---++++ Serialization

There are six types of data:
   * integer - can be 1, 2, 4, or 8 bytes in length, can be signed or unsigned. These will be referred to as Byte (1-byte unsigned), SByte (1-byte signed), Int16 (2-byte signed), UInt16 (2-byte unsigned), Int32 (4-byte signed), UInt32 (4-byte unsigned), Int64 (8-byte signed), or UInt64 (8-byte unsigned). These factors must be predetermined. Represented in standard little-endian format.
      * 1234 represented as a UInt16 => "\210\004"
      * -30000 represented as a Int16 => "\208\138"
   * string - a UInt16 representing the length of the string in bytes followed by the string itself. The string can be assumed to be encoded as UTF-8.
      * "Hello" => "\005\000Hello"
      * "Über" => "\005\000\195\156ber"
   * boolean - actually a Byte that is either 0 or 1
      * true => "\001"
      * false => "\000"
   * list - a UInt16 representing the number of elements in the list, followed by each element. Each element can be any type.
      * ["Hello", "Friend"] => "\002\000\005\000Hello\006\000Friend"
   * tuple - an ordered set of elements where the number of elements is known, so the length is not passed along.
      * ("Hello", "Friend") => "\005\000Hello\006\000Friend"
   * item - a tuple of 6 UInt16s, 1 Int16, and 1 Int32. See http://www.wowwiki.com/ItemString for details
      * "item:28484:1503:0:2946:2945:0:0:210677200" => "\068\111\223\005\000\000\130\011\129\011\000\000\000\000\208\173\142\012"
   * enum - a Byte, represents a specific value from a known set
      * "PRIEST" => "\005"
   * zone - a Byte, essentially an enum, except that the enum type is dynamically generated by the list of zones initially supplied. 0 means no or unknown zone.
      * "Durotar" => "\001"
   * faction - a UInt16, essentially an enum, except that the enum type is dynamically generated by the list of factions initially supplied. 0 means no or unknown faction.
      * "Horde" => "\001\000"

After serialization of data, the resultant string is encoded in base64. See info at http://en.wikipedia.org/wiki/Base64

---++++ Data format

   * Int64 - CurseProfiler's version number. e.g. 64891
   * string - WoW server address, e.g. "us.logon.worldofwarcraft.com"
   * string - Locale of the following set { "enUS", "enGB", "frFR", "deDE", "koKR", "zhTW", "zhCN", "esES" }
   * string - WoW client version, e.g. "2.4.0"
   * Int16 - WoW client build, e.g. 8089
   * list - list of strings that provide error data. If this has data in it, then the rest of the data will not show.
   * list - list of strings that represent zones, so that if the first zone is "Durotar", every zone with an ID of 1 means "Durotar".
   * list - list of strings that represent factions, so that if the first faction is "Horde", every faction with an ID of 1 means "Horde".
   * list - list of GameObject data tuples
   * list - list of OpenableItem data tuples
   * list - list of OpenableGameObject data tuples
   * list - list of NPC data tuples
   * list - list of PlayerProfile data tuples
   * list - list of Quest data tuples

---+++++ Enums
   * class
      * WARRIOR = 1
      * PALADIN = 2
      * HUNTER = 3
      * ROGUE = 4
      * PRIEST = 5
      * SHAMAN = 7
      * MAGE = 8
      * WARLOCK = 9
      * DRUID = 11
   * race
      * Human = 1
      * Orc = 2
      * Dwarf = 3
      * NightElf = 4
      * Scourge = 5 (sic, this is actually the undead race)
      * Tauren = 6
      * Gnome = 7
      * Troll = 8
      * BloodElf = 10
      * Draenei = 11
   * objectType
      * item = 1
      * gameobject = 2
      * npc = 3

---+++++ GameObject data
   * Int32 - object id of the game object
   * zone - zone that the game object is in 
   * Int16 - x-coordinate of the game object in the zone, multiplied by 100. Range is [0, 10000]
   * Int16 - y-cordinate of the game object in the zone, multiplied by 100. Range is [0, 10000]

---+++++ OpenableItem data
   * UInt16 - item id of the item in question
   * UInt16 - spell id used on the item to open it. 31252 for Prospecting, 13262 for Disenchant, 3365 for Opening.
   * list - LootData

---+++++ LootData
   * UInt16 - item id of the item available for loot. 0 for money.
   * Int32 - quantity of the item (or amount of copper) available for loot.

---+++++ OpenableGameObject data
   * UInt16 - spell id used on the item to open it. 3365 for Opening, 32606 for Mining, 11993 for Herb Gathering.
   * zone - zone that the game object is in 
   * Int16 - x-coordinate of the game object in the zone, multiplied by 100. Range is [0, 10000]
   * Int16 - y-coordinate of the game object in the zone, multiplied by 100. Range is [0, 10000]
   * list - LootData
   * string - Line on the tooltip that has the word "Requires" on it.
   * string - name of the object

---+++++ NPC data
   * Int32 - mob id
   * Byte - sex. See http://www.wowwiki.com/API_UnitSex
   * faction - faction of the mob.
   * list - list of NPCLocation data tuples
   * list - list of (faction playerFaction, Byte reaction) tuples. See http://www.wowwiki.com/API_UnitReaction
   * list - list of (UInt16 itemID, Byte quantity) tuples. Represents the items the merchant can sell.
   * list - list of (UInt16 itemID, Byte numAvailable) tuples. Represents the items the merchant can sell, but on a limited basis
   * list - list of (UInt16 itemID, Int16 honor, Int16 arenaPoints, Int16 reqRating) tuples. Represents the items that cost honor, arena, or have required rating and the amount of honor cost, arena point cost, and required rating. If any of the values are 0, it represents undefined.
   * list - list of (enum-class class, enum-race race, string name, string rank, string skill, Int32 cost) tuples. Represents the skills that the NPC can train and the class and race of the character who talked to said NPC. Cost is in copper.
   * tuple - tuple of NPCStat data for Normal instances and the world.
   * tuple - tuple of NPCStat data for Heroic instances.
   * tuple - tuple of NPCStat data for Epic instances.

---+++++ NPCLocation data
   * zone - zone that the mob was seen in
   * list - list of Coordinate tuples

---+++++ Coordinate
   * Int16 - x-coordinate of the object in question, multiplied by 100. Range is [0, 10000]
   * Int16 - y-coordinate of the object in question, multiplied by 100. Range is [0, 10000]

---+++++ NPCStat data
   * list - list of (Byte level, Int32 maxHP), representing the levels of the NPC that have been seen. If maxHP is 0, it means the health is unknown.
   * list - list of (UInt16 spellID, list of LootData tuples)
   * list - list of (UInt16 spellID, Int32 count), representing the spells that an NPC has cast. For swing attack, 6603 is used, for ranged attack, 3018 is used.

---+++++ PlayerProfile data
   * string - Name of the character, e.g. "Glenda"
   * string - Realm of the character, e.g. "Cenarion Circle"
   * enum-race - Race of the character, e.g. 2 for Paladin
   * enum-class - Class of the character, e.g. 11 for Draenei
   * Byte - Level of the character, e.g. 60
   * Int32 - Maximum health of the character, e.g. 12500
   * Int32 - Maximum mana, energy, or rage of the character, e.g. 10000
   * Int32 - Current experience of the character, e.g. 158812
   * Int32 - Maximum experience of the character for the level, e.g. 494000
   * string - Name of the guild the character is in, blank if no guild, e.g. "Southsea Buccaneers"
   * string - Guild rank of the character, blank if no guild, e.g. "Captain"
   * Byte - Gender of the character where 1 = Neutrum, 2 = Male, 3  Female
   * Int64 - Amount of money of the character, measured in copper pieces. 100 is 1 silver, 10000 is 1 gold.
   * list - List of (UInt16, Byte) tuples representing the talentID and rank of the chosen talents.
   * list - List of UInt16s representing the spellIDs of spells in character's spellbook.
   * list - List of Faction data tuples
   * list - List of strings representing the names of friends of the character.
   * list - List of Skill data tuples
   * list - List of (UInt16 spellID, tuple Profession data) tuples
   * tuple - Tuple of 24 instances of Combat rating amounts. Types found at http://wowwiki.com/API_GetCombatRating
   * tuple - Tuple of 5 instances of normal Stat tuples. Types found at http://wowwiki.com/API_UnitStat
   * tuple - Tuple of 7 instances of resistance Stat tuples. Types found at http://wowwiki.com/API_UnitResistance
   * Int16 - Main-hand weapon skill
   * Int16 - Off-hand weapon skill
   * Int16 - Main-hand minimum damage
   * Int16 - Main-hand maximum damage
   * Int16 - Off-hand minimum damage
   * Int16 - Off-hand maximum damage
   * Int16 - Main-hand speed, multiplied by 100, e.g. 260 means 2.60 speed
   * Int16 - Off-hand speed, multiplied by 100
   * Int16 - Melee attack power
   * Int16 - Melee attack power bonus
   * Int16 - Melee crit chance, multiplied by 100, e.g. 466 means 4.66% Crit chance
   * Int16 - Ranged weapon skill
   * Int16 - Ranged minimum damage
   * Int16 - Ranged maximum damage
   * Int16 - Ranged speed, multiplied by 100, e.g. 260 means 2.60 speed
   * Int16 - Ranged attack power
   * Int16 - Ranged attack power bonus
   * Int16 - Ranged crit chance, multiplied by 100, e.g. 466 means 4.66% Ranged crit chance
   * Int16 - Raw spell damage bonus for Holy
   * Int16 - Raw spell damage bonus for Fire
   * Int16 - Raw spell damage bonus for Nature
   * Int16 - Raw spell damage bonus for Frost
   * Int16 - Raw spell damage bonus for Shadow
   * Int16 - Raw spell damage bonus for Arcane
   * Int16 - Raw spell healing bonus
   * Int16 - Raw spell crit change for Holy, multiplied by 100
   * Int16 - Raw spell crit change for Fire, multiplied by 100
   * Int16 - Raw spell crit change for Nature, multiplied by 100
   * Int16 - Raw spell crit change for Frost, multiplied by 100
   * Int16 - Raw spell crit change for Shadow, multiplied by 100
   * Int16 - Raw spell crit change for Arcane, multiplied by 100
   * Int16 - Spell penetration
   * Int16 - Mana regen every 5 seconds when not casting
   * Int16 - Mana regen every 5 seconds when casting
   * Int16 - Defense amount
   * Int16 - Defense bonus
   * Int16 - Dodge percent, multiplied by 100, e.g. 466 means 4.66% chance to dodge
   * Int16 - Parry percent, multiplied by 100, e.g. 466 means 4.66% chance to parry
   * Int16 - Block percent, multiplied by 100, e.g. 466 means 4.66% chance to block
   * item - Item in the Head slot
   * item - Item in the Neck slot
   * item - Item in the Shoulder slot
   * item - Item in the Back slot
   * item - Item in the Chest slot
   * item - Item in the Shirt slot
   * item - Item in the Tabard slot
   * item - Item in the Wrist slot
   * item - Item in the Hands slot
   * item - Item in the Waist slot
   * item - Item in the Legs slot
   * item - Item in the Feet slot
   * item - Item in the Finger0 slot
   * item - Item in the Finger1 slot
   * item - Item in the Trinket0 slot
   * item - Item in the Trinket1 slot
   * item - Item in the MainHand slot
   * item - Item in the SecondaryHand slot
   * item - Item in the Ranged slot
   * item - Item in the Ammo slot
   * list - List of UInt16s, which represent the recent blue or higher items received, in reverse order. Newest items are first, oldest are last.

---++++++ Faction data
   * faction - faction ID
   * Byte - StandingId of the character's relationship with the faction. http://www.wowwiki.com/StandingId
   * Int32 - Total earned reputation that the character has with the faction, e.g. 1234
   * boolean - Whether the character is at war with the faction.

---++++++ Skill data
   * string - Name of the skill, e.g. "Two-Handed Swords"
   * Int16 - Current level of the skill, e.g. 118
   * Int16 - Maximum level of the skill, e.g. 300

---++++++ Profession data
   * UInt16 - Recipe spellID of the profession item/enchant.
   * UInt16 - itemID or enchantID of the profession item/enchant.
   * boolean - whether profession item/enchant is an enchant.

---++++++ Stat
   * Int16 - amount of the stat
   * Int16 - applied buff value

---+++++ Quest
   * UInt16 - quest id
   * Byte - the lowest level the quest has been seen at
   * list - list of enum-classes, represents the classes the user has gotten the quest as
   * list - list of enum-races, represents the races the user has gotten the quest as
   * enum-objectType - object type of the object the quest started at
   * Int32 - object id of the object the quest started at
   * enum-objectType - object type of the object the quest finished at
   * Int32 - object id of the object the quest finished at
   * Int16 - the time in seconds the quest must be completed in, 0 for no timer
   * Int32 - experience gained by completing the quest
   * list - list of (faction factionID, Int32 amount) tuples for faction gains and losses caused by completing the quest
   * string - the text you get by visiting the NPC before completing but after accepting
   * string - the text you get by visiting the NPC upon completion
