From 19232933b6345b30f569e67f601529513ae8d5fe Mon Sep 17 00:00:00 2001 From: katboi01 Date: Sun, 2 Feb 2025 19:44:00 +0100 Subject: [PATCH] Refactored code. Added update checking for KF3TL. --- TranslationUpdater.cs | 3 +- TranslationUpdater.csproj | 5 + UI/PopupMessage.cs | 38 +++ UI/ProgressSlider.cs | 24 ++ UI/SettingsPanel.cs | 86 +++++++ UI/UpdateAvailable.cs | 38 +++ UI/UpdateChecker.cs | 16 ++ UpdateHandler.asset | Bin 195904 -> 206448 bytes UpdateHandler.cs | 479 ++++++++++++++++++++++---------------- 9 files changed, 481 insertions(+), 208 deletions(-) create mode 100644 UI/PopupMessage.cs create mode 100644 UI/ProgressSlider.cs create mode 100644 UI/SettingsPanel.cs create mode 100644 UI/UpdateAvailable.cs create mode 100644 UI/UpdateChecker.cs diff --git a/TranslationUpdater.cs b/TranslationUpdater.cs index 815ce18..5e642b1 100644 --- a/TranslationUpdater.cs +++ b/TranslationUpdater.cs @@ -8,10 +8,11 @@ namespace TranslationUpdater { public const string pluginGuid = "katboi01.TranslationUpdater"; public const string pluginName = "KF3 Translation Updater"; - public const string pluginVersion = "1.1.1"; + public const string pluginVersion = "1.2.0"; public void Awake() { + UpdateHandler.PluginVersion = pluginVersion; UpdateHandler.Create(); } } diff --git a/TranslationUpdater.csproj b/TranslationUpdater.csproj index 75142dd..d580a09 100644 --- a/TranslationUpdater.csproj +++ b/TranslationUpdater.csproj @@ -86,6 +86,11 @@ + + + + + diff --git a/UI/PopupMessage.cs b/UI/PopupMessage.cs new file mode 100644 index 0000000..e6351e7 --- /dev/null +++ b/UI/PopupMessage.cs @@ -0,0 +1,38 @@ +using UnityEngine; +using UnityEngine.UI; + +public class PopupMessage : MonoBehaviour +{ + public Text Content; + public float MessageTime; + + public System.Action OnFinishedAction; + + public PopupMessage Init(string message, float time = 2) + { + Content.text = message; + MessageTime = time; + gameObject.SetActive(true); + return this; + } + + private void Update() + { + if (MessageTime > 0) + { + MessageTime -= Time.deltaTime; + + if (MessageTime <= 0) + { + OnFinishedAction?.Invoke(); + Destroy(gameObject); + } + } + } + + public void OnClick() + { + Destroy(this.gameObject); + OnFinishedAction?.Invoke(); + } +} \ No newline at end of file diff --git a/UI/ProgressSlider.cs b/UI/ProgressSlider.cs new file mode 100644 index 0000000..9534080 --- /dev/null +++ b/UI/ProgressSlider.cs @@ -0,0 +1,24 @@ +using UnityEngine; +using UnityEngine.UI; + +public class ProgressSlider : MonoBehaviour +{ + public Slider SlUpdateProgress; + public Text TextUpdateProgress; + + public void SetUpdateProgress(float value) + { + if (value == 0 || value >= 1) { SetActive(false); } + else + { + SetActive(true); + SlUpdateProgress.value = value; + TextUpdateProgress.text = $"{Mathf.Round(value * 10000) / 100}%"; + } + } + + public void SetActive(bool active) + { + gameObject.SetActive(active); + } +} \ No newline at end of file diff --git a/UI/SettingsPanel.cs b/UI/SettingsPanel.cs new file mode 100644 index 0000000..fbc24f6 --- /dev/null +++ b/UI/SettingsPanel.cs @@ -0,0 +1,86 @@ +using UnityEngine; +using UnityEngine.UI; + +public class SettingsPanel : MonoBehaviour +{ + public UpdateHandler Handler; + public Dropdown DdRepository; + public InputField InRepositoryUrl; + + public Text TextUpdaterVersion; + public Text TextTranslatorVersion; + public Text TextTranslationVersion; + + private bool _settingsChanged; + + public SettingsPanel Init(string updaterVersion) + { + _settingsChanged = false; + TextUpdaterVersion.text = "Updater Version: " + updaterVersion; + TextTranslatorVersion.text = "KF3TL Version:\n" + PlayerPrefs.GetString(UpdateHandler.TRANSLATOR_VER, "undefined"); + TextTranslationVersion.text = "Translation Version:\n" + PlayerPrefs.GetString(UpdateHandler.TRANSLATION_VER, "undefined"); + + int mode = PlayerPrefs.GetInt(UpdateHandler.REPO_CUSTOM_NAME, 0); + OnSourceDropdown(mode); + DdRepository.SetValueWithoutNotify(mode); + + _settingsChanged = false; + gameObject.SetActive(true); + transform.SetAsLastSibling(); + return this; + } + + public void OnSourceDropdown(int choice) + { + switch (choice) + { + case 0: + PlayerPrefs.SetInt(UpdateHandler.REPO_CUSTOM_NAME, 0); + InRepositoryUrl.text = UpdateHandler.REPO_DEFAULT; + InRepositoryUrl.interactable = false; + break; + case 1: + PlayerPrefs.SetInt(UpdateHandler.REPO_CUSTOM_NAME, 1); + InRepositoryUrl.text = PlayerPrefs.GetString(UpdateHandler.REPO_CUSTOM_URL, UpdateHandler.REPO_DEFAULT); + InRepositoryUrl.interactable = true; + break; + } + PlayerPrefs.Save(); + _settingsChanged = true; + } + + public void OnSourceEditFinished(string text) + { + PlayerPrefs.SetString(UpdateHandler.REPO_CUSTOM_URL, text); + PlayerPrefs.Save(); + _settingsChanged = true; + } + + public void OnClearTranslatorButton() + { + PlayerPrefs.SetString(UpdateHandler.TRANSLATOR_VER, "undefined"); + PlayerPrefs.Save(); + TextTranslatorVersion.text = "KF3TL Version:\n" + PlayerPrefs.GetString(UpdateHandler.TRANSLATOR_VER, "undefined"); + _settingsChanged = true; + } + + public void OnClearTranslationButton() + { + PlayerPrefs.SetString(UpdateHandler.TRANSLATION_VER, "undefined"); + PlayerPrefs.Save(); + TextTranslationVersion.text = "Translation Version:\n" + PlayerPrefs.GetString(UpdateHandler.TRANSLATION_VER, "undefined"); + _settingsChanged = true; + } + + public void OnSettingsClose() + { + if (_settingsChanged) + { + Handler.StopAllCoroutines(); + Destroy(Handler.gameObject); + UpdateHandler.Create(); + return; + } + gameObject.SetActive(false); + } +} \ No newline at end of file diff --git a/UI/UpdateAvailable.cs b/UI/UpdateAvailable.cs new file mode 100644 index 0000000..46dc17a --- /dev/null +++ b/UI/UpdateAvailable.cs @@ -0,0 +1,38 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.UI; + +public class UpdateAvailable : MonoBehaviour +{ + public Text Header; + public Text CurrentVersion; + public Text NewVersion; + public System.Action OnDownloadAction; + public System.Action OnIgnoreAction; + public System.Action OnIgnorePersistentAction; + public Button IgnorePersistentButton; + + public UpdateAvailable Init(string title, string currentVersion, string newVersion) + { + Header.text = title; + CurrentVersion.text = "Current: " + currentVersion; + NewVersion.text = "Update: " + newVersion; + gameObject.SetActive(true); + return this; + } + + public void OnDownload() + { + OnDownloadAction?.Invoke(); + } + + public void OnIgnore() + { + OnIgnoreAction?.Invoke(); + } + + public void OnIgnorePersistent() + { + OnIgnorePersistentAction?.Invoke(); + } +} \ No newline at end of file diff --git a/UI/UpdateChecker.cs b/UI/UpdateChecker.cs new file mode 100644 index 0000000..5845d5c --- /dev/null +++ b/UI/UpdateChecker.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +public class UpdateChecker : MonoBehaviour +{ + public UpdateHandler Handler; + + public void OpenSettings() + { + Handler.OpenSettingsDetached(); + } + + public void SetActive(bool active) + { + gameObject.SetActive(active); + } +} \ No newline at end of file diff --git a/UpdateHandler.asset b/UpdateHandler.asset index 7d8f44d63b17f0de2755d8f53c37286b72929359..44426cf0f81064f09bb4d39ccfcc3460a925c99e 100644 GIT binary patch delta 18808 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 M;`Gs{f{w5KAI``!3;+NC delta 12940 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 D7>7q3 diff --git a/UpdateHandler.cs b/UpdateHandler.cs index c198b82..acac0d6 100644 --- a/UpdateHandler.cs +++ b/UpdateHandler.cs @@ -1,31 +1,48 @@ -using System.IO.Compression; -using System.IO; using System; -using UnityEngine.Networking; -using UnityEngine.UI; -using UnityEngine; using System.Collections; +using System.IO; +using System.IO.Compression; using System.Reflection; +using UnityEngine; +using UnityEngine.Networking; using Newtonsoft.Json.Linq; public class UpdateHandler : MonoBehaviour { - private string _serverVersion = ""; - private float _messageTime = 0; - private bool _readyForDeletion = false; + /// Set by harmony/bepinex + public static string PluginVersion = "1.0.0"; - private const string PluginVersion = "1.1.1"; - private const string defaultRepositoryUrl = "https://git.japari.cafe/api/v1/repos/Vorked/VorkedTranslationPack"; + [Header("Message")] + public PopupMessage PanelMessage; + + [Header("UpdateChecker")] + public UpdateChecker UpdateChecker; + + [Header("UpdateProgress")] + public ProgressSlider UpdateProgress; + + [Header("UpdateAvailable")] + public UpdateAvailable UpdatePanel; + + [Header("Settings")] + public SettingsPanel PanelSettings; + + public const string REPO_DEFAULT = "https://git.japari.cafe/api/v1/repos/Vorked/VorkedTranslationPack"; //playerprefs keys - private const string translationVersionKey = "lastVersion"; - private const string repositoryUrlKey = "customRepositoryUrl"; - private const string customRepositoryKey = "customRepository"; + public const string TRANSLATION_VER = "translationVersion"; + public const string TRANSLATOR_VER = "KF3TLVersion"; + public const string REPO_CUSTOM_URL = "customRepositoryUrl"; + public const string REPO_CUSTOM_NAME = "customRepository"; + + private int _idleFrames = 0; public static void Create() { #if UNITY_EDITOR - var prefab = AssetBundle.LoadFromFile(@"R:\Unity\KF3Modder2\Assets\AssetBundles\UpdateHandler"); + //var prefab = AssetBundle.LoadFromFile(Application.dataPath + "/AssetBundles/UpdateHandler"); + var prefab = Resources.Load("UpdateHandler"); + Instantiate(prefab); #else var prefab = AssetBundle.LoadFromMemory(LoadResource("UpdateHandler.asset")); #endif @@ -55,103 +72,204 @@ public class UpdateHandler : MonoBehaviour { yield return 0; transform.SetAsLastSibling(); - PanelUpdateChecker.SetActive(true); + UpdateChecker.SetActive(true); - string repositoryUrl = PlayerPrefs.GetInt(customRepositoryKey, 0) == 0 ? defaultRepositoryUrl : PlayerPrefs.GetString(repositoryUrlKey, defaultRepositoryUrl); - string currentVersion = PlayerPrefs.GetString(translationVersionKey, "undefined"); - string newVersion = currentVersion; - string downloadError = ""; - bool updateSuccess = false; + yield return CheckKF3TLUpdate(); + yield return CheckTranslationUpdate(); - yield return DownloadText(repositoryUrl + "/branches/master", - (json) => - { - try - { - if (string.IsNullOrEmpty(json)) - { - throw new System.Exception("No response from " + repositoryUrl); - } - var responseObject = JObject.Parse(json); - newVersion = responseObject["commit"]["id"].ToString(); - updateSuccess = true; - } - catch (System.Exception e) - { - downloadError = e.Message; - updateSuccess = false; - } - } - ); - - if (!updateSuccess) - { - PanelUpdateChecker.SetActive(false); - yield return SetAwaitableMessage("Failed to check for update!\nError: " + downloadError, 5); - OpenSettings(); - _readyForDeletion = true; - yield break; - } - - Debug.Log("local version: " + currentVersion); - Debug.Log("server version: " + newVersion); - - if (newVersion != currentVersion) - { - OpenUpdateAvailable(); - _serverVersion = newVersion; - PanelUpdateChecker.SetActive(false); - } - else - { - float time = 0; - while (time < 3 || PanelSettings.activeInHierarchy) - { - time += Time.deltaTime; - yield return 0; - } - Destroy(this.gameObject); - } + yield return new WaitForSeconds(5); + UpdateChecker.SetActive(false); } private void Update() { - if (_messageTime > 0) + for (int i = 0; i < transform.childCount; i++) { - _messageTime -= Time.deltaTime; - - if (_messageTime <= 0) + if (transform.GetChild(i).gameObject.activeSelf) { - PanelMessage.SetActive(false); + _idleFrames = 0; + return; } } - else if (_readyForDeletion && !PanelSettings.activeInHierarchy) + + if (_idleFrames >= 5) { Destroy(this.gameObject); } + else + { + _idleFrames++; + } } - public IEnumerator UpdateTranslation() + public IEnumerator CheckKF3TLUpdate() { - PanelUpdateProgress.SetActive(true); - SlUpdateProgress.value = 0; + Debug.Log("Checking KF3TL Update"); + string currentVersion = PlayerPrefs.GetString(TRANSLATOR_VER, "undefined"); + var firstRun = currentVersion == "undefined"; + BranchCheckResult result = null; + + yield return GetRepoVersion("https://api.github.com/repos/Vorked/KF3TL/branches/main", data => + { + result = data; + }); + + if (result == null || !result.Success) + { + UpdateChecker.SetActive(false); + if (result == null) + { + yield return SetAwaitableMessage("Failed to get response from server", 5); + } + else + { + yield return SetAwaitableMessage("Failed to check for update!\nError: " + result.Error, 5); + } + yield break; + } + + Debug.Log("local version: " + currentVersion); + Debug.Log("server version: " + result.Version); + + if (firstRun) + { + yield return SetAwaitableMessage("First run detected. Press Ignore on next prompt if you have the newest version of KF3TL", 150); + } + + if (result.Version != currentVersion) + { + var panel = Instantiate(UpdatePanel, transform); + panel.Init("KF3TL Plugin Update", currentVersion, result.Version); + panel.OnDownloadAction = () => + { + StartCoroutine(UpdateKF3TL(result.Version, () => Destroy(panel.gameObject))); + panel.gameObject.SetActive(false); + }; + panel.OnIgnoreAction = () => + { + Destroy(panel.gameObject); + }; + if (firstRun) + { + panel.OnIgnorePersistentAction = () => + { + PlayerPrefs.SetString(TRANSLATOR_VER, result.Version); + PlayerPrefs.Save(); + Destroy(panel.gameObject); + }; + } + else + { + panel.IgnorePersistentButton.gameObject.SetActive(false); + } + while (panel != null) yield return 0; + } + } + + public IEnumerator UpdateKF3TL(string version, System.Action onComplete) + { byte[] bytes = null; - string repositoryUrl = PlayerPrefs.GetInt(customRepositoryKey, 0) == 0 ? defaultRepositoryUrl : PlayerPrefs.GetString(repositoryUrlKey, defaultRepositoryUrl); + yield return DownloadBytes("https://api.github.com/repos/Vorked/KF3TL/zipball/main", + (newBytes) => + { + bytes = newBytes; + }, + UpdateProgress.SetUpdateProgress + ); + + UpdateProgress.SetUpdateProgress(1); + + if (bytes.Length <= 0) + { + yield return SetAwaitableMessage("Failed to download the update!\nDownload new version from https://github.com/Vorked/KF3TL", 15); + yield break; + } + + var path = Application.dataPath + "/../" + "KF3TL.zip"; + File.WriteAllBytes(path, bytes); + + PlayerPrefs.SetString(TRANSLATOR_VER, version); + PlayerPrefs.Save(); + UpdateProgress.SetActive(false); + var message = Instantiate(PanelMessage, transform).Init($"New version downloaded as KF3TL.zip. Please close the game and install it.", 150); + message.OnFinishedAction = () => + { + System.Diagnostics.Process.Start("explorer.exe", "/select," + path.Replace("/", "\\")); + onComplete?.Invoke(); + }; + } + + public IEnumerator CheckTranslationUpdate() + { + Debug.Log("Checking Translation Update"); + + string repositoryUrl = PlayerPrefs.GetInt(REPO_CUSTOM_NAME, 0) == 0 ? REPO_DEFAULT : PlayerPrefs.GetString(REPO_CUSTOM_URL, REPO_DEFAULT); + string currentVersion = PlayerPrefs.GetString(TRANSLATION_VER, "undefined"); + BranchCheckResult result = null; + + yield return GetRepoVersion(repositoryUrl + "/branches/master", data => + { + result = data; + }); + + if (result == null || !result.Success) + { + UpdateChecker.SetActive(false); + if (result == null) + { + yield return SetAwaitableMessage("Failed to get response from server", 5); + } + else + { + yield return SetAwaitableMessage("Failed to check for update!\nError: " + result.Error, 5); + } + yield break; + } + + Debug.Log("local version: " + currentVersion); + Debug.Log("server version: " + result.Version); + + if (result.Version != currentVersion) + { + var panel = Instantiate(UpdatePanel, transform); + panel.Init("Translation pack", currentVersion, result.Version); + panel.OnDownloadAction = () => + { + StartCoroutine(UpdateTranslation(result.Version, () => Destroy(panel.gameObject))); + panel.gameObject.SetActive(false); + }; + panel.OnIgnoreAction = () => + { + Destroy(panel.gameObject); + }; + panel.OnIgnorePersistentAction = () => + { + PlayerPrefs.SetString(TRANSLATION_VER, result.Version); + PlayerPrefs.Save(); + Destroy(panel.gameObject); + }; + do yield return 0; while (panel != null); + } + } + + public IEnumerator UpdateTranslation(string version, System.Action onComplete) + { + byte[] bytes = null; + string repositoryUrl = PlayerPrefs.GetInt(REPO_CUSTOM_NAME, 0) == 0 ? REPO_DEFAULT : PlayerPrefs.GetString(REPO_CUSTOM_URL, REPO_DEFAULT); yield return DownloadBytes(repositoryUrl + "/archive/master.zip", (newBytes) => { bytes = newBytes; }, - SetUpdateProgress + UpdateProgress.SetUpdateProgress ); + UpdateProgress.SetUpdateProgress(1); + if (bytes.Length <= 0) { - PanelUpdateProgress.SetActive(false); yield return SetAwaitableMessage("Failed to download the update!\nCheck your settings.", 5); - OpenSettings(); - _readyForDeletion = true; yield break; } @@ -176,149 +294,62 @@ public class UpdateHandler : MonoBehaviour } catch (System.Exception e) { - SetMessage("Failed to install the update!\nError:" + e.Message, 5); - _readyForDeletion = true; + Instantiate(PanelMessage, transform).Init("Failed to install the update!\nError:" + e.Message, 5); yield break; } - PlayerPrefs.SetString(translationVersionKey, _serverVersion); + PlayerPrefs.SetString(TRANSLATION_VER, version); PlayerPrefs.Save(); - PanelUpdateProgress.SetActive(false); - SetMessage("Update completed! Please restart the game to apply it.", 5); - _readyForDeletion = true; + UpdateProgress.SetActive(false); + var message = Instantiate(PanelMessage, transform).Init("Update completed! Please restart the game to apply it.", 5); + message.OnFinishedAction = onComplete; } - #region Message - [Header("Message")] - public GameObject PanelMessage; - public Text TextMessage; - - private void SetMessage(string message, float time = 2) + private IEnumerator GetRepoVersion(string url, System.Action callback) { - PanelMessage.SetActive(true); - TextMessage.text = message; - _messageTime = time; + BranchCheckResult result = null; + yield return DownloadText(url, + (json) => + { + try + { + if (string.IsNullOrEmpty(json)) + { + throw new System.Exception("No response from " + url); + } + result = new BranchCheckResult(); + var newData = JObject.Parse(json).ToObject(); + result.Version = newData.commit.timestamp /* gitea */ ?? newData.commit.commit.author.date; //github + result.Success = true; + } + catch (System.Exception e) + { + result.Error = e.Message; + result.Success = false; + } + } + ); + callback(result); } private IEnumerator SetAwaitableMessage(string message, float time) { - SetMessage(message, time); - do - { - yield return 0; - } - while (PanelMessage.activeInHierarchy); + var msg = Instantiate(PanelMessage, transform).Init(message, time); + do yield return 0; while (msg != null); } - #endregion - #region UpdateChecker - [Header("UpdateChecker")] - public GameObject PanelUpdateChecker; - #endregion - - #region UpdateProgress - [Header("UpdateProgress")] - public GameObject PanelUpdateProgress; - public Slider SlUpdateProgress; - public Text TextUpdateProgress; - - public void SetUpdateProgress(float value) + public void OpenSettingsDetached() { - SlUpdateProgress.value = value; - TextUpdateProgress.text = $"{Mathf.Round(value * 10000) / 100}%"; + if (PanelSettings.gameObject.activeSelf) return; + StartCoroutine(OpenSettings()); } - #endregion - #region UpdateAvailable - [Header("UpdateAvailable")] - public GameObject PanelUpdateAvailable; - - public void OpenUpdateAvailable() + private IEnumerator OpenSettings() { - PanelUpdateAvailable.SetActive(true); + PanelSettings.Init(PluginVersion); + do yield return 0; while (PanelSettings.gameObject.activeSelf); } - public void OnIgnore() - { - Destroy(this.gameObject); - } - - public void OnDownload() - { - PanelUpdateAvailable.SetActive(false); - StartCoroutine(UpdateTranslation()); - } - #endregion - - #region Settings - private bool _settingsChanged = false; - [Header("Settings")] - public GameObject PanelSettings; - public Dropdown DdRepository; - public InputField InRepositoryUrl; - public Text TextUpdaterVersion; - public Text TextTranslationVersion; - - public void OpenSettings() - { - PanelSettings.gameObject.SetActive(true); - int mode = PlayerPrefs.GetInt(customRepositoryKey, 0); - OnSourceDropdown(mode); - DdRepository.SetValueWithoutNotify(mode); - TextUpdaterVersion.text = "Updater Version: " + PluginVersion; - TextTranslationVersion.text = "Translation Version: " + PlayerPrefs.GetString(translationVersionKey, "undefined"); - _settingsChanged = false; - } - - public void OnSourceDropdown(int choice) - { - switch (choice) - { - case 0: - PlayerPrefs.SetInt(customRepositoryKey, 0); - InRepositoryUrl.text = defaultRepositoryUrl; - InRepositoryUrl.interactable = false; - break; - case 1: - PlayerPrefs.SetInt(customRepositoryKey, 1); - InRepositoryUrl.text = PlayerPrefs.GetString(repositoryUrlKey, defaultRepositoryUrl); - InRepositoryUrl.interactable = true; - break; - } - PlayerPrefs.Save(); - _settingsChanged = true; - } - - public void OnSourceEditFinished(string text) - { - PlayerPrefs.SetString(repositoryUrlKey, text); - PlayerPrefs.Save(); - _settingsChanged = true; - } - - public void OnClearButton() - { - PlayerPrefs.SetString(translationVersionKey, "undefined"); - PlayerPrefs.Save(); - OpenSettings(); - _settingsChanged = true; - } - - public void OnSettingsClose() - { - if (_settingsChanged) - { - Destroy(this.gameObject); - Create(); - } - else - { - PanelSettings.SetActive(false); - } - } - - #endregion - public static IEnumerator DownloadBytes(string url, System.Action callback, System.Action onProgressChanged = null) { UnityWebRequest www = UnityWebRequest.Get(url); @@ -359,4 +390,38 @@ public class UpdateHandler : MonoBehaviour callback(www.downloadHandler.text); } } + + [System.Serializable] + public class BranchInfo + { + public CommitInfo commit; + + [System.Serializable] + public class CommitInfo + { + public string id; + public string sha; + public string timestamp; + public CommitInfo2 commit; + + [System.Serializable] + public class CommitInfo2 + { + public AuthorInfo author; + + [System.Serializable] + public class AuthorInfo + { + public string date; + } + } + } + } + + public class BranchCheckResult + { + public bool Success; + public string Version; + public string Error; + } } \ No newline at end of file