diff --git a/Plugins/BuildFiles/common.xml b/Plugins/BuildFiles/common.xml index 5e65d8bae..07ff689c8 100644 --- a/Plugins/BuildFiles/common.xml +++ b/Plugins/BuildFiles/common.xml @@ -73,6 +73,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UUIDFetcher.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UUIDFetcher.java new file mode 100644 index 000000000..001a71d19 --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UUIDFetcher.java @@ -0,0 +1,103 @@ +package mineplex.core.common.util; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.ByteBuffer; +import java.util.*; + +public class UUIDFetcher +{ + private static UUIDFetcher _instance = new UUIDFetcher(); + + private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft"; + + private final JSONParser _jsonParser = new JSONParser(); + + public UUID getPlayerUUID(String name) + { + UUID uuid = null; + List nameList = new ArrayList(); + nameList.add(name); + + try + { + HttpURLConnection connection = createConnection(); + String body = JSONArray.toJSONString(nameList.subList(0, Math.min(100, 1))); + writeBody(connection, body); + JSONArray array = (JSONArray) _jsonParser.parse(new InputStreamReader(connection.getInputStream())); + + for (Object profile : array) + { + JSONObject jsonProfile = (JSONObject) profile; + String id = (String) jsonProfile.get("id"); + uuid = UUIDFetcher.getUUID(id); + } + } + catch (Exception exception) + { + exception.printStackTrace(); + } + + return uuid; + } + + private static void writeBody(HttpURLConnection connection, String body) throws Exception + { + OutputStream stream = connection.getOutputStream(); + stream.write(body.getBytes()); + stream.flush(); + stream.close(); + } + + private static HttpURLConnection createConnection() throws Exception + { + URL url = new URL(PROFILE_URL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setUseCaches(false); + connection.setDoInput(true); + connection.setDoOutput(true); + return connection; + } + + private static UUID getUUID(String id) + { + return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + + id.substring(16, 20) + "-" + id.substring(20, 32)); + } + + public static byte[] toBytes(UUID uuid) + { + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); + byteBuffer.putLong(uuid.getMostSignificantBits()); + byteBuffer.putLong(uuid.getLeastSignificantBits()); + return byteBuffer.array(); + } + + public static UUID fromBytes(byte[] array) + { + if (array.length != 16) + { + throw new IllegalArgumentException("Illegal byte array length: " + array.length); + } + ByteBuffer byteBuffer = ByteBuffer.wrap(array); + long mostSignificant = byteBuffer.getLong(); + long leastSignificant = byteBuffer.getLong(); + return new UUID(mostSignificant, leastSignificant); + } + + public static UUID getUUIDOf(String name) + { + if (_instance == null) + _instance = new UUIDFetcher(); + + return _instance.getPlayerUUID(name); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch b/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch index c531d22bb..e7208b92f 100644 --- a/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch +++ b/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch @@ -1,8 +1,8 @@ - - - + + + diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index f55c95510..fffa1202c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -18,6 +18,7 @@ import mineplex.core.account.repository.token.ClientToken; import mineplex.core.common.Rank; import mineplex.core.common.util.Callback; import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UUIDFetcher; import mineplex.core.common.util.UtilPlayer; import mineplex.core.logger.Logger; import mineplex.core.timing.TimingManager; @@ -37,8 +38,6 @@ import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; -import com.google.common.base.Charsets; - public class CoreClientManager extends MiniPlugin { private JavaPlugin _plugin; @@ -154,13 +153,24 @@ public class CoreClientManager extends MiniPlugin public void loadClientByName(final String playerName, final Runnable runnable) { final CoreClient client = Add(playerName); - final UUID uuid = UUID.nameUUIDFromBytes((playerName).getBytes(Charsets.UTF_8)); + final UUID uuid = UUIDFetcher.getUUIDOf(playerName); Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() { public void run() { - LoadClient(client, uuid, "null"); + ClientToken token = null; + Gson gson = new Gson(); + + String response = _repository.getClientByUUID(uuid); + token = gson.fromJson(response, ClientToken.class); + + client.SetAccountId(token.AccountId); + client.SetRank(Rank.valueOf(token.Rank)); + + // JSON sql response + Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response)); + Bukkit.getServer().getScheduler().runTask(GetPlugin(), new Runnable() { public void run() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java index 6678de58e..50e9954cc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.List; import mineplex.core.common.CurrencyType; +import mineplex.core.donation.repository.token.CoinTransactionToken; import mineplex.core.donation.repository.token.DonorToken; +import mineplex.core.donation.repository.token.TransactionToken; public class Donor { @@ -13,6 +15,8 @@ public class Donor private boolean _donated; private List _salesPackagesOwned; private List _unknownSalesPackagesOwned; + private List _transactions; + private List _coinTransactions; private boolean _update = true; @@ -24,6 +28,9 @@ public class Donor _salesPackagesOwned = token.SalesPackages; _unknownSalesPackagesOwned = token.UnknownSalesPackages; + _transactions = token.Transactions; + _coinTransactions = token.CoinRewards; + if (_salesPackagesOwned == null) { @@ -34,6 +41,11 @@ public class Donor { _unknownSalesPackagesOwned = new ArrayList(); } + + if (_unknownSalesPackagesOwned == null) + { + _transactions = new ArrayList(); + } } public int GetGems() @@ -117,6 +129,11 @@ public class Donor { _unknownSalesPackagesOwned.add(packageName); } + + public List getTransactions() + { + return _transactions; + } public boolean OwnsUltraPackage() { @@ -138,4 +155,9 @@ public class Donor { _coins += amount; } + + public List getCoinTransactions() + { + return _coinTransactions; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/CoinTransactionToken.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/CoinTransactionToken.java new file mode 100644 index 000000000..30a1b3b74 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/CoinTransactionToken.java @@ -0,0 +1,8 @@ +package mineplex.core.donation.repository.token; + +public class CoinTransactionToken +{ + public long Date; + public String Source; + public int Amount; +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java index 8eec45471..918d1f18c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java @@ -9,5 +9,6 @@ public class DonorToken public List SalesPackages; public List UnknownSalesPackages; public List Transactions; + public List CoinRewards; public int Coins; } diff --git a/Plugins/Mineplex.StaffServer/.externalToolBuilders/StaffBuilder.launch b/Plugins/Mineplex.StaffServer/.externalToolBuilders/StaffBuilder.launch new file mode 100644 index 000000000..6eb51c35e --- /dev/null +++ b/Plugins/Mineplex.StaffServer/.externalToolBuilders/StaffBuilder.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Plugins/Mineplex.StaffServer/.project b/Plugins/Mineplex.StaffServer/.project index 89a8d6d8e..055073ad3 100644 --- a/Plugins/Mineplex.StaffServer/.project +++ b/Plugins/Mineplex.StaffServer/.project @@ -10,6 +10,16 @@ + + org.eclipse.ui.externaltools.ExternalToolBuilder + auto,full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/StaffBuilder.launch + + + org.eclipse.jdt.core.javanature diff --git a/Plugins/Mineplex.StaffServer/plugin.yml b/Plugins/Mineplex.StaffServer/plugin.yml new file mode 100644 index 000000000..24ee14bdd --- /dev/null +++ b/Plugins/Mineplex.StaffServer/plugin.yml @@ -0,0 +1,3 @@ +name: StaffServer +main: mineplex.staffServer.StaffServer +version: 0.1 \ No newline at end of file diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java index 699afe207..e5f9677a2 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java @@ -3,14 +3,19 @@ package mineplex.staffServer; import mineplex.core.account.CoreClientManager; import mineplex.core.chat.Chat; import mineplex.core.command.CommandCenter; +import mineplex.core.creature.Creature; import mineplex.core.donation.DonationManager; import mineplex.core.memory.MemoryFix; import mineplex.core.monitor.LagMeter; +import mineplex.core.npc.NpcManager; import mineplex.core.playerTracker.PlayerTracker; import mineplex.core.portal.Portal; import mineplex.core.preferences.PreferencesManager; +import mineplex.core.recharge.Recharge; import mineplex.core.status.ServerStatusManager; import mineplex.core.updater.FileUpdater; +import mineplex.staffServer.customerSupport.CustomerSupport; +import mineplex.staffServer.password.Password; import org.bukkit.plugin.java.JavaPlugin; @@ -31,9 +36,11 @@ public class StaffServer extends JavaPlugin CommandCenter.Initialize(this); CoreClientManager clientManager = new CoreClientManager(this, webServerAddress); CommandCenter.Instance.setClientManager(clientManager); + Recharge.Initialize(this); DonationManager donationManager = new DonationManager(this, webServerAddress); + new NpcManager(this, new Creature(this)); ServerStatusManager serverStatusManager = new ServerStatusManager(this, new LagMeter(this, clientManager)); new PlayerTracker(this, serverStatusManager.getCurrentServerName(), serverStatusManager.getUs()); PreferencesManager preferenceManager = new PreferencesManager(this, clientManager, donationManager); @@ -43,5 +50,8 @@ public class StaffServer extends JavaPlugin new Chat(this, clientManager, preferenceManager, serverStatusManager.getCurrentServerName()); new MemoryFix(this); new FileUpdater(this, portal); + + new CustomerSupport(this, clientManager, donationManager); + new Password(this); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java index d9d311bc4..c7a45c398 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java @@ -1,34 +1,40 @@ package mineplex.staffServer.customerSupport; +import java.text.SimpleDateFormat; import java.util.HashSet; -import java.util.List; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.donation.DonationManager; import mineplex.core.donation.Donor; +import mineplex.core.donation.repository.token.CoinTransactionToken; +import mineplex.core.donation.repository.token.TransactionToken; public class CustomerSupport extends MiniPlugin { private CoreClientManager _clientManager; private DonationManager _donationManager; - + private NautHashMap> _agentCacheMap = new NautHashMap>(); - + private SimpleDateFormat _date = new SimpleDateFormat("MM/dd/yy HH:mm"); + public CustomerSupport(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager) { super("Customer Support", plugin); - + _clientManager = clientManager; _donationManager = donationManager; } - + @Override public void AddCommands() { @@ -44,7 +50,7 @@ public class CustomerSupport extends MiniPlugin { if (!_agentCacheMap.containsKey(caller)) _agentCacheMap.put(caller, new HashSet()); - + _agentCacheMap.get(caller).add(playerName); } @@ -52,10 +58,29 @@ public class CustomerSupport extends MiniPlugin { CoreClient client = _clientManager.Get(playerName); Donor donor = _donationManager.Get(playerName); - + caller.sendMessage(C.cDGreen + C.Strike + "============================================="); caller.sendMessage(F.main(GetName(), "Name : " + F.elem(playerName))); - caller.sendMessage(F.main(GetName(), "Rank : " + F.elem(client.GetRank().Name))); - - //for (donor.GetUnknownSalesPackagesOwned()) + caller.sendMessage(F.main(GetName(), + "Rank : " + F.elem(client.GetRank().Name.isEmpty() ? "Regular" : client.GetRank().Name))); + + for (CoinTransactionToken transaction : donor.getCoinTransactions()) + { + if (transaction.Source.equalsIgnoreCase("purchase")) + caller.sendMessage("[" + _date.format(transaction.Date) + "] " + C.cYellow + transaction.Amount + " Coins"); + } + + for (TransactionToken transaction : donor.getTransactions()) + { + if (transaction.Coins == 0 && transaction.Gems == 0 && transaction.SalesPackageName.contains("Gem Booster")) + caller.sendMessage("[" + _date.format(transaction.Date) + "] " + C.cGreen + + transaction.SalesPackageName); + } + caller.sendMessage(C.cDGreen + C.Strike + "============================================="); + } + + @EventHandler + public void removeMapping(PlayerQuitEvent event) + { + _agentCacheMap.remove(event.getPlayer()); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java index 0fe95546b..7cd6a7c09 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/Password.java @@ -28,7 +28,7 @@ public class Password extends MiniPlugin @EventHandler public void promptForPassword(final PlayerJoinEvent event) { - event.getPlayer().sendMessage(F.main(GetName(), "Please enter the server password within 5 seconds.")); + event.getPlayer().sendMessage(F.main(GetName(), "Please enter the server password within 10 seconds.")); GetPlugin().getServer().getScheduler().scheduleSyncDelayedTask(GetPlugin(), new Runnable() { @@ -37,7 +37,7 @@ public class Password extends MiniPlugin if (!_accepted.contains(event.getPlayer())) event.getPlayer().kickPlayer("You don't know the password little twerp."); } - }, 100L); + }, 200L); } public void checkPassword(Player caller, String attempt) diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java index 29b0f96b8..eedca6380 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordCommand.java @@ -15,7 +15,7 @@ public class PasswordCommand extends CommandBase @Override public void Execute(Player caller, String[] args) { - if (args.length == 1) + if (args != null && args.length == 1) { Plugin.checkPassword(caller, args[0]); } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackages/MonthlyUltra.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackages/MonthlyUltra.java new file mode 100644 index 000000000..c61569235 --- /dev/null +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackages/MonthlyUltra.java @@ -0,0 +1,6 @@ +package mineplex.staffServer.salespackages; + +public class MonthlyUltra +{ + +} diff --git a/Website/LOC.Core/LOC.Core.csproj b/Website/LOC.Core/LOC.Core.csproj index 89d688b85..e83cfeeab 100644 --- a/Website/LOC.Core/LOC.Core.csproj +++ b/Website/LOC.Core/LOC.Core.csproj @@ -83,6 +83,7 @@ + diff --git a/Website/LOC.Core/Tokens/Client/ClientToken.cs b/Website/LOC.Core/Tokens/Client/ClientToken.cs index a73a187ee..c06400e72 100644 --- a/Website/LOC.Core/Tokens/Client/ClientToken.cs +++ b/Website/LOC.Core/Tokens/Client/ClientToken.cs @@ -43,6 +43,7 @@ SalesPackages = new List(), UnknownSalesPackages = new List(), Transactions = new List(), + CoinRewards = new List(), CustomBuilds = new List(), Pets = new List(), PetNameTagCount = account.PetNameTagCount @@ -82,7 +83,7 @@ } if (account.AccountTransactions == null) - account.AccountTransactions = new List(); + account.AccountTransactions = new List(); foreach (var transaction in account.AccountTransactions) { diff --git a/Website/LOC.Core/Tokens/Client/CoinTransactionToken.cs b/Website/LOC.Core/Tokens/Client/CoinTransactionToken.cs new file mode 100644 index 000000000..d9e9361f3 --- /dev/null +++ b/Website/LOC.Core/Tokens/Client/CoinTransactionToken.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace LOC.Core.Tokens.Client +{ + public class CoinTransactionToken + { + public long Date { get; set; } + + public int Amount { get; set; } + + public string Source { get; set; } + + public CoinTransactionToken(Model.Sales.CoinTransaction transaction) + { + Amount = transaction.Amount; + Date = transaction.Date; + Source = transaction.Source; + } + } +} diff --git a/Website/LOC.Core/Tokens/Client/DonorToken.cs b/Website/LOC.Core/Tokens/Client/DonorToken.cs index 4e636c181..f45c969fc 100644 --- a/Website/LOC.Core/Tokens/Client/DonorToken.cs +++ b/Website/LOC.Core/Tokens/Client/DonorToken.cs @@ -1,6 +1,7 @@ namespace LOC.Core.Tokens.Client { using System.Collections.Generic; + using LOC.Core.Model.Sales; public class DonorToken { @@ -10,6 +11,7 @@ public List SalesPackages { get; set; } public List UnknownSalesPackages { get; set; } public List Transactions { get; set; } + public List CoinRewards { get; set; } public List CustomBuilds { get; set; } public List Pets { get; set; } public int PetNameTagCount { get; set; } diff --git a/Website/LOC.Website.Common/Models/AccountAdministrator.cs b/Website/LOC.Website.Common/Models/AccountAdministrator.cs index 39faa04ff..34bf7c40f 100644 --- a/Website/LOC.Website.Common/Models/AccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/AccountAdministrator.cs @@ -687,7 +687,7 @@ repository.CommitChanges(); } - public Account GetAccountByUUID(string uuid) + public ClientToken GetAccountByUUID(string uuid) { using (var repository = _repositoryFactory.CreateRepository()) { @@ -698,7 +698,16 @@ account.LoadNavigationProperties(repository.Context); - return account; + ClientToken clientToken = null; + + clientToken = new ClientToken(account); + + foreach (var trans in repository.Where(x => x.Account.AccountId == account.AccountId).ToList()) + { + clientToken.DonorToken.CoinRewards.Add(new CoinTransactionToken(trans)); + } + + return clientToken; } } } diff --git a/Website/LOC.Website.Common/Models/IAccountAdministrator.cs b/Website/LOC.Website.Common/Models/IAccountAdministrator.cs index 8391389a9..9f1dfccd5 100644 --- a/Website/LOC.Website.Common/Models/IAccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/IAccountAdministrator.cs @@ -39,6 +39,6 @@ bool CoinReward(GemRewardToken token); - Account GetAccountByUUID(string uuid); + ClientToken GetAccountByUUID(string uuid); } } diff --git a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs index d0c85c5aa..6713bef16 100644 --- a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs +++ b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs @@ -42,9 +42,7 @@ [HttpPost] public ActionResult GetAccountByUUID(string uuid) { - var account = _accountAdministrator.GetAccountByUUID(uuid); - - var json = JsonConvert.SerializeObject(new ClientToken(account)); + var json = JsonConvert.SerializeObject(_accountAdministrator.GetAccountByUUID(uuid)); return Content(json, "application/json"); } diff --git a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml index 9b78888fc..bd2a0d731 100644 --- a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml +++ b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml @@ -1,12 +1,12 @@  - + @@ -19,31 +19,27 @@ - - + - - - + - + - @@ -51,18 +47,18 @@ - - + - - + + + @@ -73,24 +69,25 @@ - - + - - + + + + + - @@ -98,7 +95,6 @@ - @@ -107,42 +103,42 @@ - - + - + + - - + - + + - + @@ -153,57 +149,62 @@ - + - + + + + + + - + + - + - + - + + - - - + - + - + @@ -211,63 +212,60 @@ - + - - + + + - + - + - - + - - + + - - + - - + + - + - - + + - - + + - + - - @@ -281,15 +279,17 @@ - + - + + + @@ -303,25 +303,26 @@ + + - + - - + @@ -332,21 +333,21 @@ + - + + + - - - @@ -354,8 +355,6 @@ - - @@ -363,43 +362,44 @@ + - + + - - + - + - + + - - + + + - - @@ -410,127 +410,125 @@ - + - - - - + - - + - + + - + - + - + + - + + - + - - + + - + - + - + - + - + - + + - - + + - + - - + + - + - - - - - + + + + + - + - - @@ -546,47 +544,49 @@ - + + - + + - + - + - + - + - + - + @@ -597,74 +597,70 @@ + - + + - - + - - + - - + + - + - + - - - + - - + - - + + - - + @@ -675,33 +671,32 @@ - + - - - - + - - + - - - + + + + + + @@ -709,91 +704,94 @@ - + + - + + - + + - + - + - - + + - + - + - + + - + - + - + + - - + + - + - - + + - + - - - - - + + + + + - + - - @@ -809,37 +807,39 @@ - + + - + + - + - + - + - + @@ -849,7 +849,7 @@ - + @@ -860,29 +860,29 @@ + - + + - - + - - + @@ -890,44 +890,40 @@ - + - + - - - + - - + - - + + - - + @@ -938,33 +934,32 @@ - + - - - - + - - + - + + + + @@ -972,84 +967,89 @@ - + + - + + - + + - + - + - - + + - + - + - + + - + - + + - - + + - + - - + + - + - - - - - + + + + + - + \ No newline at end of file diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index 5a10b5f66..aff2fcd81 100644 Binary files a/Website/LOCWebsite.suo and b/Website/LOCWebsite.suo differ