public static void ProcessPart(Part part, Dictionary<string, ResourceInfo> resources)
        {
            string name = part.name;
            if (name.Contains ("kerbalEVA")) {
                // kerbalEVA parts have the name of the kerbal appended to the
                // part name.
                name = "kerbalEVA";
            }
            if (!part_recipes.ContainsKey (name)) {
                print ("ExRecipeDatabase.ProcessPart: no part recipe for " + name);
                return;
            }
            var recipe = part_recipes[name].Bake (part.mass);
            for (int i = 0; i < recipe.ingredients.Count; i++) {
                var ingredient = recipe.ingredients[i];
                if (!ingredient.isReal) {
                    print ("fake ingredient: " + ingredient.name);
                    continue;
                }
                ingredient.ratio /= ResourceDensity (ingredient.name);

                ResourceInfo resourceInfo;
                if (!resources.ContainsKey (ingredient.name)) {
                    resourceInfo = new ResourceInfo ();
                    resources[ingredient.name] = resourceInfo;
                }
                resourceInfo = resources[ingredient.name];
                resourceInfo.containers.Add (new RecipeResourceContainer (part, ingredient));
            }
        }
		public void AddPart (Part part)
		{
			foreach (PartResource resource in part.Resources) {
				ResourceInfo resourceInfo;
				if (!resources.ContainsKey (resource.resourceName)) {
					resourceInfo = new ResourceInfo ();
					resources[resource.resourceName] = resourceInfo;
				}
				resourceInfo = resources[resource.resourceName];
				resourceInfo.containers.Add (new PartResourceContainer (resource));
			}
		}
		static void GetResources (ModuleKISInventory inv, Dictionary<string, ResourceInfo> resources)
		{
			var items = inv.items;
			foreach (var item in items.Values) {
				var kis_resources = item.GetResources ();
				foreach (var res in kis_resources) {
					ResourceInfo resourceInfo;
					var resourceName = res.resourceName;
					if (!resources.ContainsKey (resourceName)) {
						resourceInfo = new ResourceInfo ();
						resources[resourceName] = resourceInfo;
					}
					resourceInfo = resources[resourceName];
					resourceInfo.containers.Add (new KISResourceContainer (inv.part, res));
				}
			}
		}