public MainForm()
        {
            // Create form controls
            InitializeComponent();

            // Set instance
            Instance = this;

            // Make sure the basic configuration settings are setup by the user,
            // and load the BF2 server and installed mods
            if (!SetupManager.Run())
            {
                this.Load += (s, e) => this.Close();
                return;
            }

            // Load Bf2 mods
            LoadModList();

            // Load client settings
            ClientSettings.Load();
            ReloadProviders();
            ReloadServers();

            // Setup theme
            metroStyleManager1.Theme = MetroThemeStyle.Light;
            metroStyleManager1.Style = MetroColorStyle.Blue;

            // Set default texts
            InstallDirTextbox.Text = Program.Config.Bf2InstallDir;

            // Load Redirector
            bool AllSystemsGo = Redirector.Initialize();

            // Select provider if we have redirects detected
            if (Redirector.RedirectsEnabled)
            {
                ServiceProvider Provider;
                if (String.IsNullOrEmpty(Program.Config.LastUsedProvider))
                {
                    Provider = ClientSettings.ServiceProviders
                               .Where(x => x.StatsAddress == Redirector.StatsServerAddress.ToString() &&
                                      x.GamespyAddress == Redirector.GamespyServerAddress.ToString())
                               .FirstOrDefault();
                }
                else
                {
                    Provider = ClientSettings.ServiceProviders
                               .Where(x => x.Name == Program.Config.LastUsedProvider)
                               .FirstOrDefault();
                }

                // Set the last used provider if we have one
                if (Provider != null)
                {
                    ProviderComboBox.SelectedItem = Provider;
                }
            }

            // Set redirect mode
            IcsRadioButton.Checked = false;
            switch (Program.Config.RedirectMode)
            {
            case RedirectMode.HostsIcsFile:
                IcsRadioButton.Checked = true;
                break;

            case RedirectMode.HostsFile:
                HostsRadioButton.Checked = true;
                break;

            case RedirectMode.DnsServer:
                DnsRadioButton.Checked = true;
                break;
            }

            // Set redirect removal
            switch (Program.Config.RedirectRemoveMethod)
            {
            case RedirectRemoveMethod.Never:
                NeverRadioButton.Checked = true;
                break;

            case RedirectRemoveMethod.OnAppClose:
                AppExitsRadioButton.Checked = true;
                break;

            case RedirectRemoveMethod.OnGameClose: break;
            }

            // Auto Login Settings
            CredentialsCheckBox.Checked   = Program.Config.PromptCredentials;
            ProgramUpdateCheckBox.Checked = Program.Config.CheckForUpdates;

            // Load our params
            Params = new ParamsCollection(Program.Config.LaunchParams);
            LaunchParamsTextBox.Text = Params.BuildString(false);

            // Register for events
            BF2Client.PathChanged += LoadModList;
            BF2Client.Started     += BF2Client_Started;
            BF2Client.Exited      += BF2Client_Exited;

            // Focus the mod select first on the Launcher tab!
            MainTabControl.SelectedIndex = 0;

            // Start updater
            if (Program.Config.CheckForUpdates)
            {
                ProgramUpdater.CheckCompleted += ProgramUpdater_CheckCompleted;
                ProgramUpdater.CheckForUpdateAsync();
            }


            // Once the form is shown, asynchronously load the redirect service
            this.Shown += (s, e) =>
            {
                // Focus the mod select combobox
                ModComboBox.Focus();

                // Since we werent registered for Bf2Client events before, do this here
                if (BF2Client.IsRunning)
                {
                    BF2Client_Started();
                }
            };
        }
        private async void ProgramUpdater_CheckCompleted(object sender, EventArgs e)
        {
            if (ProgramUpdater.UpdateAvailable)
            {
                // Show overlay first, which provides the smokey (Modal) background
                using (ModalOverlay overlay = new ModalOverlay(this, 0.3))
                {
                    // Show overlay
                    overlay.Show(this);

                    // Make sure a mod is selected
                    DialogResult r = MetroMessageBox.Show(overlay,
                                                          "An Update for this program is avaiable for download (" + ProgramUpdater.NewVersion + ")."
                                                          + Environment.NewLine.Repeat(1)
                                                          + "Would you like to download and install this update now?",
                                                          "Update Available",
                                                          MessageBoxButtons.YesNo, MessageBoxIcon.Question, 150
                                                          );

                    // Apply update
                    if (r == DialogResult.Yes)
                    {
                        bool success = false;
                        try
                        {
                            success = await ProgramUpdater.DownloadUpdateAsync(overlay);
                        }
                        catch (Exception ex)
                        {
                            // Create Exception Log
                            TraceLog.TraceWarning("Unable to Download new update archive :: Generating Exception Log");
                            ExceptionHandler.GenerateExceptionLog(ex);

                            // Alert User
                            MetroMessageBox.Show(overlay,
                                                 "Failed to download update archive! Reason: " + ex.Message
                                                 + Environment.NewLine.Repeat(1)
                                                 + "An exception log has been generated and created inside the My Documents/BF2Statistics folder.",
                                                 "Download Failed",
                                                 MessageBoxButtons.OK,
                                                 MessageBoxIcon.Error
                                                 );
                        }

                        // If the file downloaded successfully
                        if (success)
                        {
                            try
                            {
                                ProgramUpdater.RunUpdate();
                            }
                            catch (Exception ex)
                            {
                                MetroMessageBox.Show(overlay,
                                                     "An Occured while trying to install the new update. You will need to manually apply the update."
                                                     + Environment.NewLine.Repeat(1) + "Error Message: " + ex.Message,
                                                     "Installation Error",
                                                     MessageBoxButtons.OK,
                                                     MessageBoxIcon.Error
                                                     );
                            }
                        }
                    }

                    // Close overlay
                    overlay.Close();

                    // Focus the mod select
                    ModComboBox.Focus();
                }
            }
        }