From 102576cd8c5baa9077e5b1b864b52c83c23c71ae Mon Sep 17 00:00:00 2001 From: Elvendir Date: Sat, 18 Mar 2023 17:53:41 +0100 Subject: [PATCH 001/651] adddede LastPlayed as filter option in beatmap carousel --- .../Select/Carousel/CarouselBeatmap.cs | 1 + osu.Game/Screens/Select/FilterCriteria.cs | 1 + osu.Game/Screens/Select/FilterQueryParser.cs | 53 ++++++++++++++++++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs index 7e48bc5cdd..5088dfdc02 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs @@ -48,6 +48,7 @@ namespace osu.Game.Screens.Select.Carousel match &= !criteria.CircleSize.HasFilter || criteria.CircleSize.IsInRange(BeatmapInfo.Difficulty.CircleSize); match &= !criteria.OverallDifficulty.HasFilter || criteria.OverallDifficulty.IsInRange(BeatmapInfo.Difficulty.OverallDifficulty); match &= !criteria.Length.HasFilter || criteria.Length.IsInRange(BeatmapInfo.Length); + match &= !criteria.LastPlayed.HasFilter || criteria.LastPlayed.IsInRange(BeatmapInfo.LastPlayed); match &= !criteria.BPM.HasFilter || criteria.BPM.IsInRange(BeatmapInfo.BPM); match &= !criteria.BeatDivisor.HasFilter || criteria.BeatDivisor.IsInRange(BeatmapInfo.BeatDivisor); diff --git a/osu.Game/Screens/Select/FilterCriteria.cs b/osu.Game/Screens/Select/FilterCriteria.cs index 320bfb1b45..a2da98368d 100644 --- a/osu.Game/Screens/Select/FilterCriteria.cs +++ b/osu.Game/Screens/Select/FilterCriteria.cs @@ -31,6 +31,7 @@ namespace osu.Game.Screens.Select public OptionalRange BPM; public OptionalRange BeatDivisor; public OptionalRange OnlineStatus; + public OptionalRange LastPlayed; public OptionalTextFilter Creator; public OptionalTextFilter Artist; diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index c86554ddbc..6b6b2f04a9 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -61,6 +61,10 @@ namespace osu.Game.Screens.Select case "length": return tryUpdateLengthRange(criteria, op, value); + case "played": + case "lastplayed": + return tryUpdateLastPlayedRange(criteria, op, value); + case "divisor": return TryUpdateCriteriaRange(ref criteria.BeatDivisor, op, value, tryParseInt); @@ -109,7 +113,8 @@ namespace osu.Game.Screens.Select value.EndsWith("ms", StringComparison.Ordinal) ? 1 : value.EndsWith('s') ? 1000 : value.EndsWith('m') ? 60000 : - value.EndsWith('h') ? 3600000 : 1000; + value.EndsWith('h') ? 3600000 : + value.EndsWith('d') ? 86400000 : 1000; private static bool tryParseFloatWithPoint(string value, out float result) => float.TryParse(value, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result); @@ -368,5 +373,51 @@ namespace osu.Game.Screens.Select return tryUpdateCriteriaRange(ref criteria.Length, op, totalLength, minScale / 2.0); } + + private static bool tryUpdateLastPlayedRange(FilterCriteria criteria, Operator op, string val) + { + List parts = new List(); + + GroupCollection? match = null; + + match ??= tryMatchRegex(val, @"^((?\d+):)?(?\d+):(?\d+)$"); + match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); + match ??= tryMatchRegex(val, @"^(?\d+(\.\d+)?)$"); + + if (match == null) + return false; + + if (match["seconds"].Success) + parts.Add(match["seconds"].Value + "s"); + if (match["minutes"].Success) + parts.Add(match["minutes"].Value + "m"); + if (match["hours"].Success) + parts.Add(match["hours"].Value + "h"); + if (match["days"].Success) + parts.Add(match["days"].Value + "d"); + + + double totalLength = 0; + int minScale = 86400000; + + for (int i = 0; i < parts.Count; i++) + { + string part = parts[i]; + string partNoUnit = part.TrimEnd('m', 's', 'h', 'd') ; + if (!tryParseDoubleWithPoint(partNoUnit, out double length)) + return false; + + if (i != parts.Count - 1 && length >= 60) + return false; + if (i != 0 && partNoUnit.Contains('.')) + return false; + + int scale = getLengthScale(part); + totalLength += length * scale; + minScale = Math.Min(minScale, scale); + } + + return tryUpdateCriteriaRange(ref criteria.LastPlayed, op, totalLength, minScale / 2.0); + } } } From 216a88e18d71f74ddccea1b70aff77305ec88920 Mon Sep 17 00:00:00 2001 From: Elvendir Date: Sat, 18 Mar 2023 21:35:10 +0100 Subject: [PATCH 002/651] limited max Date comparison --- .../Screens/Select/Carousel/CarouselBeatmap.cs | 2 +- osu.Game/Screens/Select/FilterQueryParser.cs | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs index 5088dfdc02..069d4f36d6 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs @@ -48,7 +48,7 @@ namespace osu.Game.Screens.Select.Carousel match &= !criteria.CircleSize.HasFilter || criteria.CircleSize.IsInRange(BeatmapInfo.Difficulty.CircleSize); match &= !criteria.OverallDifficulty.HasFilter || criteria.OverallDifficulty.IsInRange(BeatmapInfo.Difficulty.OverallDifficulty); match &= !criteria.Length.HasFilter || criteria.Length.IsInRange(BeatmapInfo.Length); - match &= !criteria.LastPlayed.HasFilter || criteria.LastPlayed.IsInRange(BeatmapInfo.LastPlayed); + match &= !criteria.LastPlayed.HasFilter || criteria.LastPlayed.IsInRange(BeatmapInfo.LastPlayed ?? DateTimeOffset.MinValue); match &= !criteria.BPM.HasFilter || criteria.BPM.IsInRange(BeatmapInfo.BPM); match &= !criteria.BeatDivisor.HasFilter || criteria.BeatDivisor.IsInRange(BeatmapInfo.BeatDivisor); diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 6b6b2f04a9..38040c2f79 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -381,7 +381,7 @@ namespace osu.Game.Screens.Select GroupCollection? match = null; match ??= tryMatchRegex(val, @"^((?\d+):)?(?\d+):(?\d+)$"); - match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); + match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)d)?((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); match ??= tryMatchRegex(val, @"^(?\d+(\.\d+)?)$"); if (match == null) @@ -403,7 +403,7 @@ namespace osu.Game.Screens.Select for (int i = 0; i < parts.Count; i++) { string part = parts[i]; - string partNoUnit = part.TrimEnd('m', 's', 'h', 'd') ; + string partNoUnit = part.TrimEnd('m', 's', 'h', 'd'); if (!tryParseDoubleWithPoint(partNoUnit, out double length)) return false; @@ -417,7 +417,16 @@ namespace osu.Game.Screens.Select minScale = Math.Min(minScale, scale); } - return tryUpdateCriteriaRange(ref criteria.LastPlayed, op, totalLength, minScale / 2.0); + totalLength += minScale / 2; + + // Limits the date to ~2000 years compared to now + // Might want to do it differently before 4000 A.C. + double limit = 86400000; + limit *= 365 * 2000; + totalLength = Math.Min(totalLength, limit); + + DateTimeOffset dateTimeOffset = DateTimeOffset.Now; + return tryUpdateCriteriaRange(ref criteria.LastPlayed, op, dateTimeOffset.AddMilliseconds(-totalLength)); } } } From 6dead81d211a760e185ff0248a080454e6729197 Mon Sep 17 00:00:00 2001 From: Elvendir Date: Sun, 19 Mar 2023 18:43:17 +0100 Subject: [PATCH 003/651] Generalized tryUpdateLastPlayedRange to tryUpdateDateRange and Added tests --- .../Filtering/FilterQueryParserTest.cs | 82 ++++++++++++++ osu.Game/Screens/Select/FilterQueryParser.cs | 107 ++++++++++++------ 2 files changed, 152 insertions(+), 37 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index da32edb8fb..9460228644 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -316,5 +316,87 @@ namespace osu.Game.Tests.NonVisual.Filtering return false; } } + + //Date criteria testing + + private static readonly object[] correct_date_query_examples = + { + new object[] { "600" }, + new object[] { "120:120" }, + new object[] { "48:0:0" }, + new object[] { "0.5s" }, + new object[] { "120m" }, + new object[] { "48h120s" }, + new object[] { "10y24M" }, + new object[] { "10y60d120s" }, + new object[] { "0.1y0.1M2d" }, + new object[] { "0.99y0.99M2d" } + }; + + [Test] + [TestCaseSource(nameof(correct_date_query_examples))] + public void TestValidDateQueries(string dateQuery) + { + string query = $"played={dateQuery} time"; + var filterCriteria = new FilterCriteria(); + FilterQueryParser.ApplyQueries(filterCriteria, query); + Assert.AreEqual(true, filterCriteria.LastPlayed.HasFilter); + } + + private static readonly object[] incorrect_date_query_examples = + { + new object[] { "7m27" }, + new object[] { "7m7m7m" }, + new object[] { "5s6m" }, + new object[] { "7d7y" }, + new object[] { ":0" }, + new object[] { "0:3:" }, + new object[] { "\"three days\"" } + }; + + [Test] + [TestCaseSource(nameof(incorrect_date_query_examples))] + public void TestInvalidDateQueries(string dateQuery) + { + string query = $"played={dateQuery} time"; + var filterCriteria = new FilterCriteria(); + FilterQueryParser.ApplyQueries(filterCriteria, query); + Assert.AreEqual(false, filterCriteria.LastPlayed.HasFilter); + } + + private static readonly object[] list_operators = + { + new object[] { "=", false, false, true, true }, + new object[] { ":", false, false, true, true }, + new object[] { "<", false, true, false, false }, + new object[] { "<=", false, true, true, false }, + new object[] { "<:", false, true, true, false }, + new object[] { ">", true, false, false, false }, + new object[] { ">=", true, false, false, true }, + new object[] { ">:", true, false, false, true } + }; + + [Test] + [TestCaseSource(nameof(list_operators))] + public void TestComparisonDateQueries(string ope, bool minIsNull, bool maxIsNull, bool isLowerInclusive, bool isUpperInclusive) + { + string query = $"played{ope}50"; + var filterCriteria = new FilterCriteria(); + FilterQueryParser.ApplyQueries(filterCriteria, query); + Assert.AreEqual(isLowerInclusive, filterCriteria.LastPlayed.IsLowerInclusive); + Assert.AreEqual(isUpperInclusive, filterCriteria.LastPlayed.IsUpperInclusive); + Assert.AreEqual(maxIsNull, filterCriteria.LastPlayed.Max == null); + Assert.AreEqual(minIsNull, filterCriteria.LastPlayed.Min == null); + } + + [Test] + public void TestOutofrangeDateQuery() + { + const string query = "played=10000y"; + var filterCriteria = new FilterCriteria(); + FilterQueryParser.ApplyQueries(filterCriteria, query); + Assert.AreEqual(true, filterCriteria.LastPlayed.HasFilter); + Assert.AreEqual(DateTimeOffset.MinValue.AddMilliseconds(1), filterCriteria.LastPlayed.Min); + } } } diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 38040c2f79..f66f1bcd1d 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -63,7 +63,7 @@ namespace osu.Game.Screens.Select case "played": case "lastplayed": - return tryUpdateLastPlayedRange(criteria, op, value); + return tryUpdateDateRange(ref criteria.LastPlayed, op, value); case "divisor": return TryUpdateCriteriaRange(ref criteria.BeatDivisor, op, value, tryParseInt); @@ -374,59 +374,92 @@ namespace osu.Game.Screens.Select return tryUpdateCriteriaRange(ref criteria.Length, op, totalLength, minScale / 2.0); } - private static bool tryUpdateLastPlayedRange(FilterCriteria criteria, Operator op, string val) + private static bool tryUpdateDateRange(ref FilterCriteria.OptionalRange dateRange, Operator op, string val) { - List parts = new List(); - GroupCollection? match = null; match ??= tryMatchRegex(val, @"^((?\d+):)?(?\d+):(?\d+)$"); - match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)d)?((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); + match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)y)?((?\d+(\.\d+)?)M)?((?\d+(\.\d+)?)d)?((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); match ??= tryMatchRegex(val, @"^(?\d+(\.\d+)?)$"); if (match == null) return false; - if (match["seconds"].Success) - parts.Add(match["seconds"].Value + "s"); - if (match["minutes"].Success) - parts.Add(match["minutes"].Value + "m"); - if (match["hours"].Success) - parts.Add(match["hours"].Value + "h"); - if (match["days"].Success) - parts.Add(match["days"].Value + "d"); + DateTimeOffset dateTimeOffset = DateTimeOffset.Now; - - double totalLength = 0; - int minScale = 86400000; - - for (int i = 0; i < parts.Count; i++) + try { - string part = parts[i]; - string partNoUnit = part.TrimEnd('m', 's', 'h', 'd'); - if (!tryParseDoubleWithPoint(partNoUnit, out double length)) - return false; + List keys = new List { "seconds", "minutes", "hours", "days", "months", "years" }; - if (i != parts.Count - 1 && length >= 60) - return false; - if (i != 0 && partNoUnit.Contains('.')) - return false; + foreach (string key in keys) + { + if (match[key].Success) + { + if (!tryParseDoubleWithPoint(match[key].Value, out double length)) + return false; - int scale = getLengthScale(part); - totalLength += length * scale; - minScale = Math.Min(minScale, scale); + switch (key) + { + case "seconds": + dateTimeOffset = dateTimeOffset.AddSeconds(-length); + break; + + case "minutes": + dateTimeOffset = dateTimeOffset.AddMinutes(-length); + break; + + case "hours": + dateTimeOffset = dateTimeOffset.AddHours(-length); + break; + + case "days": + dateTimeOffset = dateTimeOffset.AddDays(-length); + break; + + case "months": + dateTimeOffset = dateTimeOffset.AddMonths(-(int)Math.Round(length)); + break; + + case "years": + dateTimeOffset = dateTimeOffset.AddYears(-(int)Math.Round(length)); + break; + } + } + } + } + // If DateTime to compare is out-scope put it to Min + catch (Exception) + { + dateTimeOffset = DateTimeOffset.MinValue; + dateTimeOffset = dateTimeOffset.AddMilliseconds(1); } - totalLength += minScale / 2; + return tryUpdateCriteriaRange(ref dateRange, invert(op), dateTimeOffset); + } - // Limits the date to ~2000 years compared to now - // Might want to do it differently before 4000 A.C. - double limit = 86400000; - limit *= 365 * 2000; - totalLength = Math.Min(totalLength, limit); + // Function to reverse an Operator + private static Operator invert(Operator ope) + { + switch (ope) + { + default: + return Operator.Equal; - DateTimeOffset dateTimeOffset = DateTimeOffset.Now; - return tryUpdateCriteriaRange(ref criteria.LastPlayed, op, dateTimeOffset.AddMilliseconds(-totalLength)); + case Operator.Equal: + return Operator.Equal; + + case Operator.Greater: + return Operator.Less; + + case Operator.GreaterOrEqual: + return Operator.LessOrEqual; + + case Operator.Less: + return Operator.Greater; + + case Operator.LessOrEqual: + return Operator.GreaterOrEqual; + } } } } From 4b053b47852ea46ad104156d81a84e3bdaaf3b04 Mon Sep 17 00:00:00 2001 From: Elvendir Date: Sat, 1 Apr 2023 22:58:25 +0200 Subject: [PATCH 004/651] changed regex match to be inline with standard --- .../NonVisual/Filtering/FilterQueryParserTest.cs | 3 +-- osu.Game/Screens/Select/FilterQueryParser.cs | 9 +++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index 9460228644..b0cc9146d2 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -322,8 +322,6 @@ namespace osu.Game.Tests.NonVisual.Filtering private static readonly object[] correct_date_query_examples = { new object[] { "600" }, - new object[] { "120:120" }, - new object[] { "48:0:0" }, new object[] { "0.5s" }, new object[] { "120m" }, new object[] { "48h120s" }, @@ -350,6 +348,7 @@ namespace osu.Game.Tests.NonVisual.Filtering new object[] { "5s6m" }, new object[] { "7d7y" }, new object[] { ":0" }, + new object[] { "0:3:6" }, new object[] { "0:3:" }, new object[] { "\"three days\"" } }; diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index f66f1bcd1d..f66b8fd377 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -378,9 +378,8 @@ namespace osu.Game.Screens.Select { GroupCollection? match = null; - match ??= tryMatchRegex(val, @"^((?\d+):)?(?\d+):(?\d+)$"); match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)y)?((?\d+(\.\d+)?)M)?((?\d+(\.\d+)?)d)?((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); - match ??= tryMatchRegex(val, @"^(?\d+(\.\d+)?)$"); + match ??= tryMatchRegex(val, @"^(?\d+(\.\d+)?)$"); if (match == null) return false; @@ -417,11 +416,13 @@ namespace osu.Game.Screens.Select break; case "months": - dateTimeOffset = dateTimeOffset.AddMonths(-(int)Math.Round(length)); + dateTimeOffset = dateTimeOffset.AddMonths(-(int)Math.Floor(length)); + dateTimeOffset = dateTimeOffset.AddDays(-30 * (length - Math.Floor(length))); break; case "years": - dateTimeOffset = dateTimeOffset.AddYears(-(int)Math.Round(length)); + dateTimeOffset = dateTimeOffset.AddYears(-(int)Math.Floor(length)); + dateTimeOffset = dateTimeOffset.AddDays(-365 * (length - Math.Floor(length))); break; } } From 52adb99fe5fe4f7f7ea756f0723354f17904203e Mon Sep 17 00:00:00 2001 From: Elvendir <39671719+Elvendir@users.noreply.github.com> Date: Tue, 4 Apr 2023 19:29:37 +0200 Subject: [PATCH 005/651] Update osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bartłomiej Dach --- osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index b0cc9146d2..627b44dcd7 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -317,7 +317,6 @@ namespace osu.Game.Tests.NonVisual.Filtering } } - //Date criteria testing private static readonly object[] correct_date_query_examples = { From d6c6507578a0fd3a7a8a502c15febd91b0123069 Mon Sep 17 00:00:00 2001 From: Elvendir <39671719+Elvendir@users.noreply.github.com> Date: Tue, 4 Apr 2023 19:30:13 +0200 Subject: [PATCH 006/651] Update osu.Game/Screens/Select/FilterQueryParser.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bartłomiej Dach --- osu.Game/Screens/Select/FilterQueryParser.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index f66b8fd377..9582694248 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -428,8 +428,7 @@ namespace osu.Game.Screens.Select } } } - // If DateTime to compare is out-scope put it to Min - catch (Exception) + catch (ArgumentOutOfRangeException) { dateTimeOffset = DateTimeOffset.MinValue; dateTimeOffset = dateTimeOffset.AddMilliseconds(1); From 0c1d6eb89465066285668b619bc73a54c9fa964c Mon Sep 17 00:00:00 2001 From: Elvendir Date: Wed, 5 Apr 2023 11:42:39 +0200 Subject: [PATCH 007/651] - rewrote upper and lower bound tests - removed equality in tests --- .../Filtering/FilterQueryParserTest.cs | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index 627b44dcd7..c1678f14a6 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -317,7 +317,6 @@ namespace osu.Game.Tests.NonVisual.Filtering } } - private static readonly object[] correct_date_query_examples = { new object[] { "600" }, @@ -334,7 +333,7 @@ namespace osu.Game.Tests.NonVisual.Filtering [TestCaseSource(nameof(correct_date_query_examples))] public void TestValidDateQueries(string dateQuery) { - string query = $"played={dateQuery} time"; + string query = $"played<{dateQuery} time"; var filterCriteria = new FilterCriteria(); FilterQueryParser.ApplyQueries(filterCriteria, query); Assert.AreEqual(true, filterCriteria.LastPlayed.HasFilter); @@ -342,11 +341,11 @@ namespace osu.Game.Tests.NonVisual.Filtering private static readonly object[] incorrect_date_query_examples = { + new object[] { ".5s" }, new object[] { "7m27" }, new object[] { "7m7m7m" }, new object[] { "5s6m" }, new object[] { "7d7y" }, - new object[] { ":0" }, new object[] { "0:3:6" }, new object[] { "0:3:" }, new object[] { "\"three days\"" } @@ -356,41 +355,36 @@ namespace osu.Game.Tests.NonVisual.Filtering [TestCaseSource(nameof(incorrect_date_query_examples))] public void TestInvalidDateQueries(string dateQuery) { - string query = $"played={dateQuery} time"; + string query = $"played<{dateQuery} time"; var filterCriteria = new FilterCriteria(); FilterQueryParser.ApplyQueries(filterCriteria, query); Assert.AreEqual(false, filterCriteria.LastPlayed.HasFilter); } - private static readonly object[] list_operators = - { - new object[] { "=", false, false, true, true }, - new object[] { ":", false, false, true, true }, - new object[] { "<", false, true, false, false }, - new object[] { "<=", false, true, true, false }, - new object[] { "<:", false, true, true, false }, - new object[] { ">", true, false, false, false }, - new object[] { ">=", true, false, false, true }, - new object[] { ">:", true, false, false, true } - }; - [Test] - [TestCaseSource(nameof(list_operators))] - public void TestComparisonDateQueries(string ope, bool minIsNull, bool maxIsNull, bool isLowerInclusive, bool isUpperInclusive) + public void TestGreaterDateQuery() { - string query = $"played{ope}50"; + const string query = "played>50"; var filterCriteria = new FilterCriteria(); FilterQueryParser.ApplyQueries(filterCriteria, query); - Assert.AreEqual(isLowerInclusive, filterCriteria.LastPlayed.IsLowerInclusive); - Assert.AreEqual(isUpperInclusive, filterCriteria.LastPlayed.IsUpperInclusive); - Assert.AreEqual(maxIsNull, filterCriteria.LastPlayed.Max == null); - Assert.AreEqual(minIsNull, filterCriteria.LastPlayed.Min == null); + Assert.AreEqual(false, filterCriteria.LastPlayed.Max == null); + Assert.AreEqual(true, filterCriteria.LastPlayed.Min == null); + } + + [Test] + public void TestLowerDateQuery() + { + const string query = "played<50"; + var filterCriteria = new FilterCriteria(); + FilterQueryParser.ApplyQueries(filterCriteria, query); + Assert.AreEqual(true, filterCriteria.LastPlayed.Max == null); + Assert.AreEqual(false, filterCriteria.LastPlayed.Min == null); } [Test] public void TestOutofrangeDateQuery() { - const string query = "played=10000y"; + const string query = "played<10000y"; var filterCriteria = new FilterCriteria(); FilterQueryParser.ApplyQueries(filterCriteria, query); Assert.AreEqual(true, filterCriteria.LastPlayed.HasFilter); From df170517a85ea1949d20b6df1043143ac028ffec Mon Sep 17 00:00:00 2001 From: Elvendir Date: Wed, 5 Apr 2023 11:59:31 +0200 Subject: [PATCH 008/651] -renamed function inverse() to reverseInequalityOperator() for clarity -changed default case of reverseInequalityOperator() to out of range exception --- osu.Game/Screens/Select/FilterQueryParser.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 9582694248..bd4c29e457 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -434,16 +434,16 @@ namespace osu.Game.Screens.Select dateTimeOffset = dateTimeOffset.AddMilliseconds(1); } - return tryUpdateCriteriaRange(ref dateRange, invert(op), dateTimeOffset); + return tryUpdateCriteriaRange(ref dateRange, reverseInequalityOperator(op), dateTimeOffset); } // Function to reverse an Operator - private static Operator invert(Operator ope) + private static Operator reverseInequalityOperator(Operator ope) { switch (ope) { default: - return Operator.Equal; + throw new ArgumentOutOfRangeException(nameof(ope), $"Unsupported operator {ope}"); case Operator.Equal: return Operator.Equal; From c2f225f0253030ea03e710f1647da26f6b106377 Mon Sep 17 00:00:00 2001 From: Elvendir Date: Wed, 5 Apr 2023 21:25:58 +0200 Subject: [PATCH 009/651] Made Operator.Equal not parse for date filter and added corresponding test --- .../NonVisual/Filtering/FilterQueryParserTest.cs | 9 +++++++++ osu.Game/Screens/Select/FilterQueryParser.cs | 3 +++ 2 files changed, 12 insertions(+) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index c1678f14a6..450e6bdde7 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -381,6 +381,15 @@ namespace osu.Game.Tests.NonVisual.Filtering Assert.AreEqual(false, filterCriteria.LastPlayed.Min == null); } + [Test] + public void TestEqualDateQuery() + { + const string query = "played=50"; + var filterCriteria = new FilterCriteria(); + FilterQueryParser.ApplyQueries(filterCriteria, query); + Assert.AreEqual(false, filterCriteria.LastPlayed.HasFilter); + } + [Test] public void TestOutofrangeDateQuery() { diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index bd4c29e457..70893c188d 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -376,6 +376,9 @@ namespace osu.Game.Screens.Select private static bool tryUpdateDateRange(ref FilterCriteria.OptionalRange dateRange, Operator op, string val) { + if (op == Operator.Equal) + return false; + GroupCollection? match = null; match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)y)?((?\d+(\.\d+)?)M)?((?\d+(\.\d+)?)d)?((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); From 928145cdeb3b523833ed6b5f3f85c830d91f4dc8 Mon Sep 17 00:00:00 2001 From: Elvendir Date: Wed, 5 Apr 2023 22:12:15 +0200 Subject: [PATCH 010/651] Enforce integer value before y and M Change impacted Tests --- .../NonVisual/Filtering/FilterQueryParserTest.cs | 8 +++++--- osu.Game/Screens/Select/FilterQueryParser.cs | 12 ++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index 450e6bdde7..78b428e7c0 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -325,8 +325,8 @@ namespace osu.Game.Tests.NonVisual.Filtering new object[] { "48h120s" }, new object[] { "10y24M" }, new object[] { "10y60d120s" }, - new object[] { "0.1y0.1M2d" }, - new object[] { "0.99y0.99M2d" } + new object[] { "0y0M2d" }, + new object[] { "1y1M2d" } }; [Test] @@ -348,7 +348,9 @@ namespace osu.Game.Tests.NonVisual.Filtering new object[] { "7d7y" }, new object[] { "0:3:6" }, new object[] { "0:3:" }, - new object[] { "\"three days\"" } + new object[] { "\"three days\"" }, + new object[] { "0.1y0.1M2d" }, + new object[] { "0.99y0.99M2d" } }; [Test] diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 70893c188d..b49f0ba057 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -419,13 +419,17 @@ namespace osu.Game.Screens.Select break; case "months": - dateTimeOffset = dateTimeOffset.AddMonths(-(int)Math.Floor(length)); - dateTimeOffset = dateTimeOffset.AddDays(-30 * (length - Math.Floor(length))); + if (match[key].Value.Contains('.')) + return false; + + dateTimeOffset = dateTimeOffset.AddMonths(-(int)length); break; case "years": - dateTimeOffset = dateTimeOffset.AddYears(-(int)Math.Floor(length)); - dateTimeOffset = dateTimeOffset.AddDays(-365 * (length - Math.Floor(length))); + if (match[key].Value.Contains('.')) + return false; + + dateTimeOffset = dateTimeOffset.AddYears(-(int)length); break; } } From 8e156fdb5102af8cd71aaac32d3c36b3c018d382 Mon Sep 17 00:00:00 2001 From: Elvendir Date: Fri, 7 Apr 2023 00:29:46 +0200 Subject: [PATCH 011/651] Enforce integer through regex match instead --- osu.Game/Screens/Select/FilterQueryParser.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index b49f0ba057..348f663b8e 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -381,7 +381,7 @@ namespace osu.Game.Screens.Select GroupCollection? match = null; - match ??= tryMatchRegex(val, @"^((?\d+(\.\d+)?)y)?((?\d+(\.\d+)?)M)?((?\d+(\.\d+)?)d)?((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); + match ??= tryMatchRegex(val, @"^((?\d+)y)?((?\d+)M)?((?\d+(\.\d+)?)d)?((?\d+(\.\d+)?)h)?((?\d+(\.\d+)?)m)?((?\d+(\.\d+)?)s)?$"); match ??= tryMatchRegex(val, @"^(?\d+(\.\d+)?)$"); if (match == null) @@ -419,16 +419,10 @@ namespace osu.Game.Screens.Select break; case "months": - if (match[key].Value.Contains('.')) - return false; - dateTimeOffset = dateTimeOffset.AddMonths(-(int)length); break; case "years": - if (match[key].Value.Contains('.')) - return false; - dateTimeOffset = dateTimeOffset.AddYears(-(int)length); break; } From 7c8c6790d017216cd65ad9fd3f3bc35e6231c6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 13:10:59 +0200 Subject: [PATCH 012/651] Refactor metadata lookup to streamline online metadata application logic --- osu.Game/Beatmaps/APIBeatmapMetadataSource.cs | 78 ++++++ .../Beatmaps/BeatmapUpdaterMetadataLookup.cs | 251 +++--------------- .../Beatmaps/IOnlineBeatmapMetadataSource.cs | 26 ++ .../LocalCachedBeatmapMetadataSource.cs | 176 ++++++++++++ osu.Game/Beatmaps/OnlineBeatmapMetadata.cs | 61 +++++ 5 files changed, 382 insertions(+), 210 deletions(-) create mode 100644 osu.Game/Beatmaps/APIBeatmapMetadataSource.cs create mode 100644 osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs create mode 100644 osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs create mode 100644 osu.Game/Beatmaps/OnlineBeatmapMetadata.cs diff --git a/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs new file mode 100644 index 0000000000..e1b01aaac5 --- /dev/null +++ b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs @@ -0,0 +1,78 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Diagnostics; +using osu.Game.Database; +using osu.Game.Online.API; +using osu.Game.Online.API.Requests; + +namespace osu.Game.Beatmaps +{ + public class APIBeatmapMetadataSource : IOnlineBeatmapMetadataSource + { + private readonly IAPIProvider api; + + public APIBeatmapMetadataSource(IAPIProvider api) + { + this.api = api; + } + + public bool Available => api.State.Value == APIState.Online; + + public OnlineBeatmapMetadata? Lookup(BeatmapInfo beatmapInfo) + { + if (!Available) + return null; + + Debug.Assert(beatmapInfo.BeatmapSet != null); + + var req = new GetBeatmapRequest(beatmapInfo); + + try + { + // intentionally blocking to limit web request concurrency + api.Perform(req); + + if (req.CompletionState == APIRequestCompletionState.Failed) + { + logForModel(beatmapInfo.BeatmapSet, $@"Online retrieval failed for {beatmapInfo}"); + return null; + } + + var res = req.Response; + + if (res != null) + { + logForModel(beatmapInfo.BeatmapSet, $@"Online retrieval mapped {beatmapInfo} to {res.OnlineBeatmapSetID} / {res.OnlineID}."); + + return new OnlineBeatmapMetadata + { + BeatmapID = res.OnlineID, + BeatmapSetID = res.OnlineBeatmapSetID, + AuthorID = res.AuthorID, + BeatmapStatus = res.Status, + BeatmapSetStatus = res.BeatmapSet?.Status, + DateRanked = res.BeatmapSet?.Ranked, + DateSubmitted = res.BeatmapSet?.Submitted, + MD5Hash = res.MD5Hash, + LastUpdated = res.LastUpdated + }; + } + } + catch (Exception e) + { + logForModel(beatmapInfo.BeatmapSet, $@"Online retrieval failed for {beatmapInfo} ({e.Message})"); + } + + return null; + } + + private void logForModel(BeatmapSetInfo set, string message) => + RealmArchiveModelImporter.LogForModel(set, $@"[{nameof(APIBeatmapMetadataSource)}] {message}"); + + public void Dispose() + { + } + } +} diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index fac91c23f5..b326e7ad1c 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -1,62 +1,31 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using System.Diagnostics; -using System.IO; using System.Linq; -using System.Threading.Tasks; -using Microsoft.Data.Sqlite; -using osu.Framework.Development; -using osu.Framework.IO.Network; -using osu.Framework.Logging; using osu.Framework.Platform; -using osu.Game.Database; using osu.Game.Online.API; -using osu.Game.Online.API.Requests; -using SharpCompress.Compressors; -using SharpCompress.Compressors.BZip2; -using SQLitePCL; namespace osu.Game.Beatmaps { /// /// A component which handles population of online IDs for beatmaps using a two part lookup procedure. /// - /// - /// On creating the component, a copy of a database containing metadata for a large subset of beatmaps (stored to ) will be downloaded if not already present locally. - /// This will always be checked before doing a second online query to get required metadata. - /// public class BeatmapUpdaterMetadataLookup : IDisposable { - private readonly IAPIProvider api; - private readonly Storage storage; - - private FileWebRequest cacheDownloadRequest; - - private const string cache_database_name = "online.db"; + private readonly IOnlineBeatmapMetadataSource apiMetadataSource; + private readonly IOnlineBeatmapMetadataSource localCachedMetadataSource; public BeatmapUpdaterMetadataLookup(IAPIProvider api, Storage storage) + : this(new APIBeatmapMetadataSource(api), new LocalCachedBeatmapMetadataSource(storage)) { - try - { - // required to initialise native SQLite libraries on some platforms. - Batteries_V2.Init(); - raw.sqlite3_config(2 /*SQLITE_CONFIG_MULTITHREAD*/); - } - catch - { - // may fail if platform not supported. - } + } - this.api = api; - this.storage = storage; - - // avoid downloading / using cache for unit tests. - if (!DebugUtils.IsNUnitRunning && !storage.Exists(cache_database_name)) - prepareLocalCache(); + internal BeatmapUpdaterMetadataLookup(IOnlineBeatmapMetadataSource apiMetadataSource, IOnlineBeatmapMetadataSource localCachedMetadataSource) + { + this.apiMetadataSource = apiMetadataSource; + this.localCachedMetadataSource = localCachedMetadataSource; } /// @@ -69,196 +38,57 @@ namespace osu.Game.Beatmaps /// Whether metadata from an online source should be preferred. If true, the local cache will be skipped to ensure the freshest data state possible. public void Update(BeatmapSetInfo beatmapSet, bool preferOnlineFetch) { - foreach (var b in beatmapSet.Beatmaps) - lookup(beatmapSet, b, preferOnlineFetch); - } - - private void lookup(BeatmapSetInfo set, BeatmapInfo beatmapInfo, bool preferOnlineFetch) - { - bool apiAvailable = api?.State.Value == APIState.Online; - - bool useLocalCache = !apiAvailable || !preferOnlineFetch; - - if (useLocalCache && checkLocalCache(set, beatmapInfo)) - return; - - if (!apiAvailable) - return; - - var req = new GetBeatmapRequest(beatmapInfo); - - try + foreach (var beatmapInfo in beatmapSet.Beatmaps) { - // intentionally blocking to limit web request concurrency - api.Perform(req); + var res = lookup(beatmapSet, beatmapInfo, preferOnlineFetch); - if (req.CompletionState == APIRequestCompletionState.Failed) + if (res == null) { - logForModel(set, $"Online retrieval failed for {beatmapInfo}"); beatmapInfo.ResetOnlineInfo(); - return; + continue; } - var res = req.Response; + beatmapInfo.OnlineID = res.BeatmapID; + beatmapInfo.OnlineMD5Hash = res.MD5Hash; + beatmapInfo.LastOnlineUpdate = res.LastUpdated; - if (res != null) + Debug.Assert(beatmapInfo.BeatmapSet != null); + beatmapInfo.BeatmapSet.OnlineID = res.BeatmapSetID; + + // Some metadata should only be applied if there's no local changes. + if (shouldSaveOnlineMetadata(beatmapInfo)) { - beatmapInfo.OnlineID = res.OnlineID; - beatmapInfo.OnlineMD5Hash = res.MD5Hash; - beatmapInfo.LastOnlineUpdate = res.LastUpdated; - - Debug.Assert(beatmapInfo.BeatmapSet != null); - beatmapInfo.BeatmapSet.OnlineID = res.OnlineBeatmapSetID; - - // Some metadata should only be applied if there's no local changes. - if (shouldSaveOnlineMetadata(beatmapInfo)) - { - beatmapInfo.Status = res.Status; - beatmapInfo.Metadata.Author.OnlineID = res.AuthorID; - } - - if (beatmapInfo.BeatmapSet.Beatmaps.All(shouldSaveOnlineMetadata)) - { - beatmapInfo.BeatmapSet.Status = res.BeatmapSet?.Status ?? BeatmapOnlineStatus.None; - beatmapInfo.BeatmapSet.DateRanked = res.BeatmapSet?.Ranked; - beatmapInfo.BeatmapSet.DateSubmitted = res.BeatmapSet?.Submitted; - } - - logForModel(set, $"Online retrieval mapped {beatmapInfo} to {res.OnlineBeatmapSetID} / {res.OnlineID}."); + beatmapInfo.Status = res.BeatmapStatus; + beatmapInfo.Metadata.Author.OnlineID = res.AuthorID; + } + + if (beatmapInfo.BeatmapSet.Beatmaps.All(shouldSaveOnlineMetadata)) + { + beatmapInfo.BeatmapSet.Status = res.BeatmapSetStatus ?? BeatmapOnlineStatus.None; + beatmapInfo.BeatmapSet.DateRanked = res.DateRanked; + beatmapInfo.BeatmapSet.DateSubmitted = res.DateSubmitted; } - } - catch (Exception e) - { - logForModel(set, $"Online retrieval failed for {beatmapInfo} ({e.Message})"); - beatmapInfo.ResetOnlineInfo(); } } - private void prepareLocalCache() + private OnlineBeatmapMetadata? lookup(BeatmapSetInfo set, BeatmapInfo beatmapInfo, bool preferOnlineFetch) { - string cacheFilePath = storage.GetFullPath(cache_database_name); - string compressedCacheFilePath = $"{cacheFilePath}.bz2"; + OnlineBeatmapMetadata? result = null; - cacheDownloadRequest = new FileWebRequest(compressedCacheFilePath, $"https://assets.ppy.sh/client-resources/{cache_database_name}.bz2?{DateTimeOffset.UtcNow:yyyyMMdd}"); + bool useLocalCache = !apiMetadataSource.Available || !preferOnlineFetch; - cacheDownloadRequest.Failed += ex => - { - File.Delete(compressedCacheFilePath); - File.Delete(cacheFilePath); + if (useLocalCache) + result = localCachedMetadataSource.Lookup(beatmapInfo); - Logger.Log($"{nameof(BeatmapUpdaterMetadataLookup)}'s online cache download failed: {ex}", LoggingTarget.Database); - }; + if (result != null) + return result; - cacheDownloadRequest.Finished += () => - { - try - { - using (var stream = File.OpenRead(cacheDownloadRequest.Filename)) - using (var outStream = File.OpenWrite(cacheFilePath)) - using (var bz2 = new BZip2Stream(stream, CompressionMode.Decompress, false)) - bz2.CopyTo(outStream); + if (apiMetadataSource.Available) + result = apiMetadataSource.Lookup(beatmapInfo); - // set to null on completion to allow lookups to begin using the new source - cacheDownloadRequest = null; - } - catch (Exception ex) - { - Logger.Log($"{nameof(BeatmapUpdaterMetadataLookup)}'s online cache extraction failed: {ex}", LoggingTarget.Database); - File.Delete(cacheFilePath); - } - finally - { - File.Delete(compressedCacheFilePath); - } - }; - - Task.Run(async () => - { - try - { - await cacheDownloadRequest.PerformAsync().ConfigureAwait(false); - } - catch - { - // Prevent throwing unobserved exceptions, as they will be logged from the network request to the log file anyway. - } - }); + return result; } - private bool checkLocalCache(BeatmapSetInfo set, BeatmapInfo beatmapInfo) - { - // download is in progress (or was, and failed). - if (cacheDownloadRequest != null) - return false; - - // database is unavailable. - if (!storage.Exists(cache_database_name)) - return false; - - if (string.IsNullOrEmpty(beatmapInfo.MD5Hash) - && string.IsNullOrEmpty(beatmapInfo.Path) - && beatmapInfo.OnlineID <= 0) - return false; - - try - { - using (var db = new SqliteConnection(string.Concat("Data Source=", storage.GetFullPath($@"{"online.db"}", true)))) - { - db.Open(); - - using (var cmd = db.CreateCommand()) - { - cmd.CommandText = - "SELECT beatmapset_id, beatmap_id, approved, user_id, checksum, last_update FROM osu_beatmaps WHERE checksum = @MD5Hash OR beatmap_id = @OnlineID OR filename = @Path"; - - cmd.Parameters.Add(new SqliteParameter("@MD5Hash", beatmapInfo.MD5Hash)); - cmd.Parameters.Add(new SqliteParameter("@OnlineID", beatmapInfo.OnlineID)); - cmd.Parameters.Add(new SqliteParameter("@Path", beatmapInfo.Path)); - - using (var reader = cmd.ExecuteReader()) - { - if (reader.Read()) - { - var status = (BeatmapOnlineStatus)reader.GetByte(2); - - // Some metadata should only be applied if there's no local changes. - if (shouldSaveOnlineMetadata(beatmapInfo)) - { - beatmapInfo.Status = status; - beatmapInfo.Metadata.Author.OnlineID = reader.GetInt32(3); - } - - // TODO: DateSubmitted and DateRanked are not provided by local cache. - beatmapInfo.OnlineID = reader.GetInt32(1); - beatmapInfo.OnlineMD5Hash = reader.GetString(4); - beatmapInfo.LastOnlineUpdate = reader.GetDateTimeOffset(5); - - Debug.Assert(beatmapInfo.BeatmapSet != null); - beatmapInfo.BeatmapSet.OnlineID = reader.GetInt32(0); - - if (beatmapInfo.BeatmapSet.Beatmaps.All(shouldSaveOnlineMetadata)) - { - beatmapInfo.BeatmapSet.Status = status; - } - - logForModel(set, $"Cached local retrieval for {beatmapInfo}."); - return true; - } - } - } - } - } - catch (Exception ex) - { - logForModel(set, $"Cached local retrieval for {beatmapInfo} failed with {ex}."); - } - - return false; - } - - private void logForModel(BeatmapSetInfo set, string message) => - RealmArchiveModelImporter.LogForModel(set, $"[{nameof(BeatmapUpdaterMetadataLookup)}] {message}"); - /// /// Check whether the provided beatmap is in a state where online "ranked" status metadata should be saved against it. /// Handles the case where a user may have locally modified a beatmap in the editor and expects the local status to stick. @@ -267,7 +97,8 @@ namespace osu.Game.Beatmaps public void Dispose() { - cacheDownloadRequest?.Dispose(); + apiMetadataSource.Dispose(); + localCachedMetadataSource.Dispose(); } } } diff --git a/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs new file mode 100644 index 0000000000..753462d493 --- /dev/null +++ b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs @@ -0,0 +1,26 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; + +namespace osu.Game.Beatmaps +{ + /// + /// Unifying interface for sources of online beatmap metadata. + /// + public interface IOnlineBeatmapMetadataSource : IDisposable + { + /// + /// Whether this source can currently service lookups. + /// + bool Available { get; } + + /// + /// Looks up the online metadata for the supplied . + /// + /// + /// An instance if the lookup is successful, or if the lookup failed. + /// + OnlineBeatmapMetadata? Lookup(BeatmapInfo beatmapInfo); + } +} diff --git a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs new file mode 100644 index 0000000000..435242aeab --- /dev/null +++ b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs @@ -0,0 +1,176 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Diagnostics; +using System.IO; +using System.Threading.Tasks; +using Microsoft.Data.Sqlite; +using osu.Framework.Development; +using osu.Framework.IO.Network; +using osu.Framework.Logging; +using osu.Framework.Platform; +using osu.Game.Database; +using SharpCompress.Compressors; +using SharpCompress.Compressors.BZip2; +using SQLitePCL; + +namespace osu.Game.Beatmaps +{ + /// + /// + /// + /// + /// On creating the component, a copy of a database containing metadata for a large subset of beatmaps (stored to ) will be downloaded if not already present locally. + /// + public class LocalCachedBeatmapMetadataSource : IOnlineBeatmapMetadataSource + { + private readonly Storage storage; + + private FileWebRequest? cacheDownloadRequest; + + private const string cache_database_name = @"online.db"; + + public LocalCachedBeatmapMetadataSource(Storage storage) + { + try + { + // required to initialise native SQLite libraries on some platforms. + Batteries_V2.Init(); + raw.sqlite3_config(2 /*SQLITE_CONFIG_MULTITHREAD*/); + } + catch + { + // may fail if platform not supported. + } + + this.storage = storage; + + // avoid downloading / using cache for unit tests. + if (!DebugUtils.IsNUnitRunning && !storage.Exists(cache_database_name)) + prepareLocalCache(); + } + + private void prepareLocalCache() + { + string cacheFilePath = storage.GetFullPath(cache_database_name); + string compressedCacheFilePath = $@"{cacheFilePath}.bz2"; + + cacheDownloadRequest = new FileWebRequest(compressedCacheFilePath, $@"https://assets.ppy.sh/client-resources/{cache_database_name}.bz2?{DateTimeOffset.UtcNow:yyyyMMdd}"); + + cacheDownloadRequest.Failed += ex => + { + File.Delete(compressedCacheFilePath); + File.Delete(cacheFilePath); + + Logger.Log($@"{nameof(BeatmapUpdaterMetadataLookup)}'s online cache download failed: {ex}", LoggingTarget.Database); + }; + + cacheDownloadRequest.Finished += () => + { + try + { + using (var stream = File.OpenRead(cacheDownloadRequest.Filename)) + using (var outStream = File.OpenWrite(cacheFilePath)) + using (var bz2 = new BZip2Stream(stream, CompressionMode.Decompress, false)) + bz2.CopyTo(outStream); + + // set to null on completion to allow lookups to begin using the new source + cacheDownloadRequest = null; + } + catch (Exception ex) + { + Logger.Log($@"{nameof(LocalCachedBeatmapMetadataSource)}'s online cache extraction failed: {ex}", LoggingTarget.Database); + File.Delete(cacheFilePath); + } + finally + { + File.Delete(compressedCacheFilePath); + } + }; + + Task.Run(async () => + { + try + { + await cacheDownloadRequest.PerformAsync().ConfigureAwait(false); + } + catch + { + // Prevent throwing unobserved exceptions, as they will be logged from the network request to the log file anyway. + } + }); + } + + public bool Available => + // no download in progress. + cacheDownloadRequest == null + // cached database exists on disk. + && storage.Exists(cache_database_name); + + public OnlineBeatmapMetadata? Lookup(BeatmapInfo beatmapInfo) + { + if (!Available) + return null; + + if (string.IsNullOrEmpty(beatmapInfo.MD5Hash) + && string.IsNullOrEmpty(beatmapInfo.Path) + && beatmapInfo.OnlineID <= 0) + return null; + + Debug.Assert(beatmapInfo.BeatmapSet != null); + + try + { + using (var db = new SqliteConnection(string.Concat(@"Data Source=", storage.GetFullPath(@"online.db", true)))) + { + db.Open(); + + using (var cmd = db.CreateCommand()) + { + cmd.CommandText = + @"SELECT beatmapset_id, beatmap_id, approved, user_id, checksum, last_update FROM osu_beatmaps WHERE checksum = @MD5Hash OR beatmap_id = @OnlineID OR filename = @Path"; + + cmd.Parameters.Add(new SqliteParameter(@"@MD5Hash", beatmapInfo.MD5Hash)); + cmd.Parameters.Add(new SqliteParameter(@"@OnlineID", beatmapInfo.OnlineID)); + cmd.Parameters.Add(new SqliteParameter(@"@Path", beatmapInfo.Path)); + + using (var reader = cmd.ExecuteReader()) + { + if (reader.Read()) + { + logForModel(beatmapInfo.BeatmapSet, $@"Cached local retrieval for {beatmapInfo}."); + + return new OnlineBeatmapMetadata + { + BeatmapSetID = reader.GetInt32(0), + BeatmapID = reader.GetInt32(1), + BeatmapStatus = (BeatmapOnlineStatus)reader.GetByte(2), + BeatmapSetStatus = (BeatmapOnlineStatus)reader.GetByte(2), + AuthorID = reader.GetInt32(3), + MD5Hash = reader.GetString(4), + LastUpdated = reader.GetDateTimeOffset(5), + // TODO: DateSubmitted and DateRanked are not provided by local cache. + }; + } + } + } + } + } + catch (Exception ex) + { + logForModel(beatmapInfo.BeatmapSet, $@"Cached local retrieval for {beatmapInfo} failed with {ex}."); + } + + return null; + } + + private void logForModel(BeatmapSetInfo set, string message) => + RealmArchiveModelImporter.LogForModel(set, $@"[{nameof(LocalCachedBeatmapMetadataSource)}] {message}"); + + public void Dispose() + { + cacheDownloadRequest?.Dispose(); + } + } +} diff --git a/osu.Game/Beatmaps/OnlineBeatmapMetadata.cs b/osu.Game/Beatmaps/OnlineBeatmapMetadata.cs new file mode 100644 index 0000000000..8640883ca1 --- /dev/null +++ b/osu.Game/Beatmaps/OnlineBeatmapMetadata.cs @@ -0,0 +1,61 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; + +namespace osu.Game.Beatmaps +{ + /// + /// This structure contains parts of beatmap metadata which are involved with the online parts + /// of the game, and therefore must be treated with particular care. + /// This data is retrieved from trusted sources (such as osu-web API, or a locally downloaded sqlite snapshot + /// of osu-web metadata). + /// + public class OnlineBeatmapMetadata + { + /// + /// The online ID of the beatmap. + /// + public int BeatmapID { get; init; } + + /// + /// The online ID of the beatmap set. + /// + public int BeatmapSetID { get; init; } + + /// + /// The online ID of the author. + /// + public int AuthorID { get; init; } + + /// + /// The online status of the beatmap. + /// + public BeatmapOnlineStatus BeatmapStatus { get; init; } + + /// + /// The online status of the associated beatmap set. + /// + public BeatmapOnlineStatus? BeatmapSetStatus { get; init; } + + /// + /// The rank date of the beatmap, if applicable and available. + /// + public DateTimeOffset? DateRanked { get; init; } + + /// + /// The submission date of the beatmap, if available. + /// + public DateTimeOffset? DateSubmitted { get; init; } + + /// + /// The MD5 hash of the beatmap. Used to verify integrity. + /// + public string MD5Hash { get; init; } = string.Empty; + + /// + /// The date when this metadata was last updated. + /// + public DateTimeOffset LastUpdated { get; init; } + } +} From b384a3258d971419b9be5c1ed35c20070c26e1da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 13:52:06 +0200 Subject: [PATCH 013/651] Remove unused argument --- osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index b326e7ad1c..98b921e3c7 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -40,7 +40,7 @@ namespace osu.Game.Beatmaps { foreach (var beatmapInfo in beatmapSet.Beatmaps) { - var res = lookup(beatmapSet, beatmapInfo, preferOnlineFetch); + var res = lookup(beatmapInfo, preferOnlineFetch); if (res == null) { @@ -71,7 +71,7 @@ namespace osu.Game.Beatmaps } } - private OnlineBeatmapMetadata? lookup(BeatmapSetInfo set, BeatmapInfo beatmapInfo, bool preferOnlineFetch) + private OnlineBeatmapMetadata? lookup(BeatmapInfo beatmapInfo, bool preferOnlineFetch) { OnlineBeatmapMetadata? result = null; From f0ec264bbc2727d8c84ed6e5f8ac59dd89aeac97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 14:37:34 +0200 Subject: [PATCH 014/651] Add test coverage for metadata lookup process --- .../BeatmapUpdaterMetadataLookupTest.cs | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs diff --git a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs new file mode 100644 index 0000000000..f1eab065c0 --- /dev/null +++ b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs @@ -0,0 +1,125 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Moq; +using NUnit.Framework; +using osu.Framework.Extensions.IEnumerableExtensions; +using osu.Game.Beatmaps; + +namespace osu.Game.Tests.Beatmaps +{ + [TestFixture] + public class BeatmapUpdaterMetadataLookupTest + { + private Mock apiMetadataSourceMock = null!; + private Mock localCachedMetadataSourceMock = null!; + + private BeatmapUpdaterMetadataLookup metadataLookup = null!; + + [SetUp] + public void SetUp() + { + apiMetadataSourceMock = new Mock(); + localCachedMetadataSourceMock = new Mock(); + + metadataLookup = new BeatmapUpdaterMetadataLookup(apiMetadataSourceMock.Object, localCachedMetadataSourceMock.Object); + } + + [Test] + public void TestLocalCacheQueriedFirst() + { + localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + apiMetadataSourceMock.Setup(src => src.Available).Returns(true); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch: false); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + apiMetadataSourceMock.Verify(src => src.Lookup(It.IsAny()), Times.Never); + } + + [Test] + public void TestAPIQueriedSecond() + { + localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns((OnlineBeatmapMetadata?)null); + apiMetadataSourceMock.Setup(src => src.Available).Returns(true); + apiMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch: false); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + } + + [Test] + public void TestPreferOnlineFetch() + { + localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + apiMetadataSourceMock.Setup(src => src.Available).Returns(true); + apiMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Graveyard }); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch: true); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Graveyard)); + localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); + apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + } + + [Test] + public void TestPreferOnlineFetchFallsBackToLocalCacheIfOnlineSourceUnavailable() + { + localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + apiMetadataSourceMock.Setup(src => src.Available).Returns(false); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch: true); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); + } + + [Test] + public void TestMetadataLookupFailed() + { + localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns((OnlineBeatmapMetadata?)null); + apiMetadataSourceMock.Setup(src => src.Available).Returns(true); + apiMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns((OnlineBeatmapMetadata?)null); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch: false); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(beatmap.OnlineID, Is.EqualTo(-1)); + localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + } + } +} From af579be0e4d92776f0b6392c878a65e310331e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 15:20:38 +0200 Subject: [PATCH 015/651] Add test coverage for edge cases --- .../BeatmapUpdaterMetadataLookupTest.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs index f1eab065c0..64f44c9922 100644 --- a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs +++ b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs @@ -28,6 +28,7 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestLocalCacheQueriedFirst() { + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); apiMetadataSourceMock.Setup(src => src.Available).Returns(true); @@ -46,6 +47,7 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestAPIQueriedSecond() { + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) .Returns((OnlineBeatmapMetadata?)null); apiMetadataSourceMock.Setup(src => src.Available).Returns(true); @@ -66,6 +68,7 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestPreferOnlineFetch() { + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); apiMetadataSourceMock.Setup(src => src.Available).Returns(true); @@ -86,6 +89,7 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestPreferOnlineFetchFallsBackToLocalCacheIfOnlineSourceUnavailable() { + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); apiMetadataSourceMock.Setup(src => src.Available).Returns(false); @@ -104,6 +108,7 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestMetadataLookupFailed() { + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) .Returns((OnlineBeatmapMetadata?)null); apiMetadataSourceMock.Setup(src => src.Available).Returns(true); @@ -121,5 +126,52 @@ namespace osu.Game.Tests.Beatmaps localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); } + + /// + /// For the time being, if we fail to find a match in the local cache but online retrieval is not available, we trust the incoming beatmap verbatim wrt online ID. + /// While this is suboptimal as it implicitly trusts the contents of the beatmap, + /// throwing away the online data would be anti-user as it would make all beatmaps imported offline stop working in online. + /// TODO: revisit if/when we have a better flow of queueing metadata retrieval. + /// + [Test] + public void TestLocalMetadataLookupFailedAndOnlineLookupIsUnavailable([Values] bool preferOnlineFetch) + { + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); + localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) + .Returns((OnlineBeatmapMetadata?)null); + apiMetadataSourceMock.Setup(src => src.Available).Returns(false); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(beatmap.OnlineID, Is.EqualTo(123456)); + } + + /// + /// For the time being, if there are no available metadata lookup sources, we trust the incoming beatmap verbatim wrt online ID. + /// While this is suboptimal as it implicitly trusts the contents of the beatmap, + /// throwing away the online data would be anti-user as it would make all beatmaps imported offline stop working in online. + /// TODO: revisit if/when we have a better flow of queueing metadata retrieval. + /// + [Test] + public void TestNoAvailableSources() + { + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(false); + apiMetadataSourceMock.Setup(src => src.Available).Returns(false); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch: false); + + Assert.That(beatmap.OnlineID, Is.EqualTo(123456)); + localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); + apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); + } } } From b895d4a42f8c36ef75efba39f72f6bdc409fe634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 15:37:50 +0200 Subject: [PATCH 016/651] Adjust logic to preserve existing desired behaviour --- .../Beatmaps/BeatmapUpdaterMetadataLookup.cs | 43 ++++++++++++++----- .../Beatmaps/IOnlineBeatmapMetadataSource.cs | 2 +- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index 98b921e3c7..3e06907c32 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -40,7 +40,8 @@ namespace osu.Game.Beatmaps { foreach (var beatmapInfo in beatmapSet.Beatmaps) { - var res = lookup(beatmapInfo, preferOnlineFetch); + if (!tryLookup(beatmapInfo, preferOnlineFetch, out var res)) + continue; if (res == null) { @@ -71,22 +72,42 @@ namespace osu.Game.Beatmaps } } - private OnlineBeatmapMetadata? lookup(BeatmapInfo beatmapInfo, bool preferOnlineFetch) + /// + /// Attempts to retrieve the for the given . + /// + /// The beatmap to perform the online lookup for. + /// Whether online sources should be preferred for the lookup. + /// The result of the lookup. Can be if no matching beatmap was found (or the lookup failed). + /// + /// if any of the metadata sources were available and returned a valid . + /// if none of the metadata sources were available, or if there was insufficient data to return a valid . + /// + /// + /// There are two cases wherein this method will return : + /// + /// If neither the local cache or the API are available to query. + /// If the API is not available to query, and a positive match was not made in the local cache. + /// + /// In either case, the online ID read from the .osu file will be preserved, which may not necessarily be what we want. + /// TODO: reconsider this if/when a better flow for queueing online retrieval is implemented. + /// + private bool tryLookup(BeatmapInfo beatmapInfo, bool preferOnlineFetch, out OnlineBeatmapMetadata? result) { - OnlineBeatmapMetadata? result = null; - - bool useLocalCache = !apiMetadataSource.Available || !preferOnlineFetch; - - if (useLocalCache) + if (localCachedMetadataSource.Available && (!apiMetadataSource.Available || !preferOnlineFetch)) + { result = localCachedMetadataSource.Lookup(beatmapInfo); - - if (result != null) - return result; + if (result != null) + return true; + } if (apiMetadataSource.Available) + { result = apiMetadataSource.Lookup(beatmapInfo); + return true; + } - return result; + result = null; + return false; } /// diff --git a/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs index 753462d493..a068e92f95 100644 --- a/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs @@ -19,7 +19,7 @@ namespace osu.Game.Beatmaps /// Looks up the online metadata for the supplied . /// /// - /// An instance if the lookup is successful, or if the lookup failed. + /// An instance if the lookup is successful, or if the lookup did not return a matching beatmap. /// OnlineBeatmapMetadata? Lookup(BeatmapInfo beatmapInfo); } From 29ce27098d1dda1e9a5c62d1676a41bdb42b78a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 17:49:31 +0200 Subject: [PATCH 017/651] Refactor again to fix test failures --- .../BeatmapUpdaterMetadataLookupTest.cs | 86 ++++++++++++------- osu.Game/Beatmaps/APIBeatmapMetadataSource.cs | 18 ++-- .../Beatmaps/BeatmapUpdaterMetadataLookup.cs | 14 +-- .../Beatmaps/IOnlineBeatmapMetadataSource.cs | 10 ++- .../LocalCachedBeatmapMetadataSource.cs | 20 +++-- 5 files changed, 93 insertions(+), 55 deletions(-) diff --git a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs index 64f44c9922..84195f1e7c 100644 --- a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs +++ b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs @@ -28,9 +28,11 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestLocalCacheQueriedFirst() { + var localLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); - localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) + .Returns(true); + apiMetadataSourceMock.Setup(src => src.Available).Returns(true); var beatmap = new BeatmapInfo { OnlineID = 123456 }; @@ -40,19 +42,22 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: false); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); - localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); - apiMetadataSourceMock.Verify(src => src.Lookup(It.IsAny()), Times.Never); + localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); + apiMetadataSourceMock.Verify(src => src.TryLookup(It.IsAny(), out It.Ref.IsAny!), Times.Never); } [Test] public void TestAPIQueriedSecond() { + OnlineBeatmapMetadata? localLookupResult = null; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); - localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns((OnlineBeatmapMetadata?)null); + localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) + .Returns(false); + + var onlineLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; apiMetadataSourceMock.Setup(src => src.Available).Returns(true); - apiMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + apiMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out onlineLookupResult)) + .Returns(true); var beatmap = new BeatmapInfo { OnlineID = 123456 }; var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); @@ -61,19 +66,22 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: false); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); - localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); - apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); + apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); } [Test] public void TestPreferOnlineFetch() { + var localLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); - localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) + .Returns(true); + + var onlineLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Graveyard }; apiMetadataSourceMock.Setup(src => src.Available).Returns(true); - apiMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Graveyard }); + apiMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out onlineLookupResult)) + .Returns(true); var beatmap = new BeatmapInfo { OnlineID = 123456 }; var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); @@ -82,16 +90,18 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: true); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Graveyard)); - localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); - apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Never); + apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); } [Test] public void TestPreferOnlineFetchFallsBackToLocalCacheIfOnlineSourceUnavailable() { + var localLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); - localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns(new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }); + localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) + .Returns(true); + apiMetadataSourceMock.Setup(src => src.Available).Returns(false); var beatmap = new BeatmapInfo { OnlineID = 123456 }; @@ -101,19 +111,22 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: true); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); - localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); - apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); + localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); + apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Never); } [Test] public void TestMetadataLookupFailed() { + OnlineBeatmapMetadata? lookupResult = null; + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); - localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns((OnlineBeatmapMetadata?)null); + localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(false); + apiMetadataSourceMock.Setup(src => src.Available).Returns(true); - apiMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns((OnlineBeatmapMetadata?)null); + apiMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(true); var beatmap = new BeatmapInfo { OnlineID = 123456 }; var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); @@ -123,8 +136,8 @@ namespace osu.Game.Tests.Beatmaps Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); Assert.That(beatmap.OnlineID, Is.EqualTo(-1)); - localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); - apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Once); + localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); + apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); } /// @@ -134,11 +147,13 @@ namespace osu.Game.Tests.Beatmaps /// TODO: revisit if/when we have a better flow of queueing metadata retrieval. /// [Test] - public void TestLocalMetadataLookupFailedAndOnlineLookupIsUnavailable([Values] bool preferOnlineFetch) + public void TestLocalMetadataLookupReturnedNoMatchAndOnlineLookupIsUnavailable([Values] bool preferOnlineFetch) { + OnlineBeatmapMetadata? localLookupResult = null; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); - localCachedMetadataSourceMock.Setup(src => src.Lookup(It.IsAny())) - .Returns((OnlineBeatmapMetadata?)null); + localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) + .Returns(false); + apiMetadataSourceMock.Setup(src => src.Available).Returns(false); var beatmap = new BeatmapInfo { OnlineID = 123456 }; @@ -158,20 +173,25 @@ namespace osu.Game.Tests.Beatmaps /// TODO: revisit if/when we have a better flow of queueing metadata retrieval. /// [Test] - public void TestNoAvailableSources() + public void TestNoAvailableSources([Values] bool preferOnlineFetch) { + OnlineBeatmapMetadata? lookupResult = null; + localCachedMetadataSourceMock.Setup(src => src.Available).Returns(false); + localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(false); + apiMetadataSourceMock.Setup(src => src.Available).Returns(false); + apiMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(false); var beatmap = new BeatmapInfo { OnlineID = 123456 }; var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); beatmap.BeatmapSet = beatmapSet; - metadataLookup.Update(beatmapSet, preferOnlineFetch: false); + metadataLookup.Update(beatmapSet, preferOnlineFetch); Assert.That(beatmap.OnlineID, Is.EqualTo(123456)); - localCachedMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); - apiMetadataSourceMock.Verify(src => src.Lookup(beatmap), Times.Never); } } } diff --git a/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs index e1b01aaac5..9f76aaf02c 100644 --- a/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs @@ -20,10 +20,13 @@ namespace osu.Game.Beatmaps public bool Available => api.State.Value == APIState.Online; - public OnlineBeatmapMetadata? Lookup(BeatmapInfo beatmapInfo) + public bool TryLookup(BeatmapInfo beatmapInfo, out OnlineBeatmapMetadata? onlineMetadata) { if (!Available) - return null; + { + onlineMetadata = null; + return false; + } Debug.Assert(beatmapInfo.BeatmapSet != null); @@ -37,7 +40,8 @@ namespace osu.Game.Beatmaps if (req.CompletionState == APIRequestCompletionState.Failed) { logForModel(beatmapInfo.BeatmapSet, $@"Online retrieval failed for {beatmapInfo}"); - return null; + onlineMetadata = null; + return true; } var res = req.Response; @@ -46,7 +50,7 @@ namespace osu.Game.Beatmaps { logForModel(beatmapInfo.BeatmapSet, $@"Online retrieval mapped {beatmapInfo} to {res.OnlineBeatmapSetID} / {res.OnlineID}."); - return new OnlineBeatmapMetadata + onlineMetadata = new OnlineBeatmapMetadata { BeatmapID = res.OnlineID, BeatmapSetID = res.OnlineBeatmapSetID, @@ -58,14 +62,18 @@ namespace osu.Game.Beatmaps MD5Hash = res.MD5Hash, LastUpdated = res.LastUpdated }; + return true; } } catch (Exception e) { logForModel(beatmapInfo.BeatmapSet, $@"Online retrieval failed for {beatmapInfo} ({e.Message})"); + onlineMetadata = null; + return false; } - return null; + onlineMetadata = null; + return false; } private void logForModel(BeatmapSetInfo set, string message) => diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index 3e06907c32..b32310990c 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -93,18 +93,12 @@ namespace osu.Game.Beatmaps /// private bool tryLookup(BeatmapInfo beatmapInfo, bool preferOnlineFetch, out OnlineBeatmapMetadata? result) { - if (localCachedMetadataSource.Available && (!apiMetadataSource.Available || !preferOnlineFetch)) - { - result = localCachedMetadataSource.Lookup(beatmapInfo); - if (result != null) - return true; - } + bool useLocalCache = !apiMetadataSource.Available || !preferOnlineFetch; + if (useLocalCache && localCachedMetadataSource.TryLookup(beatmapInfo, out result)) + return true; - if (apiMetadataSource.Available) - { - result = apiMetadataSource.Lookup(beatmapInfo); + if (apiMetadataSource.TryLookup(beatmapInfo, out result)) return true; - } result = null; return false; diff --git a/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs index a068e92f95..8230ef40ac 100644 --- a/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs @@ -18,9 +18,15 @@ namespace osu.Game.Beatmaps /// /// Looks up the online metadata for the supplied . /// + /// The to look up. + /// + /// An instance if the lookup is successful. + /// if a mismatch between the local instance and the looked-up data was detected. + /// The returned value is only valid if the return value of the method is . + /// /// - /// An instance if the lookup is successful, or if the lookup did not return a matching beatmap. + /// Whether the lookup was performed. /// - OnlineBeatmapMetadata? Lookup(BeatmapInfo beatmapInfo); + bool TryLookup(BeatmapInfo beatmapInfo, out OnlineBeatmapMetadata? onlineMetadata); } } diff --git a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs index 435242aeab..7a179b281f 100644 --- a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs @@ -108,15 +108,21 @@ namespace osu.Game.Beatmaps // cached database exists on disk. && storage.Exists(cache_database_name); - public OnlineBeatmapMetadata? Lookup(BeatmapInfo beatmapInfo) + public bool TryLookup(BeatmapInfo beatmapInfo, out OnlineBeatmapMetadata? onlineMetadata) { if (!Available) - return null; + { + onlineMetadata = null; + return false; + } if (string.IsNullOrEmpty(beatmapInfo.MD5Hash) && string.IsNullOrEmpty(beatmapInfo.Path) && beatmapInfo.OnlineID <= 0) - return null; + { + onlineMetadata = null; + return false; + } Debug.Assert(beatmapInfo.BeatmapSet != null); @@ -141,7 +147,7 @@ namespace osu.Game.Beatmaps { logForModel(beatmapInfo.BeatmapSet, $@"Cached local retrieval for {beatmapInfo}."); - return new OnlineBeatmapMetadata + onlineMetadata = new OnlineBeatmapMetadata { BeatmapSetID = reader.GetInt32(0), BeatmapID = reader.GetInt32(1), @@ -152,6 +158,7 @@ namespace osu.Game.Beatmaps LastUpdated = reader.GetDateTimeOffset(5), // TODO: DateSubmitted and DateRanked are not provided by local cache. }; + return true; } } } @@ -160,9 +167,12 @@ namespace osu.Game.Beatmaps catch (Exception ex) { logForModel(beatmapInfo.BeatmapSet, $@"Cached local retrieval for {beatmapInfo} failed with {ex}."); + onlineMetadata = null; + return false; } - return null; + onlineMetadata = null; + return false; } private void logForModel(BeatmapSetInfo set, string message) => From c930ec97d6681fbe34afe37ba01a7dd08127c01a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 19:18:59 +0200 Subject: [PATCH 018/651] Polish xmldocs --- osu.Game/Beatmaps/APIBeatmapMetadataSource.cs | 3 +++ osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs | 2 +- osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs | 6 ++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs index 9f76aaf02c..a2eebe6161 100644 --- a/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs @@ -9,6 +9,9 @@ using osu.Game.Online.API.Requests; namespace osu.Game.Beatmaps { + /// + /// Performs online metadata lookups using the osu-web API. + /// public class APIBeatmapMetadataSource : IOnlineBeatmapMetadataSource { private readonly IAPIProvider api; diff --git a/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs index 8230ef40ac..5bf5381f2a 100644 --- a/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/IOnlineBeatmapMetadataSource.cs @@ -6,7 +6,7 @@ using System; namespace osu.Game.Beatmaps { /// - /// Unifying interface for sources of online beatmap metadata. + /// Unifying interface for sources of . /// public interface IOnlineBeatmapMetadataSource : IDisposable { diff --git a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs index 7a179b281f..ff88fecd86 100644 --- a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs @@ -18,11 +18,9 @@ using SQLitePCL; namespace osu.Game.Beatmaps { /// - /// + /// Performs online metadata lookups using a copy of a database containing metadata for a large subset of beatmaps (stored to ). + /// The database will be asynchronously downloaded - if not already present locally - when this component is constructed. /// - /// - /// On creating the component, a copy of a database containing metadata for a large subset of beatmaps (stored to ) will be downloaded if not already present locally. - /// public class LocalCachedBeatmapMetadataSource : IOnlineBeatmapMetadataSource { private readonly Storage storage; From 85e303ec54cd60b75f6b3cc4d0a457caafda4afc Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 15 Nov 2023 20:00:09 +0900 Subject: [PATCH 019/651] Add two factor step to api state flow --- osu.Game/Online/API/APIAccess.cs | 5 +++++ osu.Game/Online/API/DummyAPIAccess.cs | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 4f586c8fff..a3ceb14a40 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -540,6 +540,11 @@ namespace osu.Game.Online.API /// Failing, + /// + /// Waiting on second factor authentication. + /// + RequiresAuthentication, + /// /// We are in the process of (re-)connecting. /// diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index d585124db6..4cf2152193 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -55,6 +55,7 @@ namespace osu.Game.Online.API private bool shouldFailNextLogin; private bool stayConnectingNextLogin; + private bool requiresTwoFactor; /// /// The current connectivity state of the API. @@ -115,7 +116,13 @@ namespace osu.Game.Online.API Id = DUMMY_USER_ID, }; - state.Value = APIState.Online; + if (requiresTwoFactor) + { + state.Value = APIState.RequiresAuthentication; + requiresTwoFactor = false; + } + else + state.Value = APIState.Online; } public void Logout() @@ -142,6 +149,8 @@ namespace osu.Game.Online.API IBindableList IAPIProvider.Friends => Friends; IBindable IAPIProvider.Activity => Activity; + public void RequireTwoFactor() => requiresTwoFactor = true; + /// /// During the next simulated login, the process will fail immediately. /// From 80c879e5ebed1d1d15b8d44de47f1b15ea77470c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 16 Nov 2023 16:37:12 +0900 Subject: [PATCH 020/651] Adjust member ordering in `LoginForm` --- osu.Game/Overlays/Login/LoginForm.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/osu.Game/Overlays/Login/LoginForm.cs b/osu.Game/Overlays/Login/LoginForm.cs index 0eef55162f..80dfca93d2 100644 --- a/osu.Game/Overlays/Login/LoginForm.cs +++ b/osu.Game/Overlays/Login/LoginForm.cs @@ -32,13 +32,7 @@ namespace osu.Game.Overlays.Login public Action? RequestHide; - private void performLogin() - { - if (!string.IsNullOrEmpty(username.Text) && !string.IsNullOrEmpty(password.Text)) - api.Login(username.Text, password.Text); - else - shakeSignIn.Shake(); - } + public override bool AcceptsFocus => true; [BackgroundDependencyLoader(permitNulls: true)] private void load(OsuConfigManager config, AccountCreationOverlay accountCreation) @@ -144,7 +138,13 @@ namespace osu.Game.Overlays.Login } } - public override bool AcceptsFocus => true; + private void performLogin() + { + if (!string.IsNullOrEmpty(username.Text) && !string.IsNullOrEmpty(password.Text)) + api.Login(username.Text, password.Text); + else + shakeSignIn.Shake(); + } protected override bool OnClick(ClickEvent e) => true; From e9d4cf2e24de488c75b9cd0a52e2b524dfca5248 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 15 Nov 2023 20:00:22 +0900 Subject: [PATCH 021/651] Setup basic form flow --- .../Visual/Menus/TestSceneLoginOverlay.cs | 13 +++++++++++++ osu.Game/Overlays/Login/LoginForm.cs | 5 +++++ osu.Game/Overlays/Login/LoginPanel.cs | 6 +++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs index 0bc71924ce..30c0f6644e 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs @@ -36,6 +36,19 @@ namespace osu.Game.Tests.Visual.Menus AddStep("show login overlay", () => loginOverlay.Show()); } + [Test] + public void TestLoginTwoFactorSuccess() + { + AddStep("logout", () => + { + API.Logout(); + ((DummyAPIAccess)API).RequireTwoFactor(); + }); + + AddStep("enter password", () => loginOverlay.ChildrenOfType().First().Text = "password"); + AddStep("submit", () => loginOverlay.ChildrenOfType().First(b => b.Text.ToString() == "Sign in").TriggerClick()); + } + [Test] public void TestLoginSuccess() { diff --git a/osu.Game/Overlays/Login/LoginForm.cs b/osu.Game/Overlays/Login/LoginForm.cs index 80dfca93d2..291e92883b 100644 --- a/osu.Game/Overlays/Login/LoginForm.cs +++ b/osu.Game/Overlays/Login/LoginForm.cs @@ -21,6 +21,11 @@ using osu.Game.Localisation; namespace osu.Game.Overlays.Login { + public partial class AccountVerificationForm : FillFlowContainer + { + + } + public partial class LoginForm : FillFlowContainer { private TextBox username = null!; diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs index 71ecf2e75a..59b9c6ab9f 100644 --- a/osu.Game/Overlays/Login/LoginPanel.cs +++ b/osu.Game/Overlays/Login/LoginPanel.cs @@ -25,7 +25,7 @@ namespace osu.Game.Overlays.Login { private bool bounding = true; - private LoginForm? form; + private Drawable? form; [Resolved] private OsuColour colours { get; set; } = null!; @@ -81,6 +81,10 @@ namespace osu.Game.Overlays.Login }; break; + case APIState.RequiresAuthentication: + Child = form = new AccountVerificationForm(); + break; + case APIState.Failing: case APIState.Connecting: LinkFlowContainer linkFlow; From c4e461ba447eea892668e12967af659e17689b1a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 16 Nov 2023 11:49:49 +0900 Subject: [PATCH 022/651] Add two factor auth form --- .../Overlays/Login/AccountVerificationForm.cs | 92 +++++++++++++++++++ osu.Game/Overlays/Login/LoginForm.cs | 5 - 2 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 osu.Game/Overlays/Login/AccountVerificationForm.cs diff --git a/osu.Game/Overlays/Login/AccountVerificationForm.cs b/osu.Game/Overlays/Login/AccountVerificationForm.cs new file mode 100644 index 0000000000..a27cc01ed2 --- /dev/null +++ b/osu.Game/Overlays/Login/AccountVerificationForm.cs @@ -0,0 +1,92 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Input.Events; +using osu.Game.Graphics; +using osu.Game.Graphics.Containers; +using osu.Game.Graphics.UserInterface; +using osu.Game.Overlays.Settings; +using osuTK; + +namespace osu.Game.Overlays.Login +{ + public partial class AccountVerificationForm : FillFlowContainer + { + private OsuTextBox code = null!; + private LinkFlowContainer explainText = null!; + + [BackgroundDependencyLoader] + private void load() + { + RelativeSizeAxes = Axes.X; + AutoSizeAxes = Axes.Y; + Direction = FillDirection.Vertical; + Spacing = new Vector2(0, SettingsSection.ITEM_SPACING); + + Children = new Drawable[] + { + new FillFlowContainer + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Padding = new MarginPadding { Horizontal = SettingsPanel.CONTENT_MARGINS }, + Direction = FillDirection.Vertical, + Spacing = new Vector2(0f, SettingsSection.ITEM_SPACING), + Children = new Drawable[] + { + new OsuTextFlowContainer(s => s.Font = OsuFont.GetFont(weight: FontWeight.Regular)) + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Text = "An email has been sent to you with a verification code. Enter the code.", + }, + code = new OsuTextBox + { + PlaceholderText = "Enter code", + RelativeSizeAxes = Axes.X, + TabbableContentContainer = this + }, + explainText = new LinkFlowContainer(s => s.Font = OsuFont.GetFont(weight: FontWeight.Regular)) + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + }, + new ErrorTextFlowContainer + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Alpha = 0, + }, + }, + }, + new LinkFlowContainer + { + Padding = new MarginPadding { Horizontal = SettingsPanel.CONTENT_MARGINS }, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + }, + }; + + explainText.AddParagraph("Make sure to check your spam folder if you can't find the email."); + explainText.AddParagraph("If you can't access your email or have forgotten what you used, please follow the "); + explainText.AddLink("email recovery process here", () => { }); + explainText.AddText(". You can also "); + explainText.AddLink("request another code", () => { }); + explainText.AddText(" or "); + explainText.AddLink("sign out", () => { }); + explainText.AddText("."); + } + + public override bool AcceptsFocus => true; + + protected override bool OnClick(ClickEvent e) => true; + + protected override void OnFocus(FocusEvent e) + { + Schedule(() => { GetContainingInputManager().ChangeFocus(code); }); + } + } +} diff --git a/osu.Game/Overlays/Login/LoginForm.cs b/osu.Game/Overlays/Login/LoginForm.cs index 291e92883b..80dfca93d2 100644 --- a/osu.Game/Overlays/Login/LoginForm.cs +++ b/osu.Game/Overlays/Login/LoginForm.cs @@ -21,11 +21,6 @@ using osu.Game.Localisation; namespace osu.Game.Overlays.Login { - public partial class AccountVerificationForm : FillFlowContainer - { - - } - public partial class LoginForm : FillFlowContainer { private TextBox username = null!; From 0e4244a692227d6f08a6ec2a928ee3dcec69d4ee Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 16 Nov 2023 16:38:07 +0900 Subject: [PATCH 023/651] Add `APIAccess` flow for 2fa --- osu.Game/Online/API/APIAccess.cs | 40 +++++++++++++++++++++++++-- osu.Game/Online/API/DummyAPIAccess.cs | 7 ++++- osu.Game/Online/API/IAPIProvider.cs | 6 ++++ osu.Game/Overlays/Login/LoginPanel.cs | 2 +- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index a3ceb14a40..f9dd97a8f2 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -48,6 +48,8 @@ namespace osu.Game.Online.API public string ProvidedUsername { get; private set; } + public string SecondFactorCode { get; private set; } + private string password; public IBindable LocalUser => localUser; @@ -183,6 +185,7 @@ namespace osu.Game.Online.API /// /// /// This method takes control of and transitions from to either + /// - (pending 2fa) /// - (successful connection) /// - (failed connection but retrying) /// - (failed and can't retry, clear credentials and require user interaction) @@ -190,8 +193,6 @@ namespace osu.Game.Online.API /// Whether the connection attempt was successful. private void attemptConnect() { - state.Value = APIState.Connecting; - if (localUser.IsDefault) { // Show a placeholder user if saved credentials are available. @@ -208,11 +209,14 @@ namespace osu.Game.Online.API if (!authentication.HasValidAccessToken) { + state.Value = APIState.Connecting; LastLoginError = null; try { authentication.AuthenticateWithLogin(ProvidedUsername, password); + state.Value = APIState.RequiresSecondFactorAuth; + return; } catch (Exception e) { @@ -225,6 +229,28 @@ namespace osu.Game.Online.API } } + if (state.Value == APIState.RequiresSecondFactorAuth) + { + if (string.IsNullOrEmpty(SecondFactorCode)) + return; + + state.Value = APIState.Connecting; + LastLoginError = null; + + // TODO: use code to ensure second factor authentication completed. + Thread.Sleep(1000); + bool success = SecondFactorCode == "00000000"; + SecondFactorCode = null; + + if (!success) + { + state.Value = APIState.RequiresSecondFactorAuth; + LastLoginError = new InvalidOperationException("Second factor auth failed"); + SecondFactorCode = null; + return; + } + } + var userReq = new GetUserRequest(); userReq.Failure += ex => { @@ -307,6 +333,13 @@ namespace osu.Game.Online.API this.password = password; } + public void AuthenticateSecondFactor(string code) + { + Debug.Assert(State.Value == APIState.RequiresSecondFactorAuth); + + SecondFactorCode = code; + } + public IHubClientConnector GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => new HubClientConnector(clientName, endpoint, this, versionHash, preferMessagePack); @@ -493,6 +526,7 @@ namespace osu.Game.Online.API public void Logout() { password = null; + SecondFactorCode = null; authentication.Clear(); // Scheduled prior to state change such that the state changed event is invoked with the correct user and their friends present @@ -543,7 +577,7 @@ namespace osu.Game.Online.API /// /// Waiting on second factor authentication. /// - RequiresAuthentication, + RequiresSecondFactorAuth, /// /// We are in the process of (re-)connecting. diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index 4cf2152193..bd833d39dd 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -118,13 +118,18 @@ namespace osu.Game.Online.API if (requiresTwoFactor) { - state.Value = APIState.RequiresAuthentication; + state.Value = APIState.RequiresSecondFactorAuth; requiresTwoFactor = false; } else state.Value = APIState.Online; } + public void AuthenticateSecondFactor(string code) + { + state.Value = APIState.Online; + } + public void Logout() { state.Value = APIState.Offline; diff --git a/osu.Game/Online/API/IAPIProvider.cs b/osu.Game/Online/API/IAPIProvider.cs index a1d7006c8c..5f99ad2f4d 100644 --- a/osu.Game/Online/API/IAPIProvider.cs +++ b/osu.Game/Online/API/IAPIProvider.cs @@ -106,6 +106,12 @@ namespace osu.Game.Online.API /// The user's password. void Login(string username, string password); + /// + /// Provide a second-factor authentication code for authentication. + /// + /// The 2FA code. + void AuthenticateSecondFactor(string code); + /// /// Log out the current user. /// diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs index 59b9c6ab9f..f896d03231 100644 --- a/osu.Game/Overlays/Login/LoginPanel.cs +++ b/osu.Game/Overlays/Login/LoginPanel.cs @@ -81,7 +81,7 @@ namespace osu.Game.Overlays.Login }; break; - case APIState.RequiresAuthentication: + case APIState.RequiresSecondFactorAuth: Child = form = new AccountVerificationForm(); break; From 285f740e2a2aa3754445141fa2e974fa4b1d9cd4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 16 Nov 2023 16:53:37 +0900 Subject: [PATCH 024/651] Update various components to handle new state --- osu.Game/Overlays/Login/LoginPanel.cs | 2 +- ...icationForm.cs => SecondFactorAuthForm.cs} | 32 +++++++++++++++---- .../Overlays/Toolbar/ToolbarUserButton.cs | 1 + 3 files changed, 28 insertions(+), 7 deletions(-) rename osu.Game/Overlays/Login/{AccountVerificationForm.cs => SecondFactorAuthForm.cs} (78%) diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs index f896d03231..ce0b0a5a48 100644 --- a/osu.Game/Overlays/Login/LoginPanel.cs +++ b/osu.Game/Overlays/Login/LoginPanel.cs @@ -82,7 +82,7 @@ namespace osu.Game.Overlays.Login break; case APIState.RequiresSecondFactorAuth: - Child = form = new AccountVerificationForm(); + Child = form = new SecondFactorAuthForm(); break; case APIState.Failing: diff --git a/osu.Game/Overlays/Login/AccountVerificationForm.cs b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs similarity index 78% rename from osu.Game/Overlays/Login/AccountVerificationForm.cs rename to osu.Game/Overlays/Login/SecondFactorAuthForm.cs index a27cc01ed2..cfec46c599 100644 --- a/osu.Game/Overlays/Login/AccountVerificationForm.cs +++ b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs @@ -8,15 +8,20 @@ using osu.Framework.Input.Events; using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; +using osu.Game.Online.API; using osu.Game.Overlays.Settings; using osuTK; namespace osu.Game.Overlays.Login { - public partial class AccountVerificationForm : FillFlowContainer + public partial class SecondFactorAuthForm : FillFlowContainer { - private OsuTextBox code = null!; + private OsuTextBox codeTextBox = null!; private LinkFlowContainer explainText = null!; + private ErrorTextFlowContainer errorText = null!; + + [Resolved] + private IAPIProvider api { get; set; } = null!; [BackgroundDependencyLoader] private void load() @@ -43,18 +48,18 @@ namespace osu.Game.Overlays.Login AutoSizeAxes = Axes.Y, Text = "An email has been sent to you with a verification code. Enter the code.", }, - code = new OsuTextBox + codeTextBox = new OsuTextBox { PlaceholderText = "Enter code", RelativeSizeAxes = Axes.X, - TabbableContentContainer = this + TabbableContentContainer = this, }, explainText = new LinkFlowContainer(s => s.Font = OsuFont.GetFont(weight: FontWeight.Regular)) { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, }, - new ErrorTextFlowContainer + errorText = new ErrorTextFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, @@ -78,6 +83,21 @@ namespace osu.Game.Overlays.Login explainText.AddText(" or "); explainText.AddLink("sign out", () => { }); explainText.AddText("."); + + codeTextBox.Current.BindValueChanged(code => + { + if (code.NewValue.Length == 8) + { + api.AuthenticateSecondFactor(code.NewValue); + codeTextBox.Current.Disabled = true; + } + }); + + if (api.LastLoginError?.Message is string error) + { + errorText.Alpha = 1; + errorText.AddErrors(new[] { error }); + } } public override bool AcceptsFocus => true; @@ -86,7 +106,7 @@ namespace osu.Game.Overlays.Login protected override void OnFocus(FocusEvent e) { - Schedule(() => { GetContainingInputManager().ChangeFocus(code); }); + Schedule(() => { GetContainingInputManager().ChangeFocus(codeTextBox); }); } } } diff --git a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs index 028decea1e..f0b5aed3cf 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs @@ -101,6 +101,7 @@ namespace osu.Game.Overlays.Toolbar switch (state.NewValue) { + case APIState.RequiresSecondFactorAuth: case APIState.Connecting: TooltipText = ToolbarStrings.Connecting; spinner.Show(); From f7fa9c90d66c9ba05f4bc50c1bc78274caa2c8cf Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 16 Nov 2023 18:16:02 +0900 Subject: [PATCH 025/651] Add test coverage of 2FA flow --- .../Visual/Menus/TestSceneLoginOverlay.cs | 24 +++++++++---------- osu.Game/Online/API/DummyAPIAccess.cs | 13 ++++++---- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs index 30c0f6644e..0c5f5a321c 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs @@ -10,6 +10,7 @@ using osu.Framework.Testing; using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; using osu.Game.Overlays; +using osu.Game.Overlays.Login; using osu.Game.Users.Drawables; using osuTK.Input; @@ -36,28 +37,25 @@ namespace osu.Game.Tests.Visual.Menus AddStep("show login overlay", () => loginOverlay.Show()); } - [Test] - public void TestLoginTwoFactorSuccess() - { - AddStep("logout", () => - { - API.Logout(); - ((DummyAPIAccess)API).RequireTwoFactor(); - }); - - AddStep("enter password", () => loginOverlay.ChildrenOfType().First().Text = "password"); - AddStep("submit", () => loginOverlay.ChildrenOfType().First(b => b.Text.ToString() == "Sign in").TriggerClick()); - } - [Test] public void TestLoginSuccess() { AddStep("logout", () => API.Logout()); + assertAPIState(APIState.Offline); AddStep("enter password", () => loginOverlay.ChildrenOfType().First().Text = "password"); AddStep("submit", () => loginOverlay.ChildrenOfType().First(b => b.Text.ToString() == "Sign in").TriggerClick()); + + assertAPIState(APIState.RequiresSecondFactorAuth); + AddUntilStep("wait for second factor auth form", () => loginOverlay.ChildrenOfType().SingleOrDefault(), () => Is.Not.Null); + + AddStep("enter code", () => loginOverlay.ChildrenOfType().First().Text = "88800088"); + assertAPIState(APIState.Online); } + private void assertAPIState(APIState expected) => + AddUntilStep($"login state is {expected}", () => API.State.Value, () => Is.EqualTo(expected)); + [Test] public void TestLoginFailure() { diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index bd833d39dd..bd462ac23e 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -55,7 +55,7 @@ namespace osu.Game.Online.API private bool shouldFailNextLogin; private bool stayConnectingNextLogin; - private bool requiresTwoFactor; + private bool requiredSecondFactorAuth = true; /// /// The current connectivity state of the API. @@ -116,13 +116,15 @@ namespace osu.Game.Online.API Id = DUMMY_USER_ID, }; - if (requiresTwoFactor) + if (requiredSecondFactorAuth) { state.Value = APIState.RequiresSecondFactorAuth; - requiresTwoFactor = false; } else + { state.Value = APIState.Online; + requiredSecondFactorAuth = true; + } } public void AuthenticateSecondFactor(string code) @@ -154,7 +156,10 @@ namespace osu.Game.Online.API IBindableList IAPIProvider.Friends => Friends; IBindable IAPIProvider.Activity => Activity; - public void RequireTwoFactor() => requiresTwoFactor = true; + /// + /// Skip 2FA requirement for next login. + /// + public void SkipSecondFactor() => requiredSecondFactorAuth = false; /// /// During the next simulated login, the process will fail immediately. From 167f5b4ef401317b3721187147ec7a591288e092 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 16 Nov 2023 18:21:06 +0900 Subject: [PATCH 026/651] Tidy up localisations and connect missing links --- osu.Game/Overlays/Login/SecondFactorAuthForm.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/Login/SecondFactorAuthForm.cs b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs index cfec46c599..60c04eedee 100644 --- a/osu.Game/Overlays/Login/SecondFactorAuthForm.cs +++ b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs @@ -10,6 +10,7 @@ using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; using osu.Game.Overlays.Settings; +using osu.Game.Resources.Localisation.Web; using osuTK; namespace osu.Game.Overlays.Login @@ -75,13 +76,17 @@ namespace osu.Game.Overlays.Login }, }; - explainText.AddParagraph("Make sure to check your spam folder if you can't find the email."); + explainText.AddParagraph(UserVerificationStrings.BoxInfoCheckSpam); + // We can't support localisable strings with nested links yet. Not sure if we even can (probably need to allow markdown link formatting or something). explainText.AddParagraph("If you can't access your email or have forgotten what you used, please follow the "); - explainText.AddLink("email recovery process here", () => { }); + explainText.AddLink(UserVerificationStrings.BoxInfoRecoverLink, $"{api.WebsiteRootUrl}/home/password-reset"); explainText.AddText(". You can also "); - explainText.AddLink("request another code", () => { }); + explainText.AddLink(UserVerificationStrings.BoxInfoReissueLink, () => + { + // TODO: request another code. + }); explainText.AddText(" or "); - explainText.AddLink("sign out", () => { }); + explainText.AddLink(UserVerificationStrings.BoxInfoLogoutLink, () => { api.Logout(); }); explainText.AddText("."); codeTextBox.Current.BindValueChanged(code => From 7472dc9bb5e1e410023ab98d778c5380d1d2f958 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 16 Nov 2023 20:39:23 +0900 Subject: [PATCH 027/651] Update `APIState` checks --- osu.Game/Online/OnlineViewContainer.cs | 5 +++++ osu.Game/Overlays/AccountCreationOverlay.cs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/osu.Game/Online/OnlineViewContainer.cs b/osu.Game/Online/OnlineViewContainer.cs index 46f64fbb61..824da152b2 100644 --- a/osu.Game/Online/OnlineViewContainer.cs +++ b/osu.Game/Online/OnlineViewContainer.cs @@ -3,6 +3,7 @@ #nullable disable +using System; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; @@ -79,10 +80,14 @@ namespace osu.Game.Online case APIState.Failing: case APIState.Connecting: + case APIState.RequiresSecondFactorAuth: PopContentOut(Content); LoadingSpinner.Show(); placeholder.FadeOut(transform_duration / 2, Easing.OutQuint); break; + + default: + throw new ArgumentOutOfRangeException(); } }); diff --git a/osu.Game/Overlays/AccountCreationOverlay.cs b/osu.Game/Overlays/AccountCreationOverlay.cs index ef2e055eae..576ee92b48 100644 --- a/osu.Game/Overlays/AccountCreationOverlay.cs +++ b/osu.Game/Overlays/AccountCreationOverlay.cs @@ -3,6 +3,7 @@ #nullable disable +using System; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; @@ -118,12 +119,16 @@ namespace osu.Game.Overlays break; case APIState.Connecting: + case APIState.RequiresSecondFactorAuth: break; case APIState.Online: scheduledHide?.Cancel(); scheduledHide = Schedule(Hide); break; + + default: + throw new ArgumentOutOfRangeException(); } } } From c9de6a383d71829eb3ec23c4a7571b72480459c1 Mon Sep 17 00:00:00 2001 From: Susko3 Date: Wed, 27 Dec 2023 16:21:54 +0100 Subject: [PATCH 028/651] Add settings checkbox for `MinimiseOnFocusLossInFullscreen` Shown only on desktop platforms in fullscreen. "alt-tab" keyword also matches "alt" and "tab". --- osu.Game/Localisation/GraphicsSettingsStrings.cs | 5 +++++ .../Overlays/Settings/Sections/Graphics/LayoutSettings.cs | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/osu.Game/Localisation/GraphicsSettingsStrings.cs b/osu.Game/Localisation/GraphicsSettingsStrings.cs index 422704514f..fc29352ae2 100644 --- a/osu.Game/Localisation/GraphicsSettingsStrings.cs +++ b/osu.Game/Localisation/GraphicsSettingsStrings.cs @@ -155,6 +155,11 @@ namespace osu.Game.Localisation public static LocalisableString ChangeRendererConfirmation => new TranslatableString(getKey(@"change_renderer_configuration"), @"In order to change the renderer, the game will close. Please open it again."); + /// + /// "Minimise on focus loss" + /// + public static LocalisableString MinimiseOnFocusLoss => new TranslatableString(getKey(@"minimise_on_focus_loss"), @"Minimise on focus loss"); + private static string getKey(string key) => $"{prefix}:{key}"; } } diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs index a3290bc81c..adb572e245 100644 --- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs @@ -51,6 +51,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics private SettingsDropdown resolutionDropdown = null!; private SettingsDropdown displayDropdown = null!; private SettingsDropdown windowModeDropdown = null!; + private SettingsCheckbox minimiseOnFocusLossCheckbox = null!; private SettingsCheckbox safeAreaConsiderationsCheckbox = null!; private Bindable scalingPositionX = null!; @@ -106,6 +107,12 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics ItemSource = resolutions, Current = sizeFullscreen }, + minimiseOnFocusLossCheckbox = new SettingsCheckbox + { + LabelText = GraphicsSettingsStrings.MinimiseOnFocusLoss, + Current = config.GetBindable(FrameworkSetting.MinimiseOnFocusLossInFullscreen), + Keywords = new[] { "alt-tab" }, + }, safeAreaConsiderationsCheckbox = new SettingsCheckbox { LabelText = "Shrink game to avoid cameras and notches", @@ -255,6 +262,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics { resolutionDropdown.CanBeShown.Value = resolutions.Count > 1 && windowModeDropdown.Current.Value == WindowMode.Fullscreen; displayDropdown.CanBeShown.Value = displayDropdown.Items.Count() > 1; + minimiseOnFocusLossCheckbox.CanBeShown.Value = RuntimeInfo.IsDesktop && windowModeDropdown.Current.Value == WindowMode.Fullscreen; safeAreaConsiderationsCheckbox.CanBeShown.Value = host.Window?.SafeAreaPadding.Value.Total != Vector2.Zero; } From 0fde9cd6ae676c3bef39cd34182fbe0cfe338526 Mon Sep 17 00:00:00 2001 From: Susko3 Date: Wed, 27 Dec 2023 16:40:52 +0100 Subject: [PATCH 029/651] Override confine mouse mode only when clicking outside the window would minimise it --- osu.Game/Input/ConfineMouseTracker.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game/Input/ConfineMouseTracker.cs b/osu.Game/Input/ConfineMouseTracker.cs index de8660dbce..926f68df45 100644 --- a/osu.Game/Input/ConfineMouseTracker.cs +++ b/osu.Game/Input/ConfineMouseTracker.cs @@ -22,6 +22,7 @@ namespace osu.Game.Input { private Bindable frameworkConfineMode; private Bindable frameworkWindowMode; + private Bindable frameworkMinimiseOnFocusLossInFullscreen; private Bindable osuConfineMode; private IBindable localUserPlaying; @@ -31,7 +32,9 @@ namespace osu.Game.Input { frameworkConfineMode = frameworkConfigManager.GetBindable(FrameworkSetting.ConfineMouseMode); frameworkWindowMode = frameworkConfigManager.GetBindable(FrameworkSetting.WindowMode); + frameworkMinimiseOnFocusLossInFullscreen = frameworkConfigManager.GetBindable(FrameworkSetting.MinimiseOnFocusLossInFullscreen); frameworkWindowMode.BindValueChanged(_ => updateConfineMode()); + frameworkMinimiseOnFocusLossInFullscreen.BindValueChanged(_ => updateConfineMode()); osuConfineMode = osuConfigManager.GetBindable(OsuSetting.ConfineMouseMode); localUserPlaying = localUserInfo.IsPlaying.GetBoundCopy(); @@ -46,7 +49,8 @@ namespace osu.Game.Input if (frameworkConfineMode.Disabled) return; - if (frameworkWindowMode.Value == WindowMode.Fullscreen) + // override confine mode only when clicking outside the window minimises it. + if (frameworkWindowMode.Value == WindowMode.Fullscreen && frameworkMinimiseOnFocusLossInFullscreen.Value) { frameworkConfineMode.Value = ConfineMouseMode.Fullscreen; return; From a6bed04e50b6bcc7845ca85157bb2c6672c991d5 Mon Sep 17 00:00:00 2001 From: Susko3 Date: Wed, 27 Dec 2023 16:54:01 +0100 Subject: [PATCH 030/651] Update confine mode settings checkbox to match the new `ConfineMouseTracker` logic Not too happy with the duplicated logic, but settings can't depend on `ConfineMouseTracker` for testability reasons. --- .../Settings/Sections/Input/MouseSettings.cs | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs index 6bf06f4f98..7805ed5834 100644 --- a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs @@ -28,6 +28,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input private Bindable localSensitivity; private Bindable windowMode; + private Bindable minimiseOnFocusLoss; private SettingsEnumDropdown confineMouseModeSetting; private Bindable relativeMode; @@ -47,6 +48,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input relativeMode = mouseHandler.UseRelativeMode.GetBoundCopy(); windowMode = config.GetBindable(FrameworkSetting.WindowMode); + minimiseOnFocusLoss = config.GetBindable(FrameworkSetting.MinimiseOnFocusLossInFullscreen); Children = new Drawable[] { @@ -98,21 +100,8 @@ namespace osu.Game.Overlays.Settings.Sections.Input localSensitivity.BindValueChanged(val => handlerSensitivity.Value = val.NewValue); - windowMode.BindValueChanged(mode => - { - bool isFullscreen = mode.NewValue == WindowMode.Fullscreen; - - if (isFullscreen) - { - confineMouseModeSetting.Current.Disabled = true; - confineMouseModeSetting.TooltipText = MouseSettingsStrings.NotApplicableFullscreen; - } - else - { - confineMouseModeSetting.Current.Disabled = false; - confineMouseModeSetting.TooltipText = string.Empty; - } - }, true); + windowMode.BindValueChanged(_ => updateConfineMouseModeSettingVisibility()); + minimiseOnFocusLoss.BindValueChanged(_ => updateConfineMouseModeSettingVisibility(), true); highPrecisionMouse.Current.BindValueChanged(highPrecision => { @@ -126,6 +115,25 @@ namespace osu.Game.Overlays.Settings.Sections.Input }, true); } + /// + /// Updates disabled state and tooltip of to match when is overriding the confine mode. + /// + private void updateConfineMouseModeSettingVisibility() + { + bool confineModeOverriden = windowMode.Value == WindowMode.Fullscreen && minimiseOnFocusLoss.Value; + + if (confineModeOverriden) + { + confineMouseModeSetting.Current.Disabled = true; + confineMouseModeSetting.TooltipText = MouseSettingsStrings.NotApplicableFullscreen; + } + else + { + confineMouseModeSetting.Current.Disabled = false; + confineMouseModeSetting.TooltipText = string.Empty; + } + } + public partial class SensitivitySetting : SettingsSlider { public SensitivitySetting() From cbfcda79299e2ed2d42e720b81dcf6cd6f55984f Mon Sep 17 00:00:00 2001 From: Felipe Marins Date: Thu, 28 Dec 2023 00:10:01 -0300 Subject: [PATCH 031/651] Expose `SelectAll()` method on `ShearedSearchTextBox` --- osu.Game/Graphics/UserInterface/ShearedSearchTextBox.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Graphics/UserInterface/ShearedSearchTextBox.cs b/osu.Game/Graphics/UserInterface/ShearedSearchTextBox.cs index 131041e706..c3a9f8a586 100644 --- a/osu.Game/Graphics/UserInterface/ShearedSearchTextBox.cs +++ b/osu.Game/Graphics/UserInterface/ShearedSearchTextBox.cs @@ -48,6 +48,8 @@ namespace osu.Game.Graphics.UserInterface public void KillFocus() => textBox.KillFocus(); + public bool SelectAll() => textBox.SelectAll(); + public ShearedSearchTextBox() { Height = 42; From dce9204731972d81aaeedb42002de243b9c0742c Mon Sep 17 00:00:00 2001 From: Felipe Marins Date: Thu, 28 Dec 2023 00:10:44 -0300 Subject: [PATCH 032/651] Select search box text on ModSelectOverlay when mod selection changes --- osu.Game/Overlays/Mods/ModSelectOverlay.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index baa7e594c1..43f44d682d 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -565,6 +565,9 @@ namespace osu.Game.Overlays.Mods .ToArray(); SelectedMods.Value = ComputeNewModsFromSelection(SelectedMods.Value, candidateSelection); + + if (SearchTextBox.HasFocus) + SearchTextBox.SelectAll(); } #region Transition handling From 0c85fd496f9d555e1ec1c0b07fbebd2f9e8fd998 Mon Sep 17 00:00:00 2001 From: wooster0 Date: Sun, 31 Dec 2023 22:10:49 +0900 Subject: [PATCH 033/651] Don't leave scores screen empty if no scores are present yet Addresses https://github.com/ppy/osu/discussions/23787 I originally wanted to set `allowShowingResults` to false if there are no results but because this involves an API request to fetch the scores that would mean all the scores would have to be fetched all at once so that it knows whether to hide or show the "View results" button on a beatmap. Because that would slow things down and be very inefficient, this still allows the user to view the scores screen but if there aren't any scores, it shows a text, which I think is at least for now better than nothing. As for the testing of this, I wasn't sure how to not generate scores only for one specific test so I opted into not using `SetUpSteps` and doing it that way. --- .../TestScenePlaylistsResultsScreen.cs | 47 ++++++++++++++----- osu.Game/Screens/Ranking/ResultsScreen.cs | 35 ++++++++++---- osu.Game/Screens/Ranking/ScorePanelList.cs | 2 + 3 files changed, 63 insertions(+), 21 deletions(-) diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs index cb422d8c06..e36e7f54ba 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs @@ -42,15 +42,15 @@ namespace osu.Game.Tests.Visual.Playlists private int totalCount; private ScoreInfo userScore; - [SetUpSteps] - public override void SetUpSteps() + // We don't use SetUpSteps for this because one of the tests shouldn't receive any scores. + public void InitialiseUserScoresAndBeatmap(bool noScores = false) { base.SetUpSteps(); // Previous test instances of the results screen may still exist at this point so wait for // those screens to be cleaned up by the base SetUpSteps before re-initialising test state. - // The the screen also holds a leased Beatmap bindable so reassigning it must happen after - // the screen as been exited. + // The screen also holds a leased Beatmap bindable so reassigning it must happen after + // the screen has been exited. AddStep("initialise user scores and beatmap", () => { lowestScoreId = 1; @@ -63,7 +63,7 @@ namespace osu.Game.Tests.Visual.Playlists userScore.Statistics = new Dictionary(); userScore.MaximumStatistics = new Dictionary(); - bindHandler(); + bindHandler(noScores: noScores); // Beatmap is required to be an actual beatmap so the scores can get their scores correctly // calculated for standardised scoring, else the tests that rely on ordering will fall over. @@ -74,6 +74,8 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowWithUserScore() { + InitialiseUserScoresAndBeatmap(); + AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); createResults(() => userScore); @@ -86,6 +88,8 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowNullUserScore() { + InitialiseUserScoresAndBeatmap(); + createResults(); AddAssert("top score selected", () => this.ChildrenOfType().OrderByDescending(p => p.Score.TotalScore).First().State == PanelState.Expanded); @@ -94,6 +98,8 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowUserScoreWithDelay() { + InitialiseUserScoresAndBeatmap(); + AddStep("bind user score info handler", () => bindHandler(true, userScore)); createResults(() => userScore); @@ -105,6 +111,8 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowNullUserScoreWithDelay() { + InitialiseUserScoresAndBeatmap(); + AddStep("bind delayed handler", () => bindHandler(true)); createResults(); @@ -115,6 +123,8 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestFetchWhenScrolledToTheRight() { + InitialiseUserScoresAndBeatmap(); + createResults(); AddStep("bind delayed handler", () => bindHandler(true)); @@ -137,6 +147,8 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestFetchWhenScrolledToTheLeft() { + InitialiseUserScoresAndBeatmap(); + AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); createResults(() => userScore); @@ -158,7 +170,16 @@ namespace osu.Game.Tests.Visual.Playlists } } - private void createResults(Func getScore = null) + [Test] + public void TestShowWithNoScores() + { + InitialiseUserScoresAndBeatmap(noScores: true); + + createResults(noScores: true); + AddAssert("no scores visible", () => resultsScreen.ScorePanelList.GetScorePanels().Count() == 0); + } + + private void createResults(Func getScore = null, bool noScores = false) { AddStep("load results", () => { @@ -169,11 +190,13 @@ namespace osu.Game.Tests.Visual.Playlists }); AddUntilStep("wait for screen to load", () => resultsScreen.IsLoaded); - waitForDisplay(); + waitForDisplay(noScores); } - private void waitForDisplay() + private void waitForDisplay(bool noScores = false) { + if (noScores) return; + AddUntilStep("wait for scores loaded", () => requestComplete // request handler may need to fire more than once to get scores. @@ -183,7 +206,7 @@ namespace osu.Game.Tests.Visual.Playlists AddWaitStep("wait for display", 5); } - private void bindHandler(bool delayed = false, ScoreInfo userScore = null, bool failRequests = false) => ((DummyAPIAccess)API).HandleRequest = request => + private void bindHandler(bool delayed = false, ScoreInfo userScore = null, bool failRequests = false, bool noScores = false) => ((DummyAPIAccess)API).HandleRequest = request => { // pre-check for requests we should be handling (as they are scheduled below). switch (request) @@ -219,7 +242,7 @@ namespace osu.Game.Tests.Visual.Playlists break; case IndexPlaylistScoresRequest i: - triggerSuccess(i, createIndexResponse(i)); + triggerSuccess(i, createIndexResponse(i, noScores)); break; } }, delay); @@ -301,10 +324,12 @@ namespace osu.Game.Tests.Visual.Playlists return multiplayerUserScore; } - private IndexedMultiplayerScores createIndexResponse(IndexPlaylistScoresRequest req) + private IndexedMultiplayerScores createIndexResponse(IndexPlaylistScoresRequest req, bool noScores = false) { var result = new IndexedMultiplayerScores(); + if (noScores) return result; + string sort = req.IndexParams?.Properties["sort"].ToObject() ?? "score_desc"; for (int i = 1; i <= scores_per_result; i++) diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index e3d19725da..e18ab63706 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -19,6 +19,7 @@ using osu.Framework.Input.Events; using osu.Framework.Screens; using osu.Game.Graphics; using osu.Game.Graphics.Containers; +using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Input.Bindings; using osu.Game.Online.API; @@ -204,17 +205,31 @@ namespace osu.Game.Screens.Ranking if (lastFetchCompleted) { - APIRequest nextPageRequest = null; - - if (ScorePanelList.IsScrolledToStart) - nextPageRequest = FetchNextPage(-1, fetchScoresCallback); - else if (ScorePanelList.IsScrolledToEnd) - nextPageRequest = FetchNextPage(1, fetchScoresCallback); - - if (nextPageRequest != null) + if (ScorePanelList.IsEmpty) { - lastFetchCompleted = false; - api.Queue(nextPageRequest); + // This can happen if a beatmap part of a playlist hasn't been played yet. + VerticalScrollContent.Add(new OsuSpriteText + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Font = OsuFont.GetFont(size: 32, weight: FontWeight.Regular), + Text = "no scores yet!", + }); + } + else + { + APIRequest nextPageRequest = null; + + if (ScorePanelList.IsScrolledToStart) + nextPageRequest = FetchNextPage(-1, fetchScoresCallback); + else if (ScorePanelList.IsScrolledToEnd) + nextPageRequest = FetchNextPage(1, fetchScoresCallback); + + if (nextPageRequest != null) + { + lastFetchCompleted = false; + api.Queue(nextPageRequest); + } } } } diff --git a/osu.Game/Screens/Ranking/ScorePanelList.cs b/osu.Game/Screens/Ranking/ScorePanelList.cs index b75f3d86ff..95c90e35a0 100644 --- a/osu.Game/Screens/Ranking/ScorePanelList.cs +++ b/osu.Game/Screens/Ranking/ScorePanelList.cs @@ -49,6 +49,8 @@ namespace osu.Game.Screens.Ranking public bool AllPanelsVisible => flow.All(p => p.IsPresent); + public bool IsEmpty => flow.Count == 0; + /// /// The current scroll position. /// From 5eaf5fca2ad8d162835212151b8c1c530f7ca0f1 Mon Sep 17 00:00:00 2001 From: StanR Date: Tue, 2 Jan 2024 20:33:36 +0600 Subject: [PATCH 034/651] Add user card with global/country ranks for login overlay --- osu.Game/Overlays/Login/LoginPanel.cs | 7 +- osu.Game/Users/ExtendedUserPanel.cs | 9 -- osu.Game/Users/UserPanel.cs | 41 +++-- osu.Game/Users/UserRankPanel.cs | 212 ++++++++++++++++++++++++++ 4 files changed, 241 insertions(+), 28 deletions(-) create mode 100644 osu.Game/Users/UserRankPanel.cs diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs index 19af95459f..892d613ea4 100644 --- a/osu.Game/Overlays/Login/LoginPanel.cs +++ b/osu.Game/Overlays/Login/LoginPanel.cs @@ -30,7 +30,7 @@ namespace osu.Game.Overlays.Login [Resolved] private OsuColour colours { get; set; } = null!; - private UserGridPanel panel = null!; + private UserRankPanel panel = null!; private UserDropdown dropdown = null!; /// @@ -131,7 +131,7 @@ namespace osu.Game.Overlays.Login Text = LoginPanelStrings.SignedIn, Font = OsuFont.GetFont(size: 18, weight: FontWeight.Bold), }, - panel = new UserGridPanel(api.LocalUser.Value) + panel = new UserRankPanel(api.LocalUser.Value) { RelativeSizeAxes = Axes.X, Action = RequestHide @@ -140,9 +140,6 @@ namespace osu.Game.Overlays.Login }, }; - panel.Status.BindTo(api.LocalUser.Value.Status); - panel.Activity.BindTo(api.LocalUser.Value.Activity); - dropdown.Current.BindValueChanged(action => { switch (action.NewValue) diff --git a/osu.Game/Users/ExtendedUserPanel.cs b/osu.Game/Users/ExtendedUserPanel.cs index 1359f5d792..e33fb7a44e 100644 --- a/osu.Game/Users/ExtendedUserPanel.cs +++ b/osu.Game/Users/ExtendedUserPanel.cs @@ -3,7 +3,6 @@ #nullable disable -using osuTK; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions; @@ -53,14 +52,6 @@ namespace osu.Game.Users statusIcon.FinishTransforms(); } - protected UpdateableAvatar CreateAvatar() => new UpdateableAvatar(User, false); - - protected UpdateableFlag CreateFlag() => new UpdateableFlag(User.CountryCode) - { - Size = new Vector2(36, 26), - Action = Action, - }; - protected Container CreateStatusIcon() => statusIcon = new StatusIcon(); protected FillFlowContainer CreateStatusMessage(bool rightAlignedChildren) diff --git a/osu.Game/Users/UserPanel.cs b/osu.Game/Users/UserPanel.cs index b6a77e754d..d38f5d8ccc 100644 --- a/osu.Game/Users/UserPanel.cs +++ b/osu.Game/Users/UserPanel.cs @@ -23,6 +23,8 @@ using osu.Game.Localisation; using osu.Game.Online.Multiplayer; using osu.Game.Screens; using osu.Game.Screens.Play; +using osu.Game.Users.Drawables; +using osuTK; namespace osu.Game.Users { @@ -77,23 +79,18 @@ namespace osu.Game.Users { Masking = true; - AddRange(new[] + Add(new Box { - new Box - { - RelativeSizeAxes = Axes.Both, - Colour = ColourProvider?.Background5 ?? Colours.Gray1 - }, - Background = new UserCoverBackground - { - RelativeSizeAxes = Axes.Both, - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - User = User, - }, - CreateLayout() + RelativeSizeAxes = Axes.Both, + Colour = ColourProvider?.Background5 ?? Colours.Gray1 }); + var background = CreateBackground(); + if (background != null) + Add(background); + + Add(CreateLayout()); + base.Action = ViewProfile = () => { Action?.Invoke(); @@ -110,6 +107,22 @@ namespace osu.Game.Users Text = User.Username, }; + protected virtual Drawable? CreateBackground() => Background = new UserCoverBackground + { + RelativeSizeAxes = Axes.Both, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + User = User + }; + + protected UpdateableAvatar CreateAvatar() => new UpdateableAvatar(User, false); + + protected UpdateableFlag CreateFlag() => new UpdateableFlag(User.CountryCode) + { + Size = new Vector2(36, 26), + Action = Action, + }; + public MenuItem[] ContextMenuItems { get diff --git a/osu.Game/Users/UserRankPanel.cs b/osu.Game/Users/UserRankPanel.cs new file mode 100644 index 0000000000..272d2eecb4 --- /dev/null +++ b/osu.Game/Users/UserRankPanel.cs @@ -0,0 +1,212 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Extensions.LocalisationExtensions; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Input.Events; +using osu.Framework.Localisation; +using osu.Game.Online.API.Requests.Responses; +using osu.Game.Overlays.Profile.Header.Components; +using osu.Game.Resources.Localisation.Web; +using osuTK; + +namespace osu.Game.Users +{ + /// + /// User card that shows user's global and country ranks in the bottom. + /// Meant to be used in the toolbar login overlay. + /// + public partial class UserRankPanel : UserPanel + { + private const int padding = 10; + private const int main_content_height = 80; + + public UserRankPanel(APIUser user) + : base(user) + { + AutoSizeAxes = Axes.Y; + CornerRadius = 10; + } + + [BackgroundDependencyLoader] + private void load() + { + BorderColour = ColourProvider?.Light1 ?? Colours.GreyVioletLighter; + } + + protected override Drawable CreateLayout() + { + FillFlowContainer details; + + var layout = new Container + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Children = new Drawable[] + { + new Container + { + Name = "Main content", + RelativeSizeAxes = Axes.X, + Height = main_content_height, + CornerRadius = 10, + Masking = true, + Children = new Drawable[] + { + new UserCoverBackground + { + RelativeSizeAxes = Axes.Both, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + User = User, + Alpha = 0.3f + }, + new GridContainer + { + AutoSizeAxes = Axes.Y, + RelativeSizeAxes = Axes.X, + ColumnDimensions = new[] + { + new Dimension(GridSizeMode.Absolute, padding), + new Dimension(GridSizeMode.AutoSize), + new Dimension(), + new Dimension(GridSizeMode.Absolute, padding), + }, + RowDimensions = new[] + { + new Dimension(GridSizeMode.Absolute, padding), + new Dimension(GridSizeMode.AutoSize), + }, + Content = new[] + { + new[] + { + Empty(), + Empty(), + Empty(), + Empty() + }, + new[] + { + Empty(), + CreateAvatar().With(avatar => + { + avatar.Size = new Vector2(60); + avatar.Masking = true; + avatar.CornerRadius = 6; + }), + new Container + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = padding }, + Child = new GridContainer + { + RelativeSizeAxes = Axes.Both, + ColumnDimensions = new[] + { + new Dimension() + }, + RowDimensions = new[] + { + new Dimension(GridSizeMode.AutoSize), + new Dimension() + }, + Content = new[] + { + new Drawable[] + { + details = new FillFlowContainer + { + AutoSizeAxes = Axes.Both, + Direction = FillDirection.Horizontal, + Spacing = new Vector2(6), + Children = new Drawable[] + { + CreateFlag(), + } + } + }, + new Drawable[] + { + CreateUsername().With(username => + { + username.Anchor = Anchor.CentreLeft; + username.Origin = Anchor.CentreLeft; + }) + } + } + } + }, + Empty() + } + } + } + } + }, + new Container + { + Name = "Bottom content", + Margin = new MarginPadding { Top = main_content_height }, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Padding = new MarginPadding { Left = 80, Vertical = padding }, + Child = new GridContainer + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + ColumnDimensions = new[] + { + new Dimension(), + new Dimension() + }, + RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, + Content = new[] + { + new Drawable[] + { + new ProfileValueDisplay(true) + { + Title = UsersStrings.ShowRankGlobalSimple, + Content = User.Statistics?.GlobalRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" + }, + new ProfileValueDisplay(true) + { + Title = UsersStrings.ShowRankCountrySimple, + Content = User.Statistics?.CountryRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" + } + } + } + } + } + } + }; + + if (User.IsSupporter) + { + details.Add(new SupporterIcon + { + Height = 26, + SupportLevel = User.SupportLevel + }); + } + + return layout; + } + + protected override bool OnHover(HoverEvent e) + { + BorderThickness = 2; + return base.OnHover(e); + } + + protected override void OnHoverLost(HoverLostEvent e) + { + BorderThickness = 0; + base.OnHoverLost(e); + } + + protected override Drawable? CreateBackground() => null; + } +} From c4be6fa9741c5fdcf8c347bdec9bf5fe3641d3fb Mon Sep 17 00:00:00 2001 From: StanR Date: Wed, 3 Jan 2024 00:37:24 +0600 Subject: [PATCH 035/651] Fix code quality, add new cards to the test scene --- .../Visual/Online/TestSceneUserPanel.cs | 25 +++++++++++++++++-- osu.Game/Overlays/Login/LoginPanel.cs | 3 +-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs b/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs index b3b8fd78d3..81e17cd1b8 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs @@ -11,6 +11,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Beatmaps; using osu.Game.Online.API.Requests.Responses; +using osu.Game.Overlays; using osu.Game.Rulesets; using osu.Game.Rulesets.Osu; using osu.Game.Scoring; @@ -29,6 +30,9 @@ namespace osu.Game.Tests.Visual.Online private UserGridPanel boundPanel1; private TestUserListPanel boundPanel2; + [Cached] + private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple); + [Resolved] private IRulesetStore rulesetStore { get; set; } @@ -85,8 +89,25 @@ namespace osu.Game.Tests.Visual.Online CoverUrl = @"https://assets.ppy.sh/user-profile-covers/8195163/4a8e2ad5a02a2642b631438cfa6c6bd7e2f9db289be881cb27df18331f64144c.jpeg", IsOnline = false, LastVisit = DateTimeOffset.Now - }) - }, + }), + new UserRankPanel(new APIUser + { + Username = @"flyte", + Id = 3103765, + CountryCode = CountryCode.JP, + CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c6.jpg", + Statistics = new UserStatistics { GlobalRank = 12345, CountryRank = 1234 } + }) { Width = 300 }, + new UserRankPanel(new APIUser + { + Username = @"peppy", + Id = 2, + Colour = "99EB47", + CountryCode = CountryCode.AU, + CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg", + Statistics = new UserStatistics { GlobalRank = null, CountryRank = null } + }) { Width = 300 } + } }; boundPanel1.Status.BindTo(status); diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs index 892d613ea4..57a9f4035c 100644 --- a/osu.Game/Overlays/Login/LoginPanel.cs +++ b/osu.Game/Overlays/Login/LoginPanel.cs @@ -30,7 +30,6 @@ namespace osu.Game.Overlays.Login [Resolved] private OsuColour colours { get; set; } = null!; - private UserRankPanel panel = null!; private UserDropdown dropdown = null!; /// @@ -131,7 +130,7 @@ namespace osu.Game.Overlays.Login Text = LoginPanelStrings.SignedIn, Font = OsuFont.GetFont(size: 18, weight: FontWeight.Bold), }, - panel = new UserRankPanel(api.LocalUser.Value) + new UserRankPanel(api.LocalUser.Value) { RelativeSizeAxes = Axes.X, Action = RequestHide From 3df7430d2e278cbd3dacc173270053e6a415af07 Mon Sep 17 00:00:00 2001 From: StanR Date: Wed, 3 Jan 2024 14:32:32 +0600 Subject: [PATCH 036/651] Bind `UserRankPanel` values to `Statistics` bindable in `APIAccess` --- .../Visual/Online/TestSceneUserPanel.cs | 18 ++++++++++++++++++ osu.Game/Users/UserRankPanel.cs | 17 +++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs b/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs index 81e17cd1b8..4df34e6244 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs @@ -9,6 +9,7 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Utils; using osu.Game.Beatmaps; using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays; @@ -157,6 +158,23 @@ namespace osu.Game.Tests.Visual.Online AddAssert("visit message is not visible", () => !boundPanel2.LastVisitMessage.IsPresent); } + [Test] + public void TestUserStatisticsChange() + { + AddStep("update statistics", () => + { + API.UpdateStatistics(new UserStatistics + { + GlobalRank = RNG.Next(100000), + CountryRank = RNG.Next(100000) + }); + }); + AddStep("set statistics to empty", () => + { + API.UpdateStatistics(new UserStatistics()); + }); + } + private UserActivity soloGameStatusForRuleset(int rulesetId) => new UserActivity.InSoloGame(new BeatmapInfo(), rulesetStore.GetRuleset(rulesetId)!); private ScoreInfo createScore(string name) => new ScoreInfo(new TestBeatmap(Ruleset.Value).BeatmapInfo) diff --git a/osu.Game/Users/UserRankPanel.cs b/osu.Game/Users/UserRankPanel.cs index 272d2eecb4..74ff0a06dd 100644 --- a/osu.Game/Users/UserRankPanel.cs +++ b/osu.Game/Users/UserRankPanel.cs @@ -7,6 +7,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Events; using osu.Framework.Localisation; +using osu.Game.Online.API; using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays.Profile.Header.Components; using osu.Game.Resources.Localisation.Web; @@ -23,6 +24,12 @@ namespace osu.Game.Users private const int padding = 10; private const int main_content_height = 80; + [Resolved] + private IAPIProvider api { get; set; } = null!; + + private ProfileValueDisplay globalRankDisplay = null!; + private ProfileValueDisplay countryRankDisplay = null!; + public UserRankPanel(APIUser user) : base(user) { @@ -34,6 +41,12 @@ namespace osu.Game.Users private void load() { BorderColour = ColourProvider?.Light1 ?? Colours.GreyVioletLighter; + + api.Statistics.ValueChanged += e => + { + globalRankDisplay.Content = e.NewValue?.GlobalRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-"; + countryRankDisplay.Content = e.NewValue?.CountryRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-"; + }; } protected override Drawable CreateLayout() @@ -166,12 +179,12 @@ namespace osu.Game.Users { new Drawable[] { - new ProfileValueDisplay(true) + globalRankDisplay = new ProfileValueDisplay(true) { Title = UsersStrings.ShowRankGlobalSimple, Content = User.Statistics?.GlobalRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" }, - new ProfileValueDisplay(true) + countryRankDisplay = new ProfileValueDisplay(true) { Title = UsersStrings.ShowRankCountrySimple, Content = User.Statistics?.CountryRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" From d34f30f6ad1a2c5071eddb2ed1763465be3cc70b Mon Sep 17 00:00:00 2001 From: StanR Date: Wed, 3 Jan 2024 14:37:57 +0600 Subject: [PATCH 037/651] Add `Statistics` bindable to `IAPIProvider` and update it from `SoloStatisticsWatcher` --- osu.Game/Online/API/APIAccess.cs | 14 +++++++++++++- osu.Game/Online/API/DummyAPIAccess.cs | 14 ++++++++++++++ osu.Game/Online/API/IAPIProvider.cs | 10 ++++++++++ osu.Game/Online/Solo/SoloStatisticsWatcher.cs | 2 ++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index be5bdeca77..3910f1efea 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -53,6 +53,7 @@ namespace osu.Game.Online.API public IBindable LocalUser => localUser; public IBindableList Friends => friends; public IBindable Activity => activity; + public IBindable Statistics => statistics; public Language Language => game.CurrentLanguage.Value; @@ -65,6 +66,8 @@ namespace osu.Game.Online.API private Bindable configStatus { get; } = new Bindable(); private Bindable localUserStatus { get; } = new Bindable(); + private Bindable statistics { get; } = new Bindable(); + protected bool HasLogin => authentication.Token.Value != null || (!string.IsNullOrEmpty(ProvidedUsername) && !string.IsNullOrEmpty(password)); private readonly CancellationTokenSource cancellationToken = new CancellationTokenSource(); @@ -517,9 +520,18 @@ namespace osu.Game.Online.API flushQueue(); } + public void UpdateStatistics(UserStatistics newStatistics) + { + statistics.Value = newStatistics; + } + private static APIUser createGuestUser() => new GuestUser(); - private void setLocalUser(APIUser user) => Scheduler.Add(() => localUser.Value = user, false); + private void setLocalUser(APIUser user) => Scheduler.Add(() => + { + localUser.Value = user; + statistics.Value = user.Statistics; + }, false); protected override void Dispose(bool isDisposing) { diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index d585124db6..aa8658cc83 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -28,6 +28,8 @@ namespace osu.Game.Online.API public Bindable Activity { get; } = new Bindable(); + public Bindable Statistics { get; } = new Bindable(); + public Language Language => Language.en; public string AccessToken => "token"; @@ -115,6 +117,12 @@ namespace osu.Game.Online.API Id = DUMMY_USER_ID, }; + Statistics.Value = new UserStatistics + { + GlobalRank = 1, + CountryRank = 1 + }; + state.Value = APIState.Online; } @@ -126,6 +134,11 @@ namespace osu.Game.Online.API LocalUser.Value = new GuestUser(); } + public void UpdateStatistics(UserStatistics newStatistics) + { + Statistics.Value = newStatistics; + } + public IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null; public NotificationsClientConnector GetNotificationsConnector() => new PollingNotificationsClientConnector(this); @@ -141,6 +154,7 @@ namespace osu.Game.Online.API IBindable IAPIProvider.LocalUser => LocalUser; IBindableList IAPIProvider.Friends => Friends; IBindable IAPIProvider.Activity => Activity; + IBindable IAPIProvider.Statistics => Statistics; /// /// During the next simulated login, the process will fail immediately. diff --git a/osu.Game/Online/API/IAPIProvider.cs b/osu.Game/Online/API/IAPIProvider.cs index a1d7006c8c..b58d4a363a 100644 --- a/osu.Game/Online/API/IAPIProvider.cs +++ b/osu.Game/Online/API/IAPIProvider.cs @@ -28,6 +28,11 @@ namespace osu.Game.Online.API /// IBindable Activity { get; } + /// + /// The current user's online statistics. + /// + IBindable Statistics { get; } + /// /// The language supplied by this provider to API requests. /// @@ -111,6 +116,11 @@ namespace osu.Game.Online.API /// void Logout(); + /// + /// Sets Statistics bindable. + /// + void UpdateStatistics(UserStatistics newStatistics); + /// /// Constructs a new . May be null if not supported. /// diff --git a/osu.Game/Online/Solo/SoloStatisticsWatcher.cs b/osu.Game/Online/Solo/SoloStatisticsWatcher.cs index 46449fea73..55b27fb364 100644 --- a/osu.Game/Online/Solo/SoloStatisticsWatcher.cs +++ b/osu.Game/Online/Solo/SoloStatisticsWatcher.cs @@ -127,6 +127,8 @@ namespace osu.Game.Online.Solo { string rulesetName = callback.Score.Ruleset.ShortName; + api.UpdateStatistics(updatedStatistics); + if (latestStatistics == null) return; From 7262fef67f5c0abc51b78f8aa643c3b68d9bbbe3 Mon Sep 17 00:00:00 2001 From: StanR Date: Wed, 3 Jan 2024 17:39:48 +0600 Subject: [PATCH 038/651] Add comments --- osu.Game/Users/UserGridPanel.cs | 2 ++ osu.Game/Users/UserPanel.cs | 17 ++++++++++------- osu.Game/Users/UserRankPanel.cs | 6 ++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/osu.Game/Users/UserGridPanel.cs b/osu.Game/Users/UserGridPanel.cs index aac2315b2f..fe3435c248 100644 --- a/osu.Game/Users/UserGridPanel.cs +++ b/osu.Game/Users/UserGridPanel.cs @@ -91,6 +91,7 @@ namespace osu.Game.Users Children = new Drawable[] { CreateFlag(), + // supporter icon is being added later } } }, @@ -108,6 +109,7 @@ namespace osu.Game.Users }, new[] { + // padding Empty(), Empty() }, diff --git a/osu.Game/Users/UserPanel.cs b/osu.Game/Users/UserPanel.cs index d38f5d8ccc..ef5c95c422 100644 --- a/osu.Game/Users/UserPanel.cs +++ b/osu.Game/Users/UserPanel.cs @@ -100,13 +100,9 @@ namespace osu.Game.Users protected abstract Drawable CreateLayout(); - protected OsuSpriteText CreateUsername() => new OsuSpriteText - { - Font = OsuFont.GetFont(size: 16, weight: FontWeight.Bold), - Shadow = false, - Text = User.Username, - }; - + /// + /// Panel background container. Can be null if a panel doesn't want a background under it's layout + /// protected virtual Drawable? CreateBackground() => Background = new UserCoverBackground { RelativeSizeAxes = Axes.Both, @@ -115,6 +111,13 @@ namespace osu.Game.Users User = User }; + protected OsuSpriteText CreateUsername() => new OsuSpriteText + { + Font = OsuFont.GetFont(size: 16, weight: FontWeight.Bold), + Shadow = false, + Text = User.Username, + }; + protected UpdateableAvatar CreateAvatar() => new UpdateableAvatar(User, false); protected UpdateableFlag CreateFlag() => new UpdateableFlag(User.CountryCode) diff --git a/osu.Game/Users/UserRankPanel.cs b/osu.Game/Users/UserRankPanel.cs index 74ff0a06dd..a2e234cf82 100644 --- a/osu.Game/Users/UserRankPanel.cs +++ b/osu.Game/Users/UserRankPanel.cs @@ -96,6 +96,7 @@ namespace osu.Game.Users { new[] { + // padding Empty(), Empty(), Empty(), @@ -103,7 +104,7 @@ namespace osu.Game.Users }, new[] { - Empty(), + Empty(), // padding CreateAvatar().With(avatar => { avatar.Size = new Vector2(60); @@ -138,6 +139,7 @@ namespace osu.Game.Users Children = new Drawable[] { CreateFlag(), + // supporter icon is being added later } } }, @@ -152,7 +154,7 @@ namespace osu.Game.Users } } }, - Empty() + Empty() // padding } } } From e240443c467436a470c12fd77b3035b7720a8cdd Mon Sep 17 00:00:00 2001 From: StanR Date: Wed, 3 Jan 2024 18:15:32 +0600 Subject: [PATCH 039/651] Update `LocalUser` statistics, add test --- .../Online/TestSceneSoloStatisticsWatcher.cs | 20 +++++++++++++++++++ osu.Game/Online/API/APIAccess.cs | 3 +++ osu.Game/Online/API/DummyAPIAccess.cs | 3 +++ 3 files changed, 26 insertions(+) diff --git a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs index e62e53bd02..be819afa3e 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs @@ -268,6 +268,26 @@ namespace osu.Game.Tests.Visual.Online AddAssert("update not received", () => update == null); } + [Test] + public void TestGlobalStatisticsUpdatedAfterRegistrationAddedAndScoreProcessed() + { + int userId = getUserId(); + long scoreId = getScoreId(); + setUpUser(userId); + + var ruleset = new OsuRuleset().RulesetInfo; + + SoloStatisticsUpdate? update = null; + registerForUpdates(scoreId, ruleset, receivedUpdate => update = receivedUpdate); + + feignScoreProcessing(userId, ruleset, 5_000_000); + + AddStep("signal score processed", () => ((ISpectatorClient)spectatorClient).UserScoreProcessed(userId, scoreId)); + AddUntilStep("update received", () => update != null); + AddAssert("local user values are correct", () => dummyAPI.LocalUser.Value.Statistics.TotalScore, () => Is.EqualTo(5_000_000)); + AddAssert("statistics values are correct", () => dummyAPI.Statistics.Value!.TotalScore, () => Is.EqualTo(5_000_000)); + } + private int nextUserId = 2000; private long nextScoreId = 50000; diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 3910f1efea..17bf8bcc37 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -523,6 +523,9 @@ namespace osu.Game.Online.API public void UpdateStatistics(UserStatistics newStatistics) { statistics.Value = newStatistics; + + if (IsLoggedIn) + localUser.Value.Statistics = newStatistics; } private static APIUser createGuestUser() => new GuestUser(); diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index aa8658cc83..4b4f8061e0 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -137,6 +137,9 @@ namespace osu.Game.Online.API public void UpdateStatistics(UserStatistics newStatistics) { Statistics.Value = newStatistics; + + if (IsLoggedIn) + LocalUser.Value.Statistics = newStatistics; } public IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null; From 2c64db06287b40811e742f785664eafac09093c5 Mon Sep 17 00:00:00 2001 From: wooster0 Date: Thu, 4 Jan 2024 12:15:48 +0900 Subject: [PATCH 040/651] Use already existing message placeholder + localized string --- osu.Game/Screens/Ranking/ResultsScreen.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index e18ab63706..8823e4d320 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -19,10 +19,11 @@ using osu.Framework.Input.Events; using osu.Framework.Screens; using osu.Game.Graphics; using osu.Game.Graphics.Containers; -using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Input.Bindings; +using osu.Game.Localisation; using osu.Game.Online.API; +using osu.Game.Online.Placeholders; using osu.Game.Scoring; using osu.Game.Screens.Play; using osu.Game.Screens.Ranking.Statistics; @@ -208,13 +209,7 @@ namespace osu.Game.Screens.Ranking if (ScorePanelList.IsEmpty) { // This can happen if a beatmap part of a playlist hasn't been played yet. - VerticalScrollContent.Add(new OsuSpriteText - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Font = OsuFont.GetFont(size: 32, weight: FontWeight.Regular), - Text = "no scores yet!", - }); + VerticalScrollContent.Add(new MessagePlaceholder(LeaderboardStrings.NoRecordsYet)); } else { From bb2b7d3c313ab8c2e78ca9a790de290f874c0b6d Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 12:23:01 +0800 Subject: [PATCH 041/651] Add playback controls. --- .../Play/PlayerSettings/PlaybackSettings.cs | 117 ++++++++++++++++-- 1 file changed, 105 insertions(+), 12 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 4753effdb0..69bfe666ee 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -1,11 +1,17 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; +using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Game.Beatmaps; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; +using osu.Game.Graphics.UserInterface; +using osuTK; namespace osu.Game.Screens.Play.PlayerSettings { @@ -24,34 +30,115 @@ namespace osu.Game.Screens.Play.PlayerSettings private readonly OsuSpriteText multiplierText; + private readonly IconButton play; + + [Resolved] + private GameplayClockContainer gameplayClock { get; set; } = null!; + + [Resolved] + private GameplayState gameplayState { get; set; } = null!; + public PlaybackSettings() : base("playback") { + const double seek_amount = 5000; + const double seek_fast_amount = 10000; + Children = new Drawable[] { - new Container + new FillFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Padding = new MarginPadding { Horizontal = padding }, + Direction = FillDirection.Vertical, + Spacing = new Vector2(0, padding), Children = new Drawable[] { - new OsuSpriteText + new FillFlowContainer { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - Text = "Playback speed", + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Direction = FillDirection.Horizontal, + Spacing = new Vector2(5, 0), + Children = new Drawable[] + { + new IconButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Icon = FontAwesome.Solid.FastBackward, + Action = () => seek(-1, seek_fast_amount), + }, + new IconButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Icon = FontAwesome.Solid.Backward, + Action = () => seek(-1, seek_amount), + }, + play = new IconButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Scale = new Vector2(1.4f), + IconScale = new Vector2(1.4f), + Icon = FontAwesome.Regular.PlayCircle, + Action = () => + { + if (gameplayClock != null) + { + if (gameplayClock.IsRunning) + gameplayClock.Stop(); + else + gameplayClock.Start(); + } + } + }, + new IconButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Icon = FontAwesome.Solid.Forward, + Action = () => seek(1, seek_amount), + }, + new IconButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Icon = FontAwesome.Solid.FastForward, + Action = () => seek(1, seek_fast_amount), + }, + }, }, - multiplierText = new OsuSpriteText + new Container { - Anchor = Anchor.CentreRight, - Origin = Anchor.CentreRight, - Font = OsuFont.GetFont(weight: FontWeight.Bold), - } + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Children = new Drawable[] + { + rateSlider = new PlayerSliderBar + { + LabelText = "Playback speed", + Current = UserPlaybackRate, + }, + multiplierText = new OsuSpriteText + { + Anchor = Anchor.TopRight, + Origin = Anchor.TopRight, + Font = OsuFont.GetFont(weight: FontWeight.Bold), + Margin = new MarginPadding { Right = 20 }, + } + }, + }, }, }, - rateSlider = new PlayerSliderBar { Current = UserPlaybackRate } }; + + void seek(int direction, double amount) + { + double target = Math.Clamp((gameplayClock?.CurrentTime ?? 0) + (direction * amount), 0, gameplayState.Beatmap.GetLastObjectTime()); + gameplayClock?.Seek(target); + } } protected override void LoadComplete() @@ -59,5 +146,11 @@ namespace osu.Game.Screens.Play.PlayerSettings base.LoadComplete(); rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.0}x", true); } + + protected override void Update() + { + base.Update(); + play.Icon = gameplayClock.IsRunning ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle; + } } } From 2e041823a15b2720c90c0f2fbcdf8afcee8417df Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 12:24:09 +0800 Subject: [PATCH 042/651] Perform null check on gameplay state. --- osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 69bfe666ee..3662b7ddc8 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -136,7 +136,7 @@ namespace osu.Game.Screens.Play.PlayerSettings void seek(int direction, double amount) { - double target = Math.Clamp((gameplayClock?.CurrentTime ?? 0) + (direction * amount), 0, gameplayState.Beatmap.GetLastObjectTime()); + double target = Math.Clamp((gameplayClock?.CurrentTime ?? 0) + (direction * amount), 0, gameplayState?.Beatmap.GetLastObjectTime() ?? 0); gameplayClock?.Seek(target); } } From afa808695bf9c6060f2f706c15172861e1c56269 Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 12:48:11 +0800 Subject: [PATCH 043/651] Make resolved properties nullable. --- osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 3662b7ddc8..2a8701d4d5 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -33,10 +33,10 @@ namespace osu.Game.Screens.Play.PlayerSettings private readonly IconButton play; [Resolved] - private GameplayClockContainer gameplayClock { get; set; } = null!; + private GameplayClockContainer? gameplayClock { get; set; } [Resolved] - private GameplayState gameplayState { get; set; } = null!; + private GameplayState? gameplayState { get; set; } public PlaybackSettings() : base("playback") @@ -150,7 +150,7 @@ namespace osu.Game.Screens.Play.PlayerSettings protected override void Update() { base.Update(); - play.Icon = gameplayClock.IsRunning ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle; + play.Icon = gameplayClock?.IsRunning == true ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle; } } } From 1f6e1cbe56d5f0dce5c3fe60f779bdd66c5fe655 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 9 Jan 2024 14:45:21 +0900 Subject: [PATCH 044/651] Allow interacting with playlist item buttons when not selected --- .../Screens/OnlinePlay/DrawableRoomPlaylist.cs | 6 +++++- .../OnlinePlay/DrawableRoomPlaylistItem.cs | 16 +++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylist.cs b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylist.cs index 8abdec9ade..5a1648c91f 100644 --- a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylist.cs +++ b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylist.cs @@ -165,7 +165,11 @@ namespace osu.Game.Screens.OnlinePlay { d.SelectedItem.BindTarget = SelectedItem; d.RequestDeletion = i => RequestDeletion?.Invoke(i); - d.RequestResults = i => RequestResults?.Invoke(i); + d.RequestResults = i => + { + SelectedItem.Value = i; + RequestResults?.Invoke(i); + }; d.RequestEdit = i => RequestEdit?.Invoke(i); d.AllowReordering = AllowReordering; d.AllowDeletion = AllowDeletion; diff --git a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs index 8f405399a7..823f6ea308 100644 --- a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs +++ b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs @@ -118,8 +118,6 @@ namespace osu.Game.Screens.OnlinePlay [Resolved(CanBeNull = true)] private ManageCollectionsDialog manageCollectionsDialog { get; set; } - protected override bool ShouldBeConsideredForInput(Drawable child) => AllowReordering || AllowDeletion || !AllowSelection || SelectedItem.Value == Model; - public DrawableRoomPlaylistItem(PlaylistItem item) : base(item) { @@ -367,7 +365,7 @@ namespace osu.Game.Screens.OnlinePlay AutoSizeAxes = Axes.Both, Margin = new MarginPadding { Left = 8, Right = 8 }, }, - mainFillFlow = new FillFlowContainer + mainFillFlow = new MainFlow(() => SelectedItem.Value == Model) { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, @@ -670,5 +668,17 @@ namespace osu.Game.Screens.OnlinePlay public LocalisableString TooltipText => avatar.TooltipText; } } + + public partial class MainFlow : FillFlowContainer + { + private readonly Func isSelected; + + public override bool PropagatePositionalInputSubTree => isSelected(); + + public MainFlow(Func isSelected) + { + this.isSelected = isSelected; + } + } } } From 99c76854956f1d6f3116a462fa6af4f0320500c6 Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 15:18:21 +0800 Subject: [PATCH 045/651] use `GameplayClock.IsPaused` bindable instead of polling in `Update` --- .../Screens/Play/PlayerSettings/PlaybackSettings.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 2a8701d4d5..a0fafb821c 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -32,6 +32,8 @@ namespace osu.Game.Screens.Play.PlayerSettings private readonly IconButton play; + private readonly BindableBool isPaused = new BindableBool(); + [Resolved] private GameplayClockContainer? gameplayClock { get; set; } @@ -134,6 +136,8 @@ namespace osu.Game.Screens.Play.PlayerSettings }, }; + isPaused.BindValueChanged(e => play.Icon = e.NewValue ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle, true); + void seek(int direction, double amount) { double target = Math.Clamp((gameplayClock?.CurrentTime ?? 0) + (direction * amount), 0, gameplayState?.Beatmap.GetLastObjectTime() ?? 0); @@ -145,12 +149,7 @@ namespace osu.Game.Screens.Play.PlayerSettings { base.LoadComplete(); rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.0}x", true); - } - - protected override void Update() - { - base.Update(); - play.Icon = gameplayClock?.IsRunning == true ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle; + gameplayClock?.IsPaused.BindTo(isPaused); } } } From bdecac6d797661836279482a031ee97d3aae955a Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 15:19:54 +0800 Subject: [PATCH 046/651] Inverse check. --- osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index a0fafb821c..7974b07438 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -136,7 +136,7 @@ namespace osu.Game.Screens.Play.PlayerSettings }, }; - isPaused.BindValueChanged(e => play.Icon = e.NewValue ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle, true); + isPaused.BindValueChanged(e => play.Icon = !e.NewValue ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle, true); void seek(int direction, double amount) { From 63961ea276a282f681e1b57866ad36dbb3d472e1 Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 16:08:29 +0800 Subject: [PATCH 047/651] use `RepeatingButtonBehavior` for seek buttons --- .../Play/PlayerSettings/PlaybackSettings.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 7974b07438..6e1ce39d9b 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -11,6 +11,7 @@ using osu.Game.Beatmaps; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; +using osu.Game.Screens.Edit.Timing; using osuTK; namespace osu.Game.Screens.Play.PlayerSettings @@ -64,14 +65,14 @@ namespace osu.Game.Screens.Play.PlayerSettings Spacing = new Vector2(5, 0), Children = new Drawable[] { - new IconButton + new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastBackward, Action = () => seek(-1, seek_fast_amount), }, - new IconButton + new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, @@ -96,14 +97,14 @@ namespace osu.Game.Screens.Play.PlayerSettings } } }, - new IconButton + new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.Forward, Action = () => seek(1, seek_amount), }, - new IconButton + new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, @@ -151,5 +152,13 @@ namespace osu.Game.Screens.Play.PlayerSettings rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.0}x", true); gameplayClock?.IsPaused.BindTo(isPaused); } + + private partial class SeekButton : IconButton + { + public SeekButton() + { + AddInternal(new RepeatingButtonBehaviour(this)); + } + } } } From c081ca21451baa684c343c8a019b90432a4c1336 Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 16:30:48 +0800 Subject: [PATCH 048/651] Make field to a local. --- osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 6e1ce39d9b..e208be6095 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -31,8 +31,6 @@ namespace osu.Game.Screens.Play.PlayerSettings private readonly OsuSpriteText multiplierText; - private readonly IconButton play; - private readonly BindableBool isPaused = new BindableBool(); [Resolved] @@ -47,6 +45,8 @@ namespace osu.Game.Screens.Play.PlayerSettings const double seek_amount = 5000; const double seek_fast_amount = 10000; + IconButton play; + Children = new Drawable[] { new FillFlowContainer From 8ad697ff4cea857bec7f18a94723b098c6e036ef Mon Sep 17 00:00:00 2001 From: wooster0 Date: Tue, 9 Jan 2024 21:28:46 +0900 Subject: [PATCH 049/651] apply some suggestions/corrections --- .../TestScenePlaylistsResultsScreen.cs | 16 ++++++---- osu.Game/Screens/Ranking/ResultsScreen.cs | 32 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs index e36e7f54ba..98aeb66428 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs @@ -79,6 +79,7 @@ namespace osu.Game.Tests.Visual.Playlists AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); createResults(() => userScore); + waitForDisplay(); AddAssert("user score selected", () => this.ChildrenOfType().Single(p => p.Score.OnlineID == userScore.OnlineID).State == PanelState.Expanded); AddAssert($"score panel position is {real_user_position}", @@ -91,6 +92,7 @@ namespace osu.Game.Tests.Visual.Playlists InitialiseUserScoresAndBeatmap(); createResults(); + waitForDisplay(); AddAssert("top score selected", () => this.ChildrenOfType().OrderByDescending(p => p.Score.TotalScore).First().State == PanelState.Expanded); } @@ -103,6 +105,7 @@ namespace osu.Game.Tests.Visual.Playlists AddStep("bind user score info handler", () => bindHandler(true, userScore)); createResults(() => userScore); + waitForDisplay(); AddAssert("more than 1 panel displayed", () => this.ChildrenOfType().Count() > 1); AddAssert("user score selected", () => this.ChildrenOfType().Single(p => p.Score.OnlineID == userScore.OnlineID).State == PanelState.Expanded); @@ -116,6 +119,7 @@ namespace osu.Game.Tests.Visual.Playlists AddStep("bind delayed handler", () => bindHandler(true)); createResults(); + waitForDisplay(); AddAssert("top score selected", () => this.ChildrenOfType().OrderByDescending(p => p.Score.TotalScore).First().State == PanelState.Expanded); } @@ -126,6 +130,7 @@ namespace osu.Game.Tests.Visual.Playlists InitialiseUserScoresAndBeatmap(); createResults(); + waitForDisplay(); AddStep("bind delayed handler", () => bindHandler(true)); @@ -152,6 +157,7 @@ namespace osu.Game.Tests.Visual.Playlists AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); createResults(() => userScore); + waitForDisplay(); AddStep("bind delayed handler", () => bindHandler(true)); @@ -174,12 +180,11 @@ namespace osu.Game.Tests.Visual.Playlists public void TestShowWithNoScores() { InitialiseUserScoresAndBeatmap(noScores: true); - - createResults(noScores: true); + createResults(); AddAssert("no scores visible", () => resultsScreen.ScorePanelList.GetScorePanels().Count() == 0); } - private void createResults(Func getScore = null, bool noScores = false) + private void createResults(Func getScore = null) { AddStep("load results", () => { @@ -190,13 +195,10 @@ namespace osu.Game.Tests.Visual.Playlists }); AddUntilStep("wait for screen to load", () => resultsScreen.IsLoaded); - waitForDisplay(noScores); } - private void waitForDisplay(bool noScores = false) + private void waitForDisplay() { - if (noScores) return; - AddUntilStep("wait for scores loaded", () => requestComplete // request handler may need to fire more than once to get scores. diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index 8823e4d320..697d62ad6e 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -206,25 +206,17 @@ namespace osu.Game.Screens.Ranking if (lastFetchCompleted) { - if (ScorePanelList.IsEmpty) - { - // This can happen if a beatmap part of a playlist hasn't been played yet. - VerticalScrollContent.Add(new MessagePlaceholder(LeaderboardStrings.NoRecordsYet)); - } - else - { - APIRequest nextPageRequest = null; + APIRequest nextPageRequest = null; - if (ScorePanelList.IsScrolledToStart) - nextPageRequest = FetchNextPage(-1, fetchScoresCallback); - else if (ScorePanelList.IsScrolledToEnd) - nextPageRequest = FetchNextPage(1, fetchScoresCallback); + if (ScorePanelList.IsScrolledToStart) + nextPageRequest = FetchNextPage(-1, fetchScoresCallback); + else if (ScorePanelList.IsScrolledToEnd) + nextPageRequest = FetchNextPage(1, fetchScoresCallback); - if (nextPageRequest != null) - { - lastFetchCompleted = false; - api.Queue(nextPageRequest); - } + if (nextPageRequest != null) + { + lastFetchCompleted = false; + api.Queue(nextPageRequest); } } } @@ -255,6 +247,12 @@ namespace osu.Game.Screens.Ranking addScore(s); lastFetchCompleted = true; + + if (ScorePanelList.IsEmpty) + { + // This can happen if for example a beatmap that is part of a playlist hasn't been played yet. + VerticalScrollContent.Add(new MessagePlaceholder(LeaderboardStrings.NoRecordsYet)); + } }); public override void OnEntering(ScreenTransitionEvent e) From ea37c70e0b0e032e84a9fa1ee7c902c1a7cb2c2e Mon Sep 17 00:00:00 2001 From: wooster0 Date: Tue, 9 Jan 2024 21:34:40 +0900 Subject: [PATCH 050/651] apply suggestion --- .../TestScenePlaylistsResultsScreen.cs | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs index 98aeb66428..02bd7f950f 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs @@ -42,8 +42,8 @@ namespace osu.Game.Tests.Visual.Playlists private int totalCount; private ScoreInfo userScore; - // We don't use SetUpSteps for this because one of the tests shouldn't receive any scores. - public void InitialiseUserScoresAndBeatmap(bool noScores = false) + [SetUpSteps] + public override void SetUpSteps() { base.SetUpSteps(); @@ -63,18 +63,24 @@ namespace osu.Game.Tests.Visual.Playlists userScore.Statistics = new Dictionary(); userScore.MaximumStatistics = new Dictionary(); - bindHandler(noScores: noScores); - // Beatmap is required to be an actual beatmap so the scores can get their scores correctly // calculated for standardised scoring, else the tests that rely on ordering will fall over. Beatmap.Value = CreateWorkingBeatmap(Ruleset.Value); }); } + public void SetUpRequestHandler(bool noScores = false) + { + AddStep("set up request handler", () => + { + bindHandler(noScores: noScores); + }); + } + [Test] public void TestShowWithUserScore() { - InitialiseUserScoresAndBeatmap(); + SetUpRequestHandler(); AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); @@ -89,7 +95,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowNullUserScore() { - InitialiseUserScoresAndBeatmap(); + SetUpRequestHandler(); createResults(); waitForDisplay(); @@ -100,7 +106,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowUserScoreWithDelay() { - InitialiseUserScoresAndBeatmap(); + SetUpRequestHandler(); AddStep("bind user score info handler", () => bindHandler(true, userScore)); @@ -114,7 +120,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowNullUserScoreWithDelay() { - InitialiseUserScoresAndBeatmap(); + SetUpRequestHandler(); AddStep("bind delayed handler", () => bindHandler(true)); @@ -127,7 +133,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestFetchWhenScrolledToTheRight() { - InitialiseUserScoresAndBeatmap(); + SetUpRequestHandler(); createResults(); waitForDisplay(); @@ -152,7 +158,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestFetchWhenScrolledToTheLeft() { - InitialiseUserScoresAndBeatmap(); + SetUpRequestHandler(); AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); @@ -179,7 +185,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowWithNoScores() { - InitialiseUserScoresAndBeatmap(noScores: true); + SetUpRequestHandler(true); createResults(); AddAssert("no scores visible", () => resultsScreen.ScorePanelList.GetScorePanels().Count() == 0); } From d5fdd0c0f9bb4a52630e9fead6b27ab44e472ca0 Mon Sep 17 00:00:00 2001 From: wooster0 Date: Tue, 9 Jan 2024 21:44:05 +0900 Subject: [PATCH 051/651] make each test bind the handler only once, depending on its need --- .../TestScenePlaylistsResultsScreen.cs | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs index 02bd7f950f..727d9da50b 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs @@ -69,19 +69,9 @@ namespace osu.Game.Tests.Visual.Playlists }); } - public void SetUpRequestHandler(bool noScores = false) - { - AddStep("set up request handler", () => - { - bindHandler(noScores: noScores); - }); - } - [Test] public void TestShowWithUserScore() { - SetUpRequestHandler(); - AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); createResults(() => userScore); @@ -95,7 +85,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowNullUserScore() { - SetUpRequestHandler(); + AddStep("bind user score info handler", () => bindHandler()); createResults(); waitForDisplay(); @@ -106,8 +96,6 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowUserScoreWithDelay() { - SetUpRequestHandler(); - AddStep("bind user score info handler", () => bindHandler(true, userScore)); createResults(() => userScore); @@ -120,8 +108,6 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowNullUserScoreWithDelay() { - SetUpRequestHandler(); - AddStep("bind delayed handler", () => bindHandler(true)); createResults(); @@ -133,13 +119,11 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestFetchWhenScrolledToTheRight() { - SetUpRequestHandler(); + AddStep("bind delayed handler", () => bindHandler(true)); createResults(); waitForDisplay(); - AddStep("bind delayed handler", () => bindHandler(true)); - for (int i = 0; i < 2; i++) { int beforePanelCount = 0; @@ -158,8 +142,6 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestFetchWhenScrolledToTheLeft() { - SetUpRequestHandler(); - AddStep("bind user score info handler", () => bindHandler(userScore: userScore)); createResults(() => userScore); @@ -185,7 +167,7 @@ namespace osu.Game.Tests.Visual.Playlists [Test] public void TestShowWithNoScores() { - SetUpRequestHandler(true); + AddStep("bind user score info handler", () => bindHandler(noScores: true)); createResults(); AddAssert("no scores visible", () => resultsScreen.ScorePanelList.GetScorePanels().Count() == 0); } From 484e9e8ee636d9d1ec4aaf549e7615fb18682226 Mon Sep 17 00:00:00 2001 From: Nitrous Date: Tue, 9 Jan 2024 22:09:20 +0800 Subject: [PATCH 052/651] Fix binding order of `IsPaused` bindable and disable playback controls in spectator mode. --- .../Screens/Play/PlayerSettings/PlaybackSettings.cs | 13 +++++++++++-- osu.Game/Screens/Play/SpectatorPlayer.cs | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index e208be6095..e2859868bd 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -27,6 +27,8 @@ namespace osu.Game.Screens.Play.PlayerSettings Precision = 0.1, }; + public readonly Bindable AllowControls = new BindableBool(true); + private readonly PlayerSliderBar rateSlider; private readonly OsuSpriteText multiplierText; @@ -71,6 +73,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastBackward, Action = () => seek(-1, seek_fast_amount), + Enabled = { BindTarget = AllowControls }, }, new SeekButton { @@ -78,6 +81,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.Backward, Action = () => seek(-1, seek_amount), + Enabled = { BindTarget = AllowControls }, }, play = new IconButton { @@ -95,7 +99,8 @@ namespace osu.Game.Screens.Play.PlayerSettings else gameplayClock.Start(); } - } + }, + Enabled = { BindTarget = AllowControls }, }, new SeekButton { @@ -103,6 +108,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.Forward, Action = () => seek(1, seek_amount), + Enabled = { BindTarget = AllowControls }, }, new SeekButton { @@ -110,6 +116,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastForward, Action = () => seek(1, seek_fast_amount), + Enabled = { BindTarget = AllowControls }, }, }, }, @@ -150,7 +157,9 @@ namespace osu.Game.Screens.Play.PlayerSettings { base.LoadComplete(); rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.0}x", true); - gameplayClock?.IsPaused.BindTo(isPaused); + + if (gameplayClock != null) + isPaused.BindTarget = gameplayClock.IsPaused; } private partial class SeekButton : IconButton diff --git a/osu.Game/Screens/Play/SpectatorPlayer.cs b/osu.Game/Screens/Play/SpectatorPlayer.cs index 2faead0ee1..dd7418d563 100644 --- a/osu.Game/Screens/Play/SpectatorPlayer.cs +++ b/osu.Game/Screens/Play/SpectatorPlayer.cs @@ -68,6 +68,8 @@ namespace osu.Game.Screens.Play master.UserPlaybackRate.Value = 1; } }, true); + + HUDOverlay.PlayerSettingsOverlay.PlaybackSettings.AllowControls.Value = false; } /// From 90ab306a96e17b3d7e21011fb75acd9d753ba071 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 11 Jan 2024 14:55:04 +0300 Subject: [PATCH 053/651] Implement ArgonHealthDisplayBackground --- .../Screens/Play/HUD/ArgonHealthDisplay.cs | 11 +- .../ArgonHealthDisplayBackground.cs | 168 ++++++++++++++++++ 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index 236bd3366d..868ef9283d 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -19,6 +19,7 @@ using osu.Game.Configuration; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; +using osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts; using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -100,6 +101,14 @@ namespace osu.Game.Screens.Play.HUD background = new BackgroundPath { PathRadius = MAIN_PATH_RADIUS, + Alpha = 0, + AlwaysPresent = true + }, + new ArgonHealthDisplayBackground + { + RelativeSizeAxes = Axes.Both, + PathRadius = MAIN_PATH_RADIUS, + PathPadding = MAIN_PATH_RADIUS }, glowBar = new BarPath { @@ -121,7 +130,7 @@ namespace osu.Game.Screens.Play.HUD GlowColour = main_bar_glow_colour, PathRadius = MAIN_PATH_RADIUS, GlowPortion = 0.6f, - }, + } } }; } diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs new file mode 100644 index 0000000000..a819fb6f30 --- /dev/null +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs @@ -0,0 +1,168 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +#nullable disable + +using System; +using System.Runtime.InteropServices; +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Rendering; +using osu.Framework.Graphics.Shaders; +using osu.Framework.Graphics.Shaders.Types; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Sprites; +using osuTK; + +namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts +{ + public partial class ArgonHealthDisplayBackground : Box + { + private float endProgress = 1f; + + public float EndProgress + { + get => endProgress; + set + { + if (endProgress == value) + return; + + endProgress = value; + Invalidate(Invalidation.DrawNode); + } + } + + private float startProgress = 0f; + + public float StartProgress + { + get => startProgress; + set + { + if (startProgress == value) + return; + + startProgress = value; + Invalidate(Invalidation.DrawNode); + } + } + + private float radius = 10f; + + public float PathRadius + { + get => radius; + set + { + if (radius == value) + return; + + radius = value; + Invalidate(Invalidation.DrawNode); + } + } + + private float padding = 10f; + + public float PathPadding + { + get => padding; + set + { + if (padding == value) + return; + + padding = value; + Invalidate(Invalidation.DrawNode); + } + } + + [BackgroundDependencyLoader] + private void load(ShaderManager shaders) + { + TextureShader = shaders.Load(VertexShaderDescriptor.TEXTURE_2, "ArgonBarPathBackground"); + } + + protected override void Update() + { + base.Update(); + Invalidate(Invalidation.DrawNode); + } + + protected override DrawNode CreateDrawNode() => new ArgonBarPathDrawNode(this); + + private class ArgonBarPathDrawNode : SpriteDrawNode + { + protected new ArgonHealthDisplayBackground Source => (ArgonHealthDisplayBackground)base.Source; + + public ArgonBarPathDrawNode(ArgonHealthDisplayBackground source) + : base(source) + { + } + + private Vector2 size; + private float startProgress; + private float endProgress; + private float pathRadius; + private float padding; + + public override void ApplyState() + { + base.ApplyState(); + + size = Source.DrawSize; + endProgress = Source.endProgress; + startProgress = Math.Min(Source.startProgress, endProgress); + pathRadius = Source.PathRadius; + padding = Source.PathPadding; + } + + protected override void Draw(IRenderer renderer) + { + if (pathRadius == 0) + return; + + base.Draw(renderer); + } + + private IUniformBuffer parametersBuffer; + + protected override void BindUniformResources(IShader shader, IRenderer renderer) + { + base.BindUniformResources(shader, renderer); + + parametersBuffer ??= renderer.CreateUniformBuffer(); + parametersBuffer.Data = new ArgonBarPathBackgroundParameters + { + Size = size, + StartProgress = startProgress, + EndProgress = endProgress, + PathRadius = pathRadius, + Padding = padding + }; + + shader.BindUniformBlock("m_ArgonBarPathBackgroundParameters", parametersBuffer); + } + + protected override bool CanDrawOpaqueInterior => false; + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + parametersBuffer?.Dispose(); + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + private record struct ArgonBarPathBackgroundParameters + { + public UniformVector2 Size; + public UniformFloat StartProgress; + public UniformFloat EndProgress; + public UniformFloat PathRadius; + public UniformFloat Padding; + private UniformPadding8 pad; + } + } + } +} From f1db7db2592403d5783a63335362cf07a243bda7 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 11 Jan 2024 16:10:06 +0300 Subject: [PATCH 054/651] Implement ArgonHealthDisplayBar --- .../Screens/Play/HUD/ArgonHealthDisplay.cs | 211 +++------------- .../ArgonHealthDisplayBar.cs | 227 ++++++++++++++++++ 2 files changed, 265 insertions(+), 173 deletions(-) create mode 100644 osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index 868ef9283d..9b91252a06 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -2,23 +2,18 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Caching; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Lines; using osu.Framework.Layout; using osu.Framework.Threading; using osu.Framework.Utils; using osu.Game.Configuration; using osu.Game.Rulesets.Judgements; -using osu.Game.Rulesets.Objects; -using osu.Game.Rulesets.Objects.Types; using osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts; using osu.Game.Skinning; using osuTK; @@ -41,16 +36,14 @@ namespace osu.Game.Screens.Play.HUD [SettingSource("Use relative size")] public BindableBool UseRelativeSize { get; } = new BindableBool(true); - private BarPath mainBar = null!; + private ArgonHealthDisplayBar mainBar = null!; /// /// Used to show a glow at the end of the main bar, or red "damage" area when missing. /// - private BarPath glowBar = null!; + private ArgonHealthDisplayBar glowBar = null!; - private BackgroundPath background = null!; - - private SliderPath barPath = null!; + private Container content = null!; private static readonly Colour4 main_bar_colour = Colour4.White; private static readonly Colour4 main_bar_glow_colour = Color4Extensions.FromHex("#7ED7FD").Opacity(0.5f); @@ -59,23 +52,15 @@ namespace osu.Game.Screens.Play.HUD private bool displayingMiss => resetMissBarDelegate != null; - private readonly List vertices = new List(); - private double glowBarValue; private double healthBarValue; public const float MAIN_PATH_RADIUS = 10f; - - private const float curve_start_offset = 70; - private const float curve_end_offset = 40; private const float padding = MAIN_PATH_RADIUS * 2; - private const float curve_smoothness = 10; private readonly LayoutValue drawSizeLayout = new LayoutValue(Invalidation.DrawSize); - private readonly Cached pathVerticesCache = new Cached(); - public ArgonHealthDisplay() { AddLayout(drawSizeLayout); @@ -93,42 +78,40 @@ namespace osu.Game.Screens.Play.HUD { AutoSizeAxes = Axes.Y; - InternalChild = new Container + InternalChild = content = new Container { - AutoSizeAxes = Axes.Both, Children = new Drawable[] { - background = new BackgroundPath - { - PathRadius = MAIN_PATH_RADIUS, - Alpha = 0, - AlwaysPresent = true - }, new ArgonHealthDisplayBackground { RelativeSizeAxes = Axes.Both, PathRadius = MAIN_PATH_RADIUS, PathPadding = MAIN_PATH_RADIUS }, - glowBar = new BarPath + new Container { - BarColour = Color4.White, - GlowColour = main_bar_glow_colour, - Blending = BlendingParameters.Additive, - Colour = ColourInfo.GradientHorizontal(Color4.White.Opacity(0.8f), Color4.White), - PathRadius = 40f, - // Kinda hacky, but results in correct positioning with increased path radius. - Margin = new MarginPadding(-30f), - GlowPortion = 0.9f, + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding(-30f), + Child = glowBar = new ArgonHealthDisplayBar + { + RelativeSizeAxes = Axes.Both, + BarColour = Color4.White, + GlowColour = main_bar_glow_colour, + Blending = BlendingParameters.Additive, + Colour = ColourInfo.GradientHorizontal(Color4.White.Opacity(0.8f), Color4.White), + PathRadius = 40f, + PathPadding = 40f, + GlowPortion = 0.9f, + } }, - mainBar = new BarPath + mainBar = new ArgonHealthDisplayBar { - AutoSizeAxes = Axes.None, RelativeSizeAxes = Axes.Both, Blending = BlendingParameters.Additive, BarColour = main_bar_colour, GlowColour = main_bar_glow_colour, PathRadius = MAIN_PATH_RADIUS, + PathPadding = MAIN_PATH_RADIUS, GlowPortion = 0.6f, } } @@ -151,7 +134,7 @@ namespace osu.Game.Screens.Play.HUD UseRelativeSize.BindValueChanged(v => RelativeSizeAxes = v.NewValue ? Axes.X : Axes.None, true); Width = previousWidth; - BarHeight.BindValueChanged(_ => updatePath(), true); + BarHeight.BindValueChanged(_ => updateContentSize(), true); } private void onNewJudgement(JudgementResult result) => pendingMissAnimation |= !result.IsHit; @@ -162,7 +145,7 @@ namespace osu.Game.Screens.Play.HUD if (!drawSizeLayout.IsValid) { - updatePath(); + updateContentSize(); drawSizeLayout.Validate(); } @@ -173,7 +156,7 @@ namespace osu.Game.Screens.Play.HUD mainBar.Alpha = (float)Interpolation.DampContinuously(mainBar.Alpha, Current.Value > 0 ? 1 : 0, 40, Time.Elapsed); glowBar.Alpha = (float)Interpolation.DampContinuously(glowBar.Alpha, glowBarValue > 0 ? 1 : 0, 40, Time.Elapsed); - updatePathVertices(); + updatePathProgress(); } protected override void HealthChanged(bool increase) @@ -203,10 +186,9 @@ namespace osu.Game.Screens.Play.HUD if (!displayingMiss) { - // TODO: REMOVE THIS. It's recreating textures. - glowBar.TransformTo(nameof(BarPath.GlowColour), Colour4.White, 30, Easing.OutQuint) + glowBar.TransformTo(nameof(ArgonHealthDisplayBar.GlowColour), Colour4.White, 30, Easing.OutQuint) .Then() - .TransformTo(nameof(BarPath.GlowColour), main_bar_glow_colour, 300, Easing.OutQuint); + .TransformTo(nameof(ArgonHealthDisplayBar.GlowColour), main_bar_glow_colour, 300, Easing.OutQuint); } } @@ -221,13 +203,11 @@ namespace osu.Game.Screens.Play.HUD finishMissDisplay(); }, out resetMissBarDelegate); - // TODO: REMOVE THIS. It's recreating textures. - glowBar.TransformTo(nameof(BarPath.BarColour), new Colour4(255, 147, 147, 255), 100, Easing.OutQuint).Then() - .TransformTo(nameof(BarPath.BarColour), new Colour4(255, 93, 93, 255), 800, Easing.OutQuint); + glowBar.TransformTo(nameof(ArgonHealthDisplayBar.BarColour), new Colour4(255, 147, 147, 255), 100, Easing.OutQuint).Then() + .TransformTo(nameof(ArgonHealthDisplayBar.BarColour), new Colour4(255, 93, 93, 255), 800, Easing.OutQuint); - // TODO: REMOVE THIS. It's recreating textures. - glowBar.TransformTo(nameof(BarPath.GlowColour), new Colour4(253, 0, 0, 255).Lighten(0.2f)) - .TransformTo(nameof(BarPath.GlowColour), new Colour4(253, 0, 0, 255), 800, Easing.OutQuint); + glowBar.TransformTo(nameof(ArgonHealthDisplayBar.GlowColour), new Colour4(253, 0, 0, 255).Lighten(0.2f)) + .TransformTo(nameof(ArgonHealthDisplayBar.GlowColour), new Colour4(253, 0, 0, 255), 800, Easing.OutQuint); } private void finishMissDisplay() @@ -237,53 +217,22 @@ namespace osu.Game.Screens.Play.HUD if (Current.Value > 0) { - // TODO: REMOVE THIS. It's recreating textures. - glowBar.TransformTo(nameof(BarPath.BarColour), main_bar_colour, 300, Easing.In); - glowBar.TransformTo(nameof(BarPath.GlowColour), main_bar_glow_colour, 300, Easing.In); + glowBar.TransformTo(nameof(ArgonHealthDisplayBar.BarColour), main_bar_colour, 300, Easing.In); + glowBar.TransformTo(nameof(ArgonHealthDisplayBar.GlowColour), main_bar_glow_colour, 300, Easing.In); } resetMissBarDelegate?.Cancel(); resetMissBarDelegate = null; } - private void updatePath() + private void updateContentSize() { float usableWidth = DrawWidth - padding; if (usableWidth < 0) enforceMinimumWidth(); - // the display starts curving at `curve_start_offset` units from the right and ends curving at `curve_end_offset`. - // to ensure that the curve is symmetric when it starts being narrow enough, add a `curve_end_offset` to the left side too. - const float rescale_cutoff = curve_start_offset + curve_end_offset; - - float barLength = Math.Max(DrawWidth - padding, rescale_cutoff); - float curveStart = barLength - curve_start_offset; - float curveEnd = barLength - curve_end_offset; - - Vector2 diagonalDir = (new Vector2(curveEnd, BarHeight.Value) - new Vector2(curveStart, 0)).Normalized(); - - barPath = new SliderPath(new[] - { - new PathControlPoint(new Vector2(0, 0), PathType.LINEAR), - new PathControlPoint(new Vector2(curveStart - curve_smoothness, 0), PathType.BEZIER), - new PathControlPoint(new Vector2(curveStart, 0)), - new PathControlPoint(new Vector2(curveStart, 0) + diagonalDir * curve_smoothness, PathType.LINEAR), - new PathControlPoint(new Vector2(curveEnd, BarHeight.Value) - diagonalDir * curve_smoothness, PathType.BEZIER), - new PathControlPoint(new Vector2(curveEnd, BarHeight.Value)), - new PathControlPoint(new Vector2(curveEnd + curve_smoothness, BarHeight.Value), PathType.LINEAR), - new PathControlPoint(new Vector2(barLength, BarHeight.Value)), - }); - - if (DrawWidth - padding < rescale_cutoff) - rescalePathProportionally(); - - barPath.GetPathToProgress(vertices, 0.0, 1.0); - - background.Vertices = vertices; - mainBar.Vertices = vertices; - glowBar.Vertices = vertices; - - updatePathVertices(); + content.Size = new Vector2(DrawWidth, BarHeight.Value + padding); + updatePathProgress(); void enforceMinimumWidth() { @@ -296,35 +245,13 @@ namespace osu.Game.Screens.Play.HUD RelativeSizeAxes = relativeAxes; } - - void rescalePathProportionally() - { - foreach (var point in barPath.ControlPoints) - point.Position = new Vector2(point.Position.X / barLength * (DrawWidth - padding), point.Position.Y); - } } - private void updatePathVertices() + private void updatePathProgress() { - barPath.GetPathToProgress(vertices, 0.0, healthBarValue); - if (vertices.Count == 0) vertices.Add(Vector2.Zero); - Vector2 initialVertex = vertices[0]; - for (int i = 0; i < vertices.Count; i++) - vertices[i] -= initialVertex; - - mainBar.Vertices = vertices; - mainBar.Position = initialVertex; - - barPath.GetPathToProgress(vertices, healthBarValue, Math.Max(glowBarValue, healthBarValue)); - if (vertices.Count == 0) vertices.Add(Vector2.Zero); - initialVertex = vertices[0]; - for (int i = 0; i < vertices.Count; i++) - vertices[i] -= initialVertex; - - glowBar.Vertices = vertices; - glowBar.Position = initialVertex; - - pathVerticesCache.Validate(); + mainBar.EndProgress = (float)healthBarValue; + glowBar.StartProgress = (float)healthBarValue; + glowBar.EndProgress = (float)Math.Max(glowBarValue, healthBarValue); } protected override void Dispose(bool isDisposing) @@ -334,67 +261,5 @@ namespace osu.Game.Screens.Play.HUD if (HealthProcessor.IsNotNull()) HealthProcessor.NewJudgement -= onNewJudgement; } - - private partial class BackgroundPath : SmoothPath - { - private static readonly Color4 colour_white = Color4.White.Opacity(0.8f); - private static readonly Color4 colour_black = Color4.Black.Opacity(0.2f); - - protected override Color4 ColourAt(float position) - { - if (position <= 0.16f) - return colour_white; - - return Interpolation.ValueAt(position, - colour_white, - colour_black, - -0.5f, 1f, Easing.OutQuint); - } - } - - private partial class BarPath : SmoothPath - { - private Colour4 barColour; - - public Colour4 BarColour - { - get => barColour; - set - { - if (barColour == value) - return; - - barColour = value; - InvalidateTexture(); - } - } - - private Colour4 glowColour; - - public Colour4 GlowColour - { - get => glowColour; - set - { - if (glowColour == value) - return; - - glowColour = value; - InvalidateTexture(); - } - } - - public float GlowPortion { get; init; } - - private static readonly Colour4 transparent_black = Colour4.Black.Opacity(0.0f); - - protected override Color4 ColourAt(float position) - { - if (position >= GlowPortion) - return BarColour; - - return Interpolation.ValueAt(position, transparent_black, GlowColour, 0.0, GlowPortion, Easing.InQuint); - } - } } } diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs new file mode 100644 index 0000000000..6bc2232776 --- /dev/null +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs @@ -0,0 +1,227 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +#nullable disable + +using System; +using System.Runtime.InteropServices; +using osu.Framework.Allocation; +using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Rendering; +using osu.Framework.Graphics.Shaders; +using osu.Framework.Graphics.Shaders.Types; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Sprites; +using osuTK; +using osuTK.Graphics; + +namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts +{ + public partial class ArgonHealthDisplayBar : Box + { + private float endProgress = 1f; + + public float EndProgress + { + get => endProgress; + set + { + if (endProgress == value) + return; + + endProgress = value; + Invalidate(Invalidation.DrawNode); + } + } + + private float startProgress = 0f; + + public float StartProgress + { + get => startProgress; + set + { + if (startProgress == value) + return; + + startProgress = value; + Invalidate(Invalidation.DrawNode); + } + } + + private float radius = 10f; + + public float PathRadius + { + get => radius; + set + { + if (radius == value) + return; + + radius = value; + Invalidate(Invalidation.DrawNode); + } + } + + private float padding = 10f; + + public float PathPadding + { + get => padding; + set + { + if (padding == value) + return; + + padding = value; + Invalidate(Invalidation.DrawNode); + } + } + + private float glowPortion; + + public float GlowPortion + { + get => glowPortion; + set + { + if (glowPortion == value) + return; + + glowPortion = value; + Invalidate(Invalidation.DrawNode); + } + } + + private Colour4 barColour = Color4.White; + + public Colour4 BarColour + { + get => barColour; + set + { + if (barColour == value) + return; + + barColour = value; + Invalidate(Invalidation.DrawNode); + } + } + + private Colour4 glowColour = Color4.White.Opacity(0); + + public Colour4 GlowColour + { + get => glowColour; + set + { + if (glowColour == value) + return; + + glowColour = value; + Invalidate(Invalidation.DrawNode); + } + } + + [BackgroundDependencyLoader] + private void load(ShaderManager shaders) + { + TextureShader = shaders.Load(VertexShaderDescriptor.TEXTURE_2, "ArgonBarPath"); + } + + protected override void Update() + { + base.Update(); + Invalidate(Invalidation.DrawNode); + } + + protected override DrawNode CreateDrawNode() => new ArgonBarPathDrawNode(this); + + private class ArgonBarPathDrawNode : SpriteDrawNode + { + protected new ArgonHealthDisplayBar Source => (ArgonHealthDisplayBar)base.Source; + + public ArgonBarPathDrawNode(ArgonHealthDisplayBar source) + : base(source) + { + } + + private Vector2 size; + private float startProgress; + private float endProgress; + private float pathRadius; + private float padding; + private float glowPortion; + private Color4 barColour; + private Color4 glowColour; + + public override void ApplyState() + { + base.ApplyState(); + + size = Source.DrawSize; + endProgress = Source.endProgress; + startProgress = Math.Min(Source.startProgress, endProgress); + pathRadius = Source.PathRadius; + padding = Source.PathPadding; + glowPortion = Source.GlowPortion; + barColour = Source.barColour; + glowColour = Source.glowColour; + } + + protected override void Draw(IRenderer renderer) + { + if (pathRadius == 0) + return; + + base.Draw(renderer); + } + + private IUniformBuffer parametersBuffer; + + protected override void BindUniformResources(IShader shader, IRenderer renderer) + { + base.BindUniformResources(shader, renderer); + + parametersBuffer ??= renderer.CreateUniformBuffer(); + parametersBuffer.Data = new ArgonBarPathParameters + { + BarColour = new Vector4(barColour.R, barColour.G, barColour.B, barColour.A), + GlowColour = new Vector4(glowColour.R, glowColour.G, glowColour.B, glowColour.A), + GlowPortion = glowPortion, + Size = size, + StartProgress = startProgress, + EndProgress = endProgress, + PathRadius = pathRadius, + Padding = padding + }; + + shader.BindUniformBlock("m_ArgonBarPathParameters", parametersBuffer); + } + + protected override bool CanDrawOpaqueInterior => false; + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + parametersBuffer?.Dispose(); + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + private record struct ArgonBarPathParameters + { + public UniformVector4 BarColour; + public UniformVector4 GlowColour; + public UniformVector2 Size; + public UniformFloat StartProgress; + public UniformFloat EndProgress; + public UniformFloat PathRadius; + public UniformFloat Padding; + public UniformFloat GlowPortion; + private UniformPadding4 pad; + } + } + } +} From d75bf55c586f72ec28ffc5ce228f6ec47338274f Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 11 Jan 2024 18:28:00 +0300 Subject: [PATCH 055/651] CI fixes --- .../ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs | 4 ++-- .../Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs index a819fb6f30..781bd8e6e9 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs @@ -33,7 +33,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts } } - private float startProgress = 0f; + private float startProgress; public float StartProgress { @@ -161,7 +161,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts public UniformFloat EndProgress; public UniformFloat PathRadius; public UniformFloat Padding; - private UniformPadding8 pad; + private readonly UniformPadding8 pad; } } } diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs index 6bc2232776..ac73698f4c 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs @@ -35,7 +35,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts } } - private float startProgress = 0f; + private float startProgress; public float StartProgress { @@ -220,7 +220,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts public UniformFloat PathRadius; public UniformFloat Padding; public UniformFloat GlowPortion; - private UniformPadding4 pad; + private readonly UniformPadding4 pad; } } } From bbb36da32312064bc2d154ae2637b44c670ef76c Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 11 Jan 2024 18:58:12 +0300 Subject: [PATCH 056/651] Don't pass start and end progress to the background --- .../ArgonHealthDisplayBackground.cs | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs index 781bd8e6e9..ccb224eca6 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs @@ -3,7 +3,6 @@ #nullable disable -using System; using System.Runtime.InteropServices; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -18,36 +17,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts { public partial class ArgonHealthDisplayBackground : Box { - private float endProgress = 1f; - - public float EndProgress - { - get => endProgress; - set - { - if (endProgress == value) - return; - - endProgress = value; - Invalidate(Invalidation.DrawNode); - } - } - - private float startProgress; - - public float StartProgress - { - get => startProgress; - set - { - if (startProgress == value) - return; - - startProgress = value; - Invalidate(Invalidation.DrawNode); - } - } - private float radius = 10f; public float PathRadius @@ -102,8 +71,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts } private Vector2 size; - private float startProgress; - private float endProgress; private float pathRadius; private float padding; @@ -112,8 +79,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts base.ApplyState(); size = Source.DrawSize; - endProgress = Source.endProgress; - startProgress = Math.Min(Source.startProgress, endProgress); pathRadius = Source.PathRadius; padding = Source.PathPadding; } @@ -136,8 +101,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts parametersBuffer.Data = new ArgonBarPathBackgroundParameters { Size = size, - StartProgress = startProgress, - EndProgress = endProgress, PathRadius = pathRadius, Padding = padding }; @@ -157,11 +120,8 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts private record struct ArgonBarPathBackgroundParameters { public UniformVector2 Size; - public UniformFloat StartProgress; - public UniformFloat EndProgress; public UniformFloat PathRadius; public UniformFloat Padding; - private readonly UniformPadding8 pad; } } } From 101a26a53e3da3e16ec26a5c89891261a2b998c9 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 12 Jan 2024 02:54:04 +0300 Subject: [PATCH 057/651] Update start and end progress in one go --- .../Screens/Play/HUD/ArgonHealthDisplay.cs | 5 +-- .../ArgonHealthDisplayBar.cs | 37 +++++-------------- 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index 9b91252a06..1f633c9e82 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -249,9 +249,8 @@ namespace osu.Game.Screens.Play.HUD private void updatePathProgress() { - mainBar.EndProgress = (float)healthBarValue; - glowBar.StartProgress = (float)healthBarValue; - glowBar.EndProgress = (float)Math.Max(glowBarValue, healthBarValue); + mainBar.ProgressRange = new Vector2(0f, (float)healthBarValue); + glowBar.ProgressRange = new Vector2((float)healthBarValue, (float)Math.Max(glowBarValue, healthBarValue)); } protected override void Dispose(bool isDisposing) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs index ac73698f4c..f92ab529ef 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs @@ -20,32 +20,17 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts { public partial class ArgonHealthDisplayBar : Box { - private float endProgress = 1f; + private Vector2 progressRange = new Vector2(0f, 1f); - public float EndProgress + public Vector2 ProgressRange { - get => endProgress; + get => progressRange; set { - if (endProgress == value) + if (progressRange == value) return; - endProgress = value; - Invalidate(Invalidation.DrawNode); - } - } - - private float startProgress; - - public float StartProgress - { - get => startProgress; - set - { - if (startProgress == value) - return; - - startProgress = value; + progressRange = value; Invalidate(Invalidation.DrawNode); } } @@ -149,8 +134,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts } private Vector2 size; - private float startProgress; - private float endProgress; + private Vector2 progressRange; private float pathRadius; private float padding; private float glowPortion; @@ -162,8 +146,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts base.ApplyState(); size = Source.DrawSize; - endProgress = Source.endProgress; - startProgress = Math.Min(Source.startProgress, endProgress); + progressRange = new Vector2(Math.Min(Source.progressRange.X, Source.progressRange.Y), Source.progressRange.Y); pathRadius = Source.PathRadius; padding = Source.PathPadding; glowPortion = Source.GlowPortion; @@ -192,8 +175,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts GlowColour = new Vector4(glowColour.R, glowColour.G, glowColour.B, glowColour.A), GlowPortion = glowPortion, Size = size, - StartProgress = startProgress, - EndProgress = endProgress, + ProgressRange = progressRange, PathRadius = pathRadius, Padding = padding }; @@ -215,8 +197,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts public UniformVector4 BarColour; public UniformVector4 GlowColour; public UniformVector2 Size; - public UniformFloat StartProgress; - public UniformFloat EndProgress; + public UniformVector2 ProgressRange; public UniformFloat PathRadius; public UniformFloat Padding; public UniformFloat GlowPortion; From e861661037cce1079aee84e00b95efae50804873 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 12 Jan 2024 03:03:38 +0300 Subject: [PATCH 058/651] Remove invalidations in update oops --- .../ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs | 6 ------ .../HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs | 6 ------ 2 files changed, 12 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs index ccb224eca6..a98b3dc1f3 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs @@ -53,12 +53,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts TextureShader = shaders.Load(VertexShaderDescriptor.TEXTURE_2, "ArgonBarPathBackground"); } - protected override void Update() - { - base.Update(); - Invalidate(Invalidation.DrawNode); - } - protected override DrawNode CreateDrawNode() => new ArgonBarPathDrawNode(this); private class ArgonBarPathDrawNode : SpriteDrawNode diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs index f92ab529ef..4f4af02d66 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs @@ -116,12 +116,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts TextureShader = shaders.Load(VertexShaderDescriptor.TEXTURE_2, "ArgonBarPath"); } - protected override void Update() - { - base.Update(); - Invalidate(Invalidation.DrawNode); - } - protected override DrawNode CreateDrawNode() => new ArgonBarPathDrawNode(this); private class ArgonBarPathDrawNode : SpriteDrawNode From c40462811363c7432ede91c4475d7d6e7cd6d28b Mon Sep 17 00:00:00 2001 From: Nitrous Date: Fri, 12 Jan 2024 15:12:02 +0800 Subject: [PATCH 059/651] move creation of `PlaybackSettings` to `ReplayPlayer` --- osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs | 9 +++++---- osu.Game/Screens/Play/Player.cs | 3 --- .../Screens/Play/PlayerSettings/PlaybackSettings.cs | 6 ------ osu.Game/Screens/Play/ReplayPlayer.cs | 12 ++++++++++++ osu.Game/Screens/Play/SpectatorPlayer.cs | 2 -- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs index dbb0456cd0..b7f3dc36c3 100644 --- a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs +++ b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs @@ -12,17 +12,19 @@ namespace osu.Game.Screens.Play.HUD { private const int fade_duration = 200; - public readonly PlaybackSettings PlaybackSettings; - public readonly VisualSettings VisualSettings; + protected override Container Content => content; + + private readonly FillFlowContainer content; + public PlayerSettingsOverlay() { Anchor = Anchor.TopRight; Origin = Anchor.TopRight; AutoSizeAxes = Axes.Both; - Child = new FillFlowContainer + InternalChild = content = new FillFlowContainer { Anchor = Anchor.TopRight, Origin = Anchor.TopRight, @@ -31,7 +33,6 @@ namespace osu.Game.Screens.Play.HUD Spacing = new Vector2(0, 20), Children = new PlayerSettingsGroup[] { - PlaybackSettings = new PlaybackSettings { Expanded = { Value = false } }, VisualSettings = new VisualSettings { Expanded = { Value = false } }, new AudioSettings { Expanded = { Value = false } } } diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index b87306b9a2..29c7849685 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -476,9 +476,6 @@ namespace osu.Game.Screens.Play skipOutroOverlay.Expire(); } - if (GameplayClockContainer is MasterGameplayClockContainer master) - HUDOverlay.PlayerSettingsOverlay.PlaybackSettings.UserPlaybackRate.BindTarget = master.UserPlaybackRate; - return container; } diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index e2859868bd..0c9f5bb6ee 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -27,7 +27,6 @@ namespace osu.Game.Screens.Play.PlayerSettings Precision = 0.1, }; - public readonly Bindable AllowControls = new BindableBool(true); private readonly PlayerSliderBar rateSlider; @@ -73,7 +72,6 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastBackward, Action = () => seek(-1, seek_fast_amount), - Enabled = { BindTarget = AllowControls }, }, new SeekButton { @@ -81,7 +79,6 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.Backward, Action = () => seek(-1, seek_amount), - Enabled = { BindTarget = AllowControls }, }, play = new IconButton { @@ -100,7 +97,6 @@ namespace osu.Game.Screens.Play.PlayerSettings gameplayClock.Start(); } }, - Enabled = { BindTarget = AllowControls }, }, new SeekButton { @@ -108,7 +104,6 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.Forward, Action = () => seek(1, seek_amount), - Enabled = { BindTarget = AllowControls }, }, new SeekButton { @@ -116,7 +111,6 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastForward, Action = () => seek(1, seek_fast_amount), - Enabled = { BindTarget = AllowControls }, }, }, }, diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index ca71a89b48..788eb75283 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -15,6 +15,7 @@ using osu.Game.Input.Bindings; using osu.Game.Rulesets.Mods; using osu.Game.Scoring; using osu.Game.Screens.Play.HUD; +using osu.Game.Screens.Play.PlayerSettings; using osu.Game.Screens.Ranking; using osu.Game.Users; @@ -49,6 +50,17 @@ namespace osu.Game.Screens.Play this.createScore = createScore; } + protected override void LoadComplete() + { + base.LoadComplete(); + + var playerSettingsOverlay = new PlaybackSettings { Expanded = { Value = false } }; + HUDOverlay.PlayerSettingsOverlay.Add(playerSettingsOverlay); + + if (GameplayClockContainer is MasterGameplayClockContainer master) + playerSettingsOverlay.UserPlaybackRate.BindTarget = master.UserPlaybackRate; + } + protected override void PrepareReplay() { DrawableRuleset?.SetReplayScore(Score); diff --git a/osu.Game/Screens/Play/SpectatorPlayer.cs b/osu.Game/Screens/Play/SpectatorPlayer.cs index dd7418d563..2faead0ee1 100644 --- a/osu.Game/Screens/Play/SpectatorPlayer.cs +++ b/osu.Game/Screens/Play/SpectatorPlayer.cs @@ -68,8 +68,6 @@ namespace osu.Game.Screens.Play master.UserPlaybackRate.Value = 1; } }, true); - - HUDOverlay.PlayerSettingsOverlay.PlaybackSettings.AllowControls.Value = false; } /// From c545a9c242d56a499ddd6be46e69fd0730eed97e Mon Sep 17 00:00:00 2001 From: Nitrous Date: Fri, 12 Jan 2024 15:13:38 +0800 Subject: [PATCH 060/651] remove extra new line --- osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 0c9f5bb6ee..0fe3a08985 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -27,7 +27,6 @@ namespace osu.Game.Screens.Play.PlayerSettings Precision = 0.1, }; - private readonly PlayerSliderBar rateSlider; private readonly OsuSpriteText multiplierText; From ccbba8a00b7bcb7404cb31333742eafd21a5e62b Mon Sep 17 00:00:00 2001 From: Nitrous Date: Fri, 12 Jan 2024 17:19:59 +0800 Subject: [PATCH 061/651] Avoid NRE due to a beatmap loading with no hit objects. --- osu.Game/Screens/Play/ReplayPlayer.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index 788eb75283..f6e4ac489a 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -54,11 +54,14 @@ namespace osu.Game.Screens.Play { base.LoadComplete(); - var playerSettingsOverlay = new PlaybackSettings { Expanded = { Value = false } }; - HUDOverlay.PlayerSettingsOverlay.Add(playerSettingsOverlay); + if (HUDOverlay != null) + { + var playerSettingsOverlay = new PlaybackSettings { Expanded = { Value = false } }; + HUDOverlay.PlayerSettingsOverlay.Add(playerSettingsOverlay); - if (GameplayClockContainer is MasterGameplayClockContainer master) - playerSettingsOverlay.UserPlaybackRate.BindTarget = master.UserPlaybackRate; + if (GameplayClockContainer is MasterGameplayClockContainer master) + playerSettingsOverlay.UserPlaybackRate.BindTarget = master.UserPlaybackRate; + } } protected override void PrepareReplay() From 8d4ba6d4664ead9e095b1b5145b92b2dc93ebb81 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 12 Jan 2024 15:30:16 +0300 Subject: [PATCH 062/651] Remove PathPadding property --- .../Screens/Play/HUD/ArgonHealthDisplay.cs | 6 +-- .../ArgonHealthDisplayBackground.cs | 49 +------------------ .../ArgonHealthDisplayBar.cs | 23 +-------- 3 files changed, 5 insertions(+), 73 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index 1f633c9e82..0af514a4f9 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -84,9 +84,7 @@ namespace osu.Game.Screens.Play.HUD { new ArgonHealthDisplayBackground { - RelativeSizeAxes = Axes.Both, - PathRadius = MAIN_PATH_RADIUS, - PathPadding = MAIN_PATH_RADIUS + RelativeSizeAxes = Axes.Both }, new Container { @@ -100,7 +98,6 @@ namespace osu.Game.Screens.Play.HUD Blending = BlendingParameters.Additive, Colour = ColourInfo.GradientHorizontal(Color4.White.Opacity(0.8f), Color4.White), PathRadius = 40f, - PathPadding = 40f, GlowPortion = 0.9f, } }, @@ -111,7 +108,6 @@ namespace osu.Game.Screens.Play.HUD BarColour = main_bar_colour, GlowColour = main_bar_glow_colour, PathRadius = MAIN_PATH_RADIUS, - PathPadding = MAIN_PATH_RADIUS, GlowPortion = 0.6f, } } diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs index a98b3dc1f3..a96c2f97bd 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs @@ -17,36 +17,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts { public partial class ArgonHealthDisplayBackground : Box { - private float radius = 10f; - - public float PathRadius - { - get => radius; - set - { - if (radius == value) - return; - - radius = value; - Invalidate(Invalidation.DrawNode); - } - } - - private float padding = 10f; - - public float PathPadding - { - get => padding; - set - { - if (padding == value) - return; - - padding = value; - Invalidate(Invalidation.DrawNode); - } - } - [BackgroundDependencyLoader] private void load(ShaderManager shaders) { @@ -65,24 +35,12 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts } private Vector2 size; - private float pathRadius; - private float padding; public override void ApplyState() { base.ApplyState(); size = Source.DrawSize; - pathRadius = Source.PathRadius; - padding = Source.PathPadding; - } - - protected override void Draw(IRenderer renderer) - { - if (pathRadius == 0) - return; - - base.Draw(renderer); } private IUniformBuffer parametersBuffer; @@ -94,9 +52,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts parametersBuffer ??= renderer.CreateUniformBuffer(); parametersBuffer.Data = new ArgonBarPathBackgroundParameters { - Size = size, - PathRadius = pathRadius, - Padding = padding + Size = size }; shader.BindUniformBlock("m_ArgonBarPathBackgroundParameters", parametersBuffer); @@ -114,8 +70,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts private record struct ArgonBarPathBackgroundParameters { public UniformVector2 Size; - public UniformFloat PathRadius; - public UniformFloat Padding; + private readonly UniformPadding8 pad; } } } diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs index 4f4af02d66..1938b97d5a 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs @@ -50,21 +50,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts } } - private float padding = 10f; - - public float PathPadding - { - get => padding; - set - { - if (padding == value) - return; - - padding = value; - Invalidate(Invalidation.DrawNode); - } - } - private float glowPortion; public float GlowPortion @@ -130,7 +115,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts private Vector2 size; private Vector2 progressRange; private float pathRadius; - private float padding; private float glowPortion; private Color4 barColour; private Color4 glowColour; @@ -142,7 +126,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts size = Source.DrawSize; progressRange = new Vector2(Math.Min(Source.progressRange.X, Source.progressRange.Y), Source.progressRange.Y); pathRadius = Source.PathRadius; - padding = Source.PathPadding; glowPortion = Source.GlowPortion; barColour = Source.barColour; glowColour = Source.glowColour; @@ -170,8 +153,7 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts GlowPortion = glowPortion, Size = size, ProgressRange = progressRange, - PathRadius = pathRadius, - Padding = padding + PathRadius = pathRadius }; shader.BindUniformBlock("m_ArgonBarPathParameters", parametersBuffer); @@ -193,9 +175,8 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts public UniformVector2 Size; public UniformVector2 ProgressRange; public UniformFloat PathRadius; - public UniformFloat Padding; public UniformFloat GlowPortion; - private readonly UniformPadding4 pad; + private readonly UniformPadding8 pad; } } } From c1e4e51a5fe02cdff146cd9a45d85ba5c5847992 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 12 Jan 2024 15:34:02 +0300 Subject: [PATCH 063/651] Add comment explaining negative container padding --- osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index 0af514a4f9..dcc8f4feec 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -89,6 +89,7 @@ namespace osu.Game.Screens.Play.HUD new Container { RelativeSizeAxes = Axes.Both, + // since we are using bigger path radius we need to expand the draw area outwards to preserve the curve placement Padding = new MarginPadding(-30f), Child = glowBar = new ArgonHealthDisplayBar { From 882f49039029b7dc3e287ccc302d04de89de10df Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 01:32:37 +0100 Subject: [PATCH 064/651] lazy load slider tail position --- osu.Game.Rulesets.Osu/Objects/Slider.cs | 8 ++------ osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs | 8 ++++---- osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs | 8 ++++++++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 506145568e..2aca83ad03 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Osu.Objects set { repeatCount = value; - updateNestedPositions(); + endPositionCache.Invalidate(); } } @@ -165,7 +165,7 @@ namespace osu.Game.Rulesets.Osu.Objects public Slider() { SamplesBindable.CollectionChanged += (_, _) => UpdateNestedSamples(); - Path.Version.ValueChanged += _ => updateNestedPositions(); + Path.Version.ValueChanged += _ => endPositionCache.Invalidate(); } protected override void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, IBeatmapDifficultyInfo difficulty) @@ -218,7 +218,6 @@ namespace osu.Game.Rulesets.Osu.Objects { RepeatIndex = e.SpanIndex, StartTime = e.Time, - Position = EndPosition, StackHeight = StackHeight, ClassicSliderBehaviour = ClassicSliderBehaviour, }); @@ -245,9 +244,6 @@ namespace osu.Game.Rulesets.Osu.Objects if (HeadCircle != null) HeadCircle.Position = Position; - - if (TailCircle != null) - TailCircle.Position = EndPosition; } protected void UpdateNestedSamples() diff --git a/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs index 88a34fcb8f..2d5a5b7727 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs @@ -14,16 +14,16 @@ namespace osu.Game.Rulesets.Osu.Objects /// public abstract class SliderEndCircle : HitCircle { - private readonly Slider slider; + protected readonly Slider Slider; protected SliderEndCircle(Slider slider) { - this.slider = slider; + Slider = slider; } public int RepeatIndex { get; set; } - public double SpanDuration => slider.SpanDuration; + public double SpanDuration => Slider.SpanDuration; protected override void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, IBeatmapDifficultyInfo difficulty) { @@ -40,7 +40,7 @@ namespace osu.Game.Rulesets.Osu.Objects else { // The first end circle should fade in with the slider. - TimePreempt += StartTime - slider.StartTime; + TimePreempt += StartTime - Slider.StartTime; } } diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs index ceee513412..abe2c7074b 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs @@ -1,9 +1,11 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Rulesets.Scoring; +using osuTK; namespace osu.Game.Rulesets.Osu.Objects { @@ -15,6 +17,12 @@ namespace osu.Game.Rulesets.Osu.Objects /// public bool ClassicSliderBehaviour; + public override Vector2 Position + { + get => Slider.EndPosition; + set => throw new NotImplementedException(); + } + public SliderTailCircle(Slider slider) : base(slider) { From 5fa7f6ec53a4430b1db13f74e75e2e56b4a181fc Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 02:21:32 +0100 Subject: [PATCH 065/651] make drawables that update from path version update once per frame --- .../PathControlPointConnectionPiece.cs | 16 ++++++++++++++-- .../Skinning/Default/PlaySliderBody.cs | 6 ++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs index 67685d21a7..004a091cae 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs @@ -51,14 +51,26 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components base.LoadComplete(); hitObjectPosition = hitObject.PositionBindable.GetBoundCopy(); - hitObjectPosition.BindValueChanged(_ => updateConnectingPath()); + hitObjectPosition.BindValueChanged(_ => pathRequiresUpdate = true); pathVersion = hitObject.Path.Version.GetBoundCopy(); - pathVersion.BindValueChanged(_ => updateConnectingPath()); + pathVersion.BindValueChanged(_ => pathRequiresUpdate = true); updateConnectingPath(); } + private bool pathRequiresUpdate; + + protected override void Update() + { + base.Update(); + + if (!pathRequiresUpdate) return; + + updateConnectingPath(); + pathRequiresUpdate = false; + } + /// /// Updates the path connecting this control point to the next one. /// diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs b/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs index aa507cbaf0..cbc62a1c7c 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs @@ -18,8 +18,6 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default protected IBindable AccentColourBindable { get; private set; } = null!; - private IBindable pathVersion = null!; - [Resolved(CanBeNull = true)] private OsuRulesetConfigManager? config { get; set; } @@ -33,8 +31,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default ScaleBindable = drawableSlider.ScaleBindable.GetBoundCopy(); ScaleBindable.BindValueChanged(scale => PathRadius = OsuHitObject.OBJECT_RADIUS * scale.NewValue, true); - pathVersion = drawableSlider.PathVersion.GetBoundCopy(); - pathVersion.BindValueChanged(_ => Refresh()); + drawableObject.DefaultsApplied += _ => Refresh(); + drawableObject.HitObjectApplied += _ => Refresh(); AccentColourBindable = drawableObject.AccentColour.GetBoundCopy(); AccentColourBindable.BindValueChanged(accent => AccentColour = GetBodyAccentColour(skin, accent.NewValue), true); From e1186080b87436d78a591bb888ff8bfa93559dbf Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 02:24:33 +0100 Subject: [PATCH 066/651] simplify scheduling logic --- .../PathControlPointConnectionPiece.cs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs index 004a091cae..7e7d653dbd 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointConnectionPiece.cs @@ -51,26 +51,14 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components base.LoadComplete(); hitObjectPosition = hitObject.PositionBindable.GetBoundCopy(); - hitObjectPosition.BindValueChanged(_ => pathRequiresUpdate = true); + hitObjectPosition.BindValueChanged(_ => Scheduler.AddOnce(updateConnectingPath)); pathVersion = hitObject.Path.Version.GetBoundCopy(); - pathVersion.BindValueChanged(_ => pathRequiresUpdate = true); + pathVersion.BindValueChanged(_ => Scheduler.AddOnce(updateConnectingPath)); updateConnectingPath(); } - private bool pathRequiresUpdate; - - protected override void Update() - { - base.Update(); - - if (!pathRequiresUpdate) return; - - updateConnectingPath(); - pathRequiresUpdate = false; - } - /// /// Updates the path connecting this control point to the next one. /// From 5303023e574c9e32239bd5afe4bc311241e07faa Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 13 Jan 2024 09:41:53 +0300 Subject: [PATCH 067/651] Add failing test case and fix selection assertion --- .../TestSceneFreeModSelectOverlay.cs | 47 +++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs index f1674401cd..a4feffddfb 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs @@ -10,12 +10,14 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; using osu.Framework.Input; using osu.Framework.Testing; using osu.Game.Overlays.Mods; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Mods; using osu.Game.Screens.OnlinePlay; +using osu.Game.Utils; using osuTK.Input; namespace osu.Game.Tests.Visual.Multiplayer @@ -23,6 +25,7 @@ namespace osu.Game.Tests.Visual.Multiplayer public partial class TestSceneFreeModSelectOverlay : MultiplayerTestScene { private FreeModSelectOverlay freeModSelectOverlay; + private FooterButtonFreeMods footerButtonFreeMods; private readonly Bindable>> availableMods = new Bindable>>(); [BackgroundDependencyLoader] @@ -119,11 +122,46 @@ namespace osu.Game.Tests.Visual.Multiplayer AddAssert("select all button enabled", () => this.ChildrenOfType().Single().Enabled.Value); } + [Test] + public void TestSelectAllViaFooterButtonThenDeselectFromOverlay() + { + createFreeModSelect(); + + AddAssert("overlay select all button enabled", () => freeModSelectOverlay.ChildrenOfType().Single().Enabled.Value); + AddAssert("footer button displays off", () => footerButtonFreeMods.ChildrenOfType().Any(t => t.Text == "off")); + + AddStep("click footer select all button", () => + { + InputManager.MoveMouseTo(footerButtonFreeMods); + InputManager.Click(MouseButton.Left); + }); + + AddUntilStep("all mods selected", assertAllAvailableModsSelected); + AddAssert("footer button displays all", () => footerButtonFreeMods.ChildrenOfType().Any(t => t.Text == "all")); + + AddStep("click deselect all button", () => + { + InputManager.MoveMouseTo(this.ChildrenOfType().Single()); + InputManager.Click(MouseButton.Left); + }); + AddUntilStep("all mods deselected", () => !freeModSelectOverlay.SelectedMods.Value.Any()); + AddAssert("footer button displays off", () => footerButtonFreeMods.ChildrenOfType().Any(t => t.Text == "off")); + } + private void createFreeModSelect() { - AddStep("create free mod select screen", () => Child = freeModSelectOverlay = new FreeModSelectOverlay + AddStep("create free mod select screen", () => Children = new Drawable[] { - State = { Value = Visibility.Visible } + freeModSelectOverlay = new FreeModSelectOverlay + { + State = { Value = Visibility.Visible } + }, + footerButtonFreeMods = new FooterButtonFreeMods(freeModSelectOverlay) + { + Anchor = Anchor.BottomRight, + Origin = Anchor.BottomRight, + Current = { BindTarget = freeModSelectOverlay.SelectedMods }, + }, }); AddUntilStep("all column content loaded", () => freeModSelectOverlay.ChildrenOfType().Any() @@ -134,10 +172,13 @@ namespace osu.Game.Tests.Visual.Multiplayer { var allAvailableMods = availableMods.Value .Where(pair => pair.Key != ModType.System) - .SelectMany(pair => pair.Value) + .SelectMany(pair => ModUtils.FlattenMods(pair.Value)) .Where(mod => mod.UserPlayable && mod.HasImplementation) .ToList(); + if (freeModSelectOverlay.SelectedMods.Value.Count != allAvailableMods.Count) + return false; + foreach (var availableMod in allAvailableMods) { if (freeModSelectOverlay.SelectedMods.Value.All(selectedMod => selectedMod.GetType() != availableMod.GetType())) From c476843a837882bd6d3eb7164a20203a9e6d1774 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 13 Jan 2024 09:43:20 +0300 Subject: [PATCH 068/651] Mark system mods as invalid for selection in mod select overlay --- osu.Game/Overlays/Mods/ModSelectOverlay.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index baa7e594c1..f9875c5547 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -447,7 +447,7 @@ namespace osu.Game.Overlays.Mods private void filterMods() { foreach (var modState in AllAvailableMods) - modState.ValidForSelection.Value = modState.Mod.HasImplementation && IsValidMod.Invoke(modState.Mod); + modState.ValidForSelection.Value = modState.Mod.Type != ModType.System && modState.Mod.HasImplementation && IsValidMod.Invoke(modState.Mod); } private void updateMultiplier() From aebf246f627b8658e94654d903c8d05bd23a190d Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 13 Jan 2024 09:43:50 +0300 Subject: [PATCH 069/651] Change select all mod buttons to check `ValidForSelection` instead of directly checking system mods --- osu.Game/Overlays/Mods/SelectAllModsButton.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Mods/SelectAllModsButton.cs b/osu.Game/Overlays/Mods/SelectAllModsButton.cs index b6b3051a0d..1da762d164 100644 --- a/osu.Game/Overlays/Mods/SelectAllModsButton.cs +++ b/osu.Game/Overlays/Mods/SelectAllModsButton.cs @@ -41,8 +41,8 @@ namespace osu.Game.Overlays.Mods private void updateEnabledState() { Enabled.Value = availableMods.Value - .Where(pair => pair.Key != ModType.System) .SelectMany(pair => pair.Value) + .Where(modState => modState.ValidForSelection.Value) .Any(modState => !modState.Active.Value && modState.Visible); } } From 4cde8685d340006824edf7a17ca2a67323c98279 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 13 Jan 2024 11:16:22 +0300 Subject: [PATCH 070/651] Add failing test case --- .../Multiplayer/TestSceneMultiplayer.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs index 462286335a..201fac37c8 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs @@ -29,7 +29,9 @@ using osu.Game.Rulesets.Catch; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Mods; +using osu.Game.Rulesets.Taiko; using osu.Game.Scoring; +using osu.Game.Screens.OnlinePlay; using osu.Game.Screens.OnlinePlay.Components; using osu.Game.Screens.OnlinePlay.Lounge; using osu.Game.Screens.OnlinePlay.Lounge.Components; @@ -1009,6 +1011,54 @@ namespace osu.Game.Tests.Visual.Multiplayer } } + [Test] + public void TestGameplayStartsWhileInSongSelectWithDifferentRuleset() + { + createRoom(() => new Room + { + Name = { Value = "Test Room" }, + QueueMode = { Value = QueueMode.AllPlayers }, + Playlist = + { + new PlaylistItem(beatmaps.GetWorkingBeatmap(importedSet.Beatmaps.First(b => b.Ruleset.OnlineID == 0)).BeatmapInfo) + { + RulesetID = new OsuRuleset().RulesetInfo.OnlineID, + AllowedMods = new[] { new APIMod { Acronym = "HD" } }, + }, + new PlaylistItem(beatmaps.GetWorkingBeatmap(importedSet.Beatmaps.First(b => b.Ruleset.OnlineID == 1)).BeatmapInfo) + { + RulesetID = new TaikoRuleset().RulesetInfo.OnlineID, + AllowedMods = new[] { new APIMod { Acronym = "HD" } }, + }, + } + }); + + AddStep("join other user and make host", () => + { + multiplayerClient.AddUser(new APIUser { Id = 1234 }); + multiplayerClient.TransferHost(1234); + }); + + AddStep("select hidden", () => multiplayerClient.ChangeUserMods(new[] { new APIMod { Acronym = "HD" } })); + AddStep("make user ready", () => multiplayerClient.ChangeState(MultiplayerUserState.Ready)); + AddStep("press edit on second item", () => this.ChildrenOfType().Single(i => i.Item.RulesetID == 1) + .ChildrenOfType().Single().TriggerClick()); + + AddUntilStep("wait for song select", () => InputManager.ChildrenOfType().FirstOrDefault()?.BeatmapSetsLoaded == true); + AddAssert("ruleset is taiko", () => Ruleset.Value.OnlineID == 1); + + AddStep("start match by other user", () => + { + multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Ready); + multiplayerClient.StartMatch().WaitSafely(); + }); + + AddUntilStep("wait for loading", () => multiplayerClient.ClientRoom?.State == MultiplayerRoomState.WaitingForLoad); + AddStep("set player loaded", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Loaded)); + AddUntilStep("wait for gameplay to start", () => multiplayerClient.ClientRoom?.State == MultiplayerRoomState.Playing); + AddAssert("hidden is selected", () => SelectedMods.Value, () => Has.One.TypeOf(typeof(OsuModHidden))); + } + private void enterGameplay() { pressReadyButton(); From c514550dfa0d3521b74d43aa2e0054a8b4325bdf Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 13 Jan 2024 11:17:08 +0300 Subject: [PATCH 071/651] Fix multiplayer potentially selecting mods of wrong ruleset when starting match --- osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs | 8 ++++---- .../OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs index 2cd8e45d28..f35b205bc4 100644 --- a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs @@ -75,7 +75,7 @@ namespace osu.Game.Screens.OnlinePlay.Match private BeatmapManager beatmapManager { get; set; } [Resolved] - private RulesetStore rulesets { get; set; } + protected RulesetStore Rulesets { get; private set; } [Resolved] private IAPIProvider api { get; set; } = null!; @@ -422,7 +422,7 @@ namespace osu.Game.Screens.OnlinePlay.Match if (selected == null) return; - var rulesetInstance = rulesets.GetRuleset(SelectedItem.Value.RulesetID)?.CreateInstance(); + var rulesetInstance = Rulesets.GetRuleset(SelectedItem.Value.RulesetID)?.CreateInstance(); Debug.Assert(rulesetInstance != null); var allowedMods = SelectedItem.Value.AllowedMods.Select(m => m.ToMod(rulesetInstance)); @@ -463,7 +463,7 @@ namespace osu.Game.Screens.OnlinePlay.Match if (SelectedItem.Value == null || !this.IsCurrentScreen()) return; - var rulesetInstance = rulesets.GetRuleset(SelectedItem.Value.RulesetID)?.CreateInstance(); + var rulesetInstance = Rulesets.GetRuleset(SelectedItem.Value.RulesetID)?.CreateInstance(); Debug.Assert(rulesetInstance != null); Mods.Value = UserMods.Value.Concat(SelectedItem.Value.RequiredMods.Select(m => m.ToMod(rulesetInstance))).ToList(); } @@ -473,7 +473,7 @@ namespace osu.Game.Screens.OnlinePlay.Match if (SelectedItem.Value == null || !this.IsCurrentScreen()) return; - Ruleset.Value = rulesets.GetRuleset(SelectedItem.Value.RulesetID); + Ruleset.Value = Rulesets.GetRuleset(SelectedItem.Value.RulesetID); } private void beginHandlingTrack() diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs index 56256bb15c..8a85a46a2f 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs @@ -241,8 +241,9 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer // update local mods based on room's reported status for the local user (omitting the base call implementation). // this makes the server authoritative, and avoids the local user potentially setting mods that the server is not aware of (ie. if the match was started during the selection being changed). - var ruleset = Ruleset.Value.CreateInstance(); - Mods.Value = client.LocalUser.Mods.Select(m => m.ToMod(ruleset)).Concat(SelectedItem.Value.RequiredMods.Select(m => m.ToMod(ruleset))).ToList(); + var rulesetInstance = Rulesets.GetRuleset(SelectedItem.Value.RulesetID)?.CreateInstance(); + Debug.Assert(rulesetInstance != null); + Mods.Value = client.LocalUser.Mods.Select(m => m.ToMod(rulesetInstance)).Concat(SelectedItem.Value.RequiredMods.Select(m => m.ToMod(rulesetInstance))).ToList(); } [Resolved(canBeNull: true)] From fca9b1f53630831c5ea3d56e09148c81b7ca9c57 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 12:50:39 +0100 Subject: [PATCH 072/651] Fix so it reacts to PathVersion with Scheduler --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs | 6 ++++++ osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 4099d47d61..2f012e33da 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -244,7 +244,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables else if (slidingSample.IsPlaying) slidingSample.Stop(); } + } + protected override void UpdateAfterChildren() + { + base.UpdateAfterChildren(); + + // It's important that this is done in UpdateAfterChildren so that the SliderBody has a chance to update its Size and PathOffset on Update. double completionProgress = Math.Clamp((Time.Current - HitObject.StartTime) / HitObject.Duration, 0, 1); Ball.UpdateProgress(completionProgress); diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs b/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs index cbc62a1c7c..fb31f88d3c 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Default/PlaySliderBody.cs @@ -18,6 +18,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default protected IBindable AccentColourBindable { get; private set; } = null!; + private IBindable pathVersion = null!; + [Resolved(CanBeNull = true)] private OsuRulesetConfigManager? config { get; set; } @@ -31,8 +33,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default ScaleBindable = drawableSlider.ScaleBindable.GetBoundCopy(); ScaleBindable.BindValueChanged(scale => PathRadius = OsuHitObject.OBJECT_RADIUS * scale.NewValue, true); - drawableObject.DefaultsApplied += _ => Refresh(); - drawableObject.HitObjectApplied += _ => Refresh(); + pathVersion = drawableSlider.PathVersion.GetBoundCopy(); + pathVersion.BindValueChanged(_ => Scheduler.AddOnce(Refresh)); AccentColourBindable = drawableObject.AccentColour.GetBoundCopy(); AccentColourBindable.BindValueChanged(accent => AccentColour = GetBodyAccentColour(skin, accent.NewValue), true); From ce643aa68f35369be1a975bb1ceb69fb54192cf2 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 13:54:04 +0100 Subject: [PATCH 073/651] revert overwriting Position getter in SliderTailCircle It would have very weird implications when combined with the position bindable which would be all wrong and stuff --- osu.Game.Rulesets.Osu/Objects/Slider.cs | 4 ++++ osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs | 8 -------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 2aca83ad03..032f105ded 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -218,6 +218,7 @@ namespace osu.Game.Rulesets.Osu.Objects { RepeatIndex = e.SpanIndex, StartTime = e.Time, + Position = EndPosition, StackHeight = StackHeight, ClassicSliderBehaviour = ClassicSliderBehaviour, }); @@ -244,6 +245,9 @@ namespace osu.Game.Rulesets.Osu.Objects if (HeadCircle != null) HeadCircle.Position = Position; + + if (TailCircle != null) + TailCircle.Position = EndPosition; } protected void UpdateNestedSamples() diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs index abe2c7074b..ceee513412 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs @@ -1,11 +1,9 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Rulesets.Scoring; -using osuTK; namespace osu.Game.Rulesets.Osu.Objects { @@ -17,12 +15,6 @@ namespace osu.Game.Rulesets.Osu.Objects /// public bool ClassicSliderBehaviour; - public override Vector2 Position - { - get => Slider.EndPosition; - set => throw new NotImplementedException(); - } - public SliderTailCircle(Slider slider) : base(slider) { From b1fae2bc6a766a6301b8ebdabd3573697ef3020f Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 13 Jan 2024 16:24:48 +0300 Subject: [PATCH 074/651] Add failing test case --- .../TestScenePlayerScoreSubmission.cs | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs index f75a2656ef..833cb24f41 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs @@ -15,11 +15,13 @@ using osu.Game.Online.Rooms; using osu.Game.Online.Solo; using osu.Game.Rulesets; using osu.Game.Rulesets.Mania; +using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko; +using osu.Game.Rulesets.Taiko.Mods; using osu.Game.Scoring; using osu.Game.Screens.Ranking; using osu.Game.Tests.Beatmaps; @@ -34,12 +36,19 @@ namespace osu.Game.Tests.Visual.Gameplay private Func createCustomBeatmap; private Func createCustomRuleset; + private Func createCustomMods; private DummyAPIAccess dummyAPI => (DummyAPIAccess)API; protected override bool HasCustomSteps => true; - protected override TestPlayer CreatePlayer(Ruleset ruleset) => new FakeImportingPlayer(false); + protected override TestPlayer CreatePlayer(Ruleset ruleset) + { + if (createCustomMods != null) + SelectedMods.Value = SelectedMods.Value.Concat(createCustomMods()).ToList(); + + return new FakeImportingPlayer(false); + } protected new FakeImportingPlayer Player => (FakeImportingPlayer)base.Player; @@ -277,13 +286,27 @@ namespace osu.Game.Tests.Visual.Gameplay AddAssert("ensure no submission", () => Player.SubmittedScore == null); } - private void createPlayerTest(bool allowFail = false, Func createBeatmap = null, Func createRuleset = null) + [Test] + public void TestNoSubmissionWithModsOfDifferentRuleset() + { + prepareTestAPI(true); + + createPlayerTest(createRuleset: () => new OsuRuleset(), createMods: () => new Mod[] { new TaikoModHidden() }); + + AddUntilStep("wait for token request", () => Player.TokenCreationRequested); + + AddStep("exit", () => Player.Exit()); + AddAssert("ensure no submission", () => Player.SubmittedScore == null); + } + + private void createPlayerTest(bool allowFail = false, Func createBeatmap = null, Func createRuleset = null, Func createMods = null) { CreateTest(() => AddStep("set up requirements", () => { this.allowFail = allowFail; createCustomBeatmap = createBeatmap; createCustomRuleset = createRuleset; + createCustomMods = createMods; })); } From 0c02062780312b56dd2f79301e097b1b21de146a Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 13 Jan 2024 15:52:57 +0300 Subject: [PATCH 075/651] Add guard against starting gameplay with invalid mod instances Move guard to `Player` instead --- osu.Game/Screens/Play/Player.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index b87306b9a2..ffd585148b 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -213,6 +213,12 @@ namespace osu.Game.Screens.Play if (playableBeatmap == null) return; + if (gameplayMods.Any(m => ruleset.AllMods.All(rulesetMod => m.GetType() != rulesetMod.GetType()))) + { + Logger.Log($@"Gameplay was started with a mod belonging to a ruleset different than '{ruleset.Description}'.", level: LogLevel.Important); + return; + } + mouseWheelDisabled = config.GetBindable(OsuSetting.MouseDisableWheel); if (game != null) From f5d6d52d4c9160affc348e4dd81cbb9a1f5ed352 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 14:47:40 +0100 Subject: [PATCH 076/651] Move logic for caching segments and updating path types to PathControlPointVisualiser --- .../Components/PathControlPointPiece.cs | 42 ---------------- .../Components/PathControlPointVisualiser.cs | 48 +++++++++++++++++++ 2 files changed, 48 insertions(+), 42 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs index 03792d8520..9b40b39a9d 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs @@ -5,19 +5,15 @@ using System; using System.Collections.Generic; -using System.Linq; -using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; -using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Shapes; using osu.Framework.Input.Events; using osu.Framework.Localisation; -using osu.Framework.Utils; using osu.Game.Graphics; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; @@ -56,27 +52,11 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components private IBindable hitObjectPosition; private IBindable hitObjectScale; - [UsedImplicitly] - private readonly IBindable hitObjectVersion; - public PathControlPointPiece(T hitObject, PathControlPoint controlPoint) { this.hitObject = hitObject; ControlPoint = controlPoint; - // we don't want to run the path type update on construction as it may inadvertently change the hit object. - cachePoints(hitObject); - - hitObjectVersion = hitObject.Path.Version.GetBoundCopy(); - - // schedule ensure that updates are only applied after all operations from a single frame are applied. - // this avoids inadvertently changing the hit object path type for batch operations. - hitObjectVersion.BindValueChanged(_ => Scheduler.AddOnce(() => - { - cachePoints(hitObject); - updatePathType(); - })); - controlPoint.Changed += updateMarkerDisplay; Origin = Anchor.Centre; @@ -214,28 +194,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components protected override void OnDragEnd(DragEndEvent e) => DragEnded?.Invoke(); - private void cachePoints(T hitObject) => PointsInSegment = hitObject.Path.PointsInSegment(ControlPoint); - - /// - /// Handles correction of invalid path types. - /// - private void updatePathType() - { - if (ControlPoint.Type != PathType.PERFECT_CURVE) - return; - - if (PointsInSegment.Count > 3) - ControlPoint.Type = PathType.BEZIER; - - if (PointsInSegment.Count != 3) - return; - - ReadOnlySpan points = PointsInSegment.Select(p => p.Position).ToArray(); - RectangleF boundingBox = PathApproximator.CircularArcBoundingBox(points); - if (boundingBox.Width >= 640 || boundingBox.Height >= 480) - ControlPoint.Type = PathType.BEZIER; - } - /// /// Updates the state of the circular control point marker. /// diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs index 24e2210b45..aae6275d45 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs @@ -9,15 +9,18 @@ using System.Collections.Specialized; using System.Diagnostics; using System.Linq; using Humanizer; +using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; +using osu.Framework.Utils; using osu.Game.Graphics.UserInterface; using osu.Game.Rulesets.Edit; using osu.Game.Rulesets.Objects; @@ -52,6 +55,9 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components [Resolved(CanBeNull = true)] private IDistanceSnapProvider distanceSnapProvider { get; set; } + [UsedImplicitly] + private readonly IBindable hitObjectVersion; + public PathControlPointVisualiser(T hitObject, bool allowSelection) { this.hitObject = hitObject; @@ -64,6 +70,48 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components Connections = new Container> { RelativeSizeAxes = Axes.Both }, Pieces = new Container> { RelativeSizeAxes = Axes.Both } }; + + hitObjectVersion = hitObject.Path.Version.GetBoundCopy(); + + // schedule ensure that updates are only applied after all operations from a single frame are applied. + // this avoids inadvertently changing the hit object path type for batch operations. + hitObjectVersion.BindValueChanged(_ => Scheduler.AddOnce(cachePointsAndEnsureValidPathTypes)); + } + + /// + /// Caches the PointsInSegment of Pieces and handles correction of invalid path types. + /// + private void cachePointsAndEnsureValidPathTypes() + { + List pointsInCurrentSegment = new List(); + + foreach (var controlPoint in controlPoints) + { + if (controlPoint.Type != null) + pointsInCurrentSegment = new List(); + + pointsInCurrentSegment.Add(controlPoint); + + // Pieces might not be ordered so we need to find the piece corresponding to the current control point. + Pieces.Single(o => o.ControlPoint == controlPoint).PointsInSegment = pointsInCurrentSegment; + } + + foreach (var piece in Pieces) + { + if (piece.ControlPoint.Type != PathType.PERFECT_CURVE) + return; + + if (piece.PointsInSegment.Count > 3) + piece.ControlPoint.Type = PathType.BEZIER; + + if (piece.PointsInSegment.Count != 3) + return; + + ReadOnlySpan points = piece.PointsInSegment.Select(p => p.Position).ToArray(); + RectangleF boundingBox = PathApproximator.CircularArcBoundingBox(points); + if (boundingBox.Width >= 640 || boundingBox.Height >= 480) + piece.ControlPoint.Type = PathType.BEZIER; + } } protected override void LoadComplete() From b4f9878b4656e83da770fcd00f1b70dd109e4a84 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 20:39:49 +0100 Subject: [PATCH 077/651] working jank solution --- .../Components/PathControlPointVisualiser.cs | 36 ++++++++++++------- osu.Game/Rulesets/Objects/SliderPath.cs | 4 +++ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs index aae6275d45..a02a07f2b6 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs @@ -72,10 +72,27 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components }; hitObjectVersion = hitObject.Path.Version.GetBoundCopy(); + } + + protected override void LoadComplete() + { + base.LoadComplete(); + + inputManager = GetContainingInputManager(); + + controlPoints.CollectionChanged += onControlPointsChanged; + controlPoints.BindTo(hitObject.Path.ControlPoints); // schedule ensure that updates are only applied after all operations from a single frame are applied. // this avoids inadvertently changing the hit object path type for batch operations. - hitObjectVersion.BindValueChanged(_ => Scheduler.AddOnce(cachePointsAndEnsureValidPathTypes)); + hitObject.Path.Validating += cachePointsAndEnsureValidPathTypes; + } + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + + hitObject.Path.Validating -= cachePointsAndEnsureValidPathTypes; } /// @@ -88,7 +105,10 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components foreach (var controlPoint in controlPoints) { if (controlPoint.Type != null) + { + pointsInCurrentSegment.Add(controlPoint); pointsInCurrentSegment = new List(); + } pointsInCurrentSegment.Add(controlPoint); @@ -99,13 +119,13 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components foreach (var piece in Pieces) { if (piece.ControlPoint.Type != PathType.PERFECT_CURVE) - return; + continue; if (piece.PointsInSegment.Count > 3) piece.ControlPoint.Type = PathType.BEZIER; if (piece.PointsInSegment.Count != 3) - return; + continue; ReadOnlySpan points = piece.PointsInSegment.Select(p => p.Position).ToArray(); RectangleF boundingBox = PathApproximator.CircularArcBoundingBox(points); @@ -114,16 +134,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components } } - protected override void LoadComplete() - { - base.LoadComplete(); - - inputManager = GetContainingInputManager(); - - controlPoints.CollectionChanged += onControlPointsChanged; - controlPoints.BindTo(hitObject.Path.ControlPoints); - } - /// /// Selects the corresponding to the given , /// and deselects all other s. diff --git a/osu.Game/Rulesets/Objects/SliderPath.cs b/osu.Game/Rulesets/Objects/SliderPath.cs index dc71608132..bafc62ceda 100644 --- a/osu.Game/Rulesets/Objects/SliderPath.cs +++ b/osu.Game/Rulesets/Objects/SliderPath.cs @@ -25,6 +25,8 @@ namespace osu.Game.Rulesets.Objects private readonly Bindable version = new Bindable(); + public event Action? Validating; + /// /// The user-set distance of the path. If non-null, will match this value, /// and the path will be shortened/lengthened to match this length. @@ -233,6 +235,8 @@ namespace osu.Game.Rulesets.Objects if (pathCache.IsValid) return; + Validating?.Invoke(); + calculatePath(); calculateLength(); From da4d83f8ca2c7ccf5ff651c80df656393b817b7f Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 20:54:44 +0100 Subject: [PATCH 078/651] remove the need for caching points in segment --- .../Components/PathControlPointPiece.cs | 2 - .../Components/PathControlPointVisualiser.cs | 57 +++++++++---------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs index 9b40b39a9d..8ddc38c38e 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs @@ -37,8 +37,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components public Action DragInProgress; public Action DragEnded; - public List PointsInSegment; - public readonly BindableBool IsSelected = new BindableBool(); public readonly PathControlPoint ControlPoint; diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs index a02a07f2b6..d057565c2b 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs @@ -9,7 +9,6 @@ using System.Collections.Specialized; using System.Diagnostics; using System.Linq; using Humanizer; -using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; @@ -55,9 +54,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components [Resolved(CanBeNull = true)] private IDistanceSnapProvider distanceSnapProvider { get; set; } - [UsedImplicitly] - private readonly IBindable hitObjectVersion; - public PathControlPointVisualiser(T hitObject, bool allowSelection) { this.hitObject = hitObject; @@ -70,8 +66,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components Connections = new Container> { RelativeSizeAxes = Axes.Both }, Pieces = new Container> { RelativeSizeAxes = Axes.Both } }; - - hitObjectVersion = hitObject.Path.Version.GetBoundCopy(); } protected override void LoadComplete() @@ -85,20 +79,20 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components // schedule ensure that updates are only applied after all operations from a single frame are applied. // this avoids inadvertently changing the hit object path type for batch operations. - hitObject.Path.Validating += cachePointsAndEnsureValidPathTypes; + hitObject.Path.Validating += ensureValidPathTypes; } protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); - hitObject.Path.Validating -= cachePointsAndEnsureValidPathTypes; + hitObject.Path.Validating -= ensureValidPathTypes; } /// - /// Caches the PointsInSegment of Pieces and handles correction of invalid path types. + /// Handles correction of invalid path types. /// - private void cachePointsAndEnsureValidPathTypes() + private void ensureValidPathTypes() { List pointsInCurrentSegment = new List(); @@ -107,31 +101,33 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components if (controlPoint.Type != null) { pointsInCurrentSegment.Add(controlPoint); - pointsInCurrentSegment = new List(); + ensureValidPathType(pointsInCurrentSegment); + pointsInCurrentSegment.Clear(); } pointsInCurrentSegment.Add(controlPoint); - - // Pieces might not be ordered so we need to find the piece corresponding to the current control point. - Pieces.Single(o => o.ControlPoint == controlPoint).PointsInSegment = pointsInCurrentSegment; } - foreach (var piece in Pieces) - { - if (piece.ControlPoint.Type != PathType.PERFECT_CURVE) - continue; + ensureValidPathType(pointsInCurrentSegment); + } - if (piece.PointsInSegment.Count > 3) - piece.ControlPoint.Type = PathType.BEZIER; + private void ensureValidPathType(IReadOnlyList segment) + { + var first = segment[0]; - if (piece.PointsInSegment.Count != 3) - continue; + if (first.Type != PathType.PERFECT_CURVE) + return; - ReadOnlySpan points = piece.PointsInSegment.Select(p => p.Position).ToArray(); - RectangleF boundingBox = PathApproximator.CircularArcBoundingBox(points); - if (boundingBox.Width >= 640 || boundingBox.Height >= 480) - piece.ControlPoint.Type = PathType.BEZIER; - } + if (segment.Count > 3) + first.Type = PathType.BEZIER; + + if (segment.Count != 3) + return; + + ReadOnlySpan points = segment.Select(p => p.Position).ToArray(); + RectangleF boundingBox = PathApproximator.CircularArcBoundingBox(points); + if (boundingBox.Width >= 640 || boundingBox.Height >= 480) + first.Type = PathType.BEZIER; } /// @@ -298,7 +294,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components /// The path type we want to assign to the given control point piece. private void updatePathType(PathControlPointPiece piece, PathType? type) { - int indexInSegment = piece.PointsInSegment.IndexOf(piece.ControlPoint); + var pointsInSegment = hitObject.Path.PointsInSegment(piece.ControlPoint); + int indexInSegment = pointsInSegment.IndexOf(piece.ControlPoint); if (type?.Type == SplineType.PerfectCurve) { @@ -307,8 +304,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components // and one segment of the previous type. int thirdPointIndex = indexInSegment + 2; - if (piece.PointsInSegment.Count > thirdPointIndex + 1) - piece.PointsInSegment[thirdPointIndex].Type = piece.PointsInSegment[0].Type; + if (pointsInSegment.Count > thirdPointIndex + 1) + pointsInSegment[thirdPointIndex].Type = pointsInSegment[0].Type; } hitObject.Path.ExpectedDistance.Value = null; From 1e3c332658a320fb2dbf49e4a97e2927cafc4dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 13 Jan 2024 21:39:32 +0100 Subject: [PATCH 079/651] Fix broken installer Closes https://github.com/ppy/osu/issues/26510. Time for a rant. Technically, this "broke" with 9e8d07d3144bd4b072d28bd9bd0e255fee410de0, but it is actually an end result of upstream behaviours that I am failing to find a better description for than "utterly broken". Squirrel (the installer we use) has unit tests. Which is great, power to them. However, the method in which that testing is implemented leads to epic levels of WTF breakage. To determine whether Squirrel is being tested right now, it is checking all currently loaded assemblies, and determining that if any loaded assembly contains the magic string of "NUNIT" - among others - it must be being tested right now: https://github.com/clowd/Clowd.Squirrel/blob/24427217482deeeb9f2cacac555525edfc7bd9ac/src/Squirrel/SimpleSplat/PlatformModeDetector.cs#L17-L32 If one assumes that there is no conceivable way that an NUnit assembly *may* be loaded *without* it being a test context, this *may* seem sane. Foreshadowing. (Now, to avoid being hypocritical, we also do this, *but* we do this by checking if the *entry* assembly is an NUnit: https://github.com/ppy/osu-framework/blob/92db55a52742047b42c0b4b25327ce28bd991b44/osu.Framework/Development/DebugUtils.cs#L16-L34 which seems *much* saner, no?) Now, why did this break with 9e8d07d3144bd4b072d28bd9bd0e255fee410de0 *specifically*, you might wonder? Well the reason is this line: https://github.com/ppy/osu/blob/3d3f58c2523f519504d9156a684538e2aa0c094c/osu.Desktop/NVAPI.cs#L183 Yes you are reading this correctly, it's not NVAPI anything itself that breaks this, it is *a log statement*. To be precise, what the log statement *does* to provoke this, is calling into framework. That causes the framework assembly to load, *which* transitively loads the `nunit.framework` assembly. (If you ever find yourself wanting to find out this sort of cursed knowledge - I hope you never need to - you can run something along the lines of dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- .\osu!.exe then open the resulting trace in PerfView, and then search the `Microsoft-Windows-DotNETRuntime/AssemblyLoader/Start` log for the cursed assembly. In this case, the relevant entry said something along the lines of HasStack="True" ThreadID="23,924" ProcessorNumber="0" ClrInstanceID="6" AssemblyName="nunit.framework, Version=3.13.3.0, Culture=neutral, PublicKeyToken=2638cd05610744eb" AssemblyPath="" RequestingAssembly="osu.Framework, Version=2024.113.0.0, Culture=neutral, PublicKeyToken=null" AssemblyLoadContext="Default" RequestingAssemblyLoadContext="Default" ActivityID="/#21032/1/26/" Either that or just comment the log line for kicks. But the above is *much* faster.) Now, what *happens* if Squirrel "detects" that it is being "tested"? Well, it will refuse to close after executing the "hooks" defined via `SquirrelAwareApp`: https://github.com/clowd/Clowd.Squirrel/blob/24427217482deeeb9f2cacac555525edfc7bd9ac/src/Squirrel/SquirrelAwareApp.cs#L85-L88 and it will also refuse to create version shortcuts: https://github.com/clowd/Clowd.Squirrel/blob/24427217482deeeb9f2cacac555525edfc7bd9ac/src/Squirrel/UpdateManager.Shortcuts.cs#L63-L65 Sounds familiar, don't it? There are days on which I tire of computers. Today is one of them. --- osu.Desktop/Program.cs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/osu.Desktop/Program.cs b/osu.Desktop/Program.cs index a652e31f62..6b95a82703 100644 --- a/osu.Desktop/Program.cs +++ b/osu.Desktop/Program.cs @@ -30,12 +30,19 @@ namespace osu.Desktop [STAThread] public static void Main(string[] args) { - // NVIDIA profiles are based on the executable name of a process. - // Lazer and stable share the same executable name. - // Stable sets this setting to "Off", which may not be what we want, so let's force it back to the default "Auto" on startup. - NVAPI.ThreadedOptimisations = NvThreadControlSetting.OGL_THREAD_CONTROL_DEFAULT; - - // run Squirrel first, as the app may exit after these run + /* + * WARNING: DO NOT PLACE **ANY** CODE ABOVE THE FOLLOWING BLOCK! + * + * Logic handling Squirrel MUST run before EVERYTHING if you do not want to break it. + * To be more precise: Squirrel is internally using a rather... crude method to determine whether it is running under NUnit, + * namely by checking loaded assemblies: + * https://github.com/clowd/Clowd.Squirrel/blob/24427217482deeeb9f2cacac555525edfc7bd9ac/src/Squirrel/SimpleSplat/PlatformModeDetector.cs#L17-L32 + * + * If it finds ANY assembly from the ones listed above - REGARDLESS of the reason why it is loaded - + * the app will then do completely broken things like: + * - not creating system shortcuts (as the logic is if'd out if "running tests") + * - not exiting after the install / first-update / uninstall hooks are ran (as the `Environment.Exit()` calls are if'd out if "running tests") + */ if (OperatingSystem.IsWindows()) { var windowsVersion = Environment.OSVersion.Version; @@ -59,6 +66,11 @@ namespace osu.Desktop setupSquirrel(); } + // NVIDIA profiles are based on the executable name of a process. + // Lazer and stable share the same executable name. + // Stable sets this setting to "Off", which may not be what we want, so let's force it back to the default "Auto" on startup. + NVAPI.ThreadedOptimisations = NvThreadControlSetting.OGL_THREAD_CONTROL_DEFAULT; + // Back up the cwd before DesktopGameHost changes it string cwd = Environment.CurrentDirectory; From 39908f5425d99d04e4c09b833c170193f3715205 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 22:39:09 +0100 Subject: [PATCH 080/651] remove Validating event and instead call validation explicitly on edits --- .../Components/PathControlPointVisualiser.cs | 20 ++++++++----------- .../Sliders/SliderPlacementBlueprint.cs | 2 ++ .../Sliders/SliderSelectionBlueprint.cs | 4 ++++ osu.Game/Rulesets/Objects/SliderPath.cs | 4 ---- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs index d057565c2b..b2d1709531 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs @@ -76,23 +76,12 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components controlPoints.CollectionChanged += onControlPointsChanged; controlPoints.BindTo(hitObject.Path.ControlPoints); - - // schedule ensure that updates are only applied after all operations from a single frame are applied. - // this avoids inadvertently changing the hit object path type for batch operations. - hitObject.Path.Validating += ensureValidPathTypes; - } - - protected override void Dispose(bool isDisposing) - { - base.Dispose(isDisposing); - - hitObject.Path.Validating -= ensureValidPathTypes; } /// /// Handles correction of invalid path types. /// - private void ensureValidPathTypes() + public void EnsureValidPathTypes() { List pointsInCurrentSegment = new List(); @@ -113,6 +102,9 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components private void ensureValidPathType(IReadOnlyList segment) { + if (segment.Count == 0) + return; + var first = segment[0]; if (first.Type != PathType.PERFECT_CURVE) @@ -394,6 +386,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components // Maintain the path types in case they got defaulted to bezier at some point during the drag. for (int i = 0; i < hitObject.Path.ControlPoints.Count; i++) hitObject.Path.ControlPoints[i].Type = dragPathTypes[i]; + + EnsureValidPathTypes(); } public void DragEnded() => changeHandler?.EndChange(); @@ -467,6 +461,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components { foreach (var p in Pieces.Where(p => p.IsSelected.Value)) updatePathType(p, type); + + EnsureValidPathTypes(); }); if (countOfState == totalCount) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs index 28e972bacd..75ed818693 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs @@ -316,6 +316,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders private void updateSlider() { + controlPointVisualiser.EnsureValidPathTypes(); + if (state == SliderPlacementState.Drawing) HitObject.Path.ExpectedDistance.Value = (float)HitObject.Path.CalculatedDistance; else diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs index b3efe1c495..3575e15d1d 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs @@ -254,6 +254,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders // Move the control points from the insertion index onwards to make room for the insertion controlPoints.Insert(insertionIndex, pathControlPoint); + ControlPointVisualiser?.EnsureValidPathTypes(); + HitObject.SnapTo(distanceSnapProvider); return pathControlPoint; @@ -275,6 +277,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders controlPoints.Remove(c); } + ControlPointVisualiser?.EnsureValidPathTypes(); + // Snap the slider to the current beat divisor before checking length validity. HitObject.SnapTo(distanceSnapProvider); diff --git a/osu.Game/Rulesets/Objects/SliderPath.cs b/osu.Game/Rulesets/Objects/SliderPath.cs index bafc62ceda..dc71608132 100644 --- a/osu.Game/Rulesets/Objects/SliderPath.cs +++ b/osu.Game/Rulesets/Objects/SliderPath.cs @@ -25,8 +25,6 @@ namespace osu.Game.Rulesets.Objects private readonly Bindable version = new Bindable(); - public event Action? Validating; - /// /// The user-set distance of the path. If non-null, will match this value, /// and the path will be shortened/lengthened to match this length. @@ -235,8 +233,6 @@ namespace osu.Game.Rulesets.Objects if (pathCache.IsValid) return; - Validating?.Invoke(); - calculatePath(); calculateLength(); From 83e108071a123650991fded528f64ad80421d155 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 22:51:33 +0100 Subject: [PATCH 081/651] fix wrong path type being displayed --- .../Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs index 75ed818693..0fa84c91fc 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderPlacementBlueprint.cs @@ -267,6 +267,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders segmentStart.Type = PathType.BEZIER; break; } + + controlPointVisualiser.EnsureValidPathTypes(); } private void updateCursor() @@ -316,8 +318,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders private void updateSlider() { - controlPointVisualiser.EnsureValidPathTypes(); - if (state == SliderPlacementState.Drawing) HitObject.Path.ExpectedDistance.Value = (float)HitObject.Path.CalculatedDistance; else From 243b7b6fdad6aa28df1df8a06ecf574ebeff1238 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Sat, 13 Jan 2024 23:17:38 +0100 Subject: [PATCH 082/651] fix code quality --- .../Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs index 8ddc38c38e..e741d67e3b 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs @@ -4,7 +4,6 @@ #nullable disable using System; -using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; From 68496f7a0e865b3d1d74415d482e78a4747bd454 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 14 Jan 2024 15:13:20 +0900 Subject: [PATCH 083/651] Fix scores not showing up on leaderboards during gameplay --- osu.Game/Screens/Select/PlaySongSelect.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index 4951504ff5..7b7b8857f3 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -146,14 +146,6 @@ namespace osu.Game.Screens.Select } } - public override void OnSuspending(ScreenTransitionEvent e) - { - // Scores will be refreshed on arriving at this screen. - // Clear them to avoid animation overload on returning to song select. - playBeatmapDetailArea.Leaderboard.ClearScores(); - base.OnSuspending(e); - } - public override void OnResuming(ScreenTransitionEvent e) { base.OnResuming(e); From b7d74fda88b98cd8b78df7ae5e907cc8b8fb9c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jan 2024 09:10:39 +0100 Subject: [PATCH 084/651] Revert "Keep editor in frame stable mode when possible" --- .../TestSceneEditorAutoplayFastStreams.cs | 51 ------------------- .../Editor/TestSceneOsuComposerSelection.cs | 2 - .../Edit/DrawableEditorRulesetWrapper.cs | 21 +------- 3 files changed, 1 insertion(+), 73 deletions(-) delete mode 100644 osu.Game.Rulesets.Osu.Tests/Editor/TestSceneEditorAutoplayFastStreams.cs diff --git a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneEditorAutoplayFastStreams.cs b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneEditorAutoplayFastStreams.cs deleted file mode 100644 index cf5cd809ef..0000000000 --- a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneEditorAutoplayFastStreams.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using System.Linq; -using NUnit.Framework; -using osu.Framework.Testing; -using osu.Game.Beatmaps; -using osu.Game.Rulesets.Osu.Objects; -using osu.Game.Rulesets.Osu.Objects.Drawables; -using osu.Game.Tests.Beatmaps; -using osu.Game.Tests.Visual; - -namespace osu.Game.Rulesets.Osu.Tests.Editor -{ - /// - /// This test covers autoplay working correctly in the editor on fast streams. - /// Might seem like a weird test, but frame stability being toggled can cause autoplay to operation incorrectly. - /// This is clearly a bug with the autoplay algorithm, but is worked around at an editor level for now. - /// - public partial class TestSceneEditorAutoplayFastStreams : EditorTestScene - { - protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) - { - var testBeatmap = new TestBeatmap(ruleset, false); - testBeatmap.HitObjects.AddRange(new[] - { - new HitCircle { StartTime = 500 }, - new HitCircle { StartTime = 530 }, - new HitCircle { StartTime = 560 }, - new HitCircle { StartTime = 590 }, - new HitCircle { StartTime = 620 }, - }); - - return testBeatmap; - } - - protected override Ruleset CreateEditorRuleset() => new OsuRuleset(); - - [Test] - public void TestAllHit() - { - AddStep("start playback", () => EditorClock.Start()); - AddUntilStep("wait for all hit", () => - { - DrawableHitCircle[] hitCircles = Editor.ChildrenOfType().OrderBy(s => s.HitObject.StartTime).ToArray(); - - return hitCircles.Length == 5 && hitCircles.All(h => h.IsHit); - }); - } - } -} diff --git a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs index 366f17daee..623cefff6b 100644 --- a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs +++ b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs @@ -46,12 +46,10 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor moveMouseToObject(() => slider); AddStep("seek after end", () => EditorClock.Seek(750)); - AddUntilStep("wait for seek", () => !EditorClock.IsSeeking); AddStep("left click", () => InputManager.Click(MouseButton.Left)); AddAssert("slider not selected", () => EditorBeatmap.SelectedHitObjects.Count == 0); AddStep("seek to visible", () => EditorClock.Seek(650)); - AddUntilStep("wait for seek", () => !EditorClock.IsSeeking); AddStep("left click", () => InputManager.Click(MouseButton.Left)); AddUntilStep("slider selected", () => EditorBeatmap.SelectedHitObjects.Single() == slider); } diff --git a/osu.Game/Rulesets/Edit/DrawableEditorRulesetWrapper.cs b/osu.Game/Rulesets/Edit/DrawableEditorRulesetWrapper.cs index ebf06bcc4e..174b278d89 100644 --- a/osu.Game/Rulesets/Edit/DrawableEditorRulesetWrapper.cs +++ b/osu.Game/Rulesets/Edit/DrawableEditorRulesetWrapper.cs @@ -1,7 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Extensions.ObjectExtensions; @@ -27,9 +26,6 @@ namespace osu.Game.Rulesets.Edit [Resolved] private EditorBeatmap beatmap { get; set; } = null!; - [Resolved] - private EditorClock editorClock { get; set; } = null!; - public DrawableEditorRulesetWrapper(DrawableRuleset drawableRuleset) { this.drawableRuleset = drawableRuleset; @@ -42,6 +38,7 @@ namespace osu.Game.Rulesets.Edit [BackgroundDependencyLoader] private void load() { + drawableRuleset.FrameStablePlayback = false; Playfield.DisplayJudgements.Value = false; } @@ -68,22 +65,6 @@ namespace osu.Game.Rulesets.Edit Scheduler.AddOnce(regenerateAutoplay); } - protected override void Update() - { - base.Update(); - - // Whenever possible, we want to stay in frame stability playback. - // Without doing so, we run into bugs with some gameplay elements not behaving as expected. - // - // Note that this is not using EditorClock.IsSeeking as that would exit frame stability - // on all seeks. The intention here is to retain frame stability for small seeks. - // - // I still think no gameplay elements should require frame stability in the first place, but maybe that ship has sailed already.. - bool shouldBypassFrameStability = Math.Abs(drawableRuleset.FrameStableClock.CurrentTime - editorClock.CurrentTime) > 1000; - - drawableRuleset.FrameStablePlayback = !shouldBypassFrameStability; - } - private void regenerateAutoplay() { var autoplayMod = drawableRuleset.Mods.OfType().Single(); From eecd868d66a2fe928b76756996d25e588b383309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jan 2024 09:24:50 +0100 Subject: [PATCH 085/651] Use darker blue for `SliderTailHit` result --- osu.Game/Graphics/OsuColour.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Graphics/OsuColour.cs b/osu.Game/Graphics/OsuColour.cs index 0d11d2d4ef..1b5877b966 100644 --- a/osu.Game/Graphics/OsuColour.cs +++ b/osu.Game/Graphics/OsuColour.cs @@ -95,6 +95,7 @@ namespace osu.Game.Graphics case HitResult.SmallTickHit: case HitResult.LargeTickHit: + case HitResult.SliderTailHit: case HitResult.Great: return Blue; From 1cd7656f331172a281b12552c62b1f52ca2bad1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jan 2024 09:33:04 +0100 Subject: [PATCH 086/651] Reorder hit results so that `SliderTailHit` is next to `SmallTickHit` This addresses https://github.com/ppy/osu/discussions/26507. --- osu.Game/Rulesets/Scoring/HitResult.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/osu.Game/Rulesets/Scoring/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs index f307344347..7e58df3cfa 100644 --- a/osu.Game/Rulesets/Scoring/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Scoring /// [Description(@"")] [EnumMember(Value = "none")] - [Order(14)] + [Order(15)] None, /// @@ -71,7 +71,7 @@ namespace osu.Game.Rulesets.Scoring /// Indicates small tick miss. /// [EnumMember(Value = "small_tick_miss")] - [Order(11)] + [Order(12)] SmallTickMiss, /// @@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Scoring /// [EnumMember(Value = "large_tick_miss")] [Description("-")] - [Order(10)] + [Order(11)] LargeTickMiss, /// @@ -103,7 +103,7 @@ namespace osu.Game.Rulesets.Scoring /// [Description("S Bonus")] [EnumMember(Value = "small_bonus")] - [Order(9)] + [Order(10)] SmallBonus, /// @@ -111,7 +111,7 @@ namespace osu.Game.Rulesets.Scoring /// [Description("L Bonus")] [EnumMember(Value = "large_bonus")] - [Order(8)] + [Order(9)] LargeBonus, /// @@ -119,14 +119,14 @@ namespace osu.Game.Rulesets.Scoring /// [EnumMember(Value = "ignore_miss")] [Description("-")] - [Order(13)] + [Order(14)] IgnoreMiss, /// /// Indicates a hit that should be ignored for scoring purposes. /// [EnumMember(Value = "ignore_hit")] - [Order(12)] + [Order(13)] IgnoreHit, /// @@ -136,14 +136,14 @@ namespace osu.Game.Rulesets.Scoring /// May be paired with . /// [EnumMember(Value = "combo_break")] - [Order(15)] + [Order(16)] ComboBreak, /// /// A special judgement similar to that's used to increase the valuation of the final tick of a slider. /// [EnumMember(Value = "slider_tail_hit")] - [Order(16)] + [Order(8)] SliderTailHit, /// From f85e6add8e7ba95463622904d26202e140ed4434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jan 2024 12:55:07 +0100 Subject: [PATCH 087/651] Add failing test case --- .../Mods/TestSceneOsuModFlashlight.cs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs index a353914cd5..defbb97c8a 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs @@ -1,8 +1,18 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Collections.Generic; +using System.Linq; using NUnit.Framework; +using osu.Framework.Testing; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Osu.Beatmaps; using osu.Game.Rulesets.Osu.Mods; +using osu.Game.Rulesets.Osu.Objects; +using osu.Game.Rulesets.Osu.Replays; +using osu.Game.Rulesets.Replays; +using osuTK; namespace osu.Game.Rulesets.Osu.Tests.Mods { @@ -21,5 +31,51 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods [Test] public void TestComboBasedSize([Values] bool comboBasedSize) => CreateModTest(new ModTestData { Mod = new OsuModFlashlight { ComboBasedSize = { Value = comboBasedSize } }, PassCondition = () => true }); + + [Test] + public void TestSliderDimsOnlyAfterStartTime() + { + bool sliderDimmedBeforeStartTime = false; + + CreateModTest(new ModTestData + { + Mod = new OsuModFlashlight(), + PassCondition = () => + { + sliderDimmedBeforeStartTime |= + Player.GameplayClockContainer.CurrentTime < 1000 && Player.ChildrenOfType.Flashlight>().Single().FlashlightDim > 0; + return Player.GameplayState.HasPassed && !sliderDimmedBeforeStartTime; + }, + Beatmap = new OsuBeatmap + { + HitObjects = new List + { + new HitCircle { StartTime = 0, }, + new Slider + { + StartTime = 1000, + Path = new SliderPath(new[] + { + new PathControlPoint(), + new PathControlPoint(new Vector2(100)) + }) + } + }, + BeatmapInfo = + { + StackLeniency = 0, + } + }, + ReplayFrames = new List + { + new OsuReplayFrame(0, new Vector2(), OsuAction.LeftButton), + new OsuReplayFrame(990, new Vector2()), + new OsuReplayFrame(1000, new Vector2(), OsuAction.LeftButton), + new OsuReplayFrame(2000, new Vector2(100), OsuAction.LeftButton), + new OsuReplayFrame(2001, new Vector2(100)), + }, + Autoplay = false, + }); + } } } From 0b2b1fc58888b430c16e81119fe2a277567775de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jan 2024 13:05:02 +0100 Subject: [PATCH 088/651] Fix flashlight dim being applied before slider start time Closes https://github.com/ppy/osu/issues/26515. Compare https://github.com/ppy/osu/pull/26053. --- osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs b/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs index 252d7e2762..46c9bdd17f 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs @@ -50,7 +50,7 @@ namespace osu.Game.Rulesets.Osu.Mods public void ApplyToDrawableHitObject(DrawableHitObject drawable) { if (drawable is DrawableSlider s) - s.Tracking.ValueChanged += flashlight.OnSliderTrackingChange; + s.Tracking.ValueChanged += _ => flashlight.OnSliderTrackingChange(s); } private partial class OsuFlashlight : Flashlight, IRequireHighFrequencyMousePosition @@ -66,10 +66,10 @@ namespace osu.Game.Rulesets.Osu.Mods FlashlightSmoothness = 1.4f; } - public void OnSliderTrackingChange(ValueChangedEvent e) + public void OnSliderTrackingChange(DrawableSlider e) { // If a slider is in a tracking state, a further dim should be applied to the (remaining) visible portion of the playfield. - FlashlightDim = e.NewValue ? 0.8f : 0.0f; + FlashlightDim = Time.Current >= e.HitObject.StartTime && e.Tracking.Value ? 0.8f : 0.0f; } protected override bool OnMouseMove(MouseMoveEvent e) From baf3867e17c5d10e63433dcdf429095bce9deaa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jan 2024 13:48:47 +0100 Subject: [PATCH 089/651] Fix date failing to display on leaderboard for some scores with weird datetimes Addresses https://github.com/ppy/osu/discussions/26517. The score reported has a datetime of 0001/1/1 05:00:00 AM. Bit of a dodge fix but maybe fine? --- osu.Game/Extensions/TimeDisplayExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Extensions/TimeDisplayExtensions.cs b/osu.Game/Extensions/TimeDisplayExtensions.cs index 98633958ee..1b224cfeb7 100644 --- a/osu.Game/Extensions/TimeDisplayExtensions.cs +++ b/osu.Game/Extensions/TimeDisplayExtensions.cs @@ -59,7 +59,8 @@ namespace osu.Game.Extensions /// A short relative string representing the input time. public static string ToShortRelativeTime(this DateTimeOffset time, TimeSpan lowerCutoff) { - if (time == default) + // covers all `DateTimeOffset` instances with the date portion of 0001-01-01. + if (time.Date == default) return "-"; var now = DateTime.Now; From fb4f8d0834ee2dee64eda3e5ba8054faa26130eb Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 14 Jan 2024 22:31:48 +0900 Subject: [PATCH 090/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index e39143ab93..a7376aa5a7 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index 9afeaf7338..98e8b136e5 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From 724b4c9507b886fa8af21c6384d01ae0752305d4 Mon Sep 17 00:00:00 2001 From: Susko3 Date: Sun, 14 Jan 2024 21:09:49 +0100 Subject: [PATCH 091/651] Expand click target of toolbar buttons and clock --- osu.Game/Overlays/Toolbar/ToolbarButton.cs | 92 ++++++++++--------- osu.Game/Overlays/Toolbar/ToolbarClock.cs | 77 +++++++++------- .../Overlays/Toolbar/ToolbarHomeButton.cs | 2 +- .../Overlays/Toolbar/ToolbarMusicButton.cs | 2 +- .../Toolbar/ToolbarRulesetTabButton.cs | 2 +- .../Overlays/Toolbar/ToolbarSettingsButton.cs | 2 +- .../Overlays/Toolbar/ToolbarUserButton.cs | 2 +- 7 files changed, 97 insertions(+), 82 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index 03a1cfc005..36ff703c82 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -63,6 +63,7 @@ namespace osu.Game.Overlays.Toolbar protected virtual Anchor TooltipAnchor => Anchor.TopLeft; + protected readonly Container ButtonContent; protected ConstrainedIconContainer IconContainer; protected SpriteText DrawableText; protected Box HoverBackground; @@ -80,59 +81,66 @@ namespace osu.Game.Overlays.Toolbar protected ToolbarButton() { - Width = Toolbar.HEIGHT; + AutoSizeAxes = Axes.X; RelativeSizeAxes = Axes.Y; - Padding = new MarginPadding(3); - Children = new Drawable[] { - BackgroundContent = new Container + ButtonContent = new Container { - RelativeSizeAxes = Axes.Both, - Masking = true, - CornerRadius = 6, - CornerExponent = 3f, - Children = new Drawable[] - { - HoverBackground = new Box - { - RelativeSizeAxes = Axes.Both, - Colour = OsuColour.Gray(80).Opacity(180), - Blending = BlendingParameters.Additive, - Alpha = 0, - }, - flashBackground = new Box - { - RelativeSizeAxes = Axes.Both, - Alpha = 0, - Colour = Color4.White.Opacity(100), - Blending = BlendingParameters.Additive, - }, - } - }, - Flow = new FillFlowContainer - { - Direction = FillDirection.Horizontal, - Spacing = new Vector2(5), - Anchor = Anchor.TopCentre, - Origin = Anchor.TopCentre, - Padding = new MarginPadding { Left = Toolbar.HEIGHT / 2, Right = Toolbar.HEIGHT / 2 }, + Width = Toolbar.HEIGHT, RelativeSizeAxes = Axes.Y, - AutoSizeAxes = Axes.X, + Padding = new MarginPadding(3), Children = new Drawable[] { - IconContainer = new ConstrainedIconContainer + BackgroundContent = new Container { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - Size = new Vector2(20), - Alpha = 0, + RelativeSizeAxes = Axes.Both, + Masking = true, + CornerRadius = 6, + CornerExponent = 3f, + Children = new Drawable[] + { + HoverBackground = new Box + { + RelativeSizeAxes = Axes.Both, + Colour = OsuColour.Gray(80).Opacity(180), + Blending = BlendingParameters.Additive, + Alpha = 0, + }, + flashBackground = new Box + { + RelativeSizeAxes = Axes.Both, + Alpha = 0, + Colour = Color4.White.Opacity(100), + Blending = BlendingParameters.Additive, + }, + } }, - DrawableText = new OsuSpriteText + Flow = new FillFlowContainer { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, + Direction = FillDirection.Horizontal, + Spacing = new Vector2(5), + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + Padding = new MarginPadding { Left = Toolbar.HEIGHT / 2, Right = Toolbar.HEIGHT / 2 }, + RelativeSizeAxes = Axes.Y, + AutoSizeAxes = Axes.X, + Children = new Drawable[] + { + IconContainer = new ConstrainedIconContainer + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + Size = new Vector2(20), + Alpha = 0, + }, + DrawableText = new OsuSpriteText + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + }, + }, }, }, }, diff --git a/osu.Game/Overlays/Toolbar/ToolbarClock.cs b/osu.Game/Overlays/Toolbar/ToolbarClock.cs index 67688155ae..e7959986ae 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarClock.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarClock.cs @@ -42,52 +42,59 @@ namespace osu.Game.Overlays.Toolbar clockDisplayMode = config.GetBindable(OsuSetting.ToolbarClockDisplayMode); prefer24HourTime = config.GetBindable(OsuSetting.Prefer24HourTime); - Padding = new MarginPadding(3); - Children = new Drawable[] { new Container - { - RelativeSizeAxes = Axes.Both, - Masking = true, - CornerRadius = 6, - CornerExponent = 3f, - Children = new Drawable[] - { - hoverBackground = new Box - { - RelativeSizeAxes = Axes.Both, - Colour = OsuColour.Gray(80).Opacity(180), - Blending = BlendingParameters.Additive, - Alpha = 0, - }, - flashBackground = new Box - { - RelativeSizeAxes = Axes.Both, - Alpha = 0, - Colour = Color4.White.Opacity(100), - Blending = BlendingParameters.Additive, - }, - } - }, - new FillFlowContainer { RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, - Direction = FillDirection.Horizontal, - Spacing = new Vector2(5), - Padding = new MarginPadding(10), + Padding = new MarginPadding(3), Children = new Drawable[] { - analog = new AnalogClockDisplay + new Container { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, + RelativeSizeAxes = Axes.Both, + Masking = true, + CornerRadius = 6, + CornerExponent = 3f, + Children = new Drawable[] + { + hoverBackground = new Box + { + RelativeSizeAxes = Axes.Both, + Colour = OsuColour.Gray(80).Opacity(180), + Blending = BlendingParameters.Additive, + Alpha = 0, + }, + flashBackground = new Box + { + RelativeSizeAxes = Axes.Both, + Alpha = 0, + Colour = Color4.White.Opacity(100), + Blending = BlendingParameters.Additive, + }, + } }, - digital = new DigitalClockDisplay + new FillFlowContainer { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, + RelativeSizeAxes = Axes.Y, + AutoSizeAxes = Axes.X, + Direction = FillDirection.Horizontal, + Spacing = new Vector2(5), + Padding = new MarginPadding(10), + Children = new Drawable[] + { + analog = new AnalogClockDisplay + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + }, + digital = new DigitalClockDisplay + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + } + } } } } diff --git a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs index 70675c1b92..499ca804c9 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs @@ -12,7 +12,7 @@ namespace osu.Game.Overlays.Toolbar { public ToolbarHomeButton() { - Width *= 1.4f; + ButtonContent.Width *= 1.4f; Hotkey = GlobalAction.Home; } diff --git a/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs b/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs index 69597c6b46..5da0056787 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs @@ -28,7 +28,7 @@ namespace osu.Game.Overlays.Toolbar public ToolbarMusicButton() { Hotkey = GlobalAction.ToggleNowPlaying; - AutoSizeAxes = Axes.X; + ButtonContent.AutoSizeAxes = Axes.X; } [BackgroundDependencyLoader(true)] diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs index 5500f1c879..98a0191e0a 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs @@ -48,7 +48,7 @@ namespace osu.Game.Overlays.Toolbar public RulesetButton() { - Padding = new MarginPadding(3) + ButtonContent.Padding = new MarginPadding(3) { Bottom = 5 }; diff --git a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs index 78df060252..899f58c9c0 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs @@ -10,7 +10,7 @@ namespace osu.Game.Overlays.Toolbar { public ToolbarSettingsButton() { - Width *= 1.4f; + ButtonContent.Width *= 1.4f; Hotkey = GlobalAction.ToggleSettings; } diff --git a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs index 19b98628e6..230974cd59 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs @@ -34,7 +34,7 @@ namespace osu.Game.Overlays.Toolbar public ToolbarUserButton() { - AutoSizeAxes = Axes.X; + ButtonContent.AutoSizeAxes = Axes.X; } [BackgroundDependencyLoader] From 47b385c552462c98705e4a8a8c578cf6e8a42419 Mon Sep 17 00:00:00 2001 From: Susko3 Date: Sun, 14 Jan 2024 21:13:00 +0100 Subject: [PATCH 092/651] Move toolbar button padding to a const --- osu.Game/Overlays/Toolbar/ToolbarButton.cs | 4 +++- osu.Game/Overlays/Toolbar/ToolbarClock.cs | 2 +- osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index 36ff703c82..1da2e1b744 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -26,6 +26,8 @@ namespace osu.Game.Overlays.Toolbar { public abstract partial class ToolbarButton : OsuClickableContainer, IKeyBindingHandler { + public const float PADDING = 3; + protected GlobalAction? Hotkey { get; set; } public void SetIcon(Drawable icon) @@ -90,7 +92,7 @@ namespace osu.Game.Overlays.Toolbar { Width = Toolbar.HEIGHT, RelativeSizeAxes = Axes.Y, - Padding = new MarginPadding(3), + Padding = new MarginPadding(PADDING), Children = new Drawable[] { BackgroundContent = new Container diff --git a/osu.Game/Overlays/Toolbar/ToolbarClock.cs b/osu.Game/Overlays/Toolbar/ToolbarClock.cs index e7959986ae..e1d658b811 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarClock.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarClock.cs @@ -48,7 +48,7 @@ namespace osu.Game.Overlays.Toolbar { RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, - Padding = new MarginPadding(3), + Padding = new MarginPadding(ToolbarButton.PADDING), Children = new Drawable[] { new Container diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs index 98a0191e0a..c224f0f9c9 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs @@ -48,7 +48,7 @@ namespace osu.Game.Overlays.Toolbar public RulesetButton() { - ButtonContent.Padding = new MarginPadding(3) + ButtonContent.Padding = new MarginPadding(PADDING) { Bottom = 5 }; From 0b5cc8fb10c88fb12650762a8b4fef78f406bde8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 14:01:03 +0900 Subject: [PATCH 093/651] Fix gameplay counter textures not being cached ahead of time Part of https://github.com/ppy/osu/issues/26535. --- osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs | 6 ++++++ osu.Game/Skinning/LegacySpriteText.cs | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs b/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs index a11f2f01cd..f16669f865 100644 --- a/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs +++ b/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs @@ -137,6 +137,12 @@ namespace osu.Game.Screens.Play.HUD Spacing = new Vector2(-2f, 0f); Font = new FontUsage(font_name, 1); glyphStore = new GlyphStore(font_name, textures, getLookup); + + // cache common lookups ahead of time. + foreach (char c in new[] { '.', '%', 'x' }) + glyphStore.Get(font_name, c); + for (int i = 0; i < 10; i++) + glyphStore.Get(font_name, (char)('0' + i)); } protected override TextBuilder CreateTextBuilder(ITexturedGlyphLookupStore store) => base.CreateTextBuilder(glyphStore); diff --git a/osu.Game/Skinning/LegacySpriteText.cs b/osu.Game/Skinning/LegacySpriteText.cs index 581e7534e4..fdd8716d5a 100644 --- a/osu.Game/Skinning/LegacySpriteText.cs +++ b/osu.Game/Skinning/LegacySpriteText.cs @@ -50,6 +50,12 @@ namespace osu.Game.Skinning Spacing = new Vector2(-skin.GetFontOverlap(font), 0); glyphStore = new LegacyGlyphStore(fontPrefix, skin, MaxSizePerGlyph); + + // cache common lookups ahead of time. + foreach (char c in FixedWidthExcludeCharacters) + glyphStore.Get(fontPrefix, c); + for (int i = 0; i < 10; i++) + glyphStore.Get(fontPrefix, (char)('0' + i)); } protected override TextBuilder CreateTextBuilder(ITexturedGlyphLookupStore store) => base.CreateTextBuilder(glyphStore); From cd20561843874df1eab24e179201eb1742e77520 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 14:12:10 +0900 Subject: [PATCH 094/651] Adjust text slightly --- osu.Game/Localisation/GraphicsSettingsStrings.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/osu.Game/Localisation/GraphicsSettingsStrings.cs b/osu.Game/Localisation/GraphicsSettingsStrings.cs index fc29352ae2..1d14b0a596 100644 --- a/osu.Game/Localisation/GraphicsSettingsStrings.cs +++ b/osu.Game/Localisation/GraphicsSettingsStrings.cs @@ -152,14 +152,13 @@ namespace osu.Game.Localisation /// /// "In order to change the renderer, the game will close. Please open it again." /// - public static LocalisableString ChangeRendererConfirmation => - new TranslatableString(getKey(@"change_renderer_configuration"), @"In order to change the renderer, the game will close. Please open it again."); + public static LocalisableString ChangeRendererConfirmation => new TranslatableString(getKey(@"change_renderer_configuration"), @"In order to change the renderer, the game will close. Please open it again."); /// - /// "Minimise on focus loss" + /// "Minimise osu! when switching to another app" /// - public static LocalisableString MinimiseOnFocusLoss => new TranslatableString(getKey(@"minimise_on_focus_loss"), @"Minimise on focus loss"); + public static LocalisableString MinimiseOnFocusLoss => new TranslatableString(getKey(@"minimise_on_focus_loss"), @"Minimise osu! when switching to another app"); - private static string getKey(string key) => $"{prefix}:{key}"; + private static string getKey(string key) => $@"{prefix}:{key}"; } } From a6c309b61a1edc109dfe0b3b2ff0dca57564628d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 14:12:39 +0900 Subject: [PATCH 095/651] Add more keywords --- osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs index adb572e245..71afec88d4 100644 --- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs @@ -111,7 +111,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics { LabelText = GraphicsSettingsStrings.MinimiseOnFocusLoss, Current = config.GetBindable(FrameworkSetting.MinimiseOnFocusLossInFullscreen), - Keywords = new[] { "alt-tab" }, + Keywords = new[] { "alt-tab", "minimize", "focus", "hide" }, }, safeAreaConsiderationsCheckbox = new SettingsCheckbox { From 6940579b9edb8c275de74c0f1ba4780f45577aaa Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 14:30:27 +0900 Subject: [PATCH 096/651] Remember multiplayer room filter mode As proposed in https://github.com/ppy/osu/discussions/26218. --- osu.Game/Configuration/OsuConfigManager.cs | 4 ++++ osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs | 6 +++++- .../OnlinePlay/Multiplayer/MultiplayerLoungeSubScreen.cs | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index 23686db1f8..c05831d043 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -17,6 +17,7 @@ using osu.Game.Localisation; using osu.Game.Overlays; using osu.Game.Overlays.Mods.Input; using osu.Game.Rulesets.Scoring; +using osu.Game.Screens.OnlinePlay.Lounge.Components; using osu.Game.Screens.Select; using osu.Game.Screens.Select.Filter; using osu.Game.Skinning; @@ -191,6 +192,8 @@ namespace osu.Game.Configuration SetDefault(OsuSetting.EditorLimitedDistanceSnap, false); SetDefault(OsuSetting.EditorShowSpeedChanges, false); + SetDefault(OsuSetting.MultiplayerRoomFilter, RoomPermissionsFilter.All); + SetDefault(OsuSetting.LastProcessedMetadataId, -1); SetDefault(OsuSetting.ComboColourNormalisationAmount, 0.2f, 0f, 1f, 0.01f); @@ -423,5 +426,6 @@ namespace osu.Game.Configuration TouchDisableGameplayTaps, ModSelectTextSearchStartsActive, UserOnlineStatus, + MultiplayerRoomFilter } } diff --git a/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs b/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs index fc4a5357c6..6f5ff9c99c 100644 --- a/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs @@ -4,8 +4,8 @@ #nullable disable using System; -using System.Diagnostics; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using JetBrains.Annotations; using osu.Framework.Allocation; @@ -19,6 +19,7 @@ using osu.Framework.Input.Events; using osu.Framework.Logging; using osu.Framework.Screens; using osu.Framework.Threading; +using osu.Game.Configuration; using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; using osu.Game.Input; @@ -77,6 +78,9 @@ namespace osu.Game.Screens.OnlinePlay.Lounge [CanBeNull] private LeasedBindable selectionLease; + [Resolved] + protected OsuConfigManager Config { get; private set; } + private readonly Bindable filter = new Bindable(new FilterCriteria()); private readonly IBindable operationInProgress = new Bindable(); private readonly IBindable isIdle = new BindableBool(); diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerLoungeSubScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerLoungeSubScreen.cs index 4478179726..a3a6fd2d8e 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerLoungeSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerLoungeSubScreen.cs @@ -12,6 +12,7 @@ using osu.Framework.Logging; using osu.Framework.Screens; using osu.Framework.Graphics; using osu.Framework.Graphics.UserInterface; +using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; using osu.Game.Online.Multiplayer; @@ -51,6 +52,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer roomAccessTypeDropdown = new SlimEnumDropdown { RelativeSizeAxes = Axes.None, + Current = Config.GetBindable(OsuSetting.MultiplayerRoomFilter), Width = 160, }; From d8962ddff8e75a23114266db68de5f6e54eac264 Mon Sep 17 00:00:00 2001 From: Felipe Marins Date: Mon, 15 Jan 2024 03:22:52 -0300 Subject: [PATCH 097/651] Select all when pressing enter instead of every mod selection change --- osu.Game/Overlays/Mods/ModSelectOverlay.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index 43f44d682d..8cb990757f 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -565,9 +565,6 @@ namespace osu.Game.Overlays.Mods .ToArray(); SelectedMods.Value = ComputeNewModsFromSelection(SelectedMods.Value, candidateSelection); - - if (SearchTextBox.HasFocus) - SearchTextBox.SelectAll(); } #region Transition handling @@ -724,6 +721,8 @@ namespace osu.Game.Overlays.Mods if (firstMod is not null) firstMod.Active.Value = !firstMod.Active.Value; + SearchTextBox.SelectAll(); + return true; } } From 2d5a39b234b85f9fe235bb746f50185c0e336b55 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 16:01:34 +0900 Subject: [PATCH 098/651] Add failing test coverage of duplicates in judgement counter display --- .../Visual/Gameplay/TestSceneJudgementCounter.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs index dae6dc7b4b..787c48fb26 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs @@ -147,6 +147,16 @@ namespace osu.Game.Tests.Visual.Gameplay AddAssert("Assert max judgement hidden", () => counterDisplay.CounterFlow.ChildrenOfType().First().Alpha == 0); } + [Test] + public void TestNoDuplicates() + { + AddStep("create counter", () => Child = counterDisplay = new TestJudgementCounterDisplay()); + AddStep("Show all judgements", () => counterDisplay.Mode.Value = JudgementCounterDisplay.DisplayMode.All); + AddAssert("Check no duplicates", + () => counterDisplay.CounterFlow.ChildrenOfType().Count(), + () => Is.EqualTo(counterDisplay.CounterFlow.ChildrenOfType().Select(c => c.ResultName.Text).Distinct().Count())); + } + [Test] public void TestCycleDisplayModes() { From e6453853c256245a2d600904b9df29a963268635 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 15:54:00 +0900 Subject: [PATCH 099/651] De-dupe displayed hits in judgement counter --- .../Gameplay/TestSceneJudgementCounter.cs | 2 +- .../JudgementCountController.cs | 36 ++++++++++++++----- .../HUD/JudgementCounter/JudgementCounter.cs | 7 ++-- .../JudgementCounterDisplay.cs | 9 +++-- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs index 787c48fb26..894f08e5b2 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneJudgementCounter.cs @@ -173,7 +173,7 @@ namespace osu.Game.Tests.Visual.Gameplay private int hiddenCount() { - var num = counterDisplay.CounterFlow.Children.First(child => child.Result.Type == HitResult.LargeTickHit); + var num = counterDisplay.CounterFlow.Children.First(child => child.Result.Types.Contains(HitResult.LargeTickHit)); return num.Result.ResultCount.Value; } diff --git a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCountController.cs b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCountController.cs index 43c2ae442a..8134c97bac 100644 --- a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCountController.cs +++ b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCountController.cs @@ -6,6 +6,7 @@ using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; +using osu.Framework.Localisation; using osu.Game.Rulesets; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Scoring; @@ -21,18 +22,30 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter [Resolved] private ScoreProcessor scoreProcessor { get; set; } = null!; - public List Results = new List(); + private readonly Dictionary results = new Dictionary(); + + public IEnumerable Counters => counters; + + private readonly List counters = new List(); [BackgroundDependencyLoader] private void load(IBindable ruleset) { - foreach (var result in ruleset.Value.CreateInstance().GetHitResults()) + // Due to weirdness in judgements, some results have the same name and should be aggregated for display purposes. + // There's only one case of this right now ("slider end"). + foreach (var group in ruleset.Value.CreateInstance().GetHitResults().GroupBy(r => r.displayName)) { - Results.Add(new JudgementCount + var judgementCount = new JudgementCount { - Type = result.result, + DisplayName = group.Key, + Types = group.Select(r => r.result).ToArray(), ResultCount = new BindableInt() - }); + }; + + counters.Add(judgementCount); + + foreach (var r in group) + results[r.result] = judgementCount; } } @@ -46,13 +59,20 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter private void updateCount(JudgementResult judgement, bool revert) { - foreach (JudgementCount result in Results.Where(result => result.Type == judgement.Type)) - result.ResultCount.Value = revert ? result.ResultCount.Value - 1 : result.ResultCount.Value + 1; + if (!results.TryGetValue(judgement.Type, out var count)) + return; + + if (revert) + count.ResultCount.Value--; + else + count.ResultCount.Value++; } public struct JudgementCount { - public HitResult Type { get; set; } + public LocalisableString DisplayName { get; set; } + + public HitResult[] Types { get; set; } public BindableInt ResultCount { get; set; } } diff --git a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounter.cs b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounter.cs index 6c417faac2..45ed8d749b 100644 --- a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounter.cs +++ b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounter.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; @@ -44,14 +45,14 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter { Alpha = 0, Font = OsuFont.Numeric.With(size: 8), - Text = ruleset.Value.CreateInstance().GetDisplayNameForHitResult(Result.Type) + Text = Result.DisplayName, } } }; - var result = Result.Type; + var result = Result.Types.First(); - Colour = result.IsBasic() ? colours.ForHitResult(Result.Type) : !result.IsBonus() ? colours.PurpleLight : colours.PurpleLighter; + Colour = result.IsBasic() ? colours.ForHitResult(result) : !result.IsBonus() ? colours.PurpleLight : colours.PurpleLighter; } protected override void LoadComplete() diff --git a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs index 128897ddde..326be55222 100644 --- a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs +++ b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; @@ -49,7 +50,7 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter AutoSizeAxes = Axes.Both }; - foreach (var result in judgementCountController.Results) + foreach (var result in judgementCountController.Counters) CounterFlow.Add(createCounter(result)); } @@ -88,7 +89,9 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter if (index == 0 && !ShowMaxJudgement.Value) return false; - if (counter.Result.Type.IsBasic()) + var hitResult = counter.Result.Types.First(); + + if (hitResult.IsBasic()) return true; switch (Mode.Value) @@ -97,7 +100,7 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter return false; case DisplayMode.Normal: - return !counter.Result.Type.IsBonus(); + return !hitResult.IsBonus(); case DisplayMode.All: return true; From 2b45a9b7c629fd9f8df01fc35db37da7f8b511c2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 17:10:16 +0900 Subject: [PATCH 100/651] Add failing test coverage showing collection dropdown crash --- .../Visual/SongSelect/TestSceneFilterControl.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs index 94c6130f15..58183acb93 100644 --- a/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs +++ b/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using NUnit.Framework; using osu.Framework.Allocation; @@ -76,6 +77,20 @@ namespace osu.Game.Tests.Visual.SongSelect assertCollectionDropdownContains("2"); } + [Test] + public void TestCollectionsCleared() + { + AddStep("add collection", () => writeAndRefresh(r => r.Add(new BeatmapCollection(name: "1")))); + AddStep("add collection", () => writeAndRefresh(r => r.Add(new BeatmapCollection(name: "2")))); + AddStep("add collection", () => writeAndRefresh(r => r.Add(new BeatmapCollection(name: "3")))); + + AddAssert("check count 5", () => control.ChildrenOfType().Single().ChildrenOfType().Count(), () => Is.EqualTo(5)); + + AddStep("delete all collections", () => writeAndRefresh(r => r.RemoveAll())); + + AddAssert("check count 2", () => control.ChildrenOfType().Single().ChildrenOfType().Count(), () => Is.EqualTo(2)); + } + [Test] public void TestCollectionRemovedFromDropdown() { From 0a522d260becbbcc2e7d2835b763208ea76a6d4a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 17:10:30 +0900 Subject: [PATCH 101/651] Fix collection dropdown crashing when all collections are deleted at once --- osu.Game/Collections/CollectionDropdown.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Collections/CollectionDropdown.cs b/osu.Game/Collections/CollectionDropdown.cs index 8d83ed3ec9..249a0c35e7 100644 --- a/osu.Game/Collections/CollectionDropdown.cs +++ b/osu.Game/Collections/CollectionDropdown.cs @@ -74,7 +74,7 @@ namespace osu.Game.Collections } else { - foreach (int i in changes.DeletedIndices) + foreach (int i in changes.DeletedIndices.OrderByDescending(i => i)) filters.RemoveAt(i + 1); foreach (int i in changes.InsertedIndices) From 52f8348ee31d1cecdc5a514565811588aaf31073 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 17:48:37 +0900 Subject: [PATCH 102/651] Fade hold-for-menu button out completely on non-touch devices --- .../Screens/Play/HUD/HoldForMenuButton.cs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs index 0921a9f18a..1cf3d25dad 100644 --- a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs +++ b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs @@ -16,6 +16,7 @@ using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; using osu.Framework.Threading; using osu.Framework.Utils; +using osu.Game.Configuration; using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Graphics.Sprites; @@ -44,6 +45,8 @@ namespace osu.Game.Screens.Play.HUD Direction = FillDirection.Horizontal; Spacing = new Vector2(20, 0); Margin = new MarginPadding(10); + + AlwaysPresent = true; } [BackgroundDependencyLoader(true)] @@ -66,9 +69,15 @@ namespace osu.Game.Screens.Play.HUD Action = () => Action(), } }; + AutoSizeAxes = Axes.Both; } + [Resolved] + private SessionStatics sessionStatics { get; set; } + + private Bindable touchActive; + protected override void LoadComplete() { button.HoldActivationDelay.BindValueChanged(v => @@ -78,7 +87,20 @@ namespace osu.Game.Screens.Play.HUD : "press for menu"; }, true); - text.FadeInFromZero(500, Easing.OutQuint).Delay(1500).FadeOut(500, Easing.OutQuint); + touchActive = sessionStatics.GetBindable(Static.TouchInputActive); + + if (touchActive.Value) + { + Alpha = 1f; + text.FadeInFromZero(500, Easing.OutQuint) + .Delay(1500) + .FadeOut(500, Easing.OutQuint); + } + else + { + Alpha = 0; + text.Alpha = 0f; + } base.LoadComplete(); } @@ -99,9 +121,11 @@ namespace osu.Game.Screens.Play.HUD Alpha = 1; else { + float minAlpha = touchActive.Value ? .08f : 0; + Alpha = Interpolation.ValueAt( Math.Clamp(Clock.ElapsedFrameTime, 0, 200), - Alpha, Math.Clamp(1 - positionalAdjust, 0.04f, 1), 0, 200, Easing.OutQuint); + Alpha, Math.Clamp(1 - positionalAdjust, minAlpha, 1), 0, 200, Easing.OutQuint); } } From 2a2a4c416eaf11ac2212ebbc88c19567e6ec22b4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 18:17:49 +0900 Subject: [PATCH 103/651] Only display offset toast when in local gameplay --- osu.Game/Screens/Play/Player.cs | 6 ------ osu.Game/Screens/Play/SubmittingPlayer.cs | 10 ++++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index b87306b9a2..96530634fd 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -461,12 +461,6 @@ namespace osu.Game.Screens.Play OnRetry = () => Restart(), OnQuit = () => PerformExit(true), }, - new GameplayOffsetControl - { - Margin = new MarginPadding(20), - Anchor = Anchor.CentreRight, - Origin = Anchor.CentreRight, - } }, }; diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs index 04abb6162f..171ceea84f 100644 --- a/osu.Game/Screens/Play/SubmittingPlayer.cs +++ b/osu.Game/Screens/Play/SubmittingPlayer.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading.Tasks; using JetBrains.Annotations; using osu.Framework.Allocation; +using osu.Framework.Graphics; using osu.Framework.Logging; using osu.Framework.Screens; using osu.Game.Beatmaps; @@ -59,6 +60,15 @@ namespace osu.Game.Screens.Play } AddInternal(new PlayerTouchInputDetector()); + + // We probably want to move this display to something more global. + // Probably using the OSD somehow. + AddInternal(new GameplayOffsetControl + { + Margin = new MarginPadding(20), + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + }); } protected override GameplayClockContainer CreateGameplayClockContainer(WorkingBeatmap beatmap, double gameplayStart) => new MasterGameplayClockContainer(beatmap, gameplayStart) From 0aa8a20d57a9d50bc39d7ecf2d847314a51d317e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 18:34:32 +0900 Subject: [PATCH 104/651] Fix regression in interaction when panels are not selectable --- .../Screens/OnlinePlay/DrawableRoomPlaylistItem.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs index 823f6ea308..800c73cceb 100644 --- a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs +++ b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs @@ -365,7 +365,7 @@ namespace osu.Game.Screens.OnlinePlay AutoSizeAxes = Axes.Both, Margin = new MarginPadding { Left = 8, Right = 8 }, }, - mainFillFlow = new MainFlow(() => SelectedItem.Value == Model) + mainFillFlow = new MainFlow(() => SelectedItem.Value == Model || !AllowSelection) { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, @@ -671,13 +671,13 @@ namespace osu.Game.Screens.OnlinePlay public partial class MainFlow : FillFlowContainer { - private readonly Func isSelected; + private readonly Func allowInteraction; - public override bool PropagatePositionalInputSubTree => isSelected(); + public override bool PropagatePositionalInputSubTree => allowInteraction(); - public MainFlow(Func isSelected) + public MainFlow(Func allowInteraction) { - this.isSelected = isSelected; + this.allowInteraction = allowInteraction; } } } From 8e32780888cab9e3e035a8b9a3233c10e066f47e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 19:21:19 +0900 Subject: [PATCH 105/651] Fix background dim occasionally getting in a bad state when exiting gameplay --- .../Screens/Backgrounds/BackgroundScreenBeatmap.cs | 2 +- osu.Game/Screens/Play/Player.cs | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs index 85ea881006..185e2cab99 100644 --- a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs +++ b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs @@ -51,7 +51,7 @@ namespace osu.Game.Screens.Backgrounds /// public readonly Bindable DimWhenUserSettingsIgnored = new Bindable(); - internal readonly IBindable IsBreakTime = new Bindable(); + internal readonly Bindable IsBreakTime = new Bindable(); private readonly DimmableBackground dimmable; diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index b87306b9a2..f0f0a58368 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -1078,7 +1078,7 @@ namespace osu.Game.Screens.Play b.FadeColour(Color4.White, 250); // bind component bindables. - b.IsBreakTime.BindTo(breakTracker.IsBreakTime); + ((IBindable)b.IsBreakTime).BindTo(breakTracker.IsBreakTime); b.StoryboardReplacesBackground.BindTo(storyboardReplacesBackground); @@ -1238,7 +1238,13 @@ namespace osu.Game.Screens.Play if (this.IsCurrentScreen()) { - ApplyToBackground(b => b.IgnoreUserSettings.Value = true); + ApplyToBackground(b => + { + b.IgnoreUserSettings.Value = true; + + b.IsBreakTime.UnbindFrom(breakTracker.IsBreakTime); + b.IsBreakTime.Value = true; + }); storyboardReplacesBackground.Value = false; } } From 494c1be6553ed9b891b8b05dc37bbe6d50d3f3a7 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 15 Jan 2024 13:30:34 +0300 Subject: [PATCH 106/651] Fix blatant error in `TestSceneModAccuracyChallenge` --- osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs b/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs index 6bdb9132e1..c5e56c6453 100644 --- a/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs +++ b/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs @@ -8,6 +8,7 @@ using osu.Game.Rulesets; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Osu; +using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; using osuTK; @@ -29,7 +30,7 @@ namespace osu.Game.Tests.Visual.Mods public void TestMaximumAchievableAccuracy() => CreateModTest(new ModTestData { - Mod = new ModAccuracyChallenge + Mod = new OsuModAccuracyChallenge { MinimumAccuracy = { Value = 0.6 } }, @@ -49,7 +50,7 @@ namespace osu.Game.Tests.Visual.Mods public void TestStandardAccuracy() => CreateModTest(new ModTestData { - Mod = new ModAccuracyChallenge + Mod = new OsuModAccuracyChallenge { MinimumAccuracy = { Value = 0.6 }, AccuracyJudgeMode = { Value = ModAccuracyChallenge.AccuracyMode.Standard } From e3989c854d39ec82d1ea27ada8f70a9dea159633 Mon Sep 17 00:00:00 2001 From: StanR Date: Mon, 15 Jan 2024 16:57:22 +0600 Subject: [PATCH 107/651] Change `LoginPanel` to use `LocalUser.Status` for the dropdown --- osu.Game/Overlays/Login/LoginPanel.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs index 513088ba0c..7db3644de6 100644 --- a/osu.Game/Overlays/Login/LoginPanel.cs +++ b/osu.Game/Overlays/Login/LoginPanel.cs @@ -139,7 +139,7 @@ namespace osu.Game.Overlays.Login }, }; - panel.Status.BindValueChanged(_ => updateDropdownCurrent(), true); + api.LocalUser.Value.Status.BindValueChanged(e => updateDropdownCurrent(e.NewValue), true); dropdown.Current.BindValueChanged(action => { @@ -172,9 +172,9 @@ namespace osu.Game.Overlays.Login ScheduleAfterChildren(() => GetContainingInputManager()?.ChangeFocus(form)); }); - private void updateDropdownCurrent() + private void updateDropdownCurrent(UserStatus? status) { - switch (panel.Status.Value) + switch (status) { case UserStatus.Online: dropdown.Current.Value = UserAction.Online; From 13517869f6bb373fbe6b44df5728d31bc696ef3d Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 15 Jan 2024 14:03:23 +0300 Subject: [PATCH 108/651] Apply scale transitions in resume overlay cursor to local container --- osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs | 24 +++++++++++--------- osu.Game.Rulesets.Osu/UI/OsuResumeOverlay.cs | 20 ++++++++++++---- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs b/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs index 18351c20ce..710ca9ace7 100644 --- a/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs +++ b/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs @@ -57,17 +57,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor [BackgroundDependencyLoader] private void load() { - InternalChild = cursorScaleContainer = new Container - { - RelativeSizeAxes = Axes.Both, - Origin = Anchor.Centre, - Anchor = Anchor.Centre, - Child = cursorSprite = new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.Cursor), _ => new DefaultCursor(), confineMode: ConfineMode.NoScaling) - { - Origin = Anchor.Centre, - Anchor = Anchor.Centre, - } - }; + InternalChild = CreateCursorContent(); userCursorScale = config.GetBindable(OsuSetting.GameplayCursorSize); userCursorScale.ValueChanged += _ => cursorScale.Value = CalculateCursorScale(); @@ -84,6 +74,18 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor cursorScale.Value = CalculateCursorScale(); } + protected virtual Drawable CreateCursorContent() => cursorScaleContainer = new Container + { + RelativeSizeAxes = Axes.Both, + Origin = Anchor.Centre, + Anchor = Anchor.Centre, + Child = cursorSprite = new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.Cursor), _ => new DefaultCursor(), confineMode: ConfineMode.NoScaling) + { + Origin = Anchor.Centre, + Anchor = Anchor.Centre, + }, + }; + protected virtual float CalculateCursorScale() { float scale = userCursorScale.Value; diff --git a/osu.Game.Rulesets.Osu/UI/OsuResumeOverlay.cs b/osu.Game.Rulesets.Osu/UI/OsuResumeOverlay.cs index f5e83f46f2..8a84fe14e5 100644 --- a/osu.Game.Rulesets.Osu/UI/OsuResumeOverlay.cs +++ b/osu.Game.Rulesets.Osu/UI/OsuResumeOverlay.cs @@ -65,17 +65,24 @@ namespace osu.Game.Rulesets.Osu.UI public override bool HandlePositionalInput => true; public Action ResumeRequested; + private Container scaleTransitionContainer; public OsuClickToResumeCursor() { RelativePositionAxes = Axes.Both; } - protected override float CalculateCursorScale() + protected override Container CreateCursorContent() => scaleTransitionContainer = new Container { + RelativeSizeAxes = Axes.Both, + Origin = Anchor.Centre, + Anchor = Anchor.Centre, + Child = base.CreateCursorContent(), + }; + + protected override float CalculateCursorScale() => // Force minimum cursor size so it's easily clickable - return Math.Max(1f, base.CalculateCursorScale()); - } + Math.Max(1f, base.CalculateCursorScale()); protected override bool OnHover(HoverEvent e) { @@ -98,7 +105,7 @@ namespace osu.Game.Rulesets.Osu.UI if (!IsHovered) return false; - this.ScaleTo(2, TRANSITION_TIME, Easing.OutQuint); + scaleTransitionContainer.ScaleTo(2, TRANSITION_TIME, Easing.OutQuint); ResumeRequested?.Invoke(); return true; @@ -114,7 +121,10 @@ namespace osu.Game.Rulesets.Osu.UI public void Appear() => Schedule(() => { updateColour(); - this.ScaleTo(4).Then().ScaleTo(1, 1000, Easing.OutQuint); + + // importantly, we perform the scale transition on an underlying container rather than the whole cursor + // to prevent attempts of abuse by the scale change in the cursor's hitbox (see: https://github.com/ppy/osu/issues/26477). + scaleTransitionContainer.ScaleTo(4).Then().ScaleTo(1, 1000, Easing.OutQuint); }); private void updateColour() From 0a02050a8523c6c873b4fbf582f072d649efaec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 12:12:27 +0100 Subject: [PATCH 109/651] Fix test crashing at the end in visual test browser --- .../Visual/Multiplayer/TestSceneMultiplayer.cs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs index 201fac37c8..747805edc8 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs @@ -1033,12 +1033,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } }); - AddStep("join other user and make host", () => - { - multiplayerClient.AddUser(new APIUser { Id = 1234 }); - multiplayerClient.TransferHost(1234); - }); - AddStep("select hidden", () => multiplayerClient.ChangeUserMods(new[] { new APIMod { Acronym = "HD" } })); AddStep("make user ready", () => multiplayerClient.ChangeState(MultiplayerUserState.Ready)); AddStep("press edit on second item", () => this.ChildrenOfType().Single(i => i.Item.RulesetID == 1) @@ -1047,14 +1041,9 @@ namespace osu.Game.Tests.Visual.Multiplayer AddUntilStep("wait for song select", () => InputManager.ChildrenOfType().FirstOrDefault()?.BeatmapSetsLoaded == true); AddAssert("ruleset is taiko", () => Ruleset.Value.OnlineID == 1); - AddStep("start match by other user", () => - { - multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Ready); - multiplayerClient.StartMatch().WaitSafely(); - }); + AddStep("start match", () => multiplayerClient.StartMatch().WaitSafely()); AddUntilStep("wait for loading", () => multiplayerClient.ClientRoom?.State == MultiplayerRoomState.WaitingForLoad); - AddStep("set player loaded", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Loaded)); AddUntilStep("wait for gameplay to start", () => multiplayerClient.ClientRoom?.State == MultiplayerRoomState.Playing); AddAssert("hidden is selected", () => SelectedMods.Value, () => Has.One.TypeOf(typeof(OsuModHidden))); } From 96c472b870790825e6acbc692a425612f97efb64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 12:33:25 +0100 Subject: [PATCH 110/651] Remove unused using directive --- osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs index 58183acb93..a639d50eee 100644 --- a/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs +++ b/osu.Game.Tests/Visual/SongSelect/TestSceneFilterControl.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using NUnit.Framework; using osu.Framework.Allocation; From 86382f4408baa4bc292b2c510a9db49a8af0f6c9 Mon Sep 17 00:00:00 2001 From: OliBomby Date: Mon, 15 Jan 2024 12:49:40 +0100 Subject: [PATCH 111/651] Clarify comment --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 2f012e33da..f5840248fb 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -250,7 +250,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdateAfterChildren(); - // It's important that this is done in UpdateAfterChildren so that the SliderBody has a chance to update its Size and PathOffset on Update. + // During slider path editing, the PlaySliderBody is scheduled to refresh once in the Update phase. + // It is crucial to perform the code below in UpdateAfterChildren. This ensures that the SliderBody has the opportunity + // to update its Size and PathOffset beforehand, ensuring correct placement. + double completionProgress = Math.Clamp((Time.Current - HitObject.StartTime) / HitObject.Duration, 0, 1); Ball.UpdateProgress(completionProgress); From 6b844ed8b64db49554031bd397eaa310d4b54601 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 20:29:08 +0900 Subject: [PATCH 112/651] Split out judgement pooling concepts from `OsuPlayfield` for reuse --- osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs | 64 +++++--------------- osu.Game/Rulesets/UI/JudgementPooler.cs | 77 ++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 50 deletions(-) create mode 100644 osu.Game/Rulesets/UI/JudgementPooler.cs diff --git a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs index c94057cf6d..411a02c5af 100644 --- a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs +++ b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs @@ -4,13 +4,11 @@ #nullable disable using System; -using System.Collections.Generic; using System.Diagnostics; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Pooling; using osu.Game.Beatmaps; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects; @@ -35,6 +33,8 @@ namespace osu.Game.Rulesets.Osu.UI private readonly ProxyContainer spinnerProxies; private readonly JudgementContainer judgementLayer; + private readonly JudgementPooler judgementPooler; + public SmokeContainer Smoke { get; } public FollowPointRenderer FollowPoints { get; } @@ -42,8 +42,6 @@ namespace osu.Game.Rulesets.Osu.UI protected override GameplayCursorContainer CreateCursor() => new OsuCursorContainer(); - private readonly IDictionary> poolDictionary = new Dictionary>(); - private readonly Container judgementAboveHitObjectLayer; public OsuPlayfield() @@ -65,24 +63,15 @@ namespace osu.Game.Rulesets.Osu.UI HitPolicy = new StartTimeOrderedHitPolicy(); - foreach (var result in Enum.GetValues().Where(r => - { - switch (r) - { - case HitResult.Great: - case HitResult.Ok: - case HitResult.Meh: - case HitResult.Miss: - case HitResult.LargeTickMiss: - case HitResult.IgnoreMiss: - return true; - } - - return false; - })) - poolDictionary.Add(result, new DrawableJudgementPool(result, onJudgementLoaded)); - - AddRangeInternal(poolDictionary.Values); + AddInternal(judgementPooler = new JudgementPooler(new[] + { + HitResult.Great, + HitResult.Ok, + HitResult.Meh, + HitResult.Miss, + HitResult.LargeTickMiss, + HitResult.IgnoreMiss, + }, onJudgementLoaded)); NewResult += onNewResult; } @@ -182,10 +171,10 @@ namespace osu.Game.Rulesets.Osu.UI if (!judgedObject.DisplayResult || !DisplayJudgements.Value) return; - if (!poolDictionary.TryGetValue(result.Type, out var pool)) - return; + var explosion = judgementPooler.Get(result.Type, doj => doj.Apply(result, judgedObject)); - DrawableOsuJudgement explosion = pool.Get(doj => doj.Apply(result, judgedObject)); + if (explosion == null) + return; judgementLayer.Add(explosion); @@ -201,31 +190,6 @@ namespace osu.Game.Rulesets.Osu.UI public void Add(Drawable proxy) => AddInternal(proxy); } - private partial class DrawableJudgementPool : DrawablePool - { - private readonly HitResult result; - private readonly Action onLoaded; - - public DrawableJudgementPool(HitResult result, Action onLoaded) - : base(20) - { - this.result = result; - this.onLoaded = onLoaded; - } - - protected override DrawableOsuJudgement CreateNewDrawable() - { - var judgement = base.CreateNewDrawable(); - - // just a placeholder to initialise the correct drawable hierarchy for this pool. - judgement.Apply(new JudgementResult(new HitObject(), new Judgement()) { Type = result }, null); - - onLoaded?.Invoke(judgement); - - return judgement; - } - } - private class OsuHitObjectLifetimeEntry : HitObjectLifetimeEntry { public OsuHitObjectLifetimeEntry(HitObject hitObject) diff --git a/osu.Game/Rulesets/UI/JudgementPooler.cs b/osu.Game/Rulesets/UI/JudgementPooler.cs new file mode 100644 index 0000000000..efec760f15 --- /dev/null +++ b/osu.Game/Rulesets/UI/JudgementPooler.cs @@ -0,0 +1,77 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; +using osu.Framework.Allocation; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Pooling; +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Scoring; + +namespace osu.Game.Rulesets.UI +{ + /// + /// Handles the task of preparing poolable drawable judgements for gameplay usage. + /// + /// The drawable judgement type. + public partial class JudgementPooler : CompositeComponent + where T : DrawableJudgement, new() + { + private readonly IDictionary> poolDictionary = new Dictionary>(); + + private readonly IEnumerable usableHitResults; + private readonly Action? onJudgementInitialLoad; + + public JudgementPooler(IEnumerable usableHitResults, Action? onJudgementInitialLoad = null) + { + this.usableHitResults = usableHitResults; + this.onJudgementInitialLoad = onJudgementInitialLoad; + } + + public T? Get(HitResult result, Action? setupAction) + { + if (!poolDictionary.TryGetValue(result, out var pool)) + return null; + + return pool.Get(setupAction); + } + + [BackgroundDependencyLoader] + private void load() + { + foreach (HitResult result in usableHitResults) + { + var pool = new DrawableJudgementPool(result, onJudgementInitialLoad); + poolDictionary.Add(result, pool); + AddInternal(pool); + } + } + + private partial class DrawableJudgementPool : DrawablePool + { + private readonly HitResult result; + private readonly Action? onLoaded; + + public DrawableJudgementPool(HitResult result, Action? onLoaded) + : base(20) + { + this.result = result; + this.onLoaded = onLoaded; + } + + protected override T CreateNewDrawable() + { + var judgement = base.CreateNewDrawable(); + + // just a placeholder to initialise the correct drawable hierarchy for this pool. + judgement.Apply(new JudgementResult(new HitObject(), new Judgement()) { Type = result }, null); + + onLoaded?.Invoke(judgement); + + return judgement; + } + } + } +} From e9812fac7ae09d4f33302bce80e20a353de9f8e2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 20:37:33 +0900 Subject: [PATCH 113/651] Fix osu!mania judgments not being pooled correctly --- osu.Game.Rulesets.Mania/UI/Stage.cs | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/osu.Game.Rulesets.Mania/UI/Stage.cs b/osu.Game.Rulesets.Mania/UI/Stage.cs index fa9af6d157..36286940a8 100644 --- a/osu.Game.Rulesets.Mania/UI/Stage.cs +++ b/osu.Game.Rulesets.Mania/UI/Stage.cs @@ -1,22 +1,23 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - +using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; +using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Pooling; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mania.Objects.Drawables; +using osu.Game.Rulesets.Mania.Scoring; using osu.Game.Rulesets.Mania.Skinning; using osu.Game.Rulesets.Mania.UI.Components; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; using osu.Game.Rulesets.UI.Scrolling; using osu.Game.Skinning; @@ -40,7 +41,7 @@ namespace osu.Game.Rulesets.Mania.UI private readonly ColumnFlow columnFlow; private readonly JudgementContainer judgements; - private readonly DrawablePool judgementPool; + private readonly JudgementPooler judgementPooler; private readonly Drawable barLineContainer; @@ -48,6 +49,8 @@ namespace osu.Game.Rulesets.Mania.UI private readonly int firstColumnIndex; + private ISkinSource currentSkin = null!; + public Stage(int firstColumnIndex, StageDefinition definition, ref ManiaAction normalColumnStartAction, ref ManiaAction specialColumnStartAction) { this.firstColumnIndex = firstColumnIndex; @@ -65,7 +68,6 @@ namespace osu.Game.Rulesets.Mania.UI InternalChildren = new Drawable[] { - judgementPool = new DrawablePool(2), new Container { Anchor = Anchor.TopCentre, @@ -104,7 +106,7 @@ namespace osu.Game.Rulesets.Mania.UI { RelativeSizeAxes = Axes.Y, }, - new SkinnableDrawable(new ManiaSkinComponentLookup(ManiaSkinComponents.StageForeground), _ => null) + new SkinnableDrawable(new ManiaSkinComponentLookup(ManiaSkinComponents.StageForeground)) { RelativeSizeAxes = Axes.Both }, @@ -137,11 +139,13 @@ namespace osu.Game.Rulesets.Mania.UI AddNested(column); } + var hitWindows = new ManiaHitWindows(); + + AddInternal(judgementPooler = new JudgementPooler(Enum.GetValues().Where(r => hitWindows.IsHitResultAllowed(r)))); + RegisterPool(50, 200); } - private ISkinSource currentSkin; - [BackgroundDependencyLoader] private void load(ISkinSource skin) { @@ -170,7 +174,7 @@ namespace osu.Game.Rulesets.Mania.UI base.Dispose(isDisposing); - if (currentSkin != null) + if (currentSkin.IsNotNull()) currentSkin.SourceChanged -= onSkinChanged; } @@ -196,13 +200,13 @@ namespace osu.Game.Rulesets.Mania.UI return; judgements.Clear(false); - judgements.Add(judgementPool.Get(j => + judgements.Add(judgementPooler.Get(result.Type, j => { j.Apply(result, judgedObject); j.Anchor = Anchor.Centre; j.Origin = Anchor.Centre; - })); + })!); } protected override void Update() From 0fbca59523cea2bd7036581c5445c7173ff8123f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jan 2024 20:49:00 +0900 Subject: [PATCH 114/651] Fix osu!taiko judgments not being pooled correctly They weren't being initialised correctly on initial pool. --- osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs | 49 ++++++++++---------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs index 31f8171290..7e3ed7a4d4 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +8,6 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Pooling; using osu.Framework.Graphics.Primitives; using osu.Game.Graphics; using osu.Game.Rulesets.Objects.Drawables; @@ -42,29 +39,29 @@ namespace osu.Game.Rulesets.Taiko.UI public Container UnderlayElements { get; private set; } = null!; - private Container hitExplosionContainer; - private Container kiaiExplosionContainer; - private JudgementContainer judgementContainer; - private ScrollingHitObjectContainer drumRollHitContainer; - internal Drawable HitTarget; - private SkinnableDrawable mascot; + private Container hitExplosionContainer = null!; + private Container kiaiExplosionContainer = null!; + private JudgementContainer judgementContainer = null!; + private ScrollingHitObjectContainer drumRollHitContainer = null!; + internal Drawable HitTarget = null!; + private SkinnableDrawable mascot = null!; - private readonly IDictionary> judgementPools = new Dictionary>(); + private JudgementPooler judgementPooler = null!; private readonly IDictionary explosionPools = new Dictionary(); - private ProxyContainer topLevelHitContainer; - private InputDrum inputDrum; - private Container rightArea; + private ProxyContainer topLevelHitContainer = null!; + private InputDrum inputDrum = null!; + private Container rightArea = null!; /// /// is purposefully not called on this to prevent i.e. being able to interact /// with bar lines in the editor. /// - private BarLinePlayfield barLinePlayfield; + private BarLinePlayfield barLinePlayfield = null!; - private Container barLineContent; - private Container hitObjectContent; - private Container overlayContent; + private Container barLineContent = null!; + private Container hitObjectContent = null!; + private Container overlayContent = null!; [BackgroundDependencyLoader] private void load(OsuColour colours) @@ -202,13 +199,12 @@ namespace osu.Game.Rulesets.Taiko.UI var hitWindows = new TaikoHitWindows(); - foreach (var result in Enum.GetValues().Where(r => hitWindows.IsHitResultAllowed(r))) - { - judgementPools.Add(result, new DrawablePool(15)); - explosionPools.Add(result, new HitExplosionPool(result)); - } + HitResult[] usableHitResults = Enum.GetValues().Where(r => hitWindows.IsHitResultAllowed(r)).ToArray(); - AddRangeInternal(judgementPools.Values); + AddInternal(judgementPooler = new JudgementPooler(usableHitResults)); + + foreach (var result in usableHitResults) + explosionPools.Add(result, new HitExplosionPool(result)); AddRangeInternal(explosionPools.Values); } @@ -339,7 +335,12 @@ namespace osu.Game.Rulesets.Taiko.UI if (!result.Type.IsScorable()) break; - judgementContainer.Add(judgementPools[result.Type].Get(j => j.Apply(result, judgedObject))); + var judgement = judgementPooler.Get(result.Type, j => j.Apply(result, judgedObject)); + + if (judgement == null) + return; + + judgementContainer.Add(judgement); var type = (judgedObject.HitObject as Hit)?.Type ?? HitType.Centre; addExplosion(judgedObject, result.Type, type); From 96ffe8e737e327517e4d585d1a5dd8dff754032b Mon Sep 17 00:00:00 2001 From: OliBomby Date: Mon, 15 Jan 2024 12:51:08 +0100 Subject: [PATCH 115/651] change wording --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index f5840248fb..ed4c02a4a9 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -250,7 +250,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdateAfterChildren(); - // During slider path editing, the PlaySliderBody is scheduled to refresh once in the Update phase. + // During slider path editing, the PlaySliderBody is scheduled to refresh once on Update. // It is crucial to perform the code below in UpdateAfterChildren. This ensures that the SliderBody has the opportunity // to update its Size and PathOffset beforehand, ensuring correct placement. From 9bc9db9138ee6d8e103c1f2a8dd87b671cb6a5b8 Mon Sep 17 00:00:00 2001 From: wooster0 Date: Mon, 15 Jan 2024 20:58:43 +0900 Subject: [PATCH 116/651] simplify the code even more --- osu.Game/Screens/Ranking/ResultsScreen.cs | 2 +- osu.Game/Screens/Ranking/ScorePanelList.cs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index 697d62ad6e..da1609c2c4 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -248,7 +248,7 @@ namespace osu.Game.Screens.Ranking lastFetchCompleted = true; - if (ScorePanelList.IsEmpty) + if (!scores.Any()) { // This can happen if for example a beatmap that is part of a playlist hasn't been played yet. VerticalScrollContent.Add(new MessagePlaceholder(LeaderboardStrings.NoRecordsYet)); diff --git a/osu.Game/Screens/Ranking/ScorePanelList.cs b/osu.Game/Screens/Ranking/ScorePanelList.cs index 95c90e35a0..b75f3d86ff 100644 --- a/osu.Game/Screens/Ranking/ScorePanelList.cs +++ b/osu.Game/Screens/Ranking/ScorePanelList.cs @@ -49,8 +49,6 @@ namespace osu.Game.Screens.Ranking public bool AllPanelsVisible => flow.All(p => p.IsPresent); - public bool IsEmpty => flow.Count == 0; - /// /// The current scroll position. /// From 1d7b63e204bfac6a5350b3221b3c951f2e4e5510 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 15 Jan 2024 14:57:17 +0300 Subject: [PATCH 117/651] Move checking logic inside `ModUtils` and somewhat optimise --- osu.Game/Screens/Play/Player.cs | 3 ++- osu.Game/Utils/ModUtils.cs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index ffd585148b..5f52f59ad2 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -38,6 +38,7 @@ using osu.Game.Screens.Play.HUD; using osu.Game.Screens.Ranking; using osu.Game.Skinning; using osu.Game.Users; +using osu.Game.Utils; using osuTK.Graphics; namespace osu.Game.Screens.Play @@ -213,7 +214,7 @@ namespace osu.Game.Screens.Play if (playableBeatmap == null) return; - if (gameplayMods.Any(m => ruleset.AllMods.All(rulesetMod => m.GetType() != rulesetMod.GetType()))) + if (!ModUtils.CheckModsBelongToRuleset(ruleset, gameplayMods)) { Logger.Log($@"Gameplay was started with a mod belonging to a ruleset different than '{ruleset.Description}'.", level: LogLevel.Important); return; diff --git a/osu.Game/Utils/ModUtils.cs b/osu.Game/Utils/ModUtils.cs index 252579a186..827b199b16 100644 --- a/osu.Game/Utils/ModUtils.cs +++ b/osu.Game/Utils/ModUtils.cs @@ -229,6 +229,38 @@ namespace osu.Game.Utils return proposedWereValid; } + /// + /// Verifies all mods provided belong to the given ruleset. + /// + /// The ruleset to check the proposed mods against. + /// The mods proposed for checking. + /// Whether all belong to the given . + public static bool CheckModsBelongToRuleset(Ruleset ruleset, IEnumerable proposedMods) + { + var rulesetModsTypes = ruleset.AllMods.Select(m => m.GetType()).ToList(); + + foreach (var proposedMod in proposedMods) + { + bool found = false; + + var proposedModType = proposedMod.GetType(); + + foreach (var rulesetModType in rulesetModsTypes) + { + if (rulesetModType == proposedModType) + { + found = true; + break; + } + } + + if (!found) + return true; + } + + return true; + } + /// /// Given a value of a score multiplier, returns a string version with special handling for a value near 1.00x. /// From d346dd065027d08d374d76f045302c356d05fb9a Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 15 Jan 2024 15:01:13 +0300 Subject: [PATCH 118/651] Fix `TestModReinstantiation` failing due to custom mod being used --- osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs | 8 +------- osu.Game/Utils/ModUtils.cs | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs index dbd1ce1f6e..f97372e9b6 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs @@ -13,7 +13,6 @@ using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Localisation; using osu.Framework.Screens; using osu.Framework.Testing; using osu.Framework.Utils; @@ -487,13 +486,8 @@ namespace osu.Game.Tests.Visual.Gameplay } } - private class TestMod : Mod, IApplicableToScoreProcessor + private class TestMod : OsuModDoubleTime, IApplicableToScoreProcessor { - public override string Name => string.Empty; - public override string Acronym => string.Empty; - public override double ScoreMultiplier => 1; - public override LocalisableString Description => string.Empty; - public bool Applied { get; private set; } public void ApplyToScoreProcessor(ScoreProcessor scoreProcessor) diff --git a/osu.Game/Utils/ModUtils.cs b/osu.Game/Utils/ModUtils.cs index 827b199b16..7a9f93e06f 100644 --- a/osu.Game/Utils/ModUtils.cs +++ b/osu.Game/Utils/ModUtils.cs @@ -247,7 +247,7 @@ namespace osu.Game.Utils foreach (var rulesetModType in rulesetModsTypes) { - if (rulesetModType == proposedModType) + if (rulesetModType.IsAssignableFrom(proposedModType)) { found = true; break; From 399fc8195a7441c250b528ffb6b8953aedba1aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 13:22:22 +0100 Subject: [PATCH 119/651] Fix cursor ripple pool not loading pooled drawables ahead of time Increment the counter over at https://github.com/ppy/osu-framework/pull/6136. --- osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs b/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs index 52486b701a..4cb91aa103 100644 --- a/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs +++ b/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs @@ -33,6 +33,8 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor private void load(OsuRulesetConfigManager? rulesetConfig) { rulesetConfig?.BindWith(OsuRulesetSetting.ShowCursorRipples, showRipples); + + AddInternal(ripplePool); } public bool OnPressed(KeyBindingPressEvent e) From c5351bd14df70f61ab72c782b1dcab43c2d673b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 14:20:07 +0100 Subject: [PATCH 120/651] Fix back-to-front set --- osu.Game/Screens/Play/Player.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index f0f0a58368..4eb69a9893 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -1243,7 +1243,7 @@ namespace osu.Game.Screens.Play b.IgnoreUserSettings.Value = true; b.IsBreakTime.UnbindFrom(breakTracker.IsBreakTime); - b.IsBreakTime.Value = true; + b.IsBreakTime.Value = false; }); storyboardReplacesBackground.Value = false; } From 91f8144f98adc6f79156d4514840d7b668ced376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 14:58:46 +0100 Subject: [PATCH 121/651] Add test coverage --- .../TestSceneDrawableRoomPlaylist.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs index 312135402f..d40283ac74 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs @@ -19,8 +19,10 @@ using osu.Game.Beatmaps.Drawables; using osu.Game.Database; using osu.Game.Graphics.Containers; using osu.Game.Graphics.Cursor; +using osu.Game.Graphics.UserInterface; using osu.Game.Models; using osu.Game.Online.API; +using osu.Game.Online.Chat; using osu.Game.Online.Rooms; using osu.Game.Rulesets; using osu.Game.Rulesets.Osu; @@ -302,6 +304,36 @@ namespace osu.Game.Tests.Visual.Multiplayer }); } + [Test] + public void TestSelectableMouseHandling() + { + bool resultsRequested = false; + + AddStep("reset flag", () => resultsRequested = false); + createPlaylist(p => + { + p.AllowSelection = true; + p.AllowShowingResults = true; + p.RequestResults = _ => resultsRequested = true; + }); + + AddStep("move mouse to first item title", () => + { + var drawQuad = playlist.ChildrenOfType().First().ScreenSpaceDrawQuad; + var location = (drawQuad.TopLeft + drawQuad.BottomLeft) / 2 + new Vector2(drawQuad.Width * 0.2f, 0); + InputManager.MoveMouseTo(location); + }); + AddAssert("first item title not hovered", () => playlist.ChildrenOfType().First().IsHovered, () => Is.False); + AddStep("click left mouse", () => InputManager.Click(MouseButton.Left)); + AddUntilStep("first item selected", () => playlist.ChildrenOfType().First().IsSelectedItem, () => Is.True); + // implies being clickable. + AddUntilStep("first item title hovered", () => playlist.ChildrenOfType().First().IsHovered, () => Is.True); + + AddStep("move mouse to second item results button", () => InputManager.MoveMouseTo(playlist.ChildrenOfType().ElementAt(5))); + AddStep("click left mouse", () => InputManager.Click(MouseButton.Left)); + AddUntilStep("results requested", () => resultsRequested); + } + private void moveToItem(int index, Vector2? offset = null) => AddStep($"move mouse to item {index}", () => InputManager.MoveMouseTo(playlist.ChildrenOfType().ElementAt(index), offset)); From d8d1d9264c7bd1b933a21e67e26efebd2107707e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 18:29:51 +0100 Subject: [PATCH 122/651] Fix test failure --- .../Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs index d40283ac74..6446ebd35f 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneDrawableRoomPlaylist.cs @@ -323,6 +323,7 @@ namespace osu.Game.Tests.Visual.Multiplayer var location = (drawQuad.TopLeft + drawQuad.BottomLeft) / 2 + new Vector2(drawQuad.Width * 0.2f, 0); InputManager.MoveMouseTo(location); }); + AddUntilStep("wait for text load", () => playlist.ChildrenOfType().Any()); AddAssert("first item title not hovered", () => playlist.ChildrenOfType().First().IsHovered, () => Is.False); AddStep("click left mouse", () => InputManager.Click(MouseButton.Left)); AddUntilStep("first item selected", () => playlist.ChildrenOfType().First().IsSelectedItem, () => Is.True); From 8a839f64ed18cfabd6ca8ae98e7ba80441641803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 18:47:46 +0100 Subject: [PATCH 123/651] Add failing test coverage for placeholder shown when it shouldn't be --- .../TestScenePlaylistsResultsScreen.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs index 727d9da50b..ff1b351b9f 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs @@ -17,6 +17,7 @@ using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; using osu.Game.Online.API.Requests; using osu.Game.Online.API.Requests.Responses; +using osu.Game.Online.Placeholders; using osu.Game.Online.Rooms; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Scoring; @@ -139,6 +140,37 @@ namespace osu.Game.Tests.Visual.Playlists } } + [Test] + public void TestNoMoreScoresToTheRight() + { + AddStep("bind delayed handler with scores", () => bindHandler(delayed: true)); + + createResults(); + waitForDisplay(); + + int beforePanelCount = 0; + + AddStep("get panel count", () => beforePanelCount = this.ChildrenOfType().Count()); + AddStep("scroll to right", () => resultsScreen.ScorePanelList.ChildrenOfType().Single().ScrollToEnd(false)); + + AddAssert("right loading spinner shown", () => resultsScreen.RightSpinner.State.Value == Visibility.Visible); + waitForDisplay(); + + AddAssert($"count increased by {scores_per_result}", () => this.ChildrenOfType().Count() >= beforePanelCount + scores_per_result); + AddAssert("right loading spinner hidden", () => resultsScreen.RightSpinner.State.Value == Visibility.Hidden); + + AddStep("get panel count", () => beforePanelCount = this.ChildrenOfType().Count()); + AddStep("bind delayed handler with no scores", () => bindHandler(delayed: true, noScores: true)); + AddStep("scroll to right", () => resultsScreen.ScorePanelList.ChildrenOfType().Single().ScrollToEnd(false)); + + AddAssert("right loading spinner shown", () => resultsScreen.RightSpinner.State.Value == Visibility.Visible); + waitForDisplay(); + + AddAssert("count not increased", () => this.ChildrenOfType().Count() == beforePanelCount); + AddAssert("right loading spinner hidden", () => resultsScreen.RightSpinner.State.Value == Visibility.Hidden); + AddAssert("no placeholders shown", () => this.ChildrenOfType().Count(), () => Is.Zero); + } + [Test] public void TestFetchWhenScrolledToTheLeft() { From 9d2c82452cfee1cfd7b23dc81c78d902938b5945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 18:47:49 +0100 Subject: [PATCH 124/651] Revert "simplify the code even more" This reverts commit 9bc9db9138ee6d8e103c1f2a8dd87b671cb6a5b8. --- osu.Game/Screens/Ranking/ResultsScreen.cs | 2 +- osu.Game/Screens/Ranking/ScorePanelList.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index da1609c2c4..697d62ad6e 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -248,7 +248,7 @@ namespace osu.Game.Screens.Ranking lastFetchCompleted = true; - if (!scores.Any()) + if (ScorePanelList.IsEmpty) { // This can happen if for example a beatmap that is part of a playlist hasn't been played yet. VerticalScrollContent.Add(new MessagePlaceholder(LeaderboardStrings.NoRecordsYet)); diff --git a/osu.Game/Screens/Ranking/ScorePanelList.cs b/osu.Game/Screens/Ranking/ScorePanelList.cs index b75f3d86ff..95c90e35a0 100644 --- a/osu.Game/Screens/Ranking/ScorePanelList.cs +++ b/osu.Game/Screens/Ranking/ScorePanelList.cs @@ -49,6 +49,8 @@ namespace osu.Game.Screens.Ranking public bool AllPanelsVisible => flow.All(p => p.IsPresent); + public bool IsEmpty => flow.Count == 0; + /// /// The current scroll position. /// From 988794cf90d8bbe803c6a24a1e8c0c8a3ffaf2c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 18:49:41 +0100 Subject: [PATCH 125/651] Improve test coverage for empty results --- .../Visual/Playlists/TestScenePlaylistsResultsScreen.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs index ff1b351b9f..e805b03542 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs @@ -201,7 +201,8 @@ namespace osu.Game.Tests.Visual.Playlists { AddStep("bind user score info handler", () => bindHandler(noScores: true)); createResults(); - AddAssert("no scores visible", () => resultsScreen.ScorePanelList.GetScorePanels().Count() == 0); + AddAssert("no scores visible", () => !resultsScreen.ScorePanelList.GetScorePanels().Any()); + AddAssert("placeholder shown", () => this.ChildrenOfType().Count(), () => Is.EqualTo(1)); } private void createResults(Func getScore = null) From e8394e6f74351f7b136fe16d2a53033814d1bd56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 19:05:33 +0100 Subject: [PATCH 126/651] Add test coverage --- .../Visual/UserInterface/TestSceneModSelectOverlay.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs index 4b101a52f4..7958b68fb5 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs @@ -542,6 +542,11 @@ namespace osu.Game.Tests.Visual.UserInterface AddStep("press enter", () => InputManager.Key(Key.Enter)); AddAssert("hidden selected", () => getPanelForMod(typeof(OsuModHidden)).Active.Value); + AddAssert("all text selected in textbox", () => + { + var textBox = modSelectOverlay.ChildrenOfType().Single(); + return textBox.SelectedText == textBox.Text; + }); AddStep("press enter again", () => InputManager.Key(Key.Enter)); AddAssert("hidden deselected", () => !getPanelForMod(typeof(OsuModHidden)).Active.Value); From 8661edfc2fbc3cb9a5df62f8f31a7e1c928eb941 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Mon, 15 Jan 2024 21:07:09 +0300 Subject: [PATCH 127/651] Organize consts better --- osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index dcc8f4feec..6fc957874a 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -58,6 +58,8 @@ namespace osu.Game.Screens.Play.HUD public const float MAIN_PATH_RADIUS = 10f; private const float padding = MAIN_PATH_RADIUS * 2; + private const float glow_path_radius = 40f; + private const float main_path_glow_portion = 0.6f; private readonly LayoutValue drawSizeLayout = new LayoutValue(Invalidation.DrawSize); @@ -90,7 +92,7 @@ namespace osu.Game.Screens.Play.HUD { RelativeSizeAxes = Axes.Both, // since we are using bigger path radius we need to expand the draw area outwards to preserve the curve placement - Padding = new MarginPadding(-30f), + Padding = new MarginPadding(MAIN_PATH_RADIUS - glow_path_radius), Child = glowBar = new ArgonHealthDisplayBar { RelativeSizeAxes = Axes.Both, @@ -98,8 +100,8 @@ namespace osu.Game.Screens.Play.HUD GlowColour = main_bar_glow_colour, Blending = BlendingParameters.Additive, Colour = ColourInfo.GradientHorizontal(Color4.White.Opacity(0.8f), Color4.White), - PathRadius = 40f, - GlowPortion = 0.9f, + PathRadius = glow_path_radius, + GlowPortion = (glow_path_radius - MAIN_PATH_RADIUS * (1f - main_path_glow_portion)) / glow_path_radius, } }, mainBar = new ArgonHealthDisplayBar @@ -109,7 +111,7 @@ namespace osu.Game.Screens.Play.HUD BarColour = main_bar_colour, GlowColour = main_bar_glow_colour, PathRadius = MAIN_PATH_RADIUS, - GlowPortion = 0.6f, + GlowPortion = main_path_glow_portion } } }; From c0d4ed4789fbd7de96c131e2e7882ac673d03e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 19:07:52 +0100 Subject: [PATCH 128/651] Add test coverage of select-all-text-in-search when nothing matched --- .../Visual/UserInterface/TestSceneModSelectOverlay.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs index 7958b68fb5..046954db47 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs @@ -551,6 +551,14 @@ namespace osu.Game.Tests.Visual.UserInterface AddStep("press enter again", () => InputManager.Key(Key.Enter)); AddAssert("hidden deselected", () => !getPanelForMod(typeof(OsuModHidden)).Active.Value); + AddStep("apply search matching nothing", () => modSelectOverlay.SearchTerm = "ZZZ"); + AddStep("press enter", () => InputManager.Key(Key.Enter)); + AddAssert("all text not selected in textbox", () => + { + var textBox = modSelectOverlay.ChildrenOfType().Single(); + return textBox.SelectedText != textBox.Text; + }); + AddStep("clear search", () => modSelectOverlay.SearchTerm = string.Empty); AddStep("press enter", () => InputManager.Key(Key.Enter)); AddAssert("mod select hidden", () => modSelectOverlay.State.Value == Visibility.Hidden); From c46615839dcc40bca80f401d8559422492c43cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 19:09:50 +0100 Subject: [PATCH 129/651] Only select all text in mod search text box if enter press selected anything --- osu.Game/Overlays/Mods/ModSelectOverlay.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index 8cb990757f..a774bb9167 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -719,9 +719,10 @@ namespace osu.Game.Overlays.Mods ModState? firstMod = columnFlow.Columns.OfType().FirstOrDefault(m => m.IsPresent)?.AvailableMods.FirstOrDefault(x => x.Visible); if (firstMod is not null) + { firstMod.Active.Value = !firstMod.Active.Value; - - SearchTextBox.SelectAll(); + SearchTextBox.SelectAll(); + } return true; } From 97e08f50715e980d4a987d9f8ca52f7d6d178df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 15 Jan 2024 21:39:33 +0100 Subject: [PATCH 130/651] Fix `ColourHitErrorMeter` not loading pooled drawables ahead of time --- .../HUD/HitErrorMeters/ColourHitErrorMeter.cs | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/HitErrorMeters/ColourHitErrorMeter.cs b/osu.Game/Screens/Play/HUD/HitErrorMeters/ColourHitErrorMeter.cs index 65f4b50dde..0f2f9dc323 100644 --- a/osu.Game/Screens/Play/HUD/HitErrorMeters/ColourHitErrorMeter.cs +++ b/osu.Game/Screens/Play/HUD/HitErrorMeters/ColourHitErrorMeter.cs @@ -15,7 +15,6 @@ using osu.Game.Localisation.HUD; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Scoring; using osuTK; -using osuTK.Graphics; namespace osu.Game.Screens.Play.HUD.HitErrorMeters { @@ -42,16 +41,21 @@ namespace osu.Game.Screens.Play.HUD.HitErrorMeters [SettingSource(typeof(ColourHitErrorMeterStrings), nameof(ColourHitErrorMeterStrings.JudgementShape), nameof(ColourHitErrorMeterStrings.JudgementShapeDescription))] public Bindable JudgementShape { get; } = new Bindable(); + private readonly DrawablePool judgementShapePool; private readonly JudgementFlow judgementsFlow; public ColourHitErrorMeter() { AutoSizeAxes = Axes.Both; - InternalChild = judgementsFlow = new JudgementFlow + InternalChildren = new Drawable[] { - JudgementShape = { BindTarget = JudgementShape }, - JudgementSpacing = { BindTarget = JudgementSpacing }, - JudgementCount = { BindTarget = JudgementCount } + judgementShapePool = new DrawablePool(50), + judgementsFlow = new JudgementFlow + { + JudgementShape = { BindTarget = JudgementShape }, + JudgementSpacing = { BindTarget = JudgementSpacing }, + JudgementCount = { BindTarget = JudgementCount } + } }; } @@ -60,7 +64,7 @@ namespace osu.Game.Screens.Play.HUD.HitErrorMeters if (!judgement.Type.IsScorable() || judgement.Type.IsBonus()) return; - judgementsFlow.Push(GetColourForHitResult(judgement.Type)); + judgementsFlow.Push(judgementShapePool.Get(shape => shape.Colour = GetColourForHitResult(judgement.Type))); } public override void Clear() @@ -105,15 +109,10 @@ namespace osu.Game.Screens.Play.HUD.HitErrorMeters private readonly DrawablePool judgementLinePool = new DrawablePool(50); - public void Push(Color4 colour) + public void Push(HitErrorShape shape) { - judgementLinePool.Get(shape => - { - shape.Colour = colour; - Add(shape); - - removeExtraJudgements(); - }); + Add(shape); + removeExtraJudgements(); } private void removeExtraJudgements() From 09e5b2fb46748d7c03ac7764e9170d2c860ac7ee Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 13:18:43 +0900 Subject: [PATCH 131/651] Add test coverage of incorrect default state for `Rank` when hidden is applied --- .../Rulesets/Scoring/ScoreProcessorTest.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs index 567bf6968f..73465fae08 100644 --- a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs +++ b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs @@ -18,10 +18,12 @@ using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Judgements; +using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko; using osu.Game.Rulesets.UI; +using osu.Game.Scoring; using osu.Game.Scoring.Legacy; using osu.Game.Tests.Beatmaps; @@ -385,6 +387,42 @@ namespace osu.Game.Tests.Rulesets.Scoring Assert.That(scoreProcessor.Accuracy.Value, Is.Not.EqualTo(1)); } + [Test] + public void TestNormalGrades() + { + scoreProcessor.ApplyBeatmap(new Beatmap()); + + Assert.That(scoreProcessor.Rank.Value, Is.EqualTo(ScoreRank.X)); + + scoreProcessor.Accuracy.Value = 0.99f; + Assert.That(scoreProcessor.Rank.Value, Is.EqualTo(ScoreRank.S)); + } + + [Test] + public void TestSilverGrades() + { + scoreProcessor.ApplyBeatmap(new Beatmap()); + Assert.That(scoreProcessor.Rank.Value, Is.EqualTo(ScoreRank.X)); + + scoreProcessor.Mods.Value = new[] { new OsuModHidden() }; + Assert.That(scoreProcessor.Rank.Value, Is.EqualTo(ScoreRank.XH)); + + scoreProcessor.Accuracy.Value = 0.99f; + Assert.That(scoreProcessor.Rank.Value, Is.EqualTo(ScoreRank.SH)); + } + + [Test] + public void TestSilverGradesModsAppliedFirst() + { + scoreProcessor.Mods.Value = new[] { new OsuModHidden() }; + scoreProcessor.ApplyBeatmap(new Beatmap()); + + Assert.That(scoreProcessor.Rank.Value, Is.EqualTo(ScoreRank.XH)); + + scoreProcessor.Accuracy.Value = 0.99f; + Assert.That(scoreProcessor.Rank.Value, Is.EqualTo(ScoreRank.SH)); + } + private class TestJudgement : Judgement { public override HitResult MaxResult { get; } From 902a5436f3e2c2f330bcaae176d07f252f26e14a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 13:12:22 +0900 Subject: [PATCH 132/651] Fix silver S/SS not being awarded correctly --- osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 25 ++++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index 14fa928224..80e751422e 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -186,16 +186,7 @@ namespace osu.Game.Rulesets.Scoring Ruleset = ruleset; Combo.ValueChanged += combo => HighestCombo.Value = Math.Max(HighestCombo.Value, combo.NewValue); - Accuracy.ValueChanged += accuracy => - { - // Once failed, we shouldn't update the rank anymore. - if (rank.Value == ScoreRank.F) - return; - - rank.Value = RankFromAccuracy(accuracy.NewValue); - foreach (var mod in Mods.Value.OfType()) - rank.Value = mod.AdjustRank(Rank.Value, accuracy.NewValue); - }; + Accuracy.ValueChanged += _ => updateRank(); Mods.ValueChanged += mods => { @@ -205,6 +196,7 @@ namespace osu.Game.Rulesets.Scoring scoreMultiplier *= m.ScoreMultiplier; updateScore(); + updateRank(); }; } @@ -372,6 +364,17 @@ namespace osu.Game.Rulesets.Scoring TotalScore.Value = (long)Math.Round(ComputeTotalScore(comboProgress, accuracyProcess, currentBonusPortion) * scoreMultiplier); } + private void updateRank() + { + // Once failed, we shouldn't update the rank anymore. + if (rank.Value == ScoreRank.F) + return; + + rank.Value = RankFromAccuracy(Accuracy.Value); + foreach (var mod in Mods.Value.OfType()) + rank.Value = mod.AdjustRank(Rank.Value, Accuracy.Value); + } + protected virtual double ComputeTotalScore(double comboProgress, double accuracyProgress, double bonusPortion) { return 500000 * Accuracy.Value * comboProgress + @@ -417,8 +420,8 @@ namespace osu.Game.Rulesets.Scoring TotalScore.Value = 0; Accuracy.Value = 1; Combo.Value = 0; - rank.Value = ScoreRank.X; HighestCombo.Value = 0; + updateRank(); } /// From e75f113a06c4c4d9ec229857ed580d5747c1f143 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 14:14:04 +0900 Subject: [PATCH 133/651] Update resources --- osu.Game/osu.Game.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 07a638f04a..f33ddac66f 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -37,7 +37,7 @@ - + From 34905b20527bf7adf618506975feab634f7632b4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 14:17:21 +0900 Subject: [PATCH 134/651] Apply NRT to new classes --- .../ArgonHealthDisplayBackground.cs | 12 +++--------- .../ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs | 6 ++---- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs index a96c2f97bd..b486465cb0 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBackground.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System.Runtime.InteropServices; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -29,6 +27,8 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts { protected new ArgonHealthDisplayBackground Source => (ArgonHealthDisplayBackground)base.Source; + private IUniformBuffer? parametersBuffer; + public ArgonBarPathDrawNode(ArgonHealthDisplayBackground source) : base(source) { @@ -39,21 +39,15 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts public override void ApplyState() { base.ApplyState(); - size = Source.DrawSize; } - private IUniformBuffer parametersBuffer; - protected override void BindUniformResources(IShader shader, IRenderer renderer) { base.BindUniformResources(shader, renderer); parametersBuffer ??= renderer.CreateUniformBuffer(); - parametersBuffer.Data = new ArgonBarPathBackgroundParameters - { - Size = size - }; + parametersBuffer.Data = new ArgonBarPathBackgroundParameters { Size = size }; shader.BindUniformBlock("m_ArgonBarPathBackgroundParameters", parametersBuffer); } diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs index 1938b97d5a..28e56183bf 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplayParts/ArgonHealthDisplayBar.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using System.Runtime.InteropServices; using osu.Framework.Allocation; @@ -107,6 +105,8 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts { protected new ArgonHealthDisplayBar Source => (ArgonHealthDisplayBar)base.Source; + private IUniformBuffer? parametersBuffer; + public ArgonBarPathDrawNode(ArgonHealthDisplayBar source) : base(source) { @@ -139,8 +139,6 @@ namespace osu.Game.Screens.Play.HUD.ArgonHealthDisplayParts base.Draw(renderer); } - private IUniformBuffer parametersBuffer; - protected override void BindUniformResources(IShader shader, IRenderer renderer) { base.BindUniformResources(shader, renderer); From 451ba1c86131e61245d4d3a9eb232cc47c32ff7e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 15:12:23 +0900 Subject: [PATCH 135/651] Ensure `PresentGameplay` doesn't get stuck in loop if no beatmaps available --- osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs b/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs index bedaf12c9b..40cd31934f 100644 --- a/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs +++ b/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs @@ -136,10 +136,15 @@ namespace osu.Game.Overlays.SkinEditor globallyReenableBeatmapSkinSetting(); } - public void PresentGameplay() + public void PresentGameplay() => presentGameplay(false); + + private void presentGameplay(bool attemptedBeatmapSwitch) { performer?.PerformFromScreen(screen => { + if (State.Value != Visibility.Visible) + return; + if (beatmap.Value is DummyWorkingBeatmap) { // presume we don't have anything good to play and just bail. @@ -149,8 +154,12 @@ namespace osu.Game.Overlays.SkinEditor // If we're playing the intro, switch away to another beatmap. if (beatmap.Value.BeatmapSetInfo.Protected) { - music.NextTrack(); - Schedule(PresentGameplay); + if (!attemptedBeatmapSwitch) + { + music.NextTrack(); + Schedule(() => presentGameplay(true)); + } + return; } From e3ab7b1e9fd60ac15ae3e3e838425290512cf517 Mon Sep 17 00:00:00 2001 From: Justin Date: Tue, 16 Jan 2024 17:22:22 +1100 Subject: [PATCH 136/651] Update disctop to use turnratio like stable --- .../Skinning/Legacy/LegacyNewStyleSpinner.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyNewStyleSpinner.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyNewStyleSpinner.cs index 67a6d5e41a..d4a0f243e4 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyNewStyleSpinner.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyNewStyleSpinner.cs @@ -135,7 +135,11 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy protected override void Update() { base.Update(); - spinningMiddle.Rotation = discTop.Rotation = DrawableSpinner.RotationTracker.Rotation; + + float turnRatio = spinningMiddle.Texture != null ? 0.5f : 1; + discTop.Rotation = DrawableSpinner.RotationTracker.Rotation * turnRatio; + spinningMiddle.Rotation = DrawableSpinner.RotationTracker.Rotation; + discBottom.Rotation = discTop.Rotation / 3; glow.Alpha = DrawableSpinner.Progress; From 0e41d0c9cf1cc46da66bd1c0d11dbc4091ea644a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 15:21:43 +0900 Subject: [PATCH 137/651] Add failing test coverage of skin getting nuked This doesn't fail in headless unfortunately. Run a few times manually to confirm. --- .../Navigation/TestSceneScreenNavigation.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs index 8cb993eff2..f59fbc75ac 100644 --- a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs +++ b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs @@ -35,6 +35,7 @@ using osu.Game.Screens.OnlinePlay.Lounge; using osu.Game.Screens.OnlinePlay.Match.Components; using osu.Game.Screens.OnlinePlay.Playlists; using osu.Game.Screens.Play; +using osu.Game.Screens.Play.HUD; using osu.Game.Screens.Ranking; using osu.Game.Screens.Select; using osu.Game.Screens.Select.Carousel; @@ -834,6 +835,24 @@ namespace osu.Game.Tests.Visual.Navigation AddAssert("exit dialog is shown", () => Game.Dependencies.Get().CurrentDialog is ConfirmExitDialog); } + [Test] + public void TestQuickSkinEditorDoesntNukeSkin() + { + AddStep("import beatmap", () => BeatmapImportHelper.LoadQuickOszIntoOsu(Game).WaitSafely()); + + AddStep("open", () => InputManager.Key(Key.Space)); + AddStep("skin", () => InputManager.Key(Key.E)); + AddStep("editor", () => InputManager.Key(Key.S)); + AddStep("and close immediately", () => InputManager.Key(Key.Escape)); + + AddStep("open again", () => InputManager.Key(Key.S)); + + Player player = null; + + AddUntilStep("wait for player", () => (player = Game.ScreenStack.CurrentScreen as Player) != null); + AddUntilStep("wait for gameplay still has health bar", () => player.ChildrenOfType().Any()); + } + [Test] public void TestTouchScreenDetectionAtSongSelect() { From cd02d00c0352eed86d4f2e5ec9aaf3bcd61a0102 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 15:23:07 +0900 Subject: [PATCH 138/651] Fix skin potentially being lost when opening and closing skin editor rapidly --- osu.Game/Overlays/SkinEditor/SkinEditor.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/SkinEditor/SkinEditor.cs b/osu.Game/Overlays/SkinEditor/SkinEditor.cs index f972186333..d3af928907 100644 --- a/osu.Game/Overlays/SkinEditor/SkinEditor.cs +++ b/osu.Game/Overlays/SkinEditor/SkinEditor.cs @@ -47,7 +47,7 @@ namespace osu.Game.Overlays.SkinEditor protected override bool StartHidden => true; - private Drawable targetScreen = null!; + private Drawable? targetScreen; private OsuTextFlowContainer headerText = null!; @@ -541,8 +541,14 @@ namespace osu.Game.Overlays.SkinEditor if (!hasBegunMutating) return; + if (targetScreen?.IsLoaded != true) + return; + SkinComponentsContainer[] targetContainers = availableTargets.ToArray(); + if (!targetContainers.All(c => c.ComponentsLoaded)) + return; + foreach (var t in targetContainers) currentSkin.Value.UpdateDrawableTarget(t); From 57a6025a2c492c897531cbb56ae0bdaf136dd03c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 15:52:05 +0900 Subject: [PATCH 139/651] Add helper method to bypass judgement woes --- osu.Game/Rulesets/Judgements/JudgementResult.cs | 5 +++++ osu.Game/Rulesets/Scoring/HealthProcessor.cs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/Judgements/JudgementResult.cs b/osu.Game/Rulesets/Judgements/JudgementResult.cs index 1b915d52b7..b781a13929 100644 --- a/osu.Game/Rulesets/Judgements/JudgementResult.cs +++ b/osu.Game/Rulesets/Judgements/JudgementResult.cs @@ -94,6 +94,11 @@ namespace osu.Game.Rulesets.Judgements /// public bool IsHit => Type.IsHit(); + /// + /// The increase in health resulting from this judgement result. + /// + public double HealthIncrease => Judgement.HealthIncreaseFor(this); + /// /// Creates a new . /// diff --git a/osu.Game/Rulesets/Scoring/HealthProcessor.cs b/osu.Game/Rulesets/Scoring/HealthProcessor.cs index 3e0b6433c2..b5eb755650 100644 --- a/osu.Game/Rulesets/Scoring/HealthProcessor.cs +++ b/osu.Game/Rulesets/Scoring/HealthProcessor.cs @@ -66,7 +66,7 @@ namespace osu.Game.Rulesets.Scoring /// /// The . /// The health increase. - protected virtual double GetHealthIncreaseFor(JudgementResult result) => result.Judgement.HealthIncreaseFor(result); + protected virtual double GetHealthIncreaseFor(JudgementResult result) => result.HealthIncrease; /// /// The default conditions for failing. From 2be8d66d4c75cee98d9aa0e5b60c99f475bb555c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 15:52:18 +0900 Subject: [PATCH 140/651] Fix argon health bar showing "miss" bar for bananas --- osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index 6fc957874a..71996718d9 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -136,7 +136,12 @@ namespace osu.Game.Screens.Play.HUD BarHeight.BindValueChanged(_ => updateContentSize(), true); } - private void onNewJudgement(JudgementResult result) => pendingMissAnimation |= !result.IsHit; + private void onNewJudgement(JudgementResult result) + { + // Check the health increase because cases like osu!catch bananas fire `IgnoreMiss`, + // which counts as a miss but doesn't actually subtract any health. + pendingMissAnimation |= !result.IsHit && result.HealthIncrease < 0; + } protected override void Update() { From cdc6621f33f1365cb212e8663e0f948e7dc34bf5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 16:37:05 +0900 Subject: [PATCH 141/651] Allow adjusting volume controls via a drag --- osu.Game/Overlays/Volume/VolumeMeter.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/osu.Game/Overlays/Volume/VolumeMeter.cs b/osu.Game/Overlays/Volume/VolumeMeter.cs index d366f0bddb..6ad314c601 100644 --- a/osu.Game/Overlays/Volume/VolumeMeter.cs +++ b/osu.Game/Overlays/Volume/VolumeMeter.cs @@ -309,10 +309,24 @@ namespace osu.Game.Overlays.Volume private const double max_acceleration = 5; private const double acceleration_multiplier = 1.8; + private const float mouse_drag_divisor = 20; + private ScheduledDelegate accelerationDebounce; private void resetAcceleration() => accelerationModifier = 1; + protected override bool OnDragStart(DragStartEvent e) + { + adjust(-e.Delta.Y / mouse_drag_divisor, true); + return true; + } + + protected override void OnDrag(DragEvent e) + { + adjust(-e.Delta.Y / mouse_drag_divisor, true); + base.OnDrag(e); + } + private void adjust(double delta, bool isPrecise) { if (delta == 0) From ee26329353ec41e9a9859aad8fc7000760bfac66 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 16:44:50 +0900 Subject: [PATCH 142/651] Fix some elements not showing on leaderboard scores when almost off-screen --- osu.Game/Online/Leaderboards/LeaderboardScore.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Online/Leaderboards/LeaderboardScore.cs b/osu.Game/Online/Leaderboards/LeaderboardScore.cs index a76f4ae955..1c2a26eafb 100644 --- a/osu.Game/Online/Leaderboards/LeaderboardScore.cs +++ b/osu.Game/Online/Leaderboards/LeaderboardScore.cs @@ -164,7 +164,8 @@ namespace osu.Game.Online.Leaderboards { Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, - AutoSizeAxes = Axes.Both, + AutoSizeAxes = Axes.X, + Height = 28, Direction = FillDirection.Horizontal, Spacing = new Vector2(10f, 0f), Children = new Drawable[] From c45daa373e24070c78379c71c57d6c1ede6c6c31 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jan 2024 17:15:25 +0900 Subject: [PATCH 143/651] Fix cursor scale animation not matching stable on classic skins --- .../Skinning/Argon/ArgonCursor.cs | 2 +- .../Skinning/Legacy/LegacyCursor.cs | 16 +++++++++- osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs | 11 +++---- .../UI/Cursor/OsuCursorSprite.cs | 19 ------------ .../UI/Cursor/SkinnableCursor.cs | 31 +++++++++++++++++++ 5 files changed, 51 insertions(+), 28 deletions(-) delete mode 100644 osu.Game.Rulesets.Osu/UI/Cursor/OsuCursorSprite.cs create mode 100644 osu.Game.Rulesets.Osu/UI/Cursor/SkinnableCursor.cs diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonCursor.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonCursor.cs index 4ca6abfdf7..15838f3e1b 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonCursor.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonCursor.cs @@ -13,7 +13,7 @@ using osuTK.Graphics; namespace osu.Game.Rulesets.Osu.Skinning.Argon { - public partial class ArgonCursor : OsuCursorSprite + public partial class ArgonCursor : SkinnableCursor { public ArgonCursor() { diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyCursor.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyCursor.cs index b0c01d2925..375d81049d 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyCursor.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyCursor.cs @@ -9,8 +9,11 @@ using osuTK; namespace osu.Game.Rulesets.Osu.Skinning.Legacy { - public partial class LegacyCursor : OsuCursorSprite + public partial class LegacyCursor : SkinnableCursor { + private const float pressed_scale = 1.3f; + private const float released_scale = 1f; + private readonly ISkin skin; private bool spin; @@ -51,5 +54,16 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy if (spin) ExpandTarget.Spin(10000, RotationDirection.Clockwise); } + + public override void Expand() + { + ExpandTarget?.ScaleTo(released_scale) + .ScaleTo(pressed_scale, 100, Easing.Out); + } + + public override void Contract() + { + ExpandTarget?.ScaleTo(released_scale, 100, Easing.Out); + } } } diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs b/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs index 710ca9ace7..d8f50c1f5d 100644 --- a/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs +++ b/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs @@ -24,15 +24,12 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor { public const float SIZE = 28; - private const float pressed_scale = 1.2f; - private const float released_scale = 1f; - private bool cursorExpand; private SkinnableDrawable cursorSprite; private Container cursorScaleContainer = null!; - private Drawable expandTarget => (cursorSprite.Drawable as OsuCursorSprite)?.ExpandTarget ?? cursorSprite; + private SkinnableCursor skinnableCursor => (SkinnableCursor)cursorSprite.Drawable; public IBindable CursorScale => cursorScale; @@ -108,10 +105,10 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor { if (!cursorExpand) return; - expandTarget.ScaleTo(released_scale).ScaleTo(pressed_scale, 400, Easing.OutElasticHalf); + skinnableCursor.Expand(); } - public void Contract() => expandTarget.ScaleTo(released_scale, 400, Easing.OutQuad); + public void Contract() => skinnableCursor.Contract(); /// /// Get the scale applicable to the ActiveCursor based on a beatmap's circle size. @@ -119,7 +116,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor public static float GetScaleForCircleSize(float circleSize) => 1f - 0.7f * (1f + circleSize - BeatmapDifficulty.DEFAULT_DIFFICULTY) / BeatmapDifficulty.DEFAULT_DIFFICULTY; - private partial class DefaultCursor : OsuCursorSprite + private partial class DefaultCursor : SkinnableCursor { public DefaultCursor() { diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursorSprite.cs b/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursorSprite.cs deleted file mode 100644 index aaf8949084..0000000000 --- a/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursorSprite.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -#nullable disable - -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; - -namespace osu.Game.Rulesets.Osu.UI.Cursor -{ - public abstract partial class OsuCursorSprite : CompositeDrawable - { - /// - /// The an optional piece of the cursor to expand when in a clicked state. - /// If null, the whole cursor will be affected by expansion. - /// - public Drawable ExpandTarget { get; protected set; } - } -} diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/SkinnableCursor.cs b/osu.Game.Rulesets.Osu/UI/Cursor/SkinnableCursor.cs new file mode 100644 index 0000000000..09e6f989a4 --- /dev/null +++ b/osu.Game.Rulesets.Osu/UI/Cursor/SkinnableCursor.cs @@ -0,0 +1,31 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; + +namespace osu.Game.Rulesets.Osu.UI.Cursor +{ + public abstract partial class SkinnableCursor : CompositeDrawable + { + private const float pressed_scale = 1.2f; + private const float released_scale = 1f; + + public virtual void Expand() + { + ExpandTarget?.ScaleTo(released_scale) + .ScaleTo(pressed_scale, 400, Easing.OutElasticHalf); + } + + public virtual void Contract() + { + ExpandTarget?.ScaleTo(released_scale, 400, Easing.OutQuad); + } + + /// + /// The an optional piece of the cursor to expand when in a clicked state. + /// If null, the whole cursor will be affected by expansion. + /// + public Drawable? ExpandTarget { get; protected set; } + } +} From 2935bd4809d1e071d8feb93604629fa94fb2cbbc Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Tue, 16 Jan 2024 14:27:24 +0300 Subject: [PATCH 144/651] Add test cases for helper method --- osu.Game.Tests/Mods/ModUtilsTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/osu.Game.Tests/Mods/ModUtilsTest.cs b/osu.Game.Tests/Mods/ModUtilsTest.cs index 13da69871e..decb0a31ac 100644 --- a/osu.Game.Tests/Mods/ModUtilsTest.cs +++ b/osu.Game.Tests/Mods/ModUtilsTest.cs @@ -7,7 +7,9 @@ using Moq; using NUnit.Framework; using osu.Framework.Localisation; using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Mods; +using osu.Game.Rulesets.Taiko.Mods; using osu.Game.Utils; namespace osu.Game.Tests.Mods @@ -310,6 +312,16 @@ namespace osu.Game.Tests.Mods Assert.That(invalid?.Select(t => t.GetType()), Is.EquivalentTo(expectedInvalid)); } + [Test] + public void TestModBelongsToRuleset() + { + Assert.That(ModUtils.CheckModsBelongToRuleset(new OsuRuleset(), Array.Empty())); + Assert.That(ModUtils.CheckModsBelongToRuleset(new OsuRuleset(), new Mod[] { new OsuModDoubleTime() })); + Assert.That(ModUtils.CheckModsBelongToRuleset(new OsuRuleset(), new Mod[] { new OsuModDoubleTime(), new OsuModAccuracyChallenge() })); + Assert.That(ModUtils.CheckModsBelongToRuleset(new OsuRuleset(), new Mod[] { new OsuModDoubleTime(), new ModAccuracyChallenge() }), Is.False); + Assert.That(ModUtils.CheckModsBelongToRuleset(new OsuRuleset(), new Mod[] { new OsuModDoubleTime(), new TaikoModFlashlight() }), Is.False); + } + [Test] public void TestFormatScoreMultiplier() { From 90da39c65d252e157b8a550429e18c944cd65380 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Tue, 16 Jan 2024 14:27:30 +0300 Subject: [PATCH 145/651] Fix helper method returning incorrect result --- osu.Game/Utils/ModUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Utils/ModUtils.cs b/osu.Game/Utils/ModUtils.cs index 7a9f93e06f..2c9eef41e3 100644 --- a/osu.Game/Utils/ModUtils.cs +++ b/osu.Game/Utils/ModUtils.cs @@ -255,7 +255,7 @@ namespace osu.Game.Utils } if (!found) - return true; + return false; } return true; From 485195d4c25d3b8f13f52f6da7faf72472a21b0e Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Tue, 16 Jan 2024 14:27:40 +0300 Subject: [PATCH 146/651] Fix submission test not asserting properly --- osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs index 833cb24f41..e2ce3a014c 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs @@ -294,6 +294,7 @@ namespace osu.Game.Tests.Visual.Gameplay createPlayerTest(createRuleset: () => new OsuRuleset(), createMods: () => new Mod[] { new TaikoModHidden() }); AddUntilStep("wait for token request", () => Player.TokenCreationRequested); + AddAssert("gameplay not loaded", () => Player.DrawableRuleset == null); AddStep("exit", () => Player.Exit()); AddAssert("ensure no submission", () => Player.SubmittedScore == null); From 7920e93fa91dbe14a610591cb4446a3c08d63819 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Tue, 16 Jan 2024 17:36:46 +0300 Subject: [PATCH 147/651] Rework GlowingSpriteText --- .../Graphics/Sprites/GlowingSpriteText.cs | 85 +++++++++---------- 1 file changed, 40 insertions(+), 45 deletions(-) diff --git a/osu.Game/Graphics/Sprites/GlowingSpriteText.cs b/osu.Game/Graphics/Sprites/GlowingSpriteText.cs index 1355bfc272..669c5da01e 100644 --- a/osu.Game/Graphics/Sprites/GlowingSpriteText.cs +++ b/osu.Game/Graphics/Sprites/GlowingSpriteText.cs @@ -5,95 +5,90 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; +using osu.Framework.Utils; using osuTK; namespace osu.Game.Graphics.Sprites { - public partial class GlowingSpriteText : Container, IHasText + public partial class GlowingSpriteText : BufferedContainer, IHasText { - private readonly OsuSpriteText spriteText, blurredText; + private const float blur_sigma = 3f; + + // Inflate draw quad to prevent glow from trimming at the edges. + // Padding won't suffice since it will affect text position in cases when it's not centered. + protected override Quad ComputeScreenSpaceDrawQuad() => base.ComputeScreenSpaceDrawQuad().AABBFloat.Inflate(Blur.KernelSize(blur_sigma)); + + private readonly OsuSpriteText text; public LocalisableString Text { - get => spriteText.Text; - set => blurredText.Text = spriteText.Text = value; + get => text.Text; + set => text.Text = value; } public FontUsage Font { - get => spriteText.Font; - set => blurredText.Font = spriteText.Font = value.With(fixedWidth: true); + get => text.Font; + set => text.Font = value.With(fixedWidth: true); } public Vector2 TextSize { - get => spriteText.Size; - set => blurredText.Size = spriteText.Size = value; + get => text.Size; + set => text.Size = value; } public ColourInfo TextColour { - get => spriteText.Colour; - set => spriteText.Colour = value; + get => text.Colour; + set => text.Colour = value; } public ColourInfo GlowColour { - get => blurredText.Colour; - set => blurredText.Colour = value; + get => EffectColour; + set + { + EffectColour = value; + BackgroundColour = value.MultiplyAlpha(0f); + } } public Vector2 Spacing { - get => spriteText.Spacing; - set => spriteText.Spacing = blurredText.Spacing = value; + get => text.Spacing; + set => text.Spacing = value; } public bool UseFullGlyphHeight { - get => spriteText.UseFullGlyphHeight; - set => spriteText.UseFullGlyphHeight = blurredText.UseFullGlyphHeight = value; + get => text.UseFullGlyphHeight; + set => text.UseFullGlyphHeight = value; } public Bindable Current { - get => spriteText.Current; - set => spriteText.Current = value; + get => text.Current; + set => text.Current = value; } public GlowingSpriteText() + : base(cachedFrameBuffer: true) { AutoSizeAxes = Axes.Both; - - Children = new Drawable[] + BlurSigma = new Vector2(blur_sigma); + RedrawOnScale = false; + DrawOriginal = true; + EffectBlending = BlendingParameters.Additive; + EffectPlacement = EffectPlacement.InFront; + Child = text = new OsuSpriteText { - new BufferedContainer(cachedFrameBuffer: true) - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - BlurSigma = new Vector2(4), - RedrawOnScale = false, - RelativeSizeAxes = Axes.Both, - Blending = BlendingParameters.Additive, - Size = new Vector2(3f), - Children = new[] - { - blurredText = new OsuSpriteText - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Shadow = false, - }, - }, - }, - spriteText = new OsuSpriteText - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Shadow = false, - }, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Shadow = false, }; } } From dfdf700560726d0f8bd87408b3cecd9b0e373f4c Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Tue, 16 Jan 2024 17:39:37 +0300 Subject: [PATCH 148/651] Don't use glowing text in ScoreComponentLabel --- osu.Game/Online/Leaderboards/LeaderboardScore.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/osu.Game/Online/Leaderboards/LeaderboardScore.cs b/osu.Game/Online/Leaderboards/LeaderboardScore.cs index 1c2a26eafb..964f065813 100644 --- a/osu.Game/Online/Leaderboards/LeaderboardScore.cs +++ b/osu.Game/Online/Leaderboards/LeaderboardScore.cs @@ -358,14 +358,12 @@ namespace osu.Game.Online.Leaderboards }, }, }, - new GlowingSpriteText + new OsuSpriteText { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, - TextColour = Color4.White, - GlowColour = Color4Extensions.FromHex(@"83ccfa"), Text = statistic.Value, - Font = OsuFont.GetFont(size: 17, weight: FontWeight.Bold), + Font = OsuFont.GetFont(size: 17, weight: FontWeight.Bold, fixedWidth: true) }, }, }; From 7a7548e89d91849992461c759a01a7e4f5cf97fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 17:09:04 +0100 Subject: [PATCH 149/651] Add failing test coverage --- .../Mods/TestSceneOsuModTouchDevice.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs index cd51ccd751..5b5ad07fde 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs @@ -51,7 +51,6 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods public void TestUserAlreadyHasTouchDeviceActive() { loadPlayer(); - // it is presumed that a previous screen (i.e. song select) will set this up AddStep("set up touchscreen user", () => { currentPlayer.Score.ScoreInfo.Mods = currentPlayer.Score.ScoreInfo.Mods.Append(new OsuModTouchDevice()).ToArray(); @@ -69,6 +68,14 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods AddAssert("touch device mod activated", () => currentPlayer.Score.ScoreInfo.Mods, () => Has.One.InstanceOf()); } + [Test] + public void TestTouchActivePriorToPlayerLoad() + { + AddStep("set touch input active", () => statics.SetValue(Static.TouchInputActive, true)); + loadPlayer(); + AddAssert("touch device mod activated", () => currentPlayer.Score.ScoreInfo.Mods, () => Has.One.InstanceOf()); + } + [Test] public void TestTouchDuringBreak() { From a9d086c11954c618e12301eb762edf2df8931187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 17:12:40 +0100 Subject: [PATCH 150/651] Fix touch device not always activating when it should See https://github.com/ppy/osu/discussions/26574 --- osu.Game/Screens/Play/PlayerTouchInputDetector.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerTouchInputDetector.cs b/osu.Game/Screens/Play/PlayerTouchInputDetector.cs index 69c3cd0ded..12fb748e7d 100644 --- a/osu.Game/Screens/Play/PlayerTouchInputDetector.cs +++ b/osu.Game/Screens/Play/PlayerTouchInputDetector.cs @@ -20,12 +20,16 @@ namespace osu.Game.Screens.Play private GameplayState gameplayState { get; set; } = null!; private IBindable touchActive = new BindableBool(); + private IBindable isBreakTime = null!; [BackgroundDependencyLoader] private void load(SessionStatics statics) { touchActive = statics.GetBindable(Static.TouchInputActive); touchActive.BindValueChanged(_ => updateState()); + + isBreakTime = player.IsBreakTime.GetBoundCopy(); + isBreakTime.BindValueChanged(_ => updateState(), true); } private void updateState() @@ -39,7 +43,7 @@ namespace osu.Game.Screens.Play if (gameplayState.Score.ScoreInfo.Mods.OfType().Any()) return; - if (player.IsBreakTime.Value) + if (isBreakTime.Value) return; var touchDeviceMod = gameplayState.Ruleset.GetTouchDeviceMod(); From b16152811d0266905db40187cfbaefe6ebe8c434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 17:54:49 +0100 Subject: [PATCH 151/651] Use until step instead --- osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs index 5b5ad07fde..fdb1cac3e5 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModTouchDevice.cs @@ -73,7 +73,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { AddStep("set touch input active", () => statics.SetValue(Static.TouchInputActive, true)); loadPlayer(); - AddAssert("touch device mod activated", () => currentPlayer.Score.ScoreInfo.Mods, () => Has.One.InstanceOf()); + AddUntilStep("touch device mod activated", () => currentPlayer.Score.ScoreInfo.Mods, () => Has.One.InstanceOf()); } [Test] From e9e5a0b08cfd0fca03443cd0d25e00b14382934d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 18:41:49 +0100 Subject: [PATCH 152/651] Add failing test case --- .../Mods/TestSceneOsuModFlashlight.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs index defbb97c8a..1a786b99e8 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs @@ -77,5 +77,44 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods Autoplay = false, }); } + + [Test] + public void TestSliderDoesDimAfterStartTimeIfHitEarly() + { + bool sliderDimmed = false; + + CreateModTest(new ModTestData + { + Mod = new OsuModFlashlight(), + PassCondition = () => + { + sliderDimmed |= + Player.GameplayClockContainer.CurrentTime >= 1000 && Player.ChildrenOfType.Flashlight>().Single().FlashlightDim > 0; + return Player.GameplayState.HasPassed && sliderDimmed; + }, + Beatmap = new OsuBeatmap + { + HitObjects = new List + { + new Slider + { + StartTime = 1000, + Path = new SliderPath(new[] + { + new PathControlPoint(), + new PathControlPoint(new Vector2(100)) + }) + } + }, + }, + ReplayFrames = new List + { + new OsuReplayFrame(990, new Vector2(), OsuAction.LeftButton), + new OsuReplayFrame(2000, new Vector2(100), OsuAction.LeftButton), + new OsuReplayFrame(2001, new Vector2(100)), + }, + Autoplay = false, + }); + } } } From d0e9402761a37a393d3048689ef72bb287f26237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 18:47:00 +0100 Subject: [PATCH 153/651] Fix flashlight not dimming if slider head is hit early Closes https://github.com/ppy/osu/issues/26551 Fix is a bit nuclear (`OnUpdate` should be considered last resort), but I don't see many better alternatives here as `ApplyCustomUpdateState` does not work... --- osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs b/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs index 46c9bdd17f..5a6cc50082 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs @@ -50,7 +50,7 @@ namespace osu.Game.Rulesets.Osu.Mods public void ApplyToDrawableHitObject(DrawableHitObject drawable) { if (drawable is DrawableSlider s) - s.Tracking.ValueChanged += _ => flashlight.OnSliderTrackingChange(s); + s.OnUpdate += _ => flashlight.OnSliderTrackingChange(s); } private partial class OsuFlashlight : Flashlight, IRequireHighFrequencyMousePosition From 24741e96156ebaed5e1abd4f26c090b254d869ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 18:54:22 +0100 Subject: [PATCH 154/651] Add some more test coverage for good measure --- .../Mods/TestSceneOsuModFlashlight.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs index 1a786b99e8..776d5854d1 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModFlashlight.cs @@ -116,5 +116,44 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods Autoplay = false, }); } + + [Test] + public void TestSliderDoesDimAfterStartTimeIfHitLate() + { + bool sliderDimmed = false; + + CreateModTest(new ModTestData + { + Mod = new OsuModFlashlight(), + PassCondition = () => + { + sliderDimmed |= + Player.GameplayClockContainer.CurrentTime >= 1000 && Player.ChildrenOfType.Flashlight>().Single().FlashlightDim > 0; + return Player.GameplayState.HasPassed && sliderDimmed; + }, + Beatmap = new OsuBeatmap + { + HitObjects = new List + { + new Slider + { + StartTime = 1000, + Path = new SliderPath(new[] + { + new PathControlPoint(), + new PathControlPoint(new Vector2(100)) + }) + } + }, + }, + ReplayFrames = new List + { + new OsuReplayFrame(1100, new Vector2(), OsuAction.LeftButton), + new OsuReplayFrame(2000, new Vector2(100), OsuAction.LeftButton), + new OsuReplayFrame(2001, new Vector2(100)), + }, + Autoplay = false, + }); + } } } From 265a56bede4c66e0632e6a6dad6cf6ed0d7bedd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 19:40:01 +0100 Subject: [PATCH 155/651] Add basic test coverage of taiko health processor --- .../TaikoHealthProcessorTest.cs | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs diff --git a/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs b/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs new file mode 100644 index 0000000000..51dcf1ba91 --- /dev/null +++ b/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs @@ -0,0 +1,110 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using NUnit.Framework; +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.Taiko.Beatmaps; +using osu.Game.Rulesets.Taiko.Judgements; +using osu.Game.Rulesets.Taiko.Objects; +using osu.Game.Rulesets.Taiko.Scoring; + +namespace osu.Game.Rulesets.Taiko.Tests +{ + [TestFixture] + public class TaikoHealthProcessorTest + { + [Test] + public void TestHitsOnlyGreat() + { + var beatmap = new TaikoBeatmap + { + HitObjects = + { + new Hit(), + new Hit { StartTime = 1000 }, + new Hit { StartTime = 2000 }, + new Hit { StartTime = 3000 }, + new Hit { StartTime = 4000 }, + } + }; + + var healthProcessor = new TaikoHealthProcessor(); + healthProcessor.ApplyBeatmap(beatmap); + + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], new TaikoJudgement()) { Type = HitResult.Great }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], new TaikoJudgement()) { Type = HitResult.Great }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[2], new TaikoJudgement()) { Type = HitResult.Great }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[3], new TaikoJudgement()) { Type = HitResult.Great }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[4], new TaikoJudgement()) { Type = HitResult.Great }); + + Assert.Multiple(() => + { + Assert.That(healthProcessor.Health.Value, Is.EqualTo(1)); + Assert.That(healthProcessor.HasFailed, Is.False); + }); + } + + [Test] + public void TestHitsAboveThreshold() + { + var beatmap = new TaikoBeatmap + { + HitObjects = + { + new Hit(), + new Hit { StartTime = 1000 }, + new Hit { StartTime = 2000 }, + new Hit { StartTime = 3000 }, + new Hit { StartTime = 4000 }, + } + }; + + var healthProcessor = new TaikoHealthProcessor(); + healthProcessor.ApplyBeatmap(beatmap); + + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], new TaikoJudgement()) { Type = HitResult.Great }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], new TaikoJudgement()) { Type = HitResult.Ok }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[2], new TaikoJudgement()) { Type = HitResult.Ok }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[3], new TaikoJudgement()) { Type = HitResult.Ok }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[4], new TaikoJudgement()) { Type = HitResult.Miss }); + + Assert.Multiple(() => + { + Assert.That(healthProcessor.Health.Value, Is.GreaterThan(0.5)); + Assert.That(healthProcessor.HasFailed, Is.False); + }); + } + + [Test] + public void TestHitsBelowThreshold() + { + var beatmap = new TaikoBeatmap + { + HitObjects = + { + new Hit(), + new Hit { StartTime = 1000 }, + new Hit { StartTime = 2000 }, + new Hit { StartTime = 3000 }, + new Hit { StartTime = 4000 }, + } + }; + + var healthProcessor = new TaikoHealthProcessor(); + healthProcessor.ApplyBeatmap(beatmap); + + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], new TaikoJudgement()) { Type = HitResult.Miss }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], new TaikoJudgement()) { Type = HitResult.Ok }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[2], new TaikoJudgement()) { Type = HitResult.Ok }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[3], new TaikoJudgement()) { Type = HitResult.Ok }); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[4], new TaikoJudgement()) { Type = HitResult.Miss }); + + Assert.Multiple(() => + { + Assert.That(healthProcessor.Health.Value, Is.LessThan(0.5)); + Assert.That(healthProcessor.HasFailed, Is.True); + }); + } + } +} From 190f30a4b3c56927c312f6163b5f7920fd014adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 19:46:00 +0100 Subject: [PATCH 156/651] Add failing test cases --- .../TaikoHealthProcessorTest.cs | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs b/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs index 51dcf1ba91..f4a1e888c9 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs @@ -106,5 +106,71 @@ namespace osu.Game.Rulesets.Taiko.Tests Assert.That(healthProcessor.HasFailed, Is.True); }); } + + [Test] + public void TestDrumRollOnly() + { + var beatmap = new TaikoBeatmap + { + HitObjects = + { + new DrumRoll { Duration = 2000 } + } + }; + + foreach (var ho in beatmap.HitObjects) + ho.ApplyDefaults(beatmap.ControlPointInfo, beatmap.Difficulty); + + var healthProcessor = new TaikoHealthProcessor(); + healthProcessor.ApplyBeatmap(beatmap); + + foreach (var nested in beatmap.HitObjects[0].NestedHitObjects) + { + var nestedJudgement = nested.CreateJudgement(); + healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult }); + } + + var judgement = beatmap.HitObjects[0].CreateJudgement(); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult }); + + Assert.Multiple(() => + { + Assert.That(healthProcessor.Health.Value, Is.EqualTo(1)); + Assert.That(healthProcessor.HasFailed, Is.False); + }); + } + + [Test] + public void TestSwellOnly() + { + var beatmap = new TaikoBeatmap + { + HitObjects = + { + new DrumRoll { Duration = 2000 } + } + }; + + foreach (var ho in beatmap.HitObjects) + ho.ApplyDefaults(beatmap.ControlPointInfo, beatmap.Difficulty); + + var healthProcessor = new TaikoHealthProcessor(); + healthProcessor.ApplyBeatmap(beatmap); + + foreach (var nested in beatmap.HitObjects[0].NestedHitObjects) + { + var nestedJudgement = nested.CreateJudgement(); + healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult }); + } + + var judgement = beatmap.HitObjects[0].CreateJudgement(); + healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult }); + + Assert.Multiple(() => + { + Assert.That(healthProcessor.Health.Value, Is.EqualTo(1)); + Assert.That(healthProcessor.HasFailed, Is.False); + }); + } } } From fc37c5e4c2bb4daa7a61714555a68b43930fc211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 20:18:32 +0100 Subject: [PATCH 157/651] Fix taiko maps containing only drum rolls / swells not being passable without mods Closes https://github.com/ppy/osu/issues/26370. As was noted in the issue thread stable does not attempt to account for such maps, and the maps are impassable in stable without No Fail. Nevertheless that seems like a pretty anti-player behaviour and I honestly believe that it is fine to change this in lazer. --- .../Scoring/TaikoHealthProcessor.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs b/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs index d75906f3aa..dfca4ac8c7 100644 --- a/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs +++ b/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs @@ -31,11 +31,39 @@ namespace osu.Game.Rulesets.Taiko.Scoring /// private double hpMissMultiplier; + /// + /// Sum of all achievable health increases throughout the map. + /// Used to determine if there are any objects that give health. + /// If there are none, health will be forcibly pulled up to 1 to avoid cases of impassable maps. + /// + private double sumOfMaxHealthIncreases; + public TaikoHealthProcessor() : base(0.5) { } + protected override void ApplyResultInternal(JudgementResult result) + { + base.ApplyResultInternal(result); + sumOfMaxHealthIncreases += result.Judgement.MaxHealthIncrease; + } + + protected override void RevertResultInternal(JudgementResult result) + { + base.RevertResultInternal(result); + sumOfMaxHealthIncreases -= result.Judgement.MaxHealthIncrease; + } + + protected override void Reset(bool storeResults) + { + base.Reset(storeResults); + + if (storeResults && sumOfMaxHealthIncreases == 0) + Health.Value = 1; + sumOfMaxHealthIncreases = 0; + } + public override void ApplyBeatmap(IBeatmap beatmap) { base.ApplyBeatmap(beatmap); From 1075b87fb8bfb84ce3404bf93253940992e86671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 22:19:20 +0100 Subject: [PATCH 158/651] Add failing test coverage --- .../Formats/LegacyScoreDecoderTest.cs | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs index 4e281cf28e..6e7c8c3631 100644 --- a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs +++ b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs @@ -3,14 +3,18 @@ #nullable disable +using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using NUnit.Framework; +using osu.Framework.Extensions; using osu.Framework.Utils; using osu.Game.Beatmaps; using osu.Game.Beatmaps.Formats; +using osu.Game.Beatmaps.Legacy; +using osu.Game.IO.Legacy; using osu.Game.Replays; using osu.Game.Rulesets; using osu.Game.Rulesets.Catch; @@ -247,6 +251,123 @@ namespace osu.Game.Tests.Beatmaps.Formats }); } + [Test] + public void AccuracyAndRankOfStableScorePreserved() + { + var memoryStream = new MemoryStream(); + + // local partial implementation of legacy score encoder + // this is done half for readability, half because `LegacyScoreEncoder` forces `LATEST_VERSION` + // and we want to emulate a stable score here + using (var sw = new SerializationWriter(memoryStream, true)) + { + sw.Write((byte)0); // ruleset id (osu!) + sw.Write(20240116); // version (anything below `LegacyScoreEncoder.FIRST_LAZER_VERSION` is stable) + sw.Write(string.Empty.ComputeMD5Hash()); // beatmap hash, irrelevant to this test + sw.Write("username"); // irrelevant to this test + sw.Write(string.Empty.ComputeMD5Hash()); // score hash, irrelevant to this test + sw.Write((ushort)198); // count300 + sw.Write((ushort)1); // count100 + sw.Write((ushort)0); // count50 + sw.Write((ushort)0); // countGeki + sw.Write((ushort)0); // countKatu + sw.Write((ushort)1); // countMiss + sw.Write(12345678); // total score, irrelevant to this test + sw.Write((ushort)1000); // max combo, irrelevant to this test + sw.Write(false); // full combo, irrelevant to this test + sw.Write((int)LegacyMods.Hidden); // mods + sw.Write(string.Empty); // hp graph, irrelevant + sw.Write(DateTime.Now); // date, irrelevant + sw.Write(Array.Empty()); // replay data, irrelevant + sw.Write((long)1234); // legacy online ID, irrelevant + } + + memoryStream.Seek(0, SeekOrigin.Begin); + var decoded = new TestLegacyScoreDecoder().Parse(memoryStream); + + Assert.Multiple(() => + { + Assert.That(decoded.ScoreInfo.Accuracy, Is.EqualTo((double)(198 * 300 + 100) / (200 * 300))); + Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.A)); + }); + } + + [Test] + public void AccuracyAndRankOfLazerScorePreserved() + { + var ruleset = new OsuRuleset().RulesetInfo; + + var scoreInfo = TestResources.CreateTestScoreInfo(ruleset); + scoreInfo.Mods = new Mod[] { new OsuModFlashlight() }; + scoreInfo.Statistics = new Dictionary + { + [HitResult.Great] = 199, + [HitResult.Miss] = 1, + [HitResult.LargeTickHit] = 1, + }; + scoreInfo.MaximumStatistics = new Dictionary + { + [HitResult.Great] = 200, + [HitResult.LargeTickHit] = 1, + }; + + var beatmap = new TestBeatmap(ruleset); + var score = new Score + { + ScoreInfo = scoreInfo, + }; + + var decodedAfterEncode = encodeThenDecode(LegacyBeatmapDecoder.LATEST_VERSION, score, beatmap); + + Assert.Multiple(() => + { + Assert.That(decodedAfterEncode.ScoreInfo.Accuracy, Is.EqualTo((double)(199 * 300 + 30) / (200 * 300 + 30))); + Assert.That(decodedAfterEncode.ScoreInfo.Rank, Is.EqualTo(ScoreRank.SH)); + }); + } + + [Test] + public void AccuracyAndRankOfLazerScoreWithoutLegacyReplaySoloScoreInfoUsesBestEffortFallbackToLegacy() + { + var memoryStream = new MemoryStream(); + + // local partial implementation of legacy score encoder + // this is done half for readability, half because we want to emulate an old lazer score here + // that does not have everything that `LegacyScoreEncoder` now writes to the replay + using (var sw = new SerializationWriter(memoryStream, true)) + { + sw.Write((byte)0); // ruleset id (osu!) + sw.Write(LegacyScoreEncoder.FIRST_LAZER_VERSION); // version + sw.Write(string.Empty.ComputeMD5Hash()); // beatmap hash, irrelevant to this test + sw.Write("username"); // irrelevant to this test + sw.Write(string.Empty.ComputeMD5Hash()); // score hash, irrelevant to this test + sw.Write((ushort)198); // count300 + sw.Write((ushort)0); // count100 + sw.Write((ushort)1); // count50 + sw.Write((ushort)0); // countGeki + sw.Write((ushort)0); // countKatu + sw.Write((ushort)1); // countMiss + sw.Write(12345678); // total score, irrelevant to this test + sw.Write((ushort)1000); // max combo, irrelevant to this test + sw.Write(false); // full combo, irrelevant to this test + sw.Write((int)LegacyMods.Hidden); // mods + sw.Write(string.Empty); // hp graph, irrelevant + sw.Write(DateTime.Now); // date, irrelevant + sw.Write(Array.Empty()); // replay data, irrelevant + sw.Write((long)1234); // legacy online ID, irrelevant + // importantly, no compressed `LegacyReplaySoloScoreInfo` here + } + + memoryStream.Seek(0, SeekOrigin.Begin); + var decoded = new TestLegacyScoreDecoder().Parse(memoryStream); + + Assert.Multiple(() => + { + Assert.That(decoded.ScoreInfo.Accuracy, Is.EqualTo((double)(198 * 300 + 50) / (200 * 300))); + Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.A)); + }); + } + private static Score encodeThenDecode(int beatmapVersion, Score score, TestBeatmap beatmap) { var encodeStream = new MemoryStream(); From 17b9d842ab9a051ff6bc43d4ac5eb3d90dedfd93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 16 Jan 2024 21:08:02 +0100 Subject: [PATCH 159/651] Fix incorrect accuracy and rank population when decoding lazer replays Closes https://github.com/ppy/osu/issues/24061. The gist of this change is that if the `LegacyReplaySoloScoreInfo` bolt-on is present in the replay, then it can (and is) used to recompute the accuracy, and rank is computed based on that. This was the missing part of https://github.com/ppy/osu/issues/24061#issuecomment-1888438151. The accuracy would change on import before that because the encode process is _lossy_ if the `LegacyReplaySoloScoreInfo` bolt-on is not used, as the legacy format only has 6 fields for encoding judgement counts, and some judgements that affect accuracy in lazer do not fit into that. Note that this _only_ fixes _relatively_ new lazer scores looking wrong after reimport. - Very old lazer scores, i.e. ones that don't have the `LegacyReplaySoloScoreInfo` bolt-on, obviously can't use it to repopulate. There's really not much good that can be done there, so the stable pathways are used as a fallback that always works. - For stable replays, `ScoreImporter` recalculates the accuracy of the score _again_ in https://github.com/ppy/osu/blob/15a5fd7e4c8e8e3c38382cfd3d5d676d107d7908/osu.Game/Scoring/ScoreImporter.cs#L106-L110 as `StandardisedScoreMigrationTools.UpdateFromLegacy()` recomputes _both_ total score and accuracy. This makes a _semblance_ of sense as it attempts to make the accuracy of stable and lazer replays comparable. In most cases it also won't matter, as the only ruleset where accuracy changed between the legacy implementation and current lazer accuracy is mania. But it is also an inaccurate process (as, again, some of the required data is not in the replay, namely judgement counts of ticks and so on). For whatever's worth, a similar thing happens server-side in https://github.com/ppy/osu-queue-score-statistics/blob/106c2948dbe695efcad5972d32cd46f4b36005cc/osu.Server.Queues.ScoreStatisticsProcessor/Commands/Queue/BatchInserter.cs#L319 - However, _ranks_ of stable scores will still use the local stable reimplementation of ranks, i.e. a 1-miss stable score in osu! ruleset will be an A rather than an S. See importer: https://github.com/ppy/osu-queue-score-statistics/blob/106c2948dbe695efcad5972d32cd46f4b36005cc/osu.Server.Queues.ScoreStatisticsProcessor/Commands/Queue/BatchInserter.cs#L237 (it's the same method which is renamed to `PopulateLegacyAccuracyAndRank()` in this commit). That is all a bit of a mess honestly, but I'm not sure where to even begin there... --- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index ed11691674..b30fc7aee1 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -11,6 +11,7 @@ using Newtonsoft.Json; using osu.Game.Beatmaps; using osu.Game.Beatmaps.Formats; using osu.Game.Beatmaps.Legacy; +using osu.Game.Database; using osu.Game.IO.Legacy; using osu.Game.Online.API.Requests.Responses; using osu.Game.Replays; @@ -37,6 +38,7 @@ namespace osu.Game.Scoring.Legacy }; WorkingBeatmap workingBeatmap; + byte[] compressedScoreInfo = null; using (SerializationReader sr = new SerializationReader(stream)) { @@ -105,8 +107,6 @@ namespace osu.Game.Scoring.Legacy else if (version >= 20121008) scoreInfo.LegacyOnlineID = sr.ReadInt32(); - byte[] compressedScoreInfo = null; - if (version >= 30000001) compressedScoreInfo = sr.ReadByteArray(); @@ -130,7 +130,10 @@ namespace osu.Game.Scoring.Legacy } } - PopulateAccuracy(score.ScoreInfo); + if (score.ScoreInfo.IsLegacyScore || compressedScoreInfo == null) + PopulateLegacyAccuracyAndRank(score.ScoreInfo); + else + populateLazerAccuracyAndRank(score.ScoreInfo); // before returning for database import, we must restore the database-sourced BeatmapInfo. // if not, the clone operation in GetPlayableBeatmap will cause a dereference and subsequent database exception. @@ -174,7 +177,7 @@ namespace osu.Game.Scoring.Legacy /// Legacy use only. /// /// The to populate. - public static void PopulateAccuracy(ScoreInfo score) + public static void PopulateLegacyAccuracyAndRank(ScoreInfo score) { int countMiss = score.GetCountMiss() ?? 0; int count50 = score.GetCount50() ?? 0; @@ -273,6 +276,18 @@ namespace osu.Game.Scoring.Legacy } } + private void populateLazerAccuracyAndRank(ScoreInfo scoreInfo) + { + scoreInfo.Accuracy = StandardisedScoreMigrationTools.ComputeAccuracy(scoreInfo); + + var rank = currentRuleset.CreateScoreProcessor().RankFromAccuracy(scoreInfo.Accuracy); + + foreach (var mod in scoreInfo.Mods.OfType()) + rank = mod.AdjustRank(rank, scoreInfo.Accuracy); + + scoreInfo.Rank = rank; + } + private void readLegacyReplay(Replay replay, StreamReader reader) { float lastTime = beatmapOffset; From 9cde04c30c964a62d7e1e92c0c05f3726b8acf17 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 14:12:12 +0900 Subject: [PATCH 160/651] Change drag adjustments to be linear (and account for partial deltas) --- osu.Game/Overlays/Volume/VolumeMeter.cs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/Volume/VolumeMeter.cs b/osu.Game/Overlays/Volume/VolumeMeter.cs index 6ad314c601..a5b496b7d8 100644 --- a/osu.Game/Overlays/Volume/VolumeMeter.cs +++ b/osu.Game/Overlays/Volume/VolumeMeter.cs @@ -309,24 +309,37 @@ namespace osu.Game.Overlays.Volume private const double max_acceleration = 5; private const double acceleration_multiplier = 1.8; - private const float mouse_drag_divisor = 20; - private ScheduledDelegate accelerationDebounce; private void resetAcceleration() => accelerationModifier = 1; + private float dragDelta = 0; + protected override bool OnDragStart(DragStartEvent e) { - adjust(-e.Delta.Y / mouse_drag_divisor, true); + dragDelta = 0; + adjustFromDrag(e.Delta); return true; } protected override void OnDrag(DragEvent e) { - adjust(-e.Delta.Y / mouse_drag_divisor, true); + adjustFromDrag(e.Delta); base.OnDrag(e); } + private void adjustFromDrag(Vector2 delta) + { + const float mouse_drag_divisor = 200; + + dragDelta += delta.Y / mouse_drag_divisor; + + if (Math.Abs(dragDelta) < 0.01) return; + + Volume -= dragDelta; + dragDelta = 0; + } + private void adjust(double delta, bool isPrecise) { if (delta == 0) From f11682d44f769fe480ae1bfcfc7f324208fd49a7 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 08:10:02 +0300 Subject: [PATCH 161/651] Add failing test case --- .../Visual/Editing/TestSceneTimingScreen.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs b/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs index 40aadc8164..56c8c05fe6 100644 --- a/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs +++ b/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs @@ -4,11 +4,13 @@ #nullable disable using System; +using System.Diagnostics; using System.Linq; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.UserInterface; using osu.Framework.Testing; using osu.Game.Beatmaps.ControlPoints; using osu.Game.Graphics.Containers; @@ -177,6 +179,43 @@ namespace osu.Game.Tests.Visual.Editing AddUntilStep("Scrolled to end", () => timingScreen.ChildrenOfType().First().IsScrolledToEnd()); } + [Test] + public void TestEditThenClickAway() + { + AddStep("Add two control points", () => + { + editorBeatmap.ControlPointInfo.Clear(); + editorBeatmap.ControlPointInfo.Add(1000, new TimingControlPoint()); + editorBeatmap.ControlPointInfo.Add(2000, new TimingControlPoint()); + }); + + AddStep("Select second timing point", () => + { + InputManager.MoveMouseTo(Child.ChildrenOfType().Last()); + InputManager.Click(MouseButton.Left); + }); + + AddStep("Scroll to end", () => timingScreen.ChildrenOfType().Single().ChildrenOfType().Single().ScrollToEnd(false)); + AddStep("Modify time signature", () => + { + var timeSignatureTextBox = Child.ChildrenOfType().Single().ChildrenOfType().Single(); + InputManager.MoveMouseTo(timeSignatureTextBox); + InputManager.Click(MouseButton.Left); + + Debug.Assert(!timeSignatureTextBox.Current.Value.Equals("1")); + timeSignatureTextBox.Current.Value = "1"; + }); + + AddStep("Select first timing point", () => + { + InputManager.MoveMouseTo(Child.ChildrenOfType().First()); + InputManager.Click(MouseButton.Left); + }); + + AddAssert("Second timing point changed time signature", () => editorBeatmap.ControlPointInfo.TimingPoints.Last().TimeSignature.Numerator == 1); + AddAssert("First timing point preserved time signature", () => editorBeatmap.ControlPointInfo.TimingPoints.First().TimeSignature.Numerator == 4); + } + protected override void Dispose(bool isDisposing) { Beatmap.Disabled = false; From 46429c5074b05447f8934dd25bd26fcce5e46dec Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 08:10:37 +0300 Subject: [PATCH 162/651] Schedule control point switch for settings modifications to apply first --- osu.Game/Screens/Edit/Timing/ControlPointTable.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Edit/Timing/ControlPointTable.cs b/osu.Game/Screens/Edit/Timing/ControlPointTable.cs index 7a27056da3..219575a380 100644 --- a/osu.Game/Screens/Edit/Timing/ControlPointTable.cs +++ b/osu.Game/Screens/Edit/Timing/ControlPointTable.cs @@ -44,11 +44,12 @@ namespace osu.Game.Screens.Edit.Timing { BackgroundFlow.Add(new RowBackground(group) { - Action = () => + // schedule to give time for any modified focused text box to lose focus and commit changes (e.g. BPM / time signature textboxes) before switching to new point. + Action = () => Schedule(() => { SetSelectedRow(group); clock.SeekSmoothlyTo(group.Time); - } + }) }); } From a34d2a3424eec99dec0efb44ae91844348f46f22 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 08:28:47 +0300 Subject: [PATCH 163/651] Add small volume meter to test feel --- .../Visual/UserInterface/TestSceneVolumePieces.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneVolumePieces.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneVolumePieces.cs index 311bae0d50..b85e4c19d1 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneVolumePieces.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneVolumePieces.cs @@ -14,7 +14,7 @@ namespace osu.Game.Tests.Visual.UserInterface { VolumeMeter meter; MuteButton mute; - Add(meter = new VolumeMeter("MASTER", 125, Color4.Blue) { Position = new Vector2(10) }); + Add(meter = new VolumeMeter("MASTER", 125, Color4.Green) { Position = new Vector2(10) }); AddSliderStep("master volume", 0, 10, 0, i => meter.Bindable.Value = i * 0.1); Add(new VolumeMeter("BIG", 250, Color4.Red) @@ -22,6 +22,15 @@ namespace osu.Game.Tests.Visual.UserInterface Anchor = Anchor.Centre, Origin = Anchor.Centre, Position = new Vector2(10), + Margin = new MarginPadding { Left = 250 }, + }); + + Add(new VolumeMeter("SML", 125, Color4.Blue) + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Position = new Vector2(10), + Margin = new MarginPadding { Right = 500 }, }); Add(mute = new MuteButton From 1790a5df03719e0483d4abede98460f4874bb65f Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 08:29:55 +0300 Subject: [PATCH 164/651] Remove redundant value to appease CI --- osu.Game/Overlays/Volume/VolumeMeter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Volume/VolumeMeter.cs b/osu.Game/Overlays/Volume/VolumeMeter.cs index a5b496b7d8..9ca4c25ab9 100644 --- a/osu.Game/Overlays/Volume/VolumeMeter.cs +++ b/osu.Game/Overlays/Volume/VolumeMeter.cs @@ -313,7 +313,7 @@ namespace osu.Game.Overlays.Volume private void resetAcceleration() => accelerationModifier = 1; - private float dragDelta = 0; + private float dragDelta; protected override bool OnDragStart(DragStartEvent e) { From 05729706eb2633b74dbb97d3e2615f85cd2721e5 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 08:53:24 +0300 Subject: [PATCH 165/651] Fix android build CI failing No idea why this is only in android, but okay. --- osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs b/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs index 56c8c05fe6..f3d2b5d518 100644 --- a/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs +++ b/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs @@ -202,7 +202,7 @@ namespace osu.Game.Tests.Visual.Editing InputManager.MoveMouseTo(timeSignatureTextBox); InputManager.Click(MouseButton.Left); - Debug.Assert(!timeSignatureTextBox.Current.Value.Equals("1")); + Debug.Assert(!timeSignatureTextBox.Current.Value.Equals("1", StringComparison.Ordinal)); timeSignatureTextBox.Current.Value = "1"; }); From 42f64c2c44f34bceb9fbbadb8a5cb6d2f8ed04aa Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 14:48:33 +0900 Subject: [PATCH 166/651] Move load procedure to async method and simplify code --- .../Screens/Play/HUD/PlayerSettingsOverlay.cs | 2 ++ osu.Game/Screens/Play/ReplayPlayer.cs | 20 ++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs index b7f3dc36c3..8c74b0254d 100644 --- a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs +++ b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs @@ -41,5 +41,7 @@ namespace osu.Game.Screens.Play.HUD protected override void PopIn() => this.FadeIn(fade_duration); protected override void PopOut() => this.FadeOut(fade_duration); + + public void Insert(int i, PlayerSettingsGroup drawable) => content.Insert(i, drawable); } } diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index f6e4ac489a..39df223a9d 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; @@ -50,18 +51,19 @@ namespace osu.Game.Screens.Play this.createScore = createScore; } - protected override void LoadComplete() + [BackgroundDependencyLoader] + private void load() { - base.LoadComplete(); - - if (HUDOverlay != null) + var playbackSettings = new PlaybackSettings { - var playerSettingsOverlay = new PlaybackSettings { Expanded = { Value = false } }; - HUDOverlay.PlayerSettingsOverlay.Add(playerSettingsOverlay); + Depth = float.MaxValue, + Expanded = { Value = false } + }; - if (GameplayClockContainer is MasterGameplayClockContainer master) - playerSettingsOverlay.UserPlaybackRate.BindTarget = master.UserPlaybackRate; - } + if (GameplayClockContainer is MasterGameplayClockContainer master) + playbackSettings.UserPlaybackRate.BindTo(master.UserPlaybackRate); + + HUDOverlay.PlayerSettingsOverlay.Insert(-1, playbackSettings); } protected override void PrepareReplay() From 042e852a3ec027721a80817a7d3a9538df5904ff Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 14:53:49 +0900 Subject: [PATCH 167/651] Adjust playback speed range to allow slower minimum speed --- osu.Game/Screens/Play/MasterGameplayClockContainer.cs | 4 ++-- osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs index 8b8bf87436..1b7588d81a 100644 --- a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs +++ b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs @@ -35,9 +35,9 @@ namespace osu.Game.Screens.Play public readonly BindableNumber UserPlaybackRate = new BindableDouble(1) { - MinValue = 0.5, + MinValue = 0.05, MaxValue = 2, - Precision = 0.1, + Precision = 0.01, }; /// diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 0fe3a08985..2f37b8877f 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -22,9 +22,9 @@ namespace osu.Game.Screens.Play.PlayerSettings public readonly Bindable UserPlaybackRate = new BindableDouble(1) { - MinValue = 0.5, + MinValue = 0.05, MaxValue = 2, - Precision = 0.1, + Precision = 0.01, }; private readonly PlayerSliderBar rateSlider; @@ -149,7 +149,7 @@ namespace osu.Game.Screens.Play.PlayerSettings protected override void LoadComplete() { base.LoadComplete(); - rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.0}x", true); + rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.00}x", true); if (gameplayClock != null) isPaused.BindTarget = gameplayClock.IsPaused; From e53989faebebb0bf323cac4a0f76e6bebd042939 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 14:54:14 +0900 Subject: [PATCH 168/651] Change replay playback adjustment to skew frequency, not tempo --- osu.Game/Screens/Play/MasterGameplayClockContainer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs index 1b7588d81a..1159e5f6d9 100644 --- a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs +++ b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs @@ -274,7 +274,7 @@ namespace osu.Game.Screens.Play track.BindAdjustments(AdjustmentsFromMods); track.AddAdjustment(AdjustableProperty.Frequency, GameplayClock.ExternalPauseFrequencyAdjust); - track.AddAdjustment(AdjustableProperty.Tempo, UserPlaybackRate); + track.AddAdjustment(AdjustableProperty.Frequency, UserPlaybackRate); speedAdjustmentsApplied = true; } @@ -286,7 +286,7 @@ namespace osu.Game.Screens.Play track.UnbindAdjustments(AdjustmentsFromMods); track.RemoveAdjustment(AdjustableProperty.Frequency, GameplayClock.ExternalPauseFrequencyAdjust); - track.RemoveAdjustment(AdjustableProperty.Tempo, UserPlaybackRate); + track.RemoveAdjustment(AdjustableProperty.Frequency, UserPlaybackRate); speedAdjustmentsApplied = false; } From 2788bd912e87068c370b27ff40333bda3c85139a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 15:12:33 +0900 Subject: [PATCH 169/651] Add tooltips and localisation --- .../PlayerSettingsOverlayStrings.cs | 24 +++++++++++++++++++ .../Play/PlayerSettings/PlaybackSettings.cs | 19 ++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 osu.Game/Localisation/PlayerSettingsOverlayStrings.cs diff --git a/osu.Game/Localisation/PlayerSettingsOverlayStrings.cs b/osu.Game/Localisation/PlayerSettingsOverlayStrings.cs new file mode 100644 index 0000000000..1aedd9fc5b --- /dev/null +++ b/osu.Game/Localisation/PlayerSettingsOverlayStrings.cs @@ -0,0 +1,24 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Localisation; + +namespace osu.Game.Localisation +{ + public static class PlayerSettingsOverlayStrings + { + private const string prefix = @"osu.Game.Resources.Localisation.PlaybackSettings"; + + /// + /// "Seek backward {0} seconds" + /// + public static LocalisableString SeekBackwardSeconds(double arg0) => new TranslatableString(getKey(@"seek_backward_seconds"), @"Seek backward {0} seconds", arg0); + + /// + /// "Seek forward {0} seconds" + /// + public static LocalisableString SeekForwardSeconds(double arg0) => new TranslatableString(getKey(@"seek_forward_seconds"), @"Seek forward {0} seconds", arg0); + + private static string getKey(string key) => $@"{prefix}:{key}"; + } +} diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 2f37b8877f..44cfa8d811 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -13,6 +13,7 @@ using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Screens.Edit.Timing; using osuTK; +using osu.Game.Localisation; namespace osu.Game.Screens.Play.PlayerSettings { @@ -71,6 +72,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastBackward, Action = () => seek(-1, seek_fast_amount), + TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(seek_fast_amount / 1000), }, new SeekButton { @@ -78,6 +80,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.Backward, Action = () => seek(-1, seek_amount), + TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(seek_amount / 1000), }, play = new IconButton { @@ -103,6 +106,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.Forward, Action = () => seek(1, seek_amount), + TooltipText = PlayerSettingsOverlayStrings.SeekForwardSeconds(seek_amount / 1000), }, new SeekButton { @@ -110,6 +114,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastForward, Action = () => seek(1, seek_fast_amount), + TooltipText = PlayerSettingsOverlayStrings.SeekForwardSeconds(seek_fast_amount / 1000), }, }, }, @@ -137,7 +142,19 @@ namespace osu.Game.Screens.Play.PlayerSettings }, }; - isPaused.BindValueChanged(e => play.Icon = !e.NewValue ? FontAwesome.Regular.PauseCircle : FontAwesome.Regular.PlayCircle, true); + isPaused.BindValueChanged(paused => + { + if (!paused.NewValue) + { + play.TooltipText = ToastStrings.PauseTrack; + play.Icon = FontAwesome.Regular.PauseCircle; + } + else + { + play.TooltipText = ToastStrings.PlayTrack; + play.Icon = FontAwesome.Regular.PlayCircle; + } + }, true); void seek(int direction, double amount) { From e7732caaf79a90c15354502ab307e8927373a46e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 15:13:59 +0900 Subject: [PATCH 170/651] Make `PlayerSettingsOverlay`'s api more stringent --- osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs | 2 +- osu.Game/Screens/Play/ReplayPlayer.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs index 8c74b0254d..a2b49f6302 100644 --- a/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs +++ b/osu.Game/Screens/Play/HUD/PlayerSettingsOverlay.cs @@ -42,6 +42,6 @@ namespace osu.Game.Screens.Play.HUD protected override void PopIn() => this.FadeIn(fade_duration); protected override void PopOut() => this.FadeOut(fade_duration); - public void Insert(int i, PlayerSettingsGroup drawable) => content.Insert(i, drawable); + public void AddAtStart(PlayerSettingsGroup drawable) => content.Insert(-1, drawable); } } diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index 39df223a9d..69913c6555 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -63,7 +63,7 @@ namespace osu.Game.Screens.Play if (GameplayClockContainer is MasterGameplayClockContainer master) playbackSettings.UserPlaybackRate.BindTo(master.UserPlaybackRate); - HUDOverlay.PlayerSettingsOverlay.Insert(-1, playbackSettings); + HUDOverlay.PlayerSettingsOverlay.AddAtStart(playbackSettings); } protected override void PrepareReplay() From 266c7b28e807978ad2e71e664afd454ce5c4dc3d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 15:38:51 +0900 Subject: [PATCH 171/651] Show an empty baetmap instead of nothing --- osu.Game.Tournament/Components/SongBar.cs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tournament/Components/SongBar.cs b/osu.Game.Tournament/Components/SongBar.cs index cc1d00f62f..ae59e92e33 100644 --- a/osu.Game.Tournament/Components/SongBar.cs +++ b/osu.Game.Tournament/Components/SongBar.cs @@ -12,6 +12,7 @@ using osu.Game.Beatmaps; using osu.Game.Beatmaps.Legacy; using osu.Game.Extensions; using osu.Game.Graphics; +using osu.Game.Models; using osu.Game.Rulesets; using osu.Game.Screens.Menu; using osuTK; @@ -101,11 +102,25 @@ namespace osu.Game.Tournament.Components private void refreshContent() { - if (beatmap == null) + beatmap ??= new BeatmapInfo { - flow.Clear(); - return; - } + Metadata = new BeatmapMetadata + { + Artist = "unknown", + Title = "no beatmap selected", + Author = new RealmUser { Username = "unknown" }, + }, + DifficultyName = "unknown", + BeatmapSet = new BeatmapSetInfo(), + StarRating = 0, + Difficulty = new BeatmapDifficulty + { + CircleSize = 0, + DrainRate = 0, + OverallDifficulty = 0, + ApproachRate = 0, + }, + }; double bpm = beatmap.BPM; double length = beatmap.Length; From 06aa35a10e106997521389f26d59aadd1047c7d7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 16:26:01 +0900 Subject: [PATCH 172/651] Fix tournament beatmap backgrounds occasionally not loading --- osu.Game.Tournament/Components/TournamentBeatmapPanel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs b/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs index 4e0adb30ac..514ba482c4 100644 --- a/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs +++ b/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs @@ -194,7 +194,7 @@ namespace osu.Game.Tournament.Components // Use DelayedLoadWrapper to avoid content unloading when switching away to another screen. protected override DelayedLoadWrapper CreateDelayedLoadWrapper(Func createContentFunc, double timeBeforeLoad) - => new DelayedLoadWrapper(createContentFunc, timeBeforeLoad); + => new DelayedLoadWrapper(createContentFunc(), timeBeforeLoad); } } } From e97b31d82e9aa6c9dace49742ff3c246d27c3368 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 16:40:45 +0900 Subject: [PATCH 173/651] Fix test failures --- osu.Game/Screens/Play/ReplayPlayer.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index 69913c6555..805f907466 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -54,6 +54,9 @@ namespace osu.Game.Screens.Play [BackgroundDependencyLoader] private void load() { + if (!LoadedBeatmapSuccessfully) + return; + var playbackSettings = new PlaybackSettings { Depth = float.MaxValue, From fe06402951ada9980fe5c02308cab9423bacfa20 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 16:50:48 +0900 Subject: [PATCH 174/651] Fix incorrect bindable usage --- osu.Game/Overlays/Login/LoginPanel.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs index 7db3644de6..ea65656eb1 100644 --- a/osu.Game/Overlays/Login/LoginPanel.cs +++ b/osu.Game/Overlays/Login/LoginPanel.cs @@ -38,6 +38,7 @@ namespace osu.Game.Overlays.Login public Action? RequestHide; private readonly IBindable apiState = new Bindable(); + private readonly Bindable userStatus = new Bindable(); [Resolved] private IAPIProvider api { get; set; } = null!; @@ -139,7 +140,8 @@ namespace osu.Game.Overlays.Login }, }; - api.LocalUser.Value.Status.BindValueChanged(e => updateDropdownCurrent(e.NewValue), true); + userStatus.BindTo(api.LocalUser.Value.Status); + userStatus.BindValueChanged(e => updateDropdownCurrent(e.NewValue), true); dropdown.Current.BindValueChanged(action => { From 66c7a29e794197478a597922bbc6c7028515b304 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 16:57:22 +0900 Subject: [PATCH 175/651] Add comment about messy methods --- osu.Game/Users/UserPanel.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Users/UserPanel.cs b/osu.Game/Users/UserPanel.cs index ef5c95c422..b88619c8b7 100644 --- a/osu.Game/Users/UserPanel.cs +++ b/osu.Game/Users/UserPanel.cs @@ -98,6 +98,8 @@ namespace osu.Game.Users }; } + // TODO: this whole api is messy. half these Create methods are expected to by the implementation and half are implictly called. + protected abstract Drawable CreateLayout(); /// From 353df2f31227a71da752e40dbdcb650e288e889d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 17:00:30 +0900 Subject: [PATCH 176/651] Fix one more incorrect bindable flow and simplify string setters --- osu.Game/Users/UserRankPanel.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/osu.Game/Users/UserRankPanel.cs b/osu.Game/Users/UserRankPanel.cs index a2e234cf82..a38962dfc7 100644 --- a/osu.Game/Users/UserRankPanel.cs +++ b/osu.Game/Users/UserRankPanel.cs @@ -2,11 +2,11 @@ // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; +using osu.Framework.Bindables; using osu.Framework.Extensions.LocalisationExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Events; -using osu.Framework.Localisation; using osu.Game.Online.API; using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays.Profile.Header.Components; @@ -30,6 +30,8 @@ namespace osu.Game.Users private ProfileValueDisplay globalRankDisplay = null!; private ProfileValueDisplay countryRankDisplay = null!; + private readonly IBindable statistics = new Bindable(); + public UserRankPanel(APIUser user) : base(user) { @@ -42,11 +44,12 @@ namespace osu.Game.Users { BorderColour = ColourProvider?.Light1 ?? Colours.GreyVioletLighter; - api.Statistics.ValueChanged += e => + statistics.BindTo(api.Statistics); + statistics.BindValueChanged(stats => { - globalRankDisplay.Content = e.NewValue?.GlobalRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-"; - countryRankDisplay.Content = e.NewValue?.CountryRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-"; - }; + globalRankDisplay.Content = stats.NewValue?.GlobalRank?.ToLocalisableString("\\##,##0") ?? "-"; + countryRankDisplay.Content = stats.NewValue?.CountryRank?.ToLocalisableString("\\##,##0") ?? "-"; + }, true); } protected override Drawable CreateLayout() @@ -184,12 +187,10 @@ namespace osu.Game.Users globalRankDisplay = new ProfileValueDisplay(true) { Title = UsersStrings.ShowRankGlobalSimple, - Content = User.Statistics?.GlobalRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" }, countryRankDisplay = new ProfileValueDisplay(true) { Title = UsersStrings.ShowRankCountrySimple, - Content = User.Statistics?.CountryRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" } } } From 45e52854ca50d31182845f3de3ca9b6bd87cf86d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 17:37:35 +0900 Subject: [PATCH 177/651] Change key overlay to use the ordering provided by rulesets osu!mania already goes out of its way to order things correctly. Arguably, osu!taiko just did it wrong. --- osu.Game/Rulesets/UI/RulesetInputManager.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Rulesets/UI/RulesetInputManager.cs b/osu.Game/Rulesets/UI/RulesetInputManager.cs index 35d05b87c0..041c7a13ae 100644 --- a/osu.Game/Rulesets/UI/RulesetInputManager.cs +++ b/osu.Game/Rulesets/UI/RulesetInputManager.cs @@ -167,7 +167,6 @@ namespace osu.Game.Rulesets.UI var triggers = KeyBindingContainer.DefaultKeyBindings .Select(b => b.GetAction()) .Distinct() - .OrderBy(action => action) .Select(action => new KeyCounterActionTrigger(action)) .ToArray(); From a4c0bfd099bb6a5140e1513cb5ac640c085082bd Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 17:37:20 +0900 Subject: [PATCH 178/651] Change taiko's default key ordering to better match display order Fixes the issue originally fixed via https://github.com/ppy/osu/pull/10553 in a slightly different way, allowing more flexibility. --- osu.Game.Rulesets.Taiko/TaikoRuleset.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs index ad3b7b09f7..b80d8218f5 100644 --- a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs +++ b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs @@ -69,11 +69,11 @@ namespace osu.Game.Rulesets.Taiko public override IEnumerable GetDefaultKeyBindings(int variant = 0) => new[] { - new KeyBinding(InputKey.MouseLeft, TaikoAction.LeftCentre), - new KeyBinding(InputKey.MouseRight, TaikoAction.LeftRim), new KeyBinding(InputKey.D, TaikoAction.LeftRim), new KeyBinding(InputKey.F, TaikoAction.LeftCentre), + new KeyBinding(InputKey.MouseLeft, TaikoAction.LeftCentre), new KeyBinding(InputKey.J, TaikoAction.RightCentre), + new KeyBinding(InputKey.MouseRight, TaikoAction.LeftRim), new KeyBinding(InputKey.K, TaikoAction.RightRim), }; From 123e36a999e90a2698c52b03bb55c0054235d1a4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 17:51:46 +0900 Subject: [PATCH 179/651] Change display text for beatmap audio offset adjust to make more sense --- osu.Game/Localisation/BeatmapOffsetControlStrings.cs | 4 ++-- osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Localisation/BeatmapOffsetControlStrings.cs b/osu.Game/Localisation/BeatmapOffsetControlStrings.cs index 632a1ad0ea..b905b7ae1c 100644 --- a/osu.Game/Localisation/BeatmapOffsetControlStrings.cs +++ b/osu.Game/Localisation/BeatmapOffsetControlStrings.cs @@ -10,9 +10,9 @@ namespace osu.Game.Localisation private const string prefix = @"osu.Game.Resources.Localisation.BeatmapOffsetControl"; /// - /// "Beatmap offset" + /// "Audio offset (this beatmap)" /// - public static LocalisableString BeatmapOffset => new TranslatableString(getKey(@"beatmap_offset"), @"Beatmap offset"); + public static LocalisableString AudioOffsetThisBeatmap => new TranslatableString(getKey(@"beatmap_offset"), @"Audio offset (this beatmap)"); /// /// "Previous play:" diff --git a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs index 8efb80e771..7ac9c7186e 100644 --- a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs +++ b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs @@ -86,7 +86,7 @@ namespace osu.Game.Screens.Play.PlayerSettings new OffsetSliderBar { KeyboardStep = 5, - LabelText = BeatmapOffsetControlStrings.BeatmapOffset, + LabelText = BeatmapOffsetControlStrings.AudioOffsetThisBeatmap, Current = Current, }, referenceScoreContainer = new FillFlowContainer From cc7be137bc22415dbc3637189a638fb70910f014 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 17:57:49 +0900 Subject: [PATCH 180/651] Show tooltip on global offset adjust slider bar --- .../Settings/Sections/Audio/AudioOffsetAdjustControl.cs | 9 ++++++++- .../Screens/Play/PlayerSettings/BeatmapOffsetControl.cs | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs index 90f5a59215..ef1691534f 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs @@ -12,12 +12,14 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; +using osu.Framework.Localisation; using osu.Game.Configuration; using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterfaceV2; using osu.Game.Localisation; +using osu.Game.Screens.Play.PlayerSettings; using osuTK; namespace osu.Game.Overlays.Settings.Sections.Audio @@ -67,7 +69,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio Direction = FillDirection.Vertical, Children = new Drawable[] { - new TimeSlider + new OffsetSliderBar { RelativeSizeAxes = Axes.X, Current = { BindTarget = Current }, @@ -157,6 +159,11 @@ namespace osu.Game.Overlays.Settings.Sections.Audio : $@"Based on the last {averageHitErrorHistory.Count} play(s), the suggested offset is {SuggestedOffset.Value:N0} ms."; applySuggestion.Enabled.Value = SuggestedOffset.Value != null; } + + private partial class OffsetSliderBar : RoundedSliderBar + { + public override LocalisableString TooltipText => BeatmapOffsetControl.GetOffsetExplanatoryText(Current.Value); + } } } } diff --git a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs index 7ac9c7186e..9039604471 100644 --- a/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs +++ b/osu.Game/Screens/Play/PlayerSettings/BeatmapOffsetControl.cs @@ -307,7 +307,7 @@ namespace osu.Game.Screens.Play.PlayerSettings } } - public partial class OffsetSliderBar : PlayerSliderBar + private partial class OffsetSliderBar : PlayerSliderBar { protected override Drawable CreateControl() => new CustomSliderBar(); From a66ddc78136a877a697fec6d5232206db328439a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 18:18:53 +0900 Subject: [PATCH 181/651] Change rolling counters to use quicker easing types --- osu.Game/Graphics/UserInterface/PercentageCounter.cs | 2 +- osu.Game/Graphics/UserInterface/RollingCounter.cs | 2 +- osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs | 2 +- osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs | 2 +- osu.Game/Overlays/Mods/VerticalAttributeDisplay.cs | 2 +- osu.Game/Screens/Play/HUD/ArgonAccuracyCounter.cs | 3 +-- osu.Game/Screens/Play/HUD/ArgonComboCounter.cs | 3 +-- osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs | 3 +-- osu.Game/Screens/Play/HUD/BPMCounter.cs | 2 +- .../Play/HUD/ClicksPerSecond/ClicksPerSecondCounter.cs | 2 +- osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs | 2 +- osu.Game/Screens/Play/HUD/UnstableRateCounter.cs | 2 +- .../Ranking/Expanded/Statistics/AccuracyStatistic.cs | 7 ++++--- 13 files changed, 16 insertions(+), 18 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/PercentageCounter.cs b/osu.Game/Graphics/UserInterface/PercentageCounter.cs index ed06211e8f..1f9103b3bd 100644 --- a/osu.Game/Graphics/UserInterface/PercentageCounter.cs +++ b/osu.Game/Graphics/UserInterface/PercentageCounter.cs @@ -14,7 +14,7 @@ namespace osu.Game.Graphics.UserInterface /// public partial class PercentageCounter : RollingCounter { - protected override double RollingDuration => 750; + protected override double RollingDuration => 375; private float epsilon => 1e-10f; diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs index b80c0e3b58..e69727e047 100644 --- a/osu.Game/Graphics/UserInterface/RollingCounter.cs +++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs @@ -45,7 +45,7 @@ namespace osu.Game.Graphics.UserInterface /// /// Easing for the counter rollover animation. /// - protected virtual Easing RollingEasing => Easing.OutQuint; + protected virtual Easing RollingEasing => Easing.OutQuad; private T displayedCount; diff --git a/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs b/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs index 94dd96ec1c..b9e4896b21 100644 --- a/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs +++ b/osu.Game/Overlays/Mods/BeatmapAttributesDisplay.cs @@ -196,7 +196,7 @@ namespace osu.Game.Overlays.Mods private partial class BPMDisplay : RollingCounter { - protected override double RollingDuration => 500; + protected override double RollingDuration => 250; protected override LocalisableString FormatCount(double count) => count.ToLocalisableString("0 BPM"); diff --git a/osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs b/osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs index b599b53082..a86eba81e4 100644 --- a/osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs +++ b/osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs @@ -145,7 +145,7 @@ namespace osu.Game.Overlays.Mods private partial class EffectCounter : RollingCounter { - protected override double RollingDuration => 500; + protected override double RollingDuration => 250; protected override LocalisableString FormatCount(double count) => ModUtils.FormatScoreMultiplier(count); diff --git a/osu.Game/Overlays/Mods/VerticalAttributeDisplay.cs b/osu.Game/Overlays/Mods/VerticalAttributeDisplay.cs index 33b7eaae1c..a3e24b486f 100644 --- a/osu.Game/Overlays/Mods/VerticalAttributeDisplay.cs +++ b/osu.Game/Overlays/Mods/VerticalAttributeDisplay.cs @@ -124,7 +124,7 @@ namespace osu.Game.Overlays.Mods private partial class EffectCounter : RollingCounter { - protected override double RollingDuration => 500; + protected override double RollingDuration => 250; protected override LocalisableString FormatCount(double count) => count.ToLocalisableString("0.0#"); diff --git a/osu.Game/Screens/Play/HUD/ArgonAccuracyCounter.cs b/osu.Game/Screens/Play/HUD/ArgonAccuracyCounter.cs index 171aa3f44b..ca00ab12c7 100644 --- a/osu.Game/Screens/Play/HUD/ArgonAccuracyCounter.cs +++ b/osu.Game/Screens/Play/HUD/ArgonAccuracyCounter.cs @@ -17,8 +17,7 @@ namespace osu.Game.Screens.Play.HUD { public partial class ArgonAccuracyCounter : GameplayAccuracyCounter, ISerialisableDrawable { - protected override double RollingDuration => 500; - protected override Easing RollingEasing => Easing.OutQuint; + protected override double RollingDuration => 250; [SettingSource("Wireframe opacity", "Controls the opacity of the wire frames behind the digits.")] public BindableFloat WireframeOpacity { get; } = new BindableFloat(0.25f) diff --git a/osu.Game/Screens/Play/HUD/ArgonComboCounter.cs b/osu.Game/Screens/Play/HUD/ArgonComboCounter.cs index 1d6ca3c893..369c753cb0 100644 --- a/osu.Game/Screens/Play/HUD/ArgonComboCounter.cs +++ b/osu.Game/Screens/Play/HUD/ArgonComboCounter.cs @@ -21,8 +21,7 @@ namespace osu.Game.Screens.Play.HUD { private ArgonCounterTextComponent text = null!; - protected override double RollingDuration => 500; - protected override Easing RollingEasing => Easing.OutQuint; + protected override double RollingDuration => 250; [SettingSource("Wireframe opacity", "Controls the opacity of the wire frames behind the digits.")] public BindableFloat WireframeOpacity { get; } = new BindableFloat(0.25f) diff --git a/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs b/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs index f7ca218767..348327d710 100644 --- a/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs +++ b/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs @@ -18,8 +18,7 @@ namespace osu.Game.Screens.Play.HUD { private ArgonScoreTextComponent scoreText = null!; - protected override double RollingDuration => 500; - protected override Easing RollingEasing => Easing.OutQuint; + protected override double RollingDuration => 250; [SettingSource("Wireframe opacity", "Controls the opacity of the wire frames behind the digits.")] public BindableFloat WireframeOpacity { get; } = new BindableFloat(0.25f) diff --git a/osu.Game/Screens/Play/HUD/BPMCounter.cs b/osu.Game/Screens/Play/HUD/BPMCounter.cs index cd24237493..9cd285db4c 100644 --- a/osu.Game/Screens/Play/HUD/BPMCounter.cs +++ b/osu.Game/Screens/Play/HUD/BPMCounter.cs @@ -18,7 +18,7 @@ namespace osu.Game.Screens.Play.HUD { public partial class BPMCounter : RollingCounter, ISerialisableDrawable { - protected override double RollingDuration => 750; + protected override double RollingDuration => 375; [Resolved] private IBindable beatmap { get; set; } = null!; diff --git a/osu.Game/Screens/Play/HUD/ClicksPerSecond/ClicksPerSecondCounter.cs b/osu.Game/Screens/Play/HUD/ClicksPerSecond/ClicksPerSecondCounter.cs index 9b5ea309b0..a1cccdef0a 100644 --- a/osu.Game/Screens/Play/HUD/ClicksPerSecond/ClicksPerSecondCounter.cs +++ b/osu.Game/Screens/Play/HUD/ClicksPerSecond/ClicksPerSecondCounter.cs @@ -19,7 +19,7 @@ namespace osu.Game.Screens.Play.HUD.ClicksPerSecond [Resolved] private ClicksPerSecondController controller { get; set; } = null!; - protected override double RollingDuration => 350; + protected override double RollingDuration => 175; public bool UsesFixedAnchor { get; set; } diff --git a/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs b/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs index 82f116b4ae..f041e120f6 100644 --- a/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs +++ b/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs @@ -41,7 +41,7 @@ namespace osu.Game.Screens.Play.HUD protected override bool IsRollingProportional => true; - protected override double RollingDuration => 1000; + protected override double RollingDuration => 500; private const float alpha_when_invalid = 0.3f; diff --git a/osu.Game/Screens/Play/HUD/UnstableRateCounter.cs b/osu.Game/Screens/Play/HUD/UnstableRateCounter.cs index 701b8a8732..ab7ab6b3a0 100644 --- a/osu.Game/Screens/Play/HUD/UnstableRateCounter.cs +++ b/osu.Game/Screens/Play/HUD/UnstableRateCounter.cs @@ -23,7 +23,7 @@ namespace osu.Game.Screens.Play.HUD { public bool UsesFixedAnchor { get; set; } - protected override double RollingDuration => 750; + protected override double RollingDuration => 375; private const float alpha_when_invalid = 0.3f; private readonly Bindable valid = new Bindable(); diff --git a/osu.Game/Screens/Ranking/Expanded/Statistics/AccuracyStatistic.cs b/osu.Game/Screens/Ranking/Expanded/Statistics/AccuracyStatistic.cs index 4b8c057235..f1f2c47e20 100644 --- a/osu.Game/Screens/Ranking/Expanded/Statistics/AccuracyStatistic.cs +++ b/osu.Game/Screens/Ranking/Expanded/Statistics/AccuracyStatistic.cs @@ -44,9 +44,10 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics private partial class Counter : RollingCounter { - protected override double RollingDuration => AccuracyCircle.ACCURACY_TRANSFORM_DURATION; - - protected override Easing RollingEasing => AccuracyCircle.ACCURACY_TRANSFORM_EASING; + // FormatAccuracy doesn't round, which means if we use the OutPow10 easing the number will stick 0.01% short for some time. + // To avoid that let's use a shorter easing which looks roughly the same. + protected override double RollingDuration => AccuracyCircle.ACCURACY_TRANSFORM_DURATION / 2; + protected override Easing RollingEasing => Easing.OutQuad; protected override LocalisableString FormatCount(double count) => count.FormatAccuracy(); From 5ad2918a75d59c24ecc1d8a66cf6d4292b259bbd Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 11:21:44 +0300 Subject: [PATCH 182/651] Allow disabling high resolution texture lookups in `LegacySkin` --- .../Skinning/LegacySkinTextureFallbackTest.cs | 21 +++++++++++++++ osu.Game/Skinning/LegacySkin.cs | 26 ++++++++++++++----- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs index ca0d4d3cf3..3a7b9af0cb 100644 --- a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs +++ b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs @@ -127,8 +127,29 @@ namespace osu.Game.Tests.NonVisual.Skinning Assert.IsNull(texture); } + [Test] + public void TestDisallowHighResolutionSprites() + { + var textureStore = new TestTextureStore("hitcircle", "hitcircle@2x"); + var legacySkin = new TestLegacySkin(textureStore) { HighResolutionSprites = false }; + + var texture = legacySkin.GetTexture("hitcircle"); + + Assert.IsNotNull(texture); + Assert.That(texture.ScaleAdjust, Is.EqualTo(1)); + + texture = legacySkin.GetTexture("hitcircle@2x"); + + Assert.IsNotNull(texture); + Assert.That(texture.ScaleAdjust, Is.EqualTo(1)); + } + private class TestLegacySkin : LegacySkin { + public bool HighResolutionSprites { get; set; } = true; + + protected override bool AllowHighResolutionSprites => HighResolutionSprites; + public TestLegacySkin(IResourceStore textureStore) : base(new SkinInfo(), new TestResourceProvider(textureStore), null, string.Empty) { diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs index 8f0cd59b68..10913e7369 100644 --- a/osu.Game/Skinning/LegacySkin.cs +++ b/osu.Game/Skinning/LegacySkin.cs @@ -477,6 +477,11 @@ namespace osu.Game.Skinning return null; } + /// + /// Whether high-resolution textures ("@2x"-suffixed) are allowed to be used by when available. + /// + protected virtual bool AllowHighResolutionSprites => true; + public override Texture? GetTexture(string componentName, WrapMode wrapModeS, WrapMode wrapModeT) { switch (componentName) @@ -488,15 +493,22 @@ namespace osu.Game.Skinning foreach (string name in getFallbackNames(componentName)) { - // some component names (especially user-controlled ones, like `HitX` in mania) - // may contain `@2x` scale specifications. - // stable happens to check for that and strip them, so do the same to match stable behaviour. - string lookupName = name.Replace(@"@2x", string.Empty); + string lookupName = name; + Texture? texture = null; + float ratio = 1; - float ratio = 2; - string twoTimesFilename = $"{Path.ChangeExtension(lookupName, null)}@2x{Path.GetExtension(lookupName)}"; + if (AllowHighResolutionSprites) + { + // some component names (especially user-controlled ones, like `HitX` in mania) + // may contain `@2x` scale specifications. + // stable happens to check for that and strip them, so do the same to match stable behaviour. + lookupName = name.Replace(@"@2x", string.Empty); - var texture = Textures?.Get(twoTimesFilename, wrapModeS, wrapModeT); + string twoTimesFilename = $"{Path.ChangeExtension(lookupName, null)}@2x{Path.GetExtension(lookupName)}"; + + texture = Textures?.Get(twoTimesFilename, wrapModeS, wrapModeT); + ratio = 2; + } if (texture == null) { From 98c65f36c9b81b352f4d2eb575eba0cc7fdf1ed3 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 11:21:56 +0300 Subject: [PATCH 183/651] Disable high resolution texture lookup for legacy beatmap skins to match stable --- osu.Game/Skinning/LegacyBeatmapSkin.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/osu.Game/Skinning/LegacyBeatmapSkin.cs b/osu.Game/Skinning/LegacyBeatmapSkin.cs index d6ba6ea332..9cd072b607 100644 --- a/osu.Game/Skinning/LegacyBeatmapSkin.cs +++ b/osu.Game/Skinning/LegacyBeatmapSkin.cs @@ -22,6 +22,11 @@ namespace osu.Game.Skinning protected override bool AllowManiaConfigLookups => false; protected override bool UseCustomSampleBanks => true; + // matches stable. references: + // 1. https://github.com/peppy/osu-stable-reference/blob/dc0994645801010d4b628fff5ff79cd3c286ca83/osu!/Graphics/Textures/TextureManager.cs#L115-L137 (beatmap skin textures lookup) + // 2. https://github.com/peppy/osu-stable-reference/blob/dc0994645801010d4b628fff5ff79cd3c286ca83/osu!/Graphics/Textures/TextureManager.cs#L158-L196 (user skin textures lookup) + protected override bool AllowHighResolutionSprites => false; + /// /// Construct a new legacy beatmap skin instance. /// From 1af5d1434c0abc615984fb64ef72d9d83d803740 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Jan 2024 19:53:23 +0900 Subject: [PATCH 184/651] Rename test method slightly --- osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs b/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs index f3d2b5d518..6181024230 100644 --- a/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs +++ b/osu.Game.Tests/Visual/Editing/TestSceneTimingScreen.cs @@ -180,7 +180,7 @@ namespace osu.Game.Tests.Visual.Editing } [Test] - public void TestEditThenClickAway() + public void TestEditThenClickAwayAppliesChanges() { AddStep("Add two control points", () => { From a8970d7642a6a2aa1834f4008ddc900997629dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 17 Jan 2024 12:24:48 +0100 Subject: [PATCH 185/651] Jiggle ordering a bit further to fix revert-to-default buttons showing up --- osu.Game.Rulesets.Taiko/TaikoRuleset.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs index b80d8218f5..24b0ec5d57 100644 --- a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs +++ b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs @@ -69,11 +69,11 @@ namespace osu.Game.Rulesets.Taiko public override IEnumerable GetDefaultKeyBindings(int variant = 0) => new[] { - new KeyBinding(InputKey.D, TaikoAction.LeftRim), - new KeyBinding(InputKey.F, TaikoAction.LeftCentre), - new KeyBinding(InputKey.MouseLeft, TaikoAction.LeftCentre), - new KeyBinding(InputKey.J, TaikoAction.RightCentre), new KeyBinding(InputKey.MouseRight, TaikoAction.LeftRim), + new KeyBinding(InputKey.D, TaikoAction.LeftRim), + new KeyBinding(InputKey.MouseLeft, TaikoAction.LeftCentre), + new KeyBinding(InputKey.F, TaikoAction.LeftCentre), + new KeyBinding(InputKey.J, TaikoAction.RightCentre), new KeyBinding(InputKey.K, TaikoAction.RightRim), }; From bcc7dd6af574ecbfb4004f5aaa6265f149578d86 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 15:58:27 +0300 Subject: [PATCH 186/651] Add extended test coverage --- .../Skinning/LegacySkinTextureFallbackTest.cs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs index 3a7b9af0cb..ff954211eb 100644 --- a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs +++ b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs @@ -138,10 +138,31 @@ namespace osu.Game.Tests.NonVisual.Skinning Assert.IsNotNull(texture); Assert.That(texture.ScaleAdjust, Is.EqualTo(1)); - texture = legacySkin.GetTexture("hitcircle@2x"); + var twoTimesTexture = legacySkin.GetTexture("hitcircle@2x"); + + Assert.IsNotNull(twoTimesTexture); + Assert.That(twoTimesTexture.ScaleAdjust, Is.EqualTo(1)); + + Assert.AreNotEqual(texture, twoTimesTexture); + } + + [Test] + public void TestAllowHighResolutionSprites() + { + var textureStore = new TestTextureStore("hitcircle", "hitcircle@2x"); + var legacySkin = new TestLegacySkin(textureStore) { HighResolutionSprites = true }; + + var texture = legacySkin.GetTexture("hitcircle"); Assert.IsNotNull(texture); - Assert.That(texture.ScaleAdjust, Is.EqualTo(1)); + Assert.That(texture.ScaleAdjust, Is.EqualTo(2)); + + var twoTimesTexture = legacySkin.GetTexture("hitcircle@2x"); + + Assert.IsNotNull(twoTimesTexture); + Assert.That(twoTimesTexture.ScaleAdjust, Is.EqualTo(2)); + + Assert.AreEqual(texture, twoTimesTexture); } private class TestLegacySkin : LegacySkin From e54d20ea93514a017889ee560f92e06d7a28d37f Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 13:27:44 +0300 Subject: [PATCH 187/651] Remove ancient osu-resources lookup path from legacy skin textures --- .../Skinning/Legacy/LegacyApproachCircle.cs | 2 +- .../Skinning/Legacy/LegacyReverseArrow.cs | 8 +-- .../Skinning/GameplaySkinComponentLookup.cs | 4 -- osu.Game/Skinning/LegacySkin.cs | 57 ++++++++----------- 4 files changed, 29 insertions(+), 42 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs index eea6606233..d31c763c2c 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs @@ -21,7 +21,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy private DrawableHitObject drawableObject { get; set; } = null!; public LegacyApproachCircle() - : base("Gameplay/osu/approachcircle", OsuHitObject.OBJECT_DIMENSIONS * 2) + : base(@"approachcircle", OsuHitObject.OBJECT_DIMENSIONS * 2) { } diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyReverseArrow.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyReverseArrow.cs index 780084115d..ad1fb98aef 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyReverseArrow.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyReverseArrow.cs @@ -34,19 +34,19 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy [BackgroundDependencyLoader] private void load(DrawableHitObject drawableObject, ISkinSource skinSource) { + const string lookup_name = @"reversearrow"; + drawableRepeat = (DrawableSliderRepeat)drawableObject; AutoSizeAxes = Axes.Both; - string lookupName = new OsuSkinComponentLookup(OsuSkinComponents.ReverseArrow).LookupName; - - var skin = skinSource.FindProvider(s => s.GetTexture(lookupName) != null); + var skin = skinSource.FindProvider(s => s.GetTexture(lookup_name) != null); InternalChild = arrow = new Sprite { Anchor = Anchor.Centre, Origin = Anchor.Centre, - Texture = skin?.GetTexture(lookupName)?.WithMaximumSize(maxSize: OsuHitObject.OBJECT_DIMENSIONS * 2), + Texture = skin?.GetTexture(lookup_name)?.WithMaximumSize(maxSize: OsuHitObject.OBJECT_DIMENSIONS * 2), }; textureIsDefaultSkin = skin is ISkinTransformer transformer && transformer.Skin is DefaultLegacySkin; diff --git a/osu.Game/Skinning/GameplaySkinComponentLookup.cs b/osu.Game/Skinning/GameplaySkinComponentLookup.cs index a44bf3a43d..ec159873f8 100644 --- a/osu.Game/Skinning/GameplaySkinComponentLookup.cs +++ b/osu.Game/Skinning/GameplaySkinComponentLookup.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Linq; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Scoring; @@ -28,8 +27,5 @@ namespace osu.Game.Skinning protected virtual string RulesetPrefix => string.Empty; protected virtual string ComponentName => Component.ToString(); - - public string LookupName => - string.Join('/', new[] { "Gameplay", RulesetPrefix, ComponentName }.Where(s => !string.IsNullOrEmpty(s))); } } diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs index 10913e7369..cfa5f972d2 100644 --- a/osu.Game/Skinning/LegacySkin.cs +++ b/osu.Game/Skinning/LegacySkin.cs @@ -491,39 +491,30 @@ namespace osu.Game.Skinning break; } - foreach (string name in getFallbackNames(componentName)) + Texture? texture = null; + float ratio = 1; + + if (AllowHighResolutionSprites) { - string lookupName = name; - Texture? texture = null; - float ratio = 1; + // some component names (especially user-controlled ones, like `HitX` in mania) + // may contain `@2x` scale specifications. + // stable happens to check for that and strip them, so do the same to match stable behaviour. + componentName = componentName.Replace(@"@2x", string.Empty); - if (AllowHighResolutionSprites) - { - // some component names (especially user-controlled ones, like `HitX` in mania) - // may contain `@2x` scale specifications. - // stable happens to check for that and strip them, so do the same to match stable behaviour. - lookupName = name.Replace(@"@2x", string.Empty); + string twoTimesFilename = $"{Path.ChangeExtension(componentName, null)}@2x{Path.GetExtension(componentName)}"; - string twoTimesFilename = $"{Path.ChangeExtension(lookupName, null)}@2x{Path.GetExtension(lookupName)}"; + texture = Textures?.Get(twoTimesFilename, wrapModeS, wrapModeT); - texture = Textures?.Get(twoTimesFilename, wrapModeS, wrapModeT); + if (texture != null) ratio = 2; - } - - if (texture == null) - { - ratio = 1; - texture = Textures?.Get(lookupName, wrapModeS, wrapModeT); - } - - if (texture == null) - continue; - - texture.ScaleAdjust = ratio; - return texture; } - return null; + texture ??= Textures?.Get(componentName, wrapModeS, wrapModeT); + + if (texture != null) + texture.ScaleAdjust = ratio; + + return texture; } public override ISample? GetSample(ISampleInfo sampleInfo) @@ -534,7 +525,7 @@ namespace osu.Game.Skinning lookupNames = getLegacyLookupNames(hitSample); else { - lookupNames = sampleInfo.LookupNames.SelectMany(getFallbackNames); + lookupNames = sampleInfo.LookupNames.SelectMany(getFallbackSampleNames); } foreach (string lookup in lookupNames) @@ -552,7 +543,7 @@ namespace osu.Game.Skinning private IEnumerable getLegacyLookupNames(HitSampleInfo hitSample) { - var lookupNames = hitSample.LookupNames.SelectMany(getFallbackNames); + var lookupNames = hitSample.LookupNames.SelectMany(getFallbackSampleNames); if (!UseCustomSampleBanks && !string.IsNullOrEmpty(hitSample.Suffix)) { @@ -571,13 +562,13 @@ namespace osu.Game.Skinning yield return hitSample.Name; } - private IEnumerable getFallbackNames(string componentName) + private IEnumerable getFallbackSampleNames(string name) { - // May be something like "Gameplay/osu/approachcircle" from lazer, or "Arrows/note1" from a user skin. - yield return componentName; + // May be something like "Gameplay/normal-hitnormal" from lazer. + yield return name; - // Fall back to using the last piece for components coming from lazer (e.g. "Gameplay/osu/approachcircle" -> "approachcircle"). - yield return componentName.Split('/').Last(); + // Fall back to using the last piece for components coming from lazer (e.g. "Gameplay/normal-hitnormal" -> "normal-hitnormal"). + yield return name.Split('/').Last(); } } } From ed1e66b8f99032828b3e52a02b1baf5b10accaeb Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 16:35:39 +0300 Subject: [PATCH 188/651] Fix enabling beatmap skin cause hitobjects to use `LegacyApproachCircle` regardless of selected skin --- .../Skinning/Legacy/OsuLegacySkinTransformer.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs index c01d28c8e1..86ca5fff8c 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using NUnit.Framework; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Rulesets.Osu.Objects; @@ -163,7 +164,10 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy return null; case OsuSkinComponents.ApproachCircle: - return new LegacyApproachCircle(); + if (IsProvidingLegacyResources) + return new LegacyApproachCircle(); + + return null; default: throw new UnsupportedSkinComponentException(lookup); From ede0a2269329cde6afbbc82d185b664f17591327 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 16:58:47 +0300 Subject: [PATCH 189/651] Remove existing test coverage --- .../Skinning/LegacySkinTextureFallbackTest.cs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs index 3a7b9af0cb..89103cd4d9 100644 --- a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs +++ b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs @@ -56,24 +56,6 @@ namespace osu.Game.Tests.NonVisual.Skinning "Gameplay/osu/followpoint", 1 }, new object[] - { - new[] { "followpoint@2x", "followpoint" }, - "Gameplay/osu/followpoint", - "followpoint@2x", 2 - }, - new object[] - { - new[] { "followpoint@2x" }, - "Gameplay/osu/followpoint", - "followpoint@2x", 2 - }, - new object[] - { - new[] { "followpoint" }, - "Gameplay/osu/followpoint", - "followpoint", 1 - }, - new object[] { // Looking up a filename with extension specified should work. new[] { "followpoint.png" }, From eaa748f075948e0162db1b38503df2a4ed203ada Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 18:35:34 +0300 Subject: [PATCH 190/651] Remove unused using directive --- .../Skinning/Legacy/OsuLegacySkinTransformer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs index 86ca5fff8c..b01c18031c 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System; -using NUnit.Framework; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Rulesets.Osu.Objects; From 5597b48882b4ae4a00e3869b9bb42133db036ae2 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 17 Jan 2024 16:38:36 +0300 Subject: [PATCH 191/651] Fix storyboard animations stripping path directory on skin lookup --- osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs index cefd51b2aa..fae9ec7f2e 100644 --- a/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs +++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs @@ -129,7 +129,7 @@ namespace osu.Game.Storyboards.Drawables // When reading from a skin, we match stables weird behaviour where `FrameCount` is ignored // and resources are retrieved until the end of the animation. - var skinTextures = skin.GetTextures(Path.GetFileNameWithoutExtension(Animation.Path)!, default, default, true, string.Empty, null, out _); + var skinTextures = skin.GetTextures(Path.ChangeExtension(Animation.Path, null), default, default, true, string.Empty, null, out _); if (skinTextures.Length > 0) { From 42e4c933d374bc3ebc863ec38bc7951dd0498054 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 18 Jan 2024 04:06:02 +0300 Subject: [PATCH 192/651] Fix ConstrainedIconContainer always using masking --- osu.Game/Beatmaps/Drawables/DifficultyIcon.cs | 1 - .../Containers/ConstrainedIconContainer.cs | 18 ------------------ .../Toolbar/ToolbarRulesetTabButton.cs | 11 +---------- 3 files changed, 1 insertion(+), 29 deletions(-) diff --git a/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs b/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs index 1665ec52fa..eecf79aa34 100644 --- a/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs +++ b/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs @@ -92,7 +92,6 @@ namespace osu.Game.Beatmaps.Drawables EdgeEffect = new EdgeEffectParameters { Colour = Color4.Black.Opacity(0.06f), - Type = EdgeEffectType.Shadow, Radius = 3, }, diff --git a/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs b/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs index 7722374c69..63ac84fcf7 100644 --- a/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs +++ b/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs @@ -4,7 +4,6 @@ using System; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Effects; using osuTK; namespace osu.Game.Graphics.Containers @@ -17,21 +16,9 @@ namespace osu.Game.Graphics.Containers public Drawable Icon { get => InternalChild; - set => InternalChild = value; } - /// - /// Determines an edge effect of this . - /// Edge effects are e.g. glow or a shadow. - /// Only has an effect when is true. - /// - public new EdgeEffectParameters EdgeEffect - { - get => base.EdgeEffect; - set => base.EdgeEffect = value; - } - protected override void Update() { base.Update(); @@ -49,10 +36,5 @@ namespace osu.Game.Graphics.Containers InternalChild.Origin = Anchor.Centre; } } - - public ConstrainedIconContainer() - { - Masking = true; - } } } diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs index c224f0f9c9..3287ac6eaa 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs @@ -4,7 +4,6 @@ using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; -using osu.Framework.Graphics.Effects; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; using osu.Game.Graphics; @@ -58,15 +57,7 @@ namespace osu.Game.Overlays.Toolbar { set => Scheduler.AddOnce(() => { - if (value) - { - IconContainer.Colour = Color4Extensions.FromHex("#00FFAA"); - } - else - { - IconContainer.Colour = colours.GrayF; - IconContainer.EdgeEffect = new EdgeEffectParameters(); - } + IconContainer.Colour = value ? Color4Extensions.FromHex("#00FFAA") : colours.GrayF; }); } From c362a93a3688cd13b8befc11ca1a75a59d8172cc Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 02:18:20 +0900 Subject: [PATCH 193/651] Change frame stable catch-up method to allow for much faster sync --- .../Gameplay/TestSceneFrameStabilityContainer.cs | 4 +--- .../Visual/Gameplay/TestSceneSongProgress.cs | 5 +---- osu.Game/Rulesets/UI/FrameStabilityContainer.cs | 10 ++++++---- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneFrameStabilityContainer.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneFrameStabilityContainer.cs index 534348bed3..98a97e1d23 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneFrameStabilityContainer.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneFrameStabilityContainer.cs @@ -129,10 +129,8 @@ namespace osu.Game.Tests.Visual.Gameplay checkRate(1); } - private const int max_frames_catchup = 50; - private void createStabilityContainer(double gameplayStartTime = double.MinValue) => AddStep("create container", () => - mainContainer.Child = new FrameStabilityContainer(gameplayStartTime) { MaxCatchUpFrames = max_frames_catchup } + mainContainer.Child = new FrameStabilityContainer(gameplayStartTime) .WithChild(consumer = new ClockConsumingChild())); private void seekManualTo(double time) => AddStep($"seek manual clock to {time}", () => manualClock.CurrentTime = time); diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs index e975a85401..19bb5cdde1 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs @@ -45,10 +45,7 @@ namespace osu.Game.Tests.Visual.Gameplay }, gameplayClockContainer = new MasterGameplayClockContainer(Beatmap.Value, skip_target_time) { - Child = frameStabilityContainer = new FrameStabilityContainer - { - MaxCatchUpFrames = 1 - } + Child = frameStabilityContainer = new FrameStabilityContainer() } }); diff --git a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs index 2af9916a6b..c07bd3aef5 100644 --- a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs +++ b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs @@ -25,9 +25,9 @@ namespace osu.Game.Rulesets.UI public ReplayInputHandler? ReplayInputHandler { get; set; } /// - /// The number of frames (per parent frame) which can be run in an attempt to catch-up to real-time. + /// The number of CPU milliseconds to spend at most during seek catch-up. /// - public int MaxCatchUpFrames { get; set; } = 5; + private const double max_catchup_milliseconds = 10; /// /// Whether to enable frame-stable playback. @@ -61,6 +61,8 @@ namespace osu.Game.Rulesets.UI /// private readonly FramedClock framedClock; + private readonly Stopwatch stopwatch = new Stopwatch(); + /// /// The current direction of playback to be exposed to frame stable children. /// @@ -99,7 +101,7 @@ namespace osu.Game.Rulesets.UI public override bool UpdateSubTree() { - int loops = MaxCatchUpFrames; + stopwatch.Restart(); do { @@ -112,7 +114,7 @@ namespace osu.Game.Rulesets.UI base.UpdateSubTree(); UpdateSubTreeMasking(this, ScreenSpaceDrawQuad.AABBFloat); - } while (state == PlaybackState.RequiresCatchUp && loops-- > 0); + } while (state == PlaybackState.RequiresCatchUp && stopwatch.ElapsedMilliseconds < max_catchup_milliseconds); return true; } From fb4efd992de542ae5ad57ce192d9626de692e8ab Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 11:52:28 +0900 Subject: [PATCH 194/651] Add a fake load to visual test to restore previous testing behaviour --- .../Visual/Gameplay/TestSceneSongProgress.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs index 19bb5cdde1..99f0ffb9d0 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSongProgress.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using System.Threading; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Extensions.IEnumerableExtensions; @@ -45,7 +46,10 @@ namespace osu.Game.Tests.Visual.Gameplay }, gameplayClockContainer = new MasterGameplayClockContainer(Beatmap.Value, skip_target_time) { - Child = frameStabilityContainer = new FrameStabilityContainer() + Child = frameStabilityContainer = new FrameStabilityContainer + { + Child = new FakeLoad() + } } }); @@ -53,6 +57,15 @@ namespace osu.Game.Tests.Visual.Gameplay Dependencies.CacheAs(frameStabilityContainer); } + private partial class FakeLoad : Drawable + { + protected override void Update() + { + base.Update(); + Thread.Sleep(1); + } + } + [SetUpSteps] public void SetupSteps() { From 799c74cfe533da28509699dd2feea84179a2b8f8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 02:40:34 +0900 Subject: [PATCH 195/651] Simplify gameplay pause sequence --- .../Visual/Gameplay/TestScenePause.cs | 5 +- .../Play/MasterGameplayClockContainer.cs | 66 ------------------- 2 files changed, 1 insertion(+), 70 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs index ec3b3e0822..d55af2777f 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs @@ -93,15 +93,12 @@ namespace osu.Game.Tests.Visual.Gameplay double currentTime = masterClock.CurrentTime; - bool goingForward = currentTime >= (masterClock.LastStopTime ?? lastStopTime); + bool goingForward = currentTime >= lastStopTime; alwaysGoingForward &= goingForward; if (!goingForward) Logger.Log($"Went too far backwards (last stop: {lastStopTime:N1} current: {currentTime:N1})"); - - if (masterClock.LastStopTime != null) - lastStopTime = masterClock.LastStopTime.Value; }; }); diff --git a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs index 12f541167f..10451963a1 100644 --- a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs +++ b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs @@ -7,7 +7,6 @@ using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Audio.Track; using osu.Framework.Bindables; -using osu.Framework.Graphics; using osu.Framework.Logging; using osu.Framework.Timing; using osu.Game.Beatmaps; @@ -60,17 +59,6 @@ namespace osu.Game.Screens.Play private readonly double skipTargetTime; - /// - /// Stores the time at which the last call was triggered. - /// This is used to ensure we resume from that precise point in time, ignoring the proceeding frequency ramp. - /// - /// Optimally, we'd have gameplay ramp down with the frequency, but I believe this was intentionally disabled - /// to avoid fails occurring after the pause screen has been shown. - /// - /// In the future I want to change this. - /// - internal double? LastStopTime; - [Resolved] private MusicController musicController { get; set; } = null!; @@ -113,71 +101,17 @@ namespace osu.Game.Screens.Play return time; } - protected override void StopGameplayClock() - { - LastStopTime = GameplayClock.CurrentTime; - - if (IsLoaded) - { - // During normal operation, the source is stopped after performing a frequency ramp. - this.TransformBindableTo(GameplayClock.ExternalPauseFrequencyAdjust, 0, 200, Easing.Out).OnComplete(_ => - { - if (IsPaused.Value) - base.StopGameplayClock(); - }); - } - else - { - base.StopGameplayClock(); - - // If not yet loaded, we still want to ensure relevant state is correct, as it is used for offset calculations. - GameplayClock.ExternalPauseFrequencyAdjust.Value = 0; - - // We must also process underlying gameplay clocks to update rate-adjusted offsets with the new frequency adjustment. - // Without doing this, an initial seek may be performed with the wrong offset. - GameplayClock.ProcessFrame(); - } - } - public override void Seek(double time) { - // Safety in case the clock is seeked while stopped. - LastStopTime = null; elapsedValidationTime = null; base.Seek(time); } - protected override void PrepareStart() - { - if (LastStopTime != null) - { - Seek(LastStopTime.Value); - LastStopTime = null; - } - else - base.PrepareStart(); - } - protected override void StartGameplayClock() { addAdjustmentsToTrack(); - base.StartGameplayClock(); - - if (IsLoaded) - { - this.TransformBindableTo(GameplayClock.ExternalPauseFrequencyAdjust, 1, 200, Easing.In); - } - else - { - // If not yet loaded, we still want to ensure relevant state is correct, as it is used for offset calculations. - GameplayClock.ExternalPauseFrequencyAdjust.Value = 1; - - // We must also process underlying gameplay clocks to update rate-adjusted offsets with the new frequency adjustment. - // Without doing this, an initial seek may be performed with the wrong offset. - GameplayClock.ProcessFrame(); - } } /// From 8ab8c90e338f00c784e05fc406540b872cefa5a0 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 14:21:02 +0900 Subject: [PATCH 196/651] Remove "pause rate adjust" flow --- osu.Game/Beatmaps/FramedBeatmapClock.cs | 11 +++-------- .../Screens/Play/MasterGameplayClockContainer.cs | 2 -- osu.Game/Screens/Play/OffsetCorrectionClock.cs | 14 +++----------- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/osu.Game/Beatmaps/FramedBeatmapClock.cs b/osu.Game/Beatmaps/FramedBeatmapClock.cs index 587e6bbeed..d0ffbdd459 100644 --- a/osu.Game/Beatmaps/FramedBeatmapClock.cs +++ b/osu.Game/Beatmaps/FramedBeatmapClock.cs @@ -27,11 +27,6 @@ namespace osu.Game.Beatmaps { private readonly bool applyOffsets; - /// - /// The total frequency adjustment from pause transforms. Should eventually be handled in a better way. - /// - public readonly BindableDouble ExternalPauseFrequencyAdjust = new BindableDouble(1); - private readonly OffsetCorrectionClock? userGlobalOffsetClock; private readonly OffsetCorrectionClock? platformOffsetClock; private readonly OffsetCorrectionClock? userBeatmapOffsetClock; @@ -69,13 +64,13 @@ namespace osu.Game.Beatmaps { // Audio timings in general with newer BASS versions don't match stable. // This only seems to be required on windows. We need to eventually figure out why, with a bit of luck. - platformOffsetClock = new OffsetCorrectionClock(interpolatedTrack, ExternalPauseFrequencyAdjust) { Offset = RuntimeInfo.OS == RuntimeInfo.Platform.Windows ? 15 : 0 }; + platformOffsetClock = new OffsetCorrectionClock(interpolatedTrack) { Offset = RuntimeInfo.OS == RuntimeInfo.Platform.Windows ? 15 : 0 }; // User global offset (set in settings) should also be applied. - userGlobalOffsetClock = new OffsetCorrectionClock(platformOffsetClock, ExternalPauseFrequencyAdjust); + userGlobalOffsetClock = new OffsetCorrectionClock(platformOffsetClock); // User per-beatmap offset will be applied to this final clock. - finalClockSource = userBeatmapOffsetClock = new OffsetCorrectionClock(userGlobalOffsetClock, ExternalPauseFrequencyAdjust); + finalClockSource = userBeatmapOffsetClock = new OffsetCorrectionClock(userGlobalOffsetClock); } else { diff --git a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs index 10451963a1..93bdcb1cab 100644 --- a/osu.Game/Screens/Play/MasterGameplayClockContainer.cs +++ b/osu.Game/Screens/Play/MasterGameplayClockContainer.cs @@ -207,7 +207,6 @@ namespace osu.Game.Screens.Play musicController.ResetTrackAdjustments(); track.BindAdjustments(AdjustmentsFromMods); - track.AddAdjustment(AdjustableProperty.Frequency, GameplayClock.ExternalPauseFrequencyAdjust); track.AddAdjustment(AdjustableProperty.Frequency, UserPlaybackRate); speedAdjustmentsApplied = true; @@ -219,7 +218,6 @@ namespace osu.Game.Screens.Play return; track.UnbindAdjustments(AdjustmentsFromMods); - track.RemoveAdjustment(AdjustableProperty.Frequency, GameplayClock.ExternalPauseFrequencyAdjust); track.RemoveAdjustment(AdjustableProperty.Frequency, UserPlaybackRate); speedAdjustmentsApplied = false; diff --git a/osu.Game/Screens/Play/OffsetCorrectionClock.cs b/osu.Game/Screens/Play/OffsetCorrectionClock.cs index 207980f45c..e83ed7e464 100644 --- a/osu.Game/Screens/Play/OffsetCorrectionClock.cs +++ b/osu.Game/Screens/Play/OffsetCorrectionClock.cs @@ -1,15 +1,12 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.Bindables; using osu.Framework.Timing; namespace osu.Game.Screens.Play { public class OffsetCorrectionClock : FramedOffsetClock { - private readonly BindableDouble pauseRateAdjust; - private double offset; public new double Offset @@ -28,10 +25,9 @@ namespace osu.Game.Screens.Play public double RateAdjustedOffset => base.Offset; - public OffsetCorrectionClock(IClock source, BindableDouble pauseRateAdjust) + public OffsetCorrectionClock(IClock source) : base(source) { - this.pauseRateAdjust = pauseRateAdjust; } public override void ProcessFrame() @@ -42,12 +38,8 @@ namespace osu.Game.Screens.Play private void updateOffset() { - // changing this during the pause transform effect will cause a potentially large offset to be suddenly applied as we approach zero rate. - if (pauseRateAdjust.Value == 1) - { - // we always want to apply the same real-time offset, so it should be adjusted by the difference in playback rate (from realtime) to achieve this. - base.Offset = Offset * Rate; - } + // we always want to apply the same real-time offset, so it should be adjusted by the difference in playback rate (from realtime) to achieve this. + base.Offset = Offset * Rate; } } } From a870f99877fa3758307d33fae01e46f5f067af3b Mon Sep 17 00:00:00 2001 From: mouzedrift <43358824+mouzedrift@users.noreply.github.com> Date: Thu, 18 Jan 2024 07:19:29 +0100 Subject: [PATCH 197/651] ease out input drum animation and add delay before fading out --- osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs b/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs index 8ad419f8bd..d9e94ede4a 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs @@ -159,8 +159,8 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy const float up_time = 50; target.Animate( - t => t.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time) - ).Then( + t => t.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, Easing.Out) + ).Delay(100).Then( t => t.FadeOut(up_time) ); } From ee3de9c522685b5f85eeb9c021f9c6eab8b9d9a5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 15:44:27 +0900 Subject: [PATCH 198/651] Fix gameplay elements not correcly offsetting to avoid per-ruleset skin layout Closes https://github.com/ppy/osu/issues/26601. --- osu.Game/Screens/Play/HUDOverlay.cs | 49 ++++++++++++++++++----------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs index 128f8d5ffd..a9fe393395 100644 --- a/osu.Game/Screens/Play/HUDOverlay.cs +++ b/osu.Game/Screens/Play/HUDOverlay.cs @@ -99,6 +99,9 @@ namespace osu.Game.Screens.Play private readonly SkinComponentsContainer mainComponents; + [CanBeNull] + private readonly SkinComponentsContainer rulesetComponents; + /// /// A flow which sits at the left side of the screen to house leaderboard (and related) components. /// Will automatically be positioned to avoid colliding with top scoring elements. @@ -111,7 +114,6 @@ namespace osu.Game.Screens.Play public HUDOverlay([CanBeNull] DrawableRuleset drawableRuleset, IReadOnlyList mods, bool alwaysShowLeaderboard = true) { - Drawable rulesetComponents; this.drawableRuleset = drawableRuleset; this.mods = mods; @@ -125,8 +127,8 @@ namespace osu.Game.Screens.Play clicksPerSecondController = new ClicksPerSecondController(), InputCountController = new InputCountController(), mainComponents = new HUDComponentsContainer { AlwaysPresent = true, }, - rulesetComponents = drawableRuleset != null - ? new HUDComponentsContainer(drawableRuleset.Ruleset.RulesetInfo) { AlwaysPresent = true, } + drawableRuleset != null + ? (rulesetComponents = new HUDComponentsContainer(drawableRuleset.Ruleset.RulesetInfo) { AlwaysPresent = true, }) : Empty(), playfieldComponents = drawableRuleset != null ? new SkinComponentsContainer(new SkinComponentsContainerLookup(SkinComponentsContainerLookup.TargetArea.Playfield, drawableRuleset.Ruleset.RulesetInfo)) { AlwaysPresent = true, } @@ -256,13 +258,37 @@ namespace osu.Game.Screens.Play // LINQ cast can be removed when IDrawable interface includes Anchor / RelativeSizeAxes. foreach (var element in mainComponents.Components.Cast()) + processDrawable(element); + + if (rulesetComponents != null) + { + foreach (var element in rulesetComponents.Components.Cast()) + processDrawable(element); + } + + if (lowestTopScreenSpaceRight.HasValue) + topRightElements.Y = MathHelper.Clamp(ToLocalSpace(new Vector2(0, lowestTopScreenSpaceRight.Value)).Y, 0, DrawHeight - topRightElements.DrawHeight); + else + topRightElements.Y = 0; + + if (lowestTopScreenSpaceLeft.HasValue) + LeaderboardFlow.Y = MathHelper.Clamp(ToLocalSpace(new Vector2(0, lowestTopScreenSpaceLeft.Value)).Y, 0, DrawHeight - LeaderboardFlow.DrawHeight); + else + LeaderboardFlow.Y = 0; + + if (highestBottomScreenSpace.HasValue) + bottomRightElements.Y = BottomScoringElementsHeight = -MathHelper.Clamp(DrawHeight - ToLocalSpace(highestBottomScreenSpace.Value).Y, 0, DrawHeight - bottomRightElements.DrawHeight); + else + bottomRightElements.Y = 0; + + void processDrawable(Drawable element) { // for now align some top components with the bottom-edge of the lowest top-anchored hud element. if (element.Anchor.HasFlagFast(Anchor.y0)) { // health bars are excluded for the sake of hacky legacy skins which extend the health bar to take up the full screen area. if (element is LegacyHealthDisplay) - continue; + return; float bottom = element.ScreenSpaceDrawQuad.BottomRight.Y; @@ -288,21 +314,6 @@ namespace osu.Game.Screens.Play highestBottomScreenSpace = topLeft; } } - - if (lowestTopScreenSpaceRight.HasValue) - topRightElements.Y = MathHelper.Clamp(ToLocalSpace(new Vector2(0, lowestTopScreenSpaceRight.Value)).Y, 0, DrawHeight - topRightElements.DrawHeight); - else - topRightElements.Y = 0; - - if (lowestTopScreenSpaceLeft.HasValue) - LeaderboardFlow.Y = MathHelper.Clamp(ToLocalSpace(new Vector2(0, lowestTopScreenSpaceLeft.Value)).Y, 0, DrawHeight - LeaderboardFlow.DrawHeight); - else - LeaderboardFlow.Y = 0; - - if (highestBottomScreenSpace.HasValue) - bottomRightElements.Y = BottomScoringElementsHeight = -MathHelper.Clamp(DrawHeight - ToLocalSpace(highestBottomScreenSpace.Value).Y, 0, DrawHeight - bottomRightElements.DrawHeight); - else - bottomRightElements.Y = 0; } private void updateVisibility() From cbfc6091af4265462e89016c3dc6210c58cff2d8 Mon Sep 17 00:00:00 2001 From: mouzedrift <43358824+mouzedrift@users.noreply.github.com> Date: Thu, 18 Jan 2024 08:22:26 +0100 Subject: [PATCH 199/651] apply proposed changes --- .../Skinning/Legacy/LegacyInputDrum.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs b/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs index d9e94ede4a..28415bb72a 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs @@ -1,7 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -153,16 +152,12 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy if (target != null) { - const float alpha_amount = 1; - const float down_time = 80; const float up_time = 50; - target.Animate( - t => t.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, Easing.Out) - ).Delay(100).Then( - t => t.FadeOut(up_time) - ); + target + .FadeTo(1, down_time * (1 - target.Alpha), Easing.Out) + .Delay(100).FadeOut(up_time); } return false; From ef0b5c94064654f798727ad0dbc12f919e6284d3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 16:31:20 +0900 Subject: [PATCH 200/651] Stop playing back samples for nested screens in multiplayer I'd argue this sounds better. --- osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs b/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs index b527bf98a2..ea855c0474 100644 --- a/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs @@ -13,6 +13,8 @@ namespace osu.Game.Screens.OnlinePlay public virtual string ShortTitle => Title; + protected override bool PlayExitSound => false; + [Resolved] protected IRoomManager? RoomManager { get; private set; } From fd9c7184e449ffeeadeb3768e80bdb059bcaa92c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 16:31:33 +0900 Subject: [PATCH 201/651] Only play back sample once when traversing up multiple screens in stack --- osu.Game/Screens/OsuScreen.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs index 490a1ae6b8..f719ef67c9 100644 --- a/osu.Game/Screens/OsuScreen.cs +++ b/osu.Game/Screens/OsuScreen.cs @@ -223,7 +223,12 @@ namespace osu.Game.Screens public override bool OnExiting(ScreenExitEvent e) { - if (ValidForResume && PlayExitSound) + // Only play the exit sound if we are the last screen in the exit sequence. + // This stops many sample playbacks from stacking when a huge screen purge happens (ie. returning to menu via the home button + // from a deeply nested screen). + bool arrivingAtFinalDestination = e.Next == e.Destination; + + if (ValidForResume && PlayExitSound && arrivingAtFinalDestination) sampleExit?.Play(); if (ValidForResume && logo != null) From 1527ab89ef1dee1994f4629a5ebbcbcf2c9edc8a Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 18 Jan 2024 10:34:23 +0300 Subject: [PATCH 202/651] Refactor `DefaultApproachCircle`/`LegacyApproachCircle` to make sense --- .../Skinning/Default/DefaultApproachCircle.cs | 34 +++++++----------- .../Skinning/Legacy/LegacyApproachCircle.cs | 36 ++++++++----------- .../Legacy/OsuLegacySkinTransformer.cs | 2 +- 3 files changed, 28 insertions(+), 44 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultApproachCircle.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultApproachCircle.cs index b65f46c414..272f4b5658 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultApproachCircle.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultApproachCircle.cs @@ -3,47 +3,39 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Osu.Objects; using osu.Game.Skinning; using osuTK; using osuTK.Graphics; namespace osu.Game.Rulesets.Osu.Skinning.Default { - public partial class DefaultApproachCircle : SkinnableSprite + public partial class DefaultApproachCircle : Sprite { - private readonly IBindable accentColour = new Bindable(); - [Resolved] private DrawableHitObject drawableObject { get; set; } = null!; - public DefaultApproachCircle() - : base("Gameplay/osu/approachcircle") - { - } + private IBindable accentColour = null!; [BackgroundDependencyLoader] - private void load() + private void load(TextureStore textures) { - accentColour.BindTo(drawableObject.AccentColour); + Texture = textures.Get(@"Gameplay/osu/approachcircle").WithMaximumSize(OsuHitObject.OBJECT_DIMENSIONS * 2); + + // account for the sprite being used for the default approach circle being taken from stable, + // when hitcircles have 5px padding on each size. this should be removed if we update the sprite. + Scale = new Vector2(128 / 118f); } protected override void LoadComplete() { base.LoadComplete(); - accentColour.BindValueChanged(colour => Colour = colour.NewValue, true); - } - protected override Drawable CreateDefault(ISkinComponentLookup lookup) - { - var drawable = base.CreateDefault(lookup); - - // Although this is a non-legacy component, osu-resources currently stores approach circle as a legacy-like texture. - // See LegacyApproachCircle for documentation as to why this is required. - drawable.Scale = new Vector2(128 / 118f); - - return drawable; + accentColour = drawableObject.AccentColour.GetBoundCopy(); + accentColour.BindValueChanged(colour => Colour = LegacyColourCompatibility.DisallowZeroAlpha(colour.NewValue), true); } } } diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs index d31c763c2c..0bdea0cab1 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacyApproachCircle.cs @@ -1,9 +1,10 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Diagnostics; using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Skinning; @@ -12,40 +13,31 @@ using osuTK.Graphics; namespace osu.Game.Rulesets.Osu.Skinning.Legacy { - // todo: this should probably not be a SkinnableSprite, as this is always created for legacy skins and is recreated on skin change. - public partial class LegacyApproachCircle : SkinnableSprite + public partial class LegacyApproachCircle : Sprite { - private readonly IBindable accentColour = new Bindable(); - [Resolved] private DrawableHitObject drawableObject { get; set; } = null!; - public LegacyApproachCircle() - : base(@"approachcircle", OsuHitObject.OBJECT_DIMENSIONS * 2) - { - } + private IBindable accentColour = null!; [BackgroundDependencyLoader] - private void load() + private void load(ISkinSource skin) { - accentColour.BindTo(drawableObject.AccentColour); + var texture = skin.GetTexture(@"approachcircle"); + Debug.Assert(texture != null); + Texture = texture.WithMaximumSize(OsuHitObject.OBJECT_DIMENSIONS * 2); + + // account for the sprite being used for the default approach circle being taken from stable, + // when hitcircles have 5px padding on each size. this should be removed if we update the sprite. + Scale = new Vector2(128 / 118f); } protected override void LoadComplete() { base.LoadComplete(); + + accentColour = drawableObject.AccentColour.GetBoundCopy(); accentColour.BindValueChanged(colour => Colour = LegacyColourCompatibility.DisallowZeroAlpha(colour.NewValue), true); } - - protected override Drawable CreateDefault(ISkinComponentLookup lookup) - { - var drawable = base.CreateDefault(lookup); - - // account for the sprite being used for the default approach circle being taken from stable, - // when hitcircles have 5px padding on each size. this should be removed if we update the sprite. - drawable.Scale = new Vector2(128 / 118f); - - return drawable; - } } } diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs index b01c18031c..d2ebc68c52 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs @@ -163,7 +163,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy return null; case OsuSkinComponents.ApproachCircle: - if (IsProvidingLegacyResources) + if (GetTexture(@"approachcircle") != null) return new LegacyApproachCircle(); return null; From c9945b41c1007ab2ff18900d1d70686598e57b9d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 18:36:25 +0900 Subject: [PATCH 203/651] Remove rounding of slider velocity (when applied as scroll speed) This affects both osu!taiko and osu!mania. Closes https://github.com/ppy/osu/issues/25862. --- osu.Game/Beatmaps/ControlPoints/EffectControlPoint.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Beatmaps/ControlPoints/EffectControlPoint.cs b/osu.Game/Beatmaps/ControlPoints/EffectControlPoint.cs index 7edf892f35..0138ac7569 100644 --- a/osu.Game/Beatmaps/ControlPoints/EffectControlPoint.cs +++ b/osu.Game/Beatmaps/ControlPoints/EffectControlPoint.cs @@ -21,7 +21,6 @@ namespace osu.Game.Beatmaps.ControlPoints /// public readonly BindableDouble ScrollSpeedBindable = new BindableDouble(1) { - Precision = 0.01, MinValue = 0.01, MaxValue = 10 }; From 82e7643df55323a7e66fb9dc3351becf3357c469 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 19:45:35 +0900 Subject: [PATCH 204/651] Update IPC usages Of note, I've disabled IPC on visual test runners as we generally don't use IPC in these cases. Having it set means that the game will not open while visual tests are open, which has been a complaint from devs in the past. --- .../osu.Game.Rulesets.EmptyFreeform.Tests/VisualTestRunner.cs | 2 +- .../osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs | 2 +- .../osu.Game.Rulesets.EmptyScrolling.Tests/VisualTestRunner.cs | 2 +- .../osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs | 2 +- osu.Desktop/Program.cs | 2 +- .../Visual/Navigation/TestSceneInterProcessCommunication.cs | 2 +- osu.Game.Tournament.Tests/TournamentTestRunner.cs | 2 +- osu.Game/OsuGame.cs | 2 ++ osu.Game/Tests/CleanRunHeadlessGameHost.cs | 2 +- osu.Game/Tests/VisualTestRunner.cs | 2 +- 10 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/VisualTestRunner.cs b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/VisualTestRunner.cs index 03ee7c9204..63c481a623 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/VisualTestRunner.cs +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/VisualTestRunner.cs @@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.EmptyFreeform.Tests [STAThread] public static int Main(string[] args) { - using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu", new HostOptions { BindIPC = true })) + using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu")) { host.Run(new OsuTestBrowser()); return 0; diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs index 55c0cf6a3b..c44cbb845b 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs @@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Pippidon.Tests [STAThread] public static int Main(string[] args) { - using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu", new HostOptions { BindIPC = true })) + using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu")) { host.Run(new OsuTestBrowser()); return 0; diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/VisualTestRunner.cs b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/VisualTestRunner.cs index b45505678c..5beb6616a7 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/VisualTestRunner.cs +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/VisualTestRunner.cs @@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.EmptyScrolling.Tests [STAThread] public static int Main(string[] args) { - using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu", new HostOptions { BindIPC = true })) + using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu")) { host.Run(new OsuTestBrowser()); return 0; diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs index 55c0cf6a3b..c44cbb845b 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs @@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Pippidon.Tests [STAThread] public static int Main(string[] args) { - using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu", new HostOptions { BindIPC = true })) + using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu")) { host.Run(new OsuTestBrowser()); return 0; diff --git a/osu.Desktop/Program.cs b/osu.Desktop/Program.cs index 6b95a82703..a7453dc0e0 100644 --- a/osu.Desktop/Program.cs +++ b/osu.Desktop/Program.cs @@ -102,7 +102,7 @@ namespace osu.Desktop } } - using (DesktopGameHost host = Host.GetSuitableDesktopHost(gameName, new HostOptions { BindIPC = !tournamentClient })) + using (DesktopGameHost host = Host.GetSuitableDesktopHost(gameName, new HostOptions { IPCPort = !tournamentClient ? OsuGame.IPC_PORT : null })) { if (!host.IsPrimaryInstance) { diff --git a/osu.Game.Tests/Visual/Navigation/TestSceneInterProcessCommunication.cs b/osu.Game.Tests/Visual/Navigation/TestSceneInterProcessCommunication.cs index 1ecd38e1d3..83430b5665 100644 --- a/osu.Game.Tests/Visual/Navigation/TestSceneInterProcessCommunication.cs +++ b/osu.Game.Tests/Visual/Navigation/TestSceneInterProcessCommunication.cs @@ -63,7 +63,7 @@ namespace osu.Game.Tests.Visual.Navigation }); AddStep("create IPC sender channels", () => { - ipcSenderHost = new HeadlessGameHost(gameHost.Name, new HostOptions { BindIPC = true }); + ipcSenderHost = new HeadlessGameHost(gameHost.Name, new HostOptions { IPCPort = OsuGame.IPC_PORT }); osuSchemeLinkIPCSender = new OsuSchemeLinkIPCChannel(ipcSenderHost); archiveImportIPCSender = new ArchiveImportIPCChannel(ipcSenderHost); }); diff --git a/osu.Game.Tournament.Tests/TournamentTestRunner.cs b/osu.Game.Tournament.Tests/TournamentTestRunner.cs index 5f642b14f5..e09d1be22c 100644 --- a/osu.Game.Tournament.Tests/TournamentTestRunner.cs +++ b/osu.Game.Tournament.Tests/TournamentTestRunner.cs @@ -12,7 +12,7 @@ namespace osu.Game.Tournament.Tests [STAThread] public static int Main(string[] args) { - using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu-development", new HostOptions { BindIPC = true })) + using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu-development")) { host.Run(new TournamentTestBrowser()); return 0; diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 0d6eb1ea44..7138bf2175 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -80,6 +80,8 @@ namespace osu.Game [Cached(typeof(OsuGame))] public partial class OsuGame : OsuGameBase, IKeyBindingHandler, ILocalUserPlayInfo, IPerformFromScreenRunner, IOverlayManager, ILinkHandler { + public const int IPC_PORT = 44823; + /// /// The amount of global offset to apply when a left/right anchored overlay is displayed (ie. settings or notifications). /// diff --git a/osu.Game/Tests/CleanRunHeadlessGameHost.cs b/osu.Game/Tests/CleanRunHeadlessGameHost.cs index f3c69201e2..00e5b38b1a 100644 --- a/osu.Game/Tests/CleanRunHeadlessGameHost.cs +++ b/osu.Game/Tests/CleanRunHeadlessGameHost.cs @@ -27,7 +27,7 @@ namespace osu.Game.Tests [CallerMemberName] string callingMethodName = @"") : base($"{callingMethodName}-{Guid.NewGuid()}", new HostOptions { - BindIPC = bindIPC, + IPCPort = bindIPC ? OsuGame.IPC_PORT : null, }, bypassCleanup: bypassCleanupOnDispose, realtime: realtime) { this.bypassCleanupOnSetup = bypassCleanupOnSetup; diff --git a/osu.Game/Tests/VisualTestRunner.cs b/osu.Game/Tests/VisualTestRunner.cs index e04c71d193..1a9e03b2a4 100644 --- a/osu.Game/Tests/VisualTestRunner.cs +++ b/osu.Game/Tests/VisualTestRunner.cs @@ -12,7 +12,7 @@ namespace osu.Game.Tests [STAThread] public static int Main(string[] args) { - using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu-development", new HostOptions { BindIPC = true, })) + using (DesktopGameHost host = Host.GetSuitableDesktopHost(@"osu-development")) { host.Run(new OsuTestBrowser()); return 0; From c4e9bcd140bbb59a094c282fc7b21ac04e8ec5d2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 20:06:53 +0900 Subject: [PATCH 205/651] Remove test guarantee of audio time not advancing --- osu.Game.Tests/Visual/Gameplay/TestScenePause.cs | 2 +- osu.Game/Screens/Play/GameplayClockContainer.cs | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs index d55af2777f..73aa3be73d 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs @@ -122,7 +122,7 @@ namespace osu.Game.Tests.Visual.Gameplay resumeAndConfirm(); - AddAssert("Resumed without seeking forward", () => Player.LastResumeTime, () => Is.LessThanOrEqualTo(Player.LastPauseTime)); + AddAssert("continued playing forward", () => Player.LastResumeTime, () => Is.GreaterThanOrEqualTo(Player.LastPauseTime)); AddUntilStep("player playing", () => Player.LocalUserPlaying.Value); } diff --git a/osu.Game/Screens/Play/GameplayClockContainer.cs b/osu.Game/Screens/Play/GameplayClockContainer.cs index 4def1d36bb..c039d1e535 100644 --- a/osu.Game/Screens/Play/GameplayClockContainer.cs +++ b/osu.Game/Screens/Play/GameplayClockContainer.cs @@ -78,8 +78,6 @@ namespace osu.Game.Screens.Play isPaused.Value = false; - PrepareStart(); - // The case which caused this to be added is FrameStabilityContainer, which manages its own current and elapsed time. // Because we generally update our own current time quicker than children can query it (via Start/Seek/Update), // this means that the first frame ever exposed to children may have a non-zero current time. @@ -99,14 +97,6 @@ namespace osu.Game.Screens.Play }); } - /// - /// When is called, this will be run to give an opportunity to prepare the clock at the correct - /// start location. - /// - protected virtual void PrepareStart() - { - } - /// /// Seek to a specific time in gameplay. /// From 4532a409d23bc0cb2fffbecda32991c5278c4ea8 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 18 Jan 2024 04:06:02 +0300 Subject: [PATCH 206/651] Fix ConstrainedIconContainer always using masking --- osu.Game/Beatmaps/Drawables/DifficultyIcon.cs | 1 - .../Containers/ConstrainedIconContainer.cs | 18 ------------------ .../Toolbar/ToolbarRulesetTabButton.cs | 11 +---------- 3 files changed, 1 insertion(+), 29 deletions(-) diff --git a/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs b/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs index 1665ec52fa..eecf79aa34 100644 --- a/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs +++ b/osu.Game/Beatmaps/Drawables/DifficultyIcon.cs @@ -92,7 +92,6 @@ namespace osu.Game.Beatmaps.Drawables EdgeEffect = new EdgeEffectParameters { Colour = Color4.Black.Opacity(0.06f), - Type = EdgeEffectType.Shadow, Radius = 3, }, diff --git a/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs b/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs index 7722374c69..63ac84fcf7 100644 --- a/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs +++ b/osu.Game/Graphics/Containers/ConstrainedIconContainer.cs @@ -4,7 +4,6 @@ using System; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Effects; using osuTK; namespace osu.Game.Graphics.Containers @@ -17,21 +16,9 @@ namespace osu.Game.Graphics.Containers public Drawable Icon { get => InternalChild; - set => InternalChild = value; } - /// - /// Determines an edge effect of this . - /// Edge effects are e.g. glow or a shadow. - /// Only has an effect when is true. - /// - public new EdgeEffectParameters EdgeEffect - { - get => base.EdgeEffect; - set => base.EdgeEffect = value; - } - protected override void Update() { base.Update(); @@ -49,10 +36,5 @@ namespace osu.Game.Graphics.Containers InternalChild.Origin = Anchor.Centre; } } - - public ConstrainedIconContainer() - { - Masking = true; - } } } diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs index c224f0f9c9..3287ac6eaa 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs @@ -4,7 +4,6 @@ using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; -using osu.Framework.Graphics.Effects; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; using osu.Game.Graphics; @@ -58,15 +57,7 @@ namespace osu.Game.Overlays.Toolbar { set => Scheduler.AddOnce(() => { - if (value) - { - IconContainer.Colour = Color4Extensions.FromHex("#00FFAA"); - } - else - { - IconContainer.Colour = colours.GrayF; - IconContainer.EdgeEffect = new EdgeEffectParameters(); - } + IconContainer.Colour = value ? Color4Extensions.FromHex("#00FFAA") : colours.GrayF; }); } From 2afa4c7e1c761ce998199e39e86cd5d1e9228f49 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 14:10:16 +0900 Subject: [PATCH 207/651] Remove redundant `RequiresChildrenUpdate` usage We are already manually calling `base.UpdateSubTree` when we need to. Changing this flag is doing nothing and just adds to the complexity of the implementation. --- osu.Game/Rulesets/UI/FrameStabilityContainer.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs index 2af9916a6b..b6bf5ff53a 100644 --- a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs +++ b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs @@ -34,8 +34,6 @@ namespace osu.Game.Rulesets.UI /// internal bool FrameStablePlayback { get; set; } = true; - protected override bool RequiresChildrenUpdate => base.RequiresChildrenUpdate && state != PlaybackState.NotValid; - private readonly Bindable isCatchingUp = new Bindable(); private readonly Bindable waitingOnFrames = new Bindable(); From e73910571f35e69e409cec18cc597d232829bfa5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 14:15:22 +0900 Subject: [PATCH 208/651] Allow `FrameStabilityContainer` to continue updating while paused during replay playback --- osu.Game/Rulesets/UI/FrameStabilityContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs index b6bf5ff53a..ee19baaf65 100644 --- a/osu.Game/Rulesets/UI/FrameStabilityContainer.cs +++ b/osu.Game/Rulesets/UI/FrameStabilityContainer.cs @@ -122,7 +122,7 @@ namespace osu.Game.Rulesets.UI // if waiting on frames, run one update loop to determine if frames have arrived. state = PlaybackState.Valid; } - else if (IsPaused.Value) + else if (IsPaused.Value && !hasReplayAttached) { // time should not advance while paused, nor should anything run. state = PlaybackState.NotValid; From dafff26d0ecf6de7f27bb5a329455729ee3ce084 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 14:44:31 +0900 Subject: [PATCH 209/651] Tidy up implementation of `PlaybackSettings` --- .../Play/PlayerSettings/PlaybackSettings.cs | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 44cfa8d811..34f086da33 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -11,9 +11,9 @@ using osu.Game.Beatmaps; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; +using osu.Game.Localisation; using osu.Game.Screens.Edit.Timing; using osuTK; -using osu.Game.Localisation; namespace osu.Game.Screens.Play.PlayerSettings { @@ -28,26 +28,31 @@ namespace osu.Game.Screens.Play.PlayerSettings Precision = 0.01, }; - private readonly PlayerSliderBar rateSlider; + private PlayerSliderBar rateSlider = null!; - private readonly OsuSpriteText multiplierText; + private OsuSpriteText multiplierText = null!; - private readonly BindableBool isPaused = new BindableBool(); + private readonly IBindable isPaused = new BindableBool(); [Resolved] - private GameplayClockContainer? gameplayClock { get; set; } + private GameplayClockContainer gameplayClock { get; set; } = null!; [Resolved] - private GameplayState? gameplayState { get; set; } + private GameplayState gameplayState { get; set; } = null!; + + private IconButton pausePlay = null!; public PlaybackSettings() : base("playback") + { + } + + [BackgroundDependencyLoader] + private void load() { const double seek_amount = 5000; const double seek_fast_amount = 10000; - IconButton play; - Children = new Drawable[] { new FillFlowContainer @@ -82,7 +87,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Action = () => seek(-1, seek_amount), TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(seek_amount / 1000), }, - play = new IconButton + pausePlay = new IconButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, @@ -91,13 +96,10 @@ namespace osu.Game.Screens.Play.PlayerSettings Icon = FontAwesome.Regular.PlayCircle, Action = () => { - if (gameplayClock != null) - { - if (gameplayClock.IsRunning) - gameplayClock.Stop(); - else - gameplayClock.Start(); - } + if (gameplayClock.IsRunning) + gameplayClock.Stop(); + else + gameplayClock.Start(); }, }, new SeekButton @@ -141,26 +143,6 @@ namespace osu.Game.Screens.Play.PlayerSettings }, }, }; - - isPaused.BindValueChanged(paused => - { - if (!paused.NewValue) - { - play.TooltipText = ToastStrings.PauseTrack; - play.Icon = FontAwesome.Regular.PauseCircle; - } - else - { - play.TooltipText = ToastStrings.PlayTrack; - play.Icon = FontAwesome.Regular.PlayCircle; - } - }, true); - - void seek(int direction, double amount) - { - double target = Math.Clamp((gameplayClock?.CurrentTime ?? 0) + (direction * amount), 0, gameplayState?.Beatmap.GetLastObjectTime() ?? 0); - gameplayClock?.Seek(target); - } } protected override void LoadComplete() @@ -168,8 +150,26 @@ namespace osu.Game.Screens.Play.PlayerSettings base.LoadComplete(); rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.00}x", true); - if (gameplayClock != null) - isPaused.BindTarget = gameplayClock.IsPaused; + isPaused.BindTo(gameplayClock.IsPaused); + isPaused.BindValueChanged(paused => + { + if (!paused.NewValue) + { + pausePlay.TooltipText = ToastStrings.PauseTrack; + pausePlay.Icon = FontAwesome.Regular.PauseCircle; + } + else + { + pausePlay.TooltipText = ToastStrings.PlayTrack; + pausePlay.Icon = FontAwesome.Regular.PlayCircle; + } + }, true); + } + + private void seek(int direction, double amount) + { + double target = Math.Clamp(gameplayClock.CurrentTime + (direction * amount), 0, gameplayState.Beatmap.GetLastObjectTime()); + gameplayClock.Seek(target); } private partial class SeekButton : IconButton From 60e972cd159dcfe653ed19cc2d96ed179701205d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 14:59:35 +0900 Subject: [PATCH 210/651] Add ability to step forward/backwards single frames --- .../PlayerSettingsOverlayStrings.cs | 10 ++++++ .../Play/PlayerSettings/PlaybackSettings.cs | 33 ++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/osu.Game/Localisation/PlayerSettingsOverlayStrings.cs b/osu.Game/Localisation/PlayerSettingsOverlayStrings.cs index 1aedd9fc5b..60874da561 100644 --- a/osu.Game/Localisation/PlayerSettingsOverlayStrings.cs +++ b/osu.Game/Localisation/PlayerSettingsOverlayStrings.cs @@ -9,6 +9,16 @@ namespace osu.Game.Localisation { private const string prefix = @"osu.Game.Resources.Localisation.PlaybackSettings"; + /// + /// "Step backward one frame" + /// + public static LocalisableString StepBackward => new TranslatableString(getKey(@"step_backward_frame"), @"Step backward one frame"); + + /// + /// "Step forward one frame" + /// + public static LocalisableString StepForward => new TranslatableString(getKey(@"step_forward_frame"), @"Step forward one frame"); + /// /// "Seek backward {0} seconds" /// diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index 34f086da33..b946805be8 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; @@ -87,13 +88,20 @@ namespace osu.Game.Screens.Play.PlayerSettings Action = () => seek(-1, seek_amount), TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(seek_amount / 1000), }, + new SeekButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Icon = FontAwesome.Solid.StepBackward, + Action = () => seekFrame(-1), + TooltipText = PlayerSettingsOverlayStrings.StepBackward, + }, pausePlay = new IconButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, Scale = new Vector2(1.4f), IconScale = new Vector2(1.4f), - Icon = FontAwesome.Regular.PlayCircle, Action = () => { if (gameplayClock.IsRunning) @@ -103,6 +111,14 @@ namespace osu.Game.Screens.Play.PlayerSettings }, }, new SeekButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Icon = FontAwesome.Solid.StepForward, + Action = () => seekFrame(1), + TooltipText = PlayerSettingsOverlayStrings.StepForward, + }, + new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, @@ -166,6 +182,21 @@ namespace osu.Game.Screens.Play.PlayerSettings }, true); } + private void seekFrame(int direction) + { + gameplayClock.Stop(); + + var frames = gameplayState.Score.Replay.Frames; + + if (frames.Count == 0) + return; + + gameplayClock.Seek(direction < 0 + ? (frames.LastOrDefault(f => f.Time < gameplayClock.CurrentTime) ?? frames.First()).Time + : (frames.FirstOrDefault(f => f.Time > gameplayClock.CurrentTime) ?? frames.Last()).Time + ); + } + private void seek(int direction, double amount) { double target = Math.Clamp(gameplayClock.CurrentTime + (direction * amount), 0, gameplayState.Beatmap.GetLastObjectTime()); From 8c4af58109b202e4505f62634c8e9001397c5d3f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 15:08:24 +0900 Subject: [PATCH 211/651] Keep replay controls expanded by default --- osu.Game/Configuration/OsuConfigManager.cs | 2 ++ osu.Game/Screens/Play/ReplayPlayer.cs | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index c05831d043..6b2cb4ee74 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -142,6 +142,7 @@ namespace osu.Game.Configuration SetDefault(OsuSetting.FadePlayfieldWhenHealthLow, true); SetDefault(OsuSetting.KeyOverlay, false); SetDefault(OsuSetting.ReplaySettingsOverlay, true); + SetDefault(OsuSetting.ReplayPlaybackControlsExpanded, true); SetDefault(OsuSetting.GameplayLeaderboard, true); SetDefault(OsuSetting.AlwaysPlayFirstComboBreak, true); @@ -421,6 +422,7 @@ namespace osu.Game.Configuration ProfileCoverExpanded, EditorLimitedDistanceSnap, ReplaySettingsOverlay, + ReplayPlaybackControlsExpanded, AutomaticallyDownloadMissingBeatmaps, EditorShowSpeedChanges, TouchDisableGameplayTaps, diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index 805f907466..d4d6e7ecd0 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -12,6 +12,7 @@ using osu.Framework.Bindables; using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; using osu.Game.Beatmaps; +using osu.Game.Configuration; using osu.Game.Input.Bindings; using osu.Game.Rulesets.Mods; using osu.Game.Scoring; @@ -52,7 +53,7 @@ namespace osu.Game.Screens.Play } [BackgroundDependencyLoader] - private void load() + private void load(OsuConfigManager config) { if (!LoadedBeatmapSuccessfully) return; @@ -60,7 +61,7 @@ namespace osu.Game.Screens.Play var playbackSettings = new PlaybackSettings { Depth = float.MaxValue, - Expanded = { Value = false } + Expanded = { BindTarget = config.GetBindable(OsuSetting.ReplayPlaybackControlsExpanded) } }; if (GameplayClockContainer is MasterGameplayClockContainer master) From 22cfc8605094aebb6809333582543d6443756899 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 18 Jan 2024 14:24:48 +0300 Subject: [PATCH 212/651] Add failing test case --- osu.Game.Tests/Visual/Settings/TestSceneSettingsItem.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/osu.Game.Tests/Visual/Settings/TestSceneSettingsItem.cs b/osu.Game.Tests/Visual/Settings/TestSceneSettingsItem.cs index 2926b11067..ee0c64aa3f 100644 --- a/osu.Game.Tests/Visual/Settings/TestSceneSettingsItem.cs +++ b/osu.Game.Tests/Visual/Settings/TestSceneSettingsItem.cs @@ -40,8 +40,15 @@ namespace osu.Game.Tests.Visual.Settings AddStep("change value from default", () => textBox.Current.Value = "non-default"); AddUntilStep("restore button shown", () => revertToDefaultButton.Alpha > 0); + AddStep("disable setting", () => textBox.Current.Disabled = true); + AddUntilStep("restore button still shown", () => revertToDefaultButton.Alpha > 0); + + AddStep("enable setting", () => textBox.Current.Disabled = false); AddStep("restore default", () => textBox.Current.SetDefault()); AddUntilStep("restore button hidden", () => revertToDefaultButton.Alpha == 0); + + AddStep("disable setting", () => textBox.Current.Disabled = true); + AddUntilStep("restore button still hidden", () => revertToDefaultButton.Alpha == 0); } [Test] From b97c3ac9ee1c3a0e34afb296dc0e99543d002011 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 18 Jan 2024 14:20:07 +0300 Subject: [PATCH 213/651] Fix revert-to-default button appearing on disabled settings regardless of value --- osu.Game/Overlays/RevertToDefaultButton.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/RevertToDefaultButton.cs b/osu.Game/Overlays/RevertToDefaultButton.cs index 582138b0b4..6fa5209f64 100644 --- a/osu.Game/Overlays/RevertToDefaultButton.cs +++ b/osu.Game/Overlays/RevertToDefaultButton.cs @@ -115,7 +115,12 @@ namespace osu.Game.Overlays Enabled.Value = !current.Disabled; - this.FadeTo(current.Disabled ? 0.2f : (current.IsDefault ? 0 : 1), fade_duration, Easing.OutQuint); + if (current.IsDefault) + this.FadeTo(0, fade_duration, Easing.OutQuint); + else if (current.Disabled) + this.FadeTo(0.2f, fade_duration, Easing.OutQuint); + else + this.FadeTo(1, fade_duration, Easing.OutQuint); if (IsHovered && Enabled.Value) { From c50534c8191e3fe408fe9e04dcbaf41c2b9c4577 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 20:38:15 +0900 Subject: [PATCH 214/651] Move seek/step logic into `ReplayPlayer` --- .../Play/PlayerSettings/PlaybackSettings.cs | 51 +++++-------------- osu.Game/Screens/Play/ReplayPlayer.cs | 42 +++++++++++---- 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs index b946805be8..b3d07421ed 100644 --- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs +++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs @@ -1,14 +1,11 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; -using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; -using osu.Game.Beatmaps; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; @@ -36,10 +33,10 @@ namespace osu.Game.Screens.Play.PlayerSettings private readonly IBindable isPaused = new BindableBool(); [Resolved] - private GameplayClockContainer gameplayClock { get; set; } = null!; + private ReplayPlayer replayPlayer { get; set; } = null!; [Resolved] - private GameplayState gameplayState { get; set; } = null!; + private GameplayClockContainer gameplayClock { get; set; } = null!; private IconButton pausePlay = null!; @@ -51,9 +48,6 @@ namespace osu.Game.Screens.Play.PlayerSettings [BackgroundDependencyLoader] private void load() { - const double seek_amount = 5000; - const double seek_fast_amount = 10000; - Children = new Drawable[] { new FillFlowContainer @@ -77,23 +71,23 @@ namespace osu.Game.Screens.Play.PlayerSettings Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastBackward, - Action = () => seek(-1, seek_fast_amount), - TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(seek_fast_amount / 1000), + Action = () => replayPlayer.SeekInDirection(-10), + TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(10 * ReplayPlayer.BASE_SEEK_AMOUNT / 1000), }, new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.Backward, - Action = () => seek(-1, seek_amount), - TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(seek_amount / 1000), + Action = () => replayPlayer.SeekInDirection(-1), + TooltipText = PlayerSettingsOverlayStrings.SeekBackwardSeconds(ReplayPlayer.BASE_SEEK_AMOUNT / 1000), }, new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.StepBackward, - Action = () => seekFrame(-1), + Action = () => replayPlayer.StepFrame(-1), TooltipText = PlayerSettingsOverlayStrings.StepBackward, }, pausePlay = new IconButton @@ -115,7 +109,7 @@ namespace osu.Game.Screens.Play.PlayerSettings Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.StepForward, - Action = () => seekFrame(1), + Action = () => replayPlayer.StepFrame(1), TooltipText = PlayerSettingsOverlayStrings.StepForward, }, new SeekButton @@ -123,16 +117,16 @@ namespace osu.Game.Screens.Play.PlayerSettings Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.Forward, - Action = () => seek(1, seek_amount), - TooltipText = PlayerSettingsOverlayStrings.SeekForwardSeconds(seek_amount / 1000), + Action = () => replayPlayer.SeekInDirection(1), + TooltipText = PlayerSettingsOverlayStrings.SeekForwardSeconds(ReplayPlayer.BASE_SEEK_AMOUNT / 1000), }, new SeekButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.Solid.FastForward, - Action = () => seek(1, seek_fast_amount), - TooltipText = PlayerSettingsOverlayStrings.SeekForwardSeconds(seek_fast_amount / 1000), + Action = () => replayPlayer.SeekInDirection(10), + TooltipText = PlayerSettingsOverlayStrings.SeekForwardSeconds(10 * ReplayPlayer.BASE_SEEK_AMOUNT / 1000), }, }, }, @@ -182,27 +176,6 @@ namespace osu.Game.Screens.Play.PlayerSettings }, true); } - private void seekFrame(int direction) - { - gameplayClock.Stop(); - - var frames = gameplayState.Score.Replay.Frames; - - if (frames.Count == 0) - return; - - gameplayClock.Seek(direction < 0 - ? (frames.LastOrDefault(f => f.Time < gameplayClock.CurrentTime) ?? frames.First()).Time - : (frames.FirstOrDefault(f => f.Time > gameplayClock.CurrentTime) ?? frames.Last()).Time - ); - } - - private void seek(int direction, double amount) - { - double target = Math.Clamp(gameplayClock.CurrentTime + (direction * amount), 0, gameplayState.Beatmap.GetLastObjectTime()); - gameplayClock.Seek(target); - } - private partial class SeekButton : IconButton { public SeekButton() diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index d4d6e7ecd0..a26a2b9904 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -23,8 +23,11 @@ using osu.Game.Users; namespace osu.Game.Screens.Play { + [Cached] public partial class ReplayPlayer : Player, IKeyBindingHandler { + public const double BASE_SEEK_AMOUNT = 1000; + private readonly Func, Score> createScore; private readonly bool replayIsFailedScore; @@ -93,16 +96,22 @@ namespace osu.Game.Screens.Play public bool OnPressed(KeyBindingPressEvent e) { - const double keyboard_seek_amount = 5000; - switch (e.Action) { + case GlobalAction.StepReplayBackward: + StepFrame(-1); + return true; + + case GlobalAction.StepReplayForward: + StepFrame(1); + return true; + case GlobalAction.SeekReplayBackward: - keyboardSeek(-1); + SeekInDirection(-1); return true; case GlobalAction.SeekReplayForward: - keyboardSeek(1); + SeekInDirection(1); return true; case GlobalAction.TogglePauseReplay: @@ -114,13 +123,28 @@ namespace osu.Game.Screens.Play } return false; + } - void keyboardSeek(int direction) - { - double target = Math.Clamp(GameplayClockContainer.CurrentTime + direction * keyboard_seek_amount, 0, GameplayState.Beatmap.GetLastObjectTime()); + public void StepFrame(int direction) + { + GameplayClockContainer.Stop(); - Seek(target); - } + var frames = GameplayState.Score.Replay.Frames; + + if (frames.Count == 0) + return; + + GameplayClockContainer.Seek(direction < 0 + ? (frames.LastOrDefault(f => f.Time < GameplayClockContainer.CurrentTime) ?? frames.First()).Time + : (frames.FirstOrDefault(f => f.Time > GameplayClockContainer.CurrentTime) ?? frames.Last()).Time + ); + } + + public void SeekInDirection(float amount) + { + double target = Math.Clamp(GameplayClockContainer.CurrentTime + amount * BASE_SEEK_AMOUNT, 0, GameplayState.Beatmap.GetLastObjectTime()); + + Seek(target); } public void OnReleased(KeyBindingReleaseEvent e) From 0383bdf6a15d57a0a499b6b88ac53d4eb57b4f2b Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 18 Jan 2024 20:38:25 +0900 Subject: [PATCH 215/651] Add bindings for stepping backward/forward --- osu.Game/Input/Bindings/GlobalActionContainer.cs | 10 +++++++++- osu.Game/Localisation/GlobalActionKeyBindingStrings.cs | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/osu.Game/Input/Bindings/GlobalActionContainer.cs b/osu.Game/Input/Bindings/GlobalActionContainer.cs index 5a39c02185..436334cfe1 100644 --- a/osu.Game/Input/Bindings/GlobalActionContainer.cs +++ b/osu.Game/Input/Bindings/GlobalActionContainer.cs @@ -170,6 +170,8 @@ namespace osu.Game.Input.Bindings new KeyBinding(InputKey.MouseMiddle, GlobalAction.TogglePauseReplay), new KeyBinding(InputKey.Left, GlobalAction.SeekReplayBackward), new KeyBinding(InputKey.Right, GlobalAction.SeekReplayForward), + new KeyBinding(InputKey.Comma, GlobalAction.StepReplayBackward), + new KeyBinding(InputKey.Period, GlobalAction.StepReplayForward), new KeyBinding(new[] { InputKey.Control, InputKey.H }, GlobalAction.ToggleReplaySettings), }; @@ -411,7 +413,13 @@ namespace osu.Game.Input.Bindings IncreaseOffset, [LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.DecreaseOffset))] - DecreaseOffset + DecreaseOffset, + + [LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.StepReplayForward))] + StepReplayForward, + + [LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.StepReplayBackward))] + StepReplayBackward, } public enum GlobalActionCategory diff --git a/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs b/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs index ca27d0ff95..703e0ff1ca 100644 --- a/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs +++ b/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs @@ -324,6 +324,16 @@ namespace osu.Game.Localisation /// public static LocalisableString SeekReplayBackward => new TranslatableString(getKey(@"seek_replay_backward"), @"Seek replay backward"); + /// + /// "Seek replay forward one frame" + /// + public static LocalisableString StepReplayForward => new TranslatableString(getKey(@"step_replay_forward"), @"Seek replay forward one frame"); + + /// + /// "Step replay backward one frame" + /// + public static LocalisableString StepReplayBackward => new TranslatableString(getKey(@"step_replay_backward"), @"Step replay backward one frame"); + /// /// "Toggle chat focus" /// From 3eeefd5b7e8708894c26474cf3868fc54e662f61 Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Thu, 18 Jan 2024 16:13:48 -0800 Subject: [PATCH 216/651] Fix changelog stream user count only accounting for latest build --- osu.Game/Online/API/Requests/Responses/APIUpdateStream.cs | 3 +++ osu.Game/Overlays/Changelog/ChangelogUpdateStreamItem.cs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Online/API/Requests/Responses/APIUpdateStream.cs b/osu.Game/Online/API/Requests/Responses/APIUpdateStream.cs index 76d1941d9d..dac72f2488 100644 --- a/osu.Game/Online/API/Requests/Responses/APIUpdateStream.cs +++ b/osu.Game/Online/API/Requests/Responses/APIUpdateStream.cs @@ -28,6 +28,9 @@ namespace osu.Game.Online.API.Requests.Responses [JsonProperty("latest_build")] public APIChangelogBuild LatestBuild { get; set; } + [JsonProperty("user_count")] + public int UserCount { get; set; } + public bool Equals(APIUpdateStream other) => Id == other?.Id; internal static readonly Dictionary KNOWN_STREAMS = new Dictionary diff --git a/osu.Game/Overlays/Changelog/ChangelogUpdateStreamItem.cs b/osu.Game/Overlays/Changelog/ChangelogUpdateStreamItem.cs index 08ea373fb1..30273d2405 100644 --- a/osu.Game/Overlays/Changelog/ChangelogUpdateStreamItem.cs +++ b/osu.Game/Overlays/Changelog/ChangelogUpdateStreamItem.cs @@ -24,7 +24,7 @@ namespace osu.Game.Overlays.Changelog protected override LocalisableString AdditionalText => Value.LatestBuild.DisplayVersion; - protected override LocalisableString InfoText => Value.LatestBuild.Users > 0 ? $"{"user".ToQuantity(Value.LatestBuild.Users, "N0")} online" : null; + protected override LocalisableString InfoText => Value.UserCount > 0 ? $"{"user".ToQuantity(Value.UserCount, "N0")} online" : null; protected override Color4 GetBarColour(OsuColour colours) => Value.Colour; } From ce4fd6aca51690455f9a1f02ada35d95269883ed Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 19 Jan 2024 23:48:05 +0300 Subject: [PATCH 217/651] Rename `DEFAULT_HEIGHT` to `BASE_HEIGHT` --- .../Edit/Blueprints/HitPlacementBlueprint.cs | 2 +- .../Edit/Blueprints/TaikoSpanPlacementBlueprint.cs | 6 +++--- osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs | 2 +- .../Skinning/Legacy/TaikoLegacyHitTarget.cs | 2 +- osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/Edit/Blueprints/HitPlacementBlueprint.cs b/osu.Game.Rulesets.Taiko/Edit/Blueprints/HitPlacementBlueprint.cs index 8b1a4f688c..329fff5b42 100644 --- a/osu.Game.Rulesets.Taiko/Edit/Blueprints/HitPlacementBlueprint.cs +++ b/osu.Game.Rulesets.Taiko/Edit/Blueprints/HitPlacementBlueprint.cs @@ -21,7 +21,7 @@ namespace osu.Game.Rulesets.Taiko.Edit.Blueprints { InternalChild = piece = new HitPiece { - Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT) + Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.BASE_HEIGHT) }; } diff --git a/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs b/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs index b0919417a4..cd52398086 100644 --- a/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs +++ b/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs @@ -39,15 +39,15 @@ namespace osu.Game.Rulesets.Taiko.Edit.Blueprints { headPiece = new HitPiece { - Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT) + Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.BASE_HEIGHT) }, lengthPiece = new LengthPiece { - Height = TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT + Height = TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.BASE_HEIGHT }, tailPiece = new HitPiece { - Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT) + Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.BASE_HEIGHT) } }; } diff --git a/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs b/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs index 733772e21f..26bbb6d71b 100644 --- a/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs +++ b/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs @@ -63,7 +63,7 @@ namespace osu.Game.Rulesets.Taiko.Mods /// private Vector2 adjustSizeForPlayfieldAspectRatio(float size) { - return new Vector2(0, size * taikoPlayfield.DrawHeight / TaikoPlayfield.DEFAULT_HEIGHT); + return new Vector2(0, size * taikoPlayfield.DrawHeight / TaikoPlayfield.BASE_HEIGHT); } protected override void UpdateFlashlightSize(float size) diff --git a/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs b/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs index 492782f0d1..2f845adcd8 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs @@ -53,7 +53,7 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy // Relying on RelativeSizeAxes.Both + FillMode.Fit doesn't work due to the precise pixel layout requirements. // This is a bit ugly but makes the non-legacy implementations a lot cleaner to implement. - content.Scale = new Vector2(DrawHeight / TaikoPlayfield.DEFAULT_HEIGHT); + content.Scale = new Vector2(DrawHeight / TaikoPlayfield.BASE_HEIGHT); } } } diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs index 7e3ed7a4d4..af4ed0557a 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs @@ -28,9 +28,9 @@ namespace osu.Game.Rulesets.Taiko.UI public partial class TaikoPlayfield : ScrollingPlayfield { /// - /// Default height of a when inside a . + /// Base height of a when inside a . /// - public const float DEFAULT_HEIGHT = 200; + public const float BASE_HEIGHT = 200; /// /// Whether the hit target should be nudged further towards the left area, matching the stable "classic" position. From 3e17d01cebc88c56615f67c0deea7351168a46b1 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 19 Jan 2024 23:49:14 +0300 Subject: [PATCH 218/651] Rewrite taiko playfield adjustment container to keep height constant --- .../UI/TaikoPlayfieldAdjustmentContainer.cs | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs index 54608b77de..1bc9f7d89c 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs @@ -5,23 +5,31 @@ using System; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Rulesets.UI; +using osuTK; namespace osu.Game.Rulesets.Taiko.UI { public partial class TaikoPlayfieldAdjustmentContainer : PlayfieldAdjustmentContainer { - private const float default_relative_height = TaikoPlayfield.DEFAULT_HEIGHT / 768; - public const float MAXIMUM_ASPECT = 16f / 9f; public const float MINIMUM_ASPECT = 5f / 4f; public readonly IBindable LockPlayfieldAspectRange = new BindableBool(true); + public TaikoPlayfieldAdjustmentContainer() + { + RelativeSizeAxes = Axes.X; + RelativePositionAxes = Axes.Y; + Height = TaikoPlayfield.BASE_HEIGHT; + } + protected override void Update() { base.Update(); - float height = default_relative_height; + const float base_relative_height = TaikoPlayfield.BASE_HEIGHT / 768; + + float relativeHeight = base_relative_height; // Players coming from stable expect to be able to change the aspect ratio regardless of the window size. // We originally wanted to limit this more, but there was considerable pushback from the community. @@ -33,19 +41,20 @@ namespace osu.Game.Rulesets.Taiko.UI float currentAspect = Parent!.ChildSize.X / Parent!.ChildSize.Y; if (currentAspect > MAXIMUM_ASPECT) - height *= currentAspect / MAXIMUM_ASPECT; + relativeHeight *= currentAspect / MAXIMUM_ASPECT; else if (currentAspect < MINIMUM_ASPECT) - height *= currentAspect / MINIMUM_ASPECT; + relativeHeight *= currentAspect / MINIMUM_ASPECT; } // Limit the maximum relative height of the playfield to one-third of available area to avoid it masking out on extreme resolutions. - height = Math.Min(height, 1f / 3f); - Height = height; + relativeHeight = Math.Min(relativeHeight, 1f / 3f); // Position the taiko playfield exactly one playfield from the top of the screen, if there is enough space for it. // Note that the relative height cannot exceed one-third - if that limit is hit, the playfield will be exactly centered. - RelativePositionAxes = Axes.Y; - Y = height; + Y = relativeHeight; + + Scale = new Vector2(Math.Max(relativeHeight / base_relative_height, 1f)); + Width = 1 / Scale.X; } } } From f5ce9eaf7512b27c9df3b03adb8d8a76b7462969 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 19 Jan 2024 23:58:55 +0300 Subject: [PATCH 219/651] Refactor taiko playfield layout to use constant values --- osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs | 38 ++++++++------------ 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs index af4ed0557a..4e1691ffe0 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs @@ -21,7 +21,6 @@ using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Taiko.Objects; using osu.Game.Rulesets.Taiko.Scoring; using osu.Game.Skinning; -using osuTK; namespace osu.Game.Rulesets.Taiko.UI { @@ -44,7 +43,6 @@ namespace osu.Game.Rulesets.Taiko.UI private JudgementContainer judgementContainer = null!; private ScrollingHitObjectContainer drumRollHitContainer = null!; internal Drawable HitTarget = null!; - private SkinnableDrawable mascot = null!; private JudgementPooler judgementPooler = null!; private readonly IDictionary explosionPools = new Dictionary(); @@ -59,13 +57,11 @@ namespace osu.Game.Rulesets.Taiko.UI /// private BarLinePlayfield barLinePlayfield = null!; - private Container barLineContent = null!; - private Container hitObjectContent = null!; - private Container overlayContent = null!; - [BackgroundDependencyLoader] private void load(OsuColour colours) { + const float hit_target_width = BASE_HEIGHT; + inputDrum = new InputDrum { Anchor = Anchor.CentreLeft, @@ -89,7 +85,7 @@ namespace osu.Game.Rulesets.Taiko.UI inputDrum.CreateProxy(), } }, - mascot = new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.Mascot), _ => Empty()) + new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.Mascot), _ => Empty()) { Origin = Anchor.BottomLeft, Anchor = Anchor.TopLeft, @@ -101,14 +97,13 @@ namespace osu.Game.Rulesets.Taiko.UI { Name = "Right area", RelativeSizeAxes = Axes.Both, - RelativePositionAxes = Axes.Both, Children = new Drawable[] { new Container { - Name = "Elements before hit objects", - RelativeSizeAxes = Axes.Both, - FillMode = FillMode.Fit, + Name = "Elements behind hit objects", + RelativeSizeAxes = Axes.Y, + Width = hit_target_width, Children = new[] { new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.KiaiGlow), _ => Empty()) @@ -125,10 +120,11 @@ namespace osu.Game.Rulesets.Taiko.UI } } }, - barLineContent = new Container + new Container { Name = "Bar line content", RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = hit_target_width / 2 }, Children = new Drawable[] { UnderlayElements = new Container @@ -138,17 +134,19 @@ namespace osu.Game.Rulesets.Taiko.UI barLinePlayfield = new BarLinePlayfield(), } }, - hitObjectContent = new Container + new Container { Name = "Masked hit objects content", RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = hit_target_width / 2 }, Masking = true, Child = HitObjectContainer, }, - overlayContent = new Container + new Container { - Name = "Elements after hit objects", + Name = "Overlay content", RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = hit_target_width / 2 }, Children = new Drawable[] { drumRollHitContainer = new DrumRollHitContainer(), @@ -226,14 +224,8 @@ namespace osu.Game.Rulesets.Taiko.UI { base.Update(); - // Padding is required to be updated for elements which are based on "absolute" X sized elements. - // This is basically allowing for correct alignment as relative pieces move around them. - rightArea.Padding = new MarginPadding { Left = inputDrum.Width }; - barLineContent.Padding = new MarginPadding { Left = HitTarget.DrawWidth / 2 }; - hitObjectContent.Padding = new MarginPadding { Left = HitTarget.DrawWidth / 2 }; - overlayContent.Padding = new MarginPadding { Left = HitTarget.DrawWidth / 2 }; - - mascot.Scale = new Vector2(DrawHeight / DEFAULT_HEIGHT); + // todo: input drum width should be constant. + rightArea.Padding = new MarginPadding { Left = inputDrum.DrawWidth }; } #region Pooling support From fa2c33c64173d51d5ad14654e12e3f956f17cac8 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 20 Jan 2024 00:20:43 +0300 Subject: [PATCH 220/651] Upscale playfield by difference in game height as well I honestly don't have much clue about this one but doing so matches master. --- osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs index 1bc9f7d89c..57722b8065 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs @@ -53,7 +53,7 @@ namespace osu.Game.Rulesets.Taiko.UI // Note that the relative height cannot exceed one-third - if that limit is hit, the playfield will be exactly centered. Y = relativeHeight; - Scale = new Vector2(Math.Max(relativeHeight / base_relative_height, 1f)); + Scale = new Vector2(Math.Max((Parent!.ChildSize.Y / 768f) * (relativeHeight / base_relative_height), 1f)); Width = 1 / Scale.X; } } From 0c03326eaf1bb5954b118c8f58ba721b8058fc8b Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 20 Jan 2024 01:25:04 +0300 Subject: [PATCH 221/651] Update remaining usages of playfield height --- osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs | 2 +- .../Skinning/Legacy/TaikoLegacyHitTarget.cs | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs b/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs index 26bbb6d71b..64f2f4c18a 100644 --- a/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs +++ b/osu.Game.Rulesets.Taiko/Mods/TaikoModFlashlight.cs @@ -63,7 +63,7 @@ namespace osu.Game.Rulesets.Taiko.Mods /// private Vector2 adjustSizeForPlayfieldAspectRatio(float size) { - return new Vector2(0, size * taikoPlayfield.DrawHeight / TaikoPlayfield.BASE_HEIGHT); + return new Vector2(0, size * taikoPlayfield.Parent!.Scale.Y); } protected override void UpdateFlashlightSize(float size) diff --git a/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs b/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs index 2f845adcd8..cf9d8dd52e 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs @@ -5,7 +5,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; -using osu.Game.Rulesets.Taiko.UI; using osu.Game.Skinning; using osuTK; @@ -13,14 +12,12 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy { public partial class TaikoLegacyHitTarget : CompositeDrawable { - private Container content = null!; - [BackgroundDependencyLoader] private void load(ISkinSource skin) { RelativeSizeAxes = Axes.Both; - InternalChild = content = new Container + InternalChild = new Container { RelativeSizeAxes = Axes.Both, Anchor = Anchor.Centre, @@ -46,14 +43,5 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy } }; } - - protected override void Update() - { - base.Update(); - - // Relying on RelativeSizeAxes.Both + FillMode.Fit doesn't work due to the precise pixel layout requirements. - // This is a bit ugly but makes the non-legacy implementations a lot cleaner to implement. - content.Scale = new Vector2(DrawHeight / TaikoPlayfield.BASE_HEIGHT); - } } } From d4fef99e1f677fa3af1e1822ff9d9f2116a4be59 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 19 Jan 2024 23:26:35 +0300 Subject: [PATCH 222/651] Define constant input drum width for osu!taiko --- .../Skinning/TestSceneInputDrum.cs | 7 +++-- .../Skinning/Argon/ArgonInputDrum.cs | 2 +- .../Skinning/Default/DefaultInputDrum.cs | 2 +- .../Skinning/Legacy/LegacyInputDrum.cs | 28 ++++++------------- osu.Game.Rulesets.Taiko/UI/InputDrum.cs | 9 +----- osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs | 20 +++++-------- 6 files changed, 24 insertions(+), 44 deletions(-) diff --git a/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneInputDrum.cs b/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneInputDrum.cs index 3c6319ddf9..900d6523cf 100644 --- a/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneInputDrum.cs +++ b/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneInputDrum.cs @@ -30,8 +30,11 @@ namespace osu.Game.Rulesets.Taiko.Tests.Skinning { Anchor = Anchor.Centre, Origin = Anchor.Centre, - Size = new Vector2(200), - Child = new InputDrum() + Size = new Vector2(180f, 200f), + Child = new InputDrum + { + RelativeSizeAxes = Axes.Both, + } } }); } diff --git a/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonInputDrum.cs b/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonInputDrum.cs index f7b7105bdc..f22c7bf017 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonInputDrum.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonInputDrum.cs @@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Argon public ArgonInputDrum() { - RelativeSizeAxes = Axes.Y; + RelativeSizeAxes = Axes.X; } [BackgroundDependencyLoader] diff --git a/osu.Game.Rulesets.Taiko/Skinning/Default/DefaultInputDrum.cs b/osu.Game.Rulesets.Taiko/Skinning/Default/DefaultInputDrum.cs index 60bacf6413..3eb4f6b8a6 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Default/DefaultInputDrum.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Default/DefaultInputDrum.cs @@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Default { public DefaultInputDrum() { - RelativeSizeAxes = Axes.Y; + RelativeSizeAxes = Axes.X; } [BackgroundDependencyLoader] diff --git a/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs b/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs index 8ad419f8bd..07a7f237ba 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Legacy/LegacyInputDrum.cs @@ -8,6 +8,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; +using osu.Game.Rulesets.Taiko.UI; using osu.Game.Skinning; using osuTK; @@ -18,22 +19,20 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy /// internal partial class LegacyInputDrum : Container { - private Container content = null!; private LegacyHalfDrum left = null!; private LegacyHalfDrum right = null!; public LegacyInputDrum() { - RelativeSizeAxes = Axes.Y; - AutoSizeAxes = Axes.X; + RelativeSizeAxes = Axes.Both; } [BackgroundDependencyLoader] private void load(ISkinSource skin) { - Child = content = new Container + Child = new Container { - Size = new Vector2(180, 200), + RelativeSizeAxes = Axes.Both, Children = new Drawable[] { new Sprite @@ -66,33 +65,24 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy const float ratio = 1.6f; // because the right half is flipped, we need to position using width - position to get the true "topleft" origin position - float negativeScaleAdjust = content.Width / ratio; + const float negative_scale_adjust = TaikoPlayfield.INPUT_DRUM_WIDTH / ratio; if (skin.GetConfig(SkinConfiguration.LegacySetting.Version)?.Value >= 2.1m) { left.Centre.Position = new Vector2(0, taiko_bar_y) * ratio; - right.Centre.Position = new Vector2(negativeScaleAdjust - 56, taiko_bar_y) * ratio; + right.Centre.Position = new Vector2(negative_scale_adjust - 56, taiko_bar_y) * ratio; left.Rim.Position = new Vector2(0, taiko_bar_y) * ratio; - right.Rim.Position = new Vector2(negativeScaleAdjust - 56, taiko_bar_y) * ratio; + right.Rim.Position = new Vector2(negative_scale_adjust - 56, taiko_bar_y) * ratio; } else { left.Centre.Position = new Vector2(18, taiko_bar_y + 31) * ratio; - right.Centre.Position = new Vector2(negativeScaleAdjust - 54, taiko_bar_y + 31) * ratio; + right.Centre.Position = new Vector2(negative_scale_adjust - 54, taiko_bar_y + 31) * ratio; left.Rim.Position = new Vector2(8, taiko_bar_y + 23) * ratio; - right.Rim.Position = new Vector2(negativeScaleAdjust - 53, taiko_bar_y + 23) * ratio; + right.Rim.Position = new Vector2(negative_scale_adjust - 53, taiko_bar_y + 23) * ratio; } } - protected override void Update() - { - base.Update(); - - // Relying on RelativeSizeAxes.Both + FillMode.Fit doesn't work due to the precise pixel layout requirements. - // This is a bit ugly but makes the non-legacy implementations a lot cleaner to implement. - content.Scale = new Vector2(DrawHeight / content.Size.Y); - } - /// /// A half-drum. Contains one centre and one rim hit. /// diff --git a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs index 725857ed34..d0a8cf647d 100644 --- a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs +++ b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs @@ -14,12 +14,6 @@ namespace osu.Game.Rulesets.Taiko.UI /// internal partial class InputDrum : Container { - public InputDrum() - { - AutoSizeAxes = Axes.X; - RelativeSizeAxes = Axes.Y; - } - [BackgroundDependencyLoader] private void load() { @@ -27,8 +21,7 @@ namespace osu.Game.Rulesets.Taiko.UI { new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.InputDrum), _ => new DefaultInputDrum()) { - RelativeSizeAxes = Axes.Y, - AutoSizeAxes = Axes.X, + RelativeSizeAxes = Axes.Both, }, }; } diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs index 4e1691ffe0..95907bcb8b 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs @@ -31,6 +31,8 @@ namespace osu.Game.Rulesets.Taiko.UI /// public const float BASE_HEIGHT = 200; + public const float INPUT_DRUM_WIDTH = 180f; + /// /// Whether the hit target should be nudged further towards the left area, matching the stable "classic" position. /// @@ -49,7 +51,6 @@ namespace osu.Game.Rulesets.Taiko.UI private ProxyContainer topLevelHitContainer = null!; private InputDrum inputDrum = null!; - private Container rightArea = null!; /// /// is purposefully not called on this to prevent i.e. being able to interact @@ -66,8 +67,8 @@ namespace osu.Game.Rulesets.Taiko.UI { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, - AutoSizeAxes = Axes.X, RelativeSizeAxes = Axes.Y, + Width = INPUT_DRUM_WIDTH, }; InternalChildren = new[] @@ -76,8 +77,8 @@ namespace osu.Game.Rulesets.Taiko.UI new Container { Name = "Left overlay", - RelativeSizeAxes = Axes.Both, - FillMode = FillMode.Fit, + RelativeSizeAxes = Axes.Y, + Width = INPUT_DRUM_WIDTH, BorderColour = colours.Gray0, Children = new[] { @@ -93,10 +94,11 @@ namespace osu.Game.Rulesets.Taiko.UI RelativeSizeAxes = Axes.None, Y = 0.2f }, - rightArea = new Container + new Container { Name = "Right area", RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = INPUT_DRUM_WIDTH }, Children = new Drawable[] { new Container @@ -220,14 +222,6 @@ namespace osu.Game.Rulesets.Taiko.UI topLevelHitContainer.Add(taikoObject.CreateProxiedContent()); } - protected override void Update() - { - base.Update(); - - // todo: input drum width should be constant. - rightArea.Padding = new MarginPadding { Left = inputDrum.DrawWidth }; - } - #region Pooling support public override void Add(HitObject h) From 2f618b7f35514f1025d4750cb3726e670f4aa2d8 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 20 Jan 2024 00:28:26 +0300 Subject: [PATCH 223/651] Change taiko hit position to always match stable --- osu.Game.Rulesets.Taiko/Mods/TaikoModClassic.cs | 3 --- osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs | 14 +++++--------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/Mods/TaikoModClassic.cs b/osu.Game.Rulesets.Taiko/Mods/TaikoModClassic.cs index cdeaafde10..f63d6c2673 100644 --- a/osu.Game.Rulesets.Taiko/Mods/TaikoModClassic.cs +++ b/osu.Game.Rulesets.Taiko/Mods/TaikoModClassic.cs @@ -16,9 +16,6 @@ namespace osu.Game.Rulesets.Taiko.Mods { var drawableTaikoRuleset = (DrawableTaikoRuleset)drawableRuleset; drawableTaikoRuleset.LockPlayfieldAspectRange.Value = false; - - var playfield = (TaikoPlayfield)drawableRuleset.Playfield; - playfield.ClassicHitTargetPosition.Value = true; } public void ApplyToDrawableHitObject(DrawableHitObject drawable) diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs index 95907bcb8b..0510f08068 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfield.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; -using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Primitives; @@ -33,11 +32,6 @@ namespace osu.Game.Rulesets.Taiko.UI public const float INPUT_DRUM_WIDTH = 180f; - /// - /// Whether the hit target should be nudged further towards the left area, matching the stable "classic" position. - /// - public Bindable ClassicHitTargetPosition = new BindableBool(); - public Container UnderlayElements { get; private set; } = null!; private Container hitExplosionContainer = null!; @@ -62,6 +56,7 @@ namespace osu.Game.Rulesets.Taiko.UI private void load(OsuColour colours) { const float hit_target_width = BASE_HEIGHT; + const float hit_target_offset = -24f; inputDrum = new InputDrum { @@ -106,6 +101,7 @@ namespace osu.Game.Rulesets.Taiko.UI Name = "Elements behind hit objects", RelativeSizeAxes = Axes.Y, Width = hit_target_width, + X = hit_target_offset, Children = new[] { new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.KiaiGlow), _ => Empty()) @@ -126,7 +122,7 @@ namespace osu.Game.Rulesets.Taiko.UI { Name = "Bar line content", RelativeSizeAxes = Axes.Both, - Padding = new MarginPadding { Left = hit_target_width / 2 }, + Padding = new MarginPadding { Left = hit_target_width / 2 + hit_target_offset }, Children = new Drawable[] { UnderlayElements = new Container @@ -140,7 +136,7 @@ namespace osu.Game.Rulesets.Taiko.UI { Name = "Masked hit objects content", RelativeSizeAxes = Axes.Both, - Padding = new MarginPadding { Left = hit_target_width / 2 }, + Padding = new MarginPadding { Left = hit_target_width / 2 + hit_target_offset }, Masking = true, Child = HitObjectContainer, }, @@ -148,7 +144,7 @@ namespace osu.Game.Rulesets.Taiko.UI { Name = "Overlay content", RelativeSizeAxes = Axes.Both, - Padding = new MarginPadding { Left = hit_target_width / 2 }, + Padding = new MarginPadding { Left = hit_target_width / 2 + hit_target_offset }, Children = new Drawable[] { drumRollHitContainer = new DrumRollHitContainer(), From d8cba1cbfdee1b39b1403e90bcad33444d4e1acb Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 20 Jan 2024 00:22:32 +0300 Subject: [PATCH 224/651] Move taiko playfield down a nudge to visually match stable --- .../UI/TaikoPlayfieldAdjustmentContainer.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs index 57722b8065..9a5fc90a05 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs @@ -51,7 +51,12 @@ namespace osu.Game.Rulesets.Taiko.UI // Position the taiko playfield exactly one playfield from the top of the screen, if there is enough space for it. // Note that the relative height cannot exceed one-third - if that limit is hit, the playfield will be exactly centered. - Y = relativeHeight; + float playfieldPosition = relativeHeight; + + // arbitrary offset to make playfield position match stable. + playfieldPosition += 0.022f; + + Y = playfieldPosition; Scale = new Vector2(Math.Max((Parent!.ChildSize.Y / 768f) * (relativeHeight / base_relative_height), 1f)); Width = 1 / Scale.X; From 45effdb6dfaddf3e6fc5ed0aa882629e8ff99470 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 20 Jan 2024 08:41:34 +0300 Subject: [PATCH 225/651] Remove local vertex batching from triangles backgrounds --- osu.Game/Graphics/Backgrounds/Triangles.cs | 11 +---------- osu.Game/Graphics/Backgrounds/TrianglesV2.cs | 12 +----------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/osu.Game/Graphics/Backgrounds/Triangles.cs b/osu.Game/Graphics/Backgrounds/Triangles.cs index 1a78c1ec5e..8db7f3a1c3 100644 --- a/osu.Game/Graphics/Backgrounds/Triangles.cs +++ b/osu.Game/Graphics/Backgrounds/Triangles.cs @@ -15,7 +15,6 @@ using osu.Framework.Graphics.Primitives; using osu.Framework.Allocation; using System.Collections.Generic; using osu.Framework.Graphics.Rendering; -using osu.Framework.Graphics.Rendering.Vertices; using osu.Framework.Lists; using osu.Framework.Bindables; @@ -264,7 +263,6 @@ namespace osu.Game.Graphics.Backgrounds private readonly Vector2 triangleSize = new Vector2(1f, equilateral_triangle_ratio) * triangle_size; private Vector2 size; - private IVertexBatch vertexBatch; public TrianglesDrawNode(Triangles source) : base(source) @@ -290,12 +288,6 @@ namespace osu.Game.Graphics.Backgrounds { base.Draw(renderer); - if (Source.AimCount > 0 && (vertexBatch == null || vertexBatch.Size != Source.AimCount)) - { - vertexBatch?.Dispose(); - vertexBatch = renderer.CreateQuadBatch(Source.AimCount, 1); - } - borderDataBuffer ??= renderer.CreateUniformBuffer(); borderDataBuffer.Data = borderDataBuffer.Data with { @@ -333,7 +325,7 @@ namespace osu.Game.Graphics.Backgrounds triangleQuad.Height ) / relativeSize; - renderer.DrawQuad(texture, drawQuad, colourInfo, new RectangleF(0, 0, 1, 1), vertexBatch.AddAction, textureCoords: textureCoords); + renderer.DrawQuad(texture, drawQuad, colourInfo, new RectangleF(0, 0, 1, 1), textureCoords: textureCoords); } shader.Unbind(); @@ -356,7 +348,6 @@ namespace osu.Game.Graphics.Backgrounds { base.Dispose(isDisposing); - vertexBatch?.Dispose(); borderDataBuffer?.Dispose(); } } diff --git a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs index a20fd78569..4f611d9def 100644 --- a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs +++ b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs @@ -10,7 +10,6 @@ using osu.Framework.Graphics.Primitives; using osu.Framework.Allocation; using System.Collections.Generic; using osu.Framework.Graphics.Rendering; -using osu.Framework.Graphics.Rendering.Vertices; using osu.Framework.Bindables; using osu.Framework.Graphics; @@ -196,8 +195,6 @@ namespace osu.Game.Graphics.Backgrounds private float texelSize; private bool masking; - private IVertexBatch? vertexBatch; - public TrianglesDrawNode(TrianglesV2 source) : base(source) { @@ -235,12 +232,6 @@ namespace osu.Game.Graphics.Backgrounds if (Source.AimCount == 0 || thickness == 0) return; - if (vertexBatch == null || vertexBatch.Size != Source.AimCount) - { - vertexBatch?.Dispose(); - vertexBatch = renderer.CreateQuadBatch(Source.AimCount, 1); - } - borderDataBuffer ??= renderer.CreateUniformBuffer(); borderDataBuffer.Data = borderDataBuffer.Data with { @@ -273,7 +264,7 @@ namespace osu.Game.Graphics.Backgrounds triangleQuad.Height ) / relativeSize; - renderer.DrawQuad(texture, drawQuad, DrawColourInfo.Colour.Interpolate(triangleQuad), new RectangleF(0, 0, 1, 1), vertexBatch.AddAction, textureCoords: textureCoords); + renderer.DrawQuad(texture, drawQuad, DrawColourInfo.Colour.Interpolate(triangleQuad), new RectangleF(0, 0, 1, 1), textureCoords: textureCoords); } shader.Unbind(); @@ -296,7 +287,6 @@ namespace osu.Game.Graphics.Backgrounds { base.Dispose(isDisposing); - vertexBatch?.Dispose(); borderDataBuffer?.Dispose(); } } From 3ad3b052dffe4a1434868ad3cd2fe37c67784d24 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 02:10:36 +0300 Subject: [PATCH 226/651] Enable masking is osu logo --- osu.Game/Screens/Menu/OsuLogo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs index 75ef8be02e..243612eee1 100644 --- a/osu.Game/Screens/Menu/OsuLogo.cs +++ b/osu.Game/Screens/Menu/OsuLogo.cs @@ -192,6 +192,7 @@ namespace osu.Game.Screens.Menu ColourLight = Color4Extensions.FromHex(@"ff7db7"), ColourDark = Color4Extensions.FromHex(@"de5b95"), RelativeSizeAxes = Axes.Both, + Masking = true }, } }, From a3703d657ab5ba2a93dbd89cad0adb6a21dfbd17 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 02:12:49 +0300 Subject: [PATCH 227/651] Enable masking in popup dialog --- osu.Game/Overlays/Dialog/PopupDialog.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs index 4ac37a63e2..1c1196a1c5 100644 --- a/osu.Game/Overlays/Dialog/PopupDialog.cs +++ b/osu.Game/Overlays/Dialog/PopupDialog.cs @@ -150,6 +150,7 @@ namespace osu.Game.Overlays.Dialog ColourLight = Color4Extensions.FromHex(@"271e26"), ColourDark = Color4Extensions.FromHex(@"1e171e"), TriangleScale = 4, + Masking = true }, flashLayer = new Box { From 087d0f03a4595d5eac66bd2f8ffb2ca6ea85264a Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 02:15:48 +0300 Subject: [PATCH 228/651] Enable masking in toolbar --- osu.Game/Overlays/Toolbar/ToolbarButton.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index 1da2e1b744..bdd16b347d 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -255,6 +255,7 @@ namespace osu.Game.Overlays.Toolbar RelativeSizeAxes = Axes.Both, ColourLight = OsuColour.Gray(40), ColourDark = OsuColour.Gray(20), + Masking = true }, }; } From 421ae73715ad9f1d3f5dcc331c8ac81304830187 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 02:21:09 +0300 Subject: [PATCH 229/651] Enable masking in DrawableCarouselBeatmap --- osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs index baf0a14062..ecf65fe55c 100644 --- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs @@ -109,7 +109,8 @@ namespace osu.Game.Screens.Select.Carousel TriangleScale = 2, RelativeSizeAxes = Axes.Both, ColourLight = Color4Extensions.FromHex(@"3a7285"), - ColourDark = Color4Extensions.FromHex(@"123744") + ColourDark = Color4Extensions.FromHex(@"123744"), + Masking = true }, new FillFlowContainer { From 60f7b4ea2f582b8fa2f1f15dd70c0febe0ea711d Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 02:25:29 +0300 Subject: [PATCH 230/651] Enable masking in DrawableRank --- osu.Game/Online/Leaderboards/DrawableRank.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Online/Leaderboards/DrawableRank.cs b/osu.Game/Online/Leaderboards/DrawableRank.cs index 5177f35478..bbf981af09 100644 --- a/osu.Game/Online/Leaderboards/DrawableRank.cs +++ b/osu.Game/Online/Leaderboards/DrawableRank.cs @@ -50,6 +50,7 @@ namespace osu.Game.Online.Leaderboards ColourDark = rankColour.Darken(0.1f), ColourLight = rankColour.Lighten(0.1f), Velocity = 0.25f, + Masking = true }, new OsuSpriteText { From 6ba3546be5c2ef8f514e6652f2965bfb70d1b59c Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 02:28:14 +0300 Subject: [PATCH 231/651] Enable masking in RoundedButton --- osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs b/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs index 6aded3fe32..65bd5f49c2 100644 --- a/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs +++ b/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs @@ -68,6 +68,7 @@ namespace osu.Game.Graphics.UserInterfaceV2 SpawnRatio = 0.6f, RelativeSizeAxes = Axes.Both, Depth = float.MaxValue, + Masking = true }); updateColours(); From 1999e772f6df41e35dafb2e185f6ff49a31089bf Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 21 Jan 2024 10:31:27 +0900 Subject: [PATCH 232/651] Fix `FollowPointConnection` pool filling up when follow points are hidden Closes https://github.com/ppy/osu/issues/26642. I think this applied to all pooling cases here. --- .../Objects/Pooling/PooledDrawableWithLifetimeContainer.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs index 3b45acc7bb..1b0176cae5 100644 --- a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs +++ b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs @@ -153,6 +153,9 @@ namespace osu.Game.Rulesets.Objects.Pooling protected override bool CheckChildrenLife() { + if (!IsPresent) + return false; + bool aliveChanged = base.CheckChildrenLife(); aliveChanged |= lifetimeManager.Update(Time.Current - PastLifetimeExtension, Time.Current + FutureLifetimeExtension); return aliveChanged; From 2dedead1d12c39fdb2f26385664b9f37105877fa Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 21 Jan 2024 10:55:52 +0900 Subject: [PATCH 233/651] Allow debug instances to coexist alongside release instances --- osu.Game/OsuGame.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 7138bf2175..c244708385 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -80,7 +80,12 @@ namespace osu.Game [Cached(typeof(OsuGame))] public partial class OsuGame : OsuGameBase, IKeyBindingHandler, ILocalUserPlayInfo, IPerformFromScreenRunner, IOverlayManager, ILinkHandler { +#if DEBUG + // Different port allows runnning release and debug builds alongside each other. + public const int IPC_PORT = 44824; +#else public const int IPC_PORT = 44823; +#endif /// /// The amount of global offset to apply when a left/right anchored overlay is displayed (ie. settings or notifications). From e003ecb5937f5d1239b64250e8968908bf41c165 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 04:57:48 +0300 Subject: [PATCH 234/651] Change default masking value to true --- osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs | 1 + osu.Game/Graphics/Backgrounds/Triangles.cs | 4 ++-- osu.Game/Graphics/Backgrounds/TrianglesV2.cs | 4 ++-- osu.Game/Graphics/UserInterface/DialogButton.cs | 1 + osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs | 1 - osu.Game/Online/Leaderboards/DrawableRank.cs | 1 - osu.Game/Overlays/Dialog/PopupDialog.cs | 1 - osu.Game/Overlays/Mods/ModSelectColumn.cs | 1 + osu.Game/Overlays/Toolbar/ToolbarButton.cs | 1 - osu.Game/Screens/Menu/OsuLogo.cs | 1 - osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs | 1 - 11 files changed, 7 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs index f1143cf14d..16cd302b88 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs @@ -15,6 +15,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default { TriangleScale = 1.2f; HideAlphaDiscrepancies = false; + Masking = false; } protected override void Update() diff --git a/osu.Game/Graphics/Backgrounds/Triangles.cs b/osu.Game/Graphics/Backgrounds/Triangles.cs index 8db7f3a1c3..cf74d6ef62 100644 --- a/osu.Game/Graphics/Backgrounds/Triangles.cs +++ b/osu.Game/Graphics/Backgrounds/Triangles.cs @@ -78,9 +78,9 @@ namespace osu.Game.Graphics.Backgrounds /// /// If enabled, only the portion of triangles that falls within this 's - /// shape is drawn to the screen. + /// shape is drawn to the screen. Default is true. /// - public bool Masking { get; set; } + public bool Masking { get; set; } = true; /// /// Whether we should drop-off alpha values of triangles more quickly to improve diff --git a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs index 4f611d9def..40b076ebc8 100644 --- a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs +++ b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs @@ -34,9 +34,9 @@ namespace osu.Game.Graphics.Backgrounds /// /// If enabled, only the portion of triangles that falls within this 's - /// shape is drawn to the screen. + /// shape is drawn to the screen. Default is true. /// - public bool Masking { get; set; } + public bool Masking { get; set; } = true; private readonly BindableFloat spawnRatio = new BindableFloat(1f); diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs index c920597a95..59acbecbbf 100644 --- a/osu.Game/Graphics/UserInterface/DialogButton.cs +++ b/osu.Game/Graphics/UserInterface/DialogButton.cs @@ -150,6 +150,7 @@ namespace osu.Game.Graphics.UserInterface TriangleScale = 4, ColourDark = OsuColour.Gray(0.88f), Shear = new Vector2(-0.2f, 0), + Masking = false }, }, }, diff --git a/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs b/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs index 65bd5f49c2..6aded3fe32 100644 --- a/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs +++ b/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs @@ -68,7 +68,6 @@ namespace osu.Game.Graphics.UserInterfaceV2 SpawnRatio = 0.6f, RelativeSizeAxes = Axes.Both, Depth = float.MaxValue, - Masking = true }); updateColours(); diff --git a/osu.Game/Online/Leaderboards/DrawableRank.cs b/osu.Game/Online/Leaderboards/DrawableRank.cs index bbf981af09..5177f35478 100644 --- a/osu.Game/Online/Leaderboards/DrawableRank.cs +++ b/osu.Game/Online/Leaderboards/DrawableRank.cs @@ -50,7 +50,6 @@ namespace osu.Game.Online.Leaderboards ColourDark = rankColour.Darken(0.1f), ColourLight = rankColour.Lighten(0.1f), Velocity = 0.25f, - Masking = true }, new OsuSpriteText { diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs index 1c1196a1c5..4ac37a63e2 100644 --- a/osu.Game/Overlays/Dialog/PopupDialog.cs +++ b/osu.Game/Overlays/Dialog/PopupDialog.cs @@ -150,7 +150,6 @@ namespace osu.Game.Overlays.Dialog ColourLight = Color4Extensions.FromHex(@"271e26"), ColourDark = Color4Extensions.FromHex(@"1e171e"), TriangleScale = 4, - Masking = true }, flashLayer = new Box { diff --git a/osu.Game/Overlays/Mods/ModSelectColumn.cs b/osu.Game/Overlays/Mods/ModSelectColumn.cs index 1c56763bd9..631bb72ced 100644 --- a/osu.Game/Overlays/Mods/ModSelectColumn.cs +++ b/osu.Game/Overlays/Mods/ModSelectColumn.cs @@ -95,6 +95,7 @@ namespace osu.Game.Overlays.Mods Height = header_height, Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0), Velocity = 0.7f, + Masking = false }, headerText = new OsuTextFlowContainer(t => { diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index bdd16b347d..1da2e1b744 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -255,7 +255,6 @@ namespace osu.Game.Overlays.Toolbar RelativeSizeAxes = Axes.Both, ColourLight = OsuColour.Gray(40), ColourDark = OsuColour.Gray(20), - Masking = true }, }; } diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs index 243612eee1..75ef8be02e 100644 --- a/osu.Game/Screens/Menu/OsuLogo.cs +++ b/osu.Game/Screens/Menu/OsuLogo.cs @@ -192,7 +192,6 @@ namespace osu.Game.Screens.Menu ColourLight = Color4Extensions.FromHex(@"ff7db7"), ColourDark = Color4Extensions.FromHex(@"de5b95"), RelativeSizeAxes = Axes.Both, - Masking = true }, } }, diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs index ecf65fe55c..4a28b3212e 100644 --- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs @@ -110,7 +110,6 @@ namespace osu.Game.Screens.Select.Carousel RelativeSizeAxes = Axes.Both, ColourLight = Color4Extensions.FromHex(@"3a7285"), ColourDark = Color4Extensions.FromHex(@"123744"), - Masking = true }, new FillFlowContainer { From a69fd8198db3901fffa43a323ddb15a6df029713 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 21 Jan 2024 10:57:23 +0900 Subject: [PATCH 235/651] Update framework and other nuget packages - Moq held back because dicks - NUnit held back because large API changes (trivial but effort) - SignalR held back due to api deprecations --- ...u.Game.Rulesets.EmptyFreeform.Tests.csproj | 2 +- .../osu.Game.Rulesets.Pippidon.Tests.csproj | 2 +- ....Game.Rulesets.EmptyScrolling.Tests.csproj | 2 +- .../osu.Game.Rulesets.Pippidon.Tests.csproj | 2 +- osu.Desktop/osu.Desktop.csproj | 4 ++-- .../osu.Game.Benchmarks.csproj | 2 +- .../osu.Game.Rulesets.Catch.Tests.csproj | 2 +- .../osu.Game.Rulesets.Mania.Tests.csproj | 2 +- .../osu.Game.Rulesets.Osu.Tests.csproj | 2 +- .../osu.Game.Rulesets.Taiko.Tests.csproj | 2 +- osu.Game.Tests/osu.Game.Tests.csproj | 2 +- .../osu.Game.Tournament.Tests.csproj | 2 +- osu.Game/osu.Game.csproj | 20 +++++++++---------- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj index 2baa7ee0e0..5babdb47ff 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj index a2308e6dfc..5d64ca832a 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj index e839d2657c..6796a8962b 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj index a2308e6dfc..5d64ca832a 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj index f37cfdc5f1..d6a11fa924 100644 --- a/osu.Desktop/osu.Desktop.csproj +++ b/osu.Desktop/osu.Desktop.csproj @@ -23,9 +23,9 @@ - + - + diff --git a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj index 5de21a68d0..47c93fbd02 100644 --- a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj +++ b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj @@ -8,7 +8,7 @@ - + diff --git a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj index c45c85833c..0a77845343 100644 --- a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj +++ b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj @@ -2,7 +2,7 @@ - + diff --git a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj index b991db408c..877b9c3ea4 100644 --- a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj +++ b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj @@ -2,7 +2,7 @@ - + diff --git a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj index ea033cda45..9c248abd66 100644 --- a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj +++ b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj @@ -3,7 +3,7 @@ - + diff --git a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj index 48465bb119..4eb6b0ab3d 100644 --- a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj +++ b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj @@ -2,7 +2,7 @@ - + diff --git a/osu.Game.Tests/osu.Game.Tests.csproj b/osu.Game.Tests/osu.Game.Tests.csproj index ef6c16f2c4..7b08524240 100644 --- a/osu.Game.Tests/osu.Game.Tests.csproj +++ b/osu.Game.Tests/osu.Game.Tests.csproj @@ -4,7 +4,7 @@ - + diff --git a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj index 2cc07dd9ed..3b00f103c4 100644 --- a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj +++ b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index f33ddac66f..1b1abe3971 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -21,12 +21,12 @@ - + - - - - + + + + @@ -36,13 +36,13 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + - + - - - + + + From 1393f52b2bf537bacf2248db501068f5f2b165b8 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 21 Jan 2024 05:20:42 +0300 Subject: [PATCH 236/651] Rename Masking to ClampToDrawable --- osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs | 2 +- .../Visual/Background/TestSceneTrianglesBackground.cs | 2 +- .../Visual/Background/TestSceneTrianglesV2Background.cs | 2 +- osu.Game/Graphics/Backgrounds/Triangles.cs | 8 ++++---- osu.Game/Graphics/Backgrounds/TrianglesV2.cs | 8 ++++---- osu.Game/Graphics/UserInterface/DialogButton.cs | 2 +- osu.Game/Overlays/Mods/ModSelectColumn.cs | 2 +- .../Screens/Select/Carousel/DrawableCarouselBeatmap.cs | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs index 16cd302b88..566176505d 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs @@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default { TriangleScale = 1.2f; HideAlphaDiscrepancies = false; - Masking = false; + ClampToDrawable = false; } protected override void Update() diff --git a/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs b/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs index 378dd99664..4733b7f92f 100644 --- a/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs +++ b/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs @@ -40,7 +40,7 @@ namespace osu.Game.Tests.Visual.Background AddSliderStep("Triangle scale", 0f, 10f, 1f, s => triangles.TriangleScale = s); AddSliderStep("Seed", 0, 1000, 0, s => triangles.Reset(s)); - AddToggleStep("Masking", m => triangles.Masking = m); + AddToggleStep("ClampToDrawable", c => triangles.ClampToDrawable = c); } } } diff --git a/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs b/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs index 01a2464b8e..71d1baddc8 100644 --- a/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs +++ b/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs @@ -128,7 +128,7 @@ namespace osu.Game.Tests.Visual.Background AddStep("White colour", () => box.Colour = triangles.Colour = maskedTriangles.Colour = Color4.White); AddStep("Vertical gradient", () => box.Colour = triangles.Colour = maskedTriangles.Colour = ColourInfo.GradientVertical(Color4.White, Color4.Red)); AddStep("Horizontal gradient", () => box.Colour = triangles.Colour = maskedTriangles.Colour = ColourInfo.GradientHorizontal(Color4.White, Color4.Red)); - AddToggleStep("Masking", m => maskedTriangles.Masking = m); + AddToggleStep("ClampToDrawable", c => maskedTriangles.ClampToDrawable = c); } } } diff --git a/osu.Game/Graphics/Backgrounds/Triangles.cs b/osu.Game/Graphics/Backgrounds/Triangles.cs index cf74d6ef62..d7bfeb7731 100644 --- a/osu.Game/Graphics/Backgrounds/Triangles.cs +++ b/osu.Game/Graphics/Backgrounds/Triangles.cs @@ -80,7 +80,7 @@ namespace osu.Game.Graphics.Backgrounds /// If enabled, only the portion of triangles that falls within this 's /// shape is drawn to the screen. Default is true. /// - public bool Masking { get; set; } = true; + public bool ClampToDrawable { get; set; } = true; /// /// Whether we should drop-off alpha values of triangles more quickly to improve @@ -257,7 +257,7 @@ namespace osu.Game.Graphics.Backgrounds private IShader shader; private Texture texture; - private bool masking; + private bool clamp; private readonly List parts = new List(); private readonly Vector2 triangleSize = new Vector2(1f, equilateral_triangle_ratio) * triangle_size; @@ -276,7 +276,7 @@ namespace osu.Game.Graphics.Backgrounds shader = Source.shader; texture = Source.texture; size = Source.DrawSize; - masking = Source.Masking; + clamp = Source.ClampToDrawable; parts.Clear(); parts.AddRange(Source.parts); @@ -306,7 +306,7 @@ namespace osu.Game.Graphics.Backgrounds Vector2 topLeft = particle.Position - new Vector2(relativeSize.X * 0.5f, 0f); - Quad triangleQuad = masking ? clampToDrawable(topLeft, relativeSize) : new Quad(topLeft.X, topLeft.Y, relativeSize.X, relativeSize.Y); + Quad triangleQuad = clamp ? clampToDrawable(topLeft, relativeSize) : new Quad(topLeft.X, topLeft.Y, relativeSize.X, relativeSize.Y); var drawQuad = new Quad( Vector2Extensions.Transform(triangleQuad.TopLeft * size, DrawInfo.Matrix), diff --git a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs index 40b076ebc8..f723b1b358 100644 --- a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs +++ b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs @@ -36,7 +36,7 @@ namespace osu.Game.Graphics.Backgrounds /// If enabled, only the portion of triangles that falls within this 's /// shape is drawn to the screen. Default is true. /// - public bool Masking { get; set; } = true; + public bool ClampToDrawable { get; set; } = true; private readonly BindableFloat spawnRatio = new BindableFloat(1f); @@ -193,7 +193,7 @@ namespace osu.Game.Graphics.Backgrounds private Vector2 size; private float thickness; private float texelSize; - private bool masking; + private bool clamp; public TrianglesDrawNode(TrianglesV2 source) : base(source) @@ -208,7 +208,7 @@ namespace osu.Game.Graphics.Backgrounds texture = Source.texture; size = Source.DrawSize; thickness = Source.Thickness; - masking = Source.Masking; + clamp = Source.ClampToDrawable; Quad triangleQuad = new Quad( Vector2Extensions.Transform(Vector2.Zero, DrawInfo.Matrix), @@ -248,7 +248,7 @@ namespace osu.Game.Graphics.Backgrounds { Vector2 topLeft = particle.Position - new Vector2(relativeSize.X * 0.5f, 0f); - Quad triangleQuad = masking ? clampToDrawable(topLeft, relativeSize) : new Quad(topLeft.X, topLeft.Y, relativeSize.X, relativeSize.Y); + Quad triangleQuad = clamp ? clampToDrawable(topLeft, relativeSize) : new Quad(topLeft.X, topLeft.Y, relativeSize.X, relativeSize.Y); var drawQuad = new Quad( Vector2Extensions.Transform(triangleQuad.TopLeft * size, DrawInfo.Matrix), diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs index 59acbecbbf..10aca017f1 100644 --- a/osu.Game/Graphics/UserInterface/DialogButton.cs +++ b/osu.Game/Graphics/UserInterface/DialogButton.cs @@ -150,7 +150,7 @@ namespace osu.Game.Graphics.UserInterface TriangleScale = 4, ColourDark = OsuColour.Gray(0.88f), Shear = new Vector2(-0.2f, 0), - Masking = false + ClampToDrawable = false }, }, }, diff --git a/osu.Game/Overlays/Mods/ModSelectColumn.cs b/osu.Game/Overlays/Mods/ModSelectColumn.cs index 631bb72ced..05454159c7 100644 --- a/osu.Game/Overlays/Mods/ModSelectColumn.cs +++ b/osu.Game/Overlays/Mods/ModSelectColumn.cs @@ -95,7 +95,7 @@ namespace osu.Game.Overlays.Mods Height = header_height, Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0), Velocity = 0.7f, - Masking = false + ClampToDrawable = false }, headerText = new OsuTextFlowContainer(t => { diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs index 4a28b3212e..baf0a14062 100644 --- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs @@ -109,7 +109,7 @@ namespace osu.Game.Screens.Select.Carousel TriangleScale = 2, RelativeSizeAxes = Axes.Both, ColourLight = Color4Extensions.FromHex(@"3a7285"), - ColourDark = Color4Extensions.FromHex(@"123744"), + ColourDark = Color4Extensions.FromHex(@"123744") }, new FillFlowContainer { From 18d16018d340b38729b2ddbcb46e3bcb5b3fe3b3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 21 Jan 2024 12:17:16 +0900 Subject: [PATCH 237/651] Fix failing tests due to pooling safety changes --- .../Skinning/TestSceneBarLine.cs | 40 +++++++--------- .../TestSceneDrawableJudgement.cs | 47 ++++++++++--------- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneBarLine.cs b/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneBarLine.cs index ab9f57ecc3..a5c18babe2 100644 --- a/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneBarLine.cs +++ b/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneBarLine.cs @@ -1,10 +1,8 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using System.Collections.Generic; using NUnit.Framework; -using osu.Framework.Graphics; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mania.UI; @@ -16,37 +14,35 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning [Test] public void TestMinor() { - AddStep("Create barlines", () => recreate()); + AddStep("Create barlines", recreate); } - private void recreate(Func>? createBarLines = null) + private void recreate() { var stageDefinitions = new List { new StageDefinition(4), }; - SetContents(_ => new ManiaPlayfield(stageDefinitions).With(s => + SetContents(_ => { - if (createBarLines != null) + var maniaPlayfield = new ManiaPlayfield(stageDefinitions); + + // Must be scheduled so the pool is loaded before we try and retrieve from it. + Schedule(() => { - var barLines = createBarLines(); - - foreach (var b in barLines) - s.Add(b); - - return; - } - - for (int i = 0; i < 64; i++) - { - s.Add(new BarLine + for (int i = 0; i < 64; i++) { - StartTime = Time.Current + i * 500, - Major = i % 4 == 0, - }); - } - })); + maniaPlayfield.Add(new BarLine + { + StartTime = Time.Current + i * 500, + Major = i % 4 == 0, + }); + } + }); + + return maniaPlayfield; + }); } } } diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgement.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgement.cs index 874130233a..5f5596cbb3 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgement.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgement.cs @@ -25,16 +25,16 @@ namespace osu.Game.Rulesets.Osu.Tests [Resolved] private OsuConfigManager config { get; set; } = null!; - private readonly List> pools; + private readonly List> pools = new List>(); - public TestSceneDrawableJudgement() + [TestCaseSource(nameof(validResults))] + public void Test(HitResult result) { - pools = new List>(); - - foreach (HitResult result in Enum.GetValues(typeof(HitResult)).OfType().Skip(1)) - showResult(result); + showResult(result); } + private static IEnumerable validResults => Enum.GetValues().Skip(1); + [Test] public void TestHitLightingDisabled() { @@ -72,32 +72,33 @@ namespace osu.Game.Rulesets.Osu.Tests pools.Add(pool = new DrawablePool(1)); else { - pool = pools[poolIndex]; - // We need to make sure neither the pool nor the judgement get disposed when new content is set, and they both share the same parent. + pool = pools[poolIndex]; ((Container)pool.Parent!).Clear(false); } var container = new Container { RelativeSizeAxes = Axes.Both, - Children = new Drawable[] - { - pool, - pool.Get(j => j.Apply(new JudgementResult(new HitObject - { - StartTime = Time.Current - }, new Judgement()) - { - Type = result, - }, null)).With(j => - { - j.Anchor = Anchor.Centre; - j.Origin = Anchor.Centre; - }) - } + Child = pool, }; + // Must be scheduled so the pool is loaded before we try and retrieve from it. + Schedule(() => + { + container.Add(pool.Get(j => j.Apply(new JudgementResult(new HitObject + { + StartTime = Time.Current + }, new Judgement()) + { + Type = result, + }, null)).With(j => + { + j.Anchor = Anchor.Centre; + j.Origin = Anchor.Centre; + })); + }); + poolIndex++; return container; }); From 02369139b3054213e6598337a66ea868a5ff56c4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 21 Jan 2024 13:11:41 +0900 Subject: [PATCH 238/651] Remove `FillFlow` overhead of argon counters --- .../Play/HUD/ArgonCounterTextComponent.cs | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs b/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs index f16669f865..f8c82feddd 100644 --- a/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs +++ b/osu.Game/Screens/Play/HUD/ArgonCounterTextComponent.cs @@ -42,35 +42,30 @@ namespace osu.Game.Screens.Play.HUD Origin = anchor; AutoSizeAxes = Axes.Both; - InternalChild = new FillFlowContainer + InternalChildren = new Drawable[] { - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Vertical, - Children = new Drawable[] + labelText = new OsuSpriteText { - labelText = new OsuSpriteText + Alpha = 0, + Text = label.GetValueOrDefault(), + Font = OsuFont.Torus.With(size: 12, weight: FontWeight.Bold), + Margin = new MarginPadding { Left = 2.5f }, + }, + NumberContainer = new Container + { + AutoSizeAxes = Axes.Both, + Children = new[] { - Alpha = 0, - Text = label.GetValueOrDefault(), - Font = OsuFont.Torus.With(size: 12, weight: FontWeight.Bold), - Margin = new MarginPadding { Left = 2.5f }, - }, - NumberContainer = new Container - { - AutoSizeAxes = Axes.Both, - Children = new[] + wireframesPart = new ArgonCounterSpriteText(wireframesLookup) { - wireframesPart = new ArgonCounterSpriteText(wireframesLookup) - { - Anchor = anchor, - Origin = anchor, - }, - textPart = new ArgonCounterSpriteText(textLookup) - { - Anchor = anchor, - Origin = anchor, - }, - } + Anchor = anchor, + Origin = anchor, + }, + textPart = new ArgonCounterSpriteText(textLookup) + { + Anchor = anchor, + Origin = anchor, + }, } } }; @@ -110,7 +105,11 @@ namespace osu.Game.Screens.Play.HUD { base.LoadComplete(); WireframeOpacity.BindValueChanged(v => wireframesPart.Alpha = v.NewValue, true); - ShowLabel.BindValueChanged(s => labelText.Alpha = s.NewValue ? 1 : 0, true); + ShowLabel.BindValueChanged(s => + { + labelText.Alpha = s.NewValue ? 1 : 0; + NumberContainer.Y = s.NewValue ? 12 : 0; + }, true); } private partial class ArgonCounterSpriteText : OsuSpriteText From bab14dce31dcc408a600ebe4d0a94648b2cbaae6 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 22 Jan 2024 02:07:09 +0300 Subject: [PATCH 239/651] Add failing test case --- .../TestSceneSliderApplication.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneSliderApplication.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneSliderApplication.cs index f41dd913ab..380a2087ac 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneSliderApplication.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneSliderApplication.cs @@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Osu.Tests { DrawableSlider dho = null; - AddStep("create slider", () => Child = dho = new DrawableSlider(prepareObject(new Slider + AddStep("create slider", () => Child = dho = new DrawableSlider(applyDefaults(new Slider { Position = new Vector2(256, 192), IndexInCurrentCombo = 0, @@ -47,7 +47,7 @@ namespace osu.Game.Rulesets.Osu.Tests AddWaitStep("wait for progression", 1); - AddStep("apply new slider", () => dho.Apply(prepareObject(new Slider + AddStep("apply new slider", () => dho.Apply(applyDefaults(new Slider { Position = new Vector2(256, 192), ComboIndex = 1, @@ -75,7 +75,7 @@ namespace osu.Game.Rulesets.Osu.Tests Child = new SkinProvidingContainer(provider) { RelativeSizeAxes = Axes.Both, - Child = dho = new DrawableSlider(prepareObject(new Slider + Child = dho = new DrawableSlider(applyDefaults(new Slider { Position = new Vector2(256, 192), IndexInCurrentCombo = 0, @@ -97,7 +97,38 @@ namespace osu.Game.Rulesets.Osu.Tests AddAssert("ball is red", () => dho.ChildrenOfType().Single().BallColour == Color4.Red); } - private Slider prepareObject(Slider slider) + [Test] + public void TestIncreaseRepeatCount() + { + DrawableSlider dho = null; + + AddStep("create slider", () => + { + Child = dho = new DrawableSlider(applyDefaults(new Slider + { + Position = new Vector2(256, 192), + IndexInCurrentCombo = 0, + StartTime = Time.Current, + Path = new SliderPath(PathType.LINEAR, new[] + { + Vector2.Zero, + new Vector2(150, 100), + new Vector2(300, 0), + }) + })); + }); + + AddStep("increase repeat count", () => + { + dho.HitObject.RepeatCount++; + applyDefaults(dho.HitObject); + }); + + AddAssert("repeat got custom anchor", () => + dho.ChildrenOfType().Single().RelativeAnchorPosition == Vector2.Divide(dho.SliderBody!.PathOffset, dho.DrawSize)); + } + + private Slider applyDefaults(Slider slider) { slider.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty()); return slider; From 57b2d018a99a7307d09984687299b03c027040cf Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 22 Jan 2024 02:07:29 +0300 Subject: [PATCH 240/651] Fix slider sometimes not updating relative anchor position --- .../Objects/Drawables/DrawableSlider.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index ed4c02a4a9..baec200107 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -67,7 +67,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables private Container repeatContainer; private PausableSkinnableSound slidingSample; - private readonly LayoutValue drawSizeLayout; + private readonly LayoutValue relativeAnchorPositionLayout; public DrawableSlider() : this(null) @@ -85,7 +85,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables AlwaysPresent = true, Alpha = 0 }; - AddLayout(drawSizeLayout = new LayoutValue(Invalidation.DrawSize | Invalidation.MiscGeometry)); + AddLayout(relativeAnchorPositionLayout = new LayoutValue(Invalidation.DrawSize | Invalidation.MiscGeometry)); } [BackgroundDependencyLoader] @@ -190,6 +190,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables repeatContainer.Add(repeat); break; } + + relativeAnchorPositionLayout.Invalidate(); } protected override void ClearNestedHitObjects() @@ -265,14 +267,14 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Size = SliderBody?.Size ?? Vector2.Zero; OriginPosition = SliderBody?.PathOffset ?? Vector2.Zero; - if (!drawSizeLayout.IsValid) + if (!relativeAnchorPositionLayout.IsValid) { Vector2 pos = Vector2.Divide(OriginPosition, DrawSize); foreach (var obj in NestedHitObjects) obj.RelativeAnchorPosition = pos; Ball.RelativeAnchorPosition = pos; - drawSizeLayout.Validate(); + relativeAnchorPositionLayout.Validate(); } } From cec4f670d1f84e39b4fa918b13e57fbed087f65b Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Mon, 22 Jan 2024 03:12:23 +0300 Subject: [PATCH 241/651] Reduce allocation overhead in BeatmapCarousel --- osu.Game/Screens/Select/BeatmapCarousel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 4408634787..1f2103ff61 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -899,7 +899,7 @@ namespace osu.Game.Screens.Select // Update externally controlled state of currently visible items (e.g. x-offset and opacity). // This is a per-frame update on all drawable panels. - foreach (DrawableCarouselItem item in Scroll.Children) + foreach (DrawableCarouselItem item in Scroll.ScrollContent) { updateItem(item); From 2bd9cd5d3410a281cff18f285a01c355a9c9b8e3 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 22 Jan 2024 04:39:08 +0300 Subject: [PATCH 242/651] Fix blueprint container not handling right clicks correctly while moveing an element --- .../Screens/Edit/Compose/Components/BlueprintContainer.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs index 110beb0fa6..2d6e234e57 100644 --- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs +++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs @@ -114,7 +114,7 @@ namespace osu.Game.Screens.Edit.Compose.Components protected override bool OnMouseDown(MouseDownEvent e) { bool selectionPerformed = performMouseDownActions(e); - bool movementPossible = prepareSelectionMovement(); + bool movementPossible = prepareSelectionMovement(e); // check if selection has occurred if (selectionPerformed) @@ -536,9 +536,13 @@ namespace osu.Game.Screens.Edit.Compose.Components /// /// Attempts to begin the movement of any selected blueprints. /// + /// The defining the beginning of a movement. /// Whether a movement is possible. - private bool prepareSelectionMovement() + private bool prepareSelectionMovement(MouseDownEvent e) { + if (e.Button == MouseButton.Right) + return false; + if (!SelectionHandler.SelectedBlueprints.Any()) return false; From 74f05a5c4b28d1493e7556588f0589cb20821650 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 15:54:24 +0900 Subject: [PATCH 243/651] Use container itself rather than `ScrollContent` --- osu.Game/Screens/Select/BeatmapCarousel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 1f2103ff61..35d534cf68 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -899,7 +899,7 @@ namespace osu.Game.Screens.Select // Update externally controlled state of currently visible items (e.g. x-offset and opacity). // This is a per-frame update on all drawable panels. - foreach (DrawableCarouselItem item in Scroll.ScrollContent) + foreach (DrawableCarouselItem item in Scroll) { updateItem(item); From 1f0ad5cff24f4c445d4dd8d6b5c4be1e3de98472 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 15:56:16 +0900 Subject: [PATCH 244/651] Apply same fix in more places --- osu.Game/Screens/Select/BeatmapCarousel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 35d534cf68..70ecde3858 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -868,7 +868,7 @@ namespace osu.Game.Screens.Select { var toDisplay = visibleItems.GetRange(displayedRange.first, displayedRange.last - displayedRange.first + 1); - foreach (var panel in Scroll.Children) + foreach (var panel in Scroll) { Debug.Assert(panel.Item != null); @@ -1094,7 +1094,7 @@ namespace osu.Game.Screens.Select // to enter clamp-special-case mode where it animates completely differently to normal. float scrollChange = scrollTarget.Value - Scroll.Current; Scroll.ScrollTo(scrollTarget.Value, false); - foreach (var i in Scroll.Children) + foreach (var i in Scroll) i.Y += scrollChange; break; } From 3e5fe66e58b3bf3e36761511883b8c0170f7c0e0 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 16:37:56 +0900 Subject: [PATCH 245/651] Fix potential null reference in player screen transition handling See https://github.com/ppy/osu/actions/runs/7607677219/job/20715418536?pr=26660. --- osu.Game/Screens/Play/Player.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index db39d06c54..ad1f9ec897 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -1240,9 +1240,14 @@ namespace osu.Game.Screens.Play { b.IgnoreUserSettings.Value = true; - b.IsBreakTime.UnbindFrom(breakTracker.IsBreakTime); - b.IsBreakTime.Value = false; + // May be null if the load never completed. + if (breakTracker != null) + { + b.IsBreakTime.UnbindFrom(breakTracker.IsBreakTime); + b.IsBreakTime.Value = false; + } }); + storyboardReplacesBackground.Value = false; } } From 3dd18c777a578acbc8ded48cb3ea92683391fc5e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 17:00:35 +0900 Subject: [PATCH 246/651] Remove a couple more overrides --- osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs | 2 -- .../OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs | 7 +------ osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs | 2 +- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs b/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs index 6f5ff9c99c..3792a67896 100644 --- a/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Lounge/LoungeSubScreen.cs @@ -40,8 +40,6 @@ namespace osu.Game.Screens.OnlinePlay.Lounge { public override string Title => "Lounge"; - protected override bool PlayExitSound => false; - protected override BackgroundScreen CreateBackground() => new LoungeBackgroundScreen { SelectedRoom = { BindTarget = SelectedRoom } diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs index 8a85a46a2f..aab7ac3280 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs @@ -44,8 +44,6 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer public override string ShortTitle => "room"; - protected override bool PlayExitSound => !exitConfirmed; - [Resolved] private MultiplayerClient client { get; set; } @@ -249,15 +247,13 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer [Resolved(canBeNull: true)] private IDialogOverlay dialogOverlay { get; set; } - private bool exitConfirmed; - public override bool OnExiting(ScreenExitEvent e) { // room has not been created yet or we're offline; exit immediately. if (client.Room == null || !IsConnected) return base.OnExiting(e); - if (!exitConfirmed && dialogOverlay != null) + if (dialogOverlay != null) { if (dialogOverlay.CurrentDialog is ConfirmDialog confirmDialog) confirmDialog.PerformOkAction(); @@ -265,7 +261,6 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer { dialogOverlay.Push(new ConfirmDialog("Are you sure you want to leave this multiplayer match?", () => { - exitConfirmed = true; if (this.IsCurrentScreen()) this.Exit(); })); diff --git a/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs b/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs index ea855c0474..fa1ee004c9 100644 --- a/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/OnlinePlaySubScreen.cs @@ -13,7 +13,7 @@ namespace osu.Game.Screens.OnlinePlay public virtual string ShortTitle => Title; - protected override bool PlayExitSound => false; + protected sealed override bool PlayExitSound => false; [Resolved] protected IRoomManager? RoomManager { get; private set; } From cd551b1abd4912b7d93fedeabd0b21fcffa9f1bd Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 18:01:21 +0900 Subject: [PATCH 247/651] Fix star fountains sometimes resetting visually Addresses https://github.com/ppy/osu/discussions/26622. --- osu.Game/Screens/Menu/StarFountain.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Menu/StarFountain.cs b/osu.Game/Screens/Menu/StarFountain.cs index fd59ec3573..dd5171c6be 100644 --- a/osu.Game/Screens/Menu/StarFountain.cs +++ b/osu.Game/Screens/Menu/StarFountain.cs @@ -3,6 +3,7 @@ using osu.Framework.Allocation; using osu.Framework.Graphics.Textures; +using osu.Framework.Threading; using osu.Framework.Utils; using osu.Game.Graphics; using osu.Game.Skinning; @@ -43,8 +44,6 @@ namespace osu.Game.Screens.Menu private const double shoot_duration = 800; - protected override bool CanSpawnParticles => lastShootTime != null && Time.Current - lastShootTime < shoot_duration; - [Resolved] private ISkinSource skin { get; set; } = null!; @@ -57,7 +56,6 @@ namespace osu.Game.Screens.Menu private void load(TextureStore textures) { Texture = skin.GetTexture("Menu/fountain-star") ?? textures.Get("Menu/fountain-star"); - Active.Value = true; } protected override FallingParticle CreateParticle() @@ -81,8 +79,15 @@ namespace osu.Game.Screens.Menu return lastShootDirection * x_velocity_from_direction * (float)(1 - 2 * (Clock.CurrentTime - lastShootTime!.Value) / shoot_duration) + getRandomVariance(x_velocity_random_variance); } + private ScheduledDelegate? deactivateDelegate; + public void Shoot(int direction) { + Active.Value = true; + + deactivateDelegate?.Cancel(); + deactivateDelegate = Scheduler.AddDelayed(() => Active.Value = false, shoot_duration); + lastShootTime = Clock.CurrentTime; lastShootDirection = direction; } From 47e9846315244e9f4824a8fedcb8e6c4dee3cd44 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 18:48:48 +0900 Subject: [PATCH 248/651] Adjust slider tick / end miss animations to be less busy --- .../Skinning/Argon/ArgonJudgementPiece.cs | 11 ++++++----- osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs | 9 ++++----- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 10 +++------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs index bb61bd37c1..9a5abba4fb 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs @@ -65,14 +65,15 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon if (Result == HitResult.IgnoreMiss || Result == HitResult.LargeTickMiss) { this.RotateTo(-45); - this.ScaleTo(1.8f); + this.ScaleTo(1.6f); this.ScaleTo(1.2f, 100, Easing.In); - this.MoveTo(Vector2.Zero); - this.MoveToOffset(new Vector2(0, 10), 800, Easing.InQuint); + this.FadeOutFromOne(400); } else if (Result.IsMiss()) { + this.FadeOutFromOne(800); + this.ScaleTo(1.6f); this.ScaleTo(1, 100, Easing.In); @@ -84,14 +85,14 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon } else { + this.FadeOutFromOne(800); + JudgementText .FadeInFromZero(300, Easing.OutQuint) .ScaleTo(Vector2.One) .ScaleTo(new Vector2(1.2f), 1800, Easing.OutQuint); } - this.FadeOutFromOne(800); - ringExplosion?.PlayAnimation(); } diff --git a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs index ada651b60e..c7103cd9fd 100644 --- a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs +++ b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs @@ -45,11 +45,10 @@ namespace osu.Game.Rulesets.Judgements if (Result == HitResult.IgnoreMiss || Result == HitResult.LargeTickMiss) { this.RotateTo(-45); - this.ScaleTo(1.8f); + this.ScaleTo(1.6f); this.ScaleTo(1.2f, 100, Easing.In); - this.MoveTo(Vector2.Zero); - this.MoveToOffset(new Vector2(0, 10), 800, Easing.InQuint); + this.FadeOutFromOne(400); } else if (Result.IsMiss()) { @@ -61,9 +60,9 @@ namespace osu.Game.Rulesets.Judgements this.RotateTo(0); this.RotateTo(40, 800, Easing.InQuint); - } - this.FadeOutFromOne(800); + this.FadeOutFromOne(800); + } } public Drawable? GetAboveHitObjectsProxiedContent() => null; diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index 1834a17279..a9f68bd378 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -63,14 +63,10 @@ namespace osu.Game.Skinning // missed ticks / slider end don't get the normal animation. if (isMissedTick()) { - this.ScaleTo(1.6f); - this.ScaleTo(1, 100, Easing.In); + this.ScaleTo(1.2f); + this.ScaleTo(1f, 100, Easing.In); - if (legacyVersion > 1.0m) - { - this.MoveTo(new Vector2(0, -2f)); - this.MoveToOffset(new Vector2(0, 10), fade_out_delay + fade_out_length, Easing.In); - } + this.FadeOutFromOne(400); } else { From 9b2740f8a4032dfa568f2bbcc1ee0609a56c2bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 11:11:15 +0100 Subject: [PATCH 249/651] Fix score submission test failures due to checking audio playback validity (again) As seen in https://github.com/ppy/osu/actions/runs/7607899979/job/20716013982?pr=26662#step:5:75 In https://github.com/ppy/osu/pull/26484, I went "well if I'm moving the enabling of validation of playback rate to `SubmittingPlayer` context, then surely I can remove the local override in the test scene, right?" Reader: Apparently I did not notice that `FakeImportingPlayer : TestPlayer : SoloPlayer : SubmittingPlayer`. So no, I could not remove the local override in the test scene. You could probably attempt to conjure up some excuse about deep inheritance hierarchies here but nah. Really just a failure to read on my behalf as usual. --- .../Visual/Gameplay/TestScenePlayerScoreSubmission.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs index e2ce3a014c..5e22e47572 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs @@ -23,6 +23,7 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko; using osu.Game.Rulesets.Taiko.Mods; using osu.Game.Scoring; +using osu.Game.Screens.Play; using osu.Game.Screens.Ranking; using osu.Game.Tests.Beatmaps; @@ -383,6 +384,11 @@ namespace osu.Game.Tests.Visual.Gameplay AllowImportCompletion = new SemaphoreSlim(1); } + protected override GameplayClockContainer CreateGameplayClockContainer(WorkingBeatmap beatmap, double gameplayStart) => new MasterGameplayClockContainer(beatmap, gameplayStart) + { + ShouldValidatePlaybackRate = false, + }; + protected override async Task ImportScore(Score score) { ScoreImportStarted = true; From c8521b49cd6bcfa3aee3c437da357d49a196844d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 19 Jan 2024 18:43:15 +0900 Subject: [PATCH 250/651] Change S rank to require no miss --- .../Scoring/CatchScoreProcessor.cs | 2 +- .../Scoring/OsuScoreProcessor.cs | 18 ++++++++++++++++++ .../Scoring/TaikoScoreProcessor.cs | 18 ++++++++++++++++++ .../Visual/Ranking/TestSceneAccuracyCircle.cs | 19 +++++++++++-------- osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 4 ++-- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 2 +- 6 files changed, 51 insertions(+), 12 deletions(-) diff --git a/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs b/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs index 161a59c5fd..a12fe7f3e1 100644 --- a/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs +++ b/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs @@ -89,7 +89,7 @@ namespace osu.Game.Rulesets.Catch.Scoring return baseIncrease * Math.Min(Math.Max(0.5, Math.Log(result.ComboAfterJudgement, combo_base)), Math.Log(combo_cap, combo_base)); } - public override ScoreRank RankFromAccuracy(double accuracy) + public override ScoreRank RankFromScore(double accuracy, Dictionary results) { if (accuracy == accuracy_cutoff_x) return ScoreRank.X; diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs index 97980c6d18..0d62a6e718 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs @@ -1,9 +1,11 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Collections.Generic; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Rulesets.Scoring; +using osu.Game.Scoring; namespace osu.Game.Rulesets.Osu.Scoring { @@ -14,6 +16,22 @@ namespace osu.Game.Rulesets.Osu.Scoring { } + public override ScoreRank RankFromScore(double accuracy, Dictionary results) + { + ScoreRank rank = base.RankFromScore(accuracy, results); + + switch (rank) + { + case ScoreRank.S: + case ScoreRank.X: + if (results.GetValueOrDefault(HitResult.Miss) > 0) + rank = ScoreRank.A; + break; + } + + return rank; + } + protected override HitEvent CreateHitEvent(JudgementResult result) => base.CreateHitEvent(result).With((result as OsuHitCircleJudgementResult)?.CursorPositionAtHit); } diff --git a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs index 2fd9f070ec..023cd1f902 100644 --- a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs +++ b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs @@ -2,9 +2,11 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko.Objects; +using osu.Game.Scoring; namespace osu.Game.Rulesets.Taiko.Scoring { @@ -33,6 +35,22 @@ namespace osu.Game.Rulesets.Taiko.Scoring * strongScaleValue(result); } + public override ScoreRank RankFromScore(double accuracy, Dictionary results) + { + ScoreRank rank = base.RankFromScore(accuracy, results); + + switch (rank) + { + case ScoreRank.S: + case ScoreRank.X: + if (results.GetValueOrDefault(HitResult.Miss) == 0) + rank = ScoreRank.A; + break; + } + + return rank; + } + public override int GetBaseScoreForResult(HitResult result) { switch (result) diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs b/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs index 435dd77120..7aa36429a7 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; using NUnit.Framework; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; @@ -96,6 +97,14 @@ namespace osu.Game.Tests.Visual.Ranking { var scoreProcessor = ruleset.CreateScoreProcessor(); + var statistics = new Dictionary + { + { HitResult.Miss, 1 }, + { HitResult.Meh, 50 }, + { HitResult.Good, 100 }, + { HitResult.Great, 300 }, + }; + return new ScoreInfo { User = new APIUser @@ -109,15 +118,9 @@ namespace osu.Game.Tests.Visual.Ranking TotalScore = 2845370, Accuracy = accuracy, MaxCombo = 999, - Rank = scoreProcessor.RankFromAccuracy(accuracy), + Rank = scoreProcessor.RankFromScore(accuracy, statistics), Date = DateTimeOffset.Now, - Statistics = - { - { HitResult.Miss, 1 }, - { HitResult.Meh, 50 }, - { HitResult.Good, 100 }, - { HitResult.Great, 300 }, - } + Statistics = statistics, }; } } diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index 80e751422e..95f672f6e6 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -370,7 +370,7 @@ namespace osu.Game.Rulesets.Scoring if (rank.Value == ScoreRank.F) return; - rank.Value = RankFromAccuracy(Accuracy.Value); + rank.Value = RankFromScore(Accuracy.Value, ScoreResultCounts); foreach (var mod in Mods.Value.OfType()) rank.Value = mod.AdjustRank(Rank.Value, Accuracy.Value); } @@ -505,7 +505,7 @@ namespace osu.Game.Rulesets.Scoring /// /// Given an accuracy (0..1), return the correct . /// - public virtual ScoreRank RankFromAccuracy(double accuracy) + public virtual ScoreRank RankFromScore(double accuracy, Dictionary results) { if (accuracy == accuracy_cutoff_x) return ScoreRank.X; diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index b30fc7aee1..427b1cb7cf 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -280,7 +280,7 @@ namespace osu.Game.Scoring.Legacy { scoreInfo.Accuracy = StandardisedScoreMigrationTools.ComputeAccuracy(scoreInfo); - var rank = currentRuleset.CreateScoreProcessor().RankFromAccuracy(scoreInfo.Accuracy); + var rank = currentRuleset.CreateScoreProcessor().RankFromScore(scoreInfo.Accuracy, scoreInfo.Statistics); foreach (var mod in scoreInfo.Mods.OfType()) rank = mod.AdjustRank(rank, scoreInfo.Accuracy); From bb1eab58440ab36c0c5197335a20b72a23961219 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 20:25:36 +0900 Subject: [PATCH 251/651] Update test in line with new rank definitions always being applied --- osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs index 6e7c8c3631..e56dff74c3 100644 --- a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs +++ b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs @@ -293,7 +293,7 @@ namespace osu.Game.Tests.Beatmaps.Formats } [Test] - public void AccuracyAndRankOfLazerScorePreserved() + public void AccuracyOfLazerScorePreserved() { var ruleset = new OsuRuleset().RulesetInfo; @@ -322,7 +322,7 @@ namespace osu.Game.Tests.Beatmaps.Formats Assert.Multiple(() => { Assert.That(decodedAfterEncode.ScoreInfo.Accuracy, Is.EqualTo((double)(199 * 300 + 30) / (200 * 300 + 30))); - Assert.That(decodedAfterEncode.ScoreInfo.Rank, Is.EqualTo(ScoreRank.SH)); + Assert.That(decodedAfterEncode.ScoreInfo.Rank, Is.EqualTo(ScoreRank.A)); }); } From 4eba3b5d7093f89f186a343c8f316054edd5552c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 20:48:29 +0900 Subject: [PATCH 252/651] Move `BackgroundDataStoreProcessor` to better namespace --- osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs | 1 + osu.Game/{ => Database}/BackgroundDataStoreProcessor.cs | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) rename osu.Game/{ => Database}/BackgroundDataStoreProcessor.cs (99%) diff --git a/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs b/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs index 8b066f860f..e22cf2398b 100644 --- a/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs +++ b/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs @@ -9,6 +9,7 @@ using osu.Framework.Bindables; using osu.Framework.Extensions; using osu.Framework.Testing; using osu.Game.Beatmaps; +using osu.Game.Database; using osu.Game.Rulesets; using osu.Game.Scoring; using osu.Game.Scoring.Legacy; diff --git a/osu.Game/BackgroundDataStoreProcessor.cs b/osu.Game/Database/BackgroundDataStoreProcessor.cs similarity index 99% rename from osu.Game/BackgroundDataStoreProcessor.cs rename to osu.Game/Database/BackgroundDataStoreProcessor.cs index fc7db13d41..e462e0ccf8 100644 --- a/osu.Game/BackgroundDataStoreProcessor.cs +++ b/osu.Game/Database/BackgroundDataStoreProcessor.cs @@ -12,7 +12,6 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Logging; using osu.Game.Beatmaps; -using osu.Game.Database; using osu.Game.Extensions; using osu.Game.Online.API; using osu.Game.Overlays; @@ -22,7 +21,7 @@ using osu.Game.Scoring; using osu.Game.Scoring.Legacy; using osu.Game.Screens.Play; -namespace osu.Game +namespace osu.Game.Database { /// /// Performs background updating of data stores at startup. From 644e7d6fe6f845ccf0e3d919229d2e130dd76d1e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 20:55:17 +0900 Subject: [PATCH 253/651] Add migration --- .../Database/BackgroundDataStoreProcessor.cs | 58 +++++++++++++++++++ osu.Game/Scoring/Legacy/LegacyScoreEncoder.cs | 3 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/osu.Game/Database/BackgroundDataStoreProcessor.cs b/osu.Game/Database/BackgroundDataStoreProcessor.cs index e462e0ccf8..324d699e7c 100644 --- a/osu.Game/Database/BackgroundDataStoreProcessor.cs +++ b/osu.Game/Database/BackgroundDataStoreProcessor.cs @@ -73,6 +73,7 @@ namespace osu.Game.Database processBeatmapsWithMissingObjectCounts(); processScoresWithMissingStatistics(); convertLegacyTotalScoreToStandardised(); + upgradeScoreRanks(); }, TaskCreationOptions.LongRunning).ContinueWith(t => { if (t.Exception?.InnerException is ObjectDisposedException) @@ -354,6 +355,7 @@ namespace osu.Game.Database realmAccess.Write(r => { ScoreInfo s = r.Find(id)!; + // TODO: ensure that this is also updating rank (as it will set TotalScoreVersion to latest). StandardisedScoreMigrationTools.UpdateFromLegacy(s, beatmapManager); s.TotalScoreVersion = LegacyScoreEncoder.LATEST_VERSION; }); @@ -375,6 +377,62 @@ namespace osu.Game.Database completeNotification(notification, processedCount, scoreIds.Count, failedCount); } + private void upgradeScoreRanks() + { + Logger.Log("Querying for scores that need rank upgrades..."); + + HashSet scoreIds = realmAccess.Run(r => new HashSet( + r.All() + .Where(s => s.TotalScoreVersion < LegacyScoreEncoder.LATEST_VERSION) + .Select(s => s.ID))); + + Logger.Log($"Found {scoreIds.Count} scores which require rank upgrades."); + + if (scoreIds.Count == 0) + return; + + var notification = showProgressNotification(scoreIds.Count, "Adjusting ranks of scores", "scores now have more correct ranks"); + + int processedCount = 0; + int failedCount = 0; + + foreach (var id in scoreIds) + { + if (notification?.State == ProgressNotificationState.Cancelled) + break; + + updateNotificationProgress(notification, processedCount, scoreIds.Count); + + sleepIfRequired(); + + try + { + // Can't use async overload because we're not on the update thread. + // ReSharper disable once MethodHasAsyncOverload + realmAccess.Write(r => + { + ScoreInfo s = r.Find(id)!; + // TODO: uncomment when ready + // s.Rank = StandardisedScoreMigrationTools.ComputeRank(s, beatmapManager); + }); + + ++processedCount; + } + catch (ObjectDisposedException) + { + throw; + } + catch (Exception e) + { + Logger.Log($"Failed to update rank score {id}: {e}"); + realmAccess.Write(r => r.Find(id)!.BackgroundReprocessingFailed = true); + ++failedCount; + } + } + + completeNotification(notification, processedCount, scoreIds.Count, failedCount); + } + private void updateNotificationProgress(ProgressNotification? notification, int processedCount, int totalCount) { if (notification == null) diff --git a/osu.Game/Scoring/Legacy/LegacyScoreEncoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreEncoder.cs index 389b20b5c8..c74980abb6 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreEncoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreEncoder.cs @@ -43,9 +43,10 @@ namespace osu.Game.Scoring.Legacy /// 30000012: Fix incorrect total score conversion on selected beatmaps after implementing the more correct /// method. Reconvert all scores. /// + /// 30000013: All local scores will use lazer definitions of ranks for consistency. Recalculates the rank of all scores. /// /// - public const int LATEST_VERSION = 30000012; + public const int LATEST_VERSION = 30000013; /// /// The first stable-compatible YYYYMMDD format version given to lazer usage of replays. From 83f9118b22d64e1b52f213d895cb6e959d88b842 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 21:31:17 +0900 Subject: [PATCH 254/651] Adjust results screen to handle S->A rank adjustment when misses are present --- .../Visual/Ranking/TestSceneResultsScreen.cs | 21 +++++----- .../Expanded/Accuracy/AccuracyCircle.cs | 39 +++++++++++++++++++ .../Ranking/Expanded/Accuracy/RankBadge.cs | 8 ++-- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs index ab2e867255..866e20d063 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs @@ -21,6 +21,7 @@ using osu.Game.Online.API; using osu.Game.Rulesets; using osu.Game.Rulesets.Difficulty; using osu.Game.Rulesets.Osu; +using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; using osu.Game.Screens; using osu.Game.Screens.Play; @@ -71,15 +72,16 @@ namespace osu.Game.Tests.Visual.Ranking private int onlineScoreID = 1; - [TestCase(1, ScoreRank.X)] - [TestCase(0.9999, ScoreRank.S)] - [TestCase(0.975, ScoreRank.S)] - [TestCase(0.925, ScoreRank.A)] - [TestCase(0.85, ScoreRank.B)] - [TestCase(0.75, ScoreRank.C)] - [TestCase(0.5, ScoreRank.D)] - [TestCase(0.2, ScoreRank.D)] - public void TestResultsWithPlayer(double accuracy, ScoreRank rank) + [TestCase(1, ScoreRank.X, 0)] + [TestCase(0.9999, ScoreRank.S, 0)] + [TestCase(0.975, ScoreRank.S, 0)] + [TestCase(0.975, ScoreRank.A, 1)] + [TestCase(0.925, ScoreRank.A, 5)] + [TestCase(0.85, ScoreRank.B, 9)] + [TestCase(0.75, ScoreRank.C, 11)] + [TestCase(0.5, ScoreRank.D, 21)] + [TestCase(0.2, ScoreRank.D, 51)] + public void TestResultsWithPlayer(double accuracy, ScoreRank rank, int missCount) { TestResultsScreen screen = null; @@ -91,6 +93,7 @@ namespace osu.Game.Tests.Visual.Ranking score.HitEvents = TestSceneStatisticsPanel.CreatePositionDistributedHitEvents(); score.Accuracy = accuracy; score.Rank = rank; + score.Statistics[HitResult.Miss] = missCount; return screen = createResultsScreen(score); }); diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index 8cbca74466..d2632c70c9 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -21,6 +21,7 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; using osu.Game.Skinning; using osuTK; +using osuTK.Graphics; namespace osu.Game.Screens.Ranking.Expanded.Accuracy { @@ -111,6 +112,9 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy private readonly double accuracyD; private readonly bool withFlair; + private readonly bool isFailedSDueToMisses; + private RankText failedSRankText; + public AccuracyCircle(ScoreInfo score, bool withFlair = false) { this.score = score; @@ -119,10 +123,17 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy ScoreProcessor scoreProcessor = score.Ruleset.CreateInstance().CreateScoreProcessor(); accuracyX = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.X); accuracyS = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.S); + + // Some rulesets require no misses to get an S rank. + // if (score.Accuracy >= accuracyS && score.Rank == ScoreRank.A) + // accuracyS = score.Accuracy + 0.0001; + accuracyA = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.A); accuracyB = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.B); accuracyC = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.C); accuracyD = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.D); + + isFailedSDueToMisses = score.Accuracy >= accuracyS && score.Rank == ScoreRank.A; } [BackgroundDependencyLoader] @@ -249,6 +260,9 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy if (withFlair) { + if (isFailedSDueToMisses) + AddInternal(failedSRankText = new RankText(ScoreRank.S)); + AddRangeInternal(new Drawable[] { rankImpactSound = new PoolableSkinnableSample(new SampleInfo(impactSampleName)), @@ -387,6 +401,31 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy }); } } + + if (isFailedSDueToMisses) + { + const double adjust_duration = 200; + + using (BeginDelayedSequence(TEXT_APPEAR_DELAY - adjust_duration)) + { + failedSRankText.FadeIn(adjust_duration); + + using (BeginDelayedSequence(adjust_duration)) + { + failedSRankText + .FadeColour(Color4.Red, 800, Easing.Out) + .RotateTo(10, 1000, Easing.Out) + .MoveToY(100, 1000, Easing.In) + .FadeOut(800, Easing.Out); + + accuracyCircle + .FillTo(accuracyS - 0.0001, 70, Easing.OutQuint); + + badges.Single(b => b.Rank == ScoreRank.S) + .FadeOut(70, Easing.OutQuint); + } + } + } } } diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/RankBadge.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/RankBadge.cs index 7af327828e..8aea6045eb 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/RankBadge.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/RankBadge.cs @@ -32,7 +32,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy /// private readonly double displayPosition; - private readonly ScoreRank rank; + public readonly ScoreRank Rank; private Drawable rankContainer; private Drawable overlay; @@ -47,7 +47,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy { Accuracy = accuracy; displayPosition = position; - this.rank = rank; + Rank = rank; RelativeSizeAxes = Axes.Both; Alpha = 0; @@ -62,7 +62,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy Size = new Vector2(28, 14), Children = new[] { - new DrawableRank(rank), + new DrawableRank(Rank), overlay = new CircularContainer { RelativeSizeAxes = Axes.Both, @@ -71,7 +71,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy EdgeEffect = new EdgeEffectParameters { Type = EdgeEffectType.Glow, - Colour = OsuColour.ForRank(rank).Opacity(0.2f), + Colour = OsuColour.ForRank(Rank).Opacity(0.2f), Radius = 10, }, Child = new Box From 99d3fcc3261a5f1ec9f8270d734e5e5f93318ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 13:45:55 +0100 Subject: [PATCH 255/651] Fix crash if ruleset components container is not present --- osu.Game/Screens/Play/HUDOverlay.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs index a9fe393395..b5482f2a5b 100644 --- a/osu.Game/Screens/Play/HUDOverlay.cs +++ b/osu.Game/Screens/Play/HUDOverlay.cs @@ -172,7 +172,10 @@ namespace osu.Game.Screens.Play }, }; - hideTargets = new List { mainComponents, rulesetComponents, playfieldComponents, topRightElements }; + hideTargets = new List { mainComponents, playfieldComponents, topRightElements }; + + if (rulesetComponents != null) + hideTargets.Add(rulesetComponents); if (!alwaysShowLeaderboard) hideTargets.Add(LeaderboardFlow); From 15df6b1da16cd745e45e60dc150bed29be2f2775 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 22 Jan 2024 21:47:38 +0900 Subject: [PATCH 256/651] Revert keyboard seek speed change --- osu.Game/Screens/Play/ReplayPlayer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/ReplayPlayer.cs b/osu.Game/Screens/Play/ReplayPlayer.cs index a26a2b9904..3c5b85662a 100644 --- a/osu.Game/Screens/Play/ReplayPlayer.cs +++ b/osu.Game/Screens/Play/ReplayPlayer.cs @@ -107,11 +107,11 @@ namespace osu.Game.Screens.Play return true; case GlobalAction.SeekReplayBackward: - SeekInDirection(-1); + SeekInDirection(-5); return true; case GlobalAction.SeekReplayForward: - SeekInDirection(1); + SeekInDirection(5); return true; case GlobalAction.TogglePauseReplay: From 17d05b0fdfd392423c708bd368cd02a77116d0bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 14:23:46 +0100 Subject: [PATCH 257/651] Fix non-miss drawable judgements fading out instantly on triangles skin `else if` proves to be insidious once again. --- osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs index c7103cd9fd..7330f138ce 100644 --- a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs +++ b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs @@ -49,8 +49,10 @@ namespace osu.Game.Rulesets.Judgements this.ScaleTo(1.2f, 100, Easing.In); this.FadeOutFromOne(400); + return; } - else if (Result.IsMiss()) + + if (Result.IsMiss()) { this.ScaleTo(1.6f); this.ScaleTo(1, 100, Easing.In); @@ -60,9 +62,9 @@ namespace osu.Game.Rulesets.Judgements this.RotateTo(0); this.RotateTo(40, 800, Easing.InQuint); - - this.FadeOutFromOne(800); } + + this.FadeOutFromOne(800); } public Drawable? GetAboveHitObjectsProxiedContent() => null; From 9aa7c7f59197b9754e98e1ba5ce5e4730f4d5f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 15:35:03 +0100 Subject: [PATCH 258/651] Revert incorrect removal of `exitConfirmed` flag Removing it meant that it was _literally impossible_ to exit multiplayer. --- .../OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs index aab7ac3280..a37314de0e 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs @@ -247,13 +247,15 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer [Resolved(canBeNull: true)] private IDialogOverlay dialogOverlay { get; set; } + private bool exitConfirmed; + public override bool OnExiting(ScreenExitEvent e) { // room has not been created yet or we're offline; exit immediately. if (client.Room == null || !IsConnected) return base.OnExiting(e); - if (dialogOverlay != null) + if (!exitConfirmed && dialogOverlay != null) { if (dialogOverlay.CurrentDialog is ConfirmDialog confirmDialog) confirmDialog.PerformOkAction(); @@ -261,6 +263,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer { dialogOverlay.Push(new ConfirmDialog("Are you sure you want to leave this multiplayer match?", () => { + exitConfirmed = true; if (this.IsCurrentScreen()) this.Exit(); })); From cb8ec48717b49110bb784ae69028612d546a7a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 19:56:30 +0100 Subject: [PATCH 259/651] Make `RankFromScore()`'s dictionary param readonly Just to make sure nobody tries any "funny" business. --- osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs | 2 +- osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs | 2 +- osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs | 2 +- osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs b/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs index a12fe7f3e1..12a4182bf1 100644 --- a/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs +++ b/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs @@ -89,7 +89,7 @@ namespace osu.Game.Rulesets.Catch.Scoring return baseIncrease * Math.Min(Math.Max(0.5, Math.Log(result.ComboAfterJudgement, combo_base)), Math.Log(combo_cap, combo_base)); } - public override ScoreRank RankFromScore(double accuracy, Dictionary results) + public override ScoreRank RankFromScore(double accuracy, IReadOnlyDictionary results) { if (accuracy == accuracy_cutoff_x) return ScoreRank.X; diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs index 0d62a6e718..4d8381cf42 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs @@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Osu.Scoring { } - public override ScoreRank RankFromScore(double accuracy, Dictionary results) + public override ScoreRank RankFromScore(double accuracy, IReadOnlyDictionary results) { ScoreRank rank = base.RankFromScore(accuracy, results); diff --git a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs index 023cd1f902..441a53c05a 100644 --- a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs +++ b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs @@ -35,7 +35,7 @@ namespace osu.Game.Rulesets.Taiko.Scoring * strongScaleValue(result); } - public override ScoreRank RankFromScore(double accuracy, Dictionary results) + public override ScoreRank RankFromScore(double accuracy, IReadOnlyDictionary results) { ScoreRank rank = base.RankFromScore(accuracy, results); diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index 95f672f6e6..a092829317 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -505,7 +505,7 @@ namespace osu.Game.Rulesets.Scoring /// /// Given an accuracy (0..1), return the correct . /// - public virtual ScoreRank RankFromScore(double accuracy, Dictionary results) + public virtual ScoreRank RankFromScore(double accuracy, IReadOnlyDictionary results) { if (accuracy == accuracy_cutoff_x) return ScoreRank.X; From 20ed7e13e31c4da412e1cffab581e4b7054492cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 19:57:12 +0100 Subject: [PATCH 260/651] Fix back-to-front conditional in taiko processor Would be weird to degrade a score due to *no* misses wouldn't it? --- osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs index 441a53c05a..7e40d575bc 100644 --- a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs +++ b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs @@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Taiko.Scoring { case ScoreRank.S: case ScoreRank.X: - if (results.GetValueOrDefault(HitResult.Miss) == 0) + if (results.GetValueOrDefault(HitResult.Miss) > 0) rank = ScoreRank.A; break; } From 45dc9de1e0d22f83ea2851bf8116c180724193da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 19:58:11 +0100 Subject: [PATCH 261/651] Remove remnant of old implementation of showing "A due to misses" --- osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index d2632c70c9..be9a3a8a78 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -124,10 +124,6 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy accuracyX = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.X); accuracyS = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.S); - // Some rulesets require no misses to get an S rank. - // if (score.Accuracy >= accuracyS && score.Rank == ScoreRank.A) - // accuracyS = score.Accuracy + 0.0001; - accuracyA = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.A); accuracyB = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.B); accuracyC = scoreProcessor.AccuracyCutoffFromRank(ScoreRank.C); From 81a02665b67a4f68dda204be6207acd6d9488cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 17 Jan 2024 18:24:39 +0100 Subject: [PATCH 262/651] Adjust existing test to fail --- .../Beatmaps/Formats/LegacyScoreDecoderTest.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs index e56dff74c3..234067ccda 100644 --- a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs +++ b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs @@ -252,7 +252,7 @@ namespace osu.Game.Tests.Beatmaps.Formats } [Test] - public void AccuracyAndRankOfStableScorePreserved() + public void AccuracyOfStableScoreRecomputed() { var memoryStream = new MemoryStream(); @@ -261,15 +261,16 @@ namespace osu.Game.Tests.Beatmaps.Formats // and we want to emulate a stable score here using (var sw = new SerializationWriter(memoryStream, true)) { - sw.Write((byte)0); // ruleset id (osu!) + sw.Write((byte)3); // ruleset id (mania). + // mania is used intentionally as it is the only ruleset wherein default accuracy calculation is changed in lazer sw.Write(20240116); // version (anything below `LegacyScoreEncoder.FIRST_LAZER_VERSION` is stable) sw.Write(string.Empty.ComputeMD5Hash()); // beatmap hash, irrelevant to this test sw.Write("username"); // irrelevant to this test sw.Write(string.Empty.ComputeMD5Hash()); // score hash, irrelevant to this test - sw.Write((ushort)198); // count300 - sw.Write((ushort)1); // count100 + sw.Write((ushort)1); // count300 + sw.Write((ushort)0); // count100 sw.Write((ushort)0); // count50 - sw.Write((ushort)0); // countGeki + sw.Write((ushort)198); // countGeki (perfects / "rainbow 300s" in mania) sw.Write((ushort)0); // countKatu sw.Write((ushort)1); // countMiss sw.Write(12345678); // total score, irrelevant to this test @@ -287,8 +288,8 @@ namespace osu.Game.Tests.Beatmaps.Formats Assert.Multiple(() => { - Assert.That(decoded.ScoreInfo.Accuracy, Is.EqualTo((double)(198 * 300 + 100) / (200 * 300))); - Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.A)); + Assert.That(decoded.ScoreInfo.Accuracy, Is.EqualTo((double)(198 * 305 + 300) / (200 * 305))); + Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.S)); }); } From 3f31593a196a5bb7ce93ca4fafb91f45309043be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 20:01:18 +0100 Subject: [PATCH 263/651] Add another failing tests covering recomputation of ranks --- .../Formats/LegacyScoreDecoderTest.cs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs index 234067ccda..fd99b51a2f 100644 --- a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs +++ b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs @@ -293,6 +293,47 @@ namespace osu.Game.Tests.Beatmaps.Formats }); } + [Test] + public void RankOfStableScoreUsesLazerDefinitions() + { + var memoryStream = new MemoryStream(); + + // local partial implementation of legacy score encoder + // this is done half for readability, half because `LegacyScoreEncoder` forces `LATEST_VERSION` + // and we want to emulate a stable score here + using (var sw = new SerializationWriter(memoryStream, true)) + { + sw.Write((byte)0); // ruleset id (osu!) + sw.Write(20240116); // version (anything below `LegacyScoreEncoder.FIRST_LAZER_VERSION` is stable) + sw.Write(string.Empty.ComputeMD5Hash()); // beatmap hash, irrelevant to this test + sw.Write("username"); // irrelevant to this test + sw.Write(string.Empty.ComputeMD5Hash()); // score hash, irrelevant to this test + sw.Write((ushort)195); // count300 + sw.Write((ushort)1); // count100 + sw.Write((ushort)4); // count50 + sw.Write((ushort)0); // countGeki + sw.Write((ushort)0); // countKatu + sw.Write((ushort)0); // countMiss + sw.Write(12345678); // total score, irrelevant to this test + sw.Write((ushort)1000); // max combo, irrelevant to this test + sw.Write(false); // full combo, irrelevant to this test + sw.Write((int)LegacyMods.Hidden); // mods + sw.Write(string.Empty); // hp graph, irrelevant + sw.Write(DateTime.Now); // date, irrelevant + sw.Write(Array.Empty()); // replay data, irrelevant + sw.Write((long)1234); // legacy online ID, irrelevant + } + + memoryStream.Seek(0, SeekOrigin.Begin); + var decoded = new TestLegacyScoreDecoder().Parse(memoryStream); + + Assert.Multiple(() => + { + // In stable this would be an A because there are over 1% 50s. But that's not a thing in lazer. + Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.S)); + }); + } + [Test] public void AccuracyOfLazerScorePreserved() { From aa8eee0796ffcc6e6a244f623f0a98ab69fb2c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 17 Jan 2024 19:00:21 +0100 Subject: [PATCH 264/651] Move maximum statistics population to `LegacyScoreDecoder` --- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 68 +++++++++++++++++++ osu.Game/Scoring/ScoreImporter.cs | 67 ------------------ osu.Game/Scoring/ScoreManager.cs | 9 ++- 3 files changed, 76 insertions(+), 68 deletions(-) diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index 427b1cb7cf..3d671d80c3 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -4,6 +4,7 @@ #nullable disable using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; @@ -19,6 +20,7 @@ using osu.Game.Replays.Legacy; using osu.Game.Rulesets; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Replays; +using osu.Game.Rulesets.Scoring; using SharpCompress.Compressors.LZMA; namespace osu.Game.Scoring.Legacy @@ -130,6 +132,8 @@ namespace osu.Game.Scoring.Legacy } } + PopulateMaximumStatistics(score.ScoreInfo, workingBeatmap); + if (score.ScoreInfo.IsLegacyScore || compressedScoreInfo == null) PopulateLegacyAccuracyAndRank(score.ScoreInfo); else @@ -170,6 +174,70 @@ namespace osu.Game.Scoring.Legacy } } + /// + /// Populates the for a given . + /// + /// The score to populate the statistics of. + /// The corresponding . + internal static void PopulateMaximumStatistics(ScoreInfo score, WorkingBeatmap workingBeatmap) + { + Debug.Assert(score.BeatmapInfo != null); + + if (score.MaximumStatistics.Select(kvp => kvp.Value).Sum() > 0) + return; + + var ruleset = score.Ruleset.Detach(); + var rulesetInstance = ruleset.CreateInstance(); + var scoreProcessor = rulesetInstance.CreateScoreProcessor(); + + Debug.Assert(rulesetInstance != null); + + // Populate the maximum statistics. + HitResult maxBasicResult = rulesetInstance.GetHitResults() + .Select(h => h.result) + .Where(h => h.IsBasic()).MaxBy(scoreProcessor.GetBaseScoreForResult); + + foreach ((HitResult result, int count) in score.Statistics) + { + switch (result) + { + case HitResult.LargeTickHit: + case HitResult.LargeTickMiss: + score.MaximumStatistics[HitResult.LargeTickHit] = score.MaximumStatistics.GetValueOrDefault(HitResult.LargeTickHit) + count; + break; + + case HitResult.SmallTickHit: + case HitResult.SmallTickMiss: + score.MaximumStatistics[HitResult.SmallTickHit] = score.MaximumStatistics.GetValueOrDefault(HitResult.SmallTickHit) + count; + break; + + case HitResult.IgnoreHit: + case HitResult.IgnoreMiss: + case HitResult.SmallBonus: + case HitResult.LargeBonus: + break; + + default: + score.MaximumStatistics[maxBasicResult] = score.MaximumStatistics.GetValueOrDefault(maxBasicResult) + count; + break; + } + } + + if (!score.IsLegacyScore) + return; + +#pragma warning disable CS0618 + // In osu! and osu!mania, some judgements affect combo but aren't stored to scores. + // A special hit result is used to pad out the combo value to match, based on the max combo from the difficulty attributes. + var calculator = rulesetInstance.CreateDifficultyCalculator(workingBeatmap); + var attributes = calculator.Calculate(score.Mods); + + int maxComboFromStatistics = score.MaximumStatistics.Where(kvp => kvp.Key.AffectsCombo()).Select(kvp => kvp.Value).DefaultIfEmpty(0).Sum(); + if (attributes.MaxCombo > maxComboFromStatistics) + score.MaximumStatistics[HitResult.LegacyComboIncrease] = attributes.MaxCombo - maxComboFromStatistics; +#pragma warning restore CS0618 + } + /// /// Populates the accuracy of a given from its contained statistics. /// diff --git a/osu.Game/Scoring/ScoreImporter.cs b/osu.Game/Scoring/ScoreImporter.cs index 8e28707107..afa522b253 100644 --- a/osu.Game/Scoring/ScoreImporter.cs +++ b/osu.Game/Scoring/ScoreImporter.cs @@ -17,7 +17,6 @@ using osu.Game.Scoring.Legacy; using osu.Game.Online.API; using osu.Game.Online.API.Requests; using osu.Game.Online.API.Requests.Responses; -using osu.Game.Rulesets.Scoring; using Realms; namespace osu.Game.Scoring @@ -91,8 +90,6 @@ namespace osu.Game.Scoring ArgumentNullException.ThrowIfNull(model.BeatmapInfo); ArgumentNullException.ThrowIfNull(model.Ruleset); - PopulateMaximumStatistics(model); - if (string.IsNullOrEmpty(model.StatisticsJson)) model.StatisticsJson = JsonConvert.SerializeObject(model.Statistics); @@ -110,70 +107,6 @@ namespace osu.Game.Scoring } } - /// - /// Populates the for a given . - /// - /// The score to populate the statistics of. - public void PopulateMaximumStatistics(ScoreInfo score) - { - Debug.Assert(score.BeatmapInfo != null); - - if (score.MaximumStatistics.Select(kvp => kvp.Value).Sum() > 0) - return; - - var beatmap = score.BeatmapInfo!.Detach(); - var ruleset = score.Ruleset.Detach(); - var rulesetInstance = ruleset.CreateInstance(); - var scoreProcessor = rulesetInstance.CreateScoreProcessor(); - - Debug.Assert(rulesetInstance != null); - - // Populate the maximum statistics. - HitResult maxBasicResult = rulesetInstance.GetHitResults() - .Select(h => h.result) - .Where(h => h.IsBasic()).MaxBy(scoreProcessor.GetBaseScoreForResult); - - foreach ((HitResult result, int count) in score.Statistics) - { - switch (result) - { - case HitResult.LargeTickHit: - case HitResult.LargeTickMiss: - score.MaximumStatistics[HitResult.LargeTickHit] = score.MaximumStatistics.GetValueOrDefault(HitResult.LargeTickHit) + count; - break; - - case HitResult.SmallTickHit: - case HitResult.SmallTickMiss: - score.MaximumStatistics[HitResult.SmallTickHit] = score.MaximumStatistics.GetValueOrDefault(HitResult.SmallTickHit) + count; - break; - - case HitResult.IgnoreHit: - case HitResult.IgnoreMiss: - case HitResult.SmallBonus: - case HitResult.LargeBonus: - break; - - default: - score.MaximumStatistics[maxBasicResult] = score.MaximumStatistics.GetValueOrDefault(maxBasicResult) + count; - break; - } - } - - if (!score.IsLegacyScore) - return; - -#pragma warning disable CS0618 - // In osu! and osu!mania, some judgements affect combo but aren't stored to scores. - // A special hit result is used to pad out the combo value to match, based on the max combo from the difficulty attributes. - var calculator = rulesetInstance.CreateDifficultyCalculator(beatmaps().GetWorkingBeatmap(beatmap)); - var attributes = calculator.Calculate(score.Mods); - - int maxComboFromStatistics = score.MaximumStatistics.Where(kvp => kvp.Key.AffectsCombo()).Select(kvp => kvp.Value).DefaultIfEmpty(0).Sum(); - if (attributes.MaxCombo > maxComboFromStatistics) - score.MaximumStatistics[HitResult.LegacyComboIncrease] = attributes.MaxCombo - maxComboFromStatistics; -#pragma warning restore CS0618 - } - // Very naive local caching to improve performance of large score imports (where the username is usually the same for most or all scores). private readonly Dictionary usernameLookupCache = new Dictionary(); diff --git a/osu.Game/Scoring/ScoreManager.cs b/osu.Game/Scoring/ScoreManager.cs index 02d9e0a280..1ee99e9e93 100644 --- a/osu.Game/Scoring/ScoreManager.cs +++ b/osu.Game/Scoring/ScoreManager.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Threading; @@ -26,6 +27,7 @@ namespace osu.Game.Scoring { public class ScoreManager : ModelManager, IModelImporter { + private readonly Func beatmaps; private readonly OsuConfigManager configManager; private readonly ScoreImporter scoreImporter; private readonly LegacyScoreExporter scoreExporter; @@ -44,6 +46,7 @@ namespace osu.Game.Scoring OsuConfigManager configManager = null) : base(storage, realm) { + this.beatmaps = beatmaps; this.configManager = configManager; scoreImporter = new ScoreImporter(rulesets, beatmaps, storage, realm, api) @@ -171,7 +174,11 @@ namespace osu.Game.Scoring /// Populates the for a given . /// /// The score to populate the statistics of. - public void PopulateMaximumStatistics(ScoreInfo score) => scoreImporter.PopulateMaximumStatistics(score); + public void PopulateMaximumStatistics(ScoreInfo score) + { + Debug.Assert(score.BeatmapInfo != null); + LegacyScoreDecoder.PopulateMaximumStatistics(score, beatmaps().GetWorkingBeatmap(score.BeatmapInfo.Detach())); + } #region Implementation of IPresentImports From 2958631c5d69fdd3af915d04f26825077213069e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 17 Jan 2024 19:14:53 +0100 Subject: [PATCH 265/651] Use lazer accuracy & rank implementations across the board --- osu.Game/Database/StandardisedScoreMigrationTools.cs | 11 +++++++++++ osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 10 ++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/osu.Game/Database/StandardisedScoreMigrationTools.cs b/osu.Game/Database/StandardisedScoreMigrationTools.cs index 8c73806cb5..4221ab93f1 100644 --- a/osu.Game/Database/StandardisedScoreMigrationTools.cs +++ b/osu.Game/Database/StandardisedScoreMigrationTools.cs @@ -597,6 +597,17 @@ namespace osu.Game.Database return maxBaseScore == 0 ? 1 : baseScore / (double)maxBaseScore; } + public static ScoreRank ComputeRank(ScoreInfo scoreInfo) + { + Ruleset ruleset = scoreInfo.Ruleset.CreateInstance(); + var rank = ruleset.CreateScoreProcessor().RankFromScore(scoreInfo.Accuracy, scoreInfo.Statistics); + + foreach (var mod in scoreInfo.Mods.OfType()) + rank = mod.AdjustRank(rank, scoreInfo.Accuracy); + + return rank; + } + /// /// Used to populate the model using data parsed from its corresponding replay file. /// diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index 3d671d80c3..be704ca18b 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -40,7 +40,6 @@ namespace osu.Game.Scoring.Legacy }; WorkingBeatmap workingBeatmap; - byte[] compressedScoreInfo = null; using (SerializationReader sr = new SerializationReader(stream)) { @@ -109,6 +108,8 @@ namespace osu.Game.Scoring.Legacy else if (version >= 20121008) scoreInfo.LegacyOnlineID = sr.ReadInt32(); + byte[] compressedScoreInfo = null; + if (version >= 30000001) compressedScoreInfo = sr.ReadByteArray(); @@ -133,11 +134,8 @@ namespace osu.Game.Scoring.Legacy } PopulateMaximumStatistics(score.ScoreInfo, workingBeatmap); - - if (score.ScoreInfo.IsLegacyScore || compressedScoreInfo == null) - PopulateLegacyAccuracyAndRank(score.ScoreInfo); - else - populateLazerAccuracyAndRank(score.ScoreInfo); + score.ScoreInfo.Accuracy = StandardisedScoreMigrationTools.ComputeAccuracy(score.ScoreInfo); + score.ScoreInfo.Rank = StandardisedScoreMigrationTools.ComputeRank(score.ScoreInfo); // before returning for database import, we must restore the database-sourced BeatmapInfo. // if not, the clone operation in GetPlayableBeatmap will cause a dereference and subsequent database exception. From db4849442ec7b93312afc39bbc009d4b1da62d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 20:23:37 +0100 Subject: [PATCH 266/651] Unify legacy total score / accuracy / rank recomputation flows --- .../Database/BackgroundDataStoreProcessor.cs | 6 +- .../StandardisedScoreMigrationTools.cs | 60 +++++++++++-------- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 15 +---- osu.Game/Scoring/ScoreImporter.cs | 5 -- 4 files changed, 38 insertions(+), 48 deletions(-) diff --git a/osu.Game/Database/BackgroundDataStoreProcessor.cs b/osu.Game/Database/BackgroundDataStoreProcessor.cs index 324d699e7c..1e44141819 100644 --- a/osu.Game/Database/BackgroundDataStoreProcessor.cs +++ b/osu.Game/Database/BackgroundDataStoreProcessor.cs @@ -355,8 +355,7 @@ namespace osu.Game.Database realmAccess.Write(r => { ScoreInfo s = r.Find(id)!; - // TODO: ensure that this is also updating rank (as it will set TotalScoreVersion to latest). - StandardisedScoreMigrationTools.UpdateFromLegacy(s, beatmapManager); + StandardisedScoreMigrationTools.UpdateFromLegacy(s, beatmapManager.GetWorkingBeatmap(s.BeatmapInfo)); s.TotalScoreVersion = LegacyScoreEncoder.LATEST_VERSION; }); @@ -412,8 +411,7 @@ namespace osu.Game.Database realmAccess.Write(r => { ScoreInfo s = r.Find(id)!; - // TODO: uncomment when ready - // s.Rank = StandardisedScoreMigrationTools.ComputeRank(s, beatmapManager); + s.Rank = StandardisedScoreMigrationTools.ComputeRank(s); }); ++processedCount; diff --git a/osu.Game/Database/StandardisedScoreMigrationTools.cs b/osu.Game/Database/StandardisedScoreMigrationTools.cs index 4221ab93f1..d62d4a905a 100644 --- a/osu.Game/Database/StandardisedScoreMigrationTools.cs +++ b/osu.Game/Database/StandardisedScoreMigrationTools.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using osu.Framework.Logging; using osu.Game.Beatmaps; @@ -235,39 +234,49 @@ namespace osu.Game.Database /// Updates a legacy to standardised scoring. /// /// The score to update. - /// A used for lookups. - public static void UpdateFromLegacy(ScoreInfo score, BeatmapManager beatmaps) + /// The applicable for this score. + public static void UpdateFromLegacy(ScoreInfo score, WorkingBeatmap beatmap) { - score.TotalScore = convertFromLegacyTotalScore(score, beatmaps); - score.Accuracy = ComputeAccuracy(score); + var ruleset = score.Ruleset.CreateInstance(); + var scoreProcessor = ruleset.CreateScoreProcessor(); + + score.TotalScore = convertFromLegacyTotalScore(score, ruleset, beatmap); + score.Accuracy = computeAccuracy(score, scoreProcessor); + score.Rank = computeRank(score, scoreProcessor); } /// /// Updates a legacy to standardised scoring. /// + /// + /// This overload is intended for server-side flows. + /// See: https://github.com/ppy/osu-queue-score-statistics/blob/3681e92ac91c6c61922094bdbc7e92e6217dd0fc/osu.Server.Queues.ScoreStatisticsProcessor/Commands/Queue/BatchInserter.cs + /// /// The score to update. + /// The in which the score was set. /// The beatmap difficulty. /// The legacy scoring attributes for the beatmap which the score was set on. - public static void UpdateFromLegacy(ScoreInfo score, LegacyBeatmapConversionDifficultyInfo difficulty, LegacyScoreAttributes attributes) + public static void UpdateFromLegacy(ScoreInfo score, Ruleset ruleset, LegacyBeatmapConversionDifficultyInfo difficulty, LegacyScoreAttributes attributes) { - score.TotalScore = convertFromLegacyTotalScore(score, difficulty, attributes); - score.Accuracy = ComputeAccuracy(score); + var scoreProcessor = ruleset.CreateScoreProcessor(); + + score.TotalScore = convertFromLegacyTotalScore(score, ruleset, difficulty, attributes); + score.Accuracy = computeAccuracy(score, scoreProcessor); + score.Rank = computeRank(score, scoreProcessor); } /// /// Converts from to the new standardised scoring of . /// /// The score to convert the total score of. - /// A used for lookups. + /// The in which the score was set. + /// The applicable for this score. /// The standardised total score. - private static long convertFromLegacyTotalScore(ScoreInfo score, BeatmapManager beatmaps) + private static long convertFromLegacyTotalScore(ScoreInfo score, Ruleset ruleset, WorkingBeatmap beatmap) { if (!score.IsLegacyScore) return score.TotalScore; - WorkingBeatmap beatmap = beatmaps.GetWorkingBeatmap(score.BeatmapInfo); - Ruleset ruleset = score.Ruleset.CreateInstance(); - if (ruleset is not ILegacyRuleset legacyRuleset) return score.TotalScore; @@ -283,27 +292,28 @@ namespace osu.Game.Database ILegacyScoreSimulator sv1Simulator = legacyRuleset.CreateLegacyScoreSimulator(); LegacyScoreAttributes attributes = sv1Simulator.Simulate(beatmap, playableBeatmap); - return convertFromLegacyTotalScore(score, LegacyBeatmapConversionDifficultyInfo.FromBeatmap(beatmap.Beatmap), attributes); + return convertFromLegacyTotalScore(score, ruleset, LegacyBeatmapConversionDifficultyInfo.FromBeatmap(beatmap.Beatmap), attributes); } /// /// Converts from to the new standardised scoring of . /// /// The score to convert the total score of. + /// The in which the score was set. /// The beatmap difficulty. /// The legacy scoring attributes for the beatmap which the score was set on. /// The standardised total score. - private static long convertFromLegacyTotalScore(ScoreInfo score, LegacyBeatmapConversionDifficultyInfo difficulty, LegacyScoreAttributes attributes) + private static long convertFromLegacyTotalScore(ScoreInfo score, Ruleset ruleset, LegacyBeatmapConversionDifficultyInfo difficulty, LegacyScoreAttributes attributes) { if (!score.IsLegacyScore) return score.TotalScore; - Debug.Assert(score.LegacyTotalScore != null); - - Ruleset ruleset = score.Ruleset.CreateInstance(); if (ruleset is not ILegacyRuleset legacyRuleset) return score.TotalScore; + // ensure legacy total score is saved for later. + score.LegacyTotalScore = score.TotalScore; + double legacyModMultiplier = legacyRuleset.CreateLegacyScoreSimulator().GetLegacyScoreMultiplier(score.Mods, difficulty); int maximumLegacyAccuracyScore = attributes.AccuracyScore; long maximumLegacyComboScore = (long)Math.Round(attributes.ComboScore * legacyModMultiplier); @@ -584,11 +594,10 @@ namespace osu.Game.Database } } - public static double ComputeAccuracy(ScoreInfo scoreInfo) - { - Ruleset ruleset = scoreInfo.Ruleset.CreateInstance(); - ScoreProcessor scoreProcessor = ruleset.CreateScoreProcessor(); + public static double ComputeAccuracy(ScoreInfo scoreInfo) => computeAccuracy(scoreInfo, scoreInfo.Ruleset.CreateInstance().CreateScoreProcessor()); + private static double computeAccuracy(ScoreInfo scoreInfo, ScoreProcessor scoreProcessor) + { int baseScore = scoreInfo.Statistics.Where(kvp => kvp.Key.AffectsAccuracy()) .Sum(kvp => kvp.Value * scoreProcessor.GetBaseScoreForResult(kvp.Key)); int maxBaseScore = scoreInfo.MaximumStatistics.Where(kvp => kvp.Key.AffectsAccuracy()) @@ -597,10 +606,11 @@ namespace osu.Game.Database return maxBaseScore == 0 ? 1 : baseScore / (double)maxBaseScore; } - public static ScoreRank ComputeRank(ScoreInfo scoreInfo) + public static ScoreRank ComputeRank(ScoreInfo scoreInfo) => computeRank(scoreInfo, scoreInfo.Ruleset.CreateInstance().CreateScoreProcessor()); + + private static ScoreRank computeRank(ScoreInfo scoreInfo, ScoreProcessor scoreProcessor) { - Ruleset ruleset = scoreInfo.Ruleset.CreateInstance(); - var rank = ruleset.CreateScoreProcessor().RankFromScore(scoreInfo.Accuracy, scoreInfo.Statistics); + var rank = scoreProcessor.RankFromScore(scoreInfo.Accuracy, scoreInfo.Statistics); foreach (var mod in scoreInfo.Mods.OfType()) rank = mod.AdjustRank(rank, scoreInfo.Accuracy); diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index be704ca18b..c12e8b8474 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -134,8 +134,7 @@ namespace osu.Game.Scoring.Legacy } PopulateMaximumStatistics(score.ScoreInfo, workingBeatmap); - score.ScoreInfo.Accuracy = StandardisedScoreMigrationTools.ComputeAccuracy(score.ScoreInfo); - score.ScoreInfo.Rank = StandardisedScoreMigrationTools.ComputeRank(score.ScoreInfo); + StandardisedScoreMigrationTools.UpdateFromLegacy(score.ScoreInfo, workingBeatmap); // before returning for database import, we must restore the database-sourced BeatmapInfo. // if not, the clone operation in GetPlayableBeatmap will cause a dereference and subsequent database exception. @@ -342,18 +341,6 @@ namespace osu.Game.Scoring.Legacy } } - private void populateLazerAccuracyAndRank(ScoreInfo scoreInfo) - { - scoreInfo.Accuracy = StandardisedScoreMigrationTools.ComputeAccuracy(scoreInfo); - - var rank = currentRuleset.CreateScoreProcessor().RankFromScore(scoreInfo.Accuracy, scoreInfo.Statistics); - - foreach (var mod in scoreInfo.Mods.OfType()) - rank = mod.AdjustRank(rank, scoreInfo.Accuracy); - - scoreInfo.Rank = rank; - } - private void readLegacyReplay(Replay replay, StreamReader reader) { float lastTime = beatmapOffset; diff --git a/osu.Game/Scoring/ScoreImporter.cs b/osu.Game/Scoring/ScoreImporter.cs index afa522b253..768c28cc38 100644 --- a/osu.Game/Scoring/ScoreImporter.cs +++ b/osu.Game/Scoring/ScoreImporter.cs @@ -100,11 +100,6 @@ namespace osu.Game.Scoring // this requires: max combo, statistics, max statistics (where available), and mods to already be populated on the score. if (StandardisedScoreMigrationTools.ShouldMigrateToNewStandardised(model)) model.TotalScore = StandardisedScoreMigrationTools.GetNewStandardised(model); - else if (model.IsLegacyScore) - { - model.LegacyTotalScore = model.TotalScore; - StandardisedScoreMigrationTools.UpdateFromLegacy(model, beatmaps()); - } } // Very naive local caching to improve performance of large score imports (where the username is usually the same for most or all scores). From 217cbf684b249c220b1c867bca92f0fd4e4a0361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 20:25:29 +0100 Subject: [PATCH 267/651] Remove superfluous recomputation of accuracy --- .../Database/StandardisedScoreMigrationTools.cs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/osu.Game/Database/StandardisedScoreMigrationTools.cs b/osu.Game/Database/StandardisedScoreMigrationTools.cs index d62d4a905a..5fcf35b690 100644 --- a/osu.Game/Database/StandardisedScoreMigrationTools.cs +++ b/osu.Game/Database/StandardisedScoreMigrationTools.cs @@ -240,9 +240,10 @@ namespace osu.Game.Database var ruleset = score.Ruleset.CreateInstance(); var scoreProcessor = ruleset.CreateScoreProcessor(); - score.TotalScore = convertFromLegacyTotalScore(score, ruleset, beatmap); + // warning: ordering is important here - both total score and ranks are dependent on accuracy! score.Accuracy = computeAccuracy(score, scoreProcessor); score.Rank = computeRank(score, scoreProcessor); + score.TotalScore = convertFromLegacyTotalScore(score, ruleset, beatmap); } /// @@ -260,9 +261,10 @@ namespace osu.Game.Database { var scoreProcessor = ruleset.CreateScoreProcessor(); - score.TotalScore = convertFromLegacyTotalScore(score, ruleset, difficulty, attributes); + // warning: ordering is important here - both total score and ranks are dependent on accuracy! score.Accuracy = computeAccuracy(score, scoreProcessor); score.Rank = computeRank(score, scoreProcessor); + score.TotalScore = convertFromLegacyTotalScore(score, ruleset, difficulty, attributes); } /// @@ -484,14 +486,9 @@ namespace osu.Game.Database break; case 3: - // in the mania case accuracy actually changes between score V1 and score V2 / standardised - // (PERFECT weighting changes from 300 to 305), - // so for better accuracy recompute accuracy locally based on hit statistics and use that instead, - double scoreV2Accuracy = ComputeAccuracy(score); - convertedTotalScore = (long)Math.Round(( 850000 * comboProportion - + 150000 * Math.Pow(scoreV2Accuracy, 2 + 2 * scoreV2Accuracy) + + 150000 * Math.Pow(score.Accuracy, 2 + 2 * score.Accuracy) + bonusProportion) * modMultiplier); break; @@ -594,8 +591,6 @@ namespace osu.Game.Database } } - public static double ComputeAccuracy(ScoreInfo scoreInfo) => computeAccuracy(scoreInfo, scoreInfo.Ruleset.CreateInstance().CreateScoreProcessor()); - private static double computeAccuracy(ScoreInfo scoreInfo, ScoreProcessor scoreProcessor) { int baseScore = scoreInfo.Statistics.Where(kvp => kvp.Key.AffectsAccuracy()) From cdd6e71d0129bce737995ae888d015589f7e43f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 20:26:30 +0100 Subject: [PATCH 268/651] Remove legacy computation of accuracy & ranks --- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 106 ------------------ 1 file changed, 106 deletions(-) diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index c12e8b8474..a7374d4d4b 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -235,112 +235,6 @@ namespace osu.Game.Scoring.Legacy #pragma warning restore CS0618 } - /// - /// Populates the accuracy of a given from its contained statistics. - /// - /// - /// Legacy use only. - /// - /// The to populate. - public static void PopulateLegacyAccuracyAndRank(ScoreInfo score) - { - int countMiss = score.GetCountMiss() ?? 0; - int count50 = score.GetCount50() ?? 0; - int count100 = score.GetCount100() ?? 0; - int count300 = score.GetCount300() ?? 0; - int countGeki = score.GetCountGeki() ?? 0; - int countKatu = score.GetCountKatu() ?? 0; - - switch (score.Ruleset.OnlineID) - { - case 0: - { - int totalHits = count50 + count100 + count300 + countMiss; - score.Accuracy = totalHits > 0 ? (double)(count50 * 50 + count100 * 100 + count300 * 300) / (totalHits * 300) : 1; - - float ratio300 = (float)count300 / totalHits; - float ratio50 = (float)count50 / totalHits; - - if (ratio300 == 1) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.XH : ScoreRank.X; - else if (ratio300 > 0.9 && ratio50 <= 0.01 && countMiss == 0) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.SH : ScoreRank.S; - else if ((ratio300 > 0.8 && countMiss == 0) || ratio300 > 0.9) - score.Rank = ScoreRank.A; - else if ((ratio300 > 0.7 && countMiss == 0) || ratio300 > 0.8) - score.Rank = ScoreRank.B; - else if (ratio300 > 0.6) - score.Rank = ScoreRank.C; - else - score.Rank = ScoreRank.D; - break; - } - - case 1: - { - int totalHits = count50 + count100 + count300 + countMiss; - score.Accuracy = totalHits > 0 ? (double)(count100 * 150 + count300 * 300) / (totalHits * 300) : 1; - - float ratio300 = (float)count300 / totalHits; - float ratio50 = (float)count50 / totalHits; - - if (ratio300 == 1) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.XH : ScoreRank.X; - else if (ratio300 > 0.9 && ratio50 <= 0.01 && countMiss == 0) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.SH : ScoreRank.S; - else if ((ratio300 > 0.8 && countMiss == 0) || ratio300 > 0.9) - score.Rank = ScoreRank.A; - else if ((ratio300 > 0.7 && countMiss == 0) || ratio300 > 0.8) - score.Rank = ScoreRank.B; - else if (ratio300 > 0.6) - score.Rank = ScoreRank.C; - else - score.Rank = ScoreRank.D; - break; - } - - case 2: - { - int totalHits = count50 + count100 + count300 + countMiss + countKatu; - score.Accuracy = totalHits > 0 ? (double)(count50 + count100 + count300) / totalHits : 1; - - if (score.Accuracy == 1) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.XH : ScoreRank.X; - else if (score.Accuracy > 0.98) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.SH : ScoreRank.S; - else if (score.Accuracy > 0.94) - score.Rank = ScoreRank.A; - else if (score.Accuracy > 0.9) - score.Rank = ScoreRank.B; - else if (score.Accuracy > 0.85) - score.Rank = ScoreRank.C; - else - score.Rank = ScoreRank.D; - break; - } - - case 3: - { - int totalHits = count50 + count100 + count300 + countMiss + countGeki + countKatu; - score.Accuracy = totalHits > 0 ? (double)(count50 * 50 + count100 * 100 + countKatu * 200 + (count300 + countGeki) * 300) / (totalHits * 300) : 1; - - if (score.Accuracy == 1) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.XH : ScoreRank.X; - else if (score.Accuracy > 0.95) - score.Rank = score.Mods.Any(m => m is ModHidden || m is ModFlashlight) ? ScoreRank.SH : ScoreRank.S; - else if (score.Accuracy > 0.9) - score.Rank = ScoreRank.A; - else if (score.Accuracy > 0.8) - score.Rank = ScoreRank.B; - else if (score.Accuracy > 0.7) - score.Rank = ScoreRank.C; - else - score.Rank = ScoreRank.D; - break; - } - } - } - private void readLegacyReplay(Replay replay, StreamReader reader) { float lastTime = beatmapOffset; From d53fb5a1652a3ae50cb89a2e8609da752a319df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 20:52:45 +0100 Subject: [PATCH 269/651] Update assertions to match expected behaviour --- .../Formats/LegacyScoreDecoderTest.cs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs index fd99b51a2f..7e3967dc95 100644 --- a/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs +++ b/osu.Game.Tests/Beatmaps/Formats/LegacyScoreDecoderTest.cs @@ -10,7 +10,6 @@ using System.IO; using System.Linq; using NUnit.Framework; using osu.Framework.Extensions; -using osu.Framework.Utils; using osu.Game.Beatmaps; using osu.Game.Beatmaps.Formats; using osu.Game.Beatmaps.Legacy; @@ -23,6 +22,7 @@ using osu.Game.Rulesets.Mania.Mods; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Mods; +using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Replays; using osu.Game.Rulesets.Osu.UI; using osu.Game.Rulesets.Replays; @@ -59,14 +59,14 @@ namespace osu.Game.Tests.Beatmaps.Formats Assert.AreEqual(2, score.ScoreInfo.Statistics[HitResult.Great]); Assert.AreEqual(1, score.ScoreInfo.Statistics[HitResult.Good]); - Assert.AreEqual(829_931, score.ScoreInfo.TotalScore); + Assert.AreEqual(829_931, score.ScoreInfo.LegacyTotalScore); Assert.AreEqual(3, score.ScoreInfo.MaxCombo); Assert.IsTrue(score.ScoreInfo.Mods.Any(m => m is ManiaModClassic)); Assert.IsTrue(score.ScoreInfo.APIMods.Any(m => m.Acronym == "CL")); Assert.IsTrue(score.ScoreInfo.ModsJson.Contains("CL")); - Assert.IsTrue(Precision.AlmostEquals(0.8889, score.ScoreInfo.Accuracy, 0.0001)); + Assert.That((2 * 300d + 1 * 200) / (3 * 305d), Is.EqualTo(score.ScoreInfo.Accuracy).Within(0.0001)); Assert.AreEqual(ScoreRank.B, score.ScoreInfo.Rank); Assert.That(score.Replay.Frames, Is.Not.Empty); @@ -289,7 +289,7 @@ namespace osu.Game.Tests.Beatmaps.Formats Assert.Multiple(() => { Assert.That(decoded.ScoreInfo.Accuracy, Is.EqualTo((double)(198 * 305 + 300) / (200 * 305))); - Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.S)); + Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.SH)); }); } @@ -330,12 +330,12 @@ namespace osu.Game.Tests.Beatmaps.Formats Assert.Multiple(() => { // In stable this would be an A because there are over 1% 50s. But that's not a thing in lazer. - Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.S)); + Assert.That(decoded.ScoreInfo.Rank, Is.EqualTo(ScoreRank.SH)); }); } [Test] - public void AccuracyOfLazerScorePreserved() + public void AccuracyRankAndTotalScoreOfLazerScorePreserved() { var ruleset = new OsuRuleset().RulesetInfo; @@ -363,6 +363,8 @@ namespace osu.Game.Tests.Beatmaps.Formats Assert.Multiple(() => { + Assert.That(decodedAfterEncode.ScoreInfo.TotalScore, Is.EqualTo(284_537)); + Assert.That(decodedAfterEncode.ScoreInfo.LegacyTotalScore, Is.Null); Assert.That(decodedAfterEncode.ScoreInfo.Accuracy, Is.EqualTo((double)(199 * 300 + 30) / (200 * 300 + 30))); Assert.That(decodedAfterEncode.ScoreInfo.Rank, Is.EqualTo(ScoreRank.A)); }); @@ -457,6 +459,12 @@ namespace osu.Game.Tests.Beatmaps.Formats Ruleset = new OsuRuleset().RulesetInfo, Difficulty = new BeatmapDifficulty(), BeatmapVersion = beatmapVersion, + }, + // needs to have at least one objects so that `StandardisedScoreMigrationTools` doesn't die + // when trying to recompute total score. + HitObjects = + { + new HitCircle() } }); } From 24be6d92ceebf8950bb7bddd44710eeaac92f10a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 21:13:06 +0100 Subject: [PATCH 270/651] Expand xmldoc --- osu.Game/Database/StandardisedScoreMigrationTools.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/osu.Game/Database/StandardisedScoreMigrationTools.cs b/osu.Game/Database/StandardisedScoreMigrationTools.cs index 5fcf35b690..bf92dbc8f5 100644 --- a/osu.Game/Database/StandardisedScoreMigrationTools.cs +++ b/osu.Game/Database/StandardisedScoreMigrationTools.cs @@ -231,7 +231,10 @@ namespace osu.Game.Database } /// - /// Updates a legacy to standardised scoring. + /// Updates a to standardised scoring. + /// This will recompite the score's (always), (always), + /// and (if the score comes from stable). + /// The total score from stable - if any applicable - will be stored to . /// /// The score to update. /// The applicable for this score. @@ -247,7 +250,10 @@ namespace osu.Game.Database } /// - /// Updates a legacy to standardised scoring. + /// Updates a to standardised scoring. + /// This will recompute the score's (always), (always), + /// and (if the score comes from stable). + /// The total score from stable - if any applicable - will be stored to . /// /// /// This overload is intended for server-side flows. From 069af13aaf1d1c716ce207f9c9d2eab48f013eaa Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 23 Jan 2024 05:26:16 +0900 Subject: [PATCH 271/651] Reduce enumerator overhead in `GameplayLeaderboard` --- osu.Game/Online/Leaderboards/Leaderboard.cs | 4 ++-- osu.Game/Screens/Play/HUD/GameplayLeaderboard.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Online/Leaderboards/Leaderboard.cs b/osu.Game/Online/Leaderboards/Leaderboard.cs index 67f2590ad8..0fd9597ac0 100644 --- a/osu.Game/Online/Leaderboards/Leaderboard.cs +++ b/osu.Game/Online/Leaderboards/Leaderboard.cs @@ -287,7 +287,7 @@ namespace osu.Game.Online.Leaderboards double delay = 0; - foreach (var s in scoreFlowContainer.Children) + foreach (var s in scoreFlowContainer) { using (s.BeginDelayedSequence(delay)) s.Show(); @@ -384,7 +384,7 @@ namespace osu.Game.Online.Leaderboards if (scoreFlowContainer == null) return; - foreach (var c in scoreFlowContainer.Children) + foreach (var c in scoreFlowContainer) { float topY = c.ToSpaceOfOtherDrawable(Vector2.Zero, scoreFlowContainer).Y; float bottomY = topY + LeaderboardScore.HEIGHT; diff --git a/osu.Game/Screens/Play/HUD/GameplayLeaderboard.cs b/osu.Game/Screens/Play/HUD/GameplayLeaderboard.cs index d990af32e7..d2b6b834f8 100644 --- a/osu.Game/Screens/Play/HUD/GameplayLeaderboard.cs +++ b/osu.Game/Screens/Play/HUD/GameplayLeaderboard.cs @@ -128,7 +128,7 @@ namespace osu.Game.Screens.Play.HUD if (!scroll.IsScrolledToEnd()) fadeBottom -= panel_height; // logic is mostly shared with Leaderboard, copied here for simplicity. - foreach (var c in Flow.Children) + foreach (var c in Flow) { float topY = c.ToSpaceOfOtherDrawable(Vector2.Zero, Flow).Y; float bottomY = topY + panel_height; From 02bb506cce02df332ff4f884462bc5e24dfac949 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 23 Jan 2024 05:32:11 +0900 Subject: [PATCH 272/651] Avoid using `.Children` for enumeration in other locations --- osu.Desktop.slnf | 13 ++++++------- osu.Game/Graphics/Containers/WaveContainer.cs | 4 ++-- .../Graphics/UserInterface/BreadcrumbControl.cs | 2 +- osu.Game/Graphics/UserInterface/OsuTabControl.cs | 4 ++-- osu.Game/Graphics/UserInterface/StarCounter.cs | 2 +- osu.Game/Overlays/Chat/Listing/ChannelListing.cs | 2 +- osu.Game/Overlays/OverlayStreamControl.cs | 4 ++-- osu.Game/Screens/Menu/ButtonSystem.cs | 2 +- .../HUD/JudgementCounter/JudgementCounterDisplay.cs | 2 +- .../Select/Carousel/DrawableCarouselBeatmapSet.cs | 2 +- 10 files changed, 18 insertions(+), 19 deletions(-) diff --git a/osu.Desktop.slnf b/osu.Desktop.slnf index 503e5935f5..606988ccdf 100644 --- a/osu.Desktop.slnf +++ b/osu.Desktop.slnf @@ -16,15 +16,14 @@ "osu.Game.Tournament.Tests\\osu.Game.Tournament.Tests.csproj", "osu.Game.Tournament\\osu.Game.Tournament.csproj", "osu.Game\\osu.Game.csproj", - - "Templates\\Rulesets\\ruleset-empty\\osu.Game.Rulesets.EmptyFreeform\\osu.Game.Rulesets.EmptyFreeform.csproj", "Templates\\Rulesets\\ruleset-empty\\osu.Game.Rulesets.EmptyFreeform.Tests\\osu.Game.Rulesets.EmptyFreeform.Tests.csproj", - "Templates\\Rulesets\\ruleset-example\\osu.Game.Rulesets.Pippidon\\osu.Game.Rulesets.Pippidon.csproj", + "Templates\\Rulesets\\ruleset-empty\\osu.Game.Rulesets.EmptyFreeform\\osu.Game.Rulesets.EmptyFreeform.csproj", "Templates\\Rulesets\\ruleset-example\\osu.Game.Rulesets.Pippidon.Tests\\osu.Game.Rulesets.Pippidon.Tests.csproj", - "Templates\\Rulesets\\ruleset-scrolling-empty\\osu.Game.Rulesets.EmptyScrolling\\osu.Game.Rulesets.EmptyScrolling.csproj", + "Templates\\Rulesets\\ruleset-example\\osu.Game.Rulesets.Pippidon\\osu.Game.Rulesets.Pippidon.csproj", "Templates\\Rulesets\\ruleset-scrolling-empty\\osu.Game.Rulesets.EmptyScrolling.Tests\\osu.Game.Rulesets.EmptyScrolling.Tests.csproj", - "Templates\\Rulesets\\ruleset-scrolling-example\\osu.Game.Rulesets.Pippidon\\osu.Game.Rulesets.Pippidon.csproj", - "Templates\\Rulesets\\ruleset-scrolling-example\\osu.Game.Rulesets.Pippidon.Tests\\osu.Game.Rulesets.Pippidon.Tests.csproj" + "Templates\\Rulesets\\ruleset-scrolling-empty\\osu.Game.Rulesets.EmptyScrolling\\osu.Game.Rulesets.EmptyScrolling.csproj", + "Templates\\Rulesets\\ruleset-scrolling-example\\osu.Game.Rulesets.Pippidon.Tests\\osu.Game.Rulesets.Pippidon.Tests.csproj", + "Templates\\Rulesets\\ruleset-scrolling-example\\osu.Game.Rulesets.Pippidon\\osu.Game.Rulesets.Pippidon.csproj" ] } -} +} \ No newline at end of file diff --git a/osu.Game/Graphics/Containers/WaveContainer.cs b/osu.Game/Graphics/Containers/WaveContainer.cs index 5abc66d2ac..2ae4dc5a76 100644 --- a/osu.Game/Graphics/Containers/WaveContainer.cs +++ b/osu.Game/Graphics/Containers/WaveContainer.cs @@ -122,7 +122,7 @@ namespace osu.Game.Graphics.Containers protected override void PopIn() { - foreach (var w in wavesContainer.Children) + foreach (var w in wavesContainer) w.Show(); contentContainer.MoveToY(0, APPEAR_DURATION, Easing.OutQuint); @@ -132,7 +132,7 @@ namespace osu.Game.Graphics.Containers protected override void PopOut() { - foreach (var w in wavesContainer.Children) + foreach (var w in wavesContainer) w.Hide(); contentContainer.MoveToY(2, DISAPPEAR_DURATION, Easing.In); diff --git a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs index fc0770d896..af4b3849af 100644 --- a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs +++ b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs @@ -33,7 +33,7 @@ namespace osu.Game.Graphics.UserInterface Current.ValueChanged += index => { - foreach (var t in TabContainer.Children.OfType()) + foreach (var t in TabContainer.OfType()) { int tIndex = TabContainer.IndexOf(t); int tabIndex = TabContainer.IndexOf(TabMap[index.NewValue]); diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index 05309760e7..c260c92b43 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -37,7 +37,7 @@ namespace osu.Game.Graphics.UserInterface if (Dropdown is IHasAccentColour dropdown) dropdown.AccentColour = value; - foreach (var i in TabContainer.Children.OfType()) + foreach (var i in TabContainer.OfType()) i.AccentColour = value; } } @@ -48,7 +48,7 @@ namespace osu.Game.Graphics.UserInterface protected override TabItem CreateTabItem(T value) => new OsuTabItem(value); - protected virtual float StripWidth => TabContainer.Children.Sum(c => c.IsPresent ? c.DrawWidth + TabContainer.Spacing.X : 0) - TabContainer.Spacing.X; + protected virtual float StripWidth => TabContainer.Sum(c => c.IsPresent ? c.DrawWidth + TabContainer.Spacing.X : 0) - TabContainer.Spacing.X; /// /// Whether entries should be automatically populated if is an type. diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs index fe986b275e..720f479216 100644 --- a/osu.Game/Graphics/UserInterface/StarCounter.cs +++ b/osu.Game/Graphics/UserInterface/StarCounter.cs @@ -101,7 +101,7 @@ namespace osu.Game.Graphics.UserInterface public void StopAnimation() { animate(current); - foreach (var star in stars.Children) + foreach (var star in stars) star.FinishTransforms(true); } diff --git a/osu.Game/Overlays/Chat/Listing/ChannelListing.cs b/osu.Game/Overlays/Chat/Listing/ChannelListing.cs index 809ea2f11d..1699dcceb0 100644 --- a/osu.Game/Overlays/Chat/Listing/ChannelListing.cs +++ b/osu.Game/Overlays/Chat/Listing/ChannelListing.cs @@ -63,7 +63,7 @@ namespace osu.Game.Overlays.Chat.Listing flow.ChildrenEnumerable = newChannels.Where(c => c.Type == ChannelType.Public) .Select(c => new ChannelListingItem(c)); - foreach (var item in flow.Children) + foreach (var item in flow) { item.OnRequestJoin += channel => OnRequestJoin?.Invoke(channel); item.OnRequestLeave += channel => OnRequestLeave?.Invoke(channel); diff --git a/osu.Game/Overlays/OverlayStreamControl.cs b/osu.Game/Overlays/OverlayStreamControl.cs index 84de384fb5..bc37a57cab 100644 --- a/osu.Game/Overlays/OverlayStreamControl.cs +++ b/osu.Game/Overlays/OverlayStreamControl.cs @@ -41,7 +41,7 @@ namespace osu.Game.Overlays protected override bool OnHover(HoverEvent e) { - foreach (var streamBadge in TabContainer.Children.OfType>()) + foreach (var streamBadge in TabContainer.OfType>()) streamBadge.UserHoveringArea = true; return base.OnHover(e); @@ -49,7 +49,7 @@ namespace osu.Game.Overlays protected override void OnHoverLost(HoverLostEvent e) { - foreach (var streamBadge in TabContainer.Children.OfType>()) + foreach (var streamBadge in TabContainer.OfType>()) streamBadge.UserHoveringArea = false; base.OnHoverLost(e); diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs index b2b3fbd626..d742d2377f 100644 --- a/osu.Game/Screens/Menu/ButtonSystem.cs +++ b/osu.Game/Screens/Menu/ButtonSystem.cs @@ -343,7 +343,7 @@ namespace osu.Game.Screens.Menu { buttonArea.ButtonSystemState = state; - foreach (var b in buttonArea.Children.OfType()) + foreach (var b in buttonArea.OfType()) b.ButtonSystemState = state; } diff --git a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs index 326be55222..25e5464205 100644 --- a/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs +++ b/osu.Game/Screens/Play/HUD/JudgementCounter/JudgementCounterDisplay.cs @@ -64,7 +64,7 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter CounterFlow.Direction = convertedDirection; - foreach (var counter in CounterFlow.Children) + foreach (var counter in CounterFlow) counter.Direction.Value = convertedDirection; }, true); diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs index 369db37e63..bd659d7423 100644 --- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs +++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs @@ -242,7 +242,7 @@ namespace osu.Game.Screens.Select.Carousel bool isSelected = Item?.State.Value == CarouselItemState.Selected; - foreach (var panel in beatmapContainer.Children) + foreach (var panel in beatmapContainer) { Debug.Assert(panel.Item != null); From fdd499a4859bcd682dc09156b3dcef1a8a32bcb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 21:34:28 +0100 Subject: [PATCH 273/651] Fix rank background processing not working (and not bumping score version) --- osu.Game/Database/BackgroundDataStoreProcessor.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Database/BackgroundDataStoreProcessor.cs b/osu.Game/Database/BackgroundDataStoreProcessor.cs index 1e44141819..27d19f86c8 100644 --- a/osu.Game/Database/BackgroundDataStoreProcessor.cs +++ b/osu.Game/Database/BackgroundDataStoreProcessor.cs @@ -383,6 +383,7 @@ namespace osu.Game.Database HashSet scoreIds = realmAccess.Run(r => new HashSet( r.All() .Where(s => s.TotalScoreVersion < LegacyScoreEncoder.LATEST_VERSION) + .AsEnumerable() // need to materialise here as realm cannot support `.Select()`. .Select(s => s.ID))); Logger.Log($"Found {scoreIds.Count} scores which require rank upgrades."); @@ -412,6 +413,7 @@ namespace osu.Game.Database { ScoreInfo s = r.Find(id)!; s.Rank = StandardisedScoreMigrationTools.ComputeRank(s); + s.TotalScoreVersion = LegacyScoreEncoder.LATEST_VERSION; }); ++processedCount; From 4d253ebf3c98cc8b923695c7a94b4360143d7d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 22 Jan 2024 22:01:03 +0100 Subject: [PATCH 274/651] Remove redundant assertion It does look pretty dumb to be checking if something is `null` *after calling an instance method on it*... --- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index a7374d4d4b..63bd822205 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -187,8 +187,6 @@ namespace osu.Game.Scoring.Legacy var rulesetInstance = ruleset.CreateInstance(); var scoreProcessor = rulesetInstance.CreateScoreProcessor(); - Debug.Assert(rulesetInstance != null); - // Populate the maximum statistics. HitResult maxBasicResult = rulesetInstance.GetHitResults() .Select(h => h.result) From da992ccc55e6712b18b3b91b8864e7c44238f9ca Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Tue, 23 Jan 2024 04:54:27 +0300 Subject: [PATCH 275/651] Implement per-axis triangles clamping --- .../Skinning/Default/TrianglesPiece.cs | 3 +- .../TestSceneTrianglesBackground.cs | 8 +++-- .../TestSceneTrianglesV2Background.cs | 8 +++-- osu.Game/Graphics/Backgrounds/Triangles.cs | 36 +++++++++++-------- osu.Game/Graphics/Backgrounds/TrianglesV2.cs | 36 +++++++++++-------- .../Graphics/UserInterface/DialogButton.cs | 2 +- osu.Game/Overlays/Mods/ModSelectColumn.cs | 4 +-- 7 files changed, 59 insertions(+), 38 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs index 566176505d..512ac8ee3e 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Default/TrianglesPiece.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using osu.Framework.Graphics; using osu.Game.Graphics.Backgrounds; namespace osu.Game.Rulesets.Osu.Skinning.Default @@ -15,7 +16,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default { TriangleScale = 1.2f; HideAlphaDiscrepancies = false; - ClampToDrawable = false; + ClampAxes = Axes.None; } protected override void Update() diff --git a/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs b/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs index 4733b7f92f..dd4c372193 100644 --- a/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs +++ b/osu.Game.Tests/Visual/Background/TestSceneTrianglesBackground.cs @@ -29,7 +29,8 @@ namespace osu.Game.Tests.Visual.Background ColourDark = Color4.Gray, Anchor = Anchor.Centre, Origin = Anchor.Centre, - Size = new Vector2(0.9f) + Size = new Vector2(0.9f), + ClampAxes = Axes.None } }; } @@ -40,7 +41,10 @@ namespace osu.Game.Tests.Visual.Background AddSliderStep("Triangle scale", 0f, 10f, 1f, s => triangles.TriangleScale = s); AddSliderStep("Seed", 0, 1000, 0, s => triangles.Reset(s)); - AddToggleStep("ClampToDrawable", c => triangles.ClampToDrawable = c); + AddStep("ClampAxes X", () => triangles.ClampAxes = Axes.X); + AddStep("ClampAxes Y", () => triangles.ClampAxes = Axes.Y); + AddStep("ClampAxes Both", () => triangles.ClampAxes = Axes.Both); + AddStep("ClampAxes None", () => triangles.ClampAxes = Axes.None); } } } diff --git a/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs b/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs index 71d1baddc8..4713852c0b 100644 --- a/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs +++ b/osu.Game.Tests/Visual/Background/TestSceneTrianglesV2Background.cs @@ -86,7 +86,8 @@ namespace osu.Game.Tests.Visual.Background { Anchor = Anchor.Centre, Origin = Anchor.Centre, - RelativeSizeAxes = Axes.Both + RelativeSizeAxes = Axes.Both, + ClampAxes = Axes.None } } }, @@ -128,7 +129,10 @@ namespace osu.Game.Tests.Visual.Background AddStep("White colour", () => box.Colour = triangles.Colour = maskedTriangles.Colour = Color4.White); AddStep("Vertical gradient", () => box.Colour = triangles.Colour = maskedTriangles.Colour = ColourInfo.GradientVertical(Color4.White, Color4.Red)); AddStep("Horizontal gradient", () => box.Colour = triangles.Colour = maskedTriangles.Colour = ColourInfo.GradientHorizontal(Color4.White, Color4.Red)); - AddToggleStep("ClampToDrawable", c => maskedTriangles.ClampToDrawable = c); + AddStep("ClampAxes X", () => maskedTriangles.ClampAxes = Axes.X); + AddStep("ClampAxes Y", () => maskedTriangles.ClampAxes = Axes.Y); + AddStep("ClampAxes Both", () => maskedTriangles.ClampAxes = Axes.Both); + AddStep("ClampAxes None", () => maskedTriangles.ClampAxes = Axes.None); } } } diff --git a/osu.Game/Graphics/Backgrounds/Triangles.cs b/osu.Game/Graphics/Backgrounds/Triangles.cs index d7bfeb7731..e877915fac 100644 --- a/osu.Game/Graphics/Backgrounds/Triangles.cs +++ b/osu.Game/Graphics/Backgrounds/Triangles.cs @@ -77,10 +77,10 @@ namespace osu.Game.Graphics.Backgrounds } /// - /// If enabled, only the portion of triangles that falls within this 's - /// shape is drawn to the screen. Default is true. + /// Controls on which the portion of triangles that falls within this 's + /// shape is drawn to the screen. Default is Axes.Both. /// - public bool ClampToDrawable { get; set; } = true; + public Axes ClampAxes { get; set; } = Axes.Both; /// /// Whether we should drop-off alpha values of triangles more quickly to improve @@ -257,7 +257,7 @@ namespace osu.Game.Graphics.Backgrounds private IShader shader; private Texture texture; - private bool clamp; + private Axes clampAxes; private readonly List parts = new List(); private readonly Vector2 triangleSize = new Vector2(1f, equilateral_triangle_ratio) * triangle_size; @@ -276,7 +276,7 @@ namespace osu.Game.Graphics.Backgrounds shader = Source.shader; texture = Source.texture; size = Source.DrawSize; - clamp = Source.ClampToDrawable; + clampAxes = Source.ClampAxes; parts.Clear(); parts.AddRange(Source.parts); @@ -306,7 +306,7 @@ namespace osu.Game.Graphics.Backgrounds Vector2 topLeft = particle.Position - new Vector2(relativeSize.X * 0.5f, 0f); - Quad triangleQuad = clamp ? clampToDrawable(topLeft, relativeSize) : new Quad(topLeft.X, topLeft.Y, relativeSize.X, relativeSize.Y); + Quad triangleQuad = getClampedQuad(clampAxes, topLeft, relativeSize); var drawQuad = new Quad( Vector2Extensions.Transform(triangleQuad.TopLeft * size, DrawInfo.Matrix), @@ -331,17 +331,23 @@ namespace osu.Game.Graphics.Backgrounds shader.Unbind(); } - private static Quad clampToDrawable(Vector2 topLeft, Vector2 size) + private static Quad getClampedQuad(Axes clampAxes, Vector2 topLeft, Vector2 size) { - float leftClamped = Math.Clamp(topLeft.X, 0f, 1f); - float topClamped = Math.Clamp(topLeft.Y, 0f, 1f); + Vector2 clampedTopLeft = topLeft; - return new Quad( - leftClamped, - topClamped, - Math.Clamp(topLeft.X + size.X, 0f, 1f) - leftClamped, - Math.Clamp(topLeft.Y + size.Y, 0f, 1f) - topClamped - ); + if (clampAxes == Axes.X || clampAxes == Axes.Both) + { + clampedTopLeft.X = Math.Clamp(topLeft.X, 0f, 1f); + size.X = Math.Clamp(topLeft.X + size.X, 0f, 1f) - clampedTopLeft.X; + } + + if (clampAxes == Axes.Y || clampAxes == Axes.Both) + { + clampedTopLeft.Y = Math.Clamp(topLeft.Y, 0f, 1f); + size.Y = Math.Clamp(topLeft.Y + size.Y, 0f, 1f) - clampedTopLeft.Y; + } + + return new Quad(clampedTopLeft.X, clampedTopLeft.Y, size.X, size.Y); } protected override void Dispose(bool isDisposing) diff --git a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs index f723b1b358..706b05f5ad 100644 --- a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs +++ b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs @@ -33,10 +33,10 @@ namespace osu.Game.Graphics.Backgrounds protected virtual bool CreateNewTriangles => true; /// - /// If enabled, only the portion of triangles that falls within this 's - /// shape is drawn to the screen. Default is true. + /// Controls on which the portion of triangles that falls within this 's + /// shape is drawn to the screen. Default is Axes.Both. /// - public bool ClampToDrawable { get; set; } = true; + public Axes ClampAxes { get; set; } = Axes.Both; private readonly BindableFloat spawnRatio = new BindableFloat(1f); @@ -193,7 +193,7 @@ namespace osu.Game.Graphics.Backgrounds private Vector2 size; private float thickness; private float texelSize; - private bool clamp; + private Axes clampAxes; public TrianglesDrawNode(TrianglesV2 source) : base(source) @@ -208,7 +208,7 @@ namespace osu.Game.Graphics.Backgrounds texture = Source.texture; size = Source.DrawSize; thickness = Source.Thickness; - clamp = Source.ClampToDrawable; + clampAxes = Source.ClampAxes; Quad triangleQuad = new Quad( Vector2Extensions.Transform(Vector2.Zero, DrawInfo.Matrix), @@ -248,7 +248,7 @@ namespace osu.Game.Graphics.Backgrounds { Vector2 topLeft = particle.Position - new Vector2(relativeSize.X * 0.5f, 0f); - Quad triangleQuad = clamp ? clampToDrawable(topLeft, relativeSize) : new Quad(topLeft.X, topLeft.Y, relativeSize.X, relativeSize.Y); + Quad triangleQuad = getClampedQuad(clampAxes, topLeft, relativeSize); var drawQuad = new Quad( Vector2Extensions.Transform(triangleQuad.TopLeft * size, DrawInfo.Matrix), @@ -270,17 +270,23 @@ namespace osu.Game.Graphics.Backgrounds shader.Unbind(); } - private static Quad clampToDrawable(Vector2 topLeft, Vector2 size) + private static Quad getClampedQuad(Axes clampAxes, Vector2 topLeft, Vector2 size) { - float leftClamped = Math.Clamp(topLeft.X, 0f, 1f); - float topClamped = Math.Clamp(topLeft.Y, 0f, 1f); + Vector2 clampedTopLeft = topLeft; - return new Quad( - leftClamped, - topClamped, - Math.Clamp(topLeft.X + size.X, 0f, 1f) - leftClamped, - Math.Clamp(topLeft.Y + size.Y, 0f, 1f) - topClamped - ); + if (clampAxes == Axes.X || clampAxes == Axes.Both) + { + clampedTopLeft.X = Math.Clamp(topLeft.X, 0f, 1f); + size.X = Math.Clamp(topLeft.X + size.X, 0f, 1f) - clampedTopLeft.X; + } + + if (clampAxes == Axes.Y || clampAxes == Axes.Both) + { + clampedTopLeft.Y = Math.Clamp(topLeft.Y, 0f, 1f); + size.Y = Math.Clamp(topLeft.Y + size.Y, 0f, 1f) - clampedTopLeft.Y; + } + + return new Quad(clampedTopLeft.X, clampedTopLeft.Y, size.X, size.Y); } protected override void Dispose(bool isDisposing) diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs index 10aca017f1..c39f41bf72 100644 --- a/osu.Game/Graphics/UserInterface/DialogButton.cs +++ b/osu.Game/Graphics/UserInterface/DialogButton.cs @@ -150,7 +150,7 @@ namespace osu.Game.Graphics.UserInterface TriangleScale = 4, ColourDark = OsuColour.Gray(0.88f), Shear = new Vector2(-0.2f, 0), - ClampToDrawable = false + ClampAxes = Axes.Y }, }, }, diff --git a/osu.Game/Overlays/Mods/ModSelectColumn.cs b/osu.Game/Overlays/Mods/ModSelectColumn.cs index 05454159c7..b2c5a054e1 100644 --- a/osu.Game/Overlays/Mods/ModSelectColumn.cs +++ b/osu.Game/Overlays/Mods/ModSelectColumn.cs @@ -34,7 +34,7 @@ namespace osu.Game.Overlays.Mods var hsv = new Colour4(value.R, value.G, value.B, 1f).ToHSV(); var trianglesColour = Colour4.FromHSV(hsv.X, hsv.Y + 0.2f, hsv.Z - 0.1f); - triangles.Colour = ColourInfo.GradientVertical(trianglesColour, trianglesColour.MultiplyAlpha(0f)); + triangles.Colour = ColourInfo.GradientVertical(trianglesColour, value); } } @@ -95,7 +95,7 @@ namespace osu.Game.Overlays.Mods Height = header_height, Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0), Velocity = 0.7f, - ClampToDrawable = false + ClampAxes = Axes.Y }, headerText = new OsuTextFlowContainer(t => { From c8cd7ebe6c66b57cbcfef2d841deacb60fdbd755 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 23 Jan 2024 17:29:31 +0900 Subject: [PATCH 276/651] Fix now playing beatmap backgrounds not being correctly centred https://github.com/ppy/osu/discussions/26679 --- osu.Game/Overlays/NowPlayingOverlay.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Overlays/NowPlayingOverlay.cs b/osu.Game/Overlays/NowPlayingOverlay.cs index 7ec52364d4..ab99370603 100644 --- a/osu.Game/Overlays/NowPlayingOverlay.cs +++ b/osu.Game/Overlays/NowPlayingOverlay.cs @@ -405,6 +405,8 @@ namespace osu.Game.Overlays RelativeSizeAxes = Axes.Both, Colour = OsuColour.Gray(150), FillMode = FillMode.Fill, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, }, new Box { From 0cf90677e616793ca3ea7e7da1c1a74b7b80e7b2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 23 Jan 2024 19:16:55 +0900 Subject: [PATCH 277/651] Apply more correct visual offset adjustment Co-authored-by: Walavouchey <36758269+Walavouchey@users.noreply.github.com> --- osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index be9a3a8a78..e7e54d0fae 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -415,7 +415,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy .FadeOut(800, Easing.Out); accuracyCircle - .FillTo(accuracyS - 0.0001, 70, Easing.OutQuint); + .FillTo(accuracyS - NOTCH_WIDTH_PERCENTAGE / 2 - visual_alignment_offset, 70, Easing.OutQuint); badges.Single(b => b.Rank == ScoreRank.S) .FadeOut(70, Easing.OutQuint); From cb87d6ce500bd8070b1a0ad69537a6f643e1aa67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 23 Jan 2024 11:05:29 +0100 Subject: [PATCH 278/651] Move transferal of `LegacyTotalScore` back to original spot This subtle detail was messing with server-side score import flows. Server-side, legacy total score will *already* be in `LegacyTotalScore` from the start, and `TotalScore` will be zero until recomputed via `StandardisedScoreMigrationTools.UpdateFromLegacy()` - so in that context, attempting to move it across is incorrect. --- osu.Game/Database/StandardisedScoreMigrationTools.cs | 6 +++--- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/osu.Game/Database/StandardisedScoreMigrationTools.cs b/osu.Game/Database/StandardisedScoreMigrationTools.cs index bf92dbc8f5..403e73ab77 100644 --- a/osu.Game/Database/StandardisedScoreMigrationTools.cs +++ b/osu.Game/Database/StandardisedScoreMigrationTools.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using osu.Framework.Logging; using osu.Game.Beatmaps; @@ -316,12 +317,11 @@ namespace osu.Game.Database if (!score.IsLegacyScore) return score.TotalScore; + Debug.Assert(score.LegacyTotalScore != null); + if (ruleset is not ILegacyRuleset legacyRuleset) return score.TotalScore; - // ensure legacy total score is saved for later. - score.LegacyTotalScore = score.TotalScore; - double legacyModMultiplier = legacyRuleset.CreateLegacyScoreSimulator().GetLegacyScoreMultiplier(score.Mods, difficulty); int maximumLegacyAccuracyScore = attributes.AccuracyScore; long maximumLegacyComboScore = (long)Math.Round(attributes.ComboScore * legacyModMultiplier); diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index 63bd822205..e51a95798b 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -134,6 +134,10 @@ namespace osu.Game.Scoring.Legacy } PopulateMaximumStatistics(score.ScoreInfo, workingBeatmap); + + if (score.ScoreInfo.IsLegacyScore) + score.ScoreInfo.LegacyTotalScore = score.ScoreInfo.TotalScore; + StandardisedScoreMigrationTools.UpdateFromLegacy(score.ScoreInfo, workingBeatmap); // before returning for database import, we must restore the database-sourced BeatmapInfo. From 0b5be3c40cd0ccb2c1ab190c719d44d6d4521268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 23 Jan 2024 12:53:16 +0100 Subject: [PATCH 279/651] Remove outdated test Non-legacy scores *are* subject to upgrades again - albeit it is *rank* upgrades that they are subject to. --- .../BackgroundDataStoreProcessorTests.cs | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs b/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs index e22cf2398b..e960995c45 100644 --- a/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs +++ b/osu.Game.Tests/Database/BackgroundDataStoreProcessorTests.cs @@ -211,31 +211,6 @@ namespace osu.Game.Tests.Database AddAssert("Score version not upgraded", () => Realm.Run(r => r.Find(scoreInfo.ID)!.TotalScoreVersion), () => Is.EqualTo(30000001)); } - [Test] - public void TestNonLegacyScoreNotSubjectToUpgrades() - { - ScoreInfo scoreInfo = null!; - TestBackgroundDataStoreProcessor processor = null!; - - AddStep("Add score which requires upgrade (and has beatmap)", () => - { - Realm.Write(r => - { - r.Add(scoreInfo = new ScoreInfo(ruleset: r.All().First(), beatmap: r.All().First()) - { - TotalScoreVersion = 30000005, - LegacyTotalScore = 123456, - }); - }); - }); - - AddStep("Run background processor", () => Add(processor = new TestBackgroundDataStoreProcessor())); - AddUntilStep("Wait for completion", () => processor.Completed); - - AddAssert("Score not marked as failed", () => Realm.Run(r => r.Find(scoreInfo.ID)!.BackgroundReprocessingFailed), () => Is.False); - AddAssert("Score version not upgraded", () => Realm.Run(r => r.Find(scoreInfo.ID)!.TotalScoreVersion), () => Is.EqualTo(30000005)); - } - public partial class TestBackgroundDataStoreProcessor : BackgroundDataStoreProcessor { protected override int TimeToSleepDuringGameplay => 10; From 6c169e3156af665059df1a526495eee5cec6aa6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 23 Jan 2024 12:59:35 +0100 Subject: [PATCH 280/651] Do not reprocess ranks for custom rulesets Chances are that because we've broken rank API, it would utterly fail for all custom rulesets anyhow. --- osu.Game/Database/BackgroundDataStoreProcessor.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Database/BackgroundDataStoreProcessor.cs b/osu.Game/Database/BackgroundDataStoreProcessor.cs index 27d19f86c8..be0c83bdb3 100644 --- a/osu.Game/Database/BackgroundDataStoreProcessor.cs +++ b/osu.Game/Database/BackgroundDataStoreProcessor.cs @@ -383,7 +383,10 @@ namespace osu.Game.Database HashSet scoreIds = realmAccess.Run(r => new HashSet( r.All() .Where(s => s.TotalScoreVersion < LegacyScoreEncoder.LATEST_VERSION) - .AsEnumerable() // need to materialise here as realm cannot support `.Select()`. + .AsEnumerable() + // must be done after materialisation, as realm doesn't support + // filtering on nested property predicates or projection via `.Select()` + .Where(s => s.Ruleset.IsLegacyRuleset()) .Select(s => s.ID))); Logger.Log($"Found {scoreIds.Count} scores which require rank upgrades."); From d0d09a86578854c30e802083dd4d977a967db1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 23 Jan 2024 16:55:00 +0100 Subject: [PATCH 281/651] Fix login overlay test not clearing second auth factor --- osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs index 0c5f5a321c..0c0edca995 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs @@ -89,6 +89,12 @@ namespace osu.Game.Tests.Visual.Menus AddStep("enter password", () => loginOverlay.ChildrenOfType().First().Text = "password"); AddStep("submit", () => loginOverlay.ChildrenOfType().First(b => b.Text.ToString() == "Sign in").TriggerClick()); + assertAPIState(APIState.RequiresSecondFactorAuth); + AddUntilStep("wait for second factor auth form", () => loginOverlay.ChildrenOfType().SingleOrDefault(), () => Is.Not.Null); + + AddStep("enter code", () => loginOverlay.ChildrenOfType().First().Text = "88800088"); + assertAPIState(APIState.Online); + AddStep("click on flag", () => { InputManager.MoveMouseTo(loginOverlay.ChildrenOfType().First()); From d7e957087ebb348df86692c7ab525f27df8bf4b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 23 Jan 2024 16:56:39 +0100 Subject: [PATCH 282/651] Fix account creation overlay test not clearing second auth factor --- .../Visual/Online/TestSceneAccountCreationOverlay.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs index 0f920643f0..79fb063ea9 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs @@ -10,6 +10,7 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Testing; +using osu.Game.Online.API; using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays; using osu.Game.Overlays.AccountCreation; @@ -59,7 +60,11 @@ namespace osu.Game.Tests.Visual.Online AddStep("click button", () => accountCreation.ChildrenOfType().Single().TriggerClick()); AddUntilStep("warning screen is present", () => accountCreation.ChildrenOfType().SingleOrDefault()?.IsPresent == true); - AddStep("log back in", () => API.Login("dummy", "password")); + AddStep("log back in", () => + { + API.Login("dummy", "password"); + ((DummyAPIAccess)API).AuthenticateSecondFactor("abcdefgh"); + }); AddUntilStep("overlay is hidden", () => accountCreation.State.Value == Visibility.Hidden); } } From 5d26afc53175678fc241379dcde7d286b72e91c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 23 Jan 2024 17:00:07 +0100 Subject: [PATCH 283/651] Fix `OsuGameTestScene` not clearing second auth factor --- osu.Game/Tests/Visual/OsuGameTestScene.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Tests/Visual/OsuGameTestScene.cs b/osu.Game/Tests/Visual/OsuGameTestScene.cs index 947305439e..6069fe4fb0 100644 --- a/osu.Game/Tests/Visual/OsuGameTestScene.cs +++ b/osu.Game/Tests/Visual/OsuGameTestScene.cs @@ -178,6 +178,7 @@ namespace osu.Game.Tests.Visual LocalConfig.SetValue(OsuSetting.ShowFirstRunSetup, false); API.Login("Rhythm Champion", "osu!"); + ((DummyAPIAccess)API).AuthenticateSecondFactor("abcdefgh"); Dependencies.Get().SetValue(Static.MutedAudioNotificationShownOnce, true); From 0d7834af5fc5f4f8dc7f67903cced787b39416df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 23 Jan 2024 18:04:41 +0100 Subject: [PATCH 284/651] Ensure all remaining test usages of `IAPIAccess.Login()` also authenticate with second factor --- .../Gameplay/TestScenePlayerLocalScoreImport.cs | 6 +++++- .../Visual/Menus/TestSceneToolbarUserButton.cs | 12 ++++++++---- .../Visual/Online/TestSceneCommentActions.cs | 1 + .../Visual/Online/TestSceneFavouriteButton.cs | 13 +++++++++++-- .../Visual/Online/TestSceneSoloStatisticsWatcher.cs | 6 +++++- .../Visual/Online/TestSceneUserProfileOverlay.cs | 12 ++++++++++-- osu.Game.Tests/Visual/Online/TestSceneVotePill.cs | 7 ++++++- .../Visual/UserInterface/TestSceneCommentEditor.cs | 6 +++++- 8 files changed, 51 insertions(+), 12 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs index fafd1330cc..22422a685e 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs @@ -184,7 +184,11 @@ namespace osu.Game.Tests.Visual.Gameplay CreateTest(); AddUntilStep("wait for track to start running", () => Beatmap.Value.Track.IsRunning); - AddStep("log back in", () => API.Login("username", "password")); + AddStep("log back in", () => + { + API.Login("username", "password"); + ((DummyAPIAccess)API).AuthenticateSecondFactor("abcdefgh"); + }); AddStep("seek to completion", () => Player.GameplayClockContainer.Seek(Player.DrawableRuleset.Objects.Last().GetEndTime())); diff --git a/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs b/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs index 2bdfc8959d..f0506ed35c 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs @@ -16,6 +16,8 @@ namespace osu.Game.Tests.Visual.Menus [TestFixture] public partial class TestSceneToolbarUserButton : OsuManualInputManagerTestScene { + private DummyAPIAccess dummyAPI => (DummyAPIAccess)API; + public TestSceneToolbarUserButton() { Container mainContainer; @@ -69,18 +71,20 @@ namespace osu.Game.Tests.Visual.Menus [Test] public void TestLoginLogout() { - AddStep("Log out", () => ((DummyAPIAccess)API).Logout()); - AddStep("Log in", () => ((DummyAPIAccess)API).Login("wang", "jang")); + AddStep("Log out", () => dummyAPI.Logout()); + AddStep("Log in", () => dummyAPI.Login("wang", "jang")); + AddStep("Authenticate via second factor", () => dummyAPI.AuthenticateSecondFactor("abcdefgh")); } [Test] public void TestStates() { - AddStep("Log in", () => ((DummyAPIAccess)API).Login("wang", "jang")); + AddStep("Log in", () => dummyAPI.Login("wang", "jang")); + AddStep("Authenticate via second factor", () => dummyAPI.AuthenticateSecondFactor("abcdefgh")); foreach (var state in Enum.GetValues()) { - AddStep($"Change state to {state}", () => ((DummyAPIAccess)API).SetState(state)); + AddStep($"Change state to {state}", () => dummyAPI.SetState(state)); } } } diff --git a/osu.Game.Tests/Visual/Online/TestSceneCommentActions.cs b/osu.Game.Tests/Visual/Online/TestSceneCommentActions.cs index 10fdffb8e1..f47322b9e0 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneCommentActions.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneCommentActions.cs @@ -67,6 +67,7 @@ namespace osu.Game.Tests.Visual.Online Schedule(() => { API.Login("test", "test"); + dummyAPI.AuthenticateSecondFactor("abcdefgh"); Child = commentsContainer = new CommentsContainer(); }); } diff --git a/osu.Game.Tests/Visual/Online/TestSceneFavouriteButton.cs b/osu.Game.Tests/Visual/Online/TestSceneFavouriteButton.cs index 3954fd5cff..0acf8336e3 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneFavouriteButton.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneFavouriteButton.cs @@ -6,6 +6,7 @@ using NUnit.Framework; using osu.Framework.Graphics; using osu.Framework.Testing; +using osu.Game.Online.API; using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays.BeatmapSet.Buttons; using osuTK; @@ -34,14 +35,22 @@ namespace osu.Game.Tests.Visual.Online AddStep("set valid beatmap", () => favourite.BeatmapSet.Value = new APIBeatmapSet { OnlineID = 88 }); AddStep("log out", () => API.Logout()); checkEnabled(false); - AddStep("log in", () => API.Login("test", "test")); + AddStep("log in", () => + { + API.Login("test", "test"); + ((DummyAPIAccess)API).AuthenticateSecondFactor("abcdefgh"); + }); checkEnabled(true); } [Test] public void TestBeatmapChange() { - AddStep("log in", () => API.Login("test", "test")); + AddStep("log in", () => + { + API.Login("test", "test"); + ((DummyAPIAccess)API).AuthenticateSecondFactor("abcdefgh"); + }); AddStep("set valid beatmap", () => favourite.BeatmapSet.Value = new APIBeatmapSet { OnlineID = 88 }); checkEnabled(true); AddStep("set invalid beatmap", () => favourite.BeatmapSet.Value = new APIBeatmapSet()); diff --git a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs index be819afa3e..bb78cf9fd4 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs @@ -177,7 +177,11 @@ namespace osu.Game.Tests.Visual.Online AddWaitStep("wait a bit", 5); AddAssert("update not received", () => update == null); - AddStep("log in user", () => dummyAPI.Login("user", "password")); + AddStep("log in user", () => + { + dummyAPI.Login("user", "password"); + dummyAPI.AuthenticateSecondFactor("abcdefgh"); + }); } [Test] diff --git a/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs index 1375689075..bc8f75d4ce 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs @@ -52,7 +52,11 @@ namespace osu.Game.Tests.Visual.Online AddStep("show user", () => profile.ShowUser(new APIUser { Id = 1 })); AddToggleStep("toggle visibility", visible => profile.State.Value = visible ? Visibility.Visible : Visibility.Hidden); AddStep("log out", () => dummyAPI.Logout()); - AddStep("log back in", () => dummyAPI.Login("username", "password")); + AddStep("log back in", () => + { + dummyAPI.Login("username", "password"); + dummyAPI.AuthenticateSecondFactor("abcdefgh"); + }); } [Test] @@ -98,7 +102,11 @@ namespace osu.Game.Tests.Visual.Online }); AddStep("logout", () => dummyAPI.Logout()); AddStep("show user", () => profile.ShowUser(new APIUser { Id = 1 })); - AddStep("login", () => dummyAPI.Login("username", "password")); + AddStep("login", () => + { + dummyAPI.Login("username", "password"); + dummyAPI.AuthenticateSecondFactor("abcdefgh"); + }); AddWaitStep("wait some", 3); AddStep("complete request", () => pendingRequest.TriggerSuccess(TEST_USER)); } diff --git a/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs b/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs index ce1a9ac6a7..488902c417 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs @@ -11,6 +11,7 @@ using osu.Framework.Allocation; using osu.Game.Overlays; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Containers; +using osu.Game.Online.API; namespace osu.Game.Tests.Visual.Online { @@ -72,7 +73,11 @@ namespace osu.Game.Tests.Visual.Online AddAssert("Login overlay is visible", () => login.State.Value == Visibility.Visible); } - private void logIn() => API.Login("localUser", "password"); + private void logIn() + { + API.Login("localUser", "password"); + ((DummyAPIAccess)API).AuthenticateSecondFactor("abcdefgh"); + } private Comment getUserComment() => new Comment { diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneCommentEditor.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneCommentEditor.cs index b17024ae8f..e1d40882be 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneCommentEditor.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneCommentEditor.cs @@ -125,7 +125,11 @@ namespace osu.Game.Tests.Visual.UserInterface assertLoggedOutState(); // moving from logged out -> logged in - AddStep("log back in", () => dummyAPI.Login("username", "password")); + AddStep("log back in", () => + { + dummyAPI.Login("username", "password"); + dummyAPI.AuthenticateSecondFactor("abcdefgh"); + }); assertLoggedInState(); } From 7c140408ea20fdc8122fabe92fdff93501d16d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 13:53:40 +0100 Subject: [PATCH 285/651] Add request structures for verification endpoints --- .../ReissueVerificationCodeRequest.cs | 22 ++++++++++++++ .../API/Requests/VerifySessionRequest.cs | 30 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 osu.Game/Online/API/Requests/ReissueVerificationCodeRequest.cs create mode 100644 osu.Game/Online/API/Requests/VerifySessionRequest.cs diff --git a/osu.Game/Online/API/Requests/ReissueVerificationCodeRequest.cs b/osu.Game/Online/API/Requests/ReissueVerificationCodeRequest.cs new file mode 100644 index 0000000000..f2a3cf0a16 --- /dev/null +++ b/osu.Game/Online/API/Requests/ReissueVerificationCodeRequest.cs @@ -0,0 +1,22 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Net.Http; +using osu.Framework.IO.Network; + +namespace osu.Game.Online.API.Requests +{ + public class ReissueVerificationCodeRequest : APIRequest + { + protected override WebRequest CreateWebRequest() + { + var req = base.CreateWebRequest(); + + req.Method = HttpMethod.Post; + + return req; + } + + protected override string Target => @"session/verify/reissue"; + } +} diff --git a/osu.Game/Online/API/Requests/VerifySessionRequest.cs b/osu.Game/Online/API/Requests/VerifySessionRequest.cs new file mode 100644 index 0000000000..b39ec5b79a --- /dev/null +++ b/osu.Game/Online/API/Requests/VerifySessionRequest.cs @@ -0,0 +1,30 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Net.Http; +using osu.Framework.IO.Network; + +namespace osu.Game.Online.API.Requests +{ + public class VerifySessionRequest : APIRequest + { + public readonly string VerificationKey; + + public VerifySessionRequest(string verificationKey) + { + VerificationKey = verificationKey; + } + + protected override WebRequest CreateWebRequest() + { + var req = base.CreateWebRequest(); + + req.Method = HttpMethod.Post; + req.AddParameter(@"verification_key", VerificationKey); + + return req; + } + + protected override string Target => @"session/verify"; + } +} From 7b4721565702a71aa35e4ede372b3468bd72fb52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 14:22:57 +0100 Subject: [PATCH 286/651] Split `/me` request from `/users` requests Them being together always bothered me and led to the abject failure that is `APIUser` and its sprawl. Now that I'm about to add a flag that is unique to `/me` for verification purposes, I'm not repeating the errors of the past by adding yet another flag to `APIUser` that is never present outside of a single usage context. --- osu.Game/Online/API/APIAccess.cs | 2 +- osu.Game/Online/API/Requests/GetMeRequest.cs | 24 +++++++++++++++++++ .../Online/API/Requests/GetUserRequest.cs | 19 ++++----------- .../Online/API/Requests/Responses/APIMe.cs | 9 +++++++ 4 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 osu.Game/Online/API/Requests/GetMeRequest.cs create mode 100644 osu.Game/Online/API/Requests/Responses/APIMe.cs diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 51472dab30..42cf39414e 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -266,7 +266,7 @@ namespace osu.Game.Online.API } } - var userReq = new GetUserRequest(); + var userReq = new GetMeRequest(); userReq.Failure += ex => { if (ex is APIException) diff --git a/osu.Game/Online/API/Requests/GetMeRequest.cs b/osu.Game/Online/API/Requests/GetMeRequest.cs new file mode 100644 index 0000000000..aab7d7b2f1 --- /dev/null +++ b/osu.Game/Online/API/Requests/GetMeRequest.cs @@ -0,0 +1,24 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Online.API.Requests.Responses; +using osu.Game.Rulesets; + +namespace osu.Game.Online.API.Requests +{ + public class GetMeRequest : APIRequest + { + public readonly IRulesetInfo? Ruleset; + + /// + /// Gets the currently logged-in user. + /// + /// The ruleset to get the user's info for. + public GetMeRequest(IRulesetInfo? ruleset = null) + { + Ruleset = ruleset; + } + + protected override string Target => $@"me/{Ruleset?.ShortName}"; + } +} diff --git a/osu.Game/Online/API/Requests/GetUserRequest.cs b/osu.Game/Online/API/Requests/GetUserRequest.cs index 7dcf75950e..90d3268e75 100644 --- a/osu.Game/Online/API/Requests/GetUserRequest.cs +++ b/osu.Game/Online/API/Requests/GetUserRequest.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using osu.Game.Online.API.Requests.Responses; using osu.Game.Rulesets; @@ -11,24 +9,17 @@ namespace osu.Game.Online.API.Requests public class GetUserRequest : APIRequest { public readonly string Lookup; - public readonly IRulesetInfo Ruleset; + public readonly IRulesetInfo? Ruleset; private readonly LookupType lookupType; - /// - /// Gets the currently logged-in user. - /// - public GetUserRequest() - { - } - /// /// Gets a user from their ID. /// /// The user to get. /// The ruleset to get the user's info for. - public GetUserRequest(long? userId = null, IRulesetInfo ruleset = null) + public GetUserRequest(long? userId = null, IRulesetInfo? ruleset = null) { - Lookup = userId.ToString(); + Lookup = userId.ToString()!; lookupType = LookupType.Id; Ruleset = ruleset; } @@ -38,14 +29,14 @@ namespace osu.Game.Online.API.Requests /// /// The user to get. /// The ruleset to get the user's info for. - public GetUserRequest(string username = null, IRulesetInfo ruleset = null) + public GetUserRequest(string username, IRulesetInfo? ruleset = null) { Lookup = username; lookupType = LookupType.Username; Ruleset = ruleset; } - protected override string Target => Lookup != null ? $@"users/{Lookup}/{Ruleset?.ShortName}?key={lookupType.ToString().ToLowerInvariant()}" : $@"me/{Ruleset?.ShortName}"; + protected override string Target => $@"users/{Lookup}/{Ruleset?.ShortName}?key={lookupType.ToString().ToLowerInvariant()}"; private enum LookupType { diff --git a/osu.Game/Online/API/Requests/Responses/APIMe.cs b/osu.Game/Online/API/Requests/Responses/APIMe.cs new file mode 100644 index 0000000000..e4c4e8ce4f --- /dev/null +++ b/osu.Game/Online/API/Requests/Responses/APIMe.cs @@ -0,0 +1,9 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +namespace osu.Game.Online.API.Requests.Responses +{ + public class APIMe : APIUser + { + } +} From ddc2bbeb9bd6ca5fef3050ff690b53e2ac01cd9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 14:24:33 +0100 Subject: [PATCH 287/651] Add `session_verified` attribute to `/me` response --- osu.Game/Online/API/Requests/Responses/APIMe.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/osu.Game/Online/API/Requests/Responses/APIMe.cs b/osu.Game/Online/API/Requests/Responses/APIMe.cs index e4c4e8ce4f..3cbddbe5e7 100644 --- a/osu.Game/Online/API/Requests/Responses/APIMe.cs +++ b/osu.Game/Online/API/Requests/Responses/APIMe.cs @@ -1,9 +1,13 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using Newtonsoft.Json; + namespace osu.Game.Online.API.Requests.Responses { public class APIMe : APIUser { + [JsonProperty("session_verified")] + public bool SessionVerified { get; set; } } } From d2775680e66129c34297246ce047914d2b94fd90 Mon Sep 17 00:00:00 2001 From: Chandler Stowell Date: Wed, 24 Jan 2024 13:13:45 -0500 Subject: [PATCH 288/651] use stack to pass action state when applying hit results this removes closure allocations --- .../Drawables/DrawableEmptyFreeformHitObject.cs | 2 +- .../Drawables/DrawablePippidonHitObject.cs | 7 ++++++- .../Drawables/DrawableEmptyScrollingHitObject.cs | 2 +- .../Drawables/DrawablePippidonHitObject.cs | 7 ++++++- .../Objects/Drawables/DrawableCatchHitObject.cs | 7 ++++++- .../Objects/Drawables/DrawableHoldNote.cs | 2 +- .../Objects/Drawables/DrawableHoldNoteBody.cs | 2 +- .../Objects/Drawables/DrawableManiaHitObject.cs | 2 +- .../Objects/Drawables/DrawableNote.cs | 4 ++-- .../Objects/Drawables/DrawableHitCircle.cs | 15 ++++++++------- .../Objects/Drawables/DrawableOsuHitObject.cs | 4 ++-- .../Objects/Drawables/DrawableSlider.cs | 13 ++++++++----- .../Objects/Drawables/DrawableSpinner.cs | 12 ++++++------ .../Objects/Drawables/DrawableSpinnerTick.cs | 2 +- .../Objects/Drawables/DrawableDrumRoll.cs | 7 +++++-- .../Objects/Drawables/DrawableDrumRollTick.cs | 11 +++++++---- .../Objects/Drawables/DrawableFlyingHit.cs | 2 +- .../Objects/Drawables/DrawableHit.cs | 12 ++++++------ .../Objects/Drawables/DrawableStrongNestedHit.cs | 2 +- .../Objects/Drawables/DrawableSwell.cs | 8 ++++++-- .../Objects/Drawables/DrawableSwellTick.cs | 5 ++++- .../Objects/Drawables/DrawableHitObject.cs | 13 +++++++++++-- 22 files changed, 91 insertions(+), 50 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs index 744e207b57..e8f511bc4b 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs @@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.EmptyFreeform.Objects.Drawables { if (timeOffset >= 0) // todo: implement judgement logic - ApplyResult(r => r.Type = HitResult.Perfect); + ApplyResult(static r => r.Type = HitResult.Perfect); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs index c5ada4288d..a8bb57ba18 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -49,7 +49,12 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables protected override void CheckForResult(bool userTriggered, double timeOffset) { if (timeOffset >= 0) - ApplyResult(r => r.Type = IsHovered ? HitResult.Perfect : HitResult.Miss); + { + ApplyResult(static (r, isHovered) => + { + r.Type = isHovered ? HitResult.Perfect : HitResult.Miss; + }, IsHovered); + } } protected override double InitialLifetimeOffset => time_preempt; diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs index a3c3b89105..070a802aea 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs @@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.EmptyScrolling.Objects.Drawables { if (timeOffset >= 0) // todo: implement judgement logic - ApplyResult(r => r.Type = HitResult.Perfect); + ApplyResult(static r => r.Type = HitResult.Perfect); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs index d198fa81cb..9983ec20b0 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -49,7 +49,12 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables protected override void CheckForResult(bool userTriggered, double timeOffset) { if (timeOffset >= 0) - ApplyResult(r => r.Type = currentLane.Value == HitObject.Lane ? HitResult.Perfect : HitResult.Miss); + { + ApplyResult(static (r, pippidonHitObject) => + { + r.Type = pippidonHitObject.currentLane.Value == pippidonHitObject.HitObject.Lane ? HitResult.Perfect : HitResult.Miss; + }, this); + } } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs index 7f8c17861d..5a921f36f5 100644 --- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs +++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs @@ -63,7 +63,12 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables if (CheckPosition == null) return; if (timeOffset >= 0 && Result != null) - ApplyResult(r => r.Type = CheckPosition.Invoke(HitObject) ? r.Judgement.MaxResult : r.Judgement.MinResult); + { + ApplyResult(static (r, state) => + { + r.Type = state.CheckPosition.Invoke(state.HitObject) ? r.Judgement.MaxResult : r.Judgement.MinResult; + }, this); + } } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs index 3490d50871..e5056d5167 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs @@ -265,7 +265,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables if (Tail.AllJudged) { if (Tail.IsHit) - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static r => r.Type = r.Judgement.MaxResult); else MissForcefully(); } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs index 1b2efbafdf..317da0580c 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs @@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables { if (AllJudged) return; - ApplyResult(r => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult); + ApplyResult(static (r, hit) => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult, hit); } } } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs index 8498fd36de..dea0817869 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs @@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables /// /// Causes this to get missed, disregarding all conditions in implementations of . /// - public virtual void MissForcefully() => ApplyResult(r => r.Type = r.Judgement.MinResult); + public virtual void MissForcefully() => ApplyResult(static r => r.Type = r.Judgement.MinResult); } public abstract partial class DrawableManiaHitObject : DrawableManiaHitObject diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs index 680009bc4c..985007f905 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs @@ -89,7 +89,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); return; } @@ -100,7 +100,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables result = GetCappedResult(result); - ApplyResult(r => r.Type = result); + ApplyResult(static (r, result) => r.Type = result, result); } /// diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index 0d665cad0c..8284229d82 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -155,7 +155,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); return; } @@ -169,19 +169,20 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (result == HitResult.None || clickAction != ClickAction.Hit) return; - ApplyResult(r => + ApplyResult(static (r, state) => { + var (hitCircle, hitResult) = state; var circleResult = (OsuHitCircleJudgementResult)r; // Todo: This should also consider misses, but they're a little more interesting to handle, since we don't necessarily know the position at the time of a miss. - if (result.IsHit()) + if (hitResult.IsHit()) { - var localMousePosition = ToLocalSpace(inputManager.CurrentState.Mouse.Position); - circleResult.CursorPositionAtHit = HitObject.StackedPosition + (localMousePosition - DrawSize / 2); + var localMousePosition = hitCircle.ToLocalSpace(hitCircle.inputManager.CurrentState.Mouse.Position); + circleResult.CursorPositionAtHit = hitCircle.HitObject.StackedPosition + (localMousePosition - hitCircle.DrawSize / 2); } - circleResult.Type = result; - }); + circleResult.Type = hitResult; + }, (this, result)); } /// diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs index 5b379a0d90..cc06d009c9 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs @@ -100,12 +100,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// /// Causes this to get hit, disregarding all conditions in implementations of . /// - public void HitForcefully() => ApplyResult(r => r.Type = r.Judgement.MaxResult); + public void HitForcefully() => ApplyResult(static r => r.Type = r.Judgement.MaxResult); /// /// Causes this to get missed, disregarding all conditions in implementations of . /// - public void MissForcefully() => ApplyResult(r => r.Type = r.Judgement.MinResult); + public void MissForcefully() => ApplyResult(static r => r.Type = r.Judgement.MinResult); private RectangleF parentScreenSpaceRectangle => ((DrawableOsuHitObject)ParentHitObject)?.parentScreenSpaceRectangle ?? Parent!.ScreenSpaceDrawQuad.AABBFloat; diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index baec200107..3c298cc6af 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -292,10 +292,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (HitObject.ClassicSliderBehaviour) { // Classic behaviour means a slider is judged proportionally to the number of nested hitobjects hit. This is the classic osu!stable scoring. - ApplyResult(r => + ApplyResult(static (r, nestedHitObjects) => { - int totalTicks = NestedHitObjects.Count; - int hitTicks = NestedHitObjects.Count(h => h.IsHit); + int totalTicks = nestedHitObjects.Count; + int hitTicks = nestedHitObjects.Count(h => h.IsHit); if (hitTicks == totalTicks) r.Type = HitResult.Great; @@ -306,13 +306,16 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables double hitFraction = (double)hitTicks / totalTicks; r.Type = hitFraction >= 0.5 ? HitResult.Ok : HitResult.Meh; } - }); + }, NestedHitObjects); } else { // If only the nested hitobjects are judged, then the slider's own judgement is ignored for scoring purposes. // But the slider needs to still be judged with a reasonable hit/miss result for visual purposes (hit/miss transforms, etc). - ApplyResult(r => r.Type = NestedHitObjects.Any(h => h.Result.IsHit) ? r.Judgement.MaxResult : r.Judgement.MinResult); + ApplyResult(static (r, nestedHitObjects) => + { + r.Type = nestedHitObjects.Any(h => h.Result.IsHit) ? r.Judgement.MaxResult : r.Judgement.MinResult; + }, NestedHitObjects); } } diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index bf4b07eaab..d21d02c8ce 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -258,17 +258,17 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables foreach (var tick in ticks.Where(t => !t.Result.HasResult)) tick.TriggerResult(false); - ApplyResult(r => + ApplyResult(static (r, spinner) => { - if (Progress >= 1) + if (spinner.Progress >= 1) r.Type = HitResult.Great; - else if (Progress > .9) + else if (spinner.Progress > .9) r.Type = HitResult.Ok; - else if (Progress > .75) + else if (spinner.Progress > .75) r.Type = HitResult.Meh; - else if (Time.Current >= HitObject.EndTime) + else if (spinner.Time.Current >= spinner.HitObject.EndTime) r.Type = r.Judgement.MinResult; - }); + }, this); } protected override void Update() diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs index 5b55533edd..1c3ff29118 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs @@ -35,6 +35,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// Apply a judgement result. /// /// Whether this tick was reached. - internal void TriggerResult(bool hit) => ApplyResult(r => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult); + internal void TriggerResult(bool hit) => ApplyResult(static (r, hit) => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult, hit); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs index 2bf0c04adf..d3fe363857 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs @@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (timeOffset < 0) return; - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static r => r.Type = r.Judgement.MaxResult); } protected override void UpdateHitStateTransforms(ArmedState state) @@ -192,7 +192,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!ParentHitObject.Judged) return; - ApplyResult(r => r.Type = ParentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult); + ApplyResult(static (r, parentHitObject) => + { + r.Type = parentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }, ParentHitObject); } public override bool OnPressed(KeyBindingPressEvent e) => false; diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs index c900165d34..de9a3a31c5 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs @@ -49,14 +49,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!userTriggered) { if (timeOffset > HitObject.HitWindow) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); return; } if (Math.Abs(timeOffset) > HitObject.HitWindow) return; - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static r => r.Type = r.Judgement.MaxResult); } public override void OnKilled() @@ -64,7 +64,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables base.OnKilled(); if (Time.Current > HitObject.GetEndTime() && !Judged) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); } protected override void UpdateHitStateTransforms(ArmedState state) @@ -105,7 +105,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!ParentHitObject.Judged) return; - ApplyResult(r => r.Type = ParentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult); + ApplyResult(static (r, parentHitObject) => + { + r.Type = parentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }, ParentHitObject); } public override bool OnPressed(KeyBindingPressEvent e) => false; diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs index a039ce3407..1332b9e950 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs @@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables protected override void LoadComplete() { base.LoadComplete(); - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static r => r.Type = r.Judgement.MaxResult); } protected override void LoadSamples() diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index 1ef426854e..c3bd76bf81 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -99,7 +99,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); return; } @@ -108,9 +108,9 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables return; if (!validActionPressed) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); else - ApplyResult(r => r.Type = result); + ApplyResult(static (r, result) => r.Type = result, result); } public override bool OnPressed(KeyBindingPressEvent e) @@ -209,19 +209,19 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!ParentHitObject.Result.IsHit) { - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); return; } if (!userTriggered) { if (timeOffset - ParentHitObject.Result.TimeOffset > SECOND_HIT_WINDOW) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); return; } if (Math.Abs(timeOffset - ParentHitObject.Result.TimeOffset) <= SECOND_HIT_WINDOW) - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static r => r.Type = r.Judgement.MaxResult); } public override bool OnPressed(KeyBindingPressEvent e) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs index 724d59edcd..4080c14066 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs @@ -27,7 +27,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables // it can happen that the hit window of the nested strong hit extends past the lifetime of the parent object. // this is a safety to prevent such cases from causing the nested hit to never be judged and as such prevent gameplay from completing. if (!Judged && Time.Current > ParentHitObject?.HitObject.GetEndTime()) - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static r => r.Type = r.Judgement.MinResult); } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs index e4a083f218..d48b78283b 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs @@ -206,7 +206,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables expandingRing.ScaleTo(1f + Math.Min(target_ring_scale - 1f, (target_ring_scale - 1f) * completion * 1.3f), 260, Easing.OutQuint); if (numHits == HitObject.RequiredHits) - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static r => r.Type = r.Judgement.MaxResult); } else { @@ -227,7 +227,11 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables tick.TriggerResult(false); } - ApplyResult(r => r.Type = numHits == HitObject.RequiredHits ? r.Judgement.MaxResult : r.Judgement.MinResult); + ApplyResult(static (r, state) => + { + var (numHits, hitObject) = state; + r.Type = numHits == hitObject.RequiredHits ? r.Judgement.MaxResult : r.Judgement.MinResult; + }, (numHits, HitObject)); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs index 3a5c006962..ad1d09bc7b 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs @@ -30,7 +30,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables public void TriggerResult(bool hit) { HitObject.StartTime = Time.Current; - ApplyResult(r => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult); + ApplyResult(static (r, hit) => + { + r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }, hit); } protected override void CheckForResult(bool userTriggered, double timeOffset) diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index bce28361cb..9acd7b3c0f 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -687,12 +687,14 @@ namespace osu.Game.Rulesets.Objects.Drawables /// the of the . /// /// The callback that applies changes to the . - protected void ApplyResult(Action application) + /// The state passed to the callback. + /// The type of the state information that is passed to the callback method. + protected void ApplyResult(Action application, TState state) { if (Result.HasResult) throw new InvalidOperationException("Cannot apply result on a hitobject that already has a result."); - application?.Invoke(Result); + application?.Invoke(Result, state); if (!Result.HasResult) throw new InvalidOperationException($"{GetType().ReadableName()} applied a {nameof(JudgementResult)} but did not update {nameof(JudgementResult.Type)}."); @@ -714,6 +716,13 @@ namespace osu.Game.Rulesets.Objects.Drawables OnNewResult?.Invoke(this, Result); } + /// + /// Applies the of this , notifying responders such as + /// the of the . + /// + /// The callback that applies changes to the . + protected void ApplyResult(Action application) => ApplyResult((r, _) => application?.Invoke(r), null); + /// /// Processes this , checking if a scoring result has occurred. /// From 445a7450e015458aaf071643ba024ca55da57ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 15:57:40 +0100 Subject: [PATCH 289/651] Implement verification from within client --- osu.Game/Online/API/APIAccess.cs | 61 +++++++++++++++++--------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 42cf39414e..389816fcf8 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -230,8 +230,6 @@ namespace osu.Game.Online.API try { authentication.AuthenticateWithLogin(ProvidedUsername, password); - state.Value = APIState.RequiresSecondFactorAuth; - return; } catch (Exception e) { @@ -244,28 +242,6 @@ namespace osu.Game.Online.API } } - if (state.Value == APIState.RequiresSecondFactorAuth) - { - if (string.IsNullOrEmpty(SecondFactorCode)) - return; - - state.Value = APIState.Connecting; - LastLoginError = null; - - // TODO: use code to ensure second factor authentication completed. - Thread.Sleep(1000); - bool success = SecondFactorCode == "00000000"; - SecondFactorCode = null; - - if (!success) - { - state.Value = APIState.RequiresSecondFactorAuth; - LastLoginError = new InvalidOperationException("Second factor auth failed"); - SecondFactorCode = null; - return; - } - } - var userReq = new GetMeRequest(); userReq.Failure += ex => { @@ -285,14 +261,13 @@ namespace osu.Game.Online.API state.Value = APIState.Failing; } }; - userReq.Success += user => + userReq.Success += me => { - user.Status.Value = configStatus.Value ?? UserStatus.Online; + me.Status.Value = configStatus.Value ?? UserStatus.Online; - setLocalUser(user); + setLocalUser(me); - // we're connected! - state.Value = APIState.Online; + state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth; failureCount = 0; }; @@ -302,6 +277,34 @@ namespace osu.Game.Online.API return; } + if (state.Value == APIState.RequiresSecondFactorAuth) + { + if (string.IsNullOrEmpty(SecondFactorCode)) + return; + + state.Value = APIState.Connecting; + LastLoginError = null; + + var verificationRequest = new VerifySessionRequest(SecondFactorCode); + + verificationRequest.Success += () => state.Value = APIState.Online; + verificationRequest.Failure += ex => + { + state.Value = APIState.RequiresSecondFactorAuth; + LastLoginError = ex; + SecondFactorCode = null; + }; + + if (!handleRequest(verificationRequest)) + { + state.Value = APIState.Failing; + return; + } + + if (state.Value != APIState.Online) + return; + } + var friendsReq = new GetFriendsRequest(); friendsReq.Failure += _ => state.Value = APIState.Failing; friendsReq.Success += res => From 602c3bc2d90e57f84c6cf40e64eb6df1e168d945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 16:17:13 +0100 Subject: [PATCH 290/651] Hook up reissue request --- osu.Game/Overlays/Login/SecondFactorAuthForm.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Login/SecondFactorAuthForm.cs b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs index 60c04eedee..566587a541 100644 --- a/osu.Game/Overlays/Login/SecondFactorAuthForm.cs +++ b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs @@ -5,10 +5,12 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Events; +using osu.Framework.Logging; using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; +using osu.Game.Online.API.Requests; using osu.Game.Overlays.Settings; using osu.Game.Resources.Localisation.Web; using osuTK; @@ -83,7 +85,9 @@ namespace osu.Game.Overlays.Login explainText.AddText(". You can also "); explainText.AddLink(UserVerificationStrings.BoxInfoReissueLink, () => { - // TODO: request another code. + var reissueRequest = new ReissueVerificationCodeRequest(); + reissueRequest.Failure += ex => Logger.Error(ex, @"Failed to retrieve new verification code."); + api.Perform(reissueRequest); }); explainText.AddText(" or "); explainText.AddLink(UserVerificationStrings.BoxInfoLogoutLink, () => { api.Logout(); }); From 62a0c236bc2eb706bb1f2840e80f7ed7df9c3b78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 20:58:23 +0100 Subject: [PATCH 291/651] Split out raw websocket logic from conjoined notifications client contrivance --- .../WebSocket/OsuClientWebSocket.cs | 154 ++++++++++++++++++ .../WebSocket/WebSocketNotificationsClient.cs | 94 +---------- .../WebSocketNotificationsClientConnector.cs | 11 +- 3 files changed, 163 insertions(+), 96 deletions(-) create mode 100644 osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs diff --git a/osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs b/osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs new file mode 100644 index 0000000000..965f606bdc --- /dev/null +++ b/osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs @@ -0,0 +1,154 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Diagnostics; +using System.Net; +using System.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; +using osu.Framework.Extensions.TypeExtensions; +using osu.Framework.Logging; +using osu.Game.Online.API; + +namespace osu.Game.Online.Notifications.WebSocket +{ + public class OsuClientWebSocket : IAsyncDisposable + { + public event Func? MessageReceived; + public event Func? Closed; + + private readonly string endpoint; + private readonly ClientWebSocket socket; + + private CancellationTokenSource? linkedTokenSource = null; + + public OsuClientWebSocket(IAPIProvider api, string endpoint) + { + socket = new ClientWebSocket(); + socket.Options.SetRequestHeader(@"Authorization", @$"Bearer {api.AccessToken}"); + socket.Options.Proxy = WebRequest.DefaultWebProxy; + if (socket.Options.Proxy != null) + socket.Options.Proxy.Credentials = CredentialCache.DefaultCredentials; + + this.endpoint = endpoint; + } + + public async Task ConnectAsync(CancellationToken cancellationToken) + { + if (socket.State == WebSocketState.Connecting || socket.State == WebSocketState.Open) + throw new InvalidOperationException("Connection is already opened"); + + Debug.Assert(linkedTokenSource == null); + linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + + await socket.ConnectAsync(new Uri(endpoint), linkedTokenSource.Token).ConfigureAwait(false); + runReadLoop(linkedTokenSource.Token); + } + + private void runReadLoop(CancellationToken cancellationToken) => Task.Factory.StartNew(async () => + { + byte[] buffer = new byte[1024]; + StringBuilder messageResult = new StringBuilder(); + + while (!cancellationToken.IsCancellationRequested) + { + try + { + WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false); + + switch (result.MessageType) + { + case WebSocketMessageType.Text: + messageResult.Append(Encoding.UTF8.GetString(buffer[..result.Count])); + + if (result.EndOfMessage) + { + SocketMessage? message = JsonConvert.DeserializeObject(messageResult.ToString()); + messageResult.Clear(); + + Debug.Assert(message != null); + + if (message.Error != null) + { + Logger.Log($"{GetType().ReadableName()} error: {message.Error}", LoggingTarget.Network); + break; + } + + await invokeMessageReceived(message).ConfigureAwait(false); + } + + break; + + case WebSocketMessageType.Binary: + throw new NotImplementedException("Binary message type not supported."); + + case WebSocketMessageType.Close: + throw new WebException("Connection closed by remote host."); + } + } + catch (Exception ex) + { + await invokeClosed(ex).ConfigureAwait(false); + return; + } + } + }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default); + + private async Task invokeMessageReceived(SocketMessage message) + { + if (MessageReceived == null) + return; + + var invocationList = MessageReceived.GetInvocationList(); + + // ReSharper disable once PossibleInvalidCastExceptionInForeachLoop + foreach (Func handler in invocationList) + await handler.Invoke(message).ConfigureAwait(false); + } + + private async Task invokeClosed(Exception ex) + { + if (Closed == null) + return; + + var invocationList = Closed.GetInvocationList(); + + // ReSharper disable once PossibleInvalidCastExceptionInForeachLoop + foreach (Func handler in invocationList) + await handler.Invoke(ex).ConfigureAwait(false); + } + + public Task SendMessage(SocketMessage message, CancellationToken cancellationToken) + { + if (socket.State != WebSocketState.Open) + return Task.CompletedTask; + + return socket.SendAsync(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), WebSocketMessageType.Text, true, cancellationToken); + } + + public async Task DisconnectAsync() + { + linkedTokenSource?.Cancel(); + await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, @"Disconnecting", CancellationToken.None).ConfigureAwait(false); + linkedTokenSource?.Dispose(); + linkedTokenSource = null; + } + + public async ValueTask DisposeAsync() + { + try + { + await DisconnectAsync().ConfigureAwait(false); + } + catch + { + // Closure can fail if the connection is aborted. Don't really care since it's disposed anyway. + } + + socket.Dispose(); + } + } +} diff --git a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs index 73e5dcec6f..b85a6ca3fe 100644 --- a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs +++ b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs @@ -1,17 +1,11 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using System.Collections.Concurrent; using System.Diagnostics; -using System.Net; -using System.Net.WebSockets; -using System.Text; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; -using osu.Framework.Extensions.TypeExtensions; -using osu.Framework.Logging; using osu.Game.Online.API; using osu.Game.Online.API.Requests; using osu.Game.Online.Chat; @@ -23,96 +17,25 @@ namespace osu.Game.Online.Notifications.WebSocket /// public class WebSocketNotificationsClient : NotificationsClient { - private readonly ClientWebSocket socket; - private readonly string endpoint; + private readonly OsuClientWebSocket socket; private readonly ConcurrentDictionary channelsMap = new ConcurrentDictionary(); - public WebSocketNotificationsClient(ClientWebSocket socket, string endpoint, IAPIProvider api) + public WebSocketNotificationsClient(IAPIProvider api, string endpoint) : base(api) { - this.socket = socket; - this.endpoint = endpoint; + socket = new OsuClientWebSocket(api, endpoint); + socket.MessageReceived += onMessageReceivedAsync; + socket.Closed += InvokeClosed; } public override async Task ConnectAsync(CancellationToken cancellationToken) { - await socket.ConnectAsync(new Uri(endpoint), cancellationToken).ConfigureAwait(false); - await sendMessage(new StartChatRequest(), CancellationToken.None).ConfigureAwait(false); - - runReadLoop(cancellationToken); + await socket.ConnectAsync(cancellationToken).ConfigureAwait(false); + await socket.SendMessage(new StartChatRequest(), CancellationToken.None).ConfigureAwait(false); await base.ConnectAsync(cancellationToken).ConfigureAwait(false); } - private void runReadLoop(CancellationToken cancellationToken) => Task.Run(async () => - { - byte[] buffer = new byte[1024]; - StringBuilder messageResult = new StringBuilder(); - - while (!cancellationToken.IsCancellationRequested) - { - try - { - WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false); - - switch (result.MessageType) - { - case WebSocketMessageType.Text: - messageResult.Append(Encoding.UTF8.GetString(buffer[..result.Count])); - - if (result.EndOfMessage) - { - SocketMessage? message = JsonConvert.DeserializeObject(messageResult.ToString()); - messageResult.Clear(); - - Debug.Assert(message != null); - - if (message.Error != null) - { - Logger.Log($"{GetType().ReadableName()} error: {message.Error}", LoggingTarget.Network); - break; - } - - await onMessageReceivedAsync(message).ConfigureAwait(false); - } - - break; - - case WebSocketMessageType.Binary: - throw new NotImplementedException("Binary message type not supported."); - - case WebSocketMessageType.Close: - throw new WebException("Connection closed by remote host."); - } - } - catch (Exception ex) - { - await InvokeClosed(ex).ConfigureAwait(false); - return; - } - } - }, cancellationToken); - - private async Task closeAsync() - { - try - { - await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, @"Disconnecting", CancellationToken.None).ConfigureAwait(false); - } - catch - { - // Closure can fail if the connection is aborted. Don't really care since it's disposed anyway. - } - } - - private async Task sendMessage(SocketMessage message, CancellationToken cancellationToken) - { - if (socket.State != WebSocketState.Open) - return; - - await socket.SendAsync(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false); - } - private async Task onMessageReceivedAsync(SocketMessage message) { switch (message.Event) @@ -173,8 +96,7 @@ namespace osu.Game.Online.Notifications.WebSocket public override async ValueTask DisposeAsync() { await base.DisposeAsync().ConfigureAwait(false); - await closeAsync().ConfigureAwait(false); - socket.Dispose(); + await socket.DisposeAsync().ConfigureAwait(false); } } } diff --git a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs index f50369a06c..6c61281e90 100644 --- a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs +++ b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System.Net; -using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; using osu.Game.Online.API; @@ -33,14 +31,7 @@ namespace osu.Game.Online.Notifications.WebSocket api.Queue(req); string endpoint = await tcs.Task.ConfigureAwait(false); - - ClientWebSocket socket = new ClientWebSocket(); - socket.Options.SetRequestHeader(@"Authorization", @$"Bearer {api.AccessToken}"); - socket.Options.Proxy = WebRequest.DefaultWebProxy; - if (socket.Options.Proxy != null) - socket.Options.Proxy.Credentials = CredentialCache.DefaultCredentials; - - return new WebSocketNotificationsClient(socket, endpoint, api); + return new WebSocketNotificationsClient(api, endpoint); } } } From e3eb7a8b4281c7d3b2170b10b2681cde8ee7f066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 21:33:34 +0100 Subject: [PATCH 292/651] Support verification via clicking link from e-mail --- osu.Game/Online/API/APIAccess.cs | 50 ++++++++++++++++++- .../DevelopmentEndpointConfiguration.cs | 1 + osu.Game/Online/EndpointConfiguration.cs | 5 ++ .../ExperimentalEndpointConfiguration.cs | 1 + .../Online/ProductionEndpointConfiguration.cs | 1 + 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 389816fcf8..dabb2cc94c 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -11,8 +11,10 @@ using System.Net.Http; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Newtonsoft.Json.Linq; using osu.Framework.Bindables; +using osu.Framework.Extensions; using osu.Framework.Extensions.ExceptionExtensions; using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; @@ -76,6 +78,11 @@ namespace osu.Game.Online.API private readonly Logger log; + private string webSocketEndpointUrl; + + [CanBeNull] + private OsuClientWebSocket webSocket; + public APIAccess(OsuGameBase game, OsuConfigManager config, EndpointConfiguration endpointConfiguration, string versionHash) { this.game = game; @@ -84,6 +91,7 @@ namespace osu.Game.Online.API APIEndpointUrl = endpointConfiguration.APIEndpointUrl; WebsiteRootUrl = endpointConfiguration.WebsiteRootUrl; + webSocketEndpointUrl = endpointConfiguration.NotificationsWebSocketEndpointUrl; authentication = new OAuth(endpointConfiguration.APIClientID, endpointConfiguration.APIClientSecret, APIEndpointUrl); log = Logger.GetLogger(LoggingTarget.Network); @@ -267,7 +275,10 @@ namespace osu.Game.Online.API setLocalUser(me); - state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth; + if (me.SessionVerified) + state.Value = APIState.Online; + else + setUpSecondFactorAuthentication(); failureCount = 0; }; @@ -350,6 +361,42 @@ namespace osu.Game.Online.API this.password = password; } + private void setUpSecondFactorAuthentication() + { + if (state.Value == APIState.RequiresSecondFactorAuth) + return; + + state.Value = APIState.RequiresSecondFactorAuth; + + try + { + webSocket?.DisposeAsync().AsTask().WaitSafely(); + var newSocket = new OsuClientWebSocket(this, webSocketEndpointUrl); + newSocket.MessageReceived += async msg => + { + if (msg.Event == @"verified") + { + state.Value = APIState.Online; + await newSocket.DisposeAsync().ConfigureAwait(false); + if (webSocket == newSocket) + webSocket = null; + } + }; + newSocket.Closed += ex => + { + Logger.Error(ex, "Connection with account verification endpoint closed unexpectedly. Please supply account verification code manually.", LoggingTarget.Network); + return Task.CompletedTask; + }; + webSocket = newSocket; + + webSocket.ConnectAsync(cancellationToken.Token).WaitSafely(); + } + catch (Exception ex) + { + Logger.Error(ex, "Failed to set up connection with account verification endpoint. Please supply account verification code manually.", LoggingTarget.Network); + } + } + public void AuthenticateSecondFactor(string code) { Debug.Assert(State.Value == APIState.RequiresSecondFactorAuth); @@ -579,6 +626,7 @@ namespace osu.Game.Online.API flushQueue(); cancellationToken.Cancel(); + webSocket?.DisposeAsync().AsTask().WaitSafely(); } } diff --git a/osu.Game/Online/DevelopmentEndpointConfiguration.cs b/osu.Game/Online/DevelopmentEndpointConfiguration.cs index 5f3c353f4d..1c78c3c147 100644 --- a/osu.Game/Online/DevelopmentEndpointConfiguration.cs +++ b/osu.Game/Online/DevelopmentEndpointConfiguration.cs @@ -13,6 +13,7 @@ namespace osu.Game.Online SpectatorEndpointUrl = $@"{APIEndpointUrl}/signalr/spectator"; MultiplayerEndpointUrl = $@"{APIEndpointUrl}/signalr/multiplayer"; MetadataEndpointUrl = $@"{APIEndpointUrl}/signalr/metadata"; + NotificationsWebSocketEndpointUrl = "wss://dev.ppy.sh/home/notifications/feed"; } } } diff --git a/osu.Game/Online/EndpointConfiguration.cs b/osu.Game/Online/EndpointConfiguration.cs index f3bcced630..6187471b65 100644 --- a/osu.Game/Online/EndpointConfiguration.cs +++ b/osu.Game/Online/EndpointConfiguration.cs @@ -44,5 +44,10 @@ namespace osu.Game.Online /// The endpoint for the SignalR metadata server. /// public string MetadataEndpointUrl { get; set; } + + /// + /// The endpoint for the notifications websocket. + /// + public string NotificationsWebSocketEndpointUrl { get; set; } } } diff --git a/osu.Game/Online/ExperimentalEndpointConfiguration.cs b/osu.Game/Online/ExperimentalEndpointConfiguration.cs index c3d0014c8b..bc65fd63f3 100644 --- a/osu.Game/Online/ExperimentalEndpointConfiguration.cs +++ b/osu.Game/Online/ExperimentalEndpointConfiguration.cs @@ -14,6 +14,7 @@ namespace osu.Game.Online SpectatorEndpointUrl = "https://spectator.ppy.sh/spectator"; MultiplayerEndpointUrl = "https://spectator.ppy.sh/multiplayer"; MetadataEndpointUrl = "https://spectator.ppy.sh/metadata"; + NotificationsWebSocketEndpointUrl = "wss://notify.ppy.sh"; } } } diff --git a/osu.Game/Online/ProductionEndpointConfiguration.cs b/osu.Game/Online/ProductionEndpointConfiguration.cs index 0244761b65..a26a25bce5 100644 --- a/osu.Game/Online/ProductionEndpointConfiguration.cs +++ b/osu.Game/Online/ProductionEndpointConfiguration.cs @@ -13,6 +13,7 @@ namespace osu.Game.Online SpectatorEndpointUrl = "https://spectator.ppy.sh/spectator"; MultiplayerEndpointUrl = "https://spectator.ppy.sh/multiplayer"; MetadataEndpointUrl = "https://spectator.ppy.sh/metadata"; + NotificationsWebSocketEndpointUrl = "wss://notify.ppy.sh"; } } } From 67010fcd03b1546ef0bbf24fdf864db69ad5bb58 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Wed, 24 Jan 2024 23:45:07 +0300 Subject: [PATCH 293/651] Reduce allocation overhead in ScoreCounter --- osu.Game/Graphics/UserInterface/ScoreCounter.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/ScoreCounter.cs b/osu.Game/Graphics/UserInterface/ScoreCounter.cs index 255b2149f0..62cdefda43 100644 --- a/osu.Game/Graphics/UserInterface/ScoreCounter.cs +++ b/osu.Game/Graphics/UserInterface/ScoreCounter.cs @@ -4,7 +4,6 @@ #nullable disable using osu.Framework.Bindables; -using osu.Framework.Extensions.LocalisationExtensions; using osu.Framework.Graphics; using osu.Framework.Localisation; using osu.Game.Graphics.Sprites; @@ -39,7 +38,7 @@ namespace osu.Game.Graphics.UserInterface protected override double GetProportionalDuration(long currentValue, long newValue) => currentValue > newValue ? currentValue - newValue : newValue - currentValue; - protected override LocalisableString FormatCount(long count) => count.ToLocalisableString(formatString); + protected override LocalisableString FormatCount(long count) => count.ToString(formatString); protected override OsuSpriteText CreateSpriteText() => base.CreateSpriteText().With(s => s.Font = s.Font.With(fixedWidth: true)); From 2f8747776efa654e6d939eac867139249a75b6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 24 Jan 2024 22:01:59 +0100 Subject: [PATCH 294/651] Fix nullability inspection --- osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs index bb78cf9fd4..3607b37c7e 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs @@ -90,7 +90,7 @@ namespace osu.Game.Tests.Visual.Online else { int userId = int.Parse(getUserRequest.Lookup); - string rulesetName = getUserRequest.Ruleset.ShortName; + string rulesetName = getUserRequest.Ruleset!.ShortName; var response = new APIUser { Id = userId, From 9e1c24271394770313e5b06e6b89ed1e73da5056 Mon Sep 17 00:00:00 2001 From: Mike Will Date: Wed, 24 Jan 2024 08:01:41 -0500 Subject: [PATCH 295/651] Prevent custom divisor ranges from halting preset cycling A custom divisor like 24 or 32 will result in a range containing many divisors that are already in the `Common` and `Triplets` presets. When this happens, it can become impossible to cycle between presets, because the preset can only be changed if the new divisor isn't already contained within the current preset's range. --- .../Visual/Editing/TestSceneBeatDivisorControl.cs | 7 +++++++ osu.Game/Screens/Edit/BindableBeatDivisor.cs | 5 +++-- .../Screens/Edit/Compose/Components/BeatDivisorControl.cs | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs b/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs index f2b3351533..6c36e6729e 100644 --- a/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs +++ b/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs @@ -210,6 +210,13 @@ namespace osu.Game.Tests.Visual.Editing switchPresets(-1); assertPreset(BeatDivisorType.Custom, 15); assertBeatSnap(15); + + setDivisorViaInput(24); + assertPreset(BeatDivisorType.Custom, 24); + switchPresets(1); + assertPreset(BeatDivisorType.Common); + switchPresets(-2); + assertPreset(BeatDivisorType.Triplets); } private void switchBeatSnap(int direction) => AddRepeatStep($"move snap {(direction > 0 ? "forward" : "backward")}", () => diff --git a/osu.Game/Screens/Edit/BindableBeatDivisor.cs b/osu.Game/Screens/Edit/BindableBeatDivisor.cs index ffa4f01e75..87cb191a82 100644 --- a/osu.Game/Screens/Edit/BindableBeatDivisor.cs +++ b/osu.Game/Screens/Edit/BindableBeatDivisor.cs @@ -29,10 +29,11 @@ namespace osu.Game.Screens.Edit /// Set a divisor, updating the valid divisor range appropriately. /// /// The intended divisor. - public void SetArbitraryDivisor(int divisor) + /// Ignores the current valid divisor range when true. + public void SetArbitraryDivisor(int divisor, bool force = false) { // If the current valid divisor range doesn't contain the proposed value, attempt to find one which does. - if (!ValidDivisors.Value.Presets.Contains(divisor)) + if (force || !ValidDivisors.Value.Presets.Contains(divisor)) { if (BeatDivisorPresetCollection.COMMON.Presets.Contains(divisor)) ValidDivisors.Value = BeatDivisorPresetCollection.COMMON; diff --git a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs index b33edb9edb..da1a37d57f 100644 --- a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs +++ b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs @@ -208,11 +208,11 @@ namespace osu.Game.Screens.Edit.Compose.Components switch (currentType) { case BeatDivisorType.Common: - beatDivisor.SetArbitraryDivisor(4); + beatDivisor.SetArbitraryDivisor(4, true); break; case BeatDivisorType.Triplets: - beatDivisor.SetArbitraryDivisor(6); + beatDivisor.SetArbitraryDivisor(6, true); break; case BeatDivisorType.Custom: From 781196858209dcc6804182b9d8dfac2896e6fd1d Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 25 Jan 2024 03:28:02 +0300 Subject: [PATCH 296/651] Fix ArgonScoreCounter is still using localisation --- osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs b/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs index 348327d710..44b9fb3123 100644 --- a/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs +++ b/osu.Game/Screens/Play/HUD/ArgonScoreCounter.cs @@ -33,7 +33,7 @@ namespace osu.Game.Screens.Play.HUD public bool UsesFixedAnchor { get; set; } - protected override LocalisableString FormatCount(long count) => count.ToLocalisableString(); + protected override LocalisableString FormatCount(long count) => count.ToString(); protected override IHasText CreateText() => scoreText = new ArgonScoreTextComponent(Anchor.TopRight, BeatmapsetsStrings.ShowScoreboardHeadersScore.ToUpper()) { From 21b11092d61cb6b633b2b7ab248881504aeb98b7 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 25 Jan 2024 04:06:15 +0300 Subject: [PATCH 297/651] Fix slider sliding samples allocation --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index baec200107..080d07be49 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -239,11 +239,11 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (Tracking.Value && Time.Current >= HitObject.StartTime) { // keep the sliding sample playing at the current tracking position - if (!slidingSample.IsPlaying) + if (!slidingSample.RequestedPlaying) slidingSample.Play(); slidingSample.Balance.Value = CalculateSamplePlaybackBalance(CalculateDrawableRelativePosition(Ball)); } - else if (slidingSample.IsPlaying) + else if (slidingSample.IsPlaying || slidingSample.RequestedPlaying) slidingSample.Stop(); } } From 30e335233da019c7e72203a2589fbe8fd9484476 Mon Sep 17 00:00:00 2001 From: Nitrous Date: Thu, 25 Jan 2024 09:27:10 +0800 Subject: [PATCH 298/651] Crop screenshot image to scaling container. --- osu.Game/Graphics/ScreenshotManager.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/osu.Game/Graphics/ScreenshotManager.cs b/osu.Game/Graphics/ScreenshotManager.cs index 26e499ae9a..47ce0d31eb 100644 --- a/osu.Game/Graphics/ScreenshotManager.cs +++ b/osu.Game/Graphics/ScreenshotManager.cs @@ -24,6 +24,7 @@ using osu.Game.Overlays; using osu.Game.Overlays.Notifications; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; +using SixLabors.ImageSharp.Processing; namespace osu.Game.Graphics { @@ -52,6 +53,9 @@ namespace osu.Game.Graphics private INotificationOverlay notificationOverlay { get; set; } private Sample shutter; + private Bindable sizeX; + private Bindable sizeY; + private Bindable scalingMode; [BackgroundDependencyLoader] private void load(OsuConfigManager config, Storage storage, AudioManager audio) @@ -62,6 +66,10 @@ namespace osu.Game.Graphics captureMenuCursor = config.GetBindable(OsuSetting.ScreenshotCaptureMenuCursor); shutter = audio.Samples.Get("UI/shutter"); + + sizeX = config.GetBindable(OsuSetting.ScalingSizeX); + sizeY = config.GetBindable(OsuSetting.ScalingSizeY); + scalingMode = config.GetBindable(OsuSetting.Scaling); } public bool OnPressed(KeyBindingPressEvent e) @@ -119,6 +127,19 @@ namespace osu.Game.Graphics using (var image = await host.TakeScreenshotAsync().ConfigureAwait(false)) { + if (scalingMode.Value == ScalingMode.Everything) + { + image.Mutate(m => + { + var size = m.GetCurrentSize(); + var rect = new Rectangle(Point.Empty, size); + int sx = (size.Width - (int)(size.Width * sizeX.Value)) / 2; + int sy = (size.Height - (int)(size.Height * sizeY.Value)) / 2; + rect.Inflate(-sx, -sy); + m.Crop(rect); + }); + } + clipboard.SetImage(image); (string filename, var stream) = getWritableStream(); From b20051fd55b9977152b22e1d3a86dba86d9b0839 Mon Sep 17 00:00:00 2001 From: Nitrous Date: Thu, 25 Jan 2024 10:35:41 +0800 Subject: [PATCH 299/651] offset crop rectangle to scaling container --- osu.Game/Graphics/ScreenshotManager.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game/Graphics/ScreenshotManager.cs b/osu.Game/Graphics/ScreenshotManager.cs index 47ce0d31eb..a60d55cbef 100644 --- a/osu.Game/Graphics/ScreenshotManager.cs +++ b/osu.Game/Graphics/ScreenshotManager.cs @@ -53,6 +53,8 @@ namespace osu.Game.Graphics private INotificationOverlay notificationOverlay { get; set; } private Sample shutter; + private Bindable posX; + private Bindable posY; private Bindable sizeX; private Bindable sizeY; private Bindable scalingMode; @@ -67,6 +69,8 @@ namespace osu.Game.Graphics shutter = audio.Samples.Get("UI/shutter"); + posX = config.GetBindable(OsuSetting.ScalingPositionX); + posY = config.GetBindable(OsuSetting.ScalingPositionY); sizeX = config.GetBindable(OsuSetting.ScalingSizeX); sizeY = config.GetBindable(OsuSetting.ScalingSizeY); scalingMode = config.GetBindable(OsuSetting.Scaling); @@ -136,6 +140,8 @@ namespace osu.Game.Graphics int sx = (size.Width - (int)(size.Width * sizeX.Value)) / 2; int sy = (size.Height - (int)(size.Height * sizeY.Value)) / 2; rect.Inflate(-sx, -sy); + rect.X = (int)(rect.X * posX.Value) * 2; + rect.Y = (int)(rect.Y * posY.Value) * 2; m.Crop(rect); }); } From d2990170d021f2caee2c6e66368f07792c7ac53c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 13:53:31 +0900 Subject: [PATCH 300/651] Add retry loop to avoid log export failing occasionally on windows Closes https://github.com/ppy/osu/issues/26693. --- osu.Game/IO/MigratableStorage.cs | 40 ++--------- .../Sections/General/UpdateSettings.cs | 4 +- osu.Game/Utils/FileUtils.cs | 72 +++++++++++++++++++ 3 files changed, 80 insertions(+), 36 deletions(-) create mode 100644 osu.Game/Utils/FileUtils.cs diff --git a/osu.Game/IO/MigratableStorage.cs b/osu.Game/IO/MigratableStorage.cs index 14a3c5a43c..d03d259f71 100644 --- a/osu.Game/IO/MigratableStorage.cs +++ b/osu.Game/IO/MigratableStorage.cs @@ -6,8 +6,8 @@ using System; using System.IO; using System.Linq; -using System.Threading; using osu.Framework.Platform; +using osu.Game.Utils; namespace osu.Game.IO { @@ -81,7 +81,7 @@ namespace osu.Game.IO if (IgnoreSuffixes.Any(suffix => fi.Name.EndsWith(suffix, StringComparison.Ordinal))) continue; - allFilesDeleted &= AttemptOperation(() => fi.Delete(), throwOnFailure: false); + allFilesDeleted &= FileUtils.AttemptOperation(() => fi.Delete(), throwOnFailure: false); } foreach (DirectoryInfo dir in target.GetDirectories()) @@ -92,11 +92,11 @@ namespace osu.Game.IO if (IgnoreSuffixes.Any(suffix => dir.Name.EndsWith(suffix, StringComparison.Ordinal))) continue; - allFilesDeleted &= AttemptOperation(() => dir.Delete(true), throwOnFailure: false); + allFilesDeleted &= FileUtils.AttemptOperation(() => dir.Delete(true), throwOnFailure: false); } if (target.GetFiles().Length == 0 && target.GetDirectories().Length == 0) - allFilesDeleted &= AttemptOperation(target.Delete, throwOnFailure: false); + allFilesDeleted &= FileUtils.AttemptOperation(target.Delete, throwOnFailure: false); return allFilesDeleted; } @@ -115,7 +115,7 @@ namespace osu.Game.IO if (IgnoreSuffixes.Any(suffix => fileInfo.Name.EndsWith(suffix, StringComparison.Ordinal))) continue; - AttemptOperation(() => + FileUtils.AttemptOperation(() => { fileInfo.Refresh(); @@ -139,35 +139,5 @@ namespace osu.Game.IO CopyRecursive(dir, destination.CreateSubdirectory(dir.Name), false); } } - - /// - /// Attempt an IO operation multiple times and only throw if none of the attempts succeed. - /// - /// The action to perform. - /// The number of attempts (250ms wait between each). - /// Whether to throw an exception on failure. If false, will silently fail. - protected static bool AttemptOperation(Action action, int attempts = 10, bool throwOnFailure = true) - { - while (true) - { - try - { - action(); - return true; - } - catch (Exception) - { - if (attempts-- == 0) - { - if (throwOnFailure) - throw; - - return false; - } - } - - Thread.Sleep(250); - } - } } } diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 3ff5556f4d..fe88413e6a 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -15,6 +15,7 @@ using osu.Game.Localisation; using osu.Game.Overlays.Notifications; using osu.Game.Overlays.Settings.Sections.Maintenance; using osu.Game.Updater; +using osu.Game.Utils; using SharpCompress.Archives.Zip; namespace osu.Game.Overlays.Settings.Sections.General @@ -111,7 +112,8 @@ namespace osu.Game.Overlays.Settings.Sections.General using (var outStream = storage.CreateFileSafely(archive_filename)) using (var zip = ZipArchive.Create()) { - foreach (string? f in logStorage.GetFiles(string.Empty, "*.log")) zip.AddEntry(f, logStorage.GetStream(f), true); + foreach (string? f in logStorage.GetFiles(string.Empty, "*.log")) + FileUtils.AttemptOperation(z => z.AddEntry(f, logStorage.GetStream(f), true), zip); zip.SaveTo(outStream); } diff --git a/osu.Game/Utils/FileUtils.cs b/osu.Game/Utils/FileUtils.cs new file mode 100644 index 0000000000..063ab178f7 --- /dev/null +++ b/osu.Game/Utils/FileUtils.cs @@ -0,0 +1,72 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Threading; + +namespace osu.Game.Utils +{ + public static class FileUtils + { + /// + /// Attempt an IO operation multiple times and only throw if none of the attempts succeed. + /// + /// The action to perform. + /// The provided state. + /// The number of attempts (250ms wait between each). + /// Whether to throw an exception on failure. If false, will silently fail. + public static bool AttemptOperation(Action action, T state, int attempts = 10, bool throwOnFailure = true) + { + while (true) + { + try + { + action(state); + return true; + } + catch (Exception) + { + if (attempts-- == 0) + { + if (throwOnFailure) + throw; + + return false; + } + } + + Thread.Sleep(250); + } + } + + /// + /// Attempt an IO operation multiple times and only throw if none of the attempts succeed. + /// + /// The action to perform. + /// The number of attempts (250ms wait between each). + /// Whether to throw an exception on failure. If false, will silently fail. + public static bool AttemptOperation(Action action, int attempts = 10, bool throwOnFailure = true) + { + while (true) + { + try + { + action(); + return true; + } + catch (Exception) + { + if (attempts-- == 0) + { + if (throwOnFailure) + throw; + + return false; + } + } + + Thread.Sleep(250); + } + } + } +} From 0cbba7e011bd91d4d9883adc4d5c772c6789670a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 14:18:20 +0900 Subject: [PATCH 301/651] Apply NRT to `ScreenshotManager` --- osu.Game/Graphics/ScreenshotManager.cs | 39 ++++++++++++-------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/osu.Game/Graphics/ScreenshotManager.cs b/osu.Game/Graphics/ScreenshotManager.cs index a60d55cbef..d952460c47 100644 --- a/osu.Game/Graphics/ScreenshotManager.cs +++ b/osu.Game/Graphics/ScreenshotManager.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using System.IO; using System.Threading; @@ -38,37 +36,36 @@ namespace osu.Game.Graphics /// public IBindable CursorVisibility => cursorVisibility; - private Bindable screenshotFormat; - private Bindable captureMenuCursor; + [Resolved] + private GameHost host { get; set; } = null!; [Resolved] - private GameHost host { get; set; } + private Clipboard clipboard { get; set; } = null!; [Resolved] - private Clipboard clipboard { get; set; } + private INotificationOverlay notificationOverlay { get; set; } = null!; - private Storage storage; + private Storage storage = null!; - [Resolved] - private INotificationOverlay notificationOverlay { get; set; } + private Sample? shutter; - private Sample shutter; - private Bindable posX; - private Bindable posY; - private Bindable sizeX; - private Bindable sizeY; - private Bindable scalingMode; + private Bindable screenshotFormat = null!; + private Bindable captureMenuCursor = null!; + private Bindable posX = null!; + private Bindable posY = null!; + private Bindable sizeX = null!; + private Bindable sizeY = null!; + private Bindable scalingMode = null!; [BackgroundDependencyLoader] private void load(OsuConfigManager config, Storage storage, AudioManager audio) { this.storage = storage.GetStorageForDirectory(@"screenshots"); - screenshotFormat = config.GetBindable(OsuSetting.ScreenshotFormat); - captureMenuCursor = config.GetBindable(OsuSetting.ScreenshotCaptureMenuCursor); - shutter = audio.Samples.Get("UI/shutter"); + screenshotFormat = config.GetBindable(OsuSetting.ScreenshotFormat); + captureMenuCursor = config.GetBindable(OsuSetting.ScreenshotCaptureMenuCursor); posX = config.GetBindable(OsuSetting.ScalingPositionX); posY = config.GetBindable(OsuSetting.ScalingPositionY); sizeX = config.GetBindable(OsuSetting.ScalingSizeX); @@ -84,7 +81,7 @@ namespace osu.Game.Graphics switch (e.Action) { case GlobalAction.TakeScreenshot: - shutter.Play(); + shutter?.Play(); TakeScreenshotAsync().FireAndForget(); return true; } @@ -148,7 +145,7 @@ namespace osu.Game.Graphics clipboard.SetImage(image); - (string filename, var stream) = getWritableStream(); + (string? filename, Stream? stream) = getWritableStream(); if (filename == null) return; @@ -191,7 +188,7 @@ namespace osu.Game.Graphics private static readonly object filename_reservation_lock = new object(); - private (string filename, Stream stream) getWritableStream() + private (string? filename, Stream? stream) getWritableStream() { lock (filename_reservation_lock) { From 85927e06827eaa3660f00191eac6b4251e8db7b7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 14:22:27 +0900 Subject: [PATCH 302/651] Move configuration retrieval to non-bindable inline for readability --- osu.Game/Graphics/ScreenshotManager.cs | 65 ++++++++++++-------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/osu.Game/Graphics/ScreenshotManager.cs b/osu.Game/Graphics/ScreenshotManager.cs index d952460c47..ca6a3fe84f 100644 --- a/osu.Game/Graphics/ScreenshotManager.cs +++ b/osu.Game/Graphics/ScreenshotManager.cs @@ -22,6 +22,7 @@ using osu.Game.Overlays; using osu.Game.Overlays.Notifications; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; +using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; namespace osu.Game.Graphics @@ -45,32 +46,18 @@ namespace osu.Game.Graphics [Resolved] private INotificationOverlay notificationOverlay { get; set; } = null!; + [Resolved] + private OsuConfigManager config { get; set; } = null!; + private Storage storage = null!; private Sample? shutter; - private Bindable screenshotFormat = null!; - private Bindable captureMenuCursor = null!; - private Bindable posX = null!; - private Bindable posY = null!; - private Bindable sizeX = null!; - private Bindable sizeY = null!; - private Bindable scalingMode = null!; - [BackgroundDependencyLoader] - private void load(OsuConfigManager config, Storage storage, AudioManager audio) + private void load(Storage storage, AudioManager audio) { this.storage = storage.GetStorageForDirectory(@"screenshots"); - shutter = audio.Samples.Get("UI/shutter"); - - screenshotFormat = config.GetBindable(OsuSetting.ScreenshotFormat); - captureMenuCursor = config.GetBindable(OsuSetting.ScreenshotCaptureMenuCursor); - posX = config.GetBindable(OsuSetting.ScalingPositionX); - posY = config.GetBindable(OsuSetting.ScalingPositionY); - sizeX = config.GetBindable(OsuSetting.ScalingSizeX); - sizeY = config.GetBindable(OsuSetting.ScalingSizeY); - scalingMode = config.GetBindable(OsuSetting.Scaling); } public bool OnPressed(KeyBindingPressEvent e) @@ -99,9 +86,19 @@ namespace osu.Game.Graphics { Interlocked.Increment(ref screenShotTasks); + ScreenshotFormat screenshotFormat = config.Get(OsuSetting.ScreenshotFormat); + bool captureMenuCursor = config.Get(OsuSetting.ScreenshotCaptureMenuCursor); + + float posX = config.Get(OsuSetting.ScalingPositionX); + float posY = config.Get(OsuSetting.ScalingPositionY); + float sizeX = config.Get(OsuSetting.ScalingSizeX); + float sizeY = config.Get(OsuSetting.ScalingSizeY); + + ScalingMode scalingMode = config.Get(OsuSetting.Scaling); + try { - if (!captureMenuCursor.Value) + if (!captureMenuCursor) { cursorVisibility.Value = false; @@ -110,7 +107,7 @@ namespace osu.Game.Graphics int framesWaited = 0; - using (var framesWaitedEvent = new ManualResetEventSlim(false)) + using (ManualResetEventSlim framesWaitedEvent = new ManualResetEventSlim(false)) { ScheduledDelegate waitDelegate = host.DrawThread.Scheduler.AddDelayed(() => { @@ -126,32 +123,32 @@ namespace osu.Game.Graphics } } - using (var image = await host.TakeScreenshotAsync().ConfigureAwait(false)) + using (Image? image = await host.TakeScreenshotAsync().ConfigureAwait(false)) { - if (scalingMode.Value == ScalingMode.Everything) + if (scalingMode == ScalingMode.Everything) { image.Mutate(m => { - var size = m.GetCurrentSize(); - var rect = new Rectangle(Point.Empty, size); - int sx = (size.Width - (int)(size.Width * sizeX.Value)) / 2; - int sy = (size.Height - (int)(size.Height * sizeY.Value)) / 2; + Size size = m.GetCurrentSize(); + Rectangle rect = new Rectangle(Point.Empty, size); + int sx = (size.Width - (int)(size.Width * sizeX)) / 2; + int sy = (size.Height - (int)(size.Height * sizeY)) / 2; rect.Inflate(-sx, -sy); - rect.X = (int)(rect.X * posX.Value) * 2; - rect.Y = (int)(rect.Y * posY.Value) * 2; + rect.X = (int)(rect.X * posX) * 2; + rect.Y = (int)(rect.Y * posY) * 2; m.Crop(rect); }); } clipboard.SetImage(image); - (string? filename, Stream? stream) = getWritableStream(); + (string? filename, Stream? stream) = getWritableStream(screenshotFormat); if (filename == null) return; using (stream) { - switch (screenshotFormat.Value) + switch (screenshotFormat) { case ScreenshotFormat.Png: await image.SaveAsPngAsync(stream).ConfigureAwait(false); @@ -164,7 +161,7 @@ namespace osu.Game.Graphics break; default: - throw new InvalidOperationException($"Unknown enum member {nameof(ScreenshotFormat)} {screenshotFormat.Value}."); + throw new InvalidOperationException($"Unknown enum member {nameof(ScreenshotFormat)} {screenshotFormat}."); } } @@ -188,12 +185,12 @@ namespace osu.Game.Graphics private static readonly object filename_reservation_lock = new object(); - private (string? filename, Stream? stream) getWritableStream() + private (string? filename, Stream? stream) getWritableStream(ScreenshotFormat format) { lock (filename_reservation_lock) { - var dt = DateTime.Now; - string fileExt = screenshotFormat.ToString().ToLowerInvariant(); + DateTime dt = DateTime.Now; + string fileExt = format.ToString().ToLowerInvariant(); string withoutIndex = $"osu_{dt:yyyy-MM-dd_HH-mm-ss}.{fileExt}"; if (!storage.Exists(withoutIndex)) From 69e822f3c53186c61299c6b80bcb17a834f547eb Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 14:30:26 +0900 Subject: [PATCH 303/651] Refactor crop logic slightly --- osu.Game/Graphics/ScreenshotManager.cs | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/osu.Game/Graphics/ScreenshotManager.cs b/osu.Game/Graphics/ScreenshotManager.cs index ca6a3fe84f..a085558b3a 100644 --- a/osu.Game/Graphics/ScreenshotManager.cs +++ b/osu.Game/Graphics/ScreenshotManager.cs @@ -89,13 +89,6 @@ namespace osu.Game.Graphics ScreenshotFormat screenshotFormat = config.Get(OsuSetting.ScreenshotFormat); bool captureMenuCursor = config.Get(OsuSetting.ScreenshotCaptureMenuCursor); - float posX = config.Get(OsuSetting.ScalingPositionX); - float posY = config.Get(OsuSetting.ScalingPositionY); - float sizeX = config.Get(OsuSetting.ScalingSizeX); - float sizeY = config.Get(OsuSetting.ScalingSizeY); - - ScalingMode scalingMode = config.Get(OsuSetting.Scaling); - try { if (!captureMenuCursor) @@ -125,17 +118,26 @@ namespace osu.Game.Graphics using (Image? image = await host.TakeScreenshotAsync().ConfigureAwait(false)) { - if (scalingMode == ScalingMode.Everything) + if (config.Get(OsuSetting.Scaling) == ScalingMode.Everything) { + float posX = config.Get(OsuSetting.ScalingPositionX); + float posY = config.Get(OsuSetting.ScalingPositionY); + float sizeX = config.Get(OsuSetting.ScalingSizeX); + float sizeY = config.Get(OsuSetting.ScalingSizeY); + image.Mutate(m => { - Size size = m.GetCurrentSize(); - Rectangle rect = new Rectangle(Point.Empty, size); - int sx = (size.Width - (int)(size.Width * sizeX)) / 2; - int sy = (size.Height - (int)(size.Height * sizeY)) / 2; + Rectangle rect = new Rectangle(Point.Empty, m.GetCurrentSize()); + + // Reduce size by user scale settings... + int sx = (rect.Width - (int)(rect.Width * sizeX)) / 2; + int sy = (rect.Height - (int)(rect.Height * sizeY)) / 2; rect.Inflate(-sx, -sy); + + // ...then adjust the region based on their positional offset. rect.X = (int)(rect.X * posX) * 2; rect.Y = (int)(rect.Y * posY) * 2; + m.Crop(rect); }); } From f22bfa350a2b95ff3fa16a5528d7ef95c0e0d3fc Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 15:02:43 +0900 Subject: [PATCH 304/651] Add test coverage of hidden scores on accuracy circle --- .../Visual/Ranking/TestSceneAccuracyCircle.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs b/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs index 7aa36429a7..41a5603060 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneAccuracyCircle.cs @@ -46,6 +46,16 @@ namespace osu.Game.Tests.Visual.Ranking addCircleStep(createScore(1, new OsuRuleset())); } + [Test] + public void TestOsuRankHidden() + { + addCircleStep(createScore(0, new OsuRuleset(), 20, true)); + addCircleStep(createScore(0.8, new OsuRuleset(), 5, true)); + addCircleStep(createScore(0.95, new OsuRuleset(), 0, true)); + addCircleStep(createScore(0.97, new OsuRuleset(), 1, true)); + addCircleStep(createScore(1, new OsuRuleset(), 0, true)); + } + [Test] public void TestCatchRank() { @@ -66,7 +76,7 @@ namespace osu.Game.Tests.Visual.Ranking addCircleStep(createScore(1, new CatchRuleset())); } - private void addCircleStep(ScoreInfo score) => AddStep($"add panel ({score.DisplayAccuracy})", () => + private void addCircleStep(ScoreInfo score) => AddStep($"add panel ({score.DisplayAccuracy}, {score.Statistics.GetValueOrDefault(HitResult.Miss)} miss)", () => { Children = new Drawable[] { @@ -93,18 +103,22 @@ namespace osu.Game.Tests.Visual.Ranking }; }); - private ScoreInfo createScore(double accuracy, Ruleset ruleset) + private ScoreInfo createScore(double accuracy, Ruleset ruleset, int missCount = 0, bool hidden = false) { var scoreProcessor = ruleset.CreateScoreProcessor(); var statistics = new Dictionary { - { HitResult.Miss, 1 }, + { HitResult.Miss, missCount }, { HitResult.Meh, 50 }, { HitResult.Good, 100 }, { HitResult.Great, 300 }, }; + var mods = hidden + ? new[] { new OsuModHidden() } + : new Mod[] { new OsuModHardRock(), new OsuModDoubleTime() }; + return new ScoreInfo { User = new APIUser @@ -114,7 +128,7 @@ namespace osu.Game.Tests.Visual.Ranking }, BeatmapInfo = new TestBeatmap(new OsuRuleset().RulesetInfo).BeatmapInfo, Ruleset = ruleset.RulesetInfo, - Mods = new Mod[] { new OsuModHardRock(), new OsuModDoubleTime() }, + Mods = mods, TotalScore = 2845370, Accuracy = accuracy, MaxCombo = 999, From 37e370e654d743ca11b78074cd9a60f66d5590c7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 14:57:42 +0900 Subject: [PATCH 305/651] Fix crash at results screen when hidden is enabled and S rank becomes A due to miss Closes https://github.com/ppy/osu/issues/26692. --- osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index e7e54d0fae..0aff98df2b 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -417,7 +417,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy accuracyCircle .FillTo(accuracyS - NOTCH_WIDTH_PERCENTAGE / 2 - visual_alignment_offset, 70, Easing.OutQuint); - badges.Single(b => b.Rank == ScoreRank.S) + badges.Single(b => b.Rank == getRank(ScoreRank.S)) .FadeOut(70, Easing.OutQuint); } } From a264ac9f381dc71d8b8d79af70c61d168a9ed91f Mon Sep 17 00:00:00 2001 From: Mike Will Date: Thu, 25 Jan 2024 05:12:54 -0500 Subject: [PATCH 306/651] Change name and description of `force` parameter in `SetArbitraryDivisor` --- osu.Game/Screens/Edit/BindableBeatDivisor.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Edit/BindableBeatDivisor.cs b/osu.Game/Screens/Edit/BindableBeatDivisor.cs index 87cb191a82..4b0726658f 100644 --- a/osu.Game/Screens/Edit/BindableBeatDivisor.cs +++ b/osu.Game/Screens/Edit/BindableBeatDivisor.cs @@ -29,11 +29,11 @@ namespace osu.Game.Screens.Edit /// Set a divisor, updating the valid divisor range appropriately. /// /// The intended divisor. - /// Ignores the current valid divisor range when true. - public void SetArbitraryDivisor(int divisor, bool force = false) + /// Forces changing the valid divisors to a known preset. + public void SetArbitraryDivisor(int divisor, bool preferKnownPresets = false) { // If the current valid divisor range doesn't contain the proposed value, attempt to find one which does. - if (force || !ValidDivisors.Value.Presets.Contains(divisor)) + if (preferKnownPresets || !ValidDivisors.Value.Presets.Contains(divisor)) { if (BeatDivisorPresetCollection.COMMON.Presets.Contains(divisor)) ValidDivisors.Value = BeatDivisorPresetCollection.COMMON; From 8aea6e07c31127f9b93540d9b99c295f9ca3463c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 16:31:33 +0900 Subject: [PATCH 307/651] Change slider end miss colour to gray --- osu.Game/Graphics/OsuColour.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Graphics/OsuColour.cs b/osu.Game/Graphics/OsuColour.cs index 1b5877b966..985898958c 100644 --- a/osu.Game/Graphics/OsuColour.cs +++ b/osu.Game/Graphics/OsuColour.cs @@ -77,7 +77,7 @@ namespace osu.Game.Graphics { case HitResult.IgnoreMiss: case HitResult.SmallTickMiss: - return Orange1; + return Color4.Gray; case HitResult.Miss: case HitResult.LargeTickMiss: From dda96d71063796af8a3d4344ba080005447283e2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 16:33:52 +0900 Subject: [PATCH 308/651] Rename `JudgementPiece` to `TextJudgementPiece` --- osu.Game.Rulesets.Mania/Skinning/Argon/ArgonJudgementPiece.cs | 2 +- osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs | 2 +- osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonJudgementPiece.cs | 2 +- osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs | 2 +- .../Judgements/{JudgementPiece.cs => TextJudgementPiece.cs} | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename osu.Game/Rulesets/Judgements/{JudgementPiece.cs => TextJudgementPiece.cs} (88%) diff --git a/osu.Game.Rulesets.Mania/Skinning/Argon/ArgonJudgementPiece.cs b/osu.Game.Rulesets.Mania/Skinning/Argon/ArgonJudgementPiece.cs index a191dee1ca..0052fd8b78 100644 --- a/osu.Game.Rulesets.Mania/Skinning/Argon/ArgonJudgementPiece.cs +++ b/osu.Game.Rulesets.Mania/Skinning/Argon/ArgonJudgementPiece.cs @@ -17,7 +17,7 @@ using osuTK.Graphics; namespace osu.Game.Rulesets.Mania.Skinning.Argon { - public partial class ArgonJudgementPiece : JudgementPiece, IAnimatableJudgement + public partial class ArgonJudgementPiece : TextJudgementPiece, IAnimatableJudgement { private const float judgement_y_position = 160; diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs index 9a5abba4fb..83992fc785 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs @@ -16,7 +16,7 @@ using osuTK; namespace osu.Game.Rulesets.Osu.Skinning.Argon { - public partial class ArgonJudgementPiece : JudgementPiece, IAnimatableJudgement + public partial class ArgonJudgementPiece : TextJudgementPiece, IAnimatableJudgement { private RingExplosion? ringExplosion; diff --git a/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonJudgementPiece.cs b/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonJudgementPiece.cs index bbd62ff85b..724e387cc7 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonJudgementPiece.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Argon/ArgonJudgementPiece.cs @@ -17,7 +17,7 @@ using osuTK.Graphics; namespace osu.Game.Rulesets.Taiko.Skinning.Argon { - public partial class ArgonJudgementPiece : JudgementPiece, IAnimatableJudgement + public partial class ArgonJudgementPiece : TextJudgementPiece, IAnimatableJudgement { private RingExplosion? ringExplosion; diff --git a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs index 7330f138ce..458d79cc00 100644 --- a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs +++ b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs @@ -10,7 +10,7 @@ using osuTK; namespace osu.Game.Rulesets.Judgements { - public partial class DefaultJudgementPiece : JudgementPiece, IAnimatableJudgement + public partial class DefaultJudgementPiece : TextJudgementPiece, IAnimatableJudgement { public DefaultJudgementPiece(HitResult result) : base(result) diff --git a/osu.Game/Rulesets/Judgements/JudgementPiece.cs b/osu.Game/Rulesets/Judgements/TextJudgementPiece.cs similarity index 88% rename from osu.Game/Rulesets/Judgements/JudgementPiece.cs rename to osu.Game/Rulesets/Judgements/TextJudgementPiece.cs index 03f211c318..42527705eb 100644 --- a/osu.Game/Rulesets/Judgements/JudgementPiece.cs +++ b/osu.Game/Rulesets/Judgements/TextJudgementPiece.cs @@ -10,7 +10,7 @@ using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Judgements { - public abstract partial class JudgementPiece : CompositeDrawable + public abstract partial class TextJudgementPiece : CompositeDrawable { protected readonly HitResult Result; @@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Judgements [Resolved] private OsuColour colours { get; set; } = null!; - protected JudgementPiece(HitResult result) + protected TextJudgementPiece(HitResult result) { Result = result; } From 6070eac6eec64852a8aa27a2c283cf9388c6ad5c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 18:48:14 +0900 Subject: [PATCH 309/651] Remove dead code --- osu.Game/Skinning/LegacyJudgementPieceNew.cs | 2 +- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 12 +----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/osu.Game/Skinning/LegacyJudgementPieceNew.cs b/osu.Game/Skinning/LegacyJudgementPieceNew.cs index 5ff28726c0..bd1508b4a6 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceNew.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceNew.cs @@ -53,7 +53,7 @@ namespace osu.Game.Skinning if (!result.IsMiss()) { //new judgement shows old as a temporary effect - AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f, true) + AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f) { Blending = BlendingParameters.Additive, Anchor = Anchor.Centre, diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index a9f68bd378..55c81e4e41 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -18,16 +18,14 @@ namespace osu.Game.Skinning private readonly HitResult result; private readonly float finalScale; - private readonly bool forceTransforms; [Resolved] private ISkinSource skin { get; set; } = null!; - public LegacyJudgementPieceOld(HitResult result, Func createMainDrawable, float finalScale = 1f, bool forceTransforms = false) + public LegacyJudgementPieceOld(HitResult result, Func createMainDrawable, float finalScale = 1f) { this.result = result; this.finalScale = finalScale; - this.forceTransforms = forceTransforms; AutoSizeAxes = Axes.Both; Origin = Anchor.Centre; @@ -48,14 +46,6 @@ namespace osu.Game.Skinning this.FadeInFromZero(fade_in_length); this.Delay(fade_out_delay).FadeOut(fade_out_length); - // legacy judgements don't play any transforms if they are an animation.... UNLESS they are the temporary displayed judgement from new piece. - if (animation?.FrameCount > 1 && !forceTransforms) - { - if (isMissedTick()) - applyMissedTickScaling(); - return; - } - if (result.IsMiss()) { decimal? legacyVersion = skin.GetConfig(SkinConfiguration.LegacySetting.Version)?.Value; From d0421fe20667530bf1bca1a5c8e3f387dde0cf6a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 18:50:45 +0900 Subject: [PATCH 310/651] Move fade more local to avoid fading twice --- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index 55c81e4e41..c15ff041d1 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -44,7 +44,6 @@ namespace osu.Game.Skinning const double fade_out_length = 600; this.FadeInFromZero(fade_in_length); - this.Delay(fade_out_delay).FadeOut(fade_out_length); if (result.IsMiss()) { @@ -74,6 +73,8 @@ namespace osu.Game.Skinning this.RotateTo(0); this.RotateTo(rotation, fade_in_length) .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); + + this.Delay(fade_out_delay).FadeOut(fade_out_length); } } else @@ -87,6 +88,8 @@ namespace osu.Game.Skinning // so we need to force the current value to be correct at 1.2 (0.95) then complete the // second half of the transform. .ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4 + + this.Delay(fade_out_delay).FadeOut(fade_out_length); } } From 0175f6e0b8f5357a161211474e07af840dcf1852 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 18:23:25 +0900 Subject: [PATCH 311/651] Add new judgement drawable for argon slider misses --- .../ArgonJudgementPieceSliderTickMiss.cs | 51 +++++++++++++++++++ .../Skinning/Argon/ArgonSliderScorePoint.cs | 4 +- .../Skinning/Argon/OsuArgonSkinTransformer.cs | 14 ++++- 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs new file mode 100644 index 0000000000..878e8dbfc2 --- /dev/null +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs @@ -0,0 +1,51 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Shapes; +using osu.Game.Graphics; +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Scoring; +using osuTK; + +namespace osu.Game.Rulesets.Osu.Skinning.Argon +{ + public partial class ArgonJudgementPieceSliderTickMiss : CompositeDrawable, IAnimatableJudgement + { + private readonly HitResult result; + private Circle piece = null!; + + [Resolved] + private OsuColour colours { get; set; } = null!; + + public ArgonJudgementPieceSliderTickMiss(HitResult result) + { + this.result = result; + } + + [BackgroundDependencyLoader] + private void load() + { + AddInternal(piece = new Circle + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Blending = BlendingParameters.Additive, + Colour = colours.ForHitResult(result), + Size = new Vector2(ArgonSliderScorePoint.SIZE) + }); + } + + public void PlayAnimation() + { + this.ScaleTo(1.4f); + this.ScaleTo(1f, 150, Easing.Out); + + this.FadeOutFromOne(400); + } + + public Drawable? GetAboveHitObjectsProxiedContent() => piece.CreateProxy(); + } +} diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonSliderScorePoint.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonSliderScorePoint.cs index 7479c2aced..e9ee432bac 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonSliderScorePoint.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonSliderScorePoint.cs @@ -16,14 +16,14 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon { private Bindable accentColour = null!; - private const float size = 12; + public const float SIZE = 12; [BackgroundDependencyLoader] private void load(DrawableHitObject hitObject) { Masking = true; Origin = Anchor.Centre; - Size = new Vector2(size); + Size = new Vector2(SIZE); BorderThickness = 3; BorderColour = Color4.White; Child = new Box diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/OsuArgonSkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/OsuArgonSkinTransformer.cs index 0f9c97059c..ec63e1194d 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/OsuArgonSkinTransformer.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/OsuArgonSkinTransformer.cs @@ -19,11 +19,21 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon switch (lookup) { case GameplaySkinComponentLookup resultComponent: + HitResult result = resultComponent.Component; + // This should eventually be moved to a skin setting, when supported. - if (Skin is ArgonProSkin && (resultComponent.Component == HitResult.Great || resultComponent.Component == HitResult.Perfect)) + if (Skin is ArgonProSkin && (result == HitResult.Great || result == HitResult.Perfect)) return Drawable.Empty(); - return new ArgonJudgementPiece(resultComponent.Component); + switch (result) + { + case HitResult.IgnoreMiss: + case HitResult.LargeTickMiss: + return new ArgonJudgementPieceSliderTickMiss(result); + + default: + return new ArgonJudgementPiece(result); + } case OsuSkinComponentLookup osuComponent: // TODO: Once everything is finalised, consider throwing UnsupportedSkinComponentException on missing entries. From 107b37494ede1ca66a1b2cf4d669102d4c9804d4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 19:14:04 +0900 Subject: [PATCH 312/651] Update triangles skin judgment display --- .../Objects/Drawables/DrawableSliderTick.cs | 6 +-- osu.Game.Rulesets.Osu/OsuRuleset.cs | 4 ++ .../DefaultJudgementPieceSliderTickMiss.cs | 52 +++++++++++++++++++ .../Default/OsuTrianglesSkinTransformer.cs | 38 ++++++++++++++ .../Judgements/DefaultJudgementPiece.cs | 14 ----- osu.Game/Rulesets/Scoring/HitResult.cs | 2 - 6 files changed, 97 insertions(+), 19 deletions(-) create mode 100644 osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs create mode 100644 osu.Game.Rulesets.Osu/Skinning/Default/OsuTrianglesSkinTransformer.cs diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs index d64fb0bcc6..e457a50128 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public const double ANIM_DURATION = 150; - private const float default_tick_size = 16; + public const float DEFAULT_TICK_SIZE = 16; protected DrawableSlider DrawableSlider => (DrawableSlider)ParentHitObject; @@ -44,8 +44,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { Masking = true, Origin = Anchor.Centre, - Size = new Vector2(default_tick_size), - BorderThickness = default_tick_size / 4, + Size = new Vector2(DEFAULT_TICK_SIZE), + BorderThickness = DEFAULT_TICK_SIZE / 4, BorderColour = Color4.White, Child = new Box { diff --git a/osu.Game.Rulesets.Osu/OsuRuleset.cs b/osu.Game.Rulesets.Osu/OsuRuleset.cs index 0496d1f680..6752712be1 100644 --- a/osu.Game.Rulesets.Osu/OsuRuleset.cs +++ b/osu.Game.Rulesets.Osu/OsuRuleset.cs @@ -28,6 +28,7 @@ using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Replays; using osu.Game.Rulesets.Osu.Scoring; using osu.Game.Rulesets.Osu.Skinning.Argon; +using osu.Game.Rulesets.Osu.Skinning.Default; using osu.Game.Rulesets.Osu.Skinning.Legacy; using osu.Game.Rulesets.Osu.Statistics; using osu.Game.Rulesets.Osu.UI; @@ -254,6 +255,9 @@ namespace osu.Game.Rulesets.Osu case ArgonSkin: return new OsuArgonSkinTransformer(skin); + + case TrianglesSkin: + return new OsuTrianglesSkinTransformer(skin); } return null; diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs new file mode 100644 index 0000000000..9fc71852ba --- /dev/null +++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs @@ -0,0 +1,52 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Shapes; +using osu.Game.Graphics; +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Osu.Objects.Drawables; +using osu.Game.Rulesets.Scoring; +using osuTK; + +namespace osu.Game.Rulesets.Osu.Skinning.Default +{ + public partial class DefaultJudgementPieceSliderTickMiss : CompositeDrawable, IAnimatableJudgement + { + private readonly HitResult result; + private Circle piece = null!; + + [Resolved] + private OsuColour colours { get; set; } = null!; + + public DefaultJudgementPieceSliderTickMiss(HitResult result) + { + this.result = result; + } + + [BackgroundDependencyLoader] + private void load() + { + AddInternal(piece = new Circle + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Blending = BlendingParameters.Additive, + Colour = colours.ForHitResult(result), + Size = new Vector2(DrawableSliderTick.DEFAULT_TICK_SIZE) + }); + } + + public void PlayAnimation() + { + this.ScaleTo(1.4f); + this.ScaleTo(1f, 150, Easing.Out); + + this.FadeOutFromOne(400); + } + + public Drawable? GetAboveHitObjectsProxiedContent() => piece.CreateProxy(); + } +} diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/OsuTrianglesSkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Default/OsuTrianglesSkinTransformer.cs new file mode 100644 index 0000000000..7a4c768aa2 --- /dev/null +++ b/osu.Game.Rulesets.Osu/Skinning/Default/OsuTrianglesSkinTransformer.cs @@ -0,0 +1,38 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Graphics; +using osu.Game.Rulesets.Scoring; +using osu.Game.Skinning; + +namespace osu.Game.Rulesets.Osu.Skinning.Default +{ + public class OsuTrianglesSkinTransformer : SkinTransformer + { + public OsuTrianglesSkinTransformer(ISkin skin) + : base(skin) + { + } + + public override Drawable? GetDrawableComponent(ISkinComponentLookup lookup) + { + switch (lookup) + { + case GameplaySkinComponentLookup resultComponent: + HitResult result = resultComponent.Component; + + switch (result) + { + case HitResult.IgnoreMiss: + case HitResult.LargeTickMiss: + // use argon judgement piece for new tick misses because i don't want to design another one for triangles. + return new DefaultJudgementPieceSliderTickMiss(result); + } + + break; + } + + return base.GetDrawableComponent(lookup); + } + } +} diff --git a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs index 458d79cc00..61b72a6066 100644 --- a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs +++ b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs @@ -38,20 +38,6 @@ namespace osu.Game.Rulesets.Judgements /// public virtual void PlayAnimation() { - // TODO: make these better. currently they are using a text `-` and it's not centered properly. - // Should be an explicit drawable. - // - // When this is done, remove the [Description] attributes from HitResults which were added for this purpose. - if (Result == HitResult.IgnoreMiss || Result == HitResult.LargeTickMiss) - { - this.RotateTo(-45); - this.ScaleTo(1.6f); - this.ScaleTo(1.2f, 100, Easing.In); - - this.FadeOutFromOne(400); - return; - } - if (Result.IsMiss()) { this.ScaleTo(1.6f); diff --git a/osu.Game/Rulesets/Scoring/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs index 7e58df3cfa..20ec3c4946 100644 --- a/osu.Game/Rulesets/Scoring/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -86,7 +86,6 @@ namespace osu.Game.Rulesets.Scoring /// Indicates a large tick miss. /// [EnumMember(Value = "large_tick_miss")] - [Description("-")] [Order(11)] LargeTickMiss, @@ -118,7 +117,6 @@ namespace osu.Game.Rulesets.Scoring /// Indicates a miss that should be ignored for scoring purposes. /// [EnumMember(Value = "ignore_miss")] - [Description("-")] [Order(14)] IgnoreMiss, From fd9527d5233fd6254d4b8a627fd4b07588dbc496 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 19:25:42 +0900 Subject: [PATCH 313/651] Remove weird red fade that didn't work --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs index e457a50128..73c061afbd 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs @@ -88,8 +88,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables break; case ArmedState.Miss: - this.FadeOut(ANIM_DURATION); - this.TransformBindableTo(AccentColour, Color4.Red, 0); + this.FadeOut(ANIM_DURATION, Easing.OutQuint); break; case ArmedState.Hit: From 56a9b059e9ff32b1be5288cd7f4a92921cc49542 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 19:42:38 +0900 Subject: [PATCH 314/651] Add back `ScaleAdjust` to triangles --- osu.Game/Graphics/Backgrounds/TrianglesV2.cs | 24 ++++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs index 706b05f5ad..bcb73f71cc 100644 --- a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs +++ b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs @@ -1,17 +1,18 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.Utils; -using osuTK; using System; -using osu.Framework.Graphics.Shaders; -using osu.Framework.Graphics.Textures; -using osu.Framework.Graphics.Primitives; -using osu.Framework.Allocation; using System.Collections.Generic; -using osu.Framework.Graphics.Rendering; +using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; +using osu.Framework.Graphics.Colour; +using osu.Framework.Graphics.Primitives; +using osu.Framework.Graphics.Rendering; +using osu.Framework.Graphics.Shaders; +using osu.Framework.Graphics.Textures; +using osu.Framework.Utils; +using osuTK; namespace osu.Game.Graphics.Backgrounds { @@ -27,6 +28,8 @@ namespace osu.Game.Graphics.Backgrounds public float Thickness { get; set; } = 0.02f; // No need for invalidation since it's happening in Update() + public float ScaleAdjust { get; set; } = 1; + /// /// Whether we should create new triangles as others expire. /// @@ -106,7 +109,7 @@ namespace osu.Game.Graphics.Backgrounds parts[i] = newParticle; - float bottomPos = parts[i].Position.Y + triangle_size * equilateral_triangle_ratio / DrawHeight; + float bottomPos = parts[i].Position.Y + triangle_size * ScaleAdjust * equilateral_triangle_ratio / DrawHeight; if (bottomPos < 0) parts.RemoveAt(i); } @@ -149,7 +152,7 @@ namespace osu.Game.Graphics.Backgrounds if (randomY) { // since triangles are drawn from the top - allow them to be positioned a bit above the screen - float maxOffset = triangle_size * equilateral_triangle_ratio / DrawHeight; + float maxOffset = triangle_size * ScaleAdjust * equilateral_triangle_ratio / DrawHeight; y = Interpolation.ValueAt(nextRandom(), -maxOffset, 1f, 0f, 1f); } @@ -188,7 +191,7 @@ namespace osu.Game.Graphics.Backgrounds private readonly List parts = new List(); - private readonly Vector2 triangleSize = new Vector2(1f, equilateral_triangle_ratio) * triangle_size; + private Vector2 triangleSize; private Vector2 size; private float thickness; @@ -209,6 +212,7 @@ namespace osu.Game.Graphics.Backgrounds size = Source.DrawSize; thickness = Source.Thickness; clampAxes = Source.ClampAxes; + triangleSize = new Vector2(1f, equilateral_triangle_ratio) * triangle_size * Source.ScaleAdjust; Quad triangleQuad = new Quad( Vector2Extensions.Transform(Vector2.Zero, DrawInfo.Matrix), From 4a629fbc799093c96ec824f979c7258cdf5370ae Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 19:43:08 +0900 Subject: [PATCH 315/651] Update logo to new version --- osu.Game/Screens/Menu/OsuLogo.cs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs index 75ef8be02e..624c78bdb8 100644 --- a/osu.Game/Screens/Menu/OsuLogo.cs +++ b/osu.Game/Screens/Menu/OsuLogo.cs @@ -10,6 +10,7 @@ using osu.Framework.Audio.Sample; using osu.Framework.Audio.Track; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; +using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Sprites; @@ -31,15 +32,13 @@ namespace osu.Game.Screens.Menu /// public partial class OsuLogo : BeatSyncedContainer { - public readonly Color4 OsuPink = Color4Extensions.FromHex(@"e967a1"); - private const double transition_length = 300; /// /// The osu! logo sprite has a shadow included in its texture. /// This adjustment vector is used to match the precise edge of the border of the logo. /// - public static readonly Vector2 SCALE_ADJUST = new Vector2(0.96f); + public static readonly Vector2 SCALE_ADJUST = new Vector2(0.94f); private readonly Sprite logo; private readonly CircularContainer logoContainer; @@ -58,7 +57,7 @@ namespace osu.Game.Screens.Menu private Sample sampleDownbeat; private readonly Container colourAndTriangles; - private readonly Triangles triangles; + private readonly TrianglesV2 triangles; /// /// Return value decides whether the logo should play its own sample for the click action. @@ -184,13 +183,17 @@ namespace osu.Game.Screens.Menu new Box { RelativeSizeAxes = Axes.Both, - Colour = OsuPink, + Colour = ColourInfo.GradientVertical(Color4Extensions.FromHex(@"ff66ab"), Color4Extensions.FromHex(@"cc5289")), }, - triangles = new Triangles + triangles = new TrianglesV2 { - TriangleScale = 4, - ColourLight = Color4Extensions.FromHex(@"ff7db7"), - ColourDark = Color4Extensions.FromHex(@"de5b95"), + ClampAxes = Axes.X, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Thickness = 0.009f, + ScaleAdjust = 3, + SpawnRatio = 1.2f, + Colour = ColourInfo.GradientVertical(Color4Extensions.FromHex(@"ff66ab"), Color4Extensions.FromHex(@"b6346f")), RelativeSizeAxes = Axes.Both, }, } From 7476d307d3b71f46aec187b2c16b60a51458d959 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 19:49:52 +0900 Subject: [PATCH 316/651] Update repository resources --- assets/lazer-nuget.png | Bin 12471 -> 12770 bytes assets/lazer.png | Bin 191397 -> 326320 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/lazer-nuget.png b/assets/lazer-nuget.png index c2a587fdc26734c1f263023d7eefa8fd644e978b..98a152a5a05b40b857780b2682be6a126151ba72 100644 GIT binary patch literal 12770 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 literal 12471 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 BjmH20 diff --git a/assets/lazer.png b/assets/lazer.png index 1e40e844ccb4f6065bbdb28a591af35ed78ada35..484bc0a449bb2ee813fad5180a1f74d368d75e2e 100644 GIT binary patch literal 326320 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
J{5A+Or%h3!A}p2lZ<#(PI-dV43!_B?rY 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 literal 191397 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%0Dj)^ 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༪-isS@vR}?nWow7Or%i7;$RX#dj>b`~=Fu%C4h#3H0 z8xNgckx2)D2!Mes?@~7J$%~g4UViE0M`YSc+{D_Y|LbaU5(K8&>tO0As)&loC~IVk zGEmDJ;AL{91u%eJEH>`Dz!4xWTVP&343+>+#=dza1cQt5w$~*9jDsaZ*}QC%#uCcS ziJkbgA5H|sJ0Qs7U@ZMN(mSaUc#8K}=NZ=%|NXGE0mb5sWdWKl9Fn`G_3yt2_5b{y zOrwr=!zgeW@rVGixcAnvB`94v3Fe7CU@Xok;EJH6oeo7h6+i0Og1a9UYwq|ZGE^XY zSFy#0cW^C<9a$sghas6c&=Ay&)jNB%HpXwD$7S4)}^}Cz(7L4|H%#T z-@YZqGa(dP^Lc>*dN<$Di4aM2S%?vk25a7K#@hTc&+sXbt!SS`DC8z;h94YQmO0pU zYtln#f(U~l00uS3Y4p6VNWF{IEr7kV-EF;OsuItQdU3=T{@IOszPTsjuV4MjH;(_w z|MsuTH}BlyKp6l;0F00n@J}2)e)PbxV+Wz03N)=YMa()lxGaYpq|Qy&;<$3>v&bIP z2-b}uWFJH%z)sI=U^SGXARrfk^{5C1DO4q%x2&gqXc_G1PRboY83+d*>iHv4EEetz z+M$?}Z6-@Z(weKo7Ch{h>KP{?@SG!;htIz*eg`!n+#ngqr=NwV1f($iA4LQ!M|MH! zxrd@)jR-~zmTeRpJsQT@NPVY4Af z23hzoy+c0|pwXeFAljwXV7`(+k1~0@u&trT8^B#=5JWratOFS!?3Lu78N(Awi=IOy9_PnOrF@<& z=O`$pTV}r*2KkRM1J67vdC6mhY>d0ujJi~0YD|bhaP5I4$GhHtTnjM+pwPzG^sa@)g`0P7ZKPHOGA1Gbh7)dthhHw24vGnL2x_&YBaVV2uIUw|U*m2W zPc1wm(5qj)Ct?~*@hj$39m^R?+q@_cs@Lm10q+R>4>FLFx8L)Ie>1T~mH_w0t|~Z> z9R~Z!<6vN#v?K(A>@G3Uj;0mukVd}H`RrvVT{#8y|My*}fB${(Z>}mKFzOsIoPp0r+*<_v&eJErdGxTdOW$u_ z(;o#Ac9@~!gv6COM)sTM{8&gpIUxzfnYu52sCVE7NkEzfh7;m~AVmeuM-GB{@i6dv z>tMZk6TG+YK=8pm@Pw^P%u%E!29iFN@b8;(Awxde=NVnTJO@zKsOeZV%GQvXMSkZD zt6>CsCXth4If5QGj&$4qG|uWPnYKoc2V5X2SZdil&jN^n4p*4f`iZsH z@S)S#s)K)R1-RT99{tJNwhe}546Q~UKOYHz0E6Tn0$3@cG{Art1)1>ke1CX#lqf8P zf5&;|xByNk!8)~9Ew=4yqoZUh1WOJI!-Tt~221vJ9tx<*NTp?|FW7+puDn)LrNBk) zFflWr9+Co_WtRwu`-j3&E$|PCE3{uH+~tn|;xO8=@-_i*-1l}`aRz=KVQVK#mH9MkY$XsyU5|+9;_c5R zrisB8s^C0#TKbRR`U9B};Qs6;xNqK6V73U-3;h$eryYh*8niz%LLCDZ)@hHB06@Z; z(eD2k69D;~g_ilxc~1y4y8=!EyF(xVQ1Dg8@RrdT3gi7p-5h+M>lgPd@LVy5TBvmP z=~4*LIqP{I5&-Xa0RE%{Km@=*+*rfM?pj#1zWRkPAA_yHNSKywv^Jz@8zE}ojHCMh zcpbEG1Oc|g*>)SPjYi8;FesPHL;V{FL73w*mclAYec+9QA3Aob65+`bNqtZ(^d3!Fmn?AWdq;xq*Zr zTQBv8vA^krJH_P?G-0qF^@&dF1%xTr=AlI}_df>q#Urr&7e58}jjIYgkv>3wKnjBa z+k(<_XJxuSwtth~+wPE-gk%-kuw%w{p!xv)aT|`6ws7bII`h_lhxW?SD^0_ocbK}K zKIe!Kz>Sh}81O}zFEzh8zq2$ka2{+ag?i(_f^0KrKXw>4{^frJ_eWR7I$;+FwD}m> zGmO3jz|?j3znx!aeb_?!o8uhf%REy*pWljvBz4O^Yh)UA)9}dInT1BrM#Qnj<-JWX z_RVz%)KLaN-7hw7!BVruO85EedF9{y=C2+6z5nKq-VpI~9uACvKM??Z!{=bn($d_A zue@*?wo~>0k#e$*sim0&K+t+_A`tYi-Un7t`@d4DH1wKy1lzXb$n<+p9NqpN{(O*v zgy}UBKihQ&RBM6h{;nr`GM8R>2+Gf#RKOpD_;igwkJ&AfJ@`J0wF;2s4Zy-SP&{7q zI;cQDYZ9eCpSJ`btkIV{q1N6l7y)SR+99BvK>!pI0e;X5lEPlQrT|7WUwssA-&iD zY`8s8;hlalGTTH4f}Hl82B6WU$kLur`FREu5rB4F51L&x(w~p_#0}@b*w!2O@`fDg z%NmbCXRPgbq*KA;0*Vc-3ZD3vC&=LJY#J8&bsm17HH01^)^)~6329RNPh*Nui?I3N z`U)8P=Q}$;{1KK_Ni8F{xO2uiy5Z*Yts-`R?c=Xp_=A7;$Nw%BKgTn;X~Gi$u;b~I z37Z|;S)7@je+Uvi<#|$2ssm8b=IY!a)oU8$&LskuQ3rU@E<2{@k0d4$fq~;V5MXcY zE68KvR5cIOE77OAy z*U-j80)nTAoCXQ zYx!B0s(lYQH!6dP+J8nZ-lEon@z0bxF|M#{Pd^l#ZWEfg);QV1`)UKo668pVlxai{ z#oe1hw$SZsAR&#t$i=*tqIPbx8w;0ZD2h zvrzunIdGmjuF}u5RQ>VRV$g(+z8t1}_iU|HWO>2FO8R8M|hn^6DdCUpyx6YuKqF zYam#~ltsG-(bcHdbVqgLTsyFvBrSMo)6rU#BE0fmVsvlO#v{OnegrdMVyzRo)XDJl zN;^id=>;%~&LbRnmo6ks0ndW&j~1%`7zzm+34VTC*h@qvr7}xcTHA%CN?};C(@YB7 zG)OV=xj~qLmMqobiWopGgpvjJnf<_U?bALJfHh;sT+OLt*{7OJNtU-W0apYpNdOGP zCyIG-VZ%mN zk0Ol{cWdy-Q~_Xc>56e-%1+N%0)NOZd78L;*(3v`{|KLL1Hnke zyBvlIo3Z}TTxG&wXOWS_is_P~JUSwJJc#V?$IpETqLc{!N3#2$=iG69l9?i*JsAT$ zuNY~7AfK~9iMD3F1+xq=6DtV1pEuWI(*`ppc;55X(XplHY`bX^P#eHu8WLZt0bkvg z?Q=T=>M#Q!y@@&MA+?w4VMZG7NN$uI=j72thn=_H{dp}m<>RVWoqFd?wb4;w>JEqi zQ>?Dv`SoufgL<7MoS4}rxZ;{zT9%S|I_(NmJ8!JY^hOy#jK~RKz)~tXh1?k>2v{mM zklHEPAV3qdO{jeIVVM2KvtS1l2D*32fJl1Wq(!go-B?@+XeN z%-5a)^I&MhLFzu@s9H)K2=6t6F2O+N|*gaI~^gm@nsJF$Ka@Wz|Z zC$WIwIi0lIG_H?p_T2NYz2r-VL?nrL zgWq0jvq72i_vNBn88fw3*K%|sz>UL7wJPw~QOMtGjf^b98*~f08cK@}fB=NnnUkl^ zw6w=-)T43zV#bW_e=>DB&AOtqxV5STxCHPGIHuJNzcveZ{!IaXc_AQ^Ni6`^bCcJ~ zN4NW*CLD6L1+1wybSRQ$Up^YvRr;;Ahqe7!_lV4{0ZGOC%!L?t{DbM{M!5n^vIUxH zv=3k#3hO4oJSxw-YNs@<58x@ga-KW}=Ds=D{Ief|k1f<}bGn0`aEGY$;fJB}@pEAd zBCqv5Qiw4uz38~v71s0zflBqKk$H=FxMRrtSdiWcqy-s7u_OTM6trtLOvBWV02mqG zG{6Uc@+R!GI3^lH2ydCp)(Y;dgK=_Cvr@jj15xYjdc7E^EQ_qUDm%-wwpgZl`h>t^ z06!pb-=n{zThJ3^W+6zkW@qNkCU;M`V%LnU4gg%kCmphEL5g)1*Wg~g4}QHael(he z6c=r*{pSVUCrpzyOeF{yKL=BQI?EhAM}}lbN75k_=`xS+ftg>v0=58^jaH87Q8raS z)fuOA!V_15L-Gg$T8rbiCfY?#>t$r!L?l^ohkCY+W`y`0^XP7v{d>=V^UR4*ZGB2_ zb|@@Ye)$nu^Dn`Fme3!PS7^hs=X>YR<8GM2G1PlHInPVd08w^;8?^T$K}zRBtaHJ3 zC<16u%%xMXZHrjpTkvn!z1DRn+kV*m>>LsR0krD1rMm&pVio63=oVxGf7Xc%@cqCnInF~ZziDO& z0CJr!EA=uG(1{ie4CFRz;NIJSK<*@uMu@LeDHYzTNNNyZ7C&5VAOIj zvn^n_LvNoy0M*Yw4s7>~VoG^NFd$XyEv1^=!I|^8>N1V?Lw1V*r7+z#BOojbz%mPL zv9?|dJ2S-Ig93pwWvG7P2{7iXu>BW5Rq2n@6u9H{ihGFJE2S6Dw2F~7Y}gJ(iJ-lG z%H4iw-K8Enbe_;yBI~l!nPT{?HtN(;O}Bu~(4_5Op&W=R1>lpio{jT$^kR$TN`^Ot zpAPPCHrf?;v?&$}L>IjXVJ8~Y=8`429T_AMyW2ajGoFiNqvgEW5r&m)24&!`Y_06NvNoZ?A`GougUU>=Cy8%M&ik|^^ffSFSJ;E;#e z84YFekw@ke_F&r7R-{{W;aZ2v?hiI;_g^>QOV6WmFD52BoeFV0+JG3U8DZC!wJqSQ zTity&{zGrmmRo+? zVtU4eS^bD*&vHL`)gtKjQ7B~F8%-)1_Ny97 zHdj`J%%m?}!j3B+JqzUzKdct`laU77Vf4#@m}1Q3gONP|_hq zl4Yd-2T=!r*w0J@f;(%nwsY8lU6gWf6(;=G!S{8m!5`7UdxJq;RL?Ah(mwT=0{3a) zgQkZdbD`Yc!Sh%>d!T9CpfMY0yRzoo^E=$muu}knTFlN!zt0Q6xpWj}zVsv*i&fzD z$;|{n+jE{h1?7*OZ!J5C#QyL;*+%2>h!~`+yoa9dsY!8_4r7$9YR4*|n*ai!Gr1g_zmW)_CN4?pC*^GaD2a63 z@g;XMG^8iHwybXFSU*D@qf)_T0J4R0&h_3j=BkzIambeeKvqTsz>e=pVB6N|7N=&m z(*V$v0pO{+TfCn2T0Vww0K;}{ErS*wXatbO^D#Js@(X7a_{ZU=(xs89MNnC?+S{A2 zBXF9)!BwAiXsZptRR#cpT*qqtS=|Ne%s!a;;*-E;%Nf9Hj0bkD*uNk}|6s1%TD~H8 z{>!Z-YJy;)I?+)t6Y`s0tBy^uz74@qq_glmJnZIK+Wcy*V+2J7@ z1{}+_>N$4RB>`YUp#TO?5wnr~E}a0R@G>}t!H%W~fb<3~WdaZZuwzq{hO>Kd7n`4( zKh{zcX|@5`Ixqn3c6H*{AkH6yI=;R=^z?sRl+!Kuw7}Z}{0Cec`dmIE_XB2%Sl*MGE+P7*F&d$4MTx&Uc$K>5slu+Hv>>Sr$ltJsQA822F- za3-#``pN|`4((FHl?gjW!M}EyBF3sRsWaVHIEtDvmg)iqR|S>pTytPv8&u$6=> z<+AWan$0^A=mxqhJ|Pe^&h7*I)$=MfI(=?-nD+0qY4OLy{=w9ytFULt-8Smz zH(4D5#N4zmAA!oNj{?J;@o`syM!k>cPJ{L6VG(?|t@i;l0_?1vf3CbKWhW|)u9Ju7#JXQ&l#v>6 z5+)v+DPfF%Z&Q}yb+;3y;?8!Y{HSnCJuIv2cDh@2c=6fi_dfFQg?Y$s^~VVO69KSO z$Q-@)&zw4a*q)uQK#*c(Eltz^S(~hvbZ>ImCS+S4!zuxYRQ4^~)-GHQbP}OK@PBv_ z>`y?BZybjJ@8*$R zQ2y}Q*870|2Zbx!?KJp&%rq;;d%m@TB$nOfLcI2`-lq-#MF(%ppxyu6;D?R1K;9HA zl@0&t)279624?vp0Z@0lV_$p*C^qdBSO$RWQ7vbuAK!z$`}glYa`4a|d=-l@XptfU zU`L=o>*xMVrFuwAjG2tpxOJZBvir}nL1OZ?`2T|~;T(o1#DW24Nu#!Z3IE}1l4ggX zXTAdFYmX?99|!;Oonzb?ZUdUAy`N^WjTdC6^7F8^Z8oOi5MO{j4&{%X1N+jERuX7T z0#{}kPv>MWz0nzH59h-Jl`$vY&v`%{0fyw``F0)ndMzI~!3`$MC>FcTyBJ=0>B;ulT}-OD|0c{)QJUa58@6@YXmcHdzykWV z{nG~g2TCN)difj}hZb9f(u{c8f7b5@1e$amQC3FQgTpB|Us7y4PyP=2mg=V-1MB2o z6$p+~;EJmMPo4nl)ZSJWA8mNHlo-KfkaVu`iRefw7Xc9+9G!RNrwE^sU zu6ktvG_)7Go;wRO-uy;Hj#>aj0t^H3F$nIgEC1c;nIuX83LdpkP`RTG$xZ-^!rbB+ z0CBKSLV!d7^!M;__xjNOg9lpJvv$3Zbrb-Mgq@OEoxp1@`1dz~4XLj)?*3yP9@i{F z3v}6ObUiR0+6&h6r&?Py;+Hdy5{%1O6y>fz?U;@U?&8^*0Fm-8mUmdGav}uN$CjY{ ziSsh0UVC9jO#Mef{?bt}5ARkBc>Fps?LTX0f%En)6o~{F?)ha20J=d^D@Lj^yQ%{K z1?R;DZPA7UjU9wTV^|6h@Ekj!pzq!$&-tFzdJs@4z%W=DMF4bbtrtBM%mOG<>m_#v z0N}nqd+5Z;C7@j}A^?U!3Itc4czV}M&py8d+qKrfeVnL`mfagB)i(Lc=1?X(?*1bI zpxwG8RcAHu6`lZ0yQ*M*%SpSUprEkjf#7pU6UC+>!2bi_8#Mx; z!&sN|25nUPKV2i35)r`Eb#k4AnJ38ipb%iLbr#=JGPCu~Mme^4+Yt9K<@FGug< z!pQ}xwHp1HjU&NKGF*QF|!1LpvhWATX>lIPYn53 zlK|5EvIs;}&3DDK-Ew11NCRLCRj7RO5m^79{#v%a(JwOMz-CHNdirFlg9TS)R@ut@ z9aZ-~LAK1okeubZWzG9g#4TV(21w0F{}<2GfB(J;9W(a>%9#yG1IUU85wOr84L;|wBu`$V|ES^gq>7pW)2Iyfg7iM5Kd_J2Zl zED-ctw$-?%z7OHl%ssPE{m8?uWhD4=#%_xKr2&)g6ZoG5n~DTE)4oHt2XvGuVEj3| zo>bK@J$n*(UBm1TkAr>TAh3l>^19FmAZRp<7Q2<@5aVjgIFE(@mxpDF!-^e-S{u3@ zR`X!-Lw+t(MCFj`do%l^hb1S8HB6jOaBCI(8!N3@D>U*&7r2x4ptj?bZp>CAk3WTm zleY~ZV|w9#mS2=miobfc`B+T)hxIK0RMO`&t?Y)W|#Jx zMoXLaEG0C`DFMm==tc&_O8^4SgGDf5KH-eprYC8-RP&5;LnZvX8w0KDM6isi|2nq) z>;JkOSqjkCb%ph94}yDNtSIFV70bm ze?@Korg-#XGumvn@ZQdacfL;20vN14NxiRb&qu}}=FnP$_hcKm9?j)=pJndz1Fr&l z%VO#ju1!72&pU!$3%eFuVkiUjwXrPTE1muyrUYRJfI%)ExLcv4@ZUftjbTE$RPN8G zxjs1O4}g97XshzMO#Lrq+m+1V7*jSJ?aNTRo@%!=Jfa;`{8@(sf1ccJHC3w`(`dHh z9M=We3$isHoQMdDeP29(W3dXQ4?nCJdR=Pg>ps{g_R6f5mS7IgGXubkMPSE55Et29 zk@gnNp=d5xDoa5645Jf+*5*EE3D`#M|KitQ_oVIwcRdmS?A3N6@V~=(ie+l1E^Ys4 zjDAdm2w)cySetgu6F~rA#&2H1?=S`_+U3i2C&#%mV}5CIsRF(4z)t0&MwD_sgW&UX z^Umupzq$vu{bWofgRu;A3pDKk*phOrdawrf*9RKdA^69-tx08WZQE8UnLD{YpMxO) ze(8lXvR*m?=<(y`oHm^$#;`|v*n3$4_88C~kgY|%o#UiH^Yh2Zr}GZab|xwXh}noI z!1jeh;5>3Tw@B2`FG1L`b#^~6Y-Jd~7W9vmjNO0GfA?Re-{q5hcAMkvLW@+8 z+j8XnOxC0Q8%=EiNxHQo+*oG8ZDz0)+*kqs`h()rLC0mFX2Q)?2(GU5<@Qhk9oy*A zpg{w&+vn2gd2Qoc0>^CE^OXUVG$4KJem*}M`0(uGPaUvS$`q9VbX%tA7GxSoi!73D z+ts<5ndO#UtafRaT!X7>7vQC808kNBUe^GoimZ_@l_q~7LP0>w0$Ut)*Ue7^;BB5O zLHVV#t-GISOH~KLUOpM%a9n^tYgHESIs;ku_j#L}$n%~Hs@Mh!SC2vV1nz_|E2A|a zg6OIZun}9dYaW=#m%zDr6l(v^&jdIt@VvbMto`#~?3qnm!LBOsntY z5Tj>+^Av+p^sA_OfM0uIoj%?M9(L-;ve&45jD_v84Avm9nkoIPDee`$=Dp1U{45sw ze%{a!;H?=A_}-e^>`oC|Gu$6tqh07;!2hi^@P2qr5n=}0aRz{_`={GJ-JsX?^NFzQ zW+&}p(5&^`%?I#M5YPw=+PduXxo`of`GYNBd*-^gCB?SHMe60_-*r96brNE2TbP~O z&lm}&5CPDmtLkJ{rfF6MuuT#GJVpR;ozQ>#$>F25TAeij2zJS*kq z>!U{T5z8A6_plcD+y@gVE2gg@)-EjTGMDESQQhgm$g;13JLU!IoV)r{af+2n<&ZEv zJZY~}1gbY!BLYAdQb5Y&iN(0goYFFQZVL3U)*V}}%ju^l5pM;T;{16;0Q3>8Ao!2B z{hJ2WR=h^cG_oBV>WR{jHt)w8>3#FyTs+e1f)FI(4sXV$sH_dw_!lXlhbKM_lTkLoz!cns1FGY@g;BA;@H%?~^1bxcr+s6Dsm~%iC!rgFtB`!ey`5 zoA*R~pDk9Q{M;$n{L}9jQ=^T2nrBL29o?PGREb0kjn+0oT54H@_5K|Pmh2!2m>fy zZJ3z$FTnqgt|}Yp<96X1DhU9(tAzihASaIz-s5o65X%7IUEj;S{ObV^H$<30vtx(O zMV6ED^;#}K-B??Sib0u*G344LV`Sd(gv+J!0oDwjSjIthBvVcR^y)bp~5%c}nm!hkaVL(EQ;ZN@nC6R{xI8}0s2Tg#S`%mVPbtJI1ByY$ovU`sP9 z*p5FNbZllukMtnWS_QbFh~CK#dFa4VKofTu{n&0lqyT>A>)2xCrHZKI83B%|(#_3I zDQisroG~5>4{3UD5%gIZex>4w`xqosCJ|>patLaF^DYFp3ux1Z8RHcj%!7+b^?1Cs zc9uvg*UzTAfq%T;>%#YYUekxNE=vjPV#|pLIEOEf0JtBL0=RX9Kr7UTrSQF~Ht zTr0~TQue4}gQWnJ1<(gJz!HG9T0T5-$>#V&TUM`m_V3@lS_K~~BNe7C9HS1ARiw0lY>f7v5sd$ow|2nU`iu~Bx-fE`U zrVYsTz&x}Itn-IjMZgfSNtN`Bpj_wF|4!gPVvG?uZMv$DYdr0Hr*ns87g#BygJhOBqDpA3Vi%mDRtCeBzrqKlBj5RY{B;f^3J51N~N0}^9 zFYM^wMpg{(JO`pI0R-;|K8=tJD}`+`qfRyLGGrogSp41iwTXG;{oQr&Z$6;i|2*LT zhu0Lr*>BoD0|Ngv5^DinWBTo?Eg;R4ojDlPmEarOIkSGl^+XC*vqH{Su5oS-0zzqX z?Jt!|M%}IV@CT+dD}YJ>@&P>drB8ism)!k{2eAelFEJ7sP^P{og41B5CLL-Y1prXO zwtt2(l>`6|YzycKknegKf`B|E2`(H2rIkh^+FJaQ9pGZ;#Tsv*=<3*tQCe zf_v-0SGOQo7yeY(J>RTBfWIs2>Vsx>gaC|&@E6PqTlk6Ri5V35T$y9bEEastst&N( zvg!&F@MOtMr#XN>-}2NEWyWBc4BCVwhcbu&6j_o17K;&h;#+TAgJ7*D&yhwp_>XG- zWd=pRX~~%QV^}1(NF%nE<`e+dZ9}Su^N~V_J)V0*(3Iv%kLw-C%|MQ%cAgC;yuC%Y zf0YD4J|Vzzxia^qPk(mdpZ}|Wu|W@;2!Oua7sxDU!~DqeFCG9tr702BA-5E`YD@s| zSdfQ+9a{j_{k{SY)3m^z(%t_ihA_Y>IRZ;&2m;C$X){o|d^DN*FKeXDwry6pA80u( zq(XWp<{j&W@$iCHFrN+%;!5XOmnMFXBhwsDCC64~Wd(@j{fdZ@paUrYVL$U)ST`1t zEG_Ys+PUQ(*Kgv=YYf6&^pxM3u~mQZh8Um^#{NZc&g_G&n-7rVhmo=M!WK+a|4*bm z^QK^3OGgW?lR0Oo;fJQMUdyiKmcZYV_UgTP6TF|_0sqzm2v!96U)_?ml{{+i84rS^ zl7O&-h-&W^+wr$e0kmzobI&S{A^>JeQdp7gssh_PE4wUU7m=i9Mh8+1e=bP~JZDc4 z7Lm`1vSaYr@Dw2y{hoM_|G_=*-oB+zt*vfNo#HkBwf@0Bhi2_R4H`Ql3)u9W55}85 zcFiID-}}7_d29&-I3Maopb<* z0LToPvcR1&H#@gC8OZYX4o(Nt%G%N5VFo}HU*Md^I-r~_SlW$psVr09`4rD7T#RHE zfbBu8UP}@xSe|=&85n}3c#mxsD!UsQwg0}a=Ok$d{-ZQv1Wj9Bwhcz<(Y~tZ!uFHy zd-uSLxFVJ(_8=|b4dXqY_Vlx+PM`0O-R-fMr8=tIuC7p)=|5) zEo$xf*}N&Xq?29AjS=3uyDn?Jy<~q}9)SJWVW@xqeF)aKLzVbZ5CBZ638#U6)XGk0 z4GU&u*XJW>-b{i2kg($7XZ62%3*7(jJ@D_Y3m>|z$hxR~AeNUPS=H&eB4JpqCjCT2 z1h`m_FXqwxZ6$Vv@4@F?wt<%|;EUq-4le?T1Ls47WQgoP2wFcg`nNF;#dXh#bKEnd z$hvE5DW`6O|C3wb-&~dCTj9?MuWP-Y^ed?M0qM53ql%m|YW@chfS8s^ZU1Pb)_|NF z0USWjUVz;}8|-ki17ps5-R-WwL?e0MY99CxHlVas2LrRrI>kNs2yG2A0Hg*$4to-d z`rMqrYuSBySZu)vrkxBR0w8CUSgllcw+6oL%tu3e;?SD@F9In93f$Wn*hJ8ass9+X za3a*?z$^eP14v{;I2M$iI+-ny=9n4wqG|2F(GL8F%Kn%xUC$ts@b?gS3!s630#(K9 zKe-Np08h;h0700|mm!+QoA!o3_ujtU$Q&?sRpqX?b^aij`xk)CmDPPt2NakI;0sWU zKSwZ?p@o6qjr&}`iJO(?h|d85P|a)pOx%0(_>xrPufK6^WTz)f0QSx$%{Z!w&kFXq zUKs$H1G7gW0wtzf;l6zfw*Tyh;NN%GgpC z+kreLydH7gi4GICxH}8w&{vMorUqT}5787ifOP+9w2WTBv7u2GKo1!J{bW00#*DA& zhKaTW0P^yiHPzi^zS5-?U|2?0^g5llBvu580s?G z+5Oj1C9RE0dIbKllSEdE76Kyy$ld>+y*FWUB)QH6pT~hS@4BnHy86B;QWQx^D``ff zku=iS?9Q6)HUDtT)@E(jWFwhT8i^7`4K*S~k$th7eO1?etzy2bxh39JdL6rZGk>-EMu5+y+f@eibOmQ+A#sc73Uuca#UJ=(H#KVOIlZ-H7 z=Gn#14k7&N`Fz?+8tpMnSo2RZZA)nueaUYZJVRaHIlxY_9fgrp*tgR4E6;I{=yM^U z8Yg!1Omg-modA+<2(C{1X5XEEoRezcjB82AjA^4@zYOEA7?InhrjFRteK;7<|2HNY zYo2#0m%YNTY5lTk!LO=4RjL%7Z8?=P0D{R&0C@JF1^;M#ZSY^7mwsD7X0U4Cc~NAE zvP=uiE+Vy76(AW%XCv;A%s(RU`yE;D4|$b;--GzkK6L-?Q!XY(*@43Y#c2i=8So(Z zz?NiaiAqiA_#YnAVdL3_MUfRojsQ}`zmxHpivWh zLC4W%*VX;!uYlOLe}zb6!kT~lIcC`QIs==ZvZ&CUIqfig2t9^mo<<8z6yLXrEEODcU#XssF@C7V8o?j2GweK9?Xt5l2@>mz>OLA= z*I06S+8dMyk9t0?1oV?RnWwa?P9)pWj(pA(f%Oys7}nX%jwJ;E&ax037U*6n{TY>^ zrPN>%z(iy?GY|(o4)_5xsZ;AQr?s}^!hfTjdjtVa50AmSwhrD4TV;cV^Q|&u2BQ6B zs7iVwGNq}4FUzTCvpQw@KZp8wh%;&7i7%c`s@peC?{oohP5`1wl1X!KWu zIkGHbsTJXm1HzC^#p5+A3}FF)^8*2KoUn7ixm0o%O*J&iU`=IX2_)U#nFLr;>c1W8 z;WMYsWAp31bAzjRmjZhf|5Mfe8waS6;eo(OuiQIaDvNjj?lb8A)yI5oU8sl{2Jk49 z)(xQZ{f~g|oL`)^){ z?higab9v7sJ|~s{D6MPd%mWd$?zFZ)GtWGrovQZ=K!eo6QO9s*j>6`_c z^WT33;ipeT4{j_GXw@P3raAS-7RD)dSO8#>C8j#2>3{g6 zKUrl9s#)3)%6`4ntUJkGR@TO1`zsdwClmHB=Gt|Qx?L^f4zw@=@75N3ZHf$A_F!!J z%4bAPqZ$rV{YN8w6qHrp*#Xh}?_WUYzx`4KGX^*!q~`Lrc%46gUu4M(?HT(m0u?f# z#Iyibg@EIF!Ypp~zVLV2HPL!<#`cJ3TaW>e>Y)&l(HkN8dRv;91(1?aAWOc~f@k4o z$fQ630I9~4fB*@bPcAk($(&+VPJ)lUpWla*?|%TN?A86p&mnrW%e!-6X2{ZLpA<$cz(=lnjsZa?7u4E?PnIoz*agnZ>IY*WdZ14CV?o7xY+2KTp1!X zGl;DD@BY&laQf%JfOz}ZD*y9E?Qrc9F8GIRCtD7&+>SCk3+7hx7>#J>S@1iEV~_}- zqv<2#txfBULIG6Iv(cUAT=6!5k%sO_zXV`Thj_})(*eVnZ@RU)RsZ$(zKN~dZEFY% z0E}E#6h<$9dTDFxGM9vff^SFw%vQP1Tog^po4*_Jm+pb#Izsr*WJ7bdKg022d6_V9h-TluT0(cL*88r7|`nk8pswnOWA-D2w?kxcfUYqFtPQs=c@T%Mh_}&b7-KwoR*>BZ5kb$ z__#1zd`_^&u}LZ|9}gJ-R7V3$is8<6q|8F1v6xt(vbnLb0eak$r44B8$)+&}?N)13 zaOMk3##j+R#e1>hcTfaGmjQs;|9Z`~{nG^i)|)_XZxjFkDuPeNx}l~y-b&;i+ggQ! zNm3}7>Hg?5h#&2V47-T~K?-)*b${>)P|Q|m4>O$lVZo1)bV8~OT5`ZkB0wnb#m(`m zxzn^em9A^X{fPiwaqSTBF0bTEd1m3?$e>=wzJ@`_Sp!oK5ZWg$k&0N`~0e76N> zbA^{w&>5Cfa27xq3R?d-pdbvagFEeEYyS1uDpKO{ANyGPa|*D_UOOG}Z~ThiV~bcG zU@S^EE;5%=0Nyu3H$jkI8#Q9Ol>F3 zL*tgcs+AZ%vsy;q03Xvy0PfZbIPLmu*VrO~f_N+Ijr^nr97+(7n&-IR_b2QRYae^9eXf>WG|JID2fOcr5Q#k-FZXdFiWdtq>eU7lNE-;A zvTV~xr0gvFH%pzufxRDONbFf!h*gXM7g`>@5sBZp={mMqDs$wv+Po>)Yq4eueM8Uz z1*RNcWsw-uc0^U-0vr3^Md7wBm@W4MpL``mh>l{3Fra{QU-NZr{8%>cqsq>0pPQy% z{j9Ww9^>ljm!zk1yLjH}QH5)hpSV0@6}T;i2&`@RQ#f!J&Kaf`!-BwPJJ=hGIF#EL zmc3IEM3Q88nq@-~0NgT*&rWY;CAt~CEvX&6M?u^&A|4-5f;lld>yX3oCU}k2j_@eT1q?VO04@!76`WwBn~-rZ)$yL!Dy6yScLDg{ zZ+KmeDyL#6xcX5g?jRs-RS|hHm!2zU|9v-ffncbE3?JB4e|zaM5z!ZeMokk=jN%5=T9L=Z;-L#6J{nRO5SX((u+UsxTsR+R48-Q4e z;04UQ;RK7YmF!kVMNE9S0FoXAAbqF60QWD@2KVt8BZI`JFm@`S{33FM2^gZ`YI(`w zAgSWU?jv@zaD{A)%MarpjEt5vwf`tSuQP)tZLAFKx+>(bDb@VU-m)uy|CdnFQVMI! z0N>s*&Zx^9zweF+sEaYbf-3+p15B$N(jQn!`y0%gw=RJ(t`!>%Oc`HUkk38Uw{-FP zQ?*OmWr~B$oFQ()V-eDiSlrr|Z`@&b$-SWC@M{96$F*G89F4rT?<*M400ebgV0x1F zhj*BRQPWf{yX#4f49t|@pfClEV3(AAmcl|WZ#GHiAJn+tOwhiAD~;Ycg{CI`L7V_T z(h&Xy6S3esWF|@ou#pbK$L&W@ywm5TE6qOzb>?2?(q%mt)#YC~_}mpc*4!UXn*UR9 zy0<6ClJQ1sEqqNNysvT&QuV=+Gf0uCo*C~ktvl`CyMa6qP}EJ;k1PQ4F8^2&uuOd3 zf(dI(nl$^A{*gV!OzDGaqeeo1|Cuo9;*2@hKgQKi0`$MpnUO9G*>->Kq4Y5_p59;W z!T5064gQKAZ?*m{8%En@nj1<$z*|FBSpC$do`>oAqv>X^voiF*c`u->CrUrZeM9T2 zc( zC!PSnSwVF#*>b#&!K4PpSdM8vv~L`6O>`EI7jkwnkmK!{=fN1Hf-(9s-S2qy{58uE z6%A%Me~^x6L`B@)HiyugeS-QE_-Z@+wAdg!&r4xe1>n`qVl-3`iiunQ8W{}h%{UHu^!1KrRi^|eEqty`=3wY-f51FL4~pr zXRo!|HDPb3H&+eM#64T^fAsR&fvk#1Vwqo~TWw$U^;ZA0d{g@dm(?CLaj%Z(?Hy%- zlL_B-7KXM>oUnWyyKP83P;q~j@9c%o5i@(7HT0D^jSLt)+y6#Y1OhxfD{_f((iJwf>)$k~>a?l$Em^6L%Lg19 z=B8grA7{*yWORQG+#L$QfK5H+jH22<>#AeV0^BCO?Y(DBJzst=D0hvX4RyL-qIU{8 zda6pO#e9RpVGFJxKFx<+Iu$~2y6ktUcJV16-m&mv#{+Qs8JtJ=Npxy(5D7ho@Zv*w z=I_D#((IGT%O}17JiT1wXV)*fc|R8|--jKsf`h+rS205j<(w1{ky;9!pRZ1*L{6BC zYIz33+}(YvKQQHEOdadB0*FD@!0QjKw4Yje1D|5}8S%XT((^_%nC-40*#%@&JO6$> zAcqL36YuE&PoI_M+%qj;kel-h)SxXFH*Dt`7oKIVI$j>wGLc)-j)Jje!wH*DyD%^y zJ3h(V?wc2`5;43De*oc!o{vyZx*fMvy=#QA2Y86WTn{&BT9i#V!VcY3mkAxHtS!?< z4Z3bzo{Q=eR&rk5G#ZFj9BTk>jO}r?No2G%KYuA?Dv4D~2=`nhT1}z~U^h2#=_o>s zYd@xrR<3e8_28#ukBzpt3Ul|~OW{aNwAu?haWbrP{-cC%Qd;2h2SVwz2#^z>wjFPQ zh@{G0PW%^kKW;yPqdrryVuE;5T0)29)|%LOo(zHH?Flb05|WY9AcvBgsDB zV`bxyGkZv~s;L%Xt3?n%PYOF-=~*>%u5Fu8;KowPsIU1wkT9%2txMh-!GktKHuj+v z4b%Tzh1dOB3*Y{DQSHEDkCO3jrNqJth%o4(tK7?sh&0T3k8;>50OYS$yD^Lq%#I&T4wGqn(iuB zE7jA_j{xn~YdVvK^hCVh@XOMitD}AIV7Zmj07SCY1vAm=d1E3lXaLw=w$TRZ%`7-4E!Q8X9mg_|F3qm^c z5CC$*3ckQCX&J}&{!lPhBO^buG5+9;vO1_r5FZWd|{>}AcYN#r}( zUxi&sMv}v?$msuK%);dJE{)ksbs((A;a>Rrhiwdb~u z2J>aQ^~#uVvO1attFfr?d0e!H3_m|&f~hA}UP~CsnM+NLrqy%!tdG`$8QeYz{Ts4d zEKTXRT+>##)Ow09Oib7A$gdYo{kc>=nAtwBXgh~TL9XxldhSwp5kyI-FhQh>&2+b4 zXx;1SJaz^GlbIC`_d#y04L1~WaTTMsD#v?bBW>tZnU%?l;1_B5Mi8o_NsO}p35R#YH7w4K$PEFP$yns$Jh6g!|3`hV1$=w0IbqppZI zgWpK|+;)P4CVsQIS#Aq$x@+#;s|Tq4@G9-=N%;agdiM2`!iX#-sKa9RTv~C*Ig0;a8V9I^LXh5ptU4K(FoVqZ zufULHz~R=vLX-FT(h>?yz59v!Y435=r|PH^T8$wSfocs29YBQ>!t_9mo1KqA?7_&B z-oDcxfJ{>SqRg%2z<<}cg$E$c%2f16jNfHnbx#m2hPIo!d-63KGX-)u{dRnqUlb4-R9` z#WS;cs3bQ~)JU%Xb@V!fk#6^g!H_mF0RRXBu;G7$G%eY4^*pG}r%sQ&68B!#TjnY+ zV}$ydX`0_~&|}w>$_^~GI|diK;~VFhBhPcA2-}X1K~#~~^R$_LqBtOJY|z#Vg4)aA zsaFuy&WIPmHAUrA3rx9{*F$=h=%shregR_P-vNNivE;o<6v`5UMjnl!@CCVJ{g&v-+J46oHv*7E>CbX6OK2h<{^-N9!mx@cehc zOk_CJJ!Sqkxl5Zl86cG^y-T@2ZHMFzYalwA8)Nch{quMSa)Smf+Vc@*d}~Ci;)0$O ze2|Uf)B$~_qAR>AniT-$OO*E8Zges^x-+(IzX!w@w-Inux3?c4sXOP&k`{p?oh3xn zw$&1wz5CL!mb#3ZSpP#`+3SsWxZXAiUV~tV{f+jwi)TP3j92k&o=-)F-tKtvilF@# zbh3-?=A=pGv=0Cee(oYThz#2(}00s7A2ZAnK$&-yvJ z4qlJB@|Z41XF{YTr`%Fh^La?|nHuA8XvWh)DWRC<31gfG=!WEAzX&Uh;}aaVZqLsR z@3Z;{PflRR-OCV6tf`kw2g@3x0+QNX@L^1>CVjYwwm0Uhdpd}JfXIw-UxhWx>nx3z zMs?(;`S8vhP~VxiK%G)iJrh4$Rn>D;fR{2n&n?@RH7(wv?8p(S20gTy>Zm6sQkRR+ zWP(NN*hDv|kF+=8ehBZz@j+wsV+9khF2|lVRy>4ul0mM2hhY^bGeG!hpJJ?_>TE&E zmBy@vg6a4$Al@&Vo8F1QymDEAUk!f~!-O7>e5Ee<%`ELk8cr%W33T+%<(436TOvts zVr{`11U!`O1{Uyj?LJ?R3A*sMrhW&g52e_&d~g%S`j#k+?LA)1S#Hc)Cau-@fsF{4 z?XF^rfil72{ma#~H^ziypaza(CcS#0Xb50ok-!)OygmeXWou)ne8MKgTln}Ya601b zo#RH>wSnBjDFl!fh--$*#Fb5FOyk1kvf&g}sVxv|%N(~P6B&eq0!kpn&xpNlofH9U zaZ~+eQ%4Fo|N4A&!c*D(7Mkj@7IAWCsc`fA3P7397E#g9Kw9EXPjGf|>i2T!@q~TS zFqM5lS$z*0iyq!)lyr6gukiube5<{q+}B?d`+>yWjxLHg0DX8A0|m&40KfzCYzxH( z≤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
VeuU0Ei#%i#<O zt|)PuDV9Oyd5$hx;e-Qr1aQs>d}z-P3+Uao1~}_Ywb*p&yh|Y7I~L~}DYPFZWJ)5i zWW;yC*<3Wtnl0L|?I+$?Gb7jz-s0;~q4GbOcZmbeamoPDY1=wa20$9SczX6e4g&fY zKlrQ1AlTgr*kJ*Hb1pyln}7J>A#*zOr2>h;%Zn7OltY0VgaNB0~gFJ9`y18dh9))1%E5;I-LIS z6Nv6^iv#Z>veB`iJ-XM{q50ddf&bRca^RK7!0Y;oEYDDY!^Q~_Ddr!KH(W=Uan1gm zIgG*G=R&xrHisp{=FYpk${7Hls@G2Ew&(<5@FH8JxtCVJ-C_aGi_+zOUl9jnS-Qr*Zdd29IhdufdF7oyK}_r^k+s*mtbA8eawSk9cnR_n?&8fzypFn zw09)dOWm8y=14Y^d!5<2D{H*9Y4rGj?U4sS_fI$&fcqpl2{IZqPzVkS%r2ni@9E&# z;&qay&-WYFY7^f%Q?QnBu%pUR9$SA{UNTFc38x3=x~ba&P(G`9f?cGb4Zu-rD*YL~ z9-@oxg(7pr_YEl9L4U33>#xNqhPkE)acwDDG^<9h*WG9F+Ods5EC4WWS!=Io=8Sb9 zj<(r&9X4q^XUHU?%e4A z2=>$wc)`!li3d@^dckWw?g`z3^x8?`8AY_e7qFZLGwJ@FE0})cAVBctGhPdhec}7U zlTzn|0|KKQVOa{`I8$Jzq@4`doa5T_U%Lw4tu3g%%kIDC4?v9~0D^1qCR>BURIkqw z{7<9izyB^XTaUIOpsD`HKa^!T|GAtU3YE8G(VM-dFgjB+fPFd}0t0s
Nvf@==@wLO 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

G(=B%%8*?lc!rzcW@ys1IldD}H0m1u$0 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 Date: Thu, 25 Jan 2024 19:56:40 +0900 Subject: [PATCH 317/651] Update copyright years --- Directory.Build.props | 2 +- LICENCE | 2 +- Templates/osu.Game.Templates.csproj | 4 ++-- osu.Desktop/osu.nuspec | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 734374c840..b08283f071 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -35,7 +35,7 @@ https://github.com/ppy/osu Automated release. ppy Pty Ltd - Copyright (c) 2022 ppy Pty Ltd + Copyright (c) 2024 ppy Pty Ltd osu game diff --git a/LICENCE b/LICENCE index d3e7537cef..3bb8b62d5d 100644 --- a/LICENCE +++ b/LICENCE @@ -1,4 +1,4 @@ -Copyright (c) 2022 ppy Pty Ltd . +Copyright (c) 2024 ppy Pty Ltd . Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Templates/osu.Game.Templates.csproj b/Templates/osu.Game.Templates.csproj index b8c3ad373a..186a6093f5 100644 --- a/Templates/osu.Game.Templates.csproj +++ b/Templates/osu.Game.Templates.csproj @@ -1,4 +1,4 @@ - + Template ppy.osu.Game.Templates @@ -8,7 +8,7 @@ https://github.com/ppy/osu/blob/master/Templates https://github.com/ppy/osu Automated release. - Copyright (c) 2022 ppy Pty Ltd + Copyright (c) 2024 ppy Pty Ltd Templates to use when creating a ruleset for consumption in osu!. dotnet-new;templates;osu netstandard2.1 diff --git a/osu.Desktop/osu.nuspec b/osu.Desktop/osu.nuspec index db58c325bd..3dadc4e002 100644 --- a/osu.Desktop/osu.nuspec +++ b/osu.Desktop/osu.nuspec @@ -11,7 +11,7 @@ false A free-to-win rhythm game. Rhythm is just a *click* away! testing - Copyright (c) 2022 ppy Pty Ltd + Copyright (c) 2024 ppy Pty Ltd en-AU From 2941787f5eec8543f68bbc9be89ca69b118ad9c5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 20:35:33 +0900 Subject: [PATCH 318/651] Update windows logo --- osu.Desktop/lazer.ico | Bin 86650 -> 67263 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 osu.Desktop/lazer.ico diff --git a/osu.Desktop/lazer.ico b/osu.Desktop/lazer.ico old mode 100755 new mode 100644 index a6aa8abb9f3f10a2aac07c1168d9a2adb25ce1ea..5051c00ffc79eceac173442cd0466750d8e3aaa6 GIT binary patch literal 67263 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 From 5aa4235c3d3649f16b3319e12d14b4ebb83296b5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 21:02:22 +0900 Subject: [PATCH 319/651] Simplify `TaikoLegacyHitTarget` container hierarchy --- .../Skinning/Legacy/TaikoLegacyHitTarget.cs | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs b/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs index cf9d8dd52e..0b43f1c845 100644 --- a/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs +++ b/osu.Game.Rulesets.Taiko/Skinning/Legacy/TaikoLegacyHitTarget.cs @@ -17,30 +17,24 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy { RelativeSizeAxes = Axes.Both; - InternalChild = new Container + InternalChildren = new Drawable[] { - RelativeSizeAxes = Axes.Both, - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Children = new Drawable[] + new Sprite { - new Sprite - { - Texture = skin.GetTexture("approachcircle"), - Scale = new Vector2(0.83f), - Alpha = 0.47f, // eyeballed to match stable - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - }, - new Sprite - { - Texture = skin.GetTexture("taikobigcircle"), - Scale = new Vector2(0.8f), - Alpha = 0.22f, // eyeballed to match stable - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - }, - } + Texture = skin.GetTexture("approachcircle"), + Scale = new Vector2(0.83f), + Alpha = 0.47f, // eyeballed to match stable + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + }, + new Sprite + { + Texture = skin.GetTexture("taikobigcircle"), + Scale = new Vector2(0.8f), + Alpha = 0.22f, // eyeballed to match stable + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + }, }; } } From 6a338ce5551c9ce8de5af42a06886c7c951e2cbf Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 25 Jan 2024 21:59:38 +0900 Subject: [PATCH 320/651] Adjust spawn ratio up slightly --- osu.Game/Screens/Menu/OsuLogo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs index 624c78bdb8..a39d552a90 100644 --- a/osu.Game/Screens/Menu/OsuLogo.cs +++ b/osu.Game/Screens/Menu/OsuLogo.cs @@ -192,7 +192,7 @@ namespace osu.Game.Screens.Menu Origin = Anchor.Centre, Thickness = 0.009f, ScaleAdjust = 3, - SpawnRatio = 1.2f, + SpawnRatio = 1.4f, Colour = ColourInfo.GradientVertical(Color4Extensions.FromHex(@"ff66ab"), Color4Extensions.FromHex(@"b6346f")), RelativeSizeAxes = Axes.Both, }, From c35df0313f758c4747cbfe5f43e983511d005205 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 25 Jan 2024 16:31:12 +0300 Subject: [PATCH 321/651] Fix taiko playfield test scene --- .../Skinning/TestSceneTaikoPlayfield.cs | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneTaikoPlayfield.cs b/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneTaikoPlayfield.cs index c89e2b727b..d1a8a048ed 100644 --- a/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneTaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko.Tests/Skinning/TestSceneTaikoPlayfield.cs @@ -1,17 +1,19 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Extensions.IEnumerableExtensions; +using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Framework.Testing; using osu.Game.Beatmaps.ControlPoints; using osu.Game.Rulesets.Taiko.Beatmaps; using osu.Game.Rulesets.Taiko.UI; using osu.Game.Rulesets.UI.Scrolling; using osu.Game.Tests.Visual; +using osuTK; namespace osu.Game.Rulesets.Taiko.Tests.Skinning { @@ -37,11 +39,14 @@ namespace osu.Game.Rulesets.Taiko.Tests.Skinning Beatmap.Value.Track.Start(); }); - AddStep("Load playfield", () => SetContents(_ => new TaikoPlayfield + AddStep("Load playfield", () => SetContents(_ => new Container { - Height = 0.2f, Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, + RelativeSizeAxes = Axes.Both, + Size = new Vector2(2f, 1f), + Scale = new Vector2(0.5f), + Child = new TaikoPlayfieldAdjustmentContainer { Child = new TaikoPlayfield() }, })); } @@ -54,7 +59,20 @@ namespace osu.Game.Rulesets.Taiko.Tests.Skinning [Test] public void TestHeightChanges() { - AddRepeatStep("change height", () => this.ChildrenOfType().ForEach(p => p.Height = Math.Max(0.2f, (p.Height + 0.2f) % 1f)), 50); + int value = 0; + + AddRepeatStep("change height", () => + { + value = (value + 1) % 5; + + this.ChildrenOfType().ForEach(p => + { + var parent = (Container)p.Parent.AsNonNull(); + parent.Scale = new Vector2(0.5f + 0.1f * value); + parent.Width = 1f / parent.Scale.X; + parent.Height = 0.5f / parent.Scale.Y; + }); + }, 50); } [Test] From de52f0a80c088d6f6fb4bc8008a1f525d6783a9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 25 Jan 2024 12:25:27 +0100 Subject: [PATCH 322/651] Decouple notifications websocket handling from chat operations This is a prerequisite for https://github.com/ppy/osu/pull/25480. The `WebSocketNotificationsClient` was tightly coupled to chat specifics making it difficult to use in the second factor verification flow. This commit's goal is to separate the websocket connection and message handling concerns from specific chat logic concerns. --- .../Chat/TestSceneChannelManager.cs | 2 - osu.Game/Online/API/APIAccess.cs | 8 +- osu.Game/Online/API/DummyAPIAccess.cs | 8 +- osu.Game/Online/API/IAPIProvider.cs | 10 +- osu.Game/Online/Chat/ChannelManager.cs | 26 +-- osu.Game/Online/Chat/IChatClient.cs | 18 +++ osu.Game/Online/Chat/WebSocketChatClient.cs | 148 ++++++++++++++++++ .../NotificationsClientConnector.cs | 42 ----- .../WebSocket/DummyNotificationsClient.cs | 29 ++++ .../WebSocket/INotificationsClient.cs | 17 ++ .../WebSocket/WebSocketNotificationsClient.cs | 79 +--------- .../WebSocketNotificationsClientConnector.cs | 20 ++- .../PollingChatClient.cs} | 41 ++--- osu.Game/Tests/PollingChatClientConnector.cs | 48 ++++++ osu.Game/Tests/PollingNotificationsClient.cs | 35 ----- .../PollingNotificationsClientConnector.cs | 24 --- 16 files changed, 330 insertions(+), 225 deletions(-) create mode 100644 osu.Game/Online/Chat/IChatClient.cs create mode 100644 osu.Game/Online/Chat/WebSocketChatClient.cs delete mode 100644 osu.Game/Online/Notifications/NotificationsClientConnector.cs create mode 100644 osu.Game/Online/Notifications/WebSocket/DummyNotificationsClient.cs create mode 100644 osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs rename osu.Game/{Online/Notifications/NotificationsClient.cs => Tests/PollingChatClient.cs} (59%) create mode 100644 osu.Game/Tests/PollingChatClientConnector.cs delete mode 100644 osu.Game/Tests/PollingNotificationsClient.cs delete mode 100644 osu.Game/Tests/PollingNotificationsClientConnector.cs diff --git a/osu.Game.Tests/Chat/TestSceneChannelManager.cs b/osu.Game.Tests/Chat/TestSceneChannelManager.cs index eae12edebd..95fd2669e5 100644 --- a/osu.Game.Tests/Chat/TestSceneChannelManager.cs +++ b/osu.Game.Tests/Chat/TestSceneChannelManager.cs @@ -75,8 +75,6 @@ namespace osu.Game.Tests.Chat return false; }; }); - - AddUntilStep("wait for notifications client", () => channelManager.NotificationsConnected); } [Test] diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 17bf8bcc37..359c52553d 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -21,7 +21,7 @@ using osu.Game.Configuration; using osu.Game.Localisation; using osu.Game.Online.API.Requests; using osu.Game.Online.API.Requests.Responses; -using osu.Game.Online.Notifications; +using osu.Game.Online.Chat; using osu.Game.Online.Notifications.WebSocket; using osu.Game.Users; @@ -55,6 +55,8 @@ namespace osu.Game.Online.API public IBindable Activity => activity; public IBindable Statistics => statistics; + public INotificationsClient NotificationsClient { get; } + public Language Language => game.CurrentLanguage.Value; private Bindable localUser { get; } = new Bindable(createGuestUser()); @@ -82,6 +84,7 @@ namespace osu.Game.Online.API APIEndpointUrl = endpointConfiguration.APIEndpointUrl; WebsiteRootUrl = endpointConfiguration.WebsiteRootUrl; + NotificationsClient = new WebSocketNotificationsClientConnector(this); authentication = new OAuth(endpointConfiguration.APIClientID, endpointConfiguration.APIClientSecret, APIEndpointUrl); log = Logger.GetLogger(LoggingTarget.Network); @@ -324,8 +327,7 @@ namespace osu.Game.Online.API public IHubClientConnector GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => new HubClientConnector(clientName, endpoint, this, versionHash, preferMessagePack); - public NotificationsClientConnector GetNotificationsConnector() => - new WebSocketNotificationsClientConnector(this); + public IChatClient GetChatClient() => new WebSocketChatClient(this); public RegistrationRequest.RegistrationRequestErrors CreateAccount(string email, string username, string password) { diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index 4b4f8061e0..2d5852b209 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -8,7 +8,8 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Localisation; using osu.Game.Online.API.Requests.Responses; -using osu.Game.Online.Notifications; +using osu.Game.Online.Chat; +using osu.Game.Online.Notifications.WebSocket; using osu.Game.Tests; using osu.Game.Users; @@ -30,6 +31,9 @@ namespace osu.Game.Online.API public Bindable Statistics { get; } = new Bindable(); + public DummyNotificationsClient NotificationsClient { get; } = new DummyNotificationsClient(); + INotificationsClient IAPIProvider.NotificationsClient => NotificationsClient; + public Language Language => Language.en; public string AccessToken => "token"; @@ -144,7 +148,7 @@ namespace osu.Game.Online.API public IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null; - public NotificationsClientConnector GetNotificationsConnector() => new PollingNotificationsClientConnector(this); + public IChatClient GetChatClient() => new PollingChatClientConnector(this); public RegistrationRequest.RegistrationRequestErrors? CreateAccount(string email, string username, string password) { diff --git a/osu.Game/Online/API/IAPIProvider.cs b/osu.Game/Online/API/IAPIProvider.cs index b58d4a363a..ea4eb97ccb 100644 --- a/osu.Game/Online/API/IAPIProvider.cs +++ b/osu.Game/Online/API/IAPIProvider.cs @@ -6,7 +6,8 @@ using System.Threading.Tasks; using osu.Framework.Bindables; using osu.Game.Localisation; using osu.Game.Online.API.Requests.Responses; -using osu.Game.Online.Notifications; +using osu.Game.Online.Chat; +using osu.Game.Online.Notifications.WebSocket; using osu.Game.Users; namespace osu.Game.Online.API @@ -129,10 +130,9 @@ namespace osu.Game.Online.API /// Whether to use MessagePack for serialisation if available on this platform. IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack = true); - ///

- /// Constructs a new . - /// - NotificationsClientConnector GetNotificationsConnector(); + INotificationsClient NotificationsClient { get; } + + IChatClient GetChatClient(); /// /// Create a new user account. This is a blocking operation. diff --git a/osu.Game/Online/Chat/ChannelManager.cs b/osu.Game/Online/Chat/ChannelManager.cs index 23989caae2..d0c686a666 100644 --- a/osu.Game/Online/Chat/ChannelManager.cs +++ b/osu.Game/Online/Chat/ChannelManager.cs @@ -16,7 +16,6 @@ using osu.Game.Database; using osu.Game.Online.API; using osu.Game.Online.API.Requests; using osu.Game.Online.API.Requests.Responses; -using osu.Game.Online.Notifications; using osu.Game.Overlays.Chat.Listing; namespace osu.Game.Online.Chat @@ -64,13 +63,8 @@ namespace osu.Game.Online.Chat /// public IBindableList AvailableChannels => availableChannels; - /// - /// Whether the client responsible for channel notifications is connected. - /// - public bool NotificationsConnected => connector.IsConnected.Value; - private readonly IAPIProvider api; - private readonly NotificationsClientConnector connector; + private readonly IChatClient chatClient; [Resolved] private UserLookupCache users { get; set; } @@ -85,7 +79,7 @@ namespace osu.Game.Online.Chat { this.api = api; - connector = api.GetNotificationsConnector(); + chatClient = api.GetChatClient(); CurrentChannel.ValueChanged += currentChannelChanged; } @@ -93,15 +87,11 @@ namespace osu.Game.Online.Chat [BackgroundDependencyLoader] private void load() { - connector.ChannelJoined += ch => Schedule(() => joinChannel(ch)); - - connector.ChannelParted += ch => Schedule(() => leaveChannel(getChannel(ch), false)); - - connector.NewMessages += msgs => Schedule(() => addMessages(msgs)); - - connector.PresenceReceived += () => Schedule(initializeChannels); - - connector.Start(); + chatClient.ChannelJoined += ch => Schedule(() => joinChannel(ch)); + chatClient.ChannelParted += ch => Schedule(() => leaveChannel(getChannel(ch), false)); + chatClient.NewMessages += msgs => Schedule(() => addMessages(msgs)); + chatClient.PresenceReceived += () => Schedule(initializeChannels); + chatClient.FetchInitialMessages(); apiState.BindTo(api.State); apiState.BindValueChanged(_ => SendAck(), true); @@ -655,7 +645,7 @@ namespace osu.Game.Online.Chat protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); - connector?.Dispose(); + chatClient?.Dispose(); } } diff --git a/osu.Game/Online/Chat/IChatClient.cs b/osu.Game/Online/Chat/IChatClient.cs new file mode 100644 index 0000000000..94977b8acd --- /dev/null +++ b/osu.Game/Online/Chat/IChatClient.cs @@ -0,0 +1,18 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; + +namespace osu.Game.Online.Chat +{ + public interface IChatClient : IDisposable + { + event Action? ChannelJoined; + event Action? ChannelParted; + event Action>? NewMessages; + event Action? PresenceReceived; + + void FetchInitialMessages(); + } +} diff --git a/osu.Game/Online/Chat/WebSocketChatClient.cs b/osu.Game/Online/Chat/WebSocketChatClient.cs new file mode 100644 index 0000000000..fb67c205dc --- /dev/null +++ b/osu.Game/Online/Chat/WebSocketChatClient.cs @@ -0,0 +1,148 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using Newtonsoft.Json; +using osu.Framework.Bindables; +using osu.Framework.Extensions; +using osu.Framework.Logging; +using osu.Game.Online.API; +using osu.Game.Online.API.Requests; +using osu.Game.Online.Notifications.WebSocket; + +namespace osu.Game.Online.Chat +{ + public class WebSocketChatClient : IChatClient + { + public event Action? ChannelJoined; + public event Action? ChannelParted; + public event Action>? NewMessages; + public event Action? PresenceReceived; + + private readonly IAPIProvider api; + private readonly INotificationsClient client; + private readonly ConcurrentDictionary channelsMap = new ConcurrentDictionary(); + + public WebSocketChatClient(IAPIProvider api) + { + this.api = api; + client = api.NotificationsClient; + client.IsConnected.BindValueChanged(start, true); + } + + private void start(ValueChangedEvent connected) + { + if (!connected.NewValue) + return; + + client.MessageReceived += onMessageReceived; + client.SendAsync(new StartChatRequest()).WaitSafely(); + } + + public void FetchInitialMessages() + { + api.Queue(createInitialFetchRequest()); + } + + private APIRequest createInitialFetchRequest() + { + var fetchReq = new GetUpdatesRequest(0); + + fetchReq.Success += updates => + { + if (updates?.Presence != null) + { + foreach (var channel in updates.Presence) + joinChannel(channel); + + handleMessages(updates.Messages); + } + + PresenceReceived?.Invoke(); + }; + + return fetchReq; + } + + private void onMessageReceived(SocketMessage message) + { + switch (message.Event) + { + case @"chat.channel.join": + Debug.Assert(message.Data != null); + + Channel? joinedChannel = JsonConvert.DeserializeObject(message.Data.ToString()); + Debug.Assert(joinedChannel != null); + + joinChannel(joinedChannel); + break; + + case @"chat.channel.part": + Debug.Assert(message.Data != null); + + Channel? partedChannel = JsonConvert.DeserializeObject(message.Data.ToString()); + Debug.Assert(partedChannel != null); + + partChannel(partedChannel); + break; + + case @"chat.message.new": + Debug.Assert(message.Data != null); + + NewChatMessageData? messageData = JsonConvert.DeserializeObject(message.Data.ToString()); + Debug.Assert(messageData != null); + + foreach (var msg in messageData.Messages) + postToChannel(msg); + + break; + } + } + + private void postToChannel(Message message) + { + if (channelsMap.TryGetValue(message.ChannelId, out Channel? channel)) + { + joinChannel(channel); + NewMessages?.Invoke(new List { message }); + return; + } + + var req = new GetChannelRequest(message.ChannelId); + + req.Success += response => + { + joinChannel(channelsMap[message.ChannelId] = response.Channel); + NewMessages?.Invoke(new List { message }); + }; + req.Failure += ex => Logger.Error(ex, "Failed to join channel"); + + api.Queue(req); + } + + private void joinChannel(Channel ch) + { + ch.Joined.Value = true; + ChannelJoined?.Invoke(ch); + } + + private void partChannel(Channel channel) => ChannelParted?.Invoke(channel); + + private void handleMessages(List? messages) + { + if (messages == null) + return; + + NewMessages?.Invoke(messages); + } + + public void Dispose() + { + client.IsConnected.ValueChanged -= start; + client.MessageReceived -= onMessageReceived; + } + } +} diff --git a/osu.Game/Online/Notifications/NotificationsClientConnector.cs b/osu.Game/Online/Notifications/NotificationsClientConnector.cs deleted file mode 100644 index 34ce186cb8..0000000000 --- a/osu.Game/Online/Notifications/NotificationsClientConnector.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using osu.Game.Online.API; -using osu.Game.Online.Chat; - -namespace osu.Game.Online.Notifications -{ - /// - /// An abstract connector or s. - /// - public abstract class NotificationsClientConnector : PersistentEndpointClientConnector - { - public event Action? ChannelJoined; - public event Action? ChannelParted; - public event Action>? NewMessages; - public event Action? PresenceReceived; - - protected NotificationsClientConnector(IAPIProvider api) - : base(api) - { - } - - protected sealed override async Task BuildConnectionAsync(CancellationToken cancellationToken) - { - var client = await BuildNotificationClientAsync(cancellationToken).ConfigureAwait(false); - - client.ChannelJoined = c => ChannelJoined?.Invoke(c); - client.ChannelParted = c => ChannelParted?.Invoke(c); - client.NewMessages = m => NewMessages?.Invoke(m); - client.PresenceReceived = () => PresenceReceived?.Invoke(); - - return client; - } - - protected abstract Task BuildNotificationClientAsync(CancellationToken cancellationToken); - } -} diff --git a/osu.Game/Online/Notifications/WebSocket/DummyNotificationsClient.cs b/osu.Game/Online/Notifications/WebSocket/DummyNotificationsClient.cs new file mode 100644 index 0000000000..c1f3d25be7 --- /dev/null +++ b/osu.Game/Online/Notifications/WebSocket/DummyNotificationsClient.cs @@ -0,0 +1,29 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Threading; +using System.Threading.Tasks; +using osu.Framework.Bindables; + +namespace osu.Game.Online.Notifications.WebSocket +{ + public class DummyNotificationsClient : INotificationsClient + { + public IBindable IsConnected => new BindableBool(true); + + public event Action? MessageReceived; + + public Func? HandleMessage; + + public Task SendAsync(SocketMessage message, CancellationToken? cancellationToken = default) + { + if (HandleMessage?.Invoke(message) != true) + throw new InvalidOperationException($@"{nameof(DummyNotificationsClient)} cannot process this message."); + + return Task.CompletedTask; + } + + public void Receive(SocketMessage message) => MessageReceived?.Invoke(message); + } +} diff --git a/osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs b/osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs new file mode 100644 index 0000000000..f687752047 --- /dev/null +++ b/osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs @@ -0,0 +1,17 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Threading; +using System.Threading.Tasks; +using osu.Framework.Bindables; + +namespace osu.Game.Online.Notifications.WebSocket +{ + public interface INotificationsClient + { + IBindable IsConnected { get; } + event Action? MessageReceived; + Task SendAsync(SocketMessage message, CancellationToken? cancellationToken = default); + } +} diff --git a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs index 73e5dcec6f..854f46880f 100644 --- a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs +++ b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClient.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Collections.Concurrent; using System.Diagnostics; using System.Net; using System.Net.WebSockets; @@ -12,23 +11,20 @@ using System.Threading.Tasks; using Newtonsoft.Json; using osu.Framework.Extensions.TypeExtensions; using osu.Framework.Logging; -using osu.Game.Online.API; -using osu.Game.Online.API.Requests; -using osu.Game.Online.Chat; namespace osu.Game.Online.Notifications.WebSocket { /// /// A notifications client which receives events via a websocket. /// - public class WebSocketNotificationsClient : NotificationsClient + public class WebSocketNotificationsClient : PersistentEndpointClient { + public event Action? MessageReceived; + private readonly ClientWebSocket socket; private readonly string endpoint; - private readonly ConcurrentDictionary channelsMap = new ConcurrentDictionary(); - public WebSocketNotificationsClient(ClientWebSocket socket, string endpoint, IAPIProvider api) - : base(api) + public WebSocketNotificationsClient(ClientWebSocket socket, string endpoint) { this.socket = socket; this.endpoint = endpoint; @@ -37,11 +33,7 @@ namespace osu.Game.Online.Notifications.WebSocket public override async Task ConnectAsync(CancellationToken cancellationToken) { await socket.ConnectAsync(new Uri(endpoint), cancellationToken).ConfigureAwait(false); - await sendMessage(new StartChatRequest(), CancellationToken.None).ConfigureAwait(false); - runReadLoop(cancellationToken); - - await base.ConnectAsync(cancellationToken).ConfigureAwait(false); } private void runReadLoop(CancellationToken cancellationToken) => Task.Run(async () => @@ -73,7 +65,7 @@ namespace osu.Game.Online.Notifications.WebSocket break; } - await onMessageReceivedAsync(message).ConfigureAwait(false); + MessageReceived?.Invoke(message); } break; @@ -105,69 +97,12 @@ namespace osu.Game.Online.Notifications.WebSocket } } - private async Task sendMessage(SocketMessage message, CancellationToken cancellationToken) + public async Task SendAsync(SocketMessage message, CancellationToken? cancellationToken = default) { if (socket.State != WebSocketState.Open) return; - await socket.SendAsync(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false); - } - - private async Task onMessageReceivedAsync(SocketMessage message) - { - switch (message.Event) - { - case @"chat.channel.join": - Debug.Assert(message.Data != null); - - Channel? joinedChannel = JsonConvert.DeserializeObject(message.Data.ToString()); - Debug.Assert(joinedChannel != null); - - HandleChannelJoined(joinedChannel); - break; - - case @"chat.channel.part": - Debug.Assert(message.Data != null); - - Channel? partedChannel = JsonConvert.DeserializeObject(message.Data.ToString()); - Debug.Assert(partedChannel != null); - - HandleChannelParted(partedChannel); - break; - - case @"chat.message.new": - Debug.Assert(message.Data != null); - - NewChatMessageData? messageData = JsonConvert.DeserializeObject(message.Data.ToString()); - Debug.Assert(messageData != null); - - foreach (var msg in messageData.Messages) - HandleChannelJoined(await getChannel(msg.ChannelId).ConfigureAwait(false)); - - HandleMessages(messageData.Messages); - break; - } - } - - private async Task getChannel(long channelId) - { - if (channelsMap.TryGetValue(channelId, out Channel? channel)) - return channel; - - var tsc = new TaskCompletionSource(); - var req = new GetChannelRequest(channelId); - - req.Success += response => - { - channelsMap[channelId] = response.Channel; - tsc.SetResult(response.Channel); - }; - - req.Failure += ex => tsc.SetException(ex); - - API.Queue(req); - - return await tsc.Task.ConfigureAwait(false); + await socket.SendAsync(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), WebSocketMessageType.Text, true, cancellationToken ?? CancellationToken.None).ConfigureAwait(false); } public override async ValueTask DisposeAsync() diff --git a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs index f50369a06c..73fe29d441 100644 --- a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs +++ b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using System.Net; using System.Net.WebSockets; using System.Threading; @@ -13,17 +14,20 @@ namespace osu.Game.Online.Notifications.WebSocket /// /// A connector for s that receive events via a websocket. /// - public class WebSocketNotificationsClientConnector : NotificationsClientConnector + public class WebSocketNotificationsClientConnector : PersistentEndpointClientConnector, INotificationsClient { + public event Action? MessageReceived; + private readonly IAPIProvider api; public WebSocketNotificationsClientConnector(IAPIProvider api) : base(api) { this.api = api; + Start(); } - protected override async Task BuildNotificationClientAsync(CancellationToken cancellationToken) + protected override async Task BuildConnectionAsync(CancellationToken cancellationToken) { var tcs = new TaskCompletionSource(); @@ -40,7 +44,17 @@ namespace osu.Game.Online.Notifications.WebSocket if (socket.Options.Proxy != null) socket.Options.Proxy.Credentials = CredentialCache.DefaultCredentials; - return new WebSocketNotificationsClient(socket, endpoint, api); + var client = new WebSocketNotificationsClient(socket, endpoint); + client.MessageReceived += msg => MessageReceived?.Invoke(msg); + return client; + } + + public Task SendAsync(SocketMessage message, CancellationToken? cancellationToken = default) + { + if (CurrentConnection is not WebSocketNotificationsClient webSocketClient) + return Task.CompletedTask; + + return webSocketClient.SendAsync(message, cancellationToken); } } } diff --git a/osu.Game/Online/Notifications/NotificationsClient.cs b/osu.Game/Tests/PollingChatClient.cs similarity index 59% rename from osu.Game/Online/Notifications/NotificationsClient.cs rename to osu.Game/Tests/PollingChatClient.cs index 5762e0e588..eb29b35c1d 100644 --- a/osu.Game/Online/Notifications/NotificationsClient.cs +++ b/osu.Game/Tests/PollingChatClient.cs @@ -6,34 +6,39 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using osu.Game.Online; using osu.Game.Online.API; using osu.Game.Online.API.Requests; using osu.Game.Online.Chat; -namespace osu.Game.Online.Notifications +namespace osu.Game.Tests { - /// - /// An abstract client which receives notification-related events (chat/notifications). - /// - public abstract class NotificationsClient : PersistentEndpointClient + public class PollingChatClient : PersistentEndpointClient { - public Action? ChannelJoined; - public Action? ChannelParted; - public Action>? NewMessages; - public Action? PresenceReceived; + public event Action? ChannelJoined; + public event Action>? NewMessages; + public event Action? PresenceReceived; - protected readonly IAPIProvider API; + private readonly IAPIProvider api; private long lastMessageId; - protected NotificationsClient(IAPIProvider api) + public PollingChatClient(IAPIProvider api) { - API = api; + this.api = api; } public override Task ConnectAsync(CancellationToken cancellationToken) { - API.Queue(CreateInitialFetchRequest(0)); + Task.Run(async () => + { + while (!cancellationToken.IsCancellationRequested) + { + await api.PerformAsync(CreateInitialFetchRequest()).ConfigureAwait(true); + await Task.Delay(1000, cancellationToken).ConfigureAwait(true); + } + }, cancellationToken); + return Task.CompletedTask; } @@ -46,11 +51,11 @@ namespace osu.Game.Online.Notifications if (updates?.Presence != null) { foreach (var channel in updates.Presence) - HandleChannelJoined(channel); + handleChannelJoined(channel); //todo: handle left channels - HandleMessages(updates.Messages); + handleMessages(updates.Messages); } PresenceReceived?.Invoke(); @@ -59,15 +64,13 @@ namespace osu.Game.Online.Notifications return fetchReq; } - protected void HandleChannelJoined(Channel channel) + private void handleChannelJoined(Channel channel) { channel.Joined.Value = true; ChannelJoined?.Invoke(channel); } - protected void HandleChannelParted(Channel channel) => ChannelParted?.Invoke(channel); - - protected void HandleMessages(List? messages) + private void handleMessages(List? messages) { if (messages == null) return; diff --git a/osu.Game/Tests/PollingChatClientConnector.cs b/osu.Game/Tests/PollingChatClientConnector.cs new file mode 100644 index 0000000000..3e96a8cde7 --- /dev/null +++ b/osu.Game/Tests/PollingChatClientConnector.cs @@ -0,0 +1,48 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using osu.Game.Online; +using osu.Game.Online.API; +using osu.Game.Online.Chat; + +namespace osu.Game.Tests +{ + public class PollingChatClientConnector : PersistentEndpointClientConnector, IChatClient + { + public event Action? ChannelJoined; + + public event Action? ChannelParted + { + add { } + remove { } + } + + public event Action>? NewMessages; + public event Action? PresenceReceived; + + public void FetchInitialMessages() + { + // don't really need to do anything special if we poll every second anyway. + } + + public PollingChatClientConnector(IAPIProvider api) + : base(api) + { + } + + protected sealed override Task BuildConnectionAsync(CancellationToken cancellationToken) + { + var client = new PollingChatClient(API); + + client.ChannelJoined += c => ChannelJoined?.Invoke(c); + client.NewMessages += m => NewMessages?.Invoke(m); + client.PresenceReceived += () => PresenceReceived?.Invoke(); + + return Task.FromResult(client); + } + } +} diff --git a/osu.Game/Tests/PollingNotificationsClient.cs b/osu.Game/Tests/PollingNotificationsClient.cs deleted file mode 100644 index 450c763170..0000000000 --- a/osu.Game/Tests/PollingNotificationsClient.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using System.Threading; -using System.Threading.Tasks; -using osu.Game.Online.API; -using osu.Game.Online.Notifications; - -namespace osu.Game.Tests -{ - /// - /// A notifications client which polls for new messages every second. - /// - public class PollingNotificationsClient : NotificationsClient - { - public PollingNotificationsClient(IAPIProvider api) - : base(api) - { - } - - public override Task ConnectAsync(CancellationToken cancellationToken) - { - Task.Run(async () => - { - while (!cancellationToken.IsCancellationRequested) - { - await API.PerformAsync(CreateInitialFetchRequest()).ConfigureAwait(true); - await Task.Delay(1000, cancellationToken).ConfigureAwait(true); - } - }, cancellationToken); - - return Task.CompletedTask; - } - } -} diff --git a/osu.Game/Tests/PollingNotificationsClientConnector.cs b/osu.Game/Tests/PollingNotificationsClientConnector.cs deleted file mode 100644 index 823fc9d157..0000000000 --- a/osu.Game/Tests/PollingNotificationsClientConnector.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using System.Threading; -using System.Threading.Tasks; -using osu.Game.Online.API; -using osu.Game.Online.Notifications; - -namespace osu.Game.Tests -{ - /// - /// A connector for s that poll for new messages. - /// - public class PollingNotificationsClientConnector : NotificationsClientConnector - { - public PollingNotificationsClientConnector(IAPIProvider api) - : base(api) - { - } - - protected override Task BuildNotificationClientAsync(CancellationToken cancellationToken) - => Task.FromResult((NotificationsClient)new PollingNotificationsClient(API)); - } -} From c463aa5ba1e67d0fc0fca5b5db5230a3875cf52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 25 Jan 2024 14:46:39 +0100 Subject: [PATCH 323/651] xmldoc everything --- osu.Game/Online/API/IAPIProvider.cs | 6 ++++ osu.Game/Online/Chat/ChannelManager.cs | 2 +- osu.Game/Online/Chat/IChatClient.cs | 29 ++++++++++++++++--- osu.Game/Online/Chat/WebSocketChatClient.cs | 10 ++----- .../WebSocket/INotificationsClient.cs | 14 +++++++++ osu.Game/Tests/PollingChatClientConnector.cs | 2 +- 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/osu.Game/Online/API/IAPIProvider.cs b/osu.Game/Online/API/IAPIProvider.cs index ea4eb97ccb..a050b2dfae 100644 --- a/osu.Game/Online/API/IAPIProvider.cs +++ b/osu.Game/Online/API/IAPIProvider.cs @@ -130,8 +130,14 @@ namespace osu.Game.Online.API /// Whether to use MessagePack for serialisation if available on this platform. IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack = true); + /// + /// Accesses the used to receive asynchronous notifications from web. + /// INotificationsClient NotificationsClient { get; } + /// + /// Creates a instance to use in order to chat. + /// IChatClient GetChatClient(); /// diff --git a/osu.Game/Online/Chat/ChannelManager.cs b/osu.Game/Online/Chat/ChannelManager.cs index d0c686a666..74e85c595c 100644 --- a/osu.Game/Online/Chat/ChannelManager.cs +++ b/osu.Game/Online/Chat/ChannelManager.cs @@ -91,7 +91,7 @@ namespace osu.Game.Online.Chat chatClient.ChannelParted += ch => Schedule(() => leaveChannel(getChannel(ch), false)); chatClient.NewMessages += msgs => Schedule(() => addMessages(msgs)); chatClient.PresenceReceived += () => Schedule(initializeChannels); - chatClient.FetchInitialMessages(); + chatClient.RequestPresence(); apiState.BindTo(api.State); apiState.BindValueChanged(_ => SendAck(), true); diff --git a/osu.Game/Online/Chat/IChatClient.cs b/osu.Game/Online/Chat/IChatClient.cs index 94977b8acd..290ee22710 100644 --- a/osu.Game/Online/Chat/IChatClient.cs +++ b/osu.Game/Online/Chat/IChatClient.cs @@ -6,13 +6,34 @@ using System.Collections.Generic; namespace osu.Game.Online.Chat { + /// + /// Interface for consuming online chat. + /// public interface IChatClient : IDisposable { + /// + /// Fired when a has been joined. + /// event Action? ChannelJoined; - event Action? ChannelParted; - event Action>? NewMessages; - event Action? PresenceReceived; - void FetchInitialMessages(); + /// + /// Fired when a has been parted. + /// + event Action? ChannelParted; + + /// + /// Fired when new s have arrived from the server. + /// + event Action>? NewMessages; + + /// + /// Requests presence information from the server. + /// + void RequestPresence(); + + /// + /// Fired when the initial user presence information has been received. + /// + event Action? PresenceReceived; } } diff --git a/osu.Game/Online/Chat/WebSocketChatClient.cs b/osu.Game/Online/Chat/WebSocketChatClient.cs index fb67c205dc..05d3b7b3ce 100644 --- a/osu.Game/Online/Chat/WebSocketChatClient.cs +++ b/osu.Game/Online/Chat/WebSocketChatClient.cs @@ -40,14 +40,10 @@ namespace osu.Game.Online.Chat client.MessageReceived += onMessageReceived; client.SendAsync(new StartChatRequest()).WaitSafely(); + RequestPresence(); } - public void FetchInitialMessages() - { - api.Queue(createInitialFetchRequest()); - } - - private APIRequest createInitialFetchRequest() + public void RequestPresence() { var fetchReq = new GetUpdatesRequest(0); @@ -64,7 +60,7 @@ namespace osu.Game.Online.Chat PresenceReceived?.Invoke(); }; - return fetchReq; + api.Queue(fetchReq); } private void onMessageReceived(SocketMessage message) diff --git a/osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs b/osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs index f687752047..9a222d0fdd 100644 --- a/osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs +++ b/osu.Game/Online/Notifications/WebSocket/INotificationsClient.cs @@ -8,10 +8,24 @@ using osu.Framework.Bindables; namespace osu.Game.Online.Notifications.WebSocket { + /// + /// A client for asynchronous notifications sent by osu-web. + /// public interface INotificationsClient { + /// + /// Whether this is currently connected to a server. + /// IBindable IsConnected { get; } + + /// + /// Invoked when a new arrives for this client. + /// event Action? MessageReceived; + + /// + /// Sends a to the notification server. + /// Task SendAsync(SocketMessage message, CancellationToken? cancellationToken = default); } } diff --git a/osu.Game/Tests/PollingChatClientConnector.cs b/osu.Game/Tests/PollingChatClientConnector.cs index 3e96a8cde7..1cab24dae6 100644 --- a/osu.Game/Tests/PollingChatClientConnector.cs +++ b/osu.Game/Tests/PollingChatClientConnector.cs @@ -24,7 +24,7 @@ namespace osu.Game.Tests public event Action>? NewMessages; public event Action? PresenceReceived; - public void FetchInitialMessages() + public void RequestPresence() { // don't really need to do anything special if we poll every second anyway. } From 14067c2e573e00719b849bd37c01e37f96dbc712 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 26 Jan 2024 00:39:29 +0900 Subject: [PATCH 324/651] Remove unused using statements --- osu.Game/Graphics/Backgrounds/TrianglesV2.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs index bcb73f71cc..4143a6d76d 100644 --- a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs +++ b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; -using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Rendering; using osu.Framework.Graphics.Shaders; From 93bd3ce5ae73eb6f00649e09ace1acd2224ecc95 Mon Sep 17 00:00:00 2001 From: Chandler Stowell Date: Thu, 25 Jan 2024 11:25:41 -0500 Subject: [PATCH 325/651] update `DrawableHitCircle.ApplyResult` to pass `this` to its callback --- .../DrawableEmptyFreeformHitObject.cs | 2 +- .../Drawables/DrawablePippidonHitObject.cs | 6 ++--- .../DrawableEmptyScrollingHitObject.cs | 2 +- .../Drawables/DrawablePippidonHitObject.cs | 5 ++-- .../Drawables/DrawableCatchHitObject.cs | 7 +++--- .../Objects/Drawables/DrawableHoldNote.cs | 2 +- .../Objects/Drawables/DrawableHoldNoteBody.cs | 9 ++++++- .../Drawables/DrawableManiaHitObject.cs | 2 +- .../Objects/Drawables/DrawableNote.cs | 16 +++++++++---- .../TestSceneHitCircle.cs | 2 +- .../TestSceneHitCircleLateFade.cs | 2 +- .../Objects/Drawables/DrawableHitCircle.cs | 19 ++++++++------- .../Objects/Drawables/DrawableOsuHitObject.cs | 4 ++-- .../Objects/Drawables/DrawableSlider.cs | 14 +++++------ .../Objects/Drawables/DrawableSpinner.cs | 5 ++-- .../Objects/Drawables/DrawableSpinnerTick.cs | 12 +++++++++- .../Objects/Drawables/DrawableDrumRoll.cs | 8 +++---- .../Objects/Drawables/DrawableDrumRollTick.cs | 13 +++++----- .../Objects/Drawables/DrawableFlyingHit.cs | 2 +- .../Objects/Drawables/DrawableHit.cs | 24 ++++++++++++------- .../Drawables/DrawableStrongNestedHit.cs | 2 +- .../Objects/Drawables/DrawableSwell.cs | 16 +++++++------ .../Objects/Drawables/DrawableSwellTick.cs | 10 +++++--- .../Gameplay/TestSceneDrawableHitObject.cs | 2 +- .../Gameplay/TestScenePoolingRuleset.cs | 8 +++---- .../Objects/Drawables/DrawableHitObject.cs | 13 ++-------- 26 files changed, 120 insertions(+), 87 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs index e8f511bc4b..3ad8f06fb4 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs @@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.EmptyFreeform.Objects.Drawables { if (timeOffset >= 0) // todo: implement judgement logic - ApplyResult(static r => r.Type = HitResult.Perfect); + ApplyResult(static (r, hitObject) => r.Type = HitResult.Perfect); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs index a8bb57ba18..925f2d04bf 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -50,10 +50,10 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables { if (timeOffset >= 0) { - ApplyResult(static (r, isHovered) => + ApplyResult(static (r, hitObject) => { - r.Type = isHovered ? HitResult.Perfect : HitResult.Miss; - }, IsHovered); + r.Type = hitObject.IsHovered ? HitResult.Perfect : HitResult.Miss; + }); } } diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs index 070a802aea..408bbea717 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs @@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.EmptyScrolling.Objects.Drawables { if (timeOffset >= 0) // todo: implement judgement logic - ApplyResult(static r => r.Type = HitResult.Perfect); + ApplyResult(static (r, hitObject) => r.Type = HitResult.Perfect); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs index 9983ec20b0..2c9eac7f65 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -50,10 +50,11 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables { if (timeOffset >= 0) { - ApplyResult(static (r, pippidonHitObject) => + ApplyResult(static (r, hitObject) => { + var pippidonHitObject = (DrawablePippidonHitObject)hitObject; r.Type = pippidonHitObject.currentLane.Value == pippidonHitObject.HitObject.Lane ? HitResult.Perfect : HitResult.Miss; - }, this); + }); } } diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs index 5a921f36f5..721c6aaa59 100644 --- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs +++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs @@ -64,10 +64,11 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables if (timeOffset >= 0 && Result != null) { - ApplyResult(static (r, state) => + ApplyResult(static (r, hitObject) => { - r.Type = state.CheckPosition.Invoke(state.HitObject) ? r.Judgement.MaxResult : r.Judgement.MinResult; - }, this); + var catchHitObject = (DrawableCatchHitObject)hitObject; + r.Type = catchHitObject.CheckPosition!.Invoke(catchHitObject.HitObject) ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); } } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs index e5056d5167..6c70ab3526 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs @@ -265,7 +265,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables if (Tail.AllJudged) { if (Tail.IsHit) - ApplyResult(static r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); else MissForcefully(); } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs index 317da0580c..731b1b6298 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs @@ -11,6 +11,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables public override bool DisplayResult => false; + private bool hit; + public DrawableHoldNoteBody() : this(null) { @@ -25,7 +27,12 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables { if (AllJudged) return; - ApplyResult(static (r, hit) => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult, hit); + this.hit = hit; + ApplyResult(static (r, hitObject) => + { + var holdNoteBody = (DrawableHoldNoteBody)hitObject; + r.Type = holdNoteBody.hit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); } } } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs index dea0817869..2d10fa27cd 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs @@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables /// /// Causes this to get missed, disregarding all conditions in implementations of . /// - public virtual void MissForcefully() => ApplyResult(static r => r.Type = r.Judgement.MinResult); + public virtual void MissForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); } public abstract partial class DrawableManiaHitObject : DrawableManiaHitObject diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs index 985007f905..a70253798a 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs @@ -38,6 +38,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables private Drawable headPiece; + private HitResult hitResult; + public DrawableNote() : this(null) { @@ -89,18 +91,22 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); return; } - var result = HitObject.HitWindows.ResultFor(timeOffset); - if (result == HitResult.None) + hitResult = HitObject.HitWindows.ResultFor(timeOffset); + if (hitResult == HitResult.None) return; - result = GetCappedResult(result); + hitResult = GetCappedResult(hitResult); - ApplyResult(static (r, result) => r.Type = result, result); + ApplyResult(static (r, hitObject) => + { + var note = (DrawableNote)hitObject; + r.Type = note.hitResult; + }); } /// diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs index 30b0451a3b..8d4145f2c1 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs @@ -136,7 +136,7 @@ namespace osu.Game.Rulesets.Osu.Tests if (auto && !userTriggered && timeOffset > hitOffset && CheckHittable?.Invoke(this, Time.Current, HitResult.Great) == ClickAction.Hit) { // force success - ApplyResult(r => r.Type = HitResult.Great); + ApplyResult(static (r, _) => r.Type = HitResult.Great); } else base.CheckForResult(userTriggered, timeOffset); diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs index 7824f26251..2d1e9c1270 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs @@ -208,7 +208,7 @@ namespace osu.Game.Rulesets.Osu.Tests if (shouldHit && !userTriggered && timeOffset >= 0) { // force success - ApplyResult(r => r.Type = HitResult.Great); + ApplyResult(static (r, _) => r.Type = HitResult.Great); } else base.CheckForResult(userTriggered, timeOffset); diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index 8284229d82..ce5422b180 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -44,6 +44,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables private Container scaleContainer; private InputManager inputManager; + private HitResult hitResult; public DrawableHitCircle() : this(null) @@ -155,34 +156,34 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); return; } - var result = ResultFor(timeOffset); - var clickAction = CheckHittable?.Invoke(this, Time.Current, result); + hitResult = ResultFor(timeOffset); + var clickAction = CheckHittable?.Invoke(this, Time.Current, hitResult); if (clickAction == ClickAction.Shake) Shake(); - if (result == HitResult.None || clickAction != ClickAction.Hit) + if (hitResult == HitResult.None || clickAction != ClickAction.Hit) return; - ApplyResult(static (r, state) => + ApplyResult(static (r, hitObject) => { - var (hitCircle, hitResult) = state; + var hitCircle = (DrawableHitCircle)hitObject; var circleResult = (OsuHitCircleJudgementResult)r; // Todo: This should also consider misses, but they're a little more interesting to handle, since we don't necessarily know the position at the time of a miss. - if (hitResult.IsHit()) + if (hitCircle.hitResult.IsHit()) { var localMousePosition = hitCircle.ToLocalSpace(hitCircle.inputManager.CurrentState.Mouse.Position); circleResult.CursorPositionAtHit = hitCircle.HitObject.StackedPosition + (localMousePosition - hitCircle.DrawSize / 2); } - circleResult.Type = hitResult; - }, (this, result)); + circleResult.Type = hitCircle.hitResult; + }); } /// diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs index cc06d009c9..6de60a9d51 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs @@ -100,12 +100,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// /// Causes this to get hit, disregarding all conditions in implementations of . /// - public void HitForcefully() => ApplyResult(static r => r.Type = r.Judgement.MaxResult); + public void HitForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); /// /// Causes this to get missed, disregarding all conditions in implementations of . /// - public void MissForcefully() => ApplyResult(static r => r.Type = r.Judgement.MinResult); + public void MissForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); private RectangleF parentScreenSpaceRectangle => ((DrawableOsuHitObject)ParentHitObject)?.parentScreenSpaceRectangle ?? Parent!.ScreenSpaceDrawQuad.AABBFloat; diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 3c298cc6af..c0ff258352 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -292,10 +292,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (HitObject.ClassicSliderBehaviour) { // Classic behaviour means a slider is judged proportionally to the number of nested hitobjects hit. This is the classic osu!stable scoring. - ApplyResult(static (r, nestedHitObjects) => + ApplyResult(static (r, hitObject) => { - int totalTicks = nestedHitObjects.Count; - int hitTicks = nestedHitObjects.Count(h => h.IsHit); + int totalTicks = hitObject.NestedHitObjects.Count; + int hitTicks = hitObject.NestedHitObjects.Count(h => h.IsHit); if (hitTicks == totalTicks) r.Type = HitResult.Great; @@ -306,16 +306,16 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables double hitFraction = (double)hitTicks / totalTicks; r.Type = hitFraction >= 0.5 ? HitResult.Ok : HitResult.Meh; } - }, NestedHitObjects); + }); } else { // If only the nested hitobjects are judged, then the slider's own judgement is ignored for scoring purposes. // But the slider needs to still be judged with a reasonable hit/miss result for visual purposes (hit/miss transforms, etc). - ApplyResult(static (r, nestedHitObjects) => + ApplyResult(static (r, hitObject) => { - r.Type = nestedHitObjects.Any(h => h.Result.IsHit) ? r.Judgement.MaxResult : r.Judgement.MinResult; - }, NestedHitObjects); + r.Type = hitObject.NestedHitObjects.Any(h => h.Result.IsHit) ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); } } diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index d21d02c8ce..3679bc9775 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -258,8 +258,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables foreach (var tick in ticks.Where(t => !t.Result.HasResult)) tick.TriggerResult(false); - ApplyResult(static (r, spinner) => + ApplyResult(static (r, hitObject) => { + var spinner = (DrawableSpinner)hitObject; if (spinner.Progress >= 1) r.Type = HitResult.Great; else if (spinner.Progress > .9) @@ -268,7 +269,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables r.Type = HitResult.Meh; else if (spinner.Time.Current >= spinner.HitObject.EndTime) r.Type = r.Judgement.MinResult; - }, this); + }); } protected override void Update() diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs index 1c3ff29118..628f07a281 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs @@ -11,6 +11,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public override bool DisplayResult => false; + private bool hit; + public DrawableSpinnerTick() : this(null) { @@ -35,6 +37,14 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// Apply a judgement result. /// /// Whether this tick was reached. - internal void TriggerResult(bool hit) => ApplyResult(static (r, hit) => r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult, hit); + internal void TriggerResult(bool hit) + { + this.hit = hit; + ApplyResult(static (r, hitObject) => + { + var spinnerTick = (DrawableSpinnerTick)hitObject; + r.Type = spinnerTick.hit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); + } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs index d3fe363857..2e40875af1 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs @@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (timeOffset < 0) return; - ApplyResult(static r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } protected override void UpdateHitStateTransforms(ArmedState state) @@ -192,10 +192,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!ParentHitObject.Judged) return; - ApplyResult(static (r, parentHitObject) => + ApplyResult(static (r, hitObject) => { - r.Type = parentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; - }, ParentHitObject); + r.Type = hitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); } public override bool OnPressed(KeyBindingPressEvent e) => false; diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs index de9a3a31c5..aa678d7043 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs @@ -49,14 +49,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!userTriggered) { if (timeOffset > HitObject.HitWindow) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); return; } if (Math.Abs(timeOffset) > HitObject.HitWindow) return; - ApplyResult(static r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } public override void OnKilled() @@ -64,7 +64,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables base.OnKilled(); if (Time.Current > HitObject.GetEndTime() && !Judged) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); } protected override void UpdateHitStateTransforms(ArmedState state) @@ -105,10 +105,11 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!ParentHitObject.Judged) return; - ApplyResult(static (r, parentHitObject) => + ApplyResult(static (r, hitObject) => { - r.Type = parentHitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; - }, ParentHitObject); + var nestedHit = (StrongNestedHit)hitObject; + r.Type = nestedHit.ParentHitObject!.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); } public override bool OnPressed(KeyBindingPressEvent e) => false; diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs index 1332b9e950..4349dff9f9 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs @@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables protected override void LoadComplete() { base.LoadComplete(); - ApplyResult(static r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } protected override void LoadSamples() diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index c3bd76bf81..cf8e4050ee 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -37,6 +37,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables private double? lastPressHandleTime; + private HitResult hitResult; + private readonly Bindable type = new Bindable(); public DrawableHit() @@ -99,18 +101,24 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); return; } - var result = HitObject.HitWindows.ResultFor(timeOffset); - if (result == HitResult.None) + hitResult = HitObject.HitWindows.ResultFor(timeOffset); + if (hitResult == HitResult.None) return; if (!validActionPressed) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); else - ApplyResult(static (r, result) => r.Type = result, result); + { + ApplyResult(static (r, hitObject) => + { + var drawableHit = (DrawableHit)hitObject; + r.Type = drawableHit.hitResult; + }); + } } public override bool OnPressed(KeyBindingPressEvent e) @@ -209,19 +217,19 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!ParentHitObject.Result.IsHit) { - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); return; } if (!userTriggered) { if (timeOffset - ParentHitObject.Result.TimeOffset > SECOND_HIT_WINDOW) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); return; } if (Math.Abs(timeOffset - ParentHitObject.Result.TimeOffset) <= SECOND_HIT_WINDOW) - ApplyResult(static r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } public override bool OnPressed(KeyBindingPressEvent e) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs index 4080c14066..8f99538448 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs @@ -27,7 +27,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables // it can happen that the hit window of the nested strong hit extends past the lifetime of the parent object. // this is a safety to prevent such cases from causing the nested hit to never be judged and as such prevent gameplay from completing. if (!Judged && Time.Current > ParentHitObject?.HitObject.GetEndTime()) - ApplyResult(static r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs index d48b78283b..0781ea5e2a 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs @@ -41,6 +41,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables private double? lastPressHandleTime; + private int numHits; + public override bool DisplayResult => false; public DrawableSwell() @@ -192,7 +194,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables nextTick?.TriggerResult(true); - int numHits = ticks.Count(r => r.IsHit); + numHits = ticks.Count(r => r.IsHit); float completion = (float)numHits / HitObject.RequiredHits; @@ -206,14 +208,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables expandingRing.ScaleTo(1f + Math.Min(target_ring_scale - 1f, (target_ring_scale - 1f) * completion * 1.3f), 260, Easing.OutQuint); if (numHits == HitObject.RequiredHits) - ApplyResult(static r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } else { if (timeOffset < 0) return; - int numHits = 0; + numHits = 0; foreach (var tick in ticks) { @@ -227,11 +229,11 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables tick.TriggerResult(false); } - ApplyResult(static (r, state) => + ApplyResult(static (r, hitObject) => { - var (numHits, hitObject) = state; - r.Type = numHits == hitObject.RequiredHits ? r.Judgement.MaxResult : r.Judgement.MinResult; - }, (numHits, HitObject)); + var swell = (DrawableSwell)hitObject; + r.Type = swell.numHits == swell.HitObject.RequiredHits ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs index ad1d09bc7b..557438e5e5 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs @@ -15,6 +15,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables { public override bool DisplayResult => false; + private bool hit; + public DrawableSwellTick() : this(null) { @@ -29,11 +31,13 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables public void TriggerResult(bool hit) { + this.hit = hit; HitObject.StartTime = Time.Current; - ApplyResult(static (r, hit) => + ApplyResult(static (r, hitObject) => { - r.Type = hit ? r.Judgement.MaxResult : r.Judgement.MinResult; - }, hit); + var swellTick = (DrawableSwellTick)hitObject; + r.Type = swellTick.hit ? r.Judgement.MaxResult : r.Judgement.MinResult; + }); } protected override void CheckForResult(bool userTriggered, double timeOffset) diff --git a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs index 10dbede2e0..bf1e52aab5 100644 --- a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs +++ b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs @@ -216,7 +216,7 @@ namespace osu.Game.Tests.Gameplay LifetimeStart = LIFETIME_ON_APPLY; } - public void MissForcefully() => ApplyResult(r => r.Type = HitResult.Miss); + public void MissForcefully() => ApplyResult(static (r, _) => r.Type = HitResult.Miss); protected override void UpdateHitStateTransforms(ArmedState state) { diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs index fea7456472..00bd58e303 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs @@ -431,7 +431,7 @@ namespace osu.Game.Tests.Visual.Gameplay protected override void CheckForResult(bool userTriggered, double timeOffset) { if (timeOffset > HitObject.Duration) - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } protected override void UpdateHitStateTransforms(ArmedState state) @@ -468,7 +468,7 @@ namespace osu.Game.Tests.Visual.Gameplay public override void OnKilled() { base.OnKilled(); - ApplyResult(r => r.Type = r.Judgement.MinResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); } } @@ -547,7 +547,7 @@ namespace osu.Game.Tests.Visual.Gameplay { base.CheckForResult(userTriggered, timeOffset); if (timeOffset >= 0) - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } } @@ -596,7 +596,7 @@ namespace osu.Game.Tests.Visual.Gameplay { base.CheckForResult(userTriggered, timeOffset); if (timeOffset >= 0) - ApplyResult(r => r.Type = r.Judgement.MaxResult); + ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); } } diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 9acd7b3c0f..bffe174be1 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -687,14 +687,12 @@ namespace osu.Game.Rulesets.Objects.Drawables /// the of the . /// /// The callback that applies changes to the . - /// The state passed to the callback. - /// The type of the state information that is passed to the callback method. - protected void ApplyResult(Action application, TState state) + protected void ApplyResult(Action application) { if (Result.HasResult) throw new InvalidOperationException("Cannot apply result on a hitobject that already has a result."); - application?.Invoke(Result, state); + application?.Invoke(Result, this); if (!Result.HasResult) throw new InvalidOperationException($"{GetType().ReadableName()} applied a {nameof(JudgementResult)} but did not update {nameof(JudgementResult.Type)}."); @@ -716,13 +714,6 @@ namespace osu.Game.Rulesets.Objects.Drawables OnNewResult?.Invoke(this, Result); } - /// - /// Applies the of this , notifying responders such as - /// the of the . - /// - /// The callback that applies changes to the . - protected void ApplyResult(Action application) => ApplyResult((r, _) => application?.Invoke(r), null); - /// /// Processes this , checking if a scoring result has occurred. /// From 682dab5d8327e24b38914f0599d8822eddf05e93 Mon Sep 17 00:00:00 2001 From: Chandler Stowell Date: Thu, 25 Jan 2024 11:30:52 -0500 Subject: [PATCH 326/651] check if parent was hit in taiko's `DrawableDrumRoll.CheckForResult` --- osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs index 2e40875af1..f68198b967 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs @@ -194,7 +194,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables ApplyResult(static (r, hitObject) => { - r.Type = hitObject.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; + var drumRoll = (DrawableDrumRoll)hitObject; + r.Type = drumRoll.ParentHitObject!.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; }); } From 542f571deecbcc1a1a86cfd960687e5bf1dd546e Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 26 Jan 2024 01:03:22 +0300 Subject: [PATCH 327/651] Remove LINQ cast in HUDOverlay --- osu.Game/Screens/Play/HUDOverlay.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs index b5482f2a5b..4fc37b8bb5 100644 --- a/osu.Game/Screens/Play/HUDOverlay.cs +++ b/osu.Game/Screens/Play/HUDOverlay.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; -using System.Linq; using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Bindables; @@ -259,14 +258,14 @@ namespace osu.Game.Screens.Play Vector2? highestBottomScreenSpace = null; - // LINQ cast can be removed when IDrawable interface includes Anchor / RelativeSizeAxes. - foreach (var element in mainComponents.Components.Cast()) - processDrawable(element); + // cast can be removed when IDrawable interface includes Anchor / RelativeSizeAxes. + foreach (var element in mainComponents.Components) + processDrawable(element as Drawable); if (rulesetComponents != null) { - foreach (var element in rulesetComponents.Components.Cast()) - processDrawable(element); + foreach (var element in rulesetComponents.Components) + processDrawable(element as Drawable); } if (lowestTopScreenSpaceRight.HasValue) From d2af05b30e93f729ba40326bdaf51867817f65f2 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 26 Jan 2024 04:09:00 +0300 Subject: [PATCH 328/651] Remove useless bindable from ArgonSongProgressBar --- .../Screens/Play/HUD/ArgonSongProgressBar.cs | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs index beaee0e9ee..40311da646 100644 --- a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs @@ -3,7 +3,6 @@ using System; using osu.Framework.Allocation; -using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; @@ -52,23 +51,14 @@ namespace osu.Game.Screens.Play.HUD set => CurrentNumber.Value = value; } - public double TrackTime - { - private get => currentTrackTime.Value; - set => currentTrackTime.Value = value; - } + public double TrackTime { private get; set; } private double length => EndTime - StartTime; - private readonly BindableNumber currentTrackTime; - public bool Interactive { get; set; } public ArgonSongProgressBar(float barHeight) { - currentTrackTime = new BindableDouble(); - setupAlternateValue(); - StartTime = 0; EndTime = 1; @@ -107,13 +97,6 @@ namespace osu.Game.Screens.Play.HUD }; } - private void setupAlternateValue() - { - CurrentNumber.MaxValueChanged += v => currentTrackTime.MaxValue = v; - CurrentNumber.MinValueChanged += v => currentTrackTime.MinValue = v; - CurrentNumber.PrecisionChanged += v => currentTrackTime.Precision = v; - } - private float normalizedReference { get From 9b5b313193d61c603c6e42773a8fc6ea7e05fb94 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 26 Jan 2024 04:49:23 +0300 Subject: [PATCH 329/651] Move common logic into own SongProgressBar class --- .../Screens/Play/HUD/ArgonSongProgressBar.cs | 46 +----------- .../Play/HUD/DefaultSongProgressBar.cs | 64 ++--------------- osu.Game/Screens/Play/HUD/SongProgressBar.cs | 70 +++++++++++++++++++ 3 files changed, 76 insertions(+), 104 deletions(-) create mode 100644 osu.Game/Screens/Play/HUD/SongProgressBar.cs diff --git a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs index 40311da646..5fe3b97f15 100644 --- a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs @@ -7,19 +7,15 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; -using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; -using osu.Framework.Threading; using osu.Framework.Utils; using osu.Game.Graphics; using osuTK; namespace osu.Game.Screens.Play.HUD { - public partial class ArgonSongProgressBar : SliderBar + public partial class ArgonSongProgressBar : SongProgressBar { - public Action? OnSeek { get; set; } - // Parent will handle restricting the area of valid input. public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true; @@ -33,35 +29,12 @@ namespace osu.Game.Screens.Play.HUD private readonly ColourInfo mainColour; private ColourInfo catchUpColour; - public double StartTime - { - private get => CurrentNumber.MinValue; - set => CurrentNumber.MinValue = value; - } - - public double EndTime - { - private get => CurrentNumber.MaxValue; - set => CurrentNumber.MaxValue = value; - } - - public double CurrentTime - { - private get => CurrentNumber.Value; - set => CurrentNumber.Value = value; - } - public double TrackTime { private get; set; } private double length => EndTime - StartTime; - public bool Interactive { get; set; } - public ArgonSongProgressBar(float barHeight) { - StartTime = 0; - EndTime = 1; - RelativeSizeAxes = Axes.X; Height = this.barHeight = barHeight; @@ -136,11 +109,6 @@ namespace osu.Game.Screens.Play.HUD base.OnHoverLost(e); } - protected override void UpdateValue(float value) - { - // Handled in Update - } - protected override void Update() { base.Update(); @@ -167,18 +135,6 @@ namespace osu.Game.Screens.Play.HUD catchupBar.Alpha = Math.Max(1, catchupBar.Length); } - private ScheduledDelegate? scheduledSeek; - - protected override void OnUserChange(double value) - { - scheduledSeek?.Cancel(); - scheduledSeek = Schedule(() => - { - if (Interactive) - OnSeek?.Invoke(value); - }); - } - private partial class RoundedBar : Container { private readonly Box fill; diff --git a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs index 0e16067dcc..4079351baf 100644 --- a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs @@ -7,67 +7,23 @@ using osuTK.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics; using osu.Framework.Graphics.Shapes; -using osu.Framework.Graphics.UserInterface; using osu.Framework.Utils; -using osu.Framework.Threading; namespace osu.Game.Screens.Play.HUD { - public partial class DefaultSongProgressBar : SliderBar + public partial class DefaultSongProgressBar : SongProgressBar { - /// - /// Action which is invoked when a seek is requested, with the proposed millisecond value for the seek operation. - /// - public Action? OnSeek { get; set; } - - /// - /// Whether the progress bar should allow interaction, ie. to perform seek operations. - /// - public bool Interactive - { - get => showHandle; - set - { - if (value == showHandle) - return; - - showHandle = value; - - handleBase.FadeTo(showHandle ? 1 : 0, 200); - } - } - public Color4 FillColour { set => fill.Colour = value; } - public double StartTime - { - set => CurrentNumber.MinValue = value; - } - - public double EndTime - { - set => CurrentNumber.MaxValue = value; - } - - public double CurrentTime - { - set => CurrentNumber.Value = value; - } - private readonly Box fill; private readonly Container handleBase; private readonly Container handleContainer; - private bool showHandle; - public DefaultSongProgressBar(float barHeight, float handleBarHeight, Vector2 handleSize) { - CurrentNumber.MinValue = 0; - CurrentNumber.MaxValue = 1; - RelativeSizeAxes = Axes.X; Height = barHeight + handleBarHeight + handleSize.Y; @@ -130,9 +86,11 @@ namespace osu.Game.Screens.Play.HUD }; } - protected override void UpdateValue(float value) + protected override void LoadComplete() { - // handled in update + base.LoadComplete(); + + InteractiveBindable.BindValueChanged(i => handleBase.FadeTo(i.NewValue ? 1 : 0, 200), true); } protected override void Update() @@ -145,17 +103,5 @@ namespace osu.Game.Screens.Play.HUD fill.Width = newX; handleBase.X = newX; } - - private ScheduledDelegate? scheduledSeek; - - protected override void OnUserChange(double value) - { - scheduledSeek?.Cancel(); - scheduledSeek = Schedule(() => - { - if (showHandle) - OnSeek?.Invoke(value); - }); - } } } diff --git a/osu.Game/Screens/Play/HUD/SongProgressBar.cs b/osu.Game/Screens/Play/HUD/SongProgressBar.cs new file mode 100644 index 0000000000..db9c8901b4 --- /dev/null +++ b/osu.Game/Screens/Play/HUD/SongProgressBar.cs @@ -0,0 +1,70 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using osu.Framework.Bindables; +using osu.Framework.Graphics.UserInterface; +using osu.Framework.Threading; + +namespace osu.Game.Screens.Play.HUD +{ + public abstract partial class SongProgressBar : SliderBar + { + /// + /// Action which is invoked when a seek is requested, with the proposed millisecond value for the seek operation. + /// + public Action? OnSeek { get; set; } + + /// + /// Whether the progress bar should allow interaction, ie. to perform seek operations. + /// + public bool Interactive + { + get => InteractiveBindable.Value; + set => InteractiveBindable.Value = value; + } + + protected readonly BindableBool InteractiveBindable = new BindableBool(); + + public double StartTime + { + get => CurrentNumber.MinValue; + set => CurrentNumber.MinValue = value; + } + + public double EndTime + { + get => CurrentNumber.MaxValue; + set => CurrentNumber.MaxValue = value; + } + + public double CurrentTime + { + get => CurrentNumber.Value; + set => CurrentNumber.Value = value; + } + + protected SongProgressBar() + { + StartTime = 0; + EndTime = 1; + } + + protected override void UpdateValue(float value) + { + // handled in update + } + + private ScheduledDelegate? scheduledSeek; + + protected override void OnUserChange(double value) + { + scheduledSeek?.Cancel(); + scheduledSeek = Schedule(() => + { + if (Interactive) + OnSeek?.Invoke(value); + }); + } + } +} From 84a0291c85550ab70db9a9aea0a69b9e8edfd428 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 26 Jan 2024 12:32:18 +0900 Subject: [PATCH 330/651] Update icon in nuspec file --- osu.Desktop/osu.nuspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Desktop/osu.nuspec b/osu.Desktop/osu.nuspec index 3dadc4e002..3b7d6cbe79 100644 --- a/osu.Desktop/osu.nuspec +++ b/osu.Desktop/osu.nuspec @@ -7,7 +7,8 @@ ppy Pty Ltd Dean Herbert https://osu.ppy.sh/ - https://puu.sh/tYyXZ/9a01a5d1b0.ico + https://github.com/ppy/osu/blob/master/assets/lazer-nuget.png?raw=true + icon.png false A free-to-win rhythm game. Rhythm is just a *click* away! testing From 6e3eb674f61d6865d5c39cc25a4241921796f989 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 26 Jan 2024 12:55:36 +0900 Subject: [PATCH 331/651] Move cast to local function and make direct cast --- osu.Game/Screens/Play/HUDOverlay.cs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs index 4fc37b8bb5..32ebb82f15 100644 --- a/osu.Game/Screens/Play/HUDOverlay.cs +++ b/osu.Game/Screens/Play/HUDOverlay.cs @@ -258,14 +258,13 @@ namespace osu.Game.Screens.Play Vector2? highestBottomScreenSpace = null; - // cast can be removed when IDrawable interface includes Anchor / RelativeSizeAxes. foreach (var element in mainComponents.Components) - processDrawable(element as Drawable); + processDrawable(element); if (rulesetComponents != null) { foreach (var element in rulesetComponents.Components) - processDrawable(element as Drawable); + processDrawable(element); } if (lowestTopScreenSpaceRight.HasValue) @@ -283,33 +282,36 @@ namespace osu.Game.Screens.Play else bottomRightElements.Y = 0; - void processDrawable(Drawable element) + void processDrawable(ISerialisableDrawable element) { + // Cast can be removed when IDrawable interface includes Anchor / RelativeSizeAxes. + Drawable drawable = (Drawable)element; + // for now align some top components with the bottom-edge of the lowest top-anchored hud element. - if (element.Anchor.HasFlagFast(Anchor.y0)) + if (drawable.Anchor.HasFlagFast(Anchor.y0)) { // health bars are excluded for the sake of hacky legacy skins which extend the health bar to take up the full screen area. if (element is LegacyHealthDisplay) return; - float bottom = element.ScreenSpaceDrawQuad.BottomRight.Y; + float bottom = drawable.ScreenSpaceDrawQuad.BottomRight.Y; - bool isRelativeX = element.RelativeSizeAxes == Axes.X; + bool isRelativeX = drawable.RelativeSizeAxes == Axes.X; - if (element.Anchor.HasFlagFast(Anchor.TopRight) || isRelativeX) + if (drawable.Anchor.HasFlagFast(Anchor.TopRight) || isRelativeX) { if (lowestTopScreenSpaceRight == null || bottom > lowestTopScreenSpaceRight.Value) lowestTopScreenSpaceRight = bottom; } - if (element.Anchor.HasFlagFast(Anchor.TopLeft) || isRelativeX) + if (drawable.Anchor.HasFlagFast(Anchor.TopLeft) || isRelativeX) { if (lowestTopScreenSpaceLeft == null || bottom > lowestTopScreenSpaceLeft.Value) lowestTopScreenSpaceLeft = bottom; } } // and align bottom-right components with the top-edge of the highest bottom-anchored hud element. - else if (element.Anchor.HasFlagFast(Anchor.BottomRight) || (element.Anchor.HasFlagFast(Anchor.y2) && element.RelativeSizeAxes == Axes.X)) + else if (drawable.Anchor.HasFlagFast(Anchor.BottomRight) || (drawable.Anchor.HasFlagFast(Anchor.y2) && drawable.RelativeSizeAxes == Axes.X)) { var topLeft = element.ScreenSpaceDrawQuad.TopLeft; if (highestBottomScreenSpace == null || topLeft.Y < highestBottomScreenSpace.Value.Y) From 347e88f59772f0dc0045f46dc1c8e060ed8b51b9 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 26 Jan 2024 16:21:48 +0900 Subject: [PATCH 332/651] Add note about using `static` callback --- osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index bffe174be1..e30ce13f08 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -686,7 +686,7 @@ namespace osu.Game.Rulesets.Objects.Drawables /// Applies the of this , notifying responders such as /// the of the . /// - /// The callback that applies changes to the . + /// The callback that applies changes to the . Using a `static` delegate is recommended to avoid allocation overhead. protected void ApplyResult(Action application) { if (Result.HasResult) From 6cfd2813ede27126f002ace78e3def0e5f7b03f5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 26 Jan 2024 16:52:03 +0900 Subject: [PATCH 333/651] Fix incorrect cast --- osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs index f68198b967..e15298f3ca 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs @@ -194,7 +194,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables ApplyResult(static (r, hitObject) => { - var drumRoll = (DrawableDrumRoll)hitObject; + var drumRoll = (StrongNestedHit)hitObject; r.Type = drumRoll.ParentHitObject!.IsHit ? r.Judgement.MaxResult : r.Judgement.MinResult; }); } From b6fa50c312c6b47b37cc6037688c303e5c039b24 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 26 Jan 2024 17:48:36 +0900 Subject: [PATCH 334/651] Reduce allocation overheads in `SliderInputManager` --- .../Objects/Drawables/SliderInputManager.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/SliderInputManager.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/SliderInputManager.cs index 95896c7c91..148cf79337 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/SliderInputManager.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/SliderInputManager.cs @@ -215,8 +215,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (headCircleHitAction == null) timeToAcceptAnyKeyAfter = null; - var actions = slider.OsuActionInputManager?.PressedActions; - // if the head circle was hit with a specific key, tracking should only occur while that key is pressed. if (headCircleHitAction != null && timeToAcceptAnyKeyAfter == null) { @@ -227,6 +225,20 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables timeToAcceptAnyKeyAfter = Time.Current; } + if (slider.OsuActionInputManager == null) + return; + + lastPressedActions.Clear(); + bool validTrackingAction = false; + + foreach (OsuAction action in slider.OsuActionInputManager.PressedActions) + { + if (isValidTrackingAction(action)) + validTrackingAction = true; + + lastPressedActions.Add(action); + } + Tracking = // even in an edge case where current time has exceeded the slider's time, we may not have finished judging. // we don't want to potentially update from Tracking=true to Tracking=false at this point. @@ -234,11 +246,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables // in valid position range && isValidTrackingPosition // valid action - && (actions?.Any(isValidTrackingAction) ?? false); - - lastPressedActions.Clear(); - if (actions != null) - lastPressedActions.AddRange(actions); + && validTrackingAction; } private OsuAction? getInitialHitAction() => slider.HeadCircle?.HitAction; From 68d5e8affc69c6d219c85e220913a27749551035 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 26 Jan 2024 18:50:40 +0900 Subject: [PATCH 335/651] Use a better constant for playfield positioning --- .../UI/TaikoPlayfieldAdjustmentContainer.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs index 9a5fc90a05..c10e505f50 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs @@ -28,6 +28,8 @@ namespace osu.Game.Rulesets.Taiko.UI base.Update(); const float base_relative_height = TaikoPlayfield.BASE_HEIGHT / 768; + // Matches stable, see https://github.com/peppy/osu-stable-reference/blob/7519cafd1823f1879c0d9c991ba0e5c7fd3bfa02/osu!/GameModes/Play/Rulesets/Taiko/RulesetTaiko.cs#L514 + const float base_position = 135f / 480f; float relativeHeight = base_relative_height; @@ -49,14 +51,7 @@ namespace osu.Game.Rulesets.Taiko.UI // Limit the maximum relative height of the playfield to one-third of available area to avoid it masking out on extreme resolutions. relativeHeight = Math.Min(relativeHeight, 1f / 3f); - // Position the taiko playfield exactly one playfield from the top of the screen, if there is enough space for it. - // Note that the relative height cannot exceed one-third - if that limit is hit, the playfield will be exactly centered. - float playfieldPosition = relativeHeight; - - // arbitrary offset to make playfield position match stable. - playfieldPosition += 0.022f; - - Y = playfieldPosition; + Y = base_position; Scale = new Vector2(Math.Max((Parent!.ChildSize.Y / 768f) * (relativeHeight / base_relative_height), 1f)); Width = 1 / Scale.X; From 04cae874b0e0a6f98ba40aa048c6b6f08120c667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 26 Jan 2024 10:51:52 +0100 Subject: [PATCH 336/651] Handle forced logouts due to password change too --- osu.Game/Online/API/APIAccess.cs | 45 ++++++++++++++----------- osu.Game/Online/OnlineStatusNotifier.cs | 22 ++++++++++++ 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index ebebdbbfc2..8b369d0f3f 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -86,7 +86,7 @@ namespace osu.Game.Online.API APIEndpointUrl = endpointConfiguration.APIEndpointUrl; WebsiteRootUrl = endpointConfiguration.WebsiteRootUrl; - NotificationsClient = new WebSocketNotificationsClientConnector(this); + NotificationsClient = setUpNotificationsClient(); authentication = new OAuth(endpointConfiguration.APIClientID, endpointConfiguration.APIClientSecret, APIEndpointUrl); log = Logger.GetLogger(LoggingTarget.Network); @@ -119,6 +119,30 @@ namespace osu.Game.Online.API thread.Start(); } + private WebSocketNotificationsClientConnector setUpNotificationsClient() + { + var connector = new WebSocketNotificationsClientConnector(this); + + connector.MessageReceived += msg => + { + switch (msg.Event) + { + case @"verified": + if (state.Value == APIState.RequiresSecondFactorAuth) + state.Value = APIState.Online; + break; + + case @"logout": + if (state.Value == APIState.Online) + Logout(); + + break; + } + }; + + return connector; + } + private void onTokenChanged(ValueChangedEvent e) => config.SetValue(OsuSetting.Token, config.Get(OsuSetting.SavePassword) ? authentication.TokenString : string.Empty); internal new void Schedule(Action action) => base.Schedule(action); @@ -270,10 +294,7 @@ namespace osu.Game.Online.API setLocalUser(me); - if (me.SessionVerified) - state.Value = APIState.Online; - else - setUpSecondFactorAuthentication(); + state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth; failureCount = 0; }; @@ -356,20 +377,6 @@ namespace osu.Game.Online.API this.password = password; } - private void setUpSecondFactorAuthentication() - { - if (state.Value == APIState.RequiresSecondFactorAuth) - return; - - state.Value = APIState.RequiresSecondFactorAuth; - - NotificationsClient.MessageReceived += msg => - { - if (msg.Event == @"verified") - state.Value = APIState.Online; - }; - } - public void AuthenticateSecondFactor(string code) { Debug.Assert(State.Value == APIState.RequiresSecondFactorAuth); diff --git a/osu.Game/Online/OnlineStatusNotifier.cs b/osu.Game/Online/OnlineStatusNotifier.cs index c36e4ab894..dda430ce6f 100644 --- a/osu.Game/Online/OnlineStatusNotifier.cs +++ b/osu.Game/Online/OnlineStatusNotifier.cs @@ -11,6 +11,7 @@ using osu.Framework.Screens; using osu.Game.Online.API; using osu.Game.Online.Metadata; using osu.Game.Online.Multiplayer; +using osu.Game.Online.Notifications.WebSocket; using osu.Game.Online.Spectator; using osu.Game.Overlays; using osu.Game.Overlays.Notifications; @@ -25,6 +26,8 @@ namespace osu.Game.Online { private readonly Func getCurrentScreen; + private INotificationsClient notificationsClient = null!; + [Resolved] private MultiplayerClient multiplayerClient { get; set; } = null!; @@ -55,9 +58,11 @@ namespace osu.Game.Online private void load(IAPIProvider api) { apiState = api.State.GetBoundCopy(); + notificationsClient = api.NotificationsClient; multiplayerState = multiplayerClient.IsConnected.GetBoundCopy(); spectatorState = spectatorClient.IsConnected.GetBoundCopy(); + notificationsClient.MessageReceived += notifyAboutForcedDisconnection; multiplayerClient.Disconnecting += notifyAboutForcedDisconnection; spectatorClient.Disconnecting += notifyAboutForcedDisconnection; metadataClient.Disconnecting += notifyAboutForcedDisconnection; @@ -127,10 +132,27 @@ namespace osu.Game.Online }); } + private void notifyAboutForcedDisconnection(SocketMessage obj) + { + if (obj.Event != @"logout") return; + + if (userNotified) return; + + userNotified = true; + notificationOverlay?.Post(new SimpleErrorNotification + { + Icon = FontAwesome.Solid.ExclamationCircle, + Text = "You have been logged out due to a change to your account. Please log in again." + }); + } + protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); + if (notificationsClient.IsNotNull()) + notificationsClient.MessageReceived += notifyAboutForcedDisconnection; + if (spectatorClient.IsNotNull()) spectatorClient.Disconnecting -= notifyAboutForcedDisconnection; From a2e69d37e8444a75763e9e974bf32e4eb2ce1dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 26 Jan 2024 11:17:32 +0100 Subject: [PATCH 337/651] Add basic testing of failure flow --- .../Visual/Menus/TestSceneLoginOverlay.cs | 54 +++++++++++++++++++ osu.Game/Online/API/DummyAPIAccess.cs | 22 +++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs index 0c0edca995..5fc075ed99 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System.Linq; +using System.Net; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -9,6 +10,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Testing; using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; +using osu.Game.Online.API.Requests; using osu.Game.Overlays; using osu.Game.Overlays.Login; using osu.Game.Users.Drawables; @@ -19,6 +21,8 @@ namespace osu.Game.Tests.Visual.Menus [TestFixture] public partial class TestSceneLoginOverlay : OsuManualInputManagerTestScene { + private DummyAPIAccess dummyAPI => (DummyAPIAccess)API; + private LoginOverlay loginOverlay = null!; [BackgroundDependencyLoader] @@ -49,13 +53,63 @@ namespace osu.Game.Tests.Visual.Menus assertAPIState(APIState.RequiresSecondFactorAuth); AddUntilStep("wait for second factor auth form", () => loginOverlay.ChildrenOfType().SingleOrDefault(), () => Is.Not.Null); + AddStep("set up verification handling", () => dummyAPI.HandleRequest = req => + { + switch (req) + { + case VerifySessionRequest verifySessionRequest: + if (verifySessionRequest.VerificationKey == "88800088") + verifySessionRequest.TriggerSuccess(); + else + verifySessionRequest.TriggerFailure(new WebException()); + return true; + } + + return false; + }); AddStep("enter code", () => loginOverlay.ChildrenOfType().First().Text = "88800088"); assertAPIState(APIState.Online); + AddStep("clear handler", () => dummyAPI.HandleRequest = null); } private void assertAPIState(APIState expected) => AddUntilStep($"login state is {expected}", () => API.State.Value, () => Is.EqualTo(expected)); + [Test] + public void TestVerificationFailure() + { + bool verificationHandled = false; + AddStep("reset flag", () => verificationHandled = false); + AddStep("logout", () => API.Logout()); + assertAPIState(APIState.Offline); + + AddStep("enter password", () => loginOverlay.ChildrenOfType().First().Text = "password"); + AddStep("submit", () => loginOverlay.ChildrenOfType().First(b => b.Text.ToString() == "Sign in").TriggerClick()); + + assertAPIState(APIState.RequiresSecondFactorAuth); + AddUntilStep("wait for second factor auth form", () => loginOverlay.ChildrenOfType().SingleOrDefault(), () => Is.Not.Null); + + AddStep("set up verification handling", () => dummyAPI.HandleRequest = req => + { + switch (req) + { + case VerifySessionRequest verifySessionRequest: + if (verifySessionRequest.VerificationKey == "88800088") + verifySessionRequest.TriggerSuccess(); + else + verifySessionRequest.TriggerFailure(new WebException()); + verificationHandled = true; + return true; + } + + return false; + }); + AddStep("enter code", () => loginOverlay.ChildrenOfType().First().Text = "abcdefgh"); + AddUntilStep("wait for verification handled", () => verificationHandled); + assertAPIState(APIState.RequiresSecondFactorAuth); + AddStep("clear handler", () => dummyAPI.HandleRequest = null); + } + [Test] public void TestLoginFailure() { diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index 08b1733aed..435c100c9a 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Localisation; +using osu.Game.Online.API.Requests; using osu.Game.Online.API.Requests.Responses; using osu.Game.Online.Chat; using osu.Game.Online.Notifications.WebSocket; @@ -133,7 +134,26 @@ namespace osu.Game.Online.API } } - public void AuthenticateSecondFactor(string code) => onSuccessfulLogin(); + public void AuthenticateSecondFactor(string code) + { + var request = new VerifySessionRequest(code); + request.Failure += e => + { + state.Value = APIState.RequiresSecondFactorAuth; + LastLoginError = e; + }; + + state.Value = APIState.Connecting; + LastLoginError = null; + + // if no handler installed / handler can't handle verification, just assume that the server would verify for simplicity. + if (HandleRequest?.Invoke(request) != true) + onSuccessfulLogin(); + + // if a handler did handle this, make sure the verification actually passed. + if (request.CompletionState == APIRequestCompletionState.Completed) + onSuccessfulLogin(); + } private void onSuccessfulLogin() { From 243c2bc9b420b264e5a48b34fb4d7f3bd78d155d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 26 Jan 2024 11:21:23 +0100 Subject: [PATCH 338/651] Make sure the polling connector actually auto-starts itself --- osu.Game/Tests/PollingChatClientConnector.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Tests/PollingChatClientConnector.cs b/osu.Game/Tests/PollingChatClientConnector.cs index 1cab24dae6..f1b0d9dd7d 100644 --- a/osu.Game/Tests/PollingChatClientConnector.cs +++ b/osu.Game/Tests/PollingChatClientConnector.cs @@ -32,6 +32,7 @@ namespace osu.Game.Tests public PollingChatClientConnector(IAPIProvider api) : base(api) { + Start(); } protected sealed override Task BuildConnectionAsync(CancellationToken cancellationToken) From 9dc2a1d6f8892d7a548df60b1a21f2c6eb66dd7a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 27 Jan 2024 01:02:16 +0900 Subject: [PATCH 339/651] Update resources --- osu.Game/osu.Game.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 1b1abe3971..f2623ac2a0 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -37,7 +37,7 @@ - + From f54e1418ae8308202f963faabd5acf545ef7ba1c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 27 Jan 2024 01:25:48 +0900 Subject: [PATCH 340/651] Update to v4 --- assets/lazer-nuget.png | Bin 12770 -> 11930 bytes assets/lazer.png | Bin 326320 -> 328536 bytes osu.Desktop/lazer.ico | Bin 67263 -> 67391 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/lazer-nuget.png b/assets/lazer-nuget.png index 98a152a5a05b40b857780b2682be6a126151ba72..fed2f45149d74aee14421e74fa75dc117469d01a 100644 GIT binary patch literal 11930 zcmY*D>?Jy?fU|Y?e~=(TM8c;anath4|gf) zIi`VET1TmPKy|#$_0Gxmx|N^w_bVPMH#k?$RyK2=d(7qnUX2)6(xiQ>yDkFWe5WLy z&m8k0_rd{fo~m<ZU2uxY$;r2Z+S6HMGhviY$5JoPj+BSg^vl1u9Hw&%40qn_5rRq;ZBG65IKWCxciKHozgek~5#`O{V|Jf^ry^|45f!g;qwG(-o z*(K5U$8X8CwU>gzZN9mRejnSEUYdcnLTS?S>^PsNvRPoecqThk^14_CyZo1E2~^P@ z+DkiK3(sc~C%z7new8>U|@3rl3Sp94L&?d zqUh4h?#kO@U-H)Ff~8G~$~)CERzgM?^DDAjrAAE5LfSjga@T8z6Z2j;nGp6-pYvDe zm_r;XfmNt%zS=Krs{H69%UBV5k#-eI?6`guvn57Hy7&-<(xQEM`a+Vi9C2=RBcxx5 zQc-I%n{$C9|FVx|QL!1_tN;Dsz5&E^(&wkt+6+Rw6!Q@ZRRO!3^`F{g{vd2nbS?H3 z6BEQRO;%vhLof861y4IXSFxfHSr7f5sumIC7$f0Ui;D}9xq~YQy zm>oH*SHSG=WVV^}a)*+7Sx0A}N)S-9S)Vi}@~3KlO^gT9RmPe-wTtQ7hg?*OfN-oK z;hY>%M7NL{>?(dYMVc9syD_pp0dSF-KU3df^<22{x~|9vsZHGq38&nKLpiN_ea6Mx zZ{&!btPheM0Y`_(ph-OZVjTH(lDqP-=P(Ho`sIjPN3nmpNSpDZ2Rv#Q991Pjf}YAU zy5csNX;xp#JW;wY00a~0zseEDRqxOtvNWQcAE&bOkp!MAz-MC7sae5OFb87~Ddg}8 zQrjJOucaOF)wxMt*G!3y zhVmp)eq@FaMU}$l6xYaS;>&r!QfAKs7cm(@Y`8qq9T_AXn{tL0>}3?Rxw7(<&2Z&g z@uO_(FO|*_8P^J=bmA{o#VJ-k_TdNA8UHL$jD(BXL;mzp$8vsY!&m`9Z(0k{qn}-B zUQyjf8KD?K&!CCV{^=g+)jn`Hsz8(IZgM5E0UV)xqmB;7)+3&9U_q`h}_=wKv@ zOgu0qg@)4AbhhvgXjeshs)G?R>sZCN_WZ5I%2Yg6nqq zPBs_pMZk*ZDSsyZ!(etIL21ZJzf)C2GJSudlgz?M^}aT zVC*c7pLS2tlZ}upM&W(`tTJ7sfRuGs(1mlQddtG6!D~*-qk2@h=p1TKp8~kjU|AJx zqfqx00_bUNeO$`UXZc8Vbhd9br4II2YM2jIkBj5=0SO779>*2Q$6aJiv;!lZOil9S zZ6P3rWekDfbC4`i-$C6=wLk9e^sGLQ)_G-cIsGy<={g_kH+y?Xq-xo#6UM%8SfcTmQ71(Xz5{B4 zkVm39V@xj4n$j~iiVlhP8=nJL%k-wzQ8GW|7kgCeEn4#j29VRI-X5>(ooQjL#l)cY zC|g!X55mPMwcd{|)!K90%}=7&$L$CteNfR6Otdqh4b`hz{j0LOz;oL=drDkZ0bM*E z0CCF>y+#l`=>lMwb}>Ael0B0jj7Tqnadl0V_sDhFwAp0Q)k)3E1K-b%(&by|X{0=Y z&Xzrza1MBP3|q+Nbz~p!_M&itWh))Ah`KXbnsxE&TFbXc2nqjj-*-xAeLnAFZ14)R z0LqdE<9(PxV2p{^m?XREVExo)GiW#*DUah(A?MeVSoL7Im^RCGAOLds(PQFZQY-8g zsDsP_9h>Zb%jyJ*t77!a$Np>My`QP|tjG~vwnd%0Ap8eGojN^?sY=x(8(If}Zf}Ib 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 literal 12770 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 diff --git a/assets/lazer.png b/assets/lazer.png index 484bc0a449bb2ee813fad5180a1f74d368d75e2e..2ee44225bf02b4bcd19b0f6590f0695027f3f1ee 100644 GIT binary patch literal 328536 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�P+EmKxA26|%S=Qgd8!0qiA^7-woi|X3j*0-v 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
J{5A+Or%h3!A}p2lZ<#(PI-dV43!_B?rY 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 diff --git a/osu.Desktop/lazer.ico b/osu.Desktop/lazer.ico index 5051c00ffc79eceac173442cd0466750d8e3aaa6..f84866b8e93b4c7a449371b71a99b1a8c5567df1 100644 GIT binary patch literal 67391 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 literal 67263 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 Date: Fri, 26 Jan 2024 19:02:44 +0100 Subject: [PATCH 341/651] Update android icons --- osu.Android/AndroidManifest.xml | 6 +- .../drawable/ic_launcher_background.xml | 618 ++++++++++++++++++ osu.Android/Resources/drawable/lazer.png | Bin 39318 -> 0 bytes osu.Android/Resources/drawable/monochrome.xml | 24 + .../mipmap-anydpi-v26/ic_launcher.xml | 6 + .../Resources/mipmap-hdpi/ic_launcher.png | Bin 0 -> 6403 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 7232 bytes .../Resources/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3582 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 4040 bytes .../Resources/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 9537 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 11248 bytes .../Resources/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 16409 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 21398 bytes .../Resources/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 25006 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 35444 bytes 15 files changed, 653 insertions(+), 1 deletion(-) create mode 100644 osu.Android/Resources/drawable/ic_launcher_background.xml delete mode 100644 osu.Android/Resources/drawable/lazer.png create mode 100644 osu.Android/Resources/drawable/monochrome.xml create mode 100644 osu.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 osu.Android/Resources/mipmap-hdpi/ic_launcher.png create mode 100644 osu.Android/Resources/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 osu.Android/Resources/mipmap-mdpi/ic_launcher.png create mode 100644 osu.Android/Resources/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 osu.Android/Resources/mipmap-xhdpi/ic_launcher.png create mode 100644 osu.Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 osu.Android/Resources/mipmap-xxhdpi/ic_launcher.png create mode 100644 osu.Android/Resources/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 osu.Android/Resources/mipmap-xxxhdpi/ic_launcher.png create mode 100644 osu.Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/osu.Android/AndroidManifest.xml b/osu.Android/AndroidManifest.xml index 492d48542e..a2b55257cb 100644 --- a/osu.Android/AndroidManifest.xml +++ b/osu.Android/AndroidManifest.xml @@ -1,7 +1,11 @@  - + diff --git a/osu.Android/Resources/drawable/ic_launcher_background.xml b/osu.Android/Resources/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..1af30228ec --- /dev/null +++ b/osu.Android/Resources/drawable/ic_launcher_background.xml @@ -0,0 +1,618 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/osu.Android/Resources/drawable/lazer.png b/osu.Android/Resources/drawable/lazer.png deleted file mode 100644 index fc7aa8a092cb616233bc83a3328413740bb57953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39318 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 YKk + + + + + + + diff --git a/osu.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml b/osu.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..7133c9c861 --- /dev/null +++ b/osu.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/osu.Android/Resources/mipmap-hdpi/ic_launcher.png b/osu.Android/Resources/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7870430484b7a5d9433afea0af2fe479ac0e967c GIT binary patch literal 6403 zcmV+e8T{snP)7BFZcV=!fnfG22SXtTs=l#ClH}me?d*__roOABEcP6>!nqSH< z<(KlmSmw-`b1h)38!}|bjo#jmbQw5sV1LF)U*ADNjOmQoK0X8g=I!k}2f#Vky{TUd zLR<7fUyNZK)82iq>f-C``zt=QQojce9^8iO0vVsM;#ObZfdu&Y_+Ank`VF))_F_zo zZMbzS{oYq+88c?gb;c*@<1@J5fB`;X-rhb1MpC@J2iEar>q z(pJA_B&>ifD-8Ei_k|3QMg6`iit)+uxi2elpkF^vCc}qVLGtwMFG}h}*jR@>czF#V z508F?ad5Ho=L!*|pokI| zV^+J^w6y=%s!nMphi3Th;pzT-Nl+x&MrVm13{hyvdwKAKx9Ds z{{07h1{sYqU-6=D#8&f1CMHEEr^Xy#RQzFc=iiq`j)Ec>Fkfp5nk+sw=;!6-mBKRg zG|GO(iVA!@b36(&R^*rkyow;QX|no0X4K&)F9ypQtz60&Ag@*!Wn@cw#;D6rR@8vr z-h&=7#2W-+-TW`lh0yPEW;lfgH*UH=NK$h5@9+JDQK$d7D3jDaqPn^|s;#M| z+RAFGDX*mJ(h90BDx>P+GOFS8nu;o_t*WNF+FEH_R#rwaF)_4m-8vdMa+KWnQV7x^ zI&g0Ff7fVh#>*o}nIA6;^Xe#aBe?Sz3qENUZ=K>W(#E>QY zYsy&o38lThmC~LKqqKlf4bN?$^x4}fbLnSf{pV4-a4M0iE|hBh83hFev}x038Zu;P zi(JekQw<)do15DkMqOK6)MAf2cIE-gF{nAu@$u2JW6ibflQVSaFbW9?A*HO0op(wsSer-vVY#OD5vps(kUBbB?myWelrxkW`aX6yOL)_Pio;loGJ zkt0W_va(Wh4^}EOct2%M-5{it1#A@(Dg!@kG0>;LZzH9@vW2p?d_`4-B{DW*)`krm z>9NNivyr0-sEm6TtJG;6%&53)#c8Y11T-Lg0$*0?JzX1?2>66jy--7y*LJ=fKgyijUVUr^0%H(*M4b@}_K{QYNP!0fuvXz;)F|o!jf9*MWHJlrYK)JuKFWd+*z~ zPht|s7?E4;DwyT<(RKl32JGFtw>NZe($y3}US8gzAO#y;YPM=_!HC)9%P+sIw;Ygz zcu~SnS%anw&WrtwzqPu??aaT;?X=&;ew+2Nwor~AleFfbkOWIYOd2?FkdUJ?ZnMmQ zvLX);k1f!>SvOn(6Vx!H4aj$La_XSdP`{^cQ`mX}&_R*I%r=?l z0D*x)WU*MqdaNvd(hh3)|=7PxVUfnTOU&;C!&yP`SRs9GMmxhX8k^A4jjKmViUWG z8)l=iZDMF2{{8`yA!DhK8M2@9CU2m8h9ar{e6rzOCjwBv&F#(CjK7WJ*sIH)yq

hXXd58AgjET+-K0B!Ls0lASGI$^8N`YwH)*{_2n(r@GclBMO?8dHisf)W0Da|X zZX@l&wDHaLK;S0IncQ$K+n?{Z|1`^1N8f+{z07E4`Aq~#NO5s-d&@34T&`scny4C^ z2QUM91@>;RDzD7toQKy|N=cAmgmpqFS#^@^!FUbl4##mYM&9)8R2~sW1xvoD?`P#> z=E6^9Hvlsl9;R6b5P|>>XbG_|XVo4bfeSM^DA&2W_j|P^1YuyjirKMahqzZ^#5v0J zUr&|^>-Z^Z7N8(?I8I#GNO=K2anz|csy&obM^%q@0zS_kzgF+B5s|yr@k|he)ggla`C}^m@*GvA=Tmh~F;ym5sd&#xvc429*P(RwbDZdXcABbE^QbzP z+a%{w(cV*(&17bBPE&H=ER}tiK$(-)3Ne}7$1;5zl}4PWqTN4G7F%xisskE9Y(eQv z5Za(^79)H6H*zf^B7z=$v|+WcEJ(d`W8gagyi3bz)27Yu&E%lm$QkpJmJkF?o;*di zL@~W5y{bK72ql6|V)yvRUaHP7ksZS_O95So&!ozN5(((#F`1P4N;svA4WXg~QBsHN zc_-tk%vvaY@^&7llovNqrR9Psm^zJTrg5u9>8!bXsJghE%9E_J$(9|`Kv3HF)gnvA zxHa<7(wBeE_MZUa_&i<9xPs!O-TU|r>yS}HCfOS-!XwmYO zziy?-DIZYOOiuK6AEku9d`O8egi)ncBPeldD5bOVxJSm^-Lj-9O|npO5L=>wpw#iJ z#DYL(>NCM?-Ji(TZDwYsY~Y#o@R1}~5@A`mGGXPNI(1U-_8XPf>|)DWN)X;WV516q z$VpSyi0=bwV^>k?>)|3)Syn#9&fHAaup?A_G>+2#v5OMkW6NTztIR5(xQW43d?s0x zD^IXc;qDWZwP+v3`LCv=alw@I!Un3a6w39upf%z?h%4zjLD+;#;I`O^Lz|)#36wl8 zLX)l3dbYo6l7f?DEYSO}Jsl*k5qlHXbp zUW8(|Nqzfc?TN;uQ^JhRRGFc@sR#EPO)08|uMBGf|V0lviu~V!Z z@zTBpX=uo%y-M1)ZQI#Q4hjf*S2foCQlPDf8xQ#6i!X_b;q5~b3lE`^o?gi&zM2x> z2p56N)AJ}{Rybws{f>%xotDVfleXkj=~JFvKEb zlgeTAE8lEs= zqP$svE2YfbM#*f>$zy{h2E+xfp~5psqG-Y4D2jQ09i1A#loDodrLuU9fUHlBQ~Zlz zRD3L+^0ptPc)!(jdiY|BdUG>Xv2|2({t`7|1r^6;2tm0!zoXQt>ltA(ChGDcVkmL) zYD$~2jjX$mQ`VBt#DcU3wMvUenBn+-QBhIy64FeJnIP6RiMhDLOb*ITefqf0)CsE9 zbA$TVJ7$6~W#XkCGS$>~_tN>1%P3*Y3VDLDW8SCex3*C^XV?hHmFy-JX}MIDU#yW9 zl}wS(uc7$a;bKWh70MH>5@gF#bEQu%2luE^ODQqrbE+<@VAtb}JtLn{Aos*8p!kKm zD1Lk}6v;uyOoTrq{?Pzt*j;!zG0hieB99%}N<2a;nD#H)$p%*8Eca!_t?cJ4D( z?@+7uf;0=#zV&H5s1KbwbxK=@ajuatmQ9)k(hyA1PcNsaIs9Z#oTnPR{9_@jO3Nwj zixYI_<+b8oG2>QH^nx9f8<`}epba+Qvm>H-)(fTB(LBb)6%@DTb1LJ7C)QOGj8iOh ze&s$oJNA8wANv8NgdULimGf;3#Y}9F12PqzPL^#CyqVP(;&!1{53a7RAA<`sIVivG z(Zgw|TC5@l0b2588-qYlSXh`Q@Q+C{)h9ABM#M4+Ka5yJUyqze-;7^G-;SJ5r$;ZL zxMx1l+OSK;JpDc$8#0f+9kY;*O0b%_3ptV{sFDs)z{pnA3bZATvl1C>e=lS5m zOb*Jg?!EV3m&PnNy;=6!Yp=`AVeUyBm?5kgc)~HGmeHA^izsH~QaZ=yv7?sPBWA=> ziXQ$RMf0_@Bei4ni1#Rp+c#>*E*v#{3B^9m7ByBQuHhalh0ya%4%(_ZNfN7S$YQa` zdpfiHCW6Eux^?UJG`P6N&Wiq8L~mv>3msZA)sGl4Qa(O_64S#XKQ?cSGqC<=>dOA)fg+p z>d?MnTn_Gk+0O1&A;~O~T3gv0L3DL-aox`x+}6~qpBr6VTwX!r<}3(t2{RnB)BJpG zX35_2mBbwcU^CzvXW1%ZIp%1;-xrrMw~OXFxYF4XOV};nrKn+x<=hb>`8wRUQQheG zDEF{7vthGLy+|}ei?1?MOIp*TM~^qbK~n@>->zM|?%Xk_DUx8W7!aSGV7nkJY=dlV zRuz`g`R7CF94ik3%!pwtied$D9VDFN-{v+(;JUQ4b4@|UGmVq_-lr0rF?-FNIg4es zbuYD=$J-mcU}Qb=ZoBO^d{~7q&urq46#b>y9e9a`K^(amm^XeOgjF(D%d(u{%agn}w^kqv$Et11rJ}-g@h8 z@pmMBS>az%^fMf2d3wflY&@PFy_8NqHD8Vm^~N^pTnEoir{{|#9rE9O_uZqRd$Vs=@4N55-|(R=cRZw%WY>yRjs)NwyLIc< zg=)zjXTE7`4$$e5i)Hz6nxCw~$sr5q#1r%A%*Z8@-?Rjgqu!Ig=6WNdCw)LUpP!V( z6>G$|-+sHvnM>C}@;y$FBUtBly6#OEox#?e4~)SL99fZu#(C014?RqW4U}^^8-)-j#lhuIq^Q3l?&)F2w$GaB#3g*D^r1 zH!#t3?AT=zbZ+sNubn%0{w*Kc^Wt@{K3I!Cph80S%{SUMCjw>mj&Fq|%q%B|Eu*kzQoWG|Ix z=F7u?TdiCfY=<0MH&clr$DU$N3z zd3l-w71lz^*maanPg_MNM(}#;sd<--LE0yD@ zBV;auN`Q z*TL3*ouc@8AJdOxIkt>kvpfMqy4<61qEhz`}Nmf-^M$NX69j?XcNfPVi0^M31m>re&?c3w8jN7zr+xAITR^pMPsb4{5 zsSrxfH{^%_K6martlTkny*vr3%CeByVHT1v#PAV$WtGG)WhvM-z^eSffdlmV>oa6` z&}=nE7%fPbN8b?hC~4EC%`oVs>-L|QJMOpxJ8T`gcD*ma)6+`=TyrF;JV_mm4>}hFf6d4&QgkUK%Yt}3pI&^5gWti`0i-w29?k?nb zczD)z?tJew*5w{ur^|LNb7{rvl-u~&nX~Md`}Naavb8iOIfAkP$YiE- z&rGf5uBB`~mL+kWHV;|Lf!!%dd3b z?#SqI&pr3}_wL>2E6jAtq7V-ZWQk>gNGOFpB^+Bwko->%jD>Ad5YwlR3zO2T&dI6w zR~l`s@Dpl(<4rf+g#X5ZFC(0IeKWCV&tCsz*RyE3OTATzWpQ0C zk~b*IM||BSf!++XH9#j^zG>#=f{Uel_wN7v{qNghyTS?gh74DO)i^5GApz6f4n+0f z^l4zXZr%Ro?A+%Iju#m!d4rO$80BgP@@#;%$_<(D47SjJVa%Ivz8NcVSWH*kQ&0XJ zZn$4feMOd!3Q5)%xA*Saa1CwH7JbkcWBk7%rKy4-3Ps@>m~EgqUbz4`M;)%A&CeEa{|$f5Clc18 Rc+vm>002ovPDHLkV1m2~j8Omp literal 0 HcmV?d00001 diff --git a/osu.Android/Resources/mipmap-hdpi/ic_launcher_foreground.png b/osu.Android/Resources/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ec3e49da191d5840d72a7ae2e5421dd468fecf GIT binary patch literal 7232 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 Ef^`evu>b%7 literal 0 HcmV?d00001 diff --git a/osu.Android/Resources/mipmap-mdpi/ic_launcher_foreground.png b/osu.Android/Resources/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e22f2565625261d8ad104f2d09c70ffccb5d2ee8 GIT binary patch literal 4040 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 literal 0 HcmV?d00001 diff --git a/osu.Android/Resources/mipmap-xhdpi/ic_launcher.png b/osu.Android/Resources/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e1a9e3798869f72105dec0643dfe18e8634a54 GIT binary patch literal 9537 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�>IX}``GPV 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 literal 0 HcmV?d00001 diff --git a/osu.Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png b/osu.Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc3fa9072d0bddb5511ec97d47bd80a7513c78a GIT binary patch literal 11248 zcmd6tXEz&;!$6hN+8y?6>u1l{VpY{BwG(Pnd)E$vT2Z?;HEJ|Q>=}Cp4Mk(`R>W4s z-p~1ei|3qs-`@{#V|2CED9M<}2nYx$->JXVCmN)Pm7Hz9L>Fb=gZCXQ)GNa664qV_x}G{eaHOAs`x%>AkI9hI>+Q! zePHe9^Q%5x*rUhcFaG~=$S5`}9R9-WWrW|}oTr<;{YIvT;y|2=@sH#k@t=;?B=NE6&7aiBkM?{ZB?4xTXC$aE^SMLBBXQGQ67W(cQ9q2fXntY*4E5=`n{4p zl^`C6dD%4NMlc`r_F;Obf0*-HeOYT+Y#R`Gx)xZRI)41t#s(XF^ZFt;CjxdOEkAz!5g7RuuL{4t)I_} zd2MF=aJU8MtM&J$^AnQm>+8^Ej%n4u9-o!$?CcZ=CoN||%zJN{yhp&k!gdQ9_x+Uz4?AGWkRPh7xGsKYZ@&$B>f{&NC zwV|QmIHmdvms^+WbblsrrHsVTYw@ugCy#XePjQ}Oq{Jv+U`M`@j>j)7o&6VUN5}5z zPt%QGDFyQ=e_dy~fxhegu#BZ;H)7<5MMj!ctUgh?XlW^FZay zo_RhHAo>^khw03WgXfE9;fSmqS_7UYVSwb}lt?J$cKWuFKSmMVx9ce%V;YDQK|)-B zC(<)@QvBI1`Ir_r7@v)UX?w^#fogL`MchZ*KCrizogHqu7ZGK5fHH8FHX`M&1QT^` zy!hln$U$arwbe#VckV=5O@#HrrAq3P7%>7=_|@Ah;}&g?588Hx82O)9XDJyQ8!LM4 zPHgS$6{RdYfPyM~FoB4iD`zYFC?~nF)j(-YB1}8#GPL62g=aIA4nR?y`KgoTzDvU< z;kZ-{OfO%MWtVc)=jUAG@4J?FdU~34bepoGQaDZ#n~-p8QdW=S9v-0vv#-Q2MyLn)$BD6TOo_oj<>pJ3RpeuS;f_>}B~HuRG$R)4v6C67;qS>E z-0pT;|1OsYU_;Sltx^@n$eX2E-k;xfv4)C62HA?3Y(=>QE3DeI5kBy7Ecj(-NKUD; z*FL3nq_eUg(eq?qwFK2384Lo9Q=7_Dxru`40i^(`jnBIjx6RGX5pi^aSC4LCWZ^#x zMn^~Qu`}gi)fZE|{N<1};B?^wm5yiS=gjeJE2&djfR3M~FK3SXXZFpkZ5d#P^~vdb zG8L<@RLsqnC)u2mNZprwXU!v8ogw;0-_Bt68ljl1{m--Ngk+@I_K^COfz6sg#@GdK zHZe9F^JSnmd*%CeC@Kg; z{C!RpwY^ugguCYDhQjZgo+<0OaJju=4`T3Mb^g>G+>I| zOKYWV>_pe-t&Gy+9X{0mp|7sxL==lYYD$&7KK|yEM-owMbu_%1H+K7BM&uZoudQQ~ zpV|biVAxDJ#*753$h(SoEsk`bQXi0|BA`R6z47(XC2Hca{d%Xz{wEfwp+-= z3+wcD=V?Ufi8|P`M~nvmI12S#EPQ8_a?|u^+MvxDZ$Dl408jzbcwmg+X1ccTV5Cw4 zqs2w!EsSP9>$gWL#bf72NY|BGEKll3<-&qpS^`2cM5~5A_Yhbw*|WLGv?$0yF>K}s zKm|in)9Xq#pd5*$|4P8->91eE7JYC%BPmYUOan$mxE4I3h?r(sShpS#!|Y~lf8~t) zWDs^*Yw?zKQJf_6qT(sGLvPu4a2}&|Xc;|H_v@%`Z9lQ=C8Vy1Rn`yM&tc)(Bf536 zJ$XO6Qn6CPxKuKnI9Fv+qh?B^`mj8=R>@5ZC)!_lvGeX=^?*t&{x_35t=O1gf++*V zoAJ#IZF+gu5bV;Y#6TdjLt?M@w9$|^yCqSdyXwab8o2285DW%~;=j-{*P6{vOgw?} ztC%~71&+`QzyGH3ka+jq&-YmJ=FlcW9Mz4z&3y~H6XW%jZD_XtCD=f+99&sjkfg1q zre>(FK1?sSh9Y5!c*Vid-8aop*|MlbuQxX0Q4SD>2zRg(qYzo2qnzV|4eH)UDKo^^ zc)d!S&>eKH1~LX{0Y*eaa{}6tGx)Sx&-CaTv5rE;P|hHL&1$Cr5}UQ@3d72^kL+n5 z2o%dw&Dt=*gyaq=Bal?P@6gB+}8*B_63Kt$oHWU@#b`Hc4?@hCy5Rz8xPk zO$EB->py)!NT!9F ze8UDncgjuA!B+SI@0d8~raHG#j~AIuWl>3JG0bTx0ysvv0BZI%h}ot+_5xeWxQf&O z!Gpjd{BqW^=i#4TcF2!!(pC(O9;;pKhwL8LXwsD>tsJ^yru~xSw7NIG%sJ-sCn7uw z6cmGn{3SWRWd`)^84)l#<(`1D;Ny-y!Ody4u)>V%gc&aPS-Yn!YCmcEeMq-jOBq`ohfEc%H(X)OpNa*M5#nqL7x1Sf%f|Y=Kp$y3>Wp z;*2n+^YNBNpA4b+qt2q}|cB2240dCdy~*tkr1i7Z-F zWq0qH-_8_$gJd1FgPuQnEF~@>u|Jtk5c_~wDTt8FfT>xPx4v54oltpT()`vQJ3%?1 zRq!=YM8SfT-H19mt?pz0MdfvRYTJ2GN>_fWAoW6FMdDn^8;Shkf@jra-}24rA@?WI zhO#920GemdpLjVv3?M9#fQu|~1GDmP)! zgd;ko3K_G&zf<-J9muzV=NrWf4!zxcf{5vYI7k4vxgT}Lh;q%0w{j^c+;v~vH#ZIJ zPLid6OsiW{@{Aq2q(xE_;-(V_R|p3`Qj+u7J_*A-qTu?%0P7a2wPgAi`lRK@zBX3e zgr)R9mi%FP;SQsa3ulB(nr){Rf?2^I&(x)}Yd%gpo5jqg9L1b8hkx*W9GP}-?|a4m z>O{C2dp3K&6&kWVHtAeT6KlsX8VDEYB*kRwc$>%e8}g%O`Xfl?G%PXnoT%r*pDm$OX!HAZ?Gqo z9j_TE20n_z(N?(uM4Jv`3zQ(5SZ~q3(T)#Al!H&D*(F~`(A_XIfxlEAobT_R|({7Rh zU_s;W*`wD0W&>U$v0u0Koe09cbX>9s^f4kgD%Nu$xccN*blNCp{Bsd*&dY+0% zdA;9a9=b-F=dn6n)G53*6qM3LU_>J6nI0=O&dx@W zuc(`ctF5eqD$cSr;)vmJcm&b3= zxir)Nf<~Em^PhaYQZ=Fncl*V9DI4+iqsfhxT3?Rv-j~njTIQ?|y>5+tYP>)!KcdZa{% zBm>|HM`-7qKTJ{dOUD=S#UqVvGJfL%+T8+_+}zya)kt!$1!wK-?6hX?ectPyCR!lk zhd^0Y;RmczxxX-Rx`Vo@89K&`iMp6I^R#-XFfEI;PL;xTU-W_5riI9hifkgnnuU`cvVZ14bF`caaivAoi! zu~AQBiVY~a#tD@8$d<<{^L?x~m*wtRUT#Mgdc0&26Opkeie_QfQZd`W)q+8xfLS_A zpBITEu?2C(^m=_+>aomCUq42V7kek6bOo8cf^5ifZr5K^hJ@hpzxC4O-J>eP0!ph& z%p?_ZL;nPRn5ww5$&{g>_@4S}t^P@pC@XkCqdQDXghJrcIE1{v&(q4W#fVW%O1f(l zGc|Sc@}BxbE-3KX^-HO=w6xLsTkQLP_5R?Xhp=_7GN8o<-v=(EpdD?8oq67b1agve zn)B1zRae4Mug>VM03^!#~0JJ3I+(yk!+;hI<~%?4>b1U;~=ewdc?-7}SXU1f+ z8*>y-(cyyFEp{*XG&MCxi0|0fiAO`wf9mV&iJL=nf0}maFfz~-o8Gw5XDk6mD5EH_ zeCgxWUllxF=CO8u#(cQ+F0Cs5mbY0hQ}u;O+d=P$yd5O5i^)QzUF^}BD(JRe=kAb= z|3R4Gtb@Q5jSZr+|2kj8y<31X!NuRWofu3Sfov26*3JoidYWZ>Zb96SCE zsj0zb=tYqlMdfOkA`J005E zlYtR0kyuTsKanOtp^g5T*7i$1kf*L#EtzFcgz?A->&S}uXiGHl-YqD^pGfnVfrKmK z*X`F{6bdCgf9J^+Iv+AU_B%n7ml7dc*;9tbb!^=fJyqBwiW&_V16*t9d5f9{gwq&q zEJU)HnoZ(Fn_8&Qs_6%#WtV9zt#LbEEUP!(@TwLV8C#GFV<`TMI$x;TK}mENszpK0 z%7^!*HcLE^snR`XA-0~ zBnI(n1Ba8hxgN^yYl==wDMk?6g!h$|itxwizo1fH9J=OqkVSmDeF^^>W34x3rtg+C zfcJ%P}*xT_!0==V-q-ee?5oP#JLgQsQ~z@h4YE zPPp5Ut0#kpW(bd}FLv`&JI~^)$L%z1xGh!Td4G%aC`ks)z_MbJ_L5>W)#|w%YkMdi ziZW-Mq*Gj1d!~#B%}_UGs1Q;-Bw@D!oHliaS6Ba&Pda&ZW?HQndUxZvs5k~i%3 z*U0_rQ8?2_21eYu?O<^IN=@#(>|T`E^z?KM#FnLU)oVGCRraptuC$-LkQJU5o6c#o zuHV#TSTUihY3+eEZ(RKSG;CWrAT(H+mkTH+V(1&w`GiK)`-Tj$;NP2E8dH%Zz z6Ah?*TVLd(S+t2*L=C5l7llM%oU4=4j#v#sve?P$QcTL=v{!QqjT7fu*E`x9`;%c79}Pzt6lqSAxBF~D|k5kJ~3oulP&b-=)m94Z$ZI1s`+ULF%7ruz?M?K z$72f0eadMrYa*c3l^x=pr{Q$LT-S3a5X)&k;PcIz5CVdG*t9;+_3!$*zuwM>?DPc# zT3|6iHEt6z^-h?!vo@~d??}QKd#R>_P82x0s(>$$*R>pYPhL!~?}j+0O`cg}Ld;#f zq#a+V`Tz8Xs&pa=)e99dw0S9erA=2 zNVskX(z%j-qewAx&rlfpXgS2a zODB$2w-c*}d4Z0MO|7GVJ${u(*zJJ{86T&M5i=FDx0yzJv#AWVFPmq@bxq$1Hl@$X zENB+Ik^~26Lh_EO-|FJy7Ek{Rj!42KEL0$Vl!cQTzVY1ENvMK-TpM?CU$+Z;_*WKd zEHJAaSnBpaJdAWyw00F*wEIAq)*Te~ELsqBuH3CQ7;FM>!<#mR`Buw_-(8M}4if&r zD|}ESrrZ^#p`!!Zds`)E*q(9eGASEgqTH=6(gc7s1;cfdnfgCt{@dAUL^AI>zdAZA-TlDVSZ4}-=Bb|X>~XvXOHG{eUjqxO4!=>`L~{Cc2UVCR7oH^&W1;^ zth7qoyQ>DNUxSK^oAT-{WZ!VBsg)hSW|XcG5E6R{<&|(z4R`6h*i6`A%Q{z=svUtQ zb#$BWir_akHqu@y!=Td~{FcaZjqxA)n0n-vqvJyqRVc4+o{ z_r3)9KryfI?h5MZF)~viJglQqd%>w3jau} zbA7yYAvHpphSGuZ_E4~itysX5Hd z%=-s^A~FrD;xvyEpcNPCW6jk4JrFR%U`0{-oA0bw&+?cRzKC@)z~VArFmqTb9edi>--7JXB5K z+b%Ek-rhTW45kWXehRA-l>6^1-Rznn3_$0QJJM?X)W>Q46*ztHA}fC-t&x;}Dp!U7 z=Cw;)Ow47B8c_O59ugP=P*hy~O;rIoC=z{WpjW98y;|}iom3|{Qi)N_cw0!mIe1`K$MkKdx%rF43f&M{?#Z7wIjq|iAPr7QFnd})F$m8|N{)l&LL@=-ZVJm{b4&^{;KaX&mf(1l07MdP*eGZoO{<(N1 zsB$WDlqmbJ1;v52B#LFG7q++&bB8XHa1-;4qPJvRl(M)b&Isf1p^DpSZ+7JLU1XmTu-m~cGgA&|M8 zwGGV_6ch8#P(wr$QORj_o0yyLXHDz*O20d$*g^YorT}KPXeRpgZm0UcQf;4plG0=4 zr531-Dl`(#>x{`i!#-ir^o?y9P#WC@3FnP1Z*MJaZEckWt;KMMtS4Va6H!T2U~kV? zsqKXAO^=>?KkrQPpg3u1jVZSZYyqdFt=a7HLo66nF^5r!;=TVRSGaumZ<=mQHB-c= zi(_ByX)gOpiZ-iVeDb#EOmJ@K+7=3QP)`@^>3L+|H7*tKlAF2yS30Y7q`|g@>QGK|9M9fi~qP84*XteR<_ymd<=eZ%`w%*JLBV* z?J?p}vOgwfnKyfBIbN4Oo7XI>_;5%o@AO*;IpA!%-hH|4{%rUU{xfkNt0mB9Yr=Lb zLQ7^Y&hFN?J@kfmL4={=BH`5&hh-D|k9f1ue5+&^#=|E+IXK!!$PBe>MYM$Ki-LxP zydy0WdOl(1u6O>rr-)k1NNmbxJ`)xeUd6Frr;H^$7(JC*g&tS!p&B#mzc7i$^4cxc zyK}T_^gg%X?Lw*7CVg^gOA2J6aJPX)vxUIJ=l^roUEtKtY@FcXTk(6-?VBaDO2f!_ z$<7uK6wp)LF*lYctF|j2TL9VhY$B}oRYj$f(Xf-bQ1-_s(NN7!hJae7#ltZzeC5%W zF$1fLI$F?~e&60tuyg91@<|-!=Z=n!X{crQ+S3D0k=f9@UxLVjcmn)T1Fm zm}o1Hu_b3dt)g!{;9TdI)OxV|uj$y+r3vl!2{j_m=egJb_whms&hty8;Zby6kVrW6 z=NPix)YLStL@VdaCaJOWp&~-f^Xg>#er9FG-O@C{2`yNf7BiAyr2N6NaH87Opz``| z^^i~Z{SC~kBub!ZbGxEI?iOMKAq-M$+&9BU;G`zEtd$-P+=q{!pLz*`O<2V6b)o^>G{{<#8%(vd%%(vctRE244&+xFa(zz1m0$r7y`RqJm_)#_U(hYI&V6g75dr8bi&rJ&hl?(pC07unMa zdcwstfFJ7qzyF*-|Dl%eQ#fuAxIzYJH1DJb>6V6$j^*I_ehwS|+Ch(!ha!3U8 zZYZWy??L58Br#B!N-Dlg*z4+_@s5_AH~Vg1PW}_qiY&6K=w9a5K@K_frPk{W{a4K2 z76Fx)u75LDHx%M40L34=X=Cwtyni$WBR)7OK7cg%p@tU+)9#IJ;;T$;YN*72L3i#= z`6{pVA|BJQ#8yW?qOJIyb^Yz7%-X5w4WY7v_c)6hBvXR5WktM=;n2n#8S<=eU`-c?3v_MulUy%nruGk-1gAwTgZ$T;UX$+m^u!#>|i$3N)S{n z-tAd9q#Lh!G2AoUbyMXL?4qu!I>_YZlp5B&LxN5SR1=&dRf&3I$soB}a`PSD6KBrU zH2l<^jE!nr$GzyP@y#uUu;7=3_r~b=APVdohp#@)kJ-u5sg!JT7iSF)<6}E}dpd;jQu)9mgcHND?6HVAXZ$m;s~dZO;D z>6$yF8X~HX`(ZqVrNhlxjz^bF6C94ZqM(X}An~a7+jIPUT(G7X){qf^kN^ z@q*0$XHF^4C9;Conj)ho5kzPw75b>J@is~GlNl7i>5mHOwm!8oW--;%JL)Y?Qn>og zW&k%ZLd-f zv%^Y(hLyJqg2*L&KZjc44K)qO$V5tn`3IL!9A1j0XiCw&D9+4n_vfGRs2tA+*2Nlu z5L%o-Kn@=jHxv8Et$9=4IdY`Et*z^0N=nop038{s62kbJPQm-oN3EZIWiKPtZY)n$ zs=KPH3S_jFzvbvy*!DxNsX1t6AtFuYT+0sfuG>^Ab8eCIeXOBdYh=vG7A6gscA`!J zm#fR~81GhX9a)8^n3tAsxRNxb&7Ax!cwZZ$YGJXG=#U?3$4VT2qp&|JcEHd;6n)D5eJyuSxd(C!nZ{i)+7V8ZCAavK?MY#Uh&vKe~0Nu2_fF7DCBElUNW35R;XM2hZ6JXWuqv4;us9Uf9wTCvl z%vNVx)c6}{X=%wJ=a)*WEMGbrNQjHuu5WH0D1_Wx9P23Fo^(RxD4y8}kgt%rsW5bb zh@(QHwx>m+sRv1@!vQ6WbM3d2!XZa-p_^wD6P-clcM3v6?w)>rXU%JCYY|{D*a50w z>1AVMQ^LEKtUu2qoR*o%ZmqnKo|e{#A5P{N7qaY<^VymxRP5d^$@v4HsBW9KX{@pW zl{LpApOHM&^_px@Isy=ryGcSA7?zRps@IP_$nJY=ATNfgZ^Ks~tI1K2u8^AVS{^gN z;)MJ__g158<&h7PoIZ(=Ft8#%iOBgV^epxgSc@ONoqO{H24Q%H;b51eK|hUn7O6mJ lL(294>Q?RJ9=?CX9hJFGY|N!iKtMq7PDT4|^&6}3{{syLNJ;}yDaw76%zl?U=_(F=Lw8Rm1bY2_*>)K6^lNt(ff2mhLtTCHWv zmVJ0Xot3?niEuo*+Ov}x0QP@X6VN^D{ID^Ow?ktK|pHf=@?8#bZ_4H^<#6?M*?P66c+ONC>dO#9d> z4P^e`sZ~|IB--!ttu&iSoRE-)O_)3jS%LXbVxvZll@gmb4^z#E4+RDk{2Z!Zzkzx# zo-bvXdlmlduCJewanlfBB@ACtwi-Sn0GdFFGMGm%1 z%Kf9lHk~+pd>72R2$U7}1DYvI;9-g^Xg;7!uW}oiiU}wzl33({rGXU!VQ>s7_}nZ9fU60(#LffP_@ z%^IBy3k&-XWCH<}TO)1L+jp4k7FPU5h@;*{2o#Ee#lbQ5P*|Ae^FWz$y{v#|2x$R! z<`sc(4g{B;nR#C+;Aq-7?_JHCdz-cYdEcmBy?VcsV>Z=8b>f&kDoZ)yD5D!~HC=%8 zjEdvHmIV59KomI8_3DKva*HEh7Jir=Te<)lSQf73P+v0qU)nrf)aK2b-^~K~*04G* zAp&^QMM+R10HONZg$@MddD4YPlO~o245F<1_3L}$F_()x0z6M*KWIu(p0aK}HT-~Hs4asNp`oE&eaZG0xjBa*9(>my zt5Yznrp$f*a^goVgC?_gWXt>5#*G`_tIPgpyGaGOi(Z2(msw7pGKV4&_s}w%HEUK|*TK(j6BEi6sm_(k zvfqw!@{~PoL!Tdk7gid8{D-YYGM+LjgVnQHBUp@f&?0^fGqC zRefa|ipU_qp$J7H&NK68*PKZ=lG*=9CQp=39tpxhc@hW|MarOP*~1#I5~WEQP_D}m z2=plfeJI3CUkWG^HEGg3CO9})P4xfCckv~VRij3YE12=p+wxc*eHZ{k0Ol}2*;^v3 z4Dz<)d5=8uDD~~zkN)}3f6<$7zDeW8jib49=h5=z%ju(!KBA95{+K@e@IzX*Y#Gg- zJ%=Vtm_S2@4561_{s;Bx)0bMcYOP{f?q|6nbB3h8A_EN3$TgJFyss2cvS&A9d!R%C!cIZfBW0tY4YSLw0`}1 z+P{B4Wn^T~@#Dwo)TvW+{``5mbm>xoz;&d{$;qMg^mKLqx^?Sl%9N?}?6c2NhYlU- z;fEh_JsXg@L=0_V=1Q~9r1^Qp3Cc&=U!X{IpzVb&i5 zvtpUd@|PCSg=P60kAaSUa!r|d`C(yU?QQa);Eo_61Owrjf)n9czEI!@1WWVEEB~g? zKKq;wA3m&7|$H@yDO=$l!7lD9jVBZcf3$A>DPI z{pg#p8G%B!KF4eVA;j*e#N}wh@a!j^c#;MU8cbWZY@rh;PPmlo!bMj2`3rR6^jSK0 z@)VuT$)z(#xH(HXN_p`alpC8)d5M|o_nD(7=v+=7o#%8&kNaHt`9OAdHf`Fpnf~#Q zf3nZ@h^nV415Ab!8JYD81fUbhhY6Zfr%s)!y6%3=&ExlIQ!;!GjEWP@4xJJp-Z(&d zL*ihY_xX!QAAO98Gl+KX+*za_1Jay3kxwV1)9COQJ1KSE20Ad}BZ__HJ&OM842tSC znWB44qUi3ED5g7(CsP#vj_S?F&(5T{|16>dBR{6p`5WlSx;;#?G&+}i%KaPzuu7XZ zZ=rz$-%u}%$N;3VtWUt5Xa__$!NGOIS!Y6?AI~4MV+%~4upxz!M<7Ijz#u?Cy09gU zgFN)m!}R>~FVNPlTPZIu&!sfMg)`?UpRGvNH~T1Q+$R+K(maamKZ6eRo=zz}r&C6+ zS#+fL9Lnl5kB;?SKskNiqvQR&$l-H1pVfCB9p-fDoc>)0uUm% z|02qNYB8ODdMTY@oPBy3oqc8*odfJ+1svNzy3)n_S3G z5sLH2b3mpTZu;WhSV~7X>{Y&#Sw8dOMsu|~s&4KFZ;6lg$amP=88psmZxV}~UJMWQp=2OeLVXInYi%7A( zr&8j`RjOy_DnBDPH#7Ty zWJI>jAY@qpy0Zd|4VOTtW!|k9$C>=W=hC8U*KV|J+jdv?9C4Tvkq0SZ z@cVS2=QQ>`<|?NcJ`S2I5JbUNB92|xY>1*Iz2myCy!5m_jy-7{Sfa{zgv*KMHSz70 zlpDv^=z=rAiF$6_xKX_{rYr&s@}4K%VW}cetX+7x_(v za~k`?Y}F07nybYYK?(qx6Z85h_Enr|%zNDV6z7_+G$<$hBlHGi25@ii`#4n}NBy|I zAQ8saOqm1{VukA0Z}cb}zaRVbJ!`TZ>d>A*Q(=gS(>W6SJ4Tg8zwR&G(TD!ra)&c6SCn;Mq! z%EdeV1Yr>Dp^wtUkeEb2Ae>UCPTf|}ahX^lu|CYyHK+g=SS_mp@*oUf+F=M2aG2rq zn9UaAI;nHkQv&yFj`a36S(Z{PBFNrzo(YnNc#lmKTvx=wo{`tjiUpZU_M|Q3nwdt9 z&EMudatspTC5Z1gozj+ktLkTx=z|YFP%$sa1#TQ@O)nHwP zvamv8eL_M)>Z9POK;63ae!v(G1_tG0zmitK1iI?zZRvs(@+43Ff)crxg;go;Cb`rE7CyDVPV$l zB>E&g87eYm=_iygWLcp)EurgxS|RCqHEh^;mOT~oqI{Vt=2YGSAB8IxP!Ys=%&t1d znqYZA9t<}?=$7I^051u=$KLa~{T8ZYQJ5U-X{|K+eR?`QUoY8wr!~`?*R1m=`@ZM6 zo~r_ob19yk>(u!h>B3oObB2N8!Gnjej4W3{<`r4Lt#dNp$dsu+fE5BMLqkIY+ar^> z4>R+2CP@w~4j1y0jA7y77!Z_c3Sp)6g)pvV1_{yI%6NYhCG?%{i6-mHEDRuqmmCEH zgv79fdA=-gvhPCmEc1D&7luUQ`%F{8P;)#D6WF?U@1e=d8Wxffd}#?xnfe2X3vrkJ zMD^;`t3c-gA(3s$ejOUx;QzpGCdoy85HyS{Ap|PzluWeqk&%%u@}RdB*K4Zk{zAx5 zw!b*RZ@PJ|Ac#`U^MQo^3}0naB;tC;_M1l8o1#^KRF}th-+f1|TetD}KG21@4yBzE z11p5Q>ej707&;HcoFR;l0KesociQuIF3N%e*vka<(iR>AigV`7b&YMEj66tjFU(Pn z<_QSDzy0`X_p&ac$;U$RYnpQgN787s12bqLP_lQNg3G*dDF z3?^dcpe`&#Y7+;)ucEhzE<@nQ`z)ZGKJz_qazQwOX&9W=Jg+Oy*Ka8Fcway7E9{#2 zyPs8d4}tV^cHKPpF))1u(?t@7u5?XY%goHAo;`axM)19aa?7?D@Ho@8YuA1Zx-XS8 zZJV&)G;iK~j2(5p2+Jcg2=%6{G~_|AD?EIwLr5^)DKpnn5)1KIUyCphKF9;13pwz% zD$Aq+zmX1#(P1joI`7USr}uo1qOEJ*d(E_R?5hlpXV_);mdBg7oR{=+KROGE-KSE< z2U{He5aMEAe)*-El_1Wv*P(XHw>S`Inwzm1(0yr|F=f7L)TnWdeBWganp#~*ao!{z zVHTt~`0s!J>zWL9a(@cNvNH*%5>aLd_82P`)&ak9>?DX+A!4QEcX8pp-+j$rNSUP! zs_Z_}0XcXf`dXIA%mYn#-1BoNHzv&?AINLKfWHMy2Lc%wXKNN$sZymIg$D*Vir%F8 zLgd*Vws1Wx5P0H=CusNX-45YkO2&b=Kj5ZorV9Bh!mvUC&kR8p`mx^gSn%4+LHjtn zmv&w?Nm`nMVB~|m(TteqUGR0k{##idlojOnk(WANK-p$pY@q(h-KSB~=+&-BH3F?= zF>FDu?7f(9u(3f0f4w^us{ z#e-+Q_$V-ZLP zgq~$9$Jg)D0?$RB=K114<>-W1y+>0+hjTx9_t_wBKG*i z+AZHwLG{KOHf)^7K5!7YV8ibXiGS0$apP`Y=h^j;QX-7jtXbm_2FAJ)UR$DKAlWQ* z2>xgIQacR)<5_)*GYSnrcT(IHy1_J%AS+i#N4!7|d9Inq zg#b!BDx~3i4)^dr8|M{?eB4(MiY&X2a%J^n@csy_Agq^po%2JFEOque2Z10*e8wFX zKxbNX9ug9|rGn)L6^}qwt5&_4Ge`}56Bee-?I)kCaZD7$r^5*^El_a}2ns@k(r_$L zK7zIfpxi?}W;xR9*9(G~hY-ed4pvQjKCUC3d9N?{D!ahfy+`}8&o$z6I=v~L^4IOB ztk*tNbu!Zd_{t>y#rZ1Kp_6Fk$`6!m-SRFN)_g82AdJxkJ+du>tM%(Q$h`gb+be++ zCP@m~;6Nh+S(h`Ag&PCpKwEQG(ECbANOTAw`7;7EIf>_eCUlnjO8 z7(y2%7X&jO{63`Rp+nD4%4DW-<)_lkbe%KrlY8MDAO64PbT;XzC5wyvGVMrGy-=ON z0t8kQ`_7=8?ePxzMMXuaNqBCV`+~JXnm(c+({r>D1$(}9;|o=)R0#toD)>nvHF(Mn zbf-X*2V*rTEXKVYgQjeW4vt$xDLwG8V-O;9=qj~fgQrQ#I!S5Iu(jzv!@5uM zM}EA=7+Ko94UXXrEZ~5TEg@&O?41ze;22iNI|%Ol&k@%D4@g(DX3eL;i3-Ia&=qXj zUJGRNB`gQoulAq?hdRq6H^-kyBSmGPY9KA6t z+%Rg?D3*2M1oBS&vxcMq?KAeHINRp%-O{V zJ_Z7H0_8@hQNmL!=w7qcTc?^OQAzXfqamk z;~tIRI#3?f9D45cmeIT>P>VDS{=h|`1Kiv4$fK9@KAey3H=WL89&^ZX)vAvjevB_* zh(hKMdDmrX=$V=P9*?ek~n&>m$k>ut-hJ za^0)tkhb(98m47em7|+OfZUG&AWd$96##)R4Ky1fNpp%pc0`;D4m9wiiA1klfDyW$A zeVl_p@PopNut46ySN{kELe{NY7nAM(U~{9$4bIXZ_{MF4Y{INbXHBSc=Ps0*>K$3e zT$l9u8!5TRG)hx~n(bD$0hsWNzb~SbAMK>GahY`CSRP$GeU2`kJ+JoX`S+RlL+bkB ze=eg#ecgG0s2M%jDm=S@a%OI%GyBu&e0DBfJayKS&xI4G=JEkU3Ngu=l=d+DW@)B=@KX)J$|Jn~~o?mET$Wo{kULZg!TZar*V&2AR*W6=YIFp)183R`;O9RDb4qMG6 z^Nvg9?MhO!2h=kdsa>WiLP6PS{g`auIfoz)4gW;t0|F%vTInJXnsi(j8KicdrpaQq ziU%DS{jpX6f7-MXTK-XV?{U14l zv_KLF0P_b99H>?~l}bZ!3IAS1NnNH`0=JklafL!~A@2-j&HkEF zd(EVD?&+m;nMwy)0a3?WMHqzY8g9$|sbyJHcU{PDUhC zY@ex=$jVEZ__>on2ahPfBux?2vOcQZZ0!y_HH%K}aS|wf`dYPy5JDG8h6MtF;+a6O zPPz<0d{|(R2`^mYf0n4UdcJSG@rIJKTlP*!?@J(`Xz6LZUurbUVWV<4xKY6m0$p*- zEw}uMGsp{U90&+gi*@T2K6Cgu?dv+hB`g612J@ZLZ#LzIJA-HE`0b0Izm~r1GJ-a@ z9Y*2phN(S%$Ij$t&RB~lZ)XxE_L^qB^)D}UkTEayC~fUEmbP~oNxM3XqHXQprA=+$ zq3B7g=|o%_orq1N=+_oeOsDab(0LN2PI6kHd?rwA*GZJr*&>lDyG@{k{xj+1?j%Q9 zQl@;t7HgU!kuL(p83a(cA zRjO3!cE0gUpa}$1X?}5vH#fG&WXmyTA(;Sq5<5<$l!5O%6b|JjF5E!dx{jv3oyIE5 zknoJP2G8EkV`*FGQIs(EE5|H8Si96gAF$Hce|Y&lI;SnKaxV8YB@X*geS3zcD52XF zis~|fc6J&~JNiweo&6?JWS8-DfSa$ljuTuK2n32^awW56(8~`J_##m9q|YdUEm?sC z>OVs@ai%eOj0>%bC-o3*ny-E>nmaHB#I1X3{|jD3WK zwLDiA1j2XTdWG{6GSwmp5C}+Q0dLzZ^(H6t8x4msjZMC;u+xWgXnW6bO34RbTBw}V zQ~T5Cnn*DW5DQ9$1;Rp|4gzsrk?lsSrdaBr6X=8w3l!UNyyXlJTHzuP z7F;k1gnSQl?;P2q47$O6nY6mozSm;Kcq$9;#^?xx7j<0xssd^#25{E{_4GL@2^ zokNjqnKC~4-f=DGn<$E7Qbcu|L@A5Eb}g$S06ESbK0znGh@eC7uA!9vvsD=ZSfRu* zs~rT&W1{ZwI94fLuLFL^vo$dZlsfe*it9X4kr4#K8r5=52!v&8OnIcTJW{$%Q$CPI zAZOjnhCq$a7mGkQ-UtiS;&fRM2&2Y&h4T{+DGP)*N)!ZuIPfRb8;_vb=4i)#Y0JM; zmf_%kS6C~dYS++9J2-H;vKlE1Hab>GJ-$7G;@DRKcK4Y`nH%;LzQ!}(i+B($T>6WP zRC(e$O{4?k))*G(u(Ens^GE8S2-L$jfl{V^sp=KifqklhOC5`Fp3Xc*G2A4laPwx$ zL;Z&T(`gdLKR-uVa6RAIvuBq9ff}7D7J)eN?R;}?pnGAc*y6>850rA0Vikcb!9(D{ z0TvMU=%v6p&H8$u4-a3xlhPx$v@is?F$(wBbcxR$duPUQ!ywx4~P ztzAY@#Ly*_@y%X3bL^z+Q(_%(;txJOhoak$qk|Jab2VX#(3;Yf;<5B^zv)b%1CG2b z0&!2O>lBLUJ&}&>usR6HGjq*0isp`mp4S0xwqSW66Z}r%-ekaR%yN2Hga5{#lzI8ZQc{*o+x79Th&y%8u!6y=_7sm}g~u z6oIBIYmvTUv%`{{+?z~MOpwT4OtcR-dseeJ&(`vi*NX6pDhXU{EtRXD}k zibgL8R%2(!QM9?^aN5*o4DEVrAtkTgLdT*H(z$$Ntsc(%;P8(rvh8R}9QCo&C(FpD zz3oR^O%j(KKphhKcT}G#u33bMqd%sYj#iIuSL+e9rRyl#J!CQMe03gu-)SU8br{F@ zTKOb!CnCQ6cu&57%J+p?bjs+3jT|{D-~?hlALCva7F_U;Kv!RVbww^js!1Re45X27 z;ROwN2*(1L`n}Iir`$wmd!M&2g%V#{K>Io~iCFMk+YP539asVUJ8{4~ z%8f{NSgrijqZBz{ChcoChEiXDpH9bSu%mpOvKDVrgSlwdK-S%@-=*!a3T=l`;1>aE0KNoxCaR3$#flEyu0IX-ykd;ha=VDZU{p+(z&TiQkA3~szkWdU|+-7s5 z=x#jYMka;&$3Y>G{7H&@3oom4$jmn9Jd%PCrvB{h*fH;0ZHpVybsq1hYhRKg*LKZE-YELcx_I3L7o zPHgp#WMkm;1b6?_-dstE+~tnv=S6e#7d2ou9p9hgcwWl94T?Y!-N)0B@3dJ3m#kr# ztd(0;#5?VkWomzP>1Nl^OHM=*MRXp^1e&VqmpS%xI(O9azfjIIDOr^AuO)0{EP22h zgNz=aXUf+Qi!#T;tflY*M7XiyyZbm^uSSR$v z@GM7J_?{z7yqHcC)Ub&nkO5fbLo2p8?!&A^nHc7leenU^qjd=i3dVE}d?#OIAW;Z( z0~2JLP9PcjFD-#EZ`WKzDr;Q?#qt}E2ru49Ux2ws#CdB!e)G4*x=B(1pwO&c@wDyf ziEPEjD#62Xj(lZ4o8U|Ri-Qu&_qx2#I6I5`*!Wx?a@gf0NsO-wQAMI zvUfMw+$eH19^)O?*RS7jpx%VZlvE)OjzJjww#X%G_PGn91B^CjB<97Y)4m=PmE$M^ zgOF4^ul-iBn~tL?ye}(p!CJ~qJF1joDhdF>Fvyy)WFv($>2~pbaosGXA)j5HM$@*x zO{0vjBj{At3D;7>x-w6*qk3@7R@&Bk9Q#}2R5w1J9bZ_Ht=&db?3^ztH|0p7LCO5g zY>Juv1%1y}5CKp$%P30}JMT$z*Qws4q(76BOA)Wmr)bXKl7rRMi5zfWOn=Ns^!i{Z z|I(#P)rh(&^OD2*xUhQlnxnyq3dJDMb-}^G-9ex*Pax6jD1$umPkVAs{2+HBoIu)% z6DK+Zj5tor-{!JlKp;zCz5v1D%>#)xwR?v)KR<~gCVfN)*Y2R4xHLMMdW4R}rc&z0 z-L!A|8rm{o3TJld)56Q=7|Ftba+QB z#VlM)TmLNE-nk_!DY#bPgi;F z=e)yToJyP94O8iHpN9xtC#oTtI3^+LkQI?g5hLHH@Ye5mtduE-L@xhHw8<>DqJVpz zdg^IaVVy*2)4uWwwwnbJvI(R^Hyxwqn_9n3Yaba%8=f3QYoGWpeg4pE^mXeYst1Mm z4y*)vRw_>|4>XB!d_I!9%uv?XPYhD`ZD=)!);;+at>^qUwjNBI+PqDhpBO@WJC0Qf zjcUivFY>eVfe#ba8D$yG&wPhAJpNz$lFPFmd9o1V1KNBcp(YKCf9AEkN@86$gT$l?{EJzgkY~{+89|b2W zSjMGD0->LO^$j=Na3?D}+1Zu12q4WC0LxQ6)`zJ-5{Zv@2KaKmi>BBfQ#^t#3Kjt- zS;}kkF70f~UGFyBjc+qTDFn*Gb@)8yy*l8}M6|KG{mOFdm2Vuz)BtVAcZ!SNC#S)Frb07}ZS1u@h}ROO?6L zG&;T`!6CnW`}Wz>Sp!2L>B85m7n*KIp|7ss$Baa5YECqxB3qYrx+5JZJow;WX!YvV z4!`4cdbawsM}%A);7#4zdL-?Bd^qiEJ6b6lh!V6Ns~ux+|K{V!RwHRIV}D!g9^5a$ zIi$lr;)xLy!TIlRGuq0-zNR0m=OS&ZchxbhiyE%*6Cm?`elG5Vl|#O$o1?B6KYMYW zqxk}sELrN83*j%c9vD7tMhpm_Hy0X2lnvc9B)+*pgGS@af#~!6Yrnhcd~vShhgX?GZ2X zrp5Rl79!WlgTO4NvO?jetV;^$9E7Y{v*tW-!RADvU3l4$2ur-)$c}U$rz0IGgsJ~g z$7-XxATVV#raPJ)TM4#s9mnS02ATnoK~0e`(`bs)?}L?5>9u@(0cnsH1dYMyxsNoS zynR8g`ATmegDfDBb>5q1A6q<~v{C)0QqCS{+z8EAAOna19B6cw?z`{4m%s&^6Mhj$ zVnNs6dFP$M%xd*t@a{p?(!g@QSFBj!5Co#qiQKzTzKcW97D3dQSRsHCplCCl{MOII zVyR}vM?N0d&qbaH>Oql_tw(tj>Z?pe{q_aq2cn<}GxJpB1&MIXa!DTjiQ~UC5PhCG zbEcB1Th1keHiU8Fw%cxN1};>vqR>V9KiH%vhHl&K&6+h+{|6sf0$I-ZfB^$k^wdM5 zi zCc37D96x?s{Vi4?n=j}Z`Ed(`CGPI9x!{)rE!%HyzWHW!+x}F)e*JgLfVw{G3~01RK4_gVqO2Og*~i#bs7#v5-0f&6lyW&3r- ziWSjqySZAmYOUc=1m9Gh;%>Hbql(FRN=@66|X?T3HSAJb<}C=p|uq zUNaHhaUAV>d>9jQlp>|IA4Pjwjj+$-ocDa;@SPUoJ;>m=-HVg>&qa1&dV&MD+;Yn`;Do`ELN}Nyw0Ri+xT|T?rh5Zng-}45 z5+dVi=+fg4MD#8_BGbvER;wNdERlj7n|nFdfHxK-!QPX`P6x$AF)>{E7GY{=I<_9HD_>`@WbIk3luhy#n7zuM( zkisDWVdw$m!*3Z)Xwaac(s58wP%P^npYnhMe)~VNDL)8bsPg{ykdTIIt;Et02nE%L zJumdU_CNPixEi6b65uhu|WV zZ>E*s=H3?~xGX|uGao&_nCE7>zP`Xp_0K;0Trq>VfHf&lVn)!5jA7b3y40{?L#kfA z`dsM#y6dh(53E@Jk8I)x-CDJ3)yJ7UrTR)kW-+4hGL8n+ty@nK>+{b)cMWJ}uGm6R zJuFL5Z1CH^8v#955PriN?B=Ei3Uj3`A@;Hb!l=A?-XFkv?R;XGiaHmDhz?`aYz2J^ z3ubgKTei%WZSkxRtiCKL)wpqE$50fL@rUNkn^W!DbPcZ{#t1&N!Z{a7Md$ z=<>k-h2isMiv-29K0rYPvgdSNf_1v&u>5DwFD#Yf^o1G-$0KJx8i=5O!+Izz3StI99V}t@F3tc3TJN z`j3D7BZeQvX?K;c`kq}gk& z@26S~Q*S-?JD;?U74X}>2GVSOWH28OSHD3jOi6{JWbX^Owy%@#>*|`1dy#(IV{a>x z>dz=Jy^nJs&*4?yyW&0h`KOeB2=bJ)>2kw68IW-igsNV>CMM6{W9!=Q=^I6Dx-(tr z-h1zD#}&CyQY+*SASmRIxzi?zF65t~v;`Y!U(ZQOX$1j_+{V@i*2;0sCWj09c}?*J zruTuJh)}m4;X3aV=JR?@qD;0tCV4PeiY0L{>=QWhIG`fWOrVREDpf+{xl$mUXMK}d zihtk@6N{>ZhK7EG%9Pv+6$L9giZ3|Uty|~nnc-6!tn3=udy<;*CyKzaU{{+F%IfIn zOt_S4ZaI}6&>>oc z8Z~Ns3EkQ{#)LxXJRk(Z21n`&+X~&mOnsamda5j~P?&9E+qP{->({S${T(-gce$1(ZAHAM;gj%lu3U*0|Vuh~0>Z+@5=Y5r+pt|$Q)(Qa@iJpA26@`a~ zyGVpCK0XPGAN)Q=U=FiAk9qr(@31d4-1FN3NvEYR@S1+zJXgr^*2jj>p7x_$`76@c zY1Nmh!#`9jw3%IX)bq2?K3C)^X}rfDKzHy#A9&ya^t`IDZtLC+hE(N$DXv3l6S#n049&I^{j4u9mv%UeG2J&0vMV z)O)K{t3J?*CzK_D0ER`r<8EO)hDR__wUwB3hT~52Ya#O-e#OKEzn7@lcVd)FI zW?v6yE3}<^gCMd36DP9oWJ;Q_Mn%_6e+R(ix^d&is~HMKlgIk3s^pG!%S-5iai?e) zbXnHcM>gdPRj`KmD>JIqs#W_t#1q&YUT_yOkg(oJRQioK-lViN<8xpec&iWd+r9VS z^CXr7HBK`LVG%nrid$s>tFx+ zKlP#%MIL?p3MlTURnQflQ>#|3?W{wrJO*9Lr^{txePr|W$gaNn>Ob-Ro{AN3Z&kN$ z-P8D_wrra+YeZi@Z0yjXqngcl=8SWB69x8-FaVjeEuP|seL#ErO{U!)N7>(dF*=O0 z_9oP~T!mwILHC;J_<4K#Pocz7tCW*m5OFZJh2aU*2TCoukkv56ALeL}HsEu-jH z7SO)G&!))dX3*ZhPE#w1sr~aaXy1!-D2lJgvOjZR;u^|Wu~`uY`QS@YGnQi_D=SL{ z2A_H6uc|KoSRK8-_3N9<=U4-wGC|C1rOkWwFHP%aUUSVg&7m{<|1ZkiaV}^Rhx&SH z$|_f`+`oZ6r#8_3kWL`%@g{*Z5+{KWZ41cG=)Y*gh7FXPo9B)l6$B<6#@et(GZwDQ zJ8+0{xwizM*M!wjPo-z8>-a;K!d7$Df#>7ji9qbC>mHCRWPtZ*%1fGJ1|< z)K4cA_TE_yj{6X8{sC#LR;@Z2I*Z2gwvB?8n{b)^>xk*!o*=uN1@hM2HprGKdQK>+ZNV=;K zh|F-beizjH@UCHmw0MK@mzz&N{R|BoHeCI02do4LRhZA@3uu~-9z9AsckZOcix<;d zZw;b8efp^Ub!!s{;^;u0uqKuatbZRAnV9~R3{`Neu$gsI$JPyoqM)lEt?4p1Fjyww z-@t9_oxI0-GC_6g*4qW;1vznOP5|fj)mLAm5hLEE zNs}h2s5dZu`V5*laS{z5K3uITf?1OYA>jG)RSEJFpG2PJE<@meB?SwU0b~w>amOZ- zbx{vGv2`Qgc|m7Cy7iGw_lIueg5JaXYS&(SZKL4edhumJqSC=qFy2@plr%NsKZ$a5 z$Tg$`q!$%vD^prXq`7wOItN$>O`!{0C+M>O=zdQ@oA^VBXx?nMwGZ5U^UW>m)eA}b z>5<46gb3boCLQ{9_q{(2c*zr-a??#WJp>)FF3@ygpcK0KN%%blZ73KbnsCr=k)9by z#Fi*7&^}Q)oPca0gubCnl)?fWm#iQACL#KM~@4-xNJief!KsZ@b)WmMXK_?#_xXjySm&iZ$w2= z=|Be?{}*8g34cImphk^a-?5BCAZuIZm>e&wtNx^%=At&~nMwElPj-c>a|MHH)Tpsi z#&ODw zGJ(QCY~mBCRnHiA*cGmYI7O8zRX1QD6mL}7cl9xX?Oh;UhCF0c-<>|NkZ3wy8Vs}G zH+({zGb70+L^ddEjT$w-x#pT{!XQJIWlhM`maX)*e%6-9+{6;0Vu(dxAg?l4ygKh| z!Y{h}?z>0Tty?eO?&_DBgDt}hI2PsM7|MfUd_{Ew2k+ueAP|l%GFee<=isOp;wYos z!NGO&t5m5n4l;x6>=zMJQXx~w_7_JUeUo4#qM=y*3}a_iSqQaYhHtv*rnWU}*4`{r zH>`F(a72=~Uyh*=QK&R&<|M5^LXUErE0pMwZb@$wNBKII)u|QEGU{MAS+#6u88U<{ zAydfq7t?GNw8^jsX2D@9B^fZ1@jv=C^)!YnplTG#f`-8z%hs-O^1wSh1nLu zyf07?vSK!+Ng!*6B?zqk?@PsX(8EF*gMxxH*g_Ards)(C-DS%TGQ8|F3V-ZPNF>fR z%r8DGxnHaif??b>UBtdouDq4-0ZL<$iYAaXugJVFP!K;0{+>x7fUjYFLbdJy%ERY! z@4x^4CGd5`>M*L=vVzRSS^l3Qk8HYM1oMkgV#F?VYZP?rt+%$TUcLG!At51WH6oR$ zX+tw51d--Kh$PLJ<%hWM4Ftsh!ZSe_jN}9C*I=T%8iv3`Ilgw5U!G67?(Kb89moi> zg3Nx={*J$!SR+g^Kp&)u4P*pa z{ZCq*f;Q6{VXiLPcXaow*+H^85Gucw9niG#TbmAL*nvp0zK&H^sZcVBm9dE89cc%V z#OEqQV8{W4xn%XktZAvWYu8D?=bn2O-+1GV9c|*Eu4uB*Twx9mWC59!Tb&{{-8Vu! z1HB8F>^oVQ55NbgU|XcCuDYtpz4zYx4!*8rldr6jPA09Ha}i1i0|EjvyD!W~7rK;C z;Rwr0S`*vl*|lobK6U^7)wWlzTzMGRrKx6d&|KkbQ4j}phYTQ#|5;zBxSLobbV*^V z;V5Dv6h0q@72kIXW&`lpmS4u1hFlY=}&+9Q(rD) zs9jcRreIa!VP>)_zvM0Q$FO3w?;7L=`9At6FxKswwb!AJ=QAn%}{;6ywN&*W#neBE`| zJ!)GTlu5TXh{9v+3UxqTP^WT>Q-+&PB=`de+arjEo(W7o#)9q@GHI5{LnubWn{K+P z-5qz_@gn7H1h^CNEskqJ!$0&j@i z!a2oU891u=xDFNpjw_T6Uj$7Hln;vmA^_+W0rDHykOpaS5AH=C$P0NQZ#)Cf!ZYz~ zl%bq7Kch`26PgAn4b23cQv~7=Q-LLb|0KkMg+S8+<-?(c)c_fE;2f?Y4btKsAqw(B zp2!=|z_aj7JX>#`%1QGx+;l?eq!MDmGC<+55>P$>tKkcB9cgh7?iHfwWGN@iFMJc_ nn&i>}GUza`>m>P~CCmQ)!ft}2g(PKy5S-8(FWZ?c;2-o2OoU!$VDd-u-lQ2yV$cUmS2vQpY0 z)05m!8RP?*cZ23+9>Mio{QUpKC;sKYa{597{@wc6Iw@;^W~p&U!g01-LivD#hMdw| zO|JeG74VJvBQDYoIse3Nj>iOeqwaN1tC5dyt+DaP=H%gv80_iV)5}Z82R0kD9)04@ zh1tjX|LgxD0$q79FH6im&Mp*sr*!9)mXjC~5|RZQYwLi$oH$v}`K z;$f_?|G=Hba6wl`=LKJSVSfJB$J1u9(0C6Td zm~eG)@I@_RlD*xvpD7E_*bd0_roimu%qN|``h8UUTfE2b?vw)q_!yw1G^$Nw=ofB{ zfm4k$Z_m8KAlW!nC#&BC81a(+j{(*7QWv#^lRgo%kCTX;DYRTQ_tD+JVCiIhd|WFW za8jJ-=btZ#=-`G(*5d12{6$7a-pCXMUlNHfz>tPH$AswQ0HKrBO$i3fXST7LBbu zLH%wja&iN?D=p5yrw0&2oXYRmjhgJHQi~LyJ!r_QAyDm%s%az1PjTm@4D|~`oUy}u z>TI=DRUJyG1MH6_U4JK39bBCX=SPGcm}`svt#UgIF{RFHYb%Uf^Udn6e9Lt{+07&( z1;vrDv9ZDW$OvIlSO-AjUEGg4TO4RK&ozMFHP4V`6dJ3OxbazSb*a>Ht;+9%3L}Q? zk(y;)QWrs{^7VM>8e@y}_#!r31F@gW7n8E$q%%0l$y&n^lx8Xluuer1jP=r0l~0w| z#l%%gBjxjlzK3=$sR-Zq`?6k!s9P~^Zf*j0mJ}or?H>~^A{nPa1mB=DcZ$I^mhHlGpIV ztnPxHsbK<6Z^pvv>hs=AxmwV;wN5EX#6jth=~hKW1(}hNQF?T*nKiofFHdhzO%?yo zJ3WEnKVIuIS9`N#2oUMi;T(LPQGiBk&HYRHy0Rj!I`!ejW^G|_iqwP^$hN&q3B|n$x3NmMr0mwG(ehFURBjG2Fc#e|Qld!}xl^mm>Z~ z!MsMKRHL(}b94sipPii*-6XjlU#IQ6=H`T)9!5k&M1}))CxtL`z7jO^GbOmspU~YE zvy`I#bqsqaU2qwGPmo~1BJ0|P&jU4H>({FcL=ZaUT$A#tEHl?U6fRWmzy&I93I!^5 zXqp4oekZ_207Ma2q_U*nun(j;X=;b+%*RL%OnS3Zkc5;$NyYtMhw9x&6`EZ+Kb>=*CXcWxj8qbsP% zN~EPiW&7A_^K4T^+#}`t<6KdLUX2g|Wfobc2oZt(5f5Rn`(5HlCWM(Qj+;#hOUv`eq$Q;}houz!@(Rv2n8hOCYrIB5Fl z3goBRKe3R)iNc+b$c){%v?VvM3exdS1jvJG&dF&IT!k@=7gTkc2ZLODw6Qh4Myr`A zDV{ue)iIDHAUkP^9x)NoUGDt+e9dgwA(!yC!O*<5kHOlgb3tN8gZ< z6#WC>BUgFARfhc<#R69E>a%*fpf2iJv)!@b2q7h#u=gfk2SZ&6Vl8P_ccw9(_+n7g z*u+HaIU(qIiy&`rjC0I30|uOe6crV1czb&GXCey&ung!mQ7z>mT8Q)SBc$!CTUagy zSy9=gfA;gt)89QrBg!4Bm`}{x__b?j5Ob7uTt2f7OCD@~fAakyinm{lWI&Bh+0rO|0btCyqd6kR8A zrOgt4Rny6as~tW%MQav(uM;De&GFzp>VWfgt76%?=KM17{k>n4)+;C)i<`f$tfN69 zMzXL-Q#DCdgnmNOI>b3<3x)l)w0Cj&Oa$SpKxv4d=VulnmOqV5(-IB;9=?N9D?3tRMZ^5#jWo`22CDc}5&NzU|^)9qeFhOT20h62`KJm zrRMJ7a2SNjC2C2iF2d(=+G(0ZPuI&9AHZ8&9`5cMA;C=*Ickf{{YjCBRQMitMI6_^eHmCe~3y<~K6Fiy;EW$%q{l`)dK9k`-XA8R6^7~GL&)Yi3!emumOcL-RW9Ym zNMM3uthe}wn0Y&o`g>e|Z1IJ?o7-a|M%l5@u*y&iAH6+U@sTkyGHRt@B-Tvs+NF!e zvw*^Rbq9xS^5qC82BME@&W;Ppuy*D1`~4=ji*v{$ zHxh*FEP)YpxQc&xX)r*>`fK;&uX`E!&20URfuZ!#Him0?t`P?dwnR2AVK2vARP~dYBn-fs-(v=~rOueo zAGrcp64V+HRf49#D=0KC@6jpy^yATL?bhwCUw3BOjnH?}vi--ry6Ks-@jcVnry7dZ z;pj80Ghvr#i?Jcjs`z2<9$X1SL&J6B2CLz86V_-<4^`vtptskcll^_D07m-fe}mR_ zOOD_Ox>RD9vPXpu!Gm7g(`u{O1c`0iX$Xugq5*ul~9Z5N?R7;(UrzUF^5Zsy?N;Je1E zBdkx_v%jXbP3Z!Tu;b|ucGSYu2p$jJ$OUbZqZ*tDnh^WCxXU>v3=%B7=?W8ZCIax@W3|LMRB&m-@}0=5M$S()Qeq2LUl zOX(9MZQ5Z zk5HBZOKl1&1Xh6<@T6Td3@aOQFVh=+v-cRPW6xU^*DyWv-=iC%>uWsc;v8zCUOgkT zTqLK75sIHE^v@?RCNkS5zcas5(-ydLR87RSx3}MQfc$Cu1Zg7|Q&LmKWZ#=oCU`w^ z_pK+7K3f)WqG0wZX+RncK^D`E7tj!P%nr$Yh#BP!=H3EGcHS{$`l6rfE?^=T)vaFG z|9JXxRAysgYnkHCpC2;9Upp?uXDOiYmp=g*vlnc8m>i$UKb^?3^E3IZ#5=)2+N<(C zg};NNqtaq0_)5Uo*vp34h<&5Qd8JiOM`*M2SHp{o5WN~!oyM8O*Y|RTwWN(wS*)97 zfW;FsAb>UJ3=cLucHM!Nz94WbI^!LU$Jotel~rkL6LIttrm7}SlAcoV#sYCn-Xaa|tF?G>gwRJ5n z4WgwC+8iY5#JAW?-RC>@-|+CP2KFf3=Zp!P#@X&(ygny9nM&lv+=vEjWx-^0a;L7& zD4R1JR+o154rH{nX6F6Qy6%{X^m0kQh7ygKt*x#;w;1Sqa`t~=*H#&o(OGK!u8W!! z!ccsBK?1aSuZ!I3SWV!Y&)b2QnrEozdyZTEPkM4(kZ9du((icfuFGt1Z_D)?!{WW& zLMo3z1V?E}k288(+s}JECj~XNx2_lwed2$I-*Au-@6kE+NMiW=qpI9}_qmxV8+BDF z!WcrOquE6J6vsuh2LZL6U&X|g3EZ2pL!?O+CCA#B$5@}sz8^m91I67++I}V@j^gSr zo1=~_-%mFw$&{WY&xhCA7N1UK*XG41QRXGgl@yfLqb2#n%4B)csi$NOcMz9{u^{wyHUtA?D9Tmvi*JTr(oQsS%2<5mU zfQ{`X(0=RlxWsY))EC-$e2AAsS-)hirB9wo zhCQ>Z7@L@iJ>KyQ*G#L3oS=VCJY#2+PTQ$GK*WK zDbgNFU-%CpY`1sQ6gJi0WknS2wSGyysHd!9@M(3Uzbw1+w5FH@dH) z^hnzorb5HoY}y2{5`63^pLj8K)VEzDf;1zZ_y&HKN7$ZTiv}p8GQIY1BLVt|v>sO} zcJ+>BEG@T=Bp!y<+6FV*x7&`(vRyhFYHMBM3>ZDRiMkmue)vXmqi3|LqvL3tg#FFP zJvW!A2n`6qTnL6sKL(ihc$V@Q|m!*s7nDnXGI6%otTiuPrdoHOsgAu<=ZH z;Ev!6IDRiv$MS!W&Pkny$YAMnK7+#E*#S(q7c z#F%?CGEmOV?IM4yw;;LEm!mY?aGhqo^e2%zNXUA6Wg4SM>-{{;=;&s8WUzwQAEV=} zJF_--Y2XHC7M%o;YxWX8&5y{7%v7Vk68jVy<9DlOl;9eHjNaP)=?MI|QD;y5Gp;P* z9&NOOsi*h3qpPX4wH%f$aF)%U*VSuGYy3KD_If#5Q&VF*)>~l5UQ-qxsXLNqjsKr^ zy3SweCjwEnvu+i*2RDdMu(fxqhK7wt)n`66KLD;bcyq)|L}`A&IGSBW{5wxkG%wW! zRnN`WV)rHciF*uW^EZ1Ar9wP=@Io|33^uhVa;aonOr8#H=`R7owSV0}A5xE+cDA=M z@p|wA%Xwywl0MWI7Zts>Ha0f?WkrkraYx69R=os83J)zI;)bGqM0pB9r$MidE+(5` zBkfl7Rq}09>{Ff@9uv*Iyo&xM&ucy}cE9Tisk>-zl_cCJ9k&#RjU5QbU7d(OWt1Pr zd8&ly?HxRwU)H`i%#k0)%!ht6++qEVOw5L9m6o1ZmIUW?akGy3LMlH{P*Bi|_?$lb5cN0& zAM6;vu6n@MsH;Y~Y-rTYf0Cjr*D?z3EC1az)hVDRY}kxz?3dZ_Hb@UXw5YeeGWJ3AwdJ9&v` zVv^=|EC=J)n5stOZ%S8ho_2hF83n7}^=?}K#nX5ytCV&LoX4`q_nVe9+_#&AX+T;S z2=_&y?EMRvdMNeb`d&n}vIDVuR?O_-I=+!oIb@vi_mq>KG;alYD^hWvk}LVzp;>eu z6%KIuhTK-WlKWyQ9?1gF@X84S%vqNjPx4Ua>T!W}&{j`d+w$18CN!*y!!RV@WAp)i}Z3 zn$Lz8do4dtSITHz&#SNUoX4@nPnDt4@X7B>6X8e|=s5lFbre8MzHsSm{N7)D7uN<>Eh+OFOgdj*cd&(bx|czwU^hiP8^go2^H<^84c%CPs)^x zjEu#>fjOJ9^h?NaGD8ps2QhcheRL>WB+~$o>k@Oxku@B$2d6`N)D@_qJ{s(@&u|+c zgm+LMAOW)@2dzZe*aE1eOO{Wa#_{x`k`K3&9()mh{In@+VBo{$Fr?By0_)PGgF-yR=Ay#XOtmy_i;ss=Mq(%G!IR&YS+gA3u6@8~%j)ONCT?FY1}5!bT85h~`Rm zAp9bg@wCtRcN2t}ZvX8UQGZJn%1EGl@;x0MWl@{y%3ftDc7j%Si>JPzPObt^@)fNE z-eCXPE-4ZAw2d#xedJsE<>lqlZh~pZ%_Z)apNSr(_3@PGpZg_sDa4S`RwVQ1y19?j zV;h!Rt}S=l1#2;Wm~?mpeN9KuA#Ifo#k?|t<45X7AZKf7#_O$f1bT!4f^?ts8rFub zb=-L&E37M?wkX{>=E#kOfV7g8VVNo3y#L6x6@_&Px#14nSA3ASG%XIS0jSNQxG$XY zBwtNWO=)xj`y!~?K*;1}=^;V)j#*h*tcXD}fOaNCI!eItd!KEIGnsR8c&4LGYobLZ_{bBI&@|AAV4t z-(BC;B{ujxz;ek?S&%YWs!d&Gt1p9%q_KJN88)|B`A|ZGZow3;<5JUG)lYP>J&BX; z8QS~|Hwi6PF69`<_i{GVr4w`Z>prM$lvORYEGs1WIH#%&yw@6{I%Nq47?$6!UwKN! zVzWYtMGQsfAFo0_9o~x$h!q%o#PI2lGgfwVmi6-(gbuZ@cyIQrVLrAQ!e0?ma^6`Bm$}GW0wf#Rvs5QR$uh+8Qu=4=!O&Kq5n6z zt(x;%kfZgdZ|2w18hLps;Ca*=$Az3_H-^$|bYGG>A||Snzu>-v6^jm7Xfj4!{4ZA+MtK$IV+f zcf4lyc%t}6<(c{|=g~>1FC}33II&b)IDo-xAA`=*Q`6Ej{+WjhmIRXt-|-bSb0w}d z5Z$|Mr&5o+=b4^y5KL2q;Qf43zYA-TLe=vLg);wQhjMP8Y=!vN0c++A!uW8BguCUC zMniTu3>vnd*aP1a%qS&NF!S;88I4i>E;{tAI#!qZE7ME>*}#`-KGXUI9{`IASpy)f zG>oMf-bT_O%BCGX&4(iFN_CxPYty`=$;&~$El`r6?q!1W^p%Jn=T-4@^HvIvZ>oGO z+r^*7u~@iLr2#0*JEczSKjg3Amc#Y}6TFjR6PR6%vcMbsW;V;Vk-ZRb-tY^%%O2=N z^ICCUR3RCf@z}=KqK;NHg1u4t95z#{U_w>922<6^uFn@D zU*e7oi?5JR{+TZaGv!>C5WOiIcHiyL&uS7c*D5tNHMdvYAKR;MH68YGM~EBr2`#9m zv>+>Alm!lMP^YSv-R28RFGT^SS|^kOJ8=eicJ~0Ry6eL@Nc-7P7Ogm4T`RCX^Jn_;@iBvm zs3qh8SrX7A=(^rX)zsQblqKOQ_iwC~3H*)N8oSY^@_JSsbqde$VHxefB!CuGgVn$z zcp7478`YbO*O0>fDF!B!HuUS*wgu%{(a7PjQkXBF8PQO|-w0hkq#$~}(ERlpjF0)O z@n4KH0gB9+=R*gV!O1R$-Gx`0KSPT$Xd^dLZiTz{z^>a-$L9;pZT zeF4xC4TatVM0m_V(_rFHm5?3inTW@trXqQLxWg8Oyp@KV+Xd!@NbkyhTX|-CMUsrm z|BUFZi3!yWYfauCZw*PfDD0EVHK79df%vPTdo3D~Vfu{1BEpr-LJ89wg0l5j8%0C* zMvUI;{O#EFhqWI{in|SVKTHi%0h@gYV;eq}A#xjSJUI@Gu&3emR|kI*Nt%NGD0y;P z5mJ!!1S9%33OiOcc{BYkEy#e%b)Z5`QR`aK9SAkh6whg zyEMlBmdo&~(0T#_g1R=)KGqCIqKr$6>qcPt1Kk}hFQbDtaVbPUMmPg`cvu}v1}^;` zM%ny>6z_68C7=Q))MxjgxvB04Cj?4Ew&53)y z6q?RHB-G+x*EpjU>&|Cz?S7l-kXMeW`u98svjt0@zLVtbV&alei#HNa^FN-726r^g ze4gOgb9an&aaA{(m~d+LqMz{55@@OT4l9&T8gQ|UY(PQTZR~5N=>&HBUc{;!eKNG%|W>xu*zN z8jx|#h#_x!Fb3bB!~Mpo+L0^)#nMEI92lX{Lk{%V*gmanKrpQ!)}(YNk7|6+}LhGG%& zJoE2o!9V4v^$kRri?GnXbtX0;Pq3YoG3OYg?~uPR-{i>MvDrWug}auVG73EhIAJ1u zEct>*Cf#6eR~;4cFE|wH**M^#OhwMVvbXIqlg}WFhQvPI^s#hss+f(bW_Ci^U0Qke!|%7p zOEkL)##5RaN*9)CiX5`&7Jvw@AV7bU6i}KmO=BD`%VWUNOd{v$e~eVeNdFll+1c4$ zOdP%hj0qUafD#U>efH0ckIRw2d0*8)KsBi7in@-qJpMzTqxfH}1y5E;^#M=lN5V|Nx91FR1PUwHN$bI_M=3s>B))TCJTcQS=5qg1GEeXM>vE2;_tOMm!iL+pHowV1) zhw8g==2?82D85b{$WzVO=`F@8UUvD2V~Ot8C7xFatQaZBGL{7w>c+i;y${X!{Yb}S zz`@4G=7#XO)*-^6^+*c)dS3nG#}7*WpzY{?o$htiBS6YP8v?7*`5`8U^UoUR>f@>} zPu20rzr}xttD+{b@LLt)=d#jpmX3;-wYZ;{Q0C^&{xJC}$K#{u)_YFH6kT{#p$bY@ zwGwO8@daNtXGyb0d*^T$-%pv&e2c4Z*S`73BqRq2E1n9A@sk%m*9QWe=_5b{ES(i8 zh4Ae_Pl9F=$m^^ z&IK?M!-k^BvffUm#`n1}(@is0y*asx*G`)D_E^{9_#c-VeXac5q0g{01>}(pSnMXY}H<6GOI)a-C>MQln*4jY=Z|f~Q z615JkC?r(-dDo3cfuj;*JxQ#2`iQjg2Pxv1NKi-nBrX*~da-uS+?TVrNa!qfh_g)4 zp!JS|r+p>fTf}n^Ef(k`n5;0s(Z%v9_~?#9tREP|WOErE97@a}YJ^&ZueJ418Bl^u zgZ&?L2O#S?iRz|GFt>6IRI+AJmz28J&g7z;9n(X&UScqdKGHIc`0+l=9#2aV9u6KTLm^tukZqe`NOx zJ+D3d;P+jHgnmAjBw-<)JAll~dr^-?$vY?Qp_uMHB~jH9gUqhx#I0q#G#;k@cHyp! zz>aFuKRxNy?a{SQW99b@3&O25(ab!{lx$MRxb!ADp+x2 zZ3QJT8@+g^qPXqvP8}VR8Rnbs&+VmXNhv3#tk5y~;A3qekKI_0az%SSdf$&Ykc~P{ zFl&H1@lLp5QIzzjGh`WkBsPjvVax2FuhQ>+{6jmd%3h)&7EWeF6r0Ncrfs^}L~M>3 z*WDB+)`RW-aJpd6T@`<@)!e=!tK?>9*?e9NM&)Rv;f`_tXPC>eFY10rr1MtJFNi@a ztP@TxUEsx`BG5#o2=l$yR6O|#NNuAH!u*^-!kd5DLe5{TSVhY-B<7Sf2i$q+o5tcv zx}-p78ZzjXN2e7{Y@7UE6^|~u&<0vCSX#l5>IVyr=60n$ zk4IXO8_UN7NSefo*0748Qj5f~0gnfIjDC9xRpZRw`1z74&Y~7;wr>wbBc0(tKA>5o z;P$g?Xu`BMisEo{i7R2L zAvk-(@-SGgq1^aQb?(M0s>$+kys&p6-cD~*Nk-;_DgQt&^O#%$et)ir&+Ei<5{o+H zg*(%Z$vu9C#(ARdFcRc2P4o*ojwtm5sS=GTNlebl!^o|yLXxx*Rm9qV%4>=zV|2u>L|?=dOH5h>{>ARn2fT{($~0A_woyW9Pv4ueL`>vRie|@u&XD@_s8ala zhUcI^Usrv4SxlQSlXRbgR=f#cTXVX?+I>g`ktm1%w&*a(FRN`^{As*+HgUk+Mycf< zZwf1jd9jFy)Sh0Vb)deh5#;l606l?oJehDJ#4h)kCoDc%~@MbrX`pE-NxRM3e_y{=?aGq>(1%L?U++ka@Y`?t)QUQ?qu0017B`NPZqO?eIK+ z)z{`e$msnyOsVKt(0D5Mhm(<{?6!u>pBOz9`BN_wF#0?zN4B=)>#ccp$U;UOu7n>M zAEBP_z&q#g<^u@6&<;T~F}EH%=|`@ILLJ1j1Kj|-Y65{y7r;|ge@?MIZL6Zz4Fb@{ z{3sy;swF>;GvEdcCOoN@2FTc|Z^yD}yK^TkBV8*OGYG#tEHDLbBDrJd$ZJ^kR;rkh z>wa)$izWZBHt3voiH9|R1#q-vJ@hi*j)RW5>W!TtPx4+kmReQgWl#NblQUB{OAz}Y zuRREb!f%sa`1(&w)7vZ2e!(K;5l=3y-0DY-ny;d$1-wZd%b$`T+0Mfas!1N4A`KVt zSZd2XdsaFzIZ{(ojZ8#2vk#DmD*dkZU~dZY^75q*GI}LZ(h2cs+OU+ip^(vD7G=ud z`tK}aa1#`%{^NxGDY!dpF`M)?`n*4@hy;KL$;*F}RhZvKTuv=04$rn4^|LY)5~Qpa?ZYUbsTHSU9SarVTJC z6Hqq%Fhg}0kQDz0MxL`0WdA6OTrH8d@cANvq+5OBxc&phSEe9Cj_N1(#rWI3LQ&VH zS?XG>1?^X0Q)YPj@tj}tVJqK;{=^Uo=~s;xo6*nz@ttV2G)EY2eXBXE8`b;-86NQc zU0ZsTm2$@+_A)upFmfgf1i~%S`MeU4liDlV|L?=feI$jcwWX!SCR4&w?zZ>NN=9P2 zwF75L3{Q+12peSaPrBB1~t@d+IhG?`W>bs@jMv zIKBW-9f@%{WKo8Xi-E)`e%mtVl5l3LqPm51=7DW;Ga*Et{F0uNAz@5`bE+IxxXUK@ zhd}U)V#!PXibJ)bL?GmN%}4rX!YG$HPoiAIj=_XR#K#KzS)V46E?qMVVBUZAavDAv zRmC51d~X(3XNOqr*HEgUSpx(7ZESWWOgh^>%wQx|udVu>b#2%?ImPk@?W5yc#qMZ9 z6er?QO@j{bH#bL>A>oNE%%S~01=+z$FQnJjz6t;q zug)`B;urkRPY}3mjQsJWSw*{h3)A}5t=LH`{I6v)hFGk=qJf%A$z`i5@-?Q^-_u6V zui61RdlDaa(mi zhpBgsxpPI=S69&d3yk6c4S<6J##y56e3S|9D!Y|T7`t}SKi(FhVJ>|L0P=Y>j<1wJ>*nuAA)eCRZ$HQr*VYQ0gRj+MO}^oL*c+<%7^Z=z zaN5}a>0Mn~R#jnwxTC5(nh9vl(;YGTAy`sw`oAjXKYr1nP;tj+{8>eDx6NXTO(+BW ze3$ukC&}JMn`+V{f%32;*T$8J|M7UtkR zyd0)kko(7Dj2Ibi!XAkRL_wE@Ju%o=j*O}WU8wK~aZpfD@HN_uKW2{l8i@5s2eQD{g>qBA368U+GLQ@I3 z5ZcT`C|ua~^)`BJ&ne$v`&1&`0+M@h$30g{m@&nHnwoTg&o%4NsDziN-J2-qdEH%! z|MYA#C`UOF*?_0u>3;6C)cz4CoVr&j<;*JH&2;=zla7G;VYp83l?kI5Q0rcqE1V{v zB)8Q&KQkviEiG+UA^FQ10+FuF)%8)^quYP;Psm?Y8Q00zNCV;u@lp%sbj~H4oeOnO zEo9|P=3o2YCFK?T7e5c`7*7yD)ub0i+`FVfY7V~na}n*qxMj{>(LmUIj#(U131J_>9?UL(n9ML^7lCr_8{G(t zWGa%uaQghRaw1gF(9zM;+B17cyZ$gTT zCqdo8f#>FdEJ#vwzGfG^q_mmaRoWM9&rwY#{pGRlAZGsfH-RV!pBO=R=CMdC%meyN zK`xm4WB#~om)SXBFpv5bsz|4Ka8DPrb54h;ARUDB}2zu)5@<^O6VD-1Zt z!&Xht)joU>3@~$uvCX_5%9337vXzzXmtl8Q=f`db`XamU$Nj2HPfhJ|c|{O3qqXC6 znYXlZ9wN&}71vct+XnmtSBwhcSZFhG?UTCQVP~n9zt*Q+-pXkx35d-L4+*%M{YMexPD0TyYByGu z1ZGcmF4aA|Mt5xIf@#afmdmcvVMl7r{~oMtpAMXCL91F$jatGNyTe+R07Z1V9K3vP z+;uw&jR-LQbUCuvxiL@227oyR^;9+pC+rpa&Z*GM_HZoChV0Djc5dn4obB&d_`TdL zoOxd)l9i>098P$-w63&U%7MN{C3MkZnCrpO*46)XtZU)2udJ)@gqxdx9mzA%lkY3&2k|OHk~99;{ZRrWAeMRXBJQWw&P}?+l|A75H4cenM*hriy=FB353n$ zJ>{h$Jas`q^FK37Q~3SS25xe5 z*B;#U^%q^osJcEcEv`m|isQT2s#Rh~xi6yPn+DJXDGO2^6eJ$yRp*tnu4+PS2;9G`h7VnV z-ZHP@XZcC?r+D^9U<(YHjIq}Iq1Fx0WuH5bOJ8`>a6FlI>JuzEhBf11q%tH=Y8SxE z_q1E^&GD`aHtpB*mMxGkws`wc4mcnRXJEJ_i9BjZX*$Ep>?owg?? zAB_m4>86Tu91NhqJvbp+2tah(r-(Y$w+77N%e{#75kAnz8cSo@Pw;3nGc$WbH^v2w z|1TEXRRaG@EBN&HbiXu=hL;{~S;4g-iX0iHSNP2Nuz%v{{Jz#2iAj{AOxM!+r*GU8 z_k9uv{lNy8T|;&PPxsicsi|&`;RC-4Qp?+Df2zyxj!T?iHeX7cZo~EY=NDJ2>D~?F)xzFuX=>Qa}$Z5+elJSa?VIqF-{Xy^NgRTa1eS`W!ATEg`6|q+-iAD zGDKR}VH`$abRgthQh8I%q9uwOnlYv~o`JJKa<%ECNY)}-wsp!Q|5^NQRGz25u|FuY z(|h&9bpNGE`Du{CcH_5Qj3oKMHbPJrpw|-|WU}B~c9I>LmEc@M9^SMXMl`wf$;J@I zg1;d0d*w*y0G{`O4V}d<2o51SZ9DBa;*88(!Ok>=WYu5JB{QfAcZXnGO@NHhqkeXS z(Gzkx58#h(VtEAXIt8WQQDOfn;#+8+6;Wo;x4O6VqmHs%p~Jtu`Hy#weZL`*M$ym$ z(>iaz$C<{01Ds6!wICT5`x?^)aw&r5A!>OxuaAVgT7EgnW#nK;4Y;hdl;N>~h1_D|6S_Z*7+&EIlWPTbZ)- z(4Ys${+?Hk<>h6?F{FYDLGvz{OpCoeWM7)J|I6d60Y3N)Gn#k#Io)L| zJU|_fgS~Ec{DH$y+{kF=JLN>WJ+!IQKI4FfgJ+C$)iQPn*7@T(PVf8W}++>PfHr4U*)aQA&y#KzCu~;MlMxd?#n5BSx><|CE&e zNKk@dz5g@VyrRn9C*s~FBe&9XCNh7cxtI>wg3zg3jBAYy>tD$N8cg#yp??H%Io4H= z+Rv;wTXUb2k>ASrb0;}*6LUKg6BD~C+5BSEfgEP-Tk#?wEZH)>&>%2xycrb^&V~HN z?^YjdVPPhp1Ind|QuI{TL_^?gUnl&Li^q6C@5^mHY12x@IvAr?(MSo#5swoObFX|0 z!EmaZ+9Pf97;EC>q{#bElx+-S9(Gk`Z=4Tad+Y{}`?du-i$8r8wlPF2V#ekN z|CG(EJ{M2Un{ddTVE0(+eMO1$KKU{9K-_VUQ^tC_=Mov-j;NlS0)PpWDiE%Nbi?iCuSv>y)Bnk7Y*y96-6}#N$`~)9M$_ z(_W%3jjj=yX{@y}J+MD5vuDdYy`5S}31UBMYsEopUJC*8&tGfZ-Oji@(1IPV_*&O} zkM0hSjwsUGBhoXTw}pj14we@PL4VXB;}9Wzq>hrU3`>?BJ{00tO zz^sS-%D4z?pgxr-AlVxQDgp!v)>R(on_-uqMSAZC8s2fV;(Ahw`-6Vm2N<6r)~$DO zrLd;EX_%Q0N$`;xwHZflWtBKI;+GnkzVBIhQ!3(BE)FJanrU9OBE5n{R!AvxLITk!FYOH10>yA!rE3USc89uX5sjyz&`8&m&&{BW>4@6c%SFJc3#vDP zdtY=QRwAn{cOOEwdPidjZ6cn^;rX8lW8*;PU)uAH={9V)WR;YZUT4%KUN+2d+S+&^ z?fvSxEDK_{ig!G!GGk48f9R&{qdhmbz z_I7PQvx>58eQMcV0AHHoDz7_3?aI!q`0bwtrnaymLF@&LG~B)!B=VW;lj4KpSI3vr zh+;Z=VB((m4e#;vHAbuMt3v*5nQ_Q!R7*<>Iw-QXHr4rmQ*WR9MimwozRj(!9=EY( z`0pv+KQ(*@%S~y$3%K>OC?f{3mYtD5@OMeNAs|E~55YSW%UONkcz78yln97gzXdKc z&wSc#=SQK@9!K4?uzQN5YR@3$rYNsf`jMQx7q#)X)mU^kqP<_k6w$hcKp?fy^Al*R zBev(~!|+&cG2kOPQzg00VI-Jbu`j(L8w!8mNViz-^F5z-o^kG)qFv4Uz*qgL$_ zMNy+E5_`nfrk=L;s8OqC>>x_a3PG(JiBOv-RvO#y^lx~-zUSP3!S&&~?{jNq@e*4q z`1ZZuEgj3|!2?$BxW;Boz4CT)|EMiYSA_!;q$)KL8F`_NXn7Y*$VGids@btCH=KHO zmxcb&a=H9L20uSPoFYf>To>4HHwJI-){3S-tH)xAN1>mh&?sk7^>G`5u{3->!`kF3 zXc2QA&&j(W(E+VV4}-b5C4$bMWFpR*A4v3j#5z8XPUDVQZufdm2OZ10*c3X#x(chP zs?G`s2;}-(zm7YE{zeSq1yOsf9aM50pL#OH8OTkSn)D<4q>6hXDMo(?0`FvYSZMz# z>R|qq>I*k08NFYDKwWUgo@xwiYGQ=LXi*0`{8%+bi95lr3tr_319BY@J`WEMqdC7m z9*wvDPk%xwA6kB=EU{L%|Cy;~JZVCs(Q2-pqpzf@im#daTZ(IBxdOfOmU2CW8iUej zXuX^#e$l|krsJsmnm$GX9{-aPvSbsoH@ZJLEZanc=fVz_Wa|ANIi1)0+2yc}%a81j zEHP+xpA}Y`lX`C+cn$du%|)-6jYqV6YCZbmb>d%8SXlUKFjZ2!ClHl30wc)b+)Mou zl<=8~oBuU7K3G*sV=6Z;8R!kF7P+%X-v8xIVh(($w0I6my_87U0UDE_?T-g0F@w0% z3W_+t9KkWJ!^LhFKPrJZ&2yh%}7P>UG?-F|INr~Sut=t z9_vV?oZ4^($1yKmWsDAyCw;bZILb*+PfxpIkwZqXd#maD;eZ21zz#@IB(ueDv+#7W zv%%4Tw5LsK|GCXCdkPoeBvSU1JfTl;xUXD7>W#6P zOk#K+d|YpD?{8UX@9EsjA?p=EELSf*JEP&+#f)^=ZqlrnxHwA&-IMD}GjeXP)1-}~ zO5&rKoJ?k`uDp&Z>w3K{{*yN0H{T^%PVrJf(9BiD+jM=}$XLYDs#9WOF7^W9ntN_r z0w=#cCZ-`}hUJHMQP(#yz4WmjUzbBw}q0>Cwo8k7o&{X8uX0az@@+P4Ng z1(4*4XYUOqmB#SZ%nStH;(oXzOg4RJ9KoUBn)Yn$ zqvvvZQ#bif%mj0tJO?3}Z+AgLMYMdVL{^9Zn@fiAOPFMa^?{>Gx(Eyu#d4BYho?M^ z=jUdppW0KZvJv^Nr{tC*{n{>z~M^+$kvhU^4V{*A1?%)zT5Dp+64j6~+ z<#BLu#0_0>jcWY1c01{}!5WkvPi;82&np~)#v)KjFrzs&iy+78xDpZFzI`-}keOe( zk3YjYYze>8XRhlC80ZPP8X16_Zw=HC!V)ML2})k@XHaq6mnl$g_dAr@pXmz)MaAWG zx}msXBQfRQ#b(hC#byw$d$)cVWu4Fv_=l5J1U(ODE_t*ymxdhLiS4^lJ<5udavIlA z&5$ZOJWC!d2cPVduIj@7GOnF3 znJWMY1pe22w2~!zH)i%GXa#Hv%aLu^T(NHrP@5qV9iXWyA8i632!b&-L9$vmBAik} zk!c8$K^R#bXoxYoQWTeEtIG5iFT)^!9A&1|W*`znPY0UgB#SC`Xswk(fsCm3wzkue z>hQD8JbV8Mi}ZH|D`GH<45#6%)LTI2#WP}=S&0K6X6UHlHSZm{MA6*@t0JZQ?Yec} zgPHrr{k%*C)sI_OdjcYjn_Coz45x4G(jV6*-Y9pUqeNg2k$bEp{gWa9MU>MU<1& zLlMJg?A6%g4IjJkGwKB|509D>m#J5^XF;|_a7-YS!>g`l6DaSVyHj=k#83Nb-#%kZ zJm>0ex4OX!khq=Fnp-m6xqtSa+Fb;=Wv_VyRkailM+FJn0~oR_d52Y(9>f_t2DQMoF~_c8RVU58#&Xn zs>Po|Y!AOtOar|reN2qK%C0JB*C_eJBfr#{_jtPw{liOKf%ALOrCDp4BRaOe-U51j zNFP6~s4s~2|_>yE}s`a$wY?Dvk z+}xaJ8$`Xr%oS}p-7C`>AySY9XK7>aWX$^H>qkml7;6HVcrjq_b}^bW-w%G zJ&L@}+gw*#>K^Fk=0;o61}kt_JUd>btv@HNzdgw1T$@&tW+ZHYw?YUSj`DjXT2{x; zgp=YU1_7juO}xvP;{%f(^0i;P>=MsQ$vJ^U#MWO!1*SDTzq%s)m!8|TcmaB!CEZn0 z%XZ^z7!U+fRw^9^vgDLLDgl~oL`EW_VY0qmA&OO$N!{r_i1*PFuIvHvcn&~4KVM6uF$bM zFt%}+lfCWR;C}A*_VxmF_P6WZe^h^wAj|f?w}*^suQFZEFs|iis@Pc8b#FfBBHw(( z!Uj29^*8@xYG~5lrveu>fA(x_gYRrj??NzFk{ELZ#XZCUz8d4CUZ~05u|us6=W!TR zLWW8!C>(^N(P)QF?|f?w71c7?rsTaQ?&8Bf%fXGW>_B^Wope!kdx7y#u-f~aCqBcl zsuq8_ypSF$WTa4=^Vtl(sdU3!tU>8uOE%*8_;|dD6lQCY(ypBbX>0K);4$%I;eQI(%&A>>gj3BYL?` zz7>i&1d;ov&1(h31GkOSSYW}Tc z9x!|-uZa|P!c!$x4G0$lV?Q_rUG{Ll)z;%#^AI^r48h%0I)xAXD|lbuzty93P6+XqUi$IIy8nZXgA^?Kd?v=Y(Qy}xY#I|&sbj9kgc+NcUF`4n@pWkM^E>%Nq0j)C!6bW$ z`i6#y)X$%JW^18+d0~e*KB8X_hm{Bl0ErKPFz{QUKr5`eK91dx+dEvN_e1My_|8vP zH7+PLVlbsFDk@4%Qc`lc_`4nRi`(-vGc$+H&CMJHjf;?uzk~f^9X-QPo2j@GA&vq- z`X`{VPN(H#&r2`mNblr&M@}7%XtT`M1yYD^reA@%lgcc!M+)C-K>Se&kZV>$SxP>K zgs?w#j&OPl(iVEghoa-6t7^ za^_dh#jzOQRSnqU>-ImNe%WyIJZms$l&!o6 z5X7JkcJ{vS!X@N>u%QrCY}%kh5icJnbtX;4tSyA%GpK3H!-AP}wP z<>dugSy@TQ$A7%Kd;wp00P^1Y1_mf0A)%_1g=m&@b!cyLC+XsxChNVU*A=#a25SjM zt(oe}Lz<8VRVVAZU@0jc1h*}29a6*PM<=^jpolRZ9h zk9(BJP|ajv!tf7RHvV?`6yQm{25}3GWG$epMMiWc;R?#v<}@3CUB%2NGThqS-Eo|W z#20UoFIE^VGb3qnjhYN{NRV20DN(z^!v9c?Y=UNxW8N>z4@T{Df4W|#!rT)K4W(i2@HohrzSsQ&>wI0q>J literal 0 HcmV?d00001 diff --git a/osu.Android/Resources/mipmap-xxxhdpi/ic_launcher.png b/osu.Android/Resources/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..65751e15c9432447c18a4af6a03ec970ad82c945 GIT binary patch literal 25006 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 Ef(x&YN&o-= literal 0 HcmV?d00001 diff --git a/osu.Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png b/osu.Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..05c6829a47625e8c647bcd3141594d1d5cea7b3a GIT binary patch literal 35444 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 literal 0 HcmV?d00001 From 2ccd0e3692d66b9b1dcf29daa666a09a459d2fde Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 27 Jan 2024 01:45:22 +0300 Subject: [PATCH 342/651] Add visual and failing test cases --- .../Visual/Ranking/TestSceneResultsScreen.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs index 866e20d063..dbbfac75f7 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs @@ -26,8 +26,10 @@ using osu.Game.Scoring; using osu.Game.Screens; using osu.Game.Screens.Play; using osu.Game.Screens.Ranking; +using osu.Game.Screens.Ranking.Expanded.Accuracy; using osu.Game.Screens.Ranking.Expanded.Statistics; using osu.Game.Screens.Ranking.Statistics; +using osu.Game.Skinning; using osu.Game.Tests.Resources; using osuTK; using osuTK.Input; @@ -44,6 +46,9 @@ namespace osu.Game.Tests.Visual.Ranking [Resolved] private RealmAccess realm { get; set; } + [Resolved] + private SkinManager skins { get; set; } + protected override void LoadComplete() { base.LoadComplete(); @@ -59,6 +64,9 @@ namespace osu.Game.Tests.Visual.Ranking }); } + [SetUp] + public void SetUp() => Schedule(() => skins.CurrentSkinInfo.SetDefault()); + [Test] public void TestScaling() { @@ -132,6 +140,46 @@ namespace osu.Game.Tests.Visual.Ranking AddAssert("retry overlay present", () => screen.RetryOverlay != null); } + [Test] + public void TestResultsWithFailingRank() + { + TestResultsScreen screen = null; + + loadResultsScreen(() => + { + var score = TestResources.CreateTestScoreInfo(); + + score.OnlineID = onlineScoreID++; + score.HitEvents = TestSceneStatisticsPanel.CreatePositionDistributedHitEvents(); + score.Rank = ScoreRank.F; + return screen = createResultsScreen(score); + }); + AddUntilStep("wait for loaded", () => screen.IsLoaded); + AddAssert("retry overlay present", () => screen.RetryOverlay != null); + AddAssert("no badges displayed", () => this.ChildrenOfType().All(b => !b.IsPresent)); + } + + [Test] + public void TestResultsWithFailingRankOnLegacySkin() + { + TestResultsScreen screen = null; + + AddStep("set legacy skin", () => skins.CurrentSkinInfo.Value = skins.DefaultClassicSkin.SkinInfo); + + loadResultsScreen(() => + { + var score = TestResources.CreateTestScoreInfo(); + + score.OnlineID = onlineScoreID++; + score.HitEvents = TestSceneStatisticsPanel.CreatePositionDistributedHitEvents(); + score.Rank = ScoreRank.F; + return screen = createResultsScreen(score); + }); + AddUntilStep("wait for loaded", () => screen.IsLoaded); + AddAssert("retry overlay present", () => screen.RetryOverlay != null); + AddAssert("no badges displayed", () => this.ChildrenOfType().All(b => !b.IsPresent)); + } + [Test] public void TestShowHideStatisticsViaOutsideClick() { From 47f0b860186c720619b24df1ab0581bafb80b1a1 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 27 Jan 2024 01:46:12 +0300 Subject: [PATCH 343/651] Fix results screen showing other rank badges on F rank --- .../Expanded/Accuracy/AccuracyCircle.cs | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index 0aff98df2b..8cec79ad90 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -351,24 +351,28 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy int badgeNum = 0; - foreach (var badge in badges) + if (score.Rank != ScoreRank.F) { - if (badge.Accuracy > score.Accuracy) - continue; - - using (BeginDelayedSequence(inverseEasing(ACCURACY_TRANSFORM_EASING, Math.Min(accuracyX - virtual_ss_percentage, badge.Accuracy) / targetAccuracy) * ACCURACY_TRANSFORM_DURATION)) + foreach (var badge in badges) { - badge.Appear(); + if (badge.Accuracy > score.Accuracy) + continue; - if (withFlair) + using (BeginDelayedSequence( + inverseEasing(ACCURACY_TRANSFORM_EASING, Math.Min(accuracyX - virtual_ss_percentage, badge.Accuracy) / targetAccuracy) * ACCURACY_TRANSFORM_DURATION)) { - Schedule(() => - { - var dink = badgeNum < badges.Count - 1 ? badgeTickSound : badgeMaxSound; + badge.Appear(); - dink.FrequencyTo(1 + badgeNum++ * 0.05); - dink.Play(); - }); + if (withFlair) + { + Schedule(() => + { + var dink = badgeNum < badges.Count - 1 ? badgeTickSound : badgeMaxSound; + + dink.FrequencyTo(1 + badgeNum++ * 0.05); + dink.Play(); + }); + } } } } From d25262944ecd3a6a2d595b7ffc65c9cbb058e1f6 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 27 Jan 2024 01:46:43 +0300 Subject: [PATCH 344/651] Force results screen to play default D rank applause sound on fail (regardless of skin) --- .../Expanded/Accuracy/AccuracyCircle.cs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index 8cec79ad90..60c35e6203 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -10,6 +10,7 @@ using osu.Framework.Audio; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; +using osu.Framework.Graphics.Audio; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; @@ -98,6 +99,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy private PoolableSkinnableSample swooshUpSound; private PoolableSkinnableSample rankImpactSound; private PoolableSkinnableSample rankApplauseSound; + private DrawableSample rankFailSound; private readonly Bindable tickPlaybackRate = new Bindable(); @@ -133,7 +135,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy } [BackgroundDependencyLoader] - private void load() + private void load(AudioManager audio) { InternalChildren = new Drawable[] { @@ -267,6 +269,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy badgeTickSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink")), badgeMaxSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink-max")), swooshUpSound = new PoolableSkinnableSample(new SampleInfo(@"Results/swoosh-up")), + rankFailSound = new DrawableSample(audio.Samples.Get(results_applause_d_sound)), }); } } @@ -396,8 +399,16 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy { Schedule(() => { - rankApplauseSound.VolumeTo(applause_volume); - rankApplauseSound.Play(); + if (score.Rank != ScoreRank.F) + { + rankApplauseSound.VolumeTo(applause_volume); + rankApplauseSound.Play(); + } + else + { + rankFailSound.VolumeTo(applause_volume); + rankFailSound.Play(); + } }); } } @@ -440,6 +451,8 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy } } + private const string results_applause_d_sound = @"Results/applause-d"; + private string applauseSampleName { get @@ -448,7 +461,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy { default: case ScoreRank.D: - return @"Results/applause-d"; + return results_applause_d_sound; case ScoreRank.C: return @"Results/applause-c"; From bb6c7a0a82f7a19da7445706698c67360968301d Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Fri, 26 Jan 2024 15:26:22 -0800 Subject: [PATCH 345/651] Fix edit mod preset popover buttons overflowing on some languages --- osu.Game/Overlays/Mods/EditPresetPopover.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Mods/EditPresetPopover.cs b/osu.Game/Overlays/Mods/EditPresetPopover.cs index 8bce57c96a..9554ba8ce2 100644 --- a/osu.Game/Overlays/Mods/EditPresetPopover.cs +++ b/osu.Game/Overlays/Mods/EditPresetPopover.cs @@ -92,7 +92,7 @@ namespace osu.Game.Overlays.Mods { Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, - Direction = FillDirection.Horizontal, + RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Spacing = new Vector2(7), Children = new Drawable[] From 567d2bedbf928ab4260fd7fa90b48ac906e8d109 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 27 Jan 2024 03:03:01 +0300 Subject: [PATCH 346/651] Refactor ArgonSongProgress for same CurrentTime meaning --- .../Screens/Play/HUD/ArgonSongProgress.cs | 8 ++--- .../Screens/Play/HUD/ArgonSongProgressBar.cs | 36 ++++++------------- .../Screens/Play/HUD/DefaultSongProgress.cs | 6 +--- 3 files changed, 14 insertions(+), 36 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs b/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs index cb38854bca..a0e74dd6cd 100644 --- a/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs +++ b/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs @@ -114,12 +114,8 @@ namespace osu.Game.Screens.Play.HUD protected override void UpdateProgress(double progress, bool isIntro) { - bar.TrackTime = GameplayClock.CurrentTime; - - if (isIntro) - bar.CurrentTime = 0; - else - bar.CurrentTime = FrameStableClock.CurrentTime; + bar.CurrentTime = GameplayClock.CurrentTime; + bar.Progress = isIntro ? 0 : progress; } } } diff --git a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs index 5fe3b97f15..196d8ca278 100644 --- a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs @@ -22,16 +22,16 @@ namespace osu.Game.Screens.Play.HUD private readonly float barHeight; private readonly RoundedBar playfieldBar; - private readonly RoundedBar catchupBar; + private readonly RoundedBar audioBar; private readonly Box background; private readonly ColourInfo mainColour; private ColourInfo catchUpColour; - public double TrackTime { private get; set; } + public double Progress { get; set; } - private double length => EndTime - StartTime; + private double trackTime => (EndTime - StartTime) * Progress; public ArgonSongProgressBar(float barHeight) { @@ -49,13 +49,12 @@ namespace osu.Game.Screens.Play.HUD Alpha = 0, Colour = OsuColour.Gray(0.2f), }, - catchupBar = new RoundedBar + audioBar = new RoundedBar { Name = "Audio bar", Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, CornerRadius = 5, - AlwaysPresent = true, RelativeSizeAxes = Axes.Both }, playfieldBar = new RoundedBar @@ -70,17 +69,6 @@ namespace osu.Game.Screens.Play.HUD }; } - private float normalizedReference - { - get - { - if (EndTime - StartTime == 0) - return 1; - - return (float)((TrackTime - StartTime) / length); - } - } - [BackgroundDependencyLoader] private void load(OsuColour colours) { @@ -113,26 +101,24 @@ namespace osu.Game.Screens.Play.HUD { base.Update(); - playfieldBar.Length = (float)Interpolation.Lerp(playfieldBar.Length, NormalizedValue, Math.Clamp(Time.Elapsed / 40, 0, 1)); - catchupBar.Length = (float)Interpolation.Lerp(catchupBar.Length, normalizedReference, Math.Clamp(Time.Elapsed / 40, 0, 1)); + playfieldBar.Length = (float)Interpolation.Lerp(playfieldBar.Length, Progress, Math.Clamp(Time.Elapsed / 40, 0, 1)); + audioBar.Length = (float)Interpolation.Lerp(audioBar.Length, NormalizedValue, Math.Clamp(Time.Elapsed / 40, 0, 1)); - if (TrackTime < CurrentTime) - ChangeChildDepth(catchupBar, -1); + if (trackTime > CurrentTime) + ChangeChildDepth(audioBar, -1); else - ChangeChildDepth(catchupBar, 0); + ChangeChildDepth(audioBar, 0); - float timeDelta = (float)(Math.Abs(CurrentTime - TrackTime)); + float timeDelta = (float)Math.Abs(CurrentTime - trackTime); const float colour_transition_threshold = 20000; - catchupBar.AccentColour = Interpolation.ValueAt( + audioBar.AccentColour = Interpolation.ValueAt( Math.Min(timeDelta, colour_transition_threshold), mainColour, catchUpColour, 0, colour_transition_threshold, Easing.OutQuint); - - catchupBar.Alpha = Math.Max(1, catchupBar.Length); } private partial class RoundedBar : Container diff --git a/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs b/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs index 48809796f3..be310df3a9 100644 --- a/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs +++ b/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs @@ -99,11 +99,7 @@ namespace osu.Game.Screens.Play.HUD protected override void UpdateProgress(double progress, bool isIntro) { bar.CurrentTime = GameplayClock.CurrentTime; - - if (isIntro) - graph.Progress = 0; - else - graph.Progress = (int)(graph.ColumnCount * progress); + graph.Progress = isIntro ? 0 : (int)(graph.ColumnCount * progress); } protected override void Update() From 3387565ba934acf70c6276c675c7c506e0b08d9a Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 27 Jan 2024 03:11:12 +0300 Subject: [PATCH 347/651] Fix song progress value may go beyond 1 --- osu.Game/Screens/Play/HUD/SongProgress.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/HUD/SongProgress.cs b/osu.Game/Screens/Play/HUD/SongProgress.cs index 4391193df8..962752ba5a 100644 --- a/osu.Game/Screens/Play/HUD/SongProgress.cs +++ b/osu.Game/Screens/Play/HUD/SongProgress.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Bindables; @@ -96,7 +97,7 @@ namespace osu.Game.Screens.Play.HUD if (objects == null) return; - double currentTime = FrameStableClock.CurrentTime; + double currentTime = Math.Min(FrameStableClock.CurrentTime, LastHitTime); bool isInIntro = currentTime < FirstHitTime; From 96dba035134cae64d86a602236a36c7d60cfaade Mon Sep 17 00:00:00 2001 From: aychar <58487401+hrfarmer@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:06:01 -0600 Subject: [PATCH 348/651] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d5dc0723af..d7e710f392 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ A few resources are available as starting points to getting involved and underst - Detailed release changelogs are available on the [official osu! site](https://osu.ppy.sh/home/changelog/lazer). - You can learn more about our approach to [project management](https://github.com/ppy/osu/wiki/Project-management). -- Track our current efforts [towards full "ranked play" support](https://github.com/orgs/ppy/projects/13?query=is%3Aopen+sort%3Aupdated-desc). +- Track our current efforts [towards improving the game](https://github.com/orgs/ppy/projects/7/views/6). ## Running osu! From 71dd8e2729a6e0f3d44606cf1d0d5622e030c71d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 27 Jan 2024 19:16:54 +0900 Subject: [PATCH 349/651] Update iOS icons --- ...80-5cbe0121-ed68-414f-9ddc-dd993ac97e62.png | Bin 0 -> 278451 bytes .../AppIcon.appiconset/Contents.json | 15 ++++++++++++++- .../AppIcon.appiconset/iOSAppStore.png | Bin 350640 -> 0 bytes .../AppIcon.appiconset/iPadApp1x.png | Bin 10106 -> 0 bytes .../AppIcon.appiconset/iPadApp2x.png | Bin 24966 -> 0 bytes .../AppIcon.appiconset/iPadNotification1x.png | Bin 2227 -> 0 bytes .../AppIcon.appiconset/iPadNotification2x.png | Bin 4485 -> 0 bytes .../AppIcon.appiconset/iPadProApp2x.png | Bin 28089 -> 0 bytes .../AppIcon.appiconset/iPadSettings1x.png | Bin 3192 -> 0 bytes .../AppIcon.appiconset/iPadSettings2x.png | Bin 7156 -> 0 bytes .../AppIcon.appiconset/iPadSpotlight1x.png | Bin 4485 -> 0 bytes .../AppIcon.appiconset/iPadSpotlight2x.png | Bin 10768 -> 0 bytes .../AppIcon.appiconset/iPhoneApp2x.png | Bin 18204 -> 0 bytes .../AppIcon.appiconset/iPhoneApp3x.png | Bin 30946 -> 0 bytes .../iPhoneNotification2x.png | Bin 4485 -> 0 bytes .../iPhoneNotification3x.png | Bin 7458 -> 0 bytes .../AppIcon.appiconset/iPhoneSettings2x.png | Bin 7156 -> 0 bytes .../AppIcon.appiconset/iPhoneSettings3x.png | Bin 12085 -> 0 bytes .../AppIcon.appiconset/iPhoneSpotlight2x.png | Bin 10768 -> 0 bytes .../AppIcon.appiconset/iPhoneSpotlight3x.png | Bin 18204 -> 0 bytes osu.iOS/iTunesArtwork | Bin 142214 -> 0 bytes osu.iOS/iTunesArtwork@2x | Bin 350640 -> 0 bytes 22 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/300076680-5cbe0121-ed68-414f-9ddc-dd993ac97e62.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iOSAppStore.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadApp1x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadApp2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadNotification1x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadNotification2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadProApp2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSettings1x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSettings2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSpotlight1x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSpotlight2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneApp2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneApp3x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneNotification2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneNotification3x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSettings2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSettings3x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSpotlight2x.png delete mode 100644 osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSpotlight3x.png delete mode 100644 osu.iOS/iTunesArtwork delete mode 100644 osu.iOS/iTunesArtwork@2x diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/300076680-5cbe0121-ed68-414f-9ddc-dd993ac97e62.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/300076680-5cbe0121-ed68-414f-9ddc-dd993ac97e62.png new file mode 100644 index 0000000000000000000000000000000000000000..21f5f0f3a0901ed465ec468164bce1817fb4ea22 GIT binary patch literal 278451 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%0A)gfldVW&|CqQnY^AyASRe;j{G;CxSHvf;;W` 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

=a18LszGNEXou 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%0DxLS1R|I-4EW(y9`kj-B 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

    sc-ZG& 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 diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadApp1x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadApp1x.png deleted file mode 100644 index 42fead236496dcba43a266fce2ad25fe388bdd88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10106 zcmV-=CxzIFP)Hg1+lHrgWSWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6 zwD^Ni=!>T7nL9I?X}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8re zhoBb*p;u8ID_yBf0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J z`jH<$>RKN5V(7OqK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYv zwjAKwmYb0gKL(K8-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z> z!FI&AHCpoWI|RUqx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVT zrI(b06~u#xf1yS}_UGdMvD``!0~u->P=lA4?YN`hilQ z|3tHka)7T{2CGqwjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^ z7T9R1gAN8V6s;5)ieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2b zW$~+pTw@bIek?ZvKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L z_AC5qq~L$#SMj%U$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6= zb6>{xYV#Ue-+LB$7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re z4r3qYr~6#KE>;1F`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+ z5K}u-6REM(K@W$srgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5 zh^QEb$V`rCQ-|7ZS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX z2i^rZ^Mu;6+rb@?NPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV z0id6JRRdfL?*ITJ97#k$RCodHTxpbCM|J*sUuM;eq?yq&)?y1wmW3r-vScA!Hai4^ zYy;uMCd&x{1qdW$IUyk=;e-UT0EPp{J`j=sIe3BC;n<*r#j7MsvMpPdEo&WVMjEZN zFTHoZ@4l{{*F8PfjFO!E$(3He*Y&DyReg2uty{OMC$M_;nj-$6rj0;w+ByG^GZy~` zhqd_MU>0^bh)F)5hhr8D1`!H{-0K!jKhjzkb4 zV6j-N%-brO#)rQR;w!M!rU-eu`li7K2AG(M%8loY(x=%q53pL9XM*}vZN<4+OlQuDu3SEkXX%xjzS8GcvZo2VCyzOmo#dT}0MO{;a z2SkRwmpv&-H=I%TgQuL;>FPNp15q#I=-@D(e_=0v{NtbCiKm{#g$oy^lsZYb`r|a< zQdF`GnA+yVRnHRFO987u05X)QIkV^BJ-6P9+i$-eor^E?I-Vv#9F#Jt^FaYXF$(eS zVNiZueh_Gs4&+!?cL%aE$Y@6iAaC7WC-CsY598k+eh9s%PorAm1eE&dgyK>rkP5)c z4ZOsMbS904x_aEc`%+l~hr{=SwQ9B)=PCU6U&2izrg60t8>u7Fo3bv72AV z`+RRuQUb1oTr9!?$l|--`3}Bu?>!hBA2;A;4%0-583X3GbCRkhix%V0Kl5i;w{bmz z^4TZ>#f}wspFm;T0Tf<6OB<9&p0;W{o0(`q=}C4){0K++T__lu0FCbpMNj=SA!(MA zWJxjweE7WCmp8;vwwWxeK5Di@!h@XH@xduSJ>+oSmz-kwW^`zg>gNr;jWoIKuxPyflMvHQ7a5s%ZI zsX;bq8XQWxQ(?bz8=~|0=QYaJOcG!!JUTXtO*d@B-Cy|%+S)rNRFJb(ky14J-JKZv z`Y#YZGm0?P!qko&1yqJAQcVIvqgsn3alw+$RQ=xXLj`T74I3tRl4`CYx3wsiI#>T)L#orR$!IC#*Bs61YK0Z4FYVJoLH%fP(x5dFsk=TJO&76DEWf!3twlF&rN>yo(f#!WbM;2@549i32l@>kvJqaz2J z?w15uDwV?ORjWkpicahBiHjli6G1eVUWSyoyRKQ@f(->?Bs?%9F<{(b{RMI=e$sk`c_UhR}P zE9=xGwByk@KKGf=V&T$7G^ReV9zTe|FZ~onI-%w!l-Q^;k=%rl)R?JQwPLwRMEN8e zlEeg!u>&GbcSUIe%%4~JMH&o|^6R~#9pPZ5T{6(P!pPsV9mS`P+N!{2?%iFO*B8O( z{_szcNF>UVrFP3syUVGfRm6{J0j3#o>u>xf)^6G`F&om`&OUn_Ltp*5r52%fE7=DcO;PF%oDD1HQal<3p6^^ z`G0x_n8W4O+}^8nR@~VkAr4HdiDl> zsBCL&A}L9QfRdrFDP0~D?^6SNeiViK_ab!XS`>!TC=$f*p+5ZHZ*0ZhefyAR46a%Y z{VXaZOrtJ;NSEwZicyC<-n9iQu6_N4-J(%X|KK@f_nm|m$C8?hk$9=oS$WX>r+TVM zc?6nf(#p$gi}FXKoPA3amg`WGv;^&|UzJ^+ns>Ipxc@W?JB}f+yv=6w!kGcQE;%3X zd(W1ON?92&fuxS;QsZT}<}jA^!8`BrreoDkfbv=sKJpU5@_mFiQZo!QkHqy1;*amNni|jTw}d|HVN>4)=S*u6W$x^C(^z1+?BgI|B3$ z;T@aah#zfxw3?-TFUy=pOWv(!o5h`rYPXbI0y8gO#6K^QCc^b!JKb=o8y$EUK&CQtTV-J z;seGNswIV5Xpg1Fd8KSoF90V^3TmpPM|WOyeJ!k=8Bbx9xeIa9{taLdnd_sUDi8un3 z%pz6V+uU%~Ro!J%#_4TSeQbwFyFR2MqX{Z2HB`OEqqN0l&jO-EwjAO+yDP7ZyxBCG z246m}{Y1`zSSs%(j-2c>cc+ZFd$nTz64WJ=lgvih=qsZdxUhX5=FMmL#u&2#igES` zcX#+0p}mlkIL_6-Ff#k0m=!0C*c&cKcM;Jj#l%=f#F!@oP^SKLC&xI+MDI7M2d`FP#<*dT*$)HzIj%rqhR-xaf1QNfs z39^t2}_1WjPY*DXfl$KS|pGSx*}Q<~{C;^Ax9 zhBsY_%pW{xgB4%D#L}Du=g$lxz2k_fejvf++42tLjuRkCT4d=QgyuFP%Rr`UOBosA z=99W|I@_d4p~x7YRxny$#tLB?{)ISj_@GId+$K?lN)`yhLIS4EQ12}PJ2PYvi3E3A z;^>=kCv#IJR;+vCJ=dV&t{Xg6VS~f$P~%57bDJ#5 zIGVR7sZkE7oMu^qSKw4%I6rK5$5TnEHwRI`GE^hGC09nGt_~K5#_f_uuu`x6nzZy- z>W&f%R9WwJiw zkkh!*O;txT82`!32y*8s($)klX+fH?w*26@@f1Loj}nw)3@gYD4maYe*XuVs&vx0D z5?-DyD`jBxR__FuW=I4k?4WXJP;%Ub4>vLNBjVuCoy7<(5%+ui6@aO}SjKpjXq?mEyX=!MpBVTzSr$Qwq z;+h#s7+3`Xi7G1{7vG1dDQWfx{*CRwniMtERpZ>s;>u(p-B6+1!Rh6kvc1X!lQ>agCcB9COlG}DJB`EJZFi6?&}_N##&L-n$&O2Ptm;-$pfZUrJe zN`L|dGIPXABXc<`QECiab&4V^dsnVd>fGJuNf%$s4!DCPtQiQ)hhb78BA1d>u0q0;V9f1d;zN>W#+;*O zBd71`h}1%)(Ij9poc3Hwn=~VF^yE?JE)1jp?w=y}0#^_EM~ULid@tF&z-7&-|Hw^< zENq#O64g;A|FcUZd;&(V+(iHdM5KiWSa=0B=4vP3s~>JHt8(%`EledIj_ld@o#_=4 zCO@n?RN~(@b9~hHA`P|8NKFh~izj`rAde=M0cT~wdcG5=G9xPEW<-K5Da-!l!$@4c z5HU^yk*nq-bQvcJ=93c~n9c1rrpcGH3OJLAR8>IdHXJE`Y2fTQfsDH<0!QfJso+O2JU$b zeSh>IGF;#r7&PQrE{KB)Nt1VhQsK7nvB+vgNW0Zt&wpXNc5{PBLo7R|=kq5URV=~sIZzjm>;qexB2oF77n zOQHD2E3B=V0ZKaCYO15bWCx@%;#uHYHP`0>rhZ7u9Laua1H}YVHdzuzX*S}z_Do-; z@F?9>(lg{7DEdIhdrq(rXBTmi(QM@wyUt2fAuW|EP{l^Sy`6p#{UX^F<|#(WvWZ|B zXR@J-Q8+PxfqNfAo;HMDAYv=$Q{<^el!PMBZlS^3s!MM_W_qPL z08-B$MRZ{+g64@+>Sz)&bX_uBw&jNDf(S6SDX5v7gK1L6_D`4uJ_?jlKO`jD%hX1S zC9#h-`RG6%LDy=h`}C;_r&WNJRZ_EwW{sZSQ%Lb-a=e+lDXcI!o2tUVTb8O8&}OKQ zV#x$@yXma{)uX7tZ4K9S?RF;BhJj^^11WZtyWTiin(}Zxd|L$q%%a`vV9tz zA{X2twl&m{z}QdsBSpZR4=2eOdy;E9&ccbcOL$JA$-ovb{nOyu0Xs@+mV9z&>D~~u zENx_v4z_@nG-*;Q^8ANL&TZVSUIaGR#5&g|Ro0}CE@aSk@`NqHtU&3b44B-1F*r*x zJlWlYrL(UxeGW9n5m_{coxEU%&=nTADie$akvh_0_gp~#w;xBOA!))Ow?`4xAk|H0MHGBAz%@yAFyhJq&=nxar~1#K z_uLtCOI)9IF9W780$^l(1TS$1cvX{(T%CAFlVa|+`z;g8xSUJ)e4PN2AxdhJsN}_BzMIL2h z=QF1$xlzt`)F30i*O@hisSGS7vaNy3S}Y=KdFtZWe_|hoMn}v)v$WEOkGoP>kcGGJ zdWN$JJ0c?b(W~cqzKlkIq~(IMd-^V*Wea3OBuQoqun>M_z_QHug?G(kM_Zp4{)$18ii z=c>V;;K0|aPd^6Oz3+Jp_nu`192MGyAgBB2ih1TDNcRO!HEE;OA0{@VTb*ed-}6$B z8l(Zzz&H^716Ct@IZ2CoSH^*)vfgG2vuTFbxiJow&GZC#BruMh`<^WcMwyj8Q~;(F zdA;3dd$H>oMh_yT*JP5oX_+^QL|hJT^`+z8ZiHO}E348sPiiKoSEft_wmfqOTxE%= zziH(%N(Xe9>ZP-}F=|JG2Uj#hQpVL`1XgxX?IDX9UW`ZH9p3PVtxacVVtd9h=}`>4?VGsew_R<&pnY(=V(&RYLt#-Ke2lU zj_p4ngXPU0bVTdu$vY`>465%_b#|iRlCs)r=jSyYVEy_1=D?rsp4Bf6^7(-aI6v6O zdmk?Fo?p8F(2f}GbCAER>l!_S$M$Szn2URwrHR5nc#{BA1yakw(P7;8-~$r?F;t?B z4lRf+Wb9f}b)TxEevoSAG0FDvngDnru~wSi%C>2v;^Ls`j0PtfsSULzadjt>i`!6C zd`>iP7VdleQS=S;+gB%9{kt4z9L=q(K3 zfo=b8eb)gP*A6FX;$0IkWt8h6(Y^N{zf~b+k<|;SnyV}-;cuKe>SiH-x}K{$t~5!U z%829yOR6=aNm|^c*A7?%l6hSxbXS_2we_qv>${$(x>R4Bfx?zs*CJZaO&Fc45OMAL z%}4ITh5kO1R@q7cr9t#lO~8~v4U!%|@W?}W;c5D1TEmGr8g=hqhuGB%ylAPHTJ9K& zvGXM-(caNE_(1SK>$U1}hk2zg{swAkmZ4+Qun%hmCkfNA72`7A#F4_`!jh=x&)AJr~UA4TKV z%?Qoma)N%0e>7u}7@F$2JQ8w7QZI>jt;>^SfhZCm2avuyn>3YgrXN|UjgBZ+CS~pr zu}gP%#m=-VmAGRKie0o*3^D{bsbv;6;IF^+RR&K}C4R2$uH?jhO2Cvwoz_wCoqM0f zz2Eo-z1ouGFq9Lbv)9CpScOpX+Ak!jg({eZ{Le2fATZ?RhV&L7$mxG5gI>si!E<7dIHG{m+1FGT=3EkycX$@ zZ&`|1Z>;3<>pB9F54%Nb?Ij^Wr?HENpi%;UCN_0_s_N2skNk68@3uq zNmlE}-i%~x6YO`JvRiGVz0JlJScN_G9bEej9yf&oLfF`@<0| zK5+!WQU0)f>qZn;wj(_{W>E!!r5UgqECE?-26BzkU6xE?7^kw9#zaX{Es`5hCbgY0 zviRynnES`?=D`w%g${V3B+ZEZOY8CB&wh$OWOxzv+5nj*SmJLIrVe=`E#Jm#kUHdm zQbs-VzfIeRj~&I{=bpzcH{XopNuKX|@gy)zLrS|AyyXg{k|7N3I}ZI#iA|6~=CQ|9Z5%cRhkfd5q~Ke_=wfgWMG9Tav_w zDOpeN+G&5CMVfQ5!SlDX{1av;+WwdFiCjZmx`3714)SL%t5&SU*FN{RSe$A^;gEi+ zOrmiOawkdawxJ*HL26Hz`EC~P;%h|-Bsr3xX%RDy@z-#EFJEn{?xZc(h+$~eJT%_E zmcQ$cqo8BuI+sBTUfzzb`Z0X$Pd<%3nl3S` zBB>fAKUq5nrcNqquOWK%d^G;*Ml{^C0-=-qVd){748`&ost&AKgs1us;KP6LJ2-gc z5W#9R2ifl=`+2|Cb6LV(D^sm^k~B%>=;){c`0=eD#nvr%A$E8Gg_AV?BCW@CdS_v? zZH;Ajbpib8jU8U&WMNTKZLCZ~J;!;zLkCdo5TBf9@{YDQA$mU_|`lbF=(~JNU6TdAHL)ki|>++jfnVrr_FtewIvSpkkY>Qq8S+qwfkerR9A12AO z-DnHFW&ImAp<)lhL2_RLVXOW&g+s2d5JmELOIC?WrG;Y3mGq$|rR;*vP3QbvV)$1oJ z`g1ZosVGm}I&T~<^1%Vp7F-}n9ttb-SG9wYG*_++u`cwUI%R+6%Ay?vNQ-#y_mo_wmEvJu`(|d`1&;dWwSU5fX`*l|i5UT=j%yU0 znCrXjgA-S)sm6yI;>6sOKAlCA+H$v?Yd`xFSj^)Z<_^5+P_GBNOrGqeBA`4#LMeAr zq`K7(-PIOXPqoz7XjaW634q!tK2FNS%RPI>r)JT~iOzU>o%W7?Ukog9QDyG(I>p0x z?6_1&k|&8{7R$qSR*=&9#@eESeEuDjS7RcKcsh_YsfdoP)1^@s67{VYS000CTX+uL$YePpv zZ)|UJQ*dEpWk+RhWpZg_Qb$4n062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWSWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6 zwD^Ni=!>T7nL9I?X}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8re zhoBb*p;u8ID_yBf0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J z`jH<$>RKN5V(7OqK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYv zwjAKwmYb0gKL(K8-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z> z!FI&AHCpoWI|RUqx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVT zrI(b06~u#xf1yS}_UGdMvD``!0~u->P=lA4?YN`hilQ z|3tHka)7T{2CGqwjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^ z7T9R1gAN8V6s;5)ieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2b zW$~+pTw@bIek?ZvKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L z_AC5qq~L$#SMj%U$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6= zb6>{xYV#Ue-+LB$7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re z4r3qYr~6#KE>;1F`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+ z5K}u-6REM(K@W$srgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5 zh^QEb$V`rCQ-|7ZS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX z2i^rZ^Mu;6+rb@?NPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV z0id6JRRdfL?*ITm07*naRCodHy$8HqS9RyV?(0R}>dmqx%a+_F_X4&twh0g>LkJKU zN;=6v0{?&hnfcFT!X%%}gg`>3guoF zz&Y>}fc*prQ_6w1TCtZ(C5u-}ON$i>g<9Uv=r`yp7K=_3biEpAdo|J&3k6<5AAF)L z&y>pq7=#QD58LSIsOX^Z%!z}r_V)HON?@81FbdiNxS%WeXl-qE+Fl8u!6#^n1t_YV zuC}%|rzxF>Gx;03Mn*CtAZG>rnfeZhmRHR}6R0IgjCy##VnfExt zj41#8eSJ!&)tjJGr%ri1(kQH@(BkRCBX|kuBk%&vQ~g);iC=&knumvnlwhFU^I9&u z_VzZHvd}nHt_mTsU?S7gi8^CNI1E420E4y&=p?{Y)?((cNNx9;2}5H(^5}X^22|;e z9zAM@4HC0JOlYFOTgAJUGEmd>P1f&XxuQ@(N~NLz zK3v5c_y;drTie9D!O2QCGoC7d#ahNa&&6-?p673}-`60iDk%UKY2yxs|z?{8& zxvgEZ#?D{8+E%SxX-k(bwb`@hSbO*6*5cv*K|3PQ?cTG;o`3#%+p_fq+qC&P+p%+p z9Xoc+D?upaG09k!k<a8pH4295rTN*{rf z=ZE)5iU=$u)Hy58u`AZE_iN3X3v9`fCDz`R026g-RDXt~4p16?5fjhc8*nbz^oKiy z>S}NAu=$G@+59DoY~58?cqAhOL$-JCUfZ;3lRfg-qxQ(7kJ`?iJFUOmaY5ot4qrnh z3+0qgKfJ26p}+l5Hv8*FTJ75+va3bL~y{>rNS8)2+B4LIa7`vEV=|rDs+N_ zK{Y>ZZLKcqopv=>e7JD!TD#%e>+R;7ZnD+qpKrZ0r;U+0qJX1mFpYhlk|&y0fG0iC z+CX7&eaBC^bi4Nl_u75;-)~#DZT03f-6M_uo4Lo{Hc~QHx~M}F54t1#16)(t0jUBQ z2}ipLAR8SW@#ZBE6qM*>?}Ybf(!n$sf>O#osn9Q6u+Xl)>MHxG+wZU|uDsH^rgaC> zP`A*zkW!%X)!-a#08SOOTt^2_4cHS;JYnDc-ko;ekAG}?_U#oOgWYi=B-0WBD9Vva z$Zt9uNOc^-gR1Fn= zcf8YXy7^}7nb8|a8k$5&j+|P;AFqu_oMsl%U}D7 zJ^bh+UcsAf&frySb)b-PMAexHU?-BpT!1Ab17ywCo@DsRc!o*Pu*Fu%o9AYbb;!uvrISC{!-=BqT`L6wz!{75~tK@*JCFD(D1Ab6RAlG6}ZP!4bP( z&F1Gm|F;e_%3~rG{go)kh5%M!-Yf9nl2jsn?fDnjFTD4CcH3>YSzEWP;xvN*t8DXW zh_nbKKtz+ITg6HGl}^Y=dtBD|WBt18I;l=Wztn|38A_3k!=u55)zM}JNtr^I03cdg zrb#E9(QPd=HH4;nVY>93vJ~?80oaH@2d&LE+tAvMuBIOT;IQ3&*WLEnzxkYPeD)b{ z`lh;xtMF%n53g!~VWgaQ);xR9&%evw{`R-qwAnM72Nnes0mU6RtPzWsPub|M!#29} zWgFS4`@Z8=JaocJ0##{f#7eHi$*&BR!#tNAx{QYZsYiwbsXjICIJ;_8C0dC12*!)K^uO0kBw|OV57T_ zSn+6IkW54eNC-n%Bwg7-OOa-->}aOj^2{^k=CDK)>5@uON&2+R>ao_Pv#ssC`PP2% z62BK_m3z5l2LQ(=H71mIheo8MNZheyyZyyyK5gH*>rU~f0;V$f zvLmC+!kAi^=fDI8Z!lhDZTR}H|twJuVGu zUCU{ozQF+Z1476_K8paseSLByIqpeQ+zeJ zR|UX^1uSab2Y%s~?Y-}NpS5k z21$EB;L3|KD+e@<&{*G<#9S3>$`#e~%yvkzY(P>WLMKDhjSd{Q;fG$dk*D`sOP8kj zES{ygManZSqsb2M^%o#2o+aljx0|lL(O!7r1qT_tKOF}TDJ#Ggg#+{N;(PLx2eK&x z7>OgDAc!Fe2#6Q&kPvTt{T=r4Kl+%>TedJXiPX|OM{@|U6i?~-LstCThpqT`PnChC zLPnZpxFN<&xn@y{ z0bH74$~g~YQwFeTd5?puVPIN@O4WG2z5iYBvETa-ziZvhbf9OKr_fU2JH%A=zA!bM z`r^Yj_}Tldeb@1zwC4Z|o*_vFl~yxuM1X{u4Lf2MvnWz`yXUFtzd+m*{u@TKpd-RFNy@EHKcA2o)EK-iN zMo9L+AAmOMzyf5HDS%7IKV<*|^&}h<45+8#mF(Al@mK7(KKxq}|59WJYFOjZwOndx z+VA7L?ARyovi^IY^BUB_Ky60zlq@j7g|gnLgL$c4#4|znAMaF0Ot9mE@{A<_& zG^qq58#TjX^C36n78XgGp@#ydtopz^fvlyo-LAR%8q;`#J^08&dRe2H&L9ZjP=O+E zm@b8W+13_j5F@=PXTHZ4DjCg`01QS0s3gE3lJ~#%zF)N8_|ON%9MyUxSDrFYQvkT6 z#Gm@=qjvl=KeUnk$J~xYuaLMpl(9Squm*iDdY+H*@4XUamR9gf9$;bs(pY$YhxZMF zS%n`fUW|o8qxs~0yCeYxR^{}*t)tyKj;pzPWS6THg>&Ypx2aA5V9Mg7gG}*A`CoU% z71k!kJ^1hj^{g9jF5wB1i97k{d00bqkHHC-?u%TY7Ml;W-+7(#0WywFa9{^!dZ%bt;MmJE_8{+SJcO(}J zKk{A4ruR_T37fk9D10np8op$UK-?O1-_PW$^1}1pMBbn;RFcl0- zkHR$3sG|a)d*wO41FYU|4fzPrbQPbaQS@;rA6y3QQb5T^ckeF7YDSIq9HD z(jpCapqXZK_c7W2_E}-xG%GBfsdsvxCCLZ`$fV1zUw4I?%Yxl6Nk%#`4BE0niPT-v7>b+lN2$5dlR^8OSk1z%-gfiSdE& zJ|oF>kBz>3QbR?7sacE|Rm~^E9j#+cC17yr6?53YodSkwd5*NF_iA{D0+ATDjOEAU7I47ME;+@vr>&>G?z5^M$kZi=?RbGNtMI#`S;$M1vw|FOg_uRQb z^~mcm0W!4?>n>k!Lw)`Bu+{~zvIy4aIht*zssk{1O_{>u$S;(CfCi5MSlUe)z#yit zzt7%y>+SZtzxyAo6uvwOefG3w%#v=Ni+PBhHb6xF zxyR-b8uMm3PZ_}IU0l8XO8fX9{*m>Zr5;aSZ!v;P-%oz-0XzA%N2P=+yJC1Fj>5&E zx42nCV!Rnw&n!W~&XDc}qm!;pH6JM!)31CJITS!64tisF?$`$XQgefZhbK8 zX)A3y;M0v-&Yv%ZP0}O{GI-69+M~OD-rCjIUF%b_x9{BPV984Z@V6)|)32cmTDc>+ zaJA<3PYJ-N*-I8Jvi~9r{rq#5OSlH){{YMr3y2d@pM7+dqg$2 zUDA$uTgtvSH_0%0&t8bCeR&Q>PV4FMMYm}`Fda82KqqNRnk~{{lD~<&R;PkExw<=K zq^`k_N}TxN+H%ND_QJxN1z|ihf(&q}5*HuXVYcnC+tfPGU0_$NTW3Fd;Kz3O=#iQg z!zHYwR-`Nb&eFRoH0fc|0Y;%QZ~SAw`}=m$HS2^yTVp4UtxFs;2!T7 z)dMs6idU`tMVcoaVASXj{nD@5Ti)@u&~wQe{(%uF^cr_O`8N;93?a!yrt`}q((CuE zi~*>26-H;dmc?#=Rlvj#*L7-u5K^WKT*R5@C=8VPq{3hEs|YBFEEjaF+7*C2_I7Ie zbq$ba#qI9^**1Z!PkJmM!{l@S4zpdFx)k+VB--IV0a9a^>n^k|sRBQI@P60zCX!?x zE!iB%^IhjX!$G%P{~CMmd*3IpsMau-E6XXvSeg4|Kt1&jPpDZG8I`7H6%hW zwGr3b)svZ4w5vlySgU5n{`LnyY|9oesVMIgPCF5BtV9won|*{~Tp#+S57@G`tAgHza+!A6ZB+21 zkL|L7FKkdRN6o|pz!js7AOlz~MdF9@y(6Rh9jxX#l2zfzN0(MZ(=;|(!02M#vInJs zgQVh$K&MGf`$>`Pkm~Nx>Ll+EyFyKOuuf^t)lIa z`6D#-85J~1Xrs^YT?+o_=O5P8rW01USgYUXYN2wn#XIHB~tpgdoQxmf~dtQK6^kjHD=gvy#H5h!()%g zba6C)1yzImIc*7sh4;Nb`%YVV>Dr*wXElxVT=ahE+Z%1n-bCf=It|l%nnqJ*hN|!C|P*Zu}h`sG+-f9P<3gSUs5pr{aRBf08uDh01Puk93Ie1fB*iszuTrS(I6}Ku4IiME^n(;a}J%d zf&cw*Sm^`c5^l1jSXPHG8Z({#Ebu4jn9N7=lr`|1OalN$P5>&`;R=%UQ|aKnX0jB& zCZ(TMS8HS=W86|@=?;SERX%sXdZx{=Uwr3#yz-w;#T*APzy*+C5F#5Tl@WEGxq?I+ z@iDW@FS^8TzvGTj3$h9jX+_icoo8%RtEt_BoWVe9^y&7RvP=pv1}Tj68jt=ALMG`I zosN3>fv5C7p|P!{t=tPv*U(8KC>f3PvC?)86@BkHv)Mf^$$ZQ*`k~AYoV3!em+f^o z-C|c>woYX|aXon)z~ZPmwGg1uLmZLq zJ9_g!+^R82S^HP2^%2mjKt}7N#mjAN9rpfryxW`liAu4mTmc}jQBukQRyxwyWYQbE z`202YnwxG4(kn}`rzV^lmfrQ053H(6*JKtoK56Z)>ABX&R5Iy2)CxKo-%#wcfSwgM z{(73Uxn;%E>^r7Rn|2H;{-Y|s%B8SMAWQO%veGb8Y4>5f_NwdbDoyQ~s1&O*Q_wt8 zqej)-{`c95TCmViKABaiOVwX@P|tj7py^l6(d#3^(dcc~Vq(Sol> zXWn-z2zhAA31p|VFK)6!(nxqfQg2{7D<0Gl-@k&fUm0IZPie;RrHf?)J7RX|q?cO^ zSJHC1wxx6I9dCK7J@}Y(Xi2tac{q+6^&((u>;VHr-28_ z$}xxZqWR;lvd(Z=%S-k%cf84_Ejml!$uL?%m;#SzPW|Zf2XhtsjL7{}vrNm1CyVJ6 zB*R1iZYusE)w9ygqA&d}nk`^?qZe^7E29~Qjjb}TpMV%(rH7Rs+hev+CX2H&bTM@Z zx~EOIx7_wd8&&HiHa6v|0EXR$2$-(hA)8FvA(j_uH|N`KeqH#K({n6om%t&_3`LZV zqM_dtkpx*0r<-}#F`JSTS+Qonqf$2G(#;z^&t?HivzpFhEgBfF9p_ZurTezas;|no ze0H^jM_4eWM;r6qs#W4_t2J887^xW->DY^LTtS4=Yb3KQvh2`&cT5)a9?8sg>#nrL ztIo-nULtDri9NwA5$7I_rPt6?oPE%c=NwOw@$rr~Dqm3@naOt0i{xq40WSEP1QgFz z(xs8eBnU=zxC2{Od251n@J#9t^Yrzetv}%bosY~;RFq;&+gYfo?b-&ksz*s2T0S^` z@nXC2%4>y<=B)eUbTFh?r_ScVT!F2IO)i*^jV%cYaQjV?UY)`vbL`WOo}(7Z4*h6L z$Z&(YS2`Mgql*nqPy*IkzK_YGrKNdgHH*gh&dU^Oq8Ig)btE0<72yEoaJlF1FPf3A z0$1z&8P=su>{`#77WRf^zL$V1F{6$4WKdO0!u}Q`4{f*3(HeR%{vUWz1L2FUuw<6D zXb{+pf9Nrq^3 zoEj^x7*c{t<*+cEMgPq|zs^XxxBIUr&=Pv`peS6R=z zIm$>zGlLGI430d!!-}WW#A>sW({<=#L2qh2reu?t7b;F!ZdPx~i;wqoAnK(}6PO-@ zWI=7-?220H`8OoIjNHQ-pdQ_GESv^M#aG#Z3-%dn(ZF`A7Z+&BaeR`5Dm}i(3O{qP znHKVzR*m~YUV2TeR;O6Ef>n zrWpS?B|m;h-YJYF3l`~+sSBy9;Yxa-y676!4ui#g$6P!oKcCKXSa}R$8gsQw5Xl%| z&}4zEk=`7Vsx@aYo1rBi{DzOsxLDE4;VQdf6AeWIFql|K(^)TS{90g<8a-j!AOl z4d$~Tb+R4JFS=eMqCP+E#(+xU4-60HM&tHBl_dIDLr#nd5=tGGvb3SBN}9x3!Kof- zx;a6wq%#Mqq*5vo536NtZI5iX?n`9ZXG0a1wo$e?VXY{D^(;TzuDs-O*Tc|b>+!B3 z2}bz{mQZ~ zbTA6odzj7G(_$~Xf+&PeS?Z85?M#m=O=k|S5C{BN;-b!$9%fdkC^FICYu?a(>={>3e;*yUGanLlafZB zed84J0w@4iU7o2~RXO@B3oTz8dHz5+hiMvmSR!@wxg)1!(O)P%Y*~5CIO!qbxBOTW zV8qTooNF{kyK|NnZbp%ujEBr=T8@u9reZ_CVfj1vq=Sh`rY67nGmK-mY4klcxdpZ+ zQf+GQ(SitUHvV1XV(KkbF<@Lo4ZKiXqk}r|ie8wq;^z%1Ez)ySi{4=h;QXRWFHNtI z>{ZQCq)GnVf=(E$;QTJXOBXaepcCWH)4>0zwHB3U6=qd<@|t$M%6N^pAhZNR!tsNA zRX9ZeWJNJ&{fWN`BEU zTD>OdUs;ifNkz5I*h!>BB%($+SMAh4l=Q0Q^#Dvhs|tvaFhhW9(YZdYtL9sq_Pb(d zq&-9h?&Q^cSm9*NAjN74(n}x9a=eMjO=W9$s)shIqK~ ze~=7q0&dS87hBi0s{~@%edzgC(y9*AM$!OM7Hv*t8-8}L_1*KVjY#iA=Y;m|8_u_$ zcU-C8@=NK*xCn~`IX-Ad{_tB4GNf=AsgP&o9WZvi^D1l68Ac8mS_;A`FWy7cklWD4 z-FEa(?$pZ$9q9u+By(2FlNXKBWU5th-%)E>IY01))`a-T7xVuF{FTdBcv*&N^x@2d zs;NNb_;UdUmH-%gV=Y;-BxIOOCmjijc^rv1tSzpSQlvx6>64CC)~sJl>SVssS^CeY zqUn9}CD!}XmstTO1522qo=;iUC!-1(h52(d7=P1w)^XWV>%VK0o%p);&Q}eqW#|Q5 zotG`Q8SlGZQc|0>sSLckPg@k0VKbbZc!4w^OB`{7ekKSIdTx%9fT>egD>J4^WW$b z@s92};sHVeDCZOlwHlAB?eU@RC-2asdWqD6#YA%(Z#*G^IAd zoRE_KA}!Rc4Qpy`{7xca8gN+95dC6m=w_F|WISSIM~^`Ajw`I|c1a{D0@)!fanW1qQKO_;jV8NFEt*TqY1*1vw8HUpUvz%ZCDIZ7l^TKsgH zNsq*(49n;^a!4vcWIC^L_yrtXNmm9;d<8F(6)nDZUGJo9PswQ$~Iz{0un zt!tXbrqWC!lp-zli`hCR&xz41W@9j*TLmP&AEy)(UJhV%-JuZz?G;v{xy(u@c+LJR z|E_>*hD68pD{aOv+^9~0>P?#Q^4B`M*QUSwx&SUoGS~UCW6gaFBa7O5YgGGeMFVH9 z=Zp`k4z+uUfGcseWK*WGJ057QKvSaX<@7 z`cIy+lJ-exzfBzoZ4T@pA%e7nkuW)4NX-lfGpM8-i`RR{C876}@JCJVx^9&QfENVG zm!+2|E%YOrG(R$#J9;2#Lx(4=nkt=h6rD4fPiW5)G=xLivfGec+AQHO`9t{3{FAKW z$oS@!IODy?NnSi{^^!H!Dl-E2nDIwEE*@6-FpGi?R?t);sCZmE}qpEQT`Qboy? zq|hWk*vc9mad6tiTj=I^XswAyF z>L94r3l1^F>ED$vH?(F{Hcy84W&I5mg&`w=P}jj9sa@U2PFd%SxmE&TfH^u=@r(Bh z=PmGAHYoUcW0Dw9L!y5-jT zou|~R6sG`~wu&lvjnANvxFwN>9^7VqKiC`$tjhb~iDBz~x!+Dbv&;HNq<74lshOi) zHhP%lT?ye2Y3%oB%>0M`kDEP%UlINn>p~0x#5XeH2q% zvIJOz>OMl#$Vk?fjsS&&BaQJ{Eq~LeeOj*1va!6l_1;YzF&*xh zLnv&enaKzIBqR?_So$oXKtRS{Ma{&~p!*V0nRrh(NU)jOzoJu%gR}uDW}g>OrWjX1hm>sot#ezLpb1TC}*Jz@ps@a5=L?|IkyrT~eU?R5>w|GzTAf z(b{E@^{Lq~IpF|RLDI2JbJiUYssc>N!>XR?#5*0~W387jw&}}eTaR{_8P;AJLmDj@ zk_o1Cc)%qAV9C{Yh?s~^7QTwXYdJi;I6QR1ERfZtpIM*pk80zeLFm9Qf$vXaVeujwIs5a6X9Pw4M_^@Yw-RzLE}F6>qP$c*h2YRL!av1jz*$AIVI`It!6$ zN4ZM0W1$~DDTX%S7}n{Tb&hsWR`ZysU6r6vsy5z-MY6u*QFIM!aJ{rw65{Ncv2InO z@WN6jqHUgl40DK5#=#L4dMkwpztZ_pTAE6wIq8~Wyg=7wi>*rveo>bD5v?;Ae0sMH zY}%ut8!d*RXPI_{6}Seq2Ny#v4*ZlKpDx2jBE>{_6;?qemL3SwGh@G107G(>hnuQ~ z+Y~pQ7#}9XEK?PzoG^Jz@eqEXFE!FswyM?kc#*=yMILcH3t%16r5*5DohJ8K17OrN z2+3SaR}M@{K3!J`Zq(L-l38Gk3nf|M#yJ3{rBSZuvC{OF z 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 VRQY{WNd^D_002ovPDHLkV1gW!zV844 diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadNotification1x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadNotification1x.png deleted file mode 100644 index 8c483a0a7a92ab5a46e6cfcfa49f8fdf5ddb173b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2227 zcmV;k2u$~hP)Hg1+lHrgWSWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6 zwD^Ni=!>T7nL9I?X}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8re zhoBb*p;u8ID_yBf0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J z`jH<$>RKN5V(7OqK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYv zwjAKwmYb0gKL(K8-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z> z!FI&AHCpoWI|RUqx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVT zrI(b06~u#xf1yS}_UGdMvD``!0~u->P=lA4?YN`hilQ z|3tHka)7T{2CGqwjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^ z7T9R1gAN8V6s;5)ieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2b zW$~+pTw@bIek?ZvKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L z_AC5qq~L$#SMj%U$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6= zb6>{xYV#Ue-+LB$7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re z4r3qYr~6#KE>;1F`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+ z5K}u-6REM(K@W$srgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5 zh^QEb$V`rCQ-|7ZS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX z2i^rZ^Mu;6+rb@?NPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV z0id6JRRdfL?*ISMZUrf*k6*ChPpT+|w%)~?&LZ-nb17Y3hFmq)L#-QuEuI;_O zzdYwVMi9SEyY}95Kj(ZtpL5PcPfu@12SNxudH9;=dGLK-UFP3>q#+@7`M-E|lkan2 zys@ zorE0Ap?WEYT45b7G0=ntUDA7d4Dr5w(B4hq`>|1+J^LjBdXArGR(fk|>o5blu7^*C zhH&QS2^2s53C@*y$^wvzu%Z^E89^XI1a%LXdjKQ5g5HyFA|iE6{544lg_2B(W|JOA z`VM1o;60Q+y9jS_6`mpB2fnJBvxh-IMri7xNZdkrw}jw}-*CF?b@cbXjDWM#(Kwj( z`S625gcoiAOC@Ngp(xZnR|)U>9z3FD5G8)ssDP>-z+NpwpIyP3L+`*eO$DiOU?!bb z22?N4K@bIsMM%^_a#nbx4X83o>eOsiv0bSm=uSZI>x46V2dTz3?0c?*l6sIn^;(Jm zH_ z3cR%qB%7KMl6D%2MNLb#`vEp=qC%iSp+X=o{8AMgKl}l?zZJ5j5#BvAB4&`&F0kPs zBu0ibsGTAVqmIUoEZqCu5ogS#E@u@E> z>r`o56Rxe@#&rH~NCxCGTmty!yK^v(zX*NTGtfwIp%#Up&7vb>utu93iTlm6O!%au zo@j*3wBg&!7nGsA7xZK@In2TTEG)p--hjiWjv|eGe5%Z?o1@8a=002ovPDHLkV1i)_ BI!^!q diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadNotification2x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadNotification2x.png deleted file mode 100644 index a45b01b91c65e3a8d8feefe5122bef85c77a78fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4485 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 X5L}ax?^OsQ00000NkvXXu0mjf-pQ8F diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadProApp2x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadProApp2x.png deleted file mode 100644 index d2ba8f3a7ee97837b87d619cb0f7c1f3243d7591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28089 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 Y0}pcCLt@!TD*ylh07*qoM6N<$f{85HlmGw# diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSettings1x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSettings1x.png deleted file mode 100644 index 43d577040eeca37d88ca15030a9994678c44f14a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3192 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 X5L}ax?^OsQ00000NkvXXu0mjf-pQ8F diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSpotlight2x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPadSpotlight2x.png deleted file mode 100644 index 717603dd684e9a71f55243678b954a70b89f0a13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10768 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

    rD-NlRi2>YR3M-xKh z9c4Kh`=aD%&%Ndl%vr+n}RYro+f%j>+#f{sNr+KALrZ~C8bYLjxa@X>BCtfCeq)hRhhs? z-~Ze8kq>^v>i6|nL7#UsKJXM&7f7IQ(oXjL*|Yt8=K*~{qg%%f_dd1Bk3Ou|TxhF~ z2R;?RLiDUj3Ce<@%1B4+NMiZeWYZ-&PXE^PtU-h`2#bZxI%d(;2}@#BvKTk7g^9y+ z+U;{+_?&&}Z$B#>X-AnK#{n7#<@kqoze``y<^+&vGSbqOoVKj88H-P!bM{3+JLLH!03VJj z2;o@ZEO!Y@YF#2cAN>jWm9lkd#unpyJ7=zK)B?Fr-tiZ9*AMTJ!78ttRC177RC3a{L)=iQ ziNBvx0*C4bl^qiqLU&7=r|EkGzy7Q5w)gz{do+<;#bVEI`ukM=gjLIj!l=b9RwR4E%ntJ5Nj4jgyMV-8EAae!#FgIqyHd;Ln%J#0GK3n2Lw@H zPOxDKl7?(WCIgPBKjzp3S;`I}e)5!*Pkzh*=?iYABQ3gyyY0?zf6Ko34}WhPHg5Fw z%Pf+kp9L2IAED0;S)Ite8lKa6O&Eb8T<~F|dU&Q1G%5_S2m`Pnd6&2*6C;dSET#$1 zSiZvE^~>+Hx4h*oHhbD>a&4-gdu@LrK_DAM$HY!DEFoMEs5|;&JZ3CH;4UU`=SfKC zeXQz&M3W~MV_BZ5B6*|pQNW2oEqIP|o-hK3X-0@iC1^yb3=IoJrf|Z;l@L0SW+c0>FCp}T zdGqbfx7}vH@C$FV^UlI zm&P;iCWOEgL;*C6DMuuk`Cb4*QYqY>G3OE<-UoGqt2C%@^62f=7dF*@tz5a%ZWFPu zx#k*Mdio-{Je5-YqG|Yq)5JdkAfro#C4_?Lz*xlNy;nhh{LXXfH|dd5so$LXW1Fkt z5MSYz=HI-1tNrwW2kh><@3!Zjd(I9YIqYq1(Q+fS71{|zC+$s$OHpy#c|H*ccqV`F z9r6U1xH&Og(|Dc`0z-_@$52=x7!^QrA#iw~ZrBK+QQILcgdQ1Q^(j3cyO=72?ELf3 zvsJ6Ew5zVVQr7n}ecwsQhu}yxYr{B2R(+|TMTPGhwHs6~1Oy-;#22FY>;T6y<~UQD z)B89wP^SmUf$jw5sNM~mHrk_)K5CCW`k1}2<^|igZ@*7=z|eT1KsfCHxvY9*+|RqD zDCaW&eX@TL9&ieAacAei|!XHzExT4OpkF`aOI1+H0FO*{kc<+nP0NY~9**wr9^CKeYf=$UJQzCddS- zTrf2T6`6zhKwxs8C}5*m!a$|tCQE`v{z&&JBQOYu2q1k#MN0zIScHaE4{6m=t7&t@u~Y|Q<0DTDG|KIji;*;3ty(+W(J|SkPoM4=Gc;4COtJP!?WH|E$)b3s2>W__ z{iO6GI&1mxp+k01*Wts5?TAj;?a?Rg1T{nTY5 zCkz6vLia^E{00JZHF9E}97$meJU|`*_sVO8=!8RL z`X1CI4W!}D7`)SSvfQ-P&6YGY5}eeIsZmLw(lV=rM6w2pIo@P}d3;a$(?lI7e)fP& z+8Pi|dy(W5T|+ezrb%0a=gSP%fKLzBFD~X zK|*L2AB;#ijT;)O(?!3Bkt2nx#uB%#o&GV=BA!9UpM(z+0tG_F_k_@}LmY>-QpxEy zw2zB2xv)7-6>+IPngJ#Pz%u}oSHts!5g4S!SOts>9 z!U!B1L!$#{g|Lad2LvW}2$vuf1cP*xaft`Y#2&x=K-?r|D1)a!^sGFHmz0_H_SA;e zisuO@@TqN9I`>M#ByW>2BsnHjI%WF#c;cqh{=fYE|2cuHqxRn`!K$}7`_2Ca1L!4r T1Z_6R00000NkvXXu0mjfx&MOR diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneApp3x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneApp3x.png deleted file mode 100644 index 78ef8d12b73234c4a0d842db591fddf8646b5efa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30946 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 Va~q+uY%u@;002ovPDHLkV1i*114sY> diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneNotification2x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneNotification2x.png deleted file mode 100644 index a45b01b91c65e3a8d8feefe5122bef85c77a78fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4485 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 X5L}ax?^OsQ00000NkvXXu0mjf-pQ8F diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneNotification3x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneNotification3x.png deleted file mode 100644 index 46ddf1179de6fe5a5d0ea2907a1b2823ad0d14b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7458 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

    #ey>)?|3_`yyL|7a`H`_C`|$RPW{X#!{8F#Ruy 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 diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSettings2x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSettings2x.png deleted file mode 100644 index 1ebec1390b7d9dd55bda6e79f655d2ddbf5114dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7156 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 diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSpotlight2x.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/iPhoneSpotlight2x.png deleted file mode 100644 index 717603dd684e9a71f55243678b954a70b89f0a13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10768 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

    rD-NlRi2>YR3M-xKh z9c4Kh`=aD%&%Ndl%vr+n}RYro+f%j>+#f{sNr+KALrZ~C8bYLjxa@X>BCtfCeq)hRhhs? z-~Ze8kq>^v>i6|nL7#UsKJXM&7f7IQ(oXjL*|Yt8=K*~{qg%%f_dd1Bk3Ou|TxhF~ z2R;?RLiDUj3Ce<@%1B4+NMiZeWYZ-&PXE^PtU-h`2#bZxI%d(;2}@#BvKTk7g^9y+ z+U;{+_?&&}Z$B#>X-AnK#{n7#<@kqoze``y<^+&vGSbqOoVKj88H-P!bM{3+JLLH!03VJj z2;o@ZEO!Y@YF#2cAN>jWm9lkd#unpyJ7=zK)B?Fr-tiZ9*AMTJ!78ttRC177RC3a{L)=iQ ziNBvx0*C4bl^qiqLU&7=r|EkGzy7Q5w)gz{do+<;#bVEI`ukM=gjLIj!l=b9RwR4E%ntJ5Nj4jgyMV-8EAae!#FgIqyHd;Ln%J#0GK3n2Lw@H zPOxDKl7?(WCIgPBKjzp3S;`I}e)5!*Pkzh*=?iYABQ3gyyY0?zf6Ko34}WhPHg5Fw z%Pf+kp9L2IAED0;S)Ite8lKa6O&Eb8T<~F|dU&Q1G%5_S2m`Pnd6&2*6C;dSET#$1 zSiZvE^~>+Hx4h*oHhbD>a&4-gdu@LrK_DAM$HY!DEFoMEs5|;&JZ3CH;4UU`=SfKC zeXQz&M3W~MV_BZ5B6*|pQNW2oEqIP|o-hK3X-0@iC1^yb3=IoJrf|Z;l@L0SW+c0>FCp}T zdGqbfx7}vH@C$FV^UlI zm&P;iCWOEgL;*C6DMuuk`Cb4*QYqY>G3OE<-UoGqt2C%@^62f=7dF*@tz5a%ZWFPu zx#k*Mdio-{Je5-YqG|Yq)5JdkAfro#C4_?Lz*xlNy;nhh{LXXfH|dd5so$LXW1Fkt z5MSYz=HI-1tNrwW2kh><@3!Zjd(I9YIqYq1(Q+fS71{|zC+$s$OHpy#c|H*ccqV`F z9r6U1xH&Og(|Dc`0z-_@$52=x7!^QrA#iw~ZrBK+QQILcgdQ1Q^(j3cyO=72?ELf3 zvsJ6Ew5zVVQr7n}ecwsQhu}yxYr{B2R(+|TMTPGhwHs6~1Oy-;#22FY>;T6y<~UQD z)B89wP^SmUf$jw5sNM~mHrk_)K5CCW`k1}2<^|igZ@*7=z|eT1KsfCHxvY9*+|RqD zDCaW&eX@TL9&ieAacAei|!XHzExT4OpkF`aOI1+H0FO*{kc<+nP0NY~9**wr9^CKeYf=$UJQzCddS- zTrf2T6`6zhKwxs8C}5*m!a$|tCQE`v{z&&JBQOYu2q1k#MN0zIScHaE4{6m=t7&t@u~Y|Q<0DTDG|KIji;*;3ty(+W(J|SkPoM4=Gc;4COtJP!?WH|E$)b3s2>W__ z{iO6GI&1mxp+k01*Wts5?TAj;?a?Rg1T{nTY5 zCkz6vLia^E{00JZHF9E}97$meJU|`*_sVO8=!8RL z`X1CI4W!}D7`)SSvfQ-P&6YGY5}eeIsZmLw(lV=rM6w2pIo@P}d3;a$(?lI7e)fP& z+8Pi|dy(W5T|+ezrb%0a=gSP%fKLzBFD~X zK|*L2AB;#ijT;)O(?!3Bkt2nx#uB%#o&GV=BA!9UpM(z+0tG_F_k_@}LmY>-QpxEy zw2zB2xv)7-6>+IPngJ#Pz%u}oSHts!5g4S!SOts>9 z!U!B1L!$#{g|Lad2LvW}2$vuf1cP*xaft`Y#2&x=K-?r|D1)a!^sGFHmz0_H_SA;e zisuO@@TqN9I`>M#ByW>2BsnHjI%WF#c;cqh{=fYE|2cuHqxRn`!K$}7`_2Ca1L!4r T1Z_6R00000NkvXXu0mjfx&MOR diff --git a/osu.iOS/iTunesArtwork b/osu.iOS/iTunesArtwork deleted file mode 100644 index 1939459992eba68e1067c5af904fa25624cef86d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142214 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 % z`$woa6Oq0MR?j%j>3yzkpv-t`82lruZ^Sh%<5&->$Qb2PX0#ZkfpVpOs=b(Y30hOy znP`*r^$a)hEI-}_qCJ& zFidqGc+D{TU8yvV$_7A70OT^xJo2K?^Dehi3s1?)HxDUurJ?*($(yHS0H}s!qaarW z+SYU)6Q^hhwT+o0ur>JFjF3UN;Rnj1kYF%>FJ35#xHVrfYaYXYOo*ndP z3WH-6!w=eYP#OrAv-%|_{Qd&12y0vee)u5#Y$uYT_eH*DJtytm2 z6!l)okN+?H0WUPze?7;}NXrB)sWi^3JmurTGy@N{n}9P7kh9JoGl6F9hZo)MCpX;A zN7ubZ#OhszSqLO%#fsNFjwr_Nq$*sYc(aa^=eh$pV&3Y+mF6YApA~0HD+1v|Y5L@o z!|yVn>yN;R81H9AqLge!jr-Lj81=u|almu77mPhk3(%JqAkE9{B+iur+p$B-(#+Cb z3V+Pn5U_Hr8}vs24|!x8AZO>8GcRGSQ{z}t07zM}w}i-3M^==_jvTS$fGvY`0Fje> zlcWHP-2;PPglVaU9*V))k64hYhSJda^ZYEpAAYemRKX(;+5e>`qX7uGd-D6gkRY_I zN3yQ&4eUgK27mk!G}Oi{B-t)QlT`=%BPbXGGI7@x4S<)bh7s8egZNqSjc!+tiw^(v zEw_ZW;=cHFPC}YGI_uAdL1Zawzln5)9?2fj4j54ZJM~9)117MXm1apx1bqntY%gTV zU|B~rFaOm$ZtdIW+}68aNf@~4JMaqg1Ss3>%XtbNZN+5Elff6o&{{GWd|;%Y()*I| z^O935hVbP@n)99IC!;^`D0>E|mGqp@l}y?p$5J2lhMB9DiA*3fh(m~G$6>@P86@%x z;A|^)NxC@$q2K4oU~D@U7jVJLAl&TYzFyn$#-T35I(UUaZ^|Q;&k?QvpVZkoJFQ)J zq9Okv#2X3;lZW2V{!p0!K)p(X^-n2th8lhPAx%}){RlBtfvp3MNJSlPQZ!660ZII+ zI14sFKtFJ!c7y>KXFwI>8qX$mq0&B>I*nceI+zvK76hM}2_umP$tBJQuzEPiFjoGi z#vG!7B?I|Kxb@hz?>%wrZ^+7ChJ^jcvIRJUv?AK+5lnkAlyI>RF&nxLYz9Pvo=s6e zGowBomsSAn#i>Kye?7vC%3)bH0*7T6u_QI;wmd;%b#BI>5pLPsz-yLIxJt`qd@Bia zm^3mt{H7%MDaq@>m*pU?fpN8Z3ceUh;3lc{D=Gt=L`kFN@D_<55bLNTjtZ_R$x#w0 z2^K8?#*lm4X-U9il7nYseN8fwCJYF!bq4sK6KvT!=RL2i$cFelCSrltw8|Gdz=%D} z(2G6q4rn%2nmDY%^{-WM1}qvYVNB)lA7}iV@&gTk0^7uT2mn27WDB6q5;Cu8yJQ&9 zXrQ+4S&q8uQbRL&L8#Kt1RIuic*i&D)Ct)OynV_weyC-Qb8NvY%OCxe?={g1;h7@Q}tBlY;s-{opls_-}t`+5mH+Rax7CkZ*FR zj8XM4N#sR;0#G_A4c)2FS>lYA!OQYAR0%7grYYw~c6@m9u8v!p3ES{k|F^Dz_Kl__ zw)uz@W-_sO!NZH6gIE9*2$C+fSpyp<&{<~}zaP{qBx40{DmvX$;dobhfI$kzBK=|J zjm0?Dtx@CPW7POpc!jI0J?Z9{1X|c$7egR1K2~w{=iURDB>*|sF%5tQM7@dI{>I{= zD75zY{N2mi6`<{N2x_;rrhQL88~k-qeh!o-ATKjE0}Mg{8AlLM=he{p1C4i1d0z>t z2W#>naOCfPAgzE5c1cr1dE}8-`rV5{XX%X22f&2CAn4Y@D(X}WwIJ}#jhT6!0Y0th z1inKXTIRDn=?^2MY-k!RRi?r|eJ1`|Uhq(p0N^_t<6*22Rsmy8;i_N!R+@CkLU^45+8d!eEdz@>|UVIY(z_)-vo)JE%4=hxN zj;V6YF+1eV@+Wj^u;%;(w5A@Pf)yBA9%+63z-|8OlFg*3v;C`2>|FS4kQ99HRc#8q z{rpT`RM#-f@&kgNDGU4wd{@VhN-Mzgx-k4}K+p^MP33 zUpLM=;TvrINpa+7b@sQReW_)H_Dp3{09S_rg>)8m*g2Ek?EW8I&be<&m==BKBxDh8;sx}lrlic%Gp1jk;G?D;S1 zM;+FnMcCGsx#u5Tu>q9x0UX=fZfh^S}BV8=P@XA zsF?Z+G^PcZm);2&5QMHybi@F`4HP;20Jh^KI(9-!&~ zTyOX{s$oz@qyPp$`M(9^pD&+9G=@AJ^;D3`1c1H$9hvYoIvwAtE;tWQctFMM3qmL` zbNb@(*MsvV)EAKh4E}{@|7iwQtr++>|LIe=`SZ`hK|6YPY7{AZ>X|EJIYv% zC4H7?(}qBvO^d46FL0<#0DuR+9#QHsz`^u6zOV9{zzDo&0l=(p8o7Z9T@b?>9u-Y$_RPXC1355$~O|H z`bQX;A+8>Ll@MVIXHIJk%{Ua*vQ^?3g=Lx&m5bC~%u#lYAp6aJ&c%da1B9o#`e}xhijD(;PVaFt+&+&bg zS8$AmymzBg+mRzHPBct3QVia!9Cp=}gDCYo zUK^xqx}HCZ4Bo5XpaAGQd>?{jtY9<;g6YSo@D^6q%1=`Kl>%FirpSx(D8IP*PQ)b^(C8ZK}q++*Fl|J#b)Pbxhg=zN!~g zDivlASFN~qwG-sRwnZC_F2m6iktM1E9+U!%3Ws*FZB!l8PwbV%#XGPtqM0qHu1 zI?%Jt5J6q}Hm66NKTxJ>L>lE&y>;V}d-R`w=hnafiaYX`-_?OTT0_^Yhg||r{_oAW zPOf+zhxG&pPmL(x84Z|U3Lr4;7lB8HEbtm>5M2!&)7)n(pbiyUef6|F2A*)OFYkuB zGMUD~S2CFXD$I+JfJZer0UB`)C`dk5c$?xhB4&imE{ws<(ccG{R7{_-08`I=Dw`$2 z=xMhPnjAacI>Hk^3|t$W50Hjwef4Mq8XJEEZi=JiJwgpL_f`o3fN=@Kzm0VX>$8T) z!&%df#%C~xO({Ilg+MmS=0Q>-SHs&{1pqoX3hBw_rhB>>jv+<5td9NxPloPpE#!#^kdNy&uDP69OVe5wm|JJUc-r@BCg!7;>M zovnPA%`*9rAcdcR?f0&_&b_DZ@SnZq*51BgCp+3!$GhPm9{lpN%}z6Fw}DoG8I+g= z45LH!)t>pod%d*x{&69H>2!=9(SU$>N}Zxm8WyAg06+jqL_t*4xEw9KBA3CfFJXq8gv*(-c z!IMXFMLbR`Q3Z0J;aUX%xQe=ByR~Bn8`xk|+qy|of?}fgt)IL*pttmueNJwRjwWn| zD8})jx^nipkB!p?UzH7K5O7@XU_w$em(++bwT(7pA`1%VSfqPHt#vXJg$B@M4Pr1>}^%?nxq?s>;j z3=~2nA>JC%=?nW>-ya)6DHByaZ4K| z?rDI=d^d2$A1~BpJOjQAwWwPYRoG+T7J7}eMh0VmnDjZmA9uB5Uh@(#yy$&|XPFd` z(d#(4Mc&iSqAiN4=Sd`-k(`JtLplj)OyogWOiQmnT!jk{lx7?_2~5dvpjwteU|U+g zOo%E7lj_NqKW6_)ZgNvor}jAenwBUR(#XreD|?&3+tndJ&$qWUdFCLZdPBVe0JJLy zNKRSfC(~61IK(e9lPi)TD$LjkRf(@^STq*4%iwMjZFriW3h9q5GQmOv7E@1ijAKgx zd|f~QjXZ5JtF-dc*k_*lGSoHD5jrBa=k<13YUv8Us(n?w4J4BftT+$^I=7#?-4Cw2 zl{Zhj)puTTE3ck%OB(EP@6eY!VW*>o`*;*&fJH07K|TBs2OgH9fD9oalgJ1odFEjnYuwn~y0qhIj3NARp5pf=}+ zv2PY&n=LJ&l?iLz5qB1;#Esxv+sQH%VDY|45MOPO&xz}cQ^cmQ()+Uc&}5?b__^yo z*tFdpCV(S!hP8YODWjnfE)mBBMIrX4PlsdEhxYFaL_|d$=?1 z&Ujj2Q|Si&{wL6ZutXcBpQMit`L;Y^@K`qF@mn~o9gWttvbb{6*De59{?f{vLqs*N z{OmHrXBDp+$hAUIVRIrMoffmLz6L4RmhfVp0jtCeXK1*(m;j(F1I>micdXP^q8o(; zUNt5=mUmr)9Ra+l4S;`J&0p{l7!2s(wDi>9k#%x>ZyziCV--($#0xUpVeoUO#QB^yaY*$ItS6O~4`XMV(CpLp+3}Rdt@s+63E{3TzM| zJG|3N!&zY-Qc#o&bZ8lXW0aexkGRfF`8-hmrXr3Ve&ls_jW;QxIq%~vHYEoEBNaO4 z1U)g?JXx@!;?I-0b1KsKeJTH+{j4Q@*e za2iNWAlEeuk%mZK!5(+sXf8S2tM_b21OArl$^|WYk zdv>gM0Xzt~8*=xH;osCinb8)~J`$erz6t>#^4DN`YU~yGYUUf*Y7_vxyo;o@x%J#_ zZE1ff0ilV;OUFh|`Bjq9z%XFxr=e}Q(DeGig^+Is|E}EfI-LV;$910574^I_QVDCw zcmzZT$zVfJCCdh*EQ0@3$6sa%P0e!6*E|h~^)FikgE;*njU|y=*&7VymA$&c+mn%H zM;($45LF?{p_4ocoA3Bk$9p>WVE41zt|dXBA;E{4^zwycrWIH|d(7+wnujIuNf>Za z`{7TZPp63ha7fMbxDM_?J3yJ~y=exh>hOxTWH&j4%=;=7g-IN^s8${tjb*oT_NZ%_ zuvVau491vvX-7IQjqo_fQXLHdGqrwSwhOfX3d5M(6v9A_pib;(z$;$|O{12nET|kz zfucWX#2RR**k8{witTyNr`GDX3~3qsfQe9zR?Tau#HGk6>J9aH0U>S+?DdqtDFHfH zmRD@{AGH?~lVtTZ$y-cNri#HQU|avEd!CJV4Y#$u?H)gSB09qfu@PSl*BS)?xT6`L zGWp=yQ@6dNeW8{~{ZRwXLUNnEo8=};uNww8n5sfXs z)v%y9N|xkhbltHC%)B`8De{VrT!I;>mvETGP3=KQRPNT<&`}d4#a$A1g}H5e}j-IP3|a_!Pi!W=`@s!c7FfP`%B|`U9**K&K6A_t zEP}`e9V^EW%dtuy!$BG4HBM_s!669-z=lOCMyuXwdn(B~4-n}3v5(teH#Bn;ehDS! z-gVL}TgiIRo-;t(mNBI@b@9A(hW4%L-W~|lQB%FN21*VFn;%3s0iH}{+<>1!l!?VDw|&in){@q!PPlASff8Ovx3Zc0YHFYCemlo8A}zo%fL`4+k2{x-eBl2YfU^@ zTdI;lf(cxkd5b?=Hb&oo`spSfeYN$FG$T@^@oBdB4P$RKveukMBW0bp& zqeJEEi;BPgZZe{T!Q3W~BM+0oRQQ#4U`qjg*`Ey2GmKEJ4?{w7J;xAnROGfwPx!aXgV|5ET zpw7MSFjb*}P5Uw=d|gGKkTI(I4+&+70^)mu4Do(as7`kH(NPmrVXIjfMc`uA#Afh2t^-l)D103!M{L1%Qm)sGw?RIqVSFE ziVm~4;DPkK)71nAb!`4@bzaUH1ixpUFR%kr>>||Wsms0&2OiIfB0pKg7r#!-5 zX;8-Nke|r6h^o%(5UYkB>cm<(Y@7r2`^)O`)#v8~2G+xe4i#6e!wP2Tj3s%&_U`6= zDDqCgO%tm+G{o{orU5v{k}%&USF<9>#>S~k0ARM?YN-=rtCc!FXg2-@OWl@cV3rd) zdi5)n2aqv(X8AV{gcqW~4S&fi;7{0I)32V;CD*$ITLe1&FFBz_0jY0K+klUNQLlS))Ey zh;9z&P58%}>(?qT+SVBi z3Ozeha5>nfzY_A!l?TpUf9jT_aVS9bzJakA0`*iuO@fzZF6MM8!x(t3&JkMf=8^|f`G)@XZckurfVs$X7Ps(vb_v9i%Owr%shOh6bO4SLnq1p4~3NAAZ* zj%u!q7Ck54Xu3I{nKzUOo-npxw6u3I&iW0YKB2~7iw2>MD^b*f7UDHLmc69qpw5c2 zqBB^SYP%HuB35f?U0KeW7JyEj)8(jOgeuEE@`+If124)*hG{FWoV1R)wvmxMXqLaE z?PNB9Q9um-VLP6Y6=}0fm-!=P-~%4V9;1m8zRtZTW~@{xKc|pMM^kvc8+zf3U3HH@ zfMvE`v~N9jTR;26J^4?+aog{HWrCs^VQHW?zw4AIdFEOoF!;CMyRQ0|3e6A%=zzmN zj>iHC>KHM8%sR~w+iyQp`y8LT_!l$)=`sVn6VH}UAN4|XB}hieDGt;RGR5P2Od-A% zPCrb$NBuu!I}s9Co|X4`I~0-v8(yU?LUnpq6X`XL14OAi z(8J6f8dATtT5UOEV0J$s7bfGNff>rO2I9kK&$xRJADEDU>qTY=WZQRILrHl%e*h?2 z098(#v0${Mg7Vg=1N!DiP(wGBP8Q(_Um3*|p zn?Xzetv}S@(_o;~)qGT7{U2R}E1OZ{V_6Yy>xZ!V=Lap+6A6lD@X2Hap@4R+wq{q# z-Ef5ZQ1w3I}8K=HI*>Ni} zJX=10%np6A4%#>I3c2Qmu$4E?$dF7pnU#Z^vWJ#PR}~oH6@l3aJQR+uY*0E@p9?X&OJs&dupw(gz_U@&d@;3OI4anGWl(HA0)48gdzYYHC+|^`y z!G6amF|x!<#q)!04t?n>#pB>0mbCT;2@zU;Qk3#RgN-eju~b0-rurLpD=c3;>Dm%# z_9dvSsm^imnT-ZA0k6|kqtEHL0{5baazps$aHpkXhg|arTTA5+K)Z49@n8Zb%QGer zc;se7rG7iBd=Mpp%a+l2%K*r7F9WTXq}c!8mw{++Q<}_YT5i*Q_ko-b(e8%wQ-J1@ zQ5Z-$GPu*$ghu&iJUXO(|ESV^=@dkuv@Dkn1W8IZWCme}$1(x_hVcqeaGRxcJONJb zFA_S+;8)tY1po{!nEj_*Sk>9#{+LED{nF5B2y3cXckkbmAz(|AjT$VK#~4|bgCX}R z7-kr%lqS_;WEQ2gG)_o%kS=Kc+t(kNWjKwpubEw=EhDcy^-~$bsnpT}-~zbMiFMLE z;5Bjm2d}xd1_B$9%fKH^OMB5^%-ZbQx6i5Agh>mTy)t9<(+1kk+d#g)e@e1?HmTs-x=Mf2x_PEU;-ToT-fy8}Z8q4$tQDRHcm^ z9{|A+Z|&{#t|sn%%r8x=3=3ax zM{514LAjJ_vnK(z$1;F*{DYj^%yMS__;4m zE&W-#Bo67rFH3LjS&1YpuoT1O!t7wOJQXCoWHj0o27zm<>uzI~ZGRbFGOoTCft6tS z3Rj-tSDAtaycw;FF_Fi@*A?7N9R`Fg!}vggYQiKeV=*xMM+opiYseb>QM33UsZ)%J zwgE_BE0V+>K7DM~jdTcBA*#!R&_-ZlX6(GE0L+jUT=4=EX1hSX1c2V=uGTI!3x{Ub zI1vJ}P)$ax&W6g|U?;#yd7)FoUOIlrt^e?%uz@G?GebV#4P`B(q2*UkxQ##kmY;#E zV=$Z%O+~06FdIne$nd!@*r?1~*B=J@=j5T_urD8h(u|`_gJlQ{*Dq5Ehc(GS%p4cd zFIwyfR}2K<9W&fHLg(s3*Z%N^scMI2$ttrvn6%k`kq!3HM_tw~1`GkSGBFy}p<lC)?V;i9bVOqMuQ3<0bEf#qms|4XP>=Luq0pD~0s z2K!_FfkhufKgzp#1MMJ|hr!S!P~+vJr%$x77`?T;iJ$6sR=;!J*1D~3u*@|D?+_@F(7E!^ zwSIry^C@<2L?SDCUQ)-Mg^(o%bIULBrv=67$?pQ^A$V)}kbwFiwWs-=2U*!5cq}!b z39vE%9^`3q!jjXGzx$zlD4g<+lz0#Av+xRdF<7>9Xii>{*P;Bzw1uw$nBgLke`XnA zFySf;%tusy@r{rz>!iuSV?X_|`jvbnFVxrg)ALY~S$xt37)ertrT92zT9U1SX&vU} zdkS}!dy$LUf3=9e|6I6aOxdHa8l8>96Lv(*86McuvwWVJcY>w5y!Q4vw}t_uv=^wC5tQ0j@41~Tcipbk=w|Rn zomSoRDsCet5G_Uo{%$6eZb6Wlsuk*EL z{vX}c@`wga+DfF&2tr^J7S=r@ZoccD!(RHqtKvwav03TL?!snDNq#8@b11YG5sXbf z{e$wu5iCz-9^j9B4$GA|Z<=Mp&95 zh7E9v_xzhXfG5HaJRbn3IcaB;_*htAgb?5;zt|L6S<@|t{FtzUKM5vfs*`qnFL{W4 zw6j8I^b@rj5P1O{K=!7mOUqI18ueH#$0^N59% zhaNcgT^E%r>xwuuI{dfakt+7vVL!Vfy?V@V|Dz+K{9^?ndFenWBOs{fAE7xBFEwl3 z`TVwNRtA>51rd=a)%Ru1{x^Q~y4C=iI#5WRu4_Q+m#y$6TlRakVylljSPqIf(yI}9W&LM8STdZ@}>s=Z~3JyfV`?f4?B*i zQJca~_W8Hi=N|`hV2lJT#yJ$mi07M;q_s)erf@caA$f3__mG*~B!fD|%} zVBSTbu=RUGFr0kGr>@*+cLftSz{XtC2e2!zo^;C+0@l9&irfA4rf8B|@<&@<%LYB; z(1$!4$r5DENfr+|c{jG3N+{>!jCmO*Xh0kTHvKPsZlOR@giU7Qvh(qj@lrqKqc3}o z7UiP>-_P`ElrsjwL0|-CQ+QU-o$&oh21f7kGzxyoe}RE5f0GUArVwLgEv_98!V@!o z-jQAMV$Zstr^rcTlZDV{MHqs8|H(u5Wb>&VSQL7SDTJ2$Jd*&x;P2I#@WSu)kLanK z>C(WUFOmvXmG;WRd+y$Y`#yT?uwvp0uXIox$4bH2sdKD3S85GZA+dWviFW;KeR;>N z|HyareRWn1`F}U>eO3XfhXOd;5r8V{wd1y4&+)IT7f-um|M4%}_WM`e z&L6Hjo5>L$i8Tyt86rqwprTQzTKle!>p!^Y*1mH= zWu$FtTAHx!YS<~r?uNQyr`m-9)AB434GCAA)W}W-91M-ELmK?~H-9LSRsyZs7&F_# zS^$AX_-bf(Rz@DERHhiUnxLAroq6a-b6{wV4;OXn^dyyMpE3s)zbPpU|2#;hd_jGGh^NmqK zk4SSPG}w86W)c9XfIgtc^rtUHpnm2bauHvKE9)73H9FQdEWlhfw#q^Z3dZt7YG+%b z>;TvYZtv1~l_9SZkZ9Im)xPoAwZ6XRjq=#bPA7Fz4N3IdpfU4cmQN!CLu1K+`rQB* z{W?8c5b-^KCmVdixEu{w0koStju7L4GmI;sPqlY!68(}$%lzu;D-F6XRq zlaxVigO#4+U1I$y0rF0YaP6;0gwU5W~rQ+&h|uR#RyBZi`epo z8aly+@hXxXsX8vdZJU-q}35vqZ5a(8%JCC&ve`ZkjBn6KK)vi?cl?3Gxp8yD7D_FcE z#2Ed84&PMI{UEjEnrBo-vQ9SvRGqlhWwJ!y#x<&CmCOWQRNJE0;*aaIsxa;>$OsOI zL3k__Xy0fLiJ$Sqr!;=R8~raE07F0!^O`pQ%wHUgu_K_rDO##PHUOP_2Prt4Yl^4> zH8mH8y(BTbi^jHTOzMjDfhCwn+ht-h6dHC4;M1)wclwAXWTL_IwgjFb_*+d%#9YsRpkws{E#xmSl0VY{iQ*Pt#$P{xJh$b z!9DcT*~kcR=c8+GRfoVV$zxytuGWO`+^2>_BdSseu#OK&SGXHmuj{`pqp5omnE0s! zS<&ow<<(QBGVNh-g||RDR9iz9J>oU9)g?J(!QjXC8Picx&c|c`#9+lvgV0O(jx-9A z74Qt&flWPP*Th2|s-*hH*1uhyvS;;S)~6wF3Zx9+6Kmva5&|R$ z*mgsV4iN}6P;!uy>)~BZ{5YgzM=! zvmU3_1^?E*j~)D#)~o$*_`x510bER;T@`m}T{PpU37j#W(jdH`I``_{EXDL2b(F2I z?n{eu(OZKfz)(=iTT}e$Xt}|*p@pnY2RJ!~`5w^n(~5YGO4>q_56ct6p=ku6Lv@$3 z92ejNb=@XDil5RM;38;RoleVg9K31oBdrtSajI%Vj>0By6Y~I|3+;v3r9{|v)gLPh z9@0!rKs@o2V8AC}0y5$dY?cB?g@TEoN_+$@YX8+`^_eB$7)w-78pk9^BK*^zrGd6< z?Kgcn!#&^_6HPEn)AddLf9v^EclOu`6;Ws}X_SiZXA%Icq6Y$oE1(LW#*!NblHc=f zbYAL10fP@j>kgu`a0sGU`qj{aaAiA7;AA|5n~{`Td2+P-#Q>(3W8 z%harv0Y<`%&zLe<5xO8lmNQ-dx13!k(r zcuj1`i<>P!z<*#7jPFK_e@_1@N(Z$+Gk@0nr>I|n*wk!|Erymy7^|0DIx?i}Qx8_a zog$fVPdw_ecD3N&VomlqHc}YIS#Yfkt7_%5(t|B3Fi>#L5$h&zy&Y@Bxdy5o9qu0F>q&^uk1^Dqr`$` z#(DII)F-8hFs;3&(aYR}3O>@dV;;zd-Y>C)Vtqh(k!7$9!u+&&&s&!OJ=u$1e%d{6 z8T8R!@Effo^f6@vJQ06}L&I%tODlH&v0HleO&ysvrfm-=D)ls@05HInR=)i0O_6Wp zlEPoxs0Lx|t;v<6=GgE0+ ztn;)E99;bL$7t|ZlI;ni#b*BR-zYTr18+&Qaa_b&K4K>={-UjDYYBl_u&jQB3L**y zv4mximUc|6N|<8ip9S4BK(m9Q+QCTWr4AaK06YOM%k`}-tDwrIjIt2&F)2G~^g)Sx z{%Zo$l{N>B4qCZ#K|}x|f{FL>c?39Z)!OS&enujZR&{Ji!fB@EU~mp0?&ONkrLWXW z>PDm)+JrCLaWRR{rICBosQy<*oYBn(TC|fNwZVbU3f=)tyjPjq_euPphS&tt0Zgky z+F|$jX;>zomcF9zGYJ5J18PSiJPG3}6Yfvpqp319qr7_ShBElrojq~dtNt<=z$;lp z5SFOmR5~%20TSt#wN&d^t%7C<5B7~{WzcVZddIbXbk8i9O#{FHcNW7h$PZ;uVZN-B zr);f!b!Eni5ez@@FvDd4BQStjTwR!5GDunn16}$Si&N>We#B=>T)`j1O<@Zb68T-N zQR~WJvi06o*(^L6%w}gnCwMq7TKn!<+wX7cUxY~31C7_@O?d*QJ?ko3H0*Grclz-k z`jGN%;32Ml7P6c8BIl~KF+?0BGrYRV6CSeoDkj|f{{H&(HUF4Kw64hJ!;YfP@ClFX ze3<>W*$skbV33KJa{5&)Xnl6ub${}P?PM^`AG{GB(<(^_=$IB@I;fdq2!2=0vK7LJY%n0j3e4)RZplBq4!6d0-bn!Jsa~*ifdQb4jfa-QtbQcL_fsY&psd_yC> z&bB{api^Q``z*RyTBP4Ydq!E%j;S-`i)B8pQ_5%}7V8&)=f_C42DAO|`kfo@==rm1 z;-R0-0a8g81Kh#_Kn@+*E6OQ{C`0ZZ4>$czf+Ju+* zeby_dSgy&792Ve~7iRxKg>HEo1t=aFo5;6#hPKuC1BrYvQU~;AtQ&>Hv!%5^@xfsD z*YSN`LjMl;zMVhZDm?g;AC`8SIz(qEQ1;UJw6u+qEqikf@C(18lltIK z3Fv+T-cu+6HHZ!u1(Yk)^P;%B(^Zb|jT*2Sf9iS-DBKPyADRIpiO+JL5+zHOD$ z4ybIeydw7PV6zah6plB`A@n|Rs>86YzoYwPaL!@FAJ&@2|lu`bHboN`p0Q()4dHCr`L zR4^OAr?{H@QJS$(6Me5A5 zb}+2Is;z$r84MQKL(tET7s>}Y63=|jBOmmM7j%S!SmW27IeOoptyQ+IL8~;Tx8MMCJ{Xj;oZ%C+;1-`fcf!SiKI#q;#HYZ`$ z73gnb5MRx6AOgWmK`;_9b|03@W&$%YazGIAaECis(l(*6T*P>FE)H&5(>u=X**Hwpm|ml7D??*-%uB`$6m zzrJ(RJ<~x4*0I7+elb`@i4SvLV?6^_Fj#7yIxHa|tjP{>d`=vTOr~t$scY+BK6foS z2eMg<_A&Rd&?itPRHkG$>_1fb*OxV&jh_jPx$+&g6^*Cj&LzzaGd7#GQFBrG-_)9! z)Vzf453jkM4>Vw*dY^UhHwa>=gwo}6N8Jho6?s7o7%jyuYq649g5rNdo3XYd+L&GD z{=jKGEDjoW+nPUWe|98LABvEvXe-*fXlwtV)3g1Q9=`?K?_QBBW!1GZg0twbt*!Dv zxTEqhq2D@_fJ+wyE;F{AHQ!1*SFn8QkMGn9ULz(LOFfUzRb3-J0Uk6?>933uwY&VF z34|sI2v`;@&$=_XB472q$}BJjL~Tk|k0Q>9G@sB?ZxO54SEa$CAFLukGmK%xGXRaK47CoV9C@90N@JZ-`38KyM6zzoB*M*_OGY^4e6&x%#ASv*Nh7p zkYNFUwX_L@=o3=v!`*Fn@8JV=0+OKg-#P;z4uj5c%zXnq4AaC!TlYhSJJ*0PHwD!s zq!OrNV=2A;+poO$GCFs8>~otM^a9`ffXKr)JdpR;(8ZfRe30ivJlD0Z-FKV+{HX?2 zb%c%~5!Y#Xv@xw6cS3(s-AE+IuTtXm2wCAjA;P z2Ra7$nKb0fEM*AQ#4$A_o12V~zOVp50S{D7GO%F~&xk+`C6$R09p9!`Nuv^_FkHEO zbd)XV|;luly zX1?*XK;_puRR+j!YEa%Rk1>nd72$46Z7daC=kca{_KzP+jVzuZAjAecGcUwzrC*i% zSZkmxC9$QE`UK2azh;J8Ujhby4F2#PQF!K0AEfn7v>e9MNFMoSEWqjxO>2Uw{s{10o;=|I(gsAZ5F8thfnxa)oX^Gj~$<6D}wYp|YokfzQ^OSB}FfAeIR z6=SK(a)J|cI@i8H8M)0*qH&Rs#=B-~v2#o#U=ygh3 zXxd{n9_n+C0V~2w;1ro%Ceg>?o&MJ{n*qcKBzocRxai5KMy?_LR-u>XxcyJ z9`i!k!%yCo3A8Jg)sny|yEpIMagW>n2<=$SAg9g{NAyBCy!SsJmBBwA{KFfpQTYzx zo@h_`a0Zs7=FsVEXb<>c0zlwqRT%{wKcqKqG(gxI=LYN#vSo^-k_BTXUWmms%oDe`miL+4E8MFA;$%UqhQ)S!w-DMg6T?tm|p)QFPvj?Pb z2>>$u!GoXKGqCn=nxp`&4EWgz8lOUZ=v>qGJWln)n61bfeQ21d+E=ud)Mhte2=yj3 zTDL6^lsoTURr}G0D)S30wLv^|ZcAY6+zp9gJ#MiBD@&(K=)Ja1s!i#A08hB#;a&13n=>34PB#t3YZ)D>d&C7wz zfJ2RYS%yDYrQ6^a)&Im*H9Zi4K1f^rTJK(y+8?WA5ng~c_F}KTqEifI;5cw@GMppa zPjCI~6DjIEe}}(T@C2O_R$3BXHif6BW178vMUnw!XGI#jHPJfcm!Jal^MdgGSVH5x zfTpG!gJaC=6de7lcO9F))jj>|p7dfe^`>O-s{a6oOFB{ooTi8^M#ZcjVLDk247X zUe!Mk0Q@q*fFalcAOuA9k|)@5YMDBu{f*b|-juTg87%P;X$poDh~}f(W2rxYWB}9* z1Id`JfJ<`aYWsLg0bXokPJ}Xp5X%lifY$BSWT2&ET@eB}an2gD_Q3ZU7_kWmJhaAX zv*)Uqy1=|^(6`wHjRo>mhPLy8JWA-K?rh5@V)Os|gO&hLf2*wX+stf43$6)@raclG zv@E_73w{*{W+P`$Y?08BHGQj~hd(-B=tt#`UBmL|@z_b8T3_6C&;R~o^W0}bS6$hK zB)Mm9e|p<({rXGq5R7t8Xd&NCb-)NLnRmjG?|XPt>kB&SY<5vCrqDdCtYYJx6NBy4 ziF8ta;%iS^*Zi@|dQQsJCJ6!eoaof-5&*Q5^f>~h+!DO;^}JU=G4P}QuRM?)#v@#N z?=c+LM>Adz+Ut3cLp(fUsWJW`tVS^U5t&>#Klg#a9DBpJ{>h4%T?OWFx=U&&#pzNdzO5onn!D8Vc6#%Kfp zPO6hphu?L;hl3wX*h0ch$i>b=rkGlrLI}9;p8fX^T<4YsMb?zG9AGv959CWa=AX)j zAjCC+b6|6?+D*sgRf*87AKuq)%GmEl*e9+!^ZZv|Xy*T(-xWdr(t0*;<^;nGMv?sC z6+igOm5@|r|6;*^#S1g|n>P5v3pz2yUzXs@AiAnk1#yNoln3Hjy=b`Ik0ng~zwhhx zKJBOo#Epa}2^2D~u^Skcw-+kY$zH`Af@YjDuT7fOC@#+*l^JPsvvd&dGX9)!UmSl0|j0*#iHR@RJ zDMx%B=p;nPVMwZ5JsCc3{`@ny`Hz>#jPam!eTkWYC*l*!Mb_}pp4b{S5%dwd_KR=o zlsX*gi@_g8pU^f+OK3M3?nUQ1O%4)@18W+exZ)@0JfQY}{tr^e%TboMdM3X$2WTM+ zvIj8S%G2S${;ofE*_P>Gwhz#>jIRRi62P@@hZ8B;@eqWZ7_YXg@ik>$2~2_oIMdFB zQy)1Mk&_E;zkWnx+2_xI4@I$}K5l3U$NCQSrz{h3HbTQR+5w*4+b)+m;6n%Pbcs5c z1rbggw*ED|!}5&1>$N{2m|OIBZtjRu9SF-aH!onf}niqU`~y z7AmE<*?fV{1h6%K@i>niO>6-g(z>Xl#KmSu%K*>*>wE6-|NbX#`o*;h#KmB6s$ZK^{pf(w!QW^R z40T8>SJ?5xN9EIB?xKeV^VpjZpL-3e%=Wi``MKNv^<~!+Tb{F1)Jc^Q_z8r zr1y1OL@BRJ^pBiJpkGslrf4|4DjuSh33x)_$}20k*)v4{%UlaV10LD=9a=tgX4@fn zz>R`otQ+7h7_2)A-{M2mptUNIKMeW3;|b$*>_R z`Uf7OYJuTWBb##UosG`);WTbXM&c4%*vl* zh;i|2orYXwUXlmNpZ!7pC=WYitp3=NV$85l>i-H(0F}O-d@nfT_%iOj=!HhxXRo%2A!C!WL2Zq8hS^`J z*BR_Ru)qtw;Rlh>o|mnh4A3vrA2*f0pUuES=EKF#Lr~qZ$pCcJW90`V~XKgJ;SH%XmB&q(6cfz2YLb7Q?@Y2>LWQH#l&Od`U~4RT_3$nE;@S%##n& zP@XKsQT~j11W9UJ5&$k;xh&s9I(>DdE|8?oAZq3d9GJq4pMV_zghnBNL7!i0B*Hy; zJG8#xuHU_-LxH5)g~>1$W-#Ldh|RL*qsdYQzJiQdQU8##sM#cYj1dA_U)%{Dc?ldf zCXKWINhnMM)79*s3JO!xfK+{z$Xw<7=*QT9PgN&_HMP zD%LKw&aC3a3J4$L{Ul<>eKQ1n)D0D$J1!BYz0e=-; z-Sc05;d)a2no(XXU(#0@1lKxlsb;}%#~@$TcEe-h8{Pm}rZV3W;+@q|(P+YmuHsY1 zs(3Rm|43&bWz}s4f7fkb!^Z(f_F6})&eqQ)8E90VfxkvX%AZIJ-<2mE{Or7U#qIw7 zYu9Wi2;E=}XglBp`6g0rIv;b}100uz$zfMQ}H-aeji&F) z+wMDWyzPwu-dOt@B;iv`ISeZWlbGF z&Le!srdTvW{W>?a#p=KO-nD=Fz-|2GTgvlEeNrp!P*_XV+#*L6m=-%kxoG(Ltu~H z4OkUB5`Fd|yNNIMUf~nxJ;=wy>Pcn6rK_C@EQFf6ZAJ}$crxl0u2ocv?cLr$UreoJLR4{F!)#I?>`rx z@*{d1CpGxX-o*1O$s-e0>Pzw}7tGj~$^>^Qu{-qw*P89~aDx~suJUi91}{TRp&he3^H5|&HQ41}`s z<)DZ7Y(xz`OeS+QDjgte*sSlfU6FyGK|eMsl@XoA&gZw>wr2e;4OATAYMmdL@;aEw z6cqnTeNo1{&v)FD|N5?5`S5GEE~Cnoi>KZ4X$`=vpE4VhI@Q-HJ;O6;1sYKppkcGb z;{Ol$X1dRmlu^c{-~2tk9U8LZSU#-I=&0gDpM`M4C6^!iKmpP@tNnF#PC`eANNsD@ z&(_iYqWBr8o%zDxBOWqX??_7l&1*k;&8>a!RV@q1J+lcdG4CO-DU!$&YvQWQl!ppL zy-pe{TSXdrS?YlTQ2>9q^)HgYjA9ljAKk=;rZm0HUDw^*cJ14bUF)km+TQzEyL+C< zHbcgHQ8OA+&vLQ-olSt4jqj?a7U`t4hKRt48TaRjr{ z002M$NklGjt%gq%n1K^B_(KQ6}MBb=t_;ml7+y}p}qgcOt!EOBcn{HX#!pz_cYjP}v zajs*w5@Aqdrpr1NGu$wsWt~;TG3g5Lp@FL^dY{wj_<=88>FAYToAn4ySJwW!pWblW zpWr6;uBmNNPgm-Sb`s6;n`rJl-Etjy!h>f`IR#pM^Q`^W-oD`X(Zdr|f#gL4Y#&}T zLt}7)XUx{ub>$f&LVdEjsN0Er5KgP(Y*T1dmaE*b>Eg>o=N+ly4lpPr!vcR zR+Nvy-ePmW);M-R)f%WvXp7Iw6}8xIht)+^u;XavS<=0hL|m8r7B@M(w$#_<=Wadxbo&1xBBg~Zbj>VO+4Pkjx^57)lmDUsuC^m zjzKKUZcWXZ;u*O&l`1oOlX6w=@t$Ww9Hg4cvC5#O84sOc>$BUgb@hSka&QR)6%8fr z+c~-;hK9m4;_nEfJU6=OgxLXy^Rx}e`Id|L)E!nz7W9?JL(Po%8Mmc3d zNPvgrH{l=8W}QDSCkRYvXG|*s4LK3@+Tg0(xV7;?gFasM+IPfH)W-7T-?{PFtAJI8 zc18lg^5Es5I1sPMnE2RG{qFBbGxV-B0+;T(<%{xb@XmSHJbxkx^y*AtL>wTMUJ1M-e&jj# z68L+{XJ6Wln1(Y=nBm&8rJ_s=fMX{aM$fed=%)=!TiiIUnW*JGVB{N1fe8I&1A{(H zSDnB;^3u|(Oe8klm78C?m6OLt_yQ3iuQ!OIY6Bf2&VmpEmY4nP)VmDU?4Qn3`TEw` zH{9<(`-3um-Ca0y!32N?3}yyJAm3>r*vlFJ#PoE++7^Y%*$#S`Ihy zZ?SbRp&AVq#$Bk5JK|?sYW|*#=Q?+!>ScDpz{$YRauRuo`7szT&>v%#{vbH%$LWN- zI`paa@om>QtTo{aM@=wei|?|W1+hiY3>#(0X>NoWRMWg?%nvu&a{->%SVy6Rklp$l zGd`41%d!<)@6f(=9;&^m&C%}Aa&>XrjZq&#@Jtw#ir+6$h#2Te>9vR@{sUeM+g@W`F?zxz#O@JdLm-#tNj1=KHWk!G{g~03AVdB&;G4!l z0&!0~Fk@Qkv+~9Sr`ea5*sSX# z%RQ5*r~#l&Gr>_m`|!a7_tBS^+^feyk7B)=|j9dPxQ`-dIRjDdy@PeJcZ&v6?b$#pU-B!WdTuItl+v zG61HIV}VUMSbZk<)aNNx+L$E#-q=>lne40A-geu1$W>*7?MP3mZZt++d=#)WL_F1V zzXxAvOcO*IiGFZeo&XF6`(vmo|D!xYM@z|lMwJlz@S{f6@IlYWH7&k%2 zpLjp`?!WQ9T&P3<7*7HOi+tt5AE==l{bz>M)~xXJufKAwT{#e9mc`5kFF^zZ&zuRZ zeJk<@o`D)>gOE;9I8e{6NC2=-#J&{)R&N~h_g}J-vo)vL)3(6ilVL2yayvceav z2uHZ}&6bG*T@%3X-zTGOz&k&~4oye=>&f`FCzs5uaWU+GN3MNR%{mhwuIx6Qf_;W)CC_r7GJGAH2cM?o&8iE zR@bTL8U!t#O?If`o<6oV8;zi_vauUqR@^Qsh$O!(rTjC!4E3bXOq{WeL7WOievQZe zO4iNih@X;L9tQ)Dz7l~Sfe+lrJR6(<(<1mkOjtP6q&-Co;0^!ipcWBCCxVX&0OAi5 z6w8$8=W&pAtIL&mh@7(#iFPFE`r%7vXE1f#|N_x4nFO@3)wavOv$rf3K(w?h~eLc4FBRmXnT=W_=fyrqr_>kXXF5g5c$Ft z?FI(FflofdjDM*!_z?+9Qm}_5@}2E1_nS}Nmx+OPI|%@@cL}0DwEO26+CZ zb%1+#2^V7~*EH~PH1N~SXYSPTQhOQYqj_T zXkXTTXmBNT7l2r46jW=o8vczVfNhvG)@}!KkLf>mP9-Fw^LW$~C4|`QB)A zy#Y4cozb|Ag6A2-KXy1REKq(Y*8TcF%NS|9LNkrsgJ_;R&=;_Tm~{@i6*!#Xu?29Y zF&KvZWDr~t-{>_^QHGuXf(y#3ib5n**%UuLef}Nw&1cM`LI_x2U3XvJx@OA&X7zyD zg>{w~2H@hG*{`vJLrgqyNKzQiMXW$ZYv1e`=1u`WmZf&8GMFC$2^EzDcn5#@(LiST z#dN@!5ca5CC&Yc>K9P6(&B(h^KIib#FPkK7<%MI;0twE_f%4c}77YH({%vA1%KLH8 zIc2iI9F;<4+wh=&O0daEMT1NpDuj!r9Dyq{{Hvn>&qF-sUE{pg{~4r*SR)M*HV<(Z z)0ngqUjvVRKHBEQ$jblan^)bX8&{-!(3v}W8U7XMi1O0De1|;7>}k;EUh-r<4*apzL+T6~q)EY4 z^ifMNDPqZQXaUlRA>eTMvlzp_gm?@hUpwxX+R`?~z>j?gVcu~9csLe92pDOu9E$hu z^-JCWQ1R%uJ^GP|pr04N5kLM?TkFO1+~Jo;;#ckiK%ypKr2y>epK$ zt)t1}`&qB>60WlTf)+scwhSPPcQ4shg{T-|kV6BjtCC|7$okUWDpZWV#l(`l>udUA z(0v23z&|trFT?yCU^#`~A6u}cfHCcl@qHU%$t{BqwzJ4DxdL zB`ZAtAr1#zQT?+7zD;D}Sv_ z02n4bk1#Sf$Q@GXn@cxH!dNOWhNsHcK zN2T2+LooF2$@6FKcb7hLuOB%fZ61RZ2#FSv+v89&|0c$XPvx$a2>`Q_!2qznvhKc+ z6m;i-4Dyh~@wFbeV8nu$74T^MMA9`M&!~I!!?T-toJ+osCavQcwZFHltpmD;365Hi z%`8K@`2BL`T84pxwBqF0j(ia7pSVvie_^T?J2#qb7X*@3m2(P$0$?w&_Mo%&&nbCL zZTpB$D?nLyAWInPRh6wt^wz0mn1pxQH#9#K$IDO+2W$-+%jK7$I0w`hnB%NJ@|tMg zDif|@lxLRz$-70|M%90+A+8-SoiUS6xrTSz8t$t?7^~=@(FPy@l&K?hbc{LX04U~2 zuvPy){ra-I`tXkVzySw&UugaVIW-CZ>3YWC-Vc6ag8rlW;l#jCrl%Wu4@Q&Q!* z)6dW~J}@vr56jWE|DShr29nAXs8k%f@v!k7!GU?7UirdpJ%3=@kMYn;;2sZj=u4#n z!0>pzw=jplGtT$i>qk$!55D}weR<<5DgpBx=htE~o(&N^^8;kW&JhBz$kYMVc&1y` z$zqF=x@cfFE3dyyGZxwUn$&9tC5&5lJSg*0XIoYcw; ziNT)<*?tAKCr;a)P$_NXRe5i`t|Q`^r87p5ePe;{ZTnwI%~~`(4{%ZSV_$La$wT+i z<VL6o=;smG9{KVfX9LKXji- zCGw}={gK%KupQ8jg0*Cm;Eck}d5*~`V94RfN1Oub`~l7dSkmcFJ)P2}+CQG$9I&&# zV$c5~jccF};RY?hE~i=TbC_g#yw9Y4BhWLbF}pBwe@Isa$5PZ-Evm0!5RK++P4M3Sdz1G79mR4|k5E<_l`9 zzyj6t2fyvFQdSox20IJ39Cq?f3oHz!TtqsVg-ZA3$bBJGGrQ<%-4e|f{|fpM{Hc4krJ1-?<+lEU6h^2j$B`8Hi$4It#T(%2n`ie*X@(eo*Y&{?AXp{?c8&eZ#BbQNLu{0W%&B z0L*j8a!%m(z$;+it-gIe*$t3S?>y*YnnfD^MVzBow%I_(egrE1%Qe@Nq#a z%wjRvXUAf~DYH*Hgqj1L?;`NjoQ+DsqY=UJ&Ozb}{RLV8tHPD$HUWnEpVLm?lrIXZ{Q0fVBpH3IPa3JE%H$Z-EKCBLMVfXaOd#W@<3QaJq%#@6$N|L4x6cZv zK2*$WjB41AzuygvY+-;%gI{!bIruM@{ZL1uJOc9GDQbxTS+xc-wxj*{v`$H$wt) z@Av!<^I=|iRi&ddT$DkgN$-1Va8)^Z31=Dy?2wxm$RH4b8BIXd!LR*S4fVx^M;D0I zKmF4|54IG*486)A0l=L9aQKfc`!WQopGHVz*%|MDqXX2e_%SS8(*zS{8!X0wC3ofK zb@%?|Pu$@(okXj?F-0@DAB-7;cMyQZO!c8A0U#Y|Q?gm-K(g^ym_o+j6zkJ%?F0SA zhrg4h+_Jn)6UfCtEjd zsGjRl-_4WbKh89^5P$&Y{~vfJcrAbgfZ<-R6y0>0rU57g<(rk5SwFM?7lkj~;Hj{h zQV4^{TQdGL_q^#irKV!O|Kk8LCr0Y;acLOB>3^B^0~YD;9Ahaf*X3`n3z}f z1HA@hnAQw#$(vdPfN7P>xA8P{+~X8z!~OI7zj0sPx+d8`+X0{M+I~&XC&fvV%$srR z6k(<$FuVeWBZ607KjZKT(6`+O^CPkbrh_e}@nBx^%cdh|b!#VV_E}GTEt~y6s`MBc z`K5ptqcF@M5UcEp!lE5-RYZ1;VEU#3tZTWY4#L?Mh&@2*K*xulj8~3o|3B(~J*Pj6 z4xjCqz&tlDnwid;X&jRP5CmBS@g+HdyLs=nO>U1JlBOBFLxb6{plV4i&VZ7-#*^w= z+kn=>cVsm1$t)s|$SdGKU3%Yr{MF|s0N7SQ+YLZOcs9b7!kChXe(d)J&29jU0i`N! z99?&--@O15{pRa1DQrCc9TdaAB-cZ?(LQ0mTn>TS^T2@f((-=~TlVcm6vpZ(>#8$F z%d^3$f_DDW@NaMFAP_AxIobQ^z`mhB@!J9`sKHF`zkOOq|DyiaL#$_98E4G;zXW%f zTr!@p1(5p)N__w9>X+_+zV|El%8AoL?X?V`jU zV1Mjk2|sUZ29Et#7*dRO-S;=8ZSEixl*kQM|F{=sN0|b`3zMzZ&bIsQCm*=GPacKk z*SP*~HFaO>YV{*P#=n%4evnT;jY>W=SPJ@r4hQ<#?|$L#JiIS0KsX#o)|pl?Buc?% z0B5|RGEf7!uP?fidA|2Qwcj-~AAUX46ELy<=Xl{1kOYAHj~}`J`MaOH6B~y#``7kHjX(a!y*wY9M!+Ly z9Q0K;9e>jMnW&l?xkdqC95-WTxRP0ag;G+iudca|uYct}zI@3yVhV>JVGz|nm-!pX z13zjT1rBal{qA|)z?K-nK27{XOd43(nae~ZHGH&=R&+BKqLTsD)s+wKK;P0NjuzXwOqU1 z3fHz>TQYk0@7s1%uonmt7!~x-DYW#yHhndXI2{m-=i={hCj`R>>JZ{{c+Im%_uOx^ z4Dj#&?cYc{uf6(m&d>;hv>%-P8cLdxneVAgLHub*HPm0%Kqx73_04l`Sw}>6Z$6Q# z2!f|WCKq)Z)=j5k_83ODoPn67ZGn7F!tm1R&m`{b|2H~tZL~8&7$gsRK%nl~Y-zT( z?k5xnJ$H+zudPF9IBjp9fB?C7P?`>jvN)y_?^fmM)%wvg)sFsYp7f+)yWigoQ1@lP$0QFCzdT;GB^0AIl3tP_Z#khh4q*=|}F~&D-w8+uzY#wqvpo+>5*6 z827rO1Fb-#(Y11-{$mfrwaz+Sn*cxt(_qZVMt`_ZiN;YUK8tsf8ehBcy8HPDzjZh6 z-ga-j_J->{mjG}=1+^;X5*21=uu?2D+=H6Fg$iM=fu*|934zViN8Q>FUvpbGBmfi$ zfMM{bpkBm)-2y^ZyE|X!K%S|<^K=j|BEMc_npq0qw7?f7&;j;(+Lv80umk6%<$pf2 z20KFXzmI!sJ+rlM`R6a#=f=JsZ7zd~IezW>Hy2>@hNj|fdmnq1wK?|;<)>&K7Fm{GeB3^f|AeD9Q=#ai-^pnyAM+JHH2 zQv5nXJx~Lsd6G-Yd%mY}xTm5XSwH0dpgog+`0|qZHE--{q>kq^!$4zV1?*t-rnG>E zPXHOlp`kYT!JPI}AZ)C!n?090&jPV)ib4gKL3iVOvi$#+*8i;^PilQ?{Fl6*i5jw}b^ivQ z1sRw0jDQWl@csWUzyGy+@c6Dff9i~F|MPqtXaM{(7(D^-m*oIv|8YE|-`d@6>Dg-o zV%(YN920q=0)S-`9@(G^lRQ;%eC653WWB~+;y=CrD~AMi_OvYXr2%N*qz9{gLKQ-Q z^@xJi)D6;?wgmQ{?&w^i6}R?-*WC6mF4JQgx^aIf>^6m^2q8P;q8`ZirRY}Tq8-A1 zXP(9sX|-!VUj?_{bk>cZ`f5UeO@2!tzNme)FL(HawIcXXsLL%keed8N;Ky7hMX zxTs$%%@v#dQ+AW$=0m9PEu^k!y!hUEspmCAXVMs}3FF6essFd6{^x$)z<`A_IWz!C z!1w=Uxwil1N56BgoPAAw55)L-8mnqL_{aLYq~%x?6%6{=Z46FD?8{J4hKkAnO9EAe zT9*Jkk$aiz84%yI3;<(@?eD2H91;BGjnCctm;RtfHGXvfc0dpm6E`L&S(!k=0E?@P z0UeqEsf1Q8o|0!kX&wrC2CRylGFh1?Z5g^5NMpsG2lpb=#KAw}G=X43M;7CKBd^qT z>yPZufzP5}FP+d;G0?A&;(XF%Fe%T-18sL#)OOJpV1d zbI#LZ8PF|P&9eI#|CQDx3z(e9nZdZgX5*4x|5k?VfB*h3-H9W|ga!fD+e$IGcV%;h zdjJ1t?@hogJE}X+c)9PDS^K`LR9cY`2!U8^Y>(}>X}6oP8!z4N@qFXyZ>GO#&$!*) zHg4Q_p~1$OHa5nM&1QBaKtd8)K^qc62m}ITNeCpg@2Zk&%c{yZ|KB+`-o5YT%gndj zw^e0Sy}V1rjW`i;;+zvFPMkO_XXBoY4#@7Cy*ZO}m#2xa1eZh*f zzO(_`tDlq8pKEWsDQG@#3?8P<44&ddp6PWoUDwf)^ zYpgg0M24R&EJZM^>z{i3QTYV8QxcDC0K}+^+7ei5>}J+(Vv&I3+8LYq7v#;!)^ntm z8PK+o(Q^|mK&jC9;mLai0kZ;iH@C#1{s~l%>_F@0dgKio0r-y88ERc`JAdd)I2~--OY1A&M6Z$2%+@vR?u~mK8Mu z6#R$Te|BrF@ss1>Yu~*y+;{K2vNi70tUfYxFEE0V6$IitXYQ^khynwkApm5B0Bi$T zK4>>jD*^)jo^Yx?AYp1M$c%~V^8e2&?UCr z_KIu^ba-GHMd@G@o2KMLMoapfXEh|y;r0K7(7b_ z*(Cu40LDNJ$K+(F*$GUVTgKgv{oiy@UU>eCd;cvzy%P`l?)~?K>%Z~Uuyxh?ve`dA00w2;p2b@P z0^Si<$zTuy+~CjYE#GCe0CCx%nW`jv>YB--)^FjSk#UsY7lc7`a?i*W9!#Lmj34WH zdUz~+@he{nKYiir!`hkEVGf@F%+isDNC*bTto`%)|MER_kS&4a%b^Y!9V-8kbGC)U zUwJ?|(Y%Shvmg{z?m~pStiTq`ncN9g+%%SvrBvMD5dTAP++f zA(6BIMGQRT7-(Sqv^xg6=I&6iqa<@Et65k(@I4Y|7CAcrLd`|iI{S|qTD=e?dw~l^ zpmVyi)K=*09RUbphq`q+bhZUVt;LL3vBk8tubYzUbu- zI+OCcgbDJk0yb}beM5=UpNQYM1wLwV;5|Rm&9V%x;53=BtM%#zLR*#q>VwN0g+}71 z7FN4zUFE4q!)@RGMmRQmSQCB`fEO_aOd81()>q6zsbjk%2q0j{z@wm!<$Qqt867B* zMXH7JI1%5gtywScg}@-ITTszAwjSOK6>I^FwhThMwIJ`jvII8kTbApVLszr_8X22? z3U`bick+tre`F|(oV_iWF*mTpARb{`|8V@%48I^t@q@y&jQ=uP1hgS@V$`?Ybw{}G z{`=euqRKZn>k*CwOHc(TmZg9+VFs?KZdLTz`I82 z9pAQD0GLZsEl~JI4J|iT|uZj|#m;uJv43f38Rea{34xIYRKDo63)^-rJE)CrdUzavp z%fVveRz7)ad6DG>K#PU9{i8!+{AD}c?Qd373sYgj*zDRrrNR?t#Qbe3xEzezzw^y- z(`~ot2;>QYqvN+V^H19)w$W0IL&AjMb-^J`3;lK4Mw!0!5(R|xeK|a}JhfE-pdYFS zB4VW9r%2@u2U(h#S`)7O+D+j{k3XU{OKAZ(#?iLtC7&-`K=oo5dW!&%5W>Qk%p`CQ zB&QJr8)OUc(ygIrI|3rS3uSWRyzd#qKS_g9mNnP#>i1>_RC9%Q_G{|xwiDea1Tf1& z)!BWJb+*sCrSy(!0YvwU+SWIE{*EwunzsI#x;#Ular^tUX8-VtW&%7x8sP%#{~)4@ zV9en8Z{NP>!*%lf=fQcH3jj){$H&$rp&W7DzU^Yb!1P2)7Hyp(K- zZMmlsX{fAN`m8>cx#>Ec3iy#PUlFeU%JoL53R(g%zW`)GR#}G(X}0y>vBv0aZRys#1uJ@wU|}e zwe11`70-ssXX3nZ(uCQ@SgoaiFWr7~cy|BuN+*}SI0k|l+lPGYw@v@e+5*twW3mO% zI?}+p6SNan{;>^YyH`_XQ}vUS^h^&aieVlF~sFB>;Fk$ ztn|qskgb20-FQvdubmJBdUhV+pw+;m$U7UdRm#3^_P*@`Kx~KzIQ8_( zr45uad~d`U&unz%C%#zRTBPaO-%e1;&81f7BS!O86aM-Dg1lu3vdd7}z|M zAXN>$87tdkS5pU9AY!*xA@3aukr8%leOn0^%P8H{?HobdO#;b6ZO_bqKu6)S-+QoR z{IyW(6Y;&YAFbk4)tU>^i?Q8G&HgXgqa6TZ(5P-BNk$|5f)4z7K8M*q{9v^-zf1-R zl)+E^eAoT|6fV8~s<3img-w`J{^jfWu}R{U&#Q+BIMs^G$5WDL_Ino)0E&)%mIKUCW*jQe)7Uwuj#Ic0-(Yl&%E zncTL^VnMsGTU!s5jAT0o|hR@g{Ex_~%ds1LCdrO;Y z^9DX{6{E6&RziRV0PEpTtWBY2k)m~^E+T{wyDsko=mA#S0~t?mcz+v6ytj3v={i_w zGYqL_u*D?U_BXI@DvZB$mn1H2n~Re`G9iAyX8&jaY(2i_oU13q@}Ehd*%!DF0PlI^ z@yB#z{S9H;rtQ+3;gH8?>blqjs&W!l%W%T`Uv}Fc0A=k;7@Jx8oQ`@IPhZVlN;gUK6SLM+bfxA0dj&GK`i##h>#5D zKvK^PteyyC7oH;6^sdVZRJ|=>j4#%?-jCayo&jdeswL%$^=QC%I|FJ-)s<3W1s$S~8d~prj@?8P21JV2O*X|92n^zf4R-xV)TsSuViT$a4 zSfkB^bSK7N5WTkqfG9Pk6>%w&=lSm-3>&9bhKsJfJly?* zdo(N8mOzXF?S!Y~lTt_2(hQ5Fp(jimqbr>^m1qI<$Vq_%J25;#^_0T7NNzn5c z>0J!53o7MnWqE^Z%M01jn0EnPoFDDW7SK*q-^8x$jIK-DiBU4BnSXZnA3=qNAq1R^ zA$wY2?)6u@7Uc?eaO*0~{&&a;PX+BI9+$sN3Y(?NAU|vWXn(m^QQ&4leg6H29tam- zb6Hrke!XN7ccqOdKSC@P`hhE7pRq?c}>f7fTYO!`e#gLj{!#D=uHhk zY$0z0{f&*nHQsweMk$9+xTga~hKIwq9=tbPuQLLUtAWiu@PWiJ5P9aQ1)$>@>0F1^ z!61V=t50V^kN@~-$<`Bu01EEy&`WEsz7E#<_BKJo5TNyCRV#tDMuqxU*!M@I{n@{c@7v+x^l|4O+0<}1U@#FR03aDcvcA%OY=kUZIHTOf?x)%wOr z%AkVrBP1L-a%7(B-;jy9)tnmW|)hXC*Cw?x!UHjEW$O=MSH` zC5*gm`-$NkNcBA4?4W79mFxP_Xa7wO@LEe$n^0b-0tRKnL&GNNcLEB=TGPa|j>faT z?Sa`pRT|O^f3X=D^oul+j@8i&J)e}N04K&dR)vY39I=hPa;Loh?Vc}|Yk(A=(!oR+ zhC9<}yl{-Xnf;Gz**6*g;3l*G`!)Oj$ICAYtEN`VN1S+00tvVf5C5^W#^Q8Nfbbb1 zfL}^WG?`U?yo34MILkmwUfJV=N$bZ0dm`eS6)rm_08oX>{^7auou{)_OyanAEx`E5 zNVwyhcZBP1y(!E|%HkYoTMCF&GEXf41PN`kE}TUWSPI|)=Rhx)b0Ay* zE)`rK((D=mfPAyKud#5`9bXMM+;Vf6*6g2kek}eG@<{4hAr}lIIpsaU#**Kb{#JXJ z6(nLpFDKm{;M#`fSa@?^N62!#dP8|@aUUDid(;~^Hs*27OxADQ5U!91rXN1~Ba_Tb z04UoLkhFXrFxspHOpp}FK|x4{xCq|7G7P_Bhgqc>2INszoAUq(d&cE23?h!KcD0kr z^D?uPptXgAxiEc}0Khqz2rA{gf*ET`z^Em(%Nn0HZntn(OZ}^*85|f&`lecJ`mWTE zHMVv7W$)kFw!plW0z~+6`ZM~9ond(UIui!U=&krc@hLHXc7;VI(M%Jrl;yu1z`5nW zGw(jl{vUnfv2fW9*MyN3Q<6t~BI1U5+|%2v%lDfmzy!p)U~!>xSWDbl!@uLwGE~m~ zv+<2qv$oOSXzn$Amu1j?@9kCozETjNk!k#?iOFz_4q^D*wU>oMhY$LWfc=$z0crwd z=|uEzoOt5#37^n72h#nRoC6J>Dx{P^kPGrH4Na~o+>LIoS+*pzP6{ft5sa{1p>qA0 zF_2XWHUo!|Ddp$mDm&Jy=j!d=+PX9AuT+Cpho zIZtiU{6Z@-|Y0CF|PAp3LB@5wp;#583^Jx+;L0z>@}B$ zt!vg94`K`vV9<`gKCaN*4G#|`O9JUyJ=w>feW*X=0YiuJ4<*ZeF^)C=BS*4J2bvgY zSrD9RHZ-3@lMp0rS0xu3)o1)fdb*TgIpOk#Tsb}!KK{i^?5N<Dc23k~Y+uu@I;USQjVGCPuDG)jm4=&e&V@sydn*8`{ zP7Q-Pl+B#}#3f!>1=`ss#QdZ7x0#x<_K)Eohrki^$arHZ=SPn}9KLwdbzypDwYdS# z&cYcRsOixLWa~m2>;jy*4;k}@fyW<00&)Bh8nQgm4G52vjXS<0T^^z10zlPD(4m>& zjmb+8DMt7+jXt6V{N|nC2v^?x<#1dE6$Rl!alf_&f)oTpl+uU(uF=0_84UuJZ(&+m z038*KNXK!(Bj;}mMUap(dm*SkJ)`zIO>gMjZf!Vxi0hqa^L@ZCxx;n3=b_B4@H8MPEHWlDP zSr9FSrjF<&)`<&Gb=sOu!=QLZ+x~F*+brEBUuOSuFqC07HeQ(BUv~X9;geswBCMNP zW$XT&{Q!gKGsY3HqY2>W_3*KVU4RSkgC-2PK;YT|1byPNW0JCFXOAStfoXfV(4b`r zq>>y$mk0pa%BaDpp1rDgpFGk~#QV>e0=8}65k7X=Md7ad?)Du4Yzd6gAm25M7}>@~ z3lNtAhSY=@1ghivv|cnO#}xf*CzJK5>_^>s4?~?d;JOo3!5JI9vjEaw{A*Q!Q83W6 z1R+}%hJnrOFR#XcP}62dTeiIHz1ae^pdVV@rrA0)b5Gk@-!zyBYr_0awqP`SA)!^{ zX+ZdHGh{h=%W9_#DP>?cFg+Hge)8-vFe8UNxY&jGGX%M4&A<5QKG)9Hg2an8KKaHI z|B?wLxLFW`zVCti!^bZFY*;6s|BkPK;rLLw){g*y+TJw+^XXRgv5gRX+=K^q1spx< zPJ|-3;2nYkAm$aiLICgzWouP_PrUzlADKT_PX}Wd9Uckay8GMVDro^`XAj$UP%{WD zX#w~&n{Sg%82eO6Xa<3j8jI>M4hb6JoPb#(nk=K`pSNc=n@2SO5#LD!9k8h@GIQG3A;sxp$A_OX-U`>}~8-yTkC#wdtOJDn?_Hj&*;w zfP=rykO+8%CUNHVkG%PD0cPRo^?=xCR{%0;>t5W1ckUAkSp(EAWs-S0zlrOf5V0i|1IxK8_6$ex3W*O z@3@aR;fd0ow)fKekE>%IeDvXP&go}{EgLtRx2OU}dN}VPfFMyI@HdVBrFi-pz#s@1 z1s;*sK`#eZO@_G_4u)e7>&Rl>cWJQgR^^S_rI0e1(gD#GK&t;E0mu^`RDlq~NJtjS z+v0_LoQ+Xy09`r0)Dd_7SK0A4KeqghNT2^B(;JpU38 zfX_+o|KM}YG5*-V8XJY}D`niRa*!mHJ(@n&{_np3-tf*3zBe2?HY*&^WKYpBe&F>h z?s{1caC*-{aS=>%fqr4h&vwD%5(KDU^!X3-kD7u?a_l%aR3=Qi){`%AABWz8XwkMGp{&gEuU7+ePh*R6KeXS+thm zGkhOQ)zdS+7K=~5Qh`pyn-|K+rx(`#skv{-tf76XH*VS6X6-o2GV7rS!>8*@ zKUM?n7EG4OTHp9cSn+e`gn_kFa=DIBkhDJ+?YJsFDu4gB^D2Jbz?Hn17{d5ZuKW7+VR{m;f9an8bi6okLI`kUKey6%aMKZL_-;6#&i;KYW#PtN zz#R&a7eYX*Le~laDbuIw*+J*`G<*pc?8a>YHmzJ8K6&LO;hW$4Hr6`s7Si^GCQXO{ zkj<`{mZe|g1dMDaWDCId6iIXg+t!59*X>C>1f~ekOmTUB+i_#M8Y@G~bt{8FT4#ok zPtZE326{E0@(bk;+Cw~3BD7FSy|?kQ^l-OvRl@**Xi@*>g3pYa%cJ#QQ%wkaJ$jOnP~(X+Q9aT*Sn(m}(Y#_;cuPwJY%MeAVA z=GVz~3ypC$FY%CX-}Aljx$C|dwyoVJS_Hw*PDC9nV?oKd;hw%lTSPrD@{3x668sf6 z)R{D>`A0_hPFfM&*EF^(@~Y>tyyffpvIS`uuWYu_>3sz?8sE_1@mm`4sTW=dAN#_^ z;n`=OF$r#NpR@ovI?@6)&RYv$%L>ApK>;!?DU$ppdyKwnPZ&ODiv$A2B_KNxo&D>? zJB#I=g=ewSi#Fi86;?4p%?9!i0$3ldnVDxA45492%xS4m&G2ubZ))}4W=lv-EUER% z5)^GWWW;!(7HjN1{hg;{r^(ad!TvUWqz^G#ERAN4D&t?SowT@y;~_@f-4J zPv}AcV6lojlh@y*-!Z}dV599(hPc90Os_4hj+?@d3X)wE!p= zjF%1iKSJn|H!a6kKPS#>~p}hV^BD zN_4OZ#~!9Slv~>BL4?N#N%iOj-jZiBxE4s^uib!8sJ&>a@<`I!X@7NnRh~z?o}eY> zeX&IaGDAebIN1URBvJQy!4OFrm)GwJ1E+6thd(8T3hfqNJ}tw)sQRCmLH#cZ8?@&i zuddK>jTPkCzP^F5Z{PFbbJtuE9^dy|0;^m8`_PCyD7|{gPTfhE3Z zaWoBw1!YQ7XkaHVrHO_``+K*x^mwE!p0SKxw{lJRz-6BZdv~4^{@>sDcQVqKvxfbL zLt!X6+<{(%X_qo>vSPM3Re6A*93mlu5_1S7A~*W79pUJMPlrR--{USU^D47WkYQB4 zvi5KO33`A*SQn^W5mpMqv3dijj585t2aN{HLoMzJcUIY3ez+enGDNO*9syqdbUAQM4z5B6nOh;7~D%Z4{D!BHK z&D}3>_ClycfG&p_aKSo}h?*g#E1VcMKMcWph-!(k85DwLK2@q2KJw(;b?UWPFpZM+ z7v(LM(&I={=ImwZPjXE`ZLmL>D~c9WtD4?1H;5|QTnn#~8Iu#r;!OA+L;EVVS@>0~ z+u*=_!#~3tTQ(gFLl^E21!$+9%kWpWRK-W7`WGEa-U&vebQ?Q`hUT6Qn;0DnU%mad@R=(w4TldM3|AlH~ z1PWUUK-f@uI0zbl!#SZ}9<4-u1Z4f$H}eJU(K9Ob9$KbI`^4LKDQ20bcN*rFzWEG8 z+eMJkBtW>DB0P+x8fRI(q_JV>4anNtX-2k3(tE0nK~`$9p2oG}E~>;eOi$pzP8ThC z3@)%-C0ac6lc$FM9jg+CoFS6BE#mO!as8S?>ZEyTXC3ux$NfULlcKJSQLPnt~SJb$55>LwQXBOWuX9*f+@EvU~@67GV>%w?Sj45a)e1*Qqk?J{LmQg}@V6jM%=hlUCw$gm(xZo2DQ0bqV3Ig`)6PdkFf2XC;nj2+}e34-|KbI*iNUGe$w z)H6?+L0}O9fSm!c&uX0IWXoRk9xXt`Q%(%TC{Se;RnF+kcZQ+U*4tW_M#7@m!$0UEv|0bynQ-913p!fJjEJ^C-t4gEV-OZ5+7&ft!SzU}wtu%GPv`Nb^#CMl2o{sop9a3!1s z+8zzSWna1~y#4Rr6IM;hC9vL6WTZt*F8S$Aa%H?*GJD58A>x%k&3}&XyWyJYjcx#E zaTt7nlsC9Hx_6XftV8_j9fi;U0&bpO9p3-xkA#2v!S`i^Hx!Boqy=C(z>_&6PC9UL zC~Ay_;b+uU1>6M7*aUZ$Yz-X$=`$sOWTf31v#mFoto%#V7`na5>?rLwi{ec*k5D7RFRO~u2IvP=oB09wON z1#^Sj0?kmT>O;8&;Ur5c^Ojr;N3`z$+EYURDeKCaKXEYI=VV09o`2WGH&+evU^#Y^ zRR3I)JfrIW{)Zk6fA!J#%UAzVgO&G@mms&Kyv7GQ&*?kA?V|Kj&P}!gW9UEPD zrTg-Cv4e<5vYQjr8Vh&Isl(^AD*!bQ1g*GVLI7U+2q0TlI`y~B{WW`lB!65?vgO2f z0BDoIOSgqlA$}1Lg${gkWmWka1kQ8zPkuP>U~Lpt<*2+^ErkM zwtfh!d|||nakX>+Px#jh0s6qQ3ABV@p4jrH1D11be}Kn~4?74$ZIITU%67U`3RN_> zXy4!k+Vc1E?aqlJ%5a4qOXY7{{+jjmp8?fW|JY?AqymF*l{P;%dqlJUE5nVq+$_UC zPW!{(f0i_pm|uJsd5^uRO2Wyv+e23`0aS0iY@>1?v8FP0`Fpng%uLOMTkpCfY~Q#g zoU!M$P)OG53vAh=vp_l_#DZB?7E$YSf=Rah52Hh^c}a&J1~yEG<4^7n#~#tCfr(&H zYnHX7^R@q4Qr4D+*~!${xJk#fJdQlrx@3FLdjQ#Mt7U6bnd{yfPWx*F3K;)UokP*8 zP%A-W_A-wmv_#8Wi zD<>?Wg8$IPpRi+t3+i|?2*fvlClog1+$11gc55JNf4l?=!TV;$!`P4O)WFr+i(0wo zb)g=s@x9OfLGOG5IYAtm`Nx1No54N5e`1Q|YqkYwCkSDy+6zI9es5){6?XSI(OOvY zswWf!VHUsat{w(9WJ zI!@9&J9C#aw`*l3<~MZ26-tfwTxop&SxhMowa$u($#C@z*M`r^zw`0gSxaY20U)I% zR|d?|^9&edMWZaLfs+e6HSl;C+Pg7K{?f}b_5kzi*$61Ps)039a9292Ej*P0V<`;U zdPU`134hz3X+sg4tN@i~*_?r4PJr^vv`SuaY*mRWeO7gg^^TiCNwJ}cv55+2?5fk2@zZEhJW_-FmT4kl=%}6u84LQpVF+K*?(r@M0CS} zd~x_A4S;C^l8k8EISI`deesg;;m>~}?B2A?#!%!P<=4nlxK@Lt>dR^gyXsxeoUV0s zt88?h{axDd-eIw$fF<6O#(&2|D7SCj5&q_5e;;o7=I!Q@tcV7n%r}72<{^1zn*&>e zWOh~2pXW@FEoEaPqau*3m6ivLrpAU97YBKH z^zu{E0tE?`tz!Q4HR|F#`+TvE!^)r0v{W#Iz~~cWsl*+Ohiz%qeKvF(CS_qOzwa3Vpd4(Typdz) zREsa~#MoIy8QBbm$EEi9(8V7Qk3I3YTt6m<1+mZ6velowwE$ojYW_qBkR_e`14sx^ zz;p2Et9FOs^S8@CfDqrSHortjhE5yMJ0Nyk`W_63ox{E305jwjvh=*;?r+b()}##o7CW(we!;j61GM8B zWHj4yNLv6~3HS1rf6K7ee)On($fw1%<&HkDwM>!9c|@`;K-N$Qs&<4kVC=>Kd@!t5 z_}pl9eWOt-2kRU?JR5NFJNe7!oAI;R0Yn;0(~Hg)fA~xYto`#or%>2B9SR$@?TrT^it?y4FJuYN@3Qs zNz2m--VZUJE1j1-8*eR!Rg=@>snE(MSmT7bMY0SFWlKw>ce z026K$IIw<2nEZv8hJKwJV9OG9E<-R|&vWgc{A}A_4QfbKs2Bt;hw>Hx4^f3e$XgLm z{kylaR^+~To*Ge$Cm>en4j%FA#(;n;s?d#~m0&V0K#R0Tr9xVC!}4KK+xP}W+ou23 z1z~u{+H!+u&_aWxh{4|@a`ux~fX=erZ}YUXh6MeoIh;l(1_m5wC zQF!VpmI9;&&~cODh#UmPVA_EAkkb`|!zcu3fRvmBX`u9PoDSpv?5xm-&j8yQPgv^+TVhI7O4o(;AOOXN2VOmg?}^He@n_PcjL30I(w|;OJcD6QjgN;f-TAdJqa}fJPCHY^`NJl$7C0i3 z**_nURo+Vh0AYD6a|s#d2LS&7DraEBOz4*YaP<362^Q=UmX^~%?mTDzR2h$dqq5?y zHJEXjK5XS)^jcx*hI9}FgrZi={t>ch=REtokv8-3l#a6n^8nrX#|PaI1cy6h>JoUC zXcGj^bJ0Q6eF+R(ks#n#F1YP0_qoW)Q-gp8{tkW-n04`vVuE_XOs-!S`k z>fT{!YAYUX3tE6$j4x};u??w?%!P^n<;*bodNKcK(_~Cu_@b+MLH&W&{hyb+-#nN< zXvo&Vwel^XB?lv#&KL~qu=@Ynx9Y5t4x^$( zO95)CJdiXCG+F@jMyRX)+u=m)3;@IdogDbuy*fU4kM9h~ephjyx8WachH9*lnJZd= zu@N13B;u+nowR{%kwa29mXnEmngao?o4mvojFB!~Q#&n?jWGE%L&Ld%qZqCBT0ki0 z*ZCG)qUB)j2akoZSMLr}Kljqm$2ll0dqQ*xT+pau@&D|B^u0wk@dsKe`dQG)f~LJq z5Y1HoTHby5(TBs|{Nq1_2Os%S7}2(7G{7l;U|k=;BExrBJsy}mt~zv{wt8H5zwOZ_ zfND4sJB$YBK9U(aRP&GIw7|;lpwCgQak$NGU;kPd7V|p)CFk1gcTVbeQ_Um2k`O`{ z*X}DbYV;W)fI$BG`OW}6%OKHq25es=0pLhD_JH=rR?$L$+{bg=YYj9bTC?Nq1RoFp zS6@I~iR0y4gYJDQnZM3{*zk`W_qrDbr zH{foE$H#`-hDnlkHI2S}N0|AQ3&Vg;J}qPZWGvcHl>77WfCK;tP97wJd|3BCMMj1* z?CIAF<%Kl)vm04_ac$4R+oC-L3gNktC&BtmQEV}Ez}lf5Lg2xhai`Xa2Cp}h3^^v zIIrr}fI(oHYu#?D2s3}tsG&XU!-`)xFAS`iOpN|AbXw%I_~Z*A;Or-1(s@;(utod* zE4=+#-si3ynzc38#TBiejaB7xmYtlS>Fa*~9#e{PSWX}X@oiq*X_s@7zrG0SncK3bv zg!g>-@5Ag-xqcV@c8bY|{sTl82qM2A#_uDH*=odhmWnKTIP~liKy35*9aG+Mq$7<9 zo0)6;K6^#Gk5{{UAO2x@;)y52tIvN$STQ{v=Cm!aFrZmOJVgpZ2NpRdWwU7RUgaB3 zlD~kqco17-~$e|qP}x#$8K8tuk5+HgdX9yl&X&Jl^M0@8GJ-Dqf&c1#7Rrn-~#kY2F-&y z-E`*Pye5pCz9}WRG&Vn`nr!#GR~G-+SLHE@B422x_WKw1NcBG^`v?e`$};9JgYGAu zdLsPMU;TNw?1rnuni)A-V_RZI)lXYypVQ?4GAF=K_(786yCkOK+28ioU%KT42<07< zQWf5NTpTp96TMSCKK3J%dl=T%wHv}EIvwiMmwi4QK6KC!#Fhd|{;Bny*#+d?bi&?f z6iC*TfdLJg2nhj$JJ*B>ZK>(gy4su!6xmUeS0F1+L(5Zbk0Bt-39-%dg0)-oVP=T{ z&_aGjzj^oK^4!5r}P~nUGPt6HF7pmO%*t z18Y}=0iA4h^J`XB@+JB-6!@u&DOrH=akh+g*Ft&m*rX_X$j+wu&&n|$F zO@P?#v;SDNlz7HBi(J)Au8z;Yy~<0KZw)caUbOr#uSfc1j7xL~7r~ucPBA*Du|2S2 zEUf&uuMT6{x?Dz#BJ-DBK=B^U{GXP^KeRKipu7sFtoD=sC@TpO2d};PhVX~)dV3h3 z7#E3j#?B0%c)z;QU-_&*YwYLuWE=CWEF(Vm>ebjxuL7TiyIKdq(EYt5U1ad-)sZ10 z1QH+jhPP$}R}6pfuD69-`MP{aW+qh+n?RD=k+f;(Dj570KEMc>KNXq9bVqq&h$M#rqTMk5C*3< z`w#37fBTOg2oFE}Q0O0)gPVi$4In|F6j;kb5Xd{g{LN92G6unMX^DGamIGw0FnrdQ zF!f94hrTiQT$o^O15j`};!w+6jiTmd0FKt-Qn-Oibo>*Te=7tiDu(JmPe)JfXslWd z0wK(;UJ8Ku_qyTVLVbqju2p!qP?<(+q>U`7?5Q`tER4NuXR3vWBp7C|NlX!gKWvtA zW&R?FGWsiU%3mg5a0#Qor=EH;{N2Ys81DYTyJl>xX z3`*&G_~wLI0*LLucxQo`?h4qMy^vFQ#5Y{CA?AbHbxH_y!!0+3ak&aUd++IXotu?W zAgXr^1DWw51dvHZKG{4Qx+g#K1<3_eVNfb5%A7^~6=U5r6Z%$;g`@XAp>;S3C3P+b zko|yE^pmPvE7ha4Cq&pz3p@c00;wB9loOVQdV0Z+@KcUIg=f=Z&9 z;e3i(;b{Q~EzJ_<597mjsV%_>rj|l=O!4%uzcNhz`01_%^^SCcN*ZZ)Y|Z~c?e)(q zfFNj$w9mhA+B)AVos`Q3ubYPs9}a)_@ehVS`|H09+vM$!b}@~VV2bMh%KiTl|9mL` zV0~$TY8ZXzl7tftk6JDOn1nAP#yT)ZFv3**s-5<_XCFH}E_Om}=*F*=WW=SrY<`Br zV9dPWLV2Yr#2(Z>gd`NDS)?e zTUIOT)eZjso2eJ$f2lwUX6UUTuIBH*6&kvwD%Hk#7#xhQmbPvRETeHS{{hYXUoIEF zXE^hR?m4$~ItBCRaGyMxKY)WMvg|MHmBl|N{b4XIQmE2OxbubUt_*K}=bwgkYu1W( z^8v=6j$1JP?Am|iIq8)`Ahgaiyh=uRiBOo&OZ03yOT*`~tps66U%bs+%8 z9|Z!g2n7C%2pl`4k!Fo}SpD1b&Wwycy=LRp-Fk$6fnY0SAa~0*Zx3glvNxQvbGKW% zDiYfOOGsiqZ;229A}e5*Krw7bWH6!$(8V+XGh<=)?#Hwjmo1A+3jySaVbsLfSld*H z%*G&8C(gD&U*5p@uS5W?qw@KKhe{*tbbUTqwl$Y}7`hD~8@&0|)a^2Qf7{JmD7Ubh%#hWg$nSX)vOR~(L!eRa}ems}Lpz{hwurxE@jnUs!O0vmcam@a2 z`syv=PqgLl#TQ?+?Vc_e#MwN|TLOS^%$!zn)wAQBUmeu+z7l^cpYy6(C-ccw0Dyrr zyFaQ~9!%e7__ZNH6dIzI0LB|tH}y8q{En)W-2B;h1CTpJ2RNPhP&SCcm4GCPn)krL z19B>HZ+O{RFA3|{>1a!Be=)xktj{|pc@`}Z0)Qj|4CIv%V2qv<1O@BR)>S%1a4H;o z@R=~jR+}Z30~iS7@`sI`L%V|YrwTh!v;YNZHHKvuLcQ`1pdNxU7zrbzjF$g|XI!2H0o*X{YAcr5VE!2Vjg83K|21Lqb*HIuh4Y|E zwtXY>XS<)$m&G;P2b3e`U)ZX3|4hJEt6u{6_kZyH@VkHdmhjEHzY|tWP1S1M$I8{Dv(7C?fchT8(EdgJww)R8cmRs`!}jS*}!7&oo{^$CZu z2Vr&;jSj(+rhj!bj$wlaTz34`@p)NN+6xU=Z(~?ll@@)V&0uP|I|qWkXt}dbyM$K! z^7&!>HG3tI3KS+eP8^*c!TeGC$C-bmgNs64Vu?ZnZDy%r14Zl$&zYiF^6Q{hbcvV35kFZ9t3+XONc`6gVG9=-G#eaX;|Kk4eS0DVl@J=1_ zvu&e{{@9%$8sig3XYkNFw=qctfG7y0JiwWJ`kX@E$}ygn(wVy^1pw_&79pRNDm=@$ zX>gc6meDYKp0f?^jST-vJII9rtaY(!RR{AY2~n^hO+8_L$9X4b^GG{9!7Na#-XPfW*Ikkf^+qg48b@qy6OUvQj23!KGfu=gCOcMmO z=N8o)LcrjbRpI#4`@^v(UMLd+_!6T()c>6dFi-k-)=mrT6cmk@3tky+*NKmfm)PDf z(FU;WmFH4GJvE4Qp`LHDX<_~_!;>x0ZZJMMWP_h&2!4`)5dsF*t*{*eM<0479DjVj zdlM8W5Jn9DI_;PTp^)uu9A&KG*@_lwNuKm3YWX1vxF;%cpg+KMmTEc?e6~i(_2Y%n z5SB9ZHFU;l4ZW80FXo+GVYmoQ_OJBL%a3rh^s2I7+j6E=@zv=C;R0&^QZI3Z+zI9|D^1cBJ(#8grDl;>u1Uo z)W*qX)Brfc2cP}Nd+^Gyx;0#Pe5Y!aICr9sacW9vSO@IZ{cPz18wkvbT)m%dG>{SF z6q`{9LE|8xv5~^Oqgdl~Ede?4&W)?wppb6}v$NXfrVkM^>I?L23TJvxF6w;ZlrP0N z5~R6PHf6>uuu&I?6gc@G-uin|Hx7kg{Mk3SSHAsHyXy#FW5#5L#Xb&wS|JE9NPq&h zoXYZTiKC&oUw*eGoDJ<>7iRwV9}D|Fb6Yra=R@jk9rdfVyjHDSr>(a19ZYmoT8QHZ zUM%&@(qDBx1^v!)Ru;!Q4^{pU&_9FygB|fffRNoMEgZwA-oQ9zNivT1dcSWdy~;FC zjX4@mHUvlfsF})(zTxa_vxbwSrg_oUu zPS~`0vu(q()G&TBVL$rZV#Y=pZ3=w_p5DfAjU|dPHrzd^;)WI`_}+k*l=xYTQR&v z%cPPfKpQ&xYoxzuXOV^C;kht+{*EyHrdNgG-Rm_I#}-79u^%8EqQ^G#$HgzS8M>24 zARFkUX8h*pXSI&_g}x=()24mmGk1OOuJAij`+xP$+rm1X)q-u7PbOWJA19VRxr`Ib ztS|tuWD1T)@RLG_Qb>gae?C$FHY5PB?w?gLq4M`bP`sJwsJJ5_%e;wQ2v_*V*RIsb zVwkZ5uo@@C^1uf|V_E?J*8gTZoO@>a;2TK608X#juVOmhq1hOhe}L~iaDOKi7=w0*k71Y+d*X4KsY}-$T!x1A z1R_^fhX#g(95@!ner!)z$;^MVw%ft{pB1c>Hl01)ddFty-;vgJx}+z?J~Wz<&BD`*B)q z^LK)o@nSm=R2Bw_=A?*0rR9J=t)~s_UK$cMJ6bv6a;xm4jH@~#B~=KGt58E)*EX!m!#=*m+ZVloe;&Dh+|~ET7daIGA!P0>p>a64Z3mLFM^T!fH1S zUOQEA+bXkButPcy&bp04i@>S1iY!Us90=kmsJk+Ni{SdnL>%Y{tFJnx6WapeGL+B1 zu0@Otwz7p0y5*XHOhmWd0i`uzS~T(F@TolGtqDHNvUNKV|-g zKfntf8Q2gLL3jyt zB=1}c;P@Uv^nR$G#?9T)o6C!bj-b1-*)aTx%RB@mRVJk88?l@W? z(0HuV{uaW(tTGgPYj;hkCS0%b=5q1JMp|CX@9K68ZOHhoVzc(h+Z3@|l~w-3t% z1JJb?rZw}w=+e)Ieo3_FpL1Rq(RtZ(xC|yE3)k<$q}kytcWAKzHQP@MG|99U0hhg)~YABh& z#7@ir){~Nh9|<7L^$Sw`|o4o$A z?Jv%}*n;O<3CW$Z>s*hcI`fZ4fuxCbPV*q0BPQ3?vH`f_rW?c7 zb?d`fIzpIsDze7S;9}i9X2NH!5CW8MQQLEhcRgl2tOTz%y6z z&PPMouh~5_e2`v7fQJ3Cl9a7-5e^Ew*M!1^gcLk_v1HI8<3O0KZ3~nG8j*&|#_h;6 zC;j0!VLrZe1e^{QsvZ&bWb83JYj?1*Xo%eIlIt%IT%m=EFxGAfFmS91I?&SMhmjIAm-}lD$ z*&+f!HZIR*gyEwB009W)0)Tjx)`((Uz2$-+*#Of?UuEO`KF0YqjR$G70T>M~c?Z1a z#xKiJ#dtX9%(KNvhBHEd*Qca%tIQ;u;ZpaM4>$~58R-kNTTED6w$^g%T6S*qHtjHgNQn#gI1jpA1; z;p;@+I6;E>rviBUpkR0~?kdM@`yi;VB;d3i0nLo-`iiWc8oD3`Sv-6+^iPh3ncsY^ z8~dRZG-E&LkP<-?V5FiGW+04fU)w1}1~~geYM*stGVqG#HrqqxL_fzOaF%ykiB?1TZ6!m9K3N zw1Sg(8+l5)ZYmV8!qpbW@F)g98Q5a_7GG&E2xqGV%38sv>S(!e{IeX=7BCN(+6oMQ zcOn?U7EaSY-5esEojOm!+J><&no>M67lu#Y5LUeDf-rso2l|NaKno&mATczEZGIf+ z^FVT_5AX8qW^hJjo5pd+N}r%mHpM6oL7Q#hpS|J>;mvP#As!3I?PyA)+Z?$)&$dllvE&(7ic^Yj{R_(Fzc;Cu3 zuRe8ZTyCIG+z`<*GbxjSvrQ()c*3}U1I(jsO)y1*76VpMm6If&v>(o16?4P z5Fmd6VMxFr1hjccfC0|2wCo7L0ZqiQ%Br;b8H;~r|D7to)%9yMe`^on2||A-0_8*e zdm$K{8qXaOmKf8bJGjlA_<8N`|J7HAk-eMLY(|*UNe2z7p_Akj&FEne@bzN%gNKpdZ|+YNOu6x*s%dyEda1K90dRdQ@H@ZvBISuZ>S#~IkKNR zLh&Zn(eH(2*+97_Rh6qXpzq55DOcsr{N*qr zL&2hqYzpIpe%3V^kRiQ-aZXxI&${w2FiTxm{Fa!1T(4W~8{!ZUWc6SCuD*Fu>u}qo zier0XJk5(rGrJSRFT8wP2rI|JkG3wGc9=BmP5E}Z=ha- zn*FCcPug34Pn0Gc8IWNl2Ah>*rq%FMo*RS3ok6WGvAO(VTufl1_O!X&miU^nD?)^o z|M1xx!-`*ih0ppmmWyoPCY}J2!-O@?i;wLK;rm+eKcHp5#U>B-VFP~{$7%yR*azkx zVNmgr`J?Ik+!s;%|FO+SIIs-diaduapZOJ)KF{!+NQI~uzif!#WZ(IH%y)jw$@iva z4FFA(HU5cG8Sm-HY#i_M3=o@Wh?O-sq$9I%G+X9;#K=zb=evSHRv=PVwac8R*o#MGz+ZV50V~h51MD41B?eap2RM*=wdy!28#*2x@6O zDV}>>3Tq}q|DJVWZgLZOR5E`g?|Bfn8n_Z?&nT5Wk_o!`$ zhh_NJVxhLBm1slej7J;yspQ*+QezQ_(;#OD5F~<7$CYtUTk&g2pc!D^8q<9fqhaD_ z&J5GPa$y+Wv%!nAv7EFO_oO|fNdPMU?`yrEBi-|EONyf`X&MWArS{*Vvjr%_V9`Zw z0S+BJbSQjEGynhZt-mipsn0Z}EdNDtFbZ@U?@T|^Q0&iWPHYDJodkE;?6_b+S{DFR zsJB7sZ+u^RaZ=yZAplgW-c##)BLpJatq63acdU0Lf<_cJeD5cnUfIdbKvJ1k7Ga2U zEkG=RqUVom(#3q@70hRMz<{ZjKl#~DhizN7g>!Uv00Pb&hJhLYX1P!1WXz}YGbh#! z{!shZ%lz$Y{fYUr_JW^a| zRQ}Vyc0ri>XXl2#8SVIqv;H`iZLo@Vu(j`Ax%GWW>;3jFCTO^d=P8t$qIg@sHkYc0XuDU8{sT6*_{dKf44_PFuh`+SEvy{$vFJNU2wj zYYcoJ@0YK%K+OUGNDSlk!A=MI9(*z(E_Mdbc?Q;DkpSZ$V%8Z4k|RgH0zh>HnU6T0 zZZT|v;nOz$b7YLOfI^s=o(|W_Prybw3);JTx7h@srn4N`z862_>REZS>e;OQza^DC z%s;NDd2IcE$shIKvj?52vr9lT1mJKGC|^R4${F0UG7O!jS%tg?9>eGmc%%J7{UvwZ z7vR&f;a~0DVq;S15e4$vzid8bQJy)`1AwI9YPW|-BXbp&82h5hFv`(a?GDqwabXxc zZ>No8mgyL?K8DpyG!=B@aXI|DoArKa|A=fwKti8GQuOkl3nMRGj=q5PNHZ?D7Du+O4BLKufgkZog@30u6cpUYQngDN$au`yM z%>+Kh#h8|FU4?q}jb92QLnGmgJ$t2kmQ6r(8;o%v$@!RpPL`xwpDSnW!gin2N<_x-CU!^r8IL%)0m9M}5c+s&ZBKX2zNK^oySbWJKb}4Uj&W}d6bvU zV?M&TL`s@!xKs`47>mgWOumUoNQCL@vklj6BnKu3fkIhW0P^3j8$tCn5r~aD1PmOtlY*?-YxpEoBzhYuZ;A@s0l`f)RqWERgj^w~f5 zU1)!?{~~h?t`PuS2w?eO&bFfZ1QdTA@C&PY1u{e&&AG-WM0Ry)0BGEDChu$7G;sXo zMF_~xj~aFck6@8?Hw-dxK6@)WcYfZf5MYA~v;;R3gyY_K2&C_b^Y<|=X^7|Q9s~Q8 z;3^pg&P>mQQ+3qku(rUMp8yg?A>gRi#ZcAjWG-{hNnESKex3f6Z2fZ=!c0)id zy$0pL`W0d1jLkY;cqkmx8R2sWj>y$0{bh~PD(G_0m;M{TOdOUMu>1OBh|?_zBJ7In)ddeswFw%BovhBRWeo~G)0~G zX*+&2d9Xm*Rs_miGohLPdTk#T^Unn695er;vq!}IKNo)It#1y8W&DSW?dai-e}?Gd=U1(2;%=FXQT1;smbSFQj6KmbWZK~$3_ z)<0Pu2=_kemj12s=O5b|gTJlXQmi%q!U|~)C5#v>f(K!zPg>1=`<@N&{m}cvTmIs0 z^px4!aQbJ&9mZhXdJ7*R1L7i2@p~%h-U1!hJPl6i{M*<75isS_3rLZI+xEM<1OT8z z1(VeRAOs+>xtd1ZV`>`L6x3TABs=o4v)4tCW1zEf6hS9|J-fVmSa&YpQnCG}Vz-qD6DC#J$>S6&fjR?dVoPu&|vCno$9!RQl!>^QcUQ~VGD zG*h=CTET0L=%_rr2eM5On*bdcgx!?|fnkHogh2^0>sEx}-CFmX(s>6uH+)V;M(h+Y z!j$w|@?}?DY}=n5YwdO>T?JeZ0Yf{AMF}l^a?oDTHGWinuMm6S#Lz9$hXvaT!lD0I z__Mul@}KJvpI^E_C-}*@j)6~GN5-#oHa2SECo;zzNHPy__%5c$Dmxkw` zeLkFa%AT-N1IA_x`q;i#8dI~cmby*res)wRd-`plkWS~9FakiWW4_4}%RdJV zlUZYVME5;GPZ&B2Y5`OiGxF22U!m9+#((@&&H7&xCSP}2=v#sCukp^9<3}Jf#y`IN zIR^ZDvhsgQR{p$;X)Iw*e<+qRheQWX(Mh7(=Wi1Pn12LGbenC>Pd)i$_?r*>&+woA z@XcYzjve|4djP9_iHQRu>VD@TQ4nyZ@4^7p;5(SV>=~d#Nxhf|M$JLCb}>HtZux$G z3)C$DkOfj1osbFvsJ+DiG>eT5Psh=rsbyz^85tPpLo^1YV+%*6Q6G68ks3T(&cJ{O zwmLoO|4eSJz4dyP*8vzD4&M7ObrYP%W#6SxG6>S|Y((ji!LfS9Ot|LD*M&!)d_0_U z`k7(13(=w!y8zLW9p+&{^} z|9%|%NI*bS*or{5sQfuWR4V_z?JKq1r7`Ogeg5*z(&%Rr}uigR; z2>|poo#psQ&x4zEJe}hb9Pj7|7(6q3(z`(5#vWL0Vz@yZofwx6_>KS(nVp^0)$<2g zqK2ST9URA2UkUqO+#j}X z+!Qu$*ktWVJ6rwvRKdLXvF^qRfG@~M5UIZv0U-Hdgoy8O(fY!eJP0nJ4JhdS(6-fK z_zb~4KAvWsEJq>=(@m%(t=OgKg2Y zosI-f!1Sd6LBqJ!xW|pJdGmY2*E-R`G%W@r6QHe6VcU~XH3zbBPHzWm9D zU#rHKV6<(1sQfqTF)67fAj9}_aFIS*tLCk!ni%TddYY}ocuX| za9=O9OJw@qMlL9^WKhohMPF>!PWhz5`ac%4d|k2y8WaG0puy1T^y~~BpV!XtKyV>q z61-y(0$f0#^PTCZX-G<5So`xU4Gz6G4|*~T%;uS7-PX(e^3!@|s%wKAM7O}D%rMXg ze~kC}YTZDV+`i#K5x?fMm9+PS4_ROc$?wiuM5G4xjZ4nKJ%-M3XL!z+Icj1Fh|>~V2-KzTgC$9AF}_|~7%eykSbfAZ<4!sTDOGHlzt zE$rU0GYks(UE4yTN{&{LnYad}U7yunepL1?BM6kMAKMbK4d4-rKY!>|AQ-wJns|K6~D^OkVSXF1SZQJe=r_3I12ax$ESa^3y7JP!J5+p zL<Zl`?!%TK8P zW549o8q3*~S^#3)87%-HfO48&@~8U(Fae;LTk-Im82`#J@k{6F+lz5s8Cf&m5ci{!$;V~GI9kD*{SwSR`R*tg4nYHxvD1b|o^gC52`pSXfi5vyYA zcun7fBz&Kh^t!%t7XUDQP5oft3>vR%yic755f|GddriOPEy%xm)v9o%)NId5;@+v# z1lOC|I*zE`BhQ74TYlxh(n^) z#VwdWjSv~X40ZeDDtGu*JHq6f&JUxn*ex3wY3!s8u<;47q>p2TF;z11le(YfHbN_B z{giKlh;FuOy`P!?v|ua=C(tUNkQ79#fB3`u!@J)1p70m%d3V^gQ#MNC0WkDv^c~gw z2Db?UzP_LK3(v$xA%Ux&MC-8oa$XRfz5!e|c-rin<@@?tpm6TFFKx;A1WBT*-z7bs zDJm^4b~K%hiXWuGkVM^DUoE;IHTA6w@tt2io@DVEKB$pp%s)!Ov=8z8{9XF&apIL4 zcuzh1bU1788Q~9p=Rb#^dfn^8fFxvFQ%^^h6CMc2BRW8cbHBAE&xpr-P%A-i{F$z! zpMitf14ctS5zO`sTmNUX1`wrV$v|)(edO72;HG=Rp_}dt#~*(|dyDm+IFeOq-)v5` z+_UX(LYSAxJ*dm&zEk=*z<7Orbi1H0@6&`^zZ_H?gp49 zB)&3Kdsmre`FZIUXqf;|Su`C_h*$1oC&nx9dO2k4mevCX9{Cq-5TE@%D+Ku9Kp;rd z#5FU7sqD810nhGxE{y8jfZzT<|L^ddzxHp;U%;FQF6~(+M2T<|@$dg#%_1JvaiGi~ z(lMEWn)e+94hFtXPK$Pkn8*;&8M@;_sW=*lLCy(?B7CzCJ`)b#et$T4-96zL$CpYF zFlR#61Qp+wGFkkFHo@?3dG^0}JLMe0`K(yoEIC$SMwop2@; z>*ZfB`InYNU|Kf(Te7KgPvAJnu7J+i0<_IVFgU6IMaGq!_^|6`__e#k#2e2GW3S#5 z1~yLH(6d=T39~rNJ+piH>@WV{nNZ~9K9<4=aSZuW{(n`hYZo-GSm$SdKXd}3L{NOB zB?Sr4PiVdWeINcnc-y<*X>!3T8T( zw-~>8oU8leAO;X{KAG4T4<0qY{Y9MlJp8q}wz)I>$mE&bldo$CxOzG-iw5y{ z`pnbC7<hUl=H67mm=C_77{mVCop|P=0Jc<(z^3@+c;a&s_gF9v$;UT%{ zWx&H5JxkrRC{Q+PM#`BU2?h2QV;_JcBdc^pxxC{WZQDa_dQ7Ji9@5glp_}guv-fD0 zq>Kt90-Op~`##AIwf~5GCoG4~wE(*T4j=YC;q8VZoppjtIRvsvaIT00o}(InyS2Ub zHK&A;bG5~l*}hKhG*!RhaHd?I5g7Phhinxe)rp%AYD*u6x{Qm+__=RY034$=x@tmD zI91#GFc^joWZ*UCud#Pb{dUP!SA@URdjD5$y~T|ESkeJtU*o4b&b;GQZxolR^V9bT z15_+txd$L;?oO-XJFYP-Gym8Ud0v+_0C~1%k{3u^O%o7{awG@oeU$T@jyv9$hjdWz zp7=CP%nJjY6*^6DPS5(1zt%a8Nb{7(E^*52;Q~BM=E| z25kC)*+0Z+IdrZC`h1*Es531HcU5f4r}@6TmeBG0sK# z_zi=N_11?TdMNz-&;DHaz2E+i;Z^5fU?bYpb&PBRU>Q%;fR9E;k4PI3-_HlzKFj@2 zG!>bb&R<%`40b*#MzxSz16_0>2$9B(?JXLt*y*C&J-xJQxmr<$f&>$PWPu0hSkl zU+IT*c+~Kagp0C_a<9d5hBdSR%K&HrI&ow$XA~d=%oog;037@?Zm6q-eBz^F^XARwlLZ0J+tHG!T9LWKq!;>8 z{n+*h2mY;BoH&3>uQ7I^ciH&m`{r6;Sp(2q`z`r(g4<>3e4y|O#CPOR6EKL}fDc+y z8Df51+Je6|6shc&BLhp*m#Te$1)?}e$Usem?MWMaZ*&7M9j7hnFU0E=Y8KK^JR zm?o(NBfsaU^5m33>;rU`xz!65DvTVMXa|1W6A&6CEfr);I3TyF!>4YP(crq!zji## z$vyG$$0P{gTV1;fMn<*1$=ZLFw)D)F|F)|I=vTTSZWn7;xv?BG2xPo1h1bM08wcNn zYsEv-jvbbof9p!y$~W-~=Y~05ba){n5UQ)~C9Yi~b}!XPkoh(LjE5SaDPN=Uo<%h!cB|LGrw%f5Jd*tv73 zr6UbnY2z@2sWa1e8-RtFKkwr=F%2al1*FfOrvRx4SsGUnwfvYv3oL5@a%jX_vWNpL zn>N1lvBv;p=FeaxRkNH-0nxU%&Z(gq_+c z0Q1CecWH1@9^(Wwrj9PXVJcO6v_=nbY!f8(IL|JS6|{oe%=R z_o$k#TGhze7(XnD=|4i{fM(0X=Q7*h6b9BwLxlzkTr`!P@Jav60{MVr%=l%u!fAcs zIa&4NnG;+keHBzL%Oj5m$^lN`Vb;&S{tf?sduJML*-_p1dOf$)qeM$;A*s8?Ah0l4 z5XK}nVXz%LcI+51HrN@QIL@$=wel%nvsOOjL$X%pm1JeWU_8cv!NCK@0oe|dk;GuY zfYhy)S`w04tyw+4{D1p@_N_YS-q-KFR=?M;rBm7ST zo!xmH)Qg`4jgAXWfl&dt;3QobAp>pNAgog+5pNiW5$AZq?M{1mC=eWkCA|HieJkyu zyYDV<`Mx)ofBg6UL3#U|-%_?|V4u||He)E}NThJFN2#UGL&x+kvJMGqM!xDy3lem% z1QuNz9G@NKLLs?>`37+WlRP6xrU&)N*97&(z?u6VEvLVJe>we?`^uSb=+NLZ+H2)a zi%p(=1gXI_npLF$Ux#}}_r=d14=Y;~D*!noRbKR&=tt@Y?9EH)ue(fFkiY24vQb~K z-16#u`hJDZ(Qrlu!)!nLOr}#9T?icDlE9tkT5JjZd0l1|*Y@V@n{Kxn-Ho!455j+| zR`+y3ac=)^zjZ@dIupD?Zr&I={`Ax3b6@;I`8WUZ-<6MP)<0SD*EyS<;gbwOpUe4n zTafp|1G0l{l>moBtROq(oD5>zHsBh~>QG=*09J?2k&9(b9e~c-{*Ywe)ca|n`pB_5|9pDRp(<0ntV2f$W1npSi!&tauiaiYzT~R1@#gLv$(|i?Uq;lIRVeyFl~(dA20R(Yt9)GA!%{ypeopjb zR$K5>Cd$T-RkItleWurJzCeN{_Fqz?~_^oX|2%Y z1xm>eQrKId=M0{eloax|Ar8B7*p9=E$@tEf^s_gfnO74uI#-wiqXMwP1YQU|f_T~> zxE*TSBO15;?Xv&E3IMQH2D~KzM)G4K!vVwfIuv*C$lbBz`LF)Pzbrrd?)Q|vx;#kl z5Ne{sD^tNK%}f}~_;t8${#y@Q5#Umvi^kwoxmZ$FnfTVgwOSQG5!j*a0m>AWHw}YP zyYdd89;^yrOR+ht&k>*2^~k5c`GAxGy^_V%t0+$3VVfZEDJeMhKbi|mffJ`rl#?er zfq5ZOtN9Q((f+vAezB(?I<7u3t}jq-e%aM}o%DseWJ+J8e1Z1GxuO@%AP$&zjopp| zQ07=bx7MN6I4{HgK8IIH7h|H!ceVOU)KBF>$V;ft?b8YwvwpoY8=aQ20wV(t2qCMz z{zo2ssC+=P{(t?S|9!dl@ZoY`|9(}$Jf)rWlbAGwVeAHB3izQNPyuK1B`o2jk7u~s z$0+<;YOJ1nQ~*|w)>AnlSEeOPs{{aGP7*SxgJ&RHfvB^7;+ailxM7r=qpsl5~|;CqMr!xq%;V=slms2c%6^a{3xR#_{kRpt7s@Y`BP?H znH}HT(5tj@p9X!Ocp38qd9@8VFNN#NfA*E~zjV;=-~H$RP;R*X`Zz4?i+yq_-{}y_ zp81o71wBY}xgU3i+a_Ix8Hb1y4vNT+_@N=~Xf6%~Mg`#F(0!7t<^`7rP{e^#2-tnV9UiRT&%jg)R*k@l$6aA z90*)40ckTjWZ1Zcf!FQyL*TE|O_RK~xB0vF#@F{Y9gxuHjS||KH0?~EM-<)du$H~PK$_?!+ba)(B|Ez>H!0n**pr@GvC-;wga z_1%#F_P+m7{_JaC(>UKR6y_gQkdsjgaSQwEha~N?e;*dOZlNG>L~M=|LK-)5#%tI3 zyf_pX6@ZIF_g=15$oGQfu~cb=J`kLyIuo`emhkow8 z_ulfBH@~I)+|T^Y@?(GPN6Te9#8kS&K$F2shB4#OJKemyuWL-_zunzt#!NYx)37Ql z=_gMNRfDm^XgC|7n-2N*!JIxW6yHC{vIWruo9QC0=@MzFA2WVdJjDFZJ}QNPm4Smg zK&Y#e&)lUtQ+L75p*Qg60q}vRdvxd=I6fDm0R4{xfv3AOC=08h{e^c9id&}0%TlIxT-{@!IAK;`=6%q1s>5)H&2Z0oiO}ycV8{%*nFaZj5Iy##) zgP_s7>J%6ifK?~?>DI{ zcDkmrM1E9oV70QN89B{3r;}!FSb)Vv>%;)Rj77gHB7p^Ln5A%mdmk zIQ&RCtIrmn<$&Zdo&M(A3K9@=oE^yR0&sR|jUcd(j{ya^6M(w`QfOILKz9MsMi|X( zV_9EI`b4bLJrV1r;BB~WSJ|-d1zOhELB74aV?RGWXhRy(=IRjs?7I<%KYwzN4X=sn zwbyywD9Ob=v}=6CD&X|M?usMV>Kl|DRntA*6>?1vVDm?~4+c7{x}8(54)CS`2LTW3 zV9?Ds-&}s-@BDoE$sd15*>m;PF@uV?3mDwNZIqVrjgVxv%vHSH9e^Uh>s28<6@Rgq zCS@aUW_}oE>MWVE6pS*!2T-_i5G5gqCYUTMX))pFp#Z`V?%nDD!h!3E=Z`*F&V1)F zDFer(6lmMvuC=~HKso_0g>{|} z@$jWe_V(G==a4Ig_5$`|wM|#_C@1CBVb{4A>%%?z)NtIAN%<*TR#ANzVXP&+^2kFE zl@I^+Z|NG}50+d1_||g0_WIXLDewhM2;lrtQ3O9oGOTZBJg6%S?p!HwIC0^Um9P=e zJfeJ!e{^143XBTC#ijqu+^djpqs@gvPE8n+1)IYNM7ZmzNB#&ypcBywed5y(3GnJ(oY66$r<}%BJ<3mI3T5E z^4Kp0_gYW{s37GGrYQ%fzF8UIO#&2womwhpS=F2?=r#Fb8fmE?>3Lvx^$qw=ut(iB zgFO4_)8+KNS|N}?nb+aMv#gNlRk5>2C1_|1DI8iowQ$MRf|f>^PnR9mC2gP;1jFV> z{b&dJn`X6hqRANv-DjSBMtxA9mz8q1PVKTm``R0ISZ}=q{l)`(^j`kuW&L)w85cr< zhZ(WojWs^PGM}I!ei_0;z{!UGy!NRNV9m3yueRY}U(EiaZPYM<2Uz_sris3)0_cEW zxj{?)TJ7N4Zuen@cjcUnMG5{>&pcDUs_Vbs|0^FT|MoxqhjQf$uGDRQyUHmY{);z! z)K@M1vtpk0y9w9i9ULoC z2Ilm!m%^I_%qlTKFgs^HiN{bsI3#uoIIV=RZE*H6{fIup*u-({KY7EqJ0OteCFQw$SO`Sil%Pnu8!Xdz*Zu%FE8Mc?=$ z40nU|D-IVlIRVvuzT0ySx=!vt3%Q~+W8PzspoW5|cM zDD+9yaze8*_L^BWctW#ZW~6*HM$6G>ACw!#2_e-n`V^|s{?L$4K$#+s&L)p6C+;i` z?(;F=PSe&q-Kppx+*O_cr(AYKz2|msDeG9iW@fK_>vfvR&uv%OPHn?LUp_{KvW2k6 z26qa2+?cdM4DPmG_~XYzhBAfXCHftez=w{!#ldTxY{_6~k4)F%a_s6pyJA~uRMy*d zkq>+PQi`|%GupWo{2eXgCO?hMBljFGAN}}mmtXzO-zc~K(XHj0YpyO^w_c`$m33TJ zp`F6oD*;rLxVi;^zg;D$N&p1&3P6%4JQHKGadg`gz7WmosytlkdX9M`u z@b0Uwl3Y!RtamZoWy}U!lX2D5`RvL6DRKx@O*KOLzfY*87z0~7sA_>6>^EZl?OEM zNHr;+@|}bMi-|f>AbTU8cl24>*FF6668dp1FW2!tAvyt&G;h;%$uGK<^`@WcbJ+1& zY+hrf%o#_ygFI6H`MRar;3*y0z3oePlwZ{6djH4!{%3iCz5u#2KHj5#qjVPR2=iLQ zD%?{MAku=oDglloJi`p5XW()guvUej$z+mU;+X`Djx|PsQ2|(E4YE*i5YW@cN&w+C z-f+oN#X&m$3im)IFl-h05fbU02AupnQ|gCti{M-wCc5jMyF=LgZM`!1Ge7my<<+mc zrR?0Lt4B#I4Mam9o*}<}*f290mb{BztzuPx*%|O=&O`>t+IYCQX23DKRk7f9n|0e7 z=LIC_;>uOcZuL%;XRZjstTXjW(>ODz+D&8#Y$0fE@E`>8haWEr00-El46wvKuhoQ5 zAhg1OJ7|eghT_GlLlz9&z;oCQoEWuD?5m^HM7dpwIogbs5N75Aog*IME#b3nvxGSc z076~ilS_5lvXh=)l$k$~@q0|yRB=%1Ayp3D78I(bdcndVI2vvPzpzl2LS8P>SI+jty?o3!x^cl&T2ZOG_e zixe0YfVJ2v3zW%x6Rt2c2yBN{7zf}_VGl>ic%Kcx@34fy#^gBwb0Kgvc;w;k0L;Nd zhjd@Sj`Ch@32>$G>vT|X;}$VA-SRdM6NACO>Vt`sLB_cVnd0Kx zS$xVxIfFS__6fs84wfAuTnLm&HS`A`4-zm`Xj9*xueeD<4r6d+f=+6M}g(ZZZ?hgIQj1t16> zdALhCp8k?TJn;mA2(P#u)_-QYe(301ixe0YfVJ2v=O`0{+?;m^WX2IZa{|+b;g+!1 zWKd5ri_R~r75+86RSdiu5IHNIw*_EKl7C`8q(KpQ)hl1ALxS%tfA#x+puF-G-(A+B z2*8+PMPN`~bCvjX>iqqB{YuI}Fm+~k$;byu){GaPi7^T7z>Q%QAQS*?6L4@#-zbP# z9oq&d3)~`@OW;mH1K1Uo9*HaC7qh3}Ge8B+vJP={^q&N0872XpBTzN?hVcvGAHv}e z*rrUwGO$0-HU{S-bTBejDYW%b*!IvbPU^>*hykuFLl$#Z-WNNJvavVE*#lOO_Um9D zU+c?nSPTU}RfIl_uahUsx9_~OeEj!+SEu`bx!iX97t6jI_LcQgFuA~srURDc`d0Yj zZhthu(C;OF(nFwn%HME=VTd%5fitZA5#2mUH=0X_0;2-3!fj=NY9ZTZl>;U1Hf|~I z#M_6p&?e0M9IjKjBK${ODB`N1ciHgQu*BoA6!?kDur(cHe#80=<(cEp#QA`iz3k=X zZ@uSdqzL?=-WYgM*}6@y4ze6=PSvpz$|A$8UnX9m;}9HQ9pvUUma&2K#3i#1*fsqK zlIxKSo%-=ZG2n0)OXm6GO#}AMQ4WAXIK)rxG|_x|gq?w%Ju7SgvTEL@$dPCG^=QM{ zN?}C;+AyopuU{fsJ-Nu|l&(m=^RBzf??~|f>Tmvf`TXZUU-sy{&9=)gpUn6zs8g_Kk?pSv0e%EG zg-Y18Nz=N0W*|TVU8V`og2MlN`IxajKc42VG;y@_q|!;dv?md(;20Hv6(BMV%!f|c zk7Fs_hwaEH8{XW3Wx4!uNylN5f}Ukc z_O&?~&x!z_S4BubE(9cY!c*L}YTUdoU6z+Rr!c^cpy%~Neh3FC1u+}cszGcYpd6@A z#EJo12?^WQxy`2yC(jA3vH&fB+_Qpb;!|Mani=2WZSf)GxyXl8=*;S|X;*|jhZ&j8 zb5Rlp7f&l8@W6qeU$k|XS(|5@N0;rIvnVg+L~+69+=O0ljQxF1_0!fFPvHgcF(oHb zSL3JX_1Z&+?k>Ok2ftt5_e<|DpZomh%2fz{Dbifz!w=YcpbtbgHH>(|Qn**!VO@TT z_wE3|>2^B&;gXfOB4Fx~c}+z;?*o`Tc{{br0~3W#0DWz@asc;oWx@FpdQ*f z8&0$H&bGd@UN|tw0WX+pDgrrn0>dTpFh6x+-4t$|bVqy#l!^fYLx=F@*gDVwL=o0o z2pr7g+F@*MnarUuz)+wMKTPX(h@WtC6p+@?7CGDQg{yEGPD6JGB4hTB&}PeqWqD@o z;g&6b+-X2q#3>$yAeddXg8x~vm=|WgNsshjDmLYYR@7;ywtueHj9<4G#)qk5+edMb zp=%zEt{_Rg&X-I5cimb3=uiH*{JIYK{oW^juUxZtZ@HXT`lJ+0-{O~o*9aL$!&yI> zSy^ap2%7$(+kVI6mMhSAg?3Q)%=~+Sqem1#7H}?uiC~=oE{!zsPbP#+rf{#M85MvF zKwTR6v~I^c1p`bbHxq9TA~?lt!(gT1m)rO`ix^^U!>il*r|{2k+g2QK=Z`wsEf;1-QA5RRPReJmKwnS&xa`xe@AgBe*g@_(QtM6@?)VXbK)1C1GfwD>KtT zBskKi0Pn#noIV}>S`p0DIc2Zl5OmRjX1IyZGELkHd#)MkhC%4-KWNGo(|fhI&upIq zp)hciE8;toVKcQD^|NL9uDxdh|ACwRN+OL+|@3^gOx$LrXjb{DumYhtqf}A#R z_N~x|?74&wfCMyu*zuzPxYNclob{8;m;~_|bS_gIw(%d{Yk(?skiy<_`R(P5O?x zRt1)7lCey~yOTNJj3ulJdxzH9eU_1M@V37;U4|2uCitCB8@fDtV?f&MdUfQdb+z#Q z_upS`(g%j#{f>8*AN`>pE-!t_OUt(1dVP>YCbXEQ$~hhcwQ> z8=)E4AZnb6>XNmydI){=eH1b->tUH+SM?TsnXmUTB4`a=Wjr3_Wot*j6Hh)V!T-(j zv5)_s@}ZA@xZHNz?Ru4VXW6k`w<5-vLx7lnn1^KMU`wGcTV-%e6Q(?!ZHAGi9`Xwe z6Bx%iY*Ji#+x&>NnT*d2810|{7cZSUHA@zl|L26L(hvHYw=OOVHpQyIg(mf=0Gua9 z8P}fm`(FG+L*pW}H)siWoi6OCjhzsEn}MEMBg#ZF37{Cj8#itW4X~f;+`bk^g)|qY z-27~CZ3ccWZl91VxeRVMMCivWe0rU) zJ=B+dQ%T&{)m4$QQhHGwj@)}s`M;n3RQaR?|NB1hK|!6?;l8WO<(FTkYcsTssB!O^ zpkJ}2qmv%Kf+B$1KdMmO8D7IuP`5S}YM1+s!)b8K6?M*vJIv3-(}s=iqyTaNdC(g8 z8!Na>0?)@-7Wh0_n;toEA(enp0cfeaME9%)_e|Y`bctwYg26bzk0N01Jd5kNbJ z`5n6VUM;DfF7JNVPnI8e>)XofU-x>wLipmcVXJONTWEU##PBPW0pXwLMmSv(GcRQz zzC`$#{On&7A3qYv)au(mK1T{bfs}pGb?LDBagKr|elB`K@S^}Q+owO}YCw}V#)6{e z*t*k-z}aVxm%9!fEVt{*-jDsx@01UG@B=~Xef#!@U}xrdrW=F^ate`e5T&rk-mqa~ zz!RT>It72iIc^y5!c~|otSbvHsW>bKJekb)QYxtWDGj%3{?AtRDtR{J7 z+QhhBnsXZ!Jou_*L7ivS)>fAp`HH@^N2<(5}{Pua8QDl_ASRs~3v7YK1!jj!wR7Qw?hG{|`Y-Xh>cI=n0o z50YjwaPf@hc}Ia(w(*7o{ef9M2l)6@G&6ne>&M*<+=@ti3jQu__G$XDI&vtiM<0GT z_V+(^>!-_a{r1Po=fCjzAnk$u2ci%9=01=iu>AwTZjQt7MiGY$JZmQ$KEoF}ohD%^ zMBhgSCH#-a-~^V2V3`N)d?gG_;=~D- zmfY|Rew2WrX1SESEzpgp5AQGw?u;RuRGVwWPV@f}N@>Dr|&*Ab}3Hy(H^rPidw|*)v#=7zad&PLkByL@g|~*0feAx$IE^I2UyWaUA-y zKz77Z_U7pz+4u3zytcep+XGi$b4@I>26GNN z58fbv}SiT z{`l7N;g5V+@axNUFTA#FQXf7gzJV~0bVB4VnWy`W*UuE_wh7}r5UT<34TL*mBHs+E zibJL&MNLaSF1QPCze2jYI1ZTBkiPYg?pYM@th@^3p)6ohgTO`sI3L3jKfK<3#uzLM z$kPq9nQh@v6wW6Hrx_K1CDM+4IhOt{q*&=&Tmu^lZ-g3J+i;2JTty(iR?|Em97FuU z(}E)oWAIyGhbshNa!$jNHfexuTzS&paSnI73UAnc+6v?RfJvN=V*sq@Z3;2l2gPWg zdQu1dWPap_f291-5By;H9&Hc2=*An%9(@W`OEJ8fF)1H#F@QjYVcdj}mxFxR5@0nz z+XL|lS#23i?wdzQ0NZZkC7wVwKGrM+%pYAm+Ki=r+7V{Sg-N`t&!?St>Zi}{#@7yM zYdY(>X8K4*`k0i>V~;#i4jn#R{`8A~T0ZfIpNzwO4@*(S?AQK22EpG701kvPvoljq zL7T$cg(l7d*x}$|;*sNq@y~gn}I@WdAZJ%QqoeD>iobhM`_fN(#q+fK7h zhO&To&IR}|x7#MM&|aA?!`x1N=0aDbudu3+lSb090`2ov>eA{9TlBpZ_os?&Ij&Iw zSR%EC8XtoETn90R`$J?y1EMLCb~y$n(ryJjn^k}|Upkpe)dqF$8s;Vc1Yyn8e6prZ z!5%SD$9`PKV}sYYar*~8;{^i-Fa}W#_x3=(5(Pc(zDL^wXHUcxsc(Pl+snIt;vMA` zH{V>Yf8ljyBL@c=cdQDq1%Q!XEY9vILj+jJ6V72lwhE*W#390CIy1oA1$pTZDG?%Y z=N3(eakMTX1={wA&eN2I3y;{(*JqpO_Hu|%0-tX&aI+#N1wQF4c~OD0n`$C2xb7tP zX)*o#9(W+W$oG+t{+5>bKV9y;^UgqX{q@(!jP0!Y+-d!C-!~#B5BBl7?Nh4<(TVE* zer4ho{NY!<)~QUaf}sSEhVXje7{pZG!n-TJ{9WB}Rc8k)YhY^LgNV^PlLF?)oCC9I zWdS^miC?x?!q7&%&4JMNmVo)7+jC>A@_0MJ;h7E@)5?qG%Av%wkUc5@3sI&Cr%{>x zvkHJ2YJ3go#5vq9$cUw+P1v-_9|a&^4+O`SEhrJm`4V#ZHhgcw?FPwPM%agQCv_MC z8$SX&-D$UBawF6`xP-S29KTu?;{s1A9nJ#?1`RY|W#EJ~?MIG1s=)d3+SmMr^1XlY zFBP^3UUBm)%GFn2Rkm*5P7)~t!Xs^l{4rG-z^5>{XL3-40+$YHyI`L0&9hy=Cuq69 zo>c>`wKd;`LxaG6Y@^3Dnw6kHcKM_;9fdA}&C)$rBVVpFBDv?p;Yrrugk-h?vdOX#FL6^rI&fvU}JRtEY@8&T3I0I4aG1O^}F znY&sF1j>U}2;#nhC!_?hO2AtMkL&le7y-EWs0{|53{k<+nl8Ex8r|ohz%2SfLl`GE zZ*tHnw@6s?l|@eKYnETOtBv`@E_d%Ud&khRI)*!GWBQR}eHdAi(l?>*(~ z-}pxPlh1r6miNE#g)dB?ueQDx^eCCJ?Zm`%P|HRjNU(wCE)50i0Tg? zT}gd><3{$BPX{iqj=B24)Xqj)=SP*nJKGp;cH9_xE(#zE_$AGm)hC_l56sY8Lt7)j zmvSEfas|A8tuTA1al-$}2c8cciUKBOQ*IMP;4&WL3cw=7VhEj#*Dy?Q8i9Qm8unZ! znFHSk$Z<$ov^^SgxrT#4Xnx?ufX5wXxtJD)H|p$oL%15=mz~x`fp$1>7SeE7vswF% z-{%Fg9@utwX}Yv+c$TEAy7H-MEDg-;XcOKdU@7fsG4Tf9WH_d@S%8!zzFxPCWHwx&J%gDR zoj99`BLgPk6=o1MdKaZYy97Vv=d))2!|htyaiJA}%)HHmFxqSL<}DMs;q7H)fm1vi zSuiR9N%eEs?O{GIxzr_}b0kv(@sS|j0&q)_wiW(#27Vg8+Gg~r;Dzvkqdg2bJaxKI zy7LKlal76%g&+lW^4Em3ot-l440k2W{!ClLro$6Y!cc%bWSDV;WjtXOFEI>Ee$X1) z9@EvU#~wLKR9rChrZ=Jpyfp3?*uQUI*}i>8*|JTiz%dAJwOcKJWv&Q{Fz{AJB|i)m zL@7b|=XdQ<26*Fua|CQ1@Z~(V53qrc^h%pb2zWYlI436aoCI8Aj>YN}v{Rk1Apm>x z{J4NeD=;DK`9w0adY187m5Jqi!6xlU8^4Y=U7mrmYc%?U*4C{^$azZFQ9t(BGN8NG{7&p=MG0KQSkk^K1x}iI$^NblE=MIU@!eX|@9IQ3}DHx)SsERh26 zV6JP1 z_0k=)jA?_Gml{2>bQZM5g;o~Gv(49K>X_y<`ezl=GLo!&MVO4l`;lJ4hnX=X9A?`~ zoP_tc3S4F{`Fm@CJjl~_73R4uAQl;nvewz9aT@0fBh7fbJLO71JM<3r&K=uh@O@jK zTjl%en5(b3y1eSUUm0%_-14eh;#0*hdGU*NHLEUwiRCx}X%G*hJENqeb0X)~jTUfQ#d*YBWTC*;dz3hO>~9838Kd+@{-fE>7U+Xb951cm7w zb(XJCDdNW^^ba076#MyK`})`7KK|S8xI@=bABkkU^(~4kG~3^!_x9;a%(SqX#ZzQA zOA2d}xIV5(-r(@tI@C0 zjfX)M?l7es8bGHqfV&OHpUf1zHIBNZA`w9G=wK8#C;Tpp%i{q7kQpUuT~y+|Y5)w3 zJfM`pHVOBgJM^hm8MN%reD-tY_doH8@W1){-dtY&J-6u0z;~6GzwG7Z8Yu`@=?22f zcj)vu%?{c?-B${fd!&!dyZ8t|Xt58?5;Z5$i&hz^BuataIEYW{>NC8toq#gH>H*=; zblV857I5H@YoU3S4R;g(VmM3NohQSHYTW^0FXdCEZ-OBgXulO8zj7`t>1EhO^ zkp67p?Jm<@ z#61ZZ9nXpa(7fe^L;9NcI1A#Y`^nO?_nv;&k(G>m&F|FS^0Om$=1j&jNY2lU3cxby zRtMxV6E@%s^tK~8%8Vf!xdERz+YZ-uwh6!rIWphrGLxY@VXFubmV!LP!9kgA=Zv4U z=}uf`wB%)4xbrJDq9K@G;s&3~l**6?g3Iew1F$A8Y?Ogi2w=8XT(P^nKz9fbcgL4* zpX~c?)(2X?=M}FkZ+QLd%1dATk`NL%>C?qKcJ9!M!uIA>L*+?(QaWc(mSJjNY2pM+ zCE`^yb{%j-hM3vPj!MbmwM141PGCy`(2Oxw5(vXjc*0A7FNJ01j-O?EuFd7Zox+({SF`!f2rg`a?A6dFZWqGchn0_vnY!bm6anWrIc3_o^tWM#1ug|drVD6$g3S1V zi)WWl7p1WpO%ZTQ5Iz`UY*C*`-}E^>I_K#miGur)yLI zk`k+EFVs*p_(E|mUhRCVSlmfgSvGgZVOf&Nb>Z~Sn2~2krGq*SJQm{Aw;fb{Wx(*n z1Ml=H{3($?`CWTn2FXM{0kD85arxW!kCPAfIK`N?u&z@~v-ut9(wce%Z{G zSKo3=T=K%31vlMvQ@Q%8J%zUmuDa@~?tSr2NRmAQZKk59IO-Baq+FiSQQnT%+li3n z(i$p>2}^Y%T?k9r=|-u*gwR(of)r&S^8mg*m}uyQpR8PvH$om9Fy*scDe3CBxvL{RVX@-9^g#4d=@r&h7 zZSmZ8$Ct~glX`7aX4kIW+S1up_U}KSqOydZuk49FJ(Gv;=r?4fe7mZku)D$$+6ivM zb)XSXI{R%K54h6r^q$E(Js~#q?@UifO&30SYhI4ea^lPK^vTKd9ER?1X9 z99~)?j6f#c^<;9%{4kQvocq0H3cA_8{DxOqG@-_&}$@d~<0h9H# zZ{?m8Jq%?|ryOiqOqqV6+CJQZdilPCMUlW@NvV1I$tTNWk3SZ-pdC4KU-|a8zg@ob z(1T$k^zYD@_QHrRyCv}VUcD#w)6a^|j4>a^)z-?CNqS@FuMb2xWAp4;2=2aQ0iJNi z0UQOkEmzy!BW|I-K7^g+AEwRzRblB2{QCW_#xKn^DgcYpsSaQoW!Nx_CHHba9R>kU=P|xK z@JBoYodYB1dRKIqcV#e(m0)G!&791HX451YR29I~y;U3#^5C&hhS6FHsKVbJJpE}$ zez9@@ElDHH6Px-Dg?zSKGH}HUCK7hA45oI_n%-y1$?oze=)FyE3b2Iifv3BH^k%{P z-v5g|0<)idVE+MqwCKgLI`Bf>2ft^}o^rk39lv((wXw$=uLkMeV0oODYId{Q*|h9s z(Usd_oQufv44|qPkmVZ6v;-rnEdtfWcUCa6ST#_gLWxmw3Hei;uGYa=Zqa*CGy8jw z94YrdaDTkYdFbxLn&E##@8;iIzJ2IUy|U-oJsGq5vhRj{u}Watd1dFg&Uf^UiBQMQ z(BDFPjAkF7pJzKs+br}M{fq;fH1>zf0bRV~P(C=dO&Txj8V9fOp>TTq``vDofS?aa zWfDJb`leSRB1X9Su!N3gbtqtdLz}?Y>DcZAwC@@9Ww)Ux6!lEU^2+9IO5-LaxcOn| z=kzJ^#k74U0+#U@6@VoW3j({*7vHCE(J}kr6(V;MYyP~lkxPKMGcFsmP2ajLkZ5$9 zXVd73<3ib{Pc2)Ex0ciKFf|K&py)D_;d}*h|Ni~Hdq4y7)TtACwd~RI$v^yL{J?~{ zUauM+kdWFZ`^qb?jO&VTe9?`ug}^F9{;tsMb-nI)2-B6_p62N)sEFMxB$xjikPG5m zDE|TSIIILLuh@k>07!4pRkB_em^}XIBjpLr>K}jniSqQ*y01ZZ=-+kcUFC>`{&yt& z5%h=exmz>*J2SNuugii?dv@qD=;FFRoh%;^$j zJuU2sH*AJOCAcB=voH>i!l*BU4Pj%!OnZ374xS`M3VO$Z*D$0vjv7Wfa2a3t0tPtp zONa<_v3%W0kBzvIhaD!2a8t%0X~ z-1O3$$_>|FU-n+RH)gWCyX$3lYU^Rwu3e!paHTQZL#z^Umpqpp#r2`QI;u;ly6)AY zT{ZV<&D>9`U;C=+GoHnZ@o_yar|*v*eWX14=&^E4*EK(_*YJ)VJ64Y9wYvv&r#@RM zci(eQc|!Lzv}W73?Yf&`dpWTGfN02JJ!a8R*RAuxQb<5wJ*fk`n>R0gwZ{Fse*6hMOylx&oFfC*h;8QS zI@6h_jpJa7hGn26Ja#gUUB~PhN<^ZHtd;2{o`>O{~@`L={M8NZPF{2 zyUR{p!gPfcoy-SV%FI~f!WC&3Gm={{(`HU*zuO$}Hs1bty1U3}ChoMfD~2>q7nLNW z^OFzn>F2DAvTfW5G9xse#Nl-G0So@j)HcjJAiKh1fnUH8KK&rv%4Wt{Ags;tpJjZm z+VFi(MBI+Fb1HPS3vMQQX^<7%+Uu|SoqHvKzQLri<@MkJC%7?;jZ`f0)AuqC|8mW! z04#xGIpA{evIM+gL)H9dqnJIQlc~&3Gdq-gnNg+5Tf@@7R&DAU%&imZ{c@G?$#!<@&F2e%jcyBuhQ-{wt3|bge zCQKheFrX-=0E+~A&~|4})>R|=kFe{ftD&_QeC;*cVi3DtA1D- zPA!uoY!^3k<+|&y1Cf@;=XLkNwsNH|xrtNyCd(oy=3}P*_!Cbk3H6>U-_c3?Q^$4P z@gio2?o42X3r2aF6q4=Q`dA+`7}2V$Aa&wL9Zf5kX)0?AW#DoUn@g@amOx8;CH)eE z{VD7Tt!)^-@H(EjnjUw;g4b<+IxZe^`%>;?ya}5)Na`|zqvCO%#@)}0m|4bUq8|(o z4Awknr5nRmiUQde@*W3-HGMhz0>V1OvJ41p`ir-GGt{=ny3Y%+vemXT5Nvg&f`OmB zS_OglXVVu(1pulp!LXMD;j_VLR1R}3WMF{&a=#cj20eI|XIS#ol8_o6Lt`%=$MSN# zkkDpyW`fXe+BnYPDeUp3@{lPU2R;jC)6Oq)Y!u?kICQI_ z1T2CRhU31#hpD_W0ds%?XBsA<8hJLZ8G2+8IprhEfj?>Ixcp{C(qZpaFNkdoQlJ#X zseQRqi2F;A_<=B9(@aa@5@7R#Tl<{LtY0U{Le17vgCn>O#BaV0ZeQ<<@dr2~jEq)%ue^OM7Z(*%mx~?Vn;=5wT)O zzG=V(b4UXmeX&Ah%)+)x+R?}`&?T1SCrM0~iFe74S_;bPaytxv4KqUg)YajciQ!#E z+^w)TtlJ8A73jbXVbkB*cV zG&gMKK^wuuvkeo|&`$VaII9fpelqRNjBg?MVfxX(aulF1AoxA*J&UJ(JSM$wPdmZC znJBdVe6do|pWq$XX;?jAiy#fS+pU2NU#>kW0L!2lGcq*(6v`IRCp5@6Pa1w2T{{Dr zj$J4O!BXEMFqAvRbEnCYkqre_rHPp^ehc*)!+^5zu7b`&28}w?Ss4I-%`4%thw%vI zc69(;h6lHu;GPdf41p2bGXY`&4Fh0?;B=nFd$#C(Z`Z(i_i7W;$3h((E-!F?1q}v3 zdHwSev-5EsT3lU`yYjX%=jV>1k#mxDf@UfpVk#W*SywAE0JuE@RF8xKziFRsWjxNK zk2A}%)HvWg4ySP%M~zRv%a>)rXXSgN#-&%}s0Zy2Ofr7(yM7f!?Iw5_kHat(|mPKAtQaw%x8Tn9^TirsLWihw#wNc+w7Eq6_@3;7?ot z7)Ye-Obs)x#NCf){6kyzVxd3Fwm$GEOz+V!k`fz?0vSx*En zOkWrk0MmKNPZ|jA3zJGfYU|lBbcXXWbS4^{rJlBvph-H<^F(|;g}F#+pk1B8R|Z&% z)6&4g9)_GWuW2(yDg^1rHV)Ep`yhVYHQZ@D>+fI{EBQNt%QzH2gaPfAN(0OOtlrUX z2pE@-Sz^sMiV%6mqr+Qa5iInpJQbXbfpZ34`U98KQu3imdJMx?*6;dd9<>Y^UIpNE zoKp?Mr~QeGHn-arZs?JDoC}V$lTvo>Nk9`B01DNKbW%SN09zt0X3p6QrXETvz8BTcP+ zhAiDC??ja}StzyRhp|axhgX;^Ri$AEF+niQFKLi)#1CN!A)8iJ8uH`A}KEmI(^0IIx+AO9{Iyx%PK`sLS=n#*`LzPHd)_{ zZADs!E!D2&916;%V5m8_cwDbGF5R|)orZUQHN3*A1tx{5OZo&QUhq|z{#XR2!bPgi zTk|3mQ{lkj8$JEDhvO{-82|h@qd}Vk+s_l|+TQh`Xkx+kN{{dOkVrcOiU65g=!vym4=3!`Ax&##@aESB#179T9Ra_Ff3LIVh4fJt!R+F4@GmeWp! zAmOXO3M|GdKk&5UmOuRTyJzY2tLG$<-ULrci&<@v}Q}GlH)DJC7{q+2XBk z<4%~GX4=)3GnaW8|Ff9C&+}yaP2&K09oPwTw+PwN@>*qNQ z*J4iCwA;AWJzYj(X*ZZZV|Z!f-+0{KwD~yxTPk15?qOe`KcpO(EeqPd;IU7CfDf#+ z85MvFOko<$4aX}YX8LY)Gicm&ko++V8fW_#rV;wgKLvUfw*6d&jNY@#6f7-lT^%4z zi!W!Qh9>_Ci%{_1A8BZJFY}Y$e&^+Kkku3ZJk&$Vv3X(MHd7_scjFWD>a0_@_PV z*aw_?dc|lQ{}b{(rySWAPz;B%0A7&&$}3?Pr!R~OzzTLb2DT;yqq#^FumGrxzAsdV zg)&@UXrw^0FhyXu!Ukave2drVoeptrV`ksSO-#lc%J?&!^3<{igjOI1Ax=2+>DhyE z_VbwuJ~L3|COjTX#R2fFQdWjHp@UF@H5p->ZURI8Gx2rd%4(R~($WUvnU7kYnbAuQ z9LN8XN%fouT&sOyQ~;jyU2m*lQXm<-1vX-1F`<^C#js94ordr#yvZ%o;jZwlU>YhD zkxI!tOKeUGE4eZ71aFI*RIN!EW}6OY6|r5FXrUK#Q{Kemx|4V2v1sa0jw%#1s!9Oi z9LzsgZJZW}*-%N(v@85l%jguw-!EInjP^)@=Q0IG1>m{dx?|mDQXmz96f72Uoy44( zg1{6)X%kk{^o0;{7=+$(;FY2UH;Tx)k0+2%J#s~YeDl0QpcvwuO1W@AEl(mzd*L)0 zQ`0)6DiH~>kX`c_;>Z+)({7Hh@Lf&`wtx-%P~Z=7ERb{z9x3n~qQIyCJck-{tjhUO zU?@bErVt=}77`k>6@ytq+K8u92!d%*Z z`i0?U)y>;AHKvcNhL5h10?!``j0(W>r>)1DE|CHjEEW(|8Nh#T0bJ1!g^Sarz-onl zhSjvpY=`OF*yXyHTIPlDo=;h3rsEuGJa-1#S)zXCYN)s7PJloJVvc1x5;p0;2*jc7u@u7m)%X0H>s#-^Mg`z`-TY(a*D3{O3Ct-yVXYQk<+_y0x`xR(7Hy=! zic+9EZ@i*;jL1g{j1(9tFj8Qoz(|2LMuAZQSYr(`7H6cuNP&?8BLzkZtOf=CKX{a% UcbVVLaR2}S07*qoM6N<$f_#a4DgXcg diff --git a/osu.iOS/iTunesArtwork@2x b/osu.iOS/iTunesArtwork@2x deleted file mode 100644 index 0e8bb029bc964d313c07fea891a1fcfa1b10e139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350640 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

    =a18LszGNEXou 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%0DxLS1R|I-4EW(y9`kj-B zP{JvlOazjHoX32~Ll8fR`5d!Ia9aPZAww7S`*H=lwIy{E_0_iL*UV=pgqUA)Z*ss4 ziSwHfP$fT7YCZ3B3n>VT)#a(nS}YF$-a10Vc1&vDSs>2Q zmNqPqaz5g)F2gb~P6pYbsU2cjH}(f2ucvL=$K6}bmOVM++D;+z{C*oat@PtPe)XtuD+SxZtJHJ&Vy7K8GGO^9*nse@x|y03IlA{QWI++fMNJ|0gW zI*d7H^f*zyMz8qJhS)obcyXu0^)2*u@weA{qEz^JKZP@IiPR#P2Vl_<;rI>z@`>>n zx8WuQoI#|ggbo#WI=%c7Q{ibnSOxYRb@2C@SkRVV*6gD*2d!wKGKZulF!!V5_u2o9 zy5_6*aR`bel!jb^sSSHH*b@wZOTVQoer=i@yMhmhyye%#{11nuLJS z`i~FIgK~n&{pOc9g?`tqM;lo+T^A*#jqHUcD^YP;wWGQYsDvah6o4+N=UyAqay#<0 zvM7tM6KY@4_W}^ul6IWCv}=y4G$(rPvE5*xBCe+!rP<(z@np63yg)cA#^5JQ+D{-w zwjQxTIbzSrVhvMBaz;^#Oi$q(`TC1vkRexp=yOpA{OiY>e>ys;_wa^_oHC3$V6acCo4G~^RM1&ca2hPM+R3c%qj zQ?bXf(l)x}dltDnOwQv^d>>7Pi3i8w&_Z8-RUHRM1?~60tyV@*I-Gpidks!S zl&Z7WriU(NZq|SC*>*%XVJc{bG0Z#Q>K7l&1ALpm`N%bm}Ca^uL; zK`j9tl>%b^gB^yfcm!8WrdJcw70R(hMc3J7#;%|+I&z=tFcVt&y ztUYqa@VosKAD9}I@Xo^rj)hM6efy|Ld89Uz02@Gr-U4=cSNr)}xP}>RRd+Zs?$t}O z%EGpj(eF(I4|3ygF67|0?ee3+(DC4v4xj-Ja`R@gZ!^IY32$!jlNtQz2E@!cY-^0jLgH3Bo z(0Ct;R*r8SsoELRl@&ikj={_BN2TVf$$%(rS8w(zmls0rR$1sW<*}pQ`{fez^po=}q zmR%JsFWsn8*<*%z!|Ufye-TDM5c`rmxX-!y=maGFjdo1o&xrgQ&1j@(8sU}h49^9&$%GHZ6mH37mf+WB637n3cq$JM_~8@+>F*n8wZRKPhKZ=l2CeRYB z??~{!(Pb1$be^V#5jTM#AGdPP=DdjSLG)bg0s_SStHWGH374^KTr9&uDIlJ1G>$8{J#aRkNZ&@ zcfEiVd=9W8RV0x<^NMqJ^||Z5yLjYj*TP#N9A-YgtiIcgB?;$bKH0)$fn&X0MW9(D zP3r#0L-1}J)7)m<^p2dUBym#cn-rb!fE#p+uV{5LUjlXC{Qru)2!?y9@pGfJ@xI5qQ~;}5A|s=w)0(qXIg|3 zzoQO)DZ-@ZjAlH;k?+H7IS{>1mN75-y*54K#UH#s$8>!ABX$3KyWXr(1S91GDj=AR z>VXf7`O;x{&PW-Jk5ZF>%#_)Fqdz<}kT$#Kd7}Yhj(pTLv1&~%98OT*3XW?%!3$OJshagw>dDv2@_EX--FAxCQd!Q^gw8g9=j6Q) z-P*?00L3az0^wyLF#Rc*&wNzH7!Z#WNl1c=tRBI{8;)G-5^v=Y9Wg{HM*Zom zD2$mUKgFT&o01k1^$q_RybhnD(AryjhFG$RVVK3|{KdoTqL1O=^Z^gasM2YxNB(xT z=?nSW;4BHCV>k-Q-+LKK9GF807J8RgR5!JM&UEdIPmTX<;oo5j5!xidmE1+s`87c& zR6K=B!)W51KmP0&-LXh_&a`Ga0dIH8b=`ViY~JYV^mA9hDF$$Ef**G0uS@zQesrg3 z$e|eB5JQwOk2T+xkhp$oE+P3NJgoNf=|FFy3|@~ozulL!*BCJDGa_I;gl^_Kb2{#m zu{T_woHLtT))|Hc8k?`%cms826o^Ao7$g>26hZBQQdD{GSf;%&&eHmX^t?#!pgYjO z{1VDFB8jQ<_tp-myo+zY-qg&L@l*^-9?yA6E+Yw<>5+>%bf_v@Gdo^Zk7hew!+Hiz z!p@=#pm9wo>~r>i2RJ(m==y&cq~HN`g;UUD-Lg|~bhI}b$pzMnE7H%f-G8Mx=gr{X zC=8u=mmd-K#EM+?A%#w#h{C)VH6m_$Z*m4}Or?Tqmnkr$I`N3GO`H7hsr;oQZ28Pkl^ISmW<6H)=4@~( zP#gY3zXtU1&N-`>&U`h z^Ul9@rW=E39Xe!g=KSlau0j4W?jQPpDgOm}!*?wINMpnhAp0M8)1feo#A(rP_5Kj! z-)-l;ULU;3v%_4)omN@r#f!pCx(DvEK+MAqzJO1Bu1mDXzl54O!KLG2`~ic42^`?OJV4-6ERMFgSvcc5}q94<~WgkANc;!Ii;`lj(4{7n54eLdKhKxPe!&rE^cy9pTHlRG>Q zYqQd8>as-+BlWVR(UwB)Pj9wO-hMk8)vdH(+4Mf0T-s`VG>Rf5p~dL&@~USv%Ki6; zbwqqzv~R;I_k)V~h?2DCa`s{||M0&~X^Ze^g!hxe;I&Wtv!|Me6Pb%Zb}d|_pN!;006EAYD4-p)iE2HN(tPhpe^>G(0I8q4@3?>Lj1Guk4wUs)QCL zx^&30xd`JwSH-4sIuE{s7pej8k=S`-zu&1S1v1gnD4`96k7m$4w&ivAR1ztjj(!u@+^nsDF`K(~~HHpisH5Kqk^tqo(PH>+lB;qhOCXt^Wnyux&Q5z@zx797&+_!(SVqq3&b+jnhy*q)IiX{a_L9 zIvN9Ll&e#YQx7`di?n@b%Pn~vhss ztE3+y0CsZ0hB6ySiGQA6^A=O@$s+wuF*5)}fsD}}C=&Se@m%{MtqbRGqCRi=SWz;9 zTEy2jg`gl30Ip!bvdE^ZM;)ku@V$c=cTG1VVcn?WiVSc|@p@|4XJShG!dg~Z{t6FO z0a5zl425-pRThvp!gXFY`MD8W(-n6+b@{x@;~%A$=IM80Vq)db_C1q}`eQ-*)Tik((5O29k2`3%oA`t$&AO z69Z|BJG)3sDvBCjBIuGe0V6Nesc?rxu1(%?LK?4yRN?A}(|U{?u#Q|hQ9*|yBI4s~IXKBk-jml^JVGip_ zpacGMh!3p*#q~JTUv?|rCv0)=jtRWR$j50$WS*I{ZCkP z!-r-+Kb}4!u9&G@*n<5lnjQk5H_%eJ{_>qGyEZ468JK}YAyjBU2lAiQcdmnr@Hk8EudHaYoTfJQ!-|Lot!Kn zIZ;WH^R6&_b@s9;4Y^xtbQ`{_wxUAvbMfg_{q2o()Qi{`wDZ`TzfI%|0(QOkOL2-m@-EILvnSF`q@hUR z>^g0Be7PYgPHWK%puXt-ouvA70O%3_s4-WRv9?{3)oZJ$fM)zDudtCH;}|qevYC6WRmS(Xc8*J?#Z!4nH%isjsxm_Y%|#4=cnbi{Fi~Q4G4sd)LMQ`( z9a(qQ6?xh=JgHhmRi(8w*Sjyrdxyd6ze#M5cnFuX`{-1=Si-v!a-0REVg4t^n>!5_ z3c19!je2E=KaX`gMYrQxX*59j{Ye1+Sqkxi4?HbvUednYe#U-508@wuTO-*Njz`%B zJK9uW=fj7Ey}<620=<4}ph07~s3fvvqkeOBDcb^=Nz_euH=XbXzVrKWogh5E!5gk} z#B?YA9<*~^upDw1a#=@ohZUlSs*n*xfE+r&qHx)*UM8yVvA|jL^RfHK{ht_bkF3dm z2C0VJB(|4LCBTX`oXGS0Foc4H& z?PppzlmH{JUGiXh8D)#S2A+cv6gMjtDXU;TF z!9QCi06;8qC#?8YC=~>6`_1YhFhJ=Nh>%YIy)C$noGhS++OShjTAZs({T- z-(AaQu2Mefg8a9B3N8SzoLb92QW-m~3A+#x1Z^JeV*|JWhEbrytMw)v>8ueI0}4NE zGl1_QGr-7`r{TnX5f+6%akTgn***AR6pR=t7g&Aq`#aHNaIX78G&=$29*VIxu-G39 z^_~*Dw9j?)kb(ZY?3}j2xml-z<$~}3CZBjTO^{gfN9fo_>M^psj19Hk_gEg(&ALbq zO$=s#=KVEN6tYT;+y5D;=I3Z&*a?}=$GK_Ac2galk52KC0d~CYDm-T1k>Vpbet4E1 zbuDr163<;hNA`6DTyf&n1gOIVLhOir7IPJXChK0j54uax5K`dz@=lJW@2n%ZdzQD8 zpH)|gb5-F>k zztqaM5w8#Ann)$fH|o8Lg#?nXT0c_%wPra&l`Nr4X{>4F`3GIsPeHR08v`$zvS2bC zR%v!WS)i_riHNA5yuF}iz6hZStJ#!a-#opN1Kh~oP@G$j924L%@)DmNe1@-7)Z?uM z2;%q*v@od3^0IEEhcwlGIGhkDm`X!vL39O}A;~xWwCRF}Tg=$%l6WqiEiEEctq03`|hat zo|CTx?Dw{TaHWCvL;Z-m$*8Msec3>A5a~974PKXR$T*zy`#HRV$;d_N)*Bum<;}qw zIz!-TE`6(J|Hi;u5Mv&;nVMRO+j9*gc*uJXIBJaPZF=i>#Yk2#E}hIEyb)b)VV(kU zF{WIKWnQ(i_nSQC&9}<@NRc&W(UY}4HjkALa?qq1A=A`1x0M1O6WUn%v$bD*n3-vU zChz^1fpIC3IDCs!jw^jzMLfrF9u%&R8aW|z+Xt1MEj2-I$EXwBk+3sIq=5-pkfL>* zM&$zY8GKp?#HWFsVF#W1l@;6MkRjd5OZh*6+Q+|vkn|YG)eqOy7(6Hdk)xB~zL*`z zIxz4NAgh*$m*Qx9)ZIHMhp4DN&HiQKeg z(b3y5dqYhTT0-ZFXTH=`xfg$aLs@)bLbSgwja23{%2YXb>ky?+^(*$!$S;pY1wV2p+O}CLL|g$VSC#`Bf7g5TlGz@DFi1 z@doCU=w&YWrR+{rjoF>mm<)ACdaqrt)P=#a-31etWp<+n zTzM>uI;QU|6)brvV0;NDrH-8bvO95b0ak7AWqQk!LMS z(DzC(ha&lm&>-!|sOz*G+)^7h5coYg!q|aUccsQ= zn_C8$KV@qxbzb6$q^sc=5?5@dAQ>?PTl^~mXtpURD2HAFtJt2r8GMG4TKbV zc~5lC{|rp*HHbrQ^#Bw+7QDT(!_Ty^(oSBzBA)r3P>J)Vr{oZdvOcPXRC+PrQC0D- z_oDUqfUz)F>d7daI$z3#{jc&>s$)Hwq{;Dv$|g%bB63-Ndv%KH=0e-TvT*NdW9BHP zneQ%U{_-7qTj97D%~m}|%nU1T{z5uT9RvCsORHZpJSsSAe(cipPRNE`)7)u#d*Db8 z<1PWA=_1eaho%KR4u`6ZO;~B3G`cim(c!sSiCgvh&}>3JDDfAB8V7mWS6Wg+ z2H@{9@hL8vFa;LI!h_IanQ~Z1IEr(&?je_mrN60O)FbzBzHzzff9`RB=)Kq^7wpqJFfMB&V z%u7l~{+9CGz2bLiz2xzJia=;{%e?yWqSd!r*=x#uI1}zi&u{ja4mCCN6e#g4EiG^R z+wsr3=J7#({gR1Rkx(Ww1zSM_-?=7^86OEhQksq@Q6AKk&%u!4`CQUyactlQemr;D zn6O(qc&TxdXs<6fhNctY$_TOjqzC?@Ki#Rkm}xCvdw^N@aBPV80TRx18h`!bkzIqo zb?!ZNoAqj1Ep(C2V=6L0dZnc@!JzR0%zO1f+IRMIFO~Lg@cPVx`gg_IK+hKyqFq9DkI7IF-Gtt67Po(Yd z0N5zy`qQp>s9^p~pEBk)v<8En5X|k3c2qu(z4ay*2c*wO>5j${ZSVz-3@F?`@^YJ}6!6R(P?71rkP5 z2$K^Uaxn=rzVb2(bS~|N4|-6s)S}4-C;a$G<6ezXlZ}Qq`)1w~6Y6eBxv^qNKo<1i z1pD(&AD2rVgjo4vkT29U9me|!#Xb>*;ydz`Hf(9V?HfFCOA>=b*9x?3HvYaJa^5zz z*&<)(cn7Tyu4_jR)Pyw>ZQJPFNKzt5B^t?;O@|{3?|TyS-t%z&fy0~PklyY#nJ%8L zylMP2hsd-sX484_h01G zG1phcOBGz_y=9)6rmlAqUyb3{;3T_oOsO!51d8HAPIzN0yh0#Od0~2okLv^*Y1aFva-Q^_fR4VOa}>86(gT+2iiw``lWN>!VYl#K&$ zFX3ti4kSGMLCcRc3Cx2eNgY6wD?I}63_taL!Z}7^fDLbAM=Aw<4^8H1czXZjLlZLm zb)u%r)vrD3j+DtcB#aUV!p<1NFe9t~CMnfrYqhS;yD0d(7f&wySa29vyAbzq3HGFh z{q?Gz*o4=Gx|FBwmK1P7DAfJr0Jl3Dv$cG9r8dA|99l)P8@h`eMMf z=^AY`Hk%-ayXbJCFnO*N89RM!IShz8`$9*O+aBdL_y>{$epcXi3PN8cUi`Av)dct^ zHr+=P>?wsmHcsvX6q)|BfqdX~m&+;kJRabA+12jsN?R-t6h9-VaH@;d+qWL9fzI#@ z@LI{S=^Y=B^=bJov~*cPt%fww$A68XJFCiW#{{4_N5*ZfNdM5j<$oV5EF`oz=4hsU zkl6{}W^q}2$F>e(F1OP}u!4NR*5G;~f{6xp&=Wj1mO3CU7lV$5_yIKl4;E4p;MTp^4?B>J~4t`SV zp^&M(!)dGM(!t-anJbtO8x&mGT>Z1h)dk&UYwk{7UPBCgGCBC0X>Ur!A|v#{&uVK? zeL)Pv=o@_R$FM|{M#CULSX|VN@&RwAI>Gg$Ny_^d+{RJwN@LrO!!%rOB+!3g|A5kw z*g$UK?UJQu@HfNF`ON&fL|o~#9R7=6S5gLuSlgK9@-X?SadUO2l5e!{| z?;3R{qB_ern&$%+R4}wE-=v88=STO)X%tVR0@XyAQ1jnb} z@DT#v!$#wvdlcshlc7NIoY!t6+0%E{(IU{iopJ)HnXcpC7SD#H%orqq zC-B)n`9G|{B#|wJkep)c;@i-zK`!+mAOJbg{XjQS4vVH{ zEzZZs{SQxo8G)%lnXv_k4htKxz1v>xwfp5v>2czy+co?ZHN-KB8IA<+$D~n#)07!2 zw*7D)Jtm|JdA*j8}dVewc`{cH5;M946(|kItH|e&q)hd8 z47}H{_WszsW|+m)CCgm&asNrz58j=GIbP~$r-j&>rLPNUoEi>>7l*wAfyR4O+){^| zOtHpEV(V08rGnt@m(K=XFI%v~)%b&lxrT>pe}L{maEVZ2Q$8=nCScPWG@V!M zaEv@e#-|LN$2j;xN&?aE7NZy1jOa19Pi zkPA~D2k_kKAalQsyn*|qfHM5-Tye3>z{iQ24fq2Xc6o8Fm4m`4WuCVH^851mISes% z84ntq{tx56>P{NfieOtm{o%-zq?F(xF>lRkUkM8G(3PizL3-q~r0sZF@$ zbvkCQjPhfvy#kY#a7`X;@t%6}VpX6L(+vZpheXew{hPUz@|;NM>puL!ORWRB-qt~p z@7Ij@L>5YXrs5BmUs+udJq$hr^XKM94fE|0PNA2Ops*nT0z)EP?;~Y~*t@m`9-HjL zfUEW>SH<;Tkh3u%U~8TEW^quS&X4`%4naUSlRv}W zsJ|?zS!uT8wAcP3|3*Vv@kzKh?q1RckOJM;O#^3V3RhwNr(+(E?M~pm#ia$}V%@53 zzi&6bhbQ^GZb|xV8G{|SYZL2S|7jMs^KB!H7)M*t<_b}Zs%(I8i16+*bTU z1k*{#if8}6ySh>4QdbmUMBPx<$797JDI-E0uVOCpo=N2n{T>#G&1SwiV=ePUCD?0& zoi%HbaNT$%3z>cE&s<-Z?X&8Tk(B|(6f>3l6L8Ie&zZl2RuTYpdH<^HI%9me@LVF2 zP|pQ??McOy(njI?0ofX0^46B<(jnNUWEy5#MY*!`as;c1$m9~U7S^oCCtG^+U-%Hm z>=@xArrHDLwYj`SeZO0+^|VwWh8*x->xg|c``qDrozxCKiW3$SoNhs;ws}wlnW1hH| z|Mp%%gFkeRNDzy)0QRF-iG0gPBpSfG!5+xSEV<g6*0OlhYr{;xBZ3r&&%$fIy~g8w3-4i2v5S{`_y!w1@Q`UaYzPCUOj+8c zk=umElr5YO+6wWAQYc9N9faD=(%-ff&$^Ps-#9-ll5kwU2qPKp7h(UEd$u4je0T5Q{@CVhP z+Cxw7 zC28;1;vwcEagi#4`g=VF!SeL@fULEz_6A0PKuRI5?VCR$-{?fb9AxaG*fgKBhYNp- z016EUxmv+SpMf6p#)*o}sqnYzxVbb`AjbUoyG5jsOi6YCsE@3H9rbV%(T=7E%1|h>z1+ zZ+p+Yfw*0E{eX&JO`4f31oJ3Ek~$V8L<67s<-@;xLP?nVXkTS(T20&;>KIUJ4h{6* z5lTv)>#gS@kBNY|a?}95*f}8+*K(JZX&MU?UN^D^mKtkP>jm=fpJVo&r44e}- z9mY^req7}z{Sn9Z79}|;wN{nXY$GCSe-NL5+%aXS!+Op8YoK`d>tlWZ<4Avq)T3JW ztJ=l!x@k9;rNB3rH@P%GNZ~qfV0;d}C-ky;z_{S4{>2F+Fb1);X7r%@_7cbN2=&~h zZlr$u3gObJYCVqTGL$P;-u&EZWd7Q(rpmz5R zKh`tQwehI7zhpTv;@PXQfnl<8*ph(?x@C|#5Pm0LaYSIByfNK3#Xw2lQko3>j^xFw zJ#BF3!x4hg+ZBnfO+$Hh-VT0g2Rj=FJhYyXRgijy%p4Hbek6pLJlDk-H|63}Zvwa~ z$ISs(c`TT@b4$yYVA%e00Bp3>(MjjCn6H9hU$AvA{Kxfz;K7!}e4a+K2%dz)z4%A< zMuz-bD9_Ri41QddVUW?`+iCm~22!y?%21NhKUqdYPKyPSFGl_`^n5PpfCQm)^|+@T z`3QV=p*U9th?cYBAV9j_3#%N}vuqieDC)*lE_ zL$BE9lKJb!I>H}`FeOS6mbG`sl|8n;m^WYv?n*;~qXUK4)`X~_xyVTCNpd|FEF%ob zJAaR=2LKW?zuX6w(GpP7J|AJBo-o~BueH-z_4_{W%E-XFk3QsPXMFvWj(Jv7pne)m z%KKCIdAM@n{Ty))M)oxmdJSPf@bn5P)#xkP+u7@-Nb;%pHBhn~gt*8NL;ui^jrYZJ z;YToAALLp}sF4U>^Aqw}xN9CW76`$!4=a+&RnY0sS`_NPcWqoJHG| zO@a?i`?u_{cl~&99A0AMcPi-pZ=5q7X_$2jp0vNQ;%zkus6raZjv|(hD$xrF^ERY7 zr~Z!F^VMtbpC#YeDW;5i{y42lP>>=But)T4&ye8teZ`IkIjPRLfD+pDevN{F9f7B} z{y*Jx0fxPT-H+l`Ux;NIm$cy=PsZgaQI^FW#{R7RF@b%$yW3y|+>97i%hrY-a3m@> zntR}EA{gw;tdvjkIVM9o%~|gQN(9iv2yh*Ve?UyFSV4-Y!o8nyt!=*1MLwMU{USqs zL-`|a3jAlGc)cqp)d)aBq^N|M_GiN6qsjoYcWou$b|V2rl9~;U1XminYYcwTuD;zm zkp>JRI@e&LjLU8cuX|RRBjd2+y4R#VMyz1=iJh<5CI0$^acWQfj zR8+4NBH4&%W}4*Lb!o}@zYY*S$F)Lm?3#}I$H`zD&p$Z5(yV;Gzo{ZZ%4G%ZpM-35;tru`Jdi4yBrMq7qZDz$^?1{s-S8)hI zMcZQeB;q@MzMyTOM8meOd~R3Kl@&c#f)x%AQWScI&Ach~KajBLXoZ#FQ+{b`1gBEm z1`lsH8>Wjz8D-WYO_#?HZN7`Im&gzS?Iql4LA0ZHG!MBoc9-z+CgR^}RpxmeE;-=m z85tZSA}PkY=QOj(oaA?ayps1m06A`e^i&iFU>Di>q|fp(mRRLFBW?EMXC(0*D6-KQkvWhudekO;`hdx!Jmh{rG5^p(K55 zasZ~Z6xu*$T@!o-Wu<>@R4^o^G_QcW?8A|aHo@*WaPPxau>bZWa1d>jRd}6^2yyW% znbNNzli#UfeXPS0w49KE=?Z+B@?Iz}v1COhTM8vtLKqN~71V5LS^|9JeO~4VB-?TC zhoL}P&}e8>@iH12o4V1M|2iPP443b_rcD22Qbl^I?*PEcahR-$6i9#%0^d&ijFz;T zN0f+;OxG^iIIz3a*#R9uSNyukhr^Qg0BG9l`BL{{+6j>x1=Sa7SuN3Ll-t8EE&K6v ztJdhpCa$uH@jADt(J^#-q4NsIu_psX7qNg_K9^~2r-ow!#_ms&`=?WZ2aey`b{Cfj z^M9?eW3o$bV~d>-vcXjf%}Ap85-vYOel;-`;BW)(vZ_IKs((FxL*-;(V0O%so6s+u zC?p{d1(%YUV9<1|kD(s@)V3h&Pr{$A44JT#Mh>IQjp?87J$*Qqj z$j6=}UFGPS(=soO)7oF`9|7~E_h1U{8N}RfkD0u@wn;AxG(l#Q_&_%)BLHd?Vr>-x zkb6FQhEw}q`h44htBD&IhlVrq&o4wHLGUK@@YHGJ@K9T)dCc!)pjdvyfI$Bv8t98G z9W%8Umg+*l0a%yCqAUMa;nsAg)PaQKg}A>66zK1L=4jNtgN=>tdtNtGkfJAiuYxy< z1ZBij5X(C7SkF-)vA;KljsVnpC_0k|)#Tuf-QdCz__KDmMdD5y1xP|W;U|t|GGm?V zKeS?AR74LoKW2EqPW{DdR>&hjp_4@71KN6}QMQ^^mctAez58*M?Ul|krFSg{2{Oz8 z&Dfl~S7(u7SYXITCLLci@4R08Z@w7k9Q`B2k@Ox zxEtKO$ZdCnmI!|mNqPq%R!cP_qK8egFp7MD1hF?(_t-t_sqeqaLVDjc+{-7WAry=# zLg24{&Y4*+Ts({Z!VdfB`)PPA6MeDA6>8ni&DG!B49K&piCA#>am0{LdH@o@(Sc}@ zsU9V6gY%`PsO-QA%g05Pi$_N)4#IRqYT1E978%vPku4c%ni z^V3fTuAP(iX?N_I-wxvZdR{MeiU9%0nq1kM=zaTtU>jp?;2?r83O^_PB(!qR09$}v;{Iu zSB+h`x+`1B9%q{925`La2|9Fg_Z~~Dx?dhMc1_6aP~7UoNXF70{=DsNK||X8uj?3l ztHU9kh2j(|z1QFqLLOHX7cG2BGio3&ppGyW=YME8%de&%hYf$Wu}KW18I6E|f-q9L z1f&E7=^BkRNQ%M;kq!Ytx=|XwbdF9b>F$#5-gAC0osiFdUV^Df$z2wddBruFS!v6d}8r#egwy3Uf%jHOS zy)tfNmyE^cEuxDHvd*HKnMFT1SauL_d@lqgcaBvuFCJT};wd7lSamsLTyp7vD!vA( z%q~fIjQaK7XT*VIlb^vdH7{y^9*Juz%5GSqr0H0-;G7RMfqk9B<0b2Bd}TgOO@p$p z^gxhj@Fc!x#y|2O-q##`gu^iO;0(OKdLM6+JPW)n_`Z9CuCA?<`P#+Scv169>pRJa z2QTN%gWty#aci{7Iopsh=yKIBZC!7xOsA5@$xt==H48L;byKLQ;f-_FUys}0 zcew1^_c`dE_~+kb4 zZ)s8rZswGRG?5b~AUh?_-Ym|=+`+-?oRQ-)_Y7O$)Zb4th-2c1b8DK5K{*Il0sC`s=-|>+EJS}Xl&_JznM9XJR(M=0_PJ5t& z?h6(e4bFW)UPivDr|xbsI(uRa(BBUrUy;9HUMD~x!a;FQd*20)iBiUh`1XopT0T4X zx*LVgP6}X)t@=saWh$=Dyvmp%0hpAnZncR z@$J#p&9K>n8Rzc(TyqhZz!}5PGB_C5z0;XpCUY1Gd70wBK=TLZl!tQn3kT%KOOzT2eX4&p9OxG-?A3eE0xj zf=m)6XO-6>>1F_jRq^c7+(#4NoBGC2JKy&ZRXNggw4;;PK(+=1{bttaa*fNaa}H3T z1|gY_jyI%7|5HP--i6sFn|7MJTHDPTH95b-@tJY3w>dihzGy_%(5QX2xPKJ@=8Jsd z5={O1?=%+yFe#>aL>3rZN3>+Ofo&t0S|La0S6jli?cOKsDo16g{&mPf!7=3R=t$9X z_N7n~;WNj4v{%v+_uD;(*~7+Csjnu_BrJrh>gN+pTkBQlQ(Dea zUur!%zeb_I`(2S}KoQ$RFw=!Rq~o!2-^p8UL+LbXDcg;^6+1>^VixJxAS#T10Lbxq zm~URPF$t={dxYNDRt3UNM?OL#EO|fXefHb#;An*B*Q{A!*uQYvoV-lmbUc({b}>a9 z6avpYbK! zseD3J0|XA)J}hTvkXKY?y7L@+)D?pu z$9lDb?-scV88WHsn0j(%4c2WOlS2@`wi;FDoV@^=}!l^m1Q1^M_{vgG~ z;HXtNqj?zB31M;&L`!P=pRHb6T@Y#|os{i}ikSa>8};z2O;%7k>|uE; z`?bAQBrXLzuk_30M`%&E@#ECKyOoCDh!I2;78wQpjj91Z-LN2eOy!6BT4N*gnK*X@ z$k1)3Ha#@}zm<;f0*Ug$`n2B35C8i9b0>ul zn}1E}mweA1rdSM_M~J;2FKkzP2s<5)j+wld1Sgr?DNBM*EAw6BvC(|sP8ra*+n`H4 z{1BDqXijMnJxjt?pGh%v#A<7)f6z(B0!$ktda&A8(O5Qty{$c{+kXLF4$&;WGk2f^ z8w6%4k=xRXw31Bd(h6TUCO0W! zDP=i@;x*$0W7?Px7~Y}=N7sY|40BLvILTpB0Cm7mR9agv@TvOcz$SZ}>b3C>JEhFt z1*4u%Z->`egIIY+gZhE*u4MDa;r%_7!#}kW3&X8A7rIA0YtS`0=J<>Q$ub%+Y^w$egzQl#P)#nc*rRs&;!G;%tXke~@Oq7S;$;;@ zCZ0Lbmv0W8W$U0LeFZf5gHd=n)sTs^iSNbN7vP+rw-F8!xP?<0Yuda)U&2lVhxng>jO$XtknVryJw4!G;s4Y@Hh;>beMZt=N>3Pi>rGVL zU;K{uqbJx-f1YF<%j!MsU<*2V3j)<0C20X=e^vkS*G|vIB^pRe`S`uwLsjtDGC6VG zg&4J8Rb(-+2AUXjfZM*k0eci-kNkWC> zI^l}W3P7?*kG_;`LHpytkZ*V6(gR3E+AWD-VXLLq7N!ipOu3OyRm=ajx{oIY=0m^C z3t}pt5>WHAb^!iZ+?!g_VHb{V^%o8Dem=Gt?M9rJ*vS@3HWBJfj*lFMSLD=LZye~O zLa2isW8;=-A2s?M9PG~>v>%6F^^`yAsXGtWwI29wwZkxF1)z6zOQI8Yxl~z%Yvvr% z;F+iE=MqD>%WL4PW%NIdI+uy1k@`e0YGnP}DPiU4Eisd!LTXYWp~<|f+sY=_^#m-J zE-z}O8vReofJ*Z3L%iK=fh;C$F}FV)=ixt@M1^WOm)zsev%`fg$v(@2L1^-C(n*Pp z?}8frT;rcHNZ+=pOg;R2MMZ(9tU)-QHU0sKLA-nUh}VZ^ed3mAHT5`beL4jn2SJo! zOZHiu2xe2RV_?Mb#UF{n&)&=&hgV6zC~kQcEOvE^qcsugbc5glezUI0RpDhm*82~M zaWgfrEwaAWn|Qg)ATTv1J6}k7i5o0Fg*S!GNN?OOoApppEoH_FoGXO`o6r&T#j8|N z&`=X_gu@Xta$IUyw=S7jAZP$)Q#WPGbrI^Li}m#kTe_$4C_`D3W$P4D=&JP#9-MQ` z<&ffwTXxNX-!7X!We5Z=@A=EtFa2`1oqBDSDSS(Hbns4k3jKr(afe473=WR=YaSc+ z;=zjaH`q_G8w6B@KM>lS-tVG<6BV-f;DU+P2>{1u4;XQn6y1oOk<->Gc<$ z`uBeM6Iifz)BMe=;8~bR(bXS~-D7k8R+ts6nCfsuX( zPqMq}y{@%+Hjp-453K>+ z9Tb@~mh98FYX7EsBp-1sJA_(fuIBbg|1ij5-Hw|Ua@#$tUsSMcjTb7(lqp5cM1=X4 zEhVZH`EI7Dh*)|_qSI6O@+L@DQsZ)<^yfq6^0wr7qRs=a;_}I`2eh~dhrHg|we5?? zC7IYwbo0cIUjYez)qnG~P4fKmE3Y!L=MVm){zA=%vks(UvOUZJB-`4t4RJq{^Np0R zN1C7CIx{#fNFWg*P27PyqDJkxS;-rYTXl>_^8?{y?Z|FPNO;Ddn9K!?k{#x&smN%$ z)1S^;q&w3iV>;1)4g=#{Ph9G_(IAEMDi$%{GF3HxB8!?VcY(`X`EZxRAnQ0&;5yM6 z&3Ux^`9otxb4FV=S_M5NCBUD5ll%>B^4zX`^2NxbD_EMavjgPt=ap2_RE#-vT!FzciEA* zfYz%#UJC#1n`P#(&Z2mD47}+UOQ`fK%D~sB`1mDWv;w?J^x)vE@&t80Y;u zLFFr*R&T%5=!4X5gP+Bdty$6FT^wvqY%xojitfU=dHuzSeHkOun4|-!D*&DEiL`il@`Byw1{e+W6A4N6-3( z&?HD?oC(Bf7<(B5{j<(j9~;ZzEXFN0EZxXqMHPUrv^Z;j(=lbsR0t zCu>Ky+G+ko&0OHBcJOPuUV)cl?B%QU4UDup=udLs4+zxS_G#)|-6i$0jso>p8Z+lg z3TXmg`CMOA^xg97{{Jk_DQ~yf?|TSaI^*|-loO&odSKiW?9zV+CndC*Lw*O}~bvxfT?k zCU)jcO<~lW)=XG;;vc%Pu}+2(k01vgr)V4+Xa@gU?0~uNi>W<|1-obYlX7IRCX>0> zc*OKy6dlPZxWa&?PX)KC#1v1ry`VD+3L(dH-#EdUyJj+JYD;Fc2mJ+9%>-YJ(>Pw7 z0M0zqFs8g)`hcZ~zdoZOHT+fFww#coQ5W;EhlA4FlmCV(9xqQzcwdY+W8ZRxpjs7a zN$xXLJ`28r0J@hyFv6KEpM;A3nkh|w-Scw8F_~s;g1tq|wJ!+93ubTq?#Hy~?+auoPWf=BFaEP2=BLq)i}%xhfaVi6oMAf7 zr7nOF5`qWDmN61mbwjzcA(`CH`u0mYQ$UcI;9gmd4&E!wwk~4Z3HBEa!9KqYsQeq) z@>$N6K~O-U@rvjfiYXKXf3-n<68Ds6)Lluq%6EHcN6R(cco^4lj`X=m>7PmE&2;_e z2QuX&R5fO0{L2P6#rBSMlambw8>&|&g!ezPhj;Iy4tls(^7m9kSee}Hff!x@0vxP0 z`+O~Di&DSifCI%R9&xc${aCT}*Y}C4N&-G+O7i-+>kY4*g{cXd<6oW3@Nc9@FB--M zU|d!ZNt8l((FZ=>05S2=s=pcNSH=lxFkKVimYV5PAm8+pjRX)Sks+)unTD%(s?o+x zk`ErA^vPddHxJLJ)H*F>U@xdPE-LL*D<9kwXxAfolgJx-BujRl#6?}=FfqX?pEZHD zoA%ZdT;ttv9zj>*CVI=5&LV+yVq&2_enT~l-l?KnVW$ z5{=JHywqVyD$CUbDB%)BVR6*`yqvtkUHNl&;ec7M)_a=%R9d*Ry@g&bVtD`K-z$Ew z?d^7(iPBn_t8VP&YwzrjT7#japK)n^)z$EuHJX+cmFd%d_p5z(aIH8q)u+vIR=i$j z@3hPE)i{F!4$>et;KM22R;-(>@%?YCwWnH#PQp*EmY0{0EOE#1XKM-nHy<~2ZdFo` z_Yp}y7Xu{qG4>)b0^p-TiF=(cF8N^F;9vwK^~B@K`CjJGlmp{6@<#F~0}hz0pND-M z-tiQ7H0~u>HetMRpb>k09VxT8H0N3(v2q@|ekD13vQ+Z?QFx^KMr?WO(-OBP5I{`i zak(I+c=_pc(|rm+Qlmypl=fUJ!)SjrlEBcqN)-H>=5(-lVuvL5-%U zbyU(2LaY62o>u3CEXa8axbT@T^G7z*gqLV2_BNauyCxa`S*S=T=#xqtkZbG1tFvy& zqK+P^&C7IekXC4Be?5oEA&aMW5$;Qp>8Nk%lw zTJO8g!_zfgc%rKTp`;j&Y3UzJUPLf8zE zJxQOAot3FNGTC0BMCK zGJwR^jaTvz^?Ts5=m`uUj?O+1votE&+P?^c-W!Y-T8LLzdq%$mhiFcld%-NPqZj&F z!66+5S6_V39X&G6TW_wL2WGExP7fx}X%BY0R2+@`fi(-bwb8jXv?dl1&kw5$`P6E@ zAk`P^PbOD+*}CLB6{{um=|~o?6N{~w{#x}GA&qMiTE(czoT1PqTkT*>WA0T(a_*wl zw_-w3ihAk=?p5YYH+&tbRm~c2zy`~d$qDDDeC|FG59Md=4EoZ|m-5hXY~QWXw-)M3 zofWL`428#=xx=CN{AxO}_0w9X!^6Q31Bsc_(mM^n0B7kH30HZts83MngQr1nACiGy1^bZ)eWwW@D*@P{r2r92q*4yg8Nk-I-%VQ*RiYxmD2<5TcEy5A4? zN43WY^bIlmnX>=Z$>oD^WsdxtlnTV zX}7`namVb~X6E>|0v*A0dm5g4qJ9f#LJ8n-&%x}I0GH(`#f9Yxm+d(X5J%xDb?6xmf@*{!eQ_cnwBm3)xKEk+DBT3}M8V11eh#{drhjH-NeO z>AJ52$mN98Me1L(E)n8VEpHeHU|>jvp&#PSflMdQ8jmW#r)#0!#Q=t8gc`MuR(t|4 z(a1k?VR&0ntd!(v)=pe*<^sZ9t*EHT((-`vj$$rA*g~}T87>-aU#WEzS}j ze7NM67; zjmK{b1eopNuHC)G&uWpRz6yY}y^^b7N?nz+V9-f7Q0$`~5p%25l|y2{AKn;q>u{U6 znE0M}`_Jp?#VGy|6C8vvEl@8gDY}KNE{#2mD&F4SeE{v9lAU(A=dP3U6GafW7^gVC zm}YWMr%S8zd3ji8@X~SiA+GMzkh1%~n-ILb1lvWsh?B>d7A4;8d#Cw_cMmR{%9%Ae znST3>>2*S*3f>H3?PeImZC2G<3KW0w-T2&}P3T*v1Z~>$c2bRqfrI$#Z=ZCv47)V( zC8;$qn4i4M34ZS;f2t%Wg5Taut#=zN1mJd%Ii*q1GuCnsLTq3bQb1L#TyhJJJcu5;mTmEAN6kYeBro>51{kb?al<~FvZ z6Ey)vF+#L1kgCngHagt1HB_&Du;`x1ZRq-#L1Mc^&y3(8oT`emmqzawUGz%vODnfw z9~|W9$5M9L+?TM-%xUUMg~p4Xkj!7JW9;8c|MBN$r#y7v6yZ6elTvT@4!(Hq_iNQQ z=iMvfRvu$a53wAVet&;TeCC&3K~?Y7_akrRaURSEppj8?c|{kG)s42K(({Hs(sS|M z>BHgD)Dg8>)bncYtX7JGs7$gceyX@A3+xnH|$RQkY#c%zPj$s zezodYXx~##{rfW0x@6gEW&5P3v&N&ZF6Is4{dONA9--(`Wvi85DRJNjABo9UAMMmT zX-onwJ}fB_#gNM6Qn$|x)p*}IoZFjm=>Z*8n4zB`m20(WIAXJEMCDH+OltSRMXDhld*5m!;-b|} zvJOpdt?TeUye^cC|7zFDL!g75{vN`&zOs^1>1fipGsFpWH5k7A6e@nlcH{R+Klo+b zsuR}E!|#vHsKa|2{CGc@sYWvMbbm);SY_d|pC-KAjbg>~loz%3sw(OUQ*Hxt1PAu+ z5u9(`Y`-k0u%Ur_oSz?l^>t^1iOtHvgSt{G;~uNU9+$>CTwX?Vxm#tU>3*MehxTVi zl)F5+o)aGkYbp=%PSSjrI`cPUv0bdN8KL5_0nN-|@d+FH)#N_^`f$Xcj zJ=S_bH_C6szkOl>Idu<PZN){_H`K4RSY~UUDsRhg{(kXO_f?vmK5Hin z*Cu(j4DoYYFf5R9n_4N{gU>C z^HXTf3wXb{0K7E>~kxu89$jV6BzQh3n{KSw&W z;f}MfyAZ8pn_}08Y8;m}pa?Pg&WFd^XZYu=0ggxgXt-Dqy7}M4RWi-KJnRrUvQs7A z5=i%!?1ENye}K&%*+RE}O*+e0t}s9L|yPm~YahiN4*JlFaKp*T&ui!HbR`CO(m z1$;<`h~%Dq@uTvniOAJNi;4$qo|YZ%x%Ds$Lnav1(C}8EqWno0K*=z5DEAnI& ze?~g&IfKjhLMz8NJ3eM|cDe1`fa3K&bJ+RwG8M+=_4i=)maT{c2=n}m=ICbD3~RI3 zA|K;0yf;kJOsgmIvEjnfNE=+mb^;x+r_l~+6+H!VEgZk+*$*y_CnnVg0#$Vdo><$y zD}EX{A#Ijb+=x4|N_(i+N4+Oh)zmxI1c`jtoisjnS8+00=f61R^W>W8lW6JO7oQ1Q z6y~@NXYs;~6qDWrY~NmHN9(aE?xn$j=%rbgXnDEVzy*mk*wNS9jYN|M7+Q%|I#0wa zxvE#Bw{;nYR`Nl`)Sr8&y+joM6K;3%J{7pAW^~NK-=penLUHc$g4sdLBgmNjbvvvzT;Rf@VwN=Z=L*Odz>Mbd)sOkb&;&Qki4Os9=s-n-z_ zap6vYNd((WeyGR(LP248v0-xJ%jnmFNEashJ;pi{zvH~yGVDIqLp@ze@Mpl?AX%Ug zE3sVQD=m;IM4IAc{!#LSoPJ_UE%53+SPBhm#Skh6sN zj+y`wvZ=m?(purX1UI~I_PiD2jV40dg<3Zsc#^8L3hrk=hu6T_B1lBjOY?Bg?N{hi z-g=1Chb8=r5r;`qd{|Gb0f-Y(I*WKB z7Ud-lfT!c4>sIt|V+Nz-h&I}jfokPY7mjTI@%+tZxBZ^tRp@-aHnz;TWpAi&EQlAy zL~@-GI+~=nsx+1+>Ee^0$Q#HA$byB7uu4>Zs@4dgWop#VNr3p8eoVs*sH~YNkkQ=L zSk10duoJEbn4EqG{R}faC!Q4opp2DqAmvxi95zpQNAi^X*uI=s&EU|Pk$3F3;=Q)& zPRB*C1XPsbjq~EcX?T$CX(!}P5M&qiM*Tm$5gAyq>b3RIDU(+^kMJ*@^VjygC<8EK z{7o)b@|4`VJwDOzXn)U>NmgRiyJ4dyJ`Xoi%nxzcn1Rqu-lW&Y&bS%K4bm80l=@=k zQR8hG#JO+ZPE0z3N!*nDoeA4t!X6oZso@_(z}qUjo6cn;&Dz?U1#3^qie47S|$T`W3F7J_3%@b^vB_h?arYkx3SVrhtwf%E_;8o{^JA7{siN?f*MAiAxz?%6*hSoB zb>n1S;j9}{-sP@VjGv0!&R$siFBYm#m%9G)oB6`E8U7%_S{pT`G~kD60McB+b4u%$a!t#eb3b^CAjUx$*l zJ>$~=PPt+qKSN0)Mrh(| z%y#1BUxQwCA(6uD6h79$^#D~~Q4~4jKW&{a?p4pm-!Z^4+mjUfIjifRX5E!39-El^ zIsQQLv5c6%>#2Ea!-qIpz>&qES`b1_0^&>I957-#ca#oX9?C~in zK~M_K@a>q(5iH3)VC5sW9pK?lq`T+&E`_Jcr`hX{xF_4DS;yAfrkCB7qn{z4 zyx;4*ckzp7nrme=2>rbO@bGob{IW0YcJW?HgoK}r@9pe@yT zQiL*>p0T@Y;>VXE**{K%2)xyeRibpb(ALmqKv#sF67avYlFXm@{l6U`%}aQqsX|a? zaBvVgcd%F@wy>9ueCy8jKB%SsLRnusRJ;nV_n7LyIA--@LwxAL_K|K8_9cBRn@?yP z=wk1xb#dWAer=n>T!5e1E#GNYm!xlhDZ8^}YB6hrn&7^LK!=4FRitqOAVKaHrAH`o z*ruoO1f>3%w`pREQdri0A8ZQrIVdT%H$ISEx9SyPA>>&~7{)h<&R$T{_;uhh zv7J!;xiZXRwWcJq{^wsa(+2{}jU=}SpKo6)ZB0^LF)TeI{kX&u@43*-c!H*1{#0L( z!-@5Ox_@VPKhyuzE9PD~HQys!Rl&`J9ykHl`Mz2<-?Npb?Uogv`=-)S-!mH3M?u4N zFaCw7s-otAJ6-C~aj7l~_{j$xDP~ZTeH^}*dSkJm`X*Kzb=CP?k)12Z3)UuW9#c(` znX~*PjgjKMHD=<4kW}7<}^Me7h`J=dR zhW6_Z2)#>F0$b@rj|5uIpDu_5Bi_y@7a{C)RSJW6saA`e>`M@c6q?UJB975x$7P#I z3@!4PsvURP56#%1tn8#l0>p#21zXvKPX;C1Uq>`%IT4yQC0`x^HW;*(U1bel-Q%0( z5^GA7&*H7c+=@wK6u6^2f-Wjkyn(0Fh%u0P;TGj#h` z$$d_$I|@d9hcI2Su4$7K%Q1H(@S zWKA&_58?Q@54CW-3sezyA>ll~mYT|-<{6V$StZB!r*;C(Bp(Sgy5((23I;ckdp|6; z6GCe?3uU80i`58+i_V zS8EG5YhH?V@TrOsZZFucCwh7|@ktiORoEZeJ2d`FENeJr-=d&;b%1m+b5*#e)_<6K zVQ?SKFSH_-ciqE8V)PMpZW729^?=m{y+RTNkt2~r5atrCpw?m+v5kxAA`buh(>Z+f>uKEB9J8~ptDNl^4(j^sUD*mt zbASSu>XRD8t3wEVEE=md4Bm=rN`GM`Hv_!UWmqOHPSpjR@brZw+rlqAJm#y5bQT^C zN+}CbiqKi{_j>||aEh^Q+Ebz7@nF@E&FqU9Lt#l5vAH=R-pl9KS_|4(AJ04JsIJnR zm89c-`%kiy{mIX;O2Y1(-&dEsZzjtgSiHWHBatvjj8-@boy|XN(PKdr4TiCGp><=t zL9Ex~xt2k9r=g$}->d(`gSRP;->nu3h#W0(nDIS0DWI=|{N6XVe?c;t8?JS=bwh;3 zG{Ayf7kvZ(wV(3}4}^~LhFP^Qw^b~j4_Zn zWOCpL*_I;I`2y#v00CjEYnmBt*SET>hyS?xaynRAZ!+FzS44I7yBh*a7q+c~>p8P! z4#Y*1tn<9Y2+&{7J3jm>zmY}1i<#VvuEVc~Xn#1oxSzJW24W#jPz#3TcL8=7W9%!y z0oNq0hIgfT74g<&PRdX!@z>mpvb-UMLHYBjlJ0f6@go;gRz}NSdJoPuUvnB_psy3n z80gD2$;S{|;v&JrN384i%9xNq`{$RbMx~zSA1A8Lhs-AuYw=85kLHFP*a9*x@r$nm zywMJQ+w9(QxYr>bL=^C&hqO8T3D_MunwMJiB2Kv#fi-xX$o=~p)ys1+uM?rwp^KTc z+k^G_(dAvMrkjlFm%;eM8awN#D8G&f^54`{#4dSC^;k0E@_R;g!yef5m08DMv_As! zHc<+{zp#T`|NGTqmKk-8-l3@7 z0mfNT_J`&s?Ng(UkIMRYJ!Ko9qnA+dXC6Ze-XxA*?|(LP)gHOhFJ&}8^N1|xMIfO0 zP_NOIMUgJhmFgl8x<5yD;Tktyk0-+u-;B4Qk2|u%NAcg@nb^;}*k^Y>jXnoMkp_-_ ze#6B|+O1a_1fGZ_vS++)$LYu2W?DCwMR#_Snt+;CKo_~yPYdAgb8Ze+m~-6FK6xyJ zd~d~?g%=2|I0>9^4_Tzaa{+AAkr=(HW@mH>CS~*YA=}r4#jfqZlckJA_7|4ECq9eM zrmz!&^@XK>q;ALQFhVfOx8LJH!5}b{l)pQ-pvsU>%BZF)Ciz|qQnl;yVNU6&Qjl8c z(E{Daf@!U&B<&}WJ!o>9%jJZRkE;pM@|dO|5NyNGfKd&a^nr9G>pxvO0A-zzNJH^7 z`iLD|MA9Ch4lyMqD^Tf^LyCfxRRWV8aPu$1G|w ze~8``;Xz`>e?)XeSuY66kQM%hL%e*}aXk|zB*FvUg`CTX2z6OgBI9-0o0io0$|rnz zIQ1HnXzhI<$7V?^?OgAeXYIJ~Ve_nPT)N3PYLODW@3ewh?%yFX+uyc)pGuSg!5j(z z9GLrUK61KPvMbUCm{hzGDfru^>2fb6Dej@eW2F5Svp^T(+CSj!W6ao7xZ2ciLOSo} zd-vpMBf0T+4)(%AgeEzDhAPeyh%sJB&6P=+_>bdZ4@-^IR-FG%QGI$!K-C=U^F|Q_ z(L|x^157Il@mS~xgrVRLPIF$g#`ZnXTay}hu8Z>m^Xi}ZCR@|^kKAyVgu`du1S8)B z+BU%k`T3V^oA-8cBEVYCO56D0HIVA z&}{J8$F`kz-T?VeMx4XNizxAWr^b%J!1t|G&zR2p!4HEPWK`Kd<&)lfFfc2YHVz*w zdTy;hNTC1}U}MJrhFt=|!PQ(T$*D?{dZz^W?UK{{0HI4w5PbGvMe+G{&>tkyYQo{v zn1>xatqsgeeN%E;OrcuN;Dt@&FPnn~5ixJS2qH%2JNEv@f2c}UxKP>O4}YzvP^z10 zq1+m!#+FnG4Xu6w^3^|5cr4C9`KwK3GQO~@Q<{c?gq)YmcU*hP+Ns(h8(r)KLlaK5 z6J+9vD;r2;>vV!pU4o1cM)Z)YuKVG6Z|{%RczL|^JxhAJjF()TSn&meVm)i%^tw~# zLYUb?RaI3vh1TF8Ztikkk^!h-%ej3K{tyj9Wil(1$mAdX*{=Ol2qb~n9r=GxBoOsu z0~1T{_ac`VkSyh|s!yXqzlbi?$?U5uDKs$BKM~tDY@1|Q&j0q_PQrOH@87hJwGL$8 z7xi)U{JS}7wh8@8c5z!~iZk+~KfO2Chb;}oWfiq8p(_CAa`b5$G*oR#M-V7H_UB;h zHW;M}`FSMU-)iPtzvY@Ytg=nkDb7NPv4X4uHc{JMAP(XSQym5%<9X6;*V-u_OHqMQ z*lJt`zGXj8zQ0KRY`^?IR>~CH8X~EtIu;i8!N+XX=h!nYh|3pL;9JONH}N;@Vc3-#@_YH<6sG%p_U^M$dkXiGKw~}KUiX>sNYcF z{0Ew&q2$bnm}+kX=2xIgPsGk2NSRxRs?1~n*v-C8Q>D!G0y@?$_{FTlNPV^&H?yVN zpg8amGXckwKNK+JILS20efglpW|q>PDKmXd@QM(5p2ZyBivF+4DngX}9KifVTg~Gn zMSV z`=sjd#;Ym@hBnhqvp;ika;U$pJ#3)Yi-M85$*>M`-JmS*xe|!pyLB_dmXI+xqppm+ z0Bb+hV48KA(XErZ1z>~0sG%vjw-69quZuR~7}h!wM@^ua1c9`aVWkM|k{2bx;B+fU zQ=*e7A^G50@-U!=4zFQ@@x=kxuhlXB5nd|ANyQ6phn~iyeNX}44xzXq5h+JOLIf?; zC7l&tl3lNQQu~}CLSTk7&VOA3)KnZArK`Q0PWJ9sUDSHG=6t*QM&GA~RKDWFHoTkT zl2zdDY`g?pb*L@bn$-O3XQ$+s#`**OEg{1*-5N8lvb zx0SR}#P+DxYh%EME`A$eC144TQDC{fst#k?1AilqhRbZgDCQ59*`^ zv0-Gad^V5skL*)XSZzxwT1U*oR9Qp7!yaHP3Ap!@iIXK`)L6Z@5NS#6HML6- z2`H*!ac0(~)(wog&|U&Cta*|4=_6wT7<}tQ^od=G@S}ET8p%Q&h5K6n6dW0U=~+HN z?yyt%5y|&Kic$!StsAfi2}iL$B~0A!j))C4AT_pOh8=P7@&NI;Nyd~*cFfD5d=Pwk z{CB2R&BzTE!9wDH+VU>Kq!X5t9_vz=RNN3XT1H0iVHX@5Q%=y%2obHhrB- z7W}T*5~9RO{Me)~Z>vl0z#JkU#0Y|zBc)>sY~=vM>-8v&0$b`?YDr|Dx*fAu@_M z6|*?bSx`j)3Y3Jio93Q>9#dL@Aah?4Z(gvEmXukDuhsa;x%X9l<{z z^|rBx{9s-NasEW*=SYlO=fmYRa><97dy^7U z{BX)!*2i4J#PcyI0%(iT!7=?au%>>Xh@bc;&?Sp$H!C@OF}g3ABk zU9KT!V)FRK{ zl7`c}lKp%3r0$VPv}5`a1=3j?UQUR4ZEqs2{ZV^8=yEs$qz1(hFDKFs8ya$CvcWUY z{yHT&%j(17Nhia{zGTmF5n;!a{1E9Mxc?!x^|rN{U@06;BPI5VYwJQCt^6Wij`%8A z+~`oZ6;VK9SWHUQcSi;QpXujs+jYvfW-w}C#E7{I$sz0I1u_&DIXqZuNa!7!U)#zs ztC|}&F;lV9A177XXvukPn$q`gw~OOBt7bVq(Lb_n91)FE9bw$hhl<2jO)x3di?k*gA70rO>-t~=I}SmnmT00T+|S@ z_T|M z-Wr34aVx(%Dy>I^JB2Y0K1NtSf5<_J2~ub|{;GaV-Ynlk-EesVzDkPzrbW%B?gn3u zEPB~Ups{8XadI+{3f}E*CM}ALgcLKNZ_=77>UX#^T2Zmgp)@lpbq@w-*u}Jiui9yw zPby9_vewOk?WU34Rzu_~e8ewOh@9;uce=`uW1-v$U!ue5`HAZ6>EZ+jwg&z;!*{D$ zN#$`XwO1Z_748pl`F3=9z$N-2lI%|bhiKFHZfWS+kiEBMe7G4NJ;hUSUrnsVe0e0t zLLb!k?}rnx4fbr%Iq4SmMHXw%Nd$&cE=PK$TJ%0Oi-r6wZ=c63m%5AIH zP3yJK#*V+$L?%ouTPn&T=kojcyxffaoc9^i8@2;^H$T&8ELGv+B;}F)0b@l$9nBN$ z-!4|TQ&MP8z{0Lu)f7Owpo1uXq`H9%^w83#hGJYpC6*T&QC2MFtb4sle?KvGKA^L3 z+!m{LtD;x_kYJ$Y9+=x;cd&^Q-e*cH|ssbl5*= zUTx02Z7@A-3kk0jMadltE*gVBqz?5TmN&k1?BjD|?x0L%KPKw;`%xXv75OgRUyrfn zd#K`1Ic$N1Rn3@Z=&`zn)mG$o+_~Am8i13vGUpxKd+)CO)FDvwf`m0Z_*2**Y9;2z!TSb zhbw)I(-Gec&`piaU3md0vi?jHAb$901|SP$9_u(G+JI_zczDize)qmDM&-j!1&f`Q zzyOfff$UFSb+@ivH}?>tMaHRxE0P%mL^%+CoFKH4$6;LbRNugsgpWd?U84Wnpx}m2 z?3e2N^|7L7YX5&o0RuH-fU(B0fFT78l#KyfSr+5#qvONu;{brY8{G@zY$CiSBpP5drTs}jB=|ncN&&1fs9b*3(H{?9 z$o*f|zUeu1qMmRWFi;EwP^hgK>B5A@Vy}f<0Rx3G5aHEi{4QpCgY;8(C;*xr@gT#GbabKoAK9JA@Mf&WgktzTfG_WSJodi&1rV4y)8~Dm|eikKpK)3;;S6AUEL^ zy`|Ov4e3j>mf@IOP8A69bpg2HDbnY5w|AuTU2yBk)829$J(%HaI_F?nv;38z-Odu6 zvg_`O9{x*0VfP}j2N7lD#+4iHV0X_}CkG&4?|&wNtDGk2&#?w&X7~i;v=i4D?f37k z{_|Ltvgj8D{E!h~z%Y<_HCzS^RE+@wun-Gilm)ix`a}7Pjsb~FJzl@)ZJmSmsV`Xj zZ^D#02iTem5WOdtcsPdKDj=3jV+IDwuB3u0fSzTUlK1q#X(_Pba(bjvJVH8hp>O~6 z+;yJ4%?FtAxG4j`mSO;41ekTg(-{wdf@xb`05`5(b6Xop4+cMYVz~i)`%eQ0Rl#-^ z$+qAIfP54Xnf%i`cif?l0mP-Pm)PgRC#_t=Wt&11fNLPzpC0I@{ImZbi7NqXM@OZ! zf7J1R7VM*+JzND0)QJHjTMPi^1(2fMIsplFEhGkr0pL|mH7~*c7P7GoZxlUYLX~-= zH5}LgUO^1_l{6Mls!V18kXNS3Wnr2ak7~R-`4r%HEf%(LwGy*tYOaM*(sqV1dBwdphdWoHRmRRT~`58Tqb05ea*6J7vp11Ny3-JKoje0Sa6 z?yh9d>3LX@p*C~Wbhh7ker9=syNhB2?lIcUWQv1OVVOT=@oWG8v+8Fpk8@}rMIA- z0>$g_>MR=A*>H(>YfTB+yDxv&ROupAVA3Lrlh>~O^tHAF6wnVKAKd?U zv<;v>QW}j0Jj~v_AJln9x#p4rqphe$}^^F8=dOR1W*P8lfL_5m3z0{Jo5yFK_ zas@&8hl&%FZ2SN9J8`QFgqK@J3g)~B*f-%ZxP(bVNXmD>q|7s9k>u=o>*XTXB&a!egG4e0~n8BgZ!q~*k zD)oipT1%WDW9bP+5~rkXXd3{!(ySBu&O5d} z=g&9jdRv>D7W|!nfXkd3&~w$G-&_wN>K;AxE_xM01h=kU%iasJrpYF2zM;SZMAoaM zstZ>BEyds6p9};$3QOO~CcpmRkN?8}5K_QELoi^19kBq2EE`h5K#3S&@FFJ!N13J}@YZmQm`0mSOBN z#+PLHmaZ89b$rxM(W^HudQfB=fB<4VYCDMq0|dTVCh0u31qS`ca5x^AP3eADFI_P& zfblueAqy0kS4cyjFRTHe2)?&Bx7_`kcO82|1`=2?7pXK=ix8SZ3xJjek47*6u>@<*#8ffLTU&GAmLS6kk=FoAd{XO0%rhY{xATm_R;6H2VJYtA=QTgj4uRZ zOwU90K@e&x69Xo0Ncmr#Mc`Hx4gI&{V*wO8NM)n)%cGo zQb&Zh3k3q~B9Nofw}}HV>hb!%bK{mfId|MtN~i@c`ESf`nwFWw z%xGIypnG>@07$xlFz|3~AeuxyeNxPN995FElXZr%HsMv9ah3eVD z)y&$vvy?|zeIO!wnWwPy1e9s^_>Y?|d8YmJt%FS$J$a?Y$NE4Wu1T{Fy3Jb!0^HK~ zwqPHVwzT+r=lTtIba<|3l$r+J@f0`ByJNts?a{CXSzFa-tq3t=l%m+bA1nL5w*LK1 zodJ1paL!#gIuZ>lkVTxp$eM^J3p4%KYin*@tH4D44Qcr>U;zPfFU=fy%ZHE9;u0~SNq|@Y77w6FJiNpvHl?W8 z?SGNoCYyrmy5K;#Ws8;tY^|%(bUnbJd#knuA;<`6^vuKW_(XtMY084xjwrMRxU8px z_w1yr50ZBSPaj0gS$-*+e&-eX!W-eW0Ae>Z7I&pTW$Ghm0c47I(QR}ZhIv5eyuL1d z836WnlE(q|+dSBO?)RS!7C-9#V6G&zflf0900gJ;J@9VOk&$nvhH* zO(MAoKrJW?@#;>Jz8AEqp;6B~XcoSDi!v>oud&)R>&ax{vAui^G#>!1PAA#p z@?oL67TY!pP0q_BK2?XyCX{Sqh9*D0S#@tj(!9XjVDdqjBO1{qlL8TM1(@``q5LR( zd_pP@1Mu(HIx_s1=Y^DLtC$7T9WA8JnnlD0fcNqWi5Ei0U}i&$zt=BacGs_5cc-Tx z-G>h!+{cfny4E&`&Z$%>$qGZkgR|)kopc`4oCX0bhV6c*kl(+*(uu;|s>BqnhJ z`y`b;b2r4INHY|)YtS-RBYa8Wf@?m()vWRkzy)xnBLPo?wA~-TmDd|8SbPk?OHfW% znba-T$S@CGd@NMZLZ(J|wTcd>EmVNtSrw@{kJbN17~>N-VANWyAko}ut1Is$o-gfX zYn_l#wC>L^$$cs^;eWq_qo_Vvdk*(qPAIZ*RKegJZdWoY&SBxvs>oq5QM| zXsDN!!RVTdO-O_7F^J%(?0;br-~*_#h_!!_^8ZRF02DkQ)5@yhPi)1{;w}EXVWR$e zYkv*k3{?S!ZE$pHf!`TeA9^p`I2#5q09nN8;016tM25FBF@O;O!;&3Qmzg8noCX8n zRhXUT)$mROF~I!H{7X<)cygl>a)AKC2!N~*QUU|9?1%g}>XXPmt4qJI1ArN66x`|i z8Lx(0C1BuGh<kbEUw8@lo?#KQ?yj1ePVe{A@xhThIy!Va z+gq~qBqk6D8TbFhEqiP5^?pIKxQgLT!wBKW%6|-(2sL`F<2i`_kAa{;iJ(Gjej3k! z$}53*2MilyGP0L_Ym`s{eS}m!21MHkch>*a*A{A6A`HLyis3S<4-p>~JqEEa=a{AeMtRp=% zm=kn8b83uN7fiTd%w;5#JLGaB5v2C{9gs$VH5-FO27VU#mf;`ckBGoC>I zhY2N_?8OH3ZVc8Cd;->7brLXgDY&C2FJ%#v2S8IS0D|2d3)9AzB);uhE{NpJ>W`tk zCEkc}%XfU;EgtkEY{cDAVy&U5GzNrZA0J}wSX8!WtWhrtu(k zCse~@V(JzNCAv0(Mzp@XhpzUHo8yyDgs1frK> zh6q#C|9;X7yxuRO|7aFhnLQ>kmf(K_#yZ_o5Rd5D8y_2>3GfTIfREwDtoC{MQ-0fr zSfe09*AH}m3PyV-xW?s4y%K&-fdTMqK_X2U%_RCMN)4|B4D>NT9Du?r9R1hARTl$H zDR@$_=n~RmV89IA%x^8s?@dpF5E(&Ig&8b#y{svE^Fh(u3wnBLQKdD?)3s&3BGY||G?e7epC7&G4Zoy z&1}Wqdj#MO5N{7a3Cqr#i@}*>nA1}LvT&8t)4f+Bck9}9ckS|J$1xCbBKo+U01)4Z zzmaaN=%VGvFIM!OHOT>EdJBNuR60*yYf@;={(n>IbnG8WebIzKf`#Aqm{vWqVz}b( z5kLZyCy9p8#0WSmxxKmWR<>n0gVAp)iUYy~XTa*(lKN_8Ti3XQO_M~+5s_RK$R!d@ zuZW4a-$}U9@6HF^=UN^uxTx90R5eXZ(}wWQTwnkrG2}x8do$^2T-&xJ(RfSr+k(C~ zr3hhwOwzdA99Q^_2N{OrDUz+Muu>tKHX{T)TtZjGJ@Ib7qjv}~x`&$~2Hqn3F{glK znpfa_!k))p7=zQGu#xW|5c>%GjRY?nD8Y=3z`5`d!*SWBWq6nw01C)@CWMKf&DvEv z(UYEi&}q~0(nL|=vMdZhQ;HqNX#lGV@Yg!jX#nFAb0kssk^6KxxEML^#fqNUX#g4z z>*M860!|;v8~onwyNU;}DK$zmrV@bw{WsU+8A|NQa!T+-C8;<{7*U%~&*QN}I~FL> zA-g*}jx7NDyZd&mL$7&QMCq_}r^S6AfA?OP!G*yFjETB|3*iyrFbN|L0UErx@(kQh zyjtg_De{7UO#^Pyfq}uGBL+kC?kZR8Kx-1Urh7^6yc9pWf zf@>EFj{?1{>~4BXuaqQ*q9j8=YggaoA*rAEZTbD3$^JsiDE9<$F@;FcSlPm2MgUo* zIo49AS`gT>18qx5>X4V`S^??2c_#ybSE44XIOJXy446VMx?PcAvm#nu-Q9Mp&^pE~ z(Rqt&zM*|n^hMLU$8SqAdfAx3=ryeY0E4aQG$LX#yjw1Wkxp@mh}R-TrlTmvc5Oxi z(Kz4SGsA%1f&Mx5MFz4CL0)-YXMz{&BQtZIwU$q(10yUwN7^=cd6M_uJ;PuD2EABc9*Jy;J!!n~MYs{gG5y0geTmME|WwaBrDw zE;F(WXi@-TW7+_m8f(@^tZFXYRx%vSwp}RwB5C+80+7Dj3mGk?~(hSv#+^QR?$57%PT)(?y%Z?~^$wGP z#mIn>hqPQ65dT1V=+gKKtM*%KQv5~VqUqK1d;09VwUb@9vL|5yH^$f)toMwLvuGS8 z3HqN>Rcb-g)Ma}IDF^!2SG)pY^v*p7gg&C-NCqyBbcL^XMDLw9@11-7-n9wV^isSY zL4`6{3B{m*l4I}dUdhRn|1PX07d?G(UA|4i$`E4|YkV*%UkplN-Q z?JE14!sEGvx)?;r+I;hjPq*(37L0841&T$S)Q>B8=rA8?ER&$eRYSYSFDv3UCTvxX z&hQCC8U|!D8iW6MUePx{2l^{E63DPno!}8e7QPMt0S%480A6R&BY6>PEG0(YX!sbr z80(M`vkau8-z@hD;~1|w8Q1}7d=kIczipiecmDXqJ$vz7EI=}+v3~x@*uMf#;Uoa@ z0h?g`ae;&7dL9$W1&J*I@U>P;a}2TvHRJ;_SX@oN=E?wYRtAB4+wswnEIv|Z(j7ua z4c(*{=vd#mHT6kOH7UTEz(7nAM6Q{$v<1LiM{`Q7<1zcWLGQE{G4Gn_JppWzE)(cv zzbCK9)!`fC1%`3?n)VF1yMnN-s)%8)qTovrS~=WtD+hA*Lg3Phr>%bK+Fbq-#1OiQ z;%C}+L*593`k$oqXlYqD|@&O6$>hEbsN_@!$rm`&%U_OjtI zAc4@lNPyk zfHflx(K|f-K+4N|(fdVxW8jjY;p7FtHOfx(Qc91mQE-U;(s?e!0OP@oUwR*!N6}%< zI76~My8{!>848>9Rr(al3`k%-E*+ zLk1liPxO%)bGk+X8%NzrYwjm&+yejUcHaWGaE_YB_RFWQ-CBH#SOz~FXbt01Tjp#V zz#EOJStiD%_;kz{#)2ZSw>CEA8Ghpa^4(vZ-m(<)La(#H8~s+~ws;6lCB^*4SHw+t z1mFIo0OPA>P3XSBOAShMWdJDFo9RyJV;h0t%K3|KcUvo)aSz6iu{twRr4#dspHtFL z>i<1LSoD!P6F{;8BvX91lMJ9^0oAsS`mR6lrYo=a zmdc{nt>@D;(aV&55mU=-v6~Is$h#82R*yyhta#e@o@*UxH53;wR>XETO#mJmA0rE# z;RB6XJ0${vzYB&rX^Z)@(i6RS>)Ln&@Esci9=&qyM=xy!H7XD!W`?Z`RZolojb&DF z&+WLi3sUwk9+(%)D&8y@igce9+dJO0*Qz&TAQKFxX%e zcqM}X{iJ&xT}P&PR*z?Ry-m&f6VGX9K~D?((@*N7mcHpLn_KoZw=lo3y~2zDx{ra* z`b*a=!bss~RllBKViMNr5A}@&48xd)(Ljb}>klbDY$Nb7XJiDBQq#t$_FM*Lp3$eT zG^Thbq%&i{%XC=5LTUmAY-~KyNdWS&G(#rJ{kVkwgi%l9w|cHM4iME2&&5NOz5G$O zF*hy&4Pd)_62K}3#{t^~ErBcI2_P>cWKPXPcmr?@AiQ%}7x6{_e^P)JrW9co-+f$C|ndHH>r^B`jsngPjLVS6dZ&>vr?<0>FZwVmRqd&-dmMi7!3{p=c@s> z_agR$>D2Z>OZjJ#s>%hlcpJ6vUxQ{1>ObQMAQk{C0;e(p5D%b?1V%HkTD)jzht+|m zCg2l8MgdyABzOK3Dg087R*vPN!wz5tCzapHnt40Q(_i3*%+mCv#p9v z0F=hEc`r!tM+qd^N)N)dEZPLNIsIAN1uz6Weq&Z{VhhZEtW40xkhO;a6o{2W8MI`? zg2vac=uBU2U0D^aqww2`W0rBZS3-e{1dSVg$2uhUr%g#Zr;M17Ou^bL76+@VPD*hC z9^4@D4(Q;vED9K)w^wtDx1Tl?aQ-$r2`Hd5{}&akr2YJUmU#MPbcTk-@3aT_+jKrY2oh|r=2P&?{L(`X z(YM(+AY~jHJYnxF$hUtjrcDHtPI^0#ipk(HY zto+==2q2yzodyRylz%(|vW);t>39OjL)GLD@tZPuY>Aj#5CcFljL-=;FJITO5Butf zzOc}e+gax7e`DOcAUr;TbAT>I<*ek000&HNa$P(9`GsHoFNT`Ra-p=ZYVW^aVmMnh z3?BYboE_nHRwF<>7~}6Lz_aeq`@;-iio!~Kh5eB$QuJF=f>w{U@_Ff;Taf_GYQL?n z#9LnS+Rk(S!@%sCu_8eEFor+?9}EqAlkA@U#J~OB;(s--3!|Q<>0=v*-QO4nVi!z3 zGnZUF$}{iCU+tGsYwhxZYw3P}-#4hrAwWDk!g#{fna z7ELFcbahp!x+ImPl=4Ip>R?9H&$21E%Cyyn6^q+Ir$n=I424K#)fdZ9l-bDzqXFS)r z4wn2ex!l?z?1SJJCd+_Na3=&P&bc=dEIhZL4!Ug_bjy;#r$0&kZS_#*sQr)bM1$Xn zc}oEL@cZwho3DP9Qb4gYST)5wmsN%~H39<+v=*T9Lc)?*BkZOaG0 z@%?cIYVi$`NlM?Gat$5hOKj(&5q80V#>vdlr{L7z+S<|6sV~r!T)GMQCCY#fmc~Z! z(0p>A{CaM$laCbgA%j_e(tfXMiSB#i2a|`glHeU}ML1^5*uOrHVnu!Ce4@a3P!}s19x> z_mXG!+-0)n2(B~l_z&?t`=(anfz$YG9^mYo+qg2civAZ?ccl-hBpYX{hkYfmHp-k} zhl8EEYl|x}mxea_;O%`G)Rx7mSpc}08@Cr>71tb7cPzwY`LZ;@O!zUD;%cQ`Yido% zN5u4Cj9Wxg0{KW=!r#;Ga3=~1`|?#sUOQsiU20a$Ro1kQVNG( zcRi66fGdwhXkr9p%e2>O`Lj0)fK9Q3$;REg*U`zbOa_gMPaD!Mn?7Cz;HJ2Mup#ms z#bK&ut2#z>Y3`k#FbOB95c~7a&b&4OMV&{pFZL>qQ3mAdUbf^Sbe4TLpU=utU4ccd zvD0M24nhwCK2edG)GHVs!cj*n{}#3`?yE5W+#V+H>tKm*F|o0}ES{xud+Gz7OX2tPd(l9yV_3(GzJ4a9fTAK3L{p}q zF)=f66<~72H=B|ScL@TmZpk_DacX>w^Q4_U&tg&-WF@;@gO~h$dzkzw7<26j`~^Nl zvU9HWOV5)+Lp}r^!)tqaH-8vAY!d77v767fUuiM0B@EEFwp3JGOfd#f0K9cENs2S% z?!w~C3P1|^+7$p|#ulGr8Id@FoIrqgudbtKFP=xQe*Rg!u@eml2CK<|&9ie=b(fB( zyDk3)67=1qvxuc*C4d5eFay&GM`58mySYaSfMt!CA4jwK8R+g^-i?mb$eHnu_Vbg# zJlg%hoxk6dYbJl`L@xn~YRji^qzPOkQ|5IAZnH46Jo^2GElwpbmP3lHA5q0gH zZSCbBOFMLi7?!_RCdbZj4(y`c9s$pO`9Q+a9qrl5)_pSlC)gQuy=W$@=jj${_(3x9 zg*o{NFcaqr@KXkdg?X$xNu2~*CP4tHYk>BIW+ILvKtY~NNhaZFV!T-y^TeY1T2y%a zRpm?GlSw%Wl)*3WM<4$1BpTt1D|1}8-6jRMX%`qk)rX*t|99`>yV3A>kD|fn_szE- z`nEU^3jjghiv}tKL61?Fl?nO;^v$!pK)9f+oj($ouJ3U&Cqds-L^imvzxfdeg8hT>*KPhLk6ZZh-*O=hOT?o6S( zyFojuJxu{bds_Q)Pk4iO86L^RJ^uK6JWxs=xeNbSHw*9Uxu4njqkqMCivECWpX^-r zYK+k&+J;kp)*d>cjabPv{bG`jygNvY&ldTA2j6Nx(PE&*!2V&twv+W10I;WoZO*L; z&t>Xve)lit=Gx5zc&n_}(4&`00|o25zN1~@e)u+e@k%b#HVBN&-=8ha;g|WTX$ozkX zikTQTp*6BVXRit-B>!=J7qt#`4!3*@NKI~mEaZY0=j26 z`XH%}h|4AWxT~Dr?TblSV8YF-YbC(`k@T>%pdwG?=qS-z^&zL~}MuD+@aV`IT z`DkhTq*S?)FHdb@zR|YgEr=2DnJ|0dh)Pt_UU@(&xHi~TAL}PUXBn!0&_`lfLFi!T zy0+~xS;@;Kd~!QO1(dsziTNk2HcJVBRluL52tfEz%z!rPa}H@0TtdTa*VmJa#!!kF z=zO46|IQWeTS5Egzb(dKX5t9`Ch#k-7y3EwD}Cqd$+dW_B|8K-@k#(4J7Xz6pnL8y zFM;+=IiTxV@^|Hdd)x&0$%Ux*?!Nrd-$s4?Y+FrP1&qFVYVk5m89<<=x)MAL_YV}9 z@BnZEDm*{fHe8;5{4rlX3e zfffTT1`07Cp2c>hwymtpH_##_*4&`FDC|~8z5?*T-Yw%m~xp_Q0fn_)x zYL~bN(VzbPTq4yIWtVFlN(AAc+l@6%c5`c6*i>2Ew|NRHyjnM)y z4RGXK`d<1u zI;?bgGpJnpVwnsOmi}vx0xd>YLp)tE)-L|f2&Y>0AN=mI1wgZv{0w0`fK3?yjUx>4 zGvPm34W)Ss-YHYnY@Tdiv6{o})=UO-_-=;oGZ$g5;&W4S1a!zGTYaX3IrELqB^bFC zxMWi9OVMX6^7!X>&B9{zs|V5en`d$hkZS-I0YAKStE=l*(|@Tw<}kokZ~aeYf$^mT z|1U)2GE28;{<(baQk($69@>V^5d@)eeq7TbIc%Ju6<3ID^ULXmZJz-v0d)#y=IQiy znKLg0J8hVI1OAAdj=;&7VM+k5gFY~)&!#(S$mJr69?2@;jT8VcGhqo z+VNl7n4nYmoHjkdYYof*R7Q2X$cVv=uFQW1CtGv>0eHum}U1%d!hVEGw|3 z3INJs3_fjuXvuiSScihu7P%IWsVokE_USL8fByZy1lVvv{NlKysUjx)2>B>ZwNR8R z&R@IWfG7yCzz&Mign?@p6mV?isH8B%&d(drO4ZdlM1Efc@Y$n}qBFJt^fN-?-uxhQ z4QUV|z-1b*Iye`X3~>GzZQn~UAR3nt*VnEUgWo)khJW{wDFKLUQ7GJr2AtqeTk;b#H@|+EIz{SF zN*862?C95MFa4tea6kd>rNG7BJ$n;bv*e&|&)tn$(lxgytR*AhZ)-QwfIMiw%dyVP5k1Y6&FUk#w<&t>d%X`vfrVEk768dDMj*MdZRxX(ZSEV??svRuq}r&CR*2%s`IS~wc0 zdc{fr1b>B z8ZGl|mlyK}Fk3kgkU2OfbX2(ku(DZ4LebI_@uLW+etzLrGT3I2$*Q{B!YYGGXu(W) z7Uo?4A=`;{iSj9p;k*g-N~I&{u;rN|`49i*qv%N6U=aunp%ex?vsw<);d2N@Y+J<2 zm|qce2q^z~qb+DGAuhyU?Y+v=?^WsAA9_*MM0(4@Uty*$znzjYhfll#zt{+CL= zxs1Mb!L_#}D$7278KpiLX3~oWXHYa3Bq7$EoGD+aptS7h- zpJ1{E?cbmf(=Ap{NOqV4XFNyzC5Eq<;%qVBb%iwK@3b0A09uyOBXdD9C9*7dyP8L8 zdo%y1?V6Chf(>;0afV}ve$R_Tc*$aMT||3fUh<&e5Ph10FkuF1mb5=9pV~**aNUWv z^8F&rLwS3U%zdP!um!)JyYRIKb!|c1F$U<5n%~570a%{sNXid?K}sG=7O6AAI}`_C zMp0M*(@;ABJd_K-`MKg~i7y~gB(tyekPx3G&9hsPfR2|EmV^jCg|FKxc~4f8vgA^3WD~Lgnw=Cr`5Mv_>~vZMi@fq4^906 zp-g>^<{^DgTb}-POrE8+nRdAJ*49q^XVU_6H#{t=ve>cf2h`8~*IPQ_CsZt~w`C)f zl2%30379}60ce7I0D=&TH2-<>V?A=JmFmx=OjP?2c=1N@0mgsQ_JL9am{kttwW$OK z9F2FS-0D4&ufNMvTSpOi_SZbaWkzSgeE&GcDN zkYy@acJNy1Q~Ums+`wQU7^OQ}4EwS@6CTOLxqoK&mz2$8@(YEQ#J3EW;8rUa9h73G z3=qB;Yw}}?u5GJXEC+U$N`A|-=?_PLZZIZz^zhm_ji<`hTPvB>{-E-#}Kb^xHEtT_Dv=`g~YkUxcS$=Q^)rWr-kHb80&Oe*A_A%wiv zew3zpa<_Kz7Z3*$u6qQ*m_N(eIw(wL`d9#{SlV<%n?=PfrGM4!c1yz(X zu=0)YhAz9RqleMcI5;D#(LE>2>Y(T36)&|!&?Im+7QQ8%br?@%N@+rx%i(y2@eUh= z{M~Ag*6)M*a~fPuKdzgCf2s&iGKF~;w)?cC*|V^a;Hk&Gza=*g%W0_BA9xYgOm^)v z`J-}%@Py|+%Z5j%02f`9>No3tj2h?aGOs9Qi+|Q0<3GMpU{%o;3MVv8)SYwdv%(>? z$GvrN!mAD{#RAhAyn|+-z2Ns;>xg2YBmQE$>R{ouEKz6!lGROH)gq*o!IRayQX1G0 zDZZ_j;dj~d4Z&z%PcQ%<)y`rB0xZ=BX&3s{vBnZ@98+rocC0$ZLpn?N2P5XOtNRfp=0KSZU>(_qZ9x(_~j>Rg{7{4lW({nOIkTo zkiv3`D*rvbEAxIJoJb>%k-(T*)QF;YO1@uIJ&1`>Y-@fMG^zT5L_Oa1S6>04q)&P0G_f zKaPgKRu9X~)5ltk*|id`I;3v9Wc5fXUi*rraQu(Ilxxe!Zu`po zsuZ+LpGCQ4?kpOvyl?LkkW8sX9t2c7xM-j#w{sj5-Gv!3tcNUje>S@S# zcp>v?U6^jg{*)?io0%8`5&UiS-w0xxrLS2Q_|abB1TIDakj2-UWfr{#{VSOOApRW_ z09Gl}Ja$KU#Amt}p_^#(py*IkKvBM3-D?^=Ro6S;->UxJEiT`7O?vsxtN@tvEFC{k zrfD8)bFVt_#uy;wn2lW};20>v-~H?R(Sz%|(bMNo7rx;Hc*esUSqv~gPZ$kn=_yJ8 zZCTFvnM=G+K)|tN1oG68ZifOurvIO62Y_SS0x&=`jl?8r+FHp&anhzR(;3(j5D`T9 z1!=5(nmdXC(ADY<^2-RJX9r9Y5PR~EM)+U2MOOgpHcx3r+OV(SgJX5554j1cgHM7) z&_TEP{i3p*WrDhwB8QGAnj{xx%H8W=p`dNf2ETe39sQqQ$RzrqCM04kA#d>HY9`Q{ zOnSk{(}^J?S8#Hf3jQ`R_BYEwR$Sg*+=c$FiuwbumTQJKbCNEZCiQte~HHb z_7f>lMB|=*$q9{vdz3Fkc!$PqfaF11RPIEI9+ORJZ~Z)P+zS8mZ9VtnIanHUX{!_= zEaF2p-iiMG=Eziu%lU|P{RiB7G$ciu;Qv-DxU8_WsnHl!|yM#_MG+GPs#AZkxt=R`}gn%^A160)Tlh3zQ2ItN9Nf z+>ahVd>H-y&wmo1@B^RY9ZV;}sfrWg+1jsoC7;DWcA&%Dzr$iwFotr@PHpgJ%CW`C z1+Z1|NG)`jDMa+~(MfcDbtgi*lP21e9}}W{3SZ7Y+xc|?e9XlB1UG=k_Ue?Wj#aHI z-;`Kpb;0v0PMJ8`3cOaI>k$53odktC8VlfK?e~7803CjS2R?)j;u3@%w+dW@W%4b4 zbZ!|R1*WKBuH;-9**CR!PrgSog&r!LljDherV$&2gZ({+k05DJPc~Y+6Q*Dtg1`Y@V5?*mL(H7&;=hw^Y z#aP1lt%ETghR#}&K1^q4(T0UV=FAHcJBwYOT|`$GS6Y=Ph@UK!{QM%7ra~_2R`F2) zbi`kKJt{hVj$FbIi(t1cdx!`W0to*Alzndjh+BQ67HV$tLfpC#`u9&yPNI8vw68Q# zDSbllXF|`2Fl{gQG;AZEzmB7a%O5=qsec?drofJ0C>ps;k7N8@M6?Y26IObrS$qjw zJ0jq+!vcQzb!f1{ilBhN%pZ7e#+VceacW|A38-WBqr-QFdst2^D}Z95Tg*YGQoY9t z^!Gb_{XdR++5_F9{AVj?rnnXy4aN%XE;EPLWZzc(y@@~NwKE^rAA|=pPosZmT(F5D zIE5MH`y1B`Xgo&HmmoXoNeRHpCxZ$&rH|=Z_hcA#v`fQK%A1Y_Yt-2D)lbfaz%5ZL z_`)%cP@E8e=B!6>p}%ywPWAkM(1~t^SL7&FMz< zLs&foR(1Vh!cEGr##IkN`-M^%Q1g_YN5YT%*juXbHq+V|0M}CV#xE7G!(@vkCDF}L zm!fK2Zz+O*oS@ zo$&iR!Ev^j;NcEW4akD;5$MiSU+{SR{O4%ImSiKX{OdW!&NGv?ApfSP5H>682;DxK z<)&qB@;>Oo+-9KPSf({7KiH0Nm%9>#@EiLOEIryntIqLEn@O0|3TN*ZiYTvD|Na;E zTm*Ck{4l8w9W+3!ZL#T|EV6FJayUAkGc7 z1^5N`Sd)+k1&rJRTzr58(IP?uN%bFH%6&uarTi1+AAP0m0&xc@7)TBu?ZSy@ckpYu zw*2QWWZfbKS19}^xHcLGXD9%S#tZNdvS4e_vyTjJ?Pv{o_^8}=4GniH6jVz=H9^q@ z4Ts+`T#LSQJOmd26wa*+K!~g+ovR(KIc0exewAs{CV{y_SePS_Py}%9=8o=O`?r1! zn2Q*KV+mrlISy8MZQ2P2nCFZYuVcw>+taqwyvHo~bXfXMl{H|Dvp~)W=!=uN09@a* zH~_Y2A%%cb8Y19pe4I1QfRA7;fE+}%r$}Hph1Vb>QATzcb=N2cpyS6}(50C1q-3|G?V+`Ga8AgC_fA10G$G`?tmEGV<~TbTbB2omFGZ=#zw3Iu4T$<%ePHJQc|_KOC4BD(^5enpek44g5U|z%dcZOAf+_UmnxN@&0EJum?`uW$CjxUCAWgVeI}sT0Nc-BO2zW1F_M3nEUMAC8F)ir3hl_d9uM{GK z-#m_v|I4qV!7uL%XKc4Mt+DObjjum}EEA>4^lA1i-LZlJ6Bf5~8t0=qddPyfpI1q> ztY-P@3CAu%dr&pe@B~G(MQ>j|u?pU7Pj`d?no*-)BK+qYbw@xn@H1{=FE)Iu_;3Ro zq6j37n{J!N<@9R2=gn#3jN72^c;Il4X6iCEbfDh&B{PZ+B(UuOFc4QJOcmw^sN;rKeVqr4m z{-k$zegglqAAhpRw#5nIgMcJh*gl;QIs{*F5}Q`X&`PI%nqpM^wbhEZm;?$+$krQ% zy_q&%t-MWhoA0xH0lHdsprf0XTf#nO&?o=(R}zZk3vB^YreB%{K@;5~7$G3dsfTF~ zX>yqonT}xx?LUR|z|L$^=y-rBWm!3cyo+!T55ZbPD;8|UIAJnEpg=!H=rIvQgVeuzd-ZpT)EHV{JRTKPZye|{7732GUx?g&42jdF{47d!)}1<7cfwz1eJ zu6+u!wYN6G0H`lQzws9RvA*Fx5X=1~ek}z6<4v0yhXHF!<6YuSp|-7Ykk$ndez|VQ zY^?z5YJ-CB8sQc(q1n8wNXKl`8}OysT#Xf(x^Xxut8H+&&=9X$XA@YV&=#^0q*a|RqH*t9_~uuf1o z%jJwoRhycJ0s5aaM-}gC9(WCbXgb+$l>iNCk`=*d#td&op!Yeu1nKd!w^8TLsoYYR zRD}6Z8pL-=-YOq6v>_XnbQi&j`0V6VR^!*vlb?Px$ea>@f=~b;e9dxIc!&!aNIp`S zhur|Wdd?!Cd+Pr(tfCZPanQvb@K35g9;5;wMBByrS#)uFKC6|XZEU_1Hd6AYZ@;jh zrkn$t2^RrC5YW%^#oSdeCQUBz`|ruGrEt<7fL6yTC~De(jvGQxzs~td)cyQHbo8Ho z5%m!Yz3>ki+E0IAn)v(sRsRAKb*sz>{xrT-xDHew{x^+TC&CXt|6WK6+k|tqt+f}8 zNMN=13^+;K(C!j)dyno|6OR>0XRPfyCuq|1qrstIRJ6<1h(!8#J6a?|jo}J3>I5Yh zbk2EZuuPD^$e0SBx)%tbNsjigO$=Bw00i{Qe#7$_6tnY^vkc(*{5mnT*s*(RRbhkbh`3dTGw*h-B50>rEVOa#Xc02Y

    =?Yu%0F>0utsZBqcDK7+1$+35A(xEqX4ZD7+8)+j-A&C zOZ(~dFyL1I-QV>}Xx~~D0}~1UlUMKDxV-FT=0jLsBW2dgh%`TDm_lwZVFh3=0LO9x zxVW$y`l*LmHL4z1RxL_4cL}EC)AxBxyt!6fWFc>`1weqoEX*aZcz+UION(=TdDm8~ z(-+YNnDDQb$TWs~C(T#qNjO4bA z8-C?DM+-sL_H^4ANN^6ySzojE%X4%13M<=cKimc;Z`CKgpS1FJ)xN{uKDI&Ntztsl z{NV@r)xDqT)7u7pm*sV@PNJdW9vuC{=TZ0mxij@o05JC!1piav2s+Q>Px&mmGkmV` zG!BOeI`J-%ywz_RK^K<@v3pCFAct81yi`CaPusz>_OxCM*h-c9)ge%3m6&w+k^ike z0vnnxCRO>>w(PB8Kn>@Ft&&0Mw)Wv$To9IDKfQJ)^~=ye2g91xy8&Q5P+QWsQC2fv z<=w$^FyR7ld43)}x~G7}sTAP^cjs2skpaZCE;b)bn60Nr_g-?-aTt|_1%cOwOyB48 zj`w8malh)+U&t74=t!`-G%-o%=i4WJpt5a2W3_LjuUCBnSZJ`A9EVB7 zIDY!tMIuiLHq5Y{bJi2OiugZJwNO1QIE`FsLbotBKI8S)*i6dXiUs4D*hw)TFyHIyXZ))UAa2n&QTUFY{u~Xid8+>8QA*5eu>-dLvAIyC|rmVTi#R4b_253X9Py*fNlT!lZ z?^b&qNX6BDsIJo40`T(UDq{g)6L<5`fbj>3Hl<+-8YjrLyVD$a1{fVL4<7*}%pY?R zQEmpdriT{zZz$m(|Nq&U;%4P<`ZgWPR{s;>Y}4|#_P!Wj_wi*k_|Kn5Jw-t`;Xf$c zgdzkY_CA+#rEo=*_9pO%t;FRUKPap{-5my?GnzsH0x{$7;P(%A_lZ-Y+RM^|N47%% z8t8=cV**cLK)oy_K`(m$FW*Knd+hFULfO&#D7KQsvsCzJG7#b_$z!PT zI7;y3-*1la81dS_^;_Rdt`xd`w=k04Qq8y5Vc; z_Z=&eC4i8&uR^k;!&~Yz!sCLsYG@laM@U(t;WqtuS}g- z%p%SeWB%J36#&4>SVb_vB?$%UnOw*3DhOacIsQP@{=zAYWk)&SR{HaA`)j!KbUgKU zOLkqKeJjVkRRGLGR(O9f7@Gh8sr)%G>qryk)kPKne$*^(pY-+WPXvI6CI2z6r11A~ z2!E&TP~ORmnAPEm64*oV$C5&-fQr7dNwFFT)cDn5U=7&B^g8#>qdwcf{Yt*jm_3td zTYknICH&(H&R|@WSQYla0;W;)N_%fd7=VYhfSh$4u!+OHI{A4s_;$fb~ zo zQK6duunQ9N+iU%@qCWd(L_*Jhw0+&KoIRr6*~*PV+Ve zFqUcY_=UCr#1xa;(?{t$+c;qxMYjFx69==R{u@-7gBS=qYY}*$t!jmQngi4anSjpH?@!3_OGC(^c7il zbfg5ZxDTPChY7oc=KkmRqQT#M6!q>a=uD0V3QBC?EmcykD}5<5s7vQUHg+M8fM?*^ zVy-Xq=v;UNmrd!v4a9P#Akki-lAMpx7MMEf5T^Lm`zY3!W6#0|?Rjk&&}gFOWA$JC ztWB$9z}QmAv{o;o);FY#TS+0uIOCPpwF18R$C>-VtFQuS$B)hNxwHhWqEC=Hw3E@& zM3)-q57w=XDEISiSU0U z4bF@~923$adZZZta@`o9xWvkdZXlYwkzEJ|u?qPsODFnKgC(+8iqAR?gplF89bEs=CcYpzFE8k$j_l%x(?Ril0h$ztP1s#?30}YC7Pv>Bu zXy7WkH|KSRWyWc@IyEQLu5PaY_pU%H`yGp)P|y|1zF${95(i)dqdh1j6AC((nucO$j|G@pNWi`#C3O{*5Ea>{1Dq;3N=*wJrW-G<2zF59oul0=)z?#r@w40b+@3Xs6?;k#kdSA#Knr;0& z{lNzj0=b88R45E4)iyyA;h*~WUwM?YIqSjz$~aR5ByAVM0bL*n)9%E3fd3#RLl=71 zm#fI}fBHg7fRCM}z#b_9x~E6c;PboD@YfHc-jys}Jgp;;px`=Dz0LF=;-4n#uC~H_ z2y{-R_bCPNivDH7&?~JtZUZ&R_dOhTEGn0L0(~!%uM@!f zbB?5JcX9U${?c|`t^8vF(3lj~W!`yXfOUXaAD}OIzB~_Zf4^by8#o@eGRG#u4@_lX zCl4v;BaA1^1LyJu_eT47Qw(TKn7l>-fXj&rTl9k`;o{0%x9-GPMht*O@FvgT1t-H3 z?F2xaCWwp&F2x0kHk-@nv0mfvjA-efyAqo7w*jqEgp4V&vrqH)vkjBY8%0;z0`T z^`se^dD4+wt?qg0c%AK=2TDQO>0>IV=U2wK_H5pJco#VNhZF zPy>xA6F;tyMbC*73f zfC42>T2Kuq`MMN=P@;ZCuT^_50lWA+nE_A+_agJAQw%GQA|1vKPb0d#93 zKkwERX7hHKQv!>PrUb?UU>P0p+=2i~3BY_{$3sS@3VfTb2$^>*b4gIPqv0^RzH>(e zHLaw{982cq#9%RHV&>yhLS6ED=B=tP8ma&&TkR=Qi{7|%ekVFPI(Cf_W;K&*s4+}o zhVcHb&qZugdYgV6;`Qdm2C9SC%yC|8MFyhYasrILR{jT?zSub@m=@qUW~<1GNn6oCr>LU)NM{AG$;Jx@aL zj9Utt9-Ru71?0h_fnosMz0__-&}5*vAm-SjNuSqfKr;=T+0+N3MTxg~7GtR(Vms|hU@3V^=wmxE=i-`T7% zG;LTZtSU%gHQ?L^gtr_@*MdkO5bbpE@FMCF2u;D=G7JV3A`B4;Js?N>mVIA;5F8=$ zRSA79fZLZU#Q<&T&HVEpf?hF+M>CE_S}PWw2D=0W{On$IBrAaTQUb*9o=p`5`Eu&M zrtjU?7MG&;t`uKXD@`c7EXIZE8FmCu>q`dFw4A*=u?h<6d?#O25&zDjJllGf|5n&& z!8c6!SKc5y3ajx;ZU3jAv{ymq_H=Cwptt82;CZF8)ae)l=d|KVMYWk*4AhAMiygz5 zS(cc^k4%X^(|K6j(T)ICRN2DntofdO8@$UB%(k5@1-jY*83K2}+7ti@pn|I+|oPWkON?Ue#xRn#15^`FS~8MHD>&CFDj zQVSbp)h})#e+Jl~Jg6o==i(k_n%a|j+y0oK$VL9w>Vhp}2Cy{bG&AujYSTGz(h(JU zO&w9ItoUuu$+ybwt^$T2ymb}$uk%>Z+%wVMMRExLtp1w3;vgMKqB~{aAr^Mo;By-9#$@^*3m`FIw+?a_!<= z_?DxpX!}uec!g{7%qW~c_OmPh*8U!S(}ELf;dv3&^UuQC<*GdiOblH%Wys|TU*GDv z;F~p9)EA&f;>v`x711*m029Rk$lTv5K)0wcaLg8QKDl6!0izFNe8OP1eeE5^V?d~1Rd7~IbrI0~7#i zUopJ!$?nflY+E3}Wq@mOL-Dzeqy+HE4TW-lU|y%hwIAwz9ygZCC96>XKi}%OE;fEJ z3V?8);v3`P^}Xowj39tPYcL@#VhYehlTsc=!Dm8#0Ov&7wD_&IWWpE63lLkV1JhVc z{*MU!*HGb~Y9`a|m1|5Vg%|bWu6TjhBClLb<^@*#`@ee>^?s|U|BC9KCVk5Sp`EI$ z4N*zw8kY8iq4+_ph>+95+LL|506_tbPGLb|+d~Ej$%>iR(J1Pa0IqYhgT&w$ccV!C zdi2Bd=;n`48dq(=@7+0z`kyG+hEip!3urZh%6iAvD#FW5UOi%BTgIAp1AUCG+FinA+n%=ASq;U#> zGV_~k9^VKK$sxM#-MJf`ot|b)I7}IkPTa!WoKMTjKdJqii8B=sDnEJiUM87}#+jd} zZ3wLS70Pk~^Z&xtp$*G#!s|T^Gy~NS3xE&tW?D(2p!XH+e<~kOn@dDpJmAs;>6W;ls@0 zL>pL!FfP0k9VRH~h+g_%il+YhaTNdbv--KV`t;~&LNx_@PeBX&TK%6H*ii-${Lk8c z3ao}s)d4=Hd;8L+M#lWn&&FrF;jXP}x?Uv}W)E%#r&er$rw-@dTEK7!D$|n^P>?rB zZnhHCC3yxdGNuGdWyTl+KaGBTC1sT+er;MG1FS-QkO}S2>hGAu25nrnP*(pT`L$thqG5*fl$Em;zuMG;^Q!ld=Fs1PGf*0T52qa&N7CX~MrWbwfWW>z`CI)MMsa0?bLGxxfb7oIrJXiiH`n8QP4kiU~$pmh4a_H6GUH!ZQK=Q{@1pv5bK7bWK-3hp*00>6ag%IHeeW5sVZ{BJV zM#=*O_@ZIc6@q240;Z?)->_(B{_ouf!YAZ+!hbN9hZ!n7F9fy1@9m^$2FGh{0eEzz z?bh;%30+YOg_E89JG;C#8Ym!7ghZR*O#z*})hdFl09aw%R_cm?iJL&=|8zxnTZK2Q z99B_=VoG${b?Zvx^P&9yEfAVax6?!uvI>eq08{9Y<@hF~-DuZ+OP*uNM=Ih6bH}yD z`j!!Jw!SOZPi3H3puDu)N$B@Oqw)O*PkZSJaq`^J44gc+SGmq zob(avgSvn;(!Qc=o~3;R#24@xdrmUzuARY#sqT%SXR1?Rr=G+d=}-wEW3Ak7wsId9Ln``XtuT= zX};;iEc_sOFdRsJkYJa8%!IBmm86Kmcei;{@P$GEMFX0b@dGezPiD5_Fri{QFd+C_ z-X??;`hlgNCZllSc$pML}*Cgzz0BS;$3 zA2ZJzdcmYKBUlJdt6IK(+k!tS*MGwT`>1RQXcqmKK7pD)=o8!eawX+x1$-jd3xg9O zbV4iayUq`~5Fh9q52F63QZOkdKrDaZ$w=`&>Q17A-n}#ZqyWhCQ)oT!`!9GMnK!(l zz&G`Q{~}N?{6bNw%vEI)%vk@M3jhOR!T6W^G`tpfVQ9$>qQ&nx zo-8^u5+g6k_+z7>t{2fkkbT#uM&HmAb+DAwD-TErKj*Y3LNmUB zI+$Y5=LzfV?-`!-Cn(-f$anoc&h5v?gS`HE9wvY7+rnS#-Hyy(9bg>PR|KwIlh;?3 zTO{D6E@uAk0oH8=qZ~tf&$R;p)&Xr=2?LY&@|Are<%uTCJz0!()-;7>lF7b=sgNh7KD?Hz=fibru6c>_h<=C$Hs#TqdzFuqNLtQ+(+>evB*m z0`kzEb6GoTk+3LH9LaWMksMK!upA(MK#^?0FzkNyaP)&v0Qg4m$Y*%Gd*?bj8sY+w zLo9>{#>12^Abhsd^Bi3M+X#yVX8xGpjOlIhIMDMwQ=1Q5R;xXTx#oghZ`IOoY%pAJWQs=UAp@ zXx42DHiw8VZYEzoh{oT)h++i_oII<~4;#AgoDCKE|1#=cpaAfVrFOu?&&>SNo9>~} zLv!24R)#`>+gB-nlyGb-<0kN{jXYnbKl?uIY2LruE$`Z|);*9pl(;hFH@UJBjj^s(wSoAjf!;>g({r^2mN+0nz zjlX{t-Tdjts4J_)-m&H+YfgmWbd1gIN@i*F->Qrg#tdyM8BMhCP}ILeY{19G^H3_; zoFsg9VCU2?R`ApwJa`#i4y^7~RmWDewR=fSAk#95VTiE{>p9~YfHkEoTL$Kp1TH`MCecXWv-xT61Au_r0R6CzbPx)FJmMH6 zFQl~@D3IL@S`Fj*H)x~=q#0lnm;jGHlLIqWG-jf3hUS{<)Pjix1Uw}2|B?=|PWerL z$M#Y-*M~tgk^*3Hq)&BN22O4Jhw$J3Oi@DfIK!Wt$nLpLZ8CuO`?rhcV#X$!WrQNC z09~qHwlYnjE`&qxhy#arF=q;8R_6OpAXjQR}gwH?Q{`F9Lg}(k&gTXz# z2Y{-o`OY=8J&eYfnB@AZ;a0F44Kt@^g`bHFE8z5De)_+1qD%zr@O#k1Oy8gbDOule z#|dz9O`kvk2F=q)xz_(onY^1%Mrz8KBRQ8%Fi3!yuqB%4TFdms?Y*7yt%`aL(9eZjLqYBE$HGOI8U*EEWJ) z7njO96_u&FAHLzs$WHKOH-=|v3%bL-xM;HAcsfA?QS4^ltFr0BvZu8Q?>6`xJkutfzge@3ti(_s0P)#a}o zR1O(ds*~$CmOFsVbwYZYsi-F0y@z57vH)OpHce_jGw(zYVqzX9nht@updG_(b)Opv z0(+6Aj0et>A(LE~sTYpWsVDhbIj1aE9LNRd@#zw!m2E$YV( za3>I@ihyMw&Oou#i-~B=0>%J$SRV!h>dfGJBly83S)@?vJ(4Sc6iy>40mj;oy^h2# z7rp!P{l5t4-T+iZFq31D&nK$Tz^1T4cOIS7Rf*V+z)!$7j{J0*riDx*%~gC-_T8lY zjYjBSK0z~@z)#HTLU_k|gnM3TM>B+U<=>lkq^btV z0st+s{=g^OezakO3YU``xd3P}qI5E)wZBN}&+>GhW#YAC)hs-$pAK#H6bncj0 ziYygktDx%8MY#0M<$@FL=2P!0MAKa?7>esggq zct_W{PjWYtsNYCs((i&4KYJ6!^8dHMN#XZ{Jndd4U&yH z&?(BDHnkX-ivjxY3Y`?5af=d|!Aj8hVV>{bB0OxZsv0lM>J$F9Z2aP*$X|I2!L0$a zLO~D$<9lX6Eq z$ul~xr}vJIkDO*DL~eLKzu=mm6c7_k-6o(@&|+!cVw;?*^G&Ng%~0~pgkJf%m=@}m zuKs&eIV%9S3&IC!Hw*D92G+Yijrza17j^HR`B&Ay)rnzn2&e^2&isE&IM|@EreE9o znK2>i05dZZ%rPYowgi6sT5VM{6#V`3Z9rzijtaDSv;F`Is~ZSPAGFd5jxm)7-@wfC zFkvmA>q$2$V|C^dmR8xh(S%?_mdgmD2ynQO*ov&`pG@jHr&0iXdL8vXzK%LFE1tZS z_I;apUs_WMuTlW?2mlx=06?~y#0mdFV|dtndoC@1M;SyjF6bZM3*hBaFi-HKWxF<3 zyb+2s^pjjuH&cZ1m^O0nnM;;M8P;?9ips#O9!nYPUMEAvP>^L>Fliu|Xy???GYVOQ zi9YD_a1L({LFN0&cax5y$(SnfPzCtCgg z?uEmN&)Xj7Vu1FJpD1R+H_xNVPqLbL2Ttc^FZF;i+G6vR%H3vaG0Xq3nIA4W%NxD>TIVgKs6 zL|TFvf=}%B6pBiO0RLgz0e}grr#t^(g(G58UmfxY^Zx=3*9t`)L{>UB9eyaSTr5|B z5hlPn{B}>Z`v1vw)PH=XpiV*eVX|GcmphoDj5!tsO+Xy=HsK8c0byg>YaDpMuT@a? zeT|sV+N!^9I!@>ERQcDwuMUbLRf;e(bHs;B{^+I*@QQ#C2D-Z1a-!{jTs#5_X;=b( z_5)bpqal<~bf_Vqr*!);-66OnQN#ywJ-K;s9^L!}CDrcgWppA}gznX;ToR`4RW=Bk z(3!wb9g^gf9R8|7M{sNv3Sa`22>;q{(G&o_eS$1@D#Z-^cl=bY7(c#_Vg<=#n>^w& zOx`Iz16C_awmO0W07Xv1zq?WZ^z}1=-g4=W+PMqw5I;d+XGakNEfQy>dwML(59QZ+ zW~UMVZg@0z0ab$UkyJ;E8(<0m6ldz(-jc>>%w;nR2VmwsPfj|HU%ZKKB*=11%S>Kr z53?Acua5Eg|LP~V@^AR`2%XJe=1vcuEWW^mu}v)oS`4g@0eT|62sZ#Wc5}+s^~-DD z)Np~4`<3P)d6&REazMOz7=eN(jJrFWx8y;wZ?kw+0*0fbBgvAFwB95Iy%L}kV-A-9 zXS%OCQMXL;!oTJNh4X&ian=K~?`8_B{34KGD*x7+A6R_=r9JLn-;GX+VgSrEmNMHX zR{zeL6)mBUaJ4X7!d6b{9XVJ!GiWA6qz7u!ha%M6fsX$ zL?uX|5stMzW&HA;_O939AUcgvRu!4TVge<+Apj9zj@40Cmpc+NSs9&42vR6!VBnfy zPd>Q!ZN)r4Nmk{s>X=|64cJ96&wOCVH$-26)xqr{91S?fodkNKpDT|g33L6=6_r-5 z0QhE`U$%c%HR!DVO99c9C4%jA;lBso)s9Ya;cq5K>p!~!F!$|(OH)=zG300+noklS zil!{MB6JQd`@}QRZv0XL@wd;S_=i_ftS#{@7Q>G+^=5lK1!T>b|ND1yM-+@5tsL|; zftaoyxaP$wVS)kx#Sb{vFUHbBN=J*iaHUliuCXG}z3Dci`Uo(B>j3QZ(^OORG@*~9 z1i(FjzICKF<9q6(lcx&sM*zU2kKnp6{@>q4qksEeeN6bMI{_C;3ih2wK@&8c#UNo< z4NH39pMjHIBz?z6`yc&D!oO%DLq8k9z<88ef^1Mu`)Z4U#$$jn&-dMmfHgKLUP4e; z=4CcFtLR$?Uu>)`v}J{O^z*x@7hh@)u%yP!6AG+jm%O$8$C^W;xUe;sC8Zx}XS9d+ zwAHt^l%M+SJB#UX{GJwr@UQ8D+*hZo|I??OLFRqUF z)b@Wa+Gj4SP5g5Anshmj7T{V4KFQ<^kS9#qSaAyOtx^?D`%H_4@Q;|(rYQ!9i7=S- zB@Ym&Z8}JFFHfSLO#l0z+%bP_|AtwXn9r>yYxHiPXg6l&Ow8@vKWNAiP)&H_B!C<6 z02_fF!QBh~w!+B6BvB`EyNOmqM?Xm@lE3TtHG;o_U*S8f>j~G;sRoMK-6}+RC;%kP zU|GQmXHQ$pb*@gLzTzu%rEKZll_KDh6=ywXCDSLqjTHb&00{;i`Uk71VIK0TJuFhX zBqJw_@?wLM;gCPVf4D0E%>iyCq)l!#vij9TwO3C*_yf`5&A&=OBN*VCJYZEUuzJnb zf4Bi;5;PBQ4QW4T%T zZ4xR9g7W5_(o~F5C|~p!-s;agt-2$WlZ0AUO(qEaY`rLp02Bh|N`UJC76t4& z!sN;ndG59B-=xAElm}&7bgKMnO9IwSp39wt`Z`U5#+Mtb@93{DtdD2Qs^Lnk$l?&Z zmZIf_w!Zc42mUXyMgew`jE~<>dH;56(7@RmP6S&y_)K`U@JrCO=ClF2(r3G|y_gMTvGT z6Dwd*8QXZq*ig~}fY0HAb$m3mZRMdJ=ks4oqeT3VH70Q^lFd*eG-dUly5(ka+}f{{ z@4J|?U!0wpaGR}3(qJW+OZL58UKJ2kzJdujwjVevB95P}3?#uV`1NdpvGVH&{Q|83 z9kGpM#5|v1blj8K_28G<_K!(;m{_I7FTIGl(SH6HzSD$r1P~Me`2gkDx!&swi7s-AG7^f0ocS%Bj0HR`QONLkQ z!{jFi1wtK`0MyYZwOdbHim?*~tI&pH|E$6zc*it-#>xel^Efv+5mjxVf!KT!q5nkHCX$YLgzd%*ZgLhyyGXHW*How^ECN*|i?q@*kk zYLCg7zO8fm1?8jc^GWp|NswjxKdWo5AY%neoIDdkLps?K1?~El&8Nx$&2*<1 zU1}$Qqob4P!;Qw^Bze;FtQ^7L3IFpJW}Wbl+qEfnXC`~Tk;P)a7V6QyYk{C&9v2pgi?va zijoq0pZ67jt;?#LPdpmv4}w~5>@p4Dnu3BazLFy_t9}fEZX(K!BpJDBNJP7iuwg;a z^vw4WjuH?sd%pSeQwc>{h5q^{+wzLQluoni3oCK-^esI>NXp~a9k~%m!5{(m=8sRJ zzN`WIzgAq2-#(7IvJSBA7AYQh^qbsJmyxRumH@Ozn5eJf0bpsL`B0dr#&c+;LtVoD z2&~k@TQ%@3$(kg-A~^N_zJ%?b>!7plv*D0l&2mMdd1^`zYn&=MrkQvXkah z)>@OnEC@In&q$y#>ni_nw-B1oKU;Esqaca6f#9mMC;>MyCJM$1dyW2{Br{J{o57>0 zU7H$=fuP;$hjImK33Pt-!ws#MOsXP^$&Hkg3|IOw7bY4&WB6Q26f`Bq;S{S9O#h2k{>jUF8$&Pw1WRBmEWWby z2DHZJb@Ou>N+M_ud)gZ@h7V|LKLOhOlhu?^1fLPBI5o$hJ{AO!Rjc4$8K9U@AlS0) zpEHdv^VaRlLsNh!0wlsI##;I8J-Uo~as#kcwFK{Gmd=FECh|sg4q3)r>`&v6XM(>8 z1b`O6%%$pOKEE>SH=kSR&L>Dvru?I?F^B#ky7}r!H2SN2qF+gH3iJ8=n;d}y(^~yH z&$SwfrzYkz#bkDCQD4+RR1J}0U-K4GtkN#Lw zPzO74CF+z_&Iw8;_M`W7Co}NA=&>&siSbWTY^-Gt={`~VukhVr_XTJtfx~bQxZDfj z=91*|xvTpBf?i+>c&!EPgWkObKte`i`TBqO*Y8E=68^U+3^P%d_NoXh9tRNx864a3R5@Ybu zra}zR-(m&)8-FeS$5wx4jh7Hk;TyV%i^)sj^qr0-edr!-pPs8xSRtcvP$rl@VM&?u zzE$`AGX0)BO|4!@_{~y7?KP&^no<|T>k?qf)UPfYT1FQJrxHy(WB2 zC{{|CJ;_2;5iR?9;b^6DZbxPmBm?~e%iTv;W{S@0jggRV3-E{nAlIqI8mDdM^EL%- zCIjeCzAr#$Fh+zS1WK-bLfDWw^arhmzWeWgkrF@?-`5iS7n!{JcQ-sD=&;fm|5<|A zlUMS4e-$17!!M%Ymk*+jRy)&u)isc#G=Q-ilf@k%9B{0SsJD$)8$z}H*NGV0iA77a zPnd8qfyQjma&1DLQ2-1S4A2xMJ5T_y;{tx?W_{sl8X6L4g()DP!sk1_ndzb)eqbQZ zg;~207|H0F z#JT)k>udIBdEQ;-C<(u<9cy06iXP+5yvhGAK{q~C68@dSRrX^Z_C;i|ExMu0*=j5+ zw{Xx!A1zyfTb56AlCik}AWR!0TaEy5Zm}1ZXRRiO+L^hnr?n*?=}GX%t^7!_<)(>X zf7I8R{i6Utu^%Qs-+(t@MZnL+4+wMBd)^2I0PRpFEzai(>1ze#-krO0gAB~HDV(-q zV(nXnd!)sMx;(r1n}^GPGe=bEZ3U)sCQv1jrx*D|Pk0%mJ}ADl_E>}gV`uu)mp^Ss zrvLqiS8memGc$q4_a6bxGA9pc66k79+xge)IGSLLCev5W1A$B|W^Vpm2$LaM;R~%* z`1k+xZS?-X{V}@v?s?WH-Ir1I5tPc!;O1YxjV1~-7(ag-4gdDBeBrOOGOaq1z&ZP_ zcRn~%^%GcJ&^YP@X#OYI*fyo_8{i4-X8Rk!%QFN66aZ-NG|>3A={>kmObYD=px6t< zVyL`6@D1>sQK|?&7)uUh!1i$3d6WO(=7Kd9D?v%Z3WinxSQalRl(wDNii%0lXyjat zdLd3reN2;9RvktX_UFKdDgRijGg#u=;P%Tf68_$@bYkrZU|Nif`4VuwoUG)MqDJpP1Fc2gJp_lDFR{MBgd0>}y3}(6(B+OP=Lk!b+ z`uRGBkLo@LCMp&-k!a59ruvzGdLpQH*(YAgkM6asAik3yGONG4N-3NI)OeIWYz>kC zVCUhDT>-Yncc_c;*y+2h@|s%(_baM~MWVJ9d{zdu1!ktvr?BMD9JmV9hXO&kU$}B* z;42Tpr7U*FQlO20coB^x`1i2{z^&KVT67R=w}e>15yyWK zjxhUo6OP-Am0MqTH=Js2rIU#i%Tmcz#xHI?va3JZ;)mS|YwoN54AfAW? zfVqH{$W9hI40C9XRSm3VK%t3osbqZjbNV^&VF_$R>dVBvNE;L8+xv60SGIaE9~WUAp>a&r zaE&;4+=Lb1^jwJRUY==dI{h+?LI_2ngwQ$DkJTnk97Iy)n?njDBu4I5K}A;{c1>`{ zT4g5)--rM8Z8T!#KUgKrm9o=I{I$+3u7ktd%p+Ry)1+AGIfa+yVDP$3C%EF;{t)Pf9>8@Gzgsr=<#KjRY3gWjRn|*zs0Y#`j0ZOO(_P5_8!axV*#C*X?EgsVxTd3QzT(G2`LABPlSu` zKOpk|Jc_Ne-c9{B%nE^$ZRc!tIRO+L!o*npXCMs|P2!nKx#kJquJ+sp{2Y-9#>oc> zbOg_1Mc2bFNJcU%fB(?W36BU=U9=;tq#5i zoeTJ9*48v#1y7s}w|sUNcXxMpX>oU_NO70q6xYRzyHgwr#a)U+p-|k5I}~>)wl{BX zzMn9Ylgwn2GlL%cNXo!M^S>?t7m0(n$FkhDvjfvfQa$}Yq;@|!n`Tvm1-8Exn$(`5 zP|Ukl*=ag^T?w zk)8;@wf>e$ui8Pn6O7s0)RE{*SX*+$IR+so6jC~bkix(5;tsKYfk|GS*?$3T=MV{V ztcZhPR>q&dG*d46k{%A^GN%^AV)lnRZO}8Y>e|F8r)8o^zxAkLGT1xzOT~QuNr2_r z#y_Y!j2k&0?(g}vHZRUI=}AD};o_MmFfBxbkZ;pbS#I zHQesSN?dKXKVyrn;I@I8Dn4fZ31)rC961d)*2mMBWvsK~hp(=Ai%$H<9o^To;K_

    `*cHK@o^tj}a>2<~q54Yt;Gmo!Zldn%Xg>(sHr_{799_w2V_fm;D8dI&eOF+O zx^fW9M&$@IME}aW|LxwP=xz%S;2T)Tz8}fJp;DdB$^LZs#o2fDo9u_66bSn(1DmC*!*jICIr$H(){R@Z zFGze@zjmK5Qr7?rrv|~dV|n;L{`+ij_k}`8gMG0-r7n6}-=)r$@2c+4-0s{|(d_J_!)jN{42Ca;rh!+ApQT&^M^7ixO}r8@n{1`!zdF=2g9wd`#pM zXKNG)FOsJuAvl0MzSo~vHGj0Z1^uy2C@4&9r)`3VehhK*>L_fWWv88tBnX@6lCYKP zYn5efV2K=>#8)O)i8 z@Hf-^0(tou$QJH`YbsK}>o*&i@6Yb3&3Q{IdO`f5pRU|)D7Zc654CkA{anZh!_qAo z$dI5@MN@^1iS%SK=K*Bg7qs+G#T8D1<1YTl0nYsz3L=w66|Z$`AL0WNq~!JEY) zmTzinp);7ACHZWEvtA{}D*B7ux~ntX0Xy@%-xLD?eKd*{S&8z)&TvL1tb%{ECwcFv zMU4Uy_L|fJjkJ%ge%n(7eSg}>=vR+b*2poL%S1k6W`!pF1QZ| zroY!0_a!n>{S~yQ&MlzgvI{f~4b#=&roA;l2~6N@JiOHRU0HxlxQW)mjaQ6_D?Y;H zRzI<<1gF}QbC?>@7(*I)GOnQ?GSuEQ&1rH-(rVxU3-zA-|!yA zXBW4V@v6da$q-RjUdh(;+~(w{JRL>dD&O%$eE;x8%>i7!AL2S-bKF&;ob_Qi26(^^(N10+xO6I1MEzYqulVf=OX!U>hb5d|(7RpMi- zXqIb-;>3VEYv8Y;@D63?4Xs;MPVL6_IIXF=N8xSLd8yzwp%ADJQu~p^k8Zsm;KEZl zx2vIVZ2M;f9iD*`MEbqBsDnS+u#N2{$1fV$y zbRt|TnnzrP6w4IHJ5*jj(O1xBi2pn;=kPiVHc8JU$1 zA0ctlY;~*Ubw#CuZcOB`hMFd3!F)40xPZmZ_~G^)$($Gd2YLpY&igMTJAI*M*MV?m zb`^G15qm7qK|TMkC7zm>>A}Qh6b)j9*iZ0d_&C1S#xu0jJ3pg8!mWw8`S&L_pY0sU z%T5MY)@+9c?U@)|aIS(Ac1Ztzn7=MoKESt}0bPOW0SV&ia&}7zrk@jo@Gs9Z$S}iC zQ|!_!1Z|8&_3yI?kS*Zh(+uj|0_v0P@CsB%(&>R5YYe48%Oho;x~Jt~L_#c$IO7`m z=av9(9X^5s+bw?cj?2H!E(5#Dt*lhLCSubf{r{eME9EW`t)5c{&SQ;qRj=89rxF;< zD5`Z<9_A;hIforE_c z;ua~}a)`?1TD~y<{B1=~Y)Q6{d6B*d9@?@H+W5(DuQ>&tukV;!Y|l<2Ec^mCL0MoI zapTK<2Jf5e7lYrow?JxGc^1q;-&dlH$O2|zU2rt?Mr#5%C9jpB#bSh3tA8tJ(%-_n zBoAA00VROcCq-cX^?bjwcu^Tt_%yYPPTG&@j3z!R$Q(CEvmIQ5sq@0)iG^(S#P#~| z-PxMc zuMhgQBIO~ZCBf4AsvKCU$67zpjRYCElNrlzXni7uW!u4yh2v_RK5^G0BMhl^@~}$l zC+Q^yjLB+i>ozKmM*ZWkBrD%O{Z%};Qz}-qjBQh+gRPb=%q^S6MAIk3VOq1}DH;34 zbaUi zV`U;Uf35;793p%x<7Diym(N6I#0*C_dO_jkHh;&~ z#ZIe5cB>I7t6Ff}@LB44;}MsdZ$%pW?#cw`iX zg2FqPfy{{hjW{Hqc>HemWanWfV*oSwi!3NnzyY}hlK|IVoHdNBU%nKE-OTb*47jeo zrTcbFXp=xLMOw%;-$sIcDdM@GT_Rw!M-IFk{m{qOA^8T>D;(}T-7iK7b@cDoEQ`|I zro6aV?gsp_>vyQ2_cCXUYF#9lrWdLH{|FXcu1L?GG}%(DPKF*w?^n=DJQ?i1^w^K= zL+jfEs;QtuAfH#c-Jy_DiOxST67;CSqnFch6@H$UkmZzU!-JqXP86ZEY!UmPV99c( zZ9yTdhI{M}()~qDpZ)8IAOog{GG056Nwkjttj3jn_zkWF-^axAx$W3_a9&E;pbkn? zne!XrniUYKFlqs2Pl@kO#Temg8yM~yRGMpQH;luME$$bFS`Fa0n;AWbnSi4c|2v?`kGi-+Sj>SuZU~zhm8dlH8AhW*5(6_!hqIbM6l1op$N>X2jVi+U6 zTfh3?&$CbdU=318<;@gu7&Q*`a9bdK_^@j+?yQyF-{7WU11jdk8E>;HD8(!o>%M-u zZPo#-xIa$dkK_Dnv3e%L%7S4cu3%ItT$bV1{pzZ!{1a0~a7oryT`}}fIPeUTfa9@ z;KYhwJ-MTurO`7J_7?em{{;u7b61aN|t-*^KE5zjUR~5TK+IfA*d`Q>}mV#5I<=Fm6hI z1gaxaAjeaI+~0cwV9#vI{HYs@pNhZs(!pRzMKg6|{(uHe!!-#Lyw9G-SCxanjm|`c z`1{|W&_aaWuyfIZ_6@v7_j-hInTskFc5!BBZ$- zbO!MxllAT~e*Vl19*${~>>JZ}gABV^Qv+}A(a~X7IxfE}O6bCfd>% z_?X$IjkYfm?;sq2qs~nE9rtv{yBHz8YX}CsOw3IcNH&zlQYvgX;yvE}OENabpxTg9 z2_CR}fxk}nc^{(SsLGoHHlyo3eY0Iku9?;1JdVFiq@i*&br61ob|CQ6agmBh#vV79 z5Fy}#K?rT5(Wt=8v1-MKy+L)eAy+2@{8eq^fola^0zGr6z`AUYQsPFC_qg zZ`hW0{)l7ZvgGgw}iXU=HgTDLoN8d z!79I#p9b%BmP1*rlC_zn$V`TxruwU`VJx0?kD)n*exF$5L-z+@++if2sCgBhN^si! z&)(u_h{Ii2ahBa7BH?-~71U8D9f`#*>p3Q0DCttYK1RUl3#b(s0s}R@>eHA@DqtyQ z$un*z#NY$d?>9(Y@Zs>P*%xzo0yM`7R>h~_j-!9nba%P>tTk72OExJJ0=|omx0H8Z zC*y0gf0ezPMQJ-;S6~&-fm^-iqPDY)FBan*xlX(MVmveV>F!7#O}#BCT%It{L>{?Q zj+TjPFdQsVwM~w2Ba&y{Q=UI)lU+m#I!c78v{WR`cOa7tE`?5!$XA${~c;R9BI zd9ZI9g0e})OT#14ORZ`d7Zeq7wU667#wo9&8>HOdovIQeFOb6XLq(j+$1Gg>4quX51!{_!$3 zv7py;{9R>CuysLV>&in+%^yBZQie0dS8TKB;>2LV(WO6>>+3eJ@U2Prg|gWdpUkCF zQ|wc{@Y@D<0LL)GquhGp=!ZyJmDdLFuXX@Re-s@OkS{WyidstQ9Gy=BTWh*1fk9!KO6q4gZ!kikd%+f3t1CDz~r3I;K7m8 z&E&SEp$7 z%sf~0^^`6YwXB@!;Tv04sQ+-D=)Al}(Z{&L^oalcxo&0yY%?t6pvGO#eGt2=qv)>Y zYuI6otknw6#)5W|23+cnQI$gv#@TECS_Wvc+evMeOS38H>rmQb`0~x~ zY=O$cv;ZUXEPNbV|&19Gj0=H-#CEK~>m&6@IpcLfWue1^2v>t65F z2!x$H(3Adc7#MIsamD=0W&aSg=UWdMMkE~-)DwGFtBrjmc4aAkhl*7Mj&}Mzd}^Lx z-A7H&V25%bQ|eOO?xhmuf|G41+Ka=B$!-&{`_IzSwa817X`-#N4cte#&L=!pECDq} zPHl}}XSgI~z8q2af(s1~h|N3KYZDchy|i5rz91=V8^!TRRHa&(_)%y82!B9C!c^0i zP(dzaozX$uG)q&m9T+5MRxAaMwrHT)TqumIUUMkkNT3$6{?9&yH^}Q3%t@AqGPPul zQpdpoj14GBm*1U^ho?+fHNHK4?;txeOxrERGBxlYH}As>seTE57|?y2h~UWlcC36M zr+qJ6Es#iW7x(w`GoG1ppsmE-tk&pVRP=CZJJdUk#o~ANi&Eep3+y1doha+oU(6n3 z89fGKMo|{b)FH_9g9BDK#6D`+mWGcucbJ*|lQ-7Bt>|Ub;f<}U3wct3b8N$2=!2~% z%|EZlg(9!Vwn`K3S--R5;vVq4SV?v>HIVQ9`|IoBt0qx6sOVn<{8DGT3K16-%U(yo zVmM^1vR|#diq}6=_iJ-wl-+`Vm=?LY7>vI!&abrG{WRwY4ezbJf1t?6D5l1}c6GGs z+sjl&JBmK#50nz#i~ju7oX=}FjQZ*Q^7zAYYrhn)t3ETsGD%gCJkEDlh}mU%456Sq z1Z#JS6@gSgFsG{Cf!EGFK~18w^sfp?0_!(>)_3gNUtmi5cjgxMC_puf)w#1SkBBtz z6E7pggJC8bZI@S_#D8!Osqkc^s2!9-GX0JTQN8@7Ka?hvHXytqr%x1!0GxhK!9Bup zZcQvSTg(X}pKyKIWNg3}~N|_9>HY99c!v#liQD zUNr3WN<*WxiPWLc?dO2BB-l9YA zDx9+$l99!F1Joa^j^0Z`TrK*`iMDQ#sf+qlgfpy}(E-Ic8Dh9|1FXiM@XPQ1O@hIz~zvJ})w#=%~VZ(f1Mg`-4wE14{oaHwB{eir5 z8%ur&cXm6>acD4mxC&y)0%TE!CG+djrRIBm8FiB8a>WxBoHfVvJgA&%)d=2n%M{YQ z6~mlXfYo$pBV_KhL4OO4@PitUAUUOeshJ;!6GAlmkzb<~ac|OqC3#uG@dS&B1uJ&i zX*f%)5ljvR>L2}{Y@k6`*AltOcsw0hjfi2;+Q)KgG7SGIni?2rj#sO9B)y$2hoUvtBy_`eUYdfXfc;-7y1E@=K) z=!GjGIXDHzon)qEyV#o4In?)wZ>drwpLxT?C~%7Sk33f*EYgc#B|7r&23YQ=UlkHBg-_Jr=sG=6R-BBF&HkiH91dZ7j0oz(=c`f<{6Vdb@J$hhI3O+kD`#_QaP6*uG!MRSRM$ijl>Z>G)rf3h?9r+UBjpNq;yLu3eS#J!!X;kP_#nFTrav0YOau9tN>s8 zipi~r>0Ov#|M1oOi-zw)LDV2^6sXnf=DyVeF|W67<7X5A&%xO{BE2XZA{*akk7$a{ zA61#&p2-(qQs5|DHvP1EiCZnW*GMqBjuh^#A-Bx~m4(9jty*BkqTs=+@ceBn;&O4C zl=;AIR_jXmF8ZlJ;b`HvB2(U@a-LHY;NIx z=c>j{Yr=o89;aZ4#X1v+?F)?|czL-i7E|zoG;0{M3?TBLSF#utn9a%{h1nJojEx^| zu<`J>o~h0*TOhYl#&=JHJpWMn&i-l6^OUU60o8L%N8N3JQ5um87=;!LmQ=c&bU51s z^&cx51dbzYKz*faf~fMaTu{8+a!DjG@5)i_z{_ZZf31N_rdu`F+Ncz4L7%b54oDS^ ziMpMk*XCqEN9XA4i)0yff5w3&B>(C=O&V6GRV3Ct=OTBA=|aPhHIIXBdi_4eL4{#X zM@p=J4iH=kDiEM;g?TuIeB#RboRfpCSJQ;+yC3~b8HrS|nn2c*(OAA5taNx_q(&DU z?-0y(WV#r@Ze`Ai2eqHGWiHbbbOlN9)4X`1>GZv(Aql+sV7S>mdmpcLiyhl%1eNL& zEktxJH5i!LD;xer*)ma(MtP9$4(K>kO?2d4+EH|f2Hk;@UWLmdUNoB z)l)u=t)4g4`a?vWP2qJ-}CLkgx# zkrTh;I=#V~9vD;-b`^RUWfie~3p_n^^wb}2y9V>ma?T!LG!8BYXDX&T#_4)iYnipL zusk?;$utFKrsNM;*(fGdN3QS4&M~5B_X**I`GoE*DAFW@agtc4u7ckL45=C>140jx z99FpblKN;V0Po@kE)Z`oLNOnl=k5tSMfcHPiS(MC(b1=3dvVhEg+e0F@|8)=elmYf z?(d}tY$6|PJto}ASN~DVR+N~h_dA2TOTJwrX^aD2*gnr|Xh2CK55h0{d>_h>eSLRW zEf>skqGwOs&rJK2w18ZibZN(ZiwfdZ4;LWLlMlC@X)f{%u6`6I=p9D8g?H7KCFXIs z`^1Cw5uwkK%aTHng0QLo*^#Q`2A3G{EAAk+Oc^c?UF4PGax2TC%gG#M(X-xk=hH@T zSSTs6fk?FA$FwjDz#*I4j81xzY zk(L`!IAi6d_n;3hJOg-LqEhhpP~l*P%BW*9X8oh1I()N2HzgM)j9gH85%$v3`}2k1 zEci=_eZG$f8aP=3HV{NAZdLOxz*$*V{c>k}c;EEhZ0%yJdu2ea-cc{@6$7#9ni|-P z4-+)e^^O+GDs#~oE5SxPu$7yM-49`0!T5Z8qsaGkS9M0Qg(i2Nu1l$T-}^lg=4C(D z>vVV6B3pH`2--9+L_;X_?)t~^6O-$0M>9M#3%-Nh;+?fv{i=vf9^wX0v>U?!Y3r~U zhTQY)dz&F}ACd+w8@-0EJ;888h!O0MU$=`e27f^hMJRwqFzCb7a8UT+VEgCE;7PRO{> z6CCe1!%)I%S_zxF$1r_vc`yMughegkmuatYq8!bkLB&29yJf(C{Xv zQU@u=k-&S*Bxtf?`ML`zmQbVTf7vri4InmXVHe1z-Nd~s!qVec`Z+W;rrWEHyACxJPu}uRL~{*X6aoFFI(;E#pykvkf~wJ!kPwx_Qt<>Ph*Xd_-1}bp7Hb^P`8mQ+vn0*au?wTzhS<@mq#9^asHMl@f-Z9;zW<# zq3`vBiP%9*r#4b6XP%8=Xz=q6$+OL0Ar3yP&)>BP-sD2nVP#WIq^Jlk4RH1ql{N`|Spw=ovTKc3JyjeV>f`s15@_588Roi#tchJY4K&V! zm~|zOEfy9>@+7Y}4i-pzgWGNF^3pIaR39mFc#qX?Uy_&|jA{Z4sMzTfx31o>*yGsO zpabNjYm@@Smin9t;A3OSa3_V|UYa<@)daNGfQj$9?#jl8ubCdW38`4AJ1yfop?%Vx z{WOU4IgWCbt}`1qxz#sV?}Bd@sIMCH+V>*Tj|SbTS?(~gn-?EC|G640{`6zz5B{P*GNP4!=4deW`;lA=7D%7| zZvf%KL;<9Fv!z2_2gD+cJEl@%6Zw$U#%>wB?U`?4KQ$3>*;7~68n}0$_kS&DM`&Zi zmcUA9)TWa@IPE|K4)CGWP|VUm317?WE{!+JbV}Nk75kT13y7U!5;H0>*IN{cj~c9n z$_PEY22wdFfy=e^)Odw&tY0vLeL?(CjqKWrhoD~v1}Vs-5q{OL^zCSA=8!cT`F@(5 z7Q8s{KrGlf{|T*m64=@s(Y5S`^kftD@i?!E0GJ2`svYoCByvdtxDJ;Hu938&uDq6! z&)SNpcKQ|$wVGJV>g(a;nD32t8U7qRN!Qr`W?c8j<^ET0jio=q#WkPUWXUWo|34L-|Ud4NL}i>D^}Ag?kf3mu34j6_{(3XKRK;s5OZC@7L<{Oe1=OZ797 z81CIej*v87dy5a&!25RFXlPIqsxMqU2hkKD!fT}UBIpsRk-%qBwOTUqwe`5@#F8k$|?$LGg|fRfalsll6JC0 za}lc-@1f@+Xq_GEyly}55AM&53txB6G zfoUr%ulg1uh}H)`^_H*5GjoICp+D=;nK4y{ebbCgXBOUr`pRX{#V*6aA|2ZG(l;KL zSVJmEp-G8^l!UG~s`!?$*TB4zhus#7+xK;b>I6?jev2v>N)YJxT2Q`Umkq)c<_ctdbyMNEu7ZohD=g0 z=PTxeVJ`dcdUNBG6C9AKANg6g z)Xod4^@EHkPx7}g$5GR!+>)?b0P+=72uQB)%7=m`BC`i>>Aop*g=O0UcB$8)ra5&- z7C;hs#Nb?7{nXgSaDKlvGkkjO8GQ)FH4=q#$rpj;9M{t&oy=|_;~Li2xeIc=Dd^3< zVzW5}5z62WrYsgsxhjtE2bwbj?F%mn&KB7Qc(~;N*@gm?am=bYF zJCJF)A;kKDd5RTLi_7j-q1n$~h#jeJBlm0PEAsD-wW2}}Ec!&&kzzgyFhs@$DPDH6 z$b}y4Si2-qi^r(*Xm4nf*7I+f)3M{v(JgDNzM)U_O>L3W4I>(=5wA`CXl^jI)Xe-e z0u)PU=EQ)E>_u&yp9>l%2%LW#A9K|sBY;yHl;1>fEK_uF%jO?KCH`)&BsC!OkY;$N zrzFm{?PPC-<>g^d#(XbV-Cf}3@Ir^; zn%r;x4TF6qTz&eH(kB5vQ@zr>$EzT*= z`2BmqJDPd6K9IyF8BO;zcC)$9b)a?L?OnW=W|Q z6}#J2J$Quq_PJ28E2fnnRaQ|U0Oa;L3`3G~zO6EoNYnCaIopc+rpAtYs+0o)|0Zm4 z1~ZHA{8GEq3S<97B!j;PSY>i7#Dws(8?YKVi06+AIeaER7|fn1ZOJO(YyRk(OHbm3 z8L~_dXIGqch&-$66e^OBQY|1%1)_`~{AubRKGkC+-{jz%CK5U{eyegmNr1%}uVXvL z0MWCvb6^p(lMf0amCpT$C4uRhCPFOasQm7tb@a;+QD7Lg)pJsXo$dAcugX z=cvpby~^+2yoo?KG_(w3SG{&oh%KCvrO9A10bVXMXi0r-|E>XNE}9|vm%o>qh>Jg5 z&T$~c_Su^)d{uQ>Eb0;Nd{iB5S2W|pQU1KBeUjaSGZpKKj$T)*Sq z5Fjg?6GU1AIJbW8zw@?hBwhRFd6|N|$jD(=t3$am4UqGJcor&&*e^yYKbhvy*@r(4`hj#G#ku&?I~isf5~* z*G>p93tfCpU;7QAsg^g%R}$O62P3$a2t!7kmfjDEY>b}jK^};@(>~5{<-57%k`?WJT zqc6`}9$p-nzpC@UggZlR6+{yyQTG-@!p&h~N9q$#4lZ0XGj7Eo6&nvj?sFiII^o8X0k z-I0qyxZU!@^g+{=KIM(fN^m!K@^}H=+-Wm-4+YK*Mjb(~Rr_6XUbQ?%)4fh~4{@`L z?`H!{O7n1i5jtIvk-vP(lh51`IxRXgE@ko~%Ur@&A4h^FIJ0#G8Xq=5eFXO{pM4Ew zUko9;O+D46@I`%Iw@b?Km!;+9`ib4+bKA_`o|3ZIO1r3;R?E3dR0swHeE_-~dqw1f z6%b>oNpoa0xKHe1(>fJv$u6Fzt&=OqWp=@ONtq0LW(#9qU>dWb_y!+u`^64R04S5( z!ZWLz9VsHxu-`T|$G6-{#WaIrc4$|4;~1@)}-3jww}KC1(YDEwMs>1W_t442&1( zh14g!n+~>qaxTCDTe2sUyuAg^!`>Eln&iWKYQK{s2%((<5WBofy3m9bvz7x=Ke2_` zpMTjA#x$ls-k6{#X1%|-Yi2JLAzMjpJ}cNEB#VZPFu_h1-`c)uk(a(FvTH$<7<>-G z==@3kSI)Or_4JbD}WO8u97^<-laj&8}T_qmB1!7k{&Lcp3*9ni=t z{(~Z|p=0RkFpPmgWIygC^M?)#qbC@b9QOCw?)!6UU8cco$oxhb2IN0zj?tj3l%Q@y zW*D2c)nSe~PTqWL%*{XTC*)9b-1#>2=$6}8A1qbIA+@5$3AJU5FORUjN8~qD)IsSc zY8Mob+W5~%ZOl~VuFWgJbmZi1;e9!ylypKq#RvTd_y0~H5eKqEd9?m)MeEr1?m2)$ zwIw1C*&FsiS^V~ca8yVgkgR0nh_DIpbL4z5kb@HPfVUzk7;H38^EbGID#UAfK2$4{ zngeln8pqM*U>joF7a2CZv%TqOUF_=YWXnI1`+B;_2h#99d3h#s-aNM|9Qb@({8*2& z9*5)zIbT3-SdiatX$%98Oy;49mS{a0DRJ2DR6Uk*z!i;G{5Bb8S(080@DVDCyVihK zF{d~ePmuGPc_Kb0ZUU6esLFYzHSB}wNvt=)ipWV6mKkLBRbTD6{FHqBpIPcroLe7K zPOYOwj;&kCBuC5miO8f_#m78kVt_hYs+{I(Nk7<*$U65}gF9>^!9m|(hhb^hk zY@MO*nkx1&t}n9j8p6q;2rc=S-5p+7A^DU;JuZ8=`eAFLG_0RDej>RN{W-F0SBBAf zLD8BN->2*s>&0xkR^4}Ga!pPGXpKq@EB256#GoFN?2tpvb2^Kxqqk-Z2=m0CXjb-_ z)*zR}^A@q(w1^MJu)=VtB{AYVcU209k;wiY46=CRz>i>?Mzd88k(2Ai$2fY_k(^g? ziZN7`!!lesQt+rn1+!8dE$!>2j6t+hlf;{Z|#p!EI>ya{I#2`HFdlMipXle|UjQ z+m~wI$bqv=cPP8${+G;DnTtqX6g<;F2PKAw>)|3+R*46>nIXCQ9)?Bzm?OX80_^P& zHa&_owg&MZ(!)C)e!>wslvBC@^!JhHz5c}LL21}qM!!YQIq~+6vBEn<;5;8Nz>pop zODQYn(4v)yM!cx>`sRpGgX{X|RrA6@i6{^z1cw(ZATVUizq3F)&{Qf99^nNR6kBfa!}oT?rMPG@ zW#kkK5Qm7}$}d9I&T;gn_1x0~m|XxbXj_B_!nI$rX(3(LI=0s?o|Eb`UemtJCg#@{;WM?{AH=? zWs3C|+SQTFSn=X>VoStYL)!4Jcp&MWsl$aY9O8-16Rr2>>w8yN*R0=krj}SVCRJhx z)6@@*izh1)-e9l5C3rLsDzdJ=ZI;e;?Ar%4`GN98jftb%y_NSrQVIK1l-@jPe41J; zU!FelJ#MS=>2mei+X75-U5QIOYf%N3rjPnW1Kp^r9E1?Mq2R|O42NHf{zJDCMFJ7( z0p4}ze*;XF80EI~UrI9%&-Nisyu+W^;*!`sCbKkk8czqMJDBj zbL79VBo@2q$i^o?ERZ}aq%9iNuiSm+7D0Gw%~({}j(yot95>)E&1_**#?6Yyox~2= z!&~3lX0~>H`QCh5d&xlo%Ln{f1^A)`ht-GGXaUyO^N_%fx{Qck#~ydni3$G0(9`e~ zZn)pV`0OJbMCC9q;&!s%EU8PJ{+Wk64R9v$nn_o+2B{ivh%=gal*;H-CaCR2E+_9~ z-+NZ<xz1J4_KiCiqi}2q14#JHjsweI-KM z!xoG#QMB~ZP&9%SQ2efP=sOLL#WsS%0>#Uf`H8=N1(|K)%>>qE6HNmn8;wndt)CQe zcgY>5Tge`bxLYW<4_&E;&1^juJ=s9e>@JQLB1nP&q+g&?^9I2^{3^Q(DDVB6jcpd- zMNAHBqbw=e?A8sybrSZVgWseNUv}8HwFg!aOnxCr6c&AZB9C>(Hqz74ymd-^gd`YE zOAP8grZ@|Ubh?NSm)QMcC>vtbI;Gd|L*1$r;WlAWg9w95S6%vrpRU12uuGw1m^+O+ zH1>V4Z`>nm^=Acdc+RB2K|K^D$K~B-_u72nv#=_Zwl4syQ%nSsgZ}fl94`B4M|`<~ z2|gh)pfQ$+KSf(pDx8xH_r5=#*#d=acSWdZ&k{}{^{fBV`J3fCn#hUfZ#6%8<|BxW zKh?f#f(@3?vTutoVgR3|RVU0m3pODLLXbX+q_x0ecp`~E)A{?c2mrbtTDZ+C#xWP= zR4Afq7hXMqq@Hxw=dYF;88mnLV5J?KW&h$|t>tFr@gsKQ(2<7!;;C>x8=E3+bwjh( zb-RxK{uCPny`X1PN_>TL29npy$;C9v*V~OWrC9W>mGC$3!Jet_dmR>Vc2#{84s!)3 z@^Jtfh^X=Ua(9}>8}J`5V52-hqBnwXwqJv+d#*fn-(>sfno53;D znolJ`4>p$Z4!K=MZYFX+Lxv|Ad4QqB879lp`D!sEH{3e*^FlPBojtx~>Oe`XmjHi# za3l_tRgaA1>AtH(0!4vCi&uv83C23e5BJ{WuS=N{Y{9Z&ZHcfsy(kRnLNswl=o!Ao zTA5I1vOw}LN=A{qJT{Sh5J@C}b+1fe|AG%+d`aAsa+ZUtA9m^{Nu1$LGXjN1QoJej zoO5&DPorDhv|@ePM|#{~zq+!tmHUe6b`noXA5~V8o%ri{_0!hZ8FX?d1QFlT*xU6H zFOBZ#vidD}2}OD~YKH&J=KD^93{Z9DEf#-;;qE}?) z=#&AH=^J598e=+ipO#^S=pZ=qjtSCtc4qA1xCxvxww%NZVMsX60pM;!*YiZ*tTWGqoYIOtFq8Q*IHR7+crWAGB7%1 zoW~KDl5Igw{#DL>3PKM?sFpe!Mckm*{QKWtNH|RJ{C?$>haBaATz(hcY|mi9@7^u^ zEsF0{7kqWgi<@DteG_RtMJ0)han?S@TW-{PmQk_!q4IZ|BC%hP%@7#JjVE@_M zJxht|G-~z?YzbPEp!~0!3$<`5(fJhi9Y_KBo0dxRncVRbS@8BWA9r7lSvuS2dDAGtIwCA+{7~ z!H;m+lg<2YYdwB3rND%_V$Ij16zOJ=azk$LV#7|{&x!ab4yYwsENkSG=(Q`%wq<@5 z<%LsF4E!#+ZUL_lYYpWzSk21lR={8}6>RjC9L5$OEMn=b=j+YK*xW)=M~wr9zzT>u z84kCbU0*C-i|0-Vh`t&{bnZ%8_B|a6Ey3#V*YznZN`GvSBOoCWJ?sba#P6ezY&CB3 zP4A5)XUJgS|AWm;ypewA&#$=z&_|3TcL@!GSqQnH95h)t#$4vmb1fd)6g#FoW@qI?L^ZRAj`T^lsEdY?ry|DV zny2Rl7whyJ7NG94c(2yqZdsEfTf6gr;eq?Gd*++~p;$Q-4#6al+2uOxtBHJA+Z3%V ztHGlB$Us;ZqK#lq_PO$V(G+fI_9s*VCX%Shb^Z;IPf+zq?>*aSl6CA)T8Z4(Z94yy zW>6ajeRL325qt^i0zQTRbz>HCZz~#LbQA=uX@v`b@sPak%21FKA%0R>WHVWvM;co! zh%{|u78_l}U!RCoR9Ag=s8pA@z-oF<_pAIpZ*Jy*mZeW4Sf%fLq)pr;ShQFpp40PX zKwM)8_Dx=$o}?vDPYjQkej`e-9?on}og>qy?(av8F<{!m$_1l9h#@eQJGwMsWllgp z;<=2W<413I>entFyyv^|~++Pmrsct_(xa8vV*)QOip z=-)Zvy#3$V{{sp@^}p{gOAjA#BP*Aa?4neG)}PD5U#i5KG95x4a!|*32Vc*fsL9FS z^jnN51m80+GwQa7af5I6wQP&of7bt3l2ixtzC+F|O6rov(!MWuGnx4=L}t-r;W zyH^qn&p1Iuqy$Jh*Ki-VIHzHK&m31iEJH1>{K9Oa*%pUeP&pwvoZrs*>nnb}Iv|cywVB?%8X6P7H-_>?Z^G zRKH{!um#VGoUgM-I|4PwE^UB;lx7)}O_|U5K)EvJUI69tH!aspd&^I6?qvLxu}sFz zSUhoQ;-YClmw?CkD!f%j!12jtG`SRyIfMk?6t9YBiUrV<;dDcK-3A4HT>qu`9}N@~ zIUJ|9DUf%VTw#}(GW?3MkmY-BtlajS-FpwlKxY7WFba26fEa@*Y(WP#mu+8>+tKGA zU9m7;wo}WZe0msQHVdXjN)M(~BzM~J7kUzp&Xg4gH8Yj&9pmGlQ5JpI%==Efc?r5in8o`Ps#7H2Na1fZtA| z{iHoFpOH`of*)p4|jc{8=JE5J6%Hu*D$P#%G08 z`b}O6@NHTAynK@%iM;OIZnWT!gV(PoVBdo5rp8k8`b=oZAQ$^FPy{b)&lCFNV%sn6=sgod)OJoewEiMfj`;pW{C}q9 zVdLMP*|m@$=gnK%GhvUbrQm=&G@3fQuoXq3GB z%Q^RV2Y5WfK^S(kn?4Y_Z!_a=`!4_40iE|W%TGO*1}E2_7`)n&LQoMFpid_-Q4a*a z9k^ld8$~vQ2M<&go!j(G2D%AGI?ZrR&u^m1*DDivC-MsDDNtZv9sz@IWDH;%L1s~{ zZH2UuZ3<<$sn0O_kx=$+Nr2u#U}kB7JOm=>CcU50PuK>$pWcIKTN2R5ySb!0a$)CO zv^)u?y(6^?c=2}wzykohmk|P6j)JYgr|BWLvI0JQyG!LUZ~$Gad}Z@hE8o z>6go>CxfVs?-=ITO$CntxqWjV&nK3X#uz%`ktwZZ6z5Lt=q~cVS?aE}&AfpYF4O*C zuKmbhxAI)m@~`PgJRWy{cs+4p^lVC;Ce8j&&aO&*wiTH`ue^ecZOY<3Ez2Las9Y@l z;rQrSuK(H=8ADK&$>^v|folCu`7eX0o#*Kc06RzV13xh5nGYuU>MHfHFl@_vo!`JsGA`wk2h^y z=wZJ&r#bP4w)L-yng%6#!cT7UE@EBR@0Mfje8pOm>q;} zkZ;?vmO76v4XY%MdOeu z@OV)||60$5rzHwL9$n1v+gO$HLY>&TJEkAao^Jz0!`~5_6C;2OE?V-2al7h->;KbZ z&HkG)XT`Wz^+%gr9z!t8Abh!S1-w(y?bXeVeh1`vLiJbFx0SbVZf~Qrb8Q`k`>Wr7 z5ayT-lXWeV9#i?N(G>+ol3y1X1w;$;&SsU8Y~9}nVnBk~^y_sr`>almD=UdM80k-r zGDQ=VkmanHdjAMeqM)Pf=-}wdNJ#F1>;`bqNy1I6S>T0$S_n3|N}J!=nuHY^j$e=* zZ}S8O3;+{$00<4C!K-b$L~))6PtUIY z#4j}q!Y%@=k;Nb&1CbfS!dZPI2mL{Kg$FP@MLRGvix+_UPmdsi7y-;vK)hK(^eXRw z#C)N$^y&;FfU8PV8HwP^-S5~8BJdMefusSzMPJ62i2?yu8GzE-RbzP8zD2|fSb~iu zAf?|aD)XVwQGQGgDK026rii9W2&cuR9e$3)um&?!vOb%fc7Ib0fD^-ukDTP(9zmA` z^(2{KketGx9_lHcur__geL6dGFTHU0+-D!@k@yV#Slg^lWfXC^sQ?$T$|dSQf&Xmq zsi4fP2h41hLxLHySk1c>{qW*Dyc@dqSUF;B`{TF=@1_0Ml#^Z5x zhdYt^jQYq_>lQSypSv;V3yj!FPUJxQVBK$KzE+u7X zq7epA#nUq7!s?+v2<^}mbxJE}?(uD1+CVi*B!uZDcUs5z+vH+PJNk)s3rq($>GpoSp>)WULkqhp1StnclH3i+4o&R0{k^YfHz!o@qu)Wjt3Pq_;1l z!S}BfH$ckWr~tao~7hG$tV*83;aS32j&hhV?d-bdqhJfprA9j`Grtq z8rTKF+Qu%g?fk5bKBxXDv_Z0drn=jVVesrhmuk$ZW-@0)gDjaCBZ;uR$vY*Beqgo| z4bChbF5A#hm)2q+y5Wsch>F05l9t z-;C=L$i`F6(1gSV2Wv7H%YzNVq+@a9=kn;>0-7P5-un-fr%MmR0CdF6sobYUM2WIY ziD(iGkp8_kq8?$AAN7HrjFu# zBh5O=Ko4W9Gz*rLYqatUXxF)QKLa@>-VMRGDDwBX2;;LZy1@1HQtM0Q^)r5cB2NGr z1YRmufcCQ=Xq&+pgMjNZ&{3Xu060cYvls$8ztP2&ganKL@;b3)0%-dBpC#9h3)Rp~ zD%ixd0H*+CX_S^qMZz5cC;bGzEY<>jtHOj!tQlr=Jh4`O20S}lugtW^2g0K*Rnb^d z1Xi+c8?PmaXk>0EY3vbu1)maqG`0T}K;Av>FyLc=B^hkhhXJ4pl4h&FK|G9x7_}LT zs!oiH#EB?kYVNzp((v&%c__lW1^=P(m=+oU5=PIO43z(=h>3H4%pxFR&i)M?^P7pPgwf@j?=>O1218JBgWQO-0ktbd5_n^aQL3 z<+v%Mw2(zKWG>JsD%7i)m3a_$5uoGea`VP(#_uy2&=|BZvU$mxvx#kL?c)K;DecHW ziuKb^%#@l3KycsB)53F_1$S->Mip}f&2F32*I64oQV_w*8!HGPv8spBtA^2ps$qM?aYwk5= zm?1^97_&B8MwLT}=dq^B+dpb*f7!l9-J6dX1IhR%4Sx z7l~mD*)mT?$@?Ds55sY#14Q13x_d4$ofnSbX6fFQN;SOD>s z7?6t)**!l13_xcJ`Zc{%Ffmmp<7dzaf*VXLZ%rl{HzvFq@CEEP3$7VZ>Lj>vdG2dH zG!fKiQzcWj72y2# z0i40#tuw055|B8pC^2@Jf;qm8rdq!~`t7T^u@f=di~uqK5J)h7g=at#ToAfKL0d|+ z2f+hbN_3&;&!ohuk45}gCJ=ZMAf(y%DX6J*2VC&Ki@PZLcooeq@RAbk1#Mt6*NUfL zaS*6arHS?j5dDf8AKr#-FMzL7a5gOr(9Kx4jJMpPWU#c|OJsDKwaN7qobLtiuGeq` zxfP|d@b9IL71gOLrd1eV&3;b`I}vBL4G4&Fc_4X@sQ<_E@-)LjtFW+3VAXjUhy6*R zU4E{iW#>pQ&4M&h?wQ?BX8EV);_qNwWcnkE0iYQj8)RJ`9htS@NA^}RZ2_ADuSKDD z%L5is;8nUi-4p`|m(v?8VT@|pFV zunl6^cQ!?0!}2rpAIlv(blr{QRv=@T}RNK9T^|hf_+PbiJkOU}Kwjmqr}%TI`1T{B|8aZ1!J@{}HqQ{T-@$0BcLWb~hHUtLIkF0F_Cg zk_LdO#=yJ#+vxUA2Jiz)JEV$-Vad7o6Md1jFv-z4{>p;y)Hr8~)VQ<_AaAhj(}b#! zNV#5LF0a>;kX?d=RWH(dW?Y*a3UvT+i!MbUGj07fMcB#=Mk&3Fgl&ExJtU!4R8f?p zsO2+^00#fO61`_^l_tgHRBpWorZlquajg282Y_ohn0~glyZMcmD7rat5}eXv0L+Qf zwpL>Hxv~I4Ip3}I7IS^ju8w#ECm2t64u zX3YFw>UX7q)Zm)K?L(HVUDxVJP%uK#Im;8Pa#mTps&7&|a#Y*Lw`GPiloxPS*h z$?*XL%+>XEba8dL&DR?HPU8#!Fms!U6~c+?pV12^1&Q_l_xGCp3TG#Hx5WDe#qakq zoe4!HBv9S5^~`j-E>(^J^EhFvFBB_gvmE|Wj0t`fk|FKHJ$I}eqKXOxK4^xm%YtOH z5XSC^ZL|b?r0Fk{;Spj>W30 zzS=@>*59@AzxY+_=NP2FWJEFqecTL`&4Z3wuj8S7mc0A!dg zH-j!D!tYAX@GMniM>ouifq;hUyCyiV`;K78n8g0&oh$br?u7VB>&zKuL)*ic61-zw`nO>iF!3`WI_4YB#GAfCqHT+siS1VN@LdG^8KV_$$Q8K%;7k) ztg9IyCO9-qu-OBK_Vx(^sLiw#pa)Z<4QLxP0LUm1q?AYRMh*$Swb3OohcpGvAeiF? zK)^DdE3pT9Uo%a%wPcT}%H)3A|1ukCF5Az&0Dv?YIKTj~lvMFX)?GjYx1V5(D3q+r z##<##rjWA!ALGCQCu(fVT&SbrCPdJVD-Qtr%`g_~H@&#lEUkWDE~5U&vuOC^n`rpM z+bDjGApj85HpB&-2>KE}GCqz$ibNIWO=-94{DTp6`spGX|Dt#Z@&bsT$dLAQ#h~N> zg~#Z(6PeTDo8<^a30wli20~s@k(E40z+o#x`fMHx@;<`y1&hyu0kdJW;elD}smXh_ zLePD@!@%w^peZO7-ixN1#h*=ZV=kAN^*V0^}rwuXy%me&QMCc&8OrkBYkhwPLE8=B#QKo<{Pltg315@@2 z*R0-9(Z4fSR@PY~ctV%BR5=C$;lb1zmta_QjsP%=1E4-~r+TDt_chC8QO-4UXUiW- z_PwCwW?ib@1aRxUl3@dd-!TZFJeFb*xL*?iAPrEWp{Yu_9UNV-#b&aHG%KvZY(dfUvDC)mjfOK`x7u z(Si`!L}AUgG{gg-$O0fQk=|3{vuIg~co^P2U1HdxW4K?3kq!d~i~%t+GX!cPl<}^N z!HXIHq2kdn`>#a=%|nh`URyV0&J(Y0IBNWUBMbl#HA??jvsvbXU7%3K%rKZhpNM?y zZRrMj$~wE0;G!)7hXc7Hl8}+Hy3cZ|OA-8P6t?vB^!osj)XDDg2O{+oLe29;AV`#& zx&ilrJB)LL_^E_mQ}$hzph;YpSc6KNu#Mb8Y620>0Rr5f)<-YV6Kj*7>W3?`n>p4D zB-@_#-@S|`dD|e)i*3)D`bq!w3mGfJh!H+0Fp=P5ntaaB{4mDrJi>0rO5Cc+C9&<#RMWxlV?eoS}1NnF8O&W5#Ie zQBk5O^SCIZ2!lry=se?DMeuA@43$96DP?38{4x;rUp})St>dp+e_9l+DsQbsPg<9|qGx!pX%eZFt-+W$ z->sREp+_OZmvB`Z3+LyTm(lJ0VFduB6*d{x$zOS5OTWb3KUwd;j;SM5IAuR{Z85qM zO`-UII{6aak30haq9PXekme8)nx1eIM2K-#GvOfCtfmE-Y6JXD$8QdN%z~pxg=`}@b;Pg zoN>?!W9>CY5Y{q>so`xm2Umca`@d+>hgnL+gaCE=Ef}xnFCN^PlPB0nPosHd^+S-_ zI;Cwg6CWA0o~Yv|w0!=zu=oa^b0nS9t;vdmfd%1ueoz#~n34lU}xUf4&%0KgWv z09cghzt;Xm8F%~~`o%M}1jy_zcXE0fUEgR@@W4`yQU{bEw@Gd5hXDZQuui~0@$ZZI zUj_w_R0D=O{EF?^Or1Nxuw#eo30_bUn2`%_- z_kgVSV*P(l>#y0X-3(~d9Xv4mPawpQ@tZ)R=M8H_Gf?~OM?FXwqKJm>;MI|R=h<#< z#xr+6$$h|oRZ&Jixg;;u!l~f06ravel*^G#FYumV7`^%5`)L z+aQ29%XJ8rnkJi2u>i|@h8GM!$x}1s#UN(S;W3QG#%pxsz6=ERjQfu?F&@PFgZ?uG zCpjH};bVaEuWkQqqI93Qg1*Wm+R)^a_OvBNm)nuXaOtXtmTEEp(5YwU^1sgQAEGD0 zs381g)*nfaEq>q=%S0qrp}ltTCh(u>+`qI^+w=!Scom?trMPKRE!qO>Ou`v)0Qkk) z_q*q|^n!6|09!qK6SPwkD@?~3>i0y7Fp3B3$d%X$U?6w-zSb&FPPE0OxtBMw0>v=l zHjDD#e=B9nxm@!ab*C+WW$>h_eX8ylQ`PUK>3GW#liJtJFTO3o@ zz(XTos4puNt|`iYgc4v%1jK{qrP~T z#YTE${X3&W!xJ5HuJ>H;5O5{39RrtpiWFow~uF^XC6 zWsC-TPjNmt64Z8foBY_~Rs}1+0CL~pJC7up9;Eh|5<3JOE)btQg*2l*l>0v(0A8!@ z9y@#t*{V#kKGTFwBY1(i1l){!EWN-GaA>I(13=>TFLzZ#s!>EPULkk_{4w*-o|Ytd z|2qCpW8G^Rz=E)nGK_`(;=Y&>K+Qzy&=B?`T(x1g^mmd@`JtR~E3_2Y8H3Kb%M7 zzn(-h?Khuzkfb=>?WZ>@UBW+jv>C&aZ?X)bhhigvxiQ^asGXwZNcmx@#M*=mq&oDq zbR>TNLhYob87=0`YwNn^VM2`!qsf$4NPS%c`Tic^?biSHr3H?RQT*B6M?YfT5X2KB zzj^;*1kf0X(r;T#W-{>pU|sqWeL{3?w2g5LxrB)ri~@KK$diEWZOsUvBe9Am1X~rq zD(#uH^wE~x5WQ(3fW%IXCsGTrg}8)w05Q*wHT&OR=bhnRsPYJpeTnC2xxup$@rf{y znI|YG>l3={)6S2WHny1ToJ zK79GCqqbUl;TlZGF+Ijz=YF#On}8SgA*;J?@+^fvW?M66Hp9I2*Wh3vn6Z``Vfe?l zb3B88EY`Q;ywCLu_wcs%pskugXMkaIUx5*z$4&rZ*t0A3k(+riz*unr*uIQC%`K9A z3mG0WYQ5)2+K>H>*8j@@;Q9#tNV6b40BZ zpI_<6@{Oie$W>woM^za?yeC?pNkEd?wADwpeXsCiz?aT&8NoU5=wrG4j0`(&N6`ra z_vGVcG*+~K-2OE<=YJM(+^?vzW%Cu4llNRk*ok5*pbQi$FM`9?D@%?r&#hhKGY{Ss z_fY;Z0>oOOREAUs-@S~6KfQ~lY&D5n^^Qqn1=!_pLjz?}*?d-(=yhMbtpr>QtMD9i zPcKu~9p@ST?sfF!|M{0Fexap&DEaJy6Urz%hGFaCg-g5?lKtdYlp;Qv7y>jKD+9pY z|NDy!1p3KK;IWK(j89C6Ml&r1=p{N7_lD93o(v`Tuv^Q%6Y$_kLXfp0z9i2Nlc6O> z*P1X^0Cyjl*8@FLJh{`e)9B_#vQ?J!ZW+d%oXya4ccVEYKc#thn5SSni9_XtLY)h-~N@c%tbQBjTL2Rl3gp&_f(ZnhLcsS+ZPR28vNr!KgNtD5i z9pzP>R5mm|(Uyz3u!i4bIglGG!)G;KvrG{KfUW7z!+8K({NhQ%m*v%zElCUV9QLJp zxHk?rrLGphPJ~!5Y;xh(*xlFIJ@`R!M!u1^2=ROv^A0J&hqS#NePJLOW$?pWEzuUSV6*&g`4BVyPmZ6O&cqggdrhDo{KLb_{1^jS_Ew5{@46{c?fcqDDTkgIKv5jT=Q36%1E^DqY>nlWG&Iqy*#x(L*8D5#zs>xwr~tUZ#k4GT7~iKdlKKI_RusL(ZM7`R0JJW+ zXy%5(Ee-*^u4xGxm60Tw%`fIX#5G|Di6eOdur1(YQF`Fb#n`F0aScY`tO-zc&179a z$}qH!LPlpT+hOZP-)3K@PSj7o9v*!JCFJ@MC9ACzeG3Yx<6tP)fBlG)w)X_R<;YYk z;h>LLN2#f^IKV(69sngshyH!2F#z^9GScP*uwk|yFT=c)xcxKhFXFaNy{dIEBoLG# znf0eU=TR_`@NsvqecbatBAK~$i4K<2uPt~B9d8wiT369#0c?Z1gv^QJ08H6d%_R%~ ztii+p;PWuo4({mkH{l4JKCHk*&&TCXYXvhJ66|afIQaHeG0iaG8&DCGC_~i)&v=4H5=EnaFk882K_YN9o7qzsT($BZ8apXV#xK zNjwS?K(VNQIXkmJfJ>lT=HRYqpb=@6&~k7GSO&nXIG!Y~A7EM5Oad-;{kPh)9KqQ=%d2aH?%}m? z^v7@I3i-@jmNU>;2T486*x^+sL`n8S6HdUp2P+_90Kof%;Eg`NP%yyBnOwPXi>^BX zGlMF}0Q`M`X7mnj3_s->SUq7Mpd~X7hMWC-Zs{wagIVWK3iA2Osn+~or;2m|o~$i5 zz!AmejkQYvZGMBIXIh?RMp^npQ4;L7D@X&E0pP7O)i^RmATCoC+`JX!ZTRPJBVqzj zuftB(+NvV6>m?9WBQi_|#pqQB46s@v{bS(XpqthKYL(w)xnHb!Khl1yEVdnGshyc5 zJZ4c;=+LLlJT7QDEYp0Ws@(M@rOLEk)M3Bau;SV|{Xt~-`~ajzN0 zF?OHe-HEcE&&bWiFdkUYzeL$xCJqLGWUW6l|87g7<$M!)1zcP!sF50NDPeWum1eie zBG{`0X(CAz%&kj1!vI0MCW?s9QhjGXLw~d)G6PxAu zPv0sIjowutw6P4-wa=!lp`Gm?Ia#qe?X|8hbg!v`pv5RS^p(9Psee+0ZQQfLW3L~t z?PJ6PkOr&{zHfZjR%P$QS}Lva_Q{bZYcz3M8w%iA1OP0X=*~Mb4wnVNgsTn4Ty)n< z1pvHLFhEi{TvJi#(j9rTd1>bc00wD(V+k8D$-KlCe?9gKTMu3vkxX)S~&bKtfPc-}q+jq(B zG$w!?ofp-v@PCD+y6z^Qq)-5Kpxc* zSNfwre;18UFQfaPPtqvbdjxocPZ6MOptuDH#ufoN-7?gQ(5#4UQNwbFpzhW@{0SM( z2H)OER$TeuNqz!GJWj4fcW&!OJ!c*9R5UtD16KO4?DHH2CYCYj$^ZBT16;j_LBKKNdzyq z=rW;x{vtoN18|FdAyCB$#c@{ioXTsXPxWK~C+dGuU#R@sH5Nz=0NdtJ6B#Wbk&3WI z7(mU_DB?fA1%q-$Uno@!bO--^Q9=(%x^fb`s8r!Q%)~fm<3_n}BufBfY}HnPK5^4u?xt?te}bq4X+G@6RHgJg4+8(0f9~|-v8*-cR}yq|Tu6)} zSe|k%w0w6NwuSfWx&X910Y~nDCfF>atS(3o?zC|zT@%1*SsTKt5-ctSY$5pdZJ zU@Ya?tt)RZ8Ra$(b-}pA)_6q7KU1BUIwfg+*+9Ycj{f|;JOH$Z`IieRaGNl|q?n!m zRUL?U%*=oP`&Y@b2KP}Iz12nn7%!Epz)Qtt z*wc}S)5GuIDoEM;==jHXQS|+rXey)cSO$Q51)3ZE^TcK=@nD#0hZftrm&9md==2k7XpBT1E7D-hGzx?)!%A zDkH-y{Wun!WxN33W&KxAqvQW3-Yf&)>_6jZCLNVQ z^oY{W?7vg~eZD~!cn>rAG(ciN2nxu#B>#=pYVgidqQE?cwv@5X8;;?ooYQ){;DJ`B zTqMu?ECIl4BF$DO#0ULt1ZXM$=5ng_m%SMLC+(0e1CR?=W~9-hc`HG04Z@DmKL7$@ znskmU-3&#U*=17>1hlf4TfJu15w@wv=;P_e%7gpNPL9kv%e{a2FYlwHKfF)YKms_` z<0mVx&5GbAXuO`ANm8pet8G%a{H94Nk;1Dcu&w`SpLsQGOUjA7G!_C?re*Ez01e60 z!nS78R#dho5T)yArtlIkEv5uZO2%4yKK^(nkDBvnWWhCM2*52HUQIvYS6NbFlt(j5 z317r(@)4V*^Ke<&r(Hq%Zv5oPg0>B180o)#uC_}*$N{+Ifs^dSu?R>qOg#`GDg+)i z{UQVAuV?bg&=Qf7ZvUxud0;#SO3kk==i_?U;_B~Z=cn-&gJQW7uRlazY3)6 zKBT-z&e@~F6KFQeG(XF3?fS&Qz9sxxn4zjeXQDY9bM^o*{8vUs0^*rsv-XpzVox4Z zgMQ;9Zn|u~d|>lAW9H;HtrH0LIY#a+g79 zM{_cgBxp+N1k|{Eq2TCWTdUOud$PBF$5`nv-CQ<+U*Uy=I*M z?RT~ZvI+POECd3)8eYle+B`J83Io5%$U134T^!7Iq-{J{xd)8q{-3sw<Wm>&2#N6@jRMppX!NrD`0uRNZZiee~@B| zF~DXoRZ*wBRM0LI!FT{R6O0CU-4%M$&-B%&2ETt74gaXv6#CgVlF)c-oH5gXTzIb8mZ@lC!d8Eu743gp51w?E$L%}4_Pe6fsk}UFXMwdDANCM~m&Lp& zVQ4Ug!)DiI1Yjv*)GR^Hlqv!nY9=klurDwRlW2^Yx50PvdQ$)Dzj_|UfBhJZ{{F>c zB$(p%Q2HqZqJj*5mt5%cx>&fb;9L7B0@IL#VU%?##Aj1|r;FJo+Mo<*N$2P|X zC-M!lGUFi%zw1xb1NsSRhSOnK2yAGcf2U>sXd?ms>`6 zb2|)(mMqwkT;SPjJ$~b@xgrJtv*xVpr6(=XG3}=N;UKylBoBTI>PhII&cKC7I~XzE z$OypTelAxh6i%{e_Ix1EhbOZi&GLNve}1)?2(=1lf_tFZ)T4j>E*k#Z_X<2G*J`bW z%Mvq{8kBl(pC(%!(g^delV!`jH-B2s8Eq26%B=s53{7}qShFPUHo3mFr5WS%bSt-d zAeI-#aWs_MKf5s4vZOpX1akcBiTwsMEiGZ`!XIyF_cU@SC-~$nFfu17ELqZK+1Q>be)}vs5^Wy++jq95CY~tSILEi~N}<28elny_ z_{Bqb2GwTy#m6+@pYUt(JvOUGl3VnMfyb18pI@vfYbu^NIlGbP0WK@MOYme2v$L_a zY~hD+neEFDF!f~2n-Q}FqfiN4Q-sAo(QYk$ZF}06fo&jOc>fOt zd6Z#ohQXFut6JomvK?%mFX^w;3YiZgt~1TyS`7txmh*vbMb=Rr0-m$Fpsk+}mxC=K z@xaQ1Ww~I{ns_e(T4x$p%m|S3n`Cx>f5Zapwvz?4Zm5*vud$o)Bz}>4>?~Jc;SS?I zURLyj!#4m3H^SAhFM}UOpOQRc0bx~N5L*RZq)d`dx5>7rWs2M?5Be0I3psr^EbsRI zF8XltQBG}cJPZ4Kcpa9|>}yYIt{PAnAhY+fD&{hC4ag$mOehLIpKSG)lo32Cyd-GD zhcBOO+lFHq0J0`Rkj@)d$dGrx@Jl<$02~>>Y56ELxG#DmIWujx_9o1`1CSnlkun@j zBuwLCd8A-otdBQ(F~v-b0mTd#dfLe)W6mq+&E=`#NMAH4gTccBe94lo9+!~WnRW(n zmVOPcL&XE=qr@oq;CbfPx6m+S9D%1~X&6cD*#AOBH` zu4ehOln`0cPpq?KPsHCO_^FMC{M44r7Bi!Z;yC&&H)eU;U=YCDgkW#{wioW8XL(7n zbVo4h%La%$dQd(16grH>9|nqlaP+U=M8iMGDDql3fhJwz6oKij_%{ZCy!De_8@ty^ zAN4Nl@F$A)KUTE=jRXD#AF?&+^e?XpL6(KfnJE_pd~^cS!sE&=Y=;)n$Mp7I3WNH) zjgPB~hfe#VH|PijsBuZ;IngqJ-i2KIHNIf1C~E{Tx|Tr+L+F65P=9(CjegTMk23sB z=tJk~KQb0hFNwXen?Rh#yP$uRH~8;^QuBE8M%AG$HO4S1C0jL?>^vKNB+U#j)%Lav zV_-o!EEAa!r-K>U8j~3uY*uv+1m=fN{e{Af@+-Gf7x~a^Dm^WqmQ0z-^M%J3J?I&`w*Z3?WXVJRWc_N9n^u#kLrva~7l|iws{z?(|H4)g%N7 zjIs2MfqwBfuT%%&L(3t0EIsktl+WVg{Z7Uyr~K!DV({kRsSsirB-vMfCc}_L``6K@ znZoyTGT_m{?D;A~z5j~MC@P{oF;j3c-etm&$qYA3v-)hUNHD-P$vha~2l{btGoNen z*YZfbcA}*K&{VH4TEe~7r=Jo)nW5vmm*$PbvYP3I+T*MGj`|S>HH#HueMhnxZs0o4 zXat%Q4AypZ7Pc45fx$o`=p0KBg-eUI0$yc=z!*a;kj;}(yZSc=vc9d!hu*B1{>=cOrB|&C0U&4W4dGz|`}SUPhnoxwGvr=V zaEZcm-`(%cl3ZhRpsW+C(erpY0Yc`%{}#(m-otAE_E|2`8T{{X{^jg68p(ab6lU7O z2vB8m%uOy+?!*1uTm>5y1U&oWGGX~m0>4afw{&Z__5r^P8PFN5PqI4f?dq7<9 z$G@IN_rH8GS7QWAoAo2FBhd%e(zd+PY$@Mlk7K+LhJTXFzeW3pflEMeiNQ!S{=GL+ z{9iJ&s^?*%9RaRk?Gb{xaE%KuGnT&cEck65J?`@aLaWQAStuX8dl3ya;}|~`&Rx=d za|@JFAkunH+_WQ%WVY3$>Vt6!eq}5kV$lmEYfdQ=$8j`#KZvFZayBHda6moBU$qQJ zTb`L$fD9sTD>yR-P#zJ{^)15(^qVE!GcN!&J+Ni>H$2g}m8`Xu+bQ%V!JF+^V=a*x zDp)2#{wyjz0(mH4n4+Y<^-lEpTDa1z-GXO;fdXxA2$RdMen&irsd&`%SK*16C9dDP zJX;)50At)GOGun3juQ+tS_Y7;rfrx%Iv@D8+6Bwi>u@X z0l|ce$yp@ zhXH5` z&+R~g5RJemL7JI2W;#c|oJ1o98k^w0EoIddFl0H(cXco7cTUK(qXs$1T>|V-?$iS* zR|F&Mv({C@?2@$~m=ScHzZ-vr)pWCw@DnPC0Duh0so6K2Oxv^66G zQxR^rfv4~twUHF5{=4Vq#*ar*mf%&i2i_R;3HUDk<+)(RSV`Orj*hNO?)NGI9yEJy zGoaF!sUSw6zGls*q6JgvSp|2Pq@L}r8`v2@bKES(_MW15UpQS0_hI?VM{-T=> z?(q4lYt_xR-}@xv$SA0SF-Sf%2}DywZI_ec!Y}}`&0`hu8;ZXsvXb&j07>J$ zWnQ4&QLHi43e2V^Go;9%3e6!SZSCI7yBMPQDH+9ywiwG|3~Qs8OZ>wOzqntJ2DE><^f>*+3>RixP^A(Iq=*P$&5hon?;Ona|7U}5O<$NeH8%m5(1(**L%)2DLaw{7L6 zOCI750902kxSNCu6!EI+0KX=f3~?| zhPf{#D`q{vzPU62Li=o`rhtDv83$};HBV?@_RGMxznnEE310p!CALq+^&e%~OU&Y- z{7=3-+{N1~cC%A~+kc^U*P3GtLdja!v{8jnPbZR=u6k@i- zEV^{`X-C$cN&s4@yN^X=as*S#A!ZB4DbDlgQ*}1>uqlrK zRqW8AEf!J!rzcW~QT{^|`f!yzr(Q&yrhf*VHn#)|mP$a%J$a+ev=qdahRE;}j};3f zRdjQKqXzUd_?Fss+7r!fitAMcS9~8O4Zdkgv2fXEJ#!A4ku6LbSF)wB zg_+x#ftDR;_o+UH*gQF*j%q=7<^cdqWs=&G@m*t8?a3J}OLQ4_l)Jjo5-M94yRQGP zdscgmR{~JB^;Q;;_rN-^SUH|$VTv_F0_`BThvRP&`9E?0Cr|i1ENj&@!^pg&mEHgV zKmbWZK~%}tuUfky#U)G-A#iE@%Tm+Z&O87F00uz$zij{~LMXGaqq59Dt8jO+4F+(H z9BY<)tO(1of_wFGH76l(qlh5fGZ>FuZtgn?) z9}yVPcSVOFC77D)v)rF?UqvWqoi>I53p^#I%hs8uo!Mpy)dvy6Eoh=KgH$k=Ld8sS zPf?9+T`!URR|)knafD)j&3}mZv>pgymbPUmX*oMPfP*>Olh44X?gaOR=!zhKE{Tq8 z3%!5J;{vyO^3{+~rdaEH^!?jK1(_qeq;TZl^%fba-)Ia-UB2A zKp2e4pv45>UftUf7{dgtIZ8fT|BN*|YQjwTPIp~72B52{X14GC`bDnKn)yU1L#C(A zSobOg+1%4nOg)YOmCfAs0zp;|;>HC6dJo1NDr;#;rm#tInZfK4GVlhtN@r|?xSMb%whlDB1bNI=Su@+VZ6Cr51GjaM)hUH~RTYG?D?p-2dwUUhTpf|08+Au=Usi z?J!$z%I;zx$O994i4@c*q79wUX9fW&ka!1R6fjq1chvo|?Wm$-yrX=<*zo9(nFo<~ z&(WZ}l}C&28AqN|ANoE94%||Sj?DK{PY6GIaxPd@AFEQ?dbvV`FY~UE+rI_;!y6y!^N7iR1LP9o3L|(X5-C`d`{9V3JObTat85W$p^Upb8J*%ywmv5lMGxc zVH1{7r``nL6a{d~4J*xYWYK@3p$iu^xj?KAmmNEmI1#W0W&%nV+xsX4L?h9w#BDtEsK zM)J|NtZ_t;d#-v-o|s38c>>@ea4QJ{oL~@uMvdCZUTlcGsO4t6Bb3GEGE> zH|Ubii?rl>ZOK-$^){&XB*QXu#y5AOg&&g+HsnNyL%&>`~ z!%RL(zIflvJOU6V^kazx$`R)w?Kz`>BSSm73kT4eqmiopNodf)%Pr3N(GQpfc`6t& zd~gk|a)c+lca}aQIQS3DK2DbM<=jwyc+6C8?-Ru%nSPZqu4=(ba5MAIHgBcI7NLL2 zHgl(n`{D4O1Nts**)jmd8Zqw!9SP958t(}Ns$CKXK=qs5&d1YTz*kk7cv!^h{}Xuv z%tlArC!NUq82?i`)1h_Abw_t>N(I2Bx^Q74Pg%UvZ^_K~SYH1q1c4&WpoIal2xh}` z(~zB0MU*XmY(-g6C*+kw+y%f$P{vHQOShP5W$7#jojbY3*apqv?N^i_ImU%-qNwPF z9X^Miz-38%vJ1fJxhDLY5W8RpXxWJY06164HHr0e8T+jNUvD_rr1rDu=1vi!B^*L` zeF)Hf5+dX}FOg@}v%LJfxaY&_mrsYY-yB8@O2t}Rgw8JQ2?L^2Dfpugr_m8!0CIIV zMa5`GjfYZ9By48N5zfLy8?NdcVcvaT0~fz_vuIe_`JwP&urtbX<-GzXZ z2wq0uHr6#`oN@O#Q`==t>x3WPX;1>bEGB@#sCuPUTL4oEPj8_5Del&6qT{UuZ>*$v zsGw+Zv~!hc7X9>XQ^<5K-D!alpj4qmq40T%mBk=H$%1F+Gmf-i9T;TXRYURXz_Xe2 zy!tTful>y}sH8Wu%NBQ|U*!7#+o|pM?#kKskpX|et`F~t{;zg-w1L8mfyTN2`+z|L zw1<9{-SM!n{^7M>MtW|%4q8AN_Y(~-d=Ww2lznwWqeG5R1^1mXfLlcgSfELce2R1Z zvKoR$EQMx5kDU^vu?s^vy?-P$YUYykIxr9qVwTa#)5{W(_sT4BREa#u*Tz8cT4Y{iv~?tnGb58jb*FTxVVNKk z*P2BB@a02$#)d6$yF&xOGBoQ5xtJ$GU5V7>cqi|0zUtkNCtqX$xQt#sm#|8Z6ka!1 z<+LcDVC{VVjb-Tfc*i)kzURYdLMWY#o|Gh8|3m~>1zt0y$x|3yp6<8{45)#`%trtC zVtdpRecB&@2~5=^SRR5XjL}yV9Pt9yD#G0b$QzUi`5}}UsJP*C!-qR4%apR`5U2!E z67rnZd?DmnfAfWFW@0JNydy;5DUF*et10@rv9WTc@|a!Gp{Y0pw0ZJ7_WZ5|{=;~L z0e~58mxRC3$IIycFCU|^0z?iTh}Y5JcW=xCz>FB~`?MKLGw^&_lNQ=Y^lzAO z{ey=~s9Cy^Upm=j6u`Z^SxJ?mpC|vfqffn0@XU##{f`yxfBJbx+dm42Y%Mz=#s;1o zWs+!f{NY?4QD;fa2HJ4nN%$f7;6yM?&fhCGMG%-W2OeY*3kLX1UV>NPcRsG>WN+Rr z=t(e}YifLNia$H6&~9ejz=(@kT?DY-K59tz0cYF^Hn9HgR$MGGrE=OuZEZuI}S;!%J=UJ$jsx& zkm^5d;JNB%gL)nwSw4c{2#dPMqgda3|M$<)NVA+46}-l3#ZvNzKPdXYzvUVNf%uQb zBth{AlAHYxZri0bStgJo6m#2U`?<+G+V zaYBDW+I8fd&fHu7rVo=3L#)m%HUkC#1b;IIOZiW6Y`p?m&#;;NwbRG&$It|hglmZh z)(DTG-W${rdP;PG)IePHu9P}k4l6mU?FIl*g$4K=%Kbl81d3|E|L1taSu7?D0DNA5 zG)6ILWV=z=EPKFz;R8*WpoH(?sp#ugc^DK8-f0)PGwG0te3_T2{r4JU07zs9MxW{i zgij|Y(dD&-W|LIX#xf58quTUa{s7p724#fEfhirBmmtJ2AXi)l`sy&Z^p)<$5(Xs3 zh@p*tJvAc$f~5Rr6Bl8cP&)$j2B|O>GDJyPD1it{#)lH(U;085ZWv7gpMK{4Y&Sf} zj8t>zl`Py|_uMO{)TxK31*YuXFI7%mnbLO8RcK`$pE3JS{0MkdnxL_Jt@pnF>!)af zQ3;xY4;Ui={MJWPSCs$)x5wtbw)YkSig`G#&ni#!wVP3cFeH)8}Z zC-?2Wv$QMCHJ2%CUwO#Db3HX|%;125ni9-(z7bbmY* z3KAd_{r|()&th*}JuEe~EgNG1aOee572w-C&;3a2W^p?U3q*$E*SOj{EaV(P4DfPv zor+5dIX&&WZfjI?Uh8h{5(7!_EB2wD{GeC>nmNm6`>}SiEg&;8cmOn-qnE^y24>^t zMuQMxa+#cXf73_aoy||z@m%_I*rzxD!v5cIeK-6v)^WDE!vlbGmsH2;&7HYd6Zmg7 zuGdYOnc@DM=h}~4%Z^xU?2=j4#he&et7v;yF2}H~ecJQ$S>Eu5cfAc<>uAs`+D=0_ z!{?h`L*nuTnSIh8#J`+IGsPU)r3)oWe-`);UR9I?AG=bF|EZW1Uuy{dmjmBa1_^e^ zn5eHXyWhhoTafTlqTbUZ@#%Zj+jv~TOHF?)79!5!L5Xog3dR^ELp;Q9U;2|vcB(w+ zQJRFXGW=p(K6gxUWd;FUmIru1ikSPjnHS7<>>R#F`T+}Mq&2X(XtN(}pY^8@Gdz$8`I^=3X}czi z2jB}{;0s1%v`PLZ65V2>W)K3aeo$d%kaAg*n+sjbJt}p~K0Pp+^ z&Gyj#TJJw&cK;eTI^HxS>b`cHP~gAO-#;ZYtRWv;`p9l?FzY{jr=>26JiZ{cGPB6q ze**KRpc^ErnyCX1Y%h-rl75nwmylZU!Cgz!Id!R=CMi&E=>)bz`JbN1?Vt6N3y7$& zt%b9`X8tkkB(Y360jy!KLmcHihtRn?ZDIy9aFh{zKkdpxcFuhm^X*ccK5{K2R>t3NVER7D4pXE(yyj z^Su>iSpg;9XIs5irIPJXqUuerHdS!SKQRCroseY|3y9q(mimCnFVGn?tjfnc0m?ti zVrwNo!2(`^y_Bvrlk$HXefg>w06Am6YPDg~cN>^?VgSI6B`>*c{=jEQ;}*yxyqQnpU1eddh2dN_lNg;)g5O{o@vQF8Vmrk3rH9sd}@#L^G>*|M6RN z|J#{pq<$O_Yh>`P-2d78H-(b{)nZ@Z{%>311r4=Buybi6rIiJG3_vP%8Ni+Utx^ST zmmx&*~9Pe#O`wex5BU@BeX<1pmX+sUeAY86&~f*D{r! zmaD{tUI3zBjiDGnh^{|lDUR=j(~x?#8Vo6(N&k_`+ZJB#_}e&7(`6~5=<8hGd;Y$g9ef#j=L0K} z;W9A-s3DAUpdPrAuGH&INVco8e;oBCWrS~?UtUDFisZO7=s0&2+*Di>%V`WtfQon#0Y1K z>TWY@Fdr19`3PsHGlcHcU|K)zZHGhaf!4v(_mdk-g&Eme{guJ;EM+;Y8>+DJwLHbj zJVfrapSzU*TaA=1i9fNW+TDMCjPA74L=z&EL%;o3PqYN!sckprKs6&O!hp^G)4E=w zeQRoC`>fB$Yl6eWM)4^#*bW6G0#fze{M5P4Q6OCLo|K{}k_CSdLWyY!a)Xxy;b%0BnEvSQ6sU5anM%JK6rP z@rg;uH!>I#2yk6u{AD*IWSb`J003^0Q%a_LZMAxKnFIkeku`fSkaM#8+niKc*5=`$iT=y5pcAa z4S zAjy`076cFBD34B;Ax(Bak?a5XOfc3h*yX@CRUplgg0oKkd1g4x$+CP)eAi+iJeSvi zc?On5#&SvBodpccY1k%W=9de(9_58_fm~`vfNk+&WV!*ZiYG5EiESA2nGHt_I&e`a z#k%;8DmqZq|5g}1XcUbby%#bVGwv59WB|s9CU{lhxd3l3k;V#edacRh^GlYug`G2@ z&l1HHW~rOb1F5YL-clJ>Edk)=gxQ4%O^Qvde;Y8f0Gbe)1aY{yzA_`g)F(jBO%V$U zaF^SI;7WMd5%lDvNWwQW$X@ZBi?DG8O9F0q&$`pSVZc_IXl86A!5HC_0A5)m(w27^ z0kqB=cUcMh3(Aq&kiaU?ueGh;zI&@d_n}HLkhW=Juv>1>8CG#3{QCF)P4NiX zrQ5$4jdLH4HS=%YNsG<53Q%*ApNcNWznv#rKg~&Z#XB|J*0?{@EdJ=jsg}`PWNf$y z5~APt@!(=71Pofnkc-~xp0C3I@;^#$=|)&r*daa>YSo8u`CTC*k@Jea!M|OqT=! zK-P-OU+Fw+xmLZYZ`x3i@oilGueAff$+`G1>K{vCN-$gv7qRF5lwPgI^sxd30NN1% z5Pk-W!Jjlh2M?nBUi;?(ID9t$+3CfZJ3TuSKV>F=Ul8k{!n*5t(JO#Py!e^Vlei}Y zRtZ_w35cfFIvOK4^GE6zmIDE?Ia<%%)0SAbf8TQ*x$l~%NzmkgZ|4&J&-6n%knUS5 zF|fid5C50bwz`y=AwU#g#%tCj!CHU3K~AI)LOUKN8Rkh@Rd0UX*ZS&x*U>ubOgx#n zGK;@J0Kk?!0En7CNVJV*EhquTF$1A(gO}=)1O%W1q8r^^%~9{<_AmGU{*7qF3X|VC zMnV6~b4*s8aebGn1N5vbCB+?{DH5#9yyrH{W-LIVb}7KEKi@dgJgOxTExZ7v2&m`N z6av(jtAT)MfK&kXZ{`nV@e$JsDJgq_+>nzLO>1Fgo@4#L*Ov8PN2b%#Clvi`0XWMp z1sFImdKH;~t%QGzS2U#_$f%b$m+tW7*mC-Q5pKfIZCF}*lj6V%=W&=}l?T9Ce4$?k zFk~=!-lp3##}Qe^z*XBQJnocirvJU$qoK@h9SzJcPYt33Uj5rUV%6W7}c{B5Me}#h|Qe z)1e)OxH6a+nIo@n{JQ^NzB+=el_?lmQvuc5FCHZ|=&YwBunt=F zG@&*H>nMI#wOdzGZ@?qrv?Ggp_btM|cB~;_Qr6_Sqzahpzm&y02>+%u22rOco3pj0 z>D}MIn1afb6eaFniv=M1d;5CVmeXV^{4<(u@X@;J_VY(WPk@Yk^{wd;@WvjH1b(l? z$TGbttIq*XY`Wn5aI*PryjP#B1p+WS-P0>~^Ydqm;NF$MKVW{Cdd-7Q_v~#CEYbx%8}7=D1+n$(q~&Y#f*qsCHo3Eb1TdL^`Aewy92qN z#T7>dH<@kH2o%>OQhc0wH0!^ZmyD(sT;=kAo;Cks-aB7p`G2iw|NDydke894r*+__ z`i>oA+RqSfwT;s(^QSJvG!$Gl?^=3W-iW+cwEPdq0Wt>EDajN77w2yGU_Z(^ zzJDmPGJTiP?v;g(C!mFAFqi<6Uk1Rvo|utl@_`2?@9|sC#Bp?X;*L(WW-+aSLii7H z00K^Mq)OqKtoHh^(2)!sB7D85oLPvY>Zra#PuG-I&PkhCr}aa?qmOz)x*2fYlmJ=^ zaP#L6s!U%*{6jry@N~F{h)w*C*xyGHcX4&$@E)IGnw(r{NuRD<0Wh$BMgZ_M zON35JfYGRzth4BwOH41mW`6Tvy$`bh{cQcIKXt#x zp;L}?gsJe$>L14Er344I`$PCgBOVgM$?2umR4Zo0uY0a{sXQqZ2w4j|ijZ4WbcCjO z`#47ti4q`wzp#o{;KS-$g3}?8_CBAw-mxtIw=sNJb`$73EdL5>*HR3JhPH||Z-Bht z5j{dVWjmXEknnFoDa(eS(;H&}0of7Yjp(qHvblwL;Wb__764Q5YqEZH2Ia~0nr&JR za3kOc$R5rs*3JUynMRyEO=4io1G)n1o2Pn{@??5CFr@?@chbx8XPRey(B=5eGM;-+ z(YBQ7W;7~e6(`k6{nB_OUV#3YmV$h;!YOWA6$Z~y0OX|Ic;VdK-Dvl?a%{moXu}Fl zR^|bK}MBOm+nei z0d`IJ8h*#-Cb`}=`hXx-0Zu7UOAs1b~Tafe+lt(wBn<8;61vB z7jnA#VoEE#v6^!2&y|3q1pfw0U^K=%S`L8+hXr8ERlqi8+M@Z%i2oA%*iZC+DS*n( z82E!O2b;I*Sv3nCL#?qYLjpkX!R4IGH;=i*a*MIShEj;R~l#n|x z1Y|5(&1?pI0CR?Ev@&z7=O%m_byqB-Jc;?@`sUiPgIwO^aX4@8^5k0?1_BTUc$OCc z@(aI?kRz=a2%teZfC3@@{t(CzhJ3`~u5)KG06y(~l~zY?xFLm|01B1zLuF<=+FD!& z7J@!XfN0Gy+jN=3~I@C=Srvbh4y7=7ypS1Lz+xmF0MFQ9M6#0&}3unLUNb1@~X z@5akxMEJjQmw)-_uK(+UyZv+|p`xVBi`oWVX}x&t+e!;*FTy{+bPA{&j_K#yc+Ggm z8%P2Fx>5#Oz&~jBDqy6p@xlJ?yB+Ne(<0!XS^hKnYFuBazCF>Q+t(8Q|Ko$}?4Ec= zZe0Ef-0y3i?1=W>{7rm-mSy#b!!bj$?Ey6o?rA5CmK5#v7J;L{1I;~3OL>$rhmF2b z-^qdi7D$BJqUENnx-Ih_JPj;OCNIw%6PT!J9|c}grj}8G93>eoC3z)d_=n&7w)&9Fv)i0;~C zc8gF5W~e6%)YX5ym%#T?%L265w|QwqkVFZ9u(&V$JYb#p7$tyxK;;HkCXl;M>xF<| zZ;}4#gU}E08bDW2;v6ez*sd)9xc)OvL(=o^*|ocpLg-rfaHlQc61WiZmEj0ZOUQ3x zF-7wqZ!eQ6UH}2f+`e*rUcy*8DpKiM;5}$c6y}o&iN`3n21bPmdErpZvR(q5 z9V*VZhliofJDN95rm33sA6|eZQ0xHUwKfwlEqY`g0NK3k^p}^I0~EU_Ud0R+jHmIx zyUwlqB4hFA{axi-3^&8HYq-9|<}9-){NGoYu#OVcucGI}Y&p zQUG!Tq#la2a5&rRD=_$rUKUzv+N&v0>z4_}WF-r{NqmPyFSVaS^SCk zfA{eynj^=(QN8;JOI^hSAgEzWK@rCN-P)k^)}=F zuGQTsJ zV>6#t^`^J}@5rbr&as+}kPzK?MiAK?)rSVKe4C}$IxRK{&oEZx@Ve-#&Zn1`3LL-r z>;LJKl_~(>KY|;7cfbfIv7y`TXxX}7KMl^Lc@~1Ip+M*%AlbU=qr|FPkfL-fWql9v?!jtm~)zi5J|E)2RhPR){2AF7Tdr-$2#F~_Y@GLH+ZW~ zD}Vrke@lw1%qXsUX3Bx4CUBMjM7_as0EB>>*I%tG8}578`tE78-c6MR`O)T|XmI(Z1^hs{seF^_g{b!1R z0nJm_pa8wR(RP2Q?&`0f6;WMl{t^C5+-F#ea342eG6hXrPY(UbOeJnqW_?$16UJN$ zy`G}|ceTZ1??^a-$JsIycqqDnf~KiJe{IDWF=Y+?lBO3^zH2VWT87g7dg3Ggf7Y@T z=F1K2N{emq@z6D2J(1Ex3KPwnjhyR44UE8Cv36QdJ^UHhJ$7{gUdE?P0rrMH9-;_F zo(*eUfz2_69Ev5;;jzP+=P00TiJ25r6-e+l#@~#qD~&Y`LDoc@dTpd7YmIB0_8d@v?cq~96sL-Bq?-t#rihp0zmxzD} zfw}po5yyib#Xwtm?r`O!y-{EESnDl;;D+tAgv$@aywh)k4CLb(`^AHwPepKT+ZEmS z14JiL;?t%CQa*DAh&~b>Lbm$200f}+M)0FCl~oj;7+C)4GvYbWe|Q&#q<-ukD+t-! z1KaNJ=FL~FK~B-4khe@n6abGE{EXm~=>+WoHlyf2K;`r+TXW6$6Z6yEJ#!sx?bz4$ zk67uJnh**!_8Skhy`T1FZm~o|v}7V!hDF8|Mu2T6!9AJj2!{U*VF(po-zjQaLO|R+;i=N z2lnhdYpx|vd{=;T?F8_7U%`KF#B|5!CwO!`0IZPWJ0lL4!8!Fc;cjrppJ1`TrKK^n zBI26JmQM{0R9jb^1)Nkd_2q03U|Pb34hv|e^*rKR>t|_EOgxr7XeWaLiM^XTUz6!@=Gsfd@cK+ns zT;whTQx=T1j)YqQyxeJcP`pK39?4KzR z+&kONVdr0dbnWltk{Yb7Ozc<1cOmA3DF52-F}=PU=A@%Ow&0J7{m_vYz|!5ovs<#9yTWzw z(Sn_Y5`hnN2V8@htkVzz8sj}N5WTPGuJh(VYyW51bADJ#=2@^fW9e_Qo#=fj1r^k2 zrmg+bB@2hUXIF|zAH{o-+og<>Nj0DtH}^rAwMWRVVW@QsjU0 z7%g2Lb5sbVW4>XDaoz-fq`5G`^yYncnfaj2qRGayOevS$H~jX0r|!Z6#`D4?Buqa` zUr+g92_COS0pN)i`(L&ch!4RXB>=!m4q7bx;*h0Lr&T@L=>)^Q=>fA?_TmH|9^AU75g!V%V)w2;I%Q{T1xMf`!Vjab@LJt1}9qFN^5 z*wUWQtOsqh&ZHGBqQaZ|O$+WP$F6g7ytx0$+RDCXSr}V8rkJ z(|2y?kKZ|hIU2)HR{9?%QkKL9YyA|s%01HfpzpI7RiT588P(Gm2gcc8nCWD2KCH*q zpGAVKStb}x{KgRg;7324$!dtjUkU)fo5&Eb=3*=>U{^u@uKr6qKgiX%i;^HHWhlN1 zNjSu=B8|A#A6R8t|Dy)ku!!TF?x*Q%71};)9mVkUqy%C-cjflaaZ#q!gnNziAe

      u6?tLIH00n@Qa5nG=5U)`sSMAJp#%~(Q<4^d-AC~M~ zbjy~^$c@w=8CTxB36IH^`ppN&Q%6Sg!PFMaKm4W^oyZ{YvXHPLIvRNC!E=@v!XKEh zHMl$GBx+llsUDMinYaDisy;B7O#vLdl_>zGY0Q}nG zgT*wb68O?+^dg}iWr5G&6$Q!603K~FhS$!HIMvL24)UjGea!XcCZL&qpJ*rS*=<2eP?@LqkK4gsvfgSG$D zvm5`|7oM3HfY$M`lrN1=;A`*nO50NHNt3UMO#OE6Pd}KI&u}z+=T1s9)|boWywO1$ ztDpW`|AWivq+1re4)g`ZP59&{7wODfdJWw4Gw|8@6gaT1U-Y6c;ooUpw{6!5T!AOZ zK|&DJ`hK?eyZPy(yZvR?b=eBAYQjHl0j)$|8n)CZY9DZdIm={{fu)}7vB~_Q&D^sa z6uN;)ZG#E#D&Sx5!-?x25$%6Yh7_0!@V5LyN?wcVkGnrs41^Tm4m{^g41X~v7F%`!GRRA#qZ?yCZ%}^k9 zHxGb_f0^*=?cJ^Wda&ott}cu;SGvz8v@`x_Z3+N@iO}BCqG*nOTflf#{Cr40b_U=` z+yF?QPxRz4`OZP10Dbq(U_P~|>pHJ@SZG9|a;O#rfZwxaP zdk#jD3T@F6flR|GHulUax!dJA%NtKiCS%I6Vo#4rf);@vQKC#RJ%<_X{w+^b=cOQSC`(c^XwqTdQ{pGr$c@UP$rl2tM8*$=4< zTo0Kd?1&DjDsARvXu2H*51SLBo8ehj%bCaw_M#_RZ;18Zgnwv9Jn6b4WzL=UPDhxy zd%N#C1XJVv3MPbkbDxvv)*wN6h07BKqX0`31%_X0ziGcHC5CXZ(?R)FJ5d{OAMa|5 z&z{C_?^ylK*qkL9yaa3T5urp3OH(eF4GE66CK>qa{=h3}ma^k{g@-*^%DM{jck>g$ z{thiTW%-!rc%|2Kjwe7*Tl(Gp{fjBR?sdO+j$H!eaWN6s$5k(qb|eCbMn5pG#)kT| zFDny$K+rNDr-uSSqHzV4@ILd;AQfD9#*SwOIWd}Uf<0^baqUOYm$Ag|p~w`^ghG>R zOMzDTtMdL8nBg8|;!-PPl{ODS84hw;TY(RBCTjZ{TRZ5Y9N(mMUeTE&Gwo-7kI_9nlou@ge@feHKltees7kFfpp-Z5{@W(l{Pd6w4_V?Vy<+vRHrnJ3+ zkJqLE05--uiukZcI>Z{+{j}S@zwTR105HhM4q!MX(~zL}XDl0FUTQWeQ*Y`I9tVD| z(hX(%qRzd#Rzzmq^d11Z4`XV}08}TeqhYX8EI)3QA;qdTs19BL_f*L{{SZ);TF7U z7)$_au!e>;dkm}+?PgpF-hI~iU#ahi@@@1Yk;@c`cY6x#sI~qG|Lmo17QZUP6RXD258|OM}vi(i0|*+trd4g8khR>Ho6=6v}lrnjmu*v&k88 zBksyG;)dhlx!d`N@7(==l{c2{(lTeu)qlQ^rO+XMOZUE%0HWdY1RzcTF#^nunJtb) zYtsDCoL^n(YeV!dxV|XM5a>q@l8xfED%C|%Q3MDjKFp8HVfKfYb-|nXmwMX$o9|+LmDpaUVC9JC9tng~w zwtv&AY*-}%)HWrRCTygiAs01#T?h;lie;`RX1#+F;2*zrt>3(G?Qb5N<-%vy%NiSf zc@3B%fc|Gm01PI-2^vpd7yjxe^ns!9mC-c=DAdb@HUG6r{$;?^%&48w83bZ_bASOZ z+-&W4A?pfo2F7M-NWCrwtSk3nwobeLivp=h!0ITTL#2ZKrJ6Lj1XP+l2i7tkfEPsf z#S;RCn_#2^SP$MDIWe#gU@zvAvIjV(i#YD__Tbq_QRTQn{bcFyD9%Gi!hcU506_^m zwt{Nra9w{Sq(~V~kVOkVhLr_IWdNtKCFOsBfWUfxDW~qJ(J3eepm!vMe)TndYC&glhst=xXO8_< z8`y%gVY0&dlp3)bjGR(!wm!GW|K`>;lBGH~7=Oe70$=bpot7X8%q_V*Ql=HQ$a8Q@ zKb9_V)c?6k*qDD&oKdnxiw* z9Y_>*3j!!D4>+1g2+33=jU_hu=zeMD-&7r8NC?i+lz(eEUm#j@3> zIU#`dnsxkMi=FeOR5nl++-3Iwo3uxTOJvn>9CgRSe;y6@XhhqC;ClvP!GzGKlV z6O6{Sb?SX@xg5#H<6GUB*r zW$MPry(u4C_G96RS=|)nzw_(91nP4w?@4~dggrbZG{DRPj71CP7C|KvSg>45yKT=C z<1Ja#+*dt$2z4avcRwAEUL3^$06+jqL_t)$yZ2g-^6ALD0F2?EyVUIf3PAP0crok{ za4qE?F?Fy9K#$Tkok3Rjv%OU!SLZ|bcJz);49%@^oAvM{smr&QtUL` z+O#7uXIns=RS}rMk)ABzxpx5&ooy<-;Zsm-o6-qfi<0pIDu0loQ=`+d+k@xv z6Y8c8g=ez31A1oUp1uzK#4{|kx?y=ZH5v(B44LAEW}GulG#@c`@HFTy11B>+lm8ZN zZkq7V_J7vq{4bX;CwKzSiI-`vB*Z{r8N;JoudN~z^RESS&4)|G0QjO90Bjq-XbSyq zV|3BNR`|Y&)hjGNvuF<-28#GbF+o}uXUhS6<|JkDJGy`V^QM5Nz*=1pWAi_2~CTq}u>6QW@ z76Z^S;A+@H-!3=WVfP_}7^wa7#~7}A52L^THtM08i9eb}}!uOthIT_L!cr46_Vept2zKT`w% zQyA@3Tl?!%$|ZY5ZmvW?vV7HM~^T1B4{5u51P#(c*sL;Hlk#ym#5A(#?U zns#$>Mj?qO6^tFY0?y^^lOaAwAB^B`j3~G4I%i>_&MW8-6aJ<6=}55dom?vR)C=MH zuRiOubc}w*Gk`ucCR?+Jc?(4OuvF;OesQk>-cOGM%g3L25=1j28EP{QqGZ>!$v4u* zh94kC6PRl(^1h7`jT6QZb0lL&`=%Q_xCa5z{iqm?spuQN*zmQr9T9+S`GyojJv_vi zKh~M_efh--4tU7w!@>c!A2qKv6eCmM0!=qB+z2NUxDi7Mwy#XIjr=?x7|g~rn(y<& z8$ zW_8G$Z%l=kbh{7*z_9KbFoG!VGEf#Dzz@L0s8Do{Fwejynm-dqaPbcUOL~4Ae#4*f z{7%;JF9!z}2jKpW*0dNQ(sKwJlPaH$_e=adU0@lmVY0DCq_m}Ic<}&OmZhQ$O)a7h zOk8Mj(PA^XEF<~#aEb>2(~w5>)CX)LL&&-lGcQZy_4$o!YcF{`0$37Ygjtih$73Nc zd4PCrSea5$B9E34Hw>(H~Cj=g-kkLdb$rz&r$?ZH&n%FUo_o zAO}8}C70J{N|X!#rFz8&obcKNc-24fRn`UsA;E`M4P5pa1Kig*vF7T?xUl!^ls|fb z`y>w%e_p^}jVwPW2xg{S6TLSDu*O#Bi@d%NzSo$nTh#%00T?}D>}y`?6Bp>A=+HEH z0e{QmGmgt{{Ygj1l3k|m#U95_)t^!KB`Or*_tZMZN*Z@+{E_Bemd?;c$O07Km9cOA zDT1Xc(30|srUT}xCsWXw2S5%50C)jCLRkr~RCEFv@J=MzSn;P>e_8*(d#qjJbnK}e zo6vVz?M&Y*Q~}_DOiTbx5Q^mA5z-L3-_w^Q;qg5v+!9_j8k*3|GEZ~RwhbqpcmpYa zNUPW~ud!*nb7VX*Er#FVyPK8mbx zdY%TQZq;cz1R#E_E5vPo8Hw(KvNWX`Z;4XcP8d@=$6Id*LU*SLz9%I>PXg%9@4j*E z-|P3?Q}w@walDGc^FDDcq!n*m>j8V!-`CL;0V3oGXl99wT4fc>Zeik4xbO|}F9^3p zE|V`CzAb=sgW~+j;F7N-E|Q;}ctv#rF<^2cm>z*4LuW2aeg7(5=FD3_f_Hw^v>al{v6_m|i?;0@k2 zS{l;oN(g%N(CUHEZ^DWWrjQOyZdPNKeoyVAufR{mAwW>YGohm(e}G&rYDG9_R}ebiPd z;n~`?bD*s=CG_K!$Jk<-9)UHBQ2t6SrK*VrMYAvCA4P3L%RggSu^2!N?~)yqyjraI zh2JKKCV@;%*@e*NJ(_2-NkYx1T-_C7e?rA{iuE7Hx+#V`f|)4*o@qA#4ce{&MemfM{zbrS z&TkU%uSMWL+!KQ(V$QPSuhDaO6@ch4V6&`Q!zB+Uq$}4$+6LK%d9o}?n;pR^+E#>m}yN?*=9jBf;d zydvrF&=>)MAtos&vL^uF_5`HznHv;m2Yy7xIafxCoE;OXe z%X1x}+6czkjgh-~N*v9D@GoYwe|RIMTGxA5Wwn3w&DGsuPD416Kyv&3z;(1F1^U36 z^*+m3>ary5uC2cbRYHQPV--m*U6fUn%3+$)QN53NlL#n$e%Wma23`pPJ(PjGk_C z_e5d*Cr(Sq z7@Cj#*qD}i#m^ylrU}xKxf?zNl9*tSeI2MaM&VDppQXFd+&&~v*3(JB5O1QWI3htE;~T!?|U8?n4- z5fK#96L{!XUrg+UHJ?&nFq3+OI#C6X9A+8>kHEk>)4r^|Z87Sdug9htUUO|L|2c3G z&y;1k{wDyUer#!1i=MiTD7EV1Uea{}`#clWn@w#6t)fc7^}Tw4N9 z`<1Mp+AF=q8bRR<3|KO$43sNUyjY}j18v4HE_>kojk`#QD9yJDBSQ+p}3JU zlV4c*75IczKyLs2eMJYBSHwV>nr`mOE8{-^EW4*zqNT{j>W|KP)cK+Siy8;5AD+uAOYs4IkZ0ku2a5F~;$AfFZWPd0)fiDa%@L;5xsZ^L zf(I`Tgnn83?}9=NVH4|SiIPR|hdzms=$-j`dzx9IO0KXfHm7J_4+;Q2g@;K)u@Rc` zjxhMF@cW@?6mMq0#9NdY44aZz-lU+Xw$zmKsY%EPkEP`(#U^+M{V*;tAeg`V>KDce z-IL~PMbC-+A3Ol^knKEqiiJVGua`&x;42Ih=>z?-&P;kdEeRlDy&onxFM2aOAy6UU zd*y-8$35IT-hcTh1%NDD+=wR_dlU)g1rUEQ`CIXvD?O*WR3)8+;{>|s!$8NMOTcS= z`$QIB1r#zj&{TWV<$2zcv10!@}sGsrggiD8uRoXMiE0DEHRC!zD$?-&k?VX;78 zpO0PZm4yEvUWgIZwt)nyk|Ka@A(M!qOHcv9nDyPP-G(3{ltqdFi_8nbM@cYH2I$-r z2g;i!pkr&e!Urhp5H6t$DDMX6x+Yi_?ZfJiz#sBjb(A+gPC^y+KGuHR{JUD;jrHgD zy@LG7;@?w1wLae%_|%4%w&zHoRN&H;+v|kTW``{k4uN_wmf9eYDB+!?F z{aKs??&O+%D5|+PW*bW#5CpU_9U+ekVmhM_w4v zUTARZm39kw{J^!ap5bv-r&2(`yf{SX=`-lP9VI+>i0vRnXP4ix`cxKm3oxg7q0C!m z+InR?{jNnviPZuPD1bf{(Ybgzu{6?nfT#jA9it8LC;AEoKEmg(prU-wEdO|m4*iN( z@TK(@X}i>jr*w}*zjEP}a1XwVU(pHP0bT+=fjQgcN1bCZr7iFfQR4CC^`-l~CxtG` zf}AN!x(lUb` z1s@EID#V`Ut1c_nh4nOOQgE^c4-waD1A-&CapX}{P1@Cbp=AIX1fqk3`vte45}&sq zUJ^D$Dpr>05>qhfI}H&`VenkvvT;Em93m29wbs7m-Ond(=byfF_x||G^}q2rV3t+B z6~|>h$_o1?z06u>s0j##z>91f3nc0<=wK@Aq1cg5pswgT%TBN+hf#KE*o2 z`bT$xuey(Z>_f-M3r->UL)(JK0PzHD>pa~z4;7zPe|-YCd3})5*MkT7PGDr@3fz~q z-GW3iPS%+aJ~U6^b%LVqPD(x^(s#AapDid2=fT}|*K3_HDEqhQBMb+^6};_G9JVzk z+6ofbl9!D8jg|*!Y@pCGuK;kmPHTaH(JSTyDK9NJqLjGAHNkV{PRnL`I56PQSy<6<*h79c`C2m+{1&6#+I?H=}z4z=CG zvHS7fcan=D5Ckh?x-4)A37Xgd`9GB|WjWV;pFsvl;t8h0Tn;1G8|5Q{YfIKRwiK#U zeh4u5S;NI7vTAA$p}-5Er=XT%ITpe%b5E2&+%@aBwkKmvpw_H6rNPBj8=2$6HvBql8kHnvIny}X0)_uzTvnMw;+o{3Vp#GbH z01UO@2)+qU4GE`xEsyBPI(_%)P#ytK+>V4FJOWyBAq4N52=a_6a7k#AoMh?4=mV5% ziA=f)4jSI+Ivgp-@Jt!GXJtl5?uQweXK^OL7o6`e^h{c8TYg{xrtYRmS?rU7yXsDOkZPy zAZ@l4q-dnk;DD=3uFiH92R)+2(28PD3vu*oC=paN=Byh9RuzxKEfGOxl`wgpnPxFNSdd2mMfZ+K> z#fp-g!q+w`Y3^)1)$%@!KGPCifH4OC%f{lg7gqS3Zh*ep?sBp3P)Ei&ihbh?Fn0Cb z_3gFWJyZ-GZ4ZyqFv*+5-rvB}5-R|JwjWR^0SNTxmjodg5Z@(wyC48T!> zV5R9XN`NOg6@b47>r|SQEu0ue`7ZS!`L~&15 zz(B7YlE&IBu35!Lb%~hTWVM7(yk|eXi=YKQMnBKkW|f)$o-t(LG9LyupfyMC8MBtZ ztU*q_PNd}So-9C8j`VQ%XB$5WRXtgPx?%_ste`EpR@NyW1PD&qJ>z$6uFy>>nQopw z(lUX2uK7fG2kt$WBI;W$Q6Ye!+@euLjmJH{OK0g|7Cc{%(H;@b1>A!MrW8+BJ~#?q z&YJi7AuDg}vzXuQ8l_1>RQ;=GDpV)G&`%*Nq6l;T)pO}$DOZsff zL;Cvjsg?i`lOzoVfpMo)+Q{8_joVrywHb}s}~hg(1E&Xt-ou@RaLlcN%-G*Ajac`+;MjZ1ZZKoqlfh& z3j!9%Mam|N(w~)K$@dJUn5cxuJ>eY@NSB$IFuPbk^mCu2Xn1>1jHrUPDR3K1X!D8i zLoQwjXD|)Ki^#X*fyM{K5}`aJF?!07SRT-mWuyl~h|9DDDFprwmVQ}N`>fw3XpJ$1 zs)ENsb$*f3|Gv3xH=wVP5}=`_d^W#x z)NVl*8%XC(miVD0Ej+1zi6D;>^iH0vcwa>{k~l0Va4g0F%fxW~r_Z%ykEI*q3<3z{ ziUlZ{KzI`bgC({TKC#_aux-H)`DCLK7IJy;xkr*K%vwIBbtuV+L4j~xXi`UD6bLbd zvg*Q=igI5^yl>A=&fMFN?}a02hBovo9_U#G&3msr$Wj^wKo~%I#_2FPo1%THXAu6u zKL)!0sbfu;Lc_y3J&tmKpL6@ihg$D}%SQ@XK?+=+LHLmlr_(5>;FMVfA*!@=edCDz!gbd4 z6RF#nZ=$82$l9-fiMExS#=Th+Qe(-}j?~R1*K_NNgXT)H+BuStD<<7J2|!Meis zQvwI#or1T36a**&WD#ZiQi~w~bE&FKhe3})gRHZ9szh0Jhu8m-AP;%bHmmp-eYzy zVc*vC)9(?Tv_54%M~Q!_cM?3TUZ#(sm*bKu2Vd8Kw_@@4gskI=7Px%j|OVzrW0!f>gBc znK?0|Ei6zH%G#{mmVnkkNW;4X{0f1rU;>EEq5lm6s&MTG;A%jpG1`M^z}hQKpSkJd zY6i0iLXfPhisrU*m13ADD_8X^!BojJ z<>C--g?s9gJN9r^B>N_~C)$O8!mQX%4*AiZg5l(nBtg{vM zx7G#$hC-k}piNgou5hGrq!>r76OY5p2Pk5(-r^Y`Pd>BiYHXNyz!TkG}eq?)A>-D>*>szn^~IA0Z&2FxYR}z`5F9z2KDIwruJclzk$|* z4gp`p|DXsk+#;XoD;_CM%7X+StY<9mYDjSqG2Faq{3d*pl^LKxT`)LEfFC6Fe-By- zO$=-IvF2mdXKrR(*immVS=cSzqrah(9A`{wsd)kP#P0x|WhB~6dxOC!(e7n@pbTZO zq*%rwx_5et`Unqd`l-l7XF&g^DFCRW@U0{KyEr>@dq)Sl1V2K9!*R4R$^Isv&zrnI z`d%6DR89eq1;hY&mIe58I#NggG1Mu$1mHE`akKAEwGH6O>8ZQW-jBF_v`j;&?706! zpm;r==wI%IWBgee&Z!rX*+Kkx9d&7foCG^d@n>bIcS-7C#9WADilBf@YpfgHLbBZl zn7EA)`FpGT3*#iDmcomK;Z7fOB1#3%T|aYzy~50y-J9fwc&05J!{-IhY3jDR~hw z$hoM~iXi~*=@aIqB^PNK@IV~U28(!8?(bMSO{kGlpou#lRxCVL4EH1mp^P$56$L3W zT$M%ZsTYiV<^8C_p~oYozq{yPV-mvn6t0-Nu`E=Eo3iR-rRuVC0B*{{Q756_gcjx% zF-SdgZ;g}&p`1l4Rli?d2!I19evx*f1PNk$vo7n z;Pwr@7US#BMUPRGiFTU>m}ev#7Jh8_bANj|f1`075m6J&2^7k@djvs*cG2msXt*hF zMYlQc6R;L5zLbJJTZSoEh<5kzW<(&=*s+~jP_Wf$A_R;+p1ht7Q8&a>ffoYDP!PoCaw`uUMEO5JA-TcJ2w;k)SYG?C`ppFU;b%n)RVDTFU|yzw z=M?Va#g08!JteM-$Ct2|2Ey2v#y>C^s7&HS?a2BcZ}RxJD)@vsRm=2(qGw_YK&GJl zE_zM_FX0z*cno4_yScq_Cl_ZH2VmI72)TzhHuh{|6aeG!&JR#L1E6IhggV|S+T-#0 ziD`ZQ@WXFi3vCw(!qn0ExWas{;{P(>)RqAirbgf_NRJyA+Eq&;eXQ?(EI|!|9tnHV z!}=fy05&Es2znvb|IiCU)RrdP9zRJ(MWEn-VH@C&ubeHpkrzn=cU2fltN?-81n0Pi zq5y`0i30*Gc+Q=K+Qh8D@?!}GkhPyMkkk#gKz>+|bqzx?!f4F$ao|n_Ra&d%egLWYXGakB{>l;|Qz}F3F^m=S=Hi=keAm8K|1k(?4nv;C-VF`Ro6L(Tnr?X~PcI-069liP zowP8Xz}%3iAaU0cXL4<)7WdY`N%yWtH-E=my?LiVu}*?i9}Tku892 z9>iH?qrpSyS`H5Yw*Nbl9Js4p;qIiEw|SaBIa1DSIZ7%v%SI>wW(6UgcX)EF$d7N` zzx~s{xCi%TMIu2PupXK#CYT&U2ILuT6^-Dk!k`|p>T%lwc1YXq?o?TX89m3XtND$h zzdw~#_gF4qSfc7QfB;KHAn0uUmy6g9-dyepT?uNn#jv57w19wRz%}XxLrAb4{a`-F zCG%hq;WZ&F&0LOqDeJ!4ZLXgwMMPHCW!z(^c$4%pN~_CQJ_N*Ih$dr6B!)wtWDF@n z4!iZtVbRg)Oj`+0*r@#S9mCan>2|oC!iof$dt8=3!SGE z7GwnXc?2bM>yL!_bh-8QdLUp^nK+3S{kTG!16^w(RHJATeI3Q5^|UwdSK#mDAgraZ z^9!l85hKlxw$_GEE7V|=x8bwqW3EKOuHd8=SUiJ9j1&p+3C5a{hwHqdy2E#(@H7Pg zJvKhwNa^_g>u2}t=l4aj{^KjSh9_I7001fa?%?Fewtl$0zIHF4MUWQ3G%Xg|>b{UD z;E#W04c#%rC!qA9e$i{J7wqE!(2y!O_N@K=GuQokYU}7s(>udwHaRO37X+PcCd)tp zynrC>GWr{7QzN@{WxBvKfSO(gzGo{GNJ+2HE&u2Z6X43kUKjGZ>(dqe_`?$MnYd{jc1`ZRwGz*z2 ztPD7kRW}-e!t7kh^7T5NfAyfs%#xg9b@%mz}f&%w}yr)M~kht z6jj^S3yy*$w0x_Mh9lDA;>K2{WEiHtvo)OHZ@H>hCQvO_7Y!R2Uc4+~BWSTQ>$htN zWI(_$OiEkt36PPYzEwk@a0m!L;d_i2))cYu?pU+}%x@Tq_$|3RVJ%rt&#_AE2|OPj z3s~~0`z(q41UqbFFsf9mXKAJKA`!9#Ks)bDZ6%=Mm4ej70mvenWr7y<)0i7c7WhXMje)`T)Fyg1d%orv93y3J;0;^9CRmhF zlS|hHceO-EZeTwY)g**6^UBT~=tb44{_dti0CH^>xfdw#Aia zjxza0itmq~FhWyRORUK)?dRV9=J6m(b~!7*o?1b~o7(!Z%t2htRm}p;(1GiL z%Qk(*GrT3xT5l83x4Nxj$MG&RONr){3QjFs-F+L}c<_?Ivz{i_h`C8!Z2^3jL~aoN z`QMCO;H%1(wBY~Lkf97QsmI|Jwbh}7{~g*505&zzGz9+_59KzDXgIB{LM(!cUl9ec z=%l(L_}^2#t?rZSb9Hm=-h6)NcBKSJ20WeI<|NJx^Cs_Sf15mc@@2ohn!BY_0Lp+|I3U1pc%mlaXH)A?PeD0$@yOvuPbJ^mcizSVEyJi z5WpfgTw^^?3H3WQ1eOc|(Lr3H5dQ15c@Usm*;Y6TcC&B;;YARL%fbfF)gbC`-k;O? zKhKBxwg1LbSGwVop=Dd=K2`ugb^yqeAQ`Ox*OtwNE3}b!SpIB5(5H9Or4#_KKfZT| zr$+-(DJ3$Eg+ShXV+$zJgXtrnM3r53Rj$zjeSGUKudb3sgV^k4n|5pAerZUbDnos& zPSh((J3@YogqidLXv(dpWeNZdk}XY;1vI}1)m4b%in0RDGXViNiRcuHe&UGCDl#%~ z3awTB@hyP>YueFXr_p#TV^LV@(mSXy-Zu>L<7HGGb%*7ePe zd;9f+J5~$;pO6l=FHJ!I@&N<<48Q!f(=d+SOTTk>cjxvL1rj8fZ{(nHkfQ zB6w1!^-o!z0PF^U7eH*ifAirz*VIk`O%3q8Q8HuT*oadCz+hF!`k%E2a@iUgNK#Aq zM%_!Jdny~CW~h%@VU63>*bbA}4DZ)jYX~d?0TZ%>f2__mscVtK>UV1hECK-|f%;R` z<&KNAeT&{@nxl(to8CDlJue93Ssl5~ZvgC&3GiePN0`|fcrOevJFT`w{s#sdosek| zpr1)TAOPUhB!rUtfB#Mj0Qjk*6Ff53f7&r6b-P`6a(V9d4iDUAeEE0mJ@8{5hTFdv zE2!kBl~MqV!g6|N`%X;e3!MZTc5!v>z8vhjD`|v=Zg3vCy#iqLtEIn#miB=NTfBGG z=;nhR*OGfrLssQ&On&V@!gLZJ$_xwY8Y0)0xt>+18`G4R{Yx-mRRLgi9ajT^2oY;6 zTn%{ZQu9H;*8DFqKwQ4B*13v-fP^)SMRN*k@F3m@Q61iC8k}t@0|H|vKM3C?7TV%4 zZGrIxnc=zC{v-V7SVM1mBn+f1l`cb~A1(ITbo{(k0Kl(@yYB4jLc!pD{pssWG$=#c zR#=C)h`7Sf%v$ugP8@eXyZoU6JiO|I@bSy0LApy%wJ`_T1!8R1wdcc zX+8+xdOartG~Wm7w`vHCLI85zlS$5SF-^Niv)6ZO2rL%@#?R;v^bkjsIjq9Vtx#Rs z${}EMCQ<^-*x$xGMGAn;Vn4h`1It0vJR!S8wXy!gFK)W^U&v=$gv&$NDOh-r7p5NB z{_j@5!jrI4{p9ZJheR96JL8U*H&^cU=MRqKC_flprcuHVl{cHXFm8mz%PkyWg9-qy z(xtorALdH~Jsa3Qzt0=q?e)6ur(b_@N2kZhXps0!f!yo}5GR=FPZbHhprDA?kNQY! z*}$F0)@#Kohyvh81p;I{z%5HAKx-WrTHh)rG|^RvTToiq24=Tb0F<_iwxwbwaA{hx zSO7IXZcDe9tes(9xJia3t6N>2RY1VZTcS6kLeKcGA^ai?rv>EkZ&d4vEdwy)%CO$F zxh;O{{x-#5+L6KVho`QYI{={Q#+@*VEdUEm;^(pcWAId;<&oCUW%>U}yT4sshuCjH zCIHW~8pF->1Ak5a?01soYQWO*;yL6W}6iCxGHAJLbz1xJQcv5bI(a==WXwIdK3))VClp zZ8hZy(co9%0Zi3RkzvtjbyeZEtR3x4@MoM%7%OY9RQyLK2-Hl0BkoSoujvNK(&A@U_N`g2>)H7NqKs4A1fbB6tvcV!v z=c^~K@sMQzv1cLArX4kbAvkY@CRcshk|KllpxCHW4hU#`pwz3G-5jv0v#b>YhLf6R zY>O^aQmys#^~bgi0?#yvcqr&Jw2kS*Uo?SFM_0Y5p776xdt zz!UCgJ)8WE;-6Ml0Wbtz=%{cUK1rXA>mUL$z5VjZ9Y`zG1F4~olKaiQg=;(lMiSUC za;S;}e`Fl1`(z%U z<=!V3XYTc^084tPs077AAS}jD5Kj4=OmiX9GI)%hRy%oM*66bK;v3s1#V z8J?!;_)@-67g9q2TG+F|laRxjCT=-Ki0F7l&?vz{_%}gFd{e|VZUwN+vr=ttZVB9=Mh?ehu>iC_@9%m0tWBV%|oZ ztK%kE{{uwmEmH#6L{$>}3zaL`(Fa)5n8+9wC97&(oh^od7yQA~Aycx&;HaCv3J3_j zY~8n!!o7+6AUorcvotG7~eSLFBEXN9FeZq3s%9RE0}Bz(}02S)nn(L$Rk*; z^ivax>Kg?|XA3}yMujGj75D!K`F1sf{;~f5^@q1!5vtdNScD)qJdd}^MnwF^;5F7c5gnvcXw=GIO7DniE;!(FC`Y1a5S!|N(}n1 zhkNer?#I~vkoq|DWk-K-3##JW$spNLH#5LvSloIc>;Jo;l$6bb=i0mRG`h1RA1_y$10&`E!`K$h8n z-dcYXKn?w1Zeb5?E4&z=xc&+i|HYvf0HoM}Q+%aXQ3IquZT;7HDLEjI`#-QSW2lq> zMRQlwoxp$h^h3s(lDaYmoyg1kgFFC+eLDTUDaFP`s%cqE`5Z8AKnfihj#*9OnM5Va z63^$)aeex@_r?A4;a7Kgb2Tggq{sSys~OZ&%HcCRi{wtofeV z-DJi6(&1JYSQ-eJ;IHY%#ug=gjeZeSVZPiPdU zra7X&Vjxh&Hc`e3Km#_v{N0(WhPLz<`nzq&04k13C43;u_3b4sEw zZ*Fhg*P{dXaraXqcj(t}L>``+d;TwMlT0(px}L7$PT zUPEp&eFh3{J~8cGOA3J2ch6koy@Fy8=&;g>fy*zl{#Uv!`72LXH`TALUQ1o8y-hRm zJb!sr&Pm%**b~C1PBjFo3IS#qTME!bsTZGZQiQ##4J<*uVG6r_S@^PI`;?%53s*s? zB2~CAX2{(xTx?yy=0N~8qXiYlmAWP|*1?_z_Z+Lm8;zbBmNu&ASrV)mV9g(%=4%!J zK@PgS(d5KMkx6xLi?&&S^XUoz;=5to{qXgZySTm{RD3Atk3)Lyr=LMnF(Rk$4~k8l z2$I z=OTlq!XOImFVA?aFfi+?7YYFz!y3m@X&O3jAz523{54JZnF0gA<|z!B6C564*2>Z_ zD68$$y7bv00Gf!nv}HsvoSD6Zjef(H&!C9y3qGD;RKLA6gtha}>eH{$osw*)eOn=W4iIwIlfcH zEcqZ<#g@%g=Z3qI0^sdu#R0g!NS1)$KQ<6xGHc;iS%VY>z-x9|1WfoLX3UHX;UeE$$Gfyknhkv_Ka;zTdez@383cqLO^cbNWs@kwN>;rx zR0oP{TWG>xY{=5W20}l(fMNaj#BU0y1qFFO_lY4^hJ>NZf|}>U*qgg+_vzrPEd!`& zVzL7(t^mk~05lo7(94G2mB*h8kp}lYU^>zkeLX&Ky9fK)4lw2g5CUM>n!zLx{ZhO9 zbxFOw+)KO}jZaK6iw#`79%|sD2#8g+rFB5mb7Q-`eh@)`fXTT2!#~AX!Wup)2%v;z8@Zm0fPo^XvQ+C58Q_(c{=RyWuii8o z*Z-@M#0e9=+Rg=WW9FEa+;#3`{XdlOzw3_APhznIZ)aVJrDO|Stp+Q_a|m4 z@k3f%fi!EU#G4e}^}>F5G8FuW&w0jRzg8T8|9ta{JGnTuYyXZ$0fT^FdKmy2LNPvb zfqx?sWy>04O$EUG+Hyhh0^rk^&=%;>V z3q&UN^5A2-rpvwdmVb@gtTDOVPt~Q>5Li0|G#zQWi5SlqIbVB4HuQri0Z<+jKsG)v zR<^mu*r@iU;YTV9$&Ic!XaeulHiJP9H}H*y#`MOq%MwcgFg8@03?l=)(Axi3kDYsx z!{|q2&HX=;eWrtIg*hS`&GvsR0RV}oq_fKl_aCo+a$olLwXLHGMS3It-l$yYpOYt^ zZ_0-HiC9?bWb;`LI1X_k*>QQ^_wRxT9vSZL?%aR={V(q5^u%w+1e7Qi z{J9AVfD{?950wR!sk((~!Q?#B;30ShZQ|F~y$3C~^V@G+^DzX0hE^jX=pyjKyluPn zpB|&KAJWloA3^a+Cnr{)e3B82Vny7F3{8krx2o zWK~YS_L>W~f$&$kqe@VBlwR;oJ_be!Dpc|+KyiE8WeFh?o};R%fdNoUek}kX%77pT zj5{*vC;)o@M%Mo_G#hUfWSDXFP2E4eI(Pr`=l{|cfP2` zPNw`xzCR^%L63cl3i|k}KRa&++;uzd*RLPk;n}h4Xwb(Izt3&}9gT$aU;sbn{opD9 zLH*Kogwc6K9DroEqX};P=9%pVP$k}h?eAdPCJ*CP0Jq#_`lSHLJ}!5S=d0bo`k%)0 z`HHLGsv%H92zcbi!^O^|>*83W{PMbr8H6>^UI9?y*@U?e9;CueSYEHzC5?lC83~$g zx&C`AYK<=AAeFoizk&VV_>QVl;DpH>1JR>$4E=WMQ{a08UzgEPkKUQG~fb67j%)0XT>c8_rz(}S35EGz^iCSw$)UTTL zuOiGVS7(nTX7vv{Ce_%IzZapt-sn(KF92xU11SK$mHYogS<$B@8qD^8cQSes0KE(e z`9&Vfc@pv5_D_!7zT~(oE$d!(+64Bx@(O@iJJolZCwuYpbU6e7#0%i;;zENyhWx|; zU@eK=N-|_tMp-B-f{|4(RY%57dN%+Oh96bFbdPix8MK|K=8jcDCo8P>TJ7Mu)q?&9<=b0U9^NXtgBQ*V0jP#&poaOdd@MN zFYi0sTM`Q8YA&7fEQf^u4W;$li<7Hpxr{wp9ti(br`aLUw^#tg13&<%82x44Jc0k7 z+}ASTJPH7{k0sCi2J7c%huL!85OG6V#REV~T&IaB%$4Vtm)g!plbkl)N zXU01;-VMY1@w?&Nm+dt~9ud0zuKTl)=j-9V+t_ zC8c`2f%cC8AaO=VgK9?#fY!4|8er2kY%8z(m=ECO$lA5q^?wY2qT67hZS&LKyd4q{ z{qg>cX`8<+2FG>oB_kkdd?dCz~(XHMStPe=cfcTC}< znG3yB83jN-z%K)qzT?pF?H(PtPkUe8sRBuKvHV-7>iL}p27@Clg#b;%o@LZy8D&uC zjD%5`WdQ5|V0LsJr3`3&^GLtPu8F3wgp&jlSVMb%66DVJQbybATSEv47ug{Jt-mLJ z!$*}p6H0sUJB`0F=v~>i)fKNHFcAV`H^KSf1)w2Nr{zMxEThaX77M2Wvy5oG{aYV{ zv|NDKrL6@5;7ChBlUs_L1g}>C%w7vz=KhFiuz3P_f;@LIYkQIC|IZcU>xB$_76cp& znDAqs!N^$__kXI2>;GUI^YL}>t6ewOH}2EHuKRMhr+!j9)|gBLqX78;gR;z_>*c(U*(>#J{NX$wj9!ulUl0B>R*65P>w( zYiTqww7-AqT8af=9sk81&mIByzKe{RtUgm2;A{SWPvv?dC z_?*aDU(^uTR0sqmfNvkuPi3r773mU`0C-Q?JX7L2d%=H$l)EK{b=9i|PPZlequ8oA z8&I0AfbMoX-AoanG?kifn6DFDRVJB)vM62{F-xz5MqpXGUP6?s5dJeKe2w=*4k ziP?6d?f>3?{wTRE?*2cna)M7rv6Jp)JsVegneT6e0$>!t8NE4@i9Dg>v-10UuRpwX zzkd1PZsOZupit7lH|a{V}>@@*+u;*{(r+z=!Y#sEPU{`;phCmr1;KxAbU%0Z3(b(1bN@z0&v0F2hd}5a z$Sc`)E=bBNS=GXO`{?x4{q+8|>&HE}6PbhTm$Atk+|M80xHli)Ya7g);cd=P2wdxD{>ZUMK-AC7v6}^+W(ogPk%*vp0hmT@2)~xJ zggf6qbInKjf^Dp;Wq#eitp6}PqaC%bYE4Rw~dE@ zXFG8|6L%IdXyM+*H-0S*6xFn4Q|0vn@N`|wMj-HOflK|7%0WQ*F$kKB0i|*cD0hVk z1W3SeNO36>yfTJ91@~^U{ogc+FCYj8&P&NWWoVfAR(2=z>;I=i84rNNvm^J{x4$S> z1J>GMVr3U8DMAF9kj96fWt;FP0BS;(3Ot&I4kc?sKA;afH<^EUKdV_jZyG`N6bInf zFYn#^{m(v_1ljcKYi&&biroMh`Ki$#<;nWW`tPZ3R>f33sUz!Ya1FxPAJw@jO&d!9 zc7AvvC4rumAZd8oBvxy%=j#kC0Bmu^`oGG0Pl%|;eYNGLlcSuSN>U&Q_AUl~MqVc1}Jh=I^{v-mnup zUBvucK-OCYf9@@ zhSbvfpBC%b=S6@rG@|G_sEd6NpooYTU7uOLkBq|@!}_0r$Fmew=dB^I2@nYEW;psb z)q`VMed}jLF^zZv1gpTZ3SXcc>SaHcCiqG&P+I-!rb7Vhf3sdTxzcV%3DD_uEb{zH zKQvF_SpR=`?xX+beV=X4vHq8V*+MqK^`9lnIhJEx-(0(&etqr!{guQUFc8ENq% zmrz2al&BH`UqY+vB4&gDQ@j{ky#8eWx0fq4<Hb|3N-}E1%WhSFIVlVUYmyI#-?_kDGSXM%UX4i*7aW{1cV;oNLz0I zOtQepKF5*|}&b`8G36hiYZoowt*Qo$e9Bzc)Njm(y^!w>NHAu>jC2 zT}lZsNE$5tYYmjFH~?fy7d3dXL?>w09!kR&QveVEsrmSxyZ8H-Ui(&1JJ`b>#;fex zF_ow{Csu`SM3KU73fA2P_3Ok+rXCW|g z5`SWe^p);W+MH?vLj2BWLvfxKgS&(n>A? zi~>4;XDs?|=uCgSxVlteiNCs2EeA*>#=7kW5G3r_Qz~m3``Eq0P9vgZhv=NTfB|UO z%*}?j`t~-YJ#H&{=+2K?25^7dO7)&ChP{ct6S=nA?WUjX^JCe5EeDcPaffEF984FL|H$z2Vo_e^xmK!16&9 zkYrf0??`{&pEoro?i2^$v-^6u?+7#zkcl-j{TmG$b_HM%#Z%d!JE(NLk~*i6k0j*B z-E3&S;sfmb!?&*aL|V8t>XF&AUZTGj{;N2uQs6DyC0&bN$}0fMhNK=^J!#U}W7h^+ zdR&zapmlv}2owx~ffqoC23T-?Ht+MYtJ*REtng6K^(DS$mjCsBc6|-3zqB+6pd>QG zNor@OrG20-XetCy0CbIanVNNF8O&(+8*SyyPF{I@|CfQ`60vLRhZjQ* zBkG-YVc0#|Ga2o4;H51dQtj%=8=%`&pV+UPxbFAEwYGJK=d}DRJ4HcI1~{w?MXcZ) zks(%Ff#sGSX2^8MaX1&&qFJG7@hVCNY$!-bpP(UZYuJz4jjOm^h*}B=*get?2w^vY_`54O zXYW#5r@n%+>mnlv2zMKD5o`+Yd*FT+UK9i@tBU@ZP*YGH>d)2?s2T)p+-N9E2JrJ( zLs5`RJt0*K!p!$rRhwcI*UBUF-7@nP)#}ELtt}`Lg8Vi`48+ZDY+DBnE8)NZ>g+$? zlQ>X_c?E%42EE3QPh|a9CGsQ@wEmS0nehLGC)J-e41$w`*^?6<+JBL3c6f5+ZnZtT z#l(r`K93@C8Y&tdbqsnBMhdjO+x7R2&TA6&N0uV{=j8Lh$#tpH(+yJq$}IU`AV)tU(ZA!v^VIAwPLvZv+m!!JEkicYE>T>g@8d8SZn!5 zPf=g_R~mjn47O=shiJHHbL;nO2y6ue{E(60&m2~h&!zV{Orf;X23pqqt|N*4)Mx6> zTnDVH{0(puxv7EmQp!Ki$F8qMMNHQX8Sh%wXz{Nl8Y1RiE@1$6*=WZ4y1{Sj{qm7_ z|A()i1{XR`)^T?!>wj6?|Fwjn@hA#TZZg$m0G?|7|Nr{ipDk8fS8|$9zTpV)Ft=WG zL72zVPY(Yak`BMgea4LMubv71@`Sc9WPK;B zxmNnH3C_QJuDD+L+~;Bb%=(WE!xn%=CqO2-!&w0Ge3csQ`#~*786Y5C$ah z=fM+z?{N-^`+BhJUVnP){_Riy>Rvs28EJ|1T-yOQT<=(et1BY0qIO{Yx2?*C$B2lNv9 zIli)^o*5C|4x~o)a(K1VjZ69^;EBgJRP~0{QJ*; zRj`RKl9O>Y;XVC2BD!p$fd(x-jx5XM@>8E%?Iq^kbRGF3#Dj?cwk04peB0XJJXI`! zm#+2Vv53lQP)0-52d}}$X40soT6J0)1n6OwTeL-J<>a)qa_1??6Iv+%vT$>r0_%4o z2-E=GHdH{3#y_7phVyNM#46gW*-G=2?XkY9xk}{{bkK?~mMpIVfOVOh2myq(RgH%f zyf7Bsla=_MJOD-oxm4yYxioq~(7YdH{eK0oj)yYDW5N$z(Tx-U7ZRMypa7t%_tdA4 zwRNHS+fS&w+J(aD>%pG3X#XD){t3<=<~iOY#gEX_h^G37Gye@dYFA#;9R-H(DEJ`f z+^^ysyBcY3X0R^zg*ZWg9t~+yK!)M>#v=r4Kgc)w&aa<7YO9F@Etkh)8X=qxeFA7$ z5WRqe!|x2nVC+_*r&Q7WzGHQzsc7ABzlm$!5Ds5Gb**m{3xMrKR*)cGxYewt^c7Ti zlZw;;@tzkx@JS&}WBlmDwe5e&(2w968|6#>KwVtzq!xkV4**>RiyUcvw3 z{QD#jAOqO)WyvlB;d#;vD}Dw7A!D#Dd5*-Am&21|_tU%ACWyyh8I|q8PktzGJ+AV( zA@Kg8$b!rku1plp#maalk%SDgK{bBA3AFh)`l`h-v=RvW5Iui^(5im z`>!9}m;GILp}-Rl@87pIfd-;mab0)-zUxthYzvW76nJIl<%_dN0BWSJ$`WtkP2 zN#5v@r)4!%wgCd_a{>W|@nl`kMU4Z?>V2$`eKC`^<<|hvid+4!N>_nKBW!d*lp+5eU=BnYb^nQ%|XEDy;ijRfxvykb5Bpb62L0}sG4uOZ@*vm zZFl)IF$JEr+3ZOH;D!ITmeZ1~8dK^&vG6rLtgr&W19=|2rE~c4?kw+vICT2S`HB1a z-5d9(-~G`&dGy3Re)!0D7ZLPtg=Ag1;SglcV}XC>@lqdLQ_oKO4E3N+snk$Z_`a>b zQ9GpN@?HXxAD%yQt=~Lz?QfsDTLJ~%4V43_B4)k}Q8rQoE_!0oms5L?HG;%A+B zs&65vdN-|g z649iqq*%zBpBJid{c;U~6+?hA;S`yl_!u)W*E#D2Eo0p^!ap$p>Om3#j-|Oz6@>hU zXU=^S$s^NXicu0i{!Hutjet#iVa3n!S|A1))_;~EPf6Wg*XpQM4;AKyvZw!_ zz4v~S<4E>Aqf|Gv1_4md3`akCw(o?U?U~(ww*SukxOR4TYrF5g-I+IUB!`*+2oNMe z5F|lp(F(2Z`*E+R%*x8D%I?mp%Bs!)s#AsV@bK^m_wewTYXv}=$Thwt#>G;--_v-z zYDAZVvt?cT>Wgsh)EOxO-cA$%5CT>J>rwAt?`I5_0>L#YOjw6`|gL zWW+o8D);I4yx>_edcwLzBBITocBEuLvEU~E!q*6TMiHll?9l zwY4oB#Ua$@DX~2JTu5f}65OPh2YG~nEbBx7u3{2V8Z;jOKY1mzuH6kg&(}ak@7qCO zXX3QW2?|NyJ4kkQ+JjEXvhZ01-3gT$4#9lT0Rn2jgS5VpR`>GVW%jw^e6ac>ZAHN*(D@^DZ&i_uy{9pV3iv*fvUBW-B|CI=;!;*xf6S87B zGF}0&Eg}2a^B3XvcXwos{e=W>gzbLeKH<&j3cA4W!iLJs4gNk_CL`n^+`A>fuI>3B z#^&REHg2DGB>?#iD=Qa(sl8lS1wa;qQHb}3NEi}CGORKC^PmBfbWdNr2;bfRA>8@? zoAAyXZ-wJWx@I>B%qRgk6@dLLPKBOT<%ECgqk3g0hQLW@WGevM8oJ&=o0#Xw5n%h3 zGhyrgbNK=g136$Y!9;l&W)t)tFxNWyykNj4%qc;2Uf`}WoW{?xIMquGe!Qc_L9oiT zs9`Gy17fObcr(dmC8V58>s)#m5Jok|V=3s9zx}VKdE1a*FZ24Q#=v}Hpf~S@{~Wvu zbcvR>r?UFrY2o?*;CU`e4z^%-UV{I5$sotZ3(r<>_r%KB=!apz0B+MrDom|Z*)kO$tS ze>`Lh9#!llzoi*7Rsd-@rMzgc7e~Zyt44fNCvE7IfXA|G z4WX*0uW)`&Ftf!y8yIGf3w#)0#elp46HLRKbHBQ=9&UVnE8Lbt_BfKId1v~*zj7M; zx&vRd)*2o+of6*cegzQdJF<>$v1Nh%F1f+W;gkSZ77(d=BknNhbE`D3FOvp_k_hqY zPw_ADVqCv^y!g)JC23!*u7r=Z|K!Q@XE6)EvSOZEIq&;eHH_06^5~LEAJdAz_Ohfy zL(lCu&xO`$oil0^p7huHzQ#at47mJXkpZYU*p-fHqFo%}vXFNBx_9@yPM=LsKQ96X zpov~<58f<76)R8&O%D0jKUpXQ7c&Y3C2|-xHz|}+9jV4Zr7+-BT?S2K@_)n}|7kUK zAAPJ+XekpI=HNQ|ucC3WR4mf$f9O zJ`JDC8G91oq#hCyQNDT|pM7eCaLz#J*SzUcOcT>3`H~+F{v-#<&l|o6hAE`nB5YR* zfKC1I4d7+QysB_5hV3dqI#C!P948)c@L~562>-q&E!3^Mx5M3g-)cL}M*OHwCDRa& z)-cm~8a)#{dFJJe9wT`18o_`vFvmeFN2iQ1>$Y|FgscF>aE{3ep!Xprtgkf&#$!N6 zQYMt-G2ij2>lnEhP#-q4v_#y?j|S4S{XI8k{c>?IpvjIVApEP_zWi2Yc*FvrDMwVg z*?R#t<0O;4C#_S|7^o};m^x;qs67IUz~5=R<39wiIwTlq9MSyzvX1>bEAxN(?J5-5 zqKxxDWR#f)F+7wQ$Qi(2fd6f7ZEE}VJy`&J5x#qHzgvTJLKp0P-~N{E+27joE5i8Z zCciEF`Fnrfl2t@>_BReK&@_(z+!_ES0Ju-X;5ncK01nD=OMq%ky!J6tjYG{Wz7Hba zq3C~~@S$Pvhr=Gz#w#&t+-KT<^2bj;2oIk;vdOpQKpV%?0BlQOs?jN$Osa%=1cGQH zY86QRIWEFZYvlxcLt3w;pI!>>vt28IRP_3`#=tlXnEYuZR|)m=IB@6UI~-;Qr3%O$ z8T4IoOgmjmf+I1tXdjI-_|qei-p!&_btd&;Qiu|uWeR})ImR%6EEehb+z~DZ>Bqa!1opOs@Bl$)Y9!87G!P^GD}}q=JZH@A}Hiuxm$oS7iPr ze`DtT-xeCj*MmL(f4%-mc<}g9Kp7AN9{X8oN6?M}Ki5quJP`Q(oqu=JeBMQ60IT#K zCmq-K^2ZX=SBKM&`_tAGZ3#dbkVl`c1kfpGW(fe!t26FaNeoS6cTe|uNH3bfsI>kq zO^|+{)@Z(bxf%ZO@w?%!G*Vk4z+PaIy&@+Nn>n2CT*Sk)Rexrn7IPS5jy9AD$N`dVXP5ilTym@BvTM&QIo zz{2Z4d;gOO=prDcggVF{SGcIvf6c>feqJO?6eJ?y+d10|_OzS%2L->!10IrGIJ$b`xhZUe>E45NjdXxyR1lZI&R_5gJzMu7VArt^*BhdwXM~ydTq#7q8FVEj0^y7*0-oqcl z%MG+qsTmc|A|8L0dQaA5TqW%HRt{5eQc*gkw6FadMwvRw^r-!+lmKEt4Ng0#Lydt# z7+{r}i29QuwL;13NVynbOU0fL3huj2P&Y#^N*C~@seOi9do5s%r(Gok9a94AVH<$W zH+(uVZE)-IY79&q1CVxl(X4QRnj^QcHbt<~z0bu9r(W!c;G=u=U%**+5&pr%3*Thx zl1p#`IP)N&X;k1Zw0&VWyp;L={YMYO*WZ5|UfQ;6U&wG1d+HPyHmF=4&7={K)e>g z_^`M-UP%qQy0#uZzw=divhu8dWpj%Tr&ecfJ`l)rSiS?1r}F~(&jvu`_`md#hP)HO zcV0Um+E>o%$iRXOD4Tcve5f!0dEp0zed@LFUw+f)b>HEobcI3F#_TQS@I31;^MCBdJ4Ud>Bj~?HNw=aJIbA^o>*ct(&h*dCN8tu}1mR!i@ZD9IQL(4? zJ=g00cF*L0+p1$znE|L>2{0z>fmHs2{rkSHGTA=hiW8Is*jt&)bne^VjPihaVn1=+_bMx6kfv)ODRqOV|xXt^8`G4c2>QW#uZrzu!wZB~bP>O(6nd!4Kk3h`;Hn~BJGW?hL5f}z8 zbn6NL)hnl65d6stzXUltgkjlE?EL~M0HCJvY$9osBtGww_i0?GwMYHT%Ny6rBkgBj zeID*S_%^JpubM)@K+*f%r~t^d0#I31Y5^1$d2pi4Iw}PKN&wT;IjS473}~SQ`0)j8 z2`JWy)7Y)=4-W?79;iIc>EXdb`874ufA+uaGiz%P_4~SA_KCnbO~&K{KO9gF|LRaK z228luY7i5`ym^Vu9BkrIZn<@CH3q7R0s4gbyU3qx_rO-Hz_EWvmzE_=b%xB%d(jWw zO+#kpjVq@@cuTAQSm#C-15+9HV{Xru^RX~{l#a#ZFWD1lS!{CnZHAZd76#wr1 z@53iIu7!=4>k_09rgyva5#_VIy7{+AcE)ze*FvuVf6`-&*NxD2{FW9(u>#1;%jd#zOTlc%-YSWo{rKMFQy!xCm_=W7&(Eo3Sl;P4Po6&wpWeD2 zzWnxU5vq>Zh;+3jBEjJX*R;xq@78g>jK0EW`2aoU&}2jVbQ*M4Om<@3bZwtI9+rOc zN@$+ZF(kDWz${y?+GUIOO~_35foelsdFXr~$?dMiVW(Z_@bOwaWgT;lF<@+-W{;D> zx?h&sng}uG3{aBXKSi999<;)sM9L|Gq4(?>~7UAv~`h zX@08w;l1fsef3U043E>7z#dRIU~#~afm_0*FPt!%_6HPQ?i4U@D*#3q?r?Be`u^M| z_jG7_7sOCB3@03!>>0-L(AEeaT)!$Mz>ToBE-#xgFtK_m1;CoLZ))`1P#m<}CnJJpbj+#vKSC4(G8s0Wk1%>`^A7O0P+UHz2)e# zU$>F=mb8vNw-|8#Zt5Qq08dT_b6cSb05Wc*7JKXx_ zc6he(T#cJd%y-rK_=W6V6|#=nFVAN7e-ZwnXZLlHzyqa7_(yBkx6&{8o5zmwqqM__M+n|#(@a(S~4Mwz+wH2Me4u=B+v~{=Pjp-kb zT2HH%423>NV6M=eM`(cbo&WVfIjwf6%c&Ly=mGr83%2^-_GABs#mP%|Sl+SV7B1=J zt0+yOk7rAK0m#dx&1|~$WB-5WM;B~6fT(>w>QXJtE-W;*!YHyIX8f|S6`yd$ z46nJ&WWNP>8B-pA+HaP1y1BrBum1yTt)wfz!6e3LOthl`E%WX`KM&)5`N*hqtTEud zfC+bI(v861Zgq5&nygCoE%Uj?9CPcFT4a;s?Qrs_@BtGU^F!oV-PBL=h%G=?0F5Xv zSo!DZKif7ux(*vJH^c4k?u4sf+zOAMJsl%3>*z@NkH8V1o8aS&ZQOZ?=$lzSQUZ)o zsgMYSC1hG>QEd!ZA5}k%^kjU$+91yxbQ}q2#{z1CS=`KY-fCIHTVtR&2F&DI0v7*b zKmc3n`09Up-W|Um_N!UnzIi@0wFSV0=Wz&umvaIcrvG^VuS!rmH`u;_1wetYy1o`Z zx^Xr9<v_i*-0(p23HKgdzVrE?dOeN58y?5@5P;iL5;k61?c*0UW4*p$AjV!HweML-K2q+n&s z!ZB&@R%K4axuOxDs?*Z1UJskMABK$;F&sN>WVS z#K$E=U`aeCY^x5BpFIiJzW6-c&`E1CAb%lm5qv?Gm48<75&Q?&wPRdQG3qawk{9_> zM#Ief-Q$0LI#&N14Fq}LYCxJ8xQ$y3T;PYclfe8K1;Xww+XRwyNsP(fEvNzjM8=6s zJ^~}IT|n{p@f|7reSccM@1~fQGbtJ$Wq_BrroAfP-uphh_vy#stxKR#sPR_5bGWFT#_aRdr100y-IC?$58d5FPUv zL=5=$fJFd#ZgoBW$M@;0^LBi`Z3^GZ%Ovh)(2eNI3Fg9EnWlj538c?cT=>_?{ar`} z01X%sn?+r0+);7TX;3Di+3~O=Vi=Y;jZSMe!qe5~;V)M|2>-`__+P`>lc)8nOAyGz zIOD*PUZ?xcGj>6HJLVBz&iHCbj4*ZK<$~sRNp)zeF6>|NYKu$BeCG9Yp>^wru#L%) zhB&Rq80)b zvRjk`dGFt1n*O4AO49l_e|As)LdgWwjqU6Xi#Ysi2Zxv=`Se;;^7=W^pKI?arr?!b!X{MR?@JV07x?-l#)P>g=s2&DP&8W$A z|17e4aLx=OaI-AOh!;+W&g9S-fv8}}+sB{I(%8HdSb0+?mlq{3 z4Frt~HZb^TG4Of9FAkvspeU;$-mtj-o<=3aYrNmoKBgZY-4EBbZ{?XZSkmu!R%+>8 zv~t*iWIb|PUiwqD77@4uGZ%r`K=?l*0}{3~pacMZz?Y`7^Xi$ZU(fd%zEkC)S8O7$WP`i;4kek9L-Or6#`Bz;HAbF$@ zD_Z@>nL;JDRH%iK5te28&;I|6yfCa{51u>>|MI8bg-1`H$ekD~k%TB~AWY-sKY30> zjjULkeU530iYJuiTLFe0=?7%S=k1gN=4t)>KCQGM?qFaW0At1Amr1_KVrG(MO*QX? z7!F=6d3k)+u(V9;jA{%lECy^2?Gx#Rt>a!Q*3f?c_Sq9*Nv8ju zizkaGeJKU*Q?33ZV^n4A*6M#Kc=R7Ub6w8Vzqs>tc<-~1!i%+)zPh`JN2^*3B}dh9@oqRYlPIk+ zd1eWL=lDwl>F;RpVU6DZp7=>vU0cj!0*9>_Dvc}JJzG8iPKjxF17+J{p6yX{1^gzsp^|W#Q@GsG~$@hxTtlUcD>Z~ zd^I-1C#D1ktN-!el!~m2nKcHWxgOp5{j5QnxALvGviH_>q4qRyRjA>uF)&pO*eYqI zCcaaxex@)9xbma5^rnRWH!o;TU2q`{6ZDr_U|f|G?n+F=BqOl*UrxgtSPT~k2*UTZ z`v1XapM;ect9@qm(1`z(En5kO1eePYqWI;9e%UQQPWr8HJ3#R;XvQDo*|^y=pNntf z71;A(o>f!jLlfbxuVXMkgAyf;#)RN7+r9q9&2abr_v(|WvrTAiI%(cE0FtM(8w0^q zJ~MyemtEKeR_%+iZ2(vS#Gu=zwg$A`5c4{teM=)cYD`jJ=Nto~4`*T!N*&6@z^rgO zt8&Z5UY*;1Fc6u2O#}PE9^<90{_iVsov6mZVZ;D)$oM;q^-t>D(44uYx%1L%=R)Ta zCy6EBhTg%dIrm(1Z0Qt(oQj|XC^r<#FDf90 zm+eT$3LqN*IsUTWypDru2IH0crfQ;QxwR|QYrIjsV2Hp`lHX8#k3zrSCjh74^VYwA ze&?%j`@1{g@zbY$Rsc8y+~s`EETNE$5U>7JjlV{p{Y2W3cCWE4jaYOB7$KDvKYmGCUewuy`0iP*AN>RIzw6>B%IKzqn6OH(qkjU9pfA!NywvFidJb zJc9RU^DG9*WMUPdtjQES`&<(O0hazoF^aKw{qILXouq*flRO*YBRK>7&AWdL_a8kp zZ{GG13c(6sT_!GBPn{&EWjq^;UX4G3IghZ_u^UIErNjz={XQ`mBa=fwtN>0P%_2F* zs;_g70Z5tE!a9_M0lFFZ6k<)FC@I^6WRnOqc?{qnIoD~ci~;&Kzg|e+_g>aFJq&d5 zWq8XSEPFBQo1z%dl)@(7MdR1;<{AU6ec5qq#V6l$UEhA-b?l#ni?B9p?R#} z>OX$PUc3yu&$RlVJz~7SfayIUjbrxD+#d^oF@ZV8iu|VCynQSD>67kpKzRrh04aequeJ91E+MW#Vu(aS*4*EF_#oW)>ho~p z_LpI8Jvq?+l7hXXqoUzkd?o#f4G+u58;6y z+4+^{MBIq)EK2XsxbMA)12=>DRcT5#0Pa3sEW84M#!m=f5JRKBWn-g-b~?_YExsQl z7}9KQZ-&RupM;NZU9%$rd-+05o06tE7O*$L>V73FD`qgyUiw+wF#oeTp#4c80MAFH z09e+3pEP>ZQCpWzg|@Z@7sF@lWYt0eP?@)f9*ot3uZCta z7;tLTUu$>2bZ;k9;GE^^xBx#=kTBTSp%e_*f{X0IS@~}^+J0r_FEzI)rJy>K3Sz+L z(uZoYDB5nGIv$qax?rbh6>b!H{NH`P5q3FQtP<=;ZAU+qBg24$@B#_|_~w)6&%!64 zUk_h?^L3``E>p#0`1m-S&F0fhSuDf(JA6I^V(QW5z|@Nh-_{C%lr##FB!mJX`7`vJ zypOHvsPp$p-1xPh2pVC1V;M4k5&Mnhc-D$Ji0{JI;O@?4u1CWs;S9UORN7_0Wi;E zUwFGIOMrdkRVSHG4A}hIC)x8^fuc}D>#~qtdhKjj{^jdF=kLy);~YBo%KU3ptN$x< z{*W!8E2WD;sO!>KC7dYhT<5-#JzKlxQO4Fu3n1P1}s8<-r1D*?PQ zy-e30zpDraM5e3+`w?{&foTE2FzqtRHQ~0hq1*O}Fj!eg zYrx9HfZE;KJo5btlW3XME|wR_5q1nGHDZe4Y;-K94owOF?Un@o?mPkoKug;IxN1#s zbO!a;g}^{V79hS6V6od9)BmM6&W9tvcrCQg9d`vlkrv$0OziQhWCu#hfW3XxqoUB5wokJ6+oWC5qQ!19hdo!25|4CUWxXFlVM2? z0bA!z;Mr$pv``m(FbvqyU<@`XGCf$1b!x+awD|~G)ebN#1~RVIhO~yRd<;OJPNQ|> zJ9dQ!@xo;FzkHk@#vI!c^4a^(%pnHu5&k=76;P`HB3>5$%G@_i2#Z!>6kA##TmJd0 z;mFS}t9Dejz;8>O__-Yaz0m5v3lp=)3}7#HbnKt@{&(Uc;OM%nZ*GR$-+p7}|Eux? zK;2RNph?IViV?!K?IF%XdbN(_^j_@i23avrUX109QUG{bR{{(c?#hF_rt*4DUnZJ< ziGx^~;u{ELFo67YqbEd{#7}=G2cBc_`_zjrw~Fs$+TGpl@bK}&@WG8w&CF$MJ0(Hm z3=l1zI`u#xYs+Nd%WPi&syQ9$hZ!q?#u0V?jsSNg7@Q4R1>g*@^Y+EiI4T7}9p(=M zYHF;`Z18xwRsaA%07*naR4@4aL0?^n!E1jvsxGWR2D|_~K*PU1VX)eu*3gxN0qB!S z7s@}{9)g`KqAdvzy==gNP@okdPy%T34P=o-la8aFin8XI z=KeVRPIufPMKgvxdG;jy_4jxrvAM?&$iQk_l#^4kr7yd^hyU`He%H(0=gp%2q88ggWllo>pOz^RX;t7^9 zS6PoI5U&pL^5PDAPb!E2^OjFOzZSmv{+>KtI`KUy9P%OAM;@qLh1{TSuJd2@{K{A@7Yu+qwSkEnKNf+M2apMxe=LXrWBX}e6{(@BU=|Az4LmSowab9kej%zj^-5^g;NJd6Y!PIl zjCBA$0&o;qheLn?&41l2e6iXatJtO2&xd7M05nf%&wP=9v(fd;yiKn6@p8?Q!P+_$VQd!F*62kdMP1YZ9+f_#aFcV@&3Hs1yLBQJ5v3!G_9jSkKiP zE}e(pd&9<(dDjS!F?qT6k$Jpa-;fDU44Bhn1%PQ!R;VTpCU4WGkOo$LH0wE9!~ys>Y7s!=gWUHFfy`$K02noDpb7$*cYnQ&LE z7Bx8KV*tev(_d5g#JObo#Y{cN)~Tc6=-0uIZS!-1NpmR(pPJsrA3f@~0$AS)yDK`@gHF!uI)<2qXA|Gf z{@N7+@|6H0YWDiW7$W>YtigNfN80oBW1R>f23RWrX5WlsAy7M;pqi%1v5D#kBQc=v zy<>Q-%qTt*+`NwnLO4KkvPki(yvX&tg~0%9pPlbqEyU}>)NoWqR9Wgz-yIdL{#G0V znjf%E&}M-ENpEamvaPKEvIOvz!m$bJ2y>4C5eS0P+}A@DP(515mcsH+E`?>b#9}R5 zBxsRvcLm{JtN*eBs7#RQe?!8*t^Tv{HzvS4U#zZ#&%U}9e)HEqSZtS{VnSE)(Z~CP z3(6jsRdrVYxIci@c$7-ipKt1e-8wZ5i-W+vrES@po0w$}=k}yGtE8L-O&cq*+Asw` zfBB?y#X+{7{qZLCG@DW8eeF_lRc+ip}$Hhg^ZTDbH5 zcZ!^n4|+*m$v3)hJ4fD@Z#66mSftv2=%*?2L$R=lb9QDqBeI4j+qUf?PbPHl|5z;K z1y=y{mz@`H67LF9-6V>xVxIj(=!^z9K~vH|$@_F2lJCT&4|u#Z!-~YwFk=1Yhi}7s zpM4UZ$`^ozSUiM`KY$z$``%B|Wu;-5;XSK>c@rY=fK!mTC&&;ZI5FXS?R02gJ{4Lg zWim9N>6>9)>Y{ToFp2@@Ca7Ny#{k_0gf0kDO&Da59A4wY@g?%`!%$me`C|HzG5-!l z<5Su0ucr2LsGK>1R{b&kH!uH1bJbkJ(qT1F&t!{YZLZ_l%-7m|j;kT~o6DWh(cHK5 z=6QFR9mkDPSLWEP`maa~{2}C9b>RlcaNTM$C9fNpF6BZlH(?h@_SDF@2HF@fG zVQX#Vei$k`jTTftp}(}*&)+@vZ!g7SIndSw+P4B6qE5FLBrRB6iCp@}1b9B%yCHM= z*2R}z2n$F9RH=ng;7bT^3BZuwTQ<&zknugTY~lDr;oy? zw{FM}+D#ij5Vk#}ae)N@0=DoaCEwup?yK$vUjY8oHtJn|kx8fX>`xP)V$@_y!In(_ z$zzo8?@b4czWVPD0Arq9ZQHECpneHF9s|Bd)7yMuMzkEUnuhrh+(QuKiDEP&JP#Vs zY2Nem1|_98uHAJTI_4MSudJ_z+wy? zey{}-mW@Vo*wx~;Vp20VVb%#Jowfv$g8Mm>f151p|^?TyUxiKn3A|R^|6< z`EAX6e{n@~UM9x{0{r!b%>JLq@gLg&DihS-@Lz!Wzism!57>*<)$q~HtJ(s6BRrBK zz{ijNu_KBJrW{1UV3q(V*ZW0?Y-#M*-_pV zgr3h}-1Pf&S^W$P!fS*_PacMU`NMC*-TU9UGr&lvOf)d{+2BR|b)lq4epPEdm=vI9 z;RReBcVhd4ju_`Al7*(M09vn|3rjzh6@X3$s6&M?ptghz7h;vVN@(r%lL`TKU{D|w zR}>vKdNFpaiCsq%fwlyZj#evJkvvSHryzv3eGpi%>Kh}h9siZws+j!KXAUH|Ym#Nc zzw+vzW0eeSon2)x0KM4UIz7Rz40OW*!P51}&tDBkes(3a&gc}Zq5dy?A6D|htg!oRQlCo%HxfCC>SQTX@gbX>+nU?IQ3 z0R4(@+4iN`339V5c@QHrcr(~&Ss)VP8Xq^^0X&^EshCH6M;YAnTie(OpWVI{KDhpA zc=GJ2?+YdZ^9`H;g!G z)kqEOHjz0byo}a1c3}e-5A)iZ`Eb*3&1Z*IZNVy+U**ZZRll%)BSo1X_k~Ee|6p4I zSc%grJ>kTbX5*9e)rcu%Nyoh_XQA%Py}S& zK3__rj_+c|WNDei7gf0mP+&!N%mf%CxYnvJ=&SiD(n?%&LU?8k_nNqW&On$fW0F#UM_kN zO&e{io{&KNYqxX$hniWP3QrK{yuwogANc{te@vhc+(k5JU~Xln0u(ewo>DdIVkU$E z=lO@jx%x($b@>I5t#L1@1#);+S zzaRA$fLzu~gnw5C45o4?f^Pnw{p!4`t*s5ng~i~_=26abJ{HT#yUwK`25ga zEq?$U3D})(cxtQwHubY@KiS^jrFQ7DY5`EQf(~%v2oNPe-yp3{rK18nKf4^-=Vcbf zWV(uVsv3?b1P@KOqvbr-sVg<$OsKxo%hvm^|D9f`(=BPSYnR0()6W(HjI{as>z{RL zvRctwp~|M3{WFjPFTc`QElqEV-vy%qs$&Wc+HJw=MwMm|dcwNK`m*S+rI~b8yp@&b z3{X=Sxd#lGz=tMjmQqv^c%k#N$E5(cY{Ea|#n{m0J7G;Gk*p9cH@WW@t`Yc!i5)|{p+G=Bh;In7?~f<9F>e8J5+rHyQF}o+Jd*iHh?8D z5376^7ijh_=~xt<3eZ41TE%)*2o2ijJEsZLaiR#osaapqSNeBRm+dKZRxEecXq<01Up zn6@Ytnk}N~8#*-0{AA>r&+Z#K^3`Mw#hXvAlRmlcJnMuN$AI%MS0h!ly+xNT`L|mB z(JP_zs#gD*`xXhzzgAy{U4(!60H{t7o;y-tFpobW1;DtVYOtVmU#tJ`e)2*1;qgOR zI&Ya=l}?J_OmI{D$ZHchjB&~phxBtf+~qU{DcY0qtH1qIL$c+2&_9$NSN`2`-(Zf> z{{X^&{s{t3ujHe_*F~VgY^L_6Rsf8c{6zUDUWd1eH)=v~`APuNdz^kkg@8F4rQq{xW2=_RXgO2>fFyGg61XMJchbbE?E+n&Y6g$T$7b2~nAajPjg!_55i z9R3+=mN0^YGbRgF3gWb~SYRyj36$H9UkV*g-H|Yj!mmH>D5&6?~gOxr)oek-8%P`Hi~EWf zT)cWSHgs^}V|$p>JU+pJ2_xnUfHThX<0P@Cd#9;LuRt5;lE>cr{oYucN9FHaH$B3? zQ}BLqQK#$20JMg}jH5Es0ziMPgFV^F0`$$kZH5QSvrb)I48XeJXO*-9fZorZ2uJ_+ zO`Fq7g6x~`rsuwW_sqkz?|=81_WrZ@SD7GeWBPyocnCVds}E+?HSc+AcRSpZ>HoV| zKMJ?*d_`j^8iF+fvA3RA&jn=e**ovv`-KM^L;6KklF`4h0O)i&rU)?qAKg4HThDYK ze;p>23clhW^9P20IFig6D>z1wlLuJ+Prk%EU?NYH3FLDy7-Oyny8=la3St0a9XE-O zjmi;!On-UqzmJ9SosQs?LY&Rb?eO7eSHsaGN5fmMy%~-lJLVmPC~N^(6C+p>0ouyB zr}s?A$nL832e_FC0$Ub7P6E)rfAep!EAytGPhSZ;E9+tB@oLz9sBcITb(lN` zgl1!0_3D4QxHcgoN<`&mUHROMpw!p1{lD^n4+oIRrcYpepa1Zf4EUO)=pRQM?KE-} zxT6wJ=$kFP#DU7n@cNYJpc0{3W2OC_&xW@V2in!xVkRN}GCBOSA7J@Tv91J14sjf2oDj=wek4Qnrb z4qc5JN$M7kk7?zfBfC)qjOoV6OB*jY!WZA(4u6sP|4SXs7spPkVZ^}jR$8y2T z>W@X8$-muQFz~Ya617y&z*4R z-raEW)`{@l{d?i^`HNt=tll+$e$mX?+ww zO7*CgAZJ1EB5z~VIcSLN>L58awAHoqiu_u=by25W;oLgrItDuC!z)_sd!c!6?iuo9 z(ogKO;8&e6|Cb4m4;W+0Vz2*$Cy&FIcfJl^eDjrJgHaz35VD!}H#IgA;1B7*SQ!QR zR!b43NcXh;@nRY*idbQ9Hj%UVx%GhW%a5`8udztuO@fEu`2b^l&M%L+u^hKp80M$J z)1yqlN+IS;`dNos0Z>893eKcf!s_9sUF)~vU#1w1d~haBQA(lIfIZB% z!U)426D)?}wQyLp(+t`jI3~s9J~Khq?8ATAVjNIwCZpNx_kBDwIZ9Au1?(f2StOy) z(rtY_ngs-lSZ1>NFTp$^jLB4$J||&dN0WMlh`KE&gXXH`3SD7+bl~}-@-gL+cmUfX z_Z*bIsbl|^esU=+|NK>10u&Xs#B*c`y!%vJfL~($y62K7lt4H|fq~b5_Wt{_{Ft(K z!;6*G@WJ(u!zVYdheuDJ^u~kO|4{-U->`z77kDpJ>bw3Z_=ErO*KmRd&|L~p&45CU1Yj;%>NX&z> zlN0hMlcHM26r>ZsrElB3x4$l+ry&!m#tHcYK%LqqUqj~cORt{~%Rjp!Yu0lG!4a={ zsUQ3PpUeC|JI61W%fzC|TDNiLn6~b6^xybWm{Z<={2=`Izx+PDFW+Xqn&033>6iIV z@sNvLHbOVBBPZ!`m7Nv+{^0Gy&>DlMb&CM_PCU9VUJ=OCKR5Yz#bhiu=9RrNu2GlG z&6nLh|Cs&fj}zoYne6+gt~^&M6llgOfjdc9%4it!aE6iJ&Q8z?Lm|GG>+vBF`TEnI zna^(D41fCYz3}+?lY|dIWabM%nn700vok7d%_PrBVry@C3)Y?zAd|8qc-aPUOiU$h z)xaeC-0^VaKfI;m0Z&Uopg4}IOa}GiK`{V7g|zCuk_W|PlHP<~wo?ol7?PNW;0_$* zu&a5iIqb(LD;=?_;>^fm>W>RRnnc0KiYG4xO%!L7k5T0UR<~ZGqU{AB`T@bOe!rLW z(~sL#R>2deU--h7XpaA+1Y?3z7Ht(l76Kd-eXMq-S#A;7>Nu0Z04yx>vAvc6jlidu zmgMo>yuNqL+G{WQG&FbZymC4m{l~Y$vdsURShEqzbaY*L?HksmknY7jbmbxc*k^9SPWMFISpXx7q5lpsp5<$n|=K}90N3q zjF?1Uc?~l>UHxSY1`M$^P9v6FAp)<8zxZW-u1rwcnjB)v+{efZR>9MEtpEz9DI*%9 z4-24N#|8~T=`m?+{4o)%wXGX)r_jClL-qdpFqNn+st4hmK}1*4KPLHXo0)d76-E)X zpVl$`@~2(jx;$aPR$BMB+KSnKORN7JBMG0!Vx=vAFMHwlO*zRs^2^u5@;jG(-ddzl z#3Og*+zsvqj;$*+%KU1a){_f~+ zYs-ay8!K{~$zhJde^QtH{Ac;L=7@dRccScjm3k;nI1oUbNM%tR-=}+#-+TVV*IrQ( z`He3>*Qo%X$c*M;*p}wW0#t_;z)St|yl0Y}?6Spr>e>EfBFHb>X@Hj%eoh6*Iv3IV zrC(eMo!8E3E5P*32WN|@>6I?lR;|HidR3oXN$R7Jc$Um3SKu7v+(n2DnsWed7DT+3 z+u7pX$w~J6xaY|2&3Aw%my8e73>uL}&58O!VFF#&_@Q<;1*6yun_;48-Ctleo*X&@ zSOC?%w~SVS?pXb2Rh8NKbg5o7pg{FqU}&Z-49loookt}xU^K=bc}_Sj&PC9+MKN=^9n)9uAKI2{Wt|Z2P6P zDx`yk7}oKbLBH7>1(sI>O14S4`~l1kit_4H=QJJz#`pF>aYmc^gQW;7w=qD!O}%S1 z3oJe{Mw~hlmVbOXv|l|V)Bl3Lt5_71a2a&sRamXqiB}+iExLB>Uy=G~Nl60o4_dVR z!-wyN$2tLk=e!W*A;wnjeUCgA7>N}?Ub^_sg>)h6G+U1ce^?ciS-Y^PvVjv1gAwM5nTGc=Ya#jk8fNJH>5@T@f&Z3rRDRc$p(^L zSpYQHC)5@^v|Y)C;pj(bj*~JP#9Zn_>{z=gq zM`Q)?(@SCNj!cQ3uL)Pul$vv?Uh4X0KNt{`8?DXUPo{@Fjrucvzs7409e^A9x&Kjw zRR7P3UX@o&Cfhg@>#htP1TJdK9?=$Ol<#UQ7sN8*plRveQElUgcyLMJAy#|4tFqKN zj#m?|`(CoA&-z@oq)P9l@CA&E)r_sY@6m*M5~zqLcQkifVTbueS%f_aVCy_f!vG2& zpGl7E(^`GTF`QOz`$r{L{BnN#&UT|~beo?S^Vjw(XTp)cdp$Ida#B~3YA7#R_wGKG z@V_GAA4`DB1Yv>&x8p~2^k1?1AkVD5To1Q&?B9Ezekhj)8)Em4uY~2Jkc*Y<-RMPp z?+O8wcD|~gO;6g`O3b$~(Pv1(>;IOnq$3ZtzM}bJYrOh9a)@yGy+8BL=WgW5{FrBA zj1H88m5BNIu|-VEk1&o-JIk-N0w5RrG+cpJ&rKU&dgC`FggXI2=z~gtgt)xSNHe>d zBy*nSy@wCNyPtj#-n{a9_+S41AH(sZ$Gre3eq9qtlHo-^y)w?b*sr=f2Ru;~{tB-s z0pN3aN`PY>DK`W(#~r44VdwH09j9_7G^7;SxcOb!MN?Xb{bK;erql`j?LVtJWfudG zHh3MP@viaY7;yX~196q{!XVDT?yEqBW^`k#)08ryEyXP>BU^0kI_OX{q(l@K$nm|o z(vWz=Ui(-Sk5n2KtKfUp(KwD+KX6%{8K^Ccbl$RZJieOveBVUws*DV^`E07vjOE1zF)RQ%R6#Fmz$TA zy6p?6B>cY-mfpBfQ219#Y~y{Zx$F}i`-fF;m4al721ov#k?=1c07b&4wl05t_ip&Z z2Y(LVJ@`R=AMASX_wj^WA~#6CS6T73Vl=V15JPS>wsoHf<1uYIE;$lRfh%+-fw7xR z(|L0r3-ZW52lg^ZySF*9D=mN*C6V#EUj7LrRlTbf068r~`|XVg$ONKtf{N{*mxt$_ z#C1u%Uol|0^WFKfGh0%L9Zs zGYi5KN`OILD{BV5loG&jxt3ZXYfD4>vrBRo*aRBNkK9sVW_6g~f+2@pSx|`O z&2J?t2ss$dog7pU)|r7M;jPd=LpFw)itPhypYgf5p@_@CPWpY~$ zlfZ-pK;OJ%hCo5jn0R+kyy-X0G!P;ZV*X!1_lQj_ zy!3ruI=*{Z_a8k7pMHKLym#%R@M2{piA+bpWC%-uOsB9&o<$PBN_W63Mmi7#GiRt8 z^Py8Ynk-uD)G;{&JfrOZ@~&Fg!OB1h^$R9HOzHdiXpNTxV!$T_HByV9(L}C_6Ck|Z zR{u5mLlIC`Ft$wIT2*Sv8X(Q%$|{2a$`(Hkl)3WQ&-Q^4m7v{SNmdR1V|1vo$Q7b> z-yP9(#XpI_SxJrF)645Q#X%Sr6G6_MjA?FlpuRDzg!+BuFd$wytgU%(PAXZw6>SWq zRr1hx+n=7vuc5iA2=8D0D137-9{V>GqrxZSE7$_J5o=yn@+`4hk=&`CPG`_cJI(^*%6?2Wohxv9 z*}&v`{X4eukMIx7X}G5Y)4@t9*0KjHV_{P#jScn2Us7FH4mfdp+-#gk_z;g1S9&(+ z>BSqQ`MUGn-SF@4|0VpOEdkr6ePpttACnhp5uJhXE)yu&XM&jz6?n8NbnB4@NANb} z4b;5;13PFVFjqctG<1IYiq2U*B~9yuCeL2lV*c%+JBL;lv&Ivzm6Ngl)+jBAYsVGx zzX@OkQ%yS>D?@%9l!nQK*_Q%_jReY*Qvui#kTZPjzZ_Vm@yy6L_n#FhORGBl!y3Ip z9Yvs+?z}=E9jvuxpBh04Av?}rW)D#cg4pNOw<`%>3e@_x91LhS>HIY(JNU1gZo`8| z^UJ8zLJ5F>3qnJ4(Dp@{{{Q+l9a()|bJWp!I0#}k@EeZ(dnB*_oa$9IWw<>5H%{u< zKbvEZuM^fZ&t5za*S@$Z&;Pe1v-s*BD2+cF!Q~vVFk1BVrie0;=i#RWxZvH;m}$y+ z_2c1TJlw<6#xLaIKa>vm0g6ukxO#nD_>U>(={gE~^Hh%szP1sdIG(V8a)Ukp?EPnK8iyD`w6U=v$A4di ztDk=szWM&H-Uy!~((x_%K0a=&G;IKHL1}}}hIpkv7Xmb9ROsq(A@p-RAp$?N;#U-$ z^RGmV;$b0l9HvMKapu*!pR$v<{qH?x^3LP=Gxza1rjO6D^TcPao0~7g18oKP=Rf?L zoNL^Zte=`V;V~blcrW9GD)o)x=+IScY3cx|rYuas4B|9@u=7Wc$OK6puotL`-W~Z{ zXS$7}`W_M3i&Wp_V!+T{i>bM|IlxOZ{m)ar9U#xckkrMl__ta$?kNC_x4=Zp55}6s zm~k+b=X`2^B`R0@Umna%jeW(doIH)~(_diu@wdOq9w-&UzbOFHW9fl%JmiU?JN??4 zjQfPVn)rwo3J4F}*J1H7V8T0Q+Azm%fJR#q?BKn8FA~^7f;qbVH1}M3>wGvW$A3*$ z%bBx|4Ptnh`^)41?qjX~vv^mvpi{RRY-L!M5};uBc<|&=_^x?Ti!(_fUm|QkS{GQNk~UHmm|lnKL;1kdzpEbL;q5?D+aM% zA`gUq^6YfT8wG$X92PPouTOC_ zG-mywI0i&?2oeY26UEC~u$YE7hI93Qjx4poefD)k*frDt?keU)AyU=NtZ=(Y?>rD4 z!R85qzFbt&Jh6=+cQ58Ze@*x%R|9(bZEro6VoR#efsnBviJ7Z(v_giXy-15yty&Ah z(?ox#tv)9|N@dV=RqI;AF zj{ZAsM_7+ftQZLYFXZi?WB;D%SE-;rf$V^Pt#eq{76Wc|eJy;X` zh0~XLC8;^KMnuwkG~D?y!Dgt>!1EyN;(Pr_FaU&vZ*~uO2-izX}Tr3WsxnHyekk) zDIwU>Fas9gMuvpLl$T}GY&%@5D9IDhI7X#3ac~2cq(7EaA zmm@GBk~D=%jnffG8uLlGLoww-D?E`7KD(glgjfzM@;bh3fFYF+m$5TVGMbu*>X50h zrM;8;CnrIV(zJXqEk`Cs4qJNc+J9jtc4@dXn8}zybSgn*L3jM7Qr_Yh0&QqlZg({` zJCIkf{(_ek;P$SR08M!qw>d~n4Hayu5qc70GM@am6vg6&s;}z)0A_(WqJHR z@+%!p%|7`e0Ul>w|K-U0g-rh|<@iq(fd3v_3XQYJd<*Va#AxJJoxZz&FZ}cGe;e*U zejrO_$sm@_6Z^gMgZSRBAS?>+e$VshKt4Lpp_@TEpP0^t_ui9kJWYH<6L=n6v*l%< ziL=;Y4mkC!8vvphP8bOhrs2%S_dFm@H*fLpq|H9ZvSPk|rK5Of+1%O=A6>s1KD~J@ zJbC_1LLD=xE{HhZc&T5WQxPvx1;(2+yj8eY&&=BjAaL!N!=qAaup&q3)|VpzJMYLL zpqv7>E}oRKpeAQW(BNO!g4Pq9LCoy`4UTVWA!7gdiz$6fcFlc!H>)ecsCjy3+tHL* zCB>M(0ZmBFbb6oVGFI5+XrJlF;+!$4OcvV}zHi7U=QMl&$JYn`xw5(vuHL#S&;K8X4V?l2e}xx-48L-p zeiz?+hfCtb_ZFKJ+@wN$j@Q(uzFWS>UtGl}Z~tND@2mQJOWymv!wF3B*O&DIKGbZl zLXGM~H=4kiygYgKB)ot9lklyM+St(9o86fV%aKw5=$TUi%z}XCP5lu5DP*8?RR9SX zKG^Im1#g5MEeS^hE@S)OkDt~nCqw6r^P&Cf>Clw+vWiukId&ze_Go10z$^#=Myu3? zn>rj619bmc<5JTB3E~I?TH!H1dC*$zA-&2&_@`{(*lUOrn7yXkYkXj%tbKquq^P9- z^t#lLmj$`NX9{cL~i9AN}nW?#3{^xpg3996XjwTl7U`!9zke~U9}N9*2EQNtjSXLuFXrHYP9cZfCYVCGb5le@ zyu(0dLgaFFKS4W%#c%0+{2tUh`u#agk)CJ#PQISEzsCyTLn#2ReffEK^!TyNMwvd7 zUM8CCXTz}wmH_EVj(yf2187)XX8fLN__9ntAb<^1G9`c%0W#60uKXHHGM$wIVCm9#il3%jiT8}O4ZuM7-TKM&}& z!zwzz>Vw+{q4#-t6xY0=o(%V)W+5L??6z?dCz|ycWbta+>c5=hwSRG0ze`#%kK1o! zPD8Hv0F%sb`~IJ6<=^J(#mk+1Ou@(E+G&~opOg|nIEwS@VOMze+S*#UdHW0bCHrf5 zxq(Fk{M6GXLm0|6vgAEi``f+REB%Ra;s_J#{ikAx(_?V&z3Rva}pp5`bU3 zcsU$BBF!D48@)l~oE7ufk#YrX&tbNIfge;Ds_c)$W2QTrc47e_1xR}TR8vQmG;v&_ ziQV=i`2=`THRmcbLaA`c{%Q%kFhyQIx+v0U3dL&Hlu(B7zl#^Go^#vL5RU(EQIy0GwbmwrxydKofqWwUzQEwXk1(y zUHsBzg2+)i=2q&~j=W#$g~59sM{jI3f0b^tceB3-vKw%!3Z#$A2bq zq7oo}qujJJK!2ul?3%NvcdvdJ)^#$#o0nb<|M2s_v7<1ooJ}Sj8)&C7Y7u>yRw zzM(&KMw1L9WEHuBAS?kQoN2H+a2VAI9|!y*{HkA5d$E>&c_nN=UI}Yb0PLOwXB3$|IhI6{lDxYhU90gM*NWD_)Nh#B;GV$GnTaE z%cQL>T$?-N?L=YiHvUkFX$8vcDy-=bWrWzDyc(0Lj1(6DtMSultPH^CC=d6w(CuWU z!0pyDte(%C>3_ERt^jOkO2JQqW?6)tEvSB;5eC%bW!+_#9{tj1A$S_vUfPz^>DI3< z+X+;D6hM)rBBb@Lu=@bVe{xb?sW~Z(Ty@Y%TY+Q$%=CXe@5RyIw?BLr-u?80@Voc_ z9JaI|=Q2(!_b^(sUd;GSaE4+%z8@rE|1>|3HFhhx$ zf5~}QJv-(aJLY-394Q2$KRGV5>a`yYAKMt3yQ~ar%#<@_Qv!@mQh%Kz47gtx6uiu< znMv;n`SF&kpNF)-#-?qPglj?#xU|Cd6pfgBl+Nrj{HLjVCNf- zFW|-6YWU#VC*cD*{`>BS?|TW-Q*~Y@&!e&J@kYn#6;j`nih+WZTxywfn;BXso2ca0 z00Q>ae)@S5*Wbq^$@|_LyJ1xyw&Xk_$;V?Qc@rmgtZnTjdZv>A{wjX}|M8#xw{ZH@ zY142TcaxxkFMtLs<>t{k)4_Noqbf2b6aEDo*F2^qO8~4JcG*j{8CS^^U+>$mo()Ss zz8JP2JlA#reXHDlD{s+B{nM2t3n(b#BXmcDwu#HZ|$c5P!t^ zUo-`tba|ulr@p8^>{I~3w1pMGP(>|c0aj6?a-7gNm5CBy_;|RFa>cNAyMx;#s^obB z_#|@QM}4Q9q#@xJow^-)cfi4cwr^soVgeOU^B>GaT=m(Oz_-iVLLC+Y1JEWO9@ye# z{#EwU|6v!}UfO!|d}zIX#;t0LP&*R^lx?i~Ka~Q2c`ENJ6R4Pg(LB0wS_*)?d3Fx0 z$Q<_{Kh)~~hvE8Hw`BUyA|>MxnWaPW+|{}0qsQ~8T}4b1ZD<}bYp$@Z!LpKaM}13T z)prpCwE`ewqQq+?RPSLiflImqhzdbob;v+&nXKMI#Gyb{ix zKHD|VR2B%otFi(>0f4429mtq$t*F6#(@|$~FVJna!ip=C+!%ltj>6UkPCS6g_RJ_W zDbW!oOFz9Fw!VKFcGh$($w~$HT*bOf@Vbiv2;9}7Tnrp=;#@8;ix z7viKJB|v2+52`Z9skL?_j7R~H&z+e}O%5-Ga~3OZ>_}i50%hTR6wxMkru>C(QMoEq za4$8ec3iLtz3*x~-H`|HILFu*)XJ=lrHZ!AEJ`!6M_KLwLsNaOp*e;7dD$0s>O@t- z0G2AU9OZadnC4!%N<-26gDAOY)Ognw55 ziwq_jh+eF%gpaR(8a}xGarox@Z%5QQwf71bgLaCX1OVFd*X(;JB0k<`*DUw(7+3EK9$BEiAuvF*G^WVd|E|iOCQ~jo+)k6ta zvn0V%5u}=+AnE8Nj#-=pQf^)9+#&|B?&^qM_e!e>{|%Y`cYZCWe{aa?pSGFi@#0uc z-&K~kyYfdBo=E|)Rzc~XdH;#!&^TXEsiFDLw&s-_J^o*Q_b=h=Z|{axZ3O@yj6tqE zPdGs`E~N*D!STxD?E$ZSNX|YaBph-)`if>T0c~=swKiiGfz@* zDiPHA$jb1ERH8wBJ|LcZD8VzwwK>8kgLPK?+P3mv&0)|Sld*DTgF@1z;(Rt-*fn`Q zn>&HR=us9d@Gg2;Z>X9~)6WK16)4q|0IY~66OBDVWo@lKgFuB~#q%Ns@Y7PC zUb9G*J7jf%HsPTicqps?dk76}Z)u!45;`3D_p^(dXKJoll-ikdKa<)2LkY-h9FJGA zV8Z`WXq=Pq&+31Hzop2x~geG5-62SH$WoA_LLKs4&l>p2N(FA0IU~WhO zz|W36OmTqbsiRT?Tnx*y1ZZ74?e$AgnaOBz9$BR})Bj8}FHQ}oUlVhsC}Ffl=@fA< z3DEv=odDulw?u%c%HIE6%!;3JT$LTOrim;87RJxkT`R)RT&M)DasaZPW^K-&2{gWP zJ=8&CegpIU)OcAGAMBy#7`2vuzUo&r<^06Mss#lAN)GRB^8WwKpFlm7L^G9{w==W|8;yl_Mi9S zrmPhJ`)J#Q;PVpq6Lb=H@O}Ko)$g;-!32;p28r7TU(b`YbjZ)X{5)KhKY$+|-k0-H zF(3cz=KpdC=vDw3m@Q6>$hCq2CTbif!%YEKnp$IMcG`hn#Hyei(9tcOw=agJw`B!T z)N^YEtG^eJ;LFaO_mZlPI}`&#sN>T{yrI$R50k=xijZMGfw&rJLAT`Ou=t@q%_NoBzeuL5s zZ~3NzN-|xfJ5|(AH;^izvI`@Ngz)m~B93G<%2pMu0HEE%VMz+EH?;5nmzP81l@snm z%ZOh&jJm?DSp9#l)&FN&`Dfd0mzNbTd!i8qJkI`3Xw_ei4Z{&EXUEh@-#HQE$%|+5 zHFh(6^7*x}wYg=(j}Jjz-ai00?~|9wy$xQ;2Z~R{bAUWfR4^vr`y!6WqwiDwFaiT$ zx(*Y-Kti;GnUDGwW2fWL5&Xy3!A=n4uC1?y_pf~%KD_p6c((FF6Q>mSff=z4K$Zfz zfq|~F)S!A$m5lsv^#E@C03hIF>K~E8N0}-%b;L+!KU%8A`(yZFz)7|F z;?;6CHL7ts8@#JjsM%J8OPonz+S`^%sF~K!tY!rZhWAU@!h^M$B%44|MMfOp#W%!9tzZ|X{?!L%PP;vLA3T0QwG zxS!s*9$qNq^>^XeQJMLW3km=!B^#?^OeZygOl)xIvkLk{=0lI1BF+p$ z&kum`oz==SIbIfih=bEWP6r^UJ}~fQDFAjJz6d+dH^TPg7p|rC7z^_k8ZbJjh1F8q z)Pzsbn|Y-#HRn3Bq8Mnv2aQJ+O))&4TGE6Voc~pM^*`3Ysx3aoieyXMd)Vq#7A|5L zrCe?309seq95heZ7)pTVE{YF5SfxuMf`bCL5b0SVRYio~EgSQ}@$dlV5&q4Y+9I$1 zr%-^Ba9ezW(*SUQ21VAP`WT3`+HQADfwLE`(U8;V*3T}7);qEqm6JSMG%8YM=AJV7 z-+e6M|G9ouBo*e#S`Z65DJv`$QzCCkk#YClUEBNrmk;0XVj{t4q6l=s-y@{+PQUlB zh#BSb^8_9*q5fMG1GNI6D5f&;oQT!Whjw&`(m(dc_4m9ZZM>4b-^b3w`I^MZi=VtB z9dVjE;CDyIF|j}Alh3Y(qeqT}D;F)kRNal ztyfGigDWtZF95+9>jW6UjF2WrEvD!|*#Sca!Mw*GfP4Y$$Rq2ew_Z8xyK3xf!L1y%Y0kZ zM=Tz2Ah)Zd0e3bf-1QbA7PZEUQ7^1E%ufaMT9C(EH2IQh|NK(u{LO2jsa5j53jcv4 z{~j^7EQj}%*BWA+OuSCWn&E=BG$8yJzzhDQ9^v@!gZIL}zxSu`RNDYx!eRvq_9vB% zMkwRY&ZOgge=#U?`-|>>_O#^QpDuaNw`}N-oBdipkHSE$02qaxseOx`MpL^K?|`tQ z0>D9`(`i*i7li#d$?|w~8n+U-`@{EP{oOx>U;OBuaOTwMaPIUO`(|@8_9(5&6adqx ztap4?)@|}e)+s=|@Y(-0p|M+URxQ#!pVz>Tw^oGvRrx?5bgR*R4EH06N5! zo|Vjl9D_CsWLO`!{!&4{oI;3tx}IFQS_Y)#!Oy#4a+fNyzC8d25Ri5?p>Tz4ev6@e zVl}nhk>_y5KTIqUg<)Gh4|bY6VN3ImDvz@VAcKWT>a>cbikw4>Rtp89Y2Mh9uc*%7 zOZdNX%IA`W5-XA{PIvF?$iJsj0O0tqib0P58gguC`~M5#<+-*I|M9(d!*Boc`|#Np zpIfaWPW!WnN&%vzaUPWdyk}g9Q+DE{0hrfM7Zip~Qsg{Q29=Ysn;& z0U7hrC0*P4nPxuKJTnKf24LYa5Lf?u40&E^ES|k1WhE<+7470ZOwy%&oGYnwBXpst zHAbh*tB!ykCg$WuyxI2lv#Q{ejXuB;s7wgn!)j_@26O%ZZrlfl1StFg)S=QCXlkC< zMEDmyC-d#mAU8VN4tDWmX#M{`g{v`Qs=ym>u5d;VPWrKDZrm+^tzoG%KZBm#6A9%na;Ifnecsz{=;l2C; zv|l|PmbJ&LeMLtDYOoM0=Qc3b(5`0sU%7$D(JHKKK$a<`j^g1+o@iFdeNpqgxow~t z@XBBSS~G9@b0)|j@^9;hC+2Zx+Lb`Iv0U|eu4OS-lmOyy#_#xBQC?RG{O@&oh{X(+GmNEkJY4PrGoGX+VrKh8+ZII*BL?=3x~V3FI^pr{F0B?R980jqnPXc0 zKQGV!r)`c{n8;yD>stMPDB<56Z0F3UivTgPICNh9@c7S>e>&ZuNZqh zuHO7ii;0iLe-p=lVgoj<=4xEtZ*(7Jhx`h~`0;DZCq75u;`?50{7RT{g)KQ}tr~j* zDLNjzA*X-*Oc_w1ZaBRB_J@1nU;p%P;rsjd!kVrAlQ5t5^I3gXE=d=hpHDhQeLo!x zB;0;Fvh-5dtN>}*iZra?UXqI4h}+_9MGobh^QO2j_>{J@aa;<3c-Coz zo-hdyF*~S8KLmN{|ZF0JOH-O`SZ0*}sWl1{KcCaMFWP zfcrYs7?>mmATd^j%z@b)^>tSNedT{nR{#4N5v5CctQG4A=kQ$PeP4m~!@e;#B(k-&Jv_F|jQXI*of)KkmUW9)){f{8hR5(@&=C5&E zhA34WJtMUBb)GSR-~t`C^-Bvk^H3-D{qO8*1He4?57@EB4jZ;gVp1mdi{G2h5Wbh@ z_w&%8m4;FM1Zz3Q6ftOg>|##6q_MJA(t5*T3BXvky|d-VaaOuL4-arX9xnwAd;g0B zvu@EGu>H5Mg|?jkX_cZFKY{PSkL5^v_kkS$y+{_-ij+IGIN;%w7Pl^T9sd=;3-igf zjhErm&u@hP_c#9>o<4tSi-?Jk@4~#-!I^KATM`8UU)3V^nLlYJ?eCK`p3~m{#{Bo5 zvQE*Df!38PSN>D~tNLj_7#K~|{T(5Ro9-O3RFCUtAM=jqekqUiQ6b=|k~qw@_@2bs z4S4g!8sOB4li~HtuZAPbG6#x4Xp-3=5l-{6Od`hVFW!r++Fww>FUxS4)G#J&sS>ds z)JyLh$0UI&?8<@54kshbi;1b~fpAb|>7Ui4WqFN0y0mOo0R8O()?wmm2UTNRRvZjI zb*M2=CI*Zph^KXI4>L+AV-RH)F|oWb`KMoO&+~DmW#ik}MRyV@%+FJMPK;1W%Gi5` z^%&*2Yy18?;@>SP0L&3yN#)FQHqaYC6j82xug9!ex2I98<{C?)Rkjsc8;t`BOP34B zL;D}!3Y}lQ>hnMryWm%2e!Ezmn$tg-{j>UCxg-Cmyy}71fBanO2yENdFs5GA8^?dQ zzx`Um|G$La{Q2L_nYat~QQ+>**(gEEFz*kP=hgufLD~85v+;N)FgZ`>YcK6xyvtt6 zzYgVK0PNRcN*E|Yw@IAX=>X0NKKVum%mVE%%#06aW}V8@;=%LQ*I$M|fB0Vb;n71g zEA6Fbe<==3um;Ez!dPw@D65xx_BU}1Hi0+;j-f$#TuN;Ph=|j*Dd#Aiw=RVCTXFz% zLfX*qq}M;EkBREt11UmlZ= z&+wl$InT!9{}U+yI7zE=K^3Gv9EXhsfVKhT2nz#Hv&HJg>WgsmtFOYlAHN@v8Q`zX z(|mFUp6#Lg9J3II(CZk_uQ5#$hdh#R>G$!zzRm&zwF012tkXeaC)s<(v4g~Gk^`M5 zb|BB6I6kTEf1jjD?$B00dHOV5y@glLYwGA?VCeuKGcTq&Q%$Rq6_!p>t$T!j=E}oX z#S!c!XquIS)u#)-7+Oo3;Eo)?wBNcYr-0fo!1oFVm@+@Fa76(X4l$Kv|0w#S;laK3 zax`FVW;z^8^_RV4z`8m88zt0eBHVlClTHCUlj(o5?|sq*PB4FK2>VlBA;$msV>jjH zTjwMUFww{Be|P17a58eJu>>W?hmSt{B;5J- z8?$hUaR*s|%N+gk2eF;c55|uHx z-uXU%7x>c8gZG|pkRwIk1Y6r%;#q59b!|QT`lr7L=gyoJZ%CCZ;kltfKXis@3{z1P z7^`$A0I5D>vccK~n2UbCH%t*wc9;~ctAd>Yd;CafojekDRyM-UL+$ITu-Prg{@Ia^ zgH7!fn(4-)x6Ss$PcbhD+^PE4NbP-CDB3@}N@BeZ#iW?6Gi z0^NE?{eabf95O9NfC*ExE>Avir8HLY556ArEGz2+!#3v`2#%r{dcd0j(!cy<6$C2f=vB)@%aD4 zbKm!$cZ7D4d?p%4bz%Ol)2$k>$^4&fy#?yWSo6(y--iF||NGD3|7Y*L-y=zmJMV0G zV7zzhm)s>ON~G*buTDDiJonrW_fOvYobG)johVV%QMAkDat)VjxFna$HFWD|$2-gn z2Ed@-?8C5g8fz@*A(FPcEL%YRT;vcwO5iK(StP ze^D#I(?%Ndkk{V{#I3>5c&DN9cY3ui`F;EKtw#Lx|q-gc>f%DS; zivt1xy!#x}i|Y$P0p&&-uS1?!8cSDtZf>BylY>4}FPNlQy26oo0?Yyr$DA8JE| z@K%K!Bvq=eqxn|-w#p(24MxB;1_DoNsjR07&Pzc1$8uCe+}%Gl@60&QhnSF|Y{+=!a7}R>IDZT{XE$+Nwoi@DIkH zYg~7WYt3gG+HF+%!J8;6bvAbipuubv^57uroJ^5AHpA|=oH9A|m%j1+Z>RS^{ZMN$`g1V%{>;042n7I-U;yAS z_s-yZQ6AnNm&5QpVP$ErE zxVm+G@AN=$Udq#W-lE?>V=)bR%4JAmt$}^}&h7NAAAK*q`QES6^6fj>U{_*@9CiR! z^y?0@c;l%%KKK1ZH> z=Y49A?fzGoL1sdjh4GRx92uLi00Ss^6(=3D6>6vycg3(SpD1{28v&CdywkfL&rd8hi@M^KDav51x?J;`#@}@ z)wT8XTN(Oz{`HsB`=5N2?yVNCF@ed%7667$dPzActnw3{R)Z~j0ELwy=)kHmccOCb z3pWG=^7L#-FfjjxGim-0HAx&2Asys=*wDXz86eDoF$K2rEyq>i4b)BxpIGC4kb9$< z$Y)X6wzH=|t6hzO!7*Trrp7q^sq$p1t$9r`{`W<z1{=FRT9-uUtyczw%Og zN9X@nR;1lvF8VUh@MlrkgCczCTx9+`(|Ve6-ukUN7^npRBl;GbOS62S#Nf!&<^w3= zyn4m-`15r5JuROSf5dw@mOBaa0qglzR#(!CufLMseEZFG<;L}v)X&PovMCw>-EIZY z0zu+#{h|!7UFH5lq(jZWgI=rd2m!R?@AeKro8twJVM;`F_USWe?r|9fT#^;l3UCqD z1pTS(tf2fM}ii4hwQODw&PzYE*91TDZYK z7+N^m4x+Vb-ie9S=YZ7eD-ET}ka;lW7|ULU0(lPt(T8DIn{P9mue1Ac$S!n4>gQ8- zWTM8}j(%~WoAuC!nArOp>)n4CQpJ?T!$;E07fz=so&Pt@Pl!-Ij(eW?4&M$2)LUv-4Ga_qKyd*`IPdZF+A?0;z#s2< z`WQ!B(W(zW{V2Wkv)9w9V<*#rKi;1X?h|p0Dj@X)(40oHnB|fq4RKQ{la*Ih9Vh__ zJgr^!$NhxOsa;4-QRzb4fi{su6Z)(sjQf9ZHf=1gq_vN(rsj$!0rHH?nc=^2R$%Lf z!}QOJd7t5!MRdZgv$axydUkE+BtXDmrJaGUc9UCmuRYbkfb}5>C{6wU0s7!LTLI(G z?thhqe8a(y<`kXZcY3=00WORQTt>TxQ^7q41$sTh?!WI6?78-Dr@_b}x9Hsq2u@VW1WOj1ISg%m5g4MukXIeH|0>2pt~g?a6GQyxsQt~_bnRla@tp(DDDSB$;SJfU0NrOIuvliWBe7Kv+!a?zy?6+8@_%O6grkv-p4bfUN!N+`l$+8vC_7-meomX)fz% z>?Ilf!}34cuvK;1$ZF^+>$G2McWwaa!?D5g*`-VAm7l$qo_qDh1TWyu^E+RWQ_=Ff z=&MC}y!*)=;Tb4Glq8S$GBr>)0DEl>x@MCByYFYrOGDz!zbdFLT1=yDszI@iK ziLVGDtG~UFodHvtopMy4UBT)~S%e7;_`$UM?*DdC!!8uJ2r$7TmF_)$wp&u2f45)& za)s*utajq2^=lEp31}eXW<#o~_c>o0#AgEPy`3t;Xd2Uwbae=AHj*v$nG67e0a*XD zooeohynGAOn2}L0L))Hc^>7<$0&v-{xvz2D)J;qI#>;TasiF0U0gOG*o;;KmzVc|= z_h*l%8Tkis%{yZLG5UAqj%|bul6U9QYP5>sZyXcz&+dQw&0Rezg0PvJz+M*f|NWPL zls^9KlPsmH@B2&9Ula-u8;rhF3)qD+tqm#?PvXnY^Ay7dNn6ZU`?rgM`WnFPVsOj+ zy*qb%)_h>(c_NI7+6S5~ciQ|wa)E&F@RK&u#ZxI-VDtDpckial*RG@!$4{n5PM=Nl z^Rgrw>9m+)sb=?y`oW&USdT>Uqz)Bzp(1Kk)t^F@%~H70I0cG0+AnKHV{S&q0Cl!X z!j9%OT@R=u0Xyl!>VK7)U>1+`8FuZrv-=--^<60Iby`qK^nrk>b~Oez!2m)_u7sM_ zBAou16R=G(RU`_-f9n!WWluq}6~352?i&J?G)`Wd0m!6LtY`G-mADKaHUb zjk};#JKqFbGcjN7xpBPnxZbQp69k_*oEE?OSX%s(N7L+Css6{>b+e4bi5!^`?2BUl zFY7Akd)g5i5{cTX=)vMOQn{{M2LBr8B;1h3YRBeQ4}iVNw$%~=6-v?X%zL_ru7|-yNzWB}nEz>&&Bx!umG6>!IlUo2TUb&op{MxJO z;|u5gEKm@=Ac$rVunQx`jygZDOa`}#4>bhl-Z<%KT#kkYs_To|Ih+^rifuuiSj2Vi z$x~_eb0=j@b^tZ9?V=&8W|i3j`V{B(XE20R?sVI1Jz5256iB^|{_0(In=tF_yA=a0 z`e6Lccw}+>R=mLs@%s{Ru`AO?l`3BI?N^T>9lvcu19_tDj>Wx($p^=tE#kAC|C+=; zI3CFf12v_2koge2)^0o);D)E!Cr_sNFH80R#KHc~#8Xws25Usl`E^8)w)5IrkwO?bBZN^D{QQc}X@(2Qkr|}behGG%)HXOdCWcY7r+?0ggHF_Qx0|+6fH5X2E7NxkzdSHlk#z8R9(0TZ|hmNO(r_ZIC z(}(<~r=IKM0_0d5-jSWBYtr)M2!JiV3Tdk1rC-fU$Ry3w#t||9+N9djseLr@_MKbl ztzW;BeyZEQE?&B9+A5K^dv^`yo+mS{yMi}@TF;1!XDg!iR1yRA5r7@}EDWA}0Cg6b z$1!m7!IOvQc|43XzHa2*4F-mRKhlOjPnSc;>*9+f7NECoFQ>b@2lUCu9#1C@>)I4C zcCA4#VrYKO{X=lP3K>AXSQYfA>I+#r3ZOQ_@Z)ksTNpcu<~WbrQg{&Y(^;!2)U9;R z3S)p9vWi1z`pcViO3zM6`p|2M^ z|0YR$Msi<<>A0VJ!nqG-1hH3kd7TXVt%WT;u>}qTj`D0 zYZC%k<&=`*qDaeF!9QVm%FvLv-)ag0WJd&KAOvW&Md3OoFnw?_O-c0%4q4Y+ZI) zX<(B+hw)yH_tb9m7=ZboKDIyY`->-K^zTWx+mwy}ElY>)NCUQcS?cgu{YML+st#sf z*8Ur3b+kciQM1j}M_my#fAZP+^tJE)Tl(&gevq*HmAjmQFVe~)({D%XEQ9xLM=in? z-hvEK@@4@Su8RS zBUvy;?)SLdAJ+*IP8s=1t5t*z&}Ld+-$+-lU$w>9*;A*};e&^4XU$4xE)xi=7Zyij zw>+u^FfV$@i@7LZh)+-u_05ss1(*;(4WYdvoW+G{L(Kn_>;O!O>2)E12&r&3Ob4S2 z#44)=bLJnTe+#nKj{&JsIr~JYQ_5jnX|FR&qr&qf!WAXcPDHl*&oPmpJrmFvb_bpL z&uQ@lRC{DqWSkEZ6QSs3bE-{RBdhx40T!;&-s0|h#?J%|n~A`+uj3r62mq=)k52?b zx2WWl3^mVaH+=1&G~F!N{4gbWj8BYS|h2;qt}BQikKdpHX_FqiyZrO#33tzkV1% zG>)8NMKC3Koqg(*uKQU}8@KPJwNE54DQOFAuX;wDE4*{SC+D2wteAhhL1BB%-7I{tKb=->6CwKHq_w2l^=17rbMj!C|H2tr z{eM*F{$-;n+c4;-=B(k;Rc+$1`_Hk?%6=wMFRuJU<^QNu|0VRWh5ifCz7?Ez*9NI=GZ(bSnVXW~Y{9hy^!{ z_QLqHcx|tbmr#kn#*pin#Ed3d{G)dCS?+enARvpXq2PJcm9F8B7y~Ro#QaP3b0>sQ z!)y%4d+e&PDi88uHn>k%Fs8N;9R?k>GRt(m!X&j%3=Jn4I7Ypf75mUoJ)ElTDk#t; zwBt-bxvN@MoyJV%QIQ`Y3-&7i< z4AiB$lyuA?EwE?X-^jhMO%s^@SAX$FdhHiKOKat4X1h~r;A$tAX<4>f6 z`wnDfkV!+EWEccwryNJta7Dj^iWb&jW3(-um`-zppghQ}G~~(C@aE3b;0Kn&%c3@^e2ke$SwBaQfm#4CdK`Bt!A4t` z@Xny};AxL9542$7W6%}f%YKKGrz^vSc-+0WVunLb9y^g9K65TDi0Nw$P%)||1ejI% z2m%$_G0g=977;FD+n{~ym>>W^V*p26Sx6mPO4G6lu(5p4 z1OeMI3dqTS7~3i{2JFBuVE9i$fSufVwSHWk%CVt-dtdz*qn5Snh5-mGnBqAMr+JEhM$?On)?vV&Fc?B90y8ZCGoK9$!xM&u z9jz|?j^5mq(64sG!$3pYnRA~zl@9#pFQ)mY&e%pwY0bG=QO5kQrRGJQ`M)Tme;o1T zBURBsw`6yUo&Uxe**0MJzt4fYeCKw0?k6v$fBg4etct&~gUO#sN1GNBPC$QXBMhuL$;OsRY zK;7d#G+@LtPaFBWQ8nUXfz=rwLIPm95a6y1h+IogJo0Ede)PE1unRi}2mzo*Tnh*h zDODui_3SJruWDs{)VEO4Vq4TUtjrqW<@f_!I!;+k6F}DkPRlYY6UoNymDJRAGK0Ec z{G}W`Xx1G|&ysOYQg;LZ)8NApuw%umG)+)ixS~SsS^$ObwR6>|OBy2v7;^Nz8IFS> zoGXsgG1jZEqSbFP{8tOFdSk2gIfps41vKFLlU}s<91DE}01bY7ulZwXG4#onM#8uq z{fV{1SZcF73Z0stHMRc(fBS{B@TGI9q22M;0N<*K;9u7_H?K;&^@5mx&iz-`X_RuL z;po29IHjHc1KCm2E$iD%tE+42t>3ex z+UeB7AD*U2M~TmpWHlpwF%Ph_s7)wOloKiI=gwfD769xFp1YLN8WmmQ7&Li2-uyKW z&og=$Y4SM+qkg;-S6oqb3oqt(Kd`Y@eOXpR=VkEi^of({@S#I??N+O90&6mEcFCa_ zc~PHi&TSc@H@-h%^|D<{5<-MtqF#N+1-q? zp|#EXGn#AC@nbDCDeIx3VPJTGro`;eJ#suPN$r2}4+sa|8X(@hjis%tUotJXH)0=@28K?f1JMloo}WezWjW;wJc4CmUDG~ z7EZB-gEk0w#_;1O!0Ba#dm4`m!9X!xG2X-Vw?JgPtU>^wN-oMP1=cS+fB}>9>_9nn z5p5V?fD{KwTeQ7Knmk<$qIi0)Jl^^6e2_*NKEOQOKe^{|IQU%^C?Nuk>$E#rS&187D8 zU99i*r+JI>GD34C&3^H0ntk}FOKw47U(Qwk`${^dMCu8~c+H6Uiiu+!RiSJavNNWM zGL9P5WsVaA?EX&~^WXR28fSG|WyAE_x&Jsq)QYJ+9Tfg{D3;#G?H8h};1qix{ z@Qi7Ah?t!$B#f)JLb}ge5?bmT)b7DB(3sWnl@o{4yw+F?PoC1IOLpde%MOkBRX?;h zZ)hi+bN||;sjeV~L8>1HsE_UQo&Ua=f8VgXBh~+Re)nE_?vY5cn zG4bwS1sYM@{r6A=0U->C5b}EdR!DeC&vKelRO_XmG_Az7XQ&uZFRR^TVSrH!QDZ>! z3|bc97S#H~;BqYhOW79AYxjJugz{Xtaw+}zr>~}yM~c?@tVjDnDIBo<8E3EgVKE{Hcb}5(%Y4-8sskySI zqX4UE?V~Gf`+0oiZ+iwxP!FuCn-VVAah(z4jq#{)JD7u6)n#^iPTG8{g$ZulHLJ@X zB?eeLI}^izEDp+1mb!h|jPbDgpD)I?4|jJ%V9t=HnzXWpfiuXu^_bQ%ugU2@+y2gK zstW-2P@A`nwBZ6^4(0g8eeJ+(Z1^#@;g+zwp`m>_d-`x%_{zg30GQ?~ygr#?!;IEx z&6{HSuSo!~qMiRO)@5VIrd0nMhnG@9$T8dBxqpPr_f}WZZ$9|F&i?;6efk+Uc=cy{ zB9^;6!w<#G{p}dZX-PRv9^Rg#ey=75>LUPS{Voic%?3?5t~}WCigydonf^#ugvGKH zS03c#388}5%hPcc;MMClNG)3cN7L~mN7JlS!OgL{5`nd&0GwGu%3Umq7kiH~JzI7E zQd!j%q~a|iSN;Z?0H{*H{9_m}n#Jyv|1_0Y8E=qs34a`e46xXIO7=?qAwb^wrw+ zi2)?gq_E3cWUFbXeC-x%vpP($yNNM^f~*fa`&0@Yg*9%XHut~ zIkG=3{`r$>-(NhLX3rc+4c)-hw-X6z-V)P){-&<{lMtZF7XKNc9H%|Jm>TB}`_+G1 zYWCySb#vE;pMH{_`SJ7V8{hvxJSjM7XUluZD$2XHSn*Cd5S;@sv~ z+=2?O{;R5E=K}i=i}N!4hw-Q)9>!Q{UrcE?1u=l|KU79xjP0t6?v8;ejW^EzBaC90 zO^Tyma%)B1M<3ve@uAHYzysv%nMFXe4pbFd*0ZWZh+yY*ddh`n6(QY2Xw_tbusI6` zOEdvnAhp{X1K@1>@V>P4r;n$7e<|kwteAh>WKv$E4_iE08{CnmCd~h3ss3{tLuHp+ zY7or6j7m2i67zpZyZ`i;KH7PIV?BLx=|Xzu#TU}Ip8J0K{YM}85}dpO03Mxz_p|;^ z3yAc0QsK{OM1;4e@yd`cPfK3H3G=7DWPiGac~s;nrmp=vje%MKu+tdtQeKyFQ%Kco zpb(x@vm8cydQV3@zhLlPLqJS>E4)yodC8YM(%rs$J6+UqfThKy^tf&Y*uPIkN(_Lf zYp^4Z006-NM4<@6(q;9{tDP56HD3q;q8-#f98H6wLa^#fo`X`lqC`I-Pg+CQSAW2(ud7fTO_*=I;?Q6Dl>0M?h74cbnto~zcy05l2)1A9_(@)=eGyQ+x_?piD|2Ey#d+vg< zCnWd#W=_yPo<)C5v*mCql&8x}h>8YJlGD@88W80b;ner(zQ5MFEeT^>v|Cg~xfJzSZ?Y zH06f&{maCBH+~&0uQg^^+SSWD>pKA zGD%z9`7a*}@bqOQVHEKCjT`CI@e_6<05=27up16B5M$ejHI`igsBnr12S6(lCO85o z;7OhB$DiDpG}YEw3g-w!u~8TdT#zP!ej9gI)5f(svI(#*6hWq|+jtl*&i=dMzX~rR z)t3zanh4iXwXQHu^BzF;FJAz0>s@ z6Y%sj!?pH|z*~@@FR=cWuu6BG6ezpb>ji~ZIz&Jk6lnngMef~^Z`tv8! z!c%9`6ldZ4a@l%{BbS%O{9n}WKU$aEQdL=}p1{V@AsrVzbI{KJr&)T(R!(*#)NyWH zyPlqZ^~dR7zWdE|>B{9c+Y*`J+=PH-wSHuSzWG;F@plaYmgnw5V;}-tKv0bLp6sb3 zJf6k4fEdrv7Kr!yIX(>30)X-1zDvn5*t$enP#&KTv~t=Ak7piBUVcFk-A}p@5V$|j z;XcxZb3c>Tt=qTK&E?y=4PYjnK7K0g-@nh)4lN}D08MUI2UNEpaz#f3VN@lmQ;e^o zpL)`aXo@w?-#H4vZl$%!+MYM6p&iU=UFkA?V9|~N+`n-r-IoBRs_lk2bIsno&i>DF z1x>5L@>b0Gr_jWt8I5yq>lpco?^Ch5*3}sd16VJgotd?B%w|htu%CN3Q@R`kT=S{q^I3`Ff!O z)f-zCrld_d|Mc0k|8KsK7Qb}Pj!+IXpRWm@SH%3Ezo7-Hn19=l8C!Fn%(2fyCh1Yyjn8NS_bBZh1V6 zH2GT8clZlXGH*;mML75wuuN2Wc$9hd`n7ax`IgxMc;wteG7cyerlJ!w3ZK2{8Wk?tk^aBfSkf4F~|x6xz#F(cW$RwfAL28<}=?*&%N@JZ72za1()yMJ45bKtmh(KE(plzU@O0Ce4-`bG|}Vj zt(69kzXUwuamDgHr1%$D#rN7jZVc1{fN_6;w(=Pun+=i}VBOQ?gEEgNjHOco{k+pmd>6&Wk%yjZw>(flN&b!I7I<$*~O|Z zFRC10wKoJIEg?XmF?dbdnuSRNB15~k86m*IMF{~UB;i`XyQ`@wVL+88Dpam9`iJ^I zi^xfFj0r6vd@+SuWef3>(t^64fdNJjD*vYXuRa*`F5;{Fbk+ZC_rLCg!~Ik-p$&PS zpua&q%taZ)t@+MCQxj+fnkaJs_Xu4NC?p7+U0>i&?qxNXLMb31IGWf1OR>8IMBrg zD|ge+e)(qlx9@!`J@=Cr)AAh&JfL8PEB=(3|ITn4mJ0&%^d8P%@_4>HoxfWwf8?yd zEL|3oC-Q){ztQL0g6r2YV!*{cW2``3^xznXffVD--x-kc%VByNClKLh(BmRMe)x0W z@eN{PDJ+dk3mtaAh`e`JR&?*^hq{CGx%Bb*Pj%ah)Z1H&U$J5$&S_OYBg!Jy#RVKd z;4@8qp7JKZQGc%SW%s_@4!)iH*93<8eDQPO7oneh^mtnM>LY3HiBp5CxQ!4!RL}2Q z7xQKI97b5!2tc#wos|@wo#UzKoFgcw203C3=-Y91SzKQ>;?jl&9jvvIdsT;R$FZm}D9xd;UMa~pOH;Ae0BJiYwW*VE<8S8Ng7 z;`C9)!YV7b0(4c&Qh5jfOeoP`oBONRs8XptEEG9k#*<&s(FBYiE=T|{k0e`&jArSH zbbD47Zs-5xQ4<2REZjz#BCH+s!~D-o>FnsVB-2A(W$#QQ=d)Rtuf6$(1OXSdoMtC#E7!@adkzp?MmB3GenrP4Ae&e#) zzQADDBoC)VEMDKdy_~QK@X(pFx*g!88Id#NT>uxMHUmx&J8S|(fn=t>yz9S}RcQiF z9W&SKC;-uF4~7BF_5tq*rD+%KL^3Pkz|3J8O_YG({Ps&uL^?laGNVSf0u0dEO3ig3uEIXs!K}f7?m$d4E=q)*6X9Yp*!g zM{|#zNc;Zs^J!5Uku#@c1wYn?493lVj8F~S=1pDkcV24$S8i*QiQ|+N#~zzOy6UfS zPDcL_0I*54Sv#{hXw=Hx6&d||JN>`^{P*eYU%!`b-@TpFENeFE`a#Evs{6TLg=J|x zU7j9_hwwe{=kHOq2qg_J`YiFeE4}2wRwj80LAAFs7^npRmH8B%71?~yY&D`hz6^tb z@8|r3i6@?4@x7Pd)0NXlt(%&>E?>Kv)+L2Kd+Jm=a`=dtNp_R7dWtD)paB4pv0d>j zJOGdmO#rAJze#W*2#Gevle)`~0K|+S(jLi+Elf+C%BAwdxy{`_4p8S_tRv8FG_6VvG;ZD&j!QUwg`5dlDPVMb@3B)3_8 z+XrT}tDL7im_1Ft(_c)BKXB!K^5$uC_?_XJ#593jx_U*1h;)6Ii2R9TQgzpLa^?iq zN&-BLen@)*B+s0pZL688EZm|Kb?h4&WWg zi)!YEuAf{-9WzMh4wSp6i-`U)EPT@enVtOqMA1N0$7dw8h52Xxw5IIo&M|q7=c}P~ zhwTuK5)G?cR}B*kTh#t%A3kmd{}#XUh^|PMQDoMF{q|fj`prAq?Pup7)&I(?{qq&n zz9kv7JuNMVlQQ~;4S=9wTYMxo)IR+5qxA1T_;&iY?|&!Vy0dIq^X%;0JN{U^8IE~X znfb92k9WaKRd>}{qZtchiu~LGsA42SAT_OyIg>q0hskHUn|yy z1Dz6wLV_xKqY--Ib!2!&d6#tCg6MuGsm{`q93g-V!k`Ht3ySH!T@ffDfOlz!F~YxG z`?okd@7fwZLyWMr(Sruhj@^baWvFF$^s&)bqb^|p4EWV$+O0tSe}Xhn7@`{z>Y-_Z zCGXnp90s(s6p0)r&Vj{(73wh|3s+T@@e&3zo$l@2H>gV*5(f0)=+FE$t+k0;|7?v1 zo0oOwedg@ZwC_(Jm)ifMw)rs-^DkQ4yd$-LRQ^Nlf0!g->t;Ma3Vm13{U6_#5?B5$ zVf3%Rk-EOVo<6&BF}?KKPtw=F`>piJXXlM?DQ0Ka-*BrxApoF~5$^sF2IOfRhW9y_ z9lGCoqP%$-5nc={`ibxEoR)Tvt3#`Sfj;$6s!`dz7C!2OP6m??(~s-_T9p_WbZ9p| z1?Pq2EbqL%J9u87@%!=ts}>k~sP}fMqZsrp4_4)AsDqZn>7(=KZ6bT<%tPti>9gs~ zNm+Nb2@Y`jMysk9QqTqRX80|l*(91&U+Mgl>ZQUCG{XQ)>1P@NYD}>`_~)crPa5tA z$8xRyTO!3x9bQUvpFc@J+K|D-d+&Xkny9tmES-CY{g*yIE2Dp$9pyTn-Q)Z$`JCE? zKx(**!tTLRRa!#dqYq9OiC9%Cw?#eJwF|-W7D?;qVPe3@mHrrg943(j)@0B^=r?Eo zc}_-+huHyk7c9OZ!uZ*ZX)TX5V@a!MS2=FzIepkv{^!5^P?|;!evqAihNZM5(={3U zyCSuJU86k8wb5{JuTjamYTsN+$93f&n>>9wc$!JYu|4I7bqmN9ZaqvAF zC_^{u&?|iF3QpiOy>+AZXo?Bb0Pu<48GdP0>uNbW>ub+-WBh%$pIv_uQ3&ZKKPX6~ z4}ZYsiDQ>M@9^CQ(oXc8t;+2cAL0Hix5Ib+3Co&l?R2dGZ&SB$(t958;y7{w6MnR^ z*3(@XEm@Yj(pfS8r!fjRuU+oE0&WzL2>=3VKnr+OP|M|DTS1le!2DD9KvJ=y3Ui}~ z3Pey<6l@3w7zCW!KX1H9DI zFunBpt9IpInfV7+obk_ufGr{r;gAN`5O7rG;pD~TFg;yP`-m;q*J&a!JL3o`JNScg zNc~nl3`~pwz|Zu;^h-@z4F7#GnHw^^#NvyvoY8+UBu9SWHFcgdhsh!@hgoD|^U%@y zd{CALV`quw(dL6MCXsl?;4SCwJPP1tIfL(T^TC|IGe>#dM4W&q3xE7*n$;P2jy?A6 zgabSC|JkjSF6y@|K>$}uSKYx`ADl}KZZ|j~)qgYk$JgD$slE4P^zWVDyqEs|U;ion z_>I@orx!kJO^r^DV6M?#29|3vM|iw@DZ%hlZumWqr}I=s>jVH84kr({)LC3Bw45k{ z3r~kt2&lak#lQd~aU3nkckrF@=RMB$Q=ehZ{CWF=?qYz$`}%#`EyX{jyV4nWzmtqp|~V_~60xlwane5aM^)-@;D*4MacuN# zIAE&>MdYl?8V>Xtm$_>G8NzzN=0O2%^+u+h)=LFGPgWNMxMujT0#&N3Fgy$(*wL(< zn$qm>&8SIP_mpv9bWs}_^G}>iOI-E$C9P?6>yfMdm(%uq(~`%S{|g!OKM`vGY7O(5 z)^QDKI@oo8i+$d#q))xB&5Dmc{WyK&``=E_zxr~zaqE`mm+}(Q=N!jcaqb~qkyz#L zMTVS2Av}om8ByW2bh>GPpXQp+w+?mv!C5V*C zPBN#9>GA((?B3#^gVw$A8+m9#drKT;1shwLEnEHF#L4&uYLI?o@90~9j&xuWv5MYDKhY&#R zEKM`>zdRziRaX$|SOG+&0{V7lgY<=?b~S%VVz zVU)jHC-raKakFxIt@S%4p_v4C>iCTO!K^GtC*S;oqOFw0z-2D8mT z+qoqy#5H!{i?z=EF+jZ?o}Sn|oWV?+hy%CLJ_MH=8?;3WAWKeJF7#+Nqm9O`XZdNr z!;NDS4y#ypGhMxYH9hz8i@IliE-fxBrn9F`yAVamtSz#B-?%3@RKQe$sc*p{1OOyO zMP&=omGn|i69VXI_181QmDQKF$S`0-=^O{bD{aInt|6NMbGj=Rd~k+tW938H1<)C| zZOQ-y&2Z1oxT#%xiM#l(Uz3FpU}IGRMeHxsZtNJap-$h1b{5CQ*lX5b1)zIY_ZYMN zWt+HE2yu;+LEtMbfF0t85GbHEncwxaqiT36;OKVI``dlo$o^EPe(r58~>#2Owl1p0vHoWHAI6wytwX90x!^F{Asdk+|)gHo)d}q=w+a z>&jcF%i{w#oo)6sUKV~FFpJ?H>VJEMuZqF{`P*+9#S!fX_a26Dw1rF)=jXHX#)7dTJ7g-TkxmC&D5a<9ho?p zrgUZEhSc9ye))0Q;2Ind0qh5G>>SN<-+Dtkui$@|JDTWi)?#XXN*0!d;0MIrE=Sdl zHIH!*6EmaL$Rzf`eALL7zw8+PcCsMNq#8dPCM>k;4)=fn&B=q9e+0N~3+A1~eMebV z9WjR*KlNg}13SAafNwnA;9AsmX#q@*osot#7H1zmo|gXPv9$0NS^GaK<9AHL{W_L5 zceNI}Trl{@8fp?88$AbP^zW?B{OfAx&Lgee8vzeuM*rSTwB$_M}$1W3GK#<~B}nenX$J`6u+ z;asxiemb;wYIc}Q6gIyXY-yX1D2nhLXBpZ>eftxgi^Fih;7-uejE-5%&CF>*ukuQh#o+KJ zC5IV2l%@Im(t5zU@+2*&CI!d+){{PnVJK7mccR^I);isoFfh$`YD(BWwWjOICWQ2E z6IZq|Ai=a&6d5FX?s%QqZqc`BpaC%6s??>A8Uvd9(Eym%xVx`83!{Klcidz&|MXd% z`F}Fae_mRiF#qlAoh=$+JO3AMy4pXR9TUO)YcyivALjpzjQ$;29H`wZV)oyB@2&LB zXTFo3`^k^fjhkw}MtFI8jQ4m3B8%^3f2_SdrRZ0SXypDpj8r7>MCEXYu-V^1({Bc= zj@vm5R6+m%!_AKW8qALv&#iX-8|+?+urNTJ`Dc>mJtpgZ5GVr6uCh5<3pZZP8Gk$P zr~o&@62brymbp&PSSO?`iFs9u1~qR&EmVo#lR0u3~=cxNNyXzp}Vbs z@VoHC>)}L&g;VTK;4iuxw{E6iy!}fZ1(-?4j~!2c^u<5WS@fb&Kph1@`b$+%r84VI z1qe_XV_XGS0)xqM)R#tOLIAu)im5g=7Bm#qe_3RwRgHsaAL(>dVD9r00w639T2|iv zG~H)%9LO3j%>Q&+;OxIN3WCs24h|o@rq*q=Xh!>FgBw0ft@6R))j1y=1JH(9bz(FC zN@L)`LDo4(i~$p}>vK)(*qdLkJ4v*6d&ps0w-bI$Wzg+0ImQi|Om>y*nCeg$yR#TT z@HU6gT1@bIQ^L2l_0-PRX7kdfuv_%>nY8~ue^JlVc7$x3~le4_OoD#{@|w}#)l4B7#GcDn$4;mx!Uw%-GyzMBoccB0{V z%4HLlhtob*I>j*ehY*0YVJy(|kq74A^F`kFbdh#dmjAC@y&}QxMml@)R62a%kbTdn zt2%+7xrAo%O+6!E1*Q$ z12NKE4Q(oLb@BWc#r*$`uKI)dmqz12%)c0Yv-W>phK{lLKPlG!!7OXGV`BQxvh%NV z|GK>?BNSWWeNBAN2eSD8wQv4w`r%72q|Yv0v?Z<48z(k`!AK7cXQ#nA9g1*@D)JlU zaAF;1IbEv=f}O&-uRvUa-dIG}Kh&vfL>)K*7#O1fz?pw`{jsp`(#`H19UTlte@2ov z&f7a?f_9RJayeXzkeQ4RuzV0?>%rTmQ{)PzWNFw0ktAMRV!cQdG@!R5~^ zzy`d>730HCdT%f32efcgW~|9EdY!zj{Z9*tHSJnbN+wtI`GOk&W-_q)7tGA2B6!}Z)oFo1-3g@>AE1p z07J!wi|B0}m)lFIaWWl?-JK;I&~MIz`@bo*nbxo4X6%gEyZugAPFjG>yuUw#@L8rkJky4($A${5UVK zJuZjgsk;5m>)I{04y!r_#>5RcA!FAc=0BL`Zpfk&veS-pT&+Q->h75TBnI@ zxk=j0rSYh?$yS0Lae(+b8m%ej#~30X3dWw}00fecq_PPxbM}ai0_eDajAddJaQ)&9 zhe?_)j)fy<|Iwb=%MLW7R>{?XGZHAS>CRolcMrVnWn2xr?ScDgjav*{)o$`Iz-OBh z-I>~uLCvPd&Yl@JYUmgZ0@@BKu8)IQlYI{awAATl=3BwSU?P!_RsDgZk;1X2x}Ii2*hsZm--;Z~x}q z^zG-KNf$1P`OgeJ_BS;K^WR=n=e!EMeqjPF(#EsBg!+AVVPFgbfMEVPJ0Itoy3cCt z62W}Csz05+3nSR^J<710;ib$-h^N~C>Kr`e$OnSXP>X@0POh=Q^(+B1e-Z{m?Dh;O z$A5W>QTV8Pm&#aCTg4Gy>gS38GhGP&I zWNAF5z>DFUkpPXI|Nh2LX;M zx<*|wpzntOM|AhT#t~dVx!oQ>cheOW8wcdzyD48_Os8VU%vZx59Xh_5`a!2O>HKUY!A;YT^;!4c{(Jo!;p?^2BLNg&~A8@AKWHGly-a?&Ki(FBmqHTgNa z7qP>C0^8N@yW`Rae;()QqaNjOLj99?g>yB2@Z*ejlm#IQrk{M^rHG3tr#+msDka^$ zw~}6Z?UnTD#S1q1|BwIr-_sFY57=@PhlChF3+!I2z!DzyLJ!vUZnmq=3N3F=3rsaV zs%XhDpxRPwo7&vSq{>Y+9l%3z!L7KNhjrJko{h!%wDQLLY4wwWmGLOr^X5jM0 za(g+RFH6?(2-qDFb-;vSV21?&ZZUsds>=ugdU0#)_|Hnh2J>P&Mw=itn0*8aIM<{> zicIHbQpr2HCD5OI5X89}@6h?}0=%2}EwYrJ#Br7t=2%C0R7R%|fDGQobrS;kF@o|S zF9F@=3vCL| z*)0y5ThS2H{8|+Hj;6%%LxtoT+0`E-(Y%!Aq0!aR1OPD^kFJ=pL#B!MbslspW6)!- z=vXUYy>KiwKr3`}YsZ|TpTFf9OE3=UEoedH$A{y&qkzl#%Q@K5ttV@W%D?EG`) ze?aE{t~6a=fAeSQe}Cg^>7Do9O_#4;wKZBN^Bo(J?TmJWgK#H4MvF=|06Z?1lksUt z=V@CZZ7?Eyt7m(iwn|^eR~Z94Xavv~3aG{h)8394I%w=zZqEDzOB1sGFj=h0vOG^1 z?tDky)3lcn?>-p3PJX68&h>kk$J5z6XZeV8^?t8M!0miOuwBr=vkSP+EDsp6Ic(Zd zZVT!2Jmt8&3LXx=ySaeTDSYTgD9UA!7q}b+xwU*p{*83z_bnJg@84XJ z?EnN%GiiQd-p;(&%$K7p{u=s(J3Ch?+A)#cCK^-WCwG_6YUiIjt-I0E3Rk_ZS}zP} z@WgmAX07$sE5q&x_uYRr-v0Y@ceJb`tq`pcR&8C!TA+3n!GONY^nt}Ri^kzsAJgvt z<7o!fch+NkuzsE9*>qRJc6R--_J2n^|3OIlg)y#l!a>@nE31#A_P;-+LlOXR1hr4M zvU)H5T5A7a|IRnlORxSoU6cVp_!s8HvgR@G#a|QvZ)T-ieb*4%smQ0E`|x|1jv#fo>z;js3ame|b<8QS1!5UmJ*;Jv;w7 z^Il9jsNdDyfyLm+DN}hcIn)T_$&bNI8}mWu=`19R=j`OT2appNud}zISZCVpF4~v9 zwFrna`jLk8`~p`_Xd(|!$B)A;!t`)Y2~30l*KS-(i}MTV;j`z`{(bvRZP@T-MTl5J zZ^>wMS5F7)K=7kR6;<)j3HqBgCRD*3S$X{t0+59EnN~~I(5&64;Y}UT6@U8|Qd61& z%^NFeUORPjGjp1!NR+|PA?|ITkjX#aUDKGa7n~#L53c$@EdjucEf(uOI07V(1tcWc zD3Hy26H9al#vL>my1{?@6W)O#)fw6`5GeHxqP^3n+VN1e_o*daAN=&0wD{*w>bk$P z(mFh7Hi~Qv@X@yV(IABE%VPMi$=W~X{+D%oQ5WspsIjYpb&)Tgk-z=j!@cd@(m<4uY#Pmv1g&Q|Urv}%{W~vP z0N;Dz+4SUNkEaC*0!|!1k>)U>fMc@2B0i{GlFolG=_}z9GMRf2Gp-P0V8cK^mLqk(gh!lsS$t zh^l$=1hsFQ7!U&^!L=VR@paQS0oK{KfdMuaW*b!bu~=8YXEc( zd=`or<=Tw-x1GAoc%T~))Q}nRf*tswislyW;jPMpfLFp0V3<0j)v25&|J1%9ZikV_ zZ{HX7*?eJAu3uY|T9wGdNniYKp1&9$On>>46!W$FTgBL73M~L&T)%NM-MW3t@P6db zk#u1He(}Q`@|U9uBB%|ewW9#21b9^}+WzoP#mW`QVTr|L{ClZ(L7r z{PNB8cmMnk>5Vsko>tdj{^{jTKiKJKsS5u9J%N@KwVyrA!y}K=8;8L%(BTy|0|)~i zu<#e1=WCDKnkR`m6k*l=Nyoqr2moNB{aU-A=|6UQLv=3v4(-;dgipYz|j zNrA!XLI9?tP|fKWRT^kMph*)#gJN4^AiBzr55i*nu>Db9zi{*P)Gfzv9uA}+P~gPV z5zjB)i+p!6Jof_w_~mkdj+0JD`t-tQ>GHK})*l`|!*PJjD4?ZKKJ^81yBe1H9Gu1L zk5wvOCh%Dj0%YweGy|i64N2kcNCd}K+8Eac*Hy|;%@k5=(xO>l1_Wycw}8gX%Z?Mm zJ1lK;BS7u8ivdQY-?Sj+U&6bs7Z=+tvCcmp42YJiV8|850QG+lxtQ;Lx+zaUdk769 zXll@lh87dW^~4B@szG+a0LK1ij_gnKfACN`@L#@|7QXzDj1133NAHrOOAxd`>yqZp zjQPJL<{u5tNud#}A+^)rz}Vk8-Ar{%%>MwI5AZx!b)@x`pT3&@^?Tn+KX~DX>E5dE z{0FZ<5jcNWS$cOvc?OWqkyBX`(}gI<2rF3dE)79b_SpNdU*T9>^Oq(&_>em^P>PE98f^(8%O$> z5xgE*K7qJ>dpTXZc3pM=rqj7oI)Apf)Y`2DPSO>NhHI1q$V}F(ZunYZUJVPHs6QbD zpiQ))Tl*L@obM-&4+84LffE@9Y#fo%8Z6h!_+~;IfV;bD*TR7JJCl>xz2>zRKnpbw z?6KW{(R8k!G!2VD@&iMxGgcM@Mtj|shMCfApBO4z@oiQNvMYLP%?|<%9j@JwF`%{7 zkRjIKdShT}Vb+cPeMQFpbi2^p6DM^6(|{+1kpya;fgPgsDOdf8`In*YN&1kD#aZqA zi|LoW1GD-+h}yqs;MHqa(vN=fa{A^o-$}3j?Dce8HvojoNM^k1>4d}i0%zvo6JYRt z>Lk9%{6{z-h;t!<^B(@53kOJp^D@lmK%I6exEn8HS?rGs6Y}@kx0^69VgUf>{@K0n zem0&CkLo|nKRe^?4yN1B`*WsyJj{QwPB6C!G+bS$bKo$L7+WyBaqhpIpExugTnLbj z!(x)5`W=2JUh_hT^Ewlj69Ny<)44AvFr@W%wx{8pxI8|D0C~84q*5BbX_V#Zyw1!Q z>*Pe2Pw8rc1YG&P<0tQ5hojyrZkNIuSIL%)%CmMM!(&jybgwZtA z@Cs7ZpPE%>=T3U@^;goreES>e=Wo54uHDq}2Xpk}Vqazr91Oqn71+#y znCASD&!NuHlb)YLbD~RH`C5S<-+Hx$qr)V9q$|emdO0zPOqbf&nQBfo1q zu8%SHhyEMEUy~GbXK%+qds%K3PjoKKxiZdgQ2>3t3~$ ziV!NDo)Q3~4^_)4Tcq-^GWaZR0v^`JLfhKgN853zrVnjB5kEbh|| z2xzCxk*Iz?7zRM8=&T`D9f9A9-{bNvg5XU!K6A@tN z|59e~Pr`r_&pQabairB4ZeZx|v;+W0VE(230DbGzv0?ea#~-DC__u#fKh>Fkjsf^) zU;rsDESv`jvf)Rdo#D?Jb*C?0d^x>WEaC&czXwb$j7v3-@OWp`2k&9wo?pAegTXWxlPyyt|-OACS*;YuwpKguckqjpgS@f`iQ zdi{n8Tuz=inGWfCKp2eZGcE*BLW;pS9!y7Gl!J7D@{?#n9aX1Y_A4~dkfcfXo&-)X z_1zrpmn6TTBLOy{-IFH33Yq{t(szTg%fqaT=#QOchGtE2Um4rCl95yFxk&XN8vvaH zacmW<3m!2BoE}Se22$K@0vU1nV*@YJs@XG}kL+b^RoQI?gIAleneO&dpW4X}sX34H z{c}%X>Hn#;_(utZA+K(I+44%>Tcq?>_fzx^nf3X+T38nGW@kV_poTgj#=;;k<`uF z0+89^WHBA@ltUR_j;A6|xCr;B!;83X&sbx3i>t$S2L?ta0EpdxBx2nb1nh$Q?tiCx zjqx;6Q_h+H7%){rx(v~2B!wnGxn>^jnh(U}gOE4y;i^9j*m4~4!*^Q`_Tv0XmGWxk z^(%*aEh8-Q^B!vbxr)ET^R@ynzGv zfFl7F(XOHD<8*#rT{RG1xe~A&-5O{8s$Mp<5ayrX&d{~0V`OjD&uF;lvkUx#SnUNI zh}c4JA>o;WOKJWKXVU(^`9fO!>ceRon?bgbBII;i zLv#ycJ*Q2DCWih#k=p-top)z#F-asq9D3uR)|6QLKc(G&9i22@y<2;`gsthA^ZOrt zn7;nq|C|2#-~TOrcJZ@p=iixp`YyDAb**azv@`z>lsVKjqIoZFE*8@>9u(^j`Eou2 z__=eKyqCkhE_u3cKCf%Hm^y6tU|^&IfL>?+>EKAYrn@c_ec|mE|EoaV9?p5llZ+pZG|V3jrJ-5gzG^`IJil z^Kb5H9oC&YchhH=E~N{XFQy}h52e#5Po=pz5oxmU;}JXH2mvfSi|}X{3>eWQJTE7r zC+DfU(^je5HQD*+j9s+H+O5}KPtLRHc7Vq5{Vwg+#GUSBR|QTE0!CI-O}{48Ljb_l zfVJxn1E~8O^DpfjS7q!kU!7|AU?AoY1d+^n`n!7?w^>VUI`Ks~-j3DwW_jzlO)(&> z+FWKg0+6!XVro+eb!0aTOlbpP?(q|8@lRyz?=POvb$@5m6sqsN)(ySFS%)mII`fag zzhxaSoU{!Eo%uIw|7XPfpM?3()c$+5xh?$e%H8z#Z{ADKzVuxBr+@#y>C?|X&AO@c z1+gCX@8IhT!g80<4hxJ;#n3P&VUhXw!i&s5AC32Rm=50yD#o?wbY6irU(NitA!OIS z4rt!9e>}h(+ajRL8UQJmtGSd$fdMB^t~JmlbN^KsY08*~*0lpWH%C3&+ftO|b!&$U zI*J2xlogJ0qTb!ga>5X*{16nk?(Au!ecl$}IV=wk+X$U-!2`QOaNgt%_~dgxd0Y?> zc+BzTbzn|uN&xU#T3cI9M-Ly7VZamV3!nRZTA0fwEyY`Iu9|@w&S#n>(Qpber?@Fi zT47)>FDepL`^kiRM@+lU@;5nRf_2&fEYw=#Fzjidx^CWU@PphNROS1>H6INR_NN*@umfmW<>9`BPd!mY2@|6J`Qsa z>gqNFF|D;N#vcr7ohvXP3WK3&&GGkbowYZ5RkVKCqO8TdP%mi|)b{r~V>nm(${ z05($wbr=)on!n51@xLs!|JyqIujR=^ISl@BT{4XS390=HH-osfwYBuSk3LA>`QZ=D z+W)7Yej?h(y4IQUGAy4bVd!!2IYq}(H8#w02EUz_6ye6&y9fophnp|+0-NlL3xGjL zJa!OlMNk-&(JZ$kK)S65W#rlJbL+CaE>R^04&66YL@kIQenGv26lO9Fcv%kD)mYL0HU*PDdUPR-LVc z0s53p*IEGhvT)KS?oxBc`ZBdJmu4P1s$Ksl)8bd8@_$U{{X>(opPB{g5$@fT=HMkU z{#g1qEy9TG2T%pluHE(=n|}Yn z`|0k=iqQb*K$!+OZHRE5!Qyxr{DbH54N?RV9!7PD^LHN$vC#AI2(y%=wqJW(ypyV% zBYvwi-SX98lZ%0o2>{mZ41cHkJN=le{~8U>iIx$^f`J`%Kl?v9#Kf)oGYInrxtDhg zA$AvwvRLk=2~oyOmEQcj6q>5a4gJx`H6eiS?CoKMY|?ak z8gvYME*SnR(!fo!)ls_@0~$AsABd~n-V>|b-P+!0S4MKZ?P`5^BEEiZ69Yo9{zHo= zVRLAkjU9S+x+80ZxyNMe@2{UqOJ98?&772_f6?v2@@?~SZLOp~S|>EGYq$S=cFo@; zGXH9{o%!dgzvHrdFc9-kAKZ{}>g&e*fBjqkmfro{Z_=&hJDC8yxJw@>4K;pevQ0QD z+Q=H1B`P1mz7gL^n~6ofz)6WBT4~&$zegE74VVQ4ygZhCy5(Q&VSn)jv5IC_E3J!rmz~bG@Bag!%ZSGiD-cOgWUQ3s*UQSDki*_Vn zeolATO0Z-O7yv@<0x&471I@wUi!dv+995||h7ejY7nW1={i`Wmkp=)q9ndbpnm-12 zG@crBYG<#uZq^{Fy)|U@)&v2v5r8&;T^C5Xd)8@8tAC)*XU72OinZ&&08IbP%&aX~ z>fQei^z6}qY>}(hbE^jb_KLGvOMip`Z*omHhW6==K~Yz--sB61p~2qGfY4@}I(9HE zeEH$D^#6P=E&cJM+W8mL8|$CG8!yabcL>eHPjt8aWo<&R{$QOoNlxvyYmv|D%s{#8F_~R0Vp#6S*YsZYh9;} z^zHm}aFwpsVbBo^gjaGwfv0ia$>SZK|MhVEo-TiS{AR?cSiYyO|L%Sa3|#==(ph%$ zyQ}dd+3IEdZ?kIytNJMzXbfZ@urTzUHAMj6cqzv*xTj@twe$EuIo+_|ypCNe+A4^+ zay)tRwspp}vXV1P8*?=8#iIe`oqyU7JST)vZaa)3e9{ts@$!{)}+vt}*|=7xT}gYsX5miehkwV*wcRBV6rl zAPBJujRy7k%g(}?aX{S?U@&h_ph2G@eLwGiOsG0{Dht2Zpr~CL1N5wE8U34qray?_ zsSK`u+eH{Knyx`)>_0SWuQ(&OqQTMLZgWn=)z5)3VEsznsoQ#LU|@S7!<4Sto_+Lq z+NbmW`^EgvKYb=m?US|pe%A$&j^pZF^LI__kB_pQe>NT_%`qNj;lFWKJOAwd>k33) z7uvv8Yc_wbYAtqI*ZaNs_S@-y{^S2jul($%wn>oh*t4F^KnfQ9m8lW9zRnH!jyUhf zq#@iL`JG4d4MIX42EH67>2jCDEr#d*QsO+D`Ml0;f%WSiz`$S@FZx7?Ujx)Vv3K;& z&gkoFRARd4t7<6qZ8Tu;5rZ<)%WY!-!r*rklae>u-JWmM?WJC2M!d5`2v+ZjmUiYJ zD~AW12oGFvTY{HIdvl|JT&3vcHk&z)9F~WB9ULa%{5CeoUTpz>jsL$(4KoH5Ayp35elHR{iHbcPcIZnXLSO;cS}boI7iv zL7f==<}Gaou=9`hAkU`<@bb4KT2*ckvCOn+fxqq1d0o=;Hd%EiH{q*urUrVq3 z{PpzuFMeUUqfh!X0D3=-X|epAvUPvh!XjVU@!oBrL3lT2y*+;s+GcU2>jtlwzxMBD z3_Jie*cu%$jf2x=&(oXX+`8OxrHHmt_s+q*S*>Vuw}HM{p5es>-Px=P-X53H|_ zgyl>-wE~{UL3GMYKkpvz1PLJkOux53j|-xhYYe!Mpjbzn{4*iIz17w9tKYtxZr)x_ z`}XNLz>&l0(Q}U&Q(|>jMx7W)ja4zpFmN*&LChZ1+bU*40Hvvl5I|LJva5ehlPzcM zu4&>e?)+QDvp;+aRzngNq$@JYgVT|ebV!nZK2dyVi`e21_|XnQ%6oD$VrZ#79MA%j<7{$?N3&i`LMCDnff z`m%H%8y)?^V!W~*(v3suqSh5K|99nw`Jc3jkR7NcG5klhF>*p`|NFHz8em{@3=q3h zul?+e^sQ&UlYaHV*%QYPSPmpRUfy3FRQnu5SO6JXw zN#CknjsfQUsY6R?{>js6>Cc}?^ItrtcWLzv!u$tH*;L@VVc8zCYyM#VSzknaUTn2} ztOLdHH%{rg!{gfdmu5sl8=xPj1t!P;u3o>IUU=ol>D$kKFTMHBuhMlH01RHG+uFZ; ztXJi?2EW?_i1$wWV5B7t$AgQ8(gEObBCk!v)&>Voc=4CV_ikvck9()6V|FtJMj`;9 zQ)8{Y-O<@*rGmtOX?LDyau?XNsoP?h0ZH4OSolCKw!K%rVw%zVsZ(dYHY<}hb#r-m z4wJBaH@}#RG`{oi<>y)e5$<`NsD;p=1VJF^Q_NFb9eMTIRUHMmD0=|&>Ev#I{V@0^iF@;Xsr_@!4$ME2j((iw*J2xO0Iu}Y zZUDaqMmO8ryA?cH4Q?D>)TAki`2k7HF+6A%f7_+jTLGHvc$>`CUpU&dVM2h(ZqIgW zk7_qZBRK!xjh1g0ew}~!U;x@{WYreZP}M%^*rcPtrV(GTTT?PTOnS4bP=A}xnak9b ztUvWTH&&tYBdo)eRNCjBIGGl|`j|2Q3xDvCtNk+o2XaCzw{fBN|EV@0F5dEaf8wTn z2BF3v4F5S9{5z#H{|B{>>67_4!KLPVnEhv7crN|Jzy6cd{(qis+`M7y07t1GM`0ec zerbWu?_cx zazy>MM=&rF0YEQH{=w{aTQtHTJEJ_A3j_vjx0?XyN8UE`mAaKJjx=h?mlKatk{x+* z!m$~#=#0yWO*t;YbC^ZOp0vUA=S?GRF!;GY;>iP{5;@kDDNfY#J`&{+Pye|j11%RW zUrY-a1w4ExE$Eg2uAMYmNHzokHj(KC%IpB5Fi)p%ITlC#S_c2FxXPWZ?mm!1T_59s z{Mfyp*W@A#|JL3>V?R%f10p?_)!@bhGy8)dMxt+Vx-f z!-vy;UGca0Cy%AshmWQyRNniU0ne5Cz zYrA55H}NyiU%qxF{osWkrN8^}*%psF zSKLhifX09y8<gohA- zu;P2o>Z2(;tsQVTTe+`5Hd&Dk)dY`l?g*b6A>!MYAMD|hYAdCd)6*rzB1Q<8X zDpjt2sV)YbpnHF@1@8{f(<)$t0h2B4&6nY!3RT+`b+E;NA=wzIUD2jN8lk37=?c4< zvq!b#|9IN>AD@<$|I=yepsw`AevhN3e~4PQH*ZR~|CyM6nE&fqgG}oDu8oTZMh~&{ ze_G7{e0D{2pE$XDZzX;D+4=PRk6%oG|Mjn>pa1GjUG*p2lpIXGui=>&T@XM5XWaAQ zPMW;n+@A{oScXP==aZbDaA80m=fwjne#ANK$nSBUvh%MC6FS4|kiCe3kr)Boi-_D2 zCUL}wg@A0u*g$OJ9CV%@0>q*&o_R$*jfdmM1p}YwhlmjlXX^6&JgsHP;vGP)4UjJ+ zJ-?U36_oG&?$_z2t_WNaF|5L1002M$NklY5WFFpPFr^L64an0)36kptEh=GML zb55Rc2k!;iU)2XAEv9*(vhv~zX@=kxquzu`*O~wH(RH2q9|H4FwWu#bfIEV{rU@PY zIW-b>{y}aC058Bo8{phwEjnZs9|ME$UQ7+ux5+|bm){Zq3YfTU=llMQ@Xj*VcLbYnV>(LhjkzY}G*`OfDjpXYXet9P!27`&U( z{Jaqe-npX3S`tV48v7U0?3u&b`F}{e{*RmA*D|Ua6IS0&V-YRETQc-(yZ)K6KNf?N zI85zIV`(d%)X~KgvVWkXjDz4~b!|0$@X?3q)i+*C-}&J)>6h>RO3Xj=eG#c;MmiXE z($E$8g)90+1TDDOUCZ%BxCI~qtW^h(3+CUWyQObsY?WIMso(Z81}Y^0C=QBA`zSsT zw;q61ZT^-eL9;D0q2DL5nv71TjV6;6$>F z-^fSqAcTZb4)?WQynHFW^xDhm*x@7Tz`lLy+}U$>96%*2hZbfC0qk}F70gJW9z|+Q zGP}Z25oUp3Ptpw20TMNRcKl`Szlqg(vF82MYDd%1HfMm5@Mm3NH#fKqyJ$enXyKXf zV6-KuUuz8X!hi-0lxA8&v<=Y^GZEwjyjPCN4>#K21Oged&pVUftg5uYrzHK=95$uC zgngFbPta9qZC($U|0!M9JNNjBwD6^~Y3}K>Y38KPxHF#*?9@LwX1FY4f9(9T39+J` zZpNl}-GL#FF9Ur+qwJ8>{$=nl9gz@#oqz8reN@YhmtT+_sTW^)IX&~EXVbgdNV>Or zudpoi^%C=c@dt3$p#F=Z{N3NE1OoItu3Ry%WUOO>9WM7rV5E%{UUvT0-50RC$JU{H z5d)PG0JsE=(V<=033NdWCa~%cROKK_Jo9y25GX(vXAi=Q?|G4dw~YMI7gAda;b#2SOrKR-W|I2?%Cy$*-Gg4=_#TXUW9k=c@d77cT z?6vqnOMp6AQswF1lwywl{J?=Rmyw<3$2a`SKaBT{!ci7l1~MwxM3`|`>Ty!%Z|vtT zT-rB)!I=#-mvg9K$UhXDZ(i10PHo#;$g~;Z=w3% zTE*-&G}P_g4hGbR8XO(b_-P~^ciIlD3CfEV@hPsYwJX1}xnzRsU-hb*c8O@x1{(^y zyi-Akr;qGQ3txRSEq>*ZG;{7~nmH3cRYg_wMRtTV%Hy-Q@S4+TohIQA)p8W&`?Nb=-ZVY`4KEy zxLHhqkED7IJ_UCHQh--`_bvuTVg!&~GK>JmS@9xzZ4s#v;0#(Z2Hq-+<(0!H;f*Uh z+z?3nU_-6wzTu;Nv4fzbcfRqp8Uo`)roAo2I(5e7gsB{thm+sq2y+6+dy5ig@$v3) zp0=3Ii7ol^enfnCM?buxD*`WEx}+RU9S7K-4jkBDFbt^jH1{<)BhPL>zjCD=FyX^+ zlq1apWBz|HgMXJfLyuHphaBbGm44C)xTl8820~*_vr?~i_o^1?P#y#b(ss=am90RUQ52IX21(51=A6?E@P6Me z)bu$R00UrVc7Q>jUCcSBySlo&PN%A_sy=x#{PLNnqj=Q zoN-TNB8;E>;z&5Y)VF2qlwfI-p0+3mFud+8-O>VUOHcR$ob9H|v|Igl$n3nl!DrbDN-2M;NsMiH_z{zEmH3LK~t}eJq`I^44_2@y<7~ z3AIysY$RfUY!63#x&DUJ237m!@W2dmz!?MYj6Y+bI|fX7cv?A=ilzdT%?460195Kas3!+o`WtM;Ykla@d0@^mSlxHS9tgq`AB z^RRYBybA|_ARS>0(iYd6j`x%o64x6yuZL^bu7$bTE#ct4ePK=x0+G5JB7=@aBbk4j z)`IzaszSSrQy6d@C8Hhx2C8@GC57h%f?>EQ27(9{1U#e87JVV;ITDw9k3Z7NCqOj{ z0VGJ^14-ynUjVnBd!?7M%h$$IKs`=crl=ya`#4#M5D1eZ~vp>F8(e z)a4y+*zT0u?D#QlNS)QoxwyC>zN$EYcns-qtTp_0wf=2V$=f}px-W-MaimP~g!{l6 zWBAh&Z|^q#8a(M;2*9(w$E12LOaD`x4TuN|7R2bDyKr8|1fG%*U@jayAltfG?OHSN zgN7pcj|aYMn{OL4CP8!2LDG&F0x=x^y(gQ09mf|Z;9}J~CcHxtYNJsdkdp$$uvaET zFYQ1Wef6wj^!!tz>g;6n3sBp$HJ%gzhB{6M(SXR;&{Kf#RZ*Ltg!ykPupRm;LWKeRKOn00s>TmL8K--LX| z#G7D%(ji<(IF}0mY+Rg}VD06#N#lj(o5G<;yUWtHi^*Y`0*L}^E&u>EjSnWiJtL2V zjm~0lsVF>|YMcoV$}z+GMqMW-CsiLhHXXBgiP>C`r*|!IyrX+8ptYKqq>))%x7N*T zQoNU8%H-%C2Q0tkj6LaWcfXWV0oKBS^Q-vmVdXn*499?{&z=dh(=%bm{Pr*-vw%qr zyh|4hI*U{8-Gl(dktJ}gSrc}v>FpopAG^C@b+|)WDcdy(0T2Y}J^BTZFd%*$MfY=& zmLrQeqj*9Sc15QKU=C212}Yz_*_(o;>zHVsCjO+{hr0j)tkFAx7;zAtQ%qd(ODt9_kgUm!7+ zmv5iOsiwx^X{|dj#X}%4suv%2R?PlhG5`0#{7W#RHAX)d+PJLyBJ=;9f0o0)-%2r4 zYn|rU0~61DXX|+|o5_x~r6d&aJS!Dr{9R}Oyzw?b7_*|}-V|6D0RSX5shKHawUU@dZHvm(Aq>VEZZsE$@fv{( z$A2aPY^{sg{$mQ!&If?){xf)xj?O>a7e(|1OFtz|b@Mv<9elJC-cy(jv?+%K<3a#n zZ4$FMV12+dJcJw0^j-{0<^oa!yKpXQ1KiM&FEcYUVfT)mQRNv7@gl2ODB+5XzV3#$ z37{MA{sZ3QQF+&ncSBzO8y|@IXA-7y5Bo*A<-iXifH~?CeVN4u5Cp`&jy8Y<02BLn zNE<*x03COTCO{*a96+#q4HE@uzSSo4U(;fwv;rBXg66V}JOvp386)C)VHC#3wV=4_ z9H$BDE_`W@TnpqGN2Dqf{xaL`;iC=3#9VIbewiYE?SZfrmH!71gsKGRan9|x$gEXh z@~=qHE{((J=^t}L1pA{r)oMNpTc*YQ{5H2Hv{!O}I5;69N<)bg^xl7Qk?iSd^XJ|8|{~ zK?55fv-6?W<%>>knh>pmgEHK(y%oPv`?A>pRfJ35xc%UjU~TX+p#a#I!vpJD0+oALbruqMWOqlt?r=%%2-!#2L>xu@^$B(@Q9qZe; zbX}hQ#r&Vpj}wOw=#T8B`fIIR*{(IiKJEPPm(9N%{#6hN^g)~JH*SV^K6o!Y_nQ~P zkAL~I@X~9qhHKX)7!eLz${C$uz+DJn_-%b2`zatxm+jOiW<9|fPRC0E$8CvObHW$s z!!+Y895~zkXJasFHhA7?9qsVtyTO$TSq8{&nF1{o(29P2u5OKy4nRkPNd~U<@?G&b zh{v&O_y#b_ZIVLj(54cq6dRoF1Rz#llQecn+Dek4dZ)}L741|kqeszuYD(j@Du2^r ze6=d(SzALX58M5B#-GjT_NNB$Er7)Y#mj&YiszIc-_7C~fVI(m<61a+{CId-lfwQz z`=S8gp2K%X_2<|?Ng7q>^g%%-25HGBfL8}ZT+B-XYG~e#lkZtgGUs*X?rqD9*pa!Y zGnxR+qBl5i7tg!VL11geSE`jJMAY?kMBvoD`{+D!bR^Hc%HsCXb2@z?c9!C2S_xr} zUndH%xWegQjZT@bOo4T#fJTP6n}^m(oiQg3{Og?aMx)2*!TMPI%RH02+?st9%$OQl z4_JGGxI=PjT*aGzRmb^F-M25yJa%`O`pkh)+pb-I*|!gLQ9aF}F#pla5W9a&?c%y+ zAdEwhNS%THppAp*=ugM}Rip)gK%k$Ff*-Ck=T3)Le)n2<=GV`KxBvJ@+5BHywr)?; zopnNgN6nx7jB&TMC~HjOVbskGz{zFd_GaG_IDWnk1yAcmJeS>58}RUz>YLyUPyU-J z&Wh;P8$9lO*;k)q`FnQ5=iiol_itIo>FL02&mM1g$K`N-_p%UAmG+-5S!s6^WMrNx0);pSk%8yfyn8{Uf)`H6tE`UPY4Gf6 zTfm3@mAMKJ{%8Wob8zgREK;PRwj>1UqY|XAY7)mJpoViJP3{c|NAL~6z5RFUBZCaO z3JS1zF~@%sI41>@x93%0%}Fx_x>A6KMmy6O865()8>+h^7|lp{Q>q<*u?oD5W?hD{ z)Q}PrHW#uCOBtE}re)th^SQgjjGX<=>OQesK60c^KF~#fxuG?NHX9lzbi6QrhN8Xy zK-h*PQIi%j9}Jv;aAQd*bBKjucoo0RRos8+s?+r`VZVOK7{abP(GOZjIl_cRJ^URK(r;XKPvL z+-Cdl9lZ=eI#V4=lD;y;@W0uBvr;*2a0AK*K)b_dp^rVe9+Yr+Sd57HLr z8W*Is^nM4H_GFirBMqDq0!SU5b77-nK=}jMxpS9J2bhb39#0n;c^B$vBCwHqDb}(e z{)(jUm-NG#9=qF~rT{upkL)DKIUtO>C~f`#ki+H0~c|PO(}Fs8g``h>rif1FaTkPM;~z0|jgxHi5tS9qA#_CIN}#DbrJPF54v4 z+W2Z{42z~`tRds{pXUD!DV%nTYpDF|SiiY%JQU`>E_;6*{lVl8dZA{@8sp^UQ2$7# zhS>WfNZ;V94qBb1bgV7pG`Irue;3TZcK)^L*3X5LJ$yVp`P|dtpJem@${VjmwSSoK zbg^#a&F(PsW}a(IKH;`enV54Je}1-shd{v68xF^3VZKBpjtid1%!2tq7UpYd@f-rAev^YHTB>LXu$XHSP?Cr?DCee2dOVSej;^z~4J#y+0RLF^L~ zMZmV}MsufJ4)1~{_X^B2JLrlU`Ab>=4GA|IoD`tCb6nt{+5j=V%n2qAZV!|9?zM%G zPE0`KpaFeHU1&05ADgjwl7$Vs|JKn)tOmKbqfCLS+8n#JS|X2)3~*^iVl36ii+`5_ zNBL_GN7*Ay^~cs_8&f8n`LXLiad1c2@{I?={9k_|Oh2?g)MjPN?rVpBi^klDBi)NP zLgOQ886Lf8yZ)>}M*7mn!qgBae`5Rt%>Py~|9#F!IQKh#@_6{=Gf(NLzkiPE|M(ec1wdSgQxx6zAD8T zEa^PV?_Oh1Yq)_+1M{UTmm~x@9!{S>8>XhFWfHJEOi#IEKw$usnIsmULg*PMe`1i` z<8Iu2n38mVu6d@bj^zpRfNzPs6eDebG~mpj1X;%zm2m$X?& z@se12bHLGP=vWgi3~c-^<8b)(yxSmA5ij-cI~Fc$GC6lnPU@7;x4!z-FgraT5f}UT;^PUtS!&U!QUs^@xLf_e>CP0$P+iRS97s2sV~JE;%@Ew zZ<`5WigiRE3klHxzgsW8@oMm`m6p=fXZOs<-Rj6mVF?i2g;Yf|EcIpS8R6 z$D`0=5FtRsAz>gkkcyBL3C1ejFxv;SlB&F@S_X;0*|j%|v0P;-4%PW@&cI2dMiwBPiDhol7{ z0r_k}gRq|pQ(Ov;e;khZJEi0O&g+Lp;m8ZcY45slEX*kg2etc;hQu^GC(Ss6==`_& zId5w-@q>>(3jgusFT%4gz7UR`I2x{Bm#{>g$(e1C_?S{eZ+*|!`K<4Y@RpvGMJAnh z!)tgbtCct5^{__UO+n8Ceqd5&52*hqT;T6^k$1QF9G5AuG6mLM0N{8+6k@KQU7m_NChzJ0iIe7 z@Bf>x=lXXpRJqL~^-gt%CgsZl2=}-mUJrN80MZg~utj7Z79sS1y zXDv@~&}JLq>b0wyOpZyqyco96Zx1tbvtedh_IsAGq3>ui(^M)JI#6czj64r$&1Oe^)%8Kq4xG{l&M;;%2muMuwEz7^j8@Wb%kAN}v}{h$6Q zeE9K4+Pu+PA&w=@KGkI4t(&PK#EV`A?_qDO?~?$a7{{~mAqELf!n~-4!0~v##M|ya z&i^b=Z;O@|pI~e%y6wN=B(BqC={v>d@JxZ;DX{JW051xiD(#H7YvibF)2UjeZ-#+5 z@0=Fm>f-Hid9H)sy)4lyHg>U5I@dlgCKQ;%Zp=Ss1ML2@)3#YJXx8sVl5(I}CtTXAcK0U_?+UYze=5v9@le?EmHRbk?P%Ki#}C?H z(J3OFsvHW3Ggm_6_@&S|rX&93cW3l>{hOpkUn*29YU@!{Y5dnZT zS~?z`#wC~5fxOs^b^N@Ob!+G>TIryEfz}wgGER^0^$s5LMbLm$ZgO%mGVHw5soP!b z{4a`;!}iD}e64Wq^v{kBX^*Eh&8WV2`)*#Rb};3zM5EYblrY8nfDSgE8OZH2Skii! zJriDL^c{!YEiU0mc&r?r_l=u3qzP~$y#Misk!jk$e_xoJo>6;2V%;pn3O8_7WG5eO z+_0C&c@IDR-xL>8?i)JJ?>r6yB?ypXn|MkBf&e3I-_>MiB?y+1e&Z!3nx{Ntdo{e%Ke)c$dF7#YP@ zB%AQvY1*x71_S-=2P|PmYrh+Y7+i`^>0sUsmq~n^DHLY!&iI3)_?+_c{5?;Eaw6MC)VEo;_jfmaWouhk*h|FPGo|pVlHl3x#-0V07lwOWF~Dfm|@= z*TtmYkm@26GW0UocyV8hOK&uf7~#V8Q|fzWW1qrdvc=jCKqw*K)5;ektA$Y7%%txaR^ zU)iJG{=0SJ&tBd86_$t;i!!x6dg6Ha>96qg|L@`D-@X#gojebI>vE6d2WSzBGIba+gozoa~x80$)lExWA zI#&9TuKYsXlRm9TP+cOIxIMA=7}G zJO*>55(0qwWeFP42%x?6jdv-7v3bxa7{?{s{g170Z0epXIw}-UyVQ7UJ9gtE;6vUV z*Egzr9Ljp0Q%2>xZhSf8i9Adf{fYtfEvnN}_dh6KK%cuS%zpXaF#XxP;(JxL>;s!o zQ5NP(?fN%PT@8(sQuk-qAIE>OoEuNGRhNKv4D-KJp8gN(n7`dH|62d_)4oNEdSfx1 zyKo^q`P?(%`#TBw)8;Wm=TyjVJUcQ9#$T-(x~RJeosV7gLDex$r{CKbThxiC9B6DFnYQ2+(J%cVSFhH;oD4Uw1- zhd=y^Rq29Z=%ZlD(Qc3c0F`~z`D0z95I{6dWbL^ss0LSMJBR?Fwri^vWTLs$0UHuD zL~Vf0Lc5+R(l4NPAL0T;LQna#hz-AA6d68KV7)1zv4K&M?%dGMo{!_}o$W^B_aQOP zPjP@8Y@FQadJJp+ah?}lO|aB^DWmXtyLSEW+Z$#+e@~eG;*ogF-=yXsJ3Ym}T#q=5 z^Ax-M7i2bfTK4`p`NP(q6N5IzMMu_8r~52z$A7o^2hQ{JJdOEh!x1y)W?>w4%iZhK5}aQ%1=fTDcT@mCiM`X&3Cs?seLYN# z#s4sP4gw_SZYTH56|n^&{*AsqGB&P;zX4|I-EF+$SFE^wz)4Xo2v z!?YyDHn?=}A0Uht|$bMgS)Ur?S)Cf{Q?vh z2z}riI#B9?P~(agIQm5@A^>25Wft`h)@Q+?RZZswPu;smjskZ@e*>V53p=z9I+*43 zna!pHryVEFBx}=~u9CSzn}Y&st8sXU<8o(V`{t-@xfZc!HvbGbM3xcew}4lB`SFMzh_4XsQ=^Xe`y`pTRAzB`J7UlFWIEcT*K&?C9D`lDjE?@kJT484Hb};? zGJ+edzuTSf&*BjPdnUY<(YM@)_c#k_{Y$*V&_2-w`1sgSsiB>Z%>SNUyUWJ}wjyZr z9{U99@!RAKM<)eD=|4LFn~jN;N@L@q)ErTDL?eL30cvoV2k17?rH_G6fJyDlOx`00 zOq{X+-8eQdYE#4yKM?B8mPoBTRHcP6C9|X&&MWhkDKO*|U|7&d!Jr&}HZ9=+9a70>&UH;e($8x9~k|{7a1vW$gKykg3mNfyEcM9u#rdC6L_uX8^ z?Dgy*uAKmbM+f&^f8IOH7jd9~>F2mV>cyavuin3tw+Z{^M!EEjm(w!E0c-JTu*QUh zy!{I>z+0Fz{>1rnGq)zZPX?XeVhrB>plt;Xb$8I2~jh!(*!&Ub?K*! zaVU&`G#uK!pX3>~7Yb+-ig}?pHK@H|Vun`PmOr^)jQ_)7R>%5HAzYqrj+->bL4M7- zuW|lr2!6ERSv@y*je9Ba@Waqn^}{E^J{^^OM9%*9NabG}9C6Lo2i@vgZ=b(-A@2JB zKmYtc!jsQD6OJA~sx>(aBL8T%7UP4I8GJHwhThh6>WAjof~&2|$Nl>Tzvq zgo=%IHaehnPT;L`w@J`vac!t`5*6rIm zT?~eA>w|AfYu`G3dv8OQ*4mP#GsYfxZzsT{cZ)B=8l2&1)ikkm5rZBnmkSR3nf7t} z_U&--(xq_f%qeLC%!Yk?_k}5$158NGY^gFJ>2{G7LI4=zS(&G3!4WMOV3>Wr>z000 z;;0LgIJS>hZbcj4cq#%yfI+nZ^fBT|0dlNZ<+K2u%RI4PyAIlHXruiCG*TC5GG_s)|YeX_$k1s|~|KYkj zuN@5K@TF2ig_oASf91f|5boA7e{$4|^S?;D*p7QEH9od3i248d(@%zf{@(uzum0}0 zQ5ZnDuhYQ9nmw)C`KJC|6Z2md43Ns>(zAV9WAxDiNT1sA0gLhm4*oC&Myr%l2P~Yw zZS$2N>fE`=lTsf@X<9jITdE7XT#i_)YIdRYYgt~k0y@jEuTdPeF47!Q5&GQ z^h#Gl}xntCSnPqHUGx+*uLqFUwXAW^S(LmpdOvfe;?Fcgu z9t^XO-6J8u!7#zjwZ_a`WFB*)y zWb?mgo1Fg5*k(qbsBX!&|B^OSUVYFWPNG40WG!@o?QTdGjPM1U?b`_ ze~LKTMCYJPfi(^jmtG3utCZ)*826tIr!jG1@bc6U0mg@eZ( zc$hs8yZ;tf%ys#*mAj^$UUvTZt=z$vV;PSS2Eg71x8*dn!Lv-K6jmPOfwH_?)2!!N)Brv%Jz4?DJRm-81n`iqkV z`KaydR~T#;V@G#w;ahdLaO7=<7`(5e$XtFzL; zIJhHBNPV-mPfnYrI59v1J{Dgr%EsiXs=-c32*r;R07{K^OlXj+IpP%1pb+hcHC~ts z@QBx^$KuDakh=4;k&%adtpx={)aopZ|MoEb(4jD=WBum7@j#e)eQM^23wmLXk*1^n*v+5#QuXzjKXxBAi^m3PS7P$O_Aqt790f`cAU$HyGS2W(r8xRo=mY1dfui=0 z77AXE2c_ev)j5}Uvr#}}q5iQXh(-XK+sElznzyL5O=;s){k5$tre<=~T-&`hOg(fU z%*nyu>=O@#=?Apyze9}cYBzHH_*-`T#q>uff9GWDk3eA4U7{rpjCYG}pOU@5oc*Cq zfjM5k7i*>8zxz)3(Jy}%{=e`3OL*nCuLT4GewEjbtjoxQ`w~P90WoY}{2$A2j<4Gi7z731iniSgG2q6IZJ z|GD!PskHKQc_8l$-wrN?S(||N{xeM8R#Lnm6qO{w_Ps1DrSbR_Ui_{+CxMi~COkHP zCm36t-nf1vy!X)u;n=ZbVcV81Vb{)G@((Z_+fe6PFOP}N0i_8Lz358Kt`Y?ST1;%l z^@JwjaO1X43y|HuP7R1O<`0Xq)hx`EoE?dpjw71-^!_k;cxR|dFi>HE5FG_VO#5!j zzrg5*u=^jGe=SJVO06r5Zgq0W$C&~&U$tjU<8ctiTt5z190Mbxqj@J*IQQd$zPr|z zQPp3*VW#fiA7;PxV3_^(Lt*MZa~c~@r5OluGf`yxC7_pzfAsGEk&gB|f6cVbHeFLy z8)VmCT6UF#IvGL7@m3H5U7r@aU+MY=p zIHfNXW9c#BSPIGynF4o&0z)MLpvKmrt;59Ks-}Hbq6TsPOQGxiWP^=$aFguuY`-)p ztam9k7ye!cKBK+24Wogj^>)DBX4mvB2qR6JB%FEo-Tnv=2YO@XeTUz0SbD=@c!*DF z%XyN<(px$8H!e<@Y;YoZ`s~?oQW^mhQU}|)eMgv`K?u;NZ6S3*Eq+FVfH|p^!6+}C zcc02@^&0WNe9orRq=pt#4V(q4ig9tV8WnbMKu4ME)U?wxp(CDZIC;Xv;>N8|M+*U_ zVzV$7s%uScCTc0sNcrU}Q(%NC5XXKsV~%ed7Xg5ME(S%@fZ(3Ha*vIeA&)sjUg;-x zZwu3(y(`Ro_0wVI%SXbbnAYmN?9^AQ8O3~|xtO^soVseN{-?$G-;~`y^YmuBXna#z zzw8w44$IN*LGAiuGST<0KkK8qRQxZ7|9s(@@ISx%o$#AiUkc~WpO4Hx{Trs=rhF3s z*t*;1FG^ z@>3kk%0c-pQ{awKVCVz@UUTmlNYRk~@$L+m!+7UR?`!#Fo!15!1`d-z#)Y&-ioTh* zwJh4E!nN`s*;{qfB+KAy{F~#pI12-ty(hS04x}-GfVHoL*V1=O3m($jWZ?n@CNb35 zI3eK5mCI6Lt%mun+rri@Tl+g90L1KoBVot3ZbtorO>6AtqgNWs8?a4rL285mm^?@m z06zgNrYh57))9o*EIUwDqeg{<0PF_Uw$Fvyo-Ok9Jf}~uT}6Z{?Bqo4iuC;l%4mZV zRka|Ska-fe|30Q}aFKHMnF6b(fK~-@EI^xYoUS;+Yuw|W`|}E49wNaI!jN&S-;v#6 z=1=YoQ;**hkBP0xNnI63v8&N4qX;ng5>Pizi}61$2Y;ygUy_|a{(44x`k;1gE)iC9 zaAl9?OF2ypySGHge^EH!2D)<)Cnqh2v**u-=U@6w`2J6R5MFxqm2mEYG5?m%9O>CJ z0sv$=@C0Up>oA1#D_%F(vqUPY6>w013Bpp{;C;KQ{je06dM~!PDvT zd^*MF@JxaArNGb%0I0Sx-`3IS^xpA_qr;|7+Dm66Rd1K&D`BQOv#B1@$xQ%&gfCCL zz0t83D86ADT)U-6-`L^(ZmEbb&$i`w%ZD)EsZY5XZi`EyJQlU33ux;BGwJmoN+mT>lGU(BY8&dL|X{JDT3eXj!dmwd71gzzezkAwIj-}3V%u?UxAOG{! zLIG&Pk2RZwyA$&LGI`(LF#Y+v!^{`%4wLun65}tm^;OIpF-I7GG{%^hu=PK#H#>i9ge(j)p%Q51D(=>HBVg); zbbNy}VS{<`w86s$if(vv-0CTizGHV>?ch>aYR=2sg2fS@+DB`f!LHQf;r#4!`>@t` zgY`Te7kAo>rB5&hH#IdCcJJ5~zVX$shyVI_|0O*3$fIG~R;kc=1N2OKyf-duw*e2s zXSDc`C;f1fe7#IPA{iwxGyryL0kT&N`}S!&c8EpE8eM1r-2UWzxcS?U!p*mjhXpxt zTD&B6PV5m=lUSqN)(edZOgV~ja<%HM>s7>zH&b906u^F$`Tv$otZ?AFsmHtmo$%>_ z&{I8}$F89n?z{rq#`_wW2s$0uKJB6B8O z=p%k#oBJIwgRyv+d@j~q@IOl`>{ z&XltK)1d3T_SkZ0roiA77&!p|RV{aF8*vv=+12WtIM(TDAm}_I!|2;ULgz-B=e^hl z7xK!T6)N1htNd*{=i3f0g_XZ~V(2~G?xsD;vor3r8}h^{jOV@d5QR>_awVJ=Pu`Z+ z?o1f1_#L-RG8Jh6Yzbd}{7d1#{r&$LzV!IxVK)u}r^V3rd#Ol`Te3Ao5OCs3Xs{r; z?zV?k-hNRIHN16O*&xan!Zy)s|JG2|dCg%~LV#!*um+_UL(!0sapBm7aO0&9!_BvJ zq~qx;p?*<2J=k>)Ia%5Hn2cIW+WnXLQob?;HXQ}j2N$Cd;I@uim6P9=#s8+OuUAOp zUt~Zcr?Q-3aj>zvGbhL_4we4u-uW>7@Ik5ie=1DEsN&y+wO%V{Hwb}X{IAJD?Iro8 z(XM}F{N+0)&Idz2Ck#^Em!=kQE{J4u0&6acgmC^3G;7#ocf6PDu2 zo!&ZpitW8K7t`eDwWC1$@7WH&ePd&+Ek32SI8OzP!Fjkb>K2xm`~+uV)_zjFy@S;? z1;A%GThn^pu04?AEe(^ww6p;pdf>tE?Qc90zWJ4}h6g|MU{!QIC;$LJ07*naR6H#p zo_FmCdbxvAg~MxpkN}_|#xrQGQ2u*->Vr}h@j?$YvL zwK)x0dJ&jSF`OhG(A+9PJA#1dh`7(@#=7i=cKA=7ITN0G?%D9&AN-p%0NzrVPD@x? zR27;3;ns)so8cY7K!PoYnbf%GGr;jsK06V>(ptVnc*~cP5eE*(O znEdpV4bj~vA>jR6TCoR z{a8=n<^P_YcFZ5@|IDd4bpo^Yc1SR_csC(-aeQdxj32&5J5LPKw}8*`e614g#GP z)Rj7NVu0=ytU#)GW}a2!6t}~Qv-ty|5r1< zjS4Lo%FybPs()qcl$`tR2vex~fA)}s0Q1a(euGG5k;e`nmAj zi!X$C-hW3v0A!}Pbde$Ja{}7!{1a~R-pp-XPdHaGJ@2hJ9Cw0^Pcgq@SUC@3z~xu$ zZ%b*GLj9rZeJuKCR|@3FVWhyO7XS<+(Q}zrrhpB$%SPKa32pE%M))LA4C6Ts;N>(P z-pb_L#8SkP%0n81w_X2~r%fUrS4tg|Cme=f3k_We0XPfygAYFpXV0Atv$Jzyetuh+ zosnvLS+re5+3`8Pr&SS<_Kbj9B0DuPZ zL$9KWLIW*p(gv7B)%3`os1;C~pEVlm#DF?#p&Ph9gz1O*=h(mIifR=V&Pg)`Mt}n9 z*IM#3AV&d!31CN{+^a02&m@rxxOreJHrXfa3PLq|6L^`jT%-CsNZXT|(q)7Wm)^{`TD_2puolyD{No(q-3 zI^s{B{tH_x<x^UZEu|62XJg5=0dfeoTS765Dz z;d8dVQK0t;y*WZR(K2BBpslA;W+{$ve#Kcm!CHEQF?D~?l;g{cej4maYjMCA@f(hE z87!XN|C_gNhW9`EFns*U$J*$a40BuN!tC@+;N*aQugLgwR3J8dNc0f^#AEHqFV&-8 zyh9I9^{6W*0dm$9>#VT&J=sBGMX(0duj;tKiT(3o>NESp)RDdM2*K!w40S^l0VjfY zQs6>gsY&w#&5>AwSmB}nTDgFk0&744^|)rAu8)f|z$L0tcPh{PvlO^F9uVH5c_kt1 z%A6sF6;rZs@w$BITn>#7&V>Nuj~U$t3U$|{ zek&pootwUNDl(y{=+uNL1R!jHiw%vFr%r`mKKpd|fB)%!gr}Z;CLV#zsU3bLX5QK^ z;k4g!8#d1F~Z!uF3ZhJ46 zwJk^v%oNyA3S@?9>T=|_9ferYCJELzf30I0slY_%> zPw{1ZR&Sqp93OXfu^Qp@*)!oiX#;$6{Frc5!=7Ecqr<>{wEU#9zOBSff zv)HjBSy49YUjzXN0Z`-Qh(x_sSX8nyK)`PwYgM(!PXImwrlf{CEn&c2)i6<&<3Ih@qFyWInd37BhK2%kY5j}6Ok>+RcekObb}R^E zx~@3Z!C7)VfxEQLQPr#QNwL5szyV>mLK0S z=QU3p)o%a$V*F3Z(H~}A>pN_(MGaPogN~yg_WgMGzfbo5`*r7ifVr_Q2LH;nYvH{Q z-Vgu#CqD@P{X72@-juVy(CdKegLaw>ii0+T zGQTvdr*Ycie5b#4_a3;S5P*E_9sC|=&sGMHXM!U?@Tbe_<9S+m3Ns-9s&YutKm7PZ zZ6w#j-d%gb%&eTzajaV^ctYCkiCt+q1`M+0i;E`~J`^iDGD`I5hGJynsGjfcU>blb zr@jdcdZYpOe(Bjt45dfoq9Top>fUWK57-@Qcj@eDG%&Oqvb2NbbZ{srO%>U$P_J-PS*`l)}%|~AC<&3{}_Zt!pH>Bzxj_Y?`>ghKbug9S6Fz2Beh^e4d z{lj7H{7aA>{Rj0;VmUOH`P*@=SDt_AMS1!E-{I#^{VE(iel*;^Epv)^8B=fTBLdnn z>T10b4y2uYo(bb;SV)(4_7kkdr+0%UQ8CQkflc@vuf@@kY%OLm4(nkK-Ra&dT&MIo zJX7FKQ9v9)zA^Bd!6M|77nUc5gA; z{{e+7tWA!cJQ05R^i$zi&pZ|0`or&aEr?U^dLmm|uW6nF8M9FCJ?*EicM2yh#745GDapO`Xzg@{7-oSpZI+wBT!KAs8vo z$HD;;LX!C51lJ=?+rdRTi@vp8TSD!?_E4MOVkZcoAs|K_x;LVVDVZ#9i~W2B+5k@f zCO86;vga#PU|cEC?7IwWoCq*BS^#mZat25*_J4R=K`gI|r?IfYQGT*JpTM!I9Qxth zZ}QPYVM6Nv@uZbFCJWZntme*`D<`pWr~izE-x7ca2?3%&V0FXr@Y1?eG7%413MOju z?jQE)Cm~B^o0+WjPh(r3d~)Jgc>0Cs!ViA>lknoJFGc5nMSFiTja^fJ?C3q4W=lm= z=FDHfSs~3dz+o)T8Bv_J)n{xjd_*K(7nCc5vmea`U%^BW3e&F=~3`=R5!LDJlUFXmDtld%VG? zxYqQo@ucJ`;wU~_to=QF=ur6Dm%kdm{mpNMFMa;;uy2pfrPrD716?Xea zXD)}uOWK8!4eB6jr&c(w2x? z0c%w`YXou*SPzS5uY_A~9Sb-Acrq+}ay~5Toay>iom?REgr%mpLcTcun~b~v6H)bf z1@Ii5DKHiksH>mV>kHx5t=m#=N@Mb7ue{q&`)=n@)mMytRi;rj?fBQU`#kZP17Z5H z!_tt_QFCx>?DTUDGLKox@?ZSh+>$*%+FnxkkBt8XnZ2O}ur$w>lWfj6(G?Sl8EO7$ zZVPwG(ccbi{S`hSt#9185kC6llkn_|&xN1;>X+g5H(u8<#@a|wzq7TKeM{CPmId$j zT+Y&%dx!BgOoAy25BNGo=H3JWgcjj>c6`LO&)33ZG!O}a2el1biYz>|OIwJ}kC_5P zOMxr^7}`&h3)Tw-%8Y!s6voWLfBBUrDi8F#@Az}~Fcy@gOz-hcuLfd^%vK=)Fdk-b zmfoK|4md6kFWQT0)Wz^GO89c~ zt>fY5>mP@OW9Ouqu@LHVs?^OBHTM3d`Y+pA7SL@LF`M{n<*H>0bfo}7fCbqg|{`KqE!yEGK|NS5T zAUyTlGvW9N&0F$Uly?3T({EFfGybg&(RcDKya-!n^u3@(VSuOgIPTzaO#si!^De?U ztcA5>;M;|@Vu)C*(CwmfSf;?xQy}{Q82V3?3)qbUjK95&!Np0&Fs4D?CXRObB-}oc zaCZ;?jwhuwc*j>>X%I(R%QwLk)3m}APad!d&hp|^fSWgOg-cg2hs#&4M*Hu%IjK|1 z3p_%ARJT;Nu1{pFML~47G{rgcy4Wch7vBI*96p&ZAgMpQ@lqevR}+2s0jPT^^-L*<&Nzu}KVzCSsV48<6{bITSD1eMo-p;mfiSUu zyHx#WLj_+nz^>JW3?9Z`W>(R*|Ad%-X;p=*jNvfI2gBIjK7nT2)UVA0{@Mk{`&%gNVa17>O>k!r>cCo&3`oOUB^EHo$+q4b#q3(952jmjtF!Z(m8$$ zGkhM;q$o$W5+ZLv#bo^Yu7n$Km4jXuOz^OOP@RAUK{Kw>i zXJE(Zns$yP1gP-rJ4h^AMW;5+Vld)}?wlULi3Bz6(o7%(&~IXoc566BP>rp@=>@)f z1-#0D>VHk;(9)>2p$t}zoGMdbQ&B+uRR3XK((dG@s$kp7Fr_e*M+OT5=>NK2;P)Rw zdXZD3j?f6eVa!9KFcS+@czmD=_OcPT&02A7=4vf_t-G}KK4*gEcxu5*n z1Wvh;CY2p^+cEVfjL^r3C;r&3Klc6=dHSzN6JQYL9|E!K&ymEhzW!?X{!e}se)aTI zI^yqGxFro6%}xaxB8;XnIOAW4T6#3bJA$dMeNe!d^5SIFDKU0xDK0&G zpx-0!6#)}&i{rg>m`lUOv&BbyFFt$jtzqT^AmtBS5vKU;IJnQw%!d7Y4}`CN<5L0$3FYHuxrQ8B1qrQ4UR=Rc{Mb&pbA&DxVoZuP7D~wi**A+5%~zH$~3@^4%Cr~ zgq7D6YepSR1QxZ6b@R>R;r4r{!orCQVL>*mbvX^JN*FPP?Z1xyYmpMIS^gPOrod*P zz@nU$-4vs;h#<4XtZatbwXXvV4aXrGF9cK89&SxSg_|S%uaWF_WU; zfN=1+%D=-|nB(-j#ai4Fq!lN=Cb&YN1D5U@Qy$1a81)rHWwro}I23Vf%0 zWeQ{pET@3R$y@RR5PboRNk4&2i93`UtNfn{1D2C#pb%wH!BlMPRH$v2$&z;bC-2!U zreEIt@7WousG6_G#W05uI(qfjJakS1QTeQiUj1D|YCZBDYMguw6%bRhUGl3S&9R{4 zXDgbcqB+KZW#<^bGw05R|CF8o|N8gug;!pCEnK~(`M-3Lv9&c@V%U3P@*TLy*b`QK zZ^h9r9_F8X93Kyz!+=V#@r^&aJTH6mzrF3|TYjD<-!lb9odQ_^FzR10mwy=rj6q(R zA%cNsk}!BfQx*acR>tG7cE>)um>yVzH^G3Xbq9h;NRZMQ4o_!z+rtB6rUZtkh{Hmnzh_rUjRd3v3*_Y^w37#9M&} zMmw?zSx2D8Iw|IVn@$eUdCHaDT71cNKTNXoCIDM&tWg!!mbAca;MrQgx=s*SeEU?W zzkfzr0vEOW#m<*b5QxGVZ+B~ybw-mZFv=8AcUY(|N&`Sz0J0HZT(ValvWu79Yr-Y&Ha}a(=!s)G z+V2P9-+uf^EUAp703bY|b$#B$h9@T4bAahKn45EiG{_-Zie z-ShRkr%@`)+#}+>U04agpkjW@!*fWc!01vS3jjv<+vSpXp@1{eT|k;qiCJ=9*6#-3 ztB*1!U<@uX^{v_f35K*TEGXl%GzmvalLP~nPr01MyjyXQ8;$_??A#R|dHCV*^{;$2 zeDzQNEZld`yIbv`d`fK#%w)b2}Cw@l?*5zl4;uysdM5WxA$ z5(Mnk?#oWuTcQylyZ(53Kw5vSSFXz8cDGq%Xh9ggI8zW7 z2dt^b@#0gnKt&}LI^c{7$AMa~#?J)3&=ly4&ce9@JWjOOg{y3tlt*m|9wc%B!_--<~RK%dGVJw|4BLbo499(9F^*rRBX+$JBPNOcC~j3$5^$X zu~bL-1szFShw;Z3%|!{H@lCVjn6_h0HgSXqjKGC)9}oXx{sT__<|K56dme!P>Jj0_ zt()PkKfD!w`iq~3Up)C__|2=YgcGMuM!{Km^04+~>yYAek>pm0Rv|%xXiZmy_X=2b zR!S3_9!Zv6qDA3q57#zfF;#rFx)y@-W2V3+pnz8L`N|a7d=&5jyOl{_UQ;H3#2NV{ zLAsQdi3FGg2OeNeC7(AYD;Ac7mEjXyBhJsHaaI0e95_7xdL1058PE#jaLn}Jv6BP{ zCGYq*J|hI+*q+zl{9QP8`eamtt;sy#GoSu+*uGshn>8&MR+|4JrotZ;2F5?^s)oj# z2?CI7F)V&GFRg$}(Sc)Kej8Air99>lJ2uiaDnUk*DKHuokUmam=yQXK2s4EReydVuMd7yqh`@8eXGs%**G>7Te?9{sWH7sJ0AyYj9rg}I9<4?!xv zO|;WrXI_Enztr6I?}}hEM>anaH|Ae`pRh+e{@DB@2teCxz^g7{%H=DU!yn#zH~hyh ze-VE9%v0fm4?mRW|5itTR)*rPetIru&YGn7o=gQ&Xc5LH#FVBOM+%U6-j2b-QW_8U zdwG%tZaJ*s^c0=$%hPp&%;A{=qeX#i0x(+NE0=Zv3KW^*m6EsH87hZG4toiWG5oxG zxZO=HpKxR1<5PTWeFxqI2f#E6_NlEn>^-Hoyi>kbPjDDc@TIE~rl+UEm%i}D@DG3e zx8d`j`&>AD=up@`uQQpGm_C8``lP%X7qvKRGMmvRGoHEZxbjO z=rE9-8hi(o*C=aG05zEUnQLL;J^2aHugC`PE=#`#YP9*v6c{54FgD)Si2%_d zU>u^xW1QmHP;&$ebJfE5a0Dqf9S9Ek*MR>WM7oPxc{)|W0 z#rR8DS=Z?^K_{L>%_^VR*0T&lk6YgiZ8Cj}%08KyNh_m*5CESG16~NhZfe*6)Tz^Q z@b{{0{eKXifAIx*_}7UFY4Op-?o4^Q6VcAuUzyo<`~OtP@(BU0@vZOFZzUf93AYOh z2wB$7JA@Ter)RHc3dv8I0-KEjSpcxvzG$vbTMF13qSwWq!4=mX##A#IIS#+Wa9fs1 zP+$RR4oytEg;_lCmNv!nZg`qV$#Ds;lXE~X18H0ffifk$ylF}cRjL2qb@)*D+#{cr zZ-74wU(@gK{sUopMrQ^Oa>ZgQPgLN~YNuK1n(-(mm`rxWm*_PJ@=cNkMjs(dbQma= zSsVs(dO$R#(9VsU2&{E=V{_0SHM)j`GIcZ)j$aD(kL54m!?QXo`*NsrWEOrM@<{?~ zP5q2-7%8B!6eobUq+Y(LUmCNAv9N1brnpm!SrGp)9}?4Fk?npJFaA2#bmFev`fZm7 z|6QSmCK0>Lj9HQY8l1`OS_4d!VEVP&-+bw#y#BSrgYb|<0n zHq9NV`!j#Y_CJ1{0YA;HTergTQ>VgvAG{ZyeewD5vtRr&eDu+W^0TNDe+rurM%T21 zZ?Yq`p_s4Vo%+ta6K(}--eOsohZ$ZEr#|Jq2qsQzhVdabMxHF+gxg}Ru{I%>M=q7g zp*!DO>(v=D$7BkOG6k{#V3faJE_+`TFlIY)tUaVNI7?&T>Dh7k-5GGd6Yk7CVfOBs z@|qT&&eWG-Oi*AeAj{YB`Q34lE?sr((VI+nYd#KDlN#*w^mN##lLEf|ttY}i{>|S< zvw*qTIXMp;P?eBuDYOIujmu*GKbHFWDcNmCXHBV0UWT!}vnFC;g7YRh)CzJKh~uWp z771Twnu37nL3DKy!>1U3LjQ=fZD9NrLp)rpAqFq1nYn|yR;uG=N-N(rvj%CI4 zqxO%_mnANFfbYY)|7ZC4=+SWL@@4e}XaE`Rp&FOSI~ znF5=Q0@(@RX8WSKJ{>9GlSyHI=m={QMtL$w>3lNrdqU%RklvqdLIReb7C1cV(eQa5 z<@gBH{9~}dx$l64!*C|(1Oq z0)pZsYN=NEOLi<+#K2Z`0zq^V$U+h=a~5{g8)tOme(~v807DZw46I=5ileKWi?;BN zAA21Z;E*2N?EWF-nU>lw$9ZW{S(W3!s&@aXa_SZRJMgWvP)BWeNyU_M=POfSQ&2$d zTK^dblOT3eRLm-&y4hH)e$Gz6j(@G~+!Chl+Z(1HmNUP{?vgXV!(r;va^|OFjhPS|W!3B#gg)_)Ou{5(y?F<3IM}Oq2M`o!gp6`yJ4@ zEHkorvP^WiC|dUUeQ4*4+TFi==}LI@jo*eJ{p=^<>F1scAAa;vVE!jAT~-FB3o^2` zfHCYA=8(2_NpQdzJYgx^;4BqF1ZVbBK7<)ObDzcYZeitoz+>U@DZ-N`zNLs3m>Avh zkLT6*x~C(?9FZw7{1nhiJztpu<3s_QD6Gc4tu~k(G=Ihkg}YtgS$b&`2ULo;H1^l< zmCNDtmOBuHaZe5g%Xl1?Nzcktjz^8o!d+nCxhFUl1lM&+z#rdzCtSRADV#lbKAiZ| z)8Pw`eJ&jN)RC}ti*~0|Mvh?RJ89Upkb|OzcC{YX@o!oHJ*UI)6YjC>P8 z#8U%qh6X!dFywM{RbdBSj<>>AdnBasE?f6gLy)#Vgm!MB7|HLot^sg%8E{P#2!+m7@ zHGW*y?-CCEu1iZy&zzWoMnJxr6o?JeOv9uVR@o~vF-~@oARzAgH$QLR5z^x?;&L%hS< z;?i)WFjhteV`28*8s_k}Q)T(Ih84{PBGSSiU_EU&xXH<>@Tq(54&VIB*TT2H{>|{% zqmPC?yY|RuK$8J2;Oyryo>wpCKMDclkS^fWnT4NMq90`A04oQ9(LaC|?iHMGMPY#M z9Q$;K)+i0_2GzyzH}t*g$1X$@f%=Jya`q^J00Im74QNPXAqoV>;hW?-Zb}N&>xK<7n11YFAH^5$QWX4f4VLzt!z^m6J5 zV?ARD!bJqZgxNGUnzUZGQfqL>42)}71 z{6%>Ax37g;a{kx;vYmb!if;h4XSfp_c+w7jd}}i4&fqg~`K~|lTqX?Q$?)4cgJ*m9 z$ zCk6cZx4sqbK6F>q2B=oGI9bi5UFK+G{)re#JUp`yjB1~$KC3~$>C)2JaP)+V{(jki zY8Nja|Aa;WPNCXw$*db0a3ENh)ubX`JG4`3{rjV8KMa49le#lsgNcRl zoD*Pf=%-!&I%@tL;ivH-@AP;24EmUi=V)YL>wi!?{`1lTi%$MJrCB)~M}F6}>;K8o zPr}nLJRg4ktDoyQ;5VW$pnYm%_!IM;7~{lztE{>bvky~mVF_pJE3H-8&G_wZ-KzI}Vbwk`4w%`VcQ7g=e6*tj57_tV&aO0^vOcN{`_p$5gh8Pmme zkp4{QH>(ArgaKijGy`_XX`mMVap8#hfWxgP4fO3AEby@v#nGb#IQ8QfO*`PEggW}3 zbp!(J_}!2rK?DNP_rrP?D&x)+SRDlxHSW~q{Oq>Qo?nzkz|dXIzKw5=%CvU)xoa$_ z?PZ65SC~AqM?3sGusP}W)i~4;W%f;|F&Nl7(nTTA) zKTS_X4CDI@SB)?iK@O_^`i5~__v2yt?gLzCwcM14|8p|w`<)p6f7j7|&;91t(aaCe z|I0O9Vgrk^B4_>+gI_FwGw~i)6c~7zYX$hb;Wk;dJrh%wT^k<4J%1)Nd-gD5xtu6= zcNmK^Sej&J{+%NEo+;3s0$Bjiojy5sj3{6{Xs;_3XQ&f_%IV8^h-(+0!nIgxUaev2 z9h{bL!e#l`J9!vPJ0Sq*4VS^Rdnb&GNp$O$t>MT$N5UfyJrut3Cx5Enm&5+Od&BgU z7*L;!4ZM%P%6ma|;Mh5A-sJ(hfitM9?jHbDlrLW;3b3HZ9D_w8#|LhcnkXj-$W$Q6 z$(IQO6vwJ);BQmPvCE6Tj~4a~1UH-}0JASm0KVhmCpuB!C_V&q#2|hH;;x{W1Md91 zp?1NZqcR2V7zNZG5dz%4jTXSd#%lr4cO}%TsGmpmZwXv$?C{G`=Ojn<9o}Jf{Fn&I zn?F8Qs`P)xhgObgJ%|_`n5zFHEYVIsK0;9M51jnM&OZVH2~(CB|Me)tNaNIZY6^6t zlRv!s?~!?izVT|mAq@WMGiSnwpL`fzc=5&P;s2fY-VK+pYAm(|L4k7Z8SgT4?%>YY z+r+Y5K+q}-aQKuyPD_@&8Q3aNAQ%8+{+BmpPwZuAq9KJx^*r$<0Yk!)pE3o;j{?~V z;P`#>T;r}3U^eNE0ZkK6k+1Reez(jVwv%JOVv)+QW_mzay>2*p<_9k0rC^z(s^ds5;v;RZ zmlCi5s$tiz;YT|j6?U^vT#oE1i$5G^q4yS0!#EPLY%`$L^?d0FK< ze?2TpFi<~pIey>9EeU$~v@jAhLZ0)LDX>u#&;UpmnUHX;-cWmnvAt7m()*@!U3gH} zb5-U(lLvQ1yZx$E`6qNbM|IcMXxm?r;IBGA9jfdU->J(c3uEe0=f{DcJoncxiRs6K zf3)=%-QqERcdAgMmQV9zqn*JxePCO3!WwP<8MAF-9;{MQ_g@h0KlIO4CBkvpCa5+VDrK7l+zhwpCB#$%GFC{>I~bY zVM5*~*_Nj-pvsS#0%J#kJ2;Ds9c^=kM~nhYJigXhx#&zLX{G3smZdLFG|OSY?ScTj z{oA`u!dijGcPoqIF&GO2j(7J-VCC@qnb^Tyses2BeNdLmffU~a3amY((!F#0%TNp5{a0ZhWUajxs(i+zK4ovb3 z5Z_`xZbCpvyK8P1-vD0-fAPd$gvTCvG#oi{B<$X~OS=b6CbM0l9>W^fw7`@tc|*s} z1v#Ayc$|+5%tW6aQH?Jc#|LVMsiIxN%2qMsXjicC6r&N38}#+o22cp5pKn_~D~*7Y zQcIN&0iI0|Aa&xK5(;2SARhwF2D|~K%vp{l1vJFm7Bht}fVwno)?5exvoAqiWcabw zpHctZHXSCk!(Y|Wd=q=Oh1x;g<;br_pWR4K1ydcgjG{jen11c{qrs1pwpt)pMPDrhqZTD}g6w-65UHcShdA6C>;Kt;{{|9#@>mQ#iZz4g)^J zX=$`W5SNgss)Zd=+c+lqL`8GtoX{Asbp9TNd|5cLZP1n@Y` zZ$bhAcBSs*6&sr}q*)=6;{R3cD4vnfN16h4IfY!*af9{f6GFR;I2L2~G5#bNfHBEe zroehofT2eXb3wiUZs}A29|s4@N}5bjMPHuWE3(h8NB~z8(>Jk4yZK`DBeQ=%%)WN| z+3}AWItU0DJL!^9C1IeP2TR15i|s!Bi@t_>{~3+H7sO0TODD!j%{=y7`fk2fpnyJN z-0|19->vVvPfS0jxFDP*d^K~Va=w9g|KrD^lRtL-pMUWMdHX-6AywmL+c~n?wv^Vg zrjha7$`l)1D&F$<<>|m>_)K7sOaKy|R>nVKiRm21@5DI1^o+Kn0-9+w^rwC&&4 zI<^JMftdnhNr5Z?7|YL|E8PzTY))Ny<N3$NvZ$u-n}P$^Q&JE|L`||7ao52 z;jn#P>Z>|Mpt71pEDKTFqjq3N zm^>_XejVkBia*}@D=r|GZTF>1`COy7Q7Un zVwOJ@g$B!Gb4aE@rhvAA@|7u&DbS4qOkBP2oN2;I3<>E7PwAP#%Bw1$7!AfJOJHoa zbLW4gv$9w?&-f5%$a$5eWi>|_iu_(wrCn2%eK))N z)m{3Vz47dCiF+!_+5yEOlKSXJy)di7)P_FfPW-N+@~^QWYTM{Jrdhip zY;H`9nW`av8s;^Q?hx~jkd-^;SB!6IbnA~4`VKJuw`3l5_WZf<(#tP}Up@PDcyt@aBMy8;v^J75wAy9)^Pa+pSpsN=``ROgd-`&^R>t4pTVY5`x3MeXEW>#` zcZacZ#1IA1WG#)y7t^$V?wm(^_#B!kFpd<+0)TP+>bcGXP=Lv&|5Xta5ffPXO1ONY zGKSq@mnDeFi?D{z;8HlVZ9Ptw=G3nAzyYm^G{mG;KpPBQf?z~pP<7N50sw3$8*^e@Id+O8 z<~V+?gY&{JSjRJproh5qzvyeh7pyQUazGa84AZ?uyH(MNpa9s_q;b()@8A^~C4Fnu zru|Y$qT|5mLqN{Q8aNQ-%yBu5K~O^d~4`g$M8+;&<;Px@xlD-R};fmm70G|S~g9N zWn-xs+r0WbjQ>sb1?=}>^l|1#|H0uZ<0!WNQ8=)%#T~uen**bE{DTBNVW-*xs{VNS z*SH#wZCy>JG)~=?M#{-kr^AQx=>O*L-weNa>R0me|9ZG`MOtyCL9JazFwzY4D^0

      fVcT_&R=f!&<-LSxg@=^S3V=B}Q(&wqkWB!_`t#?? z_d@~W8;YDnx6}#F`3=8YD&iB2V*)1SWAP~rC>V0PQg{k0s_k36=izr@SOOO_xRl>g zpreoXgaZ%R1ht3rM6)w9;la;582GzhL~?x!Nu!2f@oUKYh1p2?cOw6?d`*&tkn&*3oFdT;QVo z2*^_)mq2ba>-9NC6E7KsY zZgp{(&i7(@J45A|Oo2=R_5H^m|6*P_=a!Hu&?5yBpV>>dF_@GlWzw%-08)Y{;W9=% zg?V0>1OQ!T)Y~!dbry>8a^^n0HzNvp5@)zm*&W`Y?N0uv|9|1J$HG7U-G2#R{^A$I zf&B-<{I>ZpH6^BU4Xy@@SosHl@r!~0cCuLT#v-*Z*BWFyJ}6k+A`rl5fE)-`IKB!^ zj3@}uA`eG`b0xk%(=7SH!r;${`LFc3$Oh4)o5au=G}JHC^G95lAkg6%Nc3+&Y$4QL%Hgwt2HdW zTRQM2-0i}^(ka~I(mmlKtQEI~b^n{0|L*k3v6%v83S-hF%RwY^@;vb7G%nUa`EF%2_0ufF)5It6q%b0(bOaM&Qvpc|+v z6sjAc3I#O#v)Q{p+N+(<8)4-Zyb-;;l1tiZtmv-h^PzLUJ9;N?+cjP;DEZb8F0jJS zVX5?iqxU@9f@udsSf&Jc2Mm>Wi?bZ;T$*&u4)FU+1>D!Zb zy8j37r{BK)yY%}%zLQR$K4ZtW*qGKZ=&LAKcs(YS>+)WZ-Z4j>!&u$G%26L~x$+O7 z8xS(;=#RVsoQ@JzMpLo(JjaHoW{9MAUJdK@s8ff#K>~vW7MH+a09af`1H>SKUI~;+ zaWBv~BW7X3b7k29$PXA&Yq&aJNt0@6rP9(Y96KK6|7&c+d_VWY6?H-&Vjm1LkqEfEU5&s}zQ%CTEcv;pm<+ zqoI}@4A+ZE0L6-sbq@Pe#93)TOR#s0Rs5`sv0}exXWDFgv6JoBXGK39vV$aTpFRh) z&E-#D8W}tR{4FcJO6@x{rS{>d*_JpV&Od; z!U`oYdgt=i5PN@)n9(SEhv38k?wz;OFMs{3^!|q*+GqW~ zP4n~D>~Y$&?F^;+eQp>T%9~7}C@<2R_YPSq`J^?C0m7rn)yjEO$p;P?kMnKg5AB*4 zG?e$C38-+nnj8XuGTe|mNMMjamjrCKHiSU}g9O%x1Q_^MHgjVj4I@Ad)_f^I8j9C+ zd1XPLpLCkVY2ea$_1e{RZT@}*E0ZT za`6~E+|@bAF0aH`J-1u8w$moZ91fS2G$WJ6x-!`=&ddgeKy>bA?A7EjG4>eWFvTBN zd!7O31!Vc#Ga%;K@LYIR_)R^z^Fn46+k2xGW8=99nMJ$LTL9QrVv7GJJ3Nhp6F1r6 zgKR6vho)J49|IEytKBf;6LPp^ikHQCI{`T4^I1bPGAy`)RyIz`MXuFrIl3v+nmFJ+ z459hFoA=a#ZmA5k=TV!ULutqJ1O?yrTCza8Mm=l3$*vaEG`Z4V!1pBDpVo^wy|Y$E2Qeh%$p#eejE#@45GTcL-D zvHX&XUp!hgo)!QAKmbWZK~zdGa+=2z2F`TQwn1^gA6ub#M^_N=sJm}Q#~U|prms(a zoBsUQKig;hewW_;%YUWQr%tEq_Enwfi)bq0D_|_6La(V@H}6#jJWkIiINsnxeoMnw zxx?Q<0)qrrE`h-VVC6C#C_Lg4(EPldu}>064d-)vkA(?L8?IfBDHjG7xOvu?NiqST%{s&;WB|!I)Cfd%2$C-To6J^7Pe#&jbI@YGS&FOpJdosQC;~%HD-gq;;@#^d8 z*=L?f2lnqbJ<%rz4!ty-g^r(^6mO<5d#F3ia(prHWeU}M0z6wM6e0Wc& zhRmKTq<6PgQYMw&9!Wn082W`Yo$W0md(*~y4O5797pF7E8clBT8 zgXkn0zT8$9c|w!%c0vdz5BpdjdT{ac*z1`K=GPyv+J_o36zAKbZ6H-km`|bKMOU1E+XzPWfJ%z0sf8Le*zQMZkfH zsvO2&r-WTvZ*1vNgH;(>*dP2&f!hL{blx@dJ*d{B)ym9cYGH0P@R;~#j;b`kFxv>HEV>)DM^zjfe^JQrZ)y>TZUP^WY&EJem5W-Ho@ z--FfGfo=AU%8$N3!M9+#C+U#^A01%xuUL&NPN@-ndo=1TPOs)OE+LFB|vWdZ2VzsJ9!z$RMOb0+G4 zg%ZM~tklxbWMz)J}H5{g zBLOuA2;87d(QYQm_6)n5{1Oh^+UsxN%;g_(c_Fz^^8-GzLeZ$$?m4~Uy!f%&Dc|zs zX|o4*p8f~N;{kI zIl*!gwM5gHkfG)s@d~nZc`&~@9cC-Bk1dZw5wWIW%0BMm+!*eDEtQZDj?XtC*ZzZi z{l5wBQU0y_vB=#-UDD?`HUu>vB;)#A{JLxZF#M39u*l??rw+obL?_hJC-?upSE)D! zP3jp>wawNE8y{*`({=vK5E()DJC*SM4RT9#q|*7j4!e}{_G>hL&rcN5T18#dWg(`% z%OA0&YbybGWaCf1{htzX;sqZt7tF5Q_*7~{MpVQ zg_cJSN$+ftK zdKx`A*t>y=dD?_u)Edh-DbP4i!}PV# z#c4qhEGg>dhuaLs!ZAvlb-XjNOOG@~;{&V#;ZI4

      j_Z>+1Kxz|USYm4AB>Z-X*0QFR(o5cwmr3MZEgs|gn)pL~3`ypzJRTtPNyWBTj8`k32BA*zkhDs5`0 z3ZN`#O>A7vBZtrSu*E0TUlhYS`$-mTvhcjKLB7kdYy#I>@GFY-%sPOI@3Uco9Xpnb)#GWs_0DPXDlpG-ZLb(PTK7S&2NGJg&Meih zr*BZvGO%PMP=rcYF6dQpV?%!=0xcrsCsYPlX}XhCTDW&+s`a_4LMPoH;tG0v9w;J% zozh2i$Q{%)>+yEVDBQtfQ22vYm23QB)rs>Um^5UF7!fD(E1#U2pa<6q=1puxlBr9q z`ifO+Nr4f{=w`^mihUIiaOx3`U12JP9`(_y zou1##&gZ|{#gd-Nl3`UAmF3j~p)Blv0QTGGa}UE0Po~dNE)20{H}{{cKItPZoL!zy z$5c(huJP%oSKxMgAp%JzSJ7VR%BIVBKNt2g{~}k)P^f>wTjg)R_nf~$VTuMIS?#t) zEytL+VEWb7H_HF|cGj0E#T@W>Qd< zdlu!PX6s>iP2^!Sug-+NtxT^uQxsLw;y$XKDiL>{H@ z%yfiH!?3h4LIGb93II0{C9wlIRoH5 zLq;z@Jj`mbcf|SV(nxJ7km#wXvh`Ue)`zk+o_w$DJ-OVT8d)H)#&Ol&6r+&xO*$oP zkLy^c3qto@TzLl(n)a1?^2SU$h0{6vO}97>*r%M3(5l?st^rU?aQx?y&AeoyxK(FP z=ab$uM;Ih8?4)hA*oLsXipZ>UJeg~5CX4@m7~4>J<@LeboT`a&6-1s7!N~KL;RUPo z5DCmL_H{Fk-^f>9gz%*7hErlB@)Si5i=}Ao|F1LI834M;vw)6q0pzefTlRrk8T|); z=XJ)Spe+98_mK4!bRf5ML`>~R17!cRhN#a`n4>B?Zv(*_Ta=Zy4j_K8E&TpPnC9_E z=8OF(wloHo(A&0{yk#`?HZ8V_bP`_FMY^0ounxequ5gF?7EM_!&9Th>5r*|g5H}Fn z_?!YTeN+@+4@f3iR`@UH%-#)yv)GOgehM$CI6P=P{}|b!VL`Pm|1PP5f}K2Lm1V;Y zY7B^sz(B&`uh?U4?$hQk*)J9B{oFXl>ARNU=z|1S7nEVXn{Xo&+)2r^*OPo6tZ(jH zN54%I2D%{FuU!}CmVkToOb2>sK;^Z6Gao9x{EfLpNzoO0c)ASzuhaz1OgeMN_f>^w zUb_krV9Eh1%Q6Kwm-WIWcpqO}+}5d0xjeM1c)32$$tYulP>dpx6lvlS-Yc(Ppo1KAlNdvk*#WZq1zBir_5z@=(5JU?$#@ACDdC=DqqlL<@MS^=)@+vn0u6v1EB1HJ;>P zWEL+OlgR)wk~MJn+;?;7k>+`d71h8-i(AdB<&F?s)?MV*sUhir4`G2r!-e?3c}$s_ z@WbWCL?0QZ=mOO+y<;y;aJW?zbfh4;_0k(4)-i5AwC_no3c$-!!(}raR4imYNqA`A zrHOAr9p(0@c@iTfT=K{EfJ_uHZapviZg~jpUw@x~x8b9C>9<1<=SvLrg!~Z;IKRd# zb^u-1vLhvI;&GZz*de_}vqt02)c$*#Jx#KDvnxBmyEry#JkO#FH6e4oYk8rG>#7}W z4%~=$lRFsADl@ArmO_nZWs~@(x`@ZCQ_--{6fvvT@9wLOh9O_$pAq}C??y9r|MIZQ zaoGrbW3!(sl0g2Asw4k3CmDBC#_@BoZQE3q{8x*#yBS#qF|z>&XL}=jQ`EG2Y0zSa zt$WFeZibiv9L~Hma?20A-J2uD4&dD`Ij1>3jNMW;>A7>qm1V$kg37|sF{-$KMIguN zZ}~$hRj;0Q=GNFr&i8zOFfWFUJCO5xC@-T@$6tAvn)g+3VXaJ5*6W%bS-TdqEL*a1 zbYOXqpJ0mP(7N0%ho@R(S*>gIk@>&jE>OY2qW_#MwD-RW&Y+5jojzp_Co!Wnt2)2o z_U9e)RvUK_Z*Gf-JX+(FJyx+%nRgiO`Fu$jfgQdbftx=d62yMg1AS*$gi}Mh1jmOX zDi~@%e5tKwCGQ>-hF{xW>6y#2+o}S>Ky_OS8QW%5wo%o17Iu+W_C3;VOQ-F`*YRHC zmPaRPyq$*;PdzMxj!T$NIvOnAj%NeXWOEqFE!n!f?)LWK)1VD9QLakl@5WU$hw`p{ z|5*|gmJ+AK8p$TD%?h*^R0C&Mvdd<-5iwPUg#jx>b$mq&J{&u#>F;^)*>|IuM|h-7 z`iTT}Ob|`{^tpg{ChGQ%;*IK0K7<#O)Mgj2Zy7u+K?|A^UCe(av?&QG-`UPEqP%}G z$W@@eF$b$IM&}G5$(B{J126 z`Th4akrXpk6osMdX$Bk5OAEbx!n?H8wGZ5v{KlTf6x-YOu`4RNYDVr9>o?b2B3u5c zm5aGGVA{#=9af4F8n^y3uWnbJ9uk7-DK&aD)vdYS7Je@iXLK+WrOA|j0x2w~ z+0Yqpgo@(q%K*H<&?El1j>lKL!|KP8Nl?*1D~FTvCls6Nlm`kZb*h7T){~`6Q~BsG zM`HOevF=`sOqU8{l|eO9@kR3v9)m%Q(0(`Z!`?h&ndIH#va1)I6HMt4%hQtvQLH}( z{pZp#=np%_308i{x+=pdOxi~^?cW8Jv#`tDa(TObC#~tKx(h5y!f{Oc!s7w#*;(F<6}!m#^B&NMfV}bD2J$Ge7^V(EHw2BMO+p zI@Kcd&Rn-Q5Pqh?D7-y?Lu%K|2_<|MWRYNn7|PFQ{nG6CYC7e-{dXb@GYB>(FDhPi`PfyOXK@xi@d$Iuwx7%T_<#w`okyStZtGCG~JQ zaUg;turT$~QtG{^em!{==68xF-)NGGR(_f)FU#oFY-%W)a)(Z4>BI6GCG@6kUBa|G zL;kWSu{ydNfUO31GY*1vcoMFziEYKFtRsNxv{w$ceE`*h0JHoeMt6iy*;ki^6P#jOS^r{>=ytnn#VIrJ243c|~nq72Q~Pv-AfE=4lraJk$Q6hh{t4Wt}Y|5Tf| zRuNf_IBuHzgWZ`dKqr{l=#q$h*CF_9zIhIyp~^QLW-)z&8LMq5_qnJ<%yU;RI?_r~ z9bQ`I9N|M|q-UgKqqNoW`pMZtN3{}d(O*&Cyo|M@ZZ?RNi07r^ktH&S6QN@bQS4@mq@hLa z6=g~gZYwe|Tjju6-l{8Q|9;@umB;jWlq~K%`)BxHCY<^a*ftjI=9)^L7hzU8S9Bm+j?zf}DWll3^P3Rv4O`yBci) z6|%2z7wZSKlNEB!1-gr0pJE8R$F-dQsL0_Tw7l|b-qK10=1Z)NM?O!aGKds9P@|%1 zY-t&L9kJvp8d&!M`x`8i+u2$4({lKifd}HG)^huMn{bM=L0uHHZrRi%;1+iiNAjL@ zdpWXZo4Hxi@VtPm*7d`Mmw~~I$e-*3Zs>BGe{s4^@K7fwwhCS1LDW~gzOZ**?Ib$S ze&uNtZi{8@w}gl;rCd`o039nu^5oL($7u&+^#=zpdDbd_rvq?fh6TQeZ9QX7Oq2LX!P@cliKx1J z$%AIen&C|`B&Z5(8brKQALoxqf}R4F z2pGo>01>H1-O#HaG^rg7Ja89rL#oZHZZT6q&yKixoyDY4asB%0%mSWXlfRbrS1)!I ziYGul1MZ_Hc^g~YkjSq2RLtIBv_>&S!=zuXMkRHK^c~e3 zk3B!zh_-x;lNRsYPzlb&e}M@;I@h6ZH4wt4^hhl>_?Rh%UU&v?mzE&*s=D%42$R|9 zEjDW{%|spxh&ljN0IFexst;6V$Uz}Go@@6ODMoeq`Q+b+I?nh|>dr*(sgW(S*oGyR z+0~V;t)w4i1zDv)e;9Atu)&2B%#!<+#zc1|AXs+Kx|;z{gVbmEBWfrD!3Tn(*SK*^ zExDD#zeHu?m0MAGVhds8Zls!OkMUJyes>CH%t$VXPO`Vl1 zsf6xpXaLq9-&Y45NaLY`gy42Q2Eg7?Dd;H(4Pb6p_Bu~5BfVv;R@eztFFfii&2_sQ zTbZJHE`}X{Rx{zW*jy+PSc@rB|bT!^a-J~ zYR>s6*0P(DIzwrOpc>yRnNvFBbbsl2i2b}VD&Icr-+UNoa{UZxubEhcQ9di=xpkp~ zUxZyh>c9_+Hp#?wln*Meds!o3S9T1Z8gk|%$ z?`(kcXU4z((H{nuzzhLfa+f@%MZU)F{rSA@(FVREaDvLDLNpsg*>%}1_JG61(2eos zw(Z?;fsXSvYVh8rF?&t(4Ve&uz$P1@uOd*?g2!Qh28trma33!6(0RGrF8Y z^zx}@wU=SoU(?prrUYsur>O6Dw!Fo&3`$~tT)}%?g2i~0{G~e_9LWir6-`qo6Uym% zwN+Hy;Ol1#9gc>1k$0qixPR2ucW?pN&^NoT00PNuDVpCNf%*Yb6fgJ9SuM2Cqu_Rulr!fQgU+5AW@ zEkiM7^Cfpwe`Ch6xNhE~g=XXkqhTc0`+4D4%08PkaNvu`07};3Wk%RIl}h6r?P-|e zj`yWGgJG!u$z*@U+9#KWU&)$hv414N!*K)&ilk!S0b_2ek5EQ+fV`SqvzXFqKAQtY z;Vx3*r%a;GWKB<+q?@*`7N{x$+sAj zbo(rZY0dRpTiG66B9F=#>GkhFg?qi~r30(S?;53}n;k4qUiBt^0jNAl@yno*f5*f! zh~P6NW`bAR0tUhYDGXWSn`l?04h9C40CCU+5b zt#cp1O2#--HkP{=MGURiz2#a*o)A*9RU`Z?tWK}{vo~|7@P$~{&D13?QGE%Wf!2}R z^}F8pbG=hb$bZaoL}Ef+9aZ zSaxxwnd?Nn_Cp3zAsOK)3h|Zd3bMxM@NuR=q5O@gv@#w)j~Tn>|Njzt?*qBGn&z0< z=5vcL7KN^k?ZPwzN)&E|8(hHDkhb6@Le-d!E}M8*`t`dq0tpvqQ`pshZmk%EFFYVN zg#{F5Akb-|&;o_sx(Xx1t5-v82Sco8hn=ym-F&(e<45L-Dmk*#^l1g0>W3y;ssG#20LhiI3yGc~t@D%NK&A~b`g z#2KjIl&*zk1>z&l)@^F}f1=e>QPQ_VE|cSdOdF@NnP-7}jc(4Q6$rX7-CC=Pgl#xo zaH%RWvkq18;Fxn+B$pS;x5qtDdweeb6zUca%t;GdX(t;WFQFV~M6OJoh<|EW`cBpU zpCwI2TV6rIUUm8Ab9l{LSOqS-2gbCoYtuA;qFDB@4x0lta>m_-fPu#ZBe2af8l*Vzu+F+o4FU>~ZV zJ1AoHCx9r;*k>uz4*WFcPD+r080n%vHUsyc&-Og#f0P+)ST!oQce_5SOpPr00dknc zb45p;e9yxpf)yhiCEM=a`)bXTf%aXFB~2qdF+)&r#?f+Br6g z?>yYi*xbGoS>YGmHNw9T|AYV8A5`Z($k%Q~*S**cnEL=0BjR*5al#sC#|FNlaEi`1 zGPd9Im~nL~r|VmoDL&GkAv&FOJ#soE#8*;>8ZV(w7n{2dQ;O?DW(~XZF=rN^b^N($ zId4R1NvkGeH~zG*r+Ct`JK*698tDM6^m_4=e0l>q!zfeS7uCWLB8V4w%hNJgnX_dB zCE584sEBEG_WQ^b6G@@LlK*;W@6IxOTbVV5wB%52Zg2f8%YNd0UwBQl52>>qaA*#W zG%z`5lxYNgy3_&m#}?I>WQ~^}zHgfUV9L$x%cn#8cd!Ab5fa)e+6@=k<9%}QoUwx| zIIZ+U8PSHRMXVfhVXK_*J5pPQ2Z=f{)KkfZ@&E9|aRe z)u(rhix=M&*0OJo4q^2PYhg+7U2VWtrmPPsY<0M6_-zY!!*{SY+*pYp~>`X=p-vD#t*JHa2+7k=wNHJ}Zn%>RT_QMLRY zNSB&e>$J8x86NWJ)Q3J`@Sed zbrJ*&eg7BqvbX|Kh-V7=U$ttUMZu0`urCoIa4!u^q!3%ki}(2?M-F^5ej`p zBkB8fkkw-GE`lTkw}nD?U7w=bXGuMMaRoK{pyqFZl1d-XYO*VN3S=OUr~qNSyY77K zmSIQM?-~rFzfDWn{-j9JpjiX5RTtjWF(fO}LXJuiR_rJ-(jb3fC$w2%yiuDSx%+YI zmwIQteok*{S_!_kaMGc<+|Kte3$aX#z8&zz_iP~NEYcJ4*h`ox+OI!)1D*RSq|hy} z?IqrKg_502z6yD`eEoRr?`=#VnbCOjk)kN`BVGmov)*Z-9jC0YU<=E zO~*6_r-6GYQ|;cn4@j^Mfwo?3-uhc%;dbwx-wVen%7$QP-#}dxGN~RX@0TY(zD^-1 zPyv4)>WTolJfDE?Rfq{)ybOl-7Y^HjOtp>kN<^dh#24+OD^B`tJyShCT-4?qzX6f8 zB_$}e1z>c*VH=ugo9h8^iCOqXukZfOr0))Ltv;O8xipmCTo%SC)#PTh0av|>g@1(T z^K(&P>8elnd5lbbr#aYZm{`~!V6}9iz=Y}Y{i1g@K_X*3^{j-t9uLuLc5=@Xn4Rr@ zhu@xQYasfqB4k%D7!!Gp5D!1owKyXAw0a(WOqhJn&Lh&EWuey_FS=FqbZ<76gFK_R zn*GLdd9OtDn$Yu)v|#Y(d`7)b+rPUI$MXDEM^$?pe{wnlg=>6yJeOucDd$YH#eWTA zBo~9!hxsFhSn`Q~znZhZ3~}o%d+h8|!3S80ioG?NqN@_C5GQ}UFiDVHa7A9E@*(xJ zUvU)>r+EM6@l=WyGsFYD!qh_CMealQ6>t*@& z8n;EkvdeO2yu}c?5p~Z)KonF7S76`=$*=0~oQ?;$kD3p|TR}{H7TM|A|DFa_{%A$G zEI2rFI?zX5z0XQFLVeQ_s%RD&dEe?pH&c~6TX{@I#Z5*?1??^%B(*jY5d!0elh>}Y zY}Gverf~a49^_|~wHBC!o|u}r-u9TP8Q|5W-k18Qbg&1Ml6vcqcEBuI7wL58!W-@& zMPn%u2^WZK>2jk2E?6XXR~YxL`Ty@Xrp!{!l=zkT^J;%xz4{^1r}>nxhLzxTf_fKj zYgxA$OtsePHqq(|J5mZbw8ZcJiTTfm%?%^+b?L9>;bplfEWZsx{I=EN&UIe+An zXt~Gn4*~KI)xSW0@vCII6kv!7zeRh8%xEe5^1j_X``WEn#R#lBg8c2lQ& zPoJ`M31j3jxT27%xsk#NCcJYkATd^>Bi|9%JXV)f>_63&A?Tqma>Y)4dD&iFs7P!8 zd0^LnFiNHS^jh;V%1JMECJ3qK{cThwRvX#uxB@}YPu&14;M4W5TSJ}foC;|*l~hB> z0>p`Nieq@-%7;O#+*I7zj;cCm$jos6W+@v_lnQw*P6(=)XdiW_gXVf%=-}UQG%WKe9fq{`bQ%%Q@5H?GTROP7A&H)o-}$ zDbnV7o?g{F4%$UTPasCbJDhldk`%71o%h{hUz@TGZIyI0=%@^<^b0R?R(tl1(@IQ0 zKacna@>@_~8Tb=pP5S!VS_wVWqyH%|**psN_Hxr4?H)Q=F~Wbq3eq?nKBp2lEOh00 zrimWlhd-Q;$IIdU?=ZVBd;kxVqWQvet~bEp*()Suhwtub>FIJndaW8%Tdw+tkvQ(< z+gIY|>9Q;OlCR|U>F=*(gqKR|v#MhrSfFL- z2B%61v+?$+JozSnL?eY$*`xd#;V*Zg&UzFbj>01rjaUxlg@L&jcWetpQ``c2Q6~|+ zAF}dV>&+UTs+I1|#8BMw)Zs-b-ow7>Iyi{<7hKCp~=%Yv+~`--+|-BKxi zH(f>l6K0J}QC`@r?e==z+73FnhG4J)=7J92pP>I96!TnQG421V|NaCW>`_FiXH!(w zAN4+{k-OMTq20Z0k*erHO_`?{^bm49FNAJ!%#)gcq7W`somqKJffI+zmqhEc0PgpnLB zpQL$dFxbPMjE5us(dW$Kp0SLdstpTwcdjma$l< zuz-9l@aT4DamSyY51VW5NpN$r(T>f$)gpq0Zljq#9-88Q>#!0|&?SB{B{)ZBY5J>) zi|ac;M_O#MeS)qXYAaQuRe;>>RC9Mn??fwpLA3?2)m~Ru=d1jPdcD}zO>XP9MI21I zQ$}J3^m7h0UrV1>STs3~Ea=?2FN1%-k$&4NO-F9)_t%Bq2P(rrSkQM%;HB%(1JP}B z;j+NVzKM6oG8lpK-8aRaR$!A61)ZX!o)Zz%!_2{_VIPEX1Dk*^lD=LTW*VL2X*Y%JqTzwxC zQ_faf=4HdQ$gOLFcK7~Gi3MKI5h?+TC%R1OKF7H?F5-jGx`hmg|0d zEMku*Qm$KwN+&}^AK`1I$GH%a6qDZilV8@Yq4PK#OwR@e%2bh!+zr8Wcw7-y>*^7W zd$a|Lgfb={pM&e)T^^59vB#}dZyye%I`+Ab4$$+b+=zk-vn6UQ`|#(tbB#!TtVEbr zzFU%g_N(&W{F*Y;?*r6^1TXa?GlM#VgU&ebwv*_8YGep)XbTIyy_I!$J>SZ!g^>qx zK~94qaOOK6=Rky4-7VqxFl@hCSk2@7xQ~r;MiUkVm+u%qi$Md(Ek4b@5&xx7V~re> zTYW>1mKotWl&hv#l4KJ*_H%IFVTkACUL-eTTn-=jq?QKe0PL{us5-rDzHzh6F9MuPUQHpEU}q zRkilxzCZ`_%vyx6d8JnR)73ue8@xYVU%aCkG|Q~tk>4*g4^;%W$N8Y)5#;F9^zfuG z{EXr8EP0-M7)aTR5EB~6-w&0c*E2Q7Ul!&Ekw3DmC8s!|8;kZQg@BB1-)@c1-n9tFK4%h-PBfQiK8Bu8nzMBgUzniNNBG};} zO7tLIyTyU4Cu*#@L#DKy{TyBr%khWoT(+5EZ05N_51!kg2?APbvwkO4vld(LUf4Ul z)=`c5q41@VLb&5kvg8Jx`cT)7qQH^v8yh_P)cnb(QHxx2#LiCz4eQMwhYp&#BxNmI zI@-Uc3TLF5$5-Dco!m`-PP%6bA*`2r8%ND7N-FGB;eDMWW1WA@i7tWf>

      sc-ZG& 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 From 4c34d2e352eeaad5ea5bad189d2f367f205c2473 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 27 Jan 2024 20:21:27 +0900 Subject: [PATCH 350/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index a7376aa5a7..969fd52340 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index 98e8b136e5..bbcabc6360 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From 9d73d0e04d08a235587a874f56d1492aadcfba51 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 27 Jan 2024 19:06:04 +0300 Subject: [PATCH 351/651] Clamp logo triangles along both axes --- osu.Game/Screens/Menu/OsuLogo.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs index a39d552a90..25101730e7 100644 --- a/osu.Game/Screens/Menu/OsuLogo.cs +++ b/osu.Game/Screens/Menu/OsuLogo.cs @@ -187,7 +187,6 @@ namespace osu.Game.Screens.Menu }, triangles = new TrianglesV2 { - ClampAxes = Axes.X, Anchor = Anchor.Centre, Origin = Anchor.Centre, Thickness = 0.009f, From d38779f9620deae86c6ce0be2d0d916411c3b359 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 27 Jan 2024 23:22:29 +0300 Subject: [PATCH 352/651] Add failing test case --- .../Multiplayer/TestSceneMultiplayerPlayer.cs | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs index cbeff770c9..aaf85dab7c 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs @@ -3,13 +3,18 @@ #nullable disable +using System; +using System.Collections.Generic; using System.Linq; using NUnit.Framework; using osu.Framework.Screens; using osu.Framework.Testing; using osu.Game.Online.Multiplayer; using osu.Game.Online.Rooms; +using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu; +using osu.Game.Rulesets.Osu.Mods; +using osu.Game.Rulesets.Scoring; using osu.Game.Screens.OnlinePlay.Multiplayer; using osu.Game.Screens.Play; @@ -19,14 +24,37 @@ namespace osu.Game.Tests.Visual.Multiplayer { private MultiplayerPlayer player; - [SetUpSteps] - public override void SetUpSteps() + [Test] + public void TestGameplay() { - base.SetUpSteps(); + setup(); + AddUntilStep("wait for gameplay start", () => player.LocalUserPlaying.Value); + } + + [Test] + public void TestFail() + { + setup(() => new[] { new OsuModAutopilot() }); + + AddUntilStep("wait for gameplay start", () => player.LocalUserPlaying.Value); + AddStep("set health zero", () => player.ChildrenOfType().Single().Health.Value = 0); + AddUntilStep("wait for fail", () => player.ChildrenOfType().Single().HasFailed); + AddAssert("fail animation not shown", () => !player.GameplayState.HasFailed); + + // ensure that even after reaching a failed state, score processor keeps accounting for new hit results. + // the testing method used here (autopilot + hold key) is sort-of dodgy, but works enough. + AddAssert("score is zero", () => player.GameplayState.ScoreProcessor.TotalScore.Value == 0); + AddStep("hold key", () => player.ChildrenOfType().First().TriggerPressed(OsuAction.LeftButton)); + AddUntilStep("score changed", () => player.GameplayState.ScoreProcessor.TotalScore.Value > 0); + } + + private void setup(Func> mods = null) + { AddStep("set beatmap", () => { Beatmap.Value = CreateWorkingBeatmap(new OsuRuleset().RulesetInfo); + SelectedMods.Value = mods?.Invoke() ?? Array.Empty(); }); AddStep("Start track playing", () => @@ -52,11 +80,5 @@ namespace osu.Game.Tests.Visual.Multiplayer AddUntilStep("gameplay clock is not paused", () => !player.ChildrenOfType().Single().IsPaused.Value); AddAssert("gameplay clock is running", () => player.ChildrenOfType().Single().IsRunning); } - - [Test] - public void TestGameplay() - { - AddUntilStep("wait for gameplay start", () => player.LocalUserPlaying.Value); - } } } From ea641bb8d2cf7d307d508c0f1d8fb81e3ef773d7 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 27 Jan 2024 19:09:46 +0300 Subject: [PATCH 353/651] Rename `GameplayState.HasFailed` to properly clarify its meaning --- .../TestSceneTaikoSuddenDeath.cs | 2 +- .../Visual/Gameplay/TestSceneFailAnimation.cs | 2 +- .../Visual/Gameplay/TestSceneFailJudgement.cs | 2 +- osu.Game.Tests/Visual/Gameplay/TestScenePause.cs | 12 ++++++------ .../Gameplay/TestScenePlayerScoreSubmission.cs | 4 ++-- .../Visual/Gameplay/TestSceneSpectator.cs | 2 +- .../Gameplay/TestSceneStoryboardWithOutro.cs | 4 ++-- .../Visual/Mods/TestSceneModAccuracyChallenge.cs | 4 ++-- .../Multiplayer/TestSceneMultiplayerPlayer.cs | 2 +- .../Navigation/TestSceneScreenNavigation.cs | 2 +- osu.Game/Online/Spectator/SpectatorClient.cs | 2 +- osu.Game/Screens/Play/GameplayState.cs | 7 +++++-- osu.Game/Screens/Play/Player.cs | 16 ++++++++-------- .../Screens/Play/PlayerTouchInputDetector.cs | 2 +- 14 files changed, 33 insertions(+), 30 deletions(-) diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs index 9e45197b04..4b78e0a005 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs @@ -45,7 +45,7 @@ namespace osu.Game.Rulesets.Taiko.Tests Player.ScoreProcessor.NewJudgement += _ => judged = true; }); AddUntilStep("swell judged", () => judged); - AddAssert("not failed", () => !Player.GameplayState.HasFailed); + AddAssert("not failed", () => !Player.GameplayState.ShownFailAnimation); } } } diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs index b251253b7c..369bcfac4e 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs @@ -29,7 +29,7 @@ namespace osu.Game.Tests.Visual.Gameplay protected override void AddCheckSteps() { - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddUntilStep("wait for fail overlay", () => ((FailPlayer)Player).FailOverlay.State.Value == Visibility.Visible); // The pause screen and fail animation both ramp frequency. diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs index 6297b062dd..4fb6e9783c 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs @@ -22,7 +22,7 @@ namespace osu.Game.Tests.Visual.Gameplay protected override void AddCheckSteps() { AddUntilStep("player is playing", () => Player.LocalUserPlaying.Value); - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddAssert("player is not playing", () => !Player.LocalUserPlaying.Value); AddUntilStep("wait for multiple judgements", () => ((FailPlayer)Player).ScoreProcessor.JudgedHits > 1); AddAssert("total number of results == 1", () => diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs index 73aa3be73d..32f5d7cc55 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs @@ -224,7 +224,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestPauseAfterFail() { - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddUntilStep("fail overlay shown", () => Player.FailOverlayVisible); confirmClockRunning(false); @@ -240,7 +240,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestExitFromFailedGameplayAfterFailAnimation() { - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddUntilStep("wait for fail overlay shown", () => Player.FailOverlayVisible); confirmClockRunning(false); @@ -252,7 +252,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestExitFromFailedGameplayDuringFailAnimation() { - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); // will finish the fail animation and show the fail/pause screen. pauseViaBackAction(); @@ -266,7 +266,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestQuickRetryFromFailedGameplay() { - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddStep("quick retry", () => Player.GameplayClockContainer.ChildrenOfType().First().Action?.Invoke()); confirmExited(); @@ -275,7 +275,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestQuickExitFromFailedGameplay() { - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); exitViaQuickExitAction(); confirmExited(); @@ -380,7 +380,7 @@ namespace osu.Game.Tests.Visual.Gameplay { confirmClockRunning(false); confirmNotExited(); - AddAssert("player not failed", () => !Player.GameplayState.HasFailed); + AddAssert("player not failed", () => !Player.GameplayState.ShownFailAnimation); AddAssert("pause overlay shown", () => Player.PauseOverlayVisible); } diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs index 5e22e47572..a4f71bcaad 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs @@ -171,7 +171,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddUntilStep("wait for token request", () => Player.TokenCreationRequested); - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddStep("exit", () => Player.Exit()); AddAssert("ensure no submission", () => Player.SubmittedScore == null); @@ -188,7 +188,7 @@ namespace osu.Game.Tests.Visual.Gameplay addFakeHit(); - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddUntilStep("wait for submission", () => Player.SubmittedScore != null); AddAssert("ensure failing submission", () => Player.SubmittedScore.ScoreInfo.Passed == false); diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs index 1c7ede2b19..b0bb42921d 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs @@ -353,7 +353,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddStep("send failed", () => spectatorClient.SendEndPlay(streamingUser.Id, SpectatedUserState.Failed)); AddUntilStep("state is failed", () => spectatorClient.WatchedUserStates[streamingUser.Id].State == SpectatedUserState.Failed); - AddUntilStep("wait for player to fail", () => player.GameplayState.HasFailed); + AddUntilStep("wait for player to fail", () => player.GameplayState.ShownFailAnimation); start(); sendFrames(); diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs index 98825b27d4..e2e5aac734 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs @@ -102,7 +102,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddStep("set storyboard duration to 0.6s", () => currentStoryboardDuration = 600); }); - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddUntilStep("storyboard ends", () => Player.GameplayClockContainer.CurrentTime >= currentStoryboardDuration); AddUntilStep("wait for fail overlay", () => Player.FailOverlay.State.Value == Visibility.Visible); } @@ -116,7 +116,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddStep("set storyboard duration to 0s", () => currentStoryboardDuration = 0); }); AddUntilStep("storyboard ends", () => Player.GameplayClockContainer.CurrentTime >= currentStoryboardDuration); - AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddUntilStep("wait for fail overlay", () => Player.FailOverlay.State.Value == Visibility.Visible); AddUntilStep("wait for button clickable", () => Player.ChildrenOfType().First().ChildrenOfType().First().Enabled.Value); diff --git a/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs b/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs index c5e56c6453..4fc6fe1b77 100644 --- a/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs +++ b/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs @@ -43,7 +43,7 @@ namespace osu.Game.Tests.Visual.Mods Position = new Vector2(i * 50) }).Cast().ToList() }, - PassCondition = () => Player.GameplayState.HasFailed && Player.ScoreProcessor.JudgedHits >= 3 + PassCondition = () => Player.GameplayState.ShownFailAnimation && Player.ScoreProcessor.JudgedHits >= 3 }); [Test] @@ -64,7 +64,7 @@ namespace osu.Game.Tests.Visual.Mods Position = new Vector2(i * 50) }).Cast().ToList() }, - PassCondition = () => Player.GameplayState.HasFailed && Player.ScoreProcessor.JudgedHits >= 1 + PassCondition = () => Player.GameplayState.ShownFailAnimation && Player.ScoreProcessor.JudgedHits >= 1 }); } } diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs index aaf85dab7c..175fd3127d 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs @@ -40,7 +40,7 @@ namespace osu.Game.Tests.Visual.Multiplayer AddUntilStep("wait for gameplay start", () => player.LocalUserPlaying.Value); AddStep("set health zero", () => player.ChildrenOfType().Single().Health.Value = 0); AddUntilStep("wait for fail", () => player.ChildrenOfType().Single().HasFailed); - AddAssert("fail animation not shown", () => !player.GameplayState.HasFailed); + AddAssert("fail animation not shown", () => !player.GameplayState.ShownFailAnimation); // ensure that even after reaching a failed state, score processor keeps accounting for new hit results. // the testing method used here (autopilot + hold key) is sort-of dodgy, but works enough. diff --git a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs index f59fbc75ac..083a5dc833 100644 --- a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs +++ b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs @@ -392,7 +392,7 @@ namespace osu.Game.Tests.Visual.Navigation return (player = Game.ScreenStack.CurrentScreen as Player) != null; }); - AddUntilStep("wait for fail", () => player.GameplayState.HasFailed); + AddUntilStep("wait for fail", () => player.GameplayState.ShownFailAnimation); AddUntilStep("wait for track stop", () => !Game.MusicController.IsPlaying); AddAssert("Ensure time before preview point", () => Game.MusicController.CurrentTrack.CurrentTime < beatmap().BeatmapInfo.Metadata.PreviewTime); diff --git a/osu.Game/Online/Spectator/SpectatorClient.cs b/osu.Game/Online/Spectator/SpectatorClient.cs index 7911701853..a9a666a360 100644 --- a/osu.Game/Online/Spectator/SpectatorClient.cs +++ b/osu.Game/Online/Spectator/SpectatorClient.cs @@ -251,7 +251,7 @@ namespace osu.Game.Online.Spectator if (state.HasPassed) currentState.State = SpectatedUserState.Passed; - else if (state.HasFailed) + else if (state.ShownFailAnimation) currentState.State = SpectatedUserState.Failed; else currentState.State = SpectatedUserState.Quit; diff --git a/osu.Game/Screens/Play/GameplayState.cs b/osu.Game/Screens/Play/GameplayState.cs index cc399a0fbe..f64bcc9a3c 100644 --- a/osu.Game/Screens/Play/GameplayState.cs +++ b/osu.Game/Screens/Play/GameplayState.cs @@ -46,9 +46,12 @@ namespace osu.Game.Screens.Play public bool HasPassed { get; set; } ///

      - /// Whether the user failed during gameplay. This is only set when the gameplay session has completed due to the fail. + /// Whether the user failed during gameplay and the fail animation has been displayed. /// - public bool HasFailed { get; set; } + /// + /// In multiplayer, this is never set to true even if the player reached zero health, due to being turned off. + /// + public bool ShownFailAnimation { get; set; } /// /// Whether the user quit gameplay without having either passed or failed. diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index ad1f9ec897..ff1deecc3d 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -489,7 +489,7 @@ namespace osu.Game.Screens.Play private void updateGameplayState() { - bool inGameplay = !DrawableRuleset.HasReplayLoaded.Value && !DrawableRuleset.IsPaused.Value && !breakTracker.IsBreakTime.Value && !GameplayState.HasFailed; + bool inGameplay = !DrawableRuleset.HasReplayLoaded.Value && !DrawableRuleset.IsPaused.Value && !breakTracker.IsBreakTime.Value && !GameplayState.ShownFailAnimation; OverlayActivationMode.Value = inGameplay ? OverlayActivation.Disabled : OverlayActivation.UserTriggered; localUserPlaying.Value = inGameplay; } @@ -586,7 +586,7 @@ namespace osu.Game.Screens.Play if (showDialogFirst && !pauseOrFailDialogVisible) { // if the fail animation is currently in progress, accelerate it (it will show the pause dialog on completion). - if (ValidForResume && GameplayState.HasFailed) + if (ValidForResume && GameplayState.ShownFailAnimation) { failAnimationContainer.FinishTransforms(true); return false; @@ -733,7 +733,7 @@ namespace osu.Game.Screens.Play } // Only show the completion screen if the player hasn't failed - if (GameplayState.HasFailed) + if (GameplayState.ShownFailAnimation) return; GameplayState.HasPassed = true; @@ -922,11 +922,11 @@ namespace osu.Game.Screens.Play if (Configuration.AllowFailAnimation) { - Debug.Assert(!GameplayState.HasFailed); + Debug.Assert(!GameplayState.ShownFailAnimation); Debug.Assert(!GameplayState.HasPassed); Debug.Assert(!GameplayState.HasQuit); - GameplayState.HasFailed = true; + GameplayState.ShownFailAnimation = true; updateGameplayState(); @@ -1002,13 +1002,13 @@ namespace osu.Game.Screens.Play // replays cannot be paused and exit immediately && !DrawableRuleset.HasReplayLoaded.Value // cannot pause if we are already in a fail state - && !GameplayState.HasFailed; + && !GameplayState.ShownFailAnimation; private bool canResume => // cannot resume from a non-paused state GameplayClockContainer.IsPaused.Value // cannot resume if we are already in a fail state - && !GameplayState.HasFailed + && !GameplayState.ShownFailAnimation // already resuming && !IsResuming; @@ -1142,7 +1142,7 @@ namespace osu.Game.Screens.Play { Debug.Assert(resultsDisplayDelegate == null); - if (!GameplayState.HasFailed) + if (!GameplayState.ShownFailAnimation) GameplayState.HasQuit = true; if (DrawableRuleset.ReplayScore == null) diff --git a/osu.Game/Screens/Play/PlayerTouchInputDetector.cs b/osu.Game/Screens/Play/PlayerTouchInputDetector.cs index 12fb748e7d..13c94f7b32 100644 --- a/osu.Game/Screens/Play/PlayerTouchInputDetector.cs +++ b/osu.Game/Screens/Play/PlayerTouchInputDetector.cs @@ -37,7 +37,7 @@ namespace osu.Game.Screens.Play if (!touchActive.Value) return; - if (gameplayState.HasPassed || gameplayState.HasFailed || gameplayState.HasQuit) + if (gameplayState.HasPassed || gameplayState.ShownFailAnimation || gameplayState.HasQuit) return; if (gameplayState.Score.ScoreInfo.Mods.OfType().Any()) From a25be9927df56d845f1a95f8a74bd535c9273fa0 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 27 Jan 2024 19:12:03 +0300 Subject: [PATCH 354/651] Fix score processor no longer applying results when failing in multiplayer match --- osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 6 ------ osu.Game/Screens/Play/Player.cs | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index a092829317..7d50dd4665 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -211,9 +211,6 @@ namespace osu.Game.Rulesets.Scoring result.ComboAtJudgement = Combo.Value; result.HighestComboAtJudgement = HighestCombo.Value; - if (result.FailedAtJudgement) - return; - ScoreResultCounts[result.Type] = ScoreResultCounts.GetValueOrDefault(result.Type) + 1; if (result.Type.IncreasesCombo()) @@ -267,9 +264,6 @@ namespace osu.Game.Rulesets.Scoring Combo.Value = result.ComboAtJudgement; HighestCombo.Value = result.HighestComboAtJudgement; - if (result.FailedAtJudgement) - return; - ScoreResultCounts[result.Type] = ScoreResultCounts.GetValueOrDefault(result.Type) - 1; if (result.Judgement.MaxResult.AffectsAccuracy()) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index ff1deecc3d..e2470285ba 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -357,6 +357,9 @@ namespace osu.Game.Screens.Play DrawableRuleset.NewResult += r => { + if (GameplayState.ShownFailAnimation) + return; + HealthProcessor.ApplyResult(r); ScoreProcessor.ApplyResult(r); GameplayState.ApplyResult(r); @@ -364,6 +367,9 @@ namespace osu.Game.Screens.Play DrawableRuleset.RevertResult += r => { + if (GameplayState.ShownFailAnimation) + return; + HealthProcessor.RevertResult(r); ScoreProcessor.RevertResult(r); }; From 5f689998930a5b37021a2ace9f6c76d69d07239d Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 27 Jan 2024 20:44:34 +0300 Subject: [PATCH 355/651] Fix `TestSceneFailJudgement` asserts no longer being correct --- .../Visual/Gameplay/TestSceneFailJudgement.cs | 2 +- osu.Game/Rulesets/UI/Playfield.cs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs index 4fb6e9783c..339746ac8b 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs @@ -24,7 +24,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddUntilStep("player is playing", () => Player.LocalUserPlaying.Value); AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); AddAssert("player is not playing", () => !Player.LocalUserPlaying.Value); - AddUntilStep("wait for multiple judgements", () => ((FailPlayer)Player).ScoreProcessor.JudgedHits > 1); + AddUntilStep("wait for multiple judgements", () => ((FailPlayer)Player).DrawableRuleset.Playfield.AllEntries.Count(e => e.Judged) > 1); AddAssert("total number of results == 1", () => { var score = new ScoreInfo { Ruleset = Ruleset.Value }; diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs index e9c35555c8..176223729a 100644 --- a/osu.Game/Rulesets/UI/Playfield.cs +++ b/osu.Game/Rulesets/UI/Playfield.cs @@ -78,6 +78,25 @@ namespace osu.Game.Rulesets.UI } } + /// + /// All the s contained in this and all . + /// + public IEnumerable AllEntries + { + get + { + if (HitObjectContainer == null) + return Enumerable.Empty(); + + var enumerable = HitObjectContainer.Entries; + + if (nestedPlayfields.Count != 0) + enumerable = enumerable.Concat(NestedPlayfields.SelectMany(p => p.AllEntries)); + + return enumerable; + } + } + /// /// All s nested inside this . /// From 64b61108ad5b389ce136385393eb3eba9a4f9bc8 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sun, 28 Jan 2024 00:34:23 +0300 Subject: [PATCH 356/651] Move solution to multiplayer flow instead --- .../TestSceneTaikoSuddenDeath.cs | 2 +- .../Visual/Gameplay/TestSceneFailAnimation.cs | 2 +- .../Visual/Gameplay/TestSceneFailJudgement.cs | 4 ++-- .../Visual/Gameplay/TestScenePause.cs | 12 +++++----- .../TestScenePlayerScoreSubmission.cs | 4 ++-- .../Visual/Gameplay/TestSceneSpectator.cs | 2 +- .../Gameplay/TestSceneStoryboardWithOutro.cs | 4 ++-- .../Mods/TestSceneModAccuracyChallenge.cs | 4 ++-- .../Multiplayer/TestSceneMultiplayerPlayer.cs | 2 +- .../Navigation/TestSceneScreenNavigation.cs | 2 +- osu.Game/Online/Spectator/SpectatorClient.cs | 2 +- osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 8 +++++++ osu.Game/Rulesets/UI/Playfield.cs | 19 ---------------- .../Multiplayer/MultiplayerPlayer.cs | 2 ++ osu.Game/Screens/Play/GameplayState.cs | 7 ++---- osu.Game/Screens/Play/Player.cs | 22 +++++++------------ .../Screens/Play/PlayerTouchInputDetector.cs | 2 +- 17 files changed, 41 insertions(+), 59 deletions(-) diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs index 4b78e0a005..9e45197b04 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs @@ -45,7 +45,7 @@ namespace osu.Game.Rulesets.Taiko.Tests Player.ScoreProcessor.NewJudgement += _ => judged = true; }); AddUntilStep("swell judged", () => judged); - AddAssert("not failed", () => !Player.GameplayState.ShownFailAnimation); + AddAssert("not failed", () => !Player.GameplayState.HasFailed); } } } diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs index 369bcfac4e..b251253b7c 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneFailAnimation.cs @@ -29,7 +29,7 @@ namespace osu.Game.Tests.Visual.Gameplay protected override void AddCheckSteps() { - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddUntilStep("wait for fail overlay", () => ((FailPlayer)Player).FailOverlay.State.Value == Visibility.Visible); // The pause screen and fail animation both ramp frequency. diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs index 339746ac8b..6297b062dd 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneFailJudgement.cs @@ -22,9 +22,9 @@ namespace osu.Game.Tests.Visual.Gameplay protected override void AddCheckSteps() { AddUntilStep("player is playing", () => Player.LocalUserPlaying.Value); - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddAssert("player is not playing", () => !Player.LocalUserPlaying.Value); - AddUntilStep("wait for multiple judgements", () => ((FailPlayer)Player).DrawableRuleset.Playfield.AllEntries.Count(e => e.Judged) > 1); + AddUntilStep("wait for multiple judgements", () => ((FailPlayer)Player).ScoreProcessor.JudgedHits > 1); AddAssert("total number of results == 1", () => { var score = new ScoreInfo { Ruleset = Ruleset.Value }; diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs index 32f5d7cc55..73aa3be73d 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs @@ -224,7 +224,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestPauseAfterFail() { - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddUntilStep("fail overlay shown", () => Player.FailOverlayVisible); confirmClockRunning(false); @@ -240,7 +240,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestExitFromFailedGameplayAfterFailAnimation() { - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddUntilStep("wait for fail overlay shown", () => Player.FailOverlayVisible); confirmClockRunning(false); @@ -252,7 +252,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestExitFromFailedGameplayDuringFailAnimation() { - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); // will finish the fail animation and show the fail/pause screen. pauseViaBackAction(); @@ -266,7 +266,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestQuickRetryFromFailedGameplay() { - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddStep("quick retry", () => Player.GameplayClockContainer.ChildrenOfType().First().Action?.Invoke()); confirmExited(); @@ -275,7 +275,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestQuickExitFromFailedGameplay() { - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); exitViaQuickExitAction(); confirmExited(); @@ -380,7 +380,7 @@ namespace osu.Game.Tests.Visual.Gameplay { confirmClockRunning(false); confirmNotExited(); - AddAssert("player not failed", () => !Player.GameplayState.ShownFailAnimation); + AddAssert("player not failed", () => !Player.GameplayState.HasFailed); AddAssert("pause overlay shown", () => Player.PauseOverlayVisible); } diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs index a4f71bcaad..5e22e47572 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerScoreSubmission.cs @@ -171,7 +171,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddUntilStep("wait for token request", () => Player.TokenCreationRequested); - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddStep("exit", () => Player.Exit()); AddAssert("ensure no submission", () => Player.SubmittedScore == null); @@ -188,7 +188,7 @@ namespace osu.Game.Tests.Visual.Gameplay addFakeHit(); - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddUntilStep("wait for submission", () => Player.SubmittedScore != null); AddAssert("ensure failing submission", () => Player.SubmittedScore.ScoreInfo.Passed == false); diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs index b0bb42921d..1c7ede2b19 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs @@ -353,7 +353,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddStep("send failed", () => spectatorClient.SendEndPlay(streamingUser.Id, SpectatedUserState.Failed)); AddUntilStep("state is failed", () => spectatorClient.WatchedUserStates[streamingUser.Id].State == SpectatedUserState.Failed); - AddUntilStep("wait for player to fail", () => player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for player to fail", () => player.GameplayState.HasFailed); start(); sendFrames(); diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs index e2e5aac734..98825b27d4 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs @@ -102,7 +102,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddStep("set storyboard duration to 0.6s", () => currentStoryboardDuration = 600); }); - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddUntilStep("storyboard ends", () => Player.GameplayClockContainer.CurrentTime >= currentStoryboardDuration); AddUntilStep("wait for fail overlay", () => Player.FailOverlay.State.Value == Visibility.Visible); } @@ -116,7 +116,7 @@ namespace osu.Game.Tests.Visual.Gameplay AddStep("set storyboard duration to 0s", () => currentStoryboardDuration = 0); }); AddUntilStep("storyboard ends", () => Player.GameplayClockContainer.CurrentTime >= currentStoryboardDuration); - AddUntilStep("wait for fail", () => Player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => Player.GameplayState.HasFailed); AddUntilStep("wait for fail overlay", () => Player.FailOverlay.State.Value == Visibility.Visible); AddUntilStep("wait for button clickable", () => Player.ChildrenOfType().First().ChildrenOfType().First().Enabled.Value); diff --git a/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs b/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs index 4fc6fe1b77..c5e56c6453 100644 --- a/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs +++ b/osu.Game.Tests/Visual/Mods/TestSceneModAccuracyChallenge.cs @@ -43,7 +43,7 @@ namespace osu.Game.Tests.Visual.Mods Position = new Vector2(i * 50) }).Cast().ToList() }, - PassCondition = () => Player.GameplayState.ShownFailAnimation && Player.ScoreProcessor.JudgedHits >= 3 + PassCondition = () => Player.GameplayState.HasFailed && Player.ScoreProcessor.JudgedHits >= 3 }); [Test] @@ -64,7 +64,7 @@ namespace osu.Game.Tests.Visual.Mods Position = new Vector2(i * 50) }).Cast().ToList() }, - PassCondition = () => Player.GameplayState.ShownFailAnimation && Player.ScoreProcessor.JudgedHits >= 1 + PassCondition = () => Player.GameplayState.HasFailed && Player.ScoreProcessor.JudgedHits >= 1 }); } } diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs index 175fd3127d..aaf85dab7c 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs @@ -40,7 +40,7 @@ namespace osu.Game.Tests.Visual.Multiplayer AddUntilStep("wait for gameplay start", () => player.LocalUserPlaying.Value); AddStep("set health zero", () => player.ChildrenOfType().Single().Health.Value = 0); AddUntilStep("wait for fail", () => player.ChildrenOfType().Single().HasFailed); - AddAssert("fail animation not shown", () => !player.GameplayState.ShownFailAnimation); + AddAssert("fail animation not shown", () => !player.GameplayState.HasFailed); // ensure that even after reaching a failed state, score processor keeps accounting for new hit results. // the testing method used here (autopilot + hold key) is sort-of dodgy, but works enough. diff --git a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs index 083a5dc833..f59fbc75ac 100644 --- a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs +++ b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs @@ -392,7 +392,7 @@ namespace osu.Game.Tests.Visual.Navigation return (player = Game.ScreenStack.CurrentScreen as Player) != null; }); - AddUntilStep("wait for fail", () => player.GameplayState.ShownFailAnimation); + AddUntilStep("wait for fail", () => player.GameplayState.HasFailed); AddUntilStep("wait for track stop", () => !Game.MusicController.IsPlaying); AddAssert("Ensure time before preview point", () => Game.MusicController.CurrentTrack.CurrentTime < beatmap().BeatmapInfo.Metadata.PreviewTime); diff --git a/osu.Game/Online/Spectator/SpectatorClient.cs b/osu.Game/Online/Spectator/SpectatorClient.cs index a9a666a360..7911701853 100644 --- a/osu.Game/Online/Spectator/SpectatorClient.cs +++ b/osu.Game/Online/Spectator/SpectatorClient.cs @@ -251,7 +251,7 @@ namespace osu.Game.Online.Spectator if (state.HasPassed) currentState.State = SpectatedUserState.Passed; - else if (state.ShownFailAnimation) + else if (state.HasFailed) currentState.State = SpectatedUserState.Failed; else currentState.State = SpectatedUserState.Quit; diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index 7d50dd4665..9d12daad04 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -181,6 +181,8 @@ namespace osu.Game.Rulesets.Scoring private readonly List hitEvents = new List(); private HitObject? lastHitObject; + public bool ApplyNewJudgementsWhenFailed { get; set; } + public ScoreProcessor(Ruleset ruleset) { Ruleset = ruleset; @@ -211,6 +213,9 @@ namespace osu.Game.Rulesets.Scoring result.ComboAtJudgement = Combo.Value; result.HighestComboAtJudgement = HighestCombo.Value; + if (result.FailedAtJudgement && !ApplyNewJudgementsWhenFailed) + return; + ScoreResultCounts[result.Type] = ScoreResultCounts.GetValueOrDefault(result.Type) + 1; if (result.Type.IncreasesCombo()) @@ -264,6 +269,9 @@ namespace osu.Game.Rulesets.Scoring Combo.Value = result.ComboAtJudgement; HighestCombo.Value = result.HighestComboAtJudgement; + if (result.FailedAtJudgement && !ApplyNewJudgementsWhenFailed) + return; + ScoreResultCounts[result.Type] = ScoreResultCounts.GetValueOrDefault(result.Type) - 1; if (result.Judgement.MaxResult.AffectsAccuracy()) diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs index 176223729a..e9c35555c8 100644 --- a/osu.Game/Rulesets/UI/Playfield.cs +++ b/osu.Game/Rulesets/UI/Playfield.cs @@ -78,25 +78,6 @@ namespace osu.Game.Rulesets.UI } } - /// - /// All the s contained in this and all . - /// - public IEnumerable AllEntries - { - get - { - if (HitObjectContainer == null) - return Enumerable.Empty(); - - var enumerable = HitObjectContainer.Entries; - - if (nestedPlayfields.Count != 0) - enumerable = enumerable.Concat(NestedPlayfields.SelectMany(p => p.AllEntries)); - - return enumerable; - } - } - /// /// All s nested inside this . /// diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerPlayer.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerPlayer.cs index d9043df1d5..c5c536eae6 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerPlayer.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerPlayer.cs @@ -67,6 +67,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer if (!LoadedBeatmapSuccessfully) return; + ScoreProcessor.ApplyNewJudgementsWhenFailed = true; + LoadComponentAsync(new GameplayChatDisplay(Room) { Expanded = { BindTarget = LeaderboardExpandedState }, diff --git a/osu.Game/Screens/Play/GameplayState.cs b/osu.Game/Screens/Play/GameplayState.cs index f64bcc9a3c..cc399a0fbe 100644 --- a/osu.Game/Screens/Play/GameplayState.cs +++ b/osu.Game/Screens/Play/GameplayState.cs @@ -46,12 +46,9 @@ namespace osu.Game.Screens.Play public bool HasPassed { get; set; } /// - /// Whether the user failed during gameplay and the fail animation has been displayed. + /// Whether the user failed during gameplay. This is only set when the gameplay session has completed due to the fail. /// - /// - /// In multiplayer, this is never set to true even if the player reached zero health, due to being turned off. - /// - public bool ShownFailAnimation { get; set; } + public bool HasFailed { get; set; } /// /// Whether the user quit gameplay without having either passed or failed. diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index e2470285ba..ad1f9ec897 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -357,9 +357,6 @@ namespace osu.Game.Screens.Play DrawableRuleset.NewResult += r => { - if (GameplayState.ShownFailAnimation) - return; - HealthProcessor.ApplyResult(r); ScoreProcessor.ApplyResult(r); GameplayState.ApplyResult(r); @@ -367,9 +364,6 @@ namespace osu.Game.Screens.Play DrawableRuleset.RevertResult += r => { - if (GameplayState.ShownFailAnimation) - return; - HealthProcessor.RevertResult(r); ScoreProcessor.RevertResult(r); }; @@ -495,7 +489,7 @@ namespace osu.Game.Screens.Play private void updateGameplayState() { - bool inGameplay = !DrawableRuleset.HasReplayLoaded.Value && !DrawableRuleset.IsPaused.Value && !breakTracker.IsBreakTime.Value && !GameplayState.ShownFailAnimation; + bool inGameplay = !DrawableRuleset.HasReplayLoaded.Value && !DrawableRuleset.IsPaused.Value && !breakTracker.IsBreakTime.Value && !GameplayState.HasFailed; OverlayActivationMode.Value = inGameplay ? OverlayActivation.Disabled : OverlayActivation.UserTriggered; localUserPlaying.Value = inGameplay; } @@ -592,7 +586,7 @@ namespace osu.Game.Screens.Play if (showDialogFirst && !pauseOrFailDialogVisible) { // if the fail animation is currently in progress, accelerate it (it will show the pause dialog on completion). - if (ValidForResume && GameplayState.ShownFailAnimation) + if (ValidForResume && GameplayState.HasFailed) { failAnimationContainer.FinishTransforms(true); return false; @@ -739,7 +733,7 @@ namespace osu.Game.Screens.Play } // Only show the completion screen if the player hasn't failed - if (GameplayState.ShownFailAnimation) + if (GameplayState.HasFailed) return; GameplayState.HasPassed = true; @@ -928,11 +922,11 @@ namespace osu.Game.Screens.Play if (Configuration.AllowFailAnimation) { - Debug.Assert(!GameplayState.ShownFailAnimation); + Debug.Assert(!GameplayState.HasFailed); Debug.Assert(!GameplayState.HasPassed); Debug.Assert(!GameplayState.HasQuit); - GameplayState.ShownFailAnimation = true; + GameplayState.HasFailed = true; updateGameplayState(); @@ -1008,13 +1002,13 @@ namespace osu.Game.Screens.Play // replays cannot be paused and exit immediately && !DrawableRuleset.HasReplayLoaded.Value // cannot pause if we are already in a fail state - && !GameplayState.ShownFailAnimation; + && !GameplayState.HasFailed; private bool canResume => // cannot resume from a non-paused state GameplayClockContainer.IsPaused.Value // cannot resume if we are already in a fail state - && !GameplayState.ShownFailAnimation + && !GameplayState.HasFailed // already resuming && !IsResuming; @@ -1148,7 +1142,7 @@ namespace osu.Game.Screens.Play { Debug.Assert(resultsDisplayDelegate == null); - if (!GameplayState.ShownFailAnimation) + if (!GameplayState.HasFailed) GameplayState.HasQuit = true; if (DrawableRuleset.ReplayScore == null) diff --git a/osu.Game/Screens/Play/PlayerTouchInputDetector.cs b/osu.Game/Screens/Play/PlayerTouchInputDetector.cs index 13c94f7b32..12fb748e7d 100644 --- a/osu.Game/Screens/Play/PlayerTouchInputDetector.cs +++ b/osu.Game/Screens/Play/PlayerTouchInputDetector.cs @@ -37,7 +37,7 @@ namespace osu.Game.Screens.Play if (!touchActive.Value) return; - if (gameplayState.HasPassed || gameplayState.ShownFailAnimation || gameplayState.HasQuit) + if (gameplayState.HasPassed || gameplayState.HasFailed || gameplayState.HasQuit) return; if (gameplayState.Score.ScoreInfo.Mods.OfType().Any()) From b48f99ba4bd4f16ebff1dc99accb7a1a5e96abf5 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 28 Jan 2024 18:06:09 +0300 Subject: [PATCH 357/651] Stop using SliderBar as a base --- .../Play/HUD/DefaultSongProgressBar.cs | 2 +- osu.Game/Screens/Play/HUD/SongProgressBar.cs | 67 +++++++++++++------ 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs index 4079351baf..46867e7622 100644 --- a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs @@ -98,7 +98,7 @@ namespace osu.Game.Screens.Play.HUD base.Update(); handleBase.Height = Height - handleContainer.Height; - float newX = (float)Interpolation.Lerp(handleBase.X, NormalizedValue * UsableWidth, Math.Clamp(Time.Elapsed / 40, 0, 1)); + float newX = (float)Interpolation.Lerp(handleBase.X, NormalizedValue * DrawWidth, Math.Clamp(Time.Elapsed / 40, 0, 1)); fill.Width = newX; handleBase.X = newX; diff --git a/osu.Game/Screens/Play/HUD/SongProgressBar.cs b/osu.Game/Screens/Play/HUD/SongProgressBar.cs index db9c8901b4..df4df2a783 100644 --- a/osu.Game/Screens/Play/HUD/SongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/SongProgressBar.cs @@ -3,12 +3,14 @@ using System; using osu.Framework.Bindables; -using osu.Framework.Graphics.UserInterface; +using osu.Framework.Graphics.Containers; +using osu.Framework.Input.Events; using osu.Framework.Threading; +using osuTK; namespace osu.Game.Screens.Play.HUD { - public abstract partial class SongProgressBar : SliderBar + public abstract partial class SongProgressBar : Container { /// /// Action which is invoked when a seek is requested, with the proposed millisecond value for the seek operation. @@ -26,45 +28,66 @@ namespace osu.Game.Screens.Play.HUD protected readonly BindableBool InteractiveBindable = new BindableBool(); - public double StartTime + public double StartTime { get; set; } + + public double EndTime { get; set; } = 1.0; + + public double CurrentTime { get; set; } + + private double length => EndTime - StartTime; + + protected double NormalizedValue => length == 0 ? 1 : Math.Clamp(CurrentTime - StartTime, 0.0, length) / length; + + private bool handleClick; + + protected override bool OnMouseDown(MouseDownEvent e) { - get => CurrentNumber.MinValue; - set => CurrentNumber.MinValue = value; + handleClick = true; + return base.OnMouseDown(e); } - public double EndTime + protected override bool OnClick(ClickEvent e) { - get => CurrentNumber.MaxValue; - set => CurrentNumber.MaxValue = value; + if (handleClick) + handleMouseInput(e); + + return true; } - public double CurrentTime + protected override void OnDrag(DragEvent e) { - get => CurrentNumber.Value; - set => CurrentNumber.Value = value; + handleMouseInput(e); } - protected SongProgressBar() + protected override bool OnDragStart(DragStartEvent e) { - StartTime = 0; - EndTime = 1; + Vector2 posDiff = e.MouseDownPosition - e.MousePosition; + + if (Math.Abs(posDiff.X) < Math.Abs(posDiff.Y)) + { + handleClick = false; + return false; + } + + handleMouseInput(e); + return true; } - protected override void UpdateValue(float value) + private void handleMouseInput(UIEvent e) { - // handled in update + if (!Interactive) + return; + + double relativeX = Math.Clamp(ToLocalSpace(e.ScreenSpaceMousePosition).X / DrawWidth, 0, 1); + onUserChange(StartTime + (EndTime - StartTime) * relativeX); } private ScheduledDelegate? scheduledSeek; - protected override void OnUserChange(double value) + private void onUserChange(double value) { scheduledSeek?.Cancel(); - scheduledSeek = Schedule(() => - { - if (Interactive) - OnSeek?.Invoke(value); - }); + scheduledSeek = Schedule(() => OnSeek?.Invoke(value)); } } } From 23f12e1ea36195ed29fa19955d41290cfbc92328 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 01:49:34 +0900 Subject: [PATCH 358/651] Should not be a container --- osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs | 6 +++--- osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs | 2 +- osu.Game/Screens/Play/HUD/SongProgressBar.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs index 196d8ca278..42f638c386 100644 --- a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs @@ -41,7 +41,7 @@ namespace osu.Game.Screens.Play.HUD CornerRadius = 5; Masking = true; - Children = new Drawable[] + InternalChildren = new Drawable[] { background = new Box { @@ -105,9 +105,9 @@ namespace osu.Game.Screens.Play.HUD audioBar.Length = (float)Interpolation.Lerp(audioBar.Length, NormalizedValue, Math.Clamp(Time.Elapsed / 40, 0, 1)); if (trackTime > CurrentTime) - ChangeChildDepth(audioBar, -1); + ChangeInternalChildDepth(audioBar, -1); else - ChangeChildDepth(audioBar, 0); + ChangeInternalChildDepth(audioBar, 0); float timeDelta = (float)Math.Abs(CurrentTime - trackTime); diff --git a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs index 46867e7622..222d6c17bf 100644 --- a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs @@ -27,7 +27,7 @@ namespace osu.Game.Screens.Play.HUD RelativeSizeAxes = Axes.X; Height = barHeight + handleBarHeight + handleSize.Y; - Children = new Drawable[] + InternalChildren = new Drawable[] { new Box { diff --git a/osu.Game/Screens/Play/HUD/SongProgressBar.cs b/osu.Game/Screens/Play/HUD/SongProgressBar.cs index df4df2a783..140621986c 100644 --- a/osu.Game/Screens/Play/HUD/SongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/SongProgressBar.cs @@ -10,7 +10,7 @@ using osuTK; namespace osu.Game.Screens.Play.HUD { - public abstract partial class SongProgressBar : Container + public abstract partial class SongProgressBar : CompositeDrawable { /// /// Action which is invoked when a seek is requested, with the proposed millisecond value for the seek operation. From f4dd84fa77fe41edc57120063a3df9a4bbb834a7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 02:01:37 +0900 Subject: [PATCH 359/651] Fix various inconsistencies and document better --- .../Screens/Play/HUD/ArgonSongProgress.cs | 1 - .../Screens/Play/HUD/ArgonSongProgressBar.cs | 9 +++++---- .../Screens/Play/HUD/DefaultSongProgress.cs | 1 - .../Play/HUD/DefaultSongProgressBar.cs | 2 +- osu.Game/Screens/Play/HUD/SongProgress.cs | 6 ++++++ osu.Game/Screens/Play/HUD/SongProgressBar.cs | 19 +++++++++++++++---- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs b/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs index a0e74dd6cd..7db3f9fd3c 100644 --- a/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs +++ b/osu.Game/Screens/Play/HUD/ArgonSongProgress.cs @@ -114,7 +114,6 @@ namespace osu.Game.Screens.Play.HUD protected override void UpdateProgress(double progress, bool isIntro) { - bar.CurrentTime = GameplayClock.CurrentTime; bar.Progress = isIntro ? 0 : progress; } } diff --git a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs index 42f638c386..7a7870a775 100644 --- a/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/ArgonSongProgressBar.cs @@ -48,6 +48,7 @@ namespace osu.Game.Screens.Play.HUD RelativeSizeAxes = Axes.Both, Alpha = 0, Colour = OsuColour.Gray(0.2f), + Depth = float.MaxValue, }, audioBar = new RoundedBar { @@ -102,14 +103,14 @@ namespace osu.Game.Screens.Play.HUD base.Update(); playfieldBar.Length = (float)Interpolation.Lerp(playfieldBar.Length, Progress, Math.Clamp(Time.Elapsed / 40, 0, 1)); - audioBar.Length = (float)Interpolation.Lerp(audioBar.Length, NormalizedValue, Math.Clamp(Time.Elapsed / 40, 0, 1)); + audioBar.Length = (float)Interpolation.Lerp(audioBar.Length, AudioProgress, Math.Clamp(Time.Elapsed / 40, 0, 1)); - if (trackTime > CurrentTime) + if (trackTime > AudioTime) ChangeInternalChildDepth(audioBar, -1); else - ChangeInternalChildDepth(audioBar, 0); + ChangeInternalChildDepth(audioBar, 1); - float timeDelta = (float)Math.Abs(CurrentTime - trackTime); + float timeDelta = (float)Math.Abs(AudioTime - trackTime); const float colour_transition_threshold = 20000; diff --git a/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs b/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs index be310df3a9..f01c11855c 100644 --- a/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs +++ b/osu.Game/Screens/Play/HUD/DefaultSongProgress.cs @@ -98,7 +98,6 @@ namespace osu.Game.Screens.Play.HUD protected override void UpdateProgress(double progress, bool isIntro) { - bar.CurrentTime = GameplayClock.CurrentTime; graph.Progress = isIntro ? 0 : (int)(graph.ColumnCount * progress); } diff --git a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs index 222d6c17bf..05c8c6c46b 100644 --- a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs @@ -98,7 +98,7 @@ namespace osu.Game.Screens.Play.HUD base.Update(); handleBase.Height = Height - handleContainer.Height; - float newX = (float)Interpolation.Lerp(handleBase.X, NormalizedValue * DrawWidth, Math.Clamp(Time.Elapsed / 40, 0, 1)); + float newX = (float)Interpolation.Lerp(handleBase.X, AudioProgress * DrawWidth, Math.Clamp(Time.Elapsed / 40, 0, 1)); fill.Width = newX; handleBase.X = newX; diff --git a/osu.Game/Screens/Play/HUD/SongProgress.cs b/osu.Game/Screens/Play/HUD/SongProgress.cs index 962752ba5a..296306ec89 100644 --- a/osu.Game/Screens/Play/HUD/SongProgress.cs +++ b/osu.Game/Screens/Play/HUD/SongProgress.cs @@ -71,7 +71,13 @@ namespace osu.Game.Screens.Play.HUD protected double LastHitTime { get; private set; } + /// + /// Called every update frame with current progress information. + /// + /// Current (visual) progress through the beatmap (0..1). + /// If true, progress is (0..1) through the intro. protected abstract void UpdateProgress(double progress, bool isIntro); + protected virtual void UpdateObjects(IEnumerable objects) { } [BackgroundDependencyLoader] diff --git a/osu.Game/Screens/Play/HUD/SongProgressBar.cs b/osu.Game/Screens/Play/HUD/SongProgressBar.cs index 140621986c..ea2e5b2891 100644 --- a/osu.Game/Screens/Play/HUD/SongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/SongProgressBar.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Events; @@ -12,6 +13,20 @@ namespace osu.Game.Screens.Play.HUD { public abstract partial class SongProgressBar : CompositeDrawable { + /// + /// The current seek position of the audio, on a (0..1) range. + /// This is generally the seek target, which will eventually match the gameplay clock when it catches up. + /// + protected double AudioProgress => length == 0 ? 1 : AudioTime / length; + + /// + /// The current (non-frame-stable) audio time. + /// + protected double AudioTime => Math.Clamp(GameplayClock.CurrentTime - StartTime, 0.0, length); + + [Resolved] + protected IGameplayClock GameplayClock { get; private set; } = null!; + /// /// Action which is invoked when a seek is requested, with the proposed millisecond value for the seek operation. /// @@ -32,12 +47,8 @@ namespace osu.Game.Screens.Play.HUD public double EndTime { get; set; } = 1.0; - public double CurrentTime { get; set; } - private double length => EndTime - StartTime; - protected double NormalizedValue => length == 0 ? 1 : Math.Clamp(CurrentTime - StartTime, 0.0, length) / length; - private bool handleClick; protected override bool OnMouseDown(MouseDownEvent e) From 462dab3c90d762de0c9c0918d93fe90472956a06 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 02:13:39 +0900 Subject: [PATCH 360/651] Remove unnecessary bindable --- osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs | 11 +++++++---- osu.Game/Screens/Play/HUD/SongProgressBar.cs | 9 +-------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs index 05c8c6c46b..d5a6a75793 100644 --- a/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/DefaultSongProgressBar.cs @@ -86,11 +86,14 @@ namespace osu.Game.Screens.Play.HUD }; } - protected override void LoadComplete() + public override bool Interactive { - base.LoadComplete(); - - InteractiveBindable.BindValueChanged(i => handleBase.FadeTo(i.NewValue ? 1 : 0, 200), true); + get => base.Interactive; + set + { + base.Interactive = value; + handleBase.FadeTo(value ? 1 : 0, 200); + } } protected override void Update() diff --git a/osu.Game/Screens/Play/HUD/SongProgressBar.cs b/osu.Game/Screens/Play/HUD/SongProgressBar.cs index ea2e5b2891..40c4e587b9 100644 --- a/osu.Game/Screens/Play/HUD/SongProgressBar.cs +++ b/osu.Game/Screens/Play/HUD/SongProgressBar.cs @@ -3,7 +3,6 @@ using System; using osu.Framework.Allocation; -using osu.Framework.Bindables; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Events; using osu.Framework.Threading; @@ -35,13 +34,7 @@ namespace osu.Game.Screens.Play.HUD /// /// Whether the progress bar should allow interaction, ie. to perform seek operations. /// - public bool Interactive - { - get => InteractiveBindable.Value; - set => InteractiveBindable.Value = value; - } - - protected readonly BindableBool InteractiveBindable = new BindableBool(); + public virtual bool Interactive { get; set; } public double StartTime { get; set; } From ee4fe1c0683a26bcb8559ac1918d52a88e6a1276 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sun, 28 Jan 2024 23:11:42 +0300 Subject: [PATCH 361/651] Fix relax mod not handling objects close to a previous slider's follow area --- osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs index 40fadfb77e..3679425389 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs @@ -88,7 +88,7 @@ namespace osu.Game.Rulesets.Osu.Mods if (!slider.HeadCircle.IsHit) handleHitCircle(slider.HeadCircle); - requiresHold |= slider.SliderInputManager.IsMouseInFollowArea(true); + requiresHold |= slider.SliderInputManager.IsMouseInFollowArea(slider.Tracking.Value); break; case DrawableSpinner spinner: From 9c55498058abbb9b5563319abbc942a186b556cd Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 15:28:14 +0900 Subject: [PATCH 362/651] r# says hi --- .../NonVisual/Skinning/LegacySkinTextureFallbackTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs index fbe5a0e4d7..98cb66a234 100644 --- a/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs +++ b/osu.Game.Tests/NonVisual/Skinning/LegacySkinTextureFallbackTest.cs @@ -169,9 +169,9 @@ namespace osu.Game.Tests.NonVisual.Skinning public IRenderer Renderer => new DummyRenderer(); public AudioManager AudioManager => null; - public IResourceStore Files => null; - public IResourceStore Resources => null; - public RealmAccess RealmAccess => null; + public IResourceStore Files => null!; + public IResourceStore Resources => null!; + public RealmAccess RealmAccess => null!; public IResourceStore CreateTextureLoaderStore(IResourceStore underlyingStore) => textureStore; } } From de32e7815b19d8ea5a19114eebc67d3f85ecaa27 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 14:57:19 +0900 Subject: [PATCH 363/651] Clean up `DrawableHitObject` events on `Dispose` This is just general safeties to avoid cases where components don't correctly unbind events. --- osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs | 7 +++++++ osu.Game/Rulesets/Objects/HitObject.cs | 2 ++ 2 files changed, 9 insertions(+) diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index bce28361cb..5662fb2293 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -768,6 +768,13 @@ namespace osu.Game.Rulesets.Objects.Drawables if (CurrentSkin != null) CurrentSkin.SourceChanged -= skinSourceChanged; + + // Safeties against shooting in foot in cases where these are bound by external entities (like playfield) that don't clean up. + OnNestedDrawableCreated = null; + OnNewResult = null; + OnRevertResult = null; + DefaultsApplied = null; + HitObjectApplied = null; } public Bindable AnimationStartTime { get; } = new BindableDouble(); diff --git a/osu.Game/Rulesets/Objects/HitObject.cs b/osu.Game/Rulesets/Objects/HitObject.cs index ec2a4a31f6..ef8bd08bf4 100644 --- a/osu.Game/Rulesets/Objects/HitObject.cs +++ b/osu.Game/Rulesets/Objects/HitObject.cs @@ -38,6 +38,8 @@ namespace osu.Game.Rulesets.Objects /// /// Invoked after has completed on this . /// + // TODO: This has no implicit unbind flow. Currently, if a Playfield manages HitObjects it will leave a bound event on this and cause the + // playfield to remain in memory. public event Action DefaultsApplied; public readonly Bindable StartTimeBindable = new BindableDouble(); From 76832a1495d2d94fc433e46d7413af69cd9e3463 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 15:15:10 +0900 Subject: [PATCH 364/651] Remove `ScorePerformanceCache` This class was only used in two places, both on the results screen, but was holding references to `OsuPlayfield` game-wide (due to unrelated issues, but still). Because I can't really think of future use cases for this, and running the calculation twice at results screen isn't a huge overhead, let's just do that for now to keep things simple. --- osu.Game/OsuGameBase.cs | 4 -- .../PerformanceBreakdownCalculator.cs | 24 +++++-- .../Difficulty/PerformanceCalculator.cs | 5 ++ osu.Game/Scoring/ScorePerformanceCache.cs | 68 ------------------- .../Statistics/PerformanceStatistic.cs | 20 ++++-- .../Statistics/PerformanceBreakdownChart.cs | 5 +- 6 files changed, 40 insertions(+), 86 deletions(-) delete mode 100644 osu.Game/Scoring/ScorePerformanceCache.cs diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index 4e465f59df..2208f7d7ca 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -340,10 +340,6 @@ namespace osu.Game dependencies.Cache(beatmapCache = new BeatmapLookupCache()); base.Content.Add(beatmapCache); - var scorePerformanceManager = new ScorePerformanceCache(); - dependencies.Cache(scorePerformanceManager); - base.Content.Add(scorePerformanceManager); - dependencies.CacheAs(rulesetConfigCache = new RulesetConfigCache(realm, RulesetStore)); var powerStatus = CreateBatteryInfo(); diff --git a/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs b/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs index ad9257d4f3..4563c264f7 100644 --- a/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs +++ b/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs @@ -21,21 +21,29 @@ namespace osu.Game.Rulesets.Difficulty { private readonly IBeatmap playableBeatmap; private readonly BeatmapDifficultyCache difficultyCache; - private readonly ScorePerformanceCache performanceCache; - public PerformanceBreakdownCalculator(IBeatmap playableBeatmap, BeatmapDifficultyCache difficultyCache, ScorePerformanceCache performanceCache) + public PerformanceBreakdownCalculator(IBeatmap playableBeatmap, BeatmapDifficultyCache difficultyCache) { this.playableBeatmap = playableBeatmap; this.difficultyCache = difficultyCache; - this.performanceCache = performanceCache; } [ItemCanBeNull] public async Task CalculateAsync(ScoreInfo score, CancellationToken cancellationToken = default) { + var attributes = await difficultyCache.GetDifficultyAsync(score.BeatmapInfo!, score.Ruleset, score.Mods, cancellationToken).ConfigureAwait(false); + + var performanceCalculator = score.Ruleset.CreateInstance().CreatePerformanceCalculator(); + + // Performance calculation requires the beatmap and ruleset to be locally available. If not, return a default value. + if (attributes?.Attributes == null || performanceCalculator == null) + return null; + + cancellationToken.ThrowIfCancellationRequested(); + PerformanceAttributes[] performanceArray = await Task.WhenAll( // compute actual performance - performanceCache.CalculatePerformanceAsync(score, cancellationToken), + performanceCalculator.CalculateAsync(score, attributes.Value.Attributes, cancellationToken), // compute performance for perfect play getPerfectPerformance(score, cancellationToken) ).ConfigureAwait(false); @@ -88,8 +96,12 @@ namespace osu.Game.Rulesets.Difficulty cancellationToken ).ConfigureAwait(false); - // ScorePerformanceCache is not used to avoid caching multiple copies of essentially identical perfect performance attributes - return difficulty == null ? null : ruleset.CreatePerformanceCalculator()?.Calculate(perfectPlay, difficulty.Value.Attributes.AsNonNull()); + var performanceCalculator = ruleset.CreatePerformanceCalculator(); + + if (performanceCalculator == null || difficulty == null) + return null; + + return await performanceCalculator.CalculateAsync(perfectPlay, difficulty.Value.Attributes.AsNonNull(), cancellationToken).ConfigureAwait(false); }, cancellationToken); } diff --git a/osu.Game/Rulesets/Difficulty/PerformanceCalculator.cs b/osu.Game/Rulesets/Difficulty/PerformanceCalculator.cs index f5e826f8c7..966da0ff12 100644 --- a/osu.Game/Rulesets/Difficulty/PerformanceCalculator.cs +++ b/osu.Game/Rulesets/Difficulty/PerformanceCalculator.cs @@ -1,6 +1,8 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Threading; +using System.Threading.Tasks; using osu.Game.Beatmaps; using osu.Game.Scoring; @@ -15,6 +17,9 @@ namespace osu.Game.Rulesets.Difficulty Ruleset = ruleset; } + public Task CalculateAsync(ScoreInfo score, DifficultyAttributes attributes, CancellationToken cancellationToken) + => Task.Run(() => CreatePerformanceAttributes(score, attributes), cancellationToken); + public PerformanceAttributes Calculate(ScoreInfo score, DifficultyAttributes attributes) => CreatePerformanceAttributes(score, attributes); diff --git a/osu.Game/Scoring/ScorePerformanceCache.cs b/osu.Game/Scoring/ScorePerformanceCache.cs deleted file mode 100644 index 1f2b1aeb95..0000000000 --- a/osu.Game/Scoring/ScorePerformanceCache.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using System; -using System.Threading; -using System.Threading.Tasks; -using osu.Framework.Allocation; -using osu.Game.Beatmaps; -using osu.Game.Database; -using osu.Game.Rulesets.Difficulty; - -namespace osu.Game.Scoring -{ - /// - /// A component which performs and acts as a central cache for performance calculations of locally databased scores. - /// Currently not persisted between game sessions. - /// - public partial class ScorePerformanceCache : MemoryCachingComponent - { - [Resolved] - private BeatmapDifficultyCache difficultyCache { get; set; } = null!; - - protected override bool CacheNullValues => false; - - /// - /// Calculates performance for the given . - /// - /// The score to do the calculation on. - /// An optional to cancel the operation. - public Task CalculatePerformanceAsync(ScoreInfo score, CancellationToken token = default) => - GetAsync(new PerformanceCacheLookup(score), token); - - protected override async Task ComputeValueAsync(PerformanceCacheLookup lookup, CancellationToken token = default) - { - var score = lookup.ScoreInfo; - - var attributes = await difficultyCache.GetDifficultyAsync(score.BeatmapInfo!, score.Ruleset, score.Mods, token).ConfigureAwait(false); - - // Performance calculation requires the beatmap and ruleset to be locally available. If not, return a default value. - if (attributes?.Attributes == null) - return null; - - token.ThrowIfCancellationRequested(); - - return score.Ruleset.CreateInstance().CreatePerformanceCalculator()?.Calculate(score, attributes.Value.Attributes); - } - - public readonly struct PerformanceCacheLookup - { - public readonly ScoreInfo ScoreInfo; - - public PerformanceCacheLookup(ScoreInfo info) - { - ScoreInfo = info; - } - - public override int GetHashCode() - { - var hash = new HashCode(); - - hash.Add(ScoreInfo.Hash); - hash.Add(ScoreInfo.ID); - - return hash.ToHashCode(); - } - } - } -} diff --git a/osu.Game/Screens/Ranking/Expanded/Statistics/PerformanceStatistic.cs b/osu.Game/Screens/Ranking/Expanded/Statistics/PerformanceStatistic.cs index 22509b2cea..22c1e26d43 100644 --- a/osu.Game/Screens/Ranking/Expanded/Statistics/PerformanceStatistic.cs +++ b/osu.Game/Screens/Ranking/Expanded/Statistics/PerformanceStatistic.cs @@ -5,10 +5,11 @@ using System; using System.Threading; +using System.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Extensions; using osu.Framework.Graphics; +using osu.Game.Beatmaps; using osu.Game.Graphics.UserInterface; using osu.Game.Resources.Localisation.Web; using osu.Game.Scoring; @@ -32,7 +33,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics } [BackgroundDependencyLoader] - private void load(ScorePerformanceCache performanceCache) + private void load(BeatmapDifficultyCache difficultyCache, CancellationToken? cancellationToken) { if (score.PP.HasValue) { @@ -40,8 +41,19 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics } else { - performanceCache.CalculatePerformanceAsync(score, cancellationTokenSource.Token) - .ContinueWith(t => Schedule(() => setPerformanceValue(t.GetResultSafely()?.Total)), cancellationTokenSource.Token); + Task.Run(async () => + { + var attributes = await difficultyCache.GetDifficultyAsync(score.BeatmapInfo!, score.Ruleset, score.Mods, cancellationToken ?? default).ConfigureAwait(false); + var performanceCalculator = score.Ruleset.CreateInstance().CreatePerformanceCalculator(); + + // Performance calculation requires the beatmap and ruleset to be locally available. If not, return a default value. + if (attributes?.Attributes == null || performanceCalculator == null) + return; + + var result = await performanceCalculator.CalculateAsync(score, attributes.Value.Attributes, cancellationToken ?? default).ConfigureAwait(false); + + Schedule(() => setPerformanceValue(result.Total)); + }, cancellationToken ?? default); } } diff --git a/osu.Game/Screens/Ranking/Statistics/PerformanceBreakdownChart.cs b/osu.Game/Screens/Ranking/Statistics/PerformanceBreakdownChart.cs index ee0ce6183d..8b13f0951c 100644 --- a/osu.Game/Screens/Ranking/Statistics/PerformanceBreakdownChart.cs +++ b/osu.Game/Screens/Ranking/Statistics/PerformanceBreakdownChart.cs @@ -39,9 +39,6 @@ namespace osu.Game.Screens.Ranking.Statistics private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); - [Resolved] - private ScorePerformanceCache performanceCache { get; set; } - [Resolved] private BeatmapDifficultyCache difficultyCache { get; set; } @@ -148,7 +145,7 @@ namespace osu.Game.Screens.Ranking.Statistics spinner.Show(); - new PerformanceBreakdownCalculator(playableBeatmap, difficultyCache, performanceCache) + new PerformanceBreakdownCalculator(playableBeatmap, difficultyCache) .CalculateAsync(score, cancellationTokenSource.Token) .ContinueWith(t => Schedule(() => setPerformanceValue(t.GetResultSafely()))); } From eb90ee5415b05dd827464fcd3c715f731da2df1f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 15:39:31 +0900 Subject: [PATCH 365/651] Add safety in `ResultsScreen.Exit` to ensure `HitEvents` are not holding references This is a catch-all safety disconnecting `ScoreInfo` from `HitObject`s. --- osu.Game/Screens/Ranking/ResultsScreen.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index 697d62ad6e..410fdf7090 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -275,6 +275,11 @@ namespace osu.Game.Screens.Ranking if (base.OnExiting(e)) return true; + // This is a stop-gap safety against components holding references to gameplay after exiting the gameplay flow. + // Right now, HitEvents are only used up to the results screen. If this changes in the future we need to remove + // HitObject references from HitEvent. + Score.HitEvents.Clear(); + this.FadeOut(100); return false; } From 760368709a4855d0c64a89b03d455a8dd514b987 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 16:12:00 +0900 Subject: [PATCH 366/651] Mark some delegates as static because we can --- osu.Game.Rulesets.Osu/OsuInputManager.cs | 2 +- osu.Game/Rulesets/UI/RulesetInputManager.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/OsuInputManager.cs b/osu.Game.Rulesets.Osu/OsuInputManager.cs index ccd388192e..e472de1dfe 100644 --- a/osu.Game.Rulesets.Osu/OsuInputManager.cs +++ b/osu.Game.Rulesets.Osu/OsuInputManager.cs @@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Osu base.ReloadMappings(realmKeyBindings); if (!AllowGameplayInputs) - KeyBindings = KeyBindings.Where(b => b.GetAction() == OsuAction.Smoke).ToList(); + KeyBindings = KeyBindings.Where(static b => b.GetAction() == OsuAction.Smoke).ToList(); } } } diff --git a/osu.Game/Rulesets/UI/RulesetInputManager.cs b/osu.Game/Rulesets/UI/RulesetInputManager.cs index 041c7a13ae..a08c3bab08 100644 --- a/osu.Game/Rulesets/UI/RulesetInputManager.cs +++ b/osu.Game/Rulesets/UI/RulesetInputManager.cs @@ -218,7 +218,7 @@ namespace osu.Game.Rulesets.UI { base.ReloadMappings(realmKeyBindings); - KeyBindings = KeyBindings.Where(b => RealmKeyBindingStore.CheckValidForGameplay(b.KeyCombination)).ToList(); + KeyBindings = KeyBindings.Where(static b => RealmKeyBindingStore.CheckValidForGameplay(b.KeyCombination)).ToList(); RealmKeyBindingStore.ClearDuplicateBindings(KeyBindings); } } From fb24c663425648481a0e6f2006801cc0165e34dc Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 16:13:30 +0900 Subject: [PATCH 367/651] Mark `ResultsScreen.Score` as nullable Is nullable in playlist results at very least. --- .../Visual/Gameplay/TestScenePlayerLocalScoreImport.cs | 4 ++-- osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs | 2 +- .../Visual/Playlists/TestScenePlaylistsResultsScreen.cs | 2 +- .../Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs | 2 +- osu.Game/Screens/Play/SpectatorResultsScreen.cs | 2 +- osu.Game/Screens/Ranking/ResultsScreen.cs | 6 ++++-- osu.Game/Screens/Ranking/SoloResultsScreen.cs | 7 +++++++ 7 files changed, 17 insertions(+), 8 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs index fafd1330cc..c645b1b01c 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLocalScoreImport.cs @@ -138,8 +138,8 @@ namespace osu.Game.Tests.Visual.Gameplay AddUntilStep("results displayed", () => Player.GetChildScreen() is ResultsScreen); // Player creates new instance of mods after gameplay to ensure any runtime references to drawables etc. are not retained. - AddAssert("results screen score has copied mods", () => (Player.GetChildScreen() as ResultsScreen)?.Score.Mods.First(), () => Is.Not.SameAs(playerMods.First())); - AddAssert("results screen score has matching", () => (Player.GetChildScreen() as ResultsScreen)?.Score.Mods.First(), () => Is.EqualTo(playerMods.First())); + AddAssert("results screen score has copied mods", () => (Player.GetChildScreen() as ResultsScreen)?.Score?.Mods.First(), () => Is.Not.SameAs(playerMods.First())); + AddAssert("results screen score has matching", () => (Player.GetChildScreen() as ResultsScreen)?.Score?.Mods.First(), () => Is.EqualTo(playerMods.First())); AddUntilStep("score in database", () => Realm.Run(r => r.Find(Player.Score.ScoreInfo.ID) != null)); AddUntilStep("databased score has correct mods", () => Realm.Run(r => r.Find(Player.Score.ScoreInfo.ID))!.Mods.First(), () => Is.EqualTo(playerMods.First())); diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs index 747805edc8..8c7576ff52 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs @@ -698,7 +698,7 @@ namespace osu.Game.Tests.Visual.Multiplayer { var scoreInfo = ((ResultsScreen)multiplayerComponents.CurrentScreen).Score; - return !scoreInfo.Passed && scoreInfo.Rank == ScoreRank.F; + return scoreInfo?.Passed == false && scoreInfo.Rank == ScoreRank.F; }); } diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs index e805b03542..25ee20b089 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsResultsScreen.cs @@ -420,7 +420,7 @@ namespace osu.Game.Tests.Visual.Playlists public new LoadingSpinner RightSpinner => base.RightSpinner; public new ScorePanelList ScorePanelList => base.ScorePanelList; - public TestResultsScreen(ScoreInfo score, int roomId, PlaylistItem playlistItem, bool allowRetry = true) + public TestResultsScreen([CanBeNull] ScoreInfo score, int roomId, PlaylistItem playlistItem, bool allowRetry = true) : base(score, roomId, playlistItem, allowRetry) { } diff --git a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs index aa72394ac9..6a1924dea2 100644 --- a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs @@ -41,7 +41,7 @@ namespace osu.Game.Screens.OnlinePlay.Playlists [Resolved] private RulesetStore rulesets { get; set; } - public PlaylistsResultsScreen(ScoreInfo score, long roomId, PlaylistItem playlistItem, bool allowRetry, bool allowWatchingReplay = true) + public PlaylistsResultsScreen([CanBeNull] ScoreInfo score, long roomId, PlaylistItem playlistItem, bool allowRetry, bool allowWatchingReplay = true) : base(score, allowRetry, allowWatchingReplay) { this.roomId = roomId; diff --git a/osu.Game/Screens/Play/SpectatorResultsScreen.cs b/osu.Game/Screens/Play/SpectatorResultsScreen.cs index 001d3b4bbc..393cbddb34 100644 --- a/osu.Game/Screens/Play/SpectatorResultsScreen.cs +++ b/osu.Game/Screens/Play/SpectatorResultsScreen.cs @@ -28,7 +28,7 @@ namespace osu.Game.Screens.Play private void userBeganPlaying(int userId, SpectatorState state) { - if (userId == Score.UserID) + if (userId == Score?.UserID) { Schedule(() => { diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index 410fdf7090..82dade40eb 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using System.Linq; +using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Audio.Sample; @@ -45,6 +46,7 @@ namespace osu.Game.Screens.Ranking public readonly Bindable SelectedScore = new Bindable(); + [CanBeNull] public readonly ScoreInfo Score; protected ScorePanelList ScorePanelList { get; private set; } @@ -69,7 +71,7 @@ namespace osu.Game.Screens.Ranking private Sample popInSample; - protected ResultsScreen(ScoreInfo score, bool allowRetry, bool allowWatchingReplay = true) + protected ResultsScreen([CanBeNull] ScoreInfo score, bool allowRetry, bool allowWatchingReplay = true) { Score = score; this.allowRetry = allowRetry; @@ -278,7 +280,7 @@ namespace osu.Game.Screens.Ranking // This is a stop-gap safety against components holding references to gameplay after exiting the gameplay flow. // Right now, HitEvents are only used up to the results screen. If this changes in the future we need to remove // HitObject references from HitEvent. - Score.HitEvents.Clear(); + Score?.HitEvents.Clear(); this.FadeOut(100); return false; diff --git a/osu.Game/Screens/Ranking/SoloResultsScreen.cs b/osu.Game/Screens/Ranking/SoloResultsScreen.cs index da08a26a58..22d631e137 100644 --- a/osu.Game/Screens/Ranking/SoloResultsScreen.cs +++ b/osu.Game/Screens/Ranking/SoloResultsScreen.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; @@ -45,12 +46,16 @@ namespace osu.Game.Screens.Ranking { base.LoadComplete(); + Debug.Assert(Score != null); + if (ShowUserStatistics) statisticsSubscription = soloStatisticsWatcher.RegisterForStatisticsUpdateAfter(Score, update => statisticsUpdate.Value = update); } protected override StatisticsPanel CreateStatisticsPanel() { + Debug.Assert(Score != null); + if (ShowUserStatistics) { return new SoloStatisticsPanel(Score) @@ -64,6 +69,8 @@ namespace osu.Game.Screens.Ranking protected override APIRequest? FetchScores(Action>? scoresCallback) { + Debug.Assert(Score != null); + if (Score.BeatmapInfo!.OnlineID <= 0 || Score.BeatmapInfo.Status <= BeatmapOnlineStatus.Pending) return null; From a41ba7c381ba66ca432a34dd4ecc9cd655119772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 29 Jan 2024 08:43:16 +0100 Subject: [PATCH 368/651] Fix more nullable inspections --- osu.Game.Tests/Visual/Gameplay/TestSceneAutoplay.cs | 4 ++-- osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs | 2 +- osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneAutoplay.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneAutoplay.cs index 3ac4d25028..636cd78d9c 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneAutoplay.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneAutoplay.cs @@ -47,8 +47,8 @@ namespace osu.Game.Tests.Visual.Gameplay seekTo(referenceBeatmap.HitObjects[^1].GetEndTime()); AddUntilStep("results displayed", () => getResultsScreen()?.IsLoaded == true); - AddAssert("score has combo", () => getResultsScreen().Score.Combo > 100); - AddAssert("score has no misses", () => getResultsScreen().Score.Statistics[HitResult.Miss] == 0); + AddAssert("score has combo", () => getResultsScreen().Score!.Combo > 100); + AddAssert("score has no misses", () => getResultsScreen().Score!.Statistics[HitResult.Miss] == 0); AddUntilStep("avatar displayed", () => getAvatar() != null); AddAssert("avatar not clickable", () => getAvatar().ChildrenOfType().First().Action == null); diff --git a/osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs b/osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs index 459a8b0df5..6590339311 100644 --- a/osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs +++ b/osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs @@ -193,7 +193,7 @@ namespace osu.Game.Tests.Visual.Navigation case ScorePresentType.Results: AddUntilStep("wait for results", () => lastWaitedScreen != Game.ScreenStack.CurrentScreen && Game.ScreenStack.CurrentScreen is ResultsScreen); AddStep("store last waited screen", () => lastWaitedScreen = Game.ScreenStack.CurrentScreen); - AddUntilStep("correct score displayed", () => ((ResultsScreen)Game.ScreenStack.CurrentScreen).Score.Equals(getImport())); + AddUntilStep("correct score displayed", () => ((ResultsScreen)Game.ScreenStack.CurrentScreen).Score!.Equals(getImport())); AddAssert("correct ruleset selected", () => Game.Ruleset.Value.Equals(getImport().Ruleset)); break; diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs index 866e20d063..5671cbebd7 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs @@ -418,7 +418,7 @@ namespace osu.Game.Tests.Visual.Ranking public UnrankedSoloResultsScreen(ScoreInfo score) : base(score, true) { - Score.BeatmapInfo!.OnlineID = 0; + Score!.BeatmapInfo!.OnlineID = 0; Score.BeatmapInfo.Status = BeatmapOnlineStatus.Pending; } From ef94eff5745e577cec54615d6c69522100b20b87 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 16:56:28 +0900 Subject: [PATCH 369/651] Rename `PollingChatClientConnector` to better describe usage --- osu.Game/Online/API/DummyAPIAccess.cs | 2 +- ...llingChatClientConnector.cs => TestChatClientConnector.cs} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename osu.Game/Tests/{PollingChatClientConnector.cs => TestChatClientConnector.cs} (89%) diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs index 2d5852b209..3c60513495 100644 --- a/osu.Game/Online/API/DummyAPIAccess.cs +++ b/osu.Game/Online/API/DummyAPIAccess.cs @@ -148,7 +148,7 @@ namespace osu.Game.Online.API public IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null; - public IChatClient GetChatClient() => new PollingChatClientConnector(this); + public IChatClient GetChatClient() => new TestChatClientConnector(this); public RegistrationRequest.RegistrationRequestErrors? CreateAccount(string email, string username, string password) { diff --git a/osu.Game/Tests/PollingChatClientConnector.cs b/osu.Game/Tests/TestChatClientConnector.cs similarity index 89% rename from osu.Game/Tests/PollingChatClientConnector.cs rename to osu.Game/Tests/TestChatClientConnector.cs index f1b0d9dd7d..40e15b5ef5 100644 --- a/osu.Game/Tests/PollingChatClientConnector.cs +++ b/osu.Game/Tests/TestChatClientConnector.cs @@ -11,7 +11,7 @@ using osu.Game.Online.Chat; namespace osu.Game.Tests { - public class PollingChatClientConnector : PersistentEndpointClientConnector, IChatClient + public class TestChatClientConnector : PersistentEndpointClientConnector, IChatClient { public event Action? ChannelJoined; @@ -29,7 +29,7 @@ namespace osu.Game.Tests // don't really need to do anything special if we poll every second anyway. } - public PollingChatClientConnector(IAPIProvider api) + public TestChatClientConnector(IAPIProvider api) : base(api) { Start(); From 363fd1d54f76c82e639d9394aaa05e1a0cbfa28b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 29 Jan 2024 09:05:03 +0100 Subject: [PATCH 370/651] Remove no longer relevant changes --- .../DevelopmentEndpointConfiguration.cs | 1 - osu.Game/Online/EndpointConfiguration.cs | 5 - .../ExperimentalEndpointConfiguration.cs | 1 - .../WebSocket/OsuClientWebSocket.cs | 154 ------------------ .../Online/ProductionEndpointConfiguration.cs | 1 - 5 files changed, 162 deletions(-) delete mode 100644 osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs diff --git a/osu.Game/Online/DevelopmentEndpointConfiguration.cs b/osu.Game/Online/DevelopmentEndpointConfiguration.cs index 1c78c3c147..5f3c353f4d 100644 --- a/osu.Game/Online/DevelopmentEndpointConfiguration.cs +++ b/osu.Game/Online/DevelopmentEndpointConfiguration.cs @@ -13,7 +13,6 @@ namespace osu.Game.Online SpectatorEndpointUrl = $@"{APIEndpointUrl}/signalr/spectator"; MultiplayerEndpointUrl = $@"{APIEndpointUrl}/signalr/multiplayer"; MetadataEndpointUrl = $@"{APIEndpointUrl}/signalr/metadata"; - NotificationsWebSocketEndpointUrl = "wss://dev.ppy.sh/home/notifications/feed"; } } } diff --git a/osu.Game/Online/EndpointConfiguration.cs b/osu.Game/Online/EndpointConfiguration.cs index 6187471b65..f3bcced630 100644 --- a/osu.Game/Online/EndpointConfiguration.cs +++ b/osu.Game/Online/EndpointConfiguration.cs @@ -44,10 +44,5 @@ namespace osu.Game.Online /// The endpoint for the SignalR metadata server. /// public string MetadataEndpointUrl { get; set; } - - /// - /// The endpoint for the notifications websocket. - /// - public string NotificationsWebSocketEndpointUrl { get; set; } } } diff --git a/osu.Game/Online/ExperimentalEndpointConfiguration.cs b/osu.Game/Online/ExperimentalEndpointConfiguration.cs index bc65fd63f3..c3d0014c8b 100644 --- a/osu.Game/Online/ExperimentalEndpointConfiguration.cs +++ b/osu.Game/Online/ExperimentalEndpointConfiguration.cs @@ -14,7 +14,6 @@ namespace osu.Game.Online SpectatorEndpointUrl = "https://spectator.ppy.sh/spectator"; MultiplayerEndpointUrl = "https://spectator.ppy.sh/multiplayer"; MetadataEndpointUrl = "https://spectator.ppy.sh/metadata"; - NotificationsWebSocketEndpointUrl = "wss://notify.ppy.sh"; } } } diff --git a/osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs b/osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs deleted file mode 100644 index 965f606bdc..0000000000 --- a/osu.Game/Online/Notifications/WebSocket/OsuClientWebSocket.cs +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using System; -using System.Diagnostics; -using System.Net; -using System.Net.WebSockets; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Newtonsoft.Json; -using osu.Framework.Extensions.TypeExtensions; -using osu.Framework.Logging; -using osu.Game.Online.API; - -namespace osu.Game.Online.Notifications.WebSocket -{ - public class OsuClientWebSocket : IAsyncDisposable - { - public event Func? MessageReceived; - public event Func? Closed; - - private readonly string endpoint; - private readonly ClientWebSocket socket; - - private CancellationTokenSource? linkedTokenSource = null; - - public OsuClientWebSocket(IAPIProvider api, string endpoint) - { - socket = new ClientWebSocket(); - socket.Options.SetRequestHeader(@"Authorization", @$"Bearer {api.AccessToken}"); - socket.Options.Proxy = WebRequest.DefaultWebProxy; - if (socket.Options.Proxy != null) - socket.Options.Proxy.Credentials = CredentialCache.DefaultCredentials; - - this.endpoint = endpoint; - } - - public async Task ConnectAsync(CancellationToken cancellationToken) - { - if (socket.State == WebSocketState.Connecting || socket.State == WebSocketState.Open) - throw new InvalidOperationException("Connection is already opened"); - - Debug.Assert(linkedTokenSource == null); - linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); - - await socket.ConnectAsync(new Uri(endpoint), linkedTokenSource.Token).ConfigureAwait(false); - runReadLoop(linkedTokenSource.Token); - } - - private void runReadLoop(CancellationToken cancellationToken) => Task.Factory.StartNew(async () => - { - byte[] buffer = new byte[1024]; - StringBuilder messageResult = new StringBuilder(); - - while (!cancellationToken.IsCancellationRequested) - { - try - { - WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false); - - switch (result.MessageType) - { - case WebSocketMessageType.Text: - messageResult.Append(Encoding.UTF8.GetString(buffer[..result.Count])); - - if (result.EndOfMessage) - { - SocketMessage? message = JsonConvert.DeserializeObject(messageResult.ToString()); - messageResult.Clear(); - - Debug.Assert(message != null); - - if (message.Error != null) - { - Logger.Log($"{GetType().ReadableName()} error: {message.Error}", LoggingTarget.Network); - break; - } - - await invokeMessageReceived(message).ConfigureAwait(false); - } - - break; - - case WebSocketMessageType.Binary: - throw new NotImplementedException("Binary message type not supported."); - - case WebSocketMessageType.Close: - throw new WebException("Connection closed by remote host."); - } - } - catch (Exception ex) - { - await invokeClosed(ex).ConfigureAwait(false); - return; - } - } - }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default); - - private async Task invokeMessageReceived(SocketMessage message) - { - if (MessageReceived == null) - return; - - var invocationList = MessageReceived.GetInvocationList(); - - // ReSharper disable once PossibleInvalidCastExceptionInForeachLoop - foreach (Func handler in invocationList) - await handler.Invoke(message).ConfigureAwait(false); - } - - private async Task invokeClosed(Exception ex) - { - if (Closed == null) - return; - - var invocationList = Closed.GetInvocationList(); - - // ReSharper disable once PossibleInvalidCastExceptionInForeachLoop - foreach (Func handler in invocationList) - await handler.Invoke(ex).ConfigureAwait(false); - } - - public Task SendMessage(SocketMessage message, CancellationToken cancellationToken) - { - if (socket.State != WebSocketState.Open) - return Task.CompletedTask; - - return socket.SendAsync(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), WebSocketMessageType.Text, true, cancellationToken); - } - - public async Task DisconnectAsync() - { - linkedTokenSource?.Cancel(); - await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, @"Disconnecting", CancellationToken.None).ConfigureAwait(false); - linkedTokenSource?.Dispose(); - linkedTokenSource = null; - } - - public async ValueTask DisposeAsync() - { - try - { - await DisconnectAsync().ConfigureAwait(false); - } - catch - { - // Closure can fail if the connection is aborted. Don't really care since it's disposed anyway. - } - - socket.Dispose(); - } - } -} diff --git a/osu.Game/Online/ProductionEndpointConfiguration.cs b/osu.Game/Online/ProductionEndpointConfiguration.cs index a26a25bce5..0244761b65 100644 --- a/osu.Game/Online/ProductionEndpointConfiguration.cs +++ b/osu.Game/Online/ProductionEndpointConfiguration.cs @@ -13,7 +13,6 @@ namespace osu.Game.Online SpectatorEndpointUrl = "https://spectator.ppy.sh/spectator"; MultiplayerEndpointUrl = "https://spectator.ppy.sh/multiplayer"; MetadataEndpointUrl = "https://spectator.ppy.sh/metadata"; - NotificationsWebSocketEndpointUrl = "wss://notify.ppy.sh"; } } } From 96811a88749b7cc763f721ecebca20006ed08289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 29 Jan 2024 09:13:44 +0100 Subject: [PATCH 371/651] Fix `APIAccess` spamming requests while waiting for second factor --- osu.Game/Online/API/APIAccess.cs | 60 +++++++++++++++++--------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 8b369d0f3f..52506e4b12 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -269,42 +269,44 @@ namespace osu.Game.Online.API } } - var userReq = new GetMeRequest(); - userReq.Failure += ex => + if (state.Value != APIState.RequiresSecondFactorAuth) { - if (ex is APIException) + var userReq = new GetMeRequest(); + userReq.Failure += ex => { - LastLoginError = ex; - log.Add($@"Login failed for username {ProvidedUsername} on user retrieval ({LastLoginError.Message})!"); - Logout(); - } - else if (ex is WebException webException && webException.Message == @"Unauthorized") + if (ex is APIException) + { + LastLoginError = ex; + log.Add($@"Login failed for username {ProvidedUsername} on user retrieval ({LastLoginError.Message})!"); + Logout(); + } + else if (ex is WebException webException && webException.Message == @"Unauthorized") + { + log.Add(@"Login no longer valid"); + Logout(); + } + else + { + state.Value = APIState.Failing; + } + }; + userReq.Success += me => { - log.Add(@"Login no longer valid"); - Logout(); - } - else + me.Status.Value = configStatus.Value ?? UserStatus.Online; + + setLocalUser(me); + + state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth; + failureCount = 0; + }; + + if (!handleRequest(userReq)) { state.Value = APIState.Failing; + return; } - }; - userReq.Success += me => - { - me.Status.Value = configStatus.Value ?? UserStatus.Online; - - setLocalUser(me); - - state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth; - failureCount = 0; - }; - - if (!handleRequest(userReq)) - { - state.Value = APIState.Failing; - return; } - - if (state.Value == APIState.RequiresSecondFactorAuth) + else { if (string.IsNullOrEmpty(SecondFactorCode)) return; From 6a469f2cb6e45ec46c435682dc99e6e0d09b3a82 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 17:18:17 +0900 Subject: [PATCH 372/651] Use `switch` instead of `if-else` --- osu.Game/Online/API/APIAccess.cs | 114 +++++++++++++++++-------------- 1 file changed, 62 insertions(+), 52 deletions(-) diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs index 52506e4b12..d3707fe74d 100644 --- a/osu.Game/Online/API/APIAccess.cs +++ b/osu.Game/Online/API/APIAccess.cs @@ -269,69 +269,79 @@ namespace osu.Game.Online.API } } - if (state.Value != APIState.RequiresSecondFactorAuth) + switch (state.Value) { - var userReq = new GetMeRequest(); - userReq.Failure += ex => + case APIState.RequiresSecondFactorAuth: { - if (ex is APIException) + if (string.IsNullOrEmpty(SecondFactorCode)) + return; + + state.Value = APIState.Connecting; + LastLoginError = null; + + var verificationRequest = new VerifySessionRequest(SecondFactorCode); + + verificationRequest.Success += () => state.Value = APIState.Online; + verificationRequest.Failure += ex => { + state.Value = APIState.RequiresSecondFactorAuth; LastLoginError = ex; - log.Add($@"Login failed for username {ProvidedUsername} on user retrieval ({LastLoginError.Message})!"); - Logout(); - } - else if (ex is WebException webException && webException.Message == @"Unauthorized") - { - log.Add(@"Login no longer valid"); - Logout(); - } - else + SecondFactorCode = null; + }; + + if (!handleRequest(verificationRequest)) { state.Value = APIState.Failing; + return; } - }; - userReq.Success += me => - { - me.Status.Value = configStatus.Value ?? UserStatus.Online; - setLocalUser(me); + if (state.Value != APIState.Online) + return; - state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth; - failureCount = 0; - }; - - if (!handleRequest(userReq)) - { - state.Value = APIState.Failing; - return; - } - } - else - { - if (string.IsNullOrEmpty(SecondFactorCode)) - return; - - state.Value = APIState.Connecting; - LastLoginError = null; - - var verificationRequest = new VerifySessionRequest(SecondFactorCode); - - verificationRequest.Success += () => state.Value = APIState.Online; - verificationRequest.Failure += ex => - { - state.Value = APIState.RequiresSecondFactorAuth; - LastLoginError = ex; - SecondFactorCode = null; - }; - - if (!handleRequest(verificationRequest)) - { - state.Value = APIState.Failing; - return; + break; } - if (state.Value != APIState.Online) - return; + default: + { + var userReq = new GetMeRequest(); + + userReq.Failure += ex => + { + if (ex is APIException) + { + LastLoginError = ex; + log.Add($@"Login failed for username {ProvidedUsername} on user retrieval ({LastLoginError.Message})!"); + Logout(); + } + else if (ex is WebException webException && webException.Message == @"Unauthorized") + { + log.Add(@"Login no longer valid"); + Logout(); + } + else + { + state.Value = APIState.Failing; + } + }; + + userReq.Success += me => + { + me.Status.Value = configStatus.Value ?? UserStatus.Online; + + setLocalUser(me); + + state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth; + failureCount = 0; + }; + + if (!handleRequest(userReq)) + { + state.Value = APIState.Failing; + return; + } + + break; + } } var friendsReq = new GetFriendsRequest(); From 540ff0da5b1192a9f442952973ddb4ae02bdb80c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 17:54:34 +0900 Subject: [PATCH 373/651] Add loading layer when requesting a code reissue --- .../Overlays/Login/SecondFactorAuthForm.cs | 82 ++++++++++++------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/osu.Game/Overlays/Login/SecondFactorAuthForm.cs b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs index 566587a541..dcd3119f33 100644 --- a/osu.Game/Overlays/Login/SecondFactorAuthForm.cs +++ b/osu.Game/Overlays/Login/SecondFactorAuthForm.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -17,12 +18,14 @@ using osuTK; namespace osu.Game.Overlays.Login { - public partial class SecondFactorAuthForm : FillFlowContainer + public partial class SecondFactorAuthForm : Container { private OsuTextBox codeTextBox = null!; private LinkFlowContainer explainText = null!; private ErrorTextFlowContainer errorText = null!; + private LoadingLayer loading = null!; + [Resolved] private IAPIProvider api { get; set; } = null!; @@ -31,8 +34,6 @@ namespace osu.Game.Overlays.Login { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; - Direction = FillDirection.Vertical; - Spacing = new Vector2(0, SettingsSection.ITEM_SPACING); Children = new Drawable[] { @@ -40,42 +41,56 @@ namespace osu.Game.Overlays.Login { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Padding = new MarginPadding { Horizontal = SettingsPanel.CONTENT_MARGINS }, Direction = FillDirection.Vertical, - Spacing = new Vector2(0f, SettingsSection.ITEM_SPACING), + Spacing = new Vector2(0, SettingsSection.ITEM_SPACING), Children = new Drawable[] { - new OsuTextFlowContainer(s => s.Font = OsuFont.GetFont(weight: FontWeight.Regular)) + new FillFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, - Text = "An email has been sent to you with a verification code. Enter the code.", + Padding = new MarginPadding { Horizontal = SettingsPanel.CONTENT_MARGINS }, + Direction = FillDirection.Vertical, + Spacing = new Vector2(0f, SettingsSection.ITEM_SPACING), + Children = new Drawable[] + { + new OsuTextFlowContainer(s => s.Font = OsuFont.GetFont(weight: FontWeight.Regular)) + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Text = "An email has been sent to you with a verification code. Enter the code.", + }, + codeTextBox = new OsuTextBox + { + PlaceholderText = "Enter code", + RelativeSizeAxes = Axes.X, + TabbableContentContainer = this, + }, + explainText = new LinkFlowContainer(s => s.Font = OsuFont.GetFont(weight: FontWeight.Regular)) + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + }, + errorText = new ErrorTextFlowContainer + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Alpha = 0, + }, + }, }, - codeTextBox = new OsuTextBox - { - PlaceholderText = "Enter code", - RelativeSizeAxes = Axes.X, - TabbableContentContainer = this, - }, - explainText = new LinkFlowContainer(s => s.Font = OsuFont.GetFont(weight: FontWeight.Regular)) + new LinkFlowContainer { + Padding = new MarginPadding { Horizontal = SettingsPanel.CONTENT_MARGINS }, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, }, - errorText = new ErrorTextFlowContainer - { - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - Alpha = 0, - }, - }, + } }, - new LinkFlowContainer + loading = new LoadingLayer(true) { - Padding = new MarginPadding { Horizontal = SettingsPanel.CONTENT_MARGINS }, - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - }, + Padding = new MarginPadding { Vertical = -SettingsSection.ITEM_SPACING }, + } }; explainText.AddParagraph(UserVerificationStrings.BoxInfoCheckSpam); @@ -85,9 +100,20 @@ namespace osu.Game.Overlays.Login explainText.AddText(". You can also "); explainText.AddLink(UserVerificationStrings.BoxInfoReissueLink, () => { + loading.Show(); + var reissueRequest = new ReissueVerificationCodeRequest(); - reissueRequest.Failure += ex => Logger.Error(ex, @"Failed to retrieve new verification code."); - api.Perform(reissueRequest); + reissueRequest.Failure += ex => + { + Logger.Error(ex, @"Failed to retrieve new verification code."); + loading.Hide(); + }; + reissueRequest.Success += () => + { + loading.Hide(); + }; + + Task.Run(() => api.Perform(reissueRequest)); }); explainText.AddText(" or "); explainText.AddLink(UserVerificationStrings.BoxInfoLogoutLink, () => { api.Logout(); }); From dc28a6b873f0af9835f991acb805e647123e8446 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 19:33:07 +0900 Subject: [PATCH 374/651] Update resources --- osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs | 2 +- osu.Game/osu.Game.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs index e46b92795a..a552b22c11 100644 --- a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs +++ b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs @@ -27,7 +27,7 @@ namespace osu.Game.Screens.Backgrounds private Background background; private int currentDisplay; - private const int background_count = 7; + private const int background_count = 8; private IBindable user; private Bindable skin; private Bindable source; diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 6f71424130..48ba7beb7d 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -37,7 +37,7 @@ - + From 8341da7586126de557904f4db124113d33ef9e4d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 19:41:03 +0900 Subject: [PATCH 375/651] Revert "Remove dead code" (mostly) This reverts commit 6070eac6eec64852a8aa27a2c283cf9388c6ad5c. --- osu.Game/Skinning/LegacyJudgementPieceNew.cs | 2 +- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/osu.Game/Skinning/LegacyJudgementPieceNew.cs b/osu.Game/Skinning/LegacyJudgementPieceNew.cs index bd1508b4a6..5ff28726c0 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceNew.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceNew.cs @@ -53,7 +53,7 @@ namespace osu.Game.Skinning if (!result.IsMiss()) { //new judgement shows old as a temporary effect - AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f) + AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f, true) { Blending = BlendingParameters.Additive, Anchor = Anchor.Centre, diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index c15ff041d1..edfb5a23ec 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -18,14 +18,16 @@ namespace osu.Game.Skinning private readonly HitResult result; private readonly float finalScale; + private readonly bool forceTransforms; [Resolved] private ISkinSource skin { get; set; } = null!; - public LegacyJudgementPieceOld(HitResult result, Func createMainDrawable, float finalScale = 1f) + public LegacyJudgementPieceOld(HitResult result, Func createMainDrawable, float finalScale = 1f, bool forceTransforms = false) { this.result = result; this.finalScale = finalScale; + this.forceTransforms = forceTransforms; AutoSizeAxes = Axes.Both; Origin = Anchor.Centre; @@ -45,6 +47,10 @@ namespace osu.Game.Skinning this.FadeInFromZero(fade_in_length); + // legacy judgements don't play any transforms if they are an animation.... UNLESS they are the temporary displayed judgement from new piece. + if (animation?.FrameCount > 1 && !forceTransforms) + return; + if (result.IsMiss()) { decimal? legacyVersion = skin.GetConfig(SkinConfiguration.LegacySetting.Version)?.Value; @@ -95,12 +101,6 @@ namespace osu.Game.Skinning private bool isMissedTick() => result.IsMiss() && result != HitResult.Miss; - private void applyMissedTickScaling() - { - this.ScaleTo(0.6f); - this.ScaleTo(0.3f, 100, Easing.In); - } - public Drawable GetAboveHitObjectsProxiedContent() => CreateProxy(); } } From 1efdf2ae253a9844dc437c6f26767efb17bfb06a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 19:45:56 +0900 Subject: [PATCH 376/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index 969fd52340..da404599ef 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index bbcabc6360..0855c0c6d6 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From 8a11ff122712a15a2f466f01434af76e00ac98f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 29 Jan 2024 11:46:45 +0100 Subject: [PATCH 377/651] Apply local precision workaround to editor effect section --- osu.Game/Screens/Edit/Timing/EffectSection.cs | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Edit/Timing/EffectSection.cs b/osu.Game/Screens/Edit/Timing/EffectSection.cs index 7e484433f7..f321f7eeb0 100644 --- a/osu.Game/Screens/Edit/Timing/EffectSection.cs +++ b/osu.Game/Screens/Edit/Timing/EffectSection.cs @@ -52,17 +52,38 @@ namespace osu.Game.Screens.Edit.Timing protected override void OnControlPointChanged(ValueChangedEvent point) { - if (point.NewValue != null) + scrollSpeedSlider.Current.ValueChanged -= updateControlPointFromSlider; + + if (point.NewValue is EffectControlPoint newEffectPoint) { isRebinding = true; - kiai.Current = point.NewValue.KiaiModeBindable; - scrollSpeedSlider.Current = point.NewValue.ScrollSpeedBindable; + kiai.Current = newEffectPoint.KiaiModeBindable; + scrollSpeedSlider.Current = new BindableDouble + { + MinValue = 0.01, + MaxValue = 10, + Precision = 0.01, + Value = newEffectPoint.ScrollSpeedBindable.Value + }; + scrollSpeedSlider.Current.ValueChanged += updateControlPointFromSlider; + // at this point in time the above is enough to keep the slider control in sync with reality, + // since undo/redo causes `OnControlPointChanged()` to fire. + // whenever that stops being the case, or there is a possibility that the scroll speed could be changed + // by something else other than this control, this code should probably be revisited to have a binding in the other direction, too. isRebinding = false; } } + private void updateControlPointFromSlider(ValueChangedEvent scrollSpeed) + { + if (ControlPoint.Value is not EffectControlPoint effectPoint || isRebinding) + return; + + effectPoint.ScrollSpeedBindable.Value = scrollSpeed.NewValue; + } + protected override EffectControlPoint CreatePoint() { var reference = Beatmap.ControlPointInfo.EffectPointAt(SelectedGroup.Value.Time); From 034f8c0388c84333961d5ad6702c044dc83e519f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 20:36:59 +0900 Subject: [PATCH 378/651] Also fix spinner case --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index bf4b07eaab..9a98286738 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -153,7 +153,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { if (tracking.NewValue) { - if (!spinningSample.IsPlaying) + if (!spinningSample.RequestedPlaying) spinningSample.Play(); spinningSample.VolumeTo(1, 300); From f2546d72c2616f4d3d746d27b9fea061998591d7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 29 Jan 2024 20:45:51 +0900 Subject: [PATCH 379/651] Fix osu! logo being mispositioned in song select on very wide resolutions --- osu.Game/Screens/Select/SongSelect.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index bf1724995a..50467bc089 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -642,7 +642,11 @@ namespace osu.Game.Screens.Select { base.LogoArriving(logo, resuming); - Vector2 position = new Vector2(0.95f, 0.96f); + logo.Anchor = Anchor.BottomRight; + logo.Origin = Anchor.Centre; + logo.RelativePositionAxes = Axes.None; + + Vector2 position = new Vector2(-76, -36); if (logo.Alpha > 0.8f) { From 16c06169ed077bc493e1856094b76528de1665d6 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 30 Jan 2024 01:06:32 +0900 Subject: [PATCH 380/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index da404599ef..55ef55ab7d 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index 0855c0c6d6..5b99319499 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From 996ae0ecc1f970ebc60f17653b3cf6b698794dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 29 Jan 2024 19:17:39 +0100 Subject: [PATCH 381/651] Fix incorrect handling of `StartChatRequest` in websocket chat client Fixes this happening on staging: [network] 2024-01-29 17:48:24 [verbose]: WebSocketNotificationsClientConnector connected! [network] 2024-01-29 17:48:24 [verbose]: WebSocketNotificationsClientConnector connect attempt failed: Can't use WaitSafely from inside an async operation. I'm not sure how I ever allowed that `.WaitSafely()` to be there. It did feel rather dangerous but then I must have forgotten and never noticed it failing. Which is weird because you'd think that would be caught by testing that chat isn't working but I'm pretty sure that I tested that chat *was* indeed working. Anyway now that entire flow is replaced by something that should hopefully be somewhat more sane? It has a whole retry flow with logging now which should be more robust than what was there previously (failing to start to listen to chat events killing the entire websocket connection for very little good reason). --- osu.Game/Online/Chat/WebSocketChatClient.cs | 47 +++++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/osu.Game/Online/Chat/WebSocketChatClient.cs b/osu.Game/Online/Chat/WebSocketChatClient.cs index 05d3b7b3ce..b74f8bec4b 100644 --- a/osu.Game/Online/Chat/WebSocketChatClient.cs +++ b/osu.Game/Online/Chat/WebSocketChatClient.cs @@ -5,9 +5,10 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; using Newtonsoft.Json; using osu.Framework.Bindables; -using osu.Framework.Extensions; using osu.Framework.Logging; using osu.Game.Online.API; using osu.Game.Online.API.Requests; @@ -26,21 +27,49 @@ namespace osu.Game.Online.Chat private readonly INotificationsClient client; private readonly ConcurrentDictionary channelsMap = new ConcurrentDictionary(); + private CancellationTokenSource? chatStartCancellationSource; + public WebSocketChatClient(IAPIProvider api) { this.api = api; client = api.NotificationsClient; - client.IsConnected.BindValueChanged(start, true); + client.IsConnected.BindValueChanged(onConnectedChanged, true); } - private void start(ValueChangedEvent connected) + private void onConnectedChanged(ValueChangedEvent connected) { - if (!connected.NewValue) - return; + if (connected.NewValue) + { + client.MessageReceived += onMessageReceived; + attemptToStartChat(); + RequestPresence(); + } + else + chatStartCancellationSource?.Cancel(); + } - client.MessageReceived += onMessageReceived; - client.SendAsync(new StartChatRequest()).WaitSafely(); - RequestPresence(); + private void attemptToStartChat() + { + chatStartCancellationSource?.Cancel(); + chatStartCancellationSource = new CancellationTokenSource(); + + Task.Factory.StartNew(async () => + { + while (!chatStartCancellationSource.IsCancellationRequested) + { + try + { + await client.SendAsync(new StartChatRequest()).ConfigureAwait(false); + Logger.Log(@"Now listening to websocket chat messages.", LoggingTarget.Network); + chatStartCancellationSource.Cancel(); + } + catch (Exception ex) + { + Logger.Log($@"Could not start listening to websocket chat messages: {ex}", LoggingTarget.Network); + await Task.Delay(5000).ConfigureAwait(false); + } + } + }, chatStartCancellationSource.Token); } public void RequestPresence() @@ -137,7 +166,7 @@ namespace osu.Game.Online.Chat public void Dispose() { - client.IsConnected.ValueChanged -= start; + client.IsConnected.ValueChanged -= onConnectedChanged; client.MessageReceived -= onMessageReceived; } } From 959cc7c7d91fa288bb98777b73286bc30285a21f Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 29 Jan 2024 21:26:36 +0300 Subject: [PATCH 382/651] Rewrite time range computation logic to be completely based on stable code --- .../UI/DrawableTaikoRuleset.cs | 20 ++-------- .../UI/TaikoPlayfieldAdjustmentContainer.cs | 40 +++++++++++++++++-- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoRuleset.cs b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoRuleset.cs index 49b0ad811d..77b2b06c0e 100644 --- a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoRuleset.cs +++ b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoRuleset.cs @@ -16,7 +16,6 @@ using osu.Game.Replays; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Drawables; -using osu.Game.Rulesets.Taiko.Beatmaps; using osu.Game.Rulesets.Taiko.Objects; using osu.Game.Rulesets.Taiko.Replays; using osu.Game.Rulesets.Timing; @@ -36,6 +35,8 @@ namespace osu.Game.Rulesets.Taiko.UI public new TaikoInputManager KeyBindingInputManager => (TaikoInputManager)base.KeyBindingInputManager; + protected new TaikoPlayfieldAdjustmentContainer PlayfieldAdjustmentContainer => (TaikoPlayfieldAdjustmentContainer)base.PlayfieldAdjustmentContainer; + protected override bool UserScrollSpeedAdjustment => false; private SkinnableDrawable scroller; @@ -68,22 +69,7 @@ namespace osu.Game.Rulesets.Taiko.UI TimeRange.Value = ComputeTimeRange(); } - protected virtual double ComputeTimeRange() - { - // Taiko scrolls at a constant 100px per 1000ms. More notes become visible as the playfield is lengthened. - const float scroll_rate = 10; - - // Since the time range will depend on a positional value, it is referenced to the x480 pixel space. - // Width is used because it defines how many notes fit on the playfield. - // We clamp the ratio to the maximum aspect ratio to keep scroll speed consistent on widths lower than the default. - float ratio = Math.Max(DrawSize.X / 768f, TaikoPlayfieldAdjustmentContainer.MAXIMUM_ASPECT); - - // Stable internally increased the slider velocity of objects by a factor of `VELOCITY_MULTIPLIER`. - // To simulate this, we shrink the time range by that factor here. - // This, when combined with the rest of the scrolling ruleset machinery (see `MultiplierControlPoint` et al.), - // has the effect of increasing each multiplier control point's multiplier by `VELOCITY_MULTIPLIER`, ensuring parity with stable. - return (Playfield.HitObjectContainer.DrawWidth / ratio) * scroll_rate / TaikoBeatmapConverter.VELOCITY_MULTIPLIER; - } + protected virtual double ComputeTimeRange() => PlayfieldAdjustmentContainer.ComputeTimeRange(); protected override void UpdateAfterChildren() { diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs index c10e505f50..c67f61052c 100644 --- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs @@ -4,6 +4,7 @@ using System; using osu.Framework.Bindables; using osu.Framework.Graphics; +using osu.Game.Rulesets.Taiko.Beatmaps; using osu.Game.Rulesets.UI; using osuTK; @@ -14,6 +15,8 @@ namespace osu.Game.Rulesets.Taiko.UI public const float MAXIMUM_ASPECT = 16f / 9f; public const float MINIMUM_ASPECT = 5f / 4f; + private const float stable_gamefield_height = 480f; + public readonly IBindable LockPlayfieldAspectRange = new BindableBool(true); public TaikoPlayfieldAdjustmentContainer() @@ -21,6 +24,9 @@ namespace osu.Game.Rulesets.Taiko.UI RelativeSizeAxes = Axes.X; RelativePositionAxes = Axes.Y; Height = TaikoPlayfield.BASE_HEIGHT; + + // Matches stable, see https://github.com/peppy/osu-stable-reference/blob/7519cafd1823f1879c0d9c991ba0e5c7fd3bfa02/osu!/GameModes/Play/Rulesets/Taiko/RulesetTaiko.cs#L514 + Y = 135f / stable_gamefield_height; } protected override void Update() @@ -28,8 +34,6 @@ namespace osu.Game.Rulesets.Taiko.UI base.Update(); const float base_relative_height = TaikoPlayfield.BASE_HEIGHT / 768; - // Matches stable, see https://github.com/peppy/osu-stable-reference/blob/7519cafd1823f1879c0d9c991ba0e5c7fd3bfa02/osu!/GameModes/Play/Rulesets/Taiko/RulesetTaiko.cs#L514 - const float base_position = 135f / 480f; float relativeHeight = base_relative_height; @@ -51,10 +55,38 @@ namespace osu.Game.Rulesets.Taiko.UI // Limit the maximum relative height of the playfield to one-third of available area to avoid it masking out on extreme resolutions. relativeHeight = Math.Min(relativeHeight, 1f / 3f); - Y = base_position; - Scale = new Vector2(Math.Max((Parent!.ChildSize.Y / 768f) * (relativeHeight / base_relative_height), 1f)); Width = 1 / Scale.X; } + + public double ComputeTimeRange() + { + float currentAspect = Parent!.ChildSize.X / Parent!.ChildSize.Y; + + if (LockPlayfieldAspectRange.Value) + currentAspect = Math.Clamp(currentAspect, MINIMUM_ASPECT, MAXIMUM_ASPECT); + + // in a game resolution of 1024x768, stable's scrolling system consists of objects being placed 600px (widthScaled - 40) away from their hit location. + // however, the point at which the object renders at the end of the screen is exactly x=640, but stable makes the object start moving from beyond the screen instead of the boundary point. + // therefore, in lazer we have to adjust the "in length" so that it's in a 640px->160px fashion before passing it down as a "time range". + // see stable's "in length": https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/GameplayElements/HitObjectManagerTaiko.cs#L168 + const float stable_hit_location = 160f; + float widthScaled = currentAspect * stable_gamefield_height; + float inLength = widthScaled - stable_hit_location; + + // also in a game resolution of 1024x768, stable makes hit objects scroll from 760px->160px at a duration of 6000ms, divided by slider velocity (i.e. at a rate of 0.1px/ms) + // compare: https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/GameplayElements/HitObjectManagerTaiko.cs#L218 + // note: the variable "sv", in the linked reference, is equivalent to MultiplierControlPoint.Multiplier * 100, but since time range is agnostic of velocity, we replace "sv" with 100 below. + float inMsLength = inLength / 100 * 1000; + + // stable multiplies the slider velocity by 1.4x for certain reasons, divide the time range by that factor to achieve similar result. + // for references on how the factor is applied to the time range, see: + // 1. https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/GameplayElements/HitObjectManagerTaiko.cs#L79 (DifficultySliderMultiplier multiplied by 1.4x) + // 2. https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/GameplayElements/HitObjectManager.cs#L468-L470 (DifficultySliderMultiplier used to calculate SliderScoringPointDistance) + // 3. https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/GameplayElements/HitObjectManager.cs#L248-L250 (SliderScoringPointDistance used to calculate slider velocity, i.e. the "sv" variable from above) + inMsLength /= TaikoBeatmapConverter.VELOCITY_MULTIPLIER; + + return inMsLength; + } } } From acc2614090739ce546bead00deef3ddcfbbeadf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 29 Jan 2024 20:04:18 +0100 Subject: [PATCH 383/651] Apply alternative solution Fixes the logo flying out of the wrong corner when transitioning from song select to gameplay. Co-authored-by: Dean Herbert --- osu.Game/Screens/Menu/OsuLogo.cs | 7 +++++++ osu.Game/Screens/OsuScreen.cs | 5 ++++- osu.Game/Screens/Select/SongSelect.cs | 3 +-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs index 25101730e7..f2e2e25fa6 100644 --- a/osu.Game/Screens/Menu/OsuLogo.cs +++ b/osu.Game/Screens/Menu/OsuLogo.cs @@ -486,5 +486,12 @@ namespace osu.Game.Screens.Menu defaultProxyTarget.Add(this); defaultProxyTarget.Add(proxy = CreateProxy()); } + + public void ChangeAnchor(Anchor anchor) + { + var previousAnchor = AnchorPosition; + Anchor = anchor; + Position -= AnchorPosition - previousAnchor; + } } } diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs index f719ef67c9..2e8f85423d 100644 --- a/osu.Game/Screens/OsuScreen.cs +++ b/osu.Game/Screens/OsuScreen.cs @@ -250,9 +250,12 @@ namespace osu.Game.Screens { logo.Action = null; logo.FadeOut(300, Easing.OutQuint); - logo.Anchor = Anchor.TopLeft; + logo.Origin = Anchor.Centre; + + logo.ChangeAnchor(Anchor.TopLeft); logo.RelativePositionAxes = Axes.Both; + logo.Triangles = true; logo.Ripple = true; } diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 50467bc089..a603934a9d 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -642,9 +642,8 @@ namespace osu.Game.Screens.Select { base.LogoArriving(logo, resuming); - logo.Anchor = Anchor.BottomRight; - logo.Origin = Anchor.Centre; logo.RelativePositionAxes = Axes.None; + logo.ChangeAnchor(Anchor.BottomRight); Vector2 position = new Vector2(-76, -36); From 6888cda02cd127ff4baf6159d3c6a7e533184970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 29 Jan 2024 21:42:38 +0100 Subject: [PATCH 384/651] Make `LegacyScoreDecoder.PopulateMaximumStatistics()` public For `osu-tools` consumption. --- osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs index e51a95798b..65e2c02655 100644 --- a/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs +++ b/osu.Game/Scoring/Legacy/LegacyScoreDecoder.cs @@ -180,7 +180,7 @@ namespace osu.Game.Scoring.Legacy /// /// The score to populate the statistics of. /// The corresponding . - internal static void PopulateMaximumStatistics(ScoreInfo score, WorkingBeatmap workingBeatmap) + public static void PopulateMaximumStatistics(ScoreInfo score, WorkingBeatmap workingBeatmap) { Debug.Assert(score.BeatmapInfo != null); From 87f853fcd270c9fce2f3f5a7368bfb506d060a23 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Tue, 30 Jan 2024 00:23:32 +0300 Subject: [PATCH 385/651] Reduce overhead in ScrollingHitObjectContainer --- .../Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs index 129918da14..39ddb5c753 100644 --- a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs +++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs @@ -184,9 +184,12 @@ namespace osu.Game.Rulesets.UI.Scrolling // We need to calculate hit object positions (including nested hit objects) as soon as possible after lifetimes // to prevent hit objects displayed in a wrong position for one frame. - // Only AliveObjects need to be considered for layout (reduces overhead in the case of scroll speed changes). - foreach (var obj in AliveObjects) + // Only AliveEntries need to be considered for layout (reduces overhead in the case of scroll speed changes). + // We are not using AliveObjects directly to avoid selection/sorting overhead since we don't care about the order at which positions will be updated. + foreach (var entry in AliveEntries) { + var obj = entry.Drawable; + updatePosition(obj, Time.Current); if (layoutComputed.Contains(obj)) From 7dba870518857bb832dbf7b4a034471a3ed45f94 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Tue, 30 Jan 2024 03:07:37 +0300 Subject: [PATCH 386/651] Rework Content storage in ColumnFlow --- osu.Game.Rulesets.Mania.Tests/TestSceneStage.cs | 4 ++-- osu.Game.Rulesets.Mania/UI/ColumnFlow.cs | 16 +++++++++------- osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs | 10 +++++----- osu.Game.Rulesets.Mania/UI/Stage.cs | 11 +++++------ 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/TestSceneStage.cs b/osu.Game.Rulesets.Mania.Tests/TestSceneStage.cs index fee3ba3e39..db04142915 100644 --- a/osu.Game.Rulesets.Mania.Tests/TestSceneStage.cs +++ b/osu.Game.Rulesets.Mania.Tests/TestSceneStage.cs @@ -91,7 +91,7 @@ namespace osu.Game.Rulesets.Mania.Tests { foreach (var stage in stages) { - for (int i = 0; i < stage.Columns.Count; i++) + for (int i = 0; i < stage.Columns.Length; i++) { var obj = new Note { Column = i, StartTime = Time.Current + 2000 }; obj.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty()); @@ -105,7 +105,7 @@ namespace osu.Game.Rulesets.Mania.Tests { foreach (var stage in stages) { - for (int i = 0; i < stage.Columns.Count; i++) + for (int i = 0; i < stage.Columns.Length; i++) { var obj = new HoldNote { Column = i, StartTime = Time.Current + 2000, Duration = 500 }; obj.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty()); diff --git a/osu.Game.Rulesets.Mania/UI/ColumnFlow.cs b/osu.Game.Rulesets.Mania/UI/ColumnFlow.cs index 8734f8ac8a..1593e8e76f 100644 --- a/osu.Game.Rulesets.Mania/UI/ColumnFlow.cs +++ b/osu.Game.Rulesets.Mania/UI/ColumnFlow.cs @@ -4,8 +4,6 @@ #nullable disable using System; -using System.Collections.Generic; -using System.Linq; using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -28,20 +26,21 @@ namespace osu.Game.Rulesets.Mania.UI /// /// All contents added to this . /// - public IReadOnlyList Content => columns.Children.Select(c => c.Count == 0 ? null : (TContent)c.Child).ToList(); + public TContent[] Content { get; } - private readonly FillFlowContainer columns; + private readonly FillFlowContainer> columns; private readonly StageDefinition stageDefinition; public ColumnFlow(StageDefinition stageDefinition) { this.stageDefinition = stageDefinition; + Content = new TContent[stageDefinition.Columns]; AutoSizeAxes = Axes.X; Masking = true; - InternalChild = columns = new FillFlowContainer + InternalChild = columns = new FillFlowContainer> { RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, @@ -49,7 +48,7 @@ namespace osu.Game.Rulesets.Mania.UI }; for (int i = 0; i < stageDefinition.Columns; i++) - columns.Add(new Container { RelativeSizeAxes = Axes.Y }); + columns.Add(new Container { RelativeSizeAxes = Axes.Y }); } private ISkinSource currentSkin; @@ -102,7 +101,10 @@ namespace osu.Game.Rulesets.Mania.UI /// /// The index of the column to set the content of. /// The content. - public void SetContentForColumn(int column, TContent content) => columns[column].Child = content; + public void SetContentForColumn(int column, TContent content) + { + Content[column] = columns[column].Child = content; + } private void updateMobileSizing() { diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index 314d199944..c8874c8ab3 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -71,7 +71,7 @@ namespace osu.Game.Rulesets.Mania.UI stages.Add(newStage); AddNested(newStage); - firstColumnIndex += newStage.Columns.Count; + firstColumnIndex += newStage.Columns.Length; } } @@ -125,9 +125,9 @@ namespace osu.Game.Rulesets.Mania.UI foreach (var stage in stages) { - if (index >= stage.Columns.Count) + if (index >= stage.Columns.Length) { - index -= stage.Columns.Count; + index -= stage.Columns.Length; continue; } @@ -140,7 +140,7 @@ namespace osu.Game.Rulesets.Mania.UI /// /// Retrieves the total amount of columns across all stages in this playfield. /// - public int TotalColumns => stages.Sum(s => s.Columns.Count); + public int TotalColumns => stages.Sum(s => s.Columns.Length); private Stage getStageByColumn(int column) { @@ -148,7 +148,7 @@ namespace osu.Game.Rulesets.Mania.UI foreach (var stage in stages) { - sum += stage.Columns.Count; + sum += stage.Columns.Length; if (sum > column) return stage; } diff --git a/osu.Game.Rulesets.Mania/UI/Stage.cs b/osu.Game.Rulesets.Mania/UI/Stage.cs index 36286940a8..db06f9dbde 100644 --- a/osu.Game.Rulesets.Mania/UI/Stage.cs +++ b/osu.Game.Rulesets.Mania/UI/Stage.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Extensions.ObjectExtensions; @@ -37,7 +36,7 @@ namespace osu.Game.Rulesets.Mania.UI public const float HIT_TARGET_POSITION = 110; - public IReadOnlyList Columns => columnFlow.Content; + public Column[] Columns => columnFlow.Content; private readonly ColumnFlow columnFlow; private readonly JudgementContainer judgements; @@ -184,13 +183,13 @@ namespace osu.Game.Rulesets.Mania.UI NewResult += OnNewResult; } - public override void Add(HitObject hitObject) => Columns.ElementAt(((ManiaHitObject)hitObject).Column - firstColumnIndex).Add(hitObject); + public override void Add(HitObject hitObject) => Columns[((ManiaHitObject)hitObject).Column - firstColumnIndex].Add(hitObject); - public override bool Remove(HitObject hitObject) => Columns.ElementAt(((ManiaHitObject)hitObject).Column - firstColumnIndex).Remove(hitObject); + public override bool Remove(HitObject hitObject) => Columns[((ManiaHitObject)hitObject).Column - firstColumnIndex].Remove(hitObject); - public override void Add(DrawableHitObject h) => Columns.ElementAt(((ManiaHitObject)h.HitObject).Column - firstColumnIndex).Add(h); + public override void Add(DrawableHitObject h) => Columns[((ManiaHitObject)h.HitObject).Column - firstColumnIndex].Add(h); - public override bool Remove(DrawableHitObject h) => Columns.ElementAt(((ManiaHitObject)h.HitObject).Column - firstColumnIndex).Remove(h); + public override bool Remove(DrawableHitObject h) => Columns[((ManiaHitObject)h.HitObject).Column - firstColumnIndex].Remove(h); public void Add(BarLine barLine) => base.Add(barLine); From 8e20eed4ef2783234e54101fd0fa8bd92d5e11fe Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Tue, 30 Jan 2024 03:19:27 +0300 Subject: [PATCH 387/651] Don't use LINQ in ReceivePositionalInputAt --- osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs | 11 ++++++++++- osu.Game.Rulesets.Mania/UI/Stage.cs | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index c8874c8ab3..0d36f51943 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -42,7 +42,16 @@ namespace osu.Game.Rulesets.Mania.UI } } - public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => stages.Any(s => s.ReceivePositionalInputAt(screenSpacePos)); + public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) + { + foreach (var s in stages) + { + if (s.ReceivePositionalInputAt(screenSpacePos)) + return true; + } + + return false; + } public ManiaPlayfield(List stageDefinitions) { diff --git a/osu.Game.Rulesets.Mania/UI/Stage.cs b/osu.Game.Rulesets.Mania/UI/Stage.cs index db06f9dbde..a4a09c9a82 100644 --- a/osu.Game.Rulesets.Mania/UI/Stage.cs +++ b/osu.Game.Rulesets.Mania/UI/Stage.cs @@ -44,7 +44,16 @@ namespace osu.Game.Rulesets.Mania.UI private readonly Drawable barLineContainer; - public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => Columns.Any(c => c.ReceivePositionalInputAt(screenSpacePos)); + public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) + { + foreach (var c in Columns) + { + if (c.ReceivePositionalInputAt(screenSpacePos)) + return true; + } + + return false; + } private readonly int firstColumnIndex; From d895a91cd535328e327752d98576e5d5db9b20ca Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 30 Jan 2024 18:40:17 +0900 Subject: [PATCH 388/651] Update endpoints to final production endpoints --- osu.Game/Online/EndpointConfiguration.cs | 16 +++++++--------- .../ExperimentalEndpointConfiguration.cs | 19 ------------------- osu.Game/OsuGameBase.cs | 2 +- 3 files changed, 8 insertions(+), 29 deletions(-) delete mode 100644 osu.Game/Online/ExperimentalEndpointConfiguration.cs diff --git a/osu.Game/Online/EndpointConfiguration.cs b/osu.Game/Online/EndpointConfiguration.cs index f3bcced630..bd3c945124 100644 --- a/osu.Game/Online/EndpointConfiguration.cs +++ b/osu.Game/Online/EndpointConfiguration.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - namespace osu.Game.Online { /// @@ -13,36 +11,36 @@ namespace osu.Game.Online /// /// The base URL for the website. /// - public string WebsiteRootUrl { get; set; } + public string WebsiteRootUrl { get; set; } = string.Empty; /// /// The endpoint for the main (osu-web) API. /// - public string APIEndpointUrl { get; set; } + public string APIEndpointUrl { get; set; } = string.Empty; /// /// The OAuth client secret. /// - public string APIClientSecret { get; set; } + public string APIClientSecret { get; set; } = string.Empty; /// /// The OAuth client ID. /// - public string APIClientID { get; set; } + public string APIClientID { get; set; } = string.Empty; /// /// The endpoint for the SignalR spectator server. /// - public string SpectatorEndpointUrl { get; set; } + public string SpectatorEndpointUrl { get; set; } = string.Empty; /// /// The endpoint for the SignalR multiplayer server. /// - public string MultiplayerEndpointUrl { get; set; } + public string MultiplayerEndpointUrl { get; set; } = string.Empty; /// /// The endpoint for the SignalR metadata server. /// - public string MetadataEndpointUrl { get; set; } + public string MetadataEndpointUrl { get; set; } = string.Empty; } } diff --git a/osu.Game/Online/ExperimentalEndpointConfiguration.cs b/osu.Game/Online/ExperimentalEndpointConfiguration.cs deleted file mode 100644 index c3d0014c8b..0000000000 --- a/osu.Game/Online/ExperimentalEndpointConfiguration.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -namespace osu.Game.Online -{ - public class ExperimentalEndpointConfiguration : EndpointConfiguration - { - public ExperimentalEndpointConfiguration() - { - WebsiteRootUrl = @"https://osu.ppy.sh"; - APIEndpointUrl = @"https://lazer.ppy.sh"; - APIClientSecret = @"FGc9GAtyHzeQDshWP5Ah7dega8hJACAJpQtw6OXk"; - APIClientID = "5"; - SpectatorEndpointUrl = "https://spectator.ppy.sh/spectator"; - MultiplayerEndpointUrl = "https://spectator.ppy.sh/multiplayer"; - MetadataEndpointUrl = "https://spectator.ppy.sh/metadata"; - } - } -} diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index 2208f7d7ca..a2a6322665 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -102,7 +102,7 @@ namespace osu.Game public virtual bool UseDevelopmentServer => DebugUtils.IsDebugBuild; public virtual EndpointConfiguration CreateEndpoints() => - UseDevelopmentServer ? new DevelopmentEndpointConfiguration() : new ExperimentalEndpointConfiguration(); + UseDevelopmentServer ? new DevelopmentEndpointConfiguration() : new ProductionEndpointConfiguration(); public virtual Version AssemblyVersion => Assembly.GetEntryAssembly()?.GetName().Version ?? new Version(); From 6931af664ed3c9a1550a9e2751cfe436b1dc542d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 30 Jan 2024 12:05:31 +0100 Subject: [PATCH 389/651] Add missing `icon.png` entry to nuspec This is only half of the deployment fix, the other half will be in `osu-deploy` (making sure the icon is actually in the staging directory). --- osu.Desktop/osu.nuspec | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Desktop/osu.nuspec b/osu.Desktop/osu.nuspec index 3b7d6cbe79..f85698680e 100644 --- a/osu.Desktop/osu.nuspec +++ b/osu.Desktop/osu.nuspec @@ -20,5 +20,6 @@ + From 000ddc14acadf104af4724731c0aa41e27952ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 30 Jan 2024 20:50:00 +0100 Subject: [PATCH 390/651] Fix broken locking in `OAuth` Closes https://github.com/ppy/osu/issues/26824... I think? Can be reproduced via something like diff --git a/osu.Game/Online/API/OAuth.cs b/osu.Game/Online/API/OAuth.cs index 485274f349..e6e93ab4c7 100644 --- a/osu.Game/Online/API/OAuth.cs +++ b/osu.Game/Online/API/OAuth.cs @@ -151,6 +151,11 @@ internal string RequestAccessToken() { if (!ensureAccessToken()) return null; + for (int i = 0; i < 10000; ++i) + { + _ = Token.Value.AccessToken; + } + return Token.Value.AccessToken; } The cause is `SecondFactorAuthForm` calling `Logout()`, which calls `OAuth.Clear()`, _while_ the `APIAccess` connect loop is checking if `authentication.HasValidAccessToken` is true, which happens to internally check `Token.Value.AccessToken`, which the clearing of tokens can brutally interrupt. --- osu.Game/Online/API/OAuth.cs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/osu.Game/Online/API/OAuth.cs b/osu.Game/Online/API/OAuth.cs index 485274f349..4829310870 100644 --- a/osu.Game/Online/API/OAuth.cs +++ b/osu.Game/Online/API/OAuth.cs @@ -128,19 +128,12 @@ namespace osu.Game.Online.API // if we already have a valid access token, let's use it. if (accessTokenValid) return true; - // we want to ensure only a single authentication update is happening at once. - lock (access_token_retrieval_lock) - { - // re-check if valid, in case another request completed and revalidated our access. - if (accessTokenValid) return true; + // if not, let's try using our refresh token to request a new access token. + if (!string.IsNullOrEmpty(Token.Value?.RefreshToken)) + // ReSharper disable once PossibleNullReferenceException + AuthenticateWithRefresh(Token.Value.RefreshToken); - // if not, let's try using our refresh token to request a new access token. - if (!string.IsNullOrEmpty(Token.Value?.RefreshToken)) - // ReSharper disable once PossibleNullReferenceException - AuthenticateWithRefresh(Token.Value.RefreshToken); - - return accessTokenValid; - } + return accessTokenValid; } private bool accessTokenValid => Token.Value?.IsValid ?? false; @@ -149,14 +142,18 @@ namespace osu.Game.Online.API internal string RequestAccessToken() { - if (!ensureAccessToken()) return null; + lock (access_token_retrieval_lock) + { + if (!ensureAccessToken()) return null; - return Token.Value.AccessToken; + return Token.Value.AccessToken; + } } internal void Clear() { - Token.Value = null; + lock (access_token_retrieval_lock) + Token.Value = null; } private class AccessTokenRequestRefresh : AccessTokenRequest From 4126dcbe281c2f6590b999af14e27a09748bbde6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 30 Jan 2024 21:40:23 +0100 Subject: [PATCH 391/651] Fix 2FA verification via link not working correctly Closes https://github.com/ppy/osu/issues/26835. I must have not re-tested this correctly after all the refactors... Basically the issue is that the websocket connection would only come online when the API state changed to full `Online`. In particular the connector would not attempt to connect when the API state was `RequiresSecondFactorAuth`, giving the link-based flow no chance to actually work. The change in `WebSocketNotificationsClientConnector` is relevant in that queueing requests does nothing before the API state changes to full `Online`. It also cleans up things a bit code-wise so... win? And yes, this means that the _other_ `PersistentEndpointClientConnector` implementations (i.e. SignalR connectors) will also come online earlier after this. Based on previous discussions (https://github.com/ppy/osu/pull/25480#discussion_r1395566545) I think this is fine, but if it is _not_ fine, then it can be fixed by exposing a virtual that lets a connector to decide when to come alive, I guess. --- .../WebSocketNotificationsClientConnector.cs | 11 ++++------- osu.Game/Online/PersistentEndpointClientConnector.cs | 3 ++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs index 73fe29d441..596322d377 100644 --- a/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs +++ b/osu.Game/Online/Notifications/WebSocket/WebSocketNotificationsClientConnector.cs @@ -29,14 +29,11 @@ namespace osu.Game.Online.Notifications.WebSocket protected override async Task BuildConnectionAsync(CancellationToken cancellationToken) { - var tcs = new TaskCompletionSource(); - var req = new GetNotificationsRequest(); - req.Success += bundle => tcs.SetResult(bundle.Endpoint); - req.Failure += ex => tcs.SetException(ex); - api.Queue(req); - - string endpoint = await tcs.Task.ConfigureAwait(false); + // must use `PerformAsync()`, since we may not be fully online yet + // (see `APIState.RequiresSecondFactorAuth` - in this state queued requests will not execute). + await api.PerformAsync(req).ConfigureAwait(false); + string endpoint = req.Response!.Endpoint; ClientWebSocket socket = new ClientWebSocket(); socket.Options.SetRequestHeader(@"Authorization", @$"Bearer {api.AccessToken}"); diff --git a/osu.Game/Online/PersistentEndpointClientConnector.cs b/osu.Game/Online/PersistentEndpointClientConnector.cs index 8c1b58a750..024a0fea73 100644 --- a/osu.Game/Online/PersistentEndpointClientConnector.cs +++ b/osu.Game/Online/PersistentEndpointClientConnector.cs @@ -69,6 +69,7 @@ namespace osu.Game.Online break; case APIState.Online: + case APIState.RequiresSecondFactorAuth: await connect().ConfigureAwait(true); break; } @@ -83,7 +84,7 @@ namespace osu.Game.Online try { - while (apiState.Value == APIState.Online) + while (apiState.Value == APIState.RequiresSecondFactorAuth || apiState.Value == APIState.Online) { // ensure any previous connection was disposed. // this will also create a new cancellation token source. From c5e118bd1011a3a2f9b5f1affa832dc2e0735c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 30 Jan 2024 22:15:35 +0100 Subject: [PATCH 392/651] Revert "Move fade more local to avoid fading twice" This reverts commit d0421fe20667530bf1bca1a5c8e3f387dde0cf6a and fixes https://github.com/ppy/osu/issues/26801. https://github.com/ppy/osu/pull/26703#discussion_r1469409667 was correct in saying that the early fade-out needs to be restored, and that's because of the early-return. Legacy judgements that are the temporary displayed judgement from new piece should also receive the fade-out, and d0421fe20667530bf1bca1a5c8e3f387dde0cf6a broke that. --- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index edfb5a23ec..068707ba4f 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -46,6 +46,7 @@ namespace osu.Game.Skinning const double fade_out_length = 600; this.FadeInFromZero(fade_in_length); + this.Delay(fade_out_delay).FadeOut(fade_out_length); // legacy judgements don't play any transforms if they are an animation.... UNLESS they are the temporary displayed judgement from new piece. if (animation?.FrameCount > 1 && !forceTransforms) @@ -79,8 +80,6 @@ namespace osu.Game.Skinning this.RotateTo(0); this.RotateTo(rotation, fade_in_length) .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); - - this.Delay(fade_out_delay).FadeOut(fade_out_length); } } else @@ -94,8 +93,6 @@ namespace osu.Game.Skinning // so we need to force the current value to be correct at 1.2 (0.95) then complete the // second half of the transform. .ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4 - - this.Delay(fade_out_delay).FadeOut(fade_out_length); } } From 3aefc919675a855f6d13385d4d69ed326db2bc4f Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Wed, 31 Jan 2024 07:54:07 +0300 Subject: [PATCH 393/651] Make AliveDrawableMap public --- .../PooledDrawableWithLifetimeContainer.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs index 1b0176cae5..1ebdf48ae8 100644 --- a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs +++ b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs @@ -35,7 +35,7 @@ namespace osu.Game.Rulesets.Objects.Pooling /// /// The enumeration order is undefined. /// - public IEnumerable<(TEntry Entry, TDrawable Drawable)> AliveEntries => aliveDrawableMap.Select(x => (x.Key, x.Value)); + public IEnumerable<(TEntry Entry, TDrawable Drawable)> AliveEntries => AliveDrawableMap.Select(x => (x.Key, x.Value)); /// /// Whether to remove an entry when clock goes backward and crossed its . @@ -53,7 +53,7 @@ namespace osu.Game.Rulesets.Objects.Pooling /// internal double FutureLifetimeExtension { get; set; } - private readonly Dictionary aliveDrawableMap = new Dictionary(); + public readonly Dictionary AliveDrawableMap = new Dictionary(); private readonly HashSet allEntries = new HashSet(); private readonly LifetimeEntryManager lifetimeManager = new LifetimeEntryManager(); @@ -101,10 +101,10 @@ namespace osu.Game.Rulesets.Objects.Pooling private void entryBecameAlive(LifetimeEntry lifetimeEntry) { var entry = (TEntry)lifetimeEntry; - Debug.Assert(!aliveDrawableMap.ContainsKey(entry)); + Debug.Assert(!AliveDrawableMap.ContainsKey(entry)); TDrawable drawable = GetDrawable(entry); - aliveDrawableMap[entry] = drawable; + AliveDrawableMap[entry] = drawable; AddDrawable(entry, drawable); } @@ -119,10 +119,10 @@ namespace osu.Game.Rulesets.Objects.Pooling private void entryBecameDead(LifetimeEntry lifetimeEntry) { var entry = (TEntry)lifetimeEntry; - Debug.Assert(aliveDrawableMap.ContainsKey(entry)); + Debug.Assert(AliveDrawableMap.ContainsKey(entry)); - TDrawable drawable = aliveDrawableMap[entry]; - aliveDrawableMap.Remove(entry); + TDrawable drawable = AliveDrawableMap[entry]; + AliveDrawableMap.Remove(entry); RemoveDrawable(entry, drawable); } @@ -148,7 +148,7 @@ namespace osu.Game.Rulesets.Objects.Pooling foreach (var entry in Entries.ToArray()) Remove(entry); - Debug.Assert(aliveDrawableMap.Count == 0); + Debug.Assert(AliveDrawableMap.Count == 0); } protected override bool CheckChildrenLife() From 6b1de5446ad5dfd21a481ee8f484b92b42851be5 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Wed, 31 Jan 2024 07:54:28 +0300 Subject: [PATCH 394/651] Reduce allocaations in ScrollingHitObjectContainer --- osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs index 39ddb5c753..23ac4378e4 100644 --- a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs +++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs @@ -186,9 +186,9 @@ namespace osu.Game.Rulesets.UI.Scrolling // to prevent hit objects displayed in a wrong position for one frame. // Only AliveEntries need to be considered for layout (reduces overhead in the case of scroll speed changes). // We are not using AliveObjects directly to avoid selection/sorting overhead since we don't care about the order at which positions will be updated. - foreach (var entry in AliveEntries) + foreach (var entry in AliveDrawableMap) { - var obj = entry.Drawable; + var obj = entry.Value; updatePosition(obj, Time.Current); From 9b1bbe5f48eaaf6854c6055d45d6c4601ff3226e Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Wed, 31 Jan 2024 15:54:43 +0900 Subject: [PATCH 395/651] Adjust default min result of SliderTailHit, remove override --- osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs | 1 - osu.Game/Rulesets/Judgements/Judgement.cs | 4 +++- osu.Game/Rulesets/Scoring/HitResult.cs | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs index ceee513412..ee2490439f 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs @@ -30,7 +30,6 @@ namespace osu.Game.Rulesets.Osu.Objects public class TailJudgement : SliderEndJudgement { public override HitResult MaxResult => HitResult.SliderTailHit; - public override HitResult MinResult => HitResult.IgnoreMiss; } } } diff --git a/osu.Game/Rulesets/Judgements/Judgement.cs b/osu.Game/Rulesets/Judgements/Judgement.cs index 93386de483..d4d06167f1 100644 --- a/osu.Game/Rulesets/Judgements/Judgement.cs +++ b/osu.Game/Rulesets/Judgements/Judgement.cs @@ -73,9 +73,11 @@ namespace osu.Game.Rulesets.Judgements return HitResult.SmallTickMiss; case HitResult.LargeTickHit: - case HitResult.SliderTailHit: return HitResult.LargeTickMiss; + case HitResult.SliderTailHit: + return HitResult.IgnoreMiss; + default: return HitResult.Miss; } diff --git a/osu.Game/Rulesets/Scoring/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs index 20ec3c4946..b6cfca58db 100644 --- a/osu.Game/Rulesets/Scoring/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -138,7 +138,8 @@ namespace osu.Game.Rulesets.Scoring ComboBreak, /// - /// A special judgement similar to that's used to increase the valuation of the final tick of a slider. + /// A special tick judgement to increase the valuation of the final tick of a slider. + /// The default minimum result is , but may be overridden to . /// [EnumMember(Value = "slider_tail_hit")] [Order(8)] From 3f527081bd663064cf098b5b8af003ba4d41b2ff Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2024 16:12:46 +0900 Subject: [PATCH 396/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index 55ef55ab7d..d944e2ce8e 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index 5b99319499..bd6891f448 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From a7f9f50ce5c3924733c82934fc0402af41d83802 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2024 16:52:50 +0900 Subject: [PATCH 397/651] Show a better message when score submission fails due to system clock being set wrong --- osu.Game/Screens/Play/SubmittingPlayer.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs index 171ceea84f..c8e84f1961 100644 --- a/osu.Game/Screens/Play/SubmittingPlayer.cs +++ b/osu.Game/Screens/Play/SubmittingPlayer.cs @@ -132,7 +132,18 @@ namespace osu.Game.Screens.Play if (string.IsNullOrEmpty(exception.Message)) Logger.Error(exception, "Failed to retrieve a score submission token."); else - Logger.Log($"You are not able to submit a score: {exception.Message}", level: LogLevel.Important); + { + switch (exception.Message) + { + case "expired token": + Logger.Log("Score submission failed because your system clock is set incorrectly. Please check your system time, date and timezone.", level: LogLevel.Important); + break; + + default: + Logger.Log($"You are not able to submit a score: {exception.Message}", level: LogLevel.Important); + break; + } + } Schedule(() => { From ebf637bd3c33f1c886f6bfc81aa9ea2132c9e0d2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2024 17:41:26 +0900 Subject: [PATCH 398/651] Adjust slider tick / end misses to show slightly longer --- .../Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs | 2 +- .../Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs | 2 +- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs index 878e8dbfc2..bd883d6e4c 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPieceSliderTickMiss.cs @@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon this.ScaleTo(1.4f); this.ScaleTo(1f, 150, Easing.Out); - this.FadeOutFromOne(400); + this.FadeOutFromOne(600); } public Drawable? GetAboveHitObjectsProxiedContent() => piece.CreateProxy(); diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs index 9fc71852ba..04c15a1433 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultJudgementPieceSliderTickMiss.cs @@ -44,7 +44,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default this.ScaleTo(1.4f); this.ScaleTo(1f, 150, Easing.Out); - this.FadeOutFromOne(400); + this.FadeOutFromOne(600); } public Drawable? GetAboveHitObjectsProxiedContent() => piece.CreateProxy(); diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index 068707ba4f..c8630b54a6 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -62,7 +62,7 @@ namespace osu.Game.Skinning this.ScaleTo(1.2f); this.ScaleTo(1f, 100, Easing.In); - this.FadeOutFromOne(400); + this.Delay(fade_out_delay / 2).FadeOut(fade_out_length); } else { From fbc923b47ed5e00ac94b5fa20b7310208e650e8c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2024 17:51:38 +0900 Subject: [PATCH 399/651] Revert "Merge pull request #26870 from smoogipoo/adjust-default-minresult" This reverts commit 1acff746ee65020689b873c279aefb9c6c3d8124, reversing changes made to 696ecda398b22da06066bb4d5fc32861758829a8. --- osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs | 1 + osu.Game/Rulesets/Judgements/Judgement.cs | 4 +--- osu.Game/Rulesets/Scoring/HitResult.cs | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs index ee2490439f..ceee513412 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs @@ -30,6 +30,7 @@ namespace osu.Game.Rulesets.Osu.Objects public class TailJudgement : SliderEndJudgement { public override HitResult MaxResult => HitResult.SliderTailHit; + public override HitResult MinResult => HitResult.IgnoreMiss; } } } diff --git a/osu.Game/Rulesets/Judgements/Judgement.cs b/osu.Game/Rulesets/Judgements/Judgement.cs index d4d06167f1..93386de483 100644 --- a/osu.Game/Rulesets/Judgements/Judgement.cs +++ b/osu.Game/Rulesets/Judgements/Judgement.cs @@ -73,10 +73,8 @@ namespace osu.Game.Rulesets.Judgements return HitResult.SmallTickMiss; case HitResult.LargeTickHit: - return HitResult.LargeTickMiss; - case HitResult.SliderTailHit: - return HitResult.IgnoreMiss; + return HitResult.LargeTickMiss; default: return HitResult.Miss; diff --git a/osu.Game/Rulesets/Scoring/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs index b6cfca58db..20ec3c4946 100644 --- a/osu.Game/Rulesets/Scoring/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -138,8 +138,7 @@ namespace osu.Game.Rulesets.Scoring ComboBreak, /// - /// A special tick judgement to increase the valuation of the final tick of a slider. - /// The default minimum result is , but may be overridden to . + /// A special judgement similar to that's used to increase the valuation of the final tick of a slider. /// [EnumMember(Value = "slider_tail_hit")] [Order(8)] From 0642a0ee11f492345d373cd488479449df01bb28 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Wed, 31 Jan 2024 15:54:43 +0900 Subject: [PATCH 400/651] Adjust default min result of SliderTailHit, remove override --- osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs | 1 - osu.Game/Rulesets/Judgements/Judgement.cs | 4 +++- osu.Game/Rulesets/Scoring/HitResult.cs | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs index ceee513412..ee2490439f 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs @@ -30,7 +30,6 @@ namespace osu.Game.Rulesets.Osu.Objects public class TailJudgement : SliderEndJudgement { public override HitResult MaxResult => HitResult.SliderTailHit; - public override HitResult MinResult => HitResult.IgnoreMiss; } } } diff --git a/osu.Game/Rulesets/Judgements/Judgement.cs b/osu.Game/Rulesets/Judgements/Judgement.cs index 93386de483..d4d06167f1 100644 --- a/osu.Game/Rulesets/Judgements/Judgement.cs +++ b/osu.Game/Rulesets/Judgements/Judgement.cs @@ -73,9 +73,11 @@ namespace osu.Game.Rulesets.Judgements return HitResult.SmallTickMiss; case HitResult.LargeTickHit: - case HitResult.SliderTailHit: return HitResult.LargeTickMiss; + case HitResult.SliderTailHit: + return HitResult.IgnoreMiss; + default: return HitResult.Miss; } diff --git a/osu.Game/Rulesets/Scoring/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs index 20ec3c4946..b6cfca58db 100644 --- a/osu.Game/Rulesets/Scoring/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -138,7 +138,8 @@ namespace osu.Game.Rulesets.Scoring ComboBreak, /// - /// A special judgement similar to that's used to increase the valuation of the final tick of a slider. + /// A special tick judgement to increase the valuation of the final tick of a slider. + /// The default minimum result is , but may be overridden to . /// [EnumMember(Value = "slider_tail_hit")] [Order(8)] From 66aa41e00162bcc2c32b48407a9d8dd999831f7c Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Wed, 31 Jan 2024 18:04:32 +0900 Subject: [PATCH 401/651] Fix tests --- .../Rulesets/Scoring/ScoreProcessorTest.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs index 73465fae08..a3f91fffba 100644 --- a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs +++ b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using System.Collections.Generic; using System.Linq; @@ -31,8 +29,8 @@ namespace osu.Game.Tests.Rulesets.Scoring { public partial class ScoreProcessorTest { - private ScoreProcessor scoreProcessor; - private IBeatmap beatmap; + private ScoreProcessor scoreProcessor = null!; + private IBeatmap beatmap = null!; [SetUp] public void SetUp() @@ -86,7 +84,7 @@ namespace osu.Game.Tests.Rulesets.Scoring [TestCase(ScoringMode.Standardised, HitResult.SmallTickHit, HitResult.SmallTickHit, 493_652)] [TestCase(ScoringMode.Standardised, HitResult.LargeTickMiss, HitResult.LargeTickHit, 0)] [TestCase(ScoringMode.Standardised, HitResult.LargeTickHit, HitResult.LargeTickHit, 326_963)] - [TestCase(ScoringMode.Standardised, HitResult.SliderTailHit, HitResult.SliderTailHit, 326_963)] + [TestCase(ScoringMode.Standardised, HitResult.SliderTailHit, HitResult.SliderTailHit, 371_627)] [TestCase(ScoringMode.Standardised, HitResult.SmallBonus, HitResult.SmallBonus, 1_000_030)] [TestCase(ScoringMode.Standardised, HitResult.LargeBonus, HitResult.LargeBonus, 1_000_150)] [TestCase(ScoringMode.Classic, HitResult.Miss, HitResult.Great, 0)] @@ -99,7 +97,7 @@ namespace osu.Game.Tests.Rulesets.Scoring [TestCase(ScoringMode.Classic, HitResult.SmallTickHit, HitResult.SmallTickHit, 49_365)] [TestCase(ScoringMode.Classic, HitResult.LargeTickMiss, HitResult.LargeTickHit, 0)] [TestCase(ScoringMode.Classic, HitResult.LargeTickHit, HitResult.LargeTickHit, 32_696)] - [TestCase(ScoringMode.Classic, HitResult.SliderTailHit, HitResult.SliderTailHit, 32_696)] + [TestCase(ScoringMode.Classic, HitResult.SliderTailHit, HitResult.SliderTailHit, 37_163)] [TestCase(ScoringMode.Classic, HitResult.SmallBonus, HitResult.SmallBonus, 100_003)] [TestCase(ScoringMode.Classic, HitResult.LargeBonus, HitResult.LargeBonus, 100_015)] public void TestFourVariousResultsOneMiss(ScoringMode scoringMode, HitResult hitResult, HitResult maxResult, int expectedScore) @@ -171,7 +169,7 @@ namespace osu.Game.Tests.Rulesets.Scoring [TestCase(HitResult.Perfect, HitResult.Miss)] [TestCase(HitResult.SmallTickHit, HitResult.SmallTickMiss)] [TestCase(HitResult.LargeTickHit, HitResult.LargeTickMiss)] - [TestCase(HitResult.SliderTailHit, HitResult.LargeTickMiss)] + [TestCase(HitResult.SliderTailHit, HitResult.IgnoreMiss)] [TestCase(HitResult.SmallBonus, HitResult.IgnoreMiss)] [TestCase(HitResult.LargeBonus, HitResult.IgnoreMiss)] public void TestMinResults(HitResult hitResult, HitResult expectedMinResult) @@ -476,7 +474,7 @@ namespace osu.Game.Tests.Rulesets.Scoring public override IEnumerable GetModsFor(ModType type) => throw new NotImplementedException(); - public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => throw new NotImplementedException(); + public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList? mods = null) => throw new NotImplementedException(); public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => throw new NotImplementedException(); From f927cb59285ff730f7c8ad7426775f992c0f1352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 31 Jan 2024 12:29:18 +0100 Subject: [PATCH 402/651] Increase repeat count for better coverage of flip operations --- .../OsuHitObjectGenerationUtilsTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs b/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs index d78c32aa6a..ffb9ad1784 100644 --- a/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs +++ b/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs @@ -31,7 +31,7 @@ namespace osu.Game.Rulesets.Osu.Tests new PathControlPoint(new Vector2(-128, 0), PathType.LINEAR) // absolute position: (0, 128) } }, - RepeatCount = 1 + RepeatCount = 2 }; slider.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty()); return slider; @@ -45,7 +45,7 @@ namespace osu.Game.Rulesets.Osu.Tests OsuHitObjectGenerationUtils.ReflectHorizontallyAlongPlayfield(slider); Assert.That(slider.Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 128, 128))); - Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 0, 128))); + Assert.That(slider.NestedHitObjects.OfType().First().Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 0, 128))); Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[] { new Vector2(), @@ -62,7 +62,7 @@ namespace osu.Game.Rulesets.Osu.Tests OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(slider); Assert.That(slider.Position, Is.EqualTo(new Vector2(128, OsuPlayfield.BASE_SIZE.Y - 128))); - Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(0, OsuPlayfield.BASE_SIZE.Y - 128))); + Assert.That(slider.NestedHitObjects.OfType().First().Position, Is.EqualTo(new Vector2(0, OsuPlayfield.BASE_SIZE.Y - 128))); Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[] { new Vector2(), @@ -79,7 +79,7 @@ namespace osu.Game.Rulesets.Osu.Tests OsuHitObjectGenerationUtils.FlipSliderInPlaceHorizontally(slider); Assert.That(slider.Position, Is.EqualTo(new Vector2(128, 128))); - Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(256, 128))); + Assert.That(slider.NestedHitObjects.OfType().First().Position, Is.EqualTo(new Vector2(256, 128))); Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[] { new Vector2(), From a934556bb8e4d266b67c35bbc8c328d540ee35cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 31 Jan 2024 12:34:38 +0100 Subject: [PATCH 403/651] Add failing assertions for head/tail positions after flip --- .../OsuHitObjectGenerationUtilsTest.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs b/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs index ffb9ad1784..77ef4627cb 100644 --- a/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs +++ b/osu.Game.Rulesets.Osu.Tests/OsuHitObjectGenerationUtilsTest.cs @@ -45,7 +45,9 @@ namespace osu.Game.Rulesets.Osu.Tests OsuHitObjectGenerationUtils.ReflectHorizontallyAlongPlayfield(slider); Assert.That(slider.Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 128, 128))); + Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 128, 128))); Assert.That(slider.NestedHitObjects.OfType().First().Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 0, 128))); + Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X, 128))); Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[] { new Vector2(), @@ -62,7 +64,9 @@ namespace osu.Game.Rulesets.Osu.Tests OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(slider); Assert.That(slider.Position, Is.EqualTo(new Vector2(128, OsuPlayfield.BASE_SIZE.Y - 128))); + Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(128, OsuPlayfield.BASE_SIZE.Y - 128))); Assert.That(slider.NestedHitObjects.OfType().First().Position, Is.EqualTo(new Vector2(0, OsuPlayfield.BASE_SIZE.Y - 128))); + Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(0, OsuPlayfield.BASE_SIZE.Y - 128))); Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[] { new Vector2(), @@ -79,7 +83,9 @@ namespace osu.Game.Rulesets.Osu.Tests OsuHitObjectGenerationUtils.FlipSliderInPlaceHorizontally(slider); Assert.That(slider.Position, Is.EqualTo(new Vector2(128, 128))); + Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(128, 128))); Assert.That(slider.NestedHitObjects.OfType().First().Position, Is.EqualTo(new Vector2(256, 128))); + Assert.That(slider.NestedHitObjects.OfType().Single().Position, Is.EqualTo(new Vector2(256, 128))); Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[] { new Vector2(), From dfea2ade6d7d1dda0b080fca826cec767a480199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 31 Jan 2024 12:43:24 +0100 Subject: [PATCH 404/651] Revert incorrect end position optimisation Closes https://github.com/ppy/osu/issues/26867. Reverts 882f49039029b7dc3e287ccc302d04de89de10df and ce643aa68f35369be1a975bb1ceb69fb54192cf2. The applied optimisation may have been valid as long as it was constrained to `Slider`. But it is not, as `SliderTailCircle` stores a local copy of the object position. And as the commit message of ce643aa68f35369be1a975bb1ceb69fb54192cf2 states, this could be bypassed by some pretty hacky delegation from `SliderTailCircle.Position` to the slider, but it'd also be pretty hacky because it would make flows like `PositionBindable` break down. Long-term solution is to probably remove bindables from hitobjects. --- osu.Game.Rulesets.Osu/Objects/Slider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 032f105ded..506145568e 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Osu.Objects set { repeatCount = value; - endPositionCache.Invalidate(); + updateNestedPositions(); } } @@ -165,7 +165,7 @@ namespace osu.Game.Rulesets.Osu.Objects public Slider() { SamplesBindable.CollectionChanged += (_, _) => UpdateNestedSamples(); - Path.Version.ValueChanged += _ => endPositionCache.Invalidate(); + Path.Version.ValueChanged += _ => updateNestedPositions(); } protected override void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, IBeatmapDifficultyInfo difficulty) From 424859328938f86d6520bf784530c3b33d2a1ffb Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2024 22:41:44 +0900 Subject: [PATCH 405/651] Fix menu banner not updating as often as we want it to --- osu.Game/Online/API/Requests/GetSystemTitleRequest.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Online/API/Requests/GetSystemTitleRequest.cs b/osu.Game/Online/API/Requests/GetSystemTitleRequest.cs index 659e46bb11..52ca0c11eb 100644 --- a/osu.Game/Online/API/Requests/GetSystemTitleRequest.cs +++ b/osu.Game/Online/API/Requests/GetSystemTitleRequest.cs @@ -1,7 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using osu.Game.Online.API.Requests.Responses; namespace osu.Game.Online.API.Requests @@ -9,7 +8,7 @@ namespace osu.Game.Online.API.Requests public class GetSystemTitleRequest : OsuJsonWebRequest { public GetSystemTitleRequest() - : base($@"https://assets.ppy.sh/lazer-status.json?{DateTimeOffset.UtcNow.ToUnixTimeSeconds() / 1800}") + : base(@"https://assets.ppy.sh/lazer-status.json") { } } From e71c95f1fed41cf194d4c004c0d1b5a9e3620f32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 31 Jan 2024 14:48:27 +0100 Subject: [PATCH 406/651] Reintroduce `IMod.Ranked` What goes around, comes around. --- osu.Game/Rulesets/Mods/IMod.cs | 5 +++++ osu.Game/Rulesets/Mods/Mod.cs | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/osu.Game/Rulesets/Mods/IMod.cs b/osu.Game/Rulesets/Mods/IMod.cs index 744d02a4fa..3a33d14835 100644 --- a/osu.Game/Rulesets/Mods/IMod.cs +++ b/osu.Game/Rulesets/Mods/IMod.cs @@ -66,6 +66,11 @@ namespace osu.Game.Rulesets.Mods /// bool AlwaysValidForSubmission { get; } + /// + /// Whether scores with this mod active can give performance points. + /// + bool Ranked { get; } + /// /// Create a fresh instance based on this mod. /// diff --git a/osu.Game/Rulesets/Mods/Mod.cs b/osu.Game/Rulesets/Mods/Mod.cs index 0500b49513..50c867f41b 100644 --- a/osu.Game/Rulesets/Mods/Mod.cs +++ b/osu.Game/Rulesets/Mods/Mod.cs @@ -167,6 +167,12 @@ namespace osu.Game.Rulesets.Mods [JsonIgnore] public virtual bool RequiresConfiguration => false; + /// + /// Whether scores with this mod active can give performance points. + /// + [JsonIgnore] + public virtual bool Ranked => false; + /// /// The mods this mod cannot be enabled with. /// From 0642d740149b2daf8876d76b3b55c15709cd6144 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Wed, 31 Jan 2024 22:52:57 +0900 Subject: [PATCH 407/651] Expose as ReadOnlyDictionary --- .../PooledDrawableWithLifetimeContainer.cs | 19 +++++++++++-------- .../UI/GameplaySampleTriggerSource.cs | 2 +- osu.Game/Rulesets/UI/HitObjectContainer.cs | 2 +- .../Scrolling/ScrollingHitObjectContainer.cs | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs index 1ebdf48ae8..aed608cf8f 100644 --- a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs +++ b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using osu.Framework.Graphics; @@ -35,7 +36,7 @@ namespace osu.Game.Rulesets.Objects.Pooling /// /// The enumeration order is undefined. /// - public IEnumerable<(TEntry Entry, TDrawable Drawable)> AliveEntries => AliveDrawableMap.Select(x => (x.Key, x.Value)); + public readonly ReadOnlyDictionary AliveEntries; /// /// Whether to remove an entry when clock goes backward and crossed its . @@ -53,7 +54,7 @@ namespace osu.Game.Rulesets.Objects.Pooling /// internal double FutureLifetimeExtension { get; set; } - public readonly Dictionary AliveDrawableMap = new Dictionary(); + private readonly Dictionary aliveDrawableMap = new Dictionary(); private readonly HashSet allEntries = new HashSet(); private readonly LifetimeEntryManager lifetimeManager = new LifetimeEntryManager(); @@ -63,6 +64,8 @@ namespace osu.Game.Rulesets.Objects.Pooling lifetimeManager.EntryBecameAlive += entryBecameAlive; lifetimeManager.EntryBecameDead += entryBecameDead; lifetimeManager.EntryCrossedBoundary += entryCrossedBoundary; + + AliveEntries = new ReadOnlyDictionary(aliveDrawableMap); } /// @@ -101,10 +104,10 @@ namespace osu.Game.Rulesets.Objects.Pooling private void entryBecameAlive(LifetimeEntry lifetimeEntry) { var entry = (TEntry)lifetimeEntry; - Debug.Assert(!AliveDrawableMap.ContainsKey(entry)); + Debug.Assert(!aliveDrawableMap.ContainsKey(entry)); TDrawable drawable = GetDrawable(entry); - AliveDrawableMap[entry] = drawable; + aliveDrawableMap[entry] = drawable; AddDrawable(entry, drawable); } @@ -119,10 +122,10 @@ namespace osu.Game.Rulesets.Objects.Pooling private void entryBecameDead(LifetimeEntry lifetimeEntry) { var entry = (TEntry)lifetimeEntry; - Debug.Assert(AliveDrawableMap.ContainsKey(entry)); + Debug.Assert(aliveDrawableMap.ContainsKey(entry)); - TDrawable drawable = AliveDrawableMap[entry]; - AliveDrawableMap.Remove(entry); + TDrawable drawable = aliveDrawableMap[entry]; + aliveDrawableMap.Remove(entry); RemoveDrawable(entry, drawable); } @@ -148,7 +151,7 @@ namespace osu.Game.Rulesets.Objects.Pooling foreach (var entry in Entries.ToArray()) Remove(entry); - Debug.Assert(AliveDrawableMap.Count == 0); + Debug.Assert(aliveDrawableMap.Count == 0); } protected override bool CheckChildrenLife() diff --git a/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs b/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs index b61e8d9674..177520f28f 100644 --- a/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs +++ b/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs @@ -105,7 +105,7 @@ namespace osu.Game.Rulesets.UI // If required, we can make this lookup more efficient by adding support to get next-future-entry in LifetimeEntryManager. var candidate = // Use alive entries first as an optimisation. - hitObjectContainer.AliveEntries.Select(tuple => tuple.Entry).Where(e => !isAlreadyHit(e)).MinBy(e => e.HitObject.StartTime) + hitObjectContainer.AliveEntries.Keys.Where(e => !isAlreadyHit(e)).MinBy(e => e.HitObject.StartTime) ?? hitObjectContainer.Entries.Where(e => !isAlreadyHit(e)).MinBy(e => e.HitObject.StartTime); // In the case there are no non-judged objects, the last hit object should be used instead. diff --git a/osu.Game/Rulesets/UI/HitObjectContainer.cs b/osu.Game/Rulesets/UI/HitObjectContainer.cs index 099be486b3..c2879e6d87 100644 --- a/osu.Game/Rulesets/UI/HitObjectContainer.cs +++ b/osu.Game/Rulesets/UI/HitObjectContainer.cs @@ -21,7 +21,7 @@ namespace osu.Game.Rulesets.UI { public IEnumerable Objects => InternalChildren.Cast().OrderBy(h => h.HitObject.StartTime); - public IEnumerable AliveObjects => AliveEntries.Select(pair => pair.Drawable).OrderBy(h => h.HitObject.StartTime); + public IEnumerable AliveObjects => AliveEntries.Values.OrderBy(h => h.HitObject.StartTime); /// /// Invoked when a is judged. diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs index 23ac4378e4..4e72291b9c 100644 --- a/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs +++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingHitObjectContainer.cs @@ -186,7 +186,7 @@ namespace osu.Game.Rulesets.UI.Scrolling // to prevent hit objects displayed in a wrong position for one frame. // Only AliveEntries need to be considered for layout (reduces overhead in the case of scroll speed changes). // We are not using AliveObjects directly to avoid selection/sorting overhead since we don't care about the order at which positions will be updated. - foreach (var entry in AliveDrawableMap) + foreach (var entry in AliveEntries) { var obj = entry.Value; From f89923aeaee5785aeb4b91b6aaa3dfdf8b8ad791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 31 Jan 2024 14:59:35 +0100 Subject: [PATCH 408/651] Annotate mods that give pp --- osu.Game.Rulesets.Mania/Mods/ManiaKeyMod.cs | 1 + osu.Game.Rulesets.Mania/Mods/ManiaModHardRock.cs | 1 + osu.Game.Rulesets.Mania/Mods/ManiaModKey1.cs | 1 + osu.Game.Rulesets.Mania/Mods/ManiaModKey10.cs | 1 + osu.Game.Rulesets.Mania/Mods/ManiaModKey2.cs | 1 + osu.Game.Rulesets.Mania/Mods/ManiaModKey3.cs | 1 + osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs | 1 + osu.Game.Rulesets.Osu/Mods/OsuModSpunOut.cs | 1 + osu.Game.Rulesets.Osu/Mods/OsuModTouchDevice.cs | 1 + osu.Game/Rulesets/Mods/ModDaycore.cs | 1 + osu.Game/Rulesets/Mods/ModDoubleTime.cs | 1 + osu.Game/Rulesets/Mods/ModEasy.cs | 1 + osu.Game/Rulesets/Mods/ModFlashlight.cs | 1 + osu.Game/Rulesets/Mods/ModHalfTime.cs | 1 + osu.Game/Rulesets/Mods/ModHardRock.cs | 1 + osu.Game/Rulesets/Mods/ModHidden.cs | 1 + osu.Game/Rulesets/Mods/ModMuted.cs | 1 + osu.Game/Rulesets/Mods/ModNightcore.cs | 1 + osu.Game/Rulesets/Mods/ModNoFail.cs | 1 + osu.Game/Rulesets/Mods/ModPerfect.cs | 1 + osu.Game/Rulesets/Mods/ModSuddenDeath.cs | 1 + 21 files changed, 21 insertions(+) diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaKeyMod.cs b/osu.Game.Rulesets.Mania/Mods/ManiaKeyMod.cs index 050b302bd8..88d6a19822 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaKeyMod.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaKeyMod.cs @@ -15,6 +15,7 @@ namespace osu.Game.Rulesets.Mania.Mods public abstract int KeyCount { get; } public override ModType Type => ModType.Conversion; public override double ScoreMultiplier => 1; // TODO: Implement the mania key mod score multiplier + public override bool Ranked => UsesDefaultConfiguration; public void ApplyToBeatmapConverter(IBeatmapConverter beatmapConverter) { diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHardRock.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHardRock.cs index d9de06a811..189c4b3a5f 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHardRock.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHardRock.cs @@ -8,5 +8,6 @@ namespace osu.Game.Rulesets.Mania.Mods public class ManiaModHardRock : ModHardRock { public override double ScoreMultiplier => 1; + public override bool Ranked => false; } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModKey1.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModKey1.cs index 31f52610e9..7dd0c499da 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModKey1.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModKey1.cs @@ -11,5 +11,6 @@ namespace osu.Game.Rulesets.Mania.Mods public override string Name => "One Key"; public override string Acronym => "1K"; public override LocalisableString Description => @"Play with one key."; + public override bool Ranked => false; } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModKey10.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModKey10.cs index 67e65b887a..a6c57d4597 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModKey10.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModKey10.cs @@ -11,5 +11,6 @@ namespace osu.Game.Rulesets.Mania.Mods public override string Name => "Ten Keys"; public override string Acronym => "10K"; public override LocalisableString Description => @"Play with ten keys."; + public override bool Ranked => false; } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModKey2.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModKey2.cs index 0f8148d252..0d04395a52 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModKey2.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModKey2.cs @@ -11,5 +11,6 @@ namespace osu.Game.Rulesets.Mania.Mods public override string Name => "Two Keys"; public override string Acronym => "2K"; public override LocalisableString Description => @"Play with two keys."; + public override bool Ranked => false; } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModKey3.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModKey3.cs index 0f8af7940c..c83b0979ee 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModKey3.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModKey3.cs @@ -11,5 +11,6 @@ namespace osu.Game.Rulesets.Mania.Mods public override string Name => "Three Keys"; public override string Acronym => "3K"; public override LocalisableString Description => @"Play with three keys."; + public override bool Ranked => false; } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs index f9690b4298..cc7e270dda 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs @@ -14,6 +14,7 @@ namespace osu.Game.Rulesets.Mania.Mods public class ManiaModMirror : ModMirror, IApplicableToBeatmap { public override LocalisableString Description => "Notes are flipped horizontally."; + public override bool Ranked => UsesDefaultConfiguration; public void ApplyToBeatmap(IBeatmap beatmap) { diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModSpunOut.cs b/osu.Game.Rulesets.Osu/Mods/OsuModSpunOut.cs index f691731afe..df9544b71e 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModSpunOut.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModSpunOut.cs @@ -22,6 +22,7 @@ namespace osu.Game.Rulesets.Osu.Mods public override LocalisableString Description => @"Spinners will be automatically completed."; public override double ScoreMultiplier => 0.9; public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(OsuModAutopilot), typeof(OsuModTargetPractice) }; + public override bool Ranked => UsesDefaultConfiguration; public void ApplyToDrawableHitObject(DrawableHitObject hitObject) { diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModTouchDevice.cs b/osu.Game.Rulesets.Osu/Mods/OsuModTouchDevice.cs index f1468d414e..917685cdad 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModTouchDevice.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModTouchDevice.cs @@ -10,5 +10,6 @@ namespace osu.Game.Rulesets.Osu.Mods public class OsuModTouchDevice : ModTouchDevice { public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModAutopilot) }).ToArray(); + public override bool Ranked => UsesDefaultConfiguration; } } diff --git a/osu.Game/Rulesets/Mods/ModDaycore.cs b/osu.Game/Rulesets/Mods/ModDaycore.cs index 09b35c249e..359f8a950c 100644 --- a/osu.Game/Rulesets/Mods/ModDaycore.cs +++ b/osu.Game/Rulesets/Mods/ModDaycore.cs @@ -17,6 +17,7 @@ namespace osu.Game.Rulesets.Mods public override IconUsage? Icon => null; public override ModType Type => ModType.DifficultyReduction; public override LocalisableString Description => "Whoaaaaa..."; + public override bool Ranked => UsesDefaultConfiguration; [SettingSource("Speed decrease", "The actual decrease to apply", SettingControlType = typeof(MultiplierSettingsSlider))] public override BindableNumber SpeedChange { get; } = new BindableDouble(0.75) diff --git a/osu.Game/Rulesets/Mods/ModDoubleTime.cs b/osu.Game/Rulesets/Mods/ModDoubleTime.cs index 789291772d..8e430da368 100644 --- a/osu.Game/Rulesets/Mods/ModDoubleTime.cs +++ b/osu.Game/Rulesets/Mods/ModDoubleTime.cs @@ -18,6 +18,7 @@ namespace osu.Game.Rulesets.Mods public override IconUsage? Icon => OsuIcon.ModDoubleTime; public override ModType Type => ModType.DifficultyIncrease; public override LocalisableString Description => "Zoooooooooom..."; + public override bool Ranked => UsesDefaultConfiguration; [SettingSource("Speed increase", "The actual increase to apply", SettingControlType = typeof(MultiplierSettingsSlider))] public override BindableNumber SpeedChange { get; } = new BindableDouble(1.5) diff --git a/osu.Game/Rulesets/Mods/ModEasy.cs b/osu.Game/Rulesets/Mods/ModEasy.cs index 0f51e2a6d5..da43a6b294 100644 --- a/osu.Game/Rulesets/Mods/ModEasy.cs +++ b/osu.Game/Rulesets/Mods/ModEasy.cs @@ -16,6 +16,7 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.DifficultyReduction; public override double ScoreMultiplier => 0.5; public override Type[] IncompatibleMods => new[] { typeof(ModHardRock), typeof(ModDifficultyAdjust) }; + public override bool Ranked => UsesDefaultConfiguration; public virtual void ReadFromDifficulty(BeatmapDifficulty difficulty) { diff --git a/osu.Game/Rulesets/Mods/ModFlashlight.cs b/osu.Game/Rulesets/Mods/ModFlashlight.cs index dc2ad6f47e..9227af64b8 100644 --- a/osu.Game/Rulesets/Mods/ModFlashlight.cs +++ b/osu.Game/Rulesets/Mods/ModFlashlight.cs @@ -33,6 +33,7 @@ namespace osu.Game.Rulesets.Mods public override IconUsage? Icon => OsuIcon.ModFlashlight; public override ModType Type => ModType.DifficultyIncrease; public override LocalisableString Description => "Restricted view area."; + public override bool Ranked => UsesDefaultConfiguration; [SettingSource("Flashlight size", "Multiplier applied to the default flashlight size.")] public abstract BindableFloat SizeMultiplier { get; } diff --git a/osu.Game/Rulesets/Mods/ModHalfTime.cs b/osu.Game/Rulesets/Mods/ModHalfTime.cs index 8b5dd39584..59e40ee9cc 100644 --- a/osu.Game/Rulesets/Mods/ModHalfTime.cs +++ b/osu.Game/Rulesets/Mods/ModHalfTime.cs @@ -18,6 +18,7 @@ namespace osu.Game.Rulesets.Mods public override IconUsage? Icon => OsuIcon.ModHalftime; public override ModType Type => ModType.DifficultyReduction; public override LocalisableString Description => "Less zoom..."; + public override bool Ranked => UsesDefaultConfiguration; [SettingSource("Speed decrease", "The actual decrease to apply", SettingControlType = typeof(MultiplierSettingsSlider))] public override BindableNumber SpeedChange { get; } = new BindableDouble(0.75) diff --git a/osu.Game/Rulesets/Mods/ModHardRock.cs b/osu.Game/Rulesets/Mods/ModHardRock.cs index 4b2d1d050e..1e99891b99 100644 --- a/osu.Game/Rulesets/Mods/ModHardRock.cs +++ b/osu.Game/Rulesets/Mods/ModHardRock.cs @@ -17,6 +17,7 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.DifficultyIncrease; public override LocalisableString Description => "Everything just got a bit harder..."; public override Type[] IncompatibleMods => new[] { typeof(ModEasy), typeof(ModDifficultyAdjust) }; + public override bool Ranked => UsesDefaultConfiguration; protected const float ADJUST_RATIO = 1.4f; diff --git a/osu.Game/Rulesets/Mods/ModHidden.cs b/osu.Game/Rulesets/Mods/ModHidden.cs index 8b25768575..5a1abf115f 100644 --- a/osu.Game/Rulesets/Mods/ModHidden.cs +++ b/osu.Game/Rulesets/Mods/ModHidden.cs @@ -14,6 +14,7 @@ namespace osu.Game.Rulesets.Mods public override string Acronym => "HD"; public override IconUsage? Icon => OsuIcon.ModHidden; public override ModType Type => ModType.DifficultyIncrease; + public override bool Ranked => UsesDefaultConfiguration; public void ApplyToScoreProcessor(ScoreProcessor scoreProcessor) { diff --git a/osu.Game/Rulesets/Mods/ModMuted.cs b/osu.Game/Rulesets/Mods/ModMuted.cs index 131f501630..3ecd9aa6a1 100644 --- a/osu.Game/Rulesets/Mods/ModMuted.cs +++ b/osu.Game/Rulesets/Mods/ModMuted.cs @@ -25,6 +25,7 @@ namespace osu.Game.Rulesets.Mods public override LocalisableString Description => "Can you still feel the rhythm without music?"; public override ModType Type => ModType.Fun; public override double ScoreMultiplier => 1; + public override bool Ranked => UsesDefaultConfiguration; } public abstract class ModMuted : ModMuted, IApplicableToDrawableRuleset, IApplicableToTrack, IApplicableToScoreProcessor diff --git a/osu.Game/Rulesets/Mods/ModNightcore.cs b/osu.Game/Rulesets/Mods/ModNightcore.cs index b42927256c..bb18940f8c 100644 --- a/osu.Game/Rulesets/Mods/ModNightcore.cs +++ b/osu.Game/Rulesets/Mods/ModNightcore.cs @@ -28,6 +28,7 @@ namespace osu.Game.Rulesets.Mods public override IconUsage? Icon => OsuIcon.ModNightcore; public override ModType Type => ModType.DifficultyIncrease; public override LocalisableString Description => "Uguuuuuuuu..."; + public override bool Ranked => UsesDefaultConfiguration; [SettingSource("Speed increase", "The actual increase to apply", SettingControlType = typeof(MultiplierSettingsSlider))] public override BindableNumber SpeedChange { get; } = new BindableDouble(1.5) diff --git a/osu.Game/Rulesets/Mods/ModNoFail.cs b/osu.Game/Rulesets/Mods/ModNoFail.cs index cc451772b2..1aaef8eac4 100644 --- a/osu.Game/Rulesets/Mods/ModNoFail.cs +++ b/osu.Game/Rulesets/Mods/ModNoFail.cs @@ -20,6 +20,7 @@ namespace osu.Game.Rulesets.Mods public override LocalisableString Description => "You can't fail, no matter what."; public override double ScoreMultiplier => 0.5; public override Type[] IncompatibleMods => new[] { typeof(ModFailCondition), typeof(ModCinema) }; + public override bool Ranked => UsesDefaultConfiguration; private readonly Bindable showHealthBar = new Bindable(); diff --git a/osu.Game/Rulesets/Mods/ModPerfect.cs b/osu.Game/Rulesets/Mods/ModPerfect.cs index 0ba40ba070..f8f498ceb5 100644 --- a/osu.Game/Rulesets/Mods/ModPerfect.cs +++ b/osu.Game/Rulesets/Mods/ModPerfect.cs @@ -19,6 +19,7 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.DifficultyIncrease; public override double ScoreMultiplier => 1; public override LocalisableString Description => "SS or quit."; + public override bool Ranked => UsesDefaultConfiguration; public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(ModSuddenDeath), typeof(ModAccuracyChallenge) }).ToArray(); diff --git a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs index 4e4e8662e8..62579a168c 100644 --- a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs +++ b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs @@ -19,6 +19,7 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.DifficultyIncrease; public override LocalisableString Description => "Miss and fail."; public override double ScoreMultiplier => 1; + public override bool Ranked => UsesDefaultConfiguration; public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModPerfect)).ToArray(); From 7165511754ad437f035e87fdd96323d3c75e7a67 Mon Sep 17 00:00:00 2001 From: syscats Date: Wed, 31 Jan 2024 15:49:31 +0100 Subject: [PATCH 409/651] Use ordinal sorting for artist string comparison --- osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs index 6d2e938fb7..857f7efb8e 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs @@ -67,7 +67,7 @@ namespace osu.Game.Screens.Select.Carousel { default: case SortMode.Artist: - comparison = string.Compare(BeatmapSet.Metadata.Artist, otherSet.BeatmapSet.Metadata.Artist, StringComparison.OrdinalIgnoreCase); + comparison = string.Compare(BeatmapSet.Metadata.Artist, otherSet.BeatmapSet.Metadata.Artist, StringComparison.Ordinal); break; case SortMode.Title: From 563f4a26b139be4b4c9354af20b5275527ee85d1 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 1 Feb 2024 21:10:37 +0900 Subject: [PATCH 410/651] Show "failing" icon on user panel when 2FA prompt is present This gives the user a chance to know it's required. --- osu.Game/Overlays/Toolbar/ToolbarUserButton.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs index 28521e3331..1e812d7238 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs @@ -95,7 +95,7 @@ namespace osu.Game.Overlays.Toolbar private void onlineStateChanged(ValueChangedEvent state) => Schedule(() => { - failingIcon.FadeTo(state.NewValue == APIState.Failing ? 1 : 0, 200, Easing.OutQuint); + failingIcon.FadeTo(state.NewValue == APIState.Failing || state.NewValue == APIState.RequiresSecondFactorAuth ? 1 : 0, 200, Easing.OutQuint); switch (state.NewValue) { From bf3746daa8e8117a23978b3982185af7145d37fd Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 1 Feb 2024 21:10:53 +0900 Subject: [PATCH 411/651] Show login overlay at main menu when 2FA is required --- osu.Game/Screens/Menu/MainMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs index a75edd1cff..decb901c32 100644 --- a/osu.Game/Screens/Menu/MainMenu.cs +++ b/osu.Game/Screens/Menu/MainMenu.cs @@ -280,7 +280,7 @@ namespace osu.Game.Screens.Menu sideFlashes.Delay(FADE_IN_DURATION).FadeIn(64, Easing.InQuint); } - else if (!api.IsLoggedIn) + else if (!api.IsLoggedIn || api.State.Value == APIState.RequiresSecondFactorAuth) { // copy out old action to avoid accidentally capturing logo.Action in closure, causing a self-reference loop. var previousAction = logo.Action; From 0407b5d84ac0bc2d872ffc3bb173f622900ffd45 Mon Sep 17 00:00:00 2001 From: syscats Date: Thu, 1 Feb 2024 14:03:59 +0100 Subject: [PATCH 412/651] use ordinal sorting on each method --- osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs index 857f7efb8e..f7b715862a 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs @@ -71,15 +71,15 @@ namespace osu.Game.Screens.Select.Carousel break; case SortMode.Title: - comparison = string.Compare(BeatmapSet.Metadata.Title, otherSet.BeatmapSet.Metadata.Title, StringComparison.OrdinalIgnoreCase); + comparison = string.Compare(BeatmapSet.Metadata.Title, otherSet.BeatmapSet.Metadata.Title, StringComparison.Ordinal); break; case SortMode.Author: - comparison = string.Compare(BeatmapSet.Metadata.Author.Username, otherSet.BeatmapSet.Metadata.Author.Username, StringComparison.OrdinalIgnoreCase); + comparison = string.Compare(BeatmapSet.Metadata.Author.Username, otherSet.BeatmapSet.Metadata.Author.Username, StringComparison.Ordinal); break; case SortMode.Source: - comparison = string.Compare(BeatmapSet.Metadata.Source, otherSet.BeatmapSet.Metadata.Source, StringComparison.OrdinalIgnoreCase); + comparison = string.Compare(BeatmapSet.Metadata.Source, otherSet.BeatmapSet.Metadata.Source, StringComparison.Ordinal); break; case SortMode.DateAdded: From 5bbaeb6836cd9280f7e09d946192ba9e3ad69ddf Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 1 Feb 2024 16:08:33 +0300 Subject: [PATCH 413/651] Play legacy applause sound only when rank is B or higher --- .../Expanded/Accuracy/AccuracyCircle.cs | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index 60c35e6203..5de5ceb2a8 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -10,7 +10,6 @@ using osu.Framework.Audio; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; -using osu.Framework.Graphics.Audio; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; @@ -86,6 +85,9 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy /// public static readonly Easing ACCURACY_TRANSFORM_EASING = Easing.OutPow10; + [Resolved] + private SkinManager skins { get; set; } + private readonly ScoreInfo score; private CircularProgress accuracyCircle; @@ -99,7 +101,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy private PoolableSkinnableSample swooshUpSound; private PoolableSkinnableSample rankImpactSound; private PoolableSkinnableSample rankApplauseSound; - private DrawableSample rankFailSound; + private PoolableSkinnableSample rankLegacyApplauseSound; private readonly Bindable tickPlaybackRate = new Bindable(); @@ -264,12 +266,12 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy AddRangeInternal(new Drawable[] { rankImpactSound = new PoolableSkinnableSample(new SampleInfo(impactSampleName)), - rankApplauseSound = new PoolableSkinnableSample(new SampleInfo(@"applause", applauseSampleName)), + rankApplauseSound = new PoolableSkinnableSample(new SampleInfo(applauseSampleName)), + rankLegacyApplauseSound = new PoolableSkinnableSample(new SampleInfo("applause")), scoreTickSound = new PoolableSkinnableSample(new SampleInfo(@"Results/score-tick")), badgeTickSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink")), badgeMaxSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink-max")), swooshUpSound = new PoolableSkinnableSample(new SampleInfo(@"Results/swoosh-up")), - rankFailSound = new DrawableSample(audio.Samples.Get(results_applause_d_sound)), }); } } @@ -399,15 +401,19 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy { Schedule(() => { - if (score.Rank != ScoreRank.F) + if (skins.CurrentSkin.Value is LegacySkin) { - rankApplauseSound.VolumeTo(applause_volume); - rankApplauseSound.Play(); + // only play legacy "applause" sound if score rank is B or higher. + if (score.Rank >= ScoreRank.B) + { + rankLegacyApplauseSound.VolumeTo(applause_volume); + rankLegacyApplauseSound.Play(); + } } else { - rankFailSound.VolumeTo(applause_volume); - rankFailSound.Play(); + rankApplauseSound.VolumeTo(applause_volume); + rankApplauseSound.Play(); } }); } @@ -451,8 +457,6 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy } } - private const string results_applause_d_sound = @"Results/applause-d"; - private string applauseSampleName { get @@ -461,7 +465,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy { default: case ScoreRank.D: - return results_applause_d_sound; + return @"Results/applause-d"; case ScoreRank.C: return @"Results/applause-c"; From 6ab8960fdc630d4110734d206bd15c417b76d0f5 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 1 Feb 2024 16:08:48 +0300 Subject: [PATCH 414/651] Add step for toggling skins in results screen test scene --- osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs index 122149be44..2bda242de2 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs @@ -62,6 +62,12 @@ namespace osu.Game.Tests.Visual.Ranking if (beatmapInfo != null) Beatmap.Value = beatmaps.GetWorkingBeatmap(beatmapInfo); }); + + AddToggleStep("toggle skin", v => + { + if (skins != null) + skins.CurrentSkinInfo.Value = v ? skins.DefaultClassicSkin.SkinInfo : skins.CurrentSkinInfo.Default; + }); } [SetUp] From b0f6a87a2b6119f82c6219f73363e6c6578d0d2d Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 1 Feb 2024 15:35:23 +0300 Subject: [PATCH 415/651] Add stress test in TestSceneDashboardOverlay --- .../Online/TestSceneDashboardOverlay.cs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneDashboardOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneDashboardOverlay.cs index 9407941da6..b6a300322f 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneDashboardOverlay.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneDashboardOverlay.cs @@ -2,14 +2,15 @@ // See the LICENCE file in the repository root for full licence text. using NUnit.Framework; +using osu.Framework.Allocation; +using osu.Game.Online.API; +using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays; namespace osu.Game.Tests.Visual.Online { public partial class TestSceneDashboardOverlay : OsuTestScene { - protected override bool UseOnlineAPI => true; - private readonly DashboardOverlay overlay; public TestSceneDashboardOverlay() @@ -17,6 +18,30 @@ namespace osu.Game.Tests.Visual.Online Add(overlay = new DashboardOverlay()); } + [BackgroundDependencyLoader] + private void load() + { + int supportLevel = 0; + + for (int i = 0; i < 1000; i++) + { + supportLevel++; + + if (supportLevel > 3) + supportLevel = 0; + + ((DummyAPIAccess)API).Friends.Add(new APIUser + { + Username = @"peppy", + Id = 2, + Colour = "99EB47", + CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg", + IsSupporter = supportLevel > 0, + SupportLevel = supportLevel + }); + } + } + [Test] public void TestShow() { From 2bd9dcf646127261c62e1a8c913768a9a59d0221 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 1 Feb 2024 16:13:36 +0300 Subject: [PATCH 416/651] Rework UserGridPanel to reduce containers nesting --- osu.Game/Users/UserGridPanel.cs | 138 ++++++++++++++------------------ 1 file changed, 62 insertions(+), 76 deletions(-) diff --git a/osu.Game/Users/UserGridPanel.cs b/osu.Game/Users/UserGridPanel.cs index fe3435c248..fce543415d 100644 --- a/osu.Game/Users/UserGridPanel.cs +++ b/osu.Game/Users/UserGridPanel.cs @@ -35,98 +35,84 @@ namespace osu.Game.Users { FillFlowContainer details; - var layout = new Container + var layout = new GridContainer { RelativeSizeAxes = Axes.Both, Padding = new MarginPadding(margin), - Child = new GridContainer + ColumnDimensions = new[] { - RelativeSizeAxes = Axes.Both, - ColumnDimensions = new[] + new Dimension(GridSizeMode.AutoSize), + new Dimension() + }, + RowDimensions = new[] + { + new Dimension(GridSizeMode.AutoSize), + new Dimension() + }, + Content = new[] + { + new Drawable[] { - new Dimension(GridSizeMode.AutoSize), - new Dimension() - }, - RowDimensions = new[] - { - new Dimension(GridSizeMode.AutoSize), - new Dimension(GridSizeMode.Absolute, margin), - new Dimension() - }, - Content = new[] - { - new Drawable[] + CreateAvatar().With(avatar => { - CreateAvatar().With(avatar => + avatar.Size = new Vector2(60); + avatar.Masking = true; + avatar.CornerRadius = 6; + avatar.Margin = new MarginPadding { Bottom = margin }; + }), + new GridContainer + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = margin, Bottom = margin }, + ColumnDimensions = new[] { - avatar.Size = new Vector2(60); - avatar.Masking = true; - avatar.CornerRadius = 6; - }), - new Container + new Dimension() + }, + RowDimensions = new[] { - RelativeSizeAxes = Axes.Both, - Padding = new MarginPadding { Left = margin }, - Child = new GridContainer + new Dimension(GridSizeMode.AutoSize), + new Dimension() + }, + Content = new[] + { + new Drawable[] { - RelativeSizeAxes = Axes.Both, - ColumnDimensions = new[] + details = new FillFlowContainer { - new Dimension() - }, - RowDimensions = new[] - { - new Dimension(GridSizeMode.AutoSize), - new Dimension() - }, - Content = new[] - { - new Drawable[] + AutoSizeAxes = Axes.Both, + Direction = FillDirection.Horizontal, + Spacing = new Vector2(6), + Children = new Drawable[] { - details = new FillFlowContainer - { - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Horizontal, - Spacing = new Vector2(6), - Children = new Drawable[] - { - CreateFlag(), - // supporter icon is being added later - } - } - }, - new Drawable[] - { - CreateUsername().With(username => - { - username.Anchor = Anchor.CentreLeft; - username.Origin = Anchor.CentreLeft; - }) + CreateFlag(), + // supporter icon is being added later } } + }, + new Drawable[] + { + CreateUsername().With(username => + { + username.Anchor = Anchor.CentreLeft; + username.Origin = Anchor.CentreLeft; + }) } } - }, - new[] - { - // padding - Empty(), - Empty() - }, - new Drawable[] - { - CreateStatusIcon().With(icon => - { - icon.Anchor = Anchor.Centre; - icon.Origin = Anchor.Centre; - }), - CreateStatusMessage(false).With(message => - { - message.Anchor = Anchor.CentreLeft; - message.Origin = Anchor.CentreLeft; - message.Margin = new MarginPadding { Left = margin }; - }) } + }, + new Drawable[] + { + CreateStatusIcon().With(icon => + { + icon.Anchor = Anchor.Centre; + icon.Origin = Anchor.Centre; + }), + CreateStatusMessage(false).With(message => + { + message.Anchor = Anchor.CentreLeft; + message.Origin = Anchor.CentreLeft; + message.Margin = new MarginPadding { Left = margin }; + }) } } }; From 66350fd148f7189535b1c070af9d3321cc9704d3 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 1 Feb 2024 16:33:54 +0300 Subject: [PATCH 417/651] Refactor UserRankPanel layout --- osu.Game/Users/UserRankPanel.cs | 116 +++++++++++++------------------- 1 file changed, 47 insertions(+), 69 deletions(-) diff --git a/osu.Game/Users/UserRankPanel.cs b/osu.Game/Users/UserRankPanel.cs index a38962dfc7..84ff3114fc 100644 --- a/osu.Game/Users/UserRankPanel.cs +++ b/osu.Game/Users/UserRankPanel.cs @@ -81,117 +81,95 @@ namespace osu.Game.Users }, new GridContainer { - AutoSizeAxes = Axes.Y, - RelativeSizeAxes = Axes.X, + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding(padding), ColumnDimensions = new[] { - new Dimension(GridSizeMode.Absolute, padding), new Dimension(GridSizeMode.AutoSize), new Dimension(), - new Dimension(GridSizeMode.Absolute, padding), }, RowDimensions = new[] { - new Dimension(GridSizeMode.Absolute, padding), - new Dimension(GridSizeMode.AutoSize), + new Dimension() }, Content = new[] { - new[] + new Drawable[] { - // padding - Empty(), - Empty(), - Empty(), - Empty() - }, - new[] - { - Empty(), // padding CreateAvatar().With(avatar => { avatar.Size = new Vector2(60); avatar.Masking = true; avatar.CornerRadius = 6; }), - new Container + new GridContainer { RelativeSizeAxes = Axes.Both, Padding = new MarginPadding { Left = padding }, - Child = new GridContainer + ColumnDimensions = new[] { - RelativeSizeAxes = Axes.Both, - ColumnDimensions = new[] + new Dimension() + }, + RowDimensions = new[] + { + new Dimension(GridSizeMode.AutoSize), + new Dimension() + }, + Content = new[] + { + new Drawable[] { - new Dimension() - }, - RowDimensions = new[] - { - new Dimension(GridSizeMode.AutoSize), - new Dimension() - }, - Content = new[] - { - new Drawable[] + details = new FillFlowContainer { - details = new FillFlowContainer + AutoSizeAxes = Axes.Both, + Direction = FillDirection.Horizontal, + Spacing = new Vector2(6), + Children = new Drawable[] { - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Horizontal, - Spacing = new Vector2(6), - Children = new Drawable[] - { - CreateFlag(), - // supporter icon is being added later - } + CreateFlag(), + // supporter icon is being added later } - }, - new Drawable[] - { - CreateUsername().With(username => - { - username.Anchor = Anchor.CentreLeft; - username.Origin = Anchor.CentreLeft; - }) } + }, + new Drawable[] + { + CreateUsername().With(username => + { + username.Anchor = Anchor.CentreLeft; + username.Origin = Anchor.CentreLeft; + }) } } - }, - Empty() // padding + } } } } } }, - new Container + new GridContainer { Name = "Bottom content", Margin = new MarginPadding { Top = main_content_height }, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Padding = new MarginPadding { Left = 80, Vertical = padding }, - Child = new GridContainer + ColumnDimensions = new[] { - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - ColumnDimensions = new[] + new Dimension(), + new Dimension() + }, + RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, + Content = new[] + { + new Drawable[] { - new Dimension(), - new Dimension() - }, - RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, - Content = new[] - { - new Drawable[] + globalRankDisplay = new ProfileValueDisplay(true) { - globalRankDisplay = new ProfileValueDisplay(true) - { - Title = UsersStrings.ShowRankGlobalSimple, - }, - countryRankDisplay = new ProfileValueDisplay(true) - { - Title = UsersStrings.ShowRankCountrySimple, - } + Title = UsersStrings.ShowRankGlobalSimple, + }, + countryRankDisplay = new ProfileValueDisplay(true) + { + Title = UsersStrings.ShowRankCountrySimple, } } } From b0095ee54832dc8e00ab4b7491bf482bdfd7225b Mon Sep 17 00:00:00 2001 From: Susko3 Date: Thu, 1 Feb 2024 18:38:18 +0100 Subject: [PATCH 418/651] Apply NRT --- osu.Game/Updater/SimpleUpdateManager.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index bc1b0919b8..77de68d63e 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using System.Linq; using System.Runtime.InteropServices; @@ -22,10 +20,10 @@ namespace osu.Game.Updater /// public partial class SimpleUpdateManager : UpdateManager { - private string version; + private string version = null!; [Resolved] - private GameHost host { get; set; } + private GameHost host { get; set; } = null!; [BackgroundDependencyLoader] private void load(OsuGameBase game) @@ -76,7 +74,7 @@ namespace osu.Game.Updater private string getBestUrl(GitHubRelease release) { - GitHubAsset bestAsset = null; + GitHubAsset? bestAsset = null; switch (RuntimeInfo.OS) { From b9d750cfee9c18a6226c74b0ca5d452279234f5f Mon Sep 17 00:00:00 2001 From: Susko3 Date: Thu, 1 Feb 2024 18:55:34 +0100 Subject: [PATCH 419/651] Convert to try-get and don't fall back to release URL --- osu.Game/Updater/SimpleUpdateManager.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 77de68d63e..a7671551ef 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -46,7 +47,7 @@ namespace osu.Game.Updater version = version.Split('-').First(); string latestTagName = latest.TagName.Split('-').First(); - if (latestTagName != version) + if (latestTagName != version && tryGetBestUrl(latest, out string? url)) { Notifications.Post(new SimpleNotification { @@ -55,7 +56,7 @@ namespace osu.Game.Updater Icon = FontAwesome.Solid.Download, Activated = () => { - host.OpenUrlExternally(getBestUrl(latest)); + host.OpenUrlExternally(url); return true; } }); @@ -72,8 +73,9 @@ namespace osu.Game.Updater return false; } - private string getBestUrl(GitHubRelease release) + private bool tryGetBestUrl(GitHubRelease release, [NotNullWhen(true)] out string? url) { + url = null; GitHubAsset? bestAsset = null; switch (RuntimeInfo.OS) @@ -94,15 +96,18 @@ namespace osu.Game.Updater case RuntimeInfo.Platform.iOS: // iOS releases are available via testflight. this link seems to work well enough for now. // see https://stackoverflow.com/a/32960501 - return "itms-beta://beta.itunes.apple.com/v1/app/1447765923"; + url = "itms-beta://beta.itunes.apple.com/v1/app/1447765923"; + break; case RuntimeInfo.Platform.Android: - // on our testing device this causes the download to magically disappear. + // on our testing device using the .apk URL causes the download to magically disappear. //bestAsset = release.Assets?.Find(f => f.Name.EndsWith(".apk")); + url = release.HtmlUrl; break; } - return bestAsset?.BrowserDownloadUrl ?? release.HtmlUrl; + url ??= bestAsset?.BrowserDownloadUrl; + return url != null; } } } From f92751a7d29baf4bdc81d60725e00b8b7bb7db02 Mon Sep 17 00:00:00 2001 From: Susko3 Date: Thu, 1 Feb 2024 18:56:38 +0100 Subject: [PATCH 420/651] Don't suggest an update on mobile if it isn't available --- osu.Game/Updater/SimpleUpdateManager.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index a7671551ef..0f9d5b929f 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -94,15 +94,18 @@ namespace osu.Game.Updater break; case RuntimeInfo.Platform.iOS: - // iOS releases are available via testflight. this link seems to work well enough for now. - // see https://stackoverflow.com/a/32960501 - url = "itms-beta://beta.itunes.apple.com/v1/app/1447765923"; + if (release.Assets?.Exists(f => f.Name.EndsWith(".ipa", StringComparison.Ordinal)) == true) + // iOS releases are available via testflight. this link seems to work well enough for now. + // see https://stackoverflow.com/a/32960501 + url = "itms-beta://beta.itunes.apple.com/v1/app/1447765923"; + break; case RuntimeInfo.Platform.Android: - // on our testing device using the .apk URL causes the download to magically disappear. - //bestAsset = release.Assets?.Find(f => f.Name.EndsWith(".apk")); - url = release.HtmlUrl; + if (release.Assets?.Exists(f => f.Name.EndsWith(".apk", StringComparison.Ordinal)) == true) + // on our testing device using the .apk URL causes the download to magically disappear. + url = release.HtmlUrl; + break; } From 966093f7cea7097e9095d5595cc8401e317b3fde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 31 Jan 2024 15:50:43 +0100 Subject: [PATCH 421/651] Transform score multiplier display to also show ranked state --- .../TestSceneModSelectOverlay.cs | 8 +- ... => TestSceneRankingInformationDisplay.cs} | 18 ++-- .../Localisation/ModSelectOverlayStrings.cs | 20 ++++ osu.Game/Overlays/Mods/ModSelectOverlay.cs | 19 ++-- ...isplay.cs => RankingInformationDisplay.cs} | 95 ++++++++++++------- 5 files changed, 105 insertions(+), 55 deletions(-) rename osu.Game.Tests/Visual/UserInterface/{TestSceneScoreMultiplierDisplay.cs => TestSceneRankingInformationDisplay.cs} (50%) rename osu.Game/Overlays/Mods/{ScoreMultiplierDisplay.cs => RankingInformationDisplay.cs} (60%) diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs index 046954db47..99a5897dff 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs @@ -119,7 +119,7 @@ namespace osu.Game.Tests.Visual.UserInterface AddAssert("mod multiplier correct", () => { double multiplier = SelectedMods.Value.Aggregate(1d, (m, mod) => m * mod.ScoreMultiplier); - return Precision.AlmostEquals(multiplier, modSelectOverlay.ChildrenOfType().Single().Current.Value); + return Precision.AlmostEquals(multiplier, modSelectOverlay.ChildrenOfType().Single().ModMultiplier.Value); }); assertCustomisationToggleState(disabled: false, active: false); AddAssert("setting items created", () => modSelectOverlay.ChildrenOfType().Any()); @@ -134,7 +134,7 @@ namespace osu.Game.Tests.Visual.UserInterface AddAssert("mod multiplier correct", () => { double multiplier = SelectedMods.Value.Aggregate(1d, (m, mod) => m * mod.ScoreMultiplier); - return Precision.AlmostEquals(multiplier, modSelectOverlay.ChildrenOfType().Single().Current.Value); + return Precision.AlmostEquals(multiplier, modSelectOverlay.ChildrenOfType().Single().ModMultiplier.Value); }); assertCustomisationToggleState(disabled: false, active: false); AddAssert("setting items created", () => modSelectOverlay.ChildrenOfType().Any()); @@ -846,7 +846,7 @@ namespace osu.Game.Tests.Visual.UserInterface InputManager.Click(MouseButton.Left); }); AddAssert("difficulty multiplier display shows correct value", - () => modSelectOverlay.ChildrenOfType().Single().Current.Value, () => Is.EqualTo(0.1).Within(Precision.DOUBLE_EPSILON)); + () => modSelectOverlay.ChildrenOfType().Single().ModMultiplier.Value, () => Is.EqualTo(0.1).Within(Precision.DOUBLE_EPSILON)); // this is highly unorthodox in a test, but because the `ModSettingChangeTracker` machinery heavily leans on events and object disposal and re-creation, // it is instrumental in the reproduction of the failure scenario that this test is supposed to cover. @@ -856,7 +856,7 @@ namespace osu.Game.Tests.Visual.UserInterface AddStep("reset half time speed to default", () => modSelectOverlay.ChildrenOfType().Single() .ChildrenOfType>().Single().TriggerClick()); AddUntilStep("difficulty multiplier display shows correct value", - () => modSelectOverlay.ChildrenOfType().Single().Current.Value, () => Is.EqualTo(0.3).Within(Precision.DOUBLE_EPSILON)); + () => modSelectOverlay.ChildrenOfType().Single().ModMultiplier.Value, () => Is.EqualTo(0.3).Within(Precision.DOUBLE_EPSILON)); } private void waitForColumnLoad() => AddUntilStep("all column content loaded", () => diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneScoreMultiplierDisplay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneRankingInformationDisplay.cs similarity index 50% rename from osu.Game.Tests/Visual/UserInterface/TestSceneScoreMultiplierDisplay.cs rename to osu.Game.Tests/Visual/UserInterface/TestSceneRankingInformationDisplay.cs index c2ddd814b7..42f243cc21 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneScoreMultiplierDisplay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneRankingInformationDisplay.cs @@ -11,7 +11,7 @@ using osu.Game.Overlays.Mods; namespace osu.Game.Tests.Visual.UserInterface { [TestFixture] - public partial class TestSceneScoreMultiplierDisplay : OsuTestScene + public partial class TestSceneRankingInformationDisplay : OsuTestScene { [Cached] private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Green); @@ -19,22 +19,24 @@ namespace osu.Game.Tests.Visual.UserInterface [Test] public void TestBasic() { - ScoreMultiplierDisplay multiplierDisplay = null!; + RankingInformationDisplay onlinePropertiesDisplay = null!; - AddStep("create content", () => Child = multiplierDisplay = new ScoreMultiplierDisplay + AddStep("create content", () => Child = onlinePropertiesDisplay = new RankingInformationDisplay { Anchor = Anchor.Centre, Origin = Anchor.Centre }); - AddStep("set multiplier below 1", () => multiplierDisplay.Current.Value = 0.5); - AddStep("set multiplier to 1", () => multiplierDisplay.Current.Value = 1); - AddStep("set multiplier above 1", () => multiplierDisplay.Current.Value = 1.5); + AddToggleStep("toggle ranked", ranked => onlinePropertiesDisplay.Ranked.Value = ranked); + + AddStep("set multiplier below 1", () => onlinePropertiesDisplay.ModMultiplier.Value = 0.5); + AddStep("set multiplier to 1", () => onlinePropertiesDisplay.ModMultiplier.Value = 1); + AddStep("set multiplier above 1", () => onlinePropertiesDisplay.ModMultiplier.Value = 1.5); AddSliderStep("set multiplier", 0, 2, 1d, multiplier => { - if (multiplierDisplay.IsNotNull()) - multiplierDisplay.Current.Value = multiplier; + if (onlinePropertiesDisplay.IsNotNull()) + onlinePropertiesDisplay.ModMultiplier.Value = multiplier; }); } } diff --git a/osu.Game/Localisation/ModSelectOverlayStrings.cs b/osu.Game/Localisation/ModSelectOverlayStrings.cs index 86ebebd293..9513eacf02 100644 --- a/osu.Game/Localisation/ModSelectOverlayStrings.cs +++ b/osu.Game/Localisation/ModSelectOverlayStrings.cs @@ -49,6 +49,26 @@ namespace osu.Game.Localisation /// public static LocalisableString ScoreMultiplier => new TranslatableString(getKey(@"score_multiplier"), @"Score Multiplier"); + /// + /// "Ranked" + /// + public static LocalisableString Ranked => new TranslatableString(getKey(@"ranked"), @"Ranked"); + + /// + /// "Performance points can be granted for the active mods." + /// + public static LocalisableString RankedExplanation => new TranslatableString(getKey(@"ranked_explanation"), @"Performance points can be granted for the active mods."); + + /// + /// "Unranked" + /// + public static LocalisableString Unranked => new TranslatableString(getKey(@"unranked"), @"Unranked"); + + /// + /// "Performance points will not be granted due to active mods." + /// + public static LocalisableString UnrankedExplanation => new TranslatableString(getKey(@"ranked_explanation"), @"Performance points will not be granted due to active mods."); + private static string getKey(string key) => $@"{prefix}:{key}"; } } diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index 7271c53e7a..ddf96c1cb3 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -125,7 +125,7 @@ namespace osu.Game.Overlays.Mods private DeselectAllModsButton deselectAllModsButton = null!; private Container aboveColumnsContent = null!; - private ScoreMultiplierDisplay? multiplierDisplay; + private RankingInformationDisplay? rankingInformationDisplay; private BeatmapAttributesDisplay? beatmapAttributesDisplay; protected ShearedButton BackButton { get; private set; } = null!; @@ -185,7 +185,7 @@ namespace osu.Game.Overlays.Mods aboveColumnsContent = new Container { RelativeSizeAxes = Axes.X, - Height = ScoreMultiplierDisplay.HEIGHT, + Height = RankingInformationDisplay.HEIGHT, Padding = new MarginPadding { Horizontal = 100 }, Child = SearchTextBox = new ShearedSearchTextBox { @@ -200,7 +200,7 @@ namespace osu.Game.Overlays.Mods { Padding = new MarginPadding { - Top = ScoreMultiplierDisplay.HEIGHT + PADDING, + Top = RankingInformationDisplay.HEIGHT + PADDING, Bottom = PADDING }, RelativeSizeAxes = Axes.Both, @@ -269,7 +269,7 @@ namespace osu.Game.Overlays.Mods }, Children = new Drawable[] { - multiplierDisplay = new ScoreMultiplierDisplay + rankingInformationDisplay = new RankingInformationDisplay { Anchor = Anchor.BottomRight, Origin = Anchor.BottomRight @@ -315,7 +315,7 @@ namespace osu.Game.Overlays.Mods SelectedMods.BindValueChanged(_ => { - updateMultiplier(); + updateRankingInformation(); updateFromExternalSelection(); updateCustomisation(); @@ -328,7 +328,7 @@ namespace osu.Game.Overlays.Mods // // See https://github.com/ppy/osu/pull/23284#issuecomment-1529056988 modSettingChangeTracker = new ModSettingChangeTracker(SelectedMods.Value); - modSettingChangeTracker.SettingChanged += _ => updateMultiplier(); + modSettingChangeTracker.SettingChanged += _ => updateRankingInformation(); } }, true); @@ -450,9 +450,9 @@ namespace osu.Game.Overlays.Mods modState.ValidForSelection.Value = modState.Mod.Type != ModType.System && modState.Mod.HasImplementation && IsValidMod.Invoke(modState.Mod); } - private void updateMultiplier() + private void updateRankingInformation() { - if (multiplierDisplay == null) + if (rankingInformationDisplay == null) return; double multiplier = 1.0; @@ -460,7 +460,8 @@ namespace osu.Game.Overlays.Mods foreach (var mod in SelectedMods.Value) multiplier *= mod.ScoreMultiplier; - multiplierDisplay.Current.Value = multiplier; + rankingInformationDisplay.ModMultiplier.Value = multiplier; + rankingInformationDisplay.Ranked.Value = SelectedMods.Value.All(m => m.Ranked); } private void updateCustomisation() diff --git a/osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs b/osu.Game/Overlays/Mods/RankingInformationDisplay.cs similarity index 60% rename from osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs rename to osu.Game/Overlays/Mods/RankingInformationDisplay.cs index a86eba81e4..494f8a377f 100644 --- a/osu.Game/Overlays/Mods/ScoreMultiplierDisplay.cs +++ b/osu.Game/Overlays/Mods/RankingInformationDisplay.cs @@ -6,8 +6,8 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Shapes; -using osu.Framework.Graphics.UserInterface; using osu.Framework.Localisation; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; @@ -22,15 +22,13 @@ namespace osu.Game.Overlays.Mods /// /// On the mod select overlay, this provides a local updating view of the aggregate score multiplier coming from mods. /// - public partial class ScoreMultiplierDisplay : ModFooterInformationDisplay, IHasCurrentValue + public partial class RankingInformationDisplay : ModFooterInformationDisplay { public const float HEIGHT = 42; - public Bindable Current - { - get => current.Current; - set => current.Current = value; - } + public Bindable ModMultiplier = new BindableDouble(1); + + public Bindable Ranked { get; } = new BindableBool(true); private readonly BindableWithCurrent current = new BindableWithCurrent(); @@ -39,16 +37,11 @@ namespace osu.Game.Overlays.Mods private RollingCounter counter = null!; private Box flashLayer = null!; + private TextWithTooltip rankedText = null!; [Resolved] private OsuColour colours { get; set; } = null!; - public ScoreMultiplierDisplay() - { - Current.Default = 1d; - Current.Value = 1d; - } - [BackgroundDependencyLoader] private void load() { @@ -75,13 +68,20 @@ namespace osu.Game.Overlays.Mods LeftContent.AddRange(new Drawable[] { - new OsuSpriteText + new Container { + Width = 50, + RelativeSizeAxes = Axes.Y, + Margin = new MarginPadding(10), Anchor = Anchor.Centre, Origin = Anchor.Centre, - Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0), - Text = ModSelectOverlayStrings.ScoreMultiplier, - Font = OsuFont.Default.With(size: 17, weight: FontWeight.SemiBold) + Child = rankedText = new TextWithTooltip + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0), + Font = OsuFont.Default.With(size: 17, weight: FontWeight.SemiBold) + } } }); @@ -97,7 +97,7 @@ namespace osu.Game.Overlays.Mods Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0), Anchor = Anchor.Centre, Origin = Anchor.Centre, - Current = { BindTarget = Current } + Current = { BindTarget = ModMultiplier } } }); } @@ -106,30 +106,22 @@ namespace osu.Game.Overlays.Mods { base.LoadComplete(); - Current.BindValueChanged(e => + ModMultiplier.BindValueChanged(e => { - if (e.NewValue > Current.Default) + if (e.NewValue > ModMultiplier.Default) { - MainBackground - .FadeColour(colours.ForModType(ModType.DifficultyIncrease), transition_duration, Easing.OutQuint); - counter.FadeColour(ColourProvider.Background5, transition_duration, Easing.OutQuint); + counter.FadeColour(colours.ForModType(ModType.DifficultyIncrease), transition_duration, Easing.OutQuint); } - else if (e.NewValue < Current.Default) + else if (e.NewValue < ModMultiplier.Default) { - MainBackground - .FadeColour(colours.ForModType(ModType.DifficultyReduction), transition_duration, Easing.OutQuint); - counter.FadeColour(ColourProvider.Background5, transition_duration, Easing.OutQuint); + counter.FadeColour(colours.ForModType(ModType.DifficultyReduction), transition_duration, Easing.OutQuint); } else { - MainBackground.FadeColour(ColourProvider.Background4, transition_duration, Easing.OutQuint); counter.FadeColour(Colour4.White, transition_duration, Easing.OutQuint); } - flashLayer - .FadeOutFromOne() - .FadeTo(0.15f, 60, Easing.OutQuint) - .Then().FadeOut(500, Easing.OutQuint); + flash(); const float move_amount = 4; if (e.NewValue > e.OldValue) @@ -140,10 +132,43 @@ namespace osu.Game.Overlays.Mods // required to prevent the counter initially rolling up from 0 to 1 // due to `Current.Value` having a nonstandard default value of 1. - counter.SetCountWithoutRolling(Current.Value); + counter.SetCountWithoutRolling(ModMultiplier.Value); + + Ranked.BindValueChanged(e => + { + flash(); + + if (e.NewValue) + { + rankedText.Text = ModSelectOverlayStrings.Ranked; + rankedText.TooltipText = ModSelectOverlayStrings.RankedExplanation; + rankedText.FadeColour(Colour4.White, transition_duration, Easing.OutQuint); + FrontBackground.FadeColour(ColourProvider.Background3, transition_duration, Easing.OutQuint); + } + else + { + rankedText.Text = ModSelectOverlayStrings.Unranked; + rankedText.TooltipText = ModSelectOverlayStrings.UnrankedExplanation; + rankedText.FadeColour(ColourProvider.Background5, transition_duration, Easing.OutQuint); + FrontBackground.FadeColour(colours.Orange1, transition_duration, Easing.OutQuint); + } + }, true); } - private partial class EffectCounter : RollingCounter + private void flash() + { + flashLayer + .FadeOutFromOne() + .FadeTo(0.15f, 60, Easing.OutQuint) + .Then().FadeOut(500, Easing.OutQuint); + } + + private partial class TextWithTooltip : OsuSpriteText, IHasTooltip + { + public LocalisableString TooltipText { get; set; } + } + + private partial class EffectCounter : RollingCounter, IHasTooltip { protected override double RollingDuration => 250; @@ -155,6 +180,8 @@ namespace osu.Game.Overlays.Mods Origin = Anchor.Centre, Font = OsuFont.Default.With(size: 17, weight: FontWeight.SemiBold) }; + + public LocalisableString TooltipText => ModSelectOverlayStrings.ScoreMultiplier; } } } From f87ab197318b08e91757b82ea5898de19487b495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 1 Feb 2024 21:22:36 +0100 Subject: [PATCH 422/651] Apply NRT to `FooterButtonMods` --- osu.Game/Screens/Select/FooterButtonMods.cs | 47 ++++++++++----------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/osu.Game/Screens/Select/FooterButtonMods.cs b/osu.Game/Screens/Select/FooterButtonMods.cs index 69782c25bb..57784dd6ca 100644 --- a/osu.Game/Screens/Select/FooterButtonMods.cs +++ b/osu.Game/Screens/Select/FooterButtonMods.cs @@ -1,15 +1,12 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Screens.Play.HUD; using osu.Game.Rulesets.Mods; using System.Collections.Generic; using System.Linq; -using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics.UserInterface; @@ -31,28 +28,14 @@ namespace osu.Game.Screens.Select set => modDisplay.Current = value; } - protected readonly OsuSpriteText MultiplierText; - private readonly ModDisplay modDisplay; + protected OsuSpriteText MultiplierText { get; private set; } = null!; + private ModDisplay modDisplay = null!; + + private ModSettingChangeTracker? modSettingChangeTracker; + private Color4 lowMultiplierColour; private Color4 highMultiplierColour; - public FooterButtonMods() - { - ButtonContentContainer.Add(modDisplay = new ModDisplay - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Scale = new Vector2(0.8f), - ExpansionMode = ExpansionMode.AlwaysContracted, - }); - ButtonContentContainer.Add(MultiplierText = new OsuSpriteText - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Font = OsuFont.GetFont(weight: FontWeight.Bold), - }); - } - [BackgroundDependencyLoader] private void load(OsuColour colours) { @@ -62,10 +45,24 @@ namespace osu.Game.Screens.Select highMultiplierColour = colours.Green; Text = @"mods"; Hotkey = GlobalAction.ToggleModSelection; - } - [CanBeNull] - private ModSettingChangeTracker modSettingChangeTracker; + ButtonContentContainer.AddRange(new Drawable[] + { + modDisplay = new ModDisplay + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Scale = new Vector2(0.8f), + ExpansionMode = ExpansionMode.AlwaysContracted, + }, + MultiplierText = new OsuSpriteText + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Font = OsuFont.GetFont(weight: FontWeight.Bold), + } + }); + } protected override void LoadComplete() { From 865f4d76fff5fe0cff3d7c2d6cf2aae95c99ffac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 1 Feb 2024 21:51:41 +0100 Subject: [PATCH 423/651] Add unranked indicator to song select footer too --- .../TestSceneFooterButtonMods.cs | 11 ++++ osu.Game/Screens/Select/FooterButtonMods.cs | 58 ++++++++++++++++--- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneFooterButtonMods.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneFooterButtonMods.cs index a95bb2c9e3..b79ce6c75f 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneFooterButtonMods.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneFooterButtonMods.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using NUnit.Framework; +using osu.Framework.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu.Mods; @@ -67,6 +68,15 @@ namespace osu.Game.Tests.Visual.UserInterface AddAssert(@"Check empty multiplier", () => assertModsMultiplier(Array.Empty())); } + [Test] + public void TestUnrankedBadge() + { + AddStep(@"Add unranked mod", () => changeMods(new[] { new OsuModDeflate() })); + AddAssert("Unranked badge shown", () => footerButtonMods.UnrankedBadge.Alpha == 1); + AddStep(@"Clear selected mod", () => changeMods(Array.Empty())); + AddAssert("Unranked badge not shown", () => footerButtonMods.UnrankedBadge.Alpha == 0); + } + private void changeMods(IReadOnlyList mods) { footerButtonMods.Current.Value = mods; @@ -83,6 +93,7 @@ namespace osu.Game.Tests.Visual.UserInterface private partial class TestFooterButtonMods : FooterButtonMods { public new OsuSpriteText MultiplierText => base.MultiplierText; + public new Drawable UnrankedBadge => base.UnrankedBadge; } } } diff --git a/osu.Game/Screens/Select/FooterButtonMods.cs b/osu.Game/Screens/Select/FooterButtonMods.cs index 57784dd6ca..5685910c0a 100644 --- a/osu.Game/Screens/Select/FooterButtonMods.cs +++ b/osu.Game/Screens/Select/FooterButtonMods.cs @@ -9,6 +9,9 @@ using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Extensions.LocalisationExtensions; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; using osu.Game.Configuration; using osu.Game.Graphics; @@ -16,6 +19,7 @@ using osu.Game.Graphics.Sprites; using osuTK; using osuTK.Graphics; using osu.Game.Input.Bindings; +using osu.Game.Localisation; using osu.Game.Utils; namespace osu.Game.Screens.Select @@ -29,13 +33,27 @@ namespace osu.Game.Screens.Select } protected OsuSpriteText MultiplierText { get; private set; } = null!; - private ModDisplay modDisplay = null!; + protected Container UnrankedBadge { get; private set; } = null!; + + private readonly ModDisplay modDisplay; private ModSettingChangeTracker? modSettingChangeTracker; private Color4 lowMultiplierColour; private Color4 highMultiplierColour; + public FooterButtonMods() + { + // must be created in ctor for correct operation of `Current`. + modDisplay = new ModDisplay + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Scale = new Vector2(0.8f), + ExpansionMode = ExpansionMode.AlwaysContracted, + }; + } + [BackgroundDependencyLoader] private void load(OsuColour colours) { @@ -48,19 +66,38 @@ namespace osu.Game.Screens.Select ButtonContentContainer.AddRange(new Drawable[] { - modDisplay = new ModDisplay - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Scale = new Vector2(0.8f), - ExpansionMode = ExpansionMode.AlwaysContracted, - }, + modDisplay, MultiplierText = new OsuSpriteText { Anchor = Anchor.Centre, Origin = Anchor.Centre, Font = OsuFont.GetFont(weight: FontWeight.Bold), - } + }, + UnrankedBadge = new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + AutoSizeAxes = Axes.Both, + Children = new Drawable[] + { + new Circle + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Colour = colours.Yellow, + RelativeSizeAxes = Axes.Both, + }, + new OsuSpriteText + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Colour = colours.Gray2, + Padding = new MarginPadding(5), + UseFullGlyphHeight = false, + Text = ModSelectOverlayStrings.Unranked.ToLower() + } + } + }, }); } @@ -98,6 +135,9 @@ namespace osu.Game.Screens.Select modDisplay.FadeIn(); else modDisplay.FadeOut(); + + bool anyUnrankedMods = Current.Value?.Any(m => !m.Ranked) == true; + UnrankedBadge.FadeTo(anyUnrankedMods ? 1 : 0); }); } } From c114fd8f8963f28b06df951145486689ad0084db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 1 Feb 2024 22:28:49 +0100 Subject: [PATCH 424/651] Allow pp for Sudden Death and Perfect regardless of "restart on fail" setting Closes https://github.com/ppy/osu/issues/26844. --- osu.Game/Rulesets/Mods/ModPerfect.cs | 2 +- osu.Game/Rulesets/Mods/ModSuddenDeath.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Rulesets/Mods/ModPerfect.cs b/osu.Game/Rulesets/Mods/ModPerfect.cs index f8f498ceb5..5bedf443da 100644 --- a/osu.Game/Rulesets/Mods/ModPerfect.cs +++ b/osu.Game/Rulesets/Mods/ModPerfect.cs @@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.DifficultyIncrease; public override double ScoreMultiplier => 1; public override LocalisableString Description => "SS or quit."; - public override bool Ranked => UsesDefaultConfiguration; + public override bool Ranked => true; public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(ModSuddenDeath), typeof(ModAccuracyChallenge) }).ToArray(); diff --git a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs index 62579a168c..d07ff6ce87 100644 --- a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs +++ b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs @@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.DifficultyIncrease; public override LocalisableString Description => "Miss and fail."; public override double ScoreMultiplier => 1; - public override bool Ranked => UsesDefaultConfiguration; + public override bool Ranked => true; public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModPerfect)).ToArray(); From 96f66aaa2e4eaa44c167e32af51fde84ad1e6a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 1 Feb 2024 22:30:26 +0100 Subject: [PATCH 425/651] Allow pp for Accuracy Challenge Addresses https://github.com/ppy/osu/discussions/26919. --- osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs b/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs index 0072c21053..9570cddb0a 100644 --- a/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs +++ b/osu.Game/Rulesets/Mods/ModAccuracyChallenge.cs @@ -31,6 +31,8 @@ namespace osu.Game.Rulesets.Mods public override bool RequiresConfiguration => false; + public override bool Ranked => true; + public override string SettingDescription => base.SettingDescription.Replace(MinimumAccuracy.ToString(), MinimumAccuracy.Value.ToString("##%", NumberFormatInfo.InvariantInfo)); [SettingSource("Minimum accuracy", "Trigger a failure if your accuracy goes below this value.", SettingControlType = typeof(SettingsPercentageSlider))] From ea76f7a5d88a3060369db0529330c3c28ea35752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 1 Feb 2024 22:33:49 +0100 Subject: [PATCH 426/651] Allow pp for Double/Half Time's "adjust pitch" setting --- osu.Game/Rulesets/Mods/ModDoubleTime.cs | 2 +- osu.Game/Rulesets/Mods/ModHalfTime.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Rulesets/Mods/ModDoubleTime.cs b/osu.Game/Rulesets/Mods/ModDoubleTime.cs index 8e430da368..fd5120a767 100644 --- a/osu.Game/Rulesets/Mods/ModDoubleTime.cs +++ b/osu.Game/Rulesets/Mods/ModDoubleTime.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Mods public override IconUsage? Icon => OsuIcon.ModDoubleTime; public override ModType Type => ModType.DifficultyIncrease; public override LocalisableString Description => "Zoooooooooom..."; - public override bool Ranked => UsesDefaultConfiguration; + public override bool Ranked => SpeedChange.IsDefault; [SettingSource("Speed increase", "The actual increase to apply", SettingControlType = typeof(MultiplierSettingsSlider))] public override BindableNumber SpeedChange { get; } = new BindableDouble(1.5) diff --git a/osu.Game/Rulesets/Mods/ModHalfTime.cs b/osu.Game/Rulesets/Mods/ModHalfTime.cs index 59e40ee9cc..efdf0d6358 100644 --- a/osu.Game/Rulesets/Mods/ModHalfTime.cs +++ b/osu.Game/Rulesets/Mods/ModHalfTime.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Mods public override IconUsage? Icon => OsuIcon.ModHalftime; public override ModType Type => ModType.DifficultyReduction; public override LocalisableString Description => "Less zoom..."; - public override bool Ranked => UsesDefaultConfiguration; + public override bool Ranked => SpeedChange.IsDefault; [SettingSource("Speed decrease", "The actual decrease to apply", SettingControlType = typeof(MultiplierSettingsSlider))] public override BindableNumber SpeedChange { get; } = new BindableDouble(0.75) From 4dbcb41dd1e8d46e2bdee4acc9c6f858f979dd79 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 2 Feb 2024 00:44:51 +0300 Subject: [PATCH 427/651] Remove unused parameter --- osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index 5de5ceb2a8..e5ba9500ee 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -137,7 +137,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy } [BackgroundDependencyLoader] - private void load(AudioManager audio) + private void load() { InternalChildren = new Drawable[] { From e00e583bb4fbe58c8c26c847d5c2435d86f6a75d Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 2 Feb 2024 03:56:38 +0300 Subject: [PATCH 428/651] Fix DrawableManiaRuleset performing skin lookup every frame --- .../UI/DrawableManiaRuleset.cs | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs b/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs index bea536e4af..070021ef74 100644 --- a/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs +++ b/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs @@ -9,8 +9,10 @@ using osu.Framework.Allocation; using osu.Framework.Audio.Track; using osu.Framework.Bindables; using osu.Framework.Extensions.IEnumerableExtensions; +using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Input; +using osu.Framework.Threading; using osu.Game.Beatmaps; using osu.Game.Beatmaps.ControlPoints; using osu.Game.Input.Handlers; @@ -59,8 +61,7 @@ namespace osu.Game.Rulesets.Mania.UI // Stores the current speed adjustment active in gameplay. private readonly Track speedAdjustmentTrack = new TrackVirtual(0); - [Resolved] - private ISkinSource skin { get; set; } + private ISkinSource currentSkin; public DrawableManiaRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList mods = null) : base(ruleset, beatmap, mods) @@ -72,8 +73,12 @@ namespace osu.Game.Rulesets.Mania.UI } [BackgroundDependencyLoader] - private void load() + private void load(ISkinSource source) { + currentSkin = source; + currentSkin.SourceChanged += onSkinChange; + skinChanged(); + foreach (var mod in Mods.OfType()) mod.ApplyToTrack(speedAdjustmentTrack); @@ -109,12 +114,28 @@ namespace osu.Game.Rulesets.Mania.UI updateTimeRange(); } + private ScheduledDelegate pendingSkinChange; + private float hitPosition; + + private void onSkinChange() + { + // schedule required to avoid calls after disposed. + // note that this has the side-effect of components only performing a skin change when they are alive. + pendingSkinChange?.Cancel(); + pendingSkinChange = Scheduler.Add(skinChanged); + } + + private void skinChanged() + { + hitPosition = currentSkin.GetConfig( + new ManiaSkinConfigurationLookup(LegacyManiaSkinConfigurationLookups.HitPosition))?.Value + ?? Stage.HIT_TARGET_POSITION; + + pendingSkinChange = null; + } + private void updateTimeRange() { - float hitPosition = skin.GetConfig( - new ManiaSkinConfigurationLookup(LegacyManiaSkinConfigurationLookups.HitPosition))?.Value - ?? Stage.HIT_TARGET_POSITION; - const float length_to_default_hit_position = 768 - LegacyManiaSkinConfiguration.DEFAULT_HIT_POSITION; float lengthToHitPosition = 768 - hitPosition; @@ -144,5 +165,13 @@ namespace osu.Game.Rulesets.Mania.UI protected override ReplayInputHandler CreateReplayInputHandler(Replay replay) => new ManiaFramedReplayInputHandler(replay); protected override ReplayRecorder CreateReplayRecorder(Score score) => new ManiaReplayRecorder(score); + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + + if (currentSkin.IsNotNull()) + currentSkin.SourceChanged -= onSkinChange; + } } } From 7884e5808ad0407449d4895b6b06594755cc7b65 Mon Sep 17 00:00:00 2001 From: Loreos7 Date: Fri, 2 Feb 2024 04:47:13 +0300 Subject: [PATCH 429/651] localise remaining strings --- ...RunOverlayImportFromStableScreenStrings.cs | 30 +++++++++++++++++++ .../FirstRunSetup/ScreenImportFromStable.cs | 21 ++++++++----- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs b/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs index f0620245c3..bbd83d2395 100644 --- a/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs +++ b/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs @@ -51,6 +51,36 @@ namespace osu.Game.Localisation /// public static LocalisableString Items(int arg0) => new TranslatableString(getKey(@"items"), @"{0} item(s)", arg0); + /// + /// "Data migration will use "hard links". No extra disk space will be used, and you can delete either data folder at any point without affecting the other installation." + /// + public static LocalisableString DataMigrationNoExtraSpace => new TranslatableString(getKey(@"data_migration_no_extra_space"), @"Data migration will use ""hard links"". No extra disk space will be used, and you can delete either data folder at any point without affecting the other installation."); + + /// + /// "Learn more about how "hard links" work" + /// + public static LocalisableString LearnAboutHardLinks => new TranslatableString(getKey(@"learn_about_hard_links"), @"Learn more about how ""hard links"" work"); + + /// + /// "Lightweight linking of files is not supported on your operating system yet, so a copy of all files will be made during import." + /// + public static LocalisableString LightweightLinkingNotSupported => new TranslatableString(getKey(@"lightweight_linking_not_supported"), @"Lightweight linking of files is not supported on your operating system yet, so a copy of all files will be made during import."); + + /// + /// "A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install {0}." + /// + public static LocalisableString SecondCopyWillBeMade(LocalisableString extra) => new TranslatableString(getKey(@"second_copy_will_be_made"), @"A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install {0}.", extra); + + /// + /// "(and the file system is NTFS)" + /// + public static LocalisableString ToAvoidEnsureNtfs => new TranslatableString(getKey(@"to_avoid_ensure_ntfs"), @"(and the file system is NTFS)"); + + /// + /// "(and the file system supports hard links)" + /// + public static LocalisableString ToAvoidEnsureHardLinksSupport => new TranslatableString(getKey(@"to_avoid_ensure_hard_links_support"), @"(and the file system supports hard links)"); + private static string getKey(string key) => $@"{prefix}:{key}"; } } diff --git a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs index 24ac5e72e8..0b2b750136 100644 --- a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs +++ b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs @@ -127,18 +127,16 @@ namespace osu.Game.Overlays.FirstRunSetup if (available) { - copyInformation.Text = - "Data migration will use \"hard links\". No extra disk space will be used, and you can delete either data folder at any point without affecting the other installation. "; - - copyInformation.AddLink("Learn more about how \"hard links\" work", LinkAction.OpenWiki, @"Client/Release_stream/Lazer/File_storage#via-hard-links"); + copyInformation.Text = FirstRunOverlayImportFromStableScreenStrings.DataMigrationNoExtraSpace; + copyInformation.AddLink(FirstRunOverlayImportFromStableScreenStrings.LearnAboutHardLinks, LinkAction.OpenWiki, @"Client/Release_stream/Lazer/File_storage#via-hard-links"); } else if (!RuntimeInfo.IsDesktop) - copyInformation.Text = "Lightweight linking of files is not supported on your operating system yet, so a copy of all files will be made during import."; + copyInformation.Text = FirstRunOverlayImportFromStableScreenStrings.LightweightLinkingNotSupported; else { copyInformation.Text = RuntimeInfo.OS == RuntimeInfo.Platform.Windows - ? "A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install (and the file system is NTFS). " - : "A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install (and the file system supports hard links). "; + ? FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMade(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureNtfs) + : FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMade(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureHardLinksSupport); copyInformation.AddLink(GeneralSettingsStrings.ChangeFolderLocation, () => { game?.PerformFromScreen(menu => menu.Push(new MigrationSelectScreen())); @@ -328,4 +326,13 @@ namespace osu.Game.Overlays.FirstRunSetup } } } + + public enum FileSystemAddition + { + [LocalisableDescription(typeof(FirstRunOverlayImportFromStableScreenStrings), nameof(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureNtfs))] + ToAvoidEnsureNtfs, + + [LocalisableDescription(typeof(FirstRunOverlayImportFromStableScreenStrings), nameof(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureHardLinksSupport))] + ToAvoidEnsureHardLinksSupport, + } } From 8dce158a13e05911273c5fb07f77555dc3d0b6ae Mon Sep 17 00:00:00 2001 From: Loreos7 Date: Fri, 2 Feb 2024 04:49:22 +0300 Subject: [PATCH 430/651] localise update-related strings --- osu.Game/Localisation/NotificationsStrings.cs | 22 +++++++++++++++++++ osu.Game/Updater/UpdateManager.cs | 9 ++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/osu.Game/Localisation/NotificationsStrings.cs b/osu.Game/Localisation/NotificationsStrings.cs index fb3dab032d..f4965e4ebe 100644 --- a/osu.Game/Localisation/NotificationsStrings.cs +++ b/osu.Game/Localisation/NotificationsStrings.cs @@ -113,6 +113,28 @@ Please try changing your audio device to a working setting."); /// public static LocalisableString MismatchingBeatmapForReplay => new TranslatableString(getKey(@"mismatching_beatmap_for_replay"), @"Your local copy of the beatmap for this replay appears to be different than expected. You may need to update or re-download it."); + /// + /// "You are now running osu! {version}. + /// Click to see what's new!" + /// + public static LocalisableString GameVersionAfterUpdate(string version) => new TranslatableString(getKey(@"game_version_after_update"), @"You are now running osu! {0}. +Click to see what's new!", version); + + /// + /// "Update ready to install. Click to restart!" + /// + public static LocalisableString UpdateReadyToInstall => new TranslatableString(getKey(@"update_ready_to_install"), @"Update ready to install. Click to restart!"); + + /// + /// "Downloading update..." + /// + public static LocalisableString DownloadingUpdate => new TranslatableString(getKey(@"downloading_update"), @"Downloading update..."); + + /// + /// "Installing update..." + /// + public static LocalisableString InstallingUpdate => new TranslatableString(getKey(@"installing_update"), @"Installing update..."); + private static string getKey(string key) => $@"{prefix}:{key}"; } } diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 190748137a..8f13e0f42a 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -8,6 +8,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Game.Configuration; using osu.Game.Graphics; +using osu.Game.Localisation; using osu.Game.Overlays; using osu.Game.Overlays.Notifications; using osuTK; @@ -92,7 +93,7 @@ namespace osu.Game.Updater public UpdateCompleteNotification(string version) { this.version = version; - Text = $"You are now running osu! {version}.\nClick to see what's new!"; + Text = NotificationsStrings.GameVersionAfterUpdate(version); } [BackgroundDependencyLoader] @@ -114,7 +115,7 @@ namespace osu.Game.Updater { public UpdateApplicationCompleteNotification() { - Text = @"Update ready to install. Click to restart!"; + Text = NotificationsStrings.UpdateReadyToInstall; } } @@ -166,13 +167,13 @@ namespace osu.Game.Updater { State = ProgressNotificationState.Active; Progress = 0; - Text = @"Downloading update..."; + Text = NotificationsStrings.DownloadingUpdate; } public void StartInstall() { Progress = 0; - Text = @"Installing update..."; + Text = NotificationsStrings.InstallingUpdate; } public void FailDownload() From 53c5483eba108acb4c8782764ae4840d414428dd Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 2 Feb 2024 04:53:48 +0300 Subject: [PATCH 431/651] Reduce allocation in Playfield --- osu.Game/Rulesets/UI/Playfield.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs index e9c35555c8..90a2f63faa 100644 --- a/osu.Game/Rulesets/UI/Playfield.cs +++ b/osu.Game/Rulesets/UI/Playfield.cs @@ -247,10 +247,14 @@ namespace osu.Game.Rulesets.UI nestedPlayfields.Add(otherPlayfield); } + private Mod[] mods; + protected override void LoadComplete() { base.LoadComplete(); + mods = Mods?.ToArray(); + // in the case a consumer forgets to add the HitObjectContainer, we will add it here. if (HitObjectContainer.Parent == null) AddInternal(HitObjectContainer); @@ -260,9 +264,9 @@ namespace osu.Game.Rulesets.UI { base.Update(); - if (!IsNested && Mods != null) + if (!IsNested && mods != null) { - foreach (var mod in Mods) + foreach (Mod mod in mods) { if (mod is IUpdatableByPlayfield updatable) updatable.Update(this); @@ -403,10 +407,13 @@ namespace osu.Game.Rulesets.UI // If this is the first time this DHO is being used, then apply the DHO mods. // This is done before Apply() so that the state is updated once when the hitobject is applied. - if (Mods != null) + if (mods != null) { - foreach (var m in Mods.OfType()) - m.ApplyToDrawableHitObject(dho); + foreach (Mod mod in mods) + { + if (mod is IApplicableToDrawableHitObject applicable) + applicable.ApplyToDrawableHitObject(dho); + } } } From 2ff46daf5ede3204da4263fa265ee417601b667a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 2 Feb 2024 06:34:47 +0100 Subject: [PATCH 432/651] Also change icon and tooltip text when pending 2FA --- osu.Game/Localisation/ToolbarStrings.cs | 5 +++++ osu.Game/Overlays/Toolbar/ToolbarUserButton.cs | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/osu.Game/Localisation/ToolbarStrings.cs b/osu.Game/Localisation/ToolbarStrings.cs index e71a3fff9b..5822f76e02 100644 --- a/osu.Game/Localisation/ToolbarStrings.cs +++ b/osu.Game/Localisation/ToolbarStrings.cs @@ -19,6 +19,11 @@ namespace osu.Game.Localisation /// public static LocalisableString Connecting => new TranslatableString(getKey(@"connecting"), @"Connecting..."); + /// + /// "Verification required" + /// + public static LocalisableString VerificationRequired => new TranslatableString(getKey(@"verification_required"), @"Verification required"); + /// /// "home" /// diff --git a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs index 1e812d7238..2620e850c8 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs @@ -99,7 +99,6 @@ namespace osu.Game.Overlays.Toolbar switch (state.NewValue) { - case APIState.RequiresSecondFactorAuth: case APIState.Connecting: TooltipText = ToolbarStrings.Connecting; spinner.Show(); @@ -108,6 +107,13 @@ namespace osu.Game.Overlays.Toolbar case APIState.Failing: TooltipText = ToolbarStrings.AttemptingToReconnect; spinner.Show(); + failingIcon.Icon = FontAwesome.Solid.ExclamationTriangle; + break; + + case APIState.RequiresSecondFactorAuth: + TooltipText = ToolbarStrings.VerificationRequired; + spinner.Show(); + failingIcon.Icon = FontAwesome.Solid.Key; break; case APIState.Offline: From dfd966e039e49a3582b519146440b866ae00705c Mon Sep 17 00:00:00 2001 From: Mike Will Date: Wed, 31 Jan 2024 18:47:47 -0500 Subject: [PATCH 433/651] Improve silence detection in `MutedNotification` Instead of checking the master and music volumes separately to see if they're <= 1%, check the aggregate of the two volumes to see if it's <= -60 dB. When muted notification is activated, restore the aggregate volume level to -30 dB. --- .../Visual/Gameplay/TestScenePlayerLoader.cs | 16 +++++++++---- osu.Game/Screens/Play/PlayerLoader.cs | 23 +++++++++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs index f97372e9b6..2798d77373 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs @@ -264,15 +264,23 @@ namespace osu.Game.Tests.Visual.Gameplay } [Test] - public void TestMutedNotificationMasterVolume() + public void TestMutedNotificationHighMasterVolume() { - addVolumeSteps("master volume", () => audioManager.Volume.Value = 0, () => audioManager.Volume.Value == 0.5); + addVolumeSteps("high master volume", () => + { + audioManager.Volume.Value = 0.1; + audioManager.VolumeTrack.Value = 0.01; + }, () => audioManager.Volume.Value == 0.1 && audioManager.VolumeTrack.Value == 0.32); } [Test] - public void TestMutedNotificationTrackVolume() + public void TestMutedNotificationLowMasterVolume() { - addVolumeSteps("music volume", () => audioManager.VolumeTrack.Value = 0, () => audioManager.VolumeTrack.Value == 0.5); + addVolumeSteps("low master volume", () => + { + audioManager.Volume.Value = 0.01; + audioManager.VolumeTrack.Value = 0.1; + }, () => audioManager.Volume.Value == 0.03 && audioManager.VolumeTrack.Value == 1); } [Test] diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 232de53ac3..6282041f2c 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -544,14 +544,14 @@ namespace osu.Game.Screens.Play private int restartCount; - private const double volume_requirement = 0.01; + private const double volume_requirement = 1e-3; // -60 dB private void showMuteWarningIfNeeded() { if (!muteWarningShownOnce.Value) { // Checks if the notification has not been shown yet and also if master volume is muted, track/music volume is muted or if the whole game is muted. - if (volumeOverlay?.IsMuted.Value == true || audioManager.Volume.Value <= volume_requirement || audioManager.VolumeTrack.Value <= volume_requirement) + if (volumeOverlay?.IsMuted.Value == true || audioManager.Volume.Value * audioManager.VolumeTrack.Value <= volume_requirement) { notificationOverlay?.Post(new MutedNotification()); muteWarningShownOnce.Value = true; @@ -581,11 +581,20 @@ namespace osu.Game.Screens.Play volumeOverlay.IsMuted.Value = false; // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. - // Note that we only restore halfway to ensure the user isn't suddenly overloaded by unexpectedly high volume. - if (audioManager.Volume.Value <= volume_requirement) - audioManager.Volume.Value = 0.5f; - if (audioManager.VolumeTrack.Value <= volume_requirement) - audioManager.VolumeTrack.Value = 0.5f; + // Note that we only restore to -30 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. + if (audioManager.Volume.Value * audioManager.VolumeTrack.Value <= volume_requirement) + { + // Prioritize increasing music over master volume as to avoid also increasing effects volume. + const double target = 0.031622776601684; // 10 ^ (-30 / 20) + double result = target / Math.Max(0.01, audioManager.Volume.Value); + if (result > 1) + { + audioManager.Volume.Value = target; + audioManager.VolumeTrack.Value = 1; + } + else + audioManager.VolumeTrack.Value = result; + } return true; }; From bb6387bea01ebac9e5c3e6c2ffa043892824319b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 2 Feb 2024 06:53:00 +0100 Subject: [PATCH 434/651] Enable NRT in `ScreenEntry` --- .../Overlays/AccountCreation/ScreenEntry.cs | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/osu.Game/Overlays/AccountCreation/ScreenEntry.cs b/osu.Game/Overlays/AccountCreation/ScreenEntry.cs index 9ad507d82a..64d0fa94ab 100644 --- a/osu.Game/Overlays/AccountCreation/ScreenEntry.cs +++ b/osu.Game/Overlays/AccountCreation/ScreenEntry.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using System.Linq; using System.Threading.Tasks; @@ -28,28 +26,28 @@ namespace osu.Game.Overlays.AccountCreation { public partial class ScreenEntry : AccountCreationScreen { - private ErrorTextFlowContainer usernameDescription; - private ErrorTextFlowContainer emailAddressDescription; - private ErrorTextFlowContainer passwordDescription; + private ErrorTextFlowContainer usernameDescription = null!; + private ErrorTextFlowContainer emailAddressDescription = null!; + private ErrorTextFlowContainer passwordDescription = null!; - private OsuTextBox usernameTextBox; - private OsuTextBox emailTextBox; - private OsuPasswordTextBox passwordTextBox; + private OsuTextBox usernameTextBox = null!; + private OsuTextBox emailTextBox = null!; + private OsuPasswordTextBox passwordTextBox = null!; [Resolved] - private IAPIProvider api { get; set; } + private IAPIProvider api { get; set; } = null!; - private ShakeContainer registerShake; - private ITextPart characterCheckText; + private ShakeContainer registerShake = null!; + private ITextPart characterCheckText = null!; - private OsuTextBox[] textboxes; - private LoadingLayer loadingLayer; + private OsuTextBox[] textboxes = null!; + private LoadingLayer loadingLayer = null!; [Resolved] - private GameHost host { get; set; } + private GameHost? host { get; set; } [Resolved] - private OsuGame game { get; set; } + private OsuGame game { get; set; } = null!; [BackgroundDependencyLoader] private void load() @@ -180,7 +178,7 @@ namespace osu.Game.Overlays.AccountCreation Task.Run(() => { bool success; - RegistrationRequest.RegistrationRequestErrors errors = null; + RegistrationRequest.RegistrationRequestErrors? errors = null; try { @@ -241,6 +239,6 @@ namespace osu.Game.Overlays.AccountCreation return false; } - private OsuTextBox nextUnfilledTextBox() => textboxes.FirstOrDefault(t => string.IsNullOrEmpty(t.Text)); + private OsuTextBox? nextUnfilledTextBox() => textboxes.FirstOrDefault(t => string.IsNullOrEmpty(t.Text)); } } From b58ac7950bd69d383cd26e6c3142b4ea568e9a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 2 Feb 2024 06:53:17 +0100 Subject: [PATCH 435/651] Make game dependency in `ScreenEntry` optional to unbreak tests --- osu.Game/Overlays/AccountCreation/ScreenEntry.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/AccountCreation/ScreenEntry.cs b/osu.Game/Overlays/AccountCreation/ScreenEntry.cs index 64d0fa94ab..ab462357c0 100644 --- a/osu.Game/Overlays/AccountCreation/ScreenEntry.cs +++ b/osu.Game/Overlays/AccountCreation/ScreenEntry.cs @@ -47,7 +47,7 @@ namespace osu.Game.Overlays.AccountCreation private GameHost? host { get; set; } [Resolved] - private OsuGame game { get; set; } = null!; + private OsuGame? game { get; set; } [BackgroundDependencyLoader] private void load() @@ -208,7 +208,7 @@ namespace osu.Game.Overlays.AccountCreation if (!string.IsNullOrEmpty(errors.Message)) passwordDescription.AddErrors(new[] { errors.Message }); - game.OpenUrlExternally($"{errors.Redirect}?username={usernameTextBox.Text}&email={emailTextBox.Text}", true); + game?.OpenUrlExternally($"{errors.Redirect}?username={usernameTextBox.Text}&email={emailTextBox.Text}", true); } } else From 93d34e411535f2a47442146f92f62a3cab150821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 2 Feb 2024 06:54:18 +0100 Subject: [PATCH 436/651] Enable NRT in `ScreenWarning` --- osu.Game/Overlays/AccountCreation/ScreenWarning.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/osu.Game/Overlays/AccountCreation/ScreenWarning.cs b/osu.Game/Overlays/AccountCreation/ScreenWarning.cs index 0fbf6ba59e..c24bd32bb4 100644 --- a/osu.Game/Overlays/AccountCreation/ScreenWarning.cs +++ b/osu.Game/Overlays/AccountCreation/ScreenWarning.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -23,14 +21,14 @@ namespace osu.Game.Overlays.AccountCreation { public partial class ScreenWarning : AccountCreationScreen { - private OsuTextFlowContainer multiAccountExplanationText; - private LinkFlowContainer furtherAssistance; + private OsuTextFlowContainer multiAccountExplanationText = null!; + private LinkFlowContainer furtherAssistance = null!; - [Resolved(canBeNull: true)] - private IAPIProvider api { get; set; } + [Resolved] + private IAPIProvider? api { get; set; } - [Resolved(canBeNull: true)] - private OsuGame game { get; set; } + [Resolved] + private OsuGame? game { get; set; } private const string help_centre_url = "/help/wiki/Help_Centre#login"; From 45f60b035e549e24a9497bf0f11de2eb3d6a4b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 2 Feb 2024 07:05:27 +0100 Subject: [PATCH 437/651] Enable NRT in `AccountCreationOverlay` --- osu.Game/Overlays/AccountCreationOverlay.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/osu.Game/Overlays/AccountCreationOverlay.cs b/osu.Game/Overlays/AccountCreationOverlay.cs index 576ee92b48..82fc5508f1 100644 --- a/osu.Game/Overlays/AccountCreationOverlay.cs +++ b/osu.Game/Overlays/AccountCreationOverlay.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using osu.Framework.Allocation; using osu.Framework.Bindables; @@ -25,7 +23,9 @@ namespace osu.Game.Overlays { private const float transition_time = 400; - private ScreenWelcome welcomeScreen; + private ScreenWelcome welcomeScreen = null!; + + private ScheduledDelegate? scheduledHide; public AccountCreationOverlay() { @@ -108,8 +108,6 @@ namespace osu.Game.Overlays this.FadeOut(100); } - private ScheduledDelegate scheduledHide; - private void apiStateChanged(ValueChangedEvent state) { switch (state.NewValue) From a00cf87925a06b485d039ba03dcf72fc06127789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 2 Feb 2024 06:50:27 +0100 Subject: [PATCH 438/651] Add 2FA verification screen to registration flow --- .../ScreenEmailVerification.cs | 24 +++++++++++++++++++ .../Overlays/AccountCreation/ScreenEntry.cs | 11 +++++++++ 2 files changed, 35 insertions(+) create mode 100644 osu.Game/Overlays/AccountCreation/ScreenEmailVerification.cs diff --git a/osu.Game/Overlays/AccountCreation/ScreenEmailVerification.cs b/osu.Game/Overlays/AccountCreation/ScreenEmailVerification.cs new file mode 100644 index 0000000000..f3b42117ea --- /dev/null +++ b/osu.Game/Overlays/AccountCreation/ScreenEmailVerification.cs @@ -0,0 +1,24 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Game.Overlays.Login; + +namespace osu.Game.Overlays.AccountCreation +{ + public partial class ScreenEmailVerification : AccountCreationScreen + { + [BackgroundDependencyLoader] + private void load() + { + InternalChild = new SecondFactorAuthForm + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding(20), + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + }; + } + } +} diff --git a/osu.Game/Overlays/AccountCreation/ScreenEntry.cs b/osu.Game/Overlays/AccountCreation/ScreenEntry.cs index ab462357c0..f57c7d22a2 100644 --- a/osu.Game/Overlays/AccountCreation/ScreenEntry.cs +++ b/osu.Game/Overlays/AccountCreation/ScreenEntry.cs @@ -5,6 +5,7 @@ using System; using System.Linq; using System.Threading.Tasks; using osu.Framework.Allocation; +using osu.Framework.Bindables; using osu.Framework.Extensions.LocalisationExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -37,6 +38,8 @@ namespace osu.Game.Overlays.AccountCreation [Resolved] private IAPIProvider api { get; set; } = null!; + private IBindable apiState = null!; + private ShakeContainer registerShake = null!; private ITextPart characterCheckText = null!; @@ -142,6 +145,8 @@ namespace osu.Game.Overlays.AccountCreation passwordTextBox.Current.BindValueChanged(_ => updateCharacterCheckTextColour(), true); characterCheckText.DrawablePartsRecreated += _ => updateCharacterCheckTextColour(); + + apiState = api.State.GetBoundCopy(); } private void updateCharacterCheckTextColour() @@ -221,6 +226,12 @@ namespace osu.Game.Overlays.AccountCreation return; } + apiState.BindValueChanged(state => + { + if (state.NewValue == APIState.RequiresSecondFactorAuth) + this.Push(new ScreenEmailVerification()); + }); + api.Login(usernameTextBox.Text, passwordTextBox.Text); }); }); From 091618db1a81ec017ef0903f2844b95e048465e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 2 Feb 2024 07:04:31 +0100 Subject: [PATCH 439/651] Add test coverage of full account creation flow --- .../Online/TestSceneAccountCreationOverlay.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs index 79fb063ea9..b9d7312233 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs @@ -10,6 +10,7 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Testing; +using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays; @@ -67,5 +68,34 @@ namespace osu.Game.Tests.Visual.Online }); AddUntilStep("overlay is hidden", () => accountCreation.State.Value == Visibility.Hidden); } + + [Test] + public void TestFullFlow() + { + AddStep("log out", () => API.Logout()); + + AddStep("show manually", () => accountCreation.Show()); + AddUntilStep("overlay is visible", () => accountCreation.State.Value == Visibility.Visible); + + AddStep("click button", () => accountCreation.ChildrenOfType().Single().TriggerClick()); + AddUntilStep("warning screen is present", () => accountCreation.ChildrenOfType().SingleOrDefault()?.IsPresent == true); + + AddStep("proceed", () => accountCreation.ChildrenOfType().Single().TriggerClick()); + AddUntilStep("entry screen is present", () => accountCreation.ChildrenOfType().SingleOrDefault()?.IsPresent == true); + + AddStep("input details", () => + { + var entryScreen = accountCreation.ChildrenOfType().Single(); + entryScreen.ChildrenOfType().ElementAt(0).Text = "new_user"; + entryScreen.ChildrenOfType().ElementAt(1).Text = "new.user@fake.mail"; + entryScreen.ChildrenOfType().ElementAt(2).Text = "password"; + }); + AddStep("click button", () => accountCreation.ChildrenOfType().Single() + .ChildrenOfType().Single().TriggerClick()); + AddUntilStep("verification screen is present", () => accountCreation.ChildrenOfType().SingleOrDefault()?.IsPresent == true); + + AddStep("verify", () => ((DummyAPIAccess)API).AuthenticateSecondFactor("abcdefgh")); + AddUntilStep("overlay is hidden", () => accountCreation.State.Value == Visibility.Hidden); + } } } From 3122211268346b9c57e3ea8b96e77090251f06e5 Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 02:12:46 -0500 Subject: [PATCH 440/651] Change silence threshold and target restore volume level --- osu.Game/Screens/Play/PlayerLoader.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 6282041f2c..9ec7197429 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -544,7 +544,7 @@ namespace osu.Game.Screens.Play private int restartCount; - private const double volume_requirement = 1e-3; // -60 dB + private const double volume_requirement = 0.01; private void showMuteWarningIfNeeded() { @@ -581,11 +581,11 @@ namespace osu.Game.Screens.Play volumeOverlay.IsMuted.Value = false; // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. - // Note that we only restore to -30 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. + // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. if (audioManager.Volume.Value * audioManager.VolumeTrack.Value <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. - const double target = 0.031622776601684; // 10 ^ (-30 / 20) + const double target = 0.1; double result = target / Math.Max(0.01, audioManager.Volume.Value); if (result > 1) { From f4a2d5f3f489c1332f7e200747dd9b665337db7a Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 02:41:58 -0500 Subject: [PATCH 441/651] Round off inaccuracies in the aggregate volume before evaluating --- osu.Game/Screens/Play/PlayerLoader.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 9ec7197429..50c95ce525 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -551,7 +551,8 @@ namespace osu.Game.Screens.Play if (!muteWarningShownOnce.Value) { // Checks if the notification has not been shown yet and also if master volume is muted, track/music volume is muted or if the whole game is muted. - if (volumeOverlay?.IsMuted.Value == true || audioManager.Volume.Value * audioManager.VolumeTrack.Value <= volume_requirement) + double aggregate = Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100; + if (volumeOverlay?.IsMuted.Value == true || aggregate <= volume_requirement) { notificationOverlay?.Post(new MutedNotification()); muteWarningShownOnce.Value = true; @@ -582,7 +583,8 @@ namespace osu.Game.Screens.Play // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. - if (audioManager.Volume.Value * audioManager.VolumeTrack.Value <= volume_requirement) + double aggregate = Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100; + if (aggregate <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. const double target = 0.1; From 5d9200b4fe02c4ed0f287fe0f43c5f2433b52ec9 Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 02:59:02 -0500 Subject: [PATCH 442/651] Update tests to reflect new restore target volume --- osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs index 2798d77373..99bb006071 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs @@ -268,9 +268,9 @@ namespace osu.Game.Tests.Visual.Gameplay { addVolumeSteps("high master volume", () => { - audioManager.Volume.Value = 0.1; + audioManager.Volume.Value = 0.15; audioManager.VolumeTrack.Value = 0.01; - }, () => audioManager.Volume.Value == 0.1 && audioManager.VolumeTrack.Value == 0.32); + }, () => audioManager.Volume.Value == 0.15 && audioManager.VolumeTrack.Value == 0.67); } [Test] @@ -279,8 +279,8 @@ namespace osu.Game.Tests.Visual.Gameplay addVolumeSteps("low master volume", () => { audioManager.Volume.Value = 0.01; - audioManager.VolumeTrack.Value = 0.1; - }, () => audioManager.Volume.Value == 0.03 && audioManager.VolumeTrack.Value == 1); + audioManager.VolumeTrack.Value = 0.15; + }, () => audioManager.Volume.Value == 0.1 && audioManager.VolumeTrack.Value == 1); } [Test] From c60e110976ca7214c200d90da45bdd165cb0b39c Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 03:09:19 -0500 Subject: [PATCH 443/651] Try to fix code quality issues raised by workflow --- osu.Game/Screens/Play/PlayerLoader.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 50c95ce525..1d0ecfc12d 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -551,8 +551,7 @@ namespace osu.Game.Screens.Play if (!muteWarningShownOnce.Value) { // Checks if the notification has not been shown yet and also if master volume is muted, track/music volume is muted or if the whole game is muted. - double aggregate = Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100; - if (volumeOverlay?.IsMuted.Value == true || aggregate <= volume_requirement) + if (volumeOverlay?.IsMuted.Value == true || Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100 <= volume_requirement) { notificationOverlay?.Post(new MutedNotification()); muteWarningShownOnce.Value = true; @@ -583,11 +582,11 @@ namespace osu.Game.Screens.Play // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. - double aggregate = Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100; - if (aggregate <= volume_requirement) + if (Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100 <= volume_requirement) { - // Prioritize increasing music over master volume as to avoid also increasing effects volume. const double target = 0.1; + + // Prioritize increasing music over master volume as to avoid also increasing effects volume. double result = target / Math.Max(0.01, audioManager.Volume.Value); if (result > 1) { From 29a28905820bb1242cda326a2e4610e058bef1c2 Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 03:46:05 -0500 Subject: [PATCH 444/651] fix code quality error #2 --- osu.Game/Screens/Play/PlayerLoader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 1d0ecfc12d..40ffa844da 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -584,10 +584,10 @@ namespace osu.Game.Screens.Play // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. if (Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100 <= volume_requirement) { - const double target = 0.1; - // Prioritize increasing music over master volume as to avoid also increasing effects volume. + const double target = 0.1; double result = target / Math.Max(0.01, audioManager.Volume.Value); + if (result > 1) { audioManager.Volume.Value = target; From 906560f66d971778ab8ec00866b3aa3d0afb8caa Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 04:06:22 -0500 Subject: [PATCH 445/651] Fix mute button test Lowering the master volume in the previous test meant that the volume levels would end up being modified. --- osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs index 99bb006071..04b681989f 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs @@ -289,9 +289,10 @@ namespace osu.Game.Tests.Visual.Gameplay addVolumeSteps("mute button", () => { // Importantly, in the case the volume is muted but the user has a volume level set, it should be retained. + audioManager.Volume.Value = 0.5f; audioManager.VolumeTrack.Value = 0.5f; volumeOverlay.IsMuted.Value = true; - }, () => !volumeOverlay.IsMuted.Value && audioManager.VolumeTrack.Value == 0.5f); + }, () => !volumeOverlay.IsMuted.Value && audioManager.Volume.Value == 0.5f && audioManager.VolumeTrack.Value == 0.5f); } /// From e4ec8c111b90542c8705e73eaabca6bf9557f63f Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 05:48:57 -0500 Subject: [PATCH 446/651] give better volume names to `addVolumeSteps` --- osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs index 04b681989f..67e94a2960 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs @@ -266,7 +266,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestMutedNotificationHighMasterVolume() { - addVolumeSteps("high master volume", () => + addVolumeSteps("master and music volumes", () => { audioManager.Volume.Value = 0.15; audioManager.VolumeTrack.Value = 0.01; @@ -276,7 +276,7 @@ namespace osu.Game.Tests.Visual.Gameplay [Test] public void TestMutedNotificationLowMasterVolume() { - addVolumeSteps("low master volume", () => + addVolumeSteps("master and music volumes", () => { audioManager.Volume.Value = 0.01; audioManager.VolumeTrack.Value = 0.15; From b44f77cee1b6adb6568f9b5764382a6cd6ffe2ed Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 19:48:13 +0900 Subject: [PATCH 447/651] Update R# + fix inspections --- .config/dotnet-tools.json | 4 +- .globalconfig | 4 +- .../TestScenePathControlPointVisualiser.cs | 2 +- .../TestSceneFollowPoints.cs | 2 +- .../TestSceneSkinFallbacks.cs | 2 + .../UI/DrumTouchInputArea.cs | 3 +- osu.Game.Tests/Beatmaps/WorkingBeatmapTest.cs | 6 ++- osu.Game.Tests/Database/RulesetStoreTests.cs | 6 +-- .../Gameplay/TestSceneStoryboardSamples.cs | 4 +- .../TestSceneBrokenRulesetHandling.cs | 12 +++--- .../Editing/TestSceneEditorTestGameplay.cs | 4 +- .../Gameplay/TestSceneReplayRecorder.cs | 2 +- .../Gameplay/TestSceneSpectatorPlayback.cs | 2 +- .../Visual/Menus/TestSceneToolbar.cs | 2 +- .../TestSceneLoungeRoomsContainer.cs | 2 +- .../TestScenePlaylistsMatchSettingsOverlay.cs | 2 +- .../TestScenePlaylistsRoomCreation.cs | 8 ++-- .../Visual/Ranking/TestSceneResultsScreen.cs | 2 +- .../TestSceneFirstRunSetupOverlay.cs | 2 +- .../Beatmaps/Formats/LegacyBeatmapDecoder.cs | 3 +- osu.Game/Beatmaps/WorkingBeatmapCache.cs | 2 +- .../SelectionCycleFillFlowContainer.cs | 4 +- .../UserInterface/BreadcrumbControl.cs | 2 + osu.Game/IO/IStorageResourceProvider.cs | 2 +- osu.Game/Online/Spectator/SpectatorClient.cs | 3 +- osu.Game/Overlays/Comments/VotePill.cs | 2 +- .../Overlays/MedalSplash/DrawableMedal.cs | 2 + osu.Game/Overlays/Volume/VolumeMeter.cs | 2 + .../Objects/Drawables/DrawableHitObject.cs | 3 +- .../Objects/Pooling/HitObjectEntryManager.cs | 5 +-- .../Edit/Compose/Components/DragBox.cs | 2 + osu.Game/Screens/Menu/ButtonArea.cs | 3 ++ .../OnlinePlay/Components/RoomManager.cs | 2 + .../Screens/OnlinePlay/Match/RoomSubScreen.cs | 2 +- .../Screens/Play/HUD/HoldForMenuButton.cs | 2 +- .../Multiplayer/MultiplayerTestScene.cs | 4 +- .../IOnlinePlayTestSceneDependencies.cs | 12 +++--- .../Visual/OnlinePlay/OnlinePlayTestScene.cs | 42 +++++++++++-------- .../OnlinePlayTestSceneDependencies.cs | 4 +- osu.Game/Tests/Visual/SkinnableTestScene.cs | 4 +- osu.sln.DotSettings | 5 +++ 41 files changed, 102 insertions(+), 81 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index b8dc201559..99906f0895 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,13 +3,13 @@ "isRoot": true, "tools": { "jetbrains.resharper.globaltools": { - "version": "2022.2.3", + "version": "2023.3.3", "commands": [ "jb" ] }, "nvika": { - "version": "2.2.0", + "version": "3.0.0", "commands": [ "nvika" ] diff --git a/.globalconfig b/.globalconfig index a7b652c454..a4d4707f9b 100644 --- a/.globalconfig +++ b/.globalconfig @@ -1,5 +1,3 @@ -is_global = true - # .NET Code Style # IDE styles reference: https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ @@ -56,4 +54,4 @@ dotnet_diagnostic.RS0030.severity = error # Temporarily disable analysing CanBeNull = true in NRT contexts due to mobile issues. # See: https://github.com/ppy/osu/pull/19677 -dotnet_diagnostic.OSUF001.severity = none \ No newline at end of file +dotnet_diagnostic.OSUF001.severity = none diff --git a/osu.Game.Rulesets.Osu.Tests/Editor/TestScenePathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu.Tests/Editor/TestScenePathControlPointVisualiser.cs index 8234381283..2b53554ed1 100644 --- a/osu.Game.Rulesets.Osu.Tests/Editor/TestScenePathControlPointVisualiser.cs +++ b/osu.Game.Rulesets.Osu.Tests/Editor/TestScenePathControlPointVisualiser.cs @@ -206,7 +206,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor { AddStep($"click context menu item \"{contextMenuText}\"", () => { - MenuItem item = visualiser.ContextMenuItems.FirstOrDefault(menuItem => menuItem.Text.Value == "Curve type")?.Items.FirstOrDefault(menuItem => menuItem.Text.Value == contextMenuText); + MenuItem item = visualiser.ContextMenuItems!.FirstOrDefault(menuItem => menuItem.Text.Value == "Curve type")?.Items.FirstOrDefault(menuItem => menuItem.Text.Value == contextMenuText); item?.Action.Value?.Invoke(); }); diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneFollowPoints.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneFollowPoints.cs index eefaa3cae3..28c9d71139 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneFollowPoints.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneFollowPoints.cs @@ -183,7 +183,7 @@ namespace osu.Game.Rulesets.Osu.Tests break; } - hitObjectContainer.Add(drawableObject); + hitObjectContainer.Add(drawableObject!); followPointRenderer.AddFollowPoints(objects[i]); } }); diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs index 09b906cb10..c624fbbe73 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using System.Linq; +using JetBrains.Annotations; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Audio; @@ -173,6 +174,7 @@ namespace osu.Game.Rulesets.Osu.Tests public IEnumerable AllSources => new[] { this }; + [CanBeNull] public event Action SourceChanged; private bool enabled = true; diff --git a/osu.Game.Rulesets.Taiko/UI/DrumTouchInputArea.cs b/osu.Game.Rulesets.Taiko/UI/DrumTouchInputArea.cs index 29ccd96675..0b7f6f621a 100644 --- a/osu.Game.Rulesets.Taiko/UI/DrumTouchInputArea.cs +++ b/osu.Game.Rulesets.Taiko/UI/DrumTouchInputArea.cs @@ -179,10 +179,9 @@ namespace osu.Game.Rulesets.Taiko.UI TaikoAction taikoAction = getTaikoActionFromPosition(position); // Not too sure how this can happen, but let's avoid throwing. - if (trackedActions.ContainsKey(source)) + if (!trackedActions.TryAdd(source, taikoAction)) return; - trackedActions.Add(source, taikoAction); keyBindingContainer.TriggerPressed(taikoAction); } diff --git a/osu.Game.Tests/Beatmaps/WorkingBeatmapTest.cs b/osu.Game.Tests/Beatmaps/WorkingBeatmapTest.cs index f4b1028c0e..3c26f8e39a 100644 --- a/osu.Game.Tests/Beatmaps/WorkingBeatmapTest.cs +++ b/osu.Game.Tests/Beatmaps/WorkingBeatmapTest.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Moq; using NUnit.Framework; using osu.Game.Beatmaps; @@ -98,9 +99,10 @@ namespace osu.Game.Tests.Beatmaps Beatmap = beatmap; } +#pragma warning disable CS0067 + [CanBeNull] public event Action> ObjectConverted; - - protected virtual void OnObjectConverted(HitObject arg1, IEnumerable arg2) => ObjectConverted?.Invoke(arg1, arg2); +#pragma warning restore CS0067 public IBeatmap Beatmap { get; } diff --git a/osu.Game.Tests/Database/RulesetStoreTests.cs b/osu.Game.Tests/Database/RulesetStoreTests.cs index 8b4c6e2411..ddf207342a 100644 --- a/osu.Game.Tests/Database/RulesetStoreTests.cs +++ b/osu.Game.Tests/Database/RulesetStoreTests.cs @@ -79,7 +79,7 @@ namespace osu.Game.Tests.Database Assert.That(realm.Run(r => r.Find(rulesetShortName)!.Available), Is.True); // Availability is updated on construction of a RealmRulesetStore - var _ = new RealmRulesetStore(realm, storage); + _ = new RealmRulesetStore(realm, storage); Assert.That(realm.Run(r => r.Find(rulesetShortName)!.Available), Is.False); }); @@ -104,13 +104,13 @@ namespace osu.Game.Tests.Database Assert.That(realm.Run(r => r.Find(rulesetShortName)!.Available), Is.True); // Availability is updated on construction of a RealmRulesetStore - var _ = new RealmRulesetStore(realm, storage); + _ = new RealmRulesetStore(realm, storage); Assert.That(realm.Run(r => r.Find(rulesetShortName)!.Available), Is.False); // Simulate the ruleset getting updated LoadTestRuleset.Version = Ruleset.CURRENT_RULESET_API_VERSION; - var __ = new RealmRulesetStore(realm, storage); + _ = new RealmRulesetStore(realm, storage); Assert.That(realm.Run(r => r.Find(rulesetShortName)!.Available), Is.True); }); diff --git a/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs b/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs index 4fb9db845b..61161f3206 100644 --- a/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs +++ b/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs @@ -203,9 +203,9 @@ namespace osu.Game.Tests.Gameplay public IRenderer Renderer => host.Renderer; public AudioManager AudioManager => Audio; - public IResourceStore Files => null; + public IResourceStore Files => null!; public new IResourceStore Resources => base.Resources; - public RealmAccess RealmAccess => null; + public RealmAccess RealmAccess => null!; public IResourceStore CreateTextureLoaderStore(IResourceStore underlyingStore) => null; #endregion diff --git a/osu.Game.Tests/Rulesets/TestSceneBrokenRulesetHandling.cs b/osu.Game.Tests/Rulesets/TestSceneBrokenRulesetHandling.cs index dac6beea65..b378704e80 100644 --- a/osu.Game.Tests/Rulesets/TestSceneBrokenRulesetHandling.cs +++ b/osu.Game.Tests/Rulesets/TestSceneBrokenRulesetHandling.cs @@ -56,9 +56,9 @@ namespace osu.Game.Tests.Rulesets public override IEnumerable GetModsFor(ModType type) => new Mod[] { null }; - public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => null; - public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => null; - public override DifficultyCalculator CreateDifficultyCalculator(IWorkingBeatmap beatmap) => null; + public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => null!; + public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => null!; + public override DifficultyCalculator CreateDifficultyCalculator(IWorkingBeatmap beatmap) => null!; } private class TestAPIIncompatibleRuleset : Ruleset @@ -69,9 +69,9 @@ namespace osu.Game.Tests.Rulesets // simulate API incompatibility by throwing similar exceptions. public override IEnumerable GetModsFor(ModType type) => throw new MissingMethodException(); - public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => null; - public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => null; - public override DifficultyCalculator CreateDifficultyCalculator(IWorkingBeatmap beatmap) => null; + public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => null!; + public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => null!; + public override DifficultyCalculator CreateDifficultyCalculator(IWorkingBeatmap beatmap) => null!; } } } diff --git a/osu.Game.Tests/Visual/Editing/TestSceneEditorTestGameplay.cs b/osu.Game.Tests/Visual/Editing/TestSceneEditorTestGameplay.cs index bbd7123f20..ca5e89c8ed 100644 --- a/osu.Game.Tests/Visual/Editing/TestSceneEditorTestGameplay.cs +++ b/osu.Game.Tests/Visual/Editing/TestSceneEditorTestGameplay.cs @@ -142,7 +142,7 @@ namespace osu.Game.Tests.Visual.Editing AddStep("dismiss prompt", () => { - var button = DialogOverlay.CurrentDialog.Buttons.Last(); + var button = DialogOverlay.CurrentDialog!.Buttons.Last(); InputManager.MoveMouseTo(button); InputManager.Click(MouseButton.Left); }); @@ -167,7 +167,7 @@ namespace osu.Game.Tests.Visual.Editing }); AddUntilStep("save prompt shown", () => DialogOverlay.CurrentDialog is SaveRequiredPopupDialog); - AddStep("save changes", () => DialogOverlay.CurrentDialog.PerformOkAction()); + AddStep("save changes", () => DialogOverlay.CurrentDialog!.PerformOkAction()); EditorPlayer editorPlayer = null; AddUntilStep("player pushed", () => (editorPlayer = Stack.CurrentScreen as EditorPlayer) != null); diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneReplayRecorder.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneReplayRecorder.cs index c51883b221..a7ab021884 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneReplayRecorder.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneReplayRecorder.cs @@ -120,7 +120,7 @@ namespace osu.Game.Tests.Visual.Gameplay protected override void Update() { base.Update(); - playbackManager?.ReplayInputHandler.SetFrameFromTime(Time.Current - 100); + playbackManager?.ReplayInputHandler?.SetFrameFromTime(Time.Current - 100); } [TearDownSteps] diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs index 3a5b3864af..dd5bbf70b4 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs @@ -198,7 +198,7 @@ namespace osu.Game.Tests.Visual.Gameplay foreach (var legacyFrame in frames.Frames) { var frame = new TestReplayFrame(); - frame.FromLegacy(legacyFrame, null); + frame.FromLegacy(legacyFrame, null!); playbackReplay.Frames.Add(frame); } diff --git a/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs b/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs index ce9f80a84f..12d7dde11b 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs @@ -250,7 +250,7 @@ namespace osu.Game.Tests.Visual.Menus { } - public virtual IBindable UnreadCount => null; + public virtual IBindable UnreadCount { get; } = new Bindable(); public IEnumerable AllNotifications => Enumerable.Empty(); } diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs index d99d764449..b938e59d63 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs @@ -58,7 +58,7 @@ namespace osu.Game.Tests.Visual.Multiplayer .SkipWhile(r => r.Room.Category.Value == RoomCategory.Spotlight) .All(r => r.Room.Category.Value == RoomCategory.Normal)); - AddStep("remove first room", () => RoomManager.RemoveRoom(RoomManager.Rooms.FirstOrDefault(r => r.RoomID.Value == 0))); + AddStep("remove first room", () => RoomManager.RemoveRoom(RoomManager.Rooms.First(r => r.RoomID.Value == 0))); AddAssert("has 4 rooms", () => container.Rooms.Count == 4); AddAssert("first room removed", () => container.Rooms.All(r => r.Room.RoomID.Value != 0)); diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs index 1053789b27..9f7b20ad43 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs @@ -179,7 +179,7 @@ namespace osu.Game.Tests.Visual.Playlists public IBindable InitialRoomsReceived { get; } = new Bindable(true); - public IBindableList Rooms => null; + public IBindableList Rooms => null!; public void AddOrUpdateRoom(Room room) => throw new NotImplementedException(); diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomCreation.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomCreation.cs index 2f66309f04..1636a3d4b8 100644 --- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomCreation.cs +++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomCreation.cs @@ -52,11 +52,11 @@ namespace osu.Game.Tests.Visual.Playlists [SetUpSteps] public void SetupSteps() { - AddStep("set room", () => SelectedRoom.Value = new Room()); + AddStep("set room", () => SelectedRoom!.Value = new Room()); importBeatmap(); - AddStep("load match", () => LoadScreen(match = new TestPlaylistsRoomSubScreen(SelectedRoom.Value))); + AddStep("load match", () => LoadScreen(match = new TestPlaylistsRoomSubScreen(SelectedRoom!.Value))); AddUntilStep("wait for load", () => match.IsCurrentScreen()); } @@ -115,7 +115,7 @@ namespace osu.Game.Tests.Visual.Playlists }); }); - AddAssert("first playlist item selected", () => match.SelectedItem.Value == SelectedRoom.Value.Playlist[0]); + AddAssert("first playlist item selected", () => match.SelectedItem.Value == SelectedRoom!.Value.Playlist[0]); } [Test] @@ -201,7 +201,7 @@ namespace osu.Game.Tests.Visual.Playlists private void setupAndCreateRoom(Action room) { - AddStep("setup room", () => room(SelectedRoom.Value)); + AddStep("setup room", () => room(SelectedRoom!.Value)); AddStep("click create button", () => { diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs index 5671cbebd7..685a685896 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs @@ -432,7 +432,7 @@ namespace osu.Game.Tests.Visual.Ranking private class RulesetWithNoPerformanceCalculator : OsuRuleset { - public override PerformanceCalculator CreatePerformanceCalculator() => null; + public override PerformanceCalculator CreatePerformanceCalculator() => null!; } } } diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs index 9275f9755f..51da4d8755 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs @@ -213,7 +213,7 @@ namespace osu.Game.Tests.Visual.UserInterface { } - public virtual IBindable UnreadCount => null; + public virtual IBindable UnreadCount { get; } = new Bindable(); public IEnumerable AllNotifications => Enumerable.Empty(); } diff --git a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs index 1ee4670ae2..386dada328 100644 --- a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs +++ b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs @@ -567,10 +567,9 @@ namespace osu.Game.Beatmaps.Formats for (int i = pendingControlPoints.Count - 1; i >= 0; i--) { var type = pendingControlPoints[i].GetType(); - if (pendingControlPointTypes.Contains(type)) + if (!pendingControlPointTypes.Add(type)) continue; - pendingControlPointTypes.Add(type); beatmap.ControlPointInfo.Add(pendingControlPointsTime, pendingControlPoints[i]); } diff --git a/osu.Game/Beatmaps/WorkingBeatmapCache.cs b/osu.Game/Beatmaps/WorkingBeatmapCache.cs index 2c500146c5..74a85cde7c 100644 --- a/osu.Game/Beatmaps/WorkingBeatmapCache.cs +++ b/osu.Game/Beatmaps/WorkingBeatmapCache.cs @@ -116,7 +116,7 @@ namespace osu.Game.Beatmaps ITrackStore IBeatmapResourceProvider.Tracks => trackStore; IRenderer IStorageResourceProvider.Renderer => host?.Renderer ?? new DummyRenderer(); AudioManager IStorageResourceProvider.AudioManager => audioManager; - RealmAccess IStorageResourceProvider.RealmAccess => null; + RealmAccess IStorageResourceProvider.RealmAccess => null!; IResourceStore IStorageResourceProvider.Files => files; IResourceStore IStorageResourceProvider.Resources => resources; IResourceStore IStorageResourceProvider.CreateTextureLoaderStore(IResourceStore underlyingStore) => host?.CreateTextureLoaderStore(underlyingStore); diff --git a/osu.Game/Graphics/Containers/SelectionCycleFillFlowContainer.cs b/osu.Game/Graphics/Containers/SelectionCycleFillFlowContainer.cs index 62544c6111..098fd7b1ab 100644 --- a/osu.Game/Graphics/Containers/SelectionCycleFillFlowContainer.cs +++ b/osu.Game/Graphics/Containers/SelectionCycleFillFlowContainer.cs @@ -52,10 +52,10 @@ namespace osu.Game.Graphics.Containers public override void Add(T drawable) { - base.Add(drawable); - Debug.Assert(drawable != null); + base.Add(drawable); + drawable.StateChanged += state => selectionChanged(drawable, state); } diff --git a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs index af4b3849af..4af6ce7498 100644 --- a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs +++ b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs @@ -10,6 +10,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; using System.Linq; +using JetBrains.Annotations; using osu.Framework.Graphics.Sprites; namespace osu.Game.Graphics.UserInterface @@ -48,6 +49,7 @@ namespace osu.Game.Graphics.UserInterface { protected virtual float ChevronSize => 10; + [CanBeNull] public event Action StateChanged; public readonly SpriteIcon Chevron; diff --git a/osu.Game/IO/IStorageResourceProvider.cs b/osu.Game/IO/IStorageResourceProvider.cs index 08982a8b5f..91760971e8 100644 --- a/osu.Game/IO/IStorageResourceProvider.cs +++ b/osu.Game/IO/IStorageResourceProvider.cs @@ -41,6 +41,6 @@ namespace osu.Game.IO /// /// The underlying provider of texture data (in arbitrary image formats). /// A texture loader store. - IResourceStore CreateTextureLoaderStore(IResourceStore underlyingStore); + IResourceStore? CreateTextureLoaderStore(IResourceStore underlyingStore); } } diff --git a/osu.Game/Online/Spectator/SpectatorClient.cs b/osu.Game/Online/Spectator/SpectatorClient.cs index 7911701853..07ee9115d6 100644 --- a/osu.Game/Online/Spectator/SpectatorClient.cs +++ b/osu.Game/Online/Spectator/SpectatorClient.cs @@ -264,13 +264,12 @@ namespace osu.Game.Online.Spectator { Debug.Assert(ThreadSafety.IsUpdateThread); - if (watchedUsersRefCounts.ContainsKey(userId)) + if (!watchedUsersRefCounts.TryAdd(userId, 1)) { watchedUsersRefCounts[userId]++; return; } - watchedUsersRefCounts.Add(userId, 1); WatchUserInternal(userId); } diff --git a/osu.Game/Overlays/Comments/VotePill.cs b/osu.Game/Overlays/Comments/VotePill.cs index dd418a9e58..8c5aaa062f 100644 --- a/osu.Game/Overlays/Comments/VotePill.cs +++ b/osu.Game/Overlays/Comments/VotePill.cs @@ -30,7 +30,7 @@ namespace osu.Game.Overlays.Comments public Color4 AccentColour { get; set; } - protected override IEnumerable EffectTargets => null; + protected override IEnumerable EffectTargets => Enumerable.Empty(); [Resolved] private IAPIProvider api { get; set; } diff --git a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs index a25147b69f..f4f6fd2bc1 100644 --- a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs +++ b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs @@ -4,6 +4,7 @@ #nullable disable using System; +using JetBrains.Annotations; using osu.Framework; using osuTK; using osu.Framework.Allocation; @@ -24,6 +25,7 @@ namespace osu.Game.Overlays.MedalSplash private const float scale_when_unlocked = 0.76f; private const float scale_when_full = 0.6f; + [CanBeNull] public event Action StateChanged; private readonly Medal medal; diff --git a/osu.Game/Overlays/Volume/VolumeMeter.cs b/osu.Game/Overlays/Volume/VolumeMeter.cs index 9ca4c25ab9..6ec4971f06 100644 --- a/osu.Game/Overlays/Volume/VolumeMeter.cs +++ b/osu.Game/Overlays/Volume/VolumeMeter.cs @@ -5,6 +5,7 @@ using System; using System.Globalization; +using JetBrains.Annotations; using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Audio; @@ -48,6 +49,7 @@ namespace osu.Game.Overlays.Volume private Sample notchSample; private double sampleLastPlaybackTime; + [CanBeNull] public event Action StateChanged; private SelectionState state; diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 5662fb2293..161537200a 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -11,6 +11,7 @@ using System.Linq; using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Bindables; +using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Extensions.TypeExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Primitives; @@ -139,7 +140,7 @@ namespace osu.Game.Rulesets.Objects.Drawables protected override bool RequiresChildrenUpdate => true; - public override bool IsPresent => base.IsPresent || (State.Value == ArmedState.Idle && Clock?.CurrentTime >= LifetimeStart); + public override bool IsPresent => base.IsPresent || (State.Value == ArmedState.Idle && Clock.IsNotNull() && Clock.CurrentTime >= LifetimeStart); private readonly Bindable state = new Bindable(); diff --git a/osu.Game/Rulesets/Objects/Pooling/HitObjectEntryManager.cs b/osu.Game/Rulesets/Objects/Pooling/HitObjectEntryManager.cs index fabf4fc444..7977166cb2 100644 --- a/osu.Game/Rulesets/Objects/Pooling/HitObjectEntryManager.cs +++ b/osu.Game/Rulesets/Objects/Pooling/HitObjectEntryManager.cs @@ -47,12 +47,9 @@ namespace osu.Game.Rulesets.Objects.Pooling { HitObject hitObject = entry.HitObject; - if (entryMap.ContainsKey(hitObject)) + if (!entryMap.TryAdd(hitObject, entry)) throw new InvalidOperationException($@"The {nameof(HitObjectLifetimeEntry)} is already added to this {nameof(HitObjectEntryManager)}."); - // Add the entry. - entryMap[hitObject] = entry; - // If the entry has a parent, set it and add the entry to the parent's children. if (parent != null) { diff --git a/osu.Game/Screens/Edit/Compose/Components/DragBox.cs b/osu.Game/Screens/Edit/Compose/Components/DragBox.cs index 4d1f81228e..b83e565e89 100644 --- a/osu.Game/Screens/Edit/Compose/Components/DragBox.cs +++ b/osu.Game/Screens/Edit/Compose/Components/DragBox.cs @@ -4,6 +4,7 @@ #nullable disable using System; +using JetBrains.Annotations; using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -69,6 +70,7 @@ namespace osu.Game.Screens.Edit.Compose.Components public override void Show() => State = Visibility.Visible; + [CanBeNull] public event Action StateChanged; public partial class BoxWithBorders : CompositeDrawable diff --git a/osu.Game/Screens/Menu/ButtonArea.cs b/osu.Game/Screens/Menu/ButtonArea.cs index 69ba68442f..4eb91c526f 100644 --- a/osu.Game/Screens/Menu/ButtonArea.cs +++ b/osu.Game/Screens/Menu/ButtonArea.cs @@ -4,6 +4,7 @@ #nullable disable using System; +using JetBrains.Annotations; using osu.Framework; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -88,6 +89,7 @@ namespace osu.Game.Screens.Menu public override void Show() => State = Visibility.Visible; + [CanBeNull] public event Action StateChanged; private partial class ButtonAreaBackground : Box, IStateful @@ -146,6 +148,7 @@ namespace osu.Game.Screens.Menu } } + [CanBeNull] public event Action StateChanged; } diff --git a/osu.Game/Screens/OnlinePlay/Components/RoomManager.cs b/osu.Game/Screens/OnlinePlay/Components/RoomManager.cs index e892f9280f..cb27d1ee61 100644 --- a/osu.Game/Screens/OnlinePlay/Components/RoomManager.cs +++ b/osu.Game/Screens/OnlinePlay/Components/RoomManager.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Development; @@ -19,6 +20,7 @@ namespace osu.Game.Screens.OnlinePlay.Components { public partial class RoomManager : Component, IRoomManager { + [CanBeNull] public event Action RoomsUpdated; private readonly BindableList rooms = new BindableList(); diff --git a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs index f35b205bc4..4c0219eff5 100644 --- a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs @@ -509,7 +509,7 @@ namespace osu.Game.Screens.OnlinePlay.Match private void cancelTrackLooping() { - var track = Beatmap?.Value?.Track; + var track = Beatmap.Value?.Track; if (track != null) track.Looping = false; diff --git a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs index 1cf3d25dad..a260156595 100644 --- a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs +++ b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs @@ -109,7 +109,7 @@ namespace osu.Game.Screens.Play.HUD protected override bool OnMouseMove(MouseMoveEvent e) { - positionalAdjust = Vector2.Distance(e.MousePosition, button.ToSpaceOfOtherDrawable(button.DrawRectangle.Centre, Parent)) / 100; + positionalAdjust = Vector2.Distance(e.MousePosition, button.ToSpaceOfOtherDrawable(button.DrawRectangle.Centre, Parent!)) / 100; return base.OnMouseMove(e); } diff --git a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs index 93c6e72aa2..54c5b578e6 100644 --- a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs +++ b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs @@ -20,7 +20,7 @@ namespace osu.Game.Tests.Visual.Multiplayer public TestMultiplayerClient MultiplayerClient => OnlinePlayDependencies.MultiplayerClient; public new TestMultiplayerRoomManager RoomManager => OnlinePlayDependencies.RoomManager; - public TestSpectatorClient SpectatorClient => OnlinePlayDependencies?.SpectatorClient; + public TestSpectatorClient SpectatorClient => OnlinePlayDependencies.SpectatorClient; protected new MultiplayerTestSceneDependencies OnlinePlayDependencies => (MultiplayerTestSceneDependencies)base.OnlinePlayDependencies; @@ -57,7 +57,7 @@ namespace osu.Game.Tests.Visual.Multiplayer { AddStep("join room", () => { - SelectedRoom.Value = CreateRoom(); + SelectedRoom!.Value = CreateRoom(); RoomManager.CreateRoom(SelectedRoom.Value); }); diff --git a/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs b/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs index 3509519113..eb5184353a 100644 --- a/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs +++ b/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs @@ -16,31 +16,31 @@ namespace osu.Game.Tests.Visual.OnlinePlay /// /// The cached . /// - Bindable SelectedRoom { get; } + Bindable? SelectedRoom { get; } /// /// The cached /// - IRoomManager RoomManager { get; } + IRoomManager? RoomManager { get; } /// /// The cached . /// - OngoingOperationTracker OngoingOperationTracker { get; } + OngoingOperationTracker? OngoingOperationTracker { get; } /// /// The cached . /// - OnlinePlayBeatmapAvailabilityTracker AvailabilityTracker { get; } + OnlinePlayBeatmapAvailabilityTracker? AvailabilityTracker { get; } /// /// The cached . /// - TestUserLookupCache UserLookupCache { get; } + TestUserLookupCache? UserLookupCache { get; } /// /// The cached . /// - BeatmapLookupCache BeatmapLookupCache { get; } + BeatmapLookupCache? BeatmapLookupCache { get; } } } diff --git a/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs b/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs index 87488710a7..0118d60dca 100644 --- a/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs +++ b/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using osu.Framework.Allocation; using osu.Framework.Bindables; @@ -22,23 +20,23 @@ namespace osu.Game.Tests.Visual.OnlinePlay /// public abstract partial class OnlinePlayTestScene : ScreenTestScene, IOnlinePlayTestSceneDependencies { - public Bindable SelectedRoom => OnlinePlayDependencies?.SelectedRoom; - public IRoomManager RoomManager => OnlinePlayDependencies?.RoomManager; - public OngoingOperationTracker OngoingOperationTracker => OnlinePlayDependencies?.OngoingOperationTracker; - public OnlinePlayBeatmapAvailabilityTracker AvailabilityTracker => OnlinePlayDependencies?.AvailabilityTracker; - public TestUserLookupCache UserLookupCache => OnlinePlayDependencies?.UserLookupCache; - public BeatmapLookupCache BeatmapLookupCache => OnlinePlayDependencies?.BeatmapLookupCache; + public Bindable SelectedRoom => OnlinePlayDependencies.SelectedRoom; + public IRoomManager RoomManager => OnlinePlayDependencies.RoomManager; + public OngoingOperationTracker OngoingOperationTracker => OnlinePlayDependencies.OngoingOperationTracker; + public OnlinePlayBeatmapAvailabilityTracker AvailabilityTracker => OnlinePlayDependencies.AvailabilityTracker; + public TestUserLookupCache UserLookupCache => OnlinePlayDependencies.UserLookupCache; + public BeatmapLookupCache BeatmapLookupCache => OnlinePlayDependencies.BeatmapLookupCache; /// /// All dependencies required for online play components and screens. /// - protected OnlinePlayTestSceneDependencies OnlinePlayDependencies => dependencies?.OnlinePlayDependencies; + protected OnlinePlayTestSceneDependencies OnlinePlayDependencies => dependencies.OnlinePlayDependencies; protected override Container Content => content; private readonly Container content; private readonly Container drawableDependenciesContainer; - private DelegatedDependencyContainer dependencies; + private DelegatedDependencyContainer dependencies = null!; protected OnlinePlayTestScene() { @@ -51,8 +49,10 @@ namespace osu.Game.Tests.Visual.OnlinePlay protected sealed override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) { - dependencies = new DelegatedDependencyContainer(base.CreateChildDependencies(parent)); - return dependencies; + return dependencies = new DelegatedDependencyContainer(base.CreateChildDependencies(parent)) + { + OnlinePlayDependencies = initDependencies() + }; } public override void SetUpSteps() @@ -62,9 +62,7 @@ namespace osu.Game.Tests.Visual.OnlinePlay AddStep("setup dependencies", () => { // Reset the room dependencies to a fresh state. - drawableDependenciesContainer.Clear(); - dependencies.OnlinePlayDependencies = CreateOnlinePlayDependencies(); - drawableDependenciesContainer.AddRange(OnlinePlayDependencies.DrawableComponents); + dependencies.OnlinePlayDependencies = initDependencies(); var handler = OnlinePlayDependencies.RequestsHandler; @@ -90,6 +88,14 @@ namespace osu.Game.Tests.Visual.OnlinePlay }); } + private OnlinePlayTestSceneDependencies initDependencies() + { + var newDependencies = CreateOnlinePlayDependencies(); + drawableDependenciesContainer.Clear(); + drawableDependenciesContainer.AddRange(newDependencies.DrawableComponents); + return newDependencies; + } + /// /// Creates the room dependencies. Called every . /// @@ -106,7 +112,7 @@ namespace osu.Game.Tests.Visual.OnlinePlay /// /// The online play dependencies. /// - public OnlinePlayTestSceneDependencies OnlinePlayDependencies { get; set; } + public OnlinePlayTestSceneDependencies OnlinePlayDependencies { get; set; } = null!; private readonly IReadOnlyDependencyContainer parent; private readonly DependencyContainer injectableDependencies; @@ -122,10 +128,10 @@ namespace osu.Game.Tests.Visual.OnlinePlay } public object Get(Type type) - => OnlinePlayDependencies?.Get(type) ?? parent.Get(type); + => OnlinePlayDependencies.Get(type) ?? parent.Get(type); public object Get(Type type, CacheInfo info) - => OnlinePlayDependencies?.Get(type, info) ?? parent.Get(type, info); + => OnlinePlayDependencies.Get(type, info) ?? parent.Get(type, info); public void Inject(T instance) where T : class, IDependencyInjectionCandidate diff --git a/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestSceneDependencies.cs b/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestSceneDependencies.cs index 975423d19b..64bd27b871 100644 --- a/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestSceneDependencies.cs +++ b/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestSceneDependencies.cs @@ -56,10 +56,10 @@ namespace osu.Game.Tests.Visual.OnlinePlay CacheAs(BeatmapLookupCache); } - public object Get(Type type) + public object? Get(Type type) => dependencies.Get(type); - public object Get(Type type, CacheInfo info) + public object? Get(Type type, CacheInfo info) => dependencies.Get(type, info); public void Inject(T instance) diff --git a/osu.Game/Tests/Visual/SkinnableTestScene.cs b/osu.Game/Tests/Visual/SkinnableTestScene.cs index f371cf721f..c9acfa0ee5 100644 --- a/osu.Game/Tests/Visual/SkinnableTestScene.cs +++ b/osu.Game/Tests/Visual/SkinnableTestScene.cs @@ -171,10 +171,10 @@ namespace osu.Game.Tests.Visual public IRenderer Renderer => host.Renderer; public AudioManager AudioManager => Audio; - public IResourceStore Files => null; + public IResourceStore Files => null!; public new IResourceStore Resources => base.Resources; public IResourceStore CreateTextureLoaderStore(IResourceStore underlyingStore) => host.CreateTextureLoaderStore(underlyingStore); - RealmAccess IStorageResourceProvider.RealmAccess => null; + RealmAccess IStorageResourceProvider.RealmAccess => null!; #endregion diff --git a/osu.sln.DotSettings b/osu.sln.DotSettings index c8c5d6745c..1bf8aa7b0b 100644 --- a/osu.sln.DotSettings +++ b/osu.sln.DotSettings @@ -66,6 +66,7 @@ HINT WARNING DO_NOT_SHOW + HINT WARNING WARNING WARNING @@ -81,6 +82,7 @@ WARNING WARNING HINT + HINT WARNING HINT DO_NOT_SHOW @@ -165,6 +167,7 @@ WARNING WARNING WARNING + HINT WARNING WARNING WARNING @@ -251,6 +254,7 @@ HINT DO_NOT_SHOW WARNING + HINT WARNING WARNING WARNING @@ -263,6 +267,7 @@ WARNING WARNING WARNING + HINT WARNING HINT HINT From 20ae88b0a0dd9a23dfbb7982d292e475f3a959c7 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 21:05:12 +0900 Subject: [PATCH 448/651] Revert unnecessary changes --- .../Tests/Visual/Multiplayer/MultiplayerTestScene.cs | 2 +- .../OnlinePlay/IOnlinePlayTestSceneDependencies.cs | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs index 54c5b578e6..80c69db8b1 100644 --- a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs +++ b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs @@ -57,7 +57,7 @@ namespace osu.Game.Tests.Visual.Multiplayer { AddStep("join room", () => { - SelectedRoom!.Value = CreateRoom(); + SelectedRoom.Value = CreateRoom(); RoomManager.CreateRoom(SelectedRoom.Value); }); diff --git a/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs b/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs index eb5184353a..3509519113 100644 --- a/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs +++ b/osu.Game/Tests/Visual/OnlinePlay/IOnlinePlayTestSceneDependencies.cs @@ -16,31 +16,31 @@ namespace osu.Game.Tests.Visual.OnlinePlay /// /// The cached . /// - Bindable? SelectedRoom { get; } + Bindable SelectedRoom { get; } /// /// The cached /// - IRoomManager? RoomManager { get; } + IRoomManager RoomManager { get; } /// /// The cached . /// - OngoingOperationTracker? OngoingOperationTracker { get; } + OngoingOperationTracker OngoingOperationTracker { get; } /// /// The cached . /// - OnlinePlayBeatmapAvailabilityTracker? AvailabilityTracker { get; } + OnlinePlayBeatmapAvailabilityTracker AvailabilityTracker { get; } /// /// The cached . /// - TestUserLookupCache? UserLookupCache { get; } + TestUserLookupCache UserLookupCache { get; } /// /// The cached . /// - BeatmapLookupCache? BeatmapLookupCache { get; } + BeatmapLookupCache BeatmapLookupCache { get; } } } From 6e4d52863c81e28a6b4389e844081d016a4cdee7 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 00:50:26 +0900 Subject: [PATCH 449/651] Upgrade to .NET 8 SDK --- .../osu.Game.Rulesets.EmptyFreeform.Tests.csproj | 2 +- .../osu.Game.Rulesets.EmptyFreeform.csproj | 2 +- .../osu.Game.Rulesets.Pippidon.Tests.csproj | 2 +- .../osu.Game.Rulesets.Pippidon.csproj | 2 +- .../osu.Game.Rulesets.EmptyScrolling.Tests.csproj | 2 +- .../osu.Game.Rulesets.EmptyScrolling.csproj | 2 +- .../osu.Game.Rulesets.Pippidon.Tests.csproj | 2 +- .../osu.Game.Rulesets.Pippidon.csproj | 2 +- global.json | 8 ++++---- osu.Android/osu.Android.csproj | 2 +- osu.Desktop/osu.Desktop.csproj | 2 +- osu.Game.Benchmarks/osu.Game.Benchmarks.csproj | 2 +- .../osu.Game.Rulesets.Catch.Tests.Android.csproj | 4 ++-- .../osu.Game.Rulesets.Catch.Tests.iOS.csproj | 2 +- .../osu.Game.Rulesets.Catch.Tests.csproj | 2 +- osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj | 2 +- .../osu.Game.Rulesets.Mania.Tests.Android.csproj | 4 ++-- .../osu.Game.Rulesets.Mania.Tests.iOS.csproj | 2 +- .../osu.Game.Rulesets.Mania.Tests.csproj | 2 +- osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj | 2 +- .../osu.Game.Rulesets.Osu.Tests.Android.csproj | 4 ++-- .../osu.Game.Rulesets.Osu.Tests.iOS.csproj | 2 +- .../osu.Game.Rulesets.Osu.Tests.csproj | 2 +- osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj | 2 +- .../osu.Game.Rulesets.Taiko.Tests.Android.csproj | 4 ++-- .../osu.Game.Rulesets.Taiko.Tests.iOS.csproj | 2 +- .../osu.Game.Rulesets.Taiko.Tests.csproj | 2 +- osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj | 2 +- osu.Game.Tests.Android/osu.Game.Tests.Android.csproj | 2 +- osu.Game.Tests.iOS/osu.Game.Tests.iOS.csproj | 2 +- osu.Game.Tests/osu.Game.Tests.csproj | 2 +- .../osu.Game.Tournament.Tests.csproj | 2 +- osu.Game.Tournament/osu.Game.Tournament.csproj | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS/osu.iOS.csproj | 2 +- 35 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj index 5babdb47ff..7d43eb2b05 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj @@ -18,7 +18,7 @@ WinExe - net6.0 + net8.0 osu.Game.Rulesets.EmptyFreeform.Tests diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/osu.Game.Rulesets.EmptyFreeform.csproj b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/osu.Game.Rulesets.EmptyFreeform.csproj index d09e7647e0..89abd5665c 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/osu.Game.Rulesets.EmptyFreeform.csproj +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/osu.Game.Rulesets.EmptyFreeform.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 osu.Game.Rulesets.EmptyFreeform Library AnyCPU diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj index 5d64ca832a..7dc8a1336b 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj @@ -18,7 +18,7 @@ WinExe - net6.0 + net8.0 osu.Game.Rulesets.Pippidon.Tests diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj index 9c8867f4ef..165b6b6c6b 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 osu.Game.Rulesets.Pippidon Library AnyCPU diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj index 6796a8962b..9c4c8217f0 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj @@ -18,7 +18,7 @@ WinExe - net6.0 + net8.0 osu.Game.Rulesets.EmptyScrolling.Tests diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/osu.Game.Rulesets.EmptyScrolling.csproj b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/osu.Game.Rulesets.EmptyScrolling.csproj index 5bf3884f53..6d9565a6f2 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/osu.Game.Rulesets.EmptyScrolling.csproj +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/osu.Game.Rulesets.EmptyScrolling.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 osu.Game.Rulesets.EmptyScrolling Library AnyCPU diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj index 5d64ca832a..7dc8a1336b 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj @@ -18,7 +18,7 @@ WinExe - net6.0 + net8.0 osu.Game.Rulesets.Pippidon.Tests diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj index 9c8867f4ef..165b6b6c6b 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 osu.Game.Rulesets.Pippidon Library AnyCPU diff --git a/global.json b/global.json index 5dcd5f425a..da113e4cbd 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,7 @@ { "sdk": { - "version": "6.0.100", - "rollForward": "latestFeature" + "version": "8.0.0", + "rollForward": "latestFeature", + "allowPrerelease": false } -} - +} \ No newline at end of file diff --git a/osu.Android/osu.Android.csproj b/osu.Android/osu.Android.csproj index 1507bfaa29..17e049a569 100644 --- a/osu.Android/osu.Android.csproj +++ b/osu.Android/osu.Android.csproj @@ -1,7 +1,7 @@  - net6.0-android + net8.0-android Exe osu.Android osu.Android diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj index d6a11fa924..cf2ec6e681 100644 --- a/osu.Desktop/osu.Desktop.csproj +++ b/osu.Desktop/osu.Desktop.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 WinExe true A free-to-win rhythm game. Rhythm is just a *click* away! diff --git a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj index 47c93fbd02..64da5412a8 100644 --- a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj +++ b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 Exe false diff --git a/osu.Game.Rulesets.Catch.Tests.Android/osu.Game.Rulesets.Catch.Tests.Android.csproj b/osu.Game.Rulesets.Catch.Tests.Android/osu.Game.Rulesets.Catch.Tests.Android.csproj index 4ee3219442..4b2e54be67 100644 --- a/osu.Game.Rulesets.Catch.Tests.Android/osu.Game.Rulesets.Catch.Tests.Android.csproj +++ b/osu.Game.Rulesets.Catch.Tests.Android/osu.Game.Rulesets.Catch.Tests.Android.csproj @@ -1,7 +1,7 @@  - net6.0-android + net8.0-android Exe osu.Game.Rulesets.Catch.Tests osu.Game.Rulesets.Catch.Tests.Android @@ -21,4 +21,4 @@ - \ No newline at end of file + diff --git a/osu.Game.Rulesets.Catch.Tests.iOS/osu.Game.Rulesets.Catch.Tests.iOS.csproj b/osu.Game.Rulesets.Catch.Tests.iOS/osu.Game.Rulesets.Catch.Tests.iOS.csproj index acf12bb0ac..9c262a752a 100644 --- a/osu.Game.Rulesets.Catch.Tests.iOS/osu.Game.Rulesets.Catch.Tests.iOS.csproj +++ b/osu.Game.Rulesets.Catch.Tests.iOS/osu.Game.Rulesets.Catch.Tests.iOS.csproj @@ -1,7 +1,7 @@  Exe - net6.0-ios + net8.0-ios 13.4 osu.Game.Rulesets.Catch.Tests osu.Game.Rulesets.Catch.Tests.iOS diff --git a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj index 0a77845343..619081c754 100644 --- a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj +++ b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj @@ -7,7 +7,7 @@ WinExe - net6.0 + net8.0 diff --git a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj index ecce7c1b3f..a5138ffb39 100644 --- a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj +++ b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Library true catch the fruit. to the beat. diff --git a/osu.Game.Rulesets.Mania.Tests.Android/osu.Game.Rulesets.Mania.Tests.Android.csproj b/osu.Game.Rulesets.Mania.Tests.Android/osu.Game.Rulesets.Mania.Tests.Android.csproj index 25335754d2..2866508a02 100644 --- a/osu.Game.Rulesets.Mania.Tests.Android/osu.Game.Rulesets.Mania.Tests.Android.csproj +++ b/osu.Game.Rulesets.Mania.Tests.Android/osu.Game.Rulesets.Mania.Tests.Android.csproj @@ -1,7 +1,7 @@  - net6.0-android + net8.0-android Exe osu.Game.Rulesets.Mania.Tests osu.Game.Rulesets.Mania.Tests.Android @@ -21,4 +21,4 @@ - \ No newline at end of file + diff --git a/osu.Game.Rulesets.Mania.Tests.iOS/osu.Game.Rulesets.Mania.Tests.iOS.csproj b/osu.Game.Rulesets.Mania.Tests.iOS/osu.Game.Rulesets.Mania.Tests.iOS.csproj index 51e07dd6c1..d51e541e95 100644 --- a/osu.Game.Rulesets.Mania.Tests.iOS/osu.Game.Rulesets.Mania.Tests.iOS.csproj +++ b/osu.Game.Rulesets.Mania.Tests.iOS/osu.Game.Rulesets.Mania.Tests.iOS.csproj @@ -1,7 +1,7 @@  Exe - net6.0-ios + net8.0-ios 13.4 osu.Game.Rulesets.Mania.Tests osu.Game.Rulesets.Mania.Tests.iOS diff --git a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj index 877b9c3ea4..eee06acdb8 100644 --- a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj +++ b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj @@ -7,7 +7,7 @@ WinExe - net6.0 + net8.0 diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj index 72f172188e..3bca938450 100644 --- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj +++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Library true smash the keys. to the beat. diff --git a/osu.Game.Rulesets.Osu.Tests.Android/osu.Game.Rulesets.Osu.Tests.Android.csproj b/osu.Game.Rulesets.Osu.Tests.Android/osu.Game.Rulesets.Osu.Tests.Android.csproj index e8a46a9828..b79de6d40b 100644 --- a/osu.Game.Rulesets.Osu.Tests.Android/osu.Game.Rulesets.Osu.Tests.Android.csproj +++ b/osu.Game.Rulesets.Osu.Tests.Android/osu.Game.Rulesets.Osu.Tests.Android.csproj @@ -1,7 +1,7 @@  - net6.0-android + net8.0-android Exe osu.Game.Rulesets.Osu.Tests osu.Game.Rulesets.Osu.Tests.Android @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/osu.Game.Rulesets.Osu.Tests.iOS/osu.Game.Rulesets.Osu.Tests.iOS.csproj b/osu.Game.Rulesets.Osu.Tests.iOS/osu.Game.Rulesets.Osu.Tests.iOS.csproj index 7d50deb8ba..cc0233d7fd 100644 --- a/osu.Game.Rulesets.Osu.Tests.iOS/osu.Game.Rulesets.Osu.Tests.iOS.csproj +++ b/osu.Game.Rulesets.Osu.Tests.iOS/osu.Game.Rulesets.Osu.Tests.iOS.csproj @@ -1,7 +1,7 @@  Exe - net6.0-ios + net8.0-ios 13.4 Exe osu.Game.Rulesets.Osu.Tests diff --git a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj index 9c248abd66..ea54c8d313 100644 --- a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj +++ b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj @@ -8,7 +8,7 @@ WinExe - net6.0 + net8.0 diff --git a/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj b/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj index 75656e2976..518ab362ca 100644 --- a/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj +++ b/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Library true click the circles. to the beat. diff --git a/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj b/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj index a639326ebd..ee973e8544 100644 --- a/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj +++ b/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj @@ -1,7 +1,7 @@  - net6.0-android + net8.0-android Exe osu.Game.Rulesets.Taiko.Tests osu.Game.Rulesets.Taiko.Tests.Android @@ -21,4 +21,4 @@ - \ No newline at end of file + diff --git a/osu.Game.Rulesets.Taiko.Tests.iOS/osu.Game.Rulesets.Taiko.Tests.iOS.csproj b/osu.Game.Rulesets.Taiko.Tests.iOS/osu.Game.Rulesets.Taiko.Tests.iOS.csproj index e648a11299..ee2d4d703e 100644 --- a/osu.Game.Rulesets.Taiko.Tests.iOS/osu.Game.Rulesets.Taiko.Tests.iOS.csproj +++ b/osu.Game.Rulesets.Taiko.Tests.iOS/osu.Game.Rulesets.Taiko.Tests.iOS.csproj @@ -1,7 +1,7 @@  Exe - net6.0-ios + net8.0-ios 13.4 osu.Game.Rulesets.Taiko.Tests osu.Game.Rulesets.Taiko.Tests.iOS diff --git a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj index 4eb6b0ab3d..26afd42445 100644 --- a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj +++ b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj @@ -7,7 +7,7 @@ WinExe - net6.0 + net8.0 diff --git a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj index f0e1cb8e8f..cacba55c2a 100644 --- a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj +++ b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Library true bash the drum. to the beat. diff --git a/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj b/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj index b745d91980..889f0a3583 100644 --- a/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj +++ b/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj @@ -1,7 +1,7 @@  - net6.0-android + net8.0-android Exe osu.Game.Tests osu.Game.Tests.Android diff --git a/osu.Game.Tests.iOS/osu.Game.Tests.iOS.csproj b/osu.Game.Tests.iOS/osu.Game.Tests.iOS.csproj index 79771fcd50..e4b9d2ba94 100644 --- a/osu.Game.Tests.iOS/osu.Game.Tests.iOS.csproj +++ b/osu.Game.Tests.iOS/osu.Game.Tests.iOS.csproj @@ -1,7 +1,7 @@  Exe - net6.0-ios + net8.0-ios 13.4 osu.Game.Tests osu.Game.Tests.iOS diff --git a/osu.Game.Tests/osu.Game.Tests.csproj b/osu.Game.Tests/osu.Game.Tests.csproj index 7b08524240..c0bbdfb4ed 100644 --- a/osu.Game.Tests/osu.Game.Tests.csproj +++ b/osu.Game.Tests/osu.Game.Tests.csproj @@ -10,7 +10,7 @@ WinExe - net6.0 + net8.0 tests.ruleset diff --git a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj index 3b00f103c4..8f1d7114b1 100644 --- a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj +++ b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj @@ -10,7 +10,7 @@ WinExe - net6.0 + net8.0 diff --git a/osu.Game.Tournament/osu.Game.Tournament.csproj b/osu.Game.Tournament/osu.Game.Tournament.csproj index ab67e490cd..c8578ac464 100644 --- a/osu.Game.Tournament/osu.Game.Tournament.csproj +++ b/osu.Game.Tournament/osu.Game.Tournament.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Library true tools for tournaments. diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index a5d212bffe..caffebd063 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Library true 10 diff --git a/osu.iOS/osu.iOS.csproj b/osu.iOS/osu.iOS.csproj index 2d61b73125..6e9449de95 100644 --- a/osu.iOS/osu.iOS.csproj +++ b/osu.iOS/osu.iOS.csproj @@ -1,6 +1,6 @@  - net6.0-ios + net8.0-ios 13.4 Exe true From f06642c315eb7b35298fd4f1f8e3ff9e9d075766 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 00:51:43 +0900 Subject: [PATCH 450/651] Upgrade to C# 12 --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index b08283f071..2d289d0f22 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@  - 10.0 + 12.0 true enable From c8b4ff2b47d53f0a1397f05f481f3d47d70aca0e Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 00:51:55 +0900 Subject: [PATCH 451/651] Fix compile error (reserved name) --- osu.Game/IO/HardLinkHelper.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game/IO/HardLinkHelper.cs b/osu.Game/IO/HardLinkHelper.cs index 619bfdad6e..ad57f87d10 100644 --- a/osu.Game/IO/HardLinkHelper.cs +++ b/osu.Game/IO/HardLinkHelper.cs @@ -153,12 +153,12 @@ namespace osu.Game.IO public static extern int link(string oldpath, string newpath); [DllImport("libc", SetLastError = true)] - private static extern int stat(string pathname, out struct_stat statbuf); + private static extern int stat(string pathname, out Stat statbuf); // ReSharper disable once InconsistentNaming // Struct layout is likely non-portable across unices. Tread with caution. [StructLayout(LayoutKind.Sequential)] - private struct struct_stat + private struct Stat { public readonly long st_dev; public readonly long st_ino; @@ -170,14 +170,14 @@ namespace osu.Game.IO public readonly long st_size; public readonly long st_blksize; public readonly long st_blocks; - public readonly timespec st_atim; - public readonly timespec st_mtim; - public readonly timespec st_ctim; + public readonly Timespec st_atim; + public readonly Timespec st_mtim; + public readonly Timespec st_ctim; } // ReSharper disable once InconsistentNaming [StructLayout(LayoutKind.Sequential)] - private struct timespec + private struct Timespec { public readonly long tv_sec; public readonly long tv_nsec; From 630278f6e727ce1b7d3cc727e60087db4fd61316 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 01:08:15 +0900 Subject: [PATCH 452/651] Replace UseMauiEssentials with PackageReference --- osu.Android/osu.Android.csproj | 4 +++- osu.iOS/osu.iOS.csproj | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/osu.Android/osu.Android.csproj b/osu.Android/osu.Android.csproj index 17e049a569..0e79e0ab3e 100644 --- a/osu.Android/osu.Android.csproj +++ b/osu.Android/osu.Android.csproj @@ -5,7 +5,6 @@ Exe osu.Android osu.Android - true false 0.0.0 @@ -19,4 +18,7 @@ + + + diff --git a/osu.iOS/osu.iOS.csproj b/osu.iOS/osu.iOS.csproj index 6e9449de95..19c0c610b5 100644 --- a/osu.iOS/osu.iOS.csproj +++ b/osu.iOS/osu.iOS.csproj @@ -3,7 +3,6 @@ net8.0-ios 13.4 Exe - true 0.1.0 $(Version) $(Version) @@ -16,4 +15,7 @@ + + + From a217a7f8cf74de72a416cda75deb18fdcb6d0712 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 01:11:58 +0900 Subject: [PATCH 453/651] Adjust CI workflows --- .github/workflows/ci.yml | 23 +++++++------------ .../workflows/update-web-mod-definitions.yml | 4 ++-- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 103e4dbc30..722e8910d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,17 +15,10 @@ jobs: - name: Checkout uses: actions/checkout@v3 - # FIXME: Tools won't run in .NET 6.0 unless you install 3.1.x LTS side by side. - # https://itnext.io/how-to-support-multiple-net-sdks-in-github-actions-workflows-b988daa884e - - name: Install .NET 3.1.x LTS + - name: Install .NET 8.0.x uses: actions/setup-dotnet@v3 with: - dotnet-version: "3.1.x" - - - name: Install .NET 6.0.x - uses: actions/setup-dotnet@v3 - with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Restore Tools run: dotnet tool restore @@ -79,10 +72,10 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Install .NET 6.0.x + - name: Install .NET 8.0.x uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Compile run: dotnet build -c Debug -warnaserror osu.Desktop.slnf @@ -114,10 +107,10 @@ jobs: distribution: microsoft java-version: 11 - - name: Install .NET 6.0.x + - name: Install .NET 8.0.x uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Install .NET workloads run: dotnet workload install maui-android @@ -135,10 +128,10 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Install .NET 6.0.x + - name: Install .NET 8.0.x uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Install .NET Workloads run: dotnet workload install maui-ios diff --git a/.github/workflows/update-web-mod-definitions.yml b/.github/workflows/update-web-mod-definitions.yml index 32d3d37ffe..5827a6cdbf 100644 --- a/.github/workflows/update-web-mod-definitions.yml +++ b/.github/workflows/update-web-mod-definitions.yml @@ -12,10 +12,10 @@ jobs: name: Update osu-web mod definitions runs-on: ubuntu-latest steps: - - name: Install .NET 6.0.x + - name: Install .NET 8.0.x uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Checkout ppy/osu uses: actions/checkout@v3 From dda691b8c219f104a938d5a8c0bc29a88acfc19e Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 01:14:55 +0900 Subject: [PATCH 454/651] Fix NVAPI compile error --- osu.Desktop/NVAPI.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Desktop/NVAPI.cs b/osu.Desktop/NVAPI.cs index bb3a59cc7f..a34b762738 100644 --- a/osu.Desktop/NVAPI.cs +++ b/osu.Desktop/NVAPI.cs @@ -456,7 +456,7 @@ namespace osu.Desktop [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NVAPI.UNICODE_STRING_MAX)] public string ProfileName; - [MarshalAs(UnmanagedType.ByValArray)] + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public uint[] GPUSupport; public uint IsPredefined; From 38ed426f8fa90c2bfcd816317349767f1502082d Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 02:03:37 +0900 Subject: [PATCH 455/651] Fix more compiler warnings/errors --- .../ruleset-empty/Directory.Build.props | 10 ++++ Templates/Rulesets/ruleset-empty/app.manifest | 46 +++++++++++++++++++ .../ruleset-example/Directory.Build.props | 10 ++++ .../Rulesets/ruleset-example/app.manifest | 46 +++++++++++++++++++ .../Directory.Build.props | 10 ++++ .../ruleset-scrolling-empty/app.manifest | 46 +++++++++++++++++++ .../Directory.Build.props | 10 ++++ .../ruleset-scrolling-example/app.manifest | 46 +++++++++++++++++++ 8 files changed, 224 insertions(+) create mode 100644 Templates/Rulesets/ruleset-empty/Directory.Build.props create mode 100644 Templates/Rulesets/ruleset-empty/app.manifest create mode 100644 Templates/Rulesets/ruleset-example/Directory.Build.props create mode 100644 Templates/Rulesets/ruleset-example/app.manifest create mode 100644 Templates/Rulesets/ruleset-scrolling-empty/Directory.Build.props create mode 100644 Templates/Rulesets/ruleset-scrolling-empty/app.manifest create mode 100644 Templates/Rulesets/ruleset-scrolling-example/Directory.Build.props create mode 100644 Templates/Rulesets/ruleset-scrolling-example/app.manifest diff --git a/Templates/Rulesets/ruleset-empty/Directory.Build.props b/Templates/Rulesets/ruleset-empty/Directory.Build.props new file mode 100644 index 0000000000..74d05ff690 --- /dev/null +++ b/Templates/Rulesets/ruleset-empty/Directory.Build.props @@ -0,0 +1,10 @@ + + + + $(MSBuildThisFileDirectory)app.manifest + + + true + $(NoWarn);CS1591 + + diff --git a/Templates/Rulesets/ruleset-empty/app.manifest b/Templates/Rulesets/ruleset-empty/app.manifest new file mode 100644 index 0000000000..1c1e5f540c --- /dev/null +++ b/Templates/Rulesets/ruleset-empty/app.manifest @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + diff --git a/Templates/Rulesets/ruleset-example/Directory.Build.props b/Templates/Rulesets/ruleset-example/Directory.Build.props new file mode 100644 index 0000000000..74d05ff690 --- /dev/null +++ b/Templates/Rulesets/ruleset-example/Directory.Build.props @@ -0,0 +1,10 @@ + + + + $(MSBuildThisFileDirectory)app.manifest + + + true + $(NoWarn);CS1591 + + diff --git a/Templates/Rulesets/ruleset-example/app.manifest b/Templates/Rulesets/ruleset-example/app.manifest new file mode 100644 index 0000000000..1c1e5f540c --- /dev/null +++ b/Templates/Rulesets/ruleset-example/app.manifest @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + diff --git a/Templates/Rulesets/ruleset-scrolling-empty/Directory.Build.props b/Templates/Rulesets/ruleset-scrolling-empty/Directory.Build.props new file mode 100644 index 0000000000..74d05ff690 --- /dev/null +++ b/Templates/Rulesets/ruleset-scrolling-empty/Directory.Build.props @@ -0,0 +1,10 @@ + + + + $(MSBuildThisFileDirectory)app.manifest + + + true + $(NoWarn);CS1591 + + diff --git a/Templates/Rulesets/ruleset-scrolling-empty/app.manifest b/Templates/Rulesets/ruleset-scrolling-empty/app.manifest new file mode 100644 index 0000000000..1c1e5f540c --- /dev/null +++ b/Templates/Rulesets/ruleset-scrolling-empty/app.manifest @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + diff --git a/Templates/Rulesets/ruleset-scrolling-example/Directory.Build.props b/Templates/Rulesets/ruleset-scrolling-example/Directory.Build.props new file mode 100644 index 0000000000..74d05ff690 --- /dev/null +++ b/Templates/Rulesets/ruleset-scrolling-example/Directory.Build.props @@ -0,0 +1,10 @@ + + + + $(MSBuildThisFileDirectory)app.manifest + + + true + $(NoWarn);CS1591 + + diff --git a/Templates/Rulesets/ruleset-scrolling-example/app.manifest b/Templates/Rulesets/ruleset-scrolling-example/app.manifest new file mode 100644 index 0000000000..1c1e5f540c --- /dev/null +++ b/Templates/Rulesets/ruleset-scrolling-example/app.manifest @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + From ec4f3577c0659709a26383af1c3818593aef1ebc Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 02:09:00 +0900 Subject: [PATCH 456/651] Use Xcode 15.2 --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 722e8910d5..de902df93f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -136,5 +136,8 @@ jobs: - name: Install .NET Workloads run: dotnet workload install maui-ios + - name: Select Xcode 15.2 + run: sudo xcode-select -s /Applications/Xcode_15.2.app/Contents/Developer + - name: Build run: dotnet build -c Debug osu.iOS From 19ea4842400f45cb78cf55b00cee69669c5b1369 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 02:18:22 +0900 Subject: [PATCH 457/651] Adjust pragma disable to fix Android compile --- osu.Android/OsuGameActivity.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Android/OsuGameActivity.cs b/osu.Android/OsuGameActivity.cs index 33ffed432e..bbee491d90 100644 --- a/osu.Android/OsuGameActivity.cs +++ b/osu.Android/OsuGameActivity.cs @@ -72,9 +72,9 @@ namespace osu.Android Debug.Assert(Resources?.DisplayMetrics != null); Point displaySize = new Point(); -#pragma warning disable 618 // GetSize is deprecated +#pragma warning disable CA1422 // GetSize is deprecated WindowManager.DefaultDisplay.GetSize(displaySize); -#pragma warning restore 618 +#pragma warning restore CA1422 float smallestWidthDp = Math.Min(displaySize.X, displaySize.Y) / Resources.DisplayMetrics.Density; bool isTablet = smallestWidthDp >= 600f; From 497213d529f57e1f057f69720d8fe7e3e22c806d Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 02:25:52 +0900 Subject: [PATCH 458/651] Re-enable LLVM for now --- osu.Android/osu.Android.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/osu.Android/osu.Android.csproj b/osu.Android/osu.Android.csproj index 0e79e0ab3e..be2e669728 100644 --- a/osu.Android/osu.Android.csproj +++ b/osu.Android/osu.Android.csproj @@ -5,8 +5,6 @@ Exe osu.Android osu.Android - - false 0.0.0 1 $(Version) From 20504c55ef02b83ea9c575d3b435148a4eff8931 Mon Sep 17 00:00:00 2001 From: Loreos7 Date: Fri, 2 Feb 2024 15:32:55 +0300 Subject: [PATCH 459/651] localise storage error popup dialog --- .../Localisation/StorageErrorDialogStrings.cs | 49 +++++++++++++++++++ osu.Game/Screens/Menu/StorageErrorDialog.cs | 17 ++++--- 2 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 osu.Game/Localisation/StorageErrorDialogStrings.cs diff --git a/osu.Game/Localisation/StorageErrorDialogStrings.cs b/osu.Game/Localisation/StorageErrorDialogStrings.cs new file mode 100644 index 0000000000..6ad388dd1f --- /dev/null +++ b/osu.Game/Localisation/StorageErrorDialogStrings.cs @@ -0,0 +1,49 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Localisation; + +namespace osu.Game.Localisation +{ + public static class StorageErrorDialogStrings + { + private const string prefix = @"osu.Game.Resources.Localisation.StorageErrorDialog"; + + /// + /// "osu! storage error" + /// + public static LocalisableString StorageError => new TranslatableString(getKey(@"storage_error"), @"osu! storage error"); + + /// + /// "The specified osu! data location ("{0}") is not accessible. If it is on external storage, please reconnect the device and try again." + /// + public static LocalisableString LocationIsNotAccessible(string? loc) => new TranslatableString(getKey(@"location_is_not_accessible"), @"The specified osu! data location (""{0}"") is not accessible. If it is on external storage, please reconnect the device and try again.", loc); + + /// + /// "The specified osu! data location ("{0}") is empty. If you have moved the files, please close osu! and move them back." + /// + public static LocalisableString LocationIsEmpty(string? loc2) => new TranslatableString(getKey(@"location_is_empty"), @"The specified osu! data location (""{0}"") is empty. If you have moved the files, please close osu! and move them back.", loc2); + + /// + /// "Try again" + /// + public static LocalisableString TryAgain => new TranslatableString(getKey(@"try_again"), @"Try again"); + + /// + /// "Use default location until restart" + /// + public static LocalisableString UseDefaultLocation => new TranslatableString(getKey(@"use_default_location"), @"Use default location until restart"); + + /// + /// "Reset to default location" + /// + public static LocalisableString ResetToDefaultLocation => new TranslatableString(getKey(@"reset_to_default_location"), @"Reset to default location"); + + /// + /// "Start fresh at specified location" + /// + public static LocalisableString StartFresh => new TranslatableString(getKey(@"start_fresh"), @"Start fresh at specified location"); + + private static string getKey(string key) => $@"{prefix}:{key}"; + } +} diff --git a/osu.Game/Screens/Menu/StorageErrorDialog.cs b/osu.Game/Screens/Menu/StorageErrorDialog.cs index dd43289873..b48046d190 100644 --- a/osu.Game/Screens/Menu/StorageErrorDialog.cs +++ b/osu.Game/Screens/Menu/StorageErrorDialog.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Graphics.Sprites; using osu.Game.IO; +using osu.Game.Localisation; using osu.Game.Overlays; using osu.Game.Overlays.Dialog; @@ -17,7 +18,7 @@ namespace osu.Game.Screens.Menu public StorageErrorDialog(OsuStorage storage, OsuStorageError error) { - HeaderText = "osu! storage error"; + HeaderText = StorageErrorDialogStrings.StorageError; Icon = FontAwesome.Solid.ExclamationTriangle; var buttons = new List(); @@ -25,13 +26,13 @@ namespace osu.Game.Screens.Menu switch (error) { case OsuStorageError.NotAccessible: - BodyText = $"The specified osu! data location (\"{storage.CustomStoragePath}\") is not accessible. If it is on external storage, please reconnect the device and try again."; + BodyText = StorageErrorDialogStrings.LocationIsNotAccessible(storage.CustomStoragePath); buttons.AddRange(new PopupDialogButton[] { new PopupDialogCancelButton { - Text = "Try again", + Text = StorageErrorDialogStrings.TryAgain, Action = () => { if (!storage.TryChangeToCustomStorage(out var nextError)) @@ -40,29 +41,29 @@ namespace osu.Game.Screens.Menu }, new PopupDialogCancelButton { - Text = "Use default location until restart", + Text = StorageErrorDialogStrings.UseDefaultLocation, }, new PopupDialogOkButton { - Text = "Reset to default location", + Text = StorageErrorDialogStrings.ResetToDefaultLocation, Action = storage.ResetCustomStoragePath }, }); break; case OsuStorageError.AccessibleButEmpty: - BodyText = $"The specified osu! data location (\"{storage.CustomStoragePath}\") is empty. If you have moved the files, please close osu! and move them back."; + BodyText = StorageErrorDialogStrings.LocationIsEmpty(storage.CustomStoragePath); // Todo: Provide the option to search for the files similar to migration. buttons.AddRange(new PopupDialogButton[] { new PopupDialogCancelButton { - Text = "Start fresh at specified location" + Text = StorageErrorDialogStrings.StartFresh }, new PopupDialogOkButton { - Text = "Reset to default location", + Text = StorageErrorDialogStrings.ResetToDefaultLocation, Action = storage.ResetCustomStoragePath }, }); From 8e8ba9e77f94a33f06a05190b86c76da90b3c3a6 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 21:36:41 +0900 Subject: [PATCH 460/651] Fix more CI inspections --- osu.Desktop/NVAPI.cs | 2 +- osu.Game.Tests/NonVisual/TaskChainTest.cs | 2 +- osu.Game/Online/Chat/WebSocketChatClient.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Desktop/NVAPI.cs b/osu.Desktop/NVAPI.cs index a34b762738..78a814c585 100644 --- a/osu.Desktop/NVAPI.cs +++ b/osu.Desktop/NVAPI.cs @@ -138,7 +138,7 @@ namespace osu.Desktop return false; // Make sure that this is a laptop. - var gpus = new IntPtr[64]; + IntPtr[] gpus = new IntPtr[64]; if (checkError(EnumPhysicalGPUs(gpus, out int gpuCount))) return false; diff --git a/osu.Game.Tests/NonVisual/TaskChainTest.cs b/osu.Game.Tests/NonVisual/TaskChainTest.cs index ad1a3fd63f..2ac89efb69 100644 --- a/osu.Game.Tests/NonVisual/TaskChainTest.cs +++ b/osu.Game.Tests/NonVisual/TaskChainTest.cs @@ -58,7 +58,7 @@ namespace osu.Game.Tests.NonVisual var task3 = addTask(); // Cancel task2, allow task3 to complete. - task2.cancellation.Cancel(); + await task2.cancellation.CancelAsync(); task2.mutex.Set(); task3.mutex.Set(); diff --git a/osu.Game/Online/Chat/WebSocketChatClient.cs b/osu.Game/Online/Chat/WebSocketChatClient.cs index b74f8bec4b..8e1b501b25 100644 --- a/osu.Game/Online/Chat/WebSocketChatClient.cs +++ b/osu.Game/Online/Chat/WebSocketChatClient.cs @@ -61,7 +61,7 @@ namespace osu.Game.Online.Chat { await client.SendAsync(new StartChatRequest()).ConfigureAwait(false); Logger.Log(@"Now listening to websocket chat messages.", LoggingTarget.Network); - chatStartCancellationSource.Cancel(); + await chatStartCancellationSource.CancelAsync().ConfigureAwait(false); } catch (Exception ex) { From 50f9c6102975a6fac1c2ddba4bdd1f2d203e4862 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 22:34:48 +0900 Subject: [PATCH 461/651] Fix multiplayer tests --- .../Visual/OnlinePlay/OnlinePlayTestScene.cs | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs b/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs index 0118d60dca..eebc3503bc 100644 --- a/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs +++ b/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestScene.cs @@ -30,7 +30,7 @@ namespace osu.Game.Tests.Visual.OnlinePlay /// /// All dependencies required for online play components and screens. /// - protected OnlinePlayTestSceneDependencies OnlinePlayDependencies => dependencies.OnlinePlayDependencies; + protected OnlinePlayTestSceneDependencies OnlinePlayDependencies => dependencies.OnlinePlayDependencies!; protected override Container Content => content; @@ -48,12 +48,7 @@ namespace osu.Game.Tests.Visual.OnlinePlay } protected sealed override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) - { - return dependencies = new DelegatedDependencyContainer(base.CreateChildDependencies(parent)) - { - OnlinePlayDependencies = initDependencies() - }; - } + => dependencies = new DelegatedDependencyContainer(base.CreateChildDependencies(parent)); public override void SetUpSteps() { @@ -62,7 +57,9 @@ namespace osu.Game.Tests.Visual.OnlinePlay AddStep("setup dependencies", () => { // Reset the room dependencies to a fresh state. - dependencies.OnlinePlayDependencies = initDependencies(); + dependencies.OnlinePlayDependencies = CreateOnlinePlayDependencies(); + drawableDependenciesContainer.Clear(); + drawableDependenciesContainer.AddRange(dependencies.OnlinePlayDependencies.DrawableComponents); var handler = OnlinePlayDependencies.RequestsHandler; @@ -88,14 +85,6 @@ namespace osu.Game.Tests.Visual.OnlinePlay }); } - private OnlinePlayTestSceneDependencies initDependencies() - { - var newDependencies = CreateOnlinePlayDependencies(); - drawableDependenciesContainer.Clear(); - drawableDependenciesContainer.AddRange(newDependencies.DrawableComponents); - return newDependencies; - } - /// /// Creates the room dependencies. Called every . /// @@ -112,7 +101,7 @@ namespace osu.Game.Tests.Visual.OnlinePlay /// /// The online play dependencies. /// - public OnlinePlayTestSceneDependencies OnlinePlayDependencies { get; set; } = null!; + public OnlinePlayTestSceneDependencies? OnlinePlayDependencies { get; set; } private readonly IReadOnlyDependencyContainer parent; private readonly DependencyContainer injectableDependencies; @@ -128,10 +117,10 @@ namespace osu.Game.Tests.Visual.OnlinePlay } public object Get(Type type) - => OnlinePlayDependencies.Get(type) ?? parent.Get(type); + => OnlinePlayDependencies?.Get(type) ?? parent.Get(type); public object Get(Type type, CacheInfo info) - => OnlinePlayDependencies.Get(type, info) ?? parent.Get(type, info); + => OnlinePlayDependencies?.Get(type, info) ?? parent.Get(type, info); public void Inject(T instance) where T : class, IDependencyInjectionCandidate From 2ab967f783fd25d95e9142bffb79eb78e03e7cbc Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 13:27:26 -0500 Subject: [PATCH 462/651] Increase precision of aggregate volume rounding It should be large enough to account for true accuracy but small enough to disregard any hair-thin inaccuracy found at the very end of the float value. --- osu.Game/Screens/Play/PlayerLoader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 40ffa844da..aafa93c122 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -551,7 +551,7 @@ namespace osu.Game.Screens.Play if (!muteWarningShownOnce.Value) { // Checks if the notification has not been shown yet and also if master volume is muted, track/music volume is muted or if the whole game is muted. - if (volumeOverlay?.IsMuted.Value == true || Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100 <= volume_requirement) + if (volumeOverlay?.IsMuted.Value == true || Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 1e6) / 1e6 <= volume_requirement) { notificationOverlay?.Post(new MutedNotification()); muteWarningShownOnce.Value = true; @@ -582,7 +582,7 @@ namespace osu.Game.Screens.Play // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. - if (Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 100) / 100 <= volume_requirement) + if (Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 1e6) / 1e6 <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. const double target = 0.1; From 9a5348598af58008e0c22897964f81bf27d34ee0 Mon Sep 17 00:00:00 2001 From: Mike Will Date: Fri, 2 Feb 2024 14:22:24 -0500 Subject: [PATCH 463/651] Replace aggregate rounding method with a float cast --- osu.Game/Screens/Play/PlayerLoader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index aafa93c122..6154e443ef 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -551,7 +551,7 @@ namespace osu.Game.Screens.Play if (!muteWarningShownOnce.Value) { // Checks if the notification has not been shown yet and also if master volume is muted, track/music volume is muted or if the whole game is muted. - if (volumeOverlay?.IsMuted.Value == true || Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 1e6) / 1e6 <= volume_requirement) + if (volumeOverlay?.IsMuted.Value == true || (float)(audioManager.Volume.Value * audioManager.VolumeTrack.Value) <= volume_requirement) { notificationOverlay?.Post(new MutedNotification()); muteWarningShownOnce.Value = true; @@ -582,7 +582,7 @@ namespace osu.Game.Screens.Play // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. - if (Math.Floor(audioManager.Volume.Value * audioManager.VolumeTrack.Value * 1e6) / 1e6 <= volume_requirement) + if ((float)(audioManager.Volume.Value * audioManager.VolumeTrack.Value) <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. const double target = 0.1; From dde7e068a4ae490ade2c49650996da50c60e939b Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 2 Feb 2024 22:28:47 +0300 Subject: [PATCH 464/651] Incorporate new unstable rate algo --- .../Rulesets/Scoring/HitEventExtensions.cs | 39 ++++++++++++------- osu.sln.DotSettings | 1 + 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs index 9fb61c6cd9..c3ad8980fe 100644 --- a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs +++ b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs @@ -11,7 +11,7 @@ namespace osu.Game.Rulesets.Scoring public static class HitEventExtensions { /// - /// Calculates the "unstable rate" for a sequence of s. + /// Calculates the "unstable rate" for a sequence of s using Welford's online algorithm. /// /// /// A non-null value if unstable rate could be calculated, @@ -21,9 +21,30 @@ namespace osu.Game.Rulesets.Scoring { Debug.Assert(hitEvents.All(ev => ev.GameplayRate != null)); - // Division by gameplay rate is to account for TimeOffset scaling with gameplay rate. - double[] timeOffsets = hitEvents.Where(affectsUnstableRate).Select(ev => ev.TimeOffset / ev.GameplayRate!.Value).ToArray(); - return 10 * standardDeviation(timeOffsets); + double currentValue; + int k = 0; + double m = 0; + double s = 0; + double mNext; + + foreach (var e in hitEvents) + { + if (!affectsUnstableRate(e)) + continue; + + // Division by gameplay rate is to account for TimeOffset scaling with gameplay rate. + currentValue = e.TimeOffset / e.GameplayRate!.Value; + + k++; + mNext = m + (currentValue - m) / k; + s += (currentValue - m) * (currentValue - mNext); + m = mNext; + } + + if (k == 0) + return null; + + return 10.0 * Math.Sqrt(s / k); } /// @@ -44,15 +65,5 @@ namespace osu.Game.Rulesets.Scoring } private static bool affectsUnstableRate(HitEvent e) => !(e.HitObject.HitWindows is HitWindows.EmptyHitWindows) && e.Result.IsHit(); - - private static double? standardDeviation(double[] timeOffsets) - { - if (timeOffsets.Length == 0) - return null; - - double mean = timeOffsets.Average(); - double squares = timeOffsets.Select(offset => Math.Pow(offset - mean, 2)).Sum(); - return Math.Sqrt(squares / timeOffsets.Length); - } } } diff --git a/osu.sln.DotSettings b/osu.sln.DotSettings index 1bf8aa7b0b..ef557cbbfc 100644 --- a/osu.sln.DotSettings +++ b/osu.sln.DotSettings @@ -1041,4 +1041,5 @@ private void load() True True True + True True From 4d324a30573f9cd6c4dcff2e0c336e26e66a574a Mon Sep 17 00:00:00 2001 From: Loreos7 Date: Sat, 3 Feb 2024 00:08:36 +0300 Subject: [PATCH 465/651] localise remaining parts of the game settings --- .../TaikoSettingsSubsection.cs | 5 +++-- osu.Game/Localisation/AudioSettingsStrings.cs | 15 +++++++++++++++ osu.Game/Localisation/DebugSettingsStrings.cs | 5 +++++ osu.Game/Localisation/GraphicsSettingsStrings.cs | 5 +++++ osu.Game/Localisation/RulesetSettingsStrings.cs | 5 +++++ .../Sections/Audio/AudioOffsetAdjustControl.cs | 6 +++--- .../Sections/DebugSettings/GeneralSettings.cs | 2 +- .../Settings/Sections/Graphics/LayoutSettings.cs | 2 +- 8 files changed, 38 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs b/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs index 9fe861c08c..84dea474c5 100644 --- a/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs +++ b/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs @@ -1,9 +1,10 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Localisation; +using osu.Game.Localisation; using osu.Game.Overlays.Settings; using osu.Game.Rulesets.Taiko.Configuration; @@ -27,7 +28,7 @@ namespace osu.Game.Rulesets.Taiko { new SettingsEnumDropdown { - LabelText = "Touch control scheme", + LabelText = RulesetSettingsStrings.TouchControlScheme, Current = config.GetBindable(TaikoRulesetSetting.TouchControlScheme) } }; diff --git a/osu.Game/Localisation/AudioSettingsStrings.cs b/osu.Game/Localisation/AudioSettingsStrings.cs index 0f0f560df9..d93de59cd2 100644 --- a/osu.Game/Localisation/AudioSettingsStrings.cs +++ b/osu.Game/Localisation/AudioSettingsStrings.cs @@ -64,6 +64,21 @@ namespace osu.Game.Localisation /// public static LocalisableString AudioOffset => new TranslatableString(getKey(@"audio_offset"), @"Audio offset"); + /// + /// "Play a few beatmaps to receive a suggested offset!" + /// + public static LocalisableString SuggestedOffsetNote => new TranslatableString(getKey(@"suggested_offset_note"), @"Play a few beatmaps to receive a suggested offset!"); + + /// + /// "Based on the last {0} play(s), the suggested offset is {1} ms" + /// + public static LocalisableString SuggestedOffsetValueReceived(int plays, double? value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms", plays, value); + + /// + /// "Apply suggested offset" + /// + public static LocalisableString ApplySuggestedOffset => new TranslatableString(getKey(@"apply_suggested_offset"), @"Apply suggested offset"); + /// /// "Offset wizard" /// diff --git a/osu.Game/Localisation/DebugSettingsStrings.cs b/osu.Game/Localisation/DebugSettingsStrings.cs index 18fd3e83da..066c07858c 100644 --- a/osu.Game/Localisation/DebugSettingsStrings.cs +++ b/osu.Game/Localisation/DebugSettingsStrings.cs @@ -29,6 +29,11 @@ namespace osu.Game.Localisation /// public static LocalisableString ImportFiles => new TranslatableString(getKey(@"import_files"), @"Import files"); + /// + /// "Run latency certifier" + /// + public static LocalisableString RunLatencyCertifier => new TranslatableString(getKey(@"run_latency_certifier"), @"Run latency certifier"); + /// /// "Memory" /// diff --git a/osu.Game/Localisation/GraphicsSettingsStrings.cs b/osu.Game/Localisation/GraphicsSettingsStrings.cs index 1d14b0a596..d3952d0b4c 100644 --- a/osu.Game/Localisation/GraphicsSettingsStrings.cs +++ b/osu.Game/Localisation/GraphicsSettingsStrings.cs @@ -159,6 +159,11 @@ namespace osu.Game.Localisation /// public static LocalisableString MinimiseOnFocusLoss => new TranslatableString(getKey(@"minimise_on_focus_loss"), @"Minimise osu! when switching to another app"); + /// + /// "Shrink game to avoid cameras and notches" + /// + public static LocalisableString ShrinkGameOnMobile => new TranslatableString(getKey(@"shrink_game_on_mobile"), @"Shrink game to avoid cameras and notches"); + private static string getKey(string key) => $@"{prefix}:{key}"; } } diff --git a/osu.Game/Localisation/RulesetSettingsStrings.cs b/osu.Game/Localisation/RulesetSettingsStrings.cs index 3fa7656cbb..e3d51f1124 100644 --- a/osu.Game/Localisation/RulesetSettingsStrings.cs +++ b/osu.Game/Localisation/RulesetSettingsStrings.cs @@ -84,6 +84,11 @@ namespace osu.Game.Localisation /// public static LocalisableString ScrollSpeedTooltip(int scrollTime, int scrollSpeed) => new TranslatableString(getKey(@"ruleset"), @"{0}ms (speed {1})", scrollTime, scrollSpeed); + /// + /// "Touch control scheme" + /// + public static LocalisableString TouchControlScheme => new TranslatableString(getKey(@"touch_control_scheme"), @"Touch control scheme"); + private static string getKey(string key) => $@"{prefix}:{key}"; } } diff --git a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs index ef1691534f..71c357c065 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs @@ -91,7 +91,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio applySuggestion = new RoundedButton { RelativeSizeAxes = Axes.X, - Text = "Apply suggested offset", + Text = AudioSettingsStrings.ApplySuggestedOffset, Action = () => { if (SuggestedOffset.Value.HasValue) @@ -155,8 +155,8 @@ namespace osu.Game.Overlays.Settings.Sections.Audio private void updateHintText() { hintText.Text = SuggestedOffset.Value == null - ? @"Play a few beatmaps to receive a suggested offset!" - : $@"Based on the last {averageHitErrorHistory.Count} play(s), the suggested offset is {SuggestedOffset.Value:N0} ms."; + ? AudioSettingsStrings.SuggestedOffsetNote + : AudioSettingsStrings.SuggestedOffsetValueReceived(averageHitErrorHistory.Count, SuggestedOffset.Value); applySuggestion.Enabled.Value = SuggestedOffset.Value != null; } diff --git a/osu.Game/Overlays/Settings/Sections/DebugSettings/GeneralSettings.cs b/osu.Game/Overlays/Settings/Sections/DebugSettings/GeneralSettings.cs index 049ccedf37..df46e38491 100644 --- a/osu.Game/Overlays/Settings/Sections/DebugSettings/GeneralSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/DebugSettings/GeneralSettings.cs @@ -39,7 +39,7 @@ namespace osu.Game.Overlays.Settings.Sections.DebugSettings }, new SettingsButton { - Text = @"Run latency certifier", + Text = DebugSettingsStrings.RunLatencyCertifier, Action = () => performer?.PerformFromScreen(menu => menu.Push(new LatencyCertifierScreen())) } }; diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs index 71afec88d4..4eb3e54708 100644 --- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs @@ -115,7 +115,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics }, safeAreaConsiderationsCheckbox = new SettingsCheckbox { - LabelText = "Shrink game to avoid cameras and notches", + LabelText = GraphicsSettingsStrings.ShrinkGameOnMobile, Current = osuConfig.GetBindable(OsuSetting.SafeAreaConsiderations), }, new SettingsSlider From 9706836778a8fb3e83c663dc9a957f2265001a64 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Sat, 3 Feb 2024 06:16:24 +0900 Subject: [PATCH 466/651] Update system requirements --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d7e710f392..dc5809d46b 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,8 @@ If you are just looking to give the game a whirl, you can grab the latest releas ### Latest release: -| [Windows 8.1+ (x64)](https://github.com/ppy/osu/releases/latest/download/install.exe) | macOS 10.15+ ([Intel](https://github.com/ppy/osu/releases/latest/download/osu.app.Intel.zip), [Apple Silicon](https://github.com/ppy/osu/releases/latest/download/osu.app.Apple.Silicon.zip)) | [Linux (x64)](https://github.com/ppy/osu/releases/latest/download/osu.AppImage) | [iOS 13.4+](https://osu.ppy.sh/home/testflight) | [Android 5+](https://github.com/ppy/osu/releases/latest/download/sh.ppy.osulazer.apk) | -| ------------- | ------------- | ------------- | ------------- | ------------- | +| [Windows 10+ (x64)](https://github.com/ppy/osu/releases/latest/download/install.exe) | macOS 12+ ([Intel](https://github.com/ppy/osu/releases/latest/download/osu.app.Intel.zip), [Apple Silicon](https://github.com/ppy/osu/releases/latest/download/osu.app.Apple.Silicon.zip)) | [Linux (x64)](https://github.com/ppy/osu/releases/latest/download/osu.AppImage) | [iOS 13.4+](https://osu.ppy.sh/home/testflight) | [Android 5+](https://github.com/ppy/osu/releases/latest/download/sh.ppy.osulazer.apk) | +|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------- | ------------- | ------------- | You can also generally download a version for your current device from the [osu! site](https://osu.ppy.sh/home/download). From 57bc5ee04fd68fc317dea18c51d6d473f1eb80dd Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 3 Feb 2024 00:19:04 +0300 Subject: [PATCH 467/651] Improve readability --- osu.Game/Rulesets/Scoring/HitEventExtensions.cs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs index c3ad8980fe..ab36a54d3d 100644 --- a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs +++ b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs @@ -21,30 +21,28 @@ namespace osu.Game.Rulesets.Scoring { Debug.Assert(hitEvents.All(ev => ev.GameplayRate != null)); - double currentValue; - int k = 0; + int count = 0; double m = 0; double s = 0; - double mNext; foreach (var e in hitEvents) { if (!affectsUnstableRate(e)) continue; - // Division by gameplay rate is to account for TimeOffset scaling with gameplay rate. - currentValue = e.TimeOffset / e.GameplayRate!.Value; + count++; - k++; - mNext = m + (currentValue - m) / k; + // Division by gameplay rate is to account for TimeOffset scaling with gameplay rate. + double currentValue = e.TimeOffset / e.GameplayRate!.Value; + double mNext = m + (currentValue - m) / count; s += (currentValue - m) * (currentValue - mNext); m = mNext; } - if (k == 0) + if (count == 0) return null; - return 10.0 * Math.Sqrt(s / k); + return 10.0 * Math.Sqrt(s / count); } /// From 24e5c7ed42a58f7a787a965a84488a02e00e8e3f Mon Sep 17 00:00:00 2001 From: Loreos7 Date: Sat, 3 Feb 2024 02:02:21 +0300 Subject: [PATCH 468/651] fix formatting --- osu.Game/Localisation/AudioSettingsStrings.cs | 2 +- .../Settings/Sections/Audio/AudioOffsetAdjustControl.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Localisation/AudioSettingsStrings.cs b/osu.Game/Localisation/AudioSettingsStrings.cs index d93de59cd2..f4537a4c1c 100644 --- a/osu.Game/Localisation/AudioSettingsStrings.cs +++ b/osu.Game/Localisation/AudioSettingsStrings.cs @@ -72,7 +72,7 @@ namespace osu.Game.Localisation /// /// "Based on the last {0} play(s), the suggested offset is {1} ms" /// - public static LocalisableString SuggestedOffsetValueReceived(int plays, double? value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms", plays, value); + public static LocalisableString SuggestedOffsetValueReceived(int plays, string value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms", plays, value); /// /// "Apply suggested offset" diff --git a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs index 71c357c065..ad33434848 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs @@ -156,7 +156,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio { hintText.Text = SuggestedOffset.Value == null ? AudioSettingsStrings.SuggestedOffsetNote - : AudioSettingsStrings.SuggestedOffsetValueReceived(averageHitErrorHistory.Count, SuggestedOffset.Value); + : AudioSettingsStrings.SuggestedOffsetValueReceived(averageHitErrorHistory.Count, $"{SuggestedOffset.Value:N0}"); applySuggestion.Enabled.Value = SuggestedOffset.Value != null; } From 4aa27482a9b95ce8049d2a6cac1b1ded0945bc8f Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 3 Feb 2024 19:52:40 +0300 Subject: [PATCH 469/651] Use SlimReadOnlyDictionaryWrapper for AliveEntries --- .../Objects/Pooling/PooledDrawableWithLifetimeContainer.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs index aed608cf8f..efc10f26e1 100644 --- a/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs +++ b/osu.Game/Rulesets/Objects/Pooling/PooledDrawableWithLifetimeContainer.cs @@ -2,12 +2,13 @@ // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; +using osu.Framework.Extensions.ListExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Performance; +using osu.Framework.Lists; namespace osu.Game.Rulesets.Objects.Pooling { @@ -36,7 +37,7 @@ namespace osu.Game.Rulesets.Objects.Pooling /// /// The enumeration order is undefined. /// - public readonly ReadOnlyDictionary AliveEntries; + public readonly SlimReadOnlyDictionaryWrapper AliveEntries; /// /// Whether to remove an entry when clock goes backward and crossed its . @@ -65,7 +66,7 @@ namespace osu.Game.Rulesets.Objects.Pooling lifetimeManager.EntryBecameDead += entryBecameDead; lifetimeManager.EntryCrossedBoundary += entryCrossedBoundary; - AliveEntries = new ReadOnlyDictionary(aliveDrawableMap); + AliveEntries = aliveDrawableMap.AsSlimReadOnly(); } /// From e2e3c61c9c9e1a13434a6db6d919299ee459c78e Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 3 Feb 2024 19:54:04 +0300 Subject: [PATCH 470/651] Use AliveEntries where we don't need startTime order --- osu.Game.Rulesets.Osu/Mods/OsuModDepth.cs | 4 +++- osu.Game.Rulesets.Osu/Mods/OsuModMagnetised.cs | 4 +++- osu.Game.Rulesets.Osu/Mods/OsuModRepel.cs | 4 +++- osu.Game/Screens/Play/FailAnimationContainer.cs | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModDepth.cs b/osu.Game.Rulesets.Osu/Mods/OsuModDepth.cs index b70d607ca1..a9111eec1f 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModDepth.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModDepth.cs @@ -75,8 +75,10 @@ namespace osu.Game.Rulesets.Osu.Mods { double time = playfield.Time.Current; - foreach (var drawable in playfield.HitObjectContainer.AliveObjects) + foreach (var entry in playfield.HitObjectContainer.AliveEntries) { + var drawable = entry.Value; + switch (drawable) { case DrawableHitCircle circle: diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModMagnetised.cs b/osu.Game.Rulesets.Osu/Mods/OsuModMagnetised.cs index befee4af5a..b49fb931d1 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModMagnetised.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModMagnetised.cs @@ -49,8 +49,10 @@ namespace osu.Game.Rulesets.Osu.Mods { var cursorPos = playfield.Cursor.AsNonNull().ActiveCursor.DrawPosition; - foreach (var drawable in playfield.HitObjectContainer.AliveObjects) + foreach (var entry in playfield.HitObjectContainer.AliveEntries) { + var drawable = entry.Value; + switch (drawable) { case DrawableHitCircle circle: diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRepel.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRepel.cs index 91feb33931..ced98f0cd5 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRepel.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRepel.cs @@ -48,8 +48,10 @@ namespace osu.Game.Rulesets.Osu.Mods { var cursorPos = playfield.Cursor.AsNonNull().ActiveCursor.DrawPosition; - foreach (var drawable in playfield.HitObjectContainer.AliveObjects) + foreach (var entry in playfield.HitObjectContainer.AliveEntries) { + var drawable = entry.Value; + var destination = Vector2.Clamp(2 * drawable.Position - cursorPos, Vector2.Zero, OsuPlayfield.BASE_SIZE); if (drawable.HitObject is Slider thisSlider) diff --git a/osu.Game/Screens/Play/FailAnimationContainer.cs b/osu.Game/Screens/Play/FailAnimationContainer.cs index 821c67e3cb..ebb0d77726 100644 --- a/osu.Game/Screens/Play/FailAnimationContainer.cs +++ b/osu.Game/Screens/Play/FailAnimationContainer.cs @@ -198,8 +198,10 @@ namespace osu.Game.Screens.Play foreach (var nested in playfield.NestedPlayfields) applyToPlayfield(nested); - foreach (DrawableHitObject obj in playfield.HitObjectContainer.AliveObjects) + foreach (var entry in playfield.HitObjectContainer.AliveEntries) { + var obj = entry.Value; + if (appliedObjects.Contains(obj)) continue; From ba291621f0d9a0e074f8597f2f28aa203ee0c187 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Sun, 4 Feb 2024 17:27:07 +0900 Subject: [PATCH 471/651] Adjust Android SDK target version --- osu.Android/AndroidManifest.xml | 2 +- osu.Game.Rulesets.Catch.Tests.Android/AndroidManifest.xml | 2 +- osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml | 2 +- osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml | 2 +- osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml | 2 +- osu.Game.Tests.Android/AndroidManifest.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Android/AndroidManifest.xml b/osu.Android/AndroidManifest.xml index a2b55257cb..a85e711cf2 100644 --- a/osu.Android/AndroidManifest.xml +++ b/osu.Android/AndroidManifest.xml @@ -1,6 +1,6 @@  - + - + \ No newline at end of file diff --git a/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml b/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml index f5a49210ea..df4930419c 100644 --- a/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml +++ b/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml b/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml index ed4725dd94..d0c3484cfd 100644 --- a/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml +++ b/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml b/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml index cc88d3080a..0ae9ee43ad 100644 --- a/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml +++ b/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/osu.Game.Tests.Android/AndroidManifest.xml b/osu.Game.Tests.Android/AndroidManifest.xml index 6f91fb928c..71793af977 100644 --- a/osu.Game.Tests.Android/AndroidManifest.xml +++ b/osu.Game.Tests.Android/AndroidManifest.xml @@ -1,5 +1,5 @@  - + \ No newline at end of file From 9923c1b6e6e33fc982c3e61c457aa5210da3ae73 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sun, 4 Feb 2024 17:08:39 +0300 Subject: [PATCH 472/651] Fix multiplayer/playlists lounge screen disposing rooms synchronously --- .../OnlinePlay/Lounge/Components/RoomsContainer.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs index ac6403bb34..8a3fbbf792 100644 --- a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs +++ b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs @@ -141,9 +141,18 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components private void removeRooms(IEnumerable rooms) { - foreach (var r in rooms) + foreach (var room in rooms) { - roomFlow.RemoveAll(d => d.Room == r, true); + var drawableRoom = roomFlow.SingleOrDefault(d => d.Room == room); + if (drawableRoom == null) + continue; + + // expire to trigger async disposal. the room still has to exist somewhere so we move it to internal content of RoomsContainer until next frame. + drawableRoom.Hide(); + drawableRoom.Expire(); + + roomFlow.Remove(drawableRoom, false); + AddInternal(drawableRoom); // selection may have a lease due to being in a sub screen. if (!SelectedRoom.Disabled) From 6f9ee3f526745d073c1cf4978a229a796766ad64 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 00:30:48 +0300 Subject: [PATCH 473/651] Fix selected room bindable being set to null regardless of the removed room --- osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs index ac6403bb34..bd06890753 100644 --- a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs +++ b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs @@ -146,7 +146,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components roomFlow.RemoveAll(d => d.Room == r, true); // selection may have a lease due to being in a sub screen. - if (!SelectedRoom.Disabled) + if (SelectedRoom.Value == r && !SelectedRoom.Disabled) SelectedRoom.Value = null; } } From 44a594ba05325bf28197c3727ef5813b36e4ad61 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 01:03:04 +0300 Subject: [PATCH 474/651] Simplify playback logic --- .../Expanded/Accuracy/AccuracyCircle.cs | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs index e5ba9500ee..d209c305fa 100644 --- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs +++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs @@ -4,6 +4,7 @@ #nullable disable using System; +using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Audio; @@ -85,9 +86,6 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy /// public static readonly Easing ACCURACY_TRANSFORM_EASING = Easing.OutPow10; - [Resolved] - private SkinManager skins { get; set; } - private readonly ScoreInfo score; private CircularProgress accuracyCircle; @@ -101,7 +99,6 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy private PoolableSkinnableSample swooshUpSound; private PoolableSkinnableSample rankImpactSound; private PoolableSkinnableSample rankApplauseSound; - private PoolableSkinnableSample rankLegacyApplauseSound; private readonly Bindable tickPlaybackRate = new Bindable(); @@ -263,11 +260,15 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy if (isFailedSDueToMisses) AddInternal(failedSRankText = new RankText(ScoreRank.S)); + var applauseSamples = new List { applauseSampleName }; + if (score.Rank >= ScoreRank.B) + // when rank is B or higher, play legacy applause sample on legacy skins. + applauseSamples.Insert(0, @"applause"); + AddRangeInternal(new Drawable[] { rankImpactSound = new PoolableSkinnableSample(new SampleInfo(impactSampleName)), - rankApplauseSound = new PoolableSkinnableSample(new SampleInfo(applauseSampleName)), - rankLegacyApplauseSound = new PoolableSkinnableSample(new SampleInfo("applause")), + rankApplauseSound = new PoolableSkinnableSample(new SampleInfo(applauseSamples.ToArray())), scoreTickSound = new PoolableSkinnableSample(new SampleInfo(@"Results/score-tick")), badgeTickSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink")), badgeMaxSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink-max")), @@ -401,20 +402,8 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy { Schedule(() => { - if (skins.CurrentSkin.Value is LegacySkin) - { - // only play legacy "applause" sound if score rank is B or higher. - if (score.Rank >= ScoreRank.B) - { - rankLegacyApplauseSound.VolumeTo(applause_volume); - rankLegacyApplauseSound.Play(); - } - } - else - { - rankApplauseSound.VolumeTo(applause_volume); - rankApplauseSound.Play(); - } + rankApplauseSound.VolumeTo(applause_volume); + rankApplauseSound.Play(); }); } } From 5f39d4590ba1d69980a76537807a8f86b2476c52 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Mon, 5 Feb 2024 18:02:07 +0900 Subject: [PATCH 475/651] Update global.json version --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index da113e4cbd..789bff3bd0 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.0", + "version": "8.0.100", "rollForward": "latestFeature", "allowPrerelease": false } From 989e46c791de8261a970901fc8732b087d254a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 13:05:28 +0100 Subject: [PATCH 476/651] Use better test step name --- osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs index 2bda242de2..3f2b71b320 100644 --- a/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs +++ b/osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs @@ -63,7 +63,7 @@ namespace osu.Game.Tests.Visual.Ranking Beatmap.Value = beatmaps.GetWorkingBeatmap(beatmapInfo); }); - AddToggleStep("toggle skin", v => + AddToggleStep("toggle legacy classic skin", v => { if (skins != null) skins.CurrentSkinInfo.Value = v ? skins.DefaultClassicSkin.SkinInfo : skins.CurrentSkinInfo.Default; From efe6bb25b14db26e7c0b79494aa3eaf038dd99b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 13:21:01 +0100 Subject: [PATCH 477/651] Refactor result application around again to remove requirement for fields Co-authored-by: Dean Herbert --- .../Objects/Drawables/DrawableHoldNote.cs | 2 +- .../Objects/Drawables/DrawableHoldNoteBody.cs | 12 +++----- .../Drawables/DrawableManiaHitObject.cs | 2 +- .../Objects/Drawables/DrawableNote.cs | 3 +- .../TestSceneHitCircle.cs | 2 +- .../TestSceneHitCircleLateFade.cs | 2 +- .../Objects/Drawables/DrawableHitCircle.cs | 29 ++++++++++--------- .../Objects/Drawables/DrawableOsuHitObject.cs | 4 +-- .../Objects/Drawables/DrawableDrumRoll.cs | 2 +- .../Objects/Drawables/DrawableDrumRollTick.cs | 6 ++-- .../Objects/Drawables/DrawableFlyingHit.cs | 2 +- .../Objects/Drawables/DrawableHit.cs | 10 +++---- .../Drawables/DrawableStrongNestedHit.cs | 2 +- .../Objects/Drawables/DrawableSwell.cs | 2 +- .../Gameplay/TestSceneDrawableHitObject.cs | 2 +- .../Gameplay/TestScenePoolingRuleset.cs | 8 ++--- .../Rulesets/Judgements/JudgementResult.cs | 2 +- .../Objects/Drawables/DrawableHitObject.cs | 17 +++++++++-- 18 files changed, 59 insertions(+), 50 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs index 6c70ab3526..2b55e81788 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs @@ -265,7 +265,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables if (Tail.AllJudged) { if (Tail.IsHit) - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); else MissForcefully(); } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs index 731b1b6298..6259033235 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteBody.cs @@ -11,8 +11,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables public override bool DisplayResult => false; - private bool hit; - public DrawableHoldNoteBody() : this(null) { @@ -27,12 +25,10 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables { if (AllJudged) return; - this.hit = hit; - ApplyResult(static (r, hitObject) => - { - var holdNoteBody = (DrawableHoldNoteBody)hitObject; - r.Type = holdNoteBody.hit ? r.Judgement.MaxResult : r.Judgement.MinResult; - }); + if (hit) + ApplyMaxResult(); + else + ApplyMinResult(); } } } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs index 2d10fa27cd..e98622b8bf 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs @@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables /// /// Causes this to get missed, disregarding all conditions in implementations of . /// - public virtual void MissForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + public virtual void MissForcefully() => ApplyMinResult(); } public abstract partial class DrawableManiaHitObject : DrawableManiaHitObject diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs index a70253798a..2246552abe 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs @@ -91,12 +91,13 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); return; } hitResult = HitObject.HitWindows.ResultFor(timeOffset); + if (hitResult == HitResult.None) return; diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs index 8d4145f2c1..abe950f9bb 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircle.cs @@ -136,7 +136,7 @@ namespace osu.Game.Rulesets.Osu.Tests if (auto && !userTriggered && timeOffset > hitOffset && CheckHittable?.Invoke(this, Time.Current, HitResult.Great) == ClickAction.Hit) { // force success - ApplyResult(static (r, _) => r.Type = HitResult.Great); + ApplyResult(HitResult.Great); } else base.CheckForResult(userTriggered, timeOffset); diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs index 2d1e9c1270..838b426cb4 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLateFade.cs @@ -208,7 +208,7 @@ namespace osu.Game.Rulesets.Osu.Tests if (shouldHit && !userTriggered && timeOffset >= 0) { // force success - ApplyResult(static (r, _) => r.Type = HitResult.Great); + ApplyResult(HitResult.Great); } else base.CheckForResult(userTriggered, timeOffset); diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index ce5422b180..a014ba2e77 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -44,7 +44,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables private Container scaleContainer; private InputManager inputManager; - private HitResult hitResult; public DrawableHitCircle() : this(null) @@ -156,12 +155,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); return; } - hitResult = ResultFor(timeOffset); + HitResult hitResult = ResultFor(timeOffset); var clickAction = CheckHittable?.Invoke(this, Time.Current, hitResult); if (clickAction == ClickAction.Shake) @@ -170,20 +169,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables if (hitResult == HitResult.None || clickAction != ClickAction.Hit) return; - ApplyResult(static (r, hitObject) => + Vector2? hitPosition = null; + + // Todo: This should also consider misses, but they're a little more interesting to handle, since we don't necessarily know the position at the time of a miss. + if (hitResult.IsHit()) + { + var localMousePosition = ToLocalSpace(inputManager.CurrentState.Mouse.Position); + hitPosition = HitObject.StackedPosition + (localMousePosition - DrawSize / 2); + } + + ApplyResult<(HitResult result, Vector2? position)>((r, state) => { - var hitCircle = (DrawableHitCircle)hitObject; var circleResult = (OsuHitCircleJudgementResult)r; - // Todo: This should also consider misses, but they're a little more interesting to handle, since we don't necessarily know the position at the time of a miss. - if (hitCircle.hitResult.IsHit()) - { - var localMousePosition = hitCircle.ToLocalSpace(hitCircle.inputManager.CurrentState.Mouse.Position); - circleResult.CursorPositionAtHit = hitCircle.HitObject.StackedPosition + (localMousePosition - hitCircle.DrawSize / 2); - } - - circleResult.Type = hitCircle.hitResult; - }); + circleResult.Type = state.result; + circleResult.CursorPositionAtHit = state.position; + }, (hitResult, hitPosition)); } /// diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs index 6de60a9d51..5271c03e08 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs @@ -100,12 +100,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// /// Causes this to get hit, disregarding all conditions in implementations of . /// - public void HitForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + public void HitForcefully() => ApplyMaxResult(); /// /// Causes this to get missed, disregarding all conditions in implementations of . /// - public void MissForcefully() => ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + public void MissForcefully() => ApplyMinResult(); private RectangleF parentScreenSpaceRectangle => ((DrawableOsuHitObject)ParentHitObject)?.parentScreenSpaceRectangle ?? Parent!.ScreenSpaceDrawQuad.AABBFloat; diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs index e15298f3ca..1af4719b02 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs @@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (timeOffset < 0) return; - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs index aa678d7043..0333fd71a9 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs @@ -49,14 +49,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!userTriggered) { if (timeOffset > HitObject.HitWindow) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); return; } if (Math.Abs(timeOffset) > HitObject.HitWindow) return; - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } public override void OnKilled() @@ -64,7 +64,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables base.OnKilled(); if (Time.Current > HitObject.GetEndTime() && !Judged) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs index 4349dff9f9..aad9214c5e 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs @@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables protected override void LoadComplete() { base.LoadComplete(); - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } protected override void LoadSamples() diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index cf8e4050ee..ca49ddb7e1 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -101,7 +101,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); return; } @@ -110,7 +110,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables return; if (!validActionPressed) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); else { ApplyResult(static (r, hitObject) => @@ -217,19 +217,19 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!ParentHitObject.Result.IsHit) { - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); return; } if (!userTriggered) { if (timeOffset - ParentHitObject.Result.TimeOffset > SECOND_HIT_WINDOW) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); return; } if (Math.Abs(timeOffset - ParentHitObject.Result.TimeOffset) <= SECOND_HIT_WINDOW) - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } public override bool OnPressed(KeyBindingPressEvent e) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs index 8f99538448..11759927a9 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableStrongNestedHit.cs @@ -27,7 +27,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables // it can happen that the hit window of the nested strong hit extends past the lifetime of the parent object. // this is a safety to prevent such cases from causing the nested hit to never be judged and as such prevent gameplay from completing. if (!Judged && Time.Current > ParentHitObject?.HitObject.GetEndTime()) - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs index 0781ea5e2a..6eb62cce22 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs @@ -208,7 +208,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables expandingRing.ScaleTo(1f + Math.Min(target_ring_scale - 1f, (target_ring_scale - 1f) * completion * 1.3f), 260, Easing.OutQuint); if (numHits == HitObject.RequiredHits) - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } else { diff --git a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs index bf1e52aab5..73177e36e1 100644 --- a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs +++ b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs @@ -216,7 +216,7 @@ namespace osu.Game.Tests.Gameplay LifetimeStart = LIFETIME_ON_APPLY; } - public void MissForcefully() => ApplyResult(static (r, _) => r.Type = HitResult.Miss); + public void MissForcefully() => ApplyResult(HitResult.Miss); protected override void UpdateHitStateTransforms(ArmedState state) { diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs index 00bd58e303..b567e8de8d 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePoolingRuleset.cs @@ -431,7 +431,7 @@ namespace osu.Game.Tests.Visual.Gameplay protected override void CheckForResult(bool userTriggered, double timeOffset) { if (timeOffset > HitObject.Duration) - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } protected override void UpdateHitStateTransforms(ArmedState state) @@ -468,7 +468,7 @@ namespace osu.Game.Tests.Visual.Gameplay public override void OnKilled() { base.OnKilled(); - ApplyResult(static (r, _) => r.Type = r.Judgement.MinResult); + ApplyMinResult(); } } @@ -547,7 +547,7 @@ namespace osu.Game.Tests.Visual.Gameplay { base.CheckForResult(userTriggered, timeOffset); if (timeOffset >= 0) - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } } @@ -596,7 +596,7 @@ namespace osu.Game.Tests.Visual.Gameplay { base.CheckForResult(userTriggered, timeOffset); if (timeOffset >= 0) - ApplyResult(static (r, _) => r.Type = r.Judgement.MaxResult); + ApplyMaxResult(); } } diff --git a/osu.Game/Rulesets/Judgements/JudgementResult.cs b/osu.Game/Rulesets/Judgements/JudgementResult.cs index b781a13929..4b98df50d7 100644 --- a/osu.Game/Rulesets/Judgements/JudgementResult.cs +++ b/osu.Game/Rulesets/Judgements/JudgementResult.cs @@ -30,7 +30,7 @@ namespace osu.Game.Rulesets.Judgements /// /// The time at which this occurred. - /// Populated when this is applied via . + /// Populated when this is applied via . /// /// /// This is used instead of to check whether this should be reverted. diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index e30ce13f08..07fab72814 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -682,17 +682,28 @@ namespace osu.Game.Rulesets.Objects.Drawables UpdateResult(false); } + protected void ApplyMaxResult() => ApplyResult((r, _) => r.Type = r.Judgement.MaxResult); + protected void ApplyMinResult() => ApplyResult((r, _) => r.Type = r.Judgement.MinResult); + + protected void ApplyResult(HitResult type) => ApplyResult(static (result, state) => result.Type = state, type); + + [Obsolete("Use overload with state, preferrably with static delegates to avoid allocation overhead.")] // Can be removed 2024-07-26 + protected void ApplyResult(Action application) => ApplyResult((r, _) => application(r), this); + + protected void ApplyResult(Action application) => ApplyResult(application, this); + /// /// Applies the of this , notifying responders such as /// the of the . /// /// The callback that applies changes to the . Using a `static` delegate is recommended to avoid allocation overhead. - protected void ApplyResult(Action application) + /// The state. + protected void ApplyResult(Action application, T state) { if (Result.HasResult) throw new InvalidOperationException("Cannot apply result on a hitobject that already has a result."); - application?.Invoke(Result, this); + application?.Invoke(Result, state); if (!Result.HasResult) throw new InvalidOperationException($"{GetType().ReadableName()} applied a {nameof(JudgementResult)} but did not update {nameof(JudgementResult.Type)}."); @@ -737,7 +748,7 @@ namespace osu.Game.Rulesets.Objects.Drawables /// Checks if a scoring result has occurred for this . /// /// - /// If a scoring result has occurred, this method must invoke to update the result and notify responders. + /// If a scoring result has occurred, this method must invoke to update the result and notify responders. /// /// Whether the user triggered this check. /// The offset from the end time of the at which this check occurred. From 2976f225e0627ffa8cb4efe2ad6060e02a6fa5ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 13:22:58 +0100 Subject: [PATCH 478/651] Improve xmldoc of `state` param --- osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 07fab72814..c5f1878d1f 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -697,7 +697,10 @@ namespace osu.Game.Rulesets.Objects.Drawables /// the of the . /// /// The callback that applies changes to the . Using a `static` delegate is recommended to avoid allocation overhead. - /// The state. + /// + /// Use this parameter to pass any data that requires + /// to apply a result, so that it can remain a `static` delegate and thus not allocate. + /// protected void ApplyResult(Action application, T state) { if (Result.HasResult) From fb80d76b4a814a8b79ce441833515f450ab8e12b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 13:35:41 +0100 Subject: [PATCH 479/651] Apply further changes to remove remaining weirdness --- .../Drawables/DrawableEmptyFreeformHitObject.cs | 2 +- .../Drawables/DrawablePippidonHitObject.cs | 9 ++++----- .../Drawables/DrawableEmptyScrollingHitObject.cs | 3 +-- .../Drawables/DrawablePippidonHitObject.cs | 10 ++++------ .../Objects/Drawables/DrawableCatchHitObject.cs | 9 ++++----- .../Objects/Drawables/DrawableNote.cs | 15 ++++----------- .../Objects/Drawables/DrawableHitCircle.cs | 10 +++++----- .../Objects/Drawables/DrawableSpinnerTick.cs | 12 ++++-------- .../Objects/Drawables/DrawableHit.cs | 14 +++----------- .../Objects/Drawables/DrawableSwell.cs | 15 ++++++--------- .../Objects/Drawables/DrawableSwellTick.cs | 13 +++++-------- 11 files changed, 41 insertions(+), 71 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs index 3ad8f06fb4..e53fe01157 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/Drawables/DrawableEmptyFreeformHitObject.cs @@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.EmptyFreeform.Objects.Drawables { if (timeOffset >= 0) // todo: implement judgement logic - ApplyResult(static (r, hitObject) => r.Type = HitResult.Perfect); + ApplyResult(HitResult.Perfect); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs index 925f2d04bf..b1be25727f 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -9,7 +9,6 @@ using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; using osu.Game.Audio; using osu.Game.Rulesets.Objects.Drawables; -using osu.Game.Rulesets.Scoring; using osuTK; using osuTK.Graphics; @@ -50,10 +49,10 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables { if (timeOffset >= 0) { - ApplyResult(static (r, hitObject) => - { - r.Type = hitObject.IsHovered ? HitResult.Perfect : HitResult.Miss; - }); + if (IsHovered) + ApplyMaxResult(); + else + ApplyMinResult(); } } diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs index 408bbea717..adcbd36485 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/Drawables/DrawableEmptyScrollingHitObject.cs @@ -3,7 +3,6 @@ using osu.Framework.Graphics; using osu.Game.Rulesets.Objects.Drawables; -using osu.Game.Rulesets.Scoring; using osuTK; using osuTK.Graphics; @@ -24,7 +23,7 @@ namespace osu.Game.Rulesets.EmptyScrolling.Objects.Drawables { if (timeOffset >= 0) // todo: implement judgement logic - ApplyResult(static (r, hitObject) => r.Type = HitResult.Perfect); + ApplyMaxResult(); } protected override void UpdateHitStateTransforms(ArmedState state) diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs index 2c9eac7f65..3ad636a601 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -10,7 +10,6 @@ using osu.Framework.Graphics.Textures; using osu.Game.Audio; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Pippidon.UI; -using osu.Game.Rulesets.Scoring; using osuTK; using osuTK.Graphics; @@ -50,11 +49,10 @@ namespace osu.Game.Rulesets.Pippidon.Objects.Drawables { if (timeOffset >= 0) { - ApplyResult(static (r, hitObject) => - { - var pippidonHitObject = (DrawablePippidonHitObject)hitObject; - r.Type = pippidonHitObject.currentLane.Value == pippidonHitObject.HitObject.Lane ? HitResult.Perfect : HitResult.Miss; - }); + if (currentLane.Value == HitObject.Lane) + ApplyMaxResult(); + else + ApplyMinResult(); } } diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs index 721c6aaa59..64705f9909 100644 --- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs +++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs @@ -64,11 +64,10 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables if (timeOffset >= 0 && Result != null) { - ApplyResult(static (r, hitObject) => - { - var catchHitObject = (DrawableCatchHitObject)hitObject; - r.Type = catchHitObject.CheckPosition!.Invoke(catchHitObject.HitObject) ? r.Judgement.MaxResult : r.Judgement.MinResult; - }); + if (CheckPosition.Invoke(HitObject)) + ApplyMaxResult(); + else + ApplyMinResult(); } } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs index 2246552abe..f6b92ab405 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs @@ -38,8 +38,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables private Drawable headPiece; - private HitResult hitResult; - public DrawableNote() : this(null) { @@ -96,18 +94,13 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables return; } - hitResult = HitObject.HitWindows.ResultFor(timeOffset); + var result = HitObject.HitWindows.ResultFor(timeOffset); - if (hitResult == HitResult.None) + if (result == HitResult.None) return; - hitResult = GetCappedResult(hitResult); - - ApplyResult(static (r, hitObject) => - { - var note = (DrawableNote)hitObject; - r.Type = note.hitResult; - }); + result = GetCappedResult(result); + ApplyResult(result); } /// diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index a014ba2e77..b1c9bef6c4 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -160,19 +160,19 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables return; } - HitResult hitResult = ResultFor(timeOffset); - var clickAction = CheckHittable?.Invoke(this, Time.Current, hitResult); + var result = ResultFor(timeOffset); + var clickAction = CheckHittable?.Invoke(this, Time.Current, result); if (clickAction == ClickAction.Shake) Shake(); - if (hitResult == HitResult.None || clickAction != ClickAction.Hit) + if (result == HitResult.None || clickAction != ClickAction.Hit) return; Vector2? hitPosition = null; // Todo: This should also consider misses, but they're a little more interesting to handle, since we don't necessarily know the position at the time of a miss. - if (hitResult.IsHit()) + if (result.IsHit()) { var localMousePosition = ToLocalSpace(inputManager.CurrentState.Mouse.Position); hitPosition = HitObject.StackedPosition + (localMousePosition - DrawSize / 2); @@ -184,7 +184,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables circleResult.Type = state.result; circleResult.CursorPositionAtHit = state.position; - }, (hitResult, hitPosition)); + }, (result, hitPosition)); } /// diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs index 628f07a281..0a77faf924 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinnerTick.cs @@ -11,8 +11,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public override bool DisplayResult => false; - private bool hit; - public DrawableSpinnerTick() : this(null) { @@ -39,12 +37,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// Whether this tick was reached. internal void TriggerResult(bool hit) { - this.hit = hit; - ApplyResult(static (r, hitObject) => - { - var spinnerTick = (DrawableSpinnerTick)hitObject; - r.Type = spinnerTick.hit ? r.Judgement.MaxResult : r.Judgement.MinResult; - }); + if (hit) + ApplyMaxResult(); + else + ApplyMinResult(); } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index ca49ddb7e1..4fb69056da 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -37,8 +37,6 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables private double? lastPressHandleTime; - private HitResult hitResult; - private readonly Bindable type = new Bindable(); public DrawableHit() @@ -105,20 +103,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables return; } - hitResult = HitObject.HitWindows.ResultFor(timeOffset); - if (hitResult == HitResult.None) + var result = HitObject.HitWindows.ResultFor(timeOffset); + if (result == HitResult.None) return; if (!validActionPressed) ApplyMinResult(); else - { - ApplyResult(static (r, hitObject) => - { - var drawableHit = (DrawableHit)hitObject; - r.Type = drawableHit.hitResult; - }); - } + ApplyResult(result); } public override bool OnPressed(KeyBindingPressEvent e) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs index 6eb62cce22..e1fc28fe16 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs @@ -41,8 +41,6 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables private double? lastPressHandleTime; - private int numHits; - public override bool DisplayResult => false; public DrawableSwell() @@ -194,7 +192,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables nextTick?.TriggerResult(true); - numHits = ticks.Count(r => r.IsHit); + int numHits = ticks.Count(r => r.IsHit); float completion = (float)numHits / HitObject.RequiredHits; @@ -215,7 +213,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (timeOffset < 0) return; - numHits = 0; + int numHits = 0; foreach (var tick in ticks) { @@ -229,11 +227,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables tick.TriggerResult(false); } - ApplyResult(static (r, hitObject) => - { - var swell = (DrawableSwell)hitObject; - r.Type = swell.numHits == swell.HitObject.RequiredHits ? r.Judgement.MaxResult : r.Judgement.MinResult; - }); + if (numHits == HitObject.RequiredHits) + ApplyMaxResult(); + else + ApplyMinResult(); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs index 557438e5e5..04dd01e066 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwellTick.cs @@ -15,8 +15,6 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables { public override bool DisplayResult => false; - private bool hit; - public DrawableSwellTick() : this(null) { @@ -31,13 +29,12 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables public void TriggerResult(bool hit) { - this.hit = hit; HitObject.StartTime = Time.Current; - ApplyResult(static (r, hitObject) => - { - var swellTick = (DrawableSwellTick)hitObject; - r.Type = swellTick.hit ? r.Judgement.MaxResult : r.Judgement.MinResult; - }); + + if (hit) + ApplyMaxResult(); + else + ApplyMinResult(); } protected override void CheckForResult(bool userTriggered, double timeOffset) From 8b9c9f4fedcb8177e5b33061eec320b3832e2d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 14:52:08 +0100 Subject: [PATCH 480/651] Add NRT annotations to `DrawableManiaRuleset` --- osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs b/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs index 070021ef74..decf670c5d 100644 --- a/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs +++ b/osu.Game.Rulesets.Mania/UI/DrawableManiaRuleset.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; @@ -61,9 +59,9 @@ namespace osu.Game.Rulesets.Mania.UI // Stores the current speed adjustment active in gameplay. private readonly Track speedAdjustmentTrack = new TrackVirtual(0); - private ISkinSource currentSkin; + private ISkinSource currentSkin = null!; - public DrawableManiaRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList mods = null) + public DrawableManiaRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList? mods = null) : base(ruleset, beatmap, mods) { BarLines = new BarLineGenerator(Beatmap).BarLines; @@ -114,7 +112,7 @@ namespace osu.Game.Rulesets.Mania.UI updateTimeRange(); } - private ScheduledDelegate pendingSkinChange; + private ScheduledDelegate? pendingSkinChange; private float hitPosition; private void onSkinChange() @@ -160,7 +158,7 @@ namespace osu.Game.Rulesets.Mania.UI protected override PassThroughInputManager CreateInputManager() => new ManiaInputManager(Ruleset.RulesetInfo, Variant); - public override DrawableHitObject CreateDrawableRepresentation(ManiaHitObject h) => null; + public override DrawableHitObject? CreateDrawableRepresentation(ManiaHitObject h) => null; protected override ReplayInputHandler CreateReplayInputHandler(Replay replay) => new ManiaFramedReplayInputHandler(replay); From 9e1a24fdefe24dc3d6d8daa57439ffefe4ddacde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 16:20:50 +0100 Subject: [PATCH 481/651] Remove pointless enum --- .../Overlays/FirstRunSetup/ScreenImportFromStable.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs index 0b2b750136..a56af540e4 100644 --- a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs +++ b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs @@ -326,13 +326,4 @@ namespace osu.Game.Overlays.FirstRunSetup } } } - - public enum FileSystemAddition - { - [LocalisableDescription(typeof(FirstRunOverlayImportFromStableScreenStrings), nameof(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureNtfs))] - ToAvoidEnsureNtfs, - - [LocalisableDescription(typeof(FirstRunOverlayImportFromStableScreenStrings), nameof(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureHardLinksSupport))] - ToAvoidEnsureHardLinksSupport, - } } From fa894bda059e58626639e4a487181f191f207837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 16:25:44 +0100 Subject: [PATCH 482/651] Fix broken spacing --- osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs index a56af540e4..526dffa06f 100644 --- a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs +++ b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs @@ -137,6 +137,7 @@ namespace osu.Game.Overlays.FirstRunSetup copyInformation.Text = RuntimeInfo.OS == RuntimeInfo.Platform.Windows ? FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMade(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureNtfs) : FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMade(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureHardLinksSupport); + copyInformation.AddText(@" "); // just to ensure correct spacing copyInformation.AddLink(GeneralSettingsStrings.ChangeFolderLocation, () => { game?.PerformFromScreen(menu => menu.Push(new MigrationSelectScreen())); From 148e01327b41ebde80f9f1c0a83f844d14a93f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 16:27:56 +0100 Subject: [PATCH 483/651] Split copy info text into two rather than parameterise I have very low hopes translators would be able to correctly navigate this otherwise (especially in languages with different word order). --- .../FirstRunOverlayImportFromStableScreenStrings.cs | 13 ++++--------- .../FirstRunSetup/ScreenImportFromStable.cs | 4 ++-- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs b/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs index bbd83d2395..04fecab3df 100644 --- a/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs +++ b/osu.Game/Localisation/FirstRunOverlayImportFromStableScreenStrings.cs @@ -67,19 +67,14 @@ namespace osu.Game.Localisation public static LocalisableString LightweightLinkingNotSupported => new TranslatableString(getKey(@"lightweight_linking_not_supported"), @"Lightweight linking of files is not supported on your operating system yet, so a copy of all files will be made during import."); /// - /// "A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install {0}." + /// "A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install (and the file system is NTFS)." /// - public static LocalisableString SecondCopyWillBeMade(LocalisableString extra) => new TranslatableString(getKey(@"second_copy_will_be_made"), @"A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install {0}.", extra); + public static LocalisableString SecondCopyWillBeMadeWindows => new TranslatableString(getKey(@"second_copy_will_be_made_windows"), @"A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install (and the file system is NTFS)."); /// - /// "(and the file system is NTFS)" + /// "A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install (and the file system supports hard links)." /// - public static LocalisableString ToAvoidEnsureNtfs => new TranslatableString(getKey(@"to_avoid_ensure_ntfs"), @"(and the file system is NTFS)"); - - /// - /// "(and the file system supports hard links)" - /// - public static LocalisableString ToAvoidEnsureHardLinksSupport => new TranslatableString(getKey(@"to_avoid_ensure_hard_links_support"), @"(and the file system supports hard links)"); + public static LocalisableString SecondCopyWillBeMadeOtherPlatforms => new TranslatableString(getKey(@"second_copy_will_be_made_other_platforms"), @"A second copy of all files will be made during import. To avoid this, please make sure the lazer data folder is on the same drive as your previous osu! install (and the file system supports hard links)."); private static string getKey(string key) => $@"{prefix}:{key}"; } diff --git a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs index 526dffa06f..b19a9c6c99 100644 --- a/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs +++ b/osu.Game/Overlays/FirstRunSetup/ScreenImportFromStable.cs @@ -135,8 +135,8 @@ namespace osu.Game.Overlays.FirstRunSetup else { copyInformation.Text = RuntimeInfo.OS == RuntimeInfo.Platform.Windows - ? FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMade(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureNtfs) - : FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMade(FirstRunOverlayImportFromStableScreenStrings.ToAvoidEnsureHardLinksSupport); + ? FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMadeWindows + : FirstRunOverlayImportFromStableScreenStrings.SecondCopyWillBeMadeOtherPlatforms; copyInformation.AddText(@" "); // just to ensure correct spacing copyInformation.AddLink(GeneralSettingsStrings.ChangeFolderLocation, () => { From 858f2fc7495867a600631e8683cefb193cc255fc Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 18:39:04 +0300 Subject: [PATCH 484/651] Use `Clear` to trigger async disposal --- .../Lounge/Components/RoomsContainer.cs | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs index 8a3fbbf792..fd9aa6cb0e 100644 --- a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs +++ b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs @@ -126,7 +126,11 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components case NotifyCollectionChangedAction.Remove: Debug.Assert(args.OldItems != null); - removeRooms(args.OldItems.Cast()); + if (args.OldItems.Count == roomFlow.Count) + clearRooms(); + else + removeRooms(args.OldItems.Cast()); + break; } } @@ -141,18 +145,9 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components private void removeRooms(IEnumerable rooms) { - foreach (var room in rooms) + foreach (var r in rooms) { - var drawableRoom = roomFlow.SingleOrDefault(d => d.Room == room); - if (drawableRoom == null) - continue; - - // expire to trigger async disposal. the room still has to exist somewhere so we move it to internal content of RoomsContainer until next frame. - drawableRoom.Hide(); - drawableRoom.Expire(); - - roomFlow.Remove(drawableRoom, false); - AddInternal(drawableRoom); + roomFlow.RemoveAll(d => d.Room == r, true); // selection may have a lease due to being in a sub screen. if (!SelectedRoom.Disabled) @@ -160,6 +155,15 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components } } + private void clearRooms() + { + roomFlow.Clear(); + + // selection may have a lease due to being in a sub screen. + if (!SelectedRoom.Disabled) + SelectedRoom.Value = null; + } + private void updateSorting() { foreach (var room in roomFlow) From 4449ccd1d395c44b7a183f639bdd24d281b82eed Mon Sep 17 00:00:00 2001 From: Loreos7 Date: Mon, 5 Feb 2024 18:44:18 +0300 Subject: [PATCH 485/651] bring back missing dot --- osu.Game/Localisation/AudioSettingsStrings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Localisation/AudioSettingsStrings.cs b/osu.Game/Localisation/AudioSettingsStrings.cs index f4537a4c1c..405eec985c 100644 --- a/osu.Game/Localisation/AudioSettingsStrings.cs +++ b/osu.Game/Localisation/AudioSettingsStrings.cs @@ -72,7 +72,7 @@ namespace osu.Game.Localisation /// /// "Based on the last {0} play(s), the suggested offset is {1} ms" /// - public static LocalisableString SuggestedOffsetValueReceived(int plays, string value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms", plays, value); + public static LocalisableString SuggestedOffsetValueReceived(int plays, string value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms.", plays, value); /// /// "Apply suggested offset" From 8e82327509ad91decc132d56fb065d5fffc0597a Mon Sep 17 00:00:00 2001 From: Loreos7 Date: Mon, 5 Feb 2024 18:45:32 +0300 Subject: [PATCH 486/651] one more dot --- osu.Game/Localisation/AudioSettingsStrings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Localisation/AudioSettingsStrings.cs b/osu.Game/Localisation/AudioSettingsStrings.cs index 405eec985c..24508d6858 100644 --- a/osu.Game/Localisation/AudioSettingsStrings.cs +++ b/osu.Game/Localisation/AudioSettingsStrings.cs @@ -70,7 +70,7 @@ namespace osu.Game.Localisation public static LocalisableString SuggestedOffsetNote => new TranslatableString(getKey(@"suggested_offset_note"), @"Play a few beatmaps to receive a suggested offset!"); /// - /// "Based on the last {0} play(s), the suggested offset is {1} ms" + /// "Based on the last {0} play(s), the suggested offset is {1} ms." /// public static LocalisableString SuggestedOffsetValueReceived(int plays, string value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms.", plays, value); From 791423651640174323beef88c9607d5cde01690b Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 18:49:59 +0300 Subject: [PATCH 487/651] Add explanatory note --- osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs index fd9aa6cb0e..bff1a8c64c 100644 --- a/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs +++ b/osu.Game/Screens/OnlinePlay/Lounge/Components/RoomsContainer.cs @@ -126,6 +126,8 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components case NotifyCollectionChangedAction.Remove: Debug.Assert(args.OldItems != null); + // clear operations have a separate path that benefits from async disposal, + // since disposing is quite expensive when performed on a high number of drawables synchronously. if (args.OldItems.Count == roomFlow.Count) clearRooms(); else From 48d42ca7d39c66a79cb7d5194c86a4a0fef96afd Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 5 Feb 2024 23:58:10 +0800 Subject: [PATCH 488/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index d944e2ce8e..d7f29beeb3 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index bd6891f448..a4cd26a372 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From 2932184d24512eb945c49542bfe005479722688a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 18:05:21 +0100 Subject: [PATCH 489/651] Rename localisable string --- osu.Game/Localisation/GraphicsSettingsStrings.cs | 2 +- osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Localisation/GraphicsSettingsStrings.cs b/osu.Game/Localisation/GraphicsSettingsStrings.cs index d3952d0b4c..753444daf1 100644 --- a/osu.Game/Localisation/GraphicsSettingsStrings.cs +++ b/osu.Game/Localisation/GraphicsSettingsStrings.cs @@ -162,7 +162,7 @@ namespace osu.Game.Localisation /// /// "Shrink game to avoid cameras and notches" /// - public static LocalisableString ShrinkGameOnMobile => new TranslatableString(getKey(@"shrink_game_on_mobile"), @"Shrink game to avoid cameras and notches"); + public static LocalisableString ShrinkGameToSafeArea => new TranslatableString(getKey(@"shrink_game_to_safe_area"), @"Shrink game to avoid cameras and notches"); private static string getKey(string key) => $@"{prefix}:{key}"; } diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs index 4eb3e54708..ce087f1807 100644 --- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs @@ -115,7 +115,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics }, safeAreaConsiderationsCheckbox = new SettingsCheckbox { - LabelText = GraphicsSettingsStrings.ShrinkGameOnMobile, + LabelText = GraphicsSettingsStrings.ShrinkGameToSafeArea, Current = osuConfig.GetBindable(OsuSetting.SafeAreaConsiderations), }, new SettingsSlider From 87381334ffdb12f6b39ad0933cb95da50c676308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 18:06:51 +0100 Subject: [PATCH 490/651] Use more proper method of formatting --- osu.Game/Localisation/AudioSettingsStrings.cs | 2 +- .../Settings/Sections/Audio/AudioOffsetAdjustControl.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Localisation/AudioSettingsStrings.cs b/osu.Game/Localisation/AudioSettingsStrings.cs index 24508d6858..89db60d8a6 100644 --- a/osu.Game/Localisation/AudioSettingsStrings.cs +++ b/osu.Game/Localisation/AudioSettingsStrings.cs @@ -72,7 +72,7 @@ namespace osu.Game.Localisation /// /// "Based on the last {0} play(s), the suggested offset is {1} ms." /// - public static LocalisableString SuggestedOffsetValueReceived(int plays, string value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms.", plays, value); + public static LocalisableString SuggestedOffsetValueReceived(int plays, LocalisableString value) => new TranslatableString(getKey(@"suggested_offset_value_received"), @"Based on the last {0} play(s), the suggested offset is {1} ms.", plays, value); /// /// "Apply suggested offset" diff --git a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs index ad33434848..b9f043a233 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/AudioOffsetAdjustControl.cs @@ -8,6 +8,7 @@ using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.IEnumerableExtensions; +using osu.Framework.Extensions.LocalisationExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; @@ -156,7 +157,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio { hintText.Text = SuggestedOffset.Value == null ? AudioSettingsStrings.SuggestedOffsetNote - : AudioSettingsStrings.SuggestedOffsetValueReceived(averageHitErrorHistory.Count, $"{SuggestedOffset.Value:N0}"); + : AudioSettingsStrings.SuggestedOffsetValueReceived(averageHitErrorHistory.Count, SuggestedOffset.Value.ToLocalisableString(@"N0")); applySuggestion.Enabled.Value = SuggestedOffset.Value != null; } From a5aeb2ff9e98f6d0a034548c2bc6664359f8ade2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 18:56:20 +0100 Subject: [PATCH 491/651] Use better variable names It's not the 1970s. We can spare a few extra letters. --- osu.Game/Rulesets/Scoring/HitEventExtensions.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs index ab36a54d3d..f9c6d62608 100644 --- a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs +++ b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs @@ -22,8 +22,8 @@ namespace osu.Game.Rulesets.Scoring Debug.Assert(hitEvents.All(ev => ev.GameplayRate != null)); int count = 0; - double m = 0; - double s = 0; + double mean = 0; + double sumOfSquares = 0; foreach (var e in hitEvents) { @@ -34,15 +34,15 @@ namespace osu.Game.Rulesets.Scoring // Division by gameplay rate is to account for TimeOffset scaling with gameplay rate. double currentValue = e.TimeOffset / e.GameplayRate!.Value; - double mNext = m + (currentValue - m) / count; - s += (currentValue - m) * (currentValue - mNext); - m = mNext; + double nextMean = mean + (currentValue - mean) / count; + sumOfSquares += (currentValue - mean) * (currentValue - nextMean); + mean = nextMean; } if (count == 0) return null; - return 10.0 * Math.Sqrt(s / count); + return 10.0 * Math.Sqrt(sumOfSquares / count); } /// From 7b03bebd5fd8b4288ea03da66ada81bf7f831781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 18:57:55 +0100 Subject: [PATCH 492/651] Move algorithm description to remarks section of xmldoc --- osu.Game/Rulesets/Scoring/HitEventExtensions.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs index f9c6d62608..6e2852676a 100644 --- a/osu.Game/Rulesets/Scoring/HitEventExtensions.cs +++ b/osu.Game/Rulesets/Scoring/HitEventExtensions.cs @@ -11,8 +11,11 @@ namespace osu.Game.Rulesets.Scoring public static class HitEventExtensions { /// - /// Calculates the "unstable rate" for a sequence of s using Welford's online algorithm. + /// Calculates the "unstable rate" for a sequence of s. /// + /// + /// Uses Welford's online algorithm. + /// /// /// A non-null value if unstable rate could be calculated, /// and if unstable rate cannot be calculated due to being empty. From e1a5aeac198903735125d9867389fef946754e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 19:10:14 +0100 Subject: [PATCH 493/651] Commit benchmark to source Co-authored-by: Andrei Zavatski --- osu.Game.Benchmarks/BenchmarkUnstableRate.cs | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 osu.Game.Benchmarks/BenchmarkUnstableRate.cs diff --git a/osu.Game.Benchmarks/BenchmarkUnstableRate.cs b/osu.Game.Benchmarks/BenchmarkUnstableRate.cs new file mode 100644 index 0000000000..aa229c7d06 --- /dev/null +++ b/osu.Game.Benchmarks/BenchmarkUnstableRate.cs @@ -0,0 +1,31 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using BenchmarkDotNet.Attributes; +using osu.Framework.Utils; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Scoring; + +namespace osu.Game.Benchmarks +{ + public class BenchmarkUnstableRate : BenchmarkTest + { + private List events = null!; + + public override void SetUp() + { + base.SetUp(); + events = new List(); + + for (int i = 0; i < 1000; i++) + events.Add(new HitEvent(RNG.NextDouble(-200.0, 200.0), RNG.NextDouble(1.0, 2.0), HitResult.Great, new HitObject(), null, null)); + } + + [Benchmark] + public void CalculateUnstableRate() + { + _ = events.CalculateUnstableRate(); + } + } +} From c1feccb4cfc6c7929e7adbfc8c1af04145525f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 5 Feb 2024 19:53:19 +0100 Subject: [PATCH 494/651] Add test coverage for selection behaviour --- .../Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs index b938e59d63..0883c626fe 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs @@ -64,6 +64,12 @@ namespace osu.Game.Tests.Visual.Multiplayer AddStep("select first room", () => container.Rooms.First().TriggerClick()); AddAssert("first spotlight selected", () => checkRoomSelected(RoomManager.Rooms.First(r => r.Category.Value == RoomCategory.Spotlight))); + + AddStep("remove last room", () => RoomManager.RemoveRoom(RoomManager.Rooms.MinBy(r => r.RoomID?.Value))); + AddAssert("first spotlight still selected", () => checkRoomSelected(RoomManager.Rooms.First(r => r.Category.Value == RoomCategory.Spotlight))); + + AddStep("remove spotlight room", () => RoomManager.RemoveRoom(RoomManager.Rooms.Single(r => r.Category.Value == RoomCategory.Spotlight))); + AddAssert("selection vacated", () => checkRoomSelected(null)); } [Test] From 4be4ed7ab255fe6cff9b6b882e011a26a5ff15ff Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 23:27:16 +0300 Subject: [PATCH 495/651] Add "ranked" attribute to scores --- osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs | 4 ++++ osu.Game/Scoring/ScoreInfo.cs | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs b/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs index 732da3d5da..42b9d9414f 100644 --- a/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs +++ b/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs @@ -115,6 +115,9 @@ namespace osu.Game.Online.API.Requests.Responses [JsonProperty("has_replay")] public bool HasReplay { get; set; } + [JsonProperty("ranked")] + public bool Ranked { get; set; } + // These properties are calculated or not relevant to any external usage. public bool ShouldSerializeID() => false; public bool ShouldSerializeUser() => false; @@ -212,6 +215,7 @@ namespace osu.Game.Online.API.Requests.Responses HasOnlineReplay = HasReplay, Mods = mods, PP = PP, + Ranked = Ranked, }; if (beatmap is BeatmapInfo realmBeatmap) diff --git a/osu.Game/Scoring/ScoreInfo.cs b/osu.Game/Scoring/ScoreInfo.cs index 32e4bbbf29..fd98107792 100644 --- a/osu.Game/Scoring/ScoreInfo.cs +++ b/osu.Game/Scoring/ScoreInfo.cs @@ -107,6 +107,12 @@ namespace osu.Game.Scoring public double? PP { get; set; } + /// + /// Whether the performance points in this score is awarded to the player. This is used for online display purposes (see ). + /// + [Ignored] + public bool Ranked { get; set; } + /// /// The online ID of this score. /// From 6b7ffc240bbe3eb9138c3620ad175d2d9c7a3487 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 23:28:21 +0300 Subject: [PATCH 496/651] Support displaying "unranked PP" placeholder --- .../Overlays/BeatmapSet/Scores/ScoreTable.cs | 8 +++--- .../Scores/TopScoreStatisticsSection.cs | 8 +++--- .../Sections/Ranks/DrawableProfileScore.cs | 11 ++++++++ .../UnrankedPerformancePointsPlaceholder.cs | 26 +++++++++++++++++++ 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs index 1fc997fdad..c8ecb38c86 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs @@ -180,10 +180,12 @@ namespace osu.Game.Overlays.BeatmapSet.Scores if (showPerformancePoints) { - if (score.PP != null) - content.Add(new StatisticText(score.PP, format: @"N0")); - else + if (!score.Ranked) + content.Add(new UnrankedPerformancePointsPlaceholder { Font = OsuFont.GetFont(size: text_size) }); + else if (score.PP == null) content.Add(new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(text_size) }); + else + content.Add(new StatisticText(score.PP, format: @"N0")); } content.Add(new ScoreboardTime(score.Date, text_size) diff --git a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs index 72e590b009..488b99d620 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs @@ -125,10 +125,12 @@ namespace osu.Game.Overlays.BeatmapSet.Scores ppColumn.Alpha = value.BeatmapInfo!.Status.GrantsPerformancePoints() ? 1 : 0; - if (value.PP is double pp) - ppColumn.Text = pp.ToLocalisableString(@"N0"); - else + if (!value.Ranked) + ppColumn.Drawable = new UnrankedPerformancePointsPlaceholder { Font = smallFont }; + else if (value.PP is not double pp) ppColumn.Drawable = new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(smallFont.Size) }; + else + ppColumn.Text = pp.ToLocalisableString(@"N0"); statisticsColumns.ChildrenEnumerable = value.GetStatisticsForDisplay().Select(createStatisticsColumn); modsColumn.Mods = value.Mods; diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs index c26f2f19ba..c7d7af0bd7 100644 --- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs +++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs @@ -216,7 +216,18 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks if (!Score.PP.HasValue) { if (Score.Beatmap?.Status.GrantsPerformancePoints() == true) + { + if (!Score.Ranked) + { + return new UnrankedPerformancePointsPlaceholder + { + Font = OsuFont.GetFont(weight: FontWeight.Bold), + Colour = colourProvider.Highlight1 + }; + } + return new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(16), Colour = colourProvider.Highlight1 }; + } return new OsuSpriteText { diff --git a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs new file mode 100644 index 0000000000..4c44def1ee --- /dev/null +++ b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs @@ -0,0 +1,26 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +#nullable disable +using osu.Framework.Graphics; +using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; + +namespace osu.Game.Scoring.Drawables +{ + /// + /// A placeholder used in PP columns for scores that do not award PP. + /// + public partial class UnrankedPerformancePointsPlaceholder : SpriteText, IHasTooltip + { + public LocalisableString TooltipText => "pp is not awarded for this score"; // todo: replace with localised string ScoresStrings.StatusNoPp. + + public UnrankedPerformancePointsPlaceholder() + { + Anchor = Anchor.Centre; + Origin = Anchor.Centre; + Text = "-"; + } + } +} From b78c6ed673353d6d9158dc7b24c5278100a4e74f Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 23:28:30 +0300 Subject: [PATCH 497/651] Update design of "unprocessed PP" placeholder to match web --- .../Drawables/UnprocessedPerformancePointsPlaceholder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs b/osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs index 99eb7e964d..a2cb69062e 100644 --- a/osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs +++ b/osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs @@ -21,7 +21,7 @@ namespace osu.Game.Scoring.Drawables { Anchor = Anchor.Centre; Origin = Anchor.Centre; - Icon = FontAwesome.Solid.ExclamationTriangle; + Icon = FontAwesome.Solid.Sync; } } } From b0da0859d8c91a5b0c22805894bb56680c7a15c7 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 5 Feb 2024 23:28:53 +0300 Subject: [PATCH 498/651] Add visual test cases --- .../Visual/Online/TestSceneScoresContainer.cs | 19 +++++++++++ .../Online/TestSceneUserProfileScores.cs | 34 ++++++++++++++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs b/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs index 2bfbf76c10..33f4d577bd 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs @@ -154,6 +154,19 @@ namespace osu.Game.Tests.Visual.Online }); } + [Test] + public void TestUnrankedPP() + { + AddStep("Load scores with unranked PP", () => + { + var allScores = createScores(); + allScores.Scores[0].Ranked = false; + allScores.UserScore = createUserBest(); + allScores.UserScore.Score.Ranked = false; + scoresContainer.Scores = allScores; + }); + } + private ulong onlineID = 1; private APIScoresCollection createScores() @@ -184,6 +197,7 @@ namespace osu.Game.Tests.Visual.Online MaxCombo = 1234, TotalScore = 1234567890, Accuracy = 1, + Ranked = true, }, new SoloScoreInfo { @@ -206,6 +220,7 @@ namespace osu.Game.Tests.Visual.Online MaxCombo = 1234, TotalScore = 1234789, Accuracy = 0.9997, + Ranked = true, }, new SoloScoreInfo { @@ -227,6 +242,7 @@ namespace osu.Game.Tests.Visual.Online MaxCombo = 1234, TotalScore = 12345678, Accuracy = 0.9854, + Ranked = true, }, new SoloScoreInfo { @@ -247,6 +263,7 @@ namespace osu.Game.Tests.Visual.Online MaxCombo = 1234, TotalScore = 1234567, Accuracy = 0.8765, + Ranked = true, }, new SoloScoreInfo { @@ -263,6 +280,7 @@ namespace osu.Game.Tests.Visual.Online MaxCombo = 1234, TotalScore = 123456, Accuracy = 0.6543, + Ranked = true, }, } }; @@ -309,6 +327,7 @@ namespace osu.Game.Tests.Visual.Online MaxCombo = 1234, TotalScore = 123456, Accuracy = 0.6543, + Ranked = true, }, Position = 1337, }; diff --git a/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs b/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs index 5249e8694d..f72980757b 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs @@ -40,7 +40,8 @@ namespace osu.Game.Tests.Visual.Online new APIMod { Acronym = new OsuModHardRock().Acronym }, new APIMod { Acronym = new OsuModDoubleTime().Acronym }, }, - Accuracy = 0.9813 + Accuracy = 0.9813, + Ranked = true, }; var secondScore = new SoloScoreInfo @@ -62,7 +63,8 @@ namespace osu.Game.Tests.Visual.Online new APIMod { Acronym = new OsuModHardRock().Acronym }, new APIMod { Acronym = new OsuModDoubleTime().Acronym }, }, - Accuracy = 0.998546 + Accuracy = 0.998546, + Ranked = true, }; var thirdScore = new SoloScoreInfo @@ -79,7 +81,8 @@ namespace osu.Game.Tests.Visual.Online DifficultyName = "Insane" }, EndedAt = DateTimeOffset.Now, - Accuracy = 0.9726 + Accuracy = 0.9726, + Ranked = true, }; var noPPScore = new SoloScoreInfo @@ -95,7 +98,8 @@ namespace osu.Game.Tests.Visual.Online DifficultyName = "[4K] Cataclysmic Hypernova" }, EndedAt = DateTimeOffset.Now, - Accuracy = 0.55879 + Accuracy = 0.55879, + Ranked = true, }; var unprocessedPPScore = new SoloScoreInfo @@ -112,7 +116,26 @@ namespace osu.Game.Tests.Visual.Online Status = BeatmapOnlineStatus.Ranked, }, EndedAt = DateTimeOffset.Now, - Accuracy = 0.55879 + Accuracy = 0.55879, + Ranked = true, + }; + + var unrankedPPScore = new SoloScoreInfo + { + Rank = ScoreRank.B, + Beatmap = new APIBeatmap + { + BeatmapSet = new APIBeatmapSet + { + Title = "C18H27NO3(extend)", + Artist = "Team Grimoire", + }, + DifficultyName = "[4K] Cataclysmic Hypernova", + Status = BeatmapOnlineStatus.Ranked, + }, + EndedAt = DateTimeOffset.Now, + Accuracy = 0.55879, + Ranked = false, }; Add(new FillFlowContainer @@ -129,6 +152,7 @@ namespace osu.Game.Tests.Visual.Online new ColourProvidedContainer(OverlayColourScheme.Green, new DrawableProfileScore(secondScore)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileScore(noPPScore)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileScore(unprocessedPPScore)), + new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileScore(unrankedPPScore)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileWeightedScore(firstScore, 0.97)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileWeightedScore(secondScore, 0.85)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileWeightedScore(thirdScore, 0.66)), From 0da67e64b371c75aa76a4c01e6c3762aa208c603 Mon Sep 17 00:00:00 2001 From: kongehund <63306696+kongehund@users.noreply.github.com> Date: Tue, 6 Feb 2024 00:28:39 +0100 Subject: [PATCH 499/651] Fix deselecting slider adding control points --- .../Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs index 3575e15d1d..e421d497e7 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs @@ -171,7 +171,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders return false; // Allow right click to be handled by context menu case MouseButton.Left: - if (e.ControlPressed && IsSelected) + // If there's more than two objects selected, ctrl+click should deselect + if (e.ControlPressed && IsSelected && selectedObjects.Count < 2) { changeHandler?.BeginChange(); placementControlPoint = addControlPoint(e.MousePosition); From 08fac9772082088526845236c1b6dc471cee0e74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 6 Feb 2024 12:27:45 +0100 Subject: [PATCH 500/651] Add resources covering failure case --- .../special-skin/taiko-bar-right@2x.png | Bin 0 -> 39297 bytes .../special-skin/taikohitcircle@2x.png | Bin 0 -> 8720 bytes .../special-skin/taikohitcircleoverlay@2x.png | Bin 0 -> 6478 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 osu.Game.Rulesets.Taiko.Tests/Resources/special-skin/taiko-bar-right@2x.png create mode 100644 osu.Game.Rulesets.Taiko.Tests/Resources/special-skin/taikohitcircle@2x.png create mode 100644 osu.Game.Rulesets.Taiko.Tests/Resources/special-skin/taikohitcircleoverlay@2x.png diff --git a/osu.Game.Rulesets.Taiko.Tests/Resources/special-skin/taiko-bar-right@2x.png b/osu.Game.Rulesets.Taiko.Tests/Resources/special-skin/taiko-bar-right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad7849e53161dc0e6320582aa54953389236a50 GIT binary patch literal 39297 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 literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Taiko.Tests/Resources/special-skin/taikohitcircle@2x.png b/osu.Game.Rulesets.Taiko.Tests/Resources/special-skin/taikohitcircle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..73f856b16b67b84add2959868e4abca51bb7dea3 GIT binary patch literal 8720 zcmYM(RZtrY)S%%64NjoAlu+CqiWA(mEk%mEQzR6p0fN?Oao6BhoRZ?DI20=qf)#hS zop1Nw-8pkE&&;`eX5KghJ#`X7dO`pIK%%LkVgvvHF#jzG4*&odlQYZ$0KjM$Wn}|R zWn~s`UoS@&cLxA~>r?0_IgK8JC(-)G-wUYlWe`&KWf*H3Dxb<1T+nC(-o_p4lgX#~ zn#!Ls7_Js-#=F;*(k)WEJ7^wIlmg2rsb0K*5hheKUp0}2`EacxnDlT7A9OA zJ}dF?Ugk`${ai_rOZg$wPYI)5&CA^7BhbcoG>k~s90RK(`fM3^J%+VP)MQl|Ux;U) zL{|>*Z1InpwGL%mt_u=xoo}#LPtmJU5ShYpz=Y*vOMD~?O{g>S90bRLeE#(qbU`)64pWz0r{4BhHtYD?FL-306(43T3*+@{??mc z&djtEn1T0yQGNc}#upL4nXHd~ebk-*8r2Ag0$~b;UPD0aX2r2`$>z=HdQT&WM|k|P z85yw(Rfpc31_cJ*E*H=fANn599&>00iC|uipXy z0?+`hhVT;n2Lu^xGH2DDfHAOdX=guq@{ zGBevW?u*o$HOp_|;s0#4>)o}RB(x8=g6?En(gGXN-wjKtJ1y7PwU|G&GDY6@o zreKLiQdr}m0fZ5(%|=n8*0hk8ti99Z)+FAdNBk_>Vjm6803U!KO3bV|`J-`62^R?$ zvDUS7^_>?Y)FWbz*{cNjadFZ}Lk8|DQsm`}%dnZTn2of~6Ua-eL0x!@F_MSIX>A?& zvSlgnl;Bd|aawR%m|FC1yp4{Dk0Oj*V?n}oxM_GHV^8vRRM|L_P}r!N6r=aQe2r(= zC|0jgJ+Sw}t&>(?zFBlsSdLDM?IUbx{V`xl

      G19$KKIm<>Li&veC!rqSYVhV@>> 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 oGP5r_(7ax{*rdT!;o&aaD)(BoG$<$ylTeUG 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 Date: Tue, 6 Feb 2024 12:01:35 +0100 Subject: [PATCH 501/651] Convert selected legacy skin sprites to grayscale Matching stable. Closes https://github.com/ppy/osu/issues/9858. I would have liked to apply this in the taiko transformer itself, but the limited accessibility of texture uploads, and as such the raw image data, sort of prevents that... --- osu.Game/Skinning/LegacySkin.cs | 3 + osu.Game/Skinning/LegacyTextureLoaderStore.cs | 92 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 osu.Game/Skinning/LegacyTextureLoaderStore.cs diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs index cfa5f972d2..816cfc0a2d 100644 --- a/osu.Game/Skinning/LegacySkin.cs +++ b/osu.Game/Skinning/LegacySkin.cs @@ -58,6 +58,9 @@ namespace osu.Game.Skinning { } + protected override IResourceStore CreateTextureLoaderStore(IStorageResourceProvider resources, IResourceStore storage) + => new LegacyTextureLoaderStore(base.CreateTextureLoaderStore(resources, storage)); + protected override void ParseConfigurationStream(Stream stream) { base.ParseConfigurationStream(stream); diff --git a/osu.Game/Skinning/LegacyTextureLoaderStore.cs b/osu.Game/Skinning/LegacyTextureLoaderStore.cs new file mode 100644 index 0000000000..8c466e6aac --- /dev/null +++ b/osu.Game/Skinning/LegacyTextureLoaderStore.cs @@ -0,0 +1,92 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using osu.Framework.Graphics.Textures; +using osu.Framework.IO.Stores; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Processing; + +namespace osu.Game.Skinning +{ + public class LegacyTextureLoaderStore : IResourceStore + { + private readonly IResourceStore? wrappedStore; + + public LegacyTextureLoaderStore(IResourceStore? wrappedStore) + { + this.wrappedStore = wrappedStore; + } + + public TextureUpload Get(string name) + { + var textureUpload = wrappedStore?.Get(name); + + if (textureUpload == null) + return null!; + + return shouldConvertToGrayscale(name) + ? convertToGrayscale(textureUpload) + : textureUpload; + } + + public Task GetAsync(string name, CancellationToken cancellationToken = new CancellationToken()) + { + var textureUpload = wrappedStore?.Get(name); + + if (textureUpload == null) + return null!; + + return shouldConvertToGrayscale(name) + ? Task.Run(() => convertToGrayscale(textureUpload), cancellationToken) + : Task.FromResult(textureUpload); + } + + // https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/Graphics/Textures/TextureManager.cs#L91-L96 + private static readonly string[] grayscale_sprites = + { + @"taiko-bar-right", + @"taikobigcircle", + @"taikohitcircle", + @"taikohitcircleoverlay" + }; + + private bool shouldConvertToGrayscale(string name) + { + foreach (string grayscaleSprite in grayscale_sprites) + { + // unfortunately at this level of lookup we can encounter `@2x` scale suffixes in the name, + // so straight equality cannot be used. + if (name.StartsWith(grayscaleSprite, StringComparison.OrdinalIgnoreCase)) + return true; + } + + return false; + } + + private TextureUpload convertToGrayscale(TextureUpload textureUpload) + { + var image = Image.LoadPixelData(textureUpload.Data.ToArray(), textureUpload.Width, textureUpload.Height); + + // stable uses `0.299 * r + 0.587 * g + 0.114 * b` + // (https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/Graphics/Textures/pTexture.cs#L138-L153) + // which matches mode BT.601 (https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems) + image.Mutate(i => i.Grayscale(GrayscaleMode.Bt601)); + + return new TextureUpload(image); + } + + public Stream? GetStream(string name) => wrappedStore?.GetStream(name); + + public IEnumerable GetAvailableResources() => wrappedStore?.GetAvailableResources() ?? Array.Empty(); + + public void Dispose() + { + wrappedStore?.Dispose(); + } + } +} From a84f53b1693892973535250163d13dfe8981ee9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 6 Feb 2024 13:03:05 +0100 Subject: [PATCH 502/651] Allow pp for Blinds The mod does impact pp, but it requires no extra difficulty attributes (https://github.com/ppy/osu/pull/26935#issuecomment-1925734171). --- osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs b/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs index 8b0adbe50f..bb0e984418 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs @@ -31,6 +31,7 @@ namespace osu.Game.Rulesets.Osu.Mods public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.12 : 1; public override Type[] IncompatibleMods => new[] { typeof(OsuModFlashlight) }; + public override bool Ranked => true; private DrawableOsuBlinds blinds = null!; From 8df593a8e6734f59e9c3dc81b903e8e6dc5f20e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 6 Feb 2024 13:03:38 +0100 Subject: [PATCH 503/651] Allow pp for No Scope Deemed as not affecting difficulty or pp in https://github.com/ppy/osu/pull/26935#issuecomment-1925644008, so can be treated pretty much as nomod. --- osu.Game/Rulesets/Mods/ModNoScope.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Rulesets/Mods/ModNoScope.cs b/osu.Game/Rulesets/Mods/ModNoScope.cs index 5b9dfc0430..dd1bd9a719 100644 --- a/osu.Game/Rulesets/Mods/ModNoScope.cs +++ b/osu.Game/Rulesets/Mods/ModNoScope.cs @@ -22,6 +22,7 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.Fun; public override IconUsage? Icon => FontAwesome.Solid.EyeSlash; public override double ScoreMultiplier => 1; + public override bool Ranked => true; ///

      /// Slightly higher than the cutoff for . From 9e7912e66310fdfaec7bd9e2b27b1f3369eae81a Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Tue, 6 Feb 2024 21:56:26 +0900 Subject: [PATCH 504/651] Add test showing filled heatmap --- .../TestSceneAccuracyHeatmap.cs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneAccuracyHeatmap.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneAccuracyHeatmap.cs index f99518997b..5524af2061 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneAccuracyHeatmap.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneAccuracyHeatmap.cs @@ -54,7 +54,7 @@ namespace osu.Game.Rulesets.Osu.Tests { Anchor = Anchor.Centre, Origin = Anchor.Centre, - Size = new Vector2(130) + Size = new Vector2(300) } }; }); @@ -85,6 +85,30 @@ namespace osu.Game.Rulesets.Osu.Tests AddStep("return user input", () => InputManager.UseParentInput = true); } + [Test] + public void TestAllPoints() + { + AddStep("add points", () => + { + float minX = object1.DrawPosition.X - object1.DrawSize.X / 2; + float maxX = object1.DrawPosition.X + object1.DrawSize.X / 2; + + float minY = object1.DrawPosition.Y - object1.DrawSize.Y / 2; + float maxY = object1.DrawPosition.Y + object1.DrawSize.Y / 2; + + for (int i = 0; i < 10; i++) + { + for (float x = minX; x <= maxX; x += 0.5f) + { + for (float y = minY; y <= maxY; y += 0.5f) + { + accuracyHeatmap.AddPoint(object2.Position, object1.Position, new Vector2(x, y), RNG.NextSingle(10, 500)); + } + } + } + }); + } + protected override bool OnMouseDown(MouseDownEvent e) { accuracyHeatmap.AddPoint(object2.Position, object1.Position, background.ToLocalSpace(e.ScreenSpaceMouseDownPosition), 50); From 891346f7958b517d82022cf4ecaf2f980032c5fe Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Tue, 6 Feb 2024 21:56:52 +0900 Subject: [PATCH 505/651] Fix hit accuracy heatmap points being offset --- osu.Game.Rulesets.Osu/Statistics/AccuracyHeatmap.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Statistics/AccuracyHeatmap.cs b/osu.Game.Rulesets.Osu/Statistics/AccuracyHeatmap.cs index 83bab7dc01..f9d4a3b325 100644 --- a/osu.Game.Rulesets.Osu/Statistics/AccuracyHeatmap.cs +++ b/osu.Game.Rulesets.Osu/Statistics/AccuracyHeatmap.cs @@ -191,7 +191,7 @@ namespace osu.Game.Rulesets.Osu.Statistics for (int c = 0; c < points_per_dimension; c++) { - HitPointType pointType = Vector2.Distance(new Vector2(c, r), centre) <= innerRadius + HitPointType pointType = Vector2.Distance(new Vector2(c + 0.5f, r + 0.5f), centre) <= innerRadius ? HitPointType.Hit : HitPointType.Miss; From c21af1bf3d44f3c5b70c95c573748c2f41cd35f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 6 Feb 2024 14:53:01 +0100 Subject: [PATCH 506/651] Use more explicit match `taiko-bar-right-glow` is a prefix of `taiko-bar-right`... --- osu.Game/Skinning/LegacyTextureLoaderStore.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Skinning/LegacyTextureLoaderStore.cs b/osu.Game/Skinning/LegacyTextureLoaderStore.cs index 8c466e6aac..29206bbb85 100644 --- a/osu.Game/Skinning/LegacyTextureLoaderStore.cs +++ b/osu.Game/Skinning/LegacyTextureLoaderStore.cs @@ -61,8 +61,11 @@ namespace osu.Game.Skinning { // unfortunately at this level of lookup we can encounter `@2x` scale suffixes in the name, // so straight equality cannot be used. - if (name.StartsWith(grayscaleSprite, StringComparison.OrdinalIgnoreCase)) + if (name.Equals(grayscaleSprite, StringComparison.OrdinalIgnoreCase) + || name.Equals($@"{grayscaleSprite}@2x", StringComparison.OrdinalIgnoreCase)) + { return true; + } } return false; From ee05743921d8ab7a6b1041b4d47adadee9540b00 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Tue, 6 Feb 2024 22:58:11 +0900 Subject: [PATCH 507/651] Bump databased star rating versions --- osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs | 2 +- osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs index 6bb6879052..4190e74e51 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs @@ -29,7 +29,7 @@ namespace osu.Game.Rulesets.Mania.Difficulty private readonly bool isForCurrentRuleset; private readonly double originalOverallDifficulty; - public override int Version => 20220902; + public override int Version => 20230817; public ManiaDifficultyCalculator(IRulesetInfo ruleset, IWorkingBeatmap beatmap) : base(ruleset, beatmap) diff --git a/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs b/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs index ab193caaa3..b84c2d25ee 100644 --- a/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs @@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Taiko.Difficulty { private const double difficulty_multiplier = 1.35; - public override int Version => 20220902; + public override int Version => 20221107; public TaikoDifficultyCalculator(IRulesetInfo ruleset, IWorkingBeatmap beatmap) : base(ruleset, beatmap) From 5265d33c126c612a787bed98fa1c665d061c78c0 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Tue, 6 Feb 2024 23:32:54 +0900 Subject: [PATCH 508/651] Make coverage into a bindable --- .../TestScenePlayfieldCoveringContainer.cs | 12 ++++---- .../Mods/ManiaModPlayfieldCover.cs | 2 +- .../UI/PlayfieldCoveringWrapper.cs | 28 +++++++++++-------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/TestScenePlayfieldCoveringContainer.cs b/osu.Game.Rulesets.Mania.Tests/TestScenePlayfieldCoveringContainer.cs index 2a8dc715f9..341d52afcf 100644 --- a/osu.Game.Rulesets.Mania.Tests/TestScenePlayfieldCoveringContainer.cs +++ b/osu.Game.Rulesets.Mania.Tests/TestScenePlayfieldCoveringContainer.cs @@ -39,18 +39,18 @@ namespace osu.Game.Rulesets.Mania.Tests public void TestScrollingDownwards() { AddStep("set down scroll", () => scrollingContainer.Direction = ScrollingDirection.Down); - AddStep("set coverage = 0.5", () => cover.Coverage = 0.5f); - AddStep("set coverage = 0.8f", () => cover.Coverage = 0.8f); - AddStep("set coverage = 0.2f", () => cover.Coverage = 0.2f); + AddStep("set coverage = 0.5", () => cover.Coverage.Value = 0.5f); + AddStep("set coverage = 0.8f", () => cover.Coverage.Value = 0.8f); + AddStep("set coverage = 0.2f", () => cover.Coverage.Value = 0.2f); } [Test] public void TestScrollingUpwards() { AddStep("set up scroll", () => scrollingContainer.Direction = ScrollingDirection.Up); - AddStep("set coverage = 0.5", () => cover.Coverage = 0.5f); - AddStep("set coverage = 0.8f", () => cover.Coverage = 0.8f); - AddStep("set coverage = 0.2f", () => cover.Coverage = 0.2f); + AddStep("set coverage = 0.5", () => cover.Coverage.Value = 0.5f); + AddStep("set coverage = 0.8f", () => cover.Coverage.Value = 0.8f); + AddStep("set coverage = 0.2f", () => cover.Coverage.Value = 0.2f); } } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs index bc76c5cfe9..18c3ecc073 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs @@ -41,7 +41,7 @@ namespace osu.Game.Rulesets.Mania.Mods { c.RelativeSizeAxes = Axes.Both; c.Direction = ExpandDirection; - c.Coverage = Coverage.Value; + c.Coverage.BindTo(Coverage); })); } } diff --git a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs index 92f471e36b..0956b2f98f 100644 --- a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs +++ b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs @@ -19,6 +19,11 @@ namespace osu.Game.Rulesets.Mania.UI /// public partial class PlayfieldCoveringWrapper : CompositeDrawable { + /// + /// The relative area that should be completely covered. This does not include the fade. + /// + public readonly BindableFloat Coverage = new BindableFloat(); + /// /// The complete cover, including gradient and fill. /// @@ -94,21 +99,20 @@ namespace osu.Game.Rulesets.Mania.UI scrollDirection.BindValueChanged(onScrollDirectionChanged, true); } + protected override void LoadComplete() + { + base.LoadComplete(); + + Coverage.BindValueChanged(c => + { + filled.Height = c.NewValue; + gradient.Y = -c.NewValue; + }, true); + } + private void onScrollDirectionChanged(ValueChangedEvent direction) => cover.Rotation = direction.NewValue == ScrollingDirection.Up ? 0 : 180f; - /// - /// The relative area that should be completely covered. This does not include the fade. - /// - public float Coverage - { - set - { - filled.Height = value; - gradient.Y = -value; - } - } - /// /// The direction in which the cover expands. /// From 6ffe8e171373fa78c067f8c38747971ccf91f6a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 6 Feb 2024 14:48:49 +0100 Subject: [PATCH 509/651] Use staggered exponential backoff when retrying in `PersistentEndpointClientConnector` There are suspicions that the straight 5s retry could have caused a situation a few days ago for `osu-server-spectator` wherein it was getting hammered by constant retry requests. This should make that a little less likely to happen. Numbers chosen are arbitrary, but mostly follow stable's bancho retry intervals because why not. Stable also skips the exponential backoff in case of errors it considers transient, but I decided not to bother for now. Starts off from 3 seconds, then ramps up to up to 2 minutes. Added stagger factor is 25% of duration, either direction. The stagger factor helps given that if spectator server is dead, each client has three separate connections to it which it will retry on (one to each hub). --- .../PersistentEndpointClientConnector.cs | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/osu.Game/Online/PersistentEndpointClientConnector.cs b/osu.Game/Online/PersistentEndpointClientConnector.cs index 024a0fea73..9e7543ce2b 100644 --- a/osu.Game/Online/PersistentEndpointClientConnector.cs +++ b/osu.Game/Online/PersistentEndpointClientConnector.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using osu.Framework.Bindables; using osu.Framework.Extensions.TypeExtensions; using osu.Framework.Logging; +using osu.Framework.Utils; using osu.Game.Online.API; namespace osu.Game.Online @@ -31,6 +32,12 @@ namespace osu.Game.Online private CancellationTokenSource connectCancelSource = new CancellationTokenSource(); private bool started; + /// + /// How much to delay before attempting to connect again, in milliseconds. + /// Subject to exponential back-off. + /// + private int retryDelay = 3000; + /// /// Constructs a new . /// @@ -78,6 +85,8 @@ namespace osu.Game.Online private async Task connect() { cancelExistingConnect(); + // reset retry delay to default. + retryDelay = 3000; if (!await connectionLock.WaitAsync(10000).ConfigureAwait(false)) throw new TimeoutException("Could not obtain a lock to connect. A previous attempt is likely stuck."); @@ -134,8 +143,15 @@ namespace osu.Game.Online ///
      private async Task handleErrorAndDelay(Exception exception, CancellationToken cancellationToken) { - Logger.Log($"{ClientName} connect attempt failed: {exception.Message}", LoggingTarget.Network); - await Task.Delay(5000, cancellationToken).ConfigureAwait(false); + // random stagger factor to avoid mass incidental synchronisation + // compare: https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/Online/BanchoClient.cs#L331 + int thisDelay = (int)(retryDelay * RNG.NextDouble(0.75, 1.25)); + // exponential backoff with upper limit + // compare: https://github.com/peppy/osu-stable-reference/blob/013c3010a9d495e3471a9c59518de17006f9ad89/osu!/Online/BanchoClient.cs#L539 + retryDelay = Math.Min(120000, (int)(retryDelay * 1.5)); + + Logger.Log($"{ClientName} connect attempt failed: {exception.Message}. Next attempt in {thisDelay / 1000:N0} seconds.", LoggingTarget.Network); + await Task.Delay(thisDelay, cancellationToken).ConfigureAwait(false); } /// From 5bc7befbd4d780c8f3e473865e3679521bbfe1f7 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Tue, 6 Feb 2024 23:47:20 +0900 Subject: [PATCH 510/651] Add progressive cover to mania HD and FI mods --- .../Mods/ManiaModFadeIn.cs | 11 +------ .../Mods/ManiaModHidden.cs | 31 +++++++++++++------ .../Mods/ManiaModPlayfieldCover.cs | 2 -- osu.Game/Rulesets/Mods/ModHidden.cs | 4 +-- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs index 196514c7b1..d436f22cdd 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs @@ -3,13 +3,12 @@ using System; using System.Linq; -using osu.Framework.Bindables; using osu.Framework.Localisation; using osu.Game.Rulesets.Mania.UI; namespace osu.Game.Rulesets.Mania.Mods { - public class ManiaModFadeIn : ManiaModPlayfieldCover + public class ManiaModFadeIn : ManiaModHidden { public override string Name => "Fade In"; public override string Acronym => "FI"; @@ -19,13 +18,5 @@ namespace osu.Game.Rulesets.Mania.Mods public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ManiaModHidden)).ToArray(); protected override CoverExpandDirection ExpandDirection => CoverExpandDirection.AlongScroll; - - public override BindableNumber Coverage { get; } = new BindableFloat(0.5f) - { - Precision = 0.1f, - MinValue = 0.1f, - MaxValue = 0.7f, - Default = 0.5f, - }; } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs index f23cb335a5..7dcd5816a9 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs @@ -6,24 +6,37 @@ using System.Linq; using osu.Framework.Localisation; using osu.Game.Rulesets.Mania.UI; using osu.Framework.Bindables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Mods { public class ManiaModHidden : ManiaModPlayfieldCover { + /// + /// osu!stable is referenced to 480px. + /// + private const float playfield_height = 480; + + private const float min_coverage = 160f / playfield_height; + private const float max_coverage = 400f / playfield_height; + private const float coverage_increase_per_combo = 0.5f / playfield_height; + public override LocalisableString Description => @"Keys fade out before you hit them!"; public override double ScoreMultiplier => 1; - - public override BindableNumber Coverage { get; } = new BindableFloat(0.5f) - { - Precision = 0.1f, - MinValue = 0.2f, - MaxValue = 0.8f, - Default = 0.5f, - }; - public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ManiaModFadeIn)).ToArray(); + public override BindableNumber Coverage { get; } = new BindableFloat(min_coverage); protected override CoverExpandDirection ExpandDirection => CoverExpandDirection.AgainstScroll; + + private readonly BindableInt combo = new BindableInt(); + + public override void ApplyToScoreProcessor(ScoreProcessor scoreProcessor) + { + base.ApplyToScoreProcessor(scoreProcessor); + + combo.UnbindAll(); + combo.BindTo(scoreProcessor.Combo); + combo.BindValueChanged(c => Coverage.Value = Math.Min(max_coverage, min_coverage + c.NewValue * coverage_increase_per_combo), true); + } } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs index 18c3ecc073..aadb9b5717 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs @@ -6,7 +6,6 @@ using System.Linq; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Game.Configuration; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mania.UI; using osu.Game.Rulesets.Mods; @@ -24,7 +23,6 @@ namespace osu.Game.Rulesets.Mania.Mods /// protected abstract CoverExpandDirection ExpandDirection { get; } - [SettingSource("Coverage", "The proportion of playfield height that notes will be hidden for.")] public abstract BindableNumber Coverage { get; } public virtual void ApplyToDrawableRuleset(DrawableRuleset drawableRuleset) diff --git a/osu.Game/Rulesets/Mods/ModHidden.cs b/osu.Game/Rulesets/Mods/ModHidden.cs index 5a1abf115f..2915cb9bea 100644 --- a/osu.Game/Rulesets/Mods/ModHidden.cs +++ b/osu.Game/Rulesets/Mods/ModHidden.cs @@ -16,11 +16,11 @@ namespace osu.Game.Rulesets.Mods public override ModType Type => ModType.DifficultyIncrease; public override bool Ranked => UsesDefaultConfiguration; - public void ApplyToScoreProcessor(ScoreProcessor scoreProcessor) + public virtual void ApplyToScoreProcessor(ScoreProcessor scoreProcessor) { } - public ScoreRank AdjustRank(ScoreRank rank, double accuracy) + public virtual ScoreRank AdjustRank(ScoreRank rank, double accuracy) { switch (rank) { From bacb1d0dc7cf484a0a6b70f5ecdd0f4ec28bd350 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Tue, 6 Feb 2024 23:58:27 +0900 Subject: [PATCH 511/651] Add easing to make the transition less awkward --- .../UI/PlayfieldCoveringWrapper.cs | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs index 0956b2f98f..f0ac18d7ca 100644 --- a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs +++ b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; @@ -8,6 +9,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; +using osu.Framework.Utils; using osu.Game.Rulesets.UI.Scrolling; using osuTK; using osuTK.Graphics; @@ -103,11 +105,20 @@ namespace osu.Game.Rulesets.Mania.UI { base.LoadComplete(); - Coverage.BindValueChanged(c => - { - filled.Height = c.NewValue; - gradient.Y = -c.NewValue; - }, true); + updateHeight(Coverage.Value); + } + + protected override void Update() + { + base.Update(); + + updateHeight((float)Interpolation.DampContinuously(filled.Height, Coverage.Value, 25, Math.Abs(Time.Elapsed))); + } + + private void updateHeight(float height) + { + filled.Height = height; + gradient.Y = -height; } private void onScrollDirectionChanged(ValueChangedEvent direction) From 69db1b2778035b0d02ce94b842f8bedc3b88971c Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Wed, 7 Feb 2024 00:15:06 +0900 Subject: [PATCH 512/651] Add ManiaModCover to take over old roles of the mods --- osu.Game.Rulesets.Mania/ManiaRuleset.cs | 2 +- osu.Game.Rulesets.Mania/Mods/ManiaModCover.cs | 44 +++++++++++++++++++ .../Mods/ManiaModFadeIn.cs | 6 ++- .../Mods/ManiaModHidden.cs | 9 +++- ...Cover.cs => ManiaModWithPlayfieldCover.cs} | 5 ++- 5 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 osu.Game.Rulesets.Mania/Mods/ManiaModCover.cs rename osu.Game.Rulesets.Mania/Mods/{ManiaModPlayfieldCover.cs => ManiaModWithPlayfieldCover.cs} (88%) diff --git a/osu.Game.Rulesets.Mania/ManiaRuleset.cs b/osu.Game.Rulesets.Mania/ManiaRuleset.cs index c38d6519bd..f19d43826f 100644 --- a/osu.Game.Rulesets.Mania/ManiaRuleset.cs +++ b/osu.Game.Rulesets.Mania/ManiaRuleset.cs @@ -247,7 +247,7 @@ namespace osu.Game.Rulesets.Mania new ManiaModHardRock(), new MultiMod(new ManiaModSuddenDeath(), new ManiaModPerfect()), new MultiMod(new ManiaModDoubleTime(), new ManiaModNightcore()), - new MultiMod(new ManiaModFadeIn(), new ManiaModHidden()), + new MultiMod(new ManiaModFadeIn(), new ManiaModHidden(), new ManiaModCover()), new ManiaModFlashlight(), new ModAccuracyChallenge(), }; diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModCover.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModCover.cs new file mode 100644 index 0000000000..eb243bfab7 --- /dev/null +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModCover.cs @@ -0,0 +1,44 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Linq; +using osu.Framework.Bindables; +using osu.Framework.Localisation; +using osu.Game.Configuration; +using osu.Game.Rulesets.Mania.UI; + +namespace osu.Game.Rulesets.Mania.Mods +{ + public class ManiaModCover : ManiaModWithPlayfieldCover + { + public override string Name => "Cover"; + public override string Acronym => "CO"; + + public override LocalisableString Description => @"Decrease the playfield's viewing area."; + + public override double ScoreMultiplier => 1; + + protected override CoverExpandDirection ExpandDirection => Direction.Value; + + public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] + { + typeof(ManiaModHidden), + typeof(ManiaModFadeIn) + }).ToArray(); + + public override bool Ranked => false; + + [SettingSource("Coverage", "The proportion of playfield height that notes will be hidden for.")] + public override BindableNumber Coverage { get; } = new BindableFloat(0.5f) + { + Precision = 0.1f, + MinValue = 0.2f, + MaxValue = 0.8f, + Default = 0.5f, + }; + + [SettingSource("Direction", "The direction on which the cover is applied")] + public Bindable Direction { get; } = new Bindable(); + } +} diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs index d436f22cdd..54a0b8f36d 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModFadeIn.cs @@ -15,7 +15,11 @@ namespace osu.Game.Rulesets.Mania.Mods public override LocalisableString Description => @"Keys appear out of nowhere!"; public override double ScoreMultiplier => 1; - public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ManiaModHidden)).ToArray(); + public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] + { + typeof(ManiaModHidden), + typeof(ManiaModCover) + }).ToArray(); protected override CoverExpandDirection ExpandDirection => CoverExpandDirection.AlongScroll; } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs index 7dcd5816a9..f4d5386d70 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs @@ -10,7 +10,7 @@ using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Mods { - public class ManiaModHidden : ManiaModPlayfieldCover + public class ManiaModHidden : ManiaModWithPlayfieldCover { /// /// osu!stable is referenced to 480px. @@ -23,7 +23,12 @@ namespace osu.Game.Rulesets.Mania.Mods public override LocalisableString Description => @"Keys fade out before you hit them!"; public override double ScoreMultiplier => 1; - public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ManiaModFadeIn)).ToArray(); + + public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] + { + typeof(ManiaModFadeIn), + typeof(ManiaModCover) + }).ToArray(); public override BindableNumber Coverage { get; } = new BindableFloat(min_coverage); protected override CoverExpandDirection ExpandDirection => CoverExpandDirection.AgainstScroll; diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModWithPlayfieldCover.cs similarity index 88% rename from osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs rename to osu.Game.Rulesets.Mania/Mods/ManiaModWithPlayfieldCover.cs index aadb9b5717..bb5807269a 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModPlayfieldCover.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModWithPlayfieldCover.cs @@ -14,7 +14,7 @@ using osu.Game.Rulesets.UI; namespace osu.Game.Rulesets.Mania.Mods { - public abstract class ManiaModPlayfieldCover : ModHidden, IApplicableToDrawableRuleset + public abstract class ManiaModWithPlayfieldCover : ModHidden, IApplicableToDrawableRuleset { public override Type[] IncompatibleMods => new[] { typeof(ModFlashlight) }; @@ -23,6 +23,9 @@ namespace osu.Game.Rulesets.Mania.Mods /// protected abstract CoverExpandDirection ExpandDirection { get; } + /// + /// The relative area that should be completely covered. This does not include the fade. + /// public abstract BindableNumber Coverage { get; } public virtual void ApplyToDrawableRuleset(DrawableRuleset drawableRuleset) From af20eacc82747661f2408b4540d221814ea5e1d8 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Wed, 7 Feb 2024 00:25:22 +0900 Subject: [PATCH 513/651] Fix coordinate space --- osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs index f4d5386d70..9def29f82b 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs @@ -13,9 +13,9 @@ namespace osu.Game.Rulesets.Mania.Mods public class ManiaModHidden : ManiaModWithPlayfieldCover { /// - /// osu!stable is referenced to 480px. + /// osu!stable is referenced to 768px. /// - private const float playfield_height = 480; + private const float playfield_height = 768; private const float min_coverage = 160f / playfield_height; private const float max_coverage = 400f / playfield_height; From 9314de640fe6f34f41d5aab45be148d7c0af4a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 6 Feb 2024 18:30:48 +0100 Subject: [PATCH 514/651] Populate `TotalScoreInfo` when converting `SoloScoreInfo` to `ScoreInfo` For use in https://github.com/ppy/osu-tools/pull/195. --- osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs b/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs index 732da3d5da..e4ae83ca74 100644 --- a/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs +++ b/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs @@ -203,6 +203,7 @@ namespace osu.Game.Online.API.Requests.Responses Ruleset = new RulesetInfo { OnlineID = RulesetID }, Passed = Passed, TotalScore = TotalScore, + LegacyTotalScore = LegacyTotalScore, Accuracy = Accuracy, MaxCombo = MaxCombo, Rank = Rank, From 8f59cb7659d2fddaaa588417c9c534bee6cc5ebd Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Tue, 6 Feb 2024 12:54:53 -0800 Subject: [PATCH 515/651] Hide ruleset selector when on kudosu ranking --- osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs index a23ec18afe..1c743ff152 100644 --- a/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs +++ b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs @@ -39,5 +39,15 @@ namespace osu.Game.Overlays.Rankings Icon = OsuIcon.Ranking; } } + + protected override void LoadComplete() + { + base.LoadComplete(); + + Current.BindValueChanged(scope => + { + rulesetSelector.FadeTo(scope.NewValue <= RankingsScope.Country ? 1 : 0, 200, Easing.OutQuint); + }); + } } } From 21e5ae5ba975aa072e0246196971ebd347aa05a8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 7 Feb 2024 16:43:53 +0800 Subject: [PATCH 516/651] Minor adjustments --- .../Rankings/RankingsOverlayHeader.cs | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs index 1c743ff152..cf132ed4da 100644 --- a/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs +++ b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs @@ -1,13 +1,11 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using osu.Framework.Bindables; -using osu.Game.Localisation; -using osu.Game.Resources.Localisation.Web; using osu.Framework.Graphics; using osu.Game.Graphics; +using osu.Game.Localisation; +using osu.Game.Resources.Localisation.Web; using osu.Game.Rulesets; using osu.Game.Users; @@ -19,8 +17,8 @@ namespace osu.Game.Overlays.Rankings public Bindable Country => countryFilter.Current; - private OverlayRulesetSelector rulesetSelector; - private CountryFilter countryFilter; + private OverlayRulesetSelector rulesetSelector = null!; + private CountryFilter countryFilter = null!; protected override OverlayTitle CreateTitle() => new RankingsTitle(); @@ -46,8 +44,23 @@ namespace osu.Game.Overlays.Rankings Current.BindValueChanged(scope => { - rulesetSelector.FadeTo(scope.NewValue <= RankingsScope.Country ? 1 : 0, 200, Easing.OutQuint); - }); + rulesetSelector.FadeTo(showRulesetSelector(scope.NewValue) ? 1 : 0, 200, Easing.OutQuint); + }, true); + + bool showRulesetSelector(RankingsScope scope) + { + switch (scope) + { + case RankingsScope.Performance: + case RankingsScope.Spotlights: + case RankingsScope.Score: + case RankingsScope.Country: + return true; + + default: + return false; + } + } } } } From 9a3c947319c93e19299424a40b9aa982dffe11c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 7 Feb 2024 13:35:12 +0100 Subject: [PATCH 517/651] Remove unnecessary `#nullable disable` --- .../Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs index 4c44def1ee..025977e745 100644 --- a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs +++ b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs @@ -1,7 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable using osu.Framework.Graphics; using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; From f22828bc50db359957c13abceee296ac7b3b95fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 7 Feb 2024 13:36:46 +0100 Subject: [PATCH 518/651] Flip `if`s to reduce nesting --- .../Sections/Ranks/DrawableProfileScore.cs | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs index c7d7af0bd7..d1988956be 100644 --- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs +++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs @@ -213,22 +213,36 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks private Drawable createDrawablePerformance() { - if (!Score.PP.HasValue) + if (Score.PP.HasValue) { - if (Score.Beatmap?.Status.GrantsPerformancePoints() == true) + return new FillFlowContainer { - if (!Score.Ranked) + AutoSizeAxes = Axes.Both, + Direction = FillDirection.Horizontal, + Children = new[] { - return new UnrankedPerformancePointsPlaceholder + new OsuSpriteText { + Anchor = Anchor.BottomLeft, + Origin = Anchor.BottomLeft, Font = OsuFont.GetFont(weight: FontWeight.Bold), + Text = $"{Score.PP:0}", Colour = colourProvider.Highlight1 - }; + }, + new OsuSpriteText + { + Anchor = Anchor.BottomLeft, + Origin = Anchor.BottomLeft, + Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold), + Text = "pp", + Colour = colourProvider.Light3 + } } + }; + } - return new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(16), Colour = colourProvider.Highlight1 }; - } - + if (Score.Beatmap?.Status.GrantsPerformancePoints() != true) + { return new OsuSpriteText { Font = OsuFont.GetFont(weight: FontWeight.Bold), @@ -237,30 +251,16 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks }; } - return new FillFlowContainer + if (!Score.Ranked) { - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Horizontal, - Children = new[] + return new UnrankedPerformancePointsPlaceholder { - new OsuSpriteText - { - Anchor = Anchor.BottomLeft, - Origin = Anchor.BottomLeft, - Font = OsuFont.GetFont(weight: FontWeight.Bold), - Text = $"{Score.PP:0}", - Colour = colourProvider.Highlight1 - }, - new OsuSpriteText - { - Anchor = Anchor.BottomLeft, - Origin = Anchor.BottomLeft, - Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold), - Text = "pp", - Colour = colourProvider.Light3 - } - } - }; + Font = OsuFont.GetFont(weight: FontWeight.Bold), + Colour = colourProvider.Highlight1 + }; + } + + return new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(16), Colour = colourProvider.Highlight1 }; } private partial class ScoreBeatmapMetadataContainer : BeatmapMetadataContainer From 3f51148719918f0b5d8d91b1575a87319d21a3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 7 Feb 2024 13:37:37 +0100 Subject: [PATCH 519/651] Update resources --- osu.Game/osu.Game.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 935b759e4d..db41b04e44 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -37,7 +37,7 @@ - + From 706a16677c1e86b921301d8d499487c7b954c354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 7 Feb 2024 13:38:05 +0100 Subject: [PATCH 520/651] Use localised string --- .../Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs index 025977e745..c5c190e1a1 100644 --- a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs +++ b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs @@ -5,6 +5,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; +using osu.Game.Resources.Localisation.Web; namespace osu.Game.Scoring.Drawables { @@ -13,7 +14,7 @@ namespace osu.Game.Scoring.Drawables ///
      public partial class UnrankedPerformancePointsPlaceholder : SpriteText, IHasTooltip { - public LocalisableString TooltipText => "pp is not awarded for this score"; // todo: replace with localised string ScoresStrings.StatusNoPp. + public LocalisableString TooltipText => ScoresStrings.StatusNoPp; public UnrankedPerformancePointsPlaceholder() { From 8f995a30af27f3cd90df67d1c45e434e028daf5d Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Thu, 8 Feb 2024 00:20:32 +0900 Subject: [PATCH 521/651] Fix legacy coverage metrics --- .../Mods/ManiaModHidden.cs | 29 +++++++++++++++---- .../Mods/ManiaModWithPlayfieldCover.cs | 4 ++- .../UI/PlayfieldCoveringWrapper.cs | 14 ++++++--- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs index 9def29f82b..211f21513d 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs @@ -6,20 +6,21 @@ using System.Linq; using osu.Framework.Localisation; using osu.Game.Rulesets.Mania.UI; using osu.Framework.Bindables; +using osu.Framework.Graphics; using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Mods { - public class ManiaModHidden : ManiaModWithPlayfieldCover + public partial class ManiaModHidden : ManiaModWithPlayfieldCover { /// /// osu!stable is referenced to 768px. /// - private const float playfield_height = 768; + private const float reference_playfield_height = 768; - private const float min_coverage = 160f / playfield_height; - private const float max_coverage = 400f / playfield_height; - private const float coverage_increase_per_combo = 0.5f / playfield_height; + private const float min_coverage = 160 / reference_playfield_height; + private const float max_coverage = 400f / reference_playfield_height; + private const float coverage_increase_per_combo = 0.5f / reference_playfield_height; public override LocalisableString Description => @"Keys fade out before you hit them!"; public override double ScoreMultiplier => 1; @@ -43,5 +44,23 @@ namespace osu.Game.Rulesets.Mania.Mods combo.BindTo(scoreProcessor.Combo); combo.BindValueChanged(c => Coverage.Value = Math.Min(max_coverage, min_coverage + c.NewValue * coverage_increase_per_combo), true); } + + protected override PlayfieldCoveringWrapper CreateCover(Drawable content) => new LegacyPlayfieldCover(content); + + private partial class LegacyPlayfieldCover : PlayfieldCoveringWrapper + { + public LegacyPlayfieldCover(Drawable content) + : base(content) + { + } + + protected override float GetHeight(float coverage) + { + if (DrawHeight == 0) + return base.GetHeight(coverage); + + return base.GetHeight(coverage) * reference_playfield_height / DrawHeight; + } + } } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModWithPlayfieldCover.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModWithPlayfieldCover.cs index bb5807269a..864ef6c3d6 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModWithPlayfieldCover.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModWithPlayfieldCover.cs @@ -38,7 +38,7 @@ namespace osu.Game.Rulesets.Mania.Mods Container hocParent = (Container)hoc.Parent!; hocParent.Remove(hoc, false); - hocParent.Add(new PlayfieldCoveringWrapper(hoc).With(c => + hocParent.Add(CreateCover(hoc).With(c => { c.RelativeSizeAxes = Axes.Both; c.Direction = ExpandDirection; @@ -47,6 +47,8 @@ namespace osu.Game.Rulesets.Mania.Mods } } + protected virtual PlayfieldCoveringWrapper CreateCover(Drawable content) => new PlayfieldCoveringWrapper(content); + protected override void ApplyIncreasedVisibilityState(DrawableHitObject hitObject, ArmedState state) { } diff --git a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs index f0ac18d7ca..2b70c527ae 100644 --- a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs +++ b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs @@ -43,6 +43,8 @@ namespace osu.Game.Rulesets.Mania.UI private readonly IBindable scrollDirection = new Bindable(); + private float currentCoverage; + public PlayfieldCoveringWrapper(Drawable content) { InternalChild = new BufferedContainer @@ -112,15 +114,19 @@ namespace osu.Game.Rulesets.Mania.UI { base.Update(); - updateHeight((float)Interpolation.DampContinuously(filled.Height, Coverage.Value, 25, Math.Abs(Time.Elapsed))); + updateHeight((float)Interpolation.DampContinuously(currentCoverage, Coverage.Value, 25, Math.Abs(Time.Elapsed))); } - private void updateHeight(float height) + private void updateHeight(float coverage) { - filled.Height = height; - gradient.Y = -height; + filled.Height = GetHeight(coverage); + gradient.Y = -GetHeight(coverage); + + currentCoverage = coverage; } + protected virtual float GetHeight(float coverage) => coverage; + private void onScrollDirectionChanged(ValueChangedEvent direction) => cover.Rotation = direction.NewValue == ScrollingDirection.Up ? 0 : 180f; From 0d7e82ab8df41e6950d97c1fa67e28389ca699d0 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 8 Feb 2024 00:20:53 +0800 Subject: [PATCH 522/651] Improve exception logging of unobserved exceptions via `FireAndForget` Coming from https://github.com/ppy/osu/issues/27076, where the log output makes finding where the exception arrived for nigh impossible. --- osu.Game/Online/Multiplayer/MultiplayerClientExtensions.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/osu.Game/Online/Multiplayer/MultiplayerClientExtensions.cs b/osu.Game/Online/Multiplayer/MultiplayerClientExtensions.cs index 2083aa4e28..d846e7f566 100644 --- a/osu.Game/Online/Multiplayer/MultiplayerClientExtensions.cs +++ b/osu.Game/Online/Multiplayer/MultiplayerClientExtensions.cs @@ -23,9 +23,12 @@ namespace osu.Game.Online.Multiplayer Debug.Assert(exception != null); - string message = exception.GetHubExceptionMessage() ?? exception.Message; + if (exception.GetHubExceptionMessage() is string message) + // Hub exceptions generally contain something we can show the user directly. + Logger.Log(message, level: LogLevel.Important); + else + Logger.Error(exception, $"Unobserved exception occurred via {nameof(FireAndForget)} call: {exception.Message}"); - Logger.Log(message, level: LogLevel.Important); onError?.Invoke(exception); } else From 6adf0ac01ebbdd82c19617fe5e96f291c58365c7 Mon Sep 17 00:00:00 2001 From: Berkan Diler Date: Thu, 8 Feb 2024 18:01:00 +0100 Subject: [PATCH 523/651] Use new LINQ Order() instead of OrderBy() when possible --- osu.Game.Rulesets.Mania/ManiaRuleset.cs | 2 +- osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs | 2 +- osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs | 4 ++-- osu.Game.Rulesets.Taiko/Difficulty/Skills/Peaks.cs | 2 +- osu.Game.Tournament/IO/TournamentStorage.cs | 2 +- osu.Game/Beatmaps/BeatmapImporter.cs | 4 ++-- osu.Game/Collections/CollectionDropdown.cs | 2 +- osu.Game/Database/RealmArchiveModelImporter.cs | 4 ++-- osu.Game/Overlays/Music/PlaylistOverlay.cs | 2 +- .../Overlays/Settings/Sections/Graphics/RendererSettings.cs | 2 +- osu.Game/Rulesets/Difficulty/Skills/StrainSkill.cs | 2 +- osu.Game/Rulesets/Edit/Checks/CheckBreaks.cs | 4 ++-- osu.Game/Rulesets/Mods/ModAdaptiveSpeed.cs | 2 +- osu.Game/Rulesets/RealmRulesetStore.cs | 2 +- .../Edit/Compose/Components/BeatDivisorPresetCollection.cs | 2 +- .../Edit/Compose/Components/Timeline/DifficultyPointPiece.cs | 2 +- 16 files changed, 20 insertions(+), 20 deletions(-) diff --git a/osu.Game.Rulesets.Mania/ManiaRuleset.cs b/osu.Game.Rulesets.Mania/ManiaRuleset.cs index c38d6519bd..75a642924c 100644 --- a/osu.Game.Rulesets.Mania/ManiaRuleset.cs +++ b/osu.Game.Rulesets.Mania/ManiaRuleset.cs @@ -375,7 +375,7 @@ namespace osu.Game.Rulesets.Mania /// The that corresponds to . private PlayfieldType getPlayfieldType(int variant) { - return (PlayfieldType)Enum.GetValues(typeof(PlayfieldType)).Cast().OrderByDescending(i => i).First(v => variant >= v); + return (PlayfieldType)Enum.GetValues(typeof(PlayfieldType)).Cast().OrderDescending().First(v => variant >= v); } protected override IEnumerable GetValidHitResults() diff --git a/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs b/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs index 1947d86a97..0444394d87 100644 --- a/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs +++ b/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs @@ -22,7 +22,7 @@ namespace osu.Game.Rulesets.Mania.Scoring } protected override IEnumerable EnumerateHitObjects(IBeatmap beatmap) - => base.EnumerateHitObjects(beatmap).OrderBy(ho => ho, JudgementOrderComparer.DEFAULT); + => base.EnumerateHitObjects(beatmap).Order(JudgementOrderComparer.DEFAULT); protected override double ComputeTotalScore(double comboProgress, double accuracyProgress, double bonusPortion) { diff --git a/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs b/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs index 15b20a5572..4a6328010b 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs @@ -48,7 +48,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills // These sections will not contribute to the difficulty. var peaks = GetCurrentStrainPeaks().Where(p => p > 0); - List strains = peaks.OrderByDescending(d => d).ToList(); + List strains = peaks.OrderDescending().ToList(); // We are reducing the highest strains first to account for extreme difficulty spikes for (int i = 0; i < Math.Min(strains.Count, ReducedSectionCount); i++) @@ -59,7 +59,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills // Difficulty is the weighted sum of the highest strains from every section. // We're sorting from highest to lowest strain. - foreach (double strain in strains.OrderByDescending(d => d)) + foreach (double strain in strains.OrderDescending()) { difficulty += strain * weight; weight *= DecayWeight; diff --git a/osu.Game.Rulesets.Taiko/Difficulty/Skills/Peaks.cs b/osu.Game.Rulesets.Taiko/Difficulty/Skills/Peaks.cs index ec8e754c5c..91d8e93543 100644 --- a/osu.Game.Rulesets.Taiko/Difficulty/Skills/Peaks.cs +++ b/osu.Game.Rulesets.Taiko/Difficulty/Skills/Peaks.cs @@ -81,7 +81,7 @@ namespace osu.Game.Rulesets.Taiko.Difficulty.Skills double difficulty = 0; double weight = 1; - foreach (double strain in peaks.OrderByDescending(d => d)) + foreach (double strain in peaks.OrderDescending()) { difficulty += strain * weight; weight *= 0.9; diff --git a/osu.Game.Tournament/IO/TournamentStorage.cs b/osu.Game.Tournament/IO/TournamentStorage.cs index 7c5f3e44a7..48cd45fdd4 100644 --- a/osu.Game.Tournament/IO/TournamentStorage.cs +++ b/osu.Game.Tournament/IO/TournamentStorage.cs @@ -45,6 +45,6 @@ namespace osu.Game.Tournament.IO Logger.Log("Changing tournament storage: " + GetFullPath(string.Empty)); } - public IEnumerable ListTournaments() => AllTournaments.GetDirectories(string.Empty).OrderBy(directory => directory, StringComparer.CurrentCultureIgnoreCase); + public IEnumerable ListTournaments() => AllTournaments.GetDirectories(string.Empty).Order(StringComparer.CurrentCultureIgnoreCase); } } diff --git a/osu.Game/Beatmaps/BeatmapImporter.cs b/osu.Game/Beatmaps/BeatmapImporter.cs index 7bb52eef52..5ff3ab64b2 100644 --- a/osu.Game/Beatmaps/BeatmapImporter.cs +++ b/osu.Game/Beatmaps/BeatmapImporter.cs @@ -266,8 +266,8 @@ namespace osu.Game.Beatmaps if (!base.CanReuseExisting(existing, import)) return false; - var existingIds = existing.Beatmaps.Select(b => b.OnlineID).OrderBy(i => i); - var importIds = import.Beatmaps.Select(b => b.OnlineID).OrderBy(i => i); + var existingIds = existing.Beatmaps.Select(b => b.OnlineID).Order(); + var importIds = import.Beatmaps.Select(b => b.OnlineID).Order(); // force re-import if we are not in a sane state. return existing.OnlineID == import.OnlineID && existingIds.SequenceEqual(importIds); diff --git a/osu.Game/Collections/CollectionDropdown.cs b/osu.Game/Collections/CollectionDropdown.cs index 249a0c35e7..15dd644073 100644 --- a/osu.Game/Collections/CollectionDropdown.cs +++ b/osu.Game/Collections/CollectionDropdown.cs @@ -74,7 +74,7 @@ namespace osu.Game.Collections } else { - foreach (int i in changes.DeletedIndices.OrderByDescending(i => i)) + foreach (int i in changes.DeletedIndices.OrderDescending()) filters.RemoveAt(i + 1); foreach (int i in changes.InsertedIndices) diff --git a/osu.Game/Database/RealmArchiveModelImporter.cs b/osu.Game/Database/RealmArchiveModelImporter.cs index 5383040eb4..bc4954c6ea 100644 --- a/osu.Game/Database/RealmArchiveModelImporter.cs +++ b/osu.Game/Database/RealmArchiveModelImporter.cs @@ -279,7 +279,7 @@ namespace osu.Game.Database // note that this should really be checking filesizes on disk (of existing files) for some degree of sanity. // or alternatively doing a faster hash check. either of these require database changes and reprocessing of existing files. if (CanSkipImport(existing, item) && - getFilenames(existing.Files).SequenceEqual(getShortenedFilenames(archive).Select(p => p.shortened).OrderBy(f => f)) && + getFilenames(existing.Files).SequenceEqual(getShortenedFilenames(archive).Select(p => p.shortened).Order()) && checkAllFilesExist(existing)) { LogForModel(item, @$"Found existing (optimised) {HumanisedModelName} for {item} (ID {existing.ID}) – skipping import."); @@ -437,7 +437,7 @@ namespace osu.Game.Database { MemoryStream hashable = new MemoryStream(); - foreach (string? file in reader.Filenames.Where(f => HashableFileTypes.Any(ext => f.EndsWith(ext, StringComparison.OrdinalIgnoreCase))).OrderBy(f => f)) + foreach (string? file in reader.Filenames.Where(f => HashableFileTypes.Any(ext => f.EndsWith(ext, StringComparison.OrdinalIgnoreCase))).Order()) { using (Stream s = reader.GetStream(file)) s.CopyTo(hashable); diff --git a/osu.Game/Overlays/Music/PlaylistOverlay.cs b/osu.Game/Overlays/Music/PlaylistOverlay.cs index 7784643163..6ecd0f51d3 100644 --- a/osu.Game/Overlays/Music/PlaylistOverlay.cs +++ b/osu.Game/Overlays/Music/PlaylistOverlay.cs @@ -122,7 +122,7 @@ namespace osu.Game.Overlays.Music foreach (int i in changes.InsertedIndices) beatmapSets.Insert(i, sender[i].ToLive(realm)); - foreach (int i in changes.DeletedIndices.OrderByDescending(i => i)) + foreach (int i in changes.DeletedIndices.OrderDescending()) beatmapSets.RemoveAt(i); } diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs index d4cef3f4d1..fc5dd34971 100644 --- a/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs @@ -36,7 +36,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics { LabelText = GraphicsSettingsStrings.Renderer, Current = renderer, - Items = host.GetPreferredRenderersForCurrentPlatform().OrderBy(t => t).Where(t => t != RendererType.Vulkan), + Items = host.GetPreferredRenderersForCurrentPlatform().Order().Where(t => t != RendererType.Vulkan), Keywords = new[] { @"compatibility", @"directx" }, }, // TODO: this needs to be a custom dropdown at some point diff --git a/osu.Game/Rulesets/Difficulty/Skills/StrainSkill.cs b/osu.Game/Rulesets/Difficulty/Skills/StrainSkill.cs index b43a272324..b07e8399c0 100644 --- a/osu.Game/Rulesets/Difficulty/Skills/StrainSkill.cs +++ b/osu.Game/Rulesets/Difficulty/Skills/StrainSkill.cs @@ -108,7 +108,7 @@ namespace osu.Game.Rulesets.Difficulty.Skills // Difficulty is the weighted sum of the highest strains from every section. // We're sorting from highest to lowest strain. - foreach (double strain in peaks.OrderByDescending(d => d)) + foreach (double strain in peaks.OrderDescending()) { difficulty += strain * weight; weight *= DecayWeight; diff --git a/osu.Game/Rulesets/Edit/Checks/CheckBreaks.cs b/osu.Game/Rulesets/Edit/Checks/CheckBreaks.cs index 94369443c2..0842ff5453 100644 --- a/osu.Game/Rulesets/Edit/Checks/CheckBreaks.cs +++ b/osu.Game/Rulesets/Edit/Checks/CheckBreaks.cs @@ -31,8 +31,8 @@ namespace osu.Game.Rulesets.Edit.Checks public IEnumerable Run(BeatmapVerifierContext context) { - var startTimes = context.Beatmap.HitObjects.Select(ho => ho.StartTime).OrderBy(x => x).ToList(); - var endTimes = context.Beatmap.HitObjects.Select(ho => ho.GetEndTime()).OrderBy(x => x).ToList(); + var startTimes = context.Beatmap.HitObjects.Select(ho => ho.StartTime).Order().ToList(); + var endTimes = context.Beatmap.HitObjects.Select(ho => ho.GetEndTime()).Order().ToList(); foreach (var breakPeriod in context.Beatmap.Breaks) { diff --git a/osu.Game/Rulesets/Mods/ModAdaptiveSpeed.cs b/osu.Game/Rulesets/Mods/ModAdaptiveSpeed.cs index 77aa5cdc15..19554b6504 100644 --- a/osu.Game/Rulesets/Mods/ModAdaptiveSpeed.cs +++ b/osu.Game/Rulesets/Mods/ModAdaptiveSpeed.cs @@ -188,7 +188,7 @@ namespace osu.Game.Rulesets.Mods public void ApplyToBeatmap(IBeatmap beatmap) { var hitObjects = getAllApplicableHitObjects(beatmap.HitObjects).ToList(); - var endTimes = hitObjects.Select(x => x.GetEndTime()).OrderBy(x => x).Distinct().ToList(); + var endTimes = hitObjects.Select(x => x.GetEndTime()).Order().Distinct().ToList(); foreach (HitObject hitObject in hitObjects) { diff --git a/osu.Game/Rulesets/RealmRulesetStore.cs b/osu.Game/Rulesets/RealmRulesetStore.cs index 456f6e399b..ba6f4583d1 100644 --- a/osu.Game/Rulesets/RealmRulesetStore.cs +++ b/osu.Game/Rulesets/RealmRulesetStore.cs @@ -107,7 +107,7 @@ namespace osu.Game.Rulesets } } - availableRulesets.AddRange(detachedRulesets.OrderBy(r => r)); + availableRulesets.AddRange(detachedRulesets.Order()); }); } diff --git a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorPresetCollection.cs b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorPresetCollection.cs index 56df0552cc..43ab47d2d7 100644 --- a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorPresetCollection.cs +++ b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorPresetCollection.cs @@ -35,7 +35,7 @@ namespace osu.Game.Screens.Edit.Compose.Components presets.Add(maxDivisor / candidate); } - return new BeatDivisorPresetCollection(BeatDivisorType.Custom, presets.Distinct().OrderBy(d => d)); + return new BeatDivisorPresetCollection(BeatDivisorType.Custom, presets.Distinct().Order()); } } } diff --git a/osu.Game/Screens/Edit/Compose/Components/Timeline/DifficultyPointPiece.cs b/osu.Game/Screens/Edit/Compose/Components/Timeline/DifficultyPointPiece.cs index ca1e9a5d9b..fc240c570b 100644 --- a/osu.Game/Screens/Edit/Compose/Components/Timeline/DifficultyPointPiece.cs +++ b/osu.Game/Screens/Edit/Compose/Components/Timeline/DifficultyPointPiece.cs @@ -169,7 +169,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline InspectorText.Clear(); - double[] sliderVelocities = EditorBeatmap.HitObjects.OfType().Select(sv => sv.SliderVelocityMultiplier).OrderBy(v => v).ToArray(); + double[] sliderVelocities = EditorBeatmap.HitObjects.OfType().Select(sv => sv.SliderVelocityMultiplier).Order().ToArray(); AddHeader("Base velocity (from beatmap setup)"); AddValue($"{beatmapVelocity:#,0.00}x"); From c500264306adceec5edbbab0baa40a7bc13c65c4 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 9 Feb 2024 23:20:31 +0300 Subject: [PATCH 524/651] Cache created judgement in HitObject --- .../TestSceneCatchSkinConfiguration.cs | 2 +- osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs | 2 +- osu.Game.Rulesets.Catch/Objects/Banana.cs | 2 +- osu.Game.Rulesets.Catch/Objects/BananaShower.cs | 2 +- osu.Game.Rulesets.Catch/Objects/Droplet.cs | 2 +- osu.Game.Rulesets.Catch/Objects/Fruit.cs | 2 +- osu.Game.Rulesets.Catch/Objects/JuiceStream.cs | 2 +- osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs | 2 +- osu.Game.Rulesets.Mania/Objects/BarLine.cs | 2 +- osu.Game.Rulesets.Mania/Objects/HoldNote.cs | 2 +- osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs | 2 +- osu.Game.Rulesets.Mania/Objects/Note.cs | 2 +- osu.Game.Rulesets.Mania/Objects/TailNote.cs | 2 +- .../TestSceneSpinnerRotation.cs | 2 +- osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs | 2 +- osu.Game.Rulesets.Osu/Objects/HitCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/Slider.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderTick.cs | 2 +- osu.Game.Rulesets.Osu/Objects/Spinner.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs | 2 +- .../TaikoHealthProcessorTest.cs | 8 ++++---- osu.Game.Rulesets.Taiko/Objects/BarLine.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs | 4 ++-- osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs | 2 +- .../Objects/StrongNestedHitObject.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/Swell.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/SwellTick.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs | 2 +- osu.Game/Beatmaps/IBeatmap.cs | 2 +- osu.Game/Database/StandardisedScoreMigrationTools.cs | 2 +- .../Difficulty/PerformanceBreakdownCalculator.cs | 4 ++-- .../Rulesets/Objects/Drawables/DrawableHitObject.cs | 2 +- osu.Game/Rulesets/Objects/HitObject.cs | 10 +++++++++- osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs | 2 +- osu.Game/Rulesets/Scoring/JudgementProcessor.cs | 2 +- .../Rulesets/Scoring/LegacyDrainingHealthProcessor.cs | 2 +- 41 files changed, 54 insertions(+), 46 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs index e2fc31d869..0d7aa6af10 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs @@ -80,7 +80,7 @@ namespace osu.Game.Rulesets.Catch.Tests { fruit.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty()); var drawableFruit = new DrawableFruit(fruit) { X = x }; - var judgement = fruit.CreateJudgement(); + var judgement = fruit.Judgement; catcher.OnNewResult(drawableFruit, new CatchJudgementResult(fruit, judgement) { Type = judgement.MaxResult diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs index f60ae29f77..b03fa00f76 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs @@ -293,7 +293,7 @@ namespace osu.Game.Rulesets.Catch.Tests private JudgementResult createResult(CatchHitObject hitObject) { - return new CatchJudgementResult(hitObject, hitObject.CreateJudgement()) + return new CatchJudgementResult(hitObject, hitObject.Judgement) { Type = catcher.CanCatch(hitObject) ? HitResult.Great : HitResult.Miss }; diff --git a/osu.Game.Rulesets.Catch/Objects/Banana.cs b/osu.Game.Rulesets.Catch/Objects/Banana.cs index b80527f379..30bdb24b14 100644 --- a/osu.Game.Rulesets.Catch/Objects/Banana.cs +++ b/osu.Game.Rulesets.Catch/Objects/Banana.cs @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Catch.Objects ///
      public int BananaIndex; - public override Judgement CreateJudgement() => new CatchBananaJudgement(); + protected override Judgement CreateJudgement() => new CatchBananaJudgement(); private static readonly IList default_banana_samples = new List { new BananaHitSampleInfo() }.AsReadOnly(); diff --git a/osu.Game.Rulesets.Catch/Objects/BananaShower.cs b/osu.Game.Rulesets.Catch/Objects/BananaShower.cs index 328cc2b52a..86c41fce90 100644 --- a/osu.Game.Rulesets.Catch/Objects/BananaShower.cs +++ b/osu.Game.Rulesets.Catch/Objects/BananaShower.cs @@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Catch.Objects { public override bool LastInCombo => true; - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); protected override void CreateNestedHitObjects(CancellationToken cancellationToken) { diff --git a/osu.Game.Rulesets.Catch/Objects/Droplet.cs b/osu.Game.Rulesets.Catch/Objects/Droplet.cs index 9c1004a04b..107c6c3979 100644 --- a/osu.Game.Rulesets.Catch/Objects/Droplet.cs +++ b/osu.Game.Rulesets.Catch/Objects/Droplet.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Catch.Objects { public class Droplet : PalpableCatchHitObject { - public override Judgement CreateJudgement() => new CatchDropletJudgement(); + protected override Judgement CreateJudgement() => new CatchDropletJudgement(); } } diff --git a/osu.Game.Rulesets.Catch/Objects/Fruit.cs b/osu.Game.Rulesets.Catch/Objects/Fruit.cs index 4818fe2cad..17270b803c 100644 --- a/osu.Game.Rulesets.Catch/Objects/Fruit.cs +++ b/osu.Game.Rulesets.Catch/Objects/Fruit.cs @@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Catch.Objects { public class Fruit : PalpableCatchHitObject { - public override Judgement CreateJudgement() => new CatchJudgement(); + protected override Judgement CreateJudgement() => new CatchJudgement(); public static FruitVisualRepresentation GetVisualRepresentation(int indexInBeatmap) => (FruitVisualRepresentation)(indexInBeatmap % 4); } diff --git a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs index 671291ef0e..49c24df5b9 100644 --- a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs +++ b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs @@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Catch.Objects ///
      private const float base_scoring_distance = 100; - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); public int RepeatCount { get; set; } diff --git a/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs b/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs index 1bf160b5a6..ddcb92875f 100644 --- a/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs +++ b/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Catch.Objects { public class TinyDroplet : Droplet { - public override Judgement CreateJudgement() => new CatchTinyDropletJudgement(); + protected override Judgement CreateJudgement() => new CatchTinyDropletJudgement(); } } diff --git a/osu.Game.Rulesets.Mania/Objects/BarLine.cs b/osu.Game.Rulesets.Mania/Objects/BarLine.cs index cf576239ed..742b5e4b0d 100644 --- a/osu.Game.Rulesets.Mania/Objects/BarLine.cs +++ b/osu.Game.Rulesets.Mania/Objects/BarLine.cs @@ -19,6 +19,6 @@ namespace osu.Game.Rulesets.Mania.Objects set => major.Value = value; } - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); } } diff --git a/osu.Game.Rulesets.Mania/Objects/HoldNote.cs b/osu.Game.Rulesets.Mania/Objects/HoldNote.cs index 3f930a310b..4aac455bc5 100644 --- a/osu.Game.Rulesets.Mania/Objects/HoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/HoldNote.cs @@ -112,7 +112,7 @@ namespace osu.Game.Rulesets.Mania.Objects }); } - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs b/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs index 47163d0d81..92b649c174 100644 --- a/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs +++ b/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs @@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Mania.Objects ///
      public class HoldNoteBody : ManiaHitObject { - public override Judgement CreateJudgement() => new HoldNoteBodyJudgement(); + protected override Judgement CreateJudgement() => new HoldNoteBodyJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } } diff --git a/osu.Game.Rulesets.Mania/Objects/Note.cs b/osu.Game.Rulesets.Mania/Objects/Note.cs index 0035960c63..b0f2991918 100644 --- a/osu.Game.Rulesets.Mania/Objects/Note.cs +++ b/osu.Game.Rulesets.Mania/Objects/Note.cs @@ -11,6 +11,6 @@ namespace osu.Game.Rulesets.Mania.Objects ///
      public class Note : ManiaHitObject { - public override Judgement CreateJudgement() => new ManiaJudgement(); + protected override Judgement CreateJudgement() => new ManiaJudgement(); } } diff --git a/osu.Game.Rulesets.Mania/Objects/TailNote.cs b/osu.Game.Rulesets.Mania/Objects/TailNote.cs index def32880f1..bddb4630cb 100644 --- a/osu.Game.Rulesets.Mania/Objects/TailNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/TailNote.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Mania.Objects ///
      public const double RELEASE_WINDOW_LENIENCE = 1.5; - public override Judgement CreateJudgement() => new ManiaJudgement(); + protected override Judgement CreateJudgement() => new ManiaJudgement(); public override double MaximumJudgementOffset => base.MaximumJudgementOffset * RELEASE_WINDOW_LENIENCE; } diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneSpinnerRotation.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneSpinnerRotation.cs index 6706d20080..8d81fe3017 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneSpinnerRotation.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneSpinnerRotation.cs @@ -134,7 +134,7 @@ namespace osu.Game.Rulesets.Osu.Tests // multipled by 2 to nullify the score multiplier. (autoplay mod selected) long totalScore = scoreProcessor.TotalScore.Value * 2; - return totalScore == (int)(drawableSpinner.Result.TotalRotation / 360) * scoreProcessor.GetBaseScoreForResult(new SpinnerTick().CreateJudgement().MaxResult); + return totalScore == (int)(drawableSpinner.Result.TotalRotation / 360) * scoreProcessor.GetBaseScoreForResult(new SpinnerTick().Judgement.MaxResult); }); addSeekStep(0); diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs index 2c9292c58b..f07a1e930b 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs @@ -79,7 +79,7 @@ namespace osu.Game.Rulesets.Osu.Mods { } - public override Judgement CreateJudgement() => new OsuJudgement(); + protected override Judgement CreateJudgement() => new OsuJudgement(); } private partial class StrictTrackingDrawableSliderTail : DrawableSliderTail diff --git a/osu.Game.Rulesets.Osu/Objects/HitCircle.cs b/osu.Game.Rulesets.Osu/Objects/HitCircle.cs index d652db0fd4..6336482ccc 100644 --- a/osu.Game.Rulesets.Osu/Objects/HitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/HitCircle.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Osu.Objects { public class HitCircle : OsuHitObject { - public override Judgement CreateJudgement() => new OsuJudgement(); + protected override Judgement CreateJudgement() => new OsuJudgement(); } } diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 506145568e..fc0248cbbd 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -275,7 +275,7 @@ namespace osu.Game.Rulesets.Osu.Objects TailSamples = this.GetNodeSamples(repeatCount + 1); } - public override Judgement CreateJudgement() => ClassicSliderBehaviour + protected override Judgement CreateJudgement() => ClassicSliderBehaviour // Final combo is provided by the slider itself - see logic in `DrawableSlider.CheckForResult()` ? new OsuJudgement() // Final combo is provided by the tail circle - see `SliderTailCircle` diff --git a/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs index 2d5a5b7727..8d60864f0b 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs @@ -46,7 +46,7 @@ namespace osu.Game.Rulesets.Osu.Objects protected override HitWindows CreateHitWindows() => HitWindows.Empty; - public override Judgement CreateJudgement() => new SliderEndJudgement(); + protected override Judgement CreateJudgement() => new SliderEndJudgement(); public class SliderEndJudgement : OsuJudgement { diff --git a/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs index 8305481788..4760135081 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs @@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Osu.Objects /// public bool ClassicSliderBehaviour; - public override Judgement CreateJudgement() => ClassicSliderBehaviour ? new SliderTickJudgement() : base.CreateJudgement(); + protected override Judgement CreateJudgement() => ClassicSliderBehaviour ? new SliderTickJudgement() : base.CreateJudgement(); } } diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs index ee2490439f..42d8d895e4 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Osu.Objects { } - public override Judgement CreateJudgement() => ClassicSliderBehaviour ? new LegacyTailJudgement() : new TailJudgement(); + protected override Judgement CreateJudgement() => ClassicSliderBehaviour ? new LegacyTailJudgement() : new TailJudgement(); public class LegacyTailJudgement : OsuJudgement { diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTick.cs b/osu.Game.Rulesets.Osu/Objects/SliderTick.cs index 74ec4d6eb3..1d7ba2fbaf 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTick.cs @@ -32,6 +32,6 @@ namespace osu.Game.Rulesets.Osu.Objects protected override HitWindows CreateHitWindows() => HitWindows.Empty; - public override Judgement CreateJudgement() => new SliderTickJudgement(); + protected override Judgement CreateJudgement() => new SliderTickJudgement(); } } diff --git a/osu.Game.Rulesets.Osu/Objects/Spinner.cs b/osu.Game.Rulesets.Osu/Objects/Spinner.cs index e3dfe8e69a..9baa645b3c 100644 --- a/osu.Game.Rulesets.Osu/Objects/Spinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Spinner.cs @@ -95,7 +95,7 @@ namespace osu.Game.Rulesets.Osu.Objects } } - public override Judgement CreateJudgement() => new OsuJudgement(); + protected override Judgement CreateJudgement() => new OsuJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs b/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs index 8d53100529..57db29ef0c 100644 --- a/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs @@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Osu.Objects { public class SpinnerBonusTick : SpinnerTick { - public override Judgement CreateJudgement() => new OsuSpinnerBonusTickJudgement(); + protected override Judgement CreateJudgement() => new OsuSpinnerBonusTickJudgement(); public class OsuSpinnerBonusTickJudgement : OsuSpinnerTickJudgement { diff --git a/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs b/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs index 7989c9b7ff..cb59014909 100644 --- a/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs @@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Osu.Objects /// public double SpinnerDuration { get; set; } - public override Judgement CreateJudgement() => new OsuSpinnerTickJudgement(); + protected override Judgement CreateJudgement() => new OsuSpinnerTickJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs b/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs index f4a1e888c9..b28e870481 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TaikoHealthProcessorTest.cs @@ -126,11 +126,11 @@ namespace osu.Game.Rulesets.Taiko.Tests foreach (var nested in beatmap.HitObjects[0].NestedHitObjects) { - var nestedJudgement = nested.CreateJudgement(); + var nestedJudgement = nested.Judgement; healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult }); } - var judgement = beatmap.HitObjects[0].CreateJudgement(); + var judgement = beatmap.HitObjects[0].Judgement; healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult }); Assert.Multiple(() => @@ -159,11 +159,11 @@ namespace osu.Game.Rulesets.Taiko.Tests foreach (var nested in beatmap.HitObjects[0].NestedHitObjects) { - var nestedJudgement = nested.CreateJudgement(); + var nestedJudgement = nested.Judgement; healthProcessor.ApplyResult(new JudgementResult(nested, nestedJudgement) { Type = nestedJudgement.MaxResult }); } - var judgement = beatmap.HitObjects[0].CreateJudgement(); + var judgement = beatmap.HitObjects[0].Judgement; healthProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], judgement) { Type = judgement.MaxResult }); Assert.Multiple(() => diff --git a/osu.Game.Rulesets.Taiko/Objects/BarLine.cs b/osu.Game.Rulesets.Taiko/Objects/BarLine.cs index 46b3f13501..d87f8b3232 100644 --- a/osu.Game.Rulesets.Taiko/Objects/BarLine.cs +++ b/osu.Game.Rulesets.Taiko/Objects/BarLine.cs @@ -19,6 +19,6 @@ namespace osu.Game.Rulesets.Taiko.Objects set => major.Value = value; } - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs index f3143de345..50cd722a3f 100644 --- a/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs @@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Taiko.Objects } } - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; @@ -103,7 +103,7 @@ namespace osu.Game.Rulesets.Taiko.Objects public class StrongNestedHit : StrongNestedHitObject { // The strong hit of the drum roll doesn't actually provide any score. - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); public StrongNestedHit(TaikoHitObject parent) : base(parent) diff --git a/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs index dc082ffd21..c1d4102042 100644 --- a/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs @@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Taiko.Objects Parent = parent; } - public override Judgement CreateJudgement() => new TaikoDrumRollTickJudgement(); + protected override Judgement CreateJudgement() => new TaikoDrumRollTickJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs b/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs index 302f940ef4..44cd700faf 100644 --- a/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs @@ -7,6 +7,6 @@ namespace osu.Game.Rulesets.Taiko.Objects { public class IgnoreHit : Hit { - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs b/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs index 14cbe338ed..227ab4ab52 100644 --- a/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs +++ b/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Taiko.Objects Parent = parent; } - public override Judgement CreateJudgement() => new TaikoStrongJudgement(); + protected override Judgement CreateJudgement() => new TaikoStrongJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } diff --git a/osu.Game.Rulesets.Taiko/Objects/Swell.cs b/osu.Game.Rulesets.Taiko/Objects/Swell.cs index a8db8df021..76d106f924 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Swell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Swell.cs @@ -38,7 +38,7 @@ namespace osu.Game.Rulesets.Taiko.Objects } } - public override Judgement CreateJudgement() => new TaikoSwellJudgement(); + protected override Judgement CreateJudgement() => new TaikoSwellJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } diff --git a/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs b/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs index 41fb9cac7e..be1c1101de 100644 --- a/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs @@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Taiko.Objects { public class SwellTick : TaikoHitObject { - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } diff --git a/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs b/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs index 1a1fde1990..697c23addf 100644 --- a/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs +++ b/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs @@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Taiko.Objects /// public const float DEFAULT_SIZE = 0.475f; - public override Judgement CreateJudgement() => new TaikoJudgement(); + protected override Judgement CreateJudgement() => new TaikoJudgement(); protected override HitWindows CreateHitWindows() => new TaikoHitWindows(); } diff --git a/osu.Game/Beatmaps/IBeatmap.cs b/osu.Game/Beatmaps/IBeatmap.cs index d97eb00d7e..b5bb6ccafc 100644 --- a/osu.Game/Beatmaps/IBeatmap.cs +++ b/osu.Game/Beatmaps/IBeatmap.cs @@ -94,7 +94,7 @@ namespace osu.Game.Beatmaps static void addCombo(HitObject hitObject, ref int combo) { - if (hitObject.CreateJudgement().MaxResult.AffectsCombo()) + if (hitObject.Judgement.MaxResult.AffectsCombo()) combo++; foreach (var nested in hitObject.NestedHitObjects) diff --git a/osu.Game/Database/StandardisedScoreMigrationTools.cs b/osu.Game/Database/StandardisedScoreMigrationTools.cs index 403e73ab77..576d08f491 100644 --- a/osu.Game/Database/StandardisedScoreMigrationTools.cs +++ b/osu.Game/Database/StandardisedScoreMigrationTools.cs @@ -655,7 +655,7 @@ namespace osu.Game.Database { private readonly Judgement judgement; - public override Judgement CreateJudgement() => judgement; + protected override Judgement CreateJudgement() => judgement; public FakeHit(Judgement judgement) { diff --git a/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs b/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs index 4563c264f7..946d83b14b 100644 --- a/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs +++ b/osu.Game/Rulesets/Difficulty/PerformanceBreakdownCalculator.cs @@ -113,9 +113,9 @@ namespace osu.Game.Rulesets.Difficulty private IEnumerable getPerfectHitResults(HitObject hitObject) { foreach (HitObject nested in hitObject.NestedHitObjects) - yield return nested.CreateJudgement().MaxResult; + yield return nested.Judgement.MaxResult; - yield return hitObject.CreateJudgement().MaxResult; + yield return hitObject.Judgement.MaxResult; } } } diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index c9192ae3eb..16bd4b565c 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -770,7 +770,7 @@ namespace osu.Game.Rulesets.Objects.Drawables private void ensureEntryHasResult() { Debug.Assert(Entry != null); - Entry.Result ??= CreateResult(HitObject.CreateJudgement()) + Entry.Result ??= CreateResult(HitObject.Judgement) ?? throw new InvalidOperationException($"{GetType().ReadableName()} must provide a {nameof(JudgementResult)} through {nameof(CreateResult)}."); } diff --git a/osu.Game/Rulesets/Objects/HitObject.cs b/osu.Game/Rulesets/Objects/HitObject.cs index ef8bd08bf4..aed821332d 100644 --- a/osu.Game/Rulesets/Objects/HitObject.cs +++ b/osu.Game/Rulesets/Objects/HitObject.cs @@ -162,11 +162,19 @@ namespace osu.Game.Rulesets.Objects protected void AddNested(HitObject hitObject) => nestedHitObjects.Add(hitObject); + /// + /// The that represents the scoring information for this . + /// + [JsonIgnore] + public Judgement Judgement => judgement ??= CreateJudgement(); + + private Judgement judgement; + /// /// Creates the that represents the scoring information for this . /// [NotNull] - public virtual Judgement CreateJudgement() => new Judgement(); + protected virtual Judgement CreateJudgement() => new Judgement(); /// /// Creates the for this . diff --git a/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs b/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs index bb36aab0b3..499953dab9 100644 --- a/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs +++ b/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs @@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Objects.Legacy public int ComboOffset { get; set; } - public override Judgement CreateJudgement() => new IgnoreJudgement(); + protected override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } diff --git a/osu.Game/Rulesets/Scoring/JudgementProcessor.cs b/osu.Game/Rulesets/Scoring/JudgementProcessor.cs index e9f3bcb949..0e90330651 100644 --- a/osu.Game/Rulesets/Scoring/JudgementProcessor.cs +++ b/osu.Game/Rulesets/Scoring/JudgementProcessor.cs @@ -149,7 +149,7 @@ namespace osu.Game.Rulesets.Scoring foreach (var obj in EnumerateHitObjects(beatmap)) { - var judgement = obj.CreateJudgement(); + var judgement = obj.Judgement; var result = CreateResult(obj, judgement); if (result == null) diff --git a/osu.Game/Rulesets/Scoring/LegacyDrainingHealthProcessor.cs b/osu.Game/Rulesets/Scoring/LegacyDrainingHealthProcessor.cs index ce2f7d5624..2bc3ea80ec 100644 --- a/osu.Game/Rulesets/Scoring/LegacyDrainingHealthProcessor.cs +++ b/osu.Game/Rulesets/Scoring/LegacyDrainingHealthProcessor.cs @@ -141,7 +141,7 @@ namespace osu.Game.Rulesets.Scoring void increaseHp(HitObject hitObject) { - double amount = GetHealthIncreaseFor(hitObject, hitObject.CreateJudgement().MaxResult); + double amount = GetHealthIncreaseFor(hitObject, hitObject.Judgement.MaxResult); currentHpUncapped += amount; currentHp = Math.Max(0, Math.Min(1, currentHp + amount)); } From 666c57da5023627624c546c4450c7f04af676b5c Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Sat, 30 Dec 2023 12:17:14 -0800 Subject: [PATCH 525/651] Fix profile current location and interests icons not matching web --- osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs index 85751e7457..83ddb024c6 100644 --- a/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs +++ b/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs @@ -144,8 +144,8 @@ namespace osu.Game.Overlays.Profile.Header bool anyInfoAdded = false; - anyInfoAdded |= tryAddInfo(FontAwesome.Solid.MapMarker, user.Location); - anyInfoAdded |= tryAddInfo(FontAwesome.Solid.Heart, user.Interests); + anyInfoAdded |= tryAddInfo(FontAwesome.Solid.MapMarkerAlt, user.Location); + anyInfoAdded |= tryAddInfo(FontAwesome.Regular.Heart, user.Interests); anyInfoAdded |= tryAddInfo(FontAwesome.Solid.Suitcase, user.Occupation); if (anyInfoAdded) From ed2362b63da113e45e46756a47b94a3938ce4973 Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Sat, 30 Dec 2023 12:17:46 -0800 Subject: [PATCH 526/651] Fix icon family and weight not transferring to text conversion --- osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs index 83ddb024c6..d5b4d844b2 100644 --- a/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs +++ b/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs @@ -171,7 +171,7 @@ namespace osu.Game.Overlays.Profile.Header bottomLinkContainer.AddIcon(icon, text => { - text.Font = text.Font.With(size: 10); + text.Font = text.Font.With(icon.Family, 10, icon.Weight); text.Colour = iconColour; }); From 7c04e8bfba9da67118ae3ffc28abe6e2de04191b Mon Sep 17 00:00:00 2001 From: Stoppedpuma <58333920+Stoppedpuma@users.noreply.github.com> Date: Sat, 10 Feb 2024 07:48:24 +0100 Subject: [PATCH 527/651] Alias author to creator Allows "author" to show the results of "creator" --- osu.Game/Screens/Select/FilterQueryParser.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 0d8905347b..f6023c0b61 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -68,6 +68,7 @@ namespace osu.Game.Screens.Select return TryUpdateCriteriaRange(ref criteria.OnlineStatus, op, value, tryParseEnum); case "creator": + case "author": return TryUpdateCriteriaText(ref criteria.Creator, op, value); case "artist": From bfeb90c1b6d7e09edf59c42ed14a567a4bcdee7e Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Sat, 10 Feb 2024 17:20:17 +0900 Subject: [PATCH 528/651] Add additional gameplay metadata to room score request --- osu.Game/Online/Rooms/CreateRoomScoreRequest.cs | 10 +++++++++- osu.Game/Screens/Play/RoomSubmittingPlayer.cs | 12 +++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/osu.Game/Online/Rooms/CreateRoomScoreRequest.cs b/osu.Game/Online/Rooms/CreateRoomScoreRequest.cs index c31c6a929a..e0f91032fd 100644 --- a/osu.Game/Online/Rooms/CreateRoomScoreRequest.cs +++ b/osu.Game/Online/Rooms/CreateRoomScoreRequest.cs @@ -1,8 +1,10 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Globalization; using System.Net.Http; using osu.Framework.IO.Network; +using osu.Game.Beatmaps; using osu.Game.Online.API; namespace osu.Game.Online.Rooms @@ -11,12 +13,16 @@ namespace osu.Game.Online.Rooms { private readonly long roomId; private readonly long playlistItemId; + private readonly BeatmapInfo beatmapInfo; + private readonly int rulesetId; private readonly string versionHash; - public CreateRoomScoreRequest(long roomId, long playlistItemId, string versionHash) + public CreateRoomScoreRequest(long roomId, long playlistItemId, BeatmapInfo beatmapInfo, int rulesetId, string versionHash) { this.roomId = roomId; this.playlistItemId = playlistItemId; + this.beatmapInfo = beatmapInfo; + this.rulesetId = rulesetId; this.versionHash = versionHash; } @@ -25,6 +31,8 @@ namespace osu.Game.Online.Rooms var req = base.CreateWebRequest(); req.Method = HttpMethod.Post; req.AddParameter("version_hash", versionHash); + req.AddParameter("beatmap_hash", beatmapInfo.MD5Hash); + req.AddParameter("ruleset_id", rulesetId.ToString(CultureInfo.InvariantCulture)); return req; } diff --git a/osu.Game/Screens/Play/RoomSubmittingPlayer.cs b/osu.Game/Screens/Play/RoomSubmittingPlayer.cs index e21daa737e..3f74f49384 100644 --- a/osu.Game/Screens/Play/RoomSubmittingPlayer.cs +++ b/osu.Game/Screens/Play/RoomSubmittingPlayer.cs @@ -4,6 +4,7 @@ #nullable disable using System.Diagnostics; +using osu.Game.Extensions; using osu.Game.Online.API; using osu.Game.Online.Rooms; using osu.Game.Scoring; @@ -30,7 +31,16 @@ namespace osu.Game.Screens.Play if (!(Room.RoomID.Value is long roomId)) return null; - return new CreateRoomScoreRequest(roomId, PlaylistItem.ID, Game.VersionHash); + int beatmapId = Beatmap.Value.BeatmapInfo.OnlineID; + int rulesetId = Ruleset.Value.OnlineID; + + if (beatmapId <= 0) + return null; + + if (!Ruleset.Value.IsLegacyRuleset()) + return null; + + return new CreateRoomScoreRequest(roomId, PlaylistItem.ID, Beatmap.Value.BeatmapInfo, rulesetId, Game.VersionHash); } protected override APIRequest CreateSubmissionRequest(Score score, long token) From 5fa54c8c6355aeb85df2daa905d4c02d66995132 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 10 Feb 2024 14:16:45 +0300 Subject: [PATCH 529/651] Fix remaining use cases --- .../Objects/EmptyFreeformHitObject.cs | 2 +- .../Objects/PippidonHitObject.cs | 2 +- .../Objects/EmptyScrollingHitObject.cs | 2 +- .../Objects/PippidonHitObject.cs | 2 +- .../Gameplay/TestSceneDrainingHealthProcessor.cs | 2 +- .../Gameplay/TestSceneDrawableHitObject.cs | 2 +- .../Gameplay/TestSceneScoreProcessor.cs | 14 +++++++------- .../Rulesets/Scoring/ScoreProcessorTest.cs | 15 ++++++--------- 8 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs index 9cd18d2d9f..e166d09f84 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs @@ -10,7 +10,7 @@ namespace osu.Game.Rulesets.EmptyFreeform.Objects { public class EmptyFreeformHitObject : HitObject, IHasPosition { - public override Judgement CreateJudgement() => new Judgement(); + protected override Judgement CreateJudgement() => new Judgement(); public Vector2 Position { get; set; } diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs index 0c22554e82..748e6d3b53 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs @@ -10,7 +10,7 @@ namespace osu.Game.Rulesets.Pippidon.Objects { public class PippidonHitObject : HitObject, IHasPosition { - public override Judgement CreateJudgement() => new Judgement(); + protected override Judgement CreateJudgement() => new Judgement(); public Vector2 Position { get; set; } diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs index 9b469be496..4564bd1e09 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.EmptyScrolling.Objects { public class EmptyScrollingHitObject : HitObject { - public override Judgement CreateJudgement() => new Judgement(); + protected override Judgement CreateJudgement() => new Judgement(); } } diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs index 9dd135479f..ed16bce9f6 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs @@ -13,6 +13,6 @@ namespace osu.Game.Rulesets.Pippidon.Objects /// public int Lane; - public override Judgement CreateJudgement() => new Judgement(); + protected override Judgement CreateJudgement() => new Judgement(); } } diff --git a/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs b/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs index 584a9e09c0..f0f93f59b5 100644 --- a/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs +++ b/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs @@ -358,7 +358,7 @@ namespace osu.Game.Tests.Gameplay this.maxResult = maxResult; } - public override Judgement CreateJudgement() => new TestJudgement(maxResult); + protected override Judgement CreateJudgement() => new TestJudgement(maxResult); protected override HitWindows CreateHitWindows() => new HitWindows(); private class TestJudgement : Judgement diff --git a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs index 73177e36e1..22643feebb 100644 --- a/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs +++ b/osu.Game.Tests/Gameplay/TestSceneDrawableHitObject.cs @@ -175,7 +175,7 @@ namespace osu.Game.Tests.Gameplay var hitObject = new HitObject { StartTime = Time.Current }; lifetimeEntry = new HitObjectLifetimeEntry(hitObject) { - Result = new JudgementResult(hitObject, hitObject.CreateJudgement()) + Result = new JudgementResult(hitObject, hitObject.Judgement) { Type = HitResult.Great } diff --git a/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs b/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs index 1a644ad600..a428979015 100644 --- a/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs +++ b/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs @@ -129,10 +129,10 @@ namespace osu.Game.Tests.Gameplay var scoreProcessor = new ScoreProcessor(new OsuRuleset()); scoreProcessor.ApplyBeatmap(beatmap); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].CreateJudgement()) { Type = HitResult.Ok }); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].CreateJudgement()) { Type = HitResult.LargeTickHit }); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[2], beatmap.HitObjects[2].CreateJudgement()) { Type = HitResult.SmallTickMiss }); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[3], beatmap.HitObjects[3].CreateJudgement()) { Type = HitResult.SmallBonus }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].Judgement) { Type = HitResult.Ok }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].Judgement) { Type = HitResult.LargeTickHit }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[2], beatmap.HitObjects[2].Judgement) { Type = HitResult.SmallTickMiss }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[3], beatmap.HitObjects[3].Judgement) { Type = HitResult.SmallBonus }); var score = new ScoreInfo { Ruleset = new OsuRuleset().RulesetInfo }; scoreProcessor.FailScore(score); @@ -169,8 +169,8 @@ namespace osu.Game.Tests.Gameplay Assert.That(scoreProcessor.MinimumAccuracy.Value, Is.EqualTo(0)); Assert.That(scoreProcessor.MaximumAccuracy.Value, Is.EqualTo(1)); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].CreateJudgement()) { Type = HitResult.Ok }); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].CreateJudgement()) { Type = HitResult.Great }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].Judgement) { Type = HitResult.Ok }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].Judgement) { Type = HitResult.Great }); Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo((double)(100 + 300) / (2 * 300)).Within(Precision.DOUBLE_EPSILON)); Assert.That(scoreProcessor.MinimumAccuracy.Value, Is.EqualTo((double)(100 + 300) / (4 * 300)).Within(Precision.DOUBLE_EPSILON)); @@ -196,7 +196,7 @@ namespace osu.Game.Tests.Gameplay this.maxResult = maxResult; } - public override Judgement CreateJudgement() => new TestJudgement(maxResult); + protected override Judgement CreateJudgement() => new TestJudgement(maxResult); } } } diff --git a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs index a3f91fffba..ea43a65825 100644 --- a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs +++ b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs @@ -112,7 +112,7 @@ namespace osu.Game.Tests.Rulesets.Scoring for (int i = 0; i < 4; i++) { - var judgementResult = new JudgementResult(fourObjectBeatmap.HitObjects[i], fourObjectBeatmap.HitObjects[i].CreateJudgement()) + var judgementResult = new JudgementResult(fourObjectBeatmap.HitObjects[i], fourObjectBeatmap.HitObjects[i].Judgement) { Type = i == 2 ? minResult : hitResult }; @@ -141,7 +141,7 @@ namespace osu.Game.Tests.Rulesets.Scoring for (int i = 0; i < object_count; ++i) { - var judgementResult = new JudgementResult(largeBeatmap.HitObjects[i], largeBeatmap.HitObjects[i].CreateJudgement()) + var judgementResult = new JudgementResult(largeBeatmap.HitObjects[i], largeBeatmap.HitObjects[i].Judgement) { Type = HitResult.Great }; @@ -325,11 +325,11 @@ namespace osu.Game.Tests.Rulesets.Scoring scoreProcessor = new TestScoreProcessor(); scoreProcessor.ApplyBeatmap(beatmap); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].CreateJudgement()) { Type = HitResult.Great }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[0], beatmap.HitObjects[0].Judgement) { Type = HitResult.Great }); Assert.That(scoreProcessor.Combo.Value, Is.EqualTo(1)); Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo(1)); - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].CreateJudgement()) { Type = HitResult.ComboBreak }); + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[1], beatmap.HitObjects[1].Judgement) { Type = HitResult.ComboBreak }); Assert.That(scoreProcessor.Combo.Value, Is.EqualTo(0)); Assert.That(scoreProcessor.Accuracy.Value, Is.EqualTo(1)); } @@ -350,7 +350,7 @@ namespace osu.Game.Tests.Rulesets.Scoring for (int i = 0; i < beatmap.HitObjects.Count; i++) { - scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[i], beatmap.HitObjects[i].CreateJudgement()) + scoreProcessor.ApplyResult(new JudgementResult(beatmap.HitObjects[i], beatmap.HitObjects[i].Judgement) { Type = i == 0 ? HitResult.Miss : HitResult.Great }); @@ -441,10 +441,7 @@ namespace osu.Game.Tests.Rulesets.Scoring private readonly HitResult maxResult; private readonly HitResult? minResult; - public override Judgement CreateJudgement() - { - return new TestJudgement(maxResult, minResult); - } + protected override Judgement CreateJudgement() => new TestJudgement(maxResult, minResult); public TestHitObject(HitResult maxResult, HitResult? minResult = null) { From ae5f108f01444dc4c7449858ed77f63ba22d153e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 10 Feb 2024 13:08:26 +0100 Subject: [PATCH 530/651] Add visual test coverage of user profile info section --- osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs index bc8f75d4ce..1b9ca8717a 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneUserProfileOverlay.cs @@ -206,6 +206,12 @@ namespace osu.Game.Tests.Visual.Online Total = 50 }, SupportLevel = 2, + Location = "Somewhere", + Interests = "Rhythm games", + Occupation = "Gamer", + Twitter = "test_user", + Discord = "test_user", + Website = "https://google.com", }; } } From 6894f17b2311019a18cd1553b569998e263981f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 10 Feb 2024 15:34:12 +0100 Subject: [PATCH 531/651] Add test coverage --- .../Editor/TestSceneOsuComposerSelection.cs | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs index 623cefff6b..b97fe5c5a8 100644 --- a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs +++ b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneOsuComposerSelection.cs @@ -124,6 +124,113 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor AddAssert("selection preserved", () => EditorBeatmap.SelectedHitObjects.Count == 2); } + [Test] + public void TestControlClickAddsControlPointsIfSingleSliderSelected() + { + var firstSlider = new Slider + { + StartTime = 0, + Position = new Vector2(0, 0), + Path = new SliderPath + { + ControlPoints = + { + new PathControlPoint(), + new PathControlPoint(new Vector2(100)) + } + } + }; + var secondSlider = new Slider + { + StartTime = 1000, + Position = new Vector2(200, 200), + Path = new SliderPath + { + ControlPoints = + { + new PathControlPoint(), + new PathControlPoint(new Vector2(100, -100)) + } + } + }; + + AddStep("add objects", () => EditorBeatmap.AddRange(new HitObject[] { firstSlider, secondSlider })); + AddStep("select first slider", () => EditorBeatmap.SelectedHitObjects.AddRange(new HitObject[] { secondSlider })); + + AddStep("move mouse to middle of slider", () => + { + var pos = blueprintContainer.SelectionBlueprints + .First(s => s.Item == secondSlider) + .ChildrenOfType().First() + .ScreenSpaceDrawQuad.Centre; + + InputManager.MoveMouseTo(pos); + }); + AddStep("control-click left mouse", () => + { + InputManager.PressKey(Key.ControlLeft); + InputManager.Click(MouseButton.Left); + InputManager.ReleaseKey(Key.ControlLeft); + }); + AddAssert("selection preserved", () => EditorBeatmap.SelectedHitObjects.Count, () => Is.EqualTo(1)); + AddAssert("slider has 3 anchors", () => secondSlider.Path.ControlPoints.Count, () => Is.EqualTo(3)); + } + + [Test] + public void TestControlClickDoesNotAddSliderControlPointsIfMultipleObjectsSelected() + { + var firstSlider = new Slider + { + StartTime = 0, + Position = new Vector2(0, 0), + Path = new SliderPath + { + ControlPoints = + { + new PathControlPoint(), + new PathControlPoint(new Vector2(100)) + } + } + }; + var secondSlider = new Slider + { + StartTime = 1000, + Position = new Vector2(200, 200), + Path = new SliderPath + { + ControlPoints = + { + new PathControlPoint(), + new PathControlPoint(new Vector2(100, -100)) + } + } + }; + + AddStep("add objects", () => EditorBeatmap.AddRange(new HitObject[] { firstSlider, secondSlider })); + AddStep("select first slider", () => EditorBeatmap.SelectedHitObjects.AddRange(new HitObject[] { firstSlider, secondSlider })); + + AddStep("move mouse to middle of slider", () => + { + var pos = blueprintContainer.SelectionBlueprints + .First(s => s.Item == secondSlider) + .ChildrenOfType().First() + .ScreenSpaceDrawQuad.Centre; + + InputManager.MoveMouseTo(pos); + }); + AddStep("control-click left mouse", () => + { + InputManager.PressKey(Key.ControlLeft); + InputManager.Click(MouseButton.Left); + InputManager.ReleaseKey(Key.ControlLeft); + }); + AddAssert("selection not preserved", () => EditorBeatmap.SelectedHitObjects.Count, () => Is.EqualTo(1)); + AddAssert("second slider not selected", + () => blueprintContainer.SelectionBlueprints.First(s => s.Item == secondSlider).IsSelected, + () => Is.False); + AddAssert("slider still has 2 anchors", () => secondSlider.Path.ControlPoints.Count, () => Is.EqualTo(2)); + } + private ComposeBlueprintContainer blueprintContainer => Editor.ChildrenOfType().First(); From d99187302894c50cee5f84b493e7050f899cc21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 10 Feb 2024 15:54:43 +0100 Subject: [PATCH 532/651] Add note to never run release config to contributing guidelines See https://discord.com/channels/188630481301012481/188630652340404224/1205886296439136286 for the latest instance of this, but this really keeps happening. Maybe someone will read this and stop themselves from making the same mistake. One can dream. --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4106641adb..4f969ab915 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,6 +68,7 @@ Aside from the above, below is a brief checklist of things to watch out when you - Please do not make code changes via the GitHub web interface. - Please add tests for your changes. We expect most new features and bugfixes to have test coverage, unless the effort of adding them is prohibitive. The visual testing methodology we use is described in more detail [here](https://github.com/ppy/osu-framework/wiki/Development-and-Testing). - Please run tests and code style analysis (via `InspectCode.{ps1,sh}` scripts in the root of this repository) before opening the PR. This is particularly important if you're a first-time contributor, as CI will not run for your PR until we allow it to do so. +- Do not run the game in release configuration at any point during your testing (the sole exception to this being benchmarks). Using release is an unnecessary and harmful practice, and can even lead to you losing your local realm database if you start making changes to the schema. The debug configuration has a completely separated full-stack environment, including a development website instance at https://dev.ppy.sh/. It is permitted to register an account on that development instance for testing purposes and not worry about multi-accounting infractions. After you're done with your changes and you wish to open the PR, please observe the following recommendations: From c5f392c17d92ef061d480782ee195726099dab2e Mon Sep 17 00:00:00 2001 From: tsunyoku Date: Sat, 10 Feb 2024 15:25:03 +0000 Subject: [PATCH 533/651] only compute flashlight in osu! difficulty calculations when required --- .../Difficulty/OsuDifficultyCalculator.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs index 3b580a5b59..007cd977e5 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs @@ -40,7 +40,11 @@ namespace osu.Game.Rulesets.Osu.Difficulty double aimRatingNoSliders = Math.Sqrt(skills[1].DifficultyValue()) * difficulty_multiplier; double speedRating = Math.Sqrt(skills[2].DifficultyValue()) * difficulty_multiplier; double speedNotes = ((Speed)skills[2]).RelevantNoteCount(); - double flashlightRating = Math.Sqrt(skills[3].DifficultyValue()) * difficulty_multiplier; + + double flashlightRating = 0.0; + + if (mods.Any(h => h is OsuModFlashlight)) + flashlightRating = Math.Sqrt(skills[3].DifficultyValue()) * difficulty_multiplier; double sliderFactor = aimRating > 0 ? aimRatingNoSliders / aimRating : 1; @@ -126,13 +130,17 @@ namespace osu.Game.Rulesets.Osu.Difficulty protected override Skill[] CreateSkills(IBeatmap beatmap, Mod[] mods, double clockRate) { - return new Skill[] + var skills = new List { new Aim(mods, true), new Aim(mods, false), - new Speed(mods), - new Flashlight(mods) + new Speed(mods) }; + + if (mods.Any(h => h is OsuModFlashlight)) + skills.Add(new Flashlight(mods)); + + return skills.ToArray(); } protected override Mod[] DifficultyAdjustmentMods => new Mod[] From bd04377643d3f42836ff10b6fc6af53728fee215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 10 Feb 2024 16:42:19 +0100 Subject: [PATCH 534/651] Tell people to not run in release harder Co-authored-by: Dean Herbert --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4f969ab915..0fe6b6fb4d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,7 +68,7 @@ Aside from the above, below is a brief checklist of things to watch out when you - Please do not make code changes via the GitHub web interface. - Please add tests for your changes. We expect most new features and bugfixes to have test coverage, unless the effort of adding them is prohibitive. The visual testing methodology we use is described in more detail [here](https://github.com/ppy/osu-framework/wiki/Development-and-Testing). - Please run tests and code style analysis (via `InspectCode.{ps1,sh}` scripts in the root of this repository) before opening the PR. This is particularly important if you're a first-time contributor, as CI will not run for your PR until we allow it to do so. -- Do not run the game in release configuration at any point during your testing (the sole exception to this being benchmarks). Using release is an unnecessary and harmful practice, and can even lead to you losing your local realm database if you start making changes to the schema. The debug configuration has a completely separated full-stack environment, including a development website instance at https://dev.ppy.sh/. It is permitted to register an account on that development instance for testing purposes and not worry about multi-accounting infractions. +- **Do not run the game in release configuration at any point during your testing** (the sole exception to this being benchmarks). Using release is an unnecessary and harmful practice, and can even lead to you losing your local realm database if you start making changes to the schema. The debug configuration has a completely separated full-stack environment, including a development website instance at https://dev.ppy.sh/. It is permitted to register an account on that development instance for testing purposes and not worry about multi-accounting infractions. After you're done with your changes and you wish to open the PR, please observe the following recommendations: From 901b82384d5fbc224c18b96347bc3b07e37b0e8b Mon Sep 17 00:00:00 2001 From: tsunyoku Date: Sat, 10 Feb 2024 15:42:55 +0000 Subject: [PATCH 535/651] replace linq usage in `Previous` and `Next` with more direct computation --- .../Difficulty/Preprocessing/DifficultyHitObject.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/osu.Game/Rulesets/Difficulty/Preprocessing/DifficultyHitObject.cs b/osu.Game/Rulesets/Difficulty/Preprocessing/DifficultyHitObject.cs index 9ce0906dea..9785865192 100644 --- a/osu.Game/Rulesets/Difficulty/Preprocessing/DifficultyHitObject.cs +++ b/osu.Game/Rulesets/Difficulty/Preprocessing/DifficultyHitObject.cs @@ -4,7 +4,6 @@ #nullable disable using System.Collections.Generic; -using System.Linq; using osu.Game.Rulesets.Objects; namespace osu.Game.Rulesets.Difficulty.Preprocessing @@ -65,8 +64,16 @@ namespace osu.Game.Rulesets.Difficulty.Preprocessing EndTime = hitObject.GetEndTime() / clockRate; } - public DifficultyHitObject Previous(int backwardsIndex) => difficultyHitObjects.ElementAtOrDefault(Index - (backwardsIndex + 1)); + public DifficultyHitObject Previous(int backwardsIndex) + { + int index = Index - (backwardsIndex + 1); + return index >= 0 && index < difficultyHitObjects.Count ? difficultyHitObjects[index] : default; + } - public DifficultyHitObject Next(int forwardsIndex) => difficultyHitObjects.ElementAtOrDefault(Index + (forwardsIndex + 1)); + public DifficultyHitObject Next(int forwardsIndex) + { + int index = Index + (forwardsIndex + 1); + return index >= 0 && index < difficultyHitObjects.Count ? difficultyHitObjects[index] : default; + } } } From 7dba21fdaca9d405b1856dcc635a79a4313b91a4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 11 Feb 2024 20:05:58 +0800 Subject: [PATCH 536/651] Move init method to bottom of file --- .../LocalCachedBeatmapMetadataSource.cs | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs index ff88fecd86..3f93c32283 100644 --- a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs @@ -49,57 +49,6 @@ namespace osu.Game.Beatmaps prepareLocalCache(); } - private void prepareLocalCache() - { - string cacheFilePath = storage.GetFullPath(cache_database_name); - string compressedCacheFilePath = $@"{cacheFilePath}.bz2"; - - cacheDownloadRequest = new FileWebRequest(compressedCacheFilePath, $@"https://assets.ppy.sh/client-resources/{cache_database_name}.bz2?{DateTimeOffset.UtcNow:yyyyMMdd}"); - - cacheDownloadRequest.Failed += ex => - { - File.Delete(compressedCacheFilePath); - File.Delete(cacheFilePath); - - Logger.Log($@"{nameof(BeatmapUpdaterMetadataLookup)}'s online cache download failed: {ex}", LoggingTarget.Database); - }; - - cacheDownloadRequest.Finished += () => - { - try - { - using (var stream = File.OpenRead(cacheDownloadRequest.Filename)) - using (var outStream = File.OpenWrite(cacheFilePath)) - using (var bz2 = new BZip2Stream(stream, CompressionMode.Decompress, false)) - bz2.CopyTo(outStream); - - // set to null on completion to allow lookups to begin using the new source - cacheDownloadRequest = null; - } - catch (Exception ex) - { - Logger.Log($@"{nameof(LocalCachedBeatmapMetadataSource)}'s online cache extraction failed: {ex}", LoggingTarget.Database); - File.Delete(cacheFilePath); - } - finally - { - File.Delete(compressedCacheFilePath); - } - }; - - Task.Run(async () => - { - try - { - await cacheDownloadRequest.PerformAsync().ConfigureAwait(false); - } - catch - { - // Prevent throwing unobserved exceptions, as they will be logged from the network request to the log file anyway. - } - }); - } - public bool Available => // no download in progress. cacheDownloadRequest == null @@ -173,6 +122,57 @@ namespace osu.Game.Beatmaps return false; } + private void prepareLocalCache() + { + string cacheFilePath = storage.GetFullPath(cache_database_name); + string compressedCacheFilePath = $@"{cacheFilePath}.bz2"; + + cacheDownloadRequest = new FileWebRequest(compressedCacheFilePath, $@"https://assets.ppy.sh/client-resources/{cache_database_name}.bz2?{DateTimeOffset.UtcNow:yyyyMMdd}"); + + cacheDownloadRequest.Failed += ex => + { + File.Delete(compressedCacheFilePath); + File.Delete(cacheFilePath); + + Logger.Log($@"{nameof(BeatmapUpdaterMetadataLookup)}'s online cache download failed: {ex}", LoggingTarget.Database); + }; + + cacheDownloadRequest.Finished += () => + { + try + { + using (var stream = File.OpenRead(cacheDownloadRequest.Filename)) + using (var outStream = File.OpenWrite(cacheFilePath)) + using (var bz2 = new BZip2Stream(stream, CompressionMode.Decompress, false)) + bz2.CopyTo(outStream); + + // set to null on completion to allow lookups to begin using the new source + cacheDownloadRequest = null; + } + catch (Exception ex) + { + Logger.Log($@"{nameof(LocalCachedBeatmapMetadataSource)}'s online cache extraction failed: {ex}", LoggingTarget.Database); + File.Delete(cacheFilePath); + } + finally + { + File.Delete(compressedCacheFilePath); + } + }; + + Task.Run(async () => + { + try + { + await cacheDownloadRequest.PerformAsync().ConfigureAwait(false); + } + catch + { + // Prevent throwing unobserved exceptions, as they will be logged from the network request to the log file anyway. + } + }); + } + private void logForModel(BeatmapSetInfo set, string message) => RealmArchiveModelImporter.LogForModel(set, $@"[{nameof(LocalCachedBeatmapMetadataSource)}] {message}"); From 5e692345dedb62c67914485347943595748cfc9a Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sun, 11 Feb 2024 17:44:54 +0300 Subject: [PATCH 537/651] Don't convert pixel data to array --- osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs b/osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs index acd60b664d..128e100e4b 100644 --- a/osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs +++ b/osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs @@ -59,7 +59,7 @@ namespace osu.Game.Beatmaps private TextureUpload limitTextureUploadSize(TextureUpload textureUpload) { - var image = Image.LoadPixelData(textureUpload.Data.ToArray(), textureUpload.Width, textureUpload.Height); + var image = Image.LoadPixelData(textureUpload.Data, textureUpload.Width, textureUpload.Height); // The original texture upload will no longer be returned or used. textureUpload.Dispose(); From ca0819cf7a4529fc27a71d9e9e6ff4ff3a25ff3f Mon Sep 17 00:00:00 2001 From: Stoppedpuma <58333920+Stoppedpuma@users.noreply.github.com> Date: Sun, 11 Feb 2024 20:28:16 +0100 Subject: [PATCH 538/651] Alias "mapper" as well --- osu.Game/Screens/Select/FilterQueryParser.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index f6023c0b61..5d3ff1261f 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -69,6 +69,7 @@ namespace osu.Game.Screens.Select case "creator": case "author": + case "mapper": return TryUpdateCriteriaText(ref criteria.Creator, op, value); case "artist": From 36005a5449d4169edf7d77d948d1b0c0b38e2abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 08:33:08 +0100 Subject: [PATCH 539/651] Fix selected legacy skins crashing on zero-length hold notes Closes https://github.com/ppy/osu/issues/27134. --- osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs b/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs index 07045b76ca..a8200e0144 100644 --- a/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs +++ b/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs @@ -243,7 +243,9 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy bodySprite.FillMode = FillMode.Stretch; // i dunno this looks about right?? - bodySprite.Scale = new Vector2(1, scaleDirection * 32800 / sprite.DrawHeight); + // the guard against zero draw height is intended for zero-length hold notes. yes, such cases have been spotted in the wild. + if (sprite.DrawHeight > 0) + bodySprite.Scale = new Vector2(1, scaleDirection * 32800 / sprite.DrawHeight); } break; From 2ae616a88ea17cc1dc03ab6c0dfa46aeb20f93ee Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 12 Feb 2024 12:29:31 +0300 Subject: [PATCH 540/651] Combine other cases of displaying dash in scores PP --- osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs | 2 +- .../BeatmapSet/Scores/TopScoreStatisticsSection.cs | 2 +- .../Profile/Sections/Ranks/DrawableProfileScore.cs | 10 +++++----- .../Drawables/UnrankedPerformancePointsPlaceholder.cs | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs index c8ecb38c86..9dd0e26da2 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs @@ -181,7 +181,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores if (showPerformancePoints) { if (!score.Ranked) - content.Add(new UnrankedPerformancePointsPlaceholder { Font = OsuFont.GetFont(size: text_size) }); + content.Add(new UnrankedPerformancePointsPlaceholder(ScoresStrings.StatusNoPp) { Font = OsuFont.GetFont(size: text_size) }); else if (score.PP == null) content.Add(new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(text_size) }); else diff --git a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs index 488b99d620..4aad3cf953 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs @@ -126,7 +126,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores ppColumn.Alpha = value.BeatmapInfo!.Status.GrantsPerformancePoints() ? 1 : 0; if (!value.Ranked) - ppColumn.Drawable = new UnrankedPerformancePointsPlaceholder { Font = smallFont }; + ppColumn.Drawable = new UnrankedPerformancePointsPlaceholder(ScoresStrings.StatusNoPp) { Font = smallFont }; else if (value.PP is not double pp) ppColumn.Drawable = new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(smallFont.Size) }; else diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs index d1988956be..1211d65816 100644 --- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs +++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs @@ -14,6 +14,7 @@ using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Online.API.Requests.Responses; using osu.Game.Online.Leaderboards; +using osu.Game.Resources.Localisation.Web; using osu.Game.Rulesets; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; @@ -243,20 +244,19 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks if (Score.Beatmap?.Status.GrantsPerformancePoints() != true) { - return new OsuSpriteText + return new UnrankedPerformancePointsPlaceholder(UsersStrings.ShowExtraTopRanksNotRanked) { Font = OsuFont.GetFont(weight: FontWeight.Bold), - Text = "-", - Colour = colourProvider.Highlight1 + Colour = colourProvider.Highlight1, }; } if (!Score.Ranked) { - return new UnrankedPerformancePointsPlaceholder + return new UnrankedPerformancePointsPlaceholder(ScoresStrings.StatusNoPp) { Font = OsuFont.GetFont(weight: FontWeight.Bold), - Colour = colourProvider.Highlight1 + Colour = colourProvider.Highlight1, }; } diff --git a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs index c5c190e1a1..0097497ef1 100644 --- a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs +++ b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs @@ -5,22 +5,22 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; -using osu.Game.Resources.Localisation.Web; namespace osu.Game.Scoring.Drawables { /// - /// A placeholder used in PP columns for scores that do not award PP. + /// A placeholder used in PP columns for scores that do not award PP due to a reason specified by . /// public partial class UnrankedPerformancePointsPlaceholder : SpriteText, IHasTooltip { - public LocalisableString TooltipText => ScoresStrings.StatusNoPp; + public LocalisableString TooltipText { get; } - public UnrankedPerformancePointsPlaceholder() + public UnrankedPerformancePointsPlaceholder(LocalisableString tooltipText) { Anchor = Anchor.Centre; Origin = Anchor.Centre; Text = "-"; + TooltipText = tooltipText; } } } From 80b14f1aaef3627935873cdc0be2649d588d4f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 7 May 2023 20:06:07 +0200 Subject: [PATCH 541/651] Add test coverage for beatmap confusion scenarios --- .../BeatmapUpdaterMetadataLookupTest.cs | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs index 84195f1e7c..e6c06f7aec 100644 --- a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs +++ b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs @@ -193,5 +193,110 @@ namespace osu.Game.Tests.Beatmaps Assert.That(beatmap.OnlineID, Is.EqualTo(123456)); } + + [Test] + public void TestReturnedMetadataHasDifferentOnlineID([Values] bool preferOnlineFetch) + { + var lookupResult = new OnlineBeatmapMetadata { BeatmapID = 654321, BeatmapStatus = BeatmapOnlineStatus.Ranked }; + + var targetMock = preferOnlineFetch ? apiMetadataSourceMock : localCachedMetadataSourceMock; + targetMock.Setup(src => src.Available).Returns(true); + targetMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(true); + + var beatmap = new BeatmapInfo { OnlineID = 123456 }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(beatmap.OnlineID, Is.EqualTo(-1)); + } + + [Test] + public void TestMetadataLookupForBeatmapWithoutPopulatedIDAndCorrectHash([Values] bool preferOnlineFetch) + { + var lookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 654321, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + MD5Hash = @"deadbeef", + }; + + var targetMock = preferOnlineFetch ? apiMetadataSourceMock : localCachedMetadataSourceMock; + targetMock.Setup(src => src.Available).Returns(true); + targetMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(true); + + var beatmap = new BeatmapInfo + { + MD5Hash = @"deadbeef" + }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + Assert.That(beatmap.OnlineID, Is.EqualTo(654321)); + } + + [Test] + public void TestMetadataLookupForBeatmapWithoutPopulatedIDAndIncorrectHash([Values] bool preferOnlineFetch) + { + var lookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 654321, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + MD5Hash = @"cafebabe", + }; + + var targetMock = preferOnlineFetch ? apiMetadataSourceMock : localCachedMetadataSourceMock; + targetMock.Setup(src => src.Available).Returns(true); + targetMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(true); + + var beatmap = new BeatmapInfo + { + MD5Hash = @"deadbeef" + }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(beatmap.OnlineID, Is.EqualTo(-1)); + } + + [Test] + public void TestReturnedMetadataHasDifferentHash([Values] bool preferOnlineFetch) + { + var lookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 654321, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + MD5Hash = @"deadbeef" + }; + + var targetMock = preferOnlineFetch ? apiMetadataSourceMock : localCachedMetadataSourceMock; + targetMock.Setup(src => src.Available).Returns(true); + targetMock.Setup(src => src.TryLookup(It.IsAny(), out lookupResult)) + .Returns(true); + + var beatmap = new BeatmapInfo + { + OnlineID = 654321, + MD5Hash = @"cafebabe", + }; + var beatmapSet = new BeatmapSetInfo(beatmap.Yield()); + beatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch); + + Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(beatmap.OnlineID, Is.EqualTo(654321)); + } } } From 834db989f721a38bb03cf8f8c1f9d24e4e5f0ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 11:03:08 +0100 Subject: [PATCH 542/651] Add more test coverage for more failure --- .../BeatmapUpdaterMetadataLookupTest.cs | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs index e6c06f7aec..fe9d15a89d 100644 --- a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs +++ b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs @@ -298,5 +298,59 @@ namespace osu.Game.Tests.Beatmaps Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); Assert.That(beatmap.OnlineID, Is.EqualTo(654321)); } + + [Test] + public void TestPartiallyModifiedSet([Values] bool preferOnlineFetch) + { + var firstResult = new OnlineBeatmapMetadata + { + BeatmapID = 654321, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + MD5Hash = @"cafebabe" + }; + var secondResult = new OnlineBeatmapMetadata + { + BeatmapID = 666666, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + MD5Hash = @"dededede" + }; + + var targetMock = preferOnlineFetch ? apiMetadataSourceMock : localCachedMetadataSourceMock; + targetMock.Setup(src => src.Available).Returns(true); + targetMock.Setup(src => src.TryLookup(It.Is(bi => bi.OnlineID == 654321), out firstResult)) + .Returns(true); + targetMock.Setup(src => src.TryLookup(It.Is(bi => bi.OnlineID == 666666), out secondResult)) + .Returns(true); + + var firstBeatmap = new BeatmapInfo + { + OnlineID = 654321, + MD5Hash = @"cafebabe", + }; + var secondBeatmap = new BeatmapInfo + { + OnlineID = 666666, + MD5Hash = @"deadbeef" + }; + var beatmapSet = new BeatmapSetInfo(new[] + { + firstBeatmap, + secondBeatmap + }); + firstBeatmap.BeatmapSet = beatmapSet; + secondBeatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch); + + Assert.That(firstBeatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + Assert.That(firstBeatmap.OnlineID, Is.EqualTo(654321)); + + Assert.That(secondBeatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(secondBeatmap.OnlineID, Is.EqualTo(666666)); + + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + } } } From 4f0ae4197a456dde07cf4aa9868026ef0d9d0918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 11:12:01 +0100 Subject: [PATCH 543/651] Refuse to apply online metadata in the most dodgy scenarios --- osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index b32310990c..13823147b0 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -43,7 +43,7 @@ namespace osu.Game.Beatmaps if (!tryLookup(beatmapInfo, preferOnlineFetch, out var res)) continue; - if (res == null) + if (res == null || shouldDiscardLookupResult(res, beatmapInfo)) { beatmapInfo.ResetOnlineInfo(); continue; @@ -72,6 +72,17 @@ namespace osu.Game.Beatmaps } } + private bool shouldDiscardLookupResult(OnlineBeatmapMetadata result, BeatmapInfo beatmapInfo) + { + if (beatmapInfo.OnlineID > 0 && result.BeatmapID != beatmapInfo.OnlineID) + return true; + + if (beatmapInfo.OnlineID == -1 && result.MD5Hash != beatmapInfo.MD5Hash) + return true; + + return false; + } + /// /// Attempts to retrieve the for the given . /// From 87702b331271d1291ad65d0b4399408dbbf5244e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 11:35:11 +0100 Subject: [PATCH 544/651] Only check online matching when determining whether to save online metadata After https://github.com/ppy/osu/pull/23362 I'm not sure the `LocallyModified` check is doing anything useful. It was confusing me really hard when trying to parse this logic, and it can misbehave (as `None` will also pass the check). --- osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index 13823147b0..f46ce11663 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -57,13 +57,13 @@ namespace osu.Game.Beatmaps beatmapInfo.BeatmapSet.OnlineID = res.BeatmapSetID; // Some metadata should only be applied if there's no local changes. - if (shouldSaveOnlineMetadata(beatmapInfo)) + if (beatmapInfo.MatchesOnlineVersion) { beatmapInfo.Status = res.BeatmapStatus; beatmapInfo.Metadata.Author.OnlineID = res.AuthorID; } - if (beatmapInfo.BeatmapSet.Beatmaps.All(shouldSaveOnlineMetadata)) + if (beatmapInfo.BeatmapSet.Beatmaps.All(b => b.MatchesOnlineVersion)) { beatmapInfo.BeatmapSet.Status = res.BeatmapSetStatus ?? BeatmapOnlineStatus.None; beatmapInfo.BeatmapSet.DateRanked = res.DateRanked; @@ -115,12 +115,6 @@ namespace osu.Game.Beatmaps return false; } - /// - /// Check whether the provided beatmap is in a state where online "ranked" status metadata should be saved against it. - /// Handles the case where a user may have locally modified a beatmap in the editor and expects the local status to stick. - /// - private static bool shouldSaveOnlineMetadata(BeatmapInfo beatmapInfo) => beatmapInfo.MatchesOnlineVersion || beatmapInfo.Status != BeatmapOnlineStatus.LocallyModified; - public void Dispose() { apiMetadataSource.Dispose(); From 133e61a1b223156b986eb45c45fa7e1b16aefefc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 11:38:13 +0100 Subject: [PATCH 545/651] Add another test for even more failure --- .../BeatmapUpdaterMetadataLookupTest.cs | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs index fe9d15a89d..74812236bf 100644 --- a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs +++ b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs @@ -352,5 +352,58 @@ namespace osu.Game.Tests.Beatmaps Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.None)); } + + [Test] + public void TestPartiallyMaliciousSet([Values] bool preferOnlineFetch) + { + var firstResult = new OnlineBeatmapMetadata + { + BeatmapID = 654321, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + MD5Hash = @"cafebabe" + }; + var secondResult = new OnlineBeatmapMetadata + { + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + MD5Hash = @"dededede" + }; + + var targetMock = preferOnlineFetch ? apiMetadataSourceMock : localCachedMetadataSourceMock; + targetMock.Setup(src => src.Available).Returns(true); + targetMock.Setup(src => src.TryLookup(It.Is(bi => bi.OnlineID == 654321), out firstResult)) + .Returns(true); + targetMock.Setup(src => src.TryLookup(It.Is(bi => bi.OnlineID == 666666), out secondResult)) + .Returns(true); + + var firstBeatmap = new BeatmapInfo + { + OnlineID = 654321, + MD5Hash = @"cafebabe", + }; + var secondBeatmap = new BeatmapInfo + { + OnlineID = 666666, + MD5Hash = @"deadbeef" + }; + var beatmapSet = new BeatmapSetInfo(new[] + { + firstBeatmap, + secondBeatmap + }); + firstBeatmap.BeatmapSet = beatmapSet; + secondBeatmap.BeatmapSet = beatmapSet; + + metadataLookup.Update(beatmapSet, preferOnlineFetch); + + Assert.That(firstBeatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + Assert.That(firstBeatmap.OnlineID, Is.EqualTo(654321)); + + Assert.That(secondBeatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(secondBeatmap.OnlineID, Is.EqualTo(-1)); + + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + } } } From 138fea8c387190605ba5099b9d3385f4bb6903ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 11:47:30 +0100 Subject: [PATCH 546/651] Only apply set-level metadata after all difficulties have been processed --- .../Beatmaps/BeatmapUpdaterMetadataLookup.cs | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index f46ce11663..f395718a93 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using osu.Framework.Platform; @@ -38,6 +39,8 @@ namespace osu.Game.Beatmaps /// Whether metadata from an online source should be preferred. If true, the local cache will be skipped to ensure the freshest data state possible. public void Update(BeatmapSetInfo beatmapSet, bool preferOnlineFetch) { + var lookupResults = new List(); + foreach (var beatmapInfo in beatmapSet.Beatmaps) { if (!tryLookup(beatmapInfo, preferOnlineFetch, out var res)) @@ -46,9 +49,12 @@ namespace osu.Game.Beatmaps if (res == null || shouldDiscardLookupResult(res, beatmapInfo)) { beatmapInfo.ResetOnlineInfo(); + lookupResults.Add(null); // mark lookup failure continue; } + lookupResults.Add(res); + beatmapInfo.OnlineID = res.BeatmapID; beatmapInfo.OnlineMD5Hash = res.MD5Hash; beatmapInfo.LastOnlineUpdate = res.LastUpdated; @@ -62,13 +68,17 @@ namespace osu.Game.Beatmaps beatmapInfo.Status = res.BeatmapStatus; beatmapInfo.Metadata.Author.OnlineID = res.AuthorID; } + } - if (beatmapInfo.BeatmapSet.Beatmaps.All(b => b.MatchesOnlineVersion)) - { - beatmapInfo.BeatmapSet.Status = res.BeatmapSetStatus ?? BeatmapOnlineStatus.None; - beatmapInfo.BeatmapSet.DateRanked = res.DateRanked; - beatmapInfo.BeatmapSet.DateSubmitted = res.DateSubmitted; - } + if (beatmapSet.Beatmaps.All(b => b.MatchesOnlineVersion) + && lookupResults.All(r => r != null) + && lookupResults.Select(r => r!.BeatmapSetID).Distinct().Count() == 1) + { + var representative = lookupResults.First()!; + + beatmapSet.Status = representative.BeatmapSetStatus ?? BeatmapOnlineStatus.None; + beatmapSet.DateRanked = representative.DateRanked; + beatmapSet.DateSubmitted = representative.DateSubmitted; } } From e5e0b0e38585f292ce1775f0d4016e9ed55ebec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 11:55:30 +0100 Subject: [PATCH 547/651] Add test coverage for correct setting of beatmap set status --- .../BeatmapUpdaterMetadataLookupTest.cs | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs index 74812236bf..11c4c54ea6 100644 --- a/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs +++ b/osu.Game.Tests/Beatmaps/BeatmapUpdaterMetadataLookupTest.cs @@ -28,7 +28,12 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestLocalCacheQueriedFirst() { - var localLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; + var localLookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 123456, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + }; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) .Returns(true); @@ -42,6 +47,7 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: false); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); apiMetadataSourceMock.Verify(src => src.TryLookup(It.IsAny(), out It.Ref.IsAny!), Times.Never); } @@ -54,7 +60,12 @@ namespace osu.Game.Tests.Beatmaps localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) .Returns(false); - var onlineLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; + var onlineLookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 123456, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + }; apiMetadataSourceMock.Setup(src => src.Available).Returns(true); apiMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out onlineLookupResult)) .Returns(true); @@ -66,6 +77,7 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: false); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); } @@ -73,12 +85,22 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestPreferOnlineFetch() { - var localLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; + var localLookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 123456, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + }; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) .Returns(true); - var onlineLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Graveyard }; + var onlineLookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 123456, + BeatmapStatus = BeatmapOnlineStatus.Graveyard, + BeatmapSetStatus = BeatmapOnlineStatus.Graveyard, + }; apiMetadataSourceMock.Setup(src => src.Available).Returns(true); apiMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out onlineLookupResult)) .Returns(true); @@ -90,6 +112,7 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: true); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Graveyard)); + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.Graveyard)); localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Never); apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); } @@ -97,7 +120,12 @@ namespace osu.Game.Tests.Beatmaps [Test] public void TestPreferOnlineFetchFallsBackToLocalCacheIfOnlineSourceUnavailable() { - var localLookupResult = new OnlineBeatmapMetadata { BeatmapID = 123456, BeatmapStatus = BeatmapOnlineStatus.Ranked }; + var localLookupResult = new OnlineBeatmapMetadata + { + BeatmapID = 123456, + BeatmapStatus = BeatmapOnlineStatus.Ranked, + BeatmapSetStatus = BeatmapOnlineStatus.Ranked, + }; localCachedMetadataSourceMock.Setup(src => src.Available).Returns(true); localCachedMetadataSourceMock.Setup(src => src.TryLookup(It.IsAny(), out localLookupResult)) .Returns(true); @@ -111,6 +139,7 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: true); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.Ranked)); localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Never); } @@ -135,6 +164,7 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch: false); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.None)); Assert.That(beatmap.OnlineID, Is.EqualTo(-1)); localCachedMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); apiMetadataSourceMock.Verify(src => src.TryLookup(beatmap, out It.Ref.IsAny!), Times.Once); @@ -163,6 +193,7 @@ namespace osu.Game.Tests.Beatmaps metadataLookup.Update(beatmapSet, preferOnlineFetch); Assert.That(beatmap.Status, Is.EqualTo(BeatmapOnlineStatus.None)); + Assert.That(beatmapSet.Status, Is.EqualTo(BeatmapOnlineStatus.None)); Assert.That(beatmap.OnlineID, Is.EqualTo(123456)); } From 581ae2f679a00e98ea3e773a9c0c59494b9be8e5 Mon Sep 17 00:00:00 2001 From: tsunyoku Date: Mon, 12 Feb 2024 12:51:35 +0000 Subject: [PATCH 548/651] handle key presses when watching legacy relax replays --- osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs index 3679425389..55d8b6f55f 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs @@ -38,12 +38,17 @@ namespace osu.Game.Rulesets.Osu.Mods private ReplayState state = null!; private double lastStateChangeTime; + private DrawableOsuRuleset ruleset = null!; + private bool hasReplay; + private bool legacyReplay; public void ApplyToDrawableRuleset(DrawableRuleset drawableRuleset) { + ruleset = (DrawableOsuRuleset)drawableRuleset; + // grab the input manager for future use. - osuInputManager = ((DrawableOsuRuleset)drawableRuleset).KeyBindingInputManager; + osuInputManager = ruleset.KeyBindingInputManager; } public void ApplyToPlayer(Player player) @@ -51,6 +56,7 @@ namespace osu.Game.Rulesets.Osu.Mods if (osuInputManager.ReplayInputHandler != null) { hasReplay = true; + legacyReplay = ruleset.ReplayScore.ScoreInfo.IsLegacyScore; return; } @@ -59,7 +65,7 @@ namespace osu.Game.Rulesets.Osu.Mods public void Update(Playfield playfield) { - if (hasReplay) + if (hasReplay && !legacyReplay) return; bool requiresHold = false; @@ -125,6 +131,20 @@ namespace osu.Game.Rulesets.Osu.Mods isDownState = down; lastStateChangeTime = time; + // legacy replays do not contain key-presses with Relax mod, so they need to be triggered by themselves. + if (legacyReplay) + { + if (!down) + { + osuInputManager.KeyBindingContainer.TriggerReleased(wasLeft ? OsuAction.RightButton : OsuAction.LeftButton); + return; + } + + osuInputManager.KeyBindingContainer.TriggerPressed(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); + wasLeft = !wasLeft; + return; + } + state = new ReplayState { PressedActions = new List() From 96711eb185c0692868dc924b6b4368e8e1a8735d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 12 Feb 2024 18:02:34 +0100 Subject: [PATCH 549/651] Add test coverage --- .../NonVisual/Filtering/FilterQueryParserTest.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index 739a72df08..899be1e06c 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -274,10 +274,12 @@ namespace osu.Game.Tests.NonVisual.Filtering Assert.IsTrue(filterCriteria.OnlineStatus.IsUpperInclusive); } - [Test] - public void TestApplyCreatorQueries() + [TestCase("creator")] + [TestCase("author")] + [TestCase("mapper")] + public void TestApplyCreatorQueries(string keyword) { - const string query = "beatmap specifically by creator=my_fav"; + string query = $"beatmap specifically by {keyword}=my_fav"; var filterCriteria = new FilterCriteria(); FilterQueryParser.ApplyQueries(filterCriteria, query); Assert.AreEqual("beatmap specifically by", filterCriteria.SearchText.Trim()); From 2a02566283f831b469a2b37a4a645aae2cb07bc3 Mon Sep 17 00:00:00 2001 From: tsunyoku Date: Mon, 12 Feb 2024 17:45:00 +0000 Subject: [PATCH 550/651] refactor `down` and `wasLeft` management into respective `PressHandler` classes --- osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs | 67 +++++++++++++++++------ 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs index 55d8b6f55f..47b7e543d8 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs @@ -39,6 +39,7 @@ namespace osu.Game.Rulesets.Osu.Mods private double lastStateChangeTime; private DrawableOsuRuleset ruleset = null!; + private PressHandler pressHandler = null!; private bool hasReplay; private bool legacyReplay; @@ -56,10 +57,16 @@ namespace osu.Game.Rulesets.Osu.Mods if (osuInputManager.ReplayInputHandler != null) { hasReplay = true; + + Debug.Assert(ruleset.ReplayScore != null); legacyReplay = ruleset.ReplayScore.ScoreInfo.IsLegacyScore; + + pressHandler = new LegacyReplayPressHandler(this); + return; } + pressHandler = new PressHandler(this); osuInputManager.AllowGameplayInputs = false; } @@ -131,20 +138,6 @@ namespace osu.Game.Rulesets.Osu.Mods isDownState = down; lastStateChangeTime = time; - // legacy replays do not contain key-presses with Relax mod, so they need to be triggered by themselves. - if (legacyReplay) - { - if (!down) - { - osuInputManager.KeyBindingContainer.TriggerReleased(wasLeft ? OsuAction.RightButton : OsuAction.LeftButton); - return; - } - - osuInputManager.KeyBindingContainer.TriggerPressed(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); - wasLeft = !wasLeft; - return; - } - state = new ReplayState { PressedActions = new List() @@ -152,11 +145,53 @@ namespace osu.Game.Rulesets.Osu.Mods if (down) { - state.PressedActions.Add(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); + pressHandler.HandlePress(wasLeft); wasLeft = !wasLeft; } + else + { + pressHandler.HandleRelease(wasLeft); + } + } + } - state.Apply(osuInputManager.CurrentState, osuInputManager); + private class PressHandler + { + protected readonly OsuModRelax Mod; + + public PressHandler(OsuModRelax mod) + { + Mod = mod; + } + + public virtual void HandlePress(bool wasLeft) + { + Mod.state.PressedActions.Add(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); + Mod.state.Apply(Mod.osuInputManager.CurrentState, Mod.osuInputManager); + } + + public virtual void HandleRelease(bool wasLeft) + { + Mod.state.Apply(Mod.osuInputManager.CurrentState, Mod.osuInputManager); + } + } + + // legacy replays do not contain key-presses with Relax mod, so they need to be triggered by themselves. + private class LegacyReplayPressHandler : PressHandler + { + public LegacyReplayPressHandler(OsuModRelax mod) + : base(mod) + { + } + + public override void HandlePress(bool wasLeft) + { + Mod.osuInputManager.KeyBindingContainer.TriggerPressed(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); + } + + public override void HandleRelease(bool wasLeft) + { + Mod.osuInputManager.KeyBindingContainer.TriggerReleased(wasLeft ? OsuAction.RightButton : OsuAction.LeftButton); } } } From cc733ea809f3eb1d0887bf8c92605581fd21a9b3 Mon Sep 17 00:00:00 2001 From: tsunyoku Date: Mon, 12 Feb 2024 18:00:05 +0000 Subject: [PATCH 551/651] add inline comment for supposedly backwards ternary --- osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs index 47b7e543d8..a5643e5b49 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs @@ -191,6 +191,7 @@ namespace osu.Game.Rulesets.Osu.Mods public override void HandleRelease(bool wasLeft) { + // this intentionally releases right when `wasLeft` is true because `wasLeft` is set at point of press and not at point of release Mod.osuInputManager.KeyBindingContainer.TriggerReleased(wasLeft ? OsuAction.RightButton : OsuAction.LeftButton); } } From 4f0f07d55a45be5ff93e271d3adfde3b71945138 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 12 Feb 2024 21:30:10 +0300 Subject: [PATCH 552/651] Remove placeholder classes and inline everything --- .../Graphics/Sprites/SpriteIconWithTooltip.cs | 14 +++++++ .../Graphics/Sprites/SpriteTextWithTooltip.cs | 13 +++++++ .../Overlays/BeatmapSet/Scores/ScoreTable.cs | 20 ++++++++-- .../Scores/TopScoreStatisticsSection.cs | 19 +++++++-- .../Sections/Ranks/DrawableProfileScore.cs | 39 +++++++++++++++---- ...UnprocessedPerformancePointsPlaceholder.cs | 27 ------------- .../UnrankedPerformancePointsPlaceholder.cs | 26 ------------- 7 files changed, 91 insertions(+), 67 deletions(-) create mode 100644 osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs create mode 100644 osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs delete mode 100644 osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs delete mode 100644 osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs diff --git a/osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs b/osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs new file mode 100644 index 0000000000..572a17571b --- /dev/null +++ b/osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs @@ -0,0 +1,14 @@ +using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; + +namespace osu.Game.Graphics.Sprites +{ + /// + /// A with a publicly settable tooltip text. + /// + public partial class SpriteIconWithTooltip : SpriteIcon, IHasTooltip + { + public LocalisableString TooltipText { get; set; } + } +} diff --git a/osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs b/osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs new file mode 100644 index 0000000000..db98e8ba57 --- /dev/null +++ b/osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs @@ -0,0 +1,13 @@ +using osu.Framework.Graphics.Cursor; +using osu.Framework.Localisation; + +namespace osu.Game.Graphics.Sprites +{ + /// + /// An with a publicly settable tooltip text. + /// + internal partial class SpriteTextWithTooltip : OsuSpriteText, IHasTooltip + { + public LocalisableString TooltipText { get; set; } + } +} diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs index 9dd0e26da2..7a817c43eb 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs @@ -23,9 +23,9 @@ using osuTK.Graphics; using osu.Framework.Localisation; using osu.Framework.Extensions.LocalisationExtensions; using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.Sprites; using osu.Game.Resources.Localisation.Web; using osu.Game.Rulesets.Mods; -using osu.Game.Scoring.Drawables; namespace osu.Game.Overlays.BeatmapSet.Scores { @@ -181,9 +181,23 @@ namespace osu.Game.Overlays.BeatmapSet.Scores if (showPerformancePoints) { if (!score.Ranked) - content.Add(new UnrankedPerformancePointsPlaceholder(ScoresStrings.StatusNoPp) { Font = OsuFont.GetFont(size: text_size) }); + { + content.Add(new SpriteTextWithTooltip + { + Text = "-", + Font = OsuFont.GetFont(size: text_size), + TooltipText = ScoresStrings.StatusNoPp + }); + } else if (score.PP == null) - content.Add(new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(text_size) }); + { + content.Add(new SpriteIconWithTooltip + { + Icon = FontAwesome.Solid.Sync, + Size = new Vector2(text_size), + TooltipText = ScoresStrings.StatusProcessing, + }); + } else content.Add(new StatisticText(score.PP, format: @"N0")); } diff --git a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs index 4aad3cf953..17704f63ee 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs @@ -22,7 +22,6 @@ using osu.Game.Resources.Localisation.Web; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; using osu.Game.Scoring; -using osu.Game.Scoring.Drawables; using osuTK; namespace osu.Game.Overlays.BeatmapSet.Scores @@ -126,9 +125,23 @@ namespace osu.Game.Overlays.BeatmapSet.Scores ppColumn.Alpha = value.BeatmapInfo!.Status.GrantsPerformancePoints() ? 1 : 0; if (!value.Ranked) - ppColumn.Drawable = new UnrankedPerformancePointsPlaceholder(ScoresStrings.StatusNoPp) { Font = smallFont }; + { + ppColumn.Drawable = new SpriteTextWithTooltip + { + Text = "-", + Font = smallFont, + TooltipText = ScoresStrings.StatusNoPp + }; + } else if (value.PP is not double pp) - ppColumn.Drawable = new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(smallFont.Size) }; + { + ppColumn.Drawable = new SpriteIconWithTooltip + { + Icon = FontAwesome.Solid.Sync, + Size = new Vector2(smallFont.Size), + TooltipText = ScoresStrings.StatusProcessing, + }; + } else ppColumn.Text = pp.ToLocalisableString(@"N0"); diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs index 1211d65816..63afca8b74 100644 --- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs +++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs @@ -8,6 +8,7 @@ using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; using osu.Game.Beatmaps; using osu.Game.Graphics; @@ -18,7 +19,6 @@ using osu.Game.Resources.Localisation.Web; using osu.Game.Rulesets; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; -using osu.Game.Scoring.Drawables; using osu.Game.Utils; using osuTK; @@ -214,6 +214,8 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks private Drawable createDrawablePerformance() { + var font = OsuFont.GetFont(weight: FontWeight.Bold); + if (Score.PP.HasValue) { return new FillFlowContainer @@ -226,7 +228,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks { Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, - Font = OsuFont.GetFont(weight: FontWeight.Bold), + Font = font, Text = $"{Score.PP:0}", Colour = colourProvider.Highlight1 }, @@ -234,7 +236,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks { Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, - Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold), + Font = font.With(size: 12), Text = "pp", Colour = colourProvider.Light3 } @@ -244,23 +246,44 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks if (Score.Beatmap?.Status.GrantsPerformancePoints() != true) { - return new UnrankedPerformancePointsPlaceholder(UsersStrings.ShowExtraTopRanksNotRanked) + if (Score.Beatmap?.Status == BeatmapOnlineStatus.Loved) { + return new SpriteIconWithTooltip + { + Icon = FontAwesome.Solid.Heart, + Size = new Vector2(font.Size), + TooltipText = UsersStrings.ShowExtraTopRanksNotRanked, + Colour = colourProvider.Highlight1 + }; + } + + return new SpriteTextWithTooltip + { + Text = "-", Font = OsuFont.GetFont(weight: FontWeight.Bold), - Colour = colourProvider.Highlight1, + TooltipText = UsersStrings.ShowExtraTopRanksNotRanked, + Colour = colourProvider.Highlight1 }; } if (!Score.Ranked) { - return new UnrankedPerformancePointsPlaceholder(ScoresStrings.StatusNoPp) + return new SpriteTextWithTooltip { + Text = "-", Font = OsuFont.GetFont(weight: FontWeight.Bold), - Colour = colourProvider.Highlight1, + TooltipText = ScoresStrings.StatusNoPp, + Colour = colourProvider.Highlight1 }; } - return new UnprocessedPerformancePointsPlaceholder { Size = new Vector2(16), Colour = colourProvider.Highlight1 }; + return new SpriteIconWithTooltip + { + Icon = FontAwesome.Solid.Sync, + Size = new Vector2(font.Size), + TooltipText = ScoresStrings.StatusProcessing, + Colour = colourProvider.Highlight1 + }; } private partial class ScoreBeatmapMetadataContainer : BeatmapMetadataContainer diff --git a/osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs b/osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs deleted file mode 100644 index a2cb69062e..0000000000 --- a/osu.Game/Scoring/Drawables/UnprocessedPerformancePointsPlaceholder.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -#nullable disable -using osu.Framework.Graphics; -using osu.Framework.Graphics.Cursor; -using osu.Framework.Graphics.Sprites; -using osu.Framework.Localisation; -using osu.Game.Resources.Localisation.Web; - -namespace osu.Game.Scoring.Drawables -{ - /// - /// A placeholder used in PP columns for scores with unprocessed PP value. - /// - public partial class UnprocessedPerformancePointsPlaceholder : SpriteIcon, IHasTooltip - { - public LocalisableString TooltipText => ScoresStrings.StatusProcessing; - - public UnprocessedPerformancePointsPlaceholder() - { - Anchor = Anchor.Centre; - Origin = Anchor.Centre; - Icon = FontAwesome.Solid.Sync; - } - } -} diff --git a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs b/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs deleted file mode 100644 index 0097497ef1..0000000000 --- a/osu.Game/Scoring/Drawables/UnrankedPerformancePointsPlaceholder.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using osu.Framework.Graphics; -using osu.Framework.Graphics.Cursor; -using osu.Framework.Graphics.Sprites; -using osu.Framework.Localisation; - -namespace osu.Game.Scoring.Drawables -{ - /// - /// A placeholder used in PP columns for scores that do not award PP due to a reason specified by . - /// - public partial class UnrankedPerformancePointsPlaceholder : SpriteText, IHasTooltip - { - public LocalisableString TooltipText { get; } - - public UnrankedPerformancePointsPlaceholder(LocalisableString tooltipText) - { - Anchor = Anchor.Centre; - Origin = Anchor.Centre; - Text = "-"; - TooltipText = tooltipText; - } - } -} From 5bebe9fe0d5c5a5110efd1cd145e5dcb93cd92af Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 12 Feb 2024 21:33:16 +0300 Subject: [PATCH 553/651] Add test case for profile scores made on loved beatmaps --- .../Online/TestSceneUserProfileScores.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs b/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs index f72980757b..56e4348b65 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneUserProfileScores.cs @@ -102,6 +102,24 @@ namespace osu.Game.Tests.Visual.Online Ranked = true, }; + var lovedScore = new SoloScoreInfo + { + Rank = ScoreRank.B, + Beatmap = new APIBeatmap + { + BeatmapSet = new APIBeatmapSet + { + Title = "C18H27NO3(extend)", + Artist = "Team Grimoire", + }, + DifficultyName = "[4K] Cataclysmic Hypernova", + Status = BeatmapOnlineStatus.Loved, + }, + EndedAt = DateTimeOffset.Now, + Accuracy = 0.55879, + Ranked = true, + }; + var unprocessedPPScore = new SoloScoreInfo { Rank = ScoreRank.B, @@ -151,6 +169,7 @@ namespace osu.Game.Tests.Visual.Online new ColourProvidedContainer(OverlayColourScheme.Green, new DrawableProfileScore(firstScore)), new ColourProvidedContainer(OverlayColourScheme.Green, new DrawableProfileScore(secondScore)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileScore(noPPScore)), + new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileScore(lovedScore)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileScore(unprocessedPPScore)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileScore(unrankedPPScore)), new ColourProvidedContainer(OverlayColourScheme.Pink, new DrawableProfileWeightedScore(firstScore, 0.97)), From 2d65dfbf09f1e2c139862a649d363e0c12d37030 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 12 Feb 2024 22:10:36 +0300 Subject: [PATCH 554/651] Fix Rider EAP whoopsie --- osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs | 3 +++ osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs b/osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs index 572a17571b..17f4bf53f9 100644 --- a/osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs +++ b/osu.Game/Graphics/Sprites/SpriteIconWithTooltip.cs @@ -1,3 +1,6 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; diff --git a/osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs b/osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs index db98e8ba57..446b621b81 100644 --- a/osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs +++ b/osu.Game/Graphics/Sprites/SpriteTextWithTooltip.cs @@ -1,3 +1,6 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + using osu.Framework.Graphics.Cursor; using osu.Framework.Localisation; From 5101979ac099b7e590e020020bf3b0a7bf134164 Mon Sep 17 00:00:00 2001 From: James Wilson Date: Tue, 13 Feb 2024 00:34:06 +0000 Subject: [PATCH 555/651] only use `LegacyReplayPressHandler` on legacy replays --- osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs index a5643e5b49..d2e4e0c669 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs @@ -1,4 +1,4 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; @@ -61,7 +61,7 @@ namespace osu.Game.Rulesets.Osu.Mods Debug.Assert(ruleset.ReplayScore != null); legacyReplay = ruleset.ReplayScore.ScoreInfo.IsLegacyScore; - pressHandler = new LegacyReplayPressHandler(this); + pressHandler = legacyReplay ? new LegacyReplayPressHandler(this) : new PressHandler(this); return; } From 22e9c4a3b59e414a881ceae5abc885389a0af5b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Tue, 13 Feb 2024 10:19:55 +0100 Subject: [PATCH 556/651] Use private interface rather than weird inheritance --- osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs | 38 ++++++++++++++--------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs index d2e4e0c669..31511c01b8 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRelax.cs @@ -39,7 +39,7 @@ namespace osu.Game.Rulesets.Osu.Mods private double lastStateChangeTime; private DrawableOsuRuleset ruleset = null!; - private PressHandler pressHandler = null!; + private IPressHandler pressHandler = null!; private bool hasReplay; private bool legacyReplay; @@ -155,44 +155,52 @@ namespace osu.Game.Rulesets.Osu.Mods } } - private class PressHandler + private interface IPressHandler { - protected readonly OsuModRelax Mod; + void HandlePress(bool wasLeft); + void HandleRelease(bool wasLeft); + } + + private class PressHandler : IPressHandler + { + private readonly OsuModRelax mod; public PressHandler(OsuModRelax mod) { - Mod = mod; + this.mod = mod; } - public virtual void HandlePress(bool wasLeft) + public void HandlePress(bool wasLeft) { - Mod.state.PressedActions.Add(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); - Mod.state.Apply(Mod.osuInputManager.CurrentState, Mod.osuInputManager); + mod.state.PressedActions.Add(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); + mod.state.Apply(mod.osuInputManager.CurrentState, mod.osuInputManager); } - public virtual void HandleRelease(bool wasLeft) + public void HandleRelease(bool wasLeft) { - Mod.state.Apply(Mod.osuInputManager.CurrentState, Mod.osuInputManager); + mod.state.Apply(mod.osuInputManager.CurrentState, mod.osuInputManager); } } // legacy replays do not contain key-presses with Relax mod, so they need to be triggered by themselves. - private class LegacyReplayPressHandler : PressHandler + private class LegacyReplayPressHandler : IPressHandler { + private readonly OsuModRelax mod; + public LegacyReplayPressHandler(OsuModRelax mod) - : base(mod) { + this.mod = mod; } - public override void HandlePress(bool wasLeft) + public void HandlePress(bool wasLeft) { - Mod.osuInputManager.KeyBindingContainer.TriggerPressed(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); + mod.osuInputManager.KeyBindingContainer.TriggerPressed(wasLeft ? OsuAction.LeftButton : OsuAction.RightButton); } - public override void HandleRelease(bool wasLeft) + public void HandleRelease(bool wasLeft) { // this intentionally releases right when `wasLeft` is true because `wasLeft` is set at point of press and not at point of release - Mod.osuInputManager.KeyBindingContainer.TriggerReleased(wasLeft ? OsuAction.RightButton : OsuAction.LeftButton); + mod.osuInputManager.KeyBindingContainer.TriggerReleased(wasLeft ? OsuAction.RightButton : OsuAction.LeftButton); } } } From da4ebd0681e05318d7328fc5be587151233e8f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 9 Feb 2024 10:41:36 +0100 Subject: [PATCH 557/651] Refactor `SoloStatisticsWatcher` to no longer require explicit subscription callbacks --- .../Online/TestSceneSoloStatisticsWatcher.cs | 41 ++++--------- osu.Game/Online/Solo/SoloStatisticsWatcher.cs | 59 +++++-------------- .../TransientUserStatisticsUpdateDisplay.cs | 10 ++++ osu.Game/Screens/Play/SubmittingPlayer.cs | 5 ++ osu.Game/Screens/Ranking/SoloResultsScreen.cs | 24 ++++---- 5 files changed, 56 insertions(+), 83 deletions(-) create mode 100644 osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs diff --git a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs index 3607b37c7e..19121b7f58 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneSoloStatisticsWatcher.cs @@ -35,8 +35,6 @@ namespace osu.Game.Tests.Visual.Online private Action? handleGetUsersRequest; private Action? handleGetUserRequest; - private IDisposable? subscription; - private readonly Dictionary<(int userId, string rulesetName), UserStatistics> serverSideStatistics = new Dictionary<(int userId, string rulesetName), UserStatistics>(); [SetUpSteps] @@ -252,26 +250,6 @@ namespace osu.Game.Tests.Visual.Online AddAssert("values after are correct", () => update!.After.TotalScore, () => Is.EqualTo(6_000_000)); } - [Test] - public void TestStatisticsUpdateNotFiredAfterSubscriptionDisposal() - { - int userId = getUserId(); - setUpUser(userId); - - long scoreId = getScoreId(); - var ruleset = new OsuRuleset().RulesetInfo; - - SoloStatisticsUpdate? update = null; - registerForUpdates(scoreId, ruleset, receivedUpdate => update = receivedUpdate); - AddStep("unsubscribe", () => subscription!.Dispose()); - - feignScoreProcessing(userId, ruleset, 5_000_000); - - AddStep("signal score processed", () => ((ISpectatorClient)spectatorClient).UserScoreProcessed(userId, scoreId)); - AddWaitStep("wait a bit", 5); - AddAssert("update not received", () => update == null); - } - [Test] public void TestGlobalStatisticsUpdatedAfterRegistrationAddedAndScoreProcessed() { @@ -312,13 +290,20 @@ namespace osu.Game.Tests.Visual.Online } private void registerForUpdates(long scoreId, RulesetInfo rulesetInfo, Action onUpdateReady) => - AddStep("register for updates", () => subscription = watcher.RegisterForStatisticsUpdateAfter( - new ScoreInfo(Beatmap.Value.BeatmapInfo, new OsuRuleset().RulesetInfo, new RealmUser()) + AddStep("register for updates", () => + { + watcher.RegisterForStatisticsUpdateAfter( + new ScoreInfo(Beatmap.Value.BeatmapInfo, new OsuRuleset().RulesetInfo, new RealmUser()) + { + Ruleset = rulesetInfo, + OnlineID = scoreId + }); + watcher.LatestUpdate.BindValueChanged(update => { - Ruleset = rulesetInfo, - OnlineID = scoreId - }, - onUpdateReady)); + if (update.NewValue?.Score.OnlineID == scoreId) + onUpdateReady.Invoke(update.NewValue); + }); + }); private void feignScoreProcessing(int userId, RulesetInfo rulesetInfo, long newTotalScore) => AddStep("feign score processing", () => serverSideStatistics[(userId, rulesetInfo.ShortName)] = new UserStatistics { TotalScore = newTotalScore }); diff --git a/osu.Game/Online/Solo/SoloStatisticsWatcher.cs b/osu.Game/Online/Solo/SoloStatisticsWatcher.cs index 55b27fb364..2072e8633f 100644 --- a/osu.Game/Online/Solo/SoloStatisticsWatcher.cs +++ b/osu.Game/Online/Solo/SoloStatisticsWatcher.cs @@ -1,10 +1,10 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; +using osu.Framework.Bindables; using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Game.Extensions; @@ -22,14 +22,16 @@ namespace osu.Game.Online.Solo /// public partial class SoloStatisticsWatcher : Component { + public IBindable LatestUpdate => latestUpdate; + private readonly Bindable latestUpdate = new Bindable(); + [Resolved] private SpectatorClient spectatorClient { get; set; } = null!; [Resolved] private IAPIProvider api { get; set; } = null!; - private readonly Dictionary callbacks = new Dictionary(); - private long? lastProcessedScoreId; + private readonly Dictionary watchedScores = new Dictionary(); private Dictionary? latestStatistics; @@ -45,9 +47,7 @@ namespace osu.Game.Online.Solo /// Registers for a user statistics update after the given has been processed server-side. /// /// The score to listen for the statistics update for. - /// The callback to be invoked once the statistics update has been prepared. - /// An representing the subscription. Disposing it is equivalent to unsubscribing from future notifications. - public IDisposable RegisterForStatisticsUpdateAfter(ScoreInfo score, Action onUpdateReady) + public void RegisterForStatisticsUpdateAfter(ScoreInfo score) { Schedule(() => { @@ -57,24 +57,12 @@ namespace osu.Game.Online.Solo if (!score.Ruleset.IsLegacyRuleset() || score.OnlineID <= 0) return; - var callback = new StatisticsUpdateCallback(score, onUpdateReady); - - if (lastProcessedScoreId == score.OnlineID) - { - requestStatisticsUpdate(api.LocalUser.Value.Id, callback); - return; - } - - callbacks.Add(score.OnlineID, callback); + watchedScores.Add(score.OnlineID, score); }); - - return new InvokeOnDisposal(() => Schedule(() => callbacks.Remove(score.OnlineID))); } private void onUserChanged(APIUser? localUser) => Schedule(() => { - callbacks.Clear(); - lastProcessedScoreId = null; latestStatistics = null; if (localUser == null || localUser.OnlineID <= 1) @@ -107,25 +95,22 @@ namespace osu.Game.Online.Solo if (userId != api.LocalUser.Value?.OnlineID) return; - lastProcessedScoreId = scoreId; - - if (!callbacks.TryGetValue(scoreId, out var callback)) + if (!watchedScores.Remove(scoreId, out var scoreInfo)) return; - requestStatisticsUpdate(userId, callback); - callbacks.Remove(scoreId); + requestStatisticsUpdate(userId, scoreInfo); } - private void requestStatisticsUpdate(int userId, StatisticsUpdateCallback callback) + private void requestStatisticsUpdate(int userId, ScoreInfo scoreInfo) { - var request = new GetUserRequest(userId, callback.Score.Ruleset); - request.Success += user => Schedule(() => dispatchStatisticsUpdate(callback, user.Statistics)); + var request = new GetUserRequest(userId, scoreInfo.Ruleset); + request.Success += user => Schedule(() => dispatchStatisticsUpdate(scoreInfo, user.Statistics)); api.Queue(request); } - private void dispatchStatisticsUpdate(StatisticsUpdateCallback callback, UserStatistics updatedStatistics) + private void dispatchStatisticsUpdate(ScoreInfo scoreInfo, UserStatistics updatedStatistics) { - string rulesetName = callback.Score.Ruleset.ShortName; + string rulesetName = scoreInfo.Ruleset.ShortName; api.UpdateStatistics(updatedStatistics); @@ -135,9 +120,7 @@ namespace osu.Game.Online.Solo latestStatistics.TryGetValue(rulesetName, out UserStatistics? latestRulesetStatistics); latestRulesetStatistics ??= new UserStatistics(); - var update = new SoloStatisticsUpdate(callback.Score, latestRulesetStatistics, updatedStatistics); - callback.OnUpdateReady.Invoke(update); - + latestUpdate.Value = new SoloStatisticsUpdate(scoreInfo, latestRulesetStatistics, updatedStatistics); latestStatistics[rulesetName] = updatedStatistics; } @@ -148,17 +131,5 @@ namespace osu.Game.Online.Solo base.Dispose(isDisposing); } - - private class StatisticsUpdateCallback - { - public ScoreInfo Score { get; } - public Action OnUpdateReady { get; } - - public StatisticsUpdateCallback(ScoreInfo score, Action onUpdateReady) - { - Score = score; - OnUpdateReady = onUpdateReady; - } - } } } diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs new file mode 100644 index 0000000000..3917933958 --- /dev/null +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -0,0 +1,10 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +namespace osu.Game.Overlays.Toolbar +{ + public class TransientUserStatisticsUpdateDisplay + { + + } +} diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs index c8e84f1961..bbd36c05d8 100644 --- a/osu.Game/Screens/Play/SubmittingPlayer.cs +++ b/osu.Game/Screens/Play/SubmittingPlayer.cs @@ -17,6 +17,7 @@ using osu.Game.Database; using osu.Game.Online.API; using osu.Game.Online.Multiplayer; using osu.Game.Online.Rooms; +using osu.Game.Online.Solo; using osu.Game.Online.Spectator; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; @@ -42,6 +43,9 @@ namespace osu.Game.Screens.Play [Resolved] private SessionStatics statics { get; set; } + [Resolved] + private SoloStatisticsWatcher soloStatisticsWatcher { get; set; } + private readonly object scoreSubmissionLock = new object(); private TaskCompletionSource scoreSubmissionSource; @@ -175,6 +179,7 @@ namespace osu.Game.Screens.Play await submitScore(score).ConfigureAwait(false); spectatorClient.EndPlaying(GameplayState); + soloStatisticsWatcher.RegisterForStatisticsUpdateAfter(score.ScoreInfo); } [Resolved] diff --git a/osu.Game/Screens/Ranking/SoloResultsScreen.cs b/osu.Game/Screens/Ranking/SoloResultsScreen.cs index 22d631e137..cba2fa18c0 100644 --- a/osu.Game/Screens/Ranking/SoloResultsScreen.cs +++ b/osu.Game/Screens/Ranking/SoloResultsScreen.cs @@ -31,10 +31,7 @@ namespace osu.Game.Screens.Ranking [Resolved] private RulesetStore rulesets { get; set; } = null!; - [Resolved] - private SoloStatisticsWatcher soloStatisticsWatcher { get; set; } = null!; - - private IDisposable? statisticsSubscription; + private IBindable latestUpdate = null!; private readonly Bindable statisticsUpdate = new Bindable(); public SoloResultsScreen(ScoreInfo score, bool allowRetry) @@ -42,14 +39,20 @@ namespace osu.Game.Screens.Ranking { } - protected override void LoadComplete() + [BackgroundDependencyLoader] + private void load(SoloStatisticsWatcher soloStatisticsWatcher) { - base.LoadComplete(); - - Debug.Assert(Score != null); - if (ShowUserStatistics) - statisticsSubscription = soloStatisticsWatcher.RegisterForStatisticsUpdateAfter(Score, update => statisticsUpdate.Value = update); + { + Debug.Assert(Score != null); + + latestUpdate = soloStatisticsWatcher.LatestUpdate.GetBoundCopy(); + latestUpdate.BindValueChanged(update => + { + if (update.NewValue?.Score.MatchesOnlineID(Score) == true) + statisticsUpdate.Value = update.NewValue; + }); + } } protected override StatisticsPanel CreateStatisticsPanel() @@ -84,7 +87,6 @@ namespace osu.Game.Screens.Ranking base.Dispose(isDisposing); getScoreRequest?.Cancel(); - statisticsSubscription?.Dispose(); } } } From 21b9fb95e28c6c4f7e27467ac301727a00469758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 9 Feb 2024 15:19:38 +0100 Subject: [PATCH 558/651] Move `SoloStatisticsWatcher` to `OsuGame` Doesn't feel like it needs to be in base, and it being in base was causing problems elsewhere before. --- osu.Game/OsuGame.cs | 2 ++ osu.Game/OsuGameBase.cs | 4 ---- osu.Game/Screens/Play/SubmittingPlayer.cs | 5 +++-- osu.Game/Screens/Ranking/SoloResultsScreen.cs | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index c244708385..640096a5a8 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -47,6 +47,7 @@ using osu.Game.Localisation; using osu.Game.Online; using osu.Game.Online.Chat; using osu.Game.Online.Rooms; +using osu.Game.Online.Solo; using osu.Game.Overlays; using osu.Game.Overlays.BeatmapListing; using osu.Game.Overlays.Music; @@ -1015,6 +1016,7 @@ namespace osu.Game ScreenStack.Push(CreateLoader().With(l => l.RelativeSizeAxes = Axes.Both)); }); + loadComponentSingleFile(new SoloStatisticsWatcher(), Add, true); loadComponentSingleFile(Toolbar = new Toolbar { OnHome = delegate diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index a2a6322665..81e3d8bed8 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -50,7 +50,6 @@ using osu.Game.Online.API; using osu.Game.Online.Chat; using osu.Game.Online.Metadata; using osu.Game.Online.Multiplayer; -using osu.Game.Online.Solo; using osu.Game.Online.Spectator; using osu.Game.Overlays; using osu.Game.Overlays.Settings; @@ -207,7 +206,6 @@ namespace osu.Game protected MultiplayerClient MultiplayerClient { get; private set; } private MetadataClient metadataClient; - private SoloStatisticsWatcher soloStatisticsWatcher; private RealmAccess realm; @@ -328,7 +326,6 @@ namespace osu.Game dependencies.CacheAs(SpectatorClient = new OnlineSpectatorClient(endpoints)); dependencies.CacheAs(MultiplayerClient = new OnlineMultiplayerClient(endpoints)); dependencies.CacheAs(metadataClient = new OnlineMetadataClient(endpoints)); - dependencies.CacheAs(soloStatisticsWatcher = new SoloStatisticsWatcher()); base.Content.Add(new BeatmapOnlineChangeIngest(beatmapUpdater, realm, metadataClient)); @@ -371,7 +368,6 @@ namespace osu.Game base.Content.Add(SpectatorClient); base.Content.Add(MultiplayerClient); base.Content.Add(metadataClient); - base.Content.Add(soloStatisticsWatcher); base.Content.Add(rulesetConfigCache); diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs index bbd36c05d8..c45d46e993 100644 --- a/osu.Game/Screens/Play/SubmittingPlayer.cs +++ b/osu.Game/Screens/Play/SubmittingPlayer.cs @@ -43,7 +43,8 @@ namespace osu.Game.Screens.Play [Resolved] private SessionStatics statics { get; set; } - [Resolved] + [Resolved(canBeNull: true)] + [CanBeNull] private SoloStatisticsWatcher soloStatisticsWatcher { get; set; } private readonly object scoreSubmissionLock = new object(); @@ -179,7 +180,7 @@ namespace osu.Game.Screens.Play await submitScore(score).ConfigureAwait(false); spectatorClient.EndPlaying(GameplayState); - soloStatisticsWatcher.RegisterForStatisticsUpdateAfter(score.ScoreInfo); + soloStatisticsWatcher?.RegisterForStatisticsUpdateAfter(score.ScoreInfo); } [Resolved] diff --git a/osu.Game/Screens/Ranking/SoloResultsScreen.cs b/osu.Game/Screens/Ranking/SoloResultsScreen.cs index cba2fa18c0..866440bbd6 100644 --- a/osu.Game/Screens/Ranking/SoloResultsScreen.cs +++ b/osu.Game/Screens/Ranking/SoloResultsScreen.cs @@ -40,9 +40,9 @@ namespace osu.Game.Screens.Ranking } [BackgroundDependencyLoader] - private void load(SoloStatisticsWatcher soloStatisticsWatcher) + private void load(SoloStatisticsWatcher? soloStatisticsWatcher) { - if (ShowUserStatistics) + if (ShowUserStatistics && soloStatisticsWatcher != null) { Debug.Assert(Score != null); From 14052ae1cc15c45cb81f60fd20341dfcfea7d429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 9 Feb 2024 17:14:15 +0100 Subject: [PATCH 559/651] Implement transient stats display on user toolbar button --- .../Menus/TestSceneToolbarUserButton.cs | 91 ++++++++ .../Overlays/Toolbar/ToolbarUserButton.cs | 7 + .../TransientUserStatisticsUpdateDisplay.cs | 215 +++++++++++++++++- 3 files changed, 311 insertions(+), 2 deletions(-) diff --git a/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs b/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs index f0506ed35c..69fedf4a3a 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneToolbarUserButton.cs @@ -2,12 +2,17 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Linq; using NUnit.Framework; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; +using osu.Framework.Testing; using osu.Game.Online.API; +using osu.Game.Online.Solo; using osu.Game.Overlays.Toolbar; +using osu.Game.Scoring; +using osu.Game.Users; using osuTK; using osuTK.Graphics; @@ -87,5 +92,91 @@ namespace osu.Game.Tests.Visual.Menus AddStep($"Change state to {state}", () => dummyAPI.SetState(state)); } } + + [Test] + public void TestTransientUserStatisticsDisplay() + { + AddStep("Log in", () => dummyAPI.Login("wang", "jang")); + AddStep("Gain", () => + { + var transientUpdateDisplay = this.ChildrenOfType().Single(); + transientUpdateDisplay.LatestUpdate.Value = new SoloStatisticsUpdate( + new ScoreInfo(), + new UserStatistics + { + GlobalRank = 123_456, + PP = 1234 + }, + new UserStatistics + { + GlobalRank = 111_111, + PP = 1357 + }); + }); + AddStep("Loss", () => + { + var transientUpdateDisplay = this.ChildrenOfType().Single(); + transientUpdateDisplay.LatestUpdate.Value = new SoloStatisticsUpdate( + new ScoreInfo(), + new UserStatistics + { + GlobalRank = 111_111, + PP = 1357 + }, + new UserStatistics + { + GlobalRank = 123_456, + PP = 1234 + }); + }); + AddStep("No change", () => + { + var transientUpdateDisplay = this.ChildrenOfType().Single(); + transientUpdateDisplay.LatestUpdate.Value = new SoloStatisticsUpdate( + new ScoreInfo(), + new UserStatistics + { + GlobalRank = 111_111, + PP = 1357 + }, + new UserStatistics + { + GlobalRank = 111_111, + PP = 1357 + }); + }); + AddStep("Was null", () => + { + var transientUpdateDisplay = this.ChildrenOfType().Single(); + transientUpdateDisplay.LatestUpdate.Value = new SoloStatisticsUpdate( + new ScoreInfo(), + new UserStatistics + { + GlobalRank = null, + PP = null + }, + new UserStatistics + { + GlobalRank = 111_111, + PP = 1357 + }); + }); + AddStep("Became null", () => + { + var transientUpdateDisplay = this.ChildrenOfType().Single(); + transientUpdateDisplay.LatestUpdate.Value = new SoloStatisticsUpdate( + new ScoreInfo(), + new UserStatistics + { + GlobalRank = 111_111, + PP = 1357 + }, + new UserStatistics + { + GlobalRank = null, + PP = null + }); + }); + } } } diff --git a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs index 2620e850c8..96c0b15c44 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarUserButton.cs @@ -78,6 +78,13 @@ namespace osu.Game.Overlays.Toolbar } }); + Flow.Add(new TransientUserStatisticsUpdateDisplay + { + Alpha = 0 + }); + Flow.AutoSizeEasing = Easing.OutQuint; + Flow.AutoSizeDuration = 250; + apiState = api.State.GetBoundCopy(); apiState.BindValueChanged(onlineStateChanged, true); diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index 3917933958..9070ea9030 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -1,10 +1,221 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; +using System.Collections.Generic; +using osu.Framework.Allocation; +using osu.Framework.Bindables; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; +using osu.Game.Graphics; +using osu.Game.Graphics.Sprites; +using osu.Game.Graphics.UserInterface; +using osu.Game.Online.Solo; +using osu.Game.Resources.Localisation.Web; +using osuTK; + namespace osu.Game.Overlays.Toolbar { - public class TransientUserStatisticsUpdateDisplay + public partial class TransientUserStatisticsUpdateDisplay : CompositeDrawable { - + public Bindable LatestUpdate { get; } = new Bindable(); + + private Statistic globalRank = null!; + private Statistic pp = null!; + + [BackgroundDependencyLoader] + private void load() + { + RelativeSizeAxes = Axes.Y; + AutoSizeAxes = Axes.X; + Alpha = 0; + + InternalChild = new FillFlowContainer + { + RelativeSizeAxes = Axes.Y, + AutoSizeAxes = Axes.X, + Padding = new MarginPadding { Horizontal = 10 }, + Spacing = new Vector2(10), + Direction = FillDirection.Horizontal, + Children = new Drawable[] + { + globalRank = new Statistic(UsersStrings.ShowRankGlobalSimple, @"#", Comparer.Create((before, after) => before - after)), + pp = new Statistic(RankingsStrings.StatPerformance, string.Empty, Comparer.Create((before, after) => Math.Sign(after - before))), + } + }; + } + + protected override void LoadComplete() + { + base.LoadComplete(); + + LatestUpdate.BindValueChanged(val => + { + if (val.NewValue == null) + return; + + var update = val.NewValue; + + // null handling here is best effort because it is annoying. + + globalRank.Alpha = update.After.GlobalRank == null ? 0 : 1; + pp.Alpha = update.After.PP == null ? 0 : 1; + + if (globalRank.Alpha == 0 && pp.Alpha == 0) + return; + + FinishTransforms(true); + + this.FadeIn(500, Easing.OutQuint); + + if (update.After.GlobalRank != null) + { + globalRank.Display( + update.Before.GlobalRank ?? update.After.GlobalRank.Value, + Math.Abs((update.After.GlobalRank.Value - update.Before.GlobalRank) ?? 0), + update.After.GlobalRank.Value); + } + + if (update.After.PP != null) + pp.Display(update.Before.PP ?? update.After.PP.Value, Math.Abs((update.After.PP - update.Before.PP) ?? 0M), update.After.PP.Value); + + this.Delay(4000).FadeOut(500, Easing.OutQuint); + }); + } + + private partial class Statistic : CompositeDrawable + where T : struct, IEquatable, IFormattable + { + private readonly LocalisableString title; + private readonly string mainValuePrefix; + private readonly IComparer valueComparer; + + private Counter mainValue = null!; + private Counter deltaValue = null!; + private OsuSpriteText titleText = null!; + + [Resolved] + private OsuColour colours { get; set; } = null!; + + public Statistic(LocalisableString title, string mainValuePrefix, IComparer valueComparer) + { + this.title = title; + this.mainValuePrefix = mainValuePrefix; + this.valueComparer = valueComparer; + } + + [BackgroundDependencyLoader] + private void load() + { + RelativeSizeAxes = Axes.Y; + AutoSizeAxes = Axes.X; + InternalChild = new FillFlowContainer + { + AutoSizeAxes = Axes.Both, + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + Direction = FillDirection.Vertical, + Children = new Drawable[] + { + mainValue = new Counter + { + ValuePrefix = mainValuePrefix, + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + Font = OsuFont.GetFont(), + }, + new Container + { + AutoSizeAxes = Axes.Both, + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + Children = new Drawable[] + { + deltaValue = new Counter + { + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + Font = OsuFont.GetFont(size: 12, fixedWidth: false, weight: FontWeight.SemiBold), + AlwaysPresent = true, + }, + titleText = new OsuSpriteText + { + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + Font = OsuFont.Default.With(size: 12, weight: FontWeight.SemiBold), + Text = title, + AlwaysPresent = true, + } + } + } + } + }; + } + + public void Display(T before, T delta, T after) + { + int comparison = valueComparer.Compare(before, after); + + if (comparison > 0) + { + deltaValue.Colour = colours.Lime1; + deltaValue.ValuePrefix = "+"; + } + else if (comparison < 0) + { + deltaValue.Colour = colours.Red1; + deltaValue.ValuePrefix = "-"; + } + else + { + deltaValue.Colour = Colour4.White; + deltaValue.ValuePrefix = string.Empty; + } + + mainValue.SetCountWithoutRolling(before); + deltaValue.SetCountWithoutRolling(delta); + + titleText.Alpha = 1; + deltaValue.Alpha = 0; + + using (BeginDelayedSequence(1000)) + { + titleText.FadeOut(250, Easing.OutQuint); + deltaValue.FadeIn(250, Easing.OutQuint) + .Then().Delay(1000) + .Then().OnComplete(_ => + { + mainValue.Current.Value = after; + deltaValue.Current.SetDefault(); + }); + } + } + } + + private partial class Counter : RollingCounter + where T : struct, IEquatable, IFormattable + { + public const double ROLLING_DURATION = 500; + + public FontUsage Font { get; init; } = OsuFont.Default; + + public string ValuePrefix + { + get => valuePrefix; + set + { + valuePrefix = value; + UpdateDisplay(); + } + } + + private string valuePrefix = string.Empty; + + protected override LocalisableString FormatCount(T count) => LocalisableString.Format(@"{0}{1:N0}", ValuePrefix, count); + protected override OsuSpriteText CreateSpriteText() => base.CreateSpriteText().With(t => t.Font = Font); + protected override double RollingDuration => ROLLING_DURATION; + } } } From eae43f5fd90b5aec6a698253c9f82cb6e3f878e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Fri, 9 Feb 2024 17:15:52 +0100 Subject: [PATCH 560/651] Consume `SoloStatisticsWatcher` updates in toolbar button --- .../Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs | 5 ++++- osu.Game/Screens/Ranking/ResultsScreen.cs | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index 9070ea9030..e3c1746e14 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -26,7 +26,7 @@ namespace osu.Game.Overlays.Toolbar private Statistic pp = null!; [BackgroundDependencyLoader] - private void load() + private void load(SoloStatisticsWatcher? soloStatisticsWatcher) { RelativeSizeAxes = Axes.Y; AutoSizeAxes = Axes.X; @@ -45,6 +45,9 @@ namespace osu.Game.Overlays.Toolbar pp = new Statistic(RankingsStrings.StatPerformance, string.Empty, Comparer.Create((before, after) => Math.Sign(after - before))), } }; + + if (soloStatisticsWatcher != null) + ((IBindable)LatestUpdate).BindTo(soloStatisticsWatcher.LatestUpdate); } protected override void LoadComplete() diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs index 82dade40eb..69cfbed8f2 100644 --- a/osu.Game/Screens/Ranking/ResultsScreen.cs +++ b/osu.Game/Screens/Ranking/ResultsScreen.cs @@ -41,9 +41,6 @@ namespace osu.Game.Screens.Ranking public override bool? AllowGlobalTrackControl => true; - // Temporary for now to stop dual transitions. Should respect the current toolbar mode, but there's no way to do so currently. - public override bool HideOverlaysOnEnter => true; - public readonly Bindable SelectedScore = new Bindable(); [CanBeNull] From 62f5251b6ef8eef5f0b1c638621aa0258379fb17 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Tue, 13 Feb 2024 11:51:21 +0300 Subject: [PATCH 561/651] Rewrite osu!catch playfield layout containers and apply masking around vertical boundaries --- .../UI/CatchPlayfieldAdjustmentContainer.cs | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs index 11531011ee..1bddd06d87 100644 --- a/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs @@ -17,24 +17,29 @@ namespace osu.Game.Rulesets.Catch.UI public CatchPlayfieldAdjustmentContainer() { - Anchor = Anchor.TopCentre; - Origin = Anchor.TopCentre; - - // playfields in stable are positioned vertically at three fourths the difference between the playfield height and the window height in stable. - // we can match that in lazer by using relative coordinates for Y and considering window height to be 1, and playfield height to be 0.8. - RelativePositionAxes = Axes.Y; - Y = (1 - playfield_size_adjust) / 4 * 3; - - Size = new Vector2(playfield_size_adjust); + const float base_game_width = 1024f; + const float base_game_height = 768f; InternalChild = new Container { + // This container limits vertical visibility of the playfield to ensure fairness between wide and tall resolutions (i.e. tall resolutions should not see more fruits). + // Note that the container still extends across the screen horizontally, so that hit explosions at the sides of the playfield do not get cut off. + Name = "Visible area", Anchor = Anchor.Centre, Origin = Anchor.Centre, - RelativeSizeAxes = Axes.Both, - FillMode = FillMode.Fit, - FillAspectRatio = 4f / 3, - Child = content = new ScalingContainer { RelativeSizeAxes = Axes.Both, } + RelativeSizeAxes = Axes.X, + Height = base_game_height, + Masking = true, + Child = new Container + { + Name = "Playable area", + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + // playfields in stable are positioned vertically at three fourths the difference between the playfield height and the window height in stable. + Y = base_game_height * ((1 - playfield_size_adjust) / 4 * 3), + Size = new Vector2(base_game_width, base_game_height) * playfield_size_adjust, + Child = content = new ScalingContainer { RelativeSizeAxes = Axes.Both } + }, }; } From 9b17020707a5dd53e45211fd0e5de9a682abf16e Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 01:03:21 +0300 Subject: [PATCH 562/651] Adjust "Floating Fruits" in line with layout changes --- osu.Game.Rulesets.Catch/Mods/CatchModFloatingFruits.cs | 1 - .../UI/CatchPlayfieldAdjustmentContainer.cs | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Catch/Mods/CatchModFloatingFruits.cs b/osu.Game.Rulesets.Catch/Mods/CatchModFloatingFruits.cs index 9d88c90576..f933b9a28f 100644 --- a/osu.Game.Rulesets.Catch/Mods/CatchModFloatingFruits.cs +++ b/osu.Game.Rulesets.Catch/Mods/CatchModFloatingFruits.cs @@ -21,7 +21,6 @@ namespace osu.Game.Rulesets.Catch.Mods public void ApplyToDrawableRuleset(DrawableRuleset drawableRuleset) { drawableRuleset.PlayfieldAdjustmentContainer.Scale = new Vector2(1, -1); - drawableRuleset.PlayfieldAdjustmentContainer.Y = 1 - drawableRuleset.PlayfieldAdjustmentContainer.Y; } } } diff --git a/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs index 1bddd06d87..64d17b08b6 100644 --- a/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs @@ -20,6 +20,9 @@ namespace osu.Game.Rulesets.Catch.UI const float base_game_width = 1024f; const float base_game_height = 768f; + Anchor = Anchor.Centre; + Origin = Anchor.Centre; + InternalChild = new Container { // This container limits vertical visibility of the playfield to ensure fairness between wide and tall resolutions (i.e. tall resolutions should not see more fruits). From a96a66bc9e071f0b8bc2771f194965a23cc62d95 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 02:04:19 +0300 Subject: [PATCH 563/651] Add failing test case --- .../Navigation/TestSceneScreenNavigation.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs index f59fbc75ac..8ff4fd5ecf 100644 --- a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs +++ b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs @@ -986,6 +986,29 @@ namespace osu.Game.Tests.Visual.Navigation } } + [Test] + public void TestPresentBeatmapAfterDeletion() + { + BeatmapSetInfo beatmap = null; + + Screens.Select.SongSelect songSelect = null; + PushAndConfirm(() => songSelect = new TestPlaySongSelect()); + AddUntilStep("wait for song select", () => songSelect.BeatmapSetsLoaded); + + AddStep("import beatmap", () => BeatmapImportHelper.LoadQuickOszIntoOsu(Game).WaitSafely()); + AddUntilStep("wait for selected", () => !Game.Beatmap.IsDefault); + + AddStep("delete selected beatmap", () => + { + beatmap = Game.Beatmap.Value.BeatmapSetInfo; + Game.BeatmapManager.Delete(Game.Beatmap.Value.BeatmapSetInfo); + }); + + AddUntilStep("nothing selected", () => Game.Beatmap.IsDefault); + AddStep("present deleted beatmap", () => Game.PresentBeatmap(beatmap)); + AddAssert("still nothing selected", () => Game.Beatmap.IsDefault); + } + private Func playToResults() { var player = playToCompletion(); From 35649d137ca9fea993c473b7b08d26f53ba13441 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 01:59:45 +0300 Subject: [PATCH 564/651] Ignore soft-deleted beatmaps when trying to present from notification --- osu.Game/OsuGame.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index c244708385..11798c22ff 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -630,6 +630,12 @@ namespace osu.Game var detachedSet = databasedSet.PerformRead(s => s.Detach()); + if (detachedSet.DeletePending) + { + Logger.Log("The requested beatmap has since been deleted.", LoggingTarget.Information); + return; + } + PerformFromScreen(screen => { // Find beatmaps that match our predicate. From 5267e0abf788da62e6eaaa1fed1ac35be0fcb428 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 03:38:49 +0300 Subject: [PATCH 565/651] Move comment author line to separate component --- .../Overlays/Comments/CommentAuthorLine.cs | 135 ++++++++++++++++++ osu.Game/Overlays/Comments/DrawableComment.cs | 102 +------------ 2 files changed, 139 insertions(+), 98 deletions(-) create mode 100644 osu.Game/Overlays/Comments/CommentAuthorLine.cs diff --git a/osu.Game/Overlays/Comments/CommentAuthorLine.cs b/osu.Game/Overlays/Comments/CommentAuthorLine.cs new file mode 100644 index 0000000000..b6b5dc00e1 --- /dev/null +++ b/osu.Game/Overlays/Comments/CommentAuthorLine.cs @@ -0,0 +1,135 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using System.Linq; +using osu.Framework.Allocation; +using osu.Framework.Extensions.ObjectExtensions; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; +using osu.Game.Graphics; +using osu.Game.Graphics.Containers; +using osu.Game.Graphics.Sprites; +using osu.Game.Online.API.Requests.Responses; +using osu.Game.Resources.Localisation.Web; +using osuTK; + +namespace osu.Game.Overlays.Comments +{ + public partial class CommentAuthorLine : FillFlowContainer + { + private readonly Comment comment; + + private OsuSpriteText deletedLabel = null!; + + public CommentAuthorLine(Comment comment) + { + this.comment = comment; + } + + [BackgroundDependencyLoader] + private void load() + { + AutoSizeAxes = Axes.Both; + Direction = FillDirection.Horizontal; + Spacing = new Vector2(4, 0); + + Add(new LinkFlowContainer(s => s.Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold)) + { + AutoSizeAxes = Axes.Both + }.With(username => + { + if (comment.UserId.HasValue) + username.AddUserLink(comment.User); + else + username.AddText(comment.LegacyName!); + })); + + if (comment.Pinned) + Add(new PinnedCommentNotice()); + + Add(new ParentUsername(comment)); + + Add(deletedLabel = new OsuSpriteText + { + Alpha = 0f, + Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold), + Text = CommentsStrings.Deleted + }); + } + + public void MarkDeleted() + { + deletedLabel.Show(); + } + + private partial class PinnedCommentNotice : FillFlowContainer + { + public PinnedCommentNotice() + { + AutoSizeAxes = Axes.Both; + Direction = FillDirection.Horizontal; + Spacing = new Vector2(2, 0); + Children = new Drawable[] + { + new SpriteIcon + { + Icon = FontAwesome.Solid.Thumbtack, + Size = new Vector2(14), + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + }, + new OsuSpriteText + { + Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold), + Text = CommentsStrings.Pinned, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + } + }; + } + } + + private partial class ParentUsername : FillFlowContainer, IHasTooltip + { + public LocalisableString TooltipText => getParentMessage(); + + private readonly Comment? parentComment; + + public ParentUsername(Comment comment) + { + parentComment = comment.ParentComment; + + AutoSizeAxes = Axes.Both; + Direction = FillDirection.Horizontal; + Spacing = new Vector2(3, 0); + Alpha = comment.ParentId == null ? 0 : 1; + Children = new Drawable[] + { + new SpriteIcon + { + Icon = FontAwesome.Solid.Reply, + Size = new Vector2(14), + }, + new OsuSpriteText + { + Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold, italics: true), + Text = parentComment?.User?.Username ?? parentComment?.LegacyName! + } + }; + } + + private LocalisableString getParentMessage() + { + if (parentComment == null) + return string.Empty; + + return parentComment.HasMessage ? parentComment.Message : parentComment.IsDeleted ? CommentsStrings.Deleted : string.Empty; + } + } + } +} diff --git a/osu.Game/Overlays/Comments/DrawableComment.cs b/osu.Game/Overlays/Comments/DrawableComment.cs index ceae17aa5d..70b1809c3e 100644 --- a/osu.Game/Overlays/Comments/DrawableComment.cs +++ b/osu.Game/Overlays/Comments/DrawableComment.cs @@ -4,12 +4,10 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics; using osu.Game.Graphics; -using osu.Framework.Graphics.Sprites; using osuTK; using osu.Game.Online.API.Requests.Responses; using osu.Game.Users.Drawables; using osu.Game.Graphics.Containers; -using osu.Framework.Graphics.Cursor; using osu.Framework.Bindables; using System.Linq; using osu.Game.Graphics.Sprites; @@ -21,7 +19,6 @@ using osu.Framework.Extensions.IEnumerableExtensions; using System.Collections.Specialized; using System.Diagnostics; using osu.Framework.Extensions.LocalisationExtensions; -using osu.Framework.Localisation; using osu.Framework.Logging; using osu.Framework.Platform; using osu.Game.Graphics.UserInterface; @@ -72,7 +69,7 @@ namespace osu.Game.Overlays.Comments private LinkFlowContainer actionsContainer = null!; private LoadingSpinner actionsLoading = null!; private DeletedCommentsCounter deletedCommentsCounter = null!; - private OsuSpriteText deletedLabel = null!; + private CommentAuthorLine author = null!; private GridContainer content = null!; private VotePill votePill = null!; private Container replyEditorContainer = null!; @@ -98,7 +95,6 @@ namespace osu.Game.Overlays.Comments [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider, DrawableComment? parentComment) { - LinkFlowContainer username; FillFlowContainer info; CommentMarkdownContainer message; @@ -174,27 +170,7 @@ namespace osu.Game.Overlays.Comments }, Children = new Drawable[] { - new FillFlowContainer - { - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Horizontal, - Spacing = new Vector2(10, 0), - Children = new[] - { - username = new LinkFlowContainer(s => s.Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold)) - { - AutoSizeAxes = Axes.Both - }, - Comment.Pinned ? new PinnedCommentNotice() : Empty(), - new ParentUsername(Comment), - deletedLabel = new OsuSpriteText - { - Alpha = 0f, - Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold), - Text = CommentsStrings.Deleted - } - } - }, + author = new CommentAuthorLine(Comment), message = new CommentMarkdownContainer { RelativeSizeAxes = Axes.X, @@ -218,7 +194,7 @@ namespace osu.Game.Overlays.Comments { new DrawableDate(Comment.CreatedAt, 12, false) { - Colour = colourProvider.Foreground1 + Colour = colourProvider.Foreground1, } } }, @@ -311,11 +287,6 @@ namespace osu.Game.Overlays.Comments } }; - if (Comment.UserId.HasValue) - username.AddUserLink(Comment.User); - else - username.AddText(Comment.LegacyName!); - if (Comment.EditedAt.HasValue && Comment.EditedUser != null) { var font = OsuFont.GetFont(size: 12, weight: FontWeight.Regular); @@ -400,7 +371,7 @@ namespace osu.Game.Overlays.Comments /// private void makeDeleted() { - deletedLabel.Show(); + author.MarkDeleted(); content.FadeColour(OsuColour.Gray(0.5f)); votePill.Hide(); actionsContainer.Expire(); @@ -547,70 +518,5 @@ namespace osu.Game.Overlays.Comments Top = 10 }; } - - private partial class PinnedCommentNotice : FillFlowContainer - { - public PinnedCommentNotice() - { - AutoSizeAxes = Axes.Both; - Direction = FillDirection.Horizontal; - Spacing = new Vector2(2, 0); - Children = new Drawable[] - { - new SpriteIcon - { - Icon = FontAwesome.Solid.Thumbtack, - Size = new Vector2(14), - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - }, - new OsuSpriteText - { - Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold), - Text = CommentsStrings.Pinned, - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - } - }; - } - } - - private partial class ParentUsername : FillFlowContainer, IHasTooltip - { - public LocalisableString TooltipText => getParentMessage(); - - private readonly Comment? parentComment; - - public ParentUsername(Comment comment) - { - parentComment = comment.ParentComment; - - AutoSizeAxes = Axes.Both; - Direction = FillDirection.Horizontal; - Spacing = new Vector2(3, 0); - Alpha = comment.ParentId == null ? 0 : 1; - Children = new Drawable[] - { - new SpriteIcon - { - Icon = FontAwesome.Solid.Reply, - Size = new Vector2(14), - }, - new OsuSpriteText - { - Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold, italics: true), - Text = parentComment?.User?.Username ?? parentComment?.LegacyName! - } - }; - } - - private LocalisableString getParentMessage() - { - if (parentComment == null) - return string.Empty; - - return parentComment.HasMessage ? parentComment.Message : parentComment.IsDeleted ? CommentsStrings.Deleted : string.Empty; - } - } } } From c4e358044a5f0478119c39309dd7525483847413 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 03:44:32 +0300 Subject: [PATCH 566/651] Add API models for comment page metadata --- .../API/Requests/Responses/CommentBundle.cs | 3 ++ .../API/Requests/Responses/CommentableMeta.cs | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 osu.Game/Online/API/Requests/Responses/CommentableMeta.cs diff --git a/osu.Game/Online/API/Requests/Responses/CommentBundle.cs b/osu.Game/Online/API/Requests/Responses/CommentBundle.cs index ae8b850723..cbff8bf76c 100644 --- a/osu.Game/Online/API/Requests/Responses/CommentBundle.cs +++ b/osu.Game/Online/API/Requests/Responses/CommentBundle.cs @@ -11,6 +11,9 @@ namespace osu.Game.Online.API.Requests.Responses { public class CommentBundle { + [JsonProperty(@"commentable_meta")] + public List CommentableMeta { get; set; } = new List(); + [JsonProperty(@"comments")] public List Comments { get; set; } diff --git a/osu.Game/Online/API/Requests/Responses/CommentableMeta.cs b/osu.Game/Online/API/Requests/Responses/CommentableMeta.cs new file mode 100644 index 0000000000..1084f1c900 --- /dev/null +++ b/osu.Game/Online/API/Requests/Responses/CommentableMeta.cs @@ -0,0 +1,28 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Newtonsoft.Json; + +namespace osu.Game.Online.API.Requests.Responses +{ + public class CommentableMeta + { + [JsonProperty("id")] + public long Id { get; set; } + + [JsonProperty("owner_id")] + public long? OwnerId { get; set; } + + [JsonProperty("owner_title")] + public string? OwnerTitle { get; set; } + + [JsonProperty("title")] + public string Title { get; set; } = string.Empty; + + [JsonProperty("type")] + public string Type { get; set; } = string.Empty; + + [JsonProperty("url")] + public string Url { get; set; } = string.Empty; + } +} From 72c6134dbff17ba8a7a2ee82a741a61412bdfa1d Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 03:46:19 +0300 Subject: [PATCH 567/651] Include commentable object metadata in comments --- osu.Game/Overlays/Comments/CommentsContainer.cs | 8 ++++---- osu.Game/Overlays/Comments/DrawableComment.cs | 4 +++- osu.Game/Overlays/Comments/ReplyCommentEditor.cs | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/osu.Game/Overlays/Comments/CommentsContainer.cs b/osu.Game/Overlays/Comments/CommentsContainer.cs index b4e9a80ff1..2e5f13aa99 100644 --- a/osu.Game/Overlays/Comments/CommentsContainer.cs +++ b/osu.Game/Overlays/Comments/CommentsContainer.cs @@ -301,7 +301,7 @@ namespace osu.Game.Overlays.Comments void addNewComment(Comment comment) { - var drawableComment = GetDrawableComment(comment); + var drawableComment = GetDrawableComment(comment, bundle.CommentableMeta); if (comment.ParentId == null) { @@ -333,7 +333,7 @@ namespace osu.Game.Overlays.Comments if (CommentDictionary.ContainsKey(comment.Id)) continue; - topLevelComments.Add(GetDrawableComment(comment)); + topLevelComments.Add(GetDrawableComment(comment, bundle.CommentableMeta)); } if (topLevelComments.Any()) @@ -351,12 +351,12 @@ namespace osu.Game.Overlays.Comments } } - public DrawableComment GetDrawableComment(Comment comment) + public DrawableComment GetDrawableComment(Comment comment, IReadOnlyList meta) { if (CommentDictionary.TryGetValue(comment.Id, out var existing)) return existing; - return CommentDictionary[comment.Id] = new DrawableComment(comment) + return CommentDictionary[comment.Id] = new DrawableComment(comment, meta) { ShowDeleted = { BindTarget = ShowDeleted }, Sort = { BindTarget = Sort }, diff --git a/osu.Game/Overlays/Comments/DrawableComment.cs b/osu.Game/Overlays/Comments/DrawableComment.cs index 70b1809c3e..afb8bdcc8b 100644 --- a/osu.Game/Overlays/Comments/DrawableComment.cs +++ b/osu.Game/Overlays/Comments/DrawableComment.cs @@ -39,6 +39,7 @@ namespace osu.Game.Overlays.Comments public Action RepliesRequested = null!; public readonly Comment Comment; + public readonly IReadOnlyList Meta; public readonly BindableBool ShowDeleted = new BindableBool(); public readonly Bindable Sort = new Bindable(); @@ -87,9 +88,10 @@ namespace osu.Game.Overlays.Comments [Resolved] private OnScreenDisplay? onScreenDisplay { get; set; } - public DrawableComment(Comment comment) + public DrawableComment(Comment comment, IReadOnlyList meta) { Comment = comment; + Meta = meta; } [BackgroundDependencyLoader] diff --git a/osu.Game/Overlays/Comments/ReplyCommentEditor.cs b/osu.Game/Overlays/Comments/ReplyCommentEditor.cs index dd4c35ef20..8e9e82507d 100644 --- a/osu.Game/Overlays/Comments/ReplyCommentEditor.cs +++ b/osu.Game/Overlays/Comments/ReplyCommentEditor.cs @@ -60,7 +60,7 @@ namespace osu.Game.Overlays.Comments foreach (var comment in cb.Comments) comment.ParentComment = parentComment; - var drawables = cb.Comments.Select(commentsContainer.GetDrawableComment).ToArray(); + var drawables = cb.Comments.Select(c => commentsContainer.GetDrawableComment(c, cb.CommentableMeta)).ToArray(); OnPost?.Invoke(drawables); OnCancel!.Invoke(); From 4d3b605e04d73ff69031d2d4c97ddcd937cb043f Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 03:48:45 +0300 Subject: [PATCH 568/651] Add support for displaying "mapper" badges in comments --- .../Overlays/Comments/CommentAuthorLine.cs | 49 ++++++++++++++++++- osu.Game/Overlays/Comments/DrawableComment.cs | 2 +- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Comments/CommentAuthorLine.cs b/osu.Game/Overlays/Comments/CommentAuthorLine.cs index b6b5dc00e1..c269ab4c01 100644 --- a/osu.Game/Overlays/Comments/CommentAuthorLine.cs +++ b/osu.Game/Overlays/Comments/CommentAuthorLine.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; -using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; @@ -23,12 +22,14 @@ namespace osu.Game.Overlays.Comments public partial class CommentAuthorLine : FillFlowContainer { private readonly Comment comment; + private readonly IReadOnlyList meta; private OsuSpriteText deletedLabel = null!; - public CommentAuthorLine(Comment comment) + public CommentAuthorLine(Comment comment, IReadOnlyList meta) { this.comment = comment; + this.meta = meta; } [BackgroundDependencyLoader] @@ -49,6 +50,17 @@ namespace osu.Game.Overlays.Comments username.AddText(comment.LegacyName!); })); + var ownerMeta = meta.FirstOrDefault(m => m.Id == comment.CommentableId && m.Type == comment.CommentableType); + + if (ownerMeta?.OwnerId != null && ownerMeta.OwnerId == comment.UserId) + { + Add(new OwnerTitleBadge(ownerMeta.OwnerTitle ?? string.Empty) + { + // add top space to align with username + Margin = new MarginPadding { Top = 2f }, + }); + } + if (comment.Pinned) Add(new PinnedCommentNotice()); @@ -67,6 +79,39 @@ namespace osu.Game.Overlays.Comments deletedLabel.Show(); } + private partial class OwnerTitleBadge : CircularContainer + { + private readonly string title; + + public OwnerTitleBadge(string title) + { + this.title = title; + } + + [BackgroundDependencyLoader] + private void load(OverlayColourProvider colourProvider) + { + AutoSizeAxes = Axes.Both; + Masking = true; + + InternalChildren = new Drawable[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + Colour = colourProvider.Light1, + }, + new OsuSpriteText + { + Text = title, + Font = OsuFont.Default.With(size: 10, weight: FontWeight.Bold), + Margin = new MarginPadding { Vertical = 2, Horizontal = 5 }, + Colour = colourProvider.Background6, + }, + }; + } + } + private partial class PinnedCommentNotice : FillFlowContainer { public PinnedCommentNotice() diff --git a/osu.Game/Overlays/Comments/DrawableComment.cs b/osu.Game/Overlays/Comments/DrawableComment.cs index afb8bdcc8b..afd4b96c68 100644 --- a/osu.Game/Overlays/Comments/DrawableComment.cs +++ b/osu.Game/Overlays/Comments/DrawableComment.cs @@ -172,7 +172,7 @@ namespace osu.Game.Overlays.Comments }, Children = new Drawable[] { - author = new CommentAuthorLine(Comment), + author = new CommentAuthorLine(Comment, Meta), message = new CommentMarkdownContainer { RelativeSizeAxes = Axes.X, From c24af5bfeb65ea125ebdd1c37e8c3e0a296ef78e Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 03:49:29 +0300 Subject: [PATCH 569/651] Add test coverage --- .../Online/TestSceneCommentsContainer.cs | 41 ++++++++- .../Visual/Online/TestSceneDrawableComment.cs | 88 ++++++++++--------- .../UserInterface/ThemeComparisonTestScene.cs | 30 ++++--- 3 files changed, 103 insertions(+), 56 deletions(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs b/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs index 3d8781d902..fd3552f675 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs @@ -170,6 +170,24 @@ namespace osu.Game.Tests.Visual.Online }); } + [Test] + public void TestPostAsOwner() + { + setUpCommentsResponse(getExampleComments()); + AddStep("show comments", () => commentsContainer.ShowComments(CommentableType.Beatmapset, 123)); + + setUpPostResponse(true); + AddStep("enter text", () => editorTextBox.Current.Value = "comm"); + AddStep("submit", () => commentsContainer.ChildrenOfType().Single().ChildrenOfType().First().TriggerClick()); + + AddUntilStep("comment sent", () => + { + string writtenText = editorTextBox.Current.Value; + var comment = commentsContainer.ChildrenOfType().LastOrDefault(); + return comment != null && comment.ChildrenOfType().Any(y => y.Text == writtenText) && comment.ChildrenOfType().Any(y => y.Text == "MAPPER"); + }); + } + private void setUpCommentsResponse(CommentBundle commentBundle) => AddStep("set up response", () => { @@ -183,7 +201,7 @@ namespace osu.Game.Tests.Visual.Online }; }); - private void setUpPostResponse() + private void setUpPostResponse(bool asOwner = false) => AddStep("set up response", () => { dummyAPI.HandleRequest = request => @@ -191,7 +209,7 @@ namespace osu.Game.Tests.Visual.Online if (!(request is CommentPostRequest req)) return false; - req.TriggerSuccess(new CommentBundle + var bundle = new CommentBundle { Comments = new List { @@ -202,9 +220,26 @@ namespace osu.Game.Tests.Visual.Online LegacyName = "FirstUser", CreatedAt = DateTimeOffset.Now, VotesCount = 98, + CommentableId = 2001, + CommentableType = "test", } } - }); + }; + + if (asOwner) + { + bundle.Comments[0].UserId = 1001; + bundle.Comments[0].User = new APIUser { Id = 1001, Username = "FirstUser" }; + bundle.CommentableMeta.Add(new CommentableMeta + { + Id = 2001, + OwnerId = 1001, + OwnerTitle = "MAPPER", + Type = "test", + }); + } + + req.TriggerSuccess(bundle); return true; }; }); diff --git a/osu.Game.Tests/Visual/Online/TestSceneDrawableComment.cs b/osu.Game.Tests/Visual/Online/TestSceneDrawableComment.cs index 5e83dd4fb3..6f09e4c1f6 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneDrawableComment.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneDrawableComment.cs @@ -4,62 +4,66 @@ #nullable disable using System; -using NUnit.Framework; -using osu.Framework.Allocation; +using System.Linq; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Shapes; +using osu.Game.Graphics.Containers; using osu.Game.Online.API.Requests.Responses; -using osu.Game.Overlays; using osu.Game.Overlays.Comments; +using osu.Game.Tests.Visual.UserInterface; namespace osu.Game.Tests.Visual.Online { - public partial class TestSceneDrawableComment : OsuTestScene + public partial class TestSceneDrawableComment : ThemeComparisonTestScene { - [Cached] - private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple); - - private Container container; - - [SetUp] - public void SetUp() => Schedule(() => + public TestSceneDrawableComment() + : base(false) { - Children = new Drawable[] - { - new Box - { - RelativeSizeAxes = Axes.Both, - Colour = colourProvider.Background4, - }, - container = new Container - { - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - }, - }; - }); - - [TestCaseSource(nameof(comments))] - public void TestComment(string description, string text) - { - AddStep(description, () => - { - comment.Pinned = description == "Pinned"; - comment.Message = text; - container.Add(new DrawableComment(comment)); - }); } - private static readonly Comment comment = new Comment + protected override Drawable CreateContent() => new OsuScrollContainer(Direction.Vertical) { - Id = 1, - LegacyName = "Test User", - CreatedAt = DateTimeOffset.Now, - VotesCount = 0, + RelativeSizeAxes = Axes.Both, + Child = new FillFlowContainer + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Direction = FillDirection.Vertical, + ChildrenEnumerable = comments.Select(info => + { + var comment = new Comment + { + Id = 1, + UserId = 1000, + User = new APIUser { Id = 1000, Username = "Someone" }, + CreatedAt = DateTimeOffset.Now, + VotesCount = 0, + Pinned = info[0] == "Pinned", + Message = info[1], + CommentableId = 2001, + CommentableType = "test" + }; + + return new[] + { + new DrawableComment(comment, Array.Empty()), + new DrawableComment(comment, new[] + { + new CommentableMeta + { + Id = 2001, + OwnerId = comment.UserId, + OwnerTitle = "MAPPER", + Type = "test", + }, + new CommentableMeta { Title = "Other Meta" }, + }), + }; + }).SelectMany(c => c) + } }; - private static object[] comments = + private static readonly string[][] comments = { new[] { "Plain", "This is plain comment" }, new[] { "Pinned", "This is pinned comment" }, diff --git a/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs b/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs index 2c894eacab..f0c4b5543f 100644 --- a/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs +++ b/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs @@ -14,31 +14,39 @@ namespace osu.Game.Tests.Visual.UserInterface { public abstract partial class ThemeComparisonTestScene : OsuGridTestScene { - protected ThemeComparisonTestScene() - : base(1, 2) + private readonly bool showNoColourProvider; + + protected ThemeComparisonTestScene(bool showNoColourProvider = true) + : base(1, showNoColourProvider ? 2 : 1) { + this.showNoColourProvider = showNoColourProvider; } [BackgroundDependencyLoader] private void load(OsuColour colours) { - Cell(0, 0).AddRange(new[] + if (showNoColourProvider) { - new Box + Cell(0, 0).AddRange(new[] { - RelativeSizeAxes = Axes.Both, - Colour = colours.GreySeaFoam - }, - CreateContent() - }); + new Box + { + RelativeSizeAxes = Axes.Both, + Colour = colours.GreySeaFoam + }, + CreateContent() + }); + } } protected void CreateThemedContent(OverlayColourScheme colourScheme) { var colourProvider = new OverlayColourProvider(colourScheme); - Cell(0, 1).Clear(); - Cell(0, 1).Add(new DependencyProvidingContainer + int col = showNoColourProvider ? 1 : 0; + + Cell(0, col).Clear(); + Cell(0, col).Add(new DependencyProvidingContainer { RelativeSizeAxes = Axes.Both, CachedDependencies = new (Type, object)[] From 02de9122d4466d2a30a915bbbc19e5f143fec824 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 14 Feb 2024 07:17:05 +0300 Subject: [PATCH 570/651] Remove behaviour of flipping catcher plate on direction change --- .../TestSceneCatchSkinConfiguration.cs | 111 ------------------ .../Skinning/CatchSkinConfiguration.cs | 13 -- .../Legacy/CatchLegacySkinTransformer.cs | 13 -- osu.Game.Rulesets.Catch/UI/Catcher.cs | 10 +- 4 files changed, 1 insertion(+), 146 deletions(-) delete mode 100644 osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs delete mode 100644 osu.Game.Rulesets.Catch/Skinning/CatchSkinConfiguration.cs diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs deleted file mode 100644 index e2fc31d869..0000000000 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchSkinConfiguration.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -#nullable disable - -using System.Linq; -using NUnit.Framework; -using osu.Framework.Bindables; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; -using osu.Framework.Testing; -using osu.Framework.Utils; -using osu.Game.Beatmaps; -using osu.Game.Beatmaps.ControlPoints; -using osu.Game.Rulesets.Catch.Judgements; -using osu.Game.Rulesets.Catch.Objects; -using osu.Game.Rulesets.Catch.Objects.Drawables; -using osu.Game.Rulesets.Catch.Skinning; -using osu.Game.Rulesets.Catch.UI; -using osu.Game.Skinning; -using osu.Game.Tests.Visual; -using Direction = osu.Game.Rulesets.Catch.UI.Direction; - -namespace osu.Game.Rulesets.Catch.Tests -{ - public partial class TestSceneCatchSkinConfiguration : OsuTestScene - { - private Catcher catcher; - - private readonly Container container; - - public TestSceneCatchSkinConfiguration() - { - Add(container = new Container { RelativeSizeAxes = Axes.Both }); - } - - [TestCase(false)] - [TestCase(true)] - public void TestCatcherPlateFlipping(bool flip) - { - AddStep("setup catcher", () => - { - var skin = new TestSkin { FlipCatcherPlate = flip }; - container.Child = new SkinProvidingContainer(skin) - { - Child = catcher = new Catcher(new DroppedObjectContainer()) - { - Anchor = Anchor.Centre - } - }; - }); - - Fruit fruit = new Fruit(); - - AddStep("catch fruit", () => catchFruit(fruit, 20)); - - float position = 0; - - AddStep("record fruit position", () => position = getCaughtObjectPosition(fruit)); - - AddStep("face left", () => catcher.VisualDirection = Direction.Left); - - if (flip) - AddAssert("fruit position changed", () => !Precision.AlmostEquals(getCaughtObjectPosition(fruit), position)); - else - AddAssert("fruit position unchanged", () => Precision.AlmostEquals(getCaughtObjectPosition(fruit), position)); - - AddStep("face right", () => catcher.VisualDirection = Direction.Right); - - AddAssert("fruit position restored", () => Precision.AlmostEquals(getCaughtObjectPosition(fruit), position)); - } - - private float getCaughtObjectPosition(Fruit fruit) - { - var caughtObject = catcher.ChildrenOfType().Single(c => c.HitObject == fruit); - return caughtObject.Parent!.ToSpaceOfOtherDrawable(caughtObject.Position, catcher).X; - } - - private void catchFruit(Fruit fruit, float x) - { - fruit.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty()); - var drawableFruit = new DrawableFruit(fruit) { X = x }; - var judgement = fruit.CreateJudgement(); - catcher.OnNewResult(drawableFruit, new CatchJudgementResult(fruit, judgement) - { - Type = judgement.MaxResult - }); - } - - private class TestSkin : TrianglesSkin - { - public bool FlipCatcherPlate { get; set; } - - public TestSkin() - : base(null!) - { - } - - public override IBindable GetConfig(TLookup lookup) - { - if (lookup is CatchSkinConfiguration config) - { - if (config == CatchSkinConfiguration.FlipCatcherPlate) - return SkinUtils.As(new Bindable(FlipCatcherPlate)); - } - - return base.GetConfig(lookup); - } - } - } -} diff --git a/osu.Game.Rulesets.Catch/Skinning/CatchSkinConfiguration.cs b/osu.Game.Rulesets.Catch/Skinning/CatchSkinConfiguration.cs deleted file mode 100644 index ea8d742b1a..0000000000 --- a/osu.Game.Rulesets.Catch/Skinning/CatchSkinConfiguration.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -namespace osu.Game.Rulesets.Catch.Skinning -{ - public enum CatchSkinConfiguration - { - /// - /// Whether the contents of the catcher plate should be visually flipped when the catcher direction is changed. - /// - FlipCatcherPlate - } -} diff --git a/osu.Game.Rulesets.Catch/Skinning/Legacy/CatchLegacySkinTransformer.cs b/osu.Game.Rulesets.Catch/Skinning/Legacy/CatchLegacySkinTransformer.cs index fb8af9bdb6..d1ef47cf17 100644 --- a/osu.Game.Rulesets.Catch/Skinning/Legacy/CatchLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Catch/Skinning/Legacy/CatchLegacySkinTransformer.cs @@ -122,19 +122,6 @@ namespace osu.Game.Rulesets.Catch.Skinning.Legacy result.Value = LegacyColourCompatibility.DisallowZeroAlpha(result.Value); return (IBindable)result; - - case CatchSkinConfiguration config: - switch (config) - { - case CatchSkinConfiguration.FlipCatcherPlate: - // Don't flip catcher plate contents if the catcher is provided by this legacy skin. - if (GetDrawableComponent(new CatchSkinComponentLookup(CatchSkinComponents.Catcher)) != null) - return (IBindable)new Bindable(); - - break; - } - - break; } return base.GetConfig(lookup); diff --git a/osu.Game.Rulesets.Catch/UI/Catcher.cs b/osu.Game.Rulesets.Catch/UI/Catcher.cs index 147850a9b7..dca01fc61a 100644 --- a/osu.Game.Rulesets.Catch/UI/Catcher.cs +++ b/osu.Game.Rulesets.Catch/UI/Catcher.cs @@ -112,11 +112,6 @@ namespace osu.Game.Rulesets.Catch.UI public Vector2 BodyScale => Scale * body.Scale; - /// - /// Whether the contents of the catcher plate should be visually flipped when the catcher direction is changed. - /// - private bool flipCatcherPlate; - /// /// Width of the area that can be used to attempt catches during gameplay. /// @@ -339,8 +334,6 @@ namespace osu.Game.Rulesets.Catch.UI skin.GetConfig(CatchSkinColour.HyperDash)?.Value ?? DEFAULT_HYPER_DASH_COLOUR; - flipCatcherPlate = skin.GetConfig(CatchSkinConfiguration.FlipCatcherPlate)?.Value ?? true; - runHyperDashStateTransition(HyperDashing); } @@ -352,8 +345,7 @@ namespace osu.Game.Rulesets.Catch.UI body.Scale = scaleFromDirection; // Inverse of catcher scale is applied here, as catcher gets scaled by circle size and so do the incoming fruit. - caughtObjectContainer.Scale = (1 / Scale.X) * (flipCatcherPlate ? scaleFromDirection : Vector2.One); - hitExplosionContainer.Scale = flipCatcherPlate ? scaleFromDirection : Vector2.One; + caughtObjectContainer.Scale = new Vector2(1 / Scale.X); // Correct overshooting. if ((hyperDashDirection > 0 && hyperDashTargetPosition < X) || From 2981ebe3d5725e4e26ad2d7b9ec22b9afe87fdf5 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Wed, 14 Feb 2024 17:13:44 +0900 Subject: [PATCH 571/651] Fix inspection --- .../Rulesets/TestSceneRulesetSkinProvidingContainer.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs b/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs index 11f3fe660d..981258e8d1 100644 --- a/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs +++ b/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs @@ -43,13 +43,13 @@ namespace osu.Game.Tests.Rulesets AddStep("setup provider", () => { - var rulesetSkinProvider = new RulesetSkinProvidingContainer(Ruleset.Value.CreateInstance(), Beatmap.Value.Beatmap, Beatmap.Value.Skin); - - rulesetSkinProvider.Add(requester = new SkinRequester()); - + requester = new SkinRequester(); requester.OnLoadAsync += () => textureOnLoad = requester.GetTexture("test-image"); - Child = rulesetSkinProvider; + Child = new RulesetSkinProvidingContainer(Ruleset.Value.CreateInstance(), Beatmap.Value.Beatmap, Beatmap.Value.Skin) + { + requester + }; }); AddAssert("requester got correct initial texture", () => textureOnLoad != null); From 6baa0999065adc10f3b61ee527fecc614f6fa1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 10:12:01 +0100 Subject: [PATCH 572/651] Fix broken delay --- .../Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index e3c1746e14..bec5170377 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -188,7 +188,7 @@ namespace osu.Game.Overlays.Toolbar titleText.FadeOut(250, Easing.OutQuint); deltaValue.FadeIn(250, Easing.OutQuint) .Then().Delay(1000) - .Then().OnComplete(_ => + .Then().Schedule(() => { mainValue.Current.Value = after; deltaValue.Current.SetDefault(); From 153024e61b52dc60f7dba39ffc8b131db743fbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 10:15:27 +0100 Subject: [PATCH 573/651] Increase transition durations slightly Maybe slightly better readability. Dunno. --- .../Toolbar/TransientUserStatisticsUpdateDisplay.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index bec5170377..9960dd4411 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -84,7 +84,7 @@ namespace osu.Game.Overlays.Toolbar if (update.After.PP != null) pp.Display(update.Before.PP ?? update.After.PP.Value, Math.Abs((update.After.PP - update.Before.PP) ?? 0M), update.After.PP.Value); - this.Delay(4000).FadeOut(500, Easing.OutQuint); + this.Delay(5000).FadeOut(500, Easing.OutQuint); }); } @@ -183,11 +183,11 @@ namespace osu.Game.Overlays.Toolbar titleText.Alpha = 1; deltaValue.Alpha = 0; - using (BeginDelayedSequence(1000)) + using (BeginDelayedSequence(1500)) { titleText.FadeOut(250, Easing.OutQuint); deltaValue.FadeIn(250, Easing.OutQuint) - .Then().Delay(1000) + .Then().Delay(1500) .Then().Schedule(() => { mainValue.Current.Value = after; From d189fa0f6907afbe9f8a83a10c6a712e793a9efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 11:53:41 +0100 Subject: [PATCH 574/651] Rename flag --- .../Visual/UserInterface/ThemeComparisonTestScene.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs b/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs index f0c4b5543f..3177695f44 100644 --- a/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs +++ b/osu.Game.Tests/Visual/UserInterface/ThemeComparisonTestScene.cs @@ -14,18 +14,18 @@ namespace osu.Game.Tests.Visual.UserInterface { public abstract partial class ThemeComparisonTestScene : OsuGridTestScene { - private readonly bool showNoColourProvider; + private readonly bool showWithoutColourProvider; - protected ThemeComparisonTestScene(bool showNoColourProvider = true) - : base(1, showNoColourProvider ? 2 : 1) + protected ThemeComparisonTestScene(bool showWithoutColourProvider = true) + : base(1, showWithoutColourProvider ? 2 : 1) { - this.showNoColourProvider = showNoColourProvider; + this.showWithoutColourProvider = showWithoutColourProvider; } [BackgroundDependencyLoader] private void load(OsuColour colours) { - if (showNoColourProvider) + if (showWithoutColourProvider) { Cell(0, 0).AddRange(new[] { @@ -43,7 +43,7 @@ namespace osu.Game.Tests.Visual.UserInterface { var colourProvider = new OverlayColourProvider(colourScheme); - int col = showNoColourProvider ? 1 : 0; + int col = showWithoutColourProvider ? 1 : 0; Cell(0, col).Clear(); Cell(0, col).Add(new DependencyProvidingContainer From 8312f92b4ea24a981b6916f5207aaaf747471546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 12:24:28 +0100 Subject: [PATCH 575/651] Use better value for alignment --- osu.Game/Overlays/Comments/CommentAuthorLine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Comments/CommentAuthorLine.cs b/osu.Game/Overlays/Comments/CommentAuthorLine.cs index c269ab4c01..1f6fef4df3 100644 --- a/osu.Game/Overlays/Comments/CommentAuthorLine.cs +++ b/osu.Game/Overlays/Comments/CommentAuthorLine.cs @@ -57,7 +57,7 @@ namespace osu.Game.Overlays.Comments Add(new OwnerTitleBadge(ownerMeta.OwnerTitle ?? string.Empty) { // add top space to align with username - Margin = new MarginPadding { Top = 2f }, + Margin = new MarginPadding { Top = 1f }, }); } From 68247fa022c0ba3cbab5fe3c92457e11fb48c4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 13:21:37 +0100 Subject: [PATCH 576/651] Fix typo in json property name Would cause the mapper badge to never actually be shown in the real world. --- osu.Game/Online/API/Requests/Responses/Comment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Online/API/Requests/Responses/Comment.cs b/osu.Game/Online/API/Requests/Responses/Comment.cs index 907632186c..e6a5559d1f 100644 --- a/osu.Game/Online/API/Requests/Responses/Comment.cs +++ b/osu.Game/Online/API/Requests/Responses/Comment.cs @@ -33,7 +33,7 @@ namespace osu.Game.Online.API.Requests.Responses [JsonProperty(@"votes_count")] public int VotesCount { get; set; } - [JsonProperty(@"commenatble_type")] + [JsonProperty(@"commentable_type")] public string CommentableType { get; set; } = null!; [JsonProperty(@"commentable_id")] From f0f37df67fea4f20cc117012457ffd2c9b3bfec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 15:27:17 +0100 Subject: [PATCH 577/651] Revert unnecessary change --- osu.Game/Screens/Select/FilterQueryParser.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 24580c9e96..5fb5859a3b 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -121,8 +121,7 @@ namespace osu.Game.Screens.Select value.EndsWith("ms", StringComparison.Ordinal) ? 1 : value.EndsWith('s') ? 1000 : value.EndsWith('m') ? 60000 : - value.EndsWith('h') ? 3600000 : - value.EndsWith('d') ? 86400000 : 1000; + value.EndsWith('h') ? 3600000 : 1000; private static bool tryParseFloatWithPoint(string value, out float result) => float.TryParse(value, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result); From d7dfc8b88aa5081a6765898a94097050c8441c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 15:55:57 +0100 Subject: [PATCH 578/651] Add failing test coverage for empty date filter not parsing --- osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index 81a73fc99f..814b26a231 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -488,7 +488,8 @@ namespace osu.Game.Tests.NonVisual.Filtering new object[] { "0:3:" }, new object[] { "\"three days\"" }, new object[] { "0.1y0.1M2d" }, - new object[] { "0.99y0.99M2d" } + new object[] { "0.99y0.99M2d" }, + new object[] { string.Empty } }; [Test] From c24328dda347f8cd2196267790e225bb3f038d6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 15:56:32 +0100 Subject: [PATCH 579/651] Abandon date filter if no meaningful time bound found during parsing --- osu.Game/Screens/Select/FilterQueryParser.cs | 23 +++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 5fb5859a3b..3612a84ff9 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -394,7 +394,8 @@ namespace osu.Game.Screens.Select if (match == null) return false; - DateTimeOffset dateTimeOffset = DateTimeOffset.Now; + DateTimeOffset? dateTimeOffset = null; + DateTimeOffset now = DateTimeOffset.Now; try { @@ -410,27 +411,27 @@ namespace osu.Game.Screens.Select switch (key) { case "seconds": - dateTimeOffset = dateTimeOffset.AddSeconds(-length); + dateTimeOffset = (dateTimeOffset ?? now).AddSeconds(-length); break; case "minutes": - dateTimeOffset = dateTimeOffset.AddMinutes(-length); + dateTimeOffset = (dateTimeOffset ?? now).AddMinutes(-length); break; case "hours": - dateTimeOffset = dateTimeOffset.AddHours(-length); + dateTimeOffset = (dateTimeOffset ?? now).AddHours(-length); break; case "days": - dateTimeOffset = dateTimeOffset.AddDays(-length); + dateTimeOffset = (dateTimeOffset ?? now).AddDays(-length); break; case "months": - dateTimeOffset = dateTimeOffset.AddMonths(-(int)length); + dateTimeOffset = (dateTimeOffset ?? now).AddMonths(-(int)length); break; case "years": - dateTimeOffset = dateTimeOffset.AddYears(-(int)length); + dateTimeOffset = (dateTimeOffset ?? now).AddYears(-(int)length); break; } } @@ -438,11 +439,13 @@ namespace osu.Game.Screens.Select } catch (ArgumentOutOfRangeException) { - dateTimeOffset = DateTimeOffset.MinValue; - dateTimeOffset = dateTimeOffset.AddMilliseconds(1); + dateTimeOffset = DateTimeOffset.MinValue.AddMilliseconds(1); } - return tryUpdateCriteriaRange(ref dateRange, reverseInequalityOperator(op), dateTimeOffset); + if (!dateTimeOffset.HasValue) + return false; + + return tryUpdateCriteriaRange(ref dateRange, reverseInequalityOperator(op), dateTimeOffset.Value); } // Function to reverse an Operator From a8ae0a032f67900b8466263ac3ceb5f1b79b95d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 15:58:38 +0100 Subject: [PATCH 580/651] Simplify parsing --- osu.Game/Screens/Select/FilterQueryParser.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 3612a84ff9..17af0ee8ba 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -403,9 +403,12 @@ namespace osu.Game.Screens.Select foreach (string key in keys) { - if (match[key].Success) + if (!match.TryGetValue(key, out var group) || !group.Success) + continue; + + if (group.Success) { - if (!tryParseDoubleWithPoint(match[key].Value, out double length)) + if (!tryParseDoubleWithPoint(group.Value, out double length)) return false; switch (key) From f1d69abdc8d56502b23beccf62827518275cdc90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 15:59:07 +0100 Subject: [PATCH 581/651] Rename test --- osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index 814b26a231..a5aac0a4ce 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -532,7 +532,7 @@ namespace osu.Game.Tests.NonVisual.Filtering } [Test] - public void TestOutofrangeDateQuery() + public void TestOutOfRangeDateQuery() { const string query = "played<10000y"; var filterCriteria = new FilterCriteria(); From 414066fd34f18db433fc4c3c2fc10f3624989924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 16:07:42 +0100 Subject: [PATCH 582/651] Inline problematic function (and rename things to make more sense) --- osu.Game/Screens/Select/FilterQueryParser.cs | 67 +++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 17af0ee8ba..278ca1ac5f 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -63,7 +63,7 @@ namespace osu.Game.Screens.Select case "played": case "lastplayed": - return tryUpdateDateRange(ref criteria.LastPlayed, op, value); + return tryUpdateDateAgoRange(ref criteria.LastPlayed, op, value); case "divisor": return TryUpdateCriteriaRange(ref criteria.BeatDivisor, op, value, tryParseInt); @@ -381,10 +381,42 @@ namespace osu.Game.Screens.Select return tryUpdateCriteriaRange(ref criteria.Length, op, totalLength, minScale / 2.0); } - private static bool tryUpdateDateRange(ref FilterCriteria.OptionalRange dateRange, Operator op, string val) + /// + /// This function is intended for parsing "days / months / years ago" type filters. + /// + private static bool tryUpdateDateAgoRange(ref FilterCriteria.OptionalRange dateRange, Operator op, string val) { - if (op == Operator.Equal) - return false; + switch (op) + { + case Operator.Equal: + // an equality filter is difficult to define for support here. + // if "3 months 2 days ago" means a single concrete time instant, such a filter is basically useless. + // if it means a range of 24 hours, then that is annoying to write and also comes with its own implications + // (does it mean "time instant 3 months 2 days ago, within 12 hours of tolerance either direction"? + // does it mean "the full calendar day, from midnight to midnight, 3 months 2 days ago"?) + // as such, for simplicity, just refuse to support this. + return false; + + // for the remaining operators, since the value provided to this function is an "ago" type value + // (as in, referring to some amount of time back), + // we'll want to flip the operator, such that `>5d` means "more than five days ago", as in "*before* five days ago", + // as intended by the user. + case Operator.Less: + op = Operator.Greater; + break; + + case Operator.LessOrEqual: + op = Operator.GreaterOrEqual; + break; + + case Operator.Greater: + op = Operator.Less; + break; + + case Operator.GreaterOrEqual: + op = Operator.LessOrEqual; + break; + } GroupCollection? match = null; @@ -448,32 +480,7 @@ namespace osu.Game.Screens.Select if (!dateTimeOffset.HasValue) return false; - return tryUpdateCriteriaRange(ref dateRange, reverseInequalityOperator(op), dateTimeOffset.Value); - } - - // Function to reverse an Operator - private static Operator reverseInequalityOperator(Operator ope) - { - switch (ope) - { - default: - throw new ArgumentOutOfRangeException(nameof(ope), $"Unsupported operator {ope}"); - - case Operator.Equal: - return Operator.Equal; - - case Operator.Greater: - return Operator.Less; - - case Operator.GreaterOrEqual: - return Operator.LessOrEqual; - - case Operator.Less: - return Operator.Greater; - - case Operator.LessOrEqual: - return Operator.GreaterOrEqual; - } + return tryUpdateCriteriaRange(ref dateRange, op, dateTimeOffset.Value); } } } From f7bea00564b7ac537b92a4eb9c4fe395bffb27d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 16:19:32 +0100 Subject: [PATCH 583/651] Improve test coverage --- .../Filtering/FilterQueryParserTest.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs index a5aac0a4ce..12d6060351 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterQueryParserTest.cs @@ -508,8 +508,11 @@ namespace osu.Game.Tests.NonVisual.Filtering const string query = "played>50"; var filterCriteria = new FilterCriteria(); FilterQueryParser.ApplyQueries(filterCriteria, query); - Assert.AreEqual(false, filterCriteria.LastPlayed.Max == null); - Assert.AreEqual(true, filterCriteria.LastPlayed.Min == null); + Assert.That(filterCriteria.LastPlayed.Max, Is.Not.Null); + Assert.That(filterCriteria.LastPlayed.Min, Is.Null); + // the parser internally references `DateTimeOffset.Now`, so to not make things too annoying for tests, just assume some tolerance + // (irrelevant in proportion to the actual filter proscribed). + Assert.That(filterCriteria.LastPlayed.Max, Is.EqualTo(DateTimeOffset.Now.AddDays(-50)).Within(TimeSpan.FromSeconds(5))); } [Test] @@ -518,8 +521,25 @@ namespace osu.Game.Tests.NonVisual.Filtering const string query = "played<50"; var filterCriteria = new FilterCriteria(); FilterQueryParser.ApplyQueries(filterCriteria, query); - Assert.AreEqual(true, filterCriteria.LastPlayed.Max == null); - Assert.AreEqual(false, filterCriteria.LastPlayed.Min == null); + Assert.That(filterCriteria.LastPlayed.Max, Is.Null); + Assert.That(filterCriteria.LastPlayed.Min, Is.Not.Null); + // the parser internally references `DateTimeOffset.Now`, so to not make things too annoying for tests, just assume some tolerance + // (irrelevant in proportion to the actual filter proscribed). + Assert.That(filterCriteria.LastPlayed.Min, Is.EqualTo(DateTimeOffset.Now.AddDays(-50)).Within(TimeSpan.FromSeconds(5))); + } + + [Test] + public void TestBothSidesDateQuery() + { + const string query = "played>3M played<1y6M"; + var filterCriteria = new FilterCriteria(); + FilterQueryParser.ApplyQueries(filterCriteria, query); + Assert.That(filterCriteria.LastPlayed.Min, Is.Not.Null); + Assert.That(filterCriteria.LastPlayed.Max, Is.Not.Null); + // the parser internally references `DateTimeOffset.Now`, so to not make things too annoying for tests, just assume some tolerance + // (irrelevant in proportion to the actual filter proscribed). + Assert.That(filterCriteria.LastPlayed.Min, Is.EqualTo(DateTimeOffset.Now.AddYears(-1).AddMonths(-6)).Within(TimeSpan.FromSeconds(5))); + Assert.That(filterCriteria.LastPlayed.Max, Is.EqualTo(DateTimeOffset.Now.AddMonths(-3)).Within(TimeSpan.FromSeconds(5))); } [Test] From ae9a2661ace43a96a4fbf26072ed3efd0dc0ba54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 16:20:47 +0100 Subject: [PATCH 584/651] Sprinkle some raw string prefixes --- osu.Game/Screens/Select/FilterQueryParser.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 278ca1ac5f..2c4077dacf 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -431,7 +431,7 @@ namespace osu.Game.Screens.Select try { - List keys = new List { "seconds", "minutes", "hours", "days", "months", "years" }; + List keys = new List { @"seconds", @"minutes", @"hours", @"days", @"months", @"years" }; foreach (string key in keys) { @@ -445,27 +445,27 @@ namespace osu.Game.Screens.Select switch (key) { - case "seconds": + case @"seconds": dateTimeOffset = (dateTimeOffset ?? now).AddSeconds(-length); break; - case "minutes": + case @"minutes": dateTimeOffset = (dateTimeOffset ?? now).AddMinutes(-length); break; - case "hours": + case @"hours": dateTimeOffset = (dateTimeOffset ?? now).AddHours(-length); break; - case "days": + case @"days": dateTimeOffset = (dateTimeOffset ?? now).AddDays(-length); break; - case "months": + case @"months": dateTimeOffset = (dateTimeOffset ?? now).AddMonths(-(int)length); break; - case "years": + case @"years": dateTimeOffset = (dateTimeOffset ?? now).AddYears(-(int)length); break; } From 53884f61c35a573273922ce3976af6b75c598a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 16:41:41 +0100 Subject: [PATCH 585/651] Apply suggested changes --- .../TransientUserStatisticsUpdateDisplay.cs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index 9960dd4411..52923ea178 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -127,7 +127,7 @@ namespace osu.Game.Overlays.Toolbar ValuePrefix = mainValuePrefix, Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - Font = OsuFont.GetFont(), + Font = OsuFont.GetFont().With(fixedWidth: true), }, new Container { @@ -140,7 +140,7 @@ namespace osu.Game.Overlays.Toolbar { Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - Font = OsuFont.GetFont(size: 12, fixedWidth: false, weight: FontWeight.SemiBold), + Font = OsuFont.GetFont(size: 12, fixedWidth: true, weight: FontWeight.SemiBold), AlwaysPresent = true, }, titleText = new OsuSpriteText @@ -183,11 +183,11 @@ namespace osu.Game.Overlays.Toolbar titleText.Alpha = 1; deltaValue.Alpha = 0; - using (BeginDelayedSequence(1500)) + using (BeginDelayedSequence(1200)) { - titleText.FadeOut(250, Easing.OutQuint); - deltaValue.FadeIn(250, Easing.OutQuint) - .Then().Delay(1500) + titleText.FadeOut(250, Easing.OutQuad); + deltaValue.FadeIn(250, Easing.OutQuad) + .Then().Delay(500) .Then().Schedule(() => { mainValue.Current.Value = after; @@ -200,9 +200,9 @@ namespace osu.Game.Overlays.Toolbar private partial class Counter : RollingCounter where T : struct, IEquatable, IFormattable { - public const double ROLLING_DURATION = 500; + public const double ROLLING_DURATION = 1500; - public FontUsage Font { get; init; } = OsuFont.Default; + public FontUsage Font { get; init; } = OsuFont.Default.With(fixedWidth: true); public string ValuePrefix { @@ -217,7 +217,13 @@ namespace osu.Game.Overlays.Toolbar private string valuePrefix = string.Empty; protected override LocalisableString FormatCount(T count) => LocalisableString.Format(@"{0}{1:N0}", ValuePrefix, count); - protected override OsuSpriteText CreateSpriteText() => base.CreateSpriteText().With(t => t.Font = Font); + + protected override OsuSpriteText CreateSpriteText() => base.CreateSpriteText().With(t => + { + t.Font = Font; + t.Spacing = new Vector2(-1.5f, 0); + }); + protected override double RollingDuration => ROLLING_DURATION; } } From aae431e8f6f414abe1155f005d33cf111493220d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 14 Feb 2024 16:48:31 +0100 Subject: [PATCH 586/651] Cancel rolling properly --- .../TransientUserStatisticsUpdateDisplay.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index 52923ea178..50fc54088f 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -9,6 +9,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; +using osu.Framework.Threading; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; @@ -98,6 +99,7 @@ namespace osu.Game.Overlays.Toolbar private Counter mainValue = null!; private Counter deltaValue = null!; private OsuSpriteText titleText = null!; + private ScheduledDelegate? valueUpdateSchedule; [Resolved] private OsuColour colours { get; set; } = null!; @@ -159,6 +161,9 @@ namespace osu.Game.Overlays.Toolbar public void Display(T before, T delta, T after) { + valueUpdateSchedule?.Cancel(); + valueUpdateSchedule = null; + int comparison = valueComparer.Compare(before, after); if (comparison > 0) @@ -186,13 +191,16 @@ namespace osu.Game.Overlays.Toolbar using (BeginDelayedSequence(1200)) { titleText.FadeOut(250, Easing.OutQuad); - deltaValue.FadeIn(250, Easing.OutQuad) - .Then().Delay(500) - .Then().Schedule(() => - { - mainValue.Current.Value = after; - deltaValue.Current.SetDefault(); - }); + deltaValue.FadeIn(250, Easing.OutQuad); + + using (BeginDelayedSequence(1250)) + { + valueUpdateSchedule = Schedule(() => + { + mainValue.Current.Value = after; + deltaValue.Current.SetDefault(); + }); + } } } } From c175e036007bf68e0ad131f7d01e31a6b5a7fea8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 15 Feb 2024 02:53:38 +0800 Subject: [PATCH 587/651] Inline rolling duration variable --- .../Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index 50fc54088f..b77a4cfb94 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -208,8 +208,6 @@ namespace osu.Game.Overlays.Toolbar private partial class Counter : RollingCounter where T : struct, IEquatable, IFormattable { - public const double ROLLING_DURATION = 1500; - public FontUsage Font { get; init; } = OsuFont.Default.With(fixedWidth: true); public string ValuePrefix @@ -232,7 +230,7 @@ namespace osu.Game.Overlays.Toolbar t.Spacing = new Vector2(-1.5f, 0); }); - protected override double RollingDuration => ROLLING_DURATION; + protected override double RollingDuration => 1500; } } } From 9ec79755fb2e2e467439f7086e7f720b607aef77 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 15 Feb 2024 02:54:28 +0800 Subject: [PATCH 588/651] Standardise font specs --- .../Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs index b77a4cfb94..f56a1a3dd2 100644 --- a/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs +++ b/osu.Game/Overlays/Toolbar/TransientUserStatisticsUpdateDisplay.cs @@ -129,7 +129,6 @@ namespace osu.Game.Overlays.Toolbar ValuePrefix = mainValuePrefix, Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - Font = OsuFont.GetFont().With(fixedWidth: true), }, new Container { @@ -142,7 +141,7 @@ namespace osu.Game.Overlays.Toolbar { Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - Font = OsuFont.GetFont(size: 12, fixedWidth: true, weight: FontWeight.SemiBold), + Font = OsuFont.Default.With(size: 12, fixedWidth: true, weight: FontWeight.SemiBold), AlwaysPresent = true, }, titleText = new OsuSpriteText From 6e1b4152c07a250426e7e89e632db21043dd31cd Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Thu, 15 Feb 2024 00:00:39 +0300 Subject: [PATCH 589/651] Redice allocations during aggregate beatmap sort --- .../Select/Carousel/CarouselBeatmapSet.cs | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs index 6d2e938fb7..d2b71b1d5e 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs @@ -127,12 +127,40 @@ namespace osu.Game.Screens.Select.Carousel /// /// All beatmaps which are not filtered and valid for display. /// - protected IEnumerable ValidBeatmaps => Beatmaps.Where(b => !b.Filtered.Value || b.State.Value == CarouselItemState.Selected).Select(b => b.BeatmapInfo); + protected IEnumerable ValidBeatmaps + { + get + { + foreach (var item in Items) // iterating over Items directly to not allocate 2 enumerators + { + if (item is CarouselBeatmap b && (!b.Filtered.Value || b.State.Value == CarouselItemState.Selected)) + yield return b.BeatmapInfo; + } + } + } + + /// + /// Whether there are available beatmaps which are not filtered and valid for display. + /// Cheaper alternative to .Any() + /// + public bool HasValidBeatmaps + { + get + { + foreach (var item in Items) // iterating over Items directly to not allocate 2 enumerators + { + if (item is CarouselBeatmap b && (!b.Filtered.Value || b.State.Value == CarouselItemState.Selected)) + return true; + } + + return false; + } + } private int compareUsingAggregateMax(CarouselBeatmapSet other, Func func) { - bool ourBeatmaps = ValidBeatmaps.Any(); - bool otherBeatmaps = other.ValidBeatmaps.Any(); + bool ourBeatmaps = HasValidBeatmaps; + bool otherBeatmaps = other.HasValidBeatmaps; if (!ourBeatmaps && !otherBeatmaps) return 0; if (!ourBeatmaps) return -1; From 80abf6aab346b2f5eed5745c81a521547bf81c26 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 15 Feb 2024 09:45:24 +0800 Subject: [PATCH 590/651] Avoid some further enumerator allocations --- osu.Game/Screens/Select/Carousel/CarouselGroup.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselGroup.cs b/osu.Game/Screens/Select/Carousel/CarouselGroup.cs index b2ca117cec..62d694976f 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselGroup.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselGroup.cs @@ -2,6 +2,8 @@ // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; +using osu.Framework.Extensions.ListExtensions; +using osu.Framework.Lists; namespace osu.Game.Screens.Select.Carousel { @@ -12,7 +14,7 @@ namespace osu.Game.Screens.Select.Carousel { public override DrawableCarouselItem? CreateDrawableRepresentation() => null; - public IReadOnlyList Items => items; + public SlimReadOnlyListWrapper Items => items.AsSlimReadOnly(); public int TotalItemsNotFiltered { get; private set; } From 674ee91bb5dd28d9f4f79a3f0c6d220274a8c3dd Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 15 Feb 2024 11:40:50 +0800 Subject: [PATCH 591/651] Define aggregate max delegates as static to further reduce allocations --- osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs index d2b71b1d5e..cee68cf9a5 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs @@ -91,19 +91,19 @@ namespace osu.Game.Screens.Select.Carousel break; case SortMode.LastPlayed: - comparison = -compareUsingAggregateMax(otherSet, b => (b.LastPlayed ?? DateTimeOffset.MinValue).ToUnixTimeSeconds()); + comparison = -compareUsingAggregateMax(otherSet, static b => (b.LastPlayed ?? DateTimeOffset.MinValue).ToUnixTimeSeconds()); break; case SortMode.BPM: - comparison = compareUsingAggregateMax(otherSet, b => b.BPM); + comparison = compareUsingAggregateMax(otherSet, static b => b.BPM); break; case SortMode.Length: - comparison = compareUsingAggregateMax(otherSet, b => b.Length); + comparison = compareUsingAggregateMax(otherSet, static b => b.Length); break; case SortMode.Difficulty: - comparison = compareUsingAggregateMax(otherSet, b => b.StarRating); + comparison = compareUsingAggregateMax(otherSet, static b => b.StarRating); break; case SortMode.DateSubmitted: From 0c25a9a460a23740ebfd6f8c8969f0661b1e2cf6 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 15 Feb 2024 07:31:01 +0300 Subject: [PATCH 592/651] Add extra bottom space for catcher to not look cut off on tall resolutions --- .../UI/CatchPlayfieldAdjustmentContainer.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs index 64d17b08b6..74dfa6c1fd 100644 --- a/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs +++ b/osu.Game.Rulesets.Catch/UI/CatchPlayfieldAdjustmentContainer.cs @@ -20,6 +20,9 @@ namespace osu.Game.Rulesets.Catch.UI const float base_game_width = 1024f; const float base_game_height = 768f; + // extra bottom space for the catcher to not get cut off at tall resolutions lower than 4:3 (e.g. 5:4). number chosen based on testing with maximum catcher scale (i.e. CS 0). + const float extra_bottom_space = 200f; + Anchor = Anchor.Centre; Origin = Anchor.Centre; @@ -31,7 +34,8 @@ namespace osu.Game.Rulesets.Catch.UI Anchor = Anchor.Centre, Origin = Anchor.Centre, RelativeSizeAxes = Axes.X, - Height = base_game_height, + Height = base_game_height + extra_bottom_space, + Y = extra_bottom_space / 2, Masking = true, Child = new Container { From 9e9297bfb3c06b816a8416cac44ad05f819e998a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 15 Feb 2024 13:22:03 +0800 Subject: [PATCH 593/651] Add inline documentation as to why classic mod is not ranked See https://github.com/ppy/osu/pull/27149#issuecomment-1939509941. --- osu.Game/Rulesets/Mods/ModClassic.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/osu.Game/Rulesets/Mods/ModClassic.cs b/osu.Game/Rulesets/Mods/ModClassic.cs index 16cb928bd4..b0f6ba9374 100644 --- a/osu.Game/Rulesets/Mods/ModClassic.cs +++ b/osu.Game/Rulesets/Mods/ModClassic.cs @@ -19,5 +19,16 @@ namespace osu.Game.Rulesets.Mods public override LocalisableString Description => "Feeling nostalgic?"; public override ModType Type => ModType.Conversion; + + /// + /// Classic mods are not to be ranked yet due to compatibility and multiplier concerns. + /// Right now classic mods are considered, for leaderboard purposes, to be equal as scores set on osu-stable. + /// But this is not the case. + /// + /// Some examples for things to resolve before even considering this: + /// - Hit windows differ (https://github.com/ppy/osu/issues/11311). + /// - Sliders always gives combo for slider end, even on miss (https://github.com/ppy/osu/issues/11769). + /// + public sealed override bool Ranked => false; } } From 401bd91dc4aefee2582055b798a471d240e17650 Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Wed, 14 Feb 2024 22:57:38 -0800 Subject: [PATCH 594/651] Add visual test showing overflow on dropdown menu items --- .../Visual/UserInterface/TestSceneOsuDropdown.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneOsuDropdown.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneOsuDropdown.cs index 1678890b73..63f7a2f2cc 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneOsuDropdown.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneOsuDropdown.cs @@ -9,7 +9,6 @@ using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; using osu.Framework.Input.States; using osu.Framework.Testing; -using osu.Game.Beatmaps; using osu.Game.Graphics.UserInterface; using osu.Game.Input.Bindings; @@ -18,13 +17,22 @@ namespace osu.Game.Tests.Visual.UserInterface public partial class TestSceneOsuDropdown : ThemeComparisonTestScene { protected override Drawable CreateContent() => - new OsuEnumDropdown + new OsuEnumDropdown { Anchor = Anchor.Centre, Origin = Anchor.TopCentre, Width = 150 }; + private enum TestEnum + { + [System.ComponentModel.Description("Option")] + Option, + + [System.ComponentModel.Description("Really lonnnnnnng option")] + ReallyLongOption, + } + [Test] // todo: this can be written much better if ThemeComparisonTestScene has a manual input manager public void TestBackAction() @@ -43,7 +51,7 @@ namespace osu.Game.Tests.Visual.UserInterface AddStep("press back", () => dropdown().OnPressed(new KeyBindingPressEvent(new InputState(), GlobalAction.Back))); AddAssert("closed", () => dropdown().ChildrenOfType().Single().State == MenuState.Closed); - OsuEnumDropdown dropdown() => this.ChildrenOfType>().First(); + OsuEnumDropdown dropdown() => this.ChildrenOfType>().First(); } } } From 3d08bc5605242c097531eae2945a89abe7f80955 Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Wed, 14 Feb 2024 23:00:30 -0800 Subject: [PATCH 595/651] Truncate long dropdown menu item text and show tooltip --- osu.Game/Graphics/UserInterface/OsuDropdown.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index 2dc701dc9d..38e90bf4ea 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -186,6 +186,8 @@ namespace osu.Game.Graphics.UserInterface : base(item) { Foreground.Padding = new MarginPadding(2); + Foreground.AutoSizeAxes = Axes.Y; + Foreground.RelativeSizeAxes = Axes.X; Masking = true; CornerRadius = corner_radius; @@ -247,11 +249,12 @@ namespace osu.Game.Graphics.UserInterface Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, }, - Label = new OsuSpriteText + Label = new TruncatingSpriteText { - X = 15, + Padding = new MarginPadding { Left = 15 }, Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, + RelativeSizeAxes = Axes.X, }, }; } From a037dbf8debe7bcecfa904d68c20875d3844236d Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Thu, 15 Feb 2024 18:33:48 +0900 Subject: [PATCH 596/651] Update test to set Child in more canonical manner --- .../Rulesets/TestSceneRulesetSkinProvidingContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs b/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs index 981258e8d1..b089144233 100644 --- a/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs +++ b/osu.Game.Tests/Rulesets/TestSceneRulesetSkinProvidingContainer.cs @@ -48,7 +48,7 @@ namespace osu.Game.Tests.Rulesets Child = new RulesetSkinProvidingContainer(Ruleset.Value.CreateInstance(), Beatmap.Value.Beatmap, Beatmap.Value.Skin) { - requester + Child = requester }; }); From 95e745c6fbabce01dda192e567546185bfe62e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 15 Feb 2024 10:16:06 +0100 Subject: [PATCH 597/651] Use better messaging for selected submission failure reasons These have been cropping up rather often lately, mostly courtesy of linux users, but not only: https://github.com/ppy/osu/issues/26840 https://github.com/ppy/osu/issues/27008 https://github.com/ppy/osu/discussions/26962 so this is a proposal for slightly improved messaging for such cases to hopefully get users on the right track. The original error is still logged to network log, so there's no information loss. --- osu.Game/Screens/Play/SubmittingPlayer.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs index c45d46e993..c759710aba 100644 --- a/osu.Game/Screens/Play/SubmittingPlayer.cs +++ b/osu.Game/Screens/Play/SubmittingPlayer.cs @@ -140,7 +140,13 @@ namespace osu.Game.Screens.Play { switch (exception.Message) { - case "expired token": + case @"missing token header": + case @"invalid client hash": + case @"invalid verification hash": + Logger.Log("You are not able to submit a score. Please ensure that you are using the latest version of the official game releases.", level: LogLevel.Important); + break; + + case @"expired token": Logger.Log("Score submission failed because your system clock is set incorrectly. Please check your system time, date and timezone.", level: LogLevel.Important); break; From 898d5ce88bd4d249f98b8fe7cc6dd5e7cdd635d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 15 Feb 2024 10:40:40 +0100 Subject: [PATCH 598/651] Show selected submission failure messages even in solo Previously, if a `SubmittingPlayer` instance deemed it okay to proceed with gameplay despite submission failure, it would silently log all errors and proceed, but the score would still not be submitted. This feels a bit anti-user in the cases wherein something is genuinely wrong with either the client or web, so things like token verification failures or API failures are now shown as notifications to give the user an indication that something went wrong at all. Selected cases (non-user-playable mod, logged out, beatmap is not online) are still logged silently because those are either known and expected, or someone is messing with things. --- osu.Game/Screens/Play/SoloPlayer.cs | 2 +- osu.Game/Screens/Play/SubmittingPlayer.cs | 33 ++++++++++++----------- osu.Game/Tests/Visual/TestPlayer.cs | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/osu.Game/Screens/Play/SoloPlayer.cs b/osu.Game/Screens/Play/SoloPlayer.cs index f7ae3eb62b..f4cf2da364 100644 --- a/osu.Game/Screens/Play/SoloPlayer.cs +++ b/osu.Game/Screens/Play/SoloPlayer.cs @@ -52,7 +52,7 @@ namespace osu.Game.Screens.Play Scores = { BindTarget = LeaderboardScores } }; - protected override bool HandleTokenRetrievalFailure(Exception exception) => false; + protected override bool ShouldExitOnTokenRetrievalFailure(Exception exception) => false; protected override Task ImportScore(Score score) { diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs index c759710aba..0873f60791 100644 --- a/osu.Game/Screens/Play/SubmittingPlayer.cs +++ b/osu.Game/Screens/Play/SubmittingPlayer.cs @@ -118,7 +118,7 @@ namespace osu.Game.Screens.Play token = r.ID; tcs.SetResult(true); }; - req.Failure += handleTokenFailure; + req.Failure += ex => handleTokenFailure(ex, displayNotification: true); api.Queue(req); @@ -128,14 +128,20 @@ namespace osu.Game.Screens.Play return true; - void handleTokenFailure(Exception exception) + void handleTokenFailure(Exception exception, bool displayNotification = false) { tcs.SetResult(false); - if (HandleTokenRetrievalFailure(exception)) + bool shouldExit = ShouldExitOnTokenRetrievalFailure(exception); + + if (displayNotification || shouldExit) { + string whatWillHappen = shouldExit + ? "You are not able to submit a score." + : "The following score will not be submitted."; + if (string.IsNullOrEmpty(exception.Message)) - Logger.Error(exception, "Failed to retrieve a score submission token."); + Logger.Error(exception, $"{whatWillHappen} Failed to retrieve a score submission token."); else { switch (exception.Message) @@ -143,31 +149,28 @@ namespace osu.Game.Screens.Play case @"missing token header": case @"invalid client hash": case @"invalid verification hash": - Logger.Log("You are not able to submit a score. Please ensure that you are using the latest version of the official game releases.", level: LogLevel.Important); + Logger.Log($"{whatWillHappen} Please ensure that you are using the latest version of the official game releases.", level: LogLevel.Important); break; case @"expired token": - Logger.Log("Score submission failed because your system clock is set incorrectly. Please check your system time, date and timezone.", level: LogLevel.Important); + Logger.Log($"{whatWillHappen} Your system clock is set incorrectly. Please check your system time, date and timezone.", level: LogLevel.Important); break; default: - Logger.Log($"You are not able to submit a score: {exception.Message}", level: LogLevel.Important); + Logger.Log($"{whatWillHappen} {exception.Message}", level: LogLevel.Important); break; } } + } + if (shouldExit) + { Schedule(() => { ValidForResume = false; this.Exit(); }); } - else - { - // Gameplay is allowed to continue, but we still should keep track of the error. - // In the future, this should be visible to the user in some way. - Logger.Log($"Score submission token retrieval failed ({exception.Message})"); - } } } @@ -176,7 +179,7 @@ namespace osu.Game.Screens.Play /// /// The error causing the failure. /// Whether gameplay should be immediately exited as a result. Returning false allows the gameplay session to continue. Defaults to true. - protected virtual bool HandleTokenRetrievalFailure(Exception exception) => true; + protected virtual bool ShouldExitOnTokenRetrievalFailure(Exception exception) => true; protected override async Task PrepareScoreForResultsAsync(Score score) { @@ -237,7 +240,7 @@ namespace osu.Game.Screens.Play /// /// Construct a request to be used for retrieval of the score token. - /// Can return null, at which point will be fired. + /// Can return null, at which point will be fired. /// [CanBeNull] protected abstract APIRequest CreateTokenRequest(); diff --git a/osu.Game/Tests/Visual/TestPlayer.cs b/osu.Game/Tests/Visual/TestPlayer.cs index d9cae6b03b..579a1934e0 100644 --- a/osu.Game/Tests/Visual/TestPlayer.cs +++ b/osu.Game/Tests/Visual/TestPlayer.cs @@ -61,7 +61,7 @@ namespace osu.Game.Tests.Visual PauseOnFocusLost = pauseOnFocusLost; } - protected override bool HandleTokenRetrievalFailure(Exception exception) => false; + protected override bool ShouldExitOnTokenRetrievalFailure(Exception exception) => false; protected override APIRequest CreateTokenRequest() { From e91d38872d99dc3904b3664331b94f097881a455 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 15 Feb 2024 18:28:59 +0800 Subject: [PATCH 599/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index d7f29beeb3..f61ff79b9f 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index a4cd26a372..506bebfd47 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From 755bc7c0507f3ad7b3c8e5b7ed5592ad78497b43 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Thu, 15 Feb 2024 20:07:55 +0900 Subject: [PATCH 600/651] Fix resolution scaling --- .../Mods/ManiaModHidden.cs | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs index 211f21513d..12f17c6c59 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs @@ -3,11 +3,14 @@ using System; using System.Linq; +using osu.Framework.Allocation; using osu.Framework.Localisation; using osu.Game.Rulesets.Mania.UI; using osu.Framework.Bindables; using osu.Framework.Graphics; +using osu.Game.Rulesets.Mania.Skinning; using osu.Game.Rulesets.Scoring; +using osu.Game.Skinning; namespace osu.Game.Rulesets.Mania.Mods { @@ -18,7 +21,7 @@ namespace osu.Game.Rulesets.Mania.Mods /// private const float reference_playfield_height = 768; - private const float min_coverage = 160 / reference_playfield_height; + private const float min_coverage = 160f / reference_playfield_height; private const float max_coverage = 400f / reference_playfield_height; private const float coverage_increase_per_combo = 0.5f / reference_playfield_height; @@ -49,17 +52,38 @@ namespace osu.Game.Rulesets.Mania.Mods private partial class LegacyPlayfieldCover : PlayfieldCoveringWrapper { + [Resolved] + private ISkinSource skin { get; set; } = null!; + + private IBindable? hitPosition; + public LegacyPlayfieldCover(Drawable content) : base(content) { } + protected override void LoadComplete() + { + base.LoadComplete(); + + skin.SourceChanged += onSkinChanged; + onSkinChanged(); + } + + private void onSkinChanged() + { + hitPosition = skin.GetManiaSkinConfig(LegacyManiaSkinConfigurationLookups.HitPosition); + } + protected override float GetHeight(float coverage) { - if (DrawHeight == 0) + // In osu!stable, the cover is applied in absolute (x768) coordinates from the hit position. + float availablePlayfieldHeight = Math.Abs(reference_playfield_height - (hitPosition?.Value ?? Stage.HIT_TARGET_POSITION)); + + if (availablePlayfieldHeight == 0) return base.GetHeight(coverage); - return base.GetHeight(coverage) * reference_playfield_height / DrawHeight; + return base.GetHeight(coverage) * reference_playfield_height / availablePlayfieldHeight; } } } From 9c22fa3a9fbae0fb568e5a7b36d4c688268add3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 15 Feb 2024 12:13:01 +0100 Subject: [PATCH 601/651] Fix android test project compile failures --- .../osu.Game.Tests.Android.csproj | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj b/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj index 889f0a3583..b02425eadd 100644 --- a/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj +++ b/osu.Game.Tests.Android/osu.Game.Tests.Android.csproj @@ -31,4 +31,22 @@ + + + + + XamarinJetbrainsAnnotations + + + From d1a51b474c2a4d8ebdd780cc42f0d5ff63a8ab9a Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Thu, 15 Feb 2024 21:24:00 +0900 Subject: [PATCH 602/651] Adjust tests --- .../Mods/TestSceneManiaModFadeIn.cs | 70 +++++++++++++++++-- .../Mods/TestSceneManiaModHidden.cs | 70 +++++++++++++++++-- .../Mods/ManiaModHidden.cs | 15 ++-- 3 files changed, 142 insertions(+), 13 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs index 2c8c151e7f..fc49dc528d 100644 --- a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs +++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs @@ -1,8 +1,14 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Linq; using NUnit.Framework; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Testing; +using osu.Framework.Utils; using osu.Game.Rulesets.Mania.Mods; +using osu.Game.Rulesets.Mania.UI; using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Mania.Tests.Mods @@ -11,9 +17,65 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods { protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset(); - [TestCase(0.5f)] - [TestCase(0.1f)] - [TestCase(0.7f)] - public void TestCoverage(float coverage) => CreateModTest(new ModTestData { Mod = new ManiaModFadeIn { Coverage = { Value = coverage } }, PassCondition = () => true }); + [Test] + public void TestMinCoverageFullWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MIN_COVERAGE) + }); + } + + [Test] + public void TestMinCoverageHalfWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MIN_COVERAGE) + }); + + AddStep("set playfield width to 0.5", () => Player.Width = 0.5f); + } + + [Test] + public void TestMaxCoverageFullWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MAX_COVERAGE) + }); + + AddStep("set combo to 480", () => Player.ScoreProcessor.Combo.Value = 480); + } + + [Test] + public void TestMaxCoverageHalfWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MAX_COVERAGE) + }); + + AddStep("set combo to 480", () => Player.ScoreProcessor.Combo.Value = 480); + AddStep("set playfield width to 0.5", () => Player.Width = 0.5f); + } + + private bool checkCoverage(float expected) + { + Drawable? cover = this.ChildrenOfType().FirstOrDefault(); + Drawable? filledArea = cover?.ChildrenOfType().LastOrDefault(); + + if (filledArea == null) + return false; + + float scale = cover!.DrawHeight / (768 - Stage.HIT_TARGET_POSITION); + + // A bit of lenience because the test may end up hitting hitobjects before any assertions. + return Precision.AlmostEquals(filledArea.DrawHeight / scale, expected, 0.1); + } } } diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs index 204f26f151..581cc3b33a 100644 --- a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs @@ -1,8 +1,14 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Linq; using NUnit.Framework; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Testing; +using osu.Framework.Utils; using osu.Game.Rulesets.Mania.Mods; +using osu.Game.Rulesets.Mania.UI; using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Mania.Tests.Mods @@ -11,9 +17,65 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods { protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset(); - [TestCase(0.5f)] - [TestCase(0.2f)] - [TestCase(0.8f)] - public void TestCoverage(float coverage) => CreateModTest(new ModTestData { Mod = new ManiaModHidden { Coverage = { Value = coverage } }, PassCondition = () => true }); + [Test] + public void TestMinCoverageFullWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MIN_COVERAGE) + }); + } + + [Test] + public void TestMinCoverageHalfWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MIN_COVERAGE) + }); + + AddStep("set playfield width to 0.5", () => Player.Width = 0.5f); + } + + [Test] + public void TestMaxCoverageFullWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MAX_COVERAGE) + }); + + AddStep("set combo to 480", () => Player.ScoreProcessor.Combo.Value = 480); + } + + [Test] + public void TestMaxCoverageHalfWidth() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + PassCondition = () => checkCoverage(ManiaModHidden.MAX_COVERAGE) + }); + + AddStep("set combo to 480", () => Player.ScoreProcessor.Combo.Value = 480); + AddStep("set playfield width to 0.5", () => Player.Width = 0.5f); + } + + private bool checkCoverage(float expected) + { + Drawable? cover = this.ChildrenOfType().FirstOrDefault(); + Drawable? filledArea = cover?.ChildrenOfType().LastOrDefault(); + + if (filledArea == null) + return false; + + float scale = cover!.DrawHeight / (768 - Stage.HIT_TARGET_POSITION); + + // A bit of lenience because the test may end up hitting hitobjects before any assertions. + return Precision.AlmostEquals(filledArea.DrawHeight / scale, expected, 0.1); + } } } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs index 12f17c6c59..b2c6988319 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs @@ -21,9 +21,9 @@ namespace osu.Game.Rulesets.Mania.Mods /// private const float reference_playfield_height = 768; - private const float min_coverage = 160f / reference_playfield_height; - private const float max_coverage = 400f / reference_playfield_height; - private const float coverage_increase_per_combo = 0.5f / reference_playfield_height; + public const float MIN_COVERAGE = 160f; + public const float MAX_COVERAGE = 400f; + private const float coverage_increase_per_combo = 0.5f; public override LocalisableString Description => @"Keys fade out before you hit them!"; public override double ScoreMultiplier => 1; @@ -34,7 +34,7 @@ namespace osu.Game.Rulesets.Mania.Mods typeof(ManiaModCover) }).ToArray(); - public override BindableNumber Coverage { get; } = new BindableFloat(min_coverage); + public override BindableNumber Coverage { get; } = new BindableFloat(MIN_COVERAGE); protected override CoverExpandDirection ExpandDirection => CoverExpandDirection.AgainstScroll; private readonly BindableInt combo = new BindableInt(); @@ -45,7 +45,12 @@ namespace osu.Game.Rulesets.Mania.Mods combo.UnbindAll(); combo.BindTo(scoreProcessor.Combo); - combo.BindValueChanged(c => Coverage.Value = Math.Min(max_coverage, min_coverage + c.NewValue * coverage_increase_per_combo), true); + combo.BindValueChanged(c => + { + Coverage.Value = Math.Min( + MAX_COVERAGE / reference_playfield_height, + MIN_COVERAGE / reference_playfield_height + c.NewValue * coverage_increase_per_combo / reference_playfield_height); + }, true); } protected override PlayfieldCoveringWrapper CreateCover(Drawable content) => new LegacyPlayfieldCover(content); From 878fb2d10d8edb3f559e786751941d8ac3f2d05d Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Thu, 15 Feb 2024 22:05:25 +0900 Subject: [PATCH 603/651] Add break support --- .../Mods/TestSceneManiaModFadeIn.cs | 19 ++++++++++++ .../Mods/TestSceneManiaModHidden.cs | 19 ++++++++++++ .../Mods/ManiaModHidden.cs | 25 ++++++++++----- .../UI/PlayfieldCoveringWrapper.cs | 31 +++++++++++++------ 4 files changed, 78 insertions(+), 16 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs index fc49dc528d..9620897983 100644 --- a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs +++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModFadeIn.cs @@ -7,8 +7,12 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Shapes; using osu.Framework.Testing; using osu.Framework.Utils; +using osu.Game.Beatmaps; +using osu.Game.Beatmaps.Timing; using osu.Game.Rulesets.Mania.Mods; +using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mania.UI; +using osu.Game.Rulesets.Objects; using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Mania.Tests.Mods @@ -64,6 +68,21 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods AddStep("set playfield width to 0.5", () => Player.Width = 0.5f); } + [Test] + public void TestNoCoverageDuringBreak() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + Beatmap = new Beatmap + { + HitObjects = Enumerable.Range(1, 100).Select(i => (HitObject)new Note { StartTime = 1000 + 200 * i }).ToList(), + Breaks = { new BreakPeriod(2000, 28000) } + }, + PassCondition = () => Player.IsBreakTime.Value && checkCoverage(0) + }); + } + private bool checkCoverage(float expected) { Drawable? cover = this.ChildrenOfType().FirstOrDefault(); diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs index 581cc3b33a..ae23c4573c 100644 --- a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModHidden.cs @@ -7,8 +7,12 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Shapes; using osu.Framework.Testing; using osu.Framework.Utils; +using osu.Game.Beatmaps; +using osu.Game.Beatmaps.Timing; using osu.Game.Rulesets.Mania.Mods; +using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mania.UI; +using osu.Game.Rulesets.Objects; using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Mania.Tests.Mods @@ -64,6 +68,21 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods AddStep("set playfield width to 0.5", () => Player.Width = 0.5f); } + [Test] + public void TestNoCoverageDuringBreak() + { + CreateModTest(new ModTestData + { + Mod = new ManiaModHidden(), + Beatmap = new Beatmap + { + HitObjects = Enumerable.Range(1, 100).Select(i => (HitObject)new Note { StartTime = 1000 + 200 * i }).ToList(), + Breaks = { new BreakPeriod(2000, 28000) } + }, + PassCondition = () => Player.IsBreakTime.Value && checkCoverage(0) + }); + } + private bool checkCoverage(float expected) { Drawable? cover = this.ChildrenOfType().FirstOrDefault(); diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs index b2c6988319..5ddc627642 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHidden.cs @@ -9,12 +9,15 @@ using osu.Game.Rulesets.Mania.UI; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Rulesets.Mania.Skinning; +using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.UI; +using osu.Game.Screens.Play; using osu.Game.Skinning; namespace osu.Game.Rulesets.Mania.Mods { - public partial class ManiaModHidden : ManiaModWithPlayfieldCover + public partial class ManiaModHidden : ManiaModWithPlayfieldCover, IApplicableToPlayer, IUpdatableByPlayfield { /// /// osu!stable is referenced to 768px. @@ -37,6 +40,7 @@ namespace osu.Game.Rulesets.Mania.Mods public override BindableNumber Coverage { get; } = new BindableFloat(MIN_COVERAGE); protected override CoverExpandDirection ExpandDirection => CoverExpandDirection.AgainstScroll; + private readonly IBindable isBreakTime = new Bindable(); private readonly BindableInt combo = new BindableInt(); public override void ApplyToScoreProcessor(ScoreProcessor scoreProcessor) @@ -45,12 +49,19 @@ namespace osu.Game.Rulesets.Mania.Mods combo.UnbindAll(); combo.BindTo(scoreProcessor.Combo); - combo.BindValueChanged(c => - { - Coverage.Value = Math.Min( - MAX_COVERAGE / reference_playfield_height, - MIN_COVERAGE / reference_playfield_height + c.NewValue * coverage_increase_per_combo / reference_playfield_height); - }, true); + } + + public void ApplyToPlayer(Player player) + { + isBreakTime.UnbindAll(); + isBreakTime.BindTo(player.IsBreakTime); + } + + public void Update(Playfield playfield) + { + Coverage.Value = isBreakTime.Value + ? 0 + : Math.Min(MAX_COVERAGE, MIN_COVERAGE + combo.Value * coverage_increase_per_combo) / reference_playfield_height; } protected override PlayfieldCoveringWrapper CreateCover(Drawable content) => new LegacyPlayfieldCover(content); diff --git a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs index 2b70c527ae..1cf2be7b06 100644 --- a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs +++ b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs @@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Mania.UI private readonly IBindable scrollDirection = new Bindable(); - private float currentCoverage; + private float currentCoverageHeight; public PlayfieldCoveringWrapper(Drawable content) { @@ -106,23 +106,36 @@ namespace osu.Game.Rulesets.Mania.UI protected override void LoadComplete() { base.LoadComplete(); - - updateHeight(Coverage.Value); + updateCoverSize(true); } protected override void Update() { base.Update(); - - updateHeight((float)Interpolation.DampContinuously(currentCoverage, Coverage.Value, 25, Math.Abs(Time.Elapsed))); + updateCoverSize(false); } - private void updateHeight(float coverage) + private void updateCoverSize(bool instant) { - filled.Height = GetHeight(coverage); - gradient.Y = -GetHeight(coverage); + float targetCoverage; + float targetAlpha; - currentCoverage = coverage; + if (instant) + { + targetCoverage = Coverage.Value; + targetAlpha = Coverage.Value > 0 ? 1 : 0; + } + else + { + targetCoverage = (float)Interpolation.DampContinuously(currentCoverageHeight, Coverage.Value, 25, Math.Abs(Time.Elapsed)); + targetAlpha = (float)Interpolation.DampContinuously(gradient.Alpha, Coverage.Value > 0 ? 1 : 0, 25, Math.Abs(Time.Elapsed)); + } + + filled.Height = GetHeight(targetCoverage); + gradient.Y = -GetHeight(targetCoverage); + gradient.Alpha = targetAlpha; + + currentCoverageHeight = targetCoverage; } protected virtual float GetHeight(float coverage) => coverage; From e705190664cee548c402eb2e67ecbaf742341b62 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 15 Feb 2024 23:23:49 +0800 Subject: [PATCH 604/651] Update windows icon metrics to match previous icon --- osu.Desktop/lazer.ico | Bin 67391 -> 76552 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/osu.Desktop/lazer.ico b/osu.Desktop/lazer.ico index f84866b8e93b4c7a449371b71a99b1a8c5567df1..a3280f0de0b6a935309c84594e8b83cdb7d2e43f 100644 GIT binary patch literal 76552 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 z zoUpk;Io&$8cI_VXo(?dGh8Qn>k~cl4?djKf+rA&qyWfCOO16>-%|kYW2~9P)B*Q6a z9ur0rU{I`U-|vp|FOcz5a>#bb2(|yH*Z;9SC{99Q5sH;;#7TA-ffQlSQW3~YLOwte zLnxQlZGWas0KzUEu?jh;4NdhguaTciLTwh(Kj?^-3lO%gV_U`i9@9jt_=>@HPU3Yk zH3j3SDH!ARE4K3zCSEHrO|$@V&gNO^+a_iiskGpJAX|P#k;kf0$kZwD+K{8us6F%% z19k>OH(N!B8~2kyw0yEFj=IB^57=GyAWB8hzM5It`S7AHt$EQ(+ z$8F|@7~VZxg2xrXRPQRhZiY9vzGJdSM$f%P?kk8LF~kurh$D1xykm{q$G(9mJbe*( z-3rD!8D`(h=(``{xkSoqPq`ST`xV$r7ctfm=i}-6X9we&{dfe=FD}DXr{G1^3Z9im z;JU-mTD^jn%PVl44MVuP%(;BTjgkh}k}^K$Soeo|!*FMt|Bynt&&z zah}(r94Y;q*K@d(>vEh@G2#G7*M8O?0)u~V+CUo}+gYunxlBXz8QqdHjjy9^q~oOP ze9#tH?+>d~LaAYCFp-#a>L8&u3+ls3unO8|%dlVI#r13%U-GT_4bvRu?d1La8~gyB Cep{CS literal 67391 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 From 4b2197039cf301960087f703cff1ec10a5434542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 15 Feb 2024 16:40:58 +0100 Subject: [PATCH 605/651] Make dropdown text nicer --- osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs index 1cf2be7b06..d8d9705530 100644 --- a/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs +++ b/osu.Game.Rulesets.Mania/UI/PlayfieldCoveringWrapper.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.ComponentModel; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; @@ -13,11 +14,12 @@ using osu.Framework.Utils; using osu.Game.Rulesets.UI.Scrolling; using osuTK; using osuTK.Graphics; +using Container = osu.Framework.Graphics.Containers.Container; namespace osu.Game.Rulesets.Mania.UI { /// - /// A that has its contents partially hidden by an adjustable "cover". This is intended to be used in a playfield. + /// A that has its contents partially hidden by an adjustable "cover". This is intended to be used in a playfield. /// public partial class PlayfieldCoveringWrapper : CompositeDrawable { @@ -157,11 +159,13 @@ namespace osu.Game.Rulesets.Mania.UI /// /// The cover expands along the scrolling direction. /// + [Description("Along scroll")] AlongScroll, /// /// The cover expands against the scrolling direction. /// + [Description("Against scroll")] AgainstScroll } } From c4bcae86ec02c59dfd0a795ddb9a7f828201b8ff Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 16 Feb 2024 00:43:20 +0800 Subject: [PATCH 606/651] Update iOS icon metrics to match previous icon --- ...0-5cbe0121-ed68-414f-9ddc-dd993ac97e62.png | Bin 278451 -> 453879 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/osu.iOS/Assets.xcassets/AppIcon.appiconset/300076680-5cbe0121-ed68-414f-9ddc-dd993ac97e62.png b/osu.iOS/Assets.xcassets/AppIcon.appiconset/300076680-5cbe0121-ed68-414f-9ddc-dd993ac97e62.png index 21f5f0f3a0901ed465ec468164bce1817fb4ea22..9287a71040091fb7a249018bff4133b91b12e1fc 100644 GIT binary patch literal 453879 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

      W7K}n#=&f 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�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

      bpC2 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

      t8`&N6^;}D0Y_B=&aomfMHy;j-%x? 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 z zS$Sz4l1mrta;AA(keMAc2I0OhuNErR#EZvv>2``d6c+&!9u`&tOa0VR`!l<%SSuSe z2PUIv12c;^aO6;9#slrK5pv(IM&&UiuHgxhCJ44)o*j>>mMT$^jKqEfI1J#h3VCk- z*!lRzt@l5^ed`wYq^>`D@!ZpoTzu}S$A9y=i_bsJSEzYYq%TCr!4ZVs-e$fz+M*OT z9qwG8Wv#||h?hb$ojOo`6?_&<@wo-=#@knXB<5$%S+_sFv3>p4t!vkj^n<>H?KB@X zzq7i+xs2QkHys?(iBZ`f5pfP9##8>l%mOjea!HI$iU&aL*r=-U((ooir+4q(-P+tt zrS%;%9?qw*ZBDKq4OQU63g{Yh1jb4{OwUHMG_d9nNN4k~hi@0GuPl|90_XC76Xkw^dlAOJ~3K~%l){8Jad z`pm@_p5A!oF%AY$o={DVK|@?V(0ysf#P@)Z>e38XDdqr1Ev!1$HIx3^?|;ll!h@&y z?3KfhZ!nnTI$BO5@Hn_pG)koduni8X?22oANJxn#_&Od)0z@wM5o`&gA5mLQ_3GqX zG}DZRsdcYSY)3$)ygCyWJ6z6ci9V;B8=fjuecn5@tDmNfD5cDRrL|>7-Cz7)-~HtE zpFimbLw@hl*V_j}8nE_3pp@{?)&Ief#P)ZnQgh`QrAi zO=2fkH0sHzGwU1cj6HZ$Vj^QqONC0yQf-=9HRv#Rjt7^-Jj8T&G?{DM`8QYzS;497 zompQw|Kjm~0RX?M2RR4L^Qdg}15>TDdwLfSjO~gbBwKa@$_Y9E7(oFbpd)+(zb}rQ zjeFybH$fiz>3@fkJO;p{rMqu`Xe}9R0<)#!Vu0p}hr3>O+wNf4it1FIdvU^^jgnop^LgLyo+%wG#}2!p&hK_MJ1uGLC?Z@R1B&ZaKr+&{itakcRgS0%ep3 z`oVzCU(!(*;C7BcXqwfvd4t)XIHMjbA^jYAO7|0yf=_n#gi}`Lvn)<2LmR|<@3Bt z#5V*aVhPWJ$CLA#n#IZ5ffCUsuQzF=^+R-Ws*Hy~wm-gk>%EU|{roDK!yO&B-sKLl z+jnnn@q#SGm}m3WGTO3r+t=@?<=)<%?HyiaOlHYo=%pl2YJM+FR-{2P@srD3638Sc z&Xu5~`WFy3!Ufx%+nd`A>7M>i1UUBaYex?<`?qiAA){7(B>?E3{b|7~^kX+0r;;`= zea#rcoE231S;PE-tnN>hjoN$wkAiG!`Ys7}0As>UQ{J|;%RN+lErFQx_O0b}WW_nM zV)coOE015g{KC^*U|fIfBG-|8xWYKa5A_@<2}n#VG;`uh+uDMa>Re6?Gl*MFwy!am ze8iPQk^z7xythBO$&mnuwX}^Bt9;>sWGEH3)(AD706iIkj4c+yPfMW4!>c=kYPIB8 zraM9nvN;L!Lb2K!zkq+R3exHD;-+;Xun96y5I{)*EBuihl@;ya5CI;8SzhABh6#X=2!O_AQ3<-r8Aw{`rz7!KY07<-@X3v%WwH| zE%dLi@}_@M;okCHP9W-r0xnioxd4;TtEoXuX_BnxpbD7uYgAmwzk2kBzh5xWwxF56 z_+H3Pax3Hh>c`G+oR|jy=xE+W$&f`E4*;~jSq#`f0+=2rrktPyfO$*^C}BD@QWe2k z@&Psu6^eO;c&_JR!ER~G7dIaN!>?a?^Zn}H>=)clsb)irFIKEAARm^OC&W(0B+gV| z3>Z;yWvqI%if>|(n)opiI6!-5x0rKrfWbOrhVgZ`6K0ov4^2AN?#SsK$BhiN>;wXv zP7W{LXtaKA1HA8zVYz$n<}W|oy>@%~&375)xd^ayevPR=PYh>PcVYdBOPuRn;VWYo zH=uI-P?J3DRzjBhqfNSXM8Q2?tH(!a&C*KTv} zmV17f($)Dn@9*~uzTF57a1Un)`Kxugk%^kK6O4nAI_-UhCnRTb4XYElLOb;@g?cUw zhks2H9 z&@{6p%5pC_{7D~8d9Ii23a56!v^4SQ0<4wXshu5OSGmL42ki51CGhL(8+$w4BlHQA zDjvfif_$omY#}jLFP&d~)KAg*LApmTu03+zLxKw%?)6uf5a)jJG{NR*wN>WOKphV7 zfnM^5SH9l4z0Dh+n9}jvy86i$z=s~tav0!@e{07EaTw!tgXcs10yIs+;_Au@pEKtL z{Lb@Fo#KtCcX#fr=li=v3=9i;Be2z+;%)do+f%Z{U8gaTvLT45LiepqoyK`+V(IDs z^eLKo-QmW1c&0=;yxE0KSK2YXV5M-_sw@$K^`r)v907zoQ&p#fH6Bzlx;ji8F)tRUEwsy9c&aH70feT0LPd;+- zna3_X{TSB@NDsa|wQ^yDwBbS9!&4&R>#aO;jZr%K?iS<8_V)GL^gchbf+eHMHiOCa z+jmHY&26`pkqizdc73&krexc1CRx>(kfrTR&zcW4yb!^H#Zy|Uz-diYhADDw6~tmA z3guD@E_*+w_F#)4l8sj-_P(n&{X!{@(2p#j`K#1OH6wUHbZOTzKwD_5$28s*N;MrHh3_EP~Hv7M`)W#$#IVywB4kSjo$^ z@|u4v@@>7<6)pl8%4lM}w(2Xz@jy&kQ9kQ+Gvla~O+~;`9Kcmw^yH+~x{t1#%l4dZ zvIZ)U_4@Nqu*>9bm%7AhBAY7Q%rsH$IEcd<6ar;sBD_$dN zM5@9x@Wag_arYG;V0-@g=NVy-^EyB_b%xIK-~95Gr8B%k(2dtkFo{b7r{40pr!LjV z?cYM@NL8fG1E4l%7y&sHm`e>ofHGa04+_rp&*9=M%t5I`bq)s#7}YLbLN=*6lZ~TA zjX>4lPrdMr!tycb)x^$`ndsJJju?|CO!eA6TdBbA>!IY?;T}BHK+pJ2SE*EP%IQ-} zXL-^2%I57&PK)wI7#W$#u_NET$1c-5?CJ9197~+xLrC88 zNMX{(9-1@#W>j^BBV_U`feBJV?Ul0&Pfh;Fs0N0r_8mO>f?=O6oAkCSs4rO)kuqHj zDDV1>WBF9bu{6Gr^i+ny*6^XuVGyI5&X*&d)73{s+<=Z!`miMAq?ioo$Sx64X8Cm^ zP|V}FdwnoY=wpkA0l2>26A4MhQ7KPN83;i&x!9?f{+izxtWw`L z=0uFGfU1*1yGL#9)u@uT%Oa|l14xzb4kuLT(xS1d z1(&RvqC_^qR0RV^YqBwm1P~s>+FIK9BGGt+D-4B==7zM35eW({*6jACGm68Jj)Rhj zrVR?QCsBa5kOM+VY&y`xW?m7-miNm~IC=lUcYd^d=^V#zoDAZu5QhQ0B8)-6i-ZW? z-K7^eal<7zj>d0a`GhOCci4&C^=(2t;Lawg_O^ZLEEz`M08lYpq*=a&YO4wZO?PB= zT}4u%bQhKR55~$uspbqcf^$r%+=rQ0(KXBh?<19^!7!+E%+LUJ6yT~lS_!r;X|18Q zbmm;{|8Z}40v-VP=%bH#89n;~56^nZChsW>5S2`YDY$c;l=aCv0O%XvNEIVUd`Ij6 zDw-9)>({Tp_S)+l0L+oc7}|~JpICnK^6n?MxCtAVvSV;l35;LaqRH)Sxzy*`KiobP zIjCwIl||qnX&>jj3Ve{i^v&78RJE8{j&e}LKEWY77a4F-qmXcn5ng(14TEZxEdw|^ z8|sdhuFE+FOLx9K$g(nI)Tm7#IQtJHBP93=zmN)D7k}A<%0UCupu2ZC|H-#V73MYx zPKEj{(k1u(NN9`c$-OwVs%UVQyEO3xAUlyq_2jPi198GcYm1p2_RBCN&LKO$OLN(UG z`VhG|=t1S=pOgN`*CXamiVcp)aMCfNN`IQD2C8>V503L|l;`MSiJVbWti_^p{WIfT zQf7>kzf-%(nQOPHh1;B=sMU4Kk~1?Q(uw(*>dNT`IUyi(NE{|}yYUfi%uS%{ax|HW zXkf;#9!i8=;HO&*CRoQH0N?@Ogh`((w0X>46z zSrr?zS%sD$cI>HbzM;6iZDU3Gb{+0`9^TG@I31=LR+&_%CRV+8s>Af0kcYQfFF89c z|K9yW?sg(pn1(u3a26V@6T-3ae0?_(zoP{Qt$5h)k$;UO9E?p3PF7$Bxn1<^0>pMQO~=g&l#KDj+l|iT z#Q?M5=yUr^4`{XZa`QrJa=knX11!mYI1{HPQu&|;J!jFFqXN&x6sh2#x-(%n%t!^7 zkn3KBR9sMVau~Ci*upebi^Y2V)8Rtcff0uYRQX%;I8QI7A0Uv`@Kio<%77svTNsMPQRTn~)41o4Ku?O7GB*Y~4%i_JXP_%@Pyh$fn1>#{Nny zveBK|+1}wI0AItXo+^^jZS5+cS8dh;#Wps?Az_RQk^!m={yC;d=-G!X%>#Lm4NOt@ z@lZu}D0IuQxXn}nNCr#rn3cXbzsfn*PCvG_*^=P@^rt`l_~Vb~eiVLm4L~s;#LT6R z5k4sg0EB5Cg;6bl@VTp-mBMr3_?1_F_{V?zFW6va#Nz;Q|MaPqCogS$<;iP*{l@aS z{sv00$#Ljx(-wCRHa3J{4qJ>3V@@mug*nI&7usfYkUG~>uudFZO2gne2t0_1!863? z24@j)dx9ssPSCPv;kraJWLGdV{g=hX0lDb?n_8+SS!b z8iqwOPB6h|$(@+%>ua}f-qL#P=YD9OuH|!e@eM2=sLq>0rI#D%(O5hKVwZe3SsP5X zLZ{OtnUqsMf9_t-@*Jc)qP26*_|XG)%kC2S38BKg1}+uiD3>6<^kAyYQS>#;)bf6 z0Nos-qji<}&k&pK#T72Rt4#SKY8p`5RECTicZAnG%ACOhS8ncXZ#&mr)O!7FP0I2YTqE*j6o}Sfkp+-CJy+qR_T!rN_!##Q<18_ zX?7h~*+FV?l(4rvT5!S++C+(hOu!=-rR5030&2+&aBX$<7EfQO!-GWhFe&5;l0YRP zP}tpv1J(t*Y$-5=XBso2ht%`K=nSWn@RT8bnqq?QQO zvJQOhbP1|R0;sX&MlpNb7*ScGs#Tk|qDg6ua}|B81J+ukWeP#ZvxZdoLG2j)Nz_8H z0&^`(q~aiKmuZ(j_8pO8gY|16R~_G+~GbO3fqLdtPIC{t4JBtGdLotzUor z^?EUDxoq$&J>vK16#N^cWApV0!w2?ANANua^gMRM+&qZD73ewg_1Av{GY0@CA;et7 z=Lq$a|L^rUlihx6NgHP!6qYmW-YBi-W zy|##wiJOD(up4nskhXEkXJu&_^`rg2XkG`79!^&TN%_n%8WY&^WXVG^y z)`wK%?rf~<2sS2SUy-#`kJZ0w)ipf)Is;IBXe(MJRs#rS39rM>&X^hXGVC3)s1= zE#yD}<^#=HTie;(<{E^^JtrmHho+>*)t2HH;9r8e#uA~1oROM-NHn`DG0M!wuN}FS z8BOkX<7O&=#-ggh-*6R^i6iK$rp-e%KpN4N*amx4osP+F+cv9uMh9$%9Ii5(uh8U~ zw47x~(^L`-&irB1cddC&0KiJr1e7y~$vY-bs{Ws6wnzz^LpqRl5>S~xEKaMK*4jKK^@u# zQ2dqWAdTnVsdFzr?XhHGzYe1@gnKoS*}M z(eR3&e3N*E2D^DDvRwMq;Y#6#` z+p%?Qa!A)c&0TSu!#Ok~pU68#55Re0E&wpOX*`^AHM$ftE>c#wOuMnZe)BFTVzH~a zyE}JxS9j}tyd3d<_+$-n31ej?Tmlqeexpt9h>F3s`VCa>COtzOp#Q5iWByOkyV4Ob1K7MazJru;V?Z2vS}p3 ze8?dpoC+n@S!&69f41*%EeIY>pYdW5Rqn#T2yD@;5B#A}`+*CT%3p$%w8VfSDPf(dZ`*LnR8r<}RBmF)0oU~dWn8B9-@ zrW={0tWE0bO(U;W7!rmAi%&v5;Ln_WDU+RKPeN4OryW^#s^Xx*g* zJRKPoB?8e7!gNK~UeMEEn+a;3so zvJomw^aK+GRqz?DR4xyNwI)oGW?G)oI$LSCihRxC&{@<55V$Vmk<@20WYdr&86`V(HO=&-wBO+`+nT2bK$T3O7w3B=LE zKm6Rp#gTSBC=|P=mzP&a3F*%77jplPSKY=ZH6F}?FM^8)0Js9+_S?@s+m|T-0|qgNzX(r$ z9i1oW0DujqA~lw^2~l0xmU^|2*REaTYXBSo%z1vDi2UlZ*&6vw-RhSf-G1kTvlq{K zKWX*{ZjEl4{(9-TvbaU{v~OH9{@J$CRos6)S9K7cWA3j9>YTY?9GfE#)o>`!Kn`G0 z)@>-7UGs0qGA?7M6nz{V*glHRh^Q3m#g4VsaTmw5nX8V48|i?R)4(4X0M>uZg4<^B@eF z4AE4}cvq%_c(6qx(^yO098-jW89?F7nd&1jR{3xBQdS6DcfJpu-cboW_E;*StrG-R zVDn2NxMNPeq#6knJPt%W7mEZle#DUCwhb;8F=@*oC0yDtS2V%D%0&nlU`ogkvZz`7 ziWz#e6h~8{{3O%#rdJxFsgd0-S94RX!KPDCS}_z;_?&{21kGPsTE4f=)4-dC0@l4# zJn_urquxX=XZ{Lc*|oKG={Lc;C$f*C{kC0fZEo=;zVRF++nZleoX!4a9fF4eb80b{ zCF4KQf=f2o5e@IA4_N$Zkx`9c3CqX)&r!UEp-vVc)zs52s8m!EeMt%#5EgF8(5c$< zp`GS_5U;dw`%_{mfd?Tt07z=ZMTJxqA7=^E;vl&fVA*O_BS?wCP`y%|e(WEy8gk3$0 zm>@(~WZ|WUB4X!wfX6{yMg_YbD)9&7J$6n!Ti`wYs{ov2p9ht$Vzc%R7g7Xyh(O2)v{&$D}HZR##Qgm0;tWK2mcv z15$g?#SkxnQgwgfAu@pb^Eb_A_f)cpv<;=TU~g~f(#HAU`jSkjKEC4So_ysC02~7h zM+SaiifvR+CUAld07ifghH{V&0z3x5o0$IikN-GF#s}#S6Jug7KXU%uZ+>a>&0hkO z!lnx8oRl@A$zEp>VkC|dy&Mv(9+xjBClQF+;u%S=de9_UTx`+3w@#dBPo zqXExY%oAO_d9%(?ray5p6S@YxPTzIQYOEH;S9`;%!LL|G5OlBx7y>Jo^$V_)(qS-?4sb)=-r43t zJUeL^?N1(8<&1UC-<5JZxI~(J)#ajs$Ajuad$zC$MoIy2l_hjQ;|I_msa0BIt4+~| zT&HIZd(|--MJg>+R#6wFLb5VhFQDY9uCJ}%<1+_$@9@wlZQ_z9k3FoMJC}1BGMB;# z>Q`Y9pY#|r^%X`YVM;T7XZsHKz{q3Fe5%q{f3{}J_gRZER#U80C72imvInJ8cVXD$ z9}YC3B6Ui(zfg+I>4tXYFbWV)$EEu+Vr0Uob|;lm?PUiOow9DRxe?*Lv0en=4Fe1> z`o^;syu*h(pxW>ftEz~X5msA8Oy?sdQBK#CTD3~UsG(yzUvZ)$h)$K!UnE3^?6F)k zP$P-xs4RjtIf4#r8X0u(;AZWDha!;Vy=v*W?1mgW{_Qg2LlSX+rzwHNO4u$*DS2XQYmcpgvba$4sW7^P;j}( zw!^mO29?iKGO%!n=%Z*iZXu!^-^$q9;;j(g=@1Kr52@K=6|Y-$?#9IND?tyaYOoF9 z0j-7K#Uz*-3v!+_EZqIS^7us<4A==M^9KMvt4j_EC!?IW1AwDK<95-bR=^1Q8*lsw z%(xJ9yn*G_9~Zv$<*WbuKX`43k%Zy~+J|b#l5EN>1X=+&#*CPoZl1);?%m<*xzynt z_r>17$?o0=S^|igFi#RA8O(voie!T>Iex9lS!$5VG!3u{H%VGBx5vj zIJdOSPMS~s#iBIM!SGs69^-3wir`DI<;nm6AOJ~3K~z+?ReG$K+VY^h2U~7suL3+T zT>Rzq57~lyC}AhCv9Z2<*5@EA2sA)D%E09+_*$VX`s9%|+gn4BBtro%gEk$JKUBcM7T|z^buIl(IG&puovP)I2}MSuTGujaaA7EU`y|(|CNC`-Kg*CL}@KF zQb^Fs$81m`#TNMTMGmxChFtPPoYN6IMo+_#u8|!;_UK5zm2^}{D!Prh9q7r6tt)Rx&Dkv08TlzN71-R<}ObIZ=Sz!A>JvBg;^VIT1-{brezvG zRUZ%0BR7cU5p-*1&4P+ z@2@rt9382LNI7u_0Q+LMFPcyb!;(^gdgq;=@jj*(UUEIY`Jgmym@>{-=6}`Q^#kl5e<#4rIk5-|xAF9^$XsAD} zk)*v;f*d4dlxmz4gII2Fi4A~?WLRZZs7WPH9cWj|G~YSb1iG}^mew9ZTDO5g$rN8*)vw$?#=9!HCD%Iu6F}_0H0T=6 z(k(A}`rpu1mX+z88Z2AcrR8uUKJ`ZEm=QqD!0V%a1n(h;4%?(GN^8<$?5=*02$B$%|lCN*BYC%Q$zC3fh1kQF<7|6%9fOH@+g||B&}Vk?d$%k4PPN z8{#BASZS7qg0LECho}rH`Vk&#Va}LTQl_J5S(xGReCJMHHlXHv_wMfOaGQt3loF|k zB2<0TiG5w%Y}-+q21yFK77&`s>Y71H_qFa~HDf~{2=%mM$zT$wY(d3es$$dyLsOY9 zRgK!L2bay!Xj==t+5tGaAeeb=KQZEP&3Q`Ae7RqLr-3K1dTPYb5j7dfjiOcXE)sHY z1B0=hHGqMB@GO8*QN>!^=q&4@LRXP~M4{D+a$6EEE-R7)KKlz#F8^}#Pxv{l=__#= zcF<9~gB?Elv3iHY1E<9*?oKqYdp<}o{n{nbXRkQZ=>Qk3DzWVgFzjBNw&qCid6nqpH8 zQFv`K>YrKiVcc7HZ(s!_aP+SuovC{-svc z{$$41?-e#(5<-`1juqqT^igEt(s6)#7ft}i0EiX!M(z^7SO4ok4&|GVRXgABcEF$s_rYJmB~@Zx*obF!Hw2LSh0S7$F9FgFxXZF!7> z0@^YwGe|VQl&pItSc&!yzoeT)|2-)HU@HY!R3{2_u&z8deDRj9$do)__@e=^my&8V zTd&?UMjnG)%tZ>lEx>d&`-zdU8#=>W?l3qei$7p^I)sbra;tYmU%03x&xUa^UwrTv;)QZi090cVf|MHTKXw|P_01(8*d)Sz&_4IzEq=TpMHpJKPyjN zVooJbjh+u==JRK2qr|CGKmPHLdHR&%{7}Ac!@iHIA#y*RrOpr~R<&tONzs~>EzA(B(?unYiu-6@V^bo| zCYv29!f=Eekn_9L%1Us1|LyIKbLV#15u}tL234uyj!unA zL&UR!iwhqZ{SnJ~Wz}%nHD`Am{Yxz< z8n#5J+J=xDi?z-jnXVmohn`0GJXY9>3lFMm&fhvB?p8ypHQDSybcahu4%-X1S#(94 z%q23)`Bn}Icq)}{;uh_?O2f%uZdT#akX-2|$+1O?vFkir~T4mv>W?Bf{pefXoQ=ukxWddyJVDy`?zS5u?lARgE8J`n=bHP#bKiiATEHNIJQjzKGJ0|k04kvS;Vtg=3fZvu@>!5K8YYojJ=jdJYEi#zseUbb#-niMX1z(CnK_VrmUo zsU^^m`atPM#RKunr)yrtmU^Z7jfuN%djV(A;-KaKjzGiE4v!rzI^l86!&33`26i=hzh($S9 z`j23_Ke~I{?3cmxjdH5bKMCM;ymaY$XVFpr^gNB^o-r!uVOc{B=+4tlA;SzZY-krw zi2^NoHHmRx_ueksKFkE1IP-cbV`3-3-knJ$;@T0&BAB)?w}T&)IbVn(iVAbFdk0D- zr3S$@A%L7hFzCT&83iTT^z2Kp=1bQShl;Z((Qgx)q0T?82loIb+7VC>iTQVkl>QQL zJ3<94?283B9HB_92EwC6^1Pz7M$@bnX%KSN%&#FqVVtN3FIZ{Lz zbv*G42u!nVSs-5kdj7Zl0I(MxPrwU6Z{EE5-S2)6e+YaXl@&btfohdHC0+P~)XsIB z>yvc=kS)l>aT{GMMIwj*lttpHU;N@1Z@lrwx4!i)`r|ks1JHF-pO=BIKljA#H{LsY z`8-(*ihrHXn9!UL=hTqKb>B^GpU5P90D6GUZzj|A_VtW(04$!N{{X!q=4?mt%<=o$ zJ=gE3Nga)pieSx-%!5HHuF4Hy21SPzPP1fkCSxzq+MQWLsoYNBP^iu*c5rt*Rf{KP zcroJbK5^m2h`bbKh0nQrM|dw99Q%OyCM8N#6O3-ihY>FR=7X~JehFN_1n+(}hja3; zd)$T&bEq1bHdE;gS{Wy03tuuY2-IH_P^j=FE`vd>+6WWX)`HHam53Iw5AMh&)T;;A zFi@JcgX9@iRiCQv2o14d=XD)KzcnenEWRV6LNfP$r)!J`hV3x0d))iJ%`TZ4k_ev6 z^D@mUGl5KuY655olY53zwv=)JFviIZD2*D|I-|pyrVM!rW{K^N2zw*yX$Ke9qZ6Yj z9UqP0yMR!U!1jP^Ank{MoY*r)}{gA?jU{Z7?B)E zaB?Sp^qDIv7^Uk8Lgonc$mxLB6?ubjdk&tjPx2%@&kYiy7Tp3^vc-`S95CcK?KF?2 z@jwn&p&6ZQN3|xaVZH%HtjcgMuI=YM6uF=2=z1wHCHGe~xm4SSI!n4O31uj?Sbprn z`QNM;fZkv4(Y}37lsbL{dZC$#L@3^Zc>j0plF^?2*g>oPZ zsDO?rb4>QqOD}N%aNO~1_LnZ5yYSCmxcSP@^s{fEMXTf=n?MKp`ltrnhdxMd9i!5% z)gI>4)$S8KO5m_DW^9#*>Ht}#*be3CEYtcBHU{0fE{4fAly|J5cK4#JsnN&V=xX&E z{5>;QB|}YyPlcJ{Ir@rBL)9!owVn#y$vgWp@AKaMojc40$BoMxjE71s6jkd}tpc;) zyT4o`s?i@;^U^mSD#euE)gC|q&`SBCjZo7}*+lSPjjfthpe9l5p(xta2>=FBN`af_ zO*X`)8A_`vF)v3`RCiFwFa&#$l;BTNG8|;;w!4~M-?xU0uw6N|Ty2Gqk$w70;n-eM zC5YSGob={F*fzW49r@?hH%I}_MyW1wAEMSZtXQh3W zn58%JH1NjF>({Yi$$fO(n|hX8417Ml90+OOqFOXZ7G~dORSHxdsPQcH(p<*^Jd7*8 zSmxFT+r%;=Mx$}4Vps9BV!5}s@wKOyFQ22{@^TV?s1UxC1H1rqdwUz(wQYj0BZ0wC zY*dGTUs?uG~pvI6i7)n{Ic8#NrMXhQhW;GMQljBJ3yKvDm`E?9dlCYnA?%5m8Kns@!duh$<{TJ zDsyVDk|A=$ZP!=dY?>sQv!Z~jG+g=d^iOX-T2!KDw5SrG;+w=OBv#9m)o@G!G})wL zr}H$&XRDZ-WagCKoY=4AX>D&SnU#+Y7Fk;zY=>Y<24;3|B;^ zp`c(V27)0Nf4ip9z`0>|s=B3>l2FodvNZ)+MTK(72m+Rzi&BJ$VY8P+j80AP83Yb2 zZ{}qKn1G9$LpUG2be4}yD_6SXL1kA&r$xCTo4ma=xQUM_H=dRNwyA;0B|U7>KqZ-# zonaa*bG(%&#+pSdQPLb5Xj`uliwv$^bcPA+R4{HJgJFi>Pl`%444wgC01Z^THB@$X zaHT$dr8vxV0dZG;=up~@XARAM4K3TP56Y)&V?GWKk3orz<+k2C#YTjhd{jh2wgoq+ z+)Jf9@HejlaDCv;+NygEHXp7i?cUwo+`PbBx%6R_o>gVLJlCz%3n_0zrl|Jt$}ll? zu!}3#Ih&Fh^8%?^XtC4UTu@;!6%fPN3Mv}RDnDKTboN5s|8p{40LsYExn{b6zF{Yh z03eQpCYxT%t-|aJUm@WHUoaPCKKbO6%aREWxH|{(dX`#8*AGNKsBBaJ4>QLBj+*=hDCj@+>}@Xmkw1J zMoZH)Q{E^=s4dQ+rfWlH(lWsfSGJ;Ai<5zP0y}(j@p&z_nm^r2vkM!9-h@)G?x-5g z?2QShOl5!A8_5tOWvK@kCQEpWqWccQSgFyjb5`C4Wl#Mnv>xAd*ntg0|@prdQ|7*$5$*!!>4ecy!NyBf?PnB}Ae5=?r z7R}36W|}~u;#phBV9Bzn?h&z>b5!r?rYv&dEqVJZr8luv2^S=ZVQz3Iwl(CgsxYGl zFh~t4syhxbRT|sv4|XvlRkW*o@x>lhyWGE0sQ?9sgSS>B1&ioex;wel8|6!RBS(z1 zDXcOm7@`0%>^drnI5c)%$?-zH=_t+X$3lr*+$(M6YDrd?hofYa^*^VOI|@W&0cx!R zFk7a+>6y|PLhKo3r5;pW<>B4pCc6yEMghiC2Fv z^YWjJ-c(a+t-oD|%A!MM6lnoUNjST7!ZK8ZYcR_WX^0o~kY(B~TW4*OHe6pTa=oLP zn-MBWIpT

      Z)d4`|23iBR!lh76Tj>#sJ0^Mh0$lhQyH)@VWEn0M#AuT}5gJlsFv4 z6-tqHCFUW9Yu3@l7Ll5API5pnT3SoYsjfesSdl+GNnon6G-(OLs5YW8Y3&~LkQ$v8 zrIZ0QY>-(f8^J*-H3Q#7gS8J27C8o2GPSkS?yy5uO#<6|N;CucTvpmEDgWud*l;1P z`DO$B8}6$}7BmX7Ins4DPOc8POhPxs;vHJNhA#> zi+g)ZkDa^lyU&GkA{N)LU;qC1Ut%PnRKJv49+ma7k3Borv{`I{-Ksm3fql zT9}IRSYEw)^|jYt`}ViLef&{2xlgS;e&NFJeEI#i-rwU8z0x}Pj1^}5Li&tmkBtJp z0h2etRnJ%;dnHp#sbZ+DuC}9?RLD)qf(Df|HQ54zgF=bE0f$w%1I4dc$Mgn>v&cOI zqC|(gW`J^X;woq^8;gBdo;;DI>{bI)jpmG`A(a}I(HcBHbyC%#LCpwW>ST9(t&Oq^ z!35b_i&})>t=630JIgS=v3uuwtQiPy;^!`)y6zMYy4}P@HWB5#%2dQ_9Jth9ul_7t zd#Kc}|8PwpIHX{7ktIOoOC!d|B1^ZLQkzCq+EP@bcAn;3;nQaKZ4*~2Qw+1eRAy=m zny3srkfw%Dq~ezihAf+v!CV0L#PrM^s*92kHBw~R`CL@54sPf9b(F4Owf7>F%& zmPA%;u~xXUb@GW;K31i3;pQp;H)^xb_9~6Z(@jM>no7@X1k$LvBzK4{PR*HWbxElJ zuI2`-#5<;gE%|a)@tTfArgfcqN>{hm9IqIJ+?#3yJdX&eNsF1_f|_;Oz^h0$Hn`_4 z=kJ{(c_h5O<1KKUpY9Fb#xO!=uJn2ziI_ys{xG{+Z_cs zCmM~?EMZ1VHO!5GRME$>A-WqOkA>KIN5mnw63x4`0W3>NVZqIi!mUr#Y8>YbsVW`~ zMU|tg)Ihg|@mLdOk*X1$Mc%GQiCN5>WVNnqv8DPOy)4Q~Z+^qaw+c&G`@$B@e%d9{s)(BMZ2c=w zu08W8xa=6a=y9ymC#T+d=bg9SdTX5QHx070IOtLF>v>86)xLww$Ay`WT8_(ugLVnm zIGj2vxO1tBDX&rc&UgME{D}LU=b^&cB6$DL#ozzx>E*MWCr(b2*)7{^HCzh5B|Ywo zuT92PRkO@iA)lIBWhjwTT*pU3Du{yTB4FJ5pk_H3<|AA)T|8ZFDO7S8=t^XnZTZdI zoJ}!{r2I-mOz`j)P_ki}*~!oo`Eb`l{WZh^rJ@dp&XhuS5@@r-RfNd?K<&Ic!*S@Y zG7*>Pr9O+N!1(9>k5%6Pm_4*p_1$|rn_E1y%eP<=&n-QmfxWjUm>|jMro{b*C;7Ob z045f5R|%*8#nex2`+udD3kfPz84MYRz*LEdEzd6uEJhqKmdLnn=uCYJ4wcxII6YB< zc1d+a1=MBl2)e2DROc-oYmq8-vIQeGB32_J0IpUuK*5eIPO42Rf<`Xm6MB!Kz zH7u}4GBjlcL=wgxj>3fC*2GSlU9~+2%CB;Iod&oDO+2VRQbU32;a7bfIPq_3kbEFj zs`Jc{>cO5T)=qKqmyS+f^EqDOsEqDoAA6&DtfWlOwJ zs|{h0S|MWTGb&6zsulruC&oWlbGqw}|@9kO`nMYyAXZ zZ0B875lu%JaEV5NfK@k58~dphu?|0iwg9AgeQB_fjF zDFpk_6do@T4xf|xrKVC&vzDg3RolwZGH$E63P3Q4Q^hI>kTIX=g6YM6oNcF5M|9-q z4uOyx&^4f}`kG~p2{6now2oF($$7VT6~XTlTAhK^h1Cl*AkW03ZNKL_t*VxZ!(X>GULC#T7i=RF>lkaO%93Yh&%~ zS>8TZLw8;Yy1C_isp2p-yfw48Obsc)8=M~V8CtO9hO|JK8?6)2H#(wJK^aEo%(5*I zBs#v916^SgVHLd)S)Vz5@%LU3_}sA@)+zZ2s^Qw0tvLCdNIN$!U1QZr?cRF;5=o^(-Z zW?U8MI-awr%#nXa2Q2T{pK?DmFJXwc8u2a>zK*oA!Z}Xs`qU)j_GG%0Z*6bp%U>Dc z`2qlMS=rcN2$5Oa@rYITxOC!9JPJK}i?3NKYFLeYo2)cdrMl!BYSkWMtEHJYwBEVP%YSMrg}3#H9;g3#S7W*fkGry#wss%LU`IR_1|oAN z-J|h1put#2%D|Rf^`jgWTzxNg8=J^eZ#E=a6sj^oLFrYag~LU>Xd+DvDF>lZ>$<|M z2)8M(ubJ&NkLUdK&JM=_8yn|*8n_}i=Wq%EiPk zE(EG-$@EajU(5haIGAE<0ctX?(jm1de!Uo;$q?qDN@CByP@0wDOahfY&#fR`S~Q*6 z+Q?b~I$TZ(aXLygwPdlrm zz=#~B?Ba517}eB47xNGiNc#pxM7(H(p?RhdFs1bYaKmV~M%Bh~VAVw%p@p%T)IE)d zsWyt*fCB4ckpRkH82J@kP85uqw%?lBYr2~x-3f%Zxz(n^Te?IKolU<8?-7mLQDk^Z zm0y1JlQKElhmXTE4*7hLZ1x)5lIap982dakz*XpT8@I0WKn@sZ6uuI4WtD@r1y5{# z?89N81J|O$qJNc}<^G&w#@s}*Dn|g})v|(FwqVKhDIHM~t!HomEiN0NHcQZ)VmNzw z7fbmsKEE0pB)LI_MId|7AY===kpqjQJ}YjI{g=d03#D)>EV!i&?Ecz` zu|gIq-4+tEAp~Eq>%kRI^FYbtTm;KA0pTk=VCiJpegu$Le{xE1D9h;2#b1=TOK60+ z6d0tI(co#h&kR404DFb@76$S|XFV+IYgzjCYLtu>)H~_K%wOm*$M*nXEKL4H2h|JH6@S zsu|o#7h>omdMm!6)p*9U0$k3Z3B;jvP4!M{_MndLFF~3l_8Py+mT;L8Q?;i7nWow> zxBk~hf0hZNqR!+{<%x3qn zUA+cpBG0vg+gwXgy(r(K%7fH3O1BQGZpyOt*$h)WC5si+Pbk^(T0@c$b95~FSZcVr zrVDD;QolBT!ja zO1Q?z%#(vpIik`I9e_Gp=GcSEuuSHpo+@b4EcGF4EvU*6!ScKzTN{f%qH-8wi_J@E zl!h7T#%Nr7J^&{uT~dcyua#DrLlnr?y#RFG#Un3FiyF%oI)DsvuNwq5xpx*x^=Ena`P5lF6`tgjdfrAx#l~CqZ>?DJ2^L?XgKZW zv%Fekks3In;1~dL+E}f~T5I>&BH%=}MMA%NM*s(3B$f-I>!d-I+m47jRkm_SM@VtY zEk7IIqC^-xD3oh&Z|&K~)}Ma@P80lCOM3bg_nGsu83ry&buLcfXHg5bg*gpf{?18- zIZ?}#djLR~DwF^OaljS65!L~Kzjlr1GrnI8$Gmhv;DYYbr9b!z`&f2<=6!ss%${oH zXiM)Y%YmX}NHxF>RYj$&4JuU|+m%CC%A~F#y4b9m@us%kjvd+y(BlQ8#n+8YQb1EX zip(;=U>?AN7?mE8IX-qfAwy$POG&epis6cqGMAyYX-XJL6N{N7r;7$OH1)m{4MSKn zkjtvr#F$z8^3pQncO_o8ynP=0%t3{w%_~yW#LW+o(3*b*bG+- zWV!%0o|EB}C;q|!k$Eg%{wf|-kJ3@KW|`(^HFyAKY+7o+_%lcy7;+%cHe|chpbHEk zIjc;Nk;<>ukcU11dzmG)zLu?ZeQl?*dxV$B2k8CPJ3Ud%f}>4?+)puZt2Zwj$Y6qr zbb5NcSiq5T)eeQP5u%^!xJ?MWocXVX%lxWE%4;PJu-#Cr(lNHIg^vwJ z>P-`(H77cXfVv>fNB2Br-l;1^7;C)&{cxYAn3`tuwId+^2|fDG@U#b)fLT8n6=t9c*? z-4$FK&*e2PN@HNYMd-p5f|-(lQqVSM0M2iY8)jo!iB<-absX21Pw5EUDJit*T52xT zS`?NIV8yExfA4uovuh(-d+4R5*Qryy0F*b*Gy5Ny>fkiI9JkBM!8y-EclkjLIw=3+ zEyTJ)&k~r9smB2NLz&0lGOhqDKY7WE0N$iG%agXfnENARD*1c!#c!QF9QpfiB)GeYsDj`KR) zr^w76y$HY)@d5w^vLpAd676Ll%&ER54jVZAuZdc=9Z54Djhjr!%+H~+Ne_~sWO=Ys^1WfS{59x=hO!?MK&G7 z4eG54BNXzA4zv6QD*@yzGPgh6v*n&EM(3q+%2k{DyVD@l{4xrfg#p?h`ti4 z$yS0^af`7qHe`CITu`K9Tb&g>=0oejyb>N5yCuadL3x&JoHlk)>Nyte$l5xvZC2Wo zN{p2HkxNmCaL0rL55Ck_OK$Ru*Kb^+{!6!RU18*ye_O=`u(qj5b|*^m|pV!A9~8+ ztNUsIQwkW>;p{=oAe{u@Bpv_|+=}l!cJuh|!&5B`%OCydM<0LuF_A3|#~I?J$lBA7 zoaZhez9gDNNuo;_+Y6PJOTo%jOpC4u*HJCydbO{6Dvr9_+7Y}n4?4T+&Rs6fDRVfU z4qjVUax7b0I(OIC>#SvxZL|nP{fbHDGio7APbrr<^`QZt$))VMsh3DCONmSPMCr0Q zQ;H_CP+^N)T7qfZNZ07khkJM=l#>(1$;%?S9ipapVNkTGs+}&ce!IQpL#6Jcr6R6| z9J{JLE=kIbq3%d@F?s~*S2|lYEs?90?0q7lU`iJZNB9e^p5k!XLs{kuFYedrh8W&h1b+f*eg;4D0Blymw7Ei%uu{#^30Y4VZN`dj7G4si(jcn9v|r)-3@@^_4s{d&=DW)u?iHM0WjRF3~GB~R_6@a3a2Jsb&qNO@Is3k}V#~7f36}ll( z3`HxwETfjiWGL`dO>PcbO*3-6`)ounfc&DeqgWrkj|l$=Z24fdgrm8r4Jm(>@Br2Z z*m^;d3BaW=&eMCTCc3zW?1}s|GU18Y-sBi73>+4lRt?s34x~8__Y*@!ML9nYB$A4S ztYs{8L@ZH3bxC^OXI~j+;{<%Ap=w1ei4v`t4;@{oOI5wd!v05PYii)q;S!ymVBgzY z{nBISzW$5?=Irs8YuB!Q_q+d40k=o(5d&cNrW9OAmf!{tz{xBp@c@8GRqSecpTH4i zN-@9;{Qmpz|L}*efEoDvh=0K(yZ_AU@})ogDszW%*+_T0&vAfCZ$)-btv%hjecLBW z7ofC_!5L!48c_fCl^OR8+{e_agJJknm{ElfOg4gu%m&91BzohyyTu;Xuez(sb!hM0NPKuG?%VA)F4oX%6B>yGB_ES>N6$*Y|m z-}#?@nmx^JLhU-f%J{sAca^}y&CA(OGQ0#&J6_*kZU^(bX(T9e{4`&ok)tFes zb)v$PZA~OboxHftZguzWUGDy;TZ%^aa@V_^+;XmWg#PYxxoIm|Bb+GL2n#s>)eIi_ z0H)TMu~piDX?fKr6X7wb3UCzFKpGNDXD#hpjSHMZcL6hFoifwgx}sAK zt_N>%qOCB!6K4_-@@s8Q=w@U=m6ZG-pm8BaMJOGU?*#=L&~B*US}ibL)6OY?^(TwH zz|++P8QVed#^D{t5HKZJnE+hFLZyMEN|<;Qr1Sf3CHl(?8DmdZL}^*6EZRz@l64h5 za?FO@(&%zuh*UMhb!x5q4zKYvlh86ERn=u9$VLghz(ba5F6{sa4mj089cX~+*?s90 zyBP~+)&cW#xYl+emY@kzuiyanCwauuHNlI_bwxj;QSxl>T>iCxvkxklRivD~ua(jp zj3j9d4~g^8+&)^7tO*8}7wTDpeJz4{w7P;G`xW@f7Vr+SX00MWjp=eYr(OYO7A=Svx+=mr>Y1@;+(jbZdn+YD-UW8k>i9C zb;1Wjq>3lvK{gFhqc|lj1s2>~$*Rn=j863oYE(4^Gj!;FopXu17f68Q07pmOG*wr_ zN<%3E$uWQj24eR}_%V4Y=GefF*^MW=S3Yurum}Em7?gi`or0P zszx&hunsf9G>gD-FV4gmvjI=Rs6v-RM)Pp8k=XJ9v=zx`h@ZFZ4j09zOvD)k67NOFesY^PL8#;@S9E!^#+ zz55Qf1*ekH-YrbE=xbKH^{huDxrV&Hmb>YkkK%0J%Ed9pVUxOHU>397YW;N)2&;WsWS;(?FjrS}u4BtC@e(lm9eodj44MYB617k<|^2w2fA-$|OSA2$4y=4tS>v0Z zM!>RW2_yy^FjL!j>URIYztR7n&0>KKmXKr%NoatkEr}(uKwcn(hJ^%ARj*!+y?5-0 zed3;bzb`YZvMRHLZe^VtCt}BrIOp7X`tYGveyA>P2yAmbHEk@rSKs-{3mwfAvbQR>CQj44S$?8Q(dKw_i5sBysqNND}Ej64&Me2 z*KiMi-u%78o4@pWc;OJg`xsyQHVpn+q$3N}B3kGpuLvsjtS!R*lF6E{pNy03QOAC&|p~0lm+7f{0U$b@wsIdoq^Y(4*q@~9l zcHX1Mq&g7I7hSEsX3rDEvi*%JO)(ilPfjXzaE6@PD8V<<$C| z8krKpL7=_OvVzM5*jC`sKiF^=@gBY*#;*Y}T>j$>X2w-1CX^D0i-@fAuO>+SFVy7V zA1ZNOgTsx#;S^OViw6KG9&PHxogos)uoL-Ih1V_;5yCnaxllnfxn!@XA7NhH@S zoFd|@T>MV)aNm-aP2571jzo-I^)}z3ZiuA_Dl{ROYED4xn01sLR)~1X_S(DN^85#X z0_M1*xgY2ms$1QzmYqe)$BKD=PXIQ1Q*A<@s#`k-GS(~TzwwR# zjdK7Xb*JW7-SC7!u|Vi4AbfTK&v8cLxgu+wii$L$z*=&|%G+{{6=n~7kEyYoKF?dnjmD?$C|{A(-;Xs+++#mi8+>VeHkeaO!$K1ZC!bR z6}xc!?k`pZra@kOyYMQmpFux3nmCk?Dzye?Mhhl4I<&hYL$AMu@2(1Z%MMyY%bC%l zH#ust4CI2KaSX!9XqlD+frk@5Ho%`ASA`5b!sAU9bUwCVL7n^>?kJ%FHj4CIRAfL2 zluE+of_XFng>1t!p!4F<_)8of)MP^ed$Yoa;|#$g^&ERD?jmyo&wSer6nX5dSxB?j>Tp>{kE8mZO<;J zzNT%{ZE4qDU9%l4wsa)hGCSwVh-zoe_?iYkA%Cw`hycYA^1RhhfEB^B%1L%dXaF)N1K)G{5j?5PL#6@~xR-VLk-(aIj6r;hE(5txi&$sAcj%6;6z4*hof|INq zIWIYBNUMngNHDIPq6|E}<1cYBtWfF?vsw~D0eyHAm4Y-`HC1_qf}z=f%pu9;l3~dg ze-ao+Rr+vZ)|f~lsj7h_o>O@7`6xZc5L)~o01o=a!gm7jYe&egcV;n?JQze3j2lJ4 z3C5)46s$fQ}#oVw!e;KdpdfM!)Uu)9i9li7&WPzsr;rds1o zK%sE40FR5{EHuy;?%l)NzBKoS=|Q9~p9U&KpT z$m>GzwLZOIj;ZFXFoB9Dt4d&Y#iE|4tE9pIWXoCO7`CQdiL+m?FEfbCNlI27MKk^f zN;0kdV=uF~g9+ahj@!Qg`=l-~K#H;`iaT@cnXJ;r+Qp|y@gdRiyaPT7%5NC(VyL@i z>6j6Ux#kI);@g#N+nT87nQ+o9XIl>0GvNf+atsOHSkfO{eCgUtzoh4Xwi%w9*6HcF z5>%z(*v4eRDM4eU1i2V+u7vaZOTg$g_v4-}0|rPg?y)4PieGDk%l@ae_Hdr230dKj z4sU57hs^MiFcZgP}H`1__jE%S= zGDLa?8@;x2K-yHtBngk_#&`6>A1#iLU1DUhH;S=Kywh?-uFK>R+n_CO$lpa{O+nILK8}$mqw6+e1}I%{fewMrFu3{)dwOtVeLnFpm&1k3>}{>WB>o;!-iJ zg}`Er>(h7d+{JZ$#l?H@cdovPLmZq5FkJc^;9ddlmGz5f8BqffFvDd+6;oNF)1pPv zDI5WnOu)N~3}h8%*?EmVJU4hI=3Wgs71cq_p5)dP1YN?8;(+q7PZ^Ci0IzhzinPds z14nEzaAh}03Bj2vHZPYh#V@HPHD(;_Y-tF&{|t`kN2e3LR7*^>9$^$MY7r^*TeG!& zt(pAx1GMZeTq>Vkj=S_~q^%YfENUz751sZA(h+@|8oJCGy-m_Biq3-CLJld~wrv#_X38!xRGZd z#9ICkVnG-H03ZNKL_t*C;l-DJ>HXjP{XfOZ$!v3>M>@I1z%14f>=Lx%9G&UBq8{z> z%p=f6(`MyyniL)Ws04DZv5Hqk@k;==b

      Tj&$q!7hiaAKb|VVOQm}HANe2PYaaZS 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

      XBd&sy>Z*v28z{p1a12%udhkcE2$6wCo8wH%%S* z1JSx-O(qRH)mhMbMvz_gJb!ekwtV!cOvuySqfkn)bndSI+~52ZP(AL=sIHc^e5{Un zH7q`a0;A2_EcmwQ#C%}pw0iaO01Il>7Dd>C9sGDcI%x>v2xARvGMzd~bIBkiNJezG z-em>quwJXHtA|2kxo{ZU*~0>x*_jlogUvys@3>D}c=@Vv`*}bij= zR!=d35243%k7S}nL<>%N44Zv_!Z&R3d@_#zmpCoSRNe23an}HPAsjXl#|3yR(!A_?P`!bW*Fy zJaQ+L1v_dy4W~L{3F|USWR~FbZ7nNra04X`q(Vs756swT`(=i(0(S?oCGSL|G0tj) zu{nRM{IbncMmS*QlSm7rwSxKkrD3yEsoqlk870f}hw`Dkh8`!G#>shLTjX2o-0KX{ z)n#2oyAMh*bBW(V_bqQf)&V4al$_17qb|t6t_!ymI5Me2`RiOMIJ-vdCv9GKQP^$N zoLJg-Ka`vTt|4X@(~ye=X#=J7tL~NX?` zHgKp8$VKMC#?*T#BC<3JdOPV%5fz2#exJO!MfB^IiC#k5D*?A_IC>AhEd#xu7LmH# zFG)t4$x>0|$ifg(g`*6iM|B*e9et)@ulxUZ?I?qk106WHY*>Q(M4kza0s}J(sXI%8 z5RKm$bv=(e!<{*95qTGTf0jRF@CWq2sIl`;5yVtNJNEysL!_FF^IpT4BE4k=cHic( zl8M!j_i*jTVee9rtn!f&Xny?yvk~!O5=w_Ifpeex6L$F05otWhcqG?3P>>*Z-_T1()q?yZSQr-K3Gd4Mgg?yW4NAz<$K zF?LM!uM$E*&&S87bI!1ow;K4ppjc4B4t=k2=mp(9UDmS+-vOkg(6NlQ*OHv*3Vuq( zpWaPHKib#lNnB6!Hv(@C6_f(yQf|R7dH|)ET_ag>O_D*A-^aAx3%LMNriCIHc;IJ< zzRpjWLkIUw41az&`LS_w-r-O!Lmt3!EbHs9@fUs~vvvL~|4ql3YQM29+5aR-Q_!~< z?8wq@@83%^qwURi*EY(=Xl)L;SwOy3O!Fs(R9>fGDz4}( zrcbWZZju?${LM7dKRWs|+s3(yc7(&^G{&jPr|GZ;x`GIw;YZ8+FYH*{EX49Sun*U% zJuaYk$~4)5-TizPAkDk(BMxTQWH0(a&}$B7lAXzGyrAkU*55Ph!jLte8B`Rx-#rWN zoGxH~qp@3F$I9cXC;3nINZ!{41&>XA!CCxnQ0aF|&u0XLZK(0!Lb3=Ab*%$_0Lemk z=@*Rud)Ww72np2npqd?7 z8A(G>)$uZbdyj@2;jEnHjJFA;TPN@6jmQBy0XIMXHUz+j{j5p<~<1vWOy&l?>>(W6*5u;J^rjH_)#`S z+;=uw=5=!+TEtbaAFH2-8BF5CD(Hy=0;OZamIB^b;waGJ&?(i0=HY8(o?>tj&?q6O zv=}hnX;5+UlP!|Q5-lqwGZz7js}CzKlTFpKBzf+IqrDPds*XIOETSx*)493X%h=dR zG%*a{jw>2vTD3W{^)vYdW^H=9E&60^h=nAGFeRhk_M=KB#W$ChIwq=a_Jxb8!tJn* zO=%obeu|`$5VJBfdpMP|l};rr@`|#YT;}z<&A`9AABRo%lKOfd(bI&gZOOuqM%UeI zdl~$~FO3Uu$FgPJvv{>~()HzkEj3g4Fz;B9|Gu8C;1O{Zh`sEnkWSZjuS4zIby?A_ z7Ftatwle>#I^f39@wp}*)MzbW4mHPCawo#|`d2{6Z)X#6 zipY5R(c8uezJLpZB%kd|$VUm2tg%nKkA%g(;c=IR3t2d{9=Hz=QH4MsJx@@8@Fz}T zz_-BYW#G?(??oZA@DEeqKY^6-Dl)UX@u8g4;EUVQ&808+mV7P^uXtp99)z(J6E6;P zp6g3lOw|noT5q_uuekBP??LhM{1o$DfSKc?0)j~T?V}T*%3F8UpfiuR;Ft^+A$}EPd*lIfhm!tZn*<7>=;x; zZx#(4^fYYWf_lrh7HD!69W2M36j!RmE`hca;CmgZb9wnX93OBgdb5`CgQh@!<3G%WkM;hGyCN+w9rL=(p_0SXClonKl@(v%Tg7o z=sRJzVC(ocg}rQ@<>;R`g*cZ#@4g4CWds-h5e&!|S|FpKyDWN_>xcuZyEOq7JfbGJ zLNQEQxeAnGce~F6lI8*ewF3waQ2R3H1Kpa5ZLU?8r*(F!4*rzPDT(p0LzlsP?-&Fl z-~nwj1Wjbyf_szLBNlDcDbmM2B~#xeW8<0jxyHyD(WZ{nvFBwj4*0io(Sgx{Gl(NB zas6C-xXS!Z!Th6ht$4231N^Bk+HwOGbarV{ukh*KJJX`cBCRa5o53U@Kdk`ZlKl6b zs>Yx4PKZI#-)SrM5|Z@Vk0BCwxh&_?@58L8u;NTmSXvUf`f{*8`l^bJKKCn=SX4P3MJG!UtQxBcGiX$1-3xSFoSJ<5tqcEl zDd0P}buYhm%*)p*PK48otsf?B_-fmLslT9ft(V*d8>IGv%~dlc)t`))r+xY*Jpc3~ zF41Qplr4$BB@juD6!o{dog+w?qX@@Q9yki(Nc)I^BQ#Lb{6(o>XPGciUnpwA&RmEq zQ1{e;gXHm&Ui67I(J)W>2L6lk0dsb?;3w;%kAr!+MI;-vg062>L`J>jehF`5koiF% z-MQG%z5S041+7{SgAWn7`$2+E3KTP+pA94%g1$@?q?u#fxijN`e{vJ_Np5HFBq!w` zV*ZshLyw(FQmcOU^KN;oPN^?eGK=FbqgL6*p9CHBH$_daU7KorF;hd;mg}TH^rfv^ z&Z`RXCgyP`jZjzo%ZHK4C>AQaO!US4;qQ+wbeIOrww%Kbrzexsr4vRklxsk`4(R6R z{o2ob>A6NmKya|hX_GFeB;ZbUL=I>_K$R-w0I7Z32b6`|piB@NvBg8Lw)^c|!2%0= zxrG<6xn`KZ$hnH0_mhCd_n$=^S_3?^#F?3t;ISTQH#Bq_rLg*MGQe3Vq6C#@3@Rm3 zCyxsQ-Q?91b3Kdb0_}i|{8dDEP_l-c#Y}wyutEZ${RNB|PV@x60C#QZGb|1&DZRGD z#e|8Tq#uD;K|=E|JWlVdvt-rWZag3(=d$cF{G2`&2lQjj<>X85A63=|by9s1DJCBO2~5d%H9Kdt4}z+1Ca`Na(`WoauueHEaBpKqNl=@3UIOfT$UI&6>z9 zq1Ih%px>Pro;yB8luYlhy5l8$m4dCyMYES;rInfk_E4Z@T5x>#qAzmb1~Ub};zTB0 z*=TCiy(OZmwi^o$=Etm@DN=cG zhZUt`kag^h21BC*tPRCM?FzVK|CodtMqDwT@0DhgP40fXv}JgYd;nutTSmxoy#>*? z%fk6+6&+#k;N!dv9r8p<1lyoH50C}{=Kk#`qWl4}3)AYmkkW0umC-T*qmPe?>-Uy8 zE)50LSw&SQ@iVK_C6TnxKK)l_=M2JMc4^dDaGh;UW(g8c0N~r7ykA1nJ`iBve{r;d zcj&+|L7fprJL2}T)dq-wDC0>y!2}ocEp4H@_bYN0cK`e@buI05iyg1xF6Q<6%1UNkR<=&s*!_!>^QGjt=9qvu(Pj-0{n7CN$>xEr?e*Vbjh_g6o)w@T}uS=YT{Bmv)_v z6790S75x@=a+d3@XUsgyjb)o+159dJnf!73FFm(jzsHK@J*-xDHw_F)HntyZcDX^* z*E(n>2?MB)`Xr6w96h0E_i_r)g|`PPM}>ZvmyFg{iU>mCPD~;@G{Wx(!7JpWQ8wWC zUSNRzoYBcyG0_x{1_pzdZ<#JH^{J@a(g_2>d0JHqOeT0wK}F^59%Q!U4Sx=K#vYz7 zqi$~hoZQ>4n5=OntB&N2dOJmOxvo^(p>M(rTNKcvmwfA8&#zfvAB?QXG~C53Jn5X# z3wi=W)1QFjKIp|`mQv>6lf#Z)=9{ps^=iG<;zNB0rslT`b$g@>(jX9`$L%HLJJ+UsYuIyM*T;2qR({_ zxvT#sO@B^vU71dFj6JbdYLM;FXwjKq-?@i>7O`!h8%-?u0g7_#;Ssg2C*+XbINF3Z zW^Sfv|B7-Rl%}5Dr{3Q$tbn#^_$ViQJhfL%X#9`>9#6ju2_ipRZtW|$2>v=Z>wwgG zG5@1ac<&v=0;s#VTI);JoWRC+75pU8T*^I+b?23s;|Deehj8dk%!@Sj1z>8L++Ku7 zScT@l$RLzs_9tXK3FU6c*d2L3(;k9!9;VReujBH5KK!qqeQ`X{>CK~=epMH8EVymH${Q0S&3bu! z^6Gi>(2q0A0~hP$1wd$b_gVnuuaS&us5^AUr|D7wN9HMu#zny=yXe5$U;B4X$Pt;h z=!&)BqB^Q|H)m3kpTL*DKr#hA-X|jIPhy`@aA~qikOy3bPy_*tz_bh0e7K*1*TwVAm8$liVg-agzCPtzW7ro() z2m5Tm?y%P*L_hq|)cb2^d2PJG{KM6Z_p%zA=AnAO&h^7v@5)|DAUfqkks0_SlDVh+hUlfFB2%z}mUzyiniZfXOeSa1C# zgP1iK5x&BrE9VKnz1KxuM`k{X&)hw^P)hQpeo!dAr_NJW@uV|`sXL9b`S6u8-M-x` zEuM9^NwZ9^Vvo8_k>X~)8CF$4zgB;>!YJ}n=7Q%%7w>;_2(?8F8B3J?!BPLIaV-8o zY+JKmzC0AUJo=U^dcXtwwC(dWyyvMs#;kq0J+7$g=)#EmV6{)>QmH+^gZXKHP9qUPmxZk{qKFuFoC?c= z^~cc?f`6$+Cpo_g_8UA&NtH9efy9 zN?gn4e*jmb#8#1pr<;*_Ti=e#XtttljpdgZA~X8mS`dwgU^c^vCBE=(5w=f zj9GiPK9&gH`4lY7Bv8LbRMAf028S3*uXO4|xPlvcuI2Pkr{CH7N+0DHWx>Y*_|FMr zJerd6a$q3EQHT4THnnZGxT&E3SVa!?>w&gx4p(&w=CU<6GBXS1G;$N!l01Vk`Mij1 z(M^U`{v40ZGnA<8FIpApOyRVqZ60#$6wym3v0fn)`6z6L7~M3OwUp3E_IEocE~D|8 z-w*E3X~=nic=`Y$oV03=PEA+V@tiX4lmMqlhrTA^T_nVD&w?mlc2qQ8IJ7bpI-K1Q z$TMgpUw0qBa&{khFj^`cTbEyrl(mey_cx{GQO*zcqsPc5eyxe6VZ4E;Mi zbJ?ZBbX3)yR84L8kR%GUTJLuBeY^KQ5t!##oLH%Q#wiDI^B1*pUxzYYDs+$ZA{Md% zT(XK+uJXCNh%jNGRabiJQKKv4e&!S47OF0a|G{D!Ou?0QA65m>3j@dVF4xU9BqT-= z)<1IzHh%eFeLcy2$DaaWDhK*$h}>MM7`Cqp@Ubmko~|Lmcn=UWN&AD$8*0N@2M|6c zp2(on)JIRn0}%9aPeP@xHc9^(&4?vt!Vvnd`Xvm{rT7LIR$NUoR>J7jnx6e{`oOML z8DGxDdqs|3QuWdw1UMD+a&xHIeA03y3)`tn%(0o)ZfNIYI5*SXH6Pkrx>plKUHRnF zYB3F*5=zzhV?3yCbHmy?vrv#Yy$fZQoohiFZP~Ob?Bd@=>S@25+Ctwo_b4dFkdVxa zigHloSg2NPs=WKmp^f+}*3nANRN`Ycs9xTdsa@5=ewoj=!Jc2{%yT`Q5y{ontVhV@ z+1@6_{46f~5_JM-PJD?XcdUh82m1QW${%G{5QN+fMsv1Gxku`q*Y(Sp;;?`PkZ^?W zTdwQwQ100}I!1W9bBqZj_O5#LLh57zyDepUD zjLq;GFX5*w#e|+a+QFRGGS{R7ymedv+{o(wH1j|U+8P^?{+*P zSkA@>8XejD;$Fdpmy`{(djiRw*NP3&#*Rn@d~(o=Ko9XK%=k?aQS?iCrc`r@{q$x% zMz*t)@&Ng>t=^Mi#m-cbied|l1W><5?}GF(M2$mtQO#;@NCPVr);Y=uCM5by(#ugQ z(*XmgP}7k$RWWfX;4M_=_BekpW=~lCF_>q-(S!Ug9%!75BcVCTl~ZSSubMJ(BXAM09{f_^a^FRCk*ejUzNB56LGN{j$&a?TfYZAVF2f zNEQDTirY{nWg2Wm7RVfm?3;)rjm%!?M0kos52a+EVINo{KTufX7Z6W9$nO=>JLta_ z>#)Ym=}k^}@UuQb{vM&~2u?BPem7e4sLZt}d`J~vGhOHLD601AS>?OIWK)1Wt}O*A zu(ykQ;QxK2QSK(*OGDY(APGMwL?;;XvM=v5hSx{5J5r)Id;aQPIArh=Y^XC-nuCal z+*SV346VCAW%U`#Ub!uWD|AW?y$lzAh49@2S7}{6haB7|qqLQ{%LF?5-WZ!n0i>lG zu6wftup%5Url($LhkIj&bDPuFTk?J!T%va&Pzi3PVpPKS@b{!wa15)kg^qGiQX035 zGapw2T!gpV9gTQ6cNm!|wk!ZdxPG51XdWs(5-$K^?ifz?OoSkQ%YPuE2~1e-!2;pk zRH$0=Xd*U33@WL6>c0S_PQZQ^d~w4O!UVBi>#F0RC&#^I^E9gx4)5=_f1Lx+fh#bH z_Adp4#Ap$@!8KM%ML4E+Xs}5{-kHQr4$ezVN{Z?f+y~nheT@Z;pO2)*^Fq1b#qpdN zdL37}WgR058Q#KC4{sv+1C{)b$3`{XOqbi;_aIwz*2TkTkiYi|6|iChB*OwESix8F z{9eIyQb3v^?cEDqFuKD0-{Il2{GG?q##fkY76p1*-V>0AEKkcH*# zm{z&dZ(tNmAZk5=?YMM9i>I>5z}|ccC5t6?Et@69j$CEd#q7n69K7aoN`_lB+h8CAtqs3>Ax^VYp8l*>ENSj*?B`NLA z+f$-5o1Q5F@WbL!mKK_Wx?2Y)E!L)Rtg$_aw|Cidtd8CLdRL_Oudfz_a|{I|kA)o` zv=k&h-}nY}L(!ut&?7kX^$b{xm)ny`tClt!Ao+6_^_ago_Nd-(BvyS__%2?`4GrIB zX%Hv0o_Qh)m@z^IiyF6n z`Fc^JPJnN4=57`7n8P0Jw$z%5T?;hN-TLSk2b{Ct&?ytpyKyQ9_m5l0(P2%x56NH& zBMySO4%_-B>ONy-bL>f5s+5oP%z}MYo~4e|s~{STh;Je6ny*^y4b#`bVESC=6dz zO&CXK9-fZLE?LY=x$8)zHgJWE*GAAtA7acdE91f|PEI^GPbCB2OOf(Rzh`f8aX*Ug z2qAATa;zh!7#q*_t<~!e{^MO6r7L7CAQmc^sNeOi0wQ~)n3njqB_y4d`@0Zc3bN9p zK4}m%`_ofv#(jLngqXjOVMTaE*%uiQD>o4d2W#dkduPxsg69F%u&EAFrJjswx%q7$bu;QVU+S5z;`C?62D+{XEn%5`5M z1zg)j*EN1n6a$$l~2PEPd8#O_RV+nw(j}*O5c+&%BBE}uuV~CbvhBnuOi|{IB1-@1`+yF zE&fbxI^NEZt7qB}rtl8rAVHpc+PL;5Utvu6iD9MiA7OBkFt$0)`mWPV^1W!Uno7Na z8n`!wLS$qpE>QcU4^cr|Y_v0Hf@ha(-R`!%hulk7XzBlva29NBFx?gn?(QzdDei^h z?o!;H;O-Edwm8L$ySqCScZX86xI@tpNbd7~_dm=$vuB-kwgfG8({GaDuRN#hiN-YD z&r#QC)P`eNiytn{XqCr3<6=}h(Y9S8|89Cx`t&O|gtOmt#N~z|Q>pe3VAB$a6VkRg zea79;6>*<8yAvbFcfh|&4s8~e4sW$c3=!dwltnIB`yC9nex$4VSL}Ghg4$Qzc$b=Fz5c(rBw-J?%#VG*oV~TRjhKM(W7D?vKeeYmy zWvh;B?}grp;4346BCeFtg?6&e`^S?3YKgjcb2zm284IiRaY72oKZ@66gC1XE2vKhr z70g|BiL!u(Uh={``w!}+2jdT)a@;SAEzF)OkYVCzo6I#+-9D7-Hx!TC%+K{iKW9Jr zorwPzgwNC0veAy>svCowMbe@C-M9mfb-(Ul>zDwt=?^JAgmv>I-_uCesfs1k(skN@ zM(K|W*OhE;*x6B+{Ao=8t;e@yz#9eNC{otgx)rb3rn}+gu{`6SxbGHjeh{lD^IVVl zyNRw{Z)Oq(^h$NAz_;O2HuOl}Ba$9-uhC55kpXbb)|ljWPyzHjer7M|Y)PC@mtI;lyB^JPB#|Yw39pSUx^wvI5F+CDx^WuOJi33 z^AW|4Bd(-Z8?RfSY4VE@$;wRZAHMq~38;bocJr<)biDrc%p~H`dkZY_c(xlhZph&@ z44eU>OP*@8XuUR*YS==JiHxkT4^Lp>?K0ONF1}-5fxxx8_cY%N&17IiiKjFRu;lgtEWi&M+t8-p!(7*( zALJ;aNiLjryY-v0;JUlO^Bbze)8Q~BMOytz^b}Qsx zN`FTa-DVI@t*xJagD(wo{o-9%ZK8=HwD5C^mmN-|^0iI1e?E4wDfga<0cnJe>BY+4 zCO0*0`{SEp_F4_9WO#=PWl#-O=s;$Au@Nj&wJPf|p`E|wDO9OX`afm`1l_P_{kSxZ zA&NJ3*iOrO+#rsKQ)%&}Z;kF~z7mv=^YF~YZlBJTEM=a-lHD<9gr07qe411FC!JY9 z?MomjF8{rIoRbxG&;&U?36LdmIi2FMn#;#)W?=(ld~%1D)*N5$~rAr}sU zYh1A%H+3Mgo(wpKw4q{4W<4(_%z!ZV7+ttbQ)&%mvSFJ~Sy4)*-=D}EbMHH2QWrvI z9WOG7gx7}dbLGnzgc4}9v19G zh6xf9a&tRG6XTNV09hW+^(D}4DVf8TmK*?)RVdv&{m@aRi!H!^Gm;dGN7=&B0k&8> z-lXTD_%|>e5ayRN%cjUSP#O@IXh;|%7!^hO(?ZXkSITp(2P-;4DY`dFY`IbnS%g}} zl9m8 z%%;yMu6DBzS(E{K~TmkNtvt19p39s%0z7PT_yG5V#}-1$7HM?kMgR(n`m*_-dqR@3MCex1D?+ zml0LgE%Ji0!?L|5HGPxAjj2Lvy_O^zbYqh{T4ui#T)sV*|MkCux+-J%li!2-+foun ze-QzHxY|J>;1$DTv^fxA_oTK;eZge#=Wk#)7c+r^?YH$8EW!HfWWz3ppRV4}`8Znr z*L-9FSP3`hRAy z*d1LQw_;m3J92lk-fJfe2Pl9YoWd@Y}3GUXE3OXUtHudUti z_F~dUG}qVrW5v&ayiOXQIObpenP~h-bZlMSn+L8ibcV;Y<@+M)cD!PFmFGC`u|lFD zwq-#6YY@9u7y}Bu?Qq)4JOaLNZ>Jy{sYQr`YWPE4I>GX1o{@Mkwz}kPg!WlbJU4JOkJ8DUMRn=hT0Fh?-(E1S{GC_j_P? zCS$63jYPrc2~!nosm}fC#ZU7m6m=K18o>jILOb6*tnc-+x3RH8*GZk;8FzNBr;n$r zA%h7tN78N{&>v5@2=P;-g%57S$ze|IWQE6h`W@Y z=+RrO6;x(ow`-*XgVJFY?i2CJ*G(`2I||Ur>q7PzW-}b#+iI3(=jtIm2-ZMAlRjn9 zIsR&HZv1%jEgnk~gSfUjYs}su^UnwW&>k=j5Q>tg4>yAd){M}3YJx384en;AApX+s zZK)-M{DyPppudI&CIfesmlaZOq4z(}_(&WA=oxWohqo1LUS50TAPxLRfO!5Ta-%j$ zUj#s~3kd)>+LBTmFlhP!8$V;z&HK{)5kHm|SXMd`#7bp8)FFT0~mAwH4ScNoQK z6u+d7qEe`Vt4)5)*_V5ID*3{TmkAx8!1XAQiIyOTQs$zbb^88_?ZOE&?t+GfPl{}^ zQkBC2z19X@g|(3%Cd?r9iGV)Wj-}>1Z(C8N7ZE-m(|DU~1IJv}EG=Apl;wd3z)*D6 z`8NjqOIKG{b{kj{P^?ZTT>4C`!r>h?_YCy8v^cdIhfKaIObOXFL^cV5>_Hks4uM0o zK{N|I;#Q&Np`3XP1xHzcY{OrqkjHXLl!c)QpF}b$W-4nMr326lxX|bRChyJPCn4;u zuPjvMMq$}ei=wwsry&bw`rcs&)lvQ+WHWIzQbx@Vxzsy>ISVq^%dWRXz9TsGm_!kESXgMq#H{ele65H4!TDz*4Ce9;!#P+|tUJKGh; zwR!u{Cp(ljmT5*RQ$(cre1GilVZTXQ6vdL~gBg)YqpM+`bcTQYuOy+ zQ+kzFErES>1SzslwW(MHBD}075pI%?c|CzAlQ1!p9vQ#Wc+=lWjBZ@GPXf_!M(-By z6~pTBzYWfMD=ul6{a>4^hjVBY^g2-McrK#>pgOJ|2AEj=_x_SkXbuK*Q5?WG$eo1> z6DnM56s~zv?T%SZZA70#AOA$Y`1ComG&*mW_<2_XN|&!v7~TY_(bRLf>8u~O)R)bR zG3y0z=$K@3@CI*%(`CpM@Y;4K&?KL!OrQMpBF0vwN>*< z@$_9zdD4lT-8X0F^bo{JUB&h5e`dSl63}4NWbDx?If&y95g0~%43Z0{w_n2f)PWsh z8_Nfip%B~m=WDynQ~ID^x3IabJ{&?Pd=Z7q2B`~&-o7lsdGNzh^e$n9gC5qd2iS2# z0jqzYT(k;hRnUkrc`I?d;v1Eod+UFKUVRx&@CtUb{M@Z)&s^UQg4mgnF)Hg z-t*DcH1OlKl8K9w;F*yfOf%7tc+gaB0@0L6waW2e9Op9o&)c~r0Y`b*Z0+X{7{S0Ev!r{;ytiNu&twy=Ag>iM>CUkcdm26-zO-Sv&-Me?0KgvKj; zbsi+~)Qa;^kjRzS;Dy9n$T0zVHp`Ff46J)B)LIMmOE8STb8k^)_WY2$@>ZZM7|wFT z*Yc&szN=ZLHK4irnpqGg1JC{z{OD9$emJVZ$&4MrQ!uevmmvrsC*(E{;t#V7Lo})V z1FKjjQ)Si(N@}NO+n#%u=ziqw1pj&Sn37Sf#{$3;4i^3eh`pYcJe-{<{d}d-==ib5 zdOB87fBde;kib$9 zJaHJ+$%+nF3_KW`_Db;qky&*TP8&(LB~H48UQTd19NFt;MeB zgePov9f?)SE4-(FW(MjSZdmq!GbPJB}cUd6pn4%7% z;RtnecG(aewuS@+`PK<$M_j<&1S=YD%6mUoO6$q5--rB65`dYCPHJN)$2BKoIz@C_ z4bdveYH%#7>_IuBv0X5OQgacnJ+ft$uc~ z6!e^%?GiKmqhUIZXs`ust=heJaSsiUWG(BFjVB|z<2PFI7tOuZs4WoCN}3=zKHCo{ zz4(Q~+ITI_L{xZCnCbAWQkZy>3yb2B^QB_2$tG-+^RHP2GE8r(F707wyMB`f83)Yl zB^KP%cL85ayT>T`l9NAA)9~#Y28`|OxC*xOBgoc>*NmmN%0w%!>S+y330uy7(jVd< z^5IWL*$UF8Lz1GQ;u4e}1j4|?HR*{eAJ>zry49b{FJ$=Cos6w-O>`OQ;_DN%##G$n zY9q|r9-X4$;1(Yh**sY|nJWZf%mjpmA|YhZqNB|2PVb$Iv8)IxHd>=i-7^V91I*kX zk%2oVl5cNG>K0GKH3W`NPtVQg7V(K03xxOGL3BPuzk@FfoP2thD+q@Ic1p0ava>>h z;C^RbfG$op!8C}nc+bp;iw>%jyg?gb&T&V>VO;D zp3=71Gdf4nE#0$ydEcADIJ6Q$418GBx9@dm-avq;ik+h(Zn?Bx=ix9C{C7mWQ8Z^3 zz`<5`UH_$jVnC2a2$?%12N@fvqe~!jhee28Plad1)OJ<*$j67J_m9Hs3}I^Y7GIwM%cGvwjtss2Zn7hd zi+0M!e%9AU6^r!)Xz%+Ej~0W{hm17cqE_iJ!9C6X4xjr1jy1M8iSPj-!H%U6xbe|& zMX9a0Hu&=7H3Rl#Iz9&6ZV#!0)_yR!pg{=kt$P$F5qXS$wK0^d+qATghRT2vvGAVu zn-R(1p?X56rWb|r9H;C|)U}{G^K%262{%)$v+F9;^aZnzolO%0wt)G_+y%v&OP*9sgP z98PgL7U|Z2OUKrhWK=)kbNbBg`=n5u`fVksJJFBoA~2Dpwm0mH_&{8W@Z9r1gUQp( zEBAB{cygPn&RbF>;z)=1AaJPx#7ioYkV5Bl_5(Z5wh)~(Vz^@vLN%XPR^MA_C8x8{ zfRLpp%&>CKRdT~|2bO*O_C#q_U9U?84Ct%6$6gP*+tM`%Jt7~;3lZ-1BsxD9rTW3I zNcw0Uc8dKZEzxSXAiS(FI*khq>gKR`b?_BS$&A3aTuF?*oRntw?2V-aRbGFWyeUljV&Jj6`^1TpO3dXk0Gpfk@5NP`4XFl7VRhE z?B9Bshj)v#zx``FehFQhGdfQ-k?j;D_|`u=EFVaUfi4#6PL(rLkt>ZkPE-am*8JYI zoCQPQq;kj)m~_&RLX*kKM0XFE6=KMxUr!{yFBs}$pdULmVQ`*8Wd6!{)l9uhQkW7} zsO0L|z|1=h=MV|sABrqE>_{t#5+#wOhpKdm-56lUK46bTCGgy8mffy%Ztx8(ZbXhN z8R_FVwr0k6VrSKq@zHh=(XEFDf-ejUQmf|!nkpM2n>;|Qcq#3n6kGVIwBPmrLS#W+ z@V_nIsr^NjMgoQO{CDV+2E(b?b10|}bsO2aDuQ6+;G}v$ECgsq_jPsD8jyPpop+gr zL%#q3fL`~o&Q|>-){L9?HItX?$hkaGmEVB;faB~-f7Um@$9YArP^0I$SSvi<|53sk zV)?CPo``bbqN5%81GUEYR2)XY-cb4p2Q3ayRH2m1*I7IrV@ucgrhP2jE2LW;9dp(a zKELBB#sIo9Mh71yti;4$x3vV=S1)RpE_p}w77U5-%u^8ItKH!&aYA}c2hA%WFOJ&$ z=!KY!obB|+UoRg{SyN$*`*l+$OB$p$GIS4;xuLp+L+RHA#nmFHT(0j1)431ItNQaU!rBgc z83-YQFbu62kd?$wB&qwegl0)bfGyr=5JD$UI{_B!QZ4nTJpGo|5FI~^n?Ii3S}9JT0w{?%~B7G?cQ z@zy&Wii-H_M3vdOh-r=SWe&9xF4>S+n6*4h7>IN`3p2pIC9|I_5(29Rq-m4F3R-BuwTOc1rkpUPwa6Y7Xl7pD4Pd zmW)ntDU;{q#1f**(=?YSssNIq#nP4`w^Z7dxvJ9Ud}#&q*xDu0_fEl~>1CYMJ|BkU zarkE@Kl5B!vGw4A-Ang;D9bNc&TZKK;>C~U@CMUdUtKbZ(8|MWrtZ;DArvgJ$XN<2 z($X{e0Y6H(m?R7iyszn}0y@AMnY+!mzAaJn+y2`!4}MRkZilZzn>+6k!Q}PtJ35W` z-?#>$Kjw!#7ahEb6B_?;A6Gx-RIagvq1H{7E-QSSZ_^l+KQfb3k-0&XbKje)PH0^D z=;QMJNX$@_8l4-n&596L?Sj`bp?OZq9Hq|hN;O57qSgpBbbgv>dnoEe#?`HNCY*07 zhVwH?0`q?S*3|Uer59Im;cXV!8~lMv1{ZCpB=Q(%e0E4@{gF4N*G?Ka^;s@WIFKNZM7lOc5MO}=lN+Ty-ZM$6f})LTE`*kTo%|a`(|oTosih6 zPH1mQ1?90JLF+wsZK)P~2Jj8Vs@Br9A7=G;egf(Rvv#h?e`peICw}n5-X-{9iv=&e ze5JM#{7Yysd)*`kjPNY&vmd{$BNP(+65Sy94mq;J44p)T{W_8^-i>wc<;c58Oyp`w zbiYtFgtdagZTAhoSM|Ow*92}ulh$X2 zge=@LPl(iUbM=2x{OoXno%pgeAQHMElqLw5Gr_M+%YVG#!5l*Zpm6|{*J<6_rW$0( z-ANX@B|&}^0C#2^SUZ5?OwAZ!GFT{5YrAYp#dUpD`k*Xc`2@`-YVBl9lCu7BW_~kAbFMof@}=4)l>v;pm^Y zF3Y&f4d%41q-a_AK$pC^0pm`tzsV2z(S}ed*I!~=-+0mcG=4pT-pSyR6lrTnw$@0E z!mu6paB$eI-8X{$9r2=-m-meGU~gjH#s-?7HNCzKI+Shh+qzh&HtuDfg$%Dzw!>B^ zEP4XC#`DHEnb)CRNUi1gevKkowW7z0kj_9BM}uT5jl1RYTEaPh30U;hn2u-JnO0p?wljETGu`L_jTF-8>e< zylj?f-|^mrE@axXKwiRoQ0X>vgXU;2ngnmsvZJ&_@^;pjoj$s3LC3kkRoS$mDdqE( zENSD$=gm3oWj)u0air?>6oW@f4pB&yYj}f=fwze_?>N*T7Em1y`zlpNYru!AG)5}7 zb{oMnqgdT0bG3KeA-05y(QvKi6jZ|>v?n&xfAQ$v57v>gI}s9>DJbVjsKrxJB^!`H zQa*1 z=n)GGm4u{~SD&6~`y1fQH5<1Ar`h$oT`==BS;X&|Z*K$y&CFh+lY};JFPQdHlJRs3 ziu6ML>|?LT7sEGy)z#HGhln(RHS_=pz5xm)&(_^tAse4A_@}kGW)})=^C3HKbo(&* zljfTrHL%-`{c{NzL)10`*)#pukJweNoxX*~Al|%erxbKP#&io^lDcNxTj_yzyrC(X z1QG&<)idYzKx*GG3^T>U4cydbz1B>vlb}zE88qaro(GROLn_dJqHgF6+ph!-h;wJN|!LEmvO`~4aFA;e!m}SPZ zRrdQ^6lT~V%Qa??4&`?W+IyHd%Qc^@`Uf^p1H4lEU~@6lp?(W5 ztwL76N04Nh+}pXgnrFe!S_&{(sc7d ztM*1!3aDw_5~`2Z$(zC$%`)y>1uhP@q496jU4nQN?(EcPg#}Bp0Cf!t+{^xf*U!wn z1@nD395$qP<_9EQqRRgYMQdV;Zs z<8|>q4k)y(d|mFx1-pzBaw@>=B^JjF)GLQK|4DQIAcV$VJlAwwv7lQw7_Au0YXEH> z`kOf{lL0wm!&$-z6Gh+v#nk?d)T>j){iNg)ubPhen(mXO@$(OY&2iW0hdc(0a)2R~ z!F;bQr{>lKGzkE9UJFxE?n!d&*~>qTck2!CCEumI%(Zb_8T*%^83pBz zc#Py)vcb09$Si8g)7I1Nv z<_`TGHiuAq28k$jpTzDWudd~e{T%zd@N`ZCjAjm3)tKR66;3XBnRPO98Sby6fcscj zbX`a8+^B)hgs4%=VKA?x8z#kGd+6#7s{k}7(8qvrzQ|qeS4%nViPQsj_Wj)6maGAU(Tz%xCUOib`cc*KMO(Helc=Zs zQN5@kPz2#10X72u87?zz;**qJ`&3yfZhqlCSZVdall9MQMKt4Tgjh3@eb8rKzPb#a zi4N5;h2N|W;w!>gf*8m_w~W->Ecf?rSRrBZioZyyu4$&+#5xN>dA}2KL@_YQF7K?aSfJRmkcwJi`S>kh_HLGJ>;8jVqzdRH_8NVE zmjHc$3n-a14LU*KckKmpm1FDdJ2r`x_CGtd*#{>%S*9hRSPXIk5Gr%3F&hk&jU?IG zxhH(?n4vROBbS5x`JJv&(j_*qljX9ODO)^$?$MiOaP4|lSBkkosJ)CUCFh)aiAtVI7fD~xBu4c@V{pC zTJ!FW>_^kL5^FA%>ZgaJoXq9Xs3M2Gp9p_WSoftP5Xe(aeWEYtp4vp7(YbyR#y9&x zi(Owk^3fL^Iy%;(yyuu5OuSjhxn%E{?GwLHR%fJ}L4vN2_O(C$bU-vAL0kDCHWU_X zGh7)W>M;}VrsiWw!5MlxKm0BMwI@G*yvF~lxA;`x&jAPLK*rtYzXKr7iJUI$bHb$^ zY)vLt#oHXpOM4T&Eaq&awVhV{!khC+dJIW7Cd7P4-vrNOui*=?4+^$l z?}V@l6laZm*cVpl;OR53a!P1Fk?9xLC-cP0MH_{yM90ks!43%T|MH)`L8xOB#;KKu zMPF1I0q1$YGDzCm%2jZ&*|ylfr2&mV=hnY9;2$))nPdMo8sChp)_D~~QS8D_TGbrMF&aS;L^_L=Rjo{MI#-bieQFYbc*9Kml#0 z<6LLJm8;uO`7U;I{=eC>Jid_t8B0#kc3w5=H+ZU1OIyIkFK?rNrhIU+mN~s>A5vXQ zH`HhLF$a&w91>4R_*+N}qVq+K#(`q@wtLQ3b!kwGM&n-s*$#fL z7CCpEY*!zCKrNP{8*reZ5uS`p@sd0vpMALEcHTHQ-8VdXBXHw~jrQ9iu<~u|WAI%~0 zuWO7B4Mpe%o5Ht+PQ8!sAZsrbO(Jo>Mv(iTCr}Ud$_b70wq9Y(d=thJbiICfr^P&$ zZlO#ivpH1le$$-jhE3BVooMjW> zv`XKoO>=KVhma%6TNRCYsnjxf0mX?WDjYa5zYC^MZG#6x5&YZAT}e+N^CLzy{0AR} z6hBdTx>UGSUU!tulLOpBtMA`O>P9d*JStE z<*xnkG=7ckK*#8d&>@oby}w=~-MZ^WgBcLeL(iTsUip&j1;sW6)@e&x?74m}|G4df zQay;{UFUb-8}s&_WOyK|bWVFyq6^l*%J1=9NnWQ|;|*BF@;4i!g}z5x!`ngDYuM|Y zV?GQ~P$lqi%C~9F==%TSEI!7+ZC8NJu>&yOQ(iHpYn(a= zGe$B8E{wT93j~jHK7_ndY#N@`YFrBT`za=u>T40Ju=$y+g!yNO_P5fYn1vsvDBtK- zoZc(!KNVR>8{0}30okJbK?A(h`Be)~q@8f;kQ+eK7q584{=zW1S5?mr$t#f8;$gT~ zg8M(}rMKM#acGBhr5t12w*g4F{DB{FZ>XL?lp{^!mmvw8k}4$MvkLpUB8wFtGfl8h z9-911T_Ss{mT)HdKCCfYN`@qSg zd(YVpvb%wD*n|;+9C}rBDlqqhamNPraWot=Zn(YRcK5~l6at#3(nYI57XwepPu{{I zsuNm&E&hq*oydNQrq>~BQc>G`K?JK43R+&*S?9X_j;mUFHk^FPaw7dg9K^3xc|Kao z0+rHiFkJ*iq=^d)xjV)eNqlOo2Eg{oA9!%xCG0#@QD4?WL+t9^eDM7(kh=zlI`l94 z3gz%eB>&mD7V~I2+%dpcjzYexXmDDhyU>E{mRZlK-Cw|7@b=D5`Ii=!v=6ikNa$N1 zEkz6j#Sx~*CEh~$;6+hbZbHY{EK0flXA@QE+VRX>Qf~TfkNDh=%k5*ib-u@&lbC}3 z8NSNKAil3L;onJowL=!-cH2yvp#^%{yh|VEwXLf|ZlZ$}RVm%(s3;P53)2l*&J7)Z zG-D|tIVV|o?HhJ+aKHo7j8Ir`J%aLAs{TE*M(#D}_h+*wmlbMTVv!iR1;!0a@P4!3 zeN1piYwJi#2!(b?qas@D31Lp9^B>nf>eJGq@mN?;!Bmg)7_$zMXfy=JM912xxdhl> zzp?VCQ!&Z=dPT+%{fw^;%N{e%^UD25$saNH4tfk?;XYIpl79|?bquM1F6ZI+EhwIz zJiEBnCbUB)d}aU!F@&c%uss01l&U~PE4<){>a4vW=R62fv+uind|{4m>7-u&!APTe zpjP2Ldv1@&Nr0mzj=1>h`GV2Awny6G^#-X!%_Fw4=_b0z%EkAVlEH@TfiO90 zGm^|_O>aP+-T_Yh1u=3p$v7LOCM?ZOLWBhB^V4VgaN7Rs*F3!*EW&EDuM=&Gge=Y!YMX*-=1p)VkmD z`46ITb_xQFN#l+1hkDzsVJm8mk&kO{?1Z6&{_Sggd||gJ{aJFq3uWp3 zXAi~U4%rg}W;{PVu_RNX_p6XGQ&Msz|4}4dP&BVhB!Ksm!NW6&f)AO_sALXsabM(wTq`oNzDNb zrkEri2oaDlZ3P{HM`QsVMcO~~cZdQAWSHuIPb|b^A>t??7AzSD6h>kg!Ze90dt(#? z%|72`OO?QD-j!k!zBIpiQF>`P;(rV?4j7=ma7YTL9^NDPCsCzZ;}${Xm(D|aZXX{= z`_^+}Y=(vdJ%o&%LMvoRNpFXfU}RYX;3I|^t$}IC9DJj2dUKO?kCz zZU!-Yc~hEosOw(K^OH7ZLbcUwV`nsXUg0`6#WjJu z?C_Vw;|Us~qy-X3=Ss)=H=2L>B2z+!iIw!Y8}zC=8n10C`uc0oe}1j6zx_w$PUDV~ zOiH^s%dprAtth-}YqI;03uo5s^)pZwYPVfyx3_hVQ*U-RHdKXT#hBvj*L6u6>!q{e z8Ve!>TrKawqTvb!;0AZx(k^h{ zmfDxzUSF{>ql4K7DIdPB+4@n`dEUqwE$z4ixR{1TnmJ!~aqA@hyP#5$9GmJk&lR~C9;8?Y$_q6CB^&0}Wj&@J|OZ~d- zGuTs_8}3j3zTk@mCUPqoYF$ZCMvebm>1m%UiE}z(>&b>Ld|PC2CvO54m_)(u+P&yA zVI5Z>ocYU8$FE4xL0`!lEDf#XulXC-4$=uXx_|tbY)g#$~n%B^|ZGt%;iBPgiF0|$SvFKvwPNq7~rs39Ug?{n?)4)2i{ikj-0_l@hCzewX=!`F?U*KmyoKH+-6_7Bp*!& zLxBY01Hqt%1#H|WElP+r4!)MykV!odroRx0;PAI6dqNZI@KxF((S+~kT;a~=sL@AD zhtyRp+K%>cDfEzzA8Wuqm5UwG>_)1KTJo66cZL6+S7a$iBuz)~Bjozp^@7^eJ67^> zuHS(*vI}070firOs%x{BnBs$jJz5O6uvP!(K|i&GNR3oR-vakFv=4- zor?f~;=!jqhb;4MlGozjqxa2gOqR92uc?|)wW(4PJdJL2&gj~oEOX%e- zRgk=0ifxa9ju&0w1wzXU{x-e6aU_D~FEWW2ToIrUZ68>B9gY^_UzW`fA}gQxvp1By zXF(VpaHfhfQLLe!`MiEzXz`6UjArI_76WFmJL*{^u_RvaEe!#oE6)sH?p&KeF@?|G zX)s54oSKmlX$w5CC`rN-tA@$t3 z$CXimRs63UDrRjIUUEnpPcY9Rlk+pG3|%~2VR^mH>kVF zJO~m*833K3q=rt?gar*iu(+45m>*Ea{4pxC4~lds?p-|KB62E@yY~KkO}BQPCP1>j zXj4CTBZ*ep-rBTEzyq58#**r@=HSRHhpTmh=jGqtS7g>`LAeRfguMjqTM#oMAP|)Q zSblK%SlI0yj{I~NWX!feW_VjyVy+)hs}|V)wl6YxklXhj&VPBl39p2)2~4Gt#=k8l zaRB?(zuU8CZly^`PZtAnxsTTk@MQ5Rf53k{C-WI-ZiWj)0T4PE8U>0q0q~MPueF^$ zaxhvsJ6UoVBlKf1-|AOKUmNAR@}1$HuvJmye*9SLR>TmXHvaTeyZZKBao4t$Gkqs+h-fd27q?E`t|lHq54k)RyvUD~@bb!~p8^ zoG1}OO7|u?*kAp330P7icxoRY>Gz>%{w1exA*d^3ZVArYo*%!( zEGN(XO9fYF%tQUD#<4{Hv9~jt|Dlhr>L8qIm|S@M=C#nQJ%_dFc3SWy{>_?pO^gnT z-9(FVW7vm?fv#r=0l%qHyF1PG=!Qalh%3u;7|CEP&U z`>S%8x$_S?|N9HRX7eu5;icXa2<&pr8@|j({#6G740Rfx(fqmjb_V(E@5@3Az^Nw{ z^(z=OPnBOYmxKIe@@2-aSGoYiV<9=ADF4@(Sg5EIoaPGXE;_XeA6UF}L~ZSz)AID- zk-P$N^Ha!v7ztf;fX)Y#^dLFUQ0W|z@pV|7+EKo{RopcNeZMd|IuBrW2iw~mNAMhP zhI?Ay|Lp!e7Ea3JD_+5{J>o<&!y18Pkwb9d%%bJQac9g>0`-w8~i$SqA9>);U$}DbZ@*d3^EZn z*qbTsr$AVbK<-<2=95_n)Qeb?mR-U#Hvj4;&Kmqv(?=B@!a858C95QPc8 zlsUBn1zyxjfiAp?epr+kx}%;hHt-Jw>60~TULh69q#4kG^7NTl#StR;jm zYZ@ZxejkcxFPAMcqv`?7ZF7{it|0B>7lYlrJSqbuay>)tS<9vW=&!J}of+QV5;GN= z8VC>3|Fp<*1h5fujvhk(T4(q5I!ERa5B+15b2sW-D408@Zo`7_D%phKT|}gO_fJk_ z7EfmW*~e^omRHm4*bFA(G!YF+*(*{t^9I36IO3J0Bs2s9Crk8RGDo#d*h?yh|ELDc z!i{x6{+vk_=Vec$H+GPWK|)`bpn({E`qR;2V)Ai(q929R>)BXB=m93KQjh|<7FC0l zXnl?WA00_JGTit3o4^mMTn|o5!5xc2Z>thmJwZLijP|klWr)7EAXE#u*#{x*qgr^Ynvac-X&-lpF^pX+TDtyNClWI{gWQb_-}EM- zvYfoc!gK4{d?ei5#xkD)MP=Sf29Bj5W1-Sr(?H3cq__T=&-E7sk1-KEa7Nc;AzGRE zVLN_+$xz(7JY90riguWe9+4jrSQIjYA=CnM6167d#~pdqfbU(avMQxa9SrMLMQrY; zgtz2A=Vfez6G}dym03eAU~)-`GxPf+Ks~5ruvdB6c)r#B5H(&_5(O&dqZ;aqmH%HE zX(fI_KKd6hE}N z5!IcvI6b=We8C%KR@P%S@-Rxj5bqi3%>N_ltpA!||1Q3b(J2jrba$sRK#*>vLplYe zB{o{=?o_&w&Johx-7Ou`Y|ra^KYzpZ%el_yocAHcT&=5kj9Z?z&@lRk*}te>pZhn7 zLVCmyl(8TjwEFPC`i!530lwe#9jXsFO7pGG!m#+9726x-_|=>oGr%MJVWre3 z{~_k_;KxN@3Z^j`n9cMG(bS{Rl*;?2YpJO-Vg>~2yko5vsXSNyft|O!!rpv%mao46 z0plI!I^_oWy;#Ep3RkoT%RG-;XwI1ghAu526~-WR>ls@a!g(jvTk~|3NP$4*V|2>u zBG=b(NM9oN@Vi_2j5A&M2WbwazOrbta%jS(hu8GmR!{Rfw6{_IB058bth1LB7JO~P zCI95JJ8EZ^kYA$mIAEWL^?L%F3s-Lt=a3q$rMzam*3O!miKV3d>-2v=Nb6P&vb|nB zXIk9EN-B0V*ob}C*5p6f|Isb!)Kvyh(XjfZenojlBmLc|a0de^EApcEp9=gST05!o zA=uVkRWJs~i$eyG%U=p1&~l&?i$zqo)BR>6N8{M(pleJMG~xG)OjfLqUi)H|^Du)e z%E8dDV!m))+nf@KK_P&RYN2KL!(=&|5^M~j-#e>Uo@uVvk26j7=f-< zq6>eY0Ed6(7B)ZH#c>iI%KRps@=B@39MWR#`$~>xpFOCA>7B*JB*cV5m29`})-{4{ zvP?QB{x#1y7?(9nCqP9iYcn~->g1fsyCz5ox$fu7c0`u%WttL*LF8?X z&&bOM;l4nl(Meb-KV!}yfv}|nUC^d^l6-$q-)Jj5jr{!lhj?jI@D5qpY~vuko3ZUp zfb^NIZBIUH2I1%<);q0zCe4T56&AI+Q<+kPVFRYiP5-e!at03nOx^m-3Rj&a;A(U6GtUm?g}%c6|`{~{3=^xG>!@$Rt!hxwntz>4Z~76Hqp zEEYm+z{}n?p-?=D^Hd#MQ}Is6Gg#KtG)j9msXG8rRf4Lg+Q+>OTJ zZ{b&7=;WWsKmr_8i`AqyMV`zZ!*NO)mHUgb$fk4ZP^3i2B;n>Za?eD=Wt`E%E8F<( zpFi6EuI1d(-)H_>TXO%7J=}JU&k@Q@U{c)!1FDm?0)fy^Xfb08QefMSOY*2$eCLiU zAR(`&_hz0C6+v9+_%cMTPB21q9*fu6me2th1_ItUB>$Q!hWRz}gh(3t64bC;4Ft7R zo)Dpo_PjxBT6KLgZ>%Dd(J#IH_k>bC5V$idsw`AchK1Hu@G}T=)?b?ornHR0U_{w> zBhf$t0iuvRIdB!1H$|1HiN%)x9AC27tarFT-`PGpk|{6WR8YJ=Qs|{6UGKS zCNPt!0q@U&eZ-{^UB!gvXRJkTzx8aHrZXJAX$2M~#nnGPVE~BzZR9{W{WHTBT1boi zk6J>y@CIg*%vzu$^&r^65)ZR(qExV08ykqR);*oivbPLd2HGZz7HV zw|a(?OV4hgo2%;{J13d)E7Krk4`+ zz2^gA(xGd#J?8CeF7c0w^l{|6%iVm}jqUN7=7J4VchW>$dqw|4?eeR@miZ;3PXLqE zj1{7x=3l;+O#b6jyC}qmqS1VHSifIJFz5MBV`XVkJK0m!2!j&mq#L~0F&x)=OHYxB zMa;>h3A9uq#15_~e>i`2|CX_>sCmIr zt2-H=+B%6?A|};i$}-tkZ6$TKVa$)K`<-JkF5r_21MFdZ{i$MS)Q@i^8Re+a$_S$+Wmm{KhAhQ0@=ZbZN^GU8cJ;B;ji*d14sH20+~?- ze%Y4<8;F*wcYr_uvA8xyj#OFg_Ft1ih2&&coG`UdsuK<1x31=274(=RVa6r1{}vX8 zR3>~GQF#{q-v|3TJO`PxF+CV6ltQQ#@?HRwOvL5P)ZbVP_I|72xJwpEl{vcd0ZP)7 z*Pw<^QgT~lw4m72^Al=E_`1E1z#;Q-;FE7Z!(_HnV!7pBn#I+lYWrlB@?S4 zf^{=bu~SjHoDe616J42>R^CY3B{;s11#vdNu4n0aEYURBB&I2h4B0e=;D3ER-VSB885Otsf zoo&x7Bj;$$Vi(d|I!$KZ)bTau%sj3?pFcJnTf}!ezUZhT*RDOdCL2DnaszB9az?K;`!I4&)FH(BJ8ztTM!pH*+UbG~mqsS-rigjx?N5D|JKWhO zn;|^14W`)>Yz>?iK|?+n-S(d?`u{j)*^Y7{H_d!SqTCN=dTE|bz5gN~-D!8#a!X9F0${7=%uYUZ1;{Ap};NnE{5 zc(yGZEqvj2bCVr=NMgb-`Q3zRXYR7={Kkom;*-69%;{G&%93F;DfJ0C&ir>`f*bqL^VO=M zG)!&=$>)h}j3rveVZ_C!6m(s9o@><}{)fb>^GU->p0G(QxBo)$4hjZ{VgnX-T#+#E zx@P*6uGaG$!3(3L)NnrZ$qrbZ!1p=nNLv>m>Rg=8KX%bac0JmEE=HSLxWpbuR{1Q+wyY zX!w~%z2cV|{*TPGi4w)C+6{U&Xt-t#(q7IPCU%|Z1nqHeVp)ww*s68q6;arh{?WO= zYjcWp@Q7}SD!tM7`+9SNaR=Qn`tTuwp1JLy ztvqJ9KUi58N4{=b5qOx#+*mbtXEu!@94%$ceP7ia@}n7iqv}zK6Ttsa$cKUOXTOU* zkg*;2xp_HIHW*x5v_nU5+y(0PBo!N9L@cet{^{gGCwIE|44)s@nnruvP|T-h^#+tE zh-16FI?@19#;;%ZWdLIxVM|IN{z*~Fpc8zo>4HW!1qTW4OvvE+xJ$AH>Y=^p+6&Eb z!lm27q+78alZ->`k@=fSklU72}zWfZ}7Y8e9GKhjTF?9 zaPY46@;nl-9kGp;zZ(taq02w(lh3U7#TbVlt6n@yAz#8mv5QchfAFi_>*WEs?EUnd zKYyMgn~f>FiKmnkU-m-HsA>0IfA~fY$}d9BK+kh~7T!HD7IaxRq|>9%naW^IqSiNJ zT*zmr;&FdKOycf5&8bUbn!UWRY?Ycli+~%AzdgOCH7^CZgj8$xJaJuETjj8cnqtz5%1Jv9)BPrRt%3uyiuYj22)&6JN)U(ZtJ+_s@0xDG{ExcH=?IRx{grvP=eBo;KR1V`kK2TyX7c*i6<1=l zqU*Y`2|qBB-+f3oasEZkCnayqZG)c`p6a)eeSQ}kgjk@=KY5VfTg<6um+~Y9^y2F{yH|<`i+wJ z9C~LtFy$fG_}>`y%<4K{sGP zXWiF2ulSOr$p<;$k_<3m-d5md*!lnI9)t$6# zC*d*AVgAS7I4>t4Zan9$a_5e<6dJrJwm!j?^Op_v*z+rlW(sMOv4{B2f3lFG9n`EJ|xRuL}Cqh=bej~ zcoX(NwZx-@fF5vcjsbJ1acd9q2#C(OJzjPk|Z4t6zkWe5%*CIT>XUdGf# zpt(w#KeFY~8iWTIHCk&NES6QR8iFz1I5~}dwg5ch* znRerD$jSkbZkC_2P5G1EID^LnSLi)?kT>O`OXz^jYf=FxnKfg&CRJ9Srq?!~R-dv8`M!2(>br zl|rC%l6r9M35mn+(x+4q3CK(_yXD3Bew!FlY#2d|pr_`koW5;3P!1+)Z2L z=mFBu@P6E`e&)t>xBL6DxnhdW^KvHA`x2dUr$%?vH&7qL^IWH%M#?ik`iC2nN_ijY z`;P1zK|U+v3dI`{P7KcX*VQ2GBEakyQRscZVdA@6OXOQj&E zf;z(rc?Y1l1y?N|Z6zDlt66#+(1o`a-BG&P%iG^L-iN-OsBd1nyb{WXP8q?9xrkhZ z-XsaZ21oyw#f_zgJ?f3SbOEB7M{P53&0PgI;cBxTKs`4qKfz&$j)R{qy=tpQ>BrQi^wk~{j`;a zi1o8KSz>KtXB>QQ?5$yvMC__JqNv|UVcG|><8w5dUKnJGc-g7He>q!z zMWB*W{INt5wFb zq|f7KJ%|*k`)$^bjIr*(PJdr`C~&$IE@Ip7PA{hAM|@c({m-91dT;gS+5-|%EV~pB ztJwweO@%YIf?wVqNxTc6^8E2tC2j|>cyGmUNj|gKBN*cUDki=>`akeZmCj2PH6JD!P%yNSlXhsP*_W5xu72gsh-ML@$ezM+v;%jZeKOzPw%c&sw4$UvccPUy)fenaY z0NM=V!?07{b;tC-8B9kHpv8&cau4G)YUKB|zC+K-C8cBX9YR*#%cVe)$US}_*K8ix z5D&sEYz9Re)Os>_;(Fl$`GMx{`&k3=NXSdDM`YLsy5tYDll1cLwm5%ze~R;_lYTj| z9HIX+V}Fjs86Ow>i0$f!inAZS)7-ue_VF715Fm1#N|5J%uz9roR}&y9ONR?y{5{A= z%Zq$FeW`%@g{BlK*ah&jJ+u)`^d{x;EHf{NM}w4I-nofiDz${6Aj1ezHZMkaCLIE5 zpo20wvp#OeDxTT)*D`~vfMGeOxpR+ANK`Fq+`Zf55^8~avcczRlLhPj5WXVT={Qf( zwTe1`c0x*JSW?Up;tqOD{puf*Bf1~?3%M7**+f}+w(#yUsel{1U`&=q$Ko*)%6h14 zk@Mqi@u*b5&;8sGnuiLoXxDk761bPObL(qBkj)HTayZl*=Mu%8?0$FS0rmdE>~Uo` zfY-gOQDk%73;tsRI(ps7u!Wpr@hd%Q$>{7N&S;2Yu)fg-G_P6=KAG=4M2GW0XhH(t zNIhM{_q*tFu0=oEkT>Y}0~+xgswJ73B|qD7>bm1b^H7M~F0}hTXAL*^eu3<8>y%Rc z;DTjqDzKpF2>Ck5*D?~L69sBB;`yjfpjqn(iY9{)d$CNs}vgQ z<2Iy@9uW`u4OTq2=Je7V7AcoLkE8u*ugAb`8~`>Ts|?IUK59nW*5z})gko2Y(%Dc4B;amq8^m-W0zvQ~6DAJgH)z!M9mVt?Kw z9oS)pVbGg^(U>4)&Wk9q44`=_PYV|RPW*09-v zS+EadN940m;k1PpZRT@$JJ6z+ZSo@WCFLww`zau?p>hg!o z;2D_```>7VSY?VtU)CHy^#z-Bi1!I*rGK2wQTZb&BC36+@5ah!)8C@!_?00o4bAF2 zy}J7xu{+VL3_md1)Rhv<>T)r0KX2>A>_i;rCct1B2p)Un)au0jP0^ASq4U=tqlsM| zM&%E15SE(tj~&PB_{d3g{|4aqqHz&ldK)AoZCC;I#~6Z8&zNr}(ym8@szj!tPO6Mt zZf^K7>1-L&3v8^WjE*Ru;UG5;1w)xE-zU9JJmez}LTYmg-;b>QZ#W!VEx1bR0Y~y7 zA8LPz2}$$(UdD${e3}Uc)`RTU*VorS_eMF}$OuJan;cM0dhZ&#XJQC7E>0Ytg@#!2 z2eyCCPT9Ce-B>}qLw~2OOu!HIbgUrTR{GSb+_r4E(e}vl8&!_lvdG}JOR0>b3AZ4{ zKfw!qo5!5_FDWu;n#^u(P6kgwwEs)7<@b+~;-{(X#tX!`g~-bSSiXTdpbd#3$q8T` zNZ5M&>#qlLV1t~%RWE3R?)3buyMNxM9OoMiznMm2x##noyNsVUNHQo|v5~&w`oS#9 z%y;JdbLX4^_0U3n> z;9nm6%KeGviGOXV3F_z(yr%-pK5zKl^*Dt6V;zI@qp+VObxC7_l2i(aw?hsoLqj4@-^d}~T4orJU*hJy8~@`v-A|p!tanD!dW1}l^`i_x!XHs11XWzL zf|`9e@aAR(b~u6K4zH%8e5UQrg&euRpn!zcb)6?vM%xTV;wwyM@v>BMe`Snb*E#Zi z{}_Fr8nEZJ#euxV^!^v?C(?&OPM=TG^|Ep2e6c!#U`L_iZ-mr;U_aR*7jv^&39(i+ zDzeOZ%-Tlh^f68k{qf#x<8wXAThwGf`7ZjptGINXAD*V^D^Wh-<~>qt z6uXTUYCi$dnur(r({IDP%H9C>e^q1%s~MxK)Ecb1v!0TGY^qjOW@{8~I!BqBpKOeQ zq@^i0EW|=}bThtIk&aNXyLIAy_m3p$M-_3-RWD(GlKWI zt!hi+gf8a@7r+5=u&>&8nl9f9e>$3w0RgWMN1G^QJE)4?JPWAA4^rSS)PMd#OfY`U zbLyv?bSFR2PGoup^8b**&Z9V*SE$T8BRzdloIC{aPUo@Ox7^pQrd`Y&7@a0go?i-LKZi=e5(1ZyG;rflLAcX zcS|d4lBe1uj5bHDaNj@0^_WhzfMJF>vuNY$Rx16i(3)Ng;(`TS8!pCc`on-KHffW# zq|XD0>WOY!muxZ1b_~SI%0}JS_Wn0gL&M5;KbN5$YVWx2?FTJkuGB47CQo-&I1EHx zdn0V34F?|gUXQYrp~(2hqW`sfr8Nx~iHK%RS;K2xxvS2!z^gxay-FUk9T7Hj5FJyL z{fovp;r`Y4oco6U1EZ`#Gy>yYWEA|kakd1fly{tK6?F#?)6dFvyE%b98J~C4exIJ4 zNT#xm%A8W%rj6DKZ4y5s@Z)(sR?eTta)S?~9>i?2eu5nnJ2Mq(gsml$M`Zvo!I|VJ z>}NC73OXGatiL%8sr^@cr}o!-e>Grv!tH>7mN&K|R7lC4c z>{`vX`EkmB#tAo#$`w2tzp5uqXQbXNk|y@HVK+)shEeN301D@>p%bw z=oSjuQ!*~(v!^jb1A9hDS*L>d@ABBNcr-aC=z?4-H*POzb90$ne;>4&Bzj{4lByM^ z`E#NX_Y#*T4&Q31N7NGB#LG;Bmi7tVD&v!? z@@_rX`rpu@d?CisaO)fjb#v{U0^vvVdaocK^$?C&SLl59%E>;n0LOypx${7j#&~r~ z2fNo?XIX-+KVR@qX!++H%h@@|pz3l)j+ADYu_>I`T5%$R{(ZKpd$A3piscm^eOJ{| zmz;hl@aIWq%zMvY?zfkE!ZMF&W0AeRD8iSOJ{7K1xL-26B2lcm$X}{tK#IGRjBi?_ zX=~PEAEc)Jd`CdCVR6QQcG5SoadLz2gKui(r682(R+pMb&FPGeiM&Gr>bqh@wftTB zgyc?fU16-7D58vRnaIEZZ5Q%Y-4HEzj;FKtpq zvw++*mr_QFqBSd?v$Qgm&KPtId%mCzpLhAvbzR(){aeBRD{uU{H#>g^DUT4<0o$Qxc~hRccR8zI%=LahKhTz zf{JR0Q{4mv%`9o9-Dt1vAQ7|t!*(Xr4p%d>C^zVNZq)si8z@fh>qbDYNY^ArD3my5 zs-btZAXub$UW)HpWUHLt?W9y6VCM-C_QA6nH~kS;$ksC&WrX^??W@a_uZ{`{P_wSW zaCoD3z*vI2{yItVebI5t!Pbrx0vWm%n5M|C%E$n4xD})(<|`~w%$VrPjBaErxQsmi z^))C4fH{{gb|Y7Z27qYk#n4)!90Xyl-LQ3ysXV7Yd_xE5=u(QPWxH(s~hpk&-3=4IqmVXHr2MkH<7YJTHIGE1g*kMW2YS8-QTrwxrEqcdNh%hwyh__u$-tKn zLYt!p{3wCGM)TW4qFHFk9u_V0&B`ZxEK#H4oDMjaY{)aTOu#rE0-9xaEmQ1pG_5Wm z0H5Vz{A8siCh?0O#U>!y{4CRfanA`^5DpNXQOLe6(#QY6J@fW8EzzG}K`Q)>2{jbI z?_AuKp5Rhv$%OXP&Gv}Fp0qt@D4dJnz{(;bcZk;&V=py!4eIlr6= z03{mPOi9|j9Jk^;J{8c{E*`0P?*h&VJ}?~&5ian_q7n`^LK!A-J#T|kE~{lgpv4d=O1pyYUG@R%5Al=Cgcr(VLtp${okAeph{^i& z5D_n$gI5P0KV*^>D2N&PV3?4=Ahs(nT-Mtj8b4qTa`)gh5V^3q%JIf&*}a8Af``uh z{84+NYmOzS==$9tO|@?_7^zH)@+av968y{IBXJc=+yk$}z^kh+M_yW5hd~dMF>w0+ z+ZFxu^dKX$L*3BXa0i=c7ywPeYBC8`$C%}x|4Qcp_<8;!+0rzw?k%nRlWj1WApO9~ z#e#!>dw&8-nmh+99)$g)v&cMHI!SE*sK1uW(UPRQ0?h8HOu11?OYv*k#&b-oTMCE1 z!D@X&@^C5}eP?h|oX*lwrc2-XI1F`2a_{+!DuZ%ARGR={42=g(SNa0%1uK zVgeF7b-ZAiQ?i7N+H^s^7Rs_lR7MShY~e07Xs_1swut*2uOcI#<+k4jt2XO00SC%g z^T5z3_67RnX60_DzYX6H%QJ&r5qVGIpKoW5lITH1JLQH33g?&4P4BSkB41GLI50OD z91!^MugR#t$+`^UO^s9b=cFKCo7Lj98+euImASAB`UV!;0QdNSHJc2)%7BS3cuYX@Bg?7y3;s-XpzbDe!8@9jp z2?#Q9&|zL;c9X=TH)ts(SIsV6&|#h}e2~N?wEbye4ilX6R^!(LVBNc$IZx1$VRc4O z*i$%?F4T*KZBCh@#Q8rkt>0_T&|DD zRFaV^;GjmdR+(HhS$%wsRzqedi4{GNXU^le*7B*@SSt!!8l#B(-YI1|C%MNE%@e|X z^5iIR{h1`J4}HBVP*NeUYKT!V$gF?wMTI~`+)7#u&$2pOC0#MUy|B5#-jiPg1eJmI_OHQFw&XIyl($*2Es0KxfNOurCCogo@!ly=e zn2Jyf4(507T>LqX`&71>d@d9xls`>>G;F2KxR^NpR6!vq&uR{Z%sanHGV&TzVECu{ z3%g4pn5kOs&i(d87$;D}RVPsdZ?*TeKI&iJflU75lhQg|we&y2&A{|nBQ%VX$?D;B z!b!3!=9TAv#@(#tHf5Y}Kef_V5P82Zt{6Q;f>9?p<4!I{ukPV*`Q4(2wH0aKU!FUE zrZU_`sv|p~JsD8*Pg0odRQYBbpO{`P&PC+{L3|^m0uHwuq#I|O+o&N{{mubP$yVr- zz6?@Cs&D3Qa)%@7yin6>n7ZGafP!o=&4D-^@&S8+sv|=40K} zCBGRZ(A7~JwAjZ83AEgbX0xg@6Tr1CklRllFGZw1pm#oHnt!!n4tfVC%ESlUtS74f zrotcRp|Nrj| zg-mSI2>vVdW)s3jE}r4uBv;9F4)oQBp}QhhPytyjk)eVj5D3W}IFo?>xH%;i23rnN z=hq+UiYuBPy^9J!CB>gA4?pyN$V#aBJfKW zbZ?40G4D;!#+odVO%cF~6OQFN*YO?6dA^p4F(H(58CVx274%-?I1wxf8-uF)q%FVB z8~#>iChmL7>0jk;^xD1v_}@W@RcX1co-YXkn`l^O`4lZY7^SM=6Q1Q*<+56nqB+Lx zR=*;=m4Fq-v$7jq8ZsYXk@55P$LBb@R({DVeD1>(sg37TeXv=l_wgt*X2sxS88)a8 z)tH~iK9C@A%)A&sE8NY+p9ClL-P1K3O)uc|j*C`@7%kYZJlKvs7~`Mr)!Mv1z?%z8 zd+{y1ak`CL!gHo#I+6b2LNj2UEHk7;(OQP~qdcl;y)cGW^^YPyA|T%J2YXa5jm;1f zLX6S0>1#n$YJkAt1a#Z&qQ&e{l^iSEccxdv*`>=}cm$kl_~IdlT~u^ITgHt`iP6&> zUdB(XM6utA!NqBc2tF@({Fbl0k?V!7^=WC~dkw?~$RF5>Wq;yoklY6{XBMk`+dW)4 znjlw+N4$7t`Gp=zTn8GMEl3b0CWHoQ>3{UhM(=fs3jV{F=4w)$Fs~6huLRny-Ge<3 zwNE-~>`YKP<`GW0G=H_ZbQJlnXw=+ACMsrXC0_-P+Q~& z@-RntF8nR}%jn9_&_ko2^?Nhp)#w##vcYRsUMf{<+Eh$9TvIsoaGAq7qESwqj0iQa z4=Wa|wMh=Znk&g%CQ$GR=fr)pD-*D{u8PrQi*!k@-4^r43-zP^z&^{6A4=8=Zk9Em z9yOF(E;~;-rV>a6Ox|Jl((bCZC5bx>!IFU94AHX;|5Lmug*`l9VA#wK+H=O~s?VAn zq?|4-4h=Zutf-H1!pEcx$7zG4KJrt1u|*i{Q#YHD(MNTQH>VkC_0l!Lft@}?M z2Z!ZcumAa33ZPn`fU&CTHhI|E7vZ8^^T(!GvUE33(BD8n95c6G>*F)S$ana`CwAZ* z`^@k1es}gBQU^)FfhVgTO(dT&jXzmnq*fQ^Oc15!#$DOD9#oBRm!$%;4-iCD2T*_o zq7ly0I#y(>0z$8xbne*Uw;L~B$Sf@|UMM&G+!;*&g$m^zDSP!;F@xZ|#f^*0Eyfge6#EDXl8{J9U!S7qh?Du0v`=w^<5%8eO z#wEhKq7v%rjLWSJaPSpMbNJgCXotWVz#xpyx#J_AoHTLpY2F+Gp^MkUoa4@RET&D( zZB8ahw*@8_@MwOqSefZwNC%?28rtylkVzYShIPlC@#!$FU*CFqa(R?s85H&}wE!0Zct%yrr!T-qU7t0FSu>;nm{BFad)Vz@kPxX>*oX3CNvzz>a@*vKr{fsT& zQeY{+1&!sgvQC1JOZPXrY6Ih1ORBVt*#IKb3jQb*W`)QCI3<$p-#cPH9ffbbmP#tXkTwVJ8-*35&+?g$G&qRI1Y~I1g_ESJ%kK@ttBx7Gl?q4!)2kkeBsg#%zPCmrOCs>rpx}XTHt`7D<84}-F z-zGxg19U}OvBFCM5;C&rxA{9N1Iet~M1v&KkWzDVkP)FyqgvUs{PO-VHXLMyVa}IZ zEEto47{mS}PKqWADOVE}NtOYwnEiQr?7b^!D^k+p;) z;LCaX9lpy_T$RYRw`j+US+&4B*#|WdtgAU7rfJ~TKu$SZwKGK* zHYl&?E9pXbJm%(!fv2YPokvK8FIt0lw7bZE*#X|^F|ICx(aU*F)z>laThR%m`|OX( z*e$1(Lf)oipf_QrqyQvNO z-X*~Mv$ks@crPJc)I2a(5K4c4ai0cTP>YAK_TZbv&I7gC%|h8NrZZ$z7>+p!bT+l4 ztFXQ=V$8QO0%ZN0q>#!qwN9k|Gc5yVOj9G&mJxhR+tYmM4SYTF>=j_wbigEN6A&ho z8nAhKu?W3}1}&kmJ;`y!FY8{!CY;iyn}p+V%2;UI%-3)TR0v3x5SZ2yn4#UFu!!=) zgyQ+)Lp-Pt+~1gh!5Y)%!8S|;iseNBfct-cZc)upeR$ zmW;f{!ZT$MB^EH8nU}~TMZ(+KGRdI?TV}Vyk8ofUkYACx#8bc^x`C5M#<$}(*W@D@ z>-~ixiW)15k;E*2H+l)zOy@so;p$*;M3&CHS9nG;T7f_4&!KoFEFYbi1DMOMus3N) z{Yay(JTey7uTYen`qB%^t4c#*X+VCEYQzeVKen(ImD!@<0xHXxTC^D3{G0Tc{A=~Z zm^*7pEU71*6Zgd^xaR(9_T$IB1vnrJIC?G3l6EQOfjD4eO zQks1ZTqmKtd73h5?dUfCspNJtN>q2}5MtDKsNN_n7+T`+Z}uNa{iHGt&_7u$jT-q? z$@NaqcKxvctI$0}*}hxXUsyx&zJlI+kb^$C4pROVEK=bRi`Rki$7XF7<8WiLdt}>( z<5x*akyjEB7IpglgT9b$T|pn;@>j zq^57$Y*zr-gk-%jsCS$XcvBTe_uaqu(JPgmfR?g_X>_buh;9Xje`?y~_633Qckw6u z4{-M*LY%f<5$CF>N<~%gkNk!go$oJ-$!K~5ceB)lE2 zr2Auce@ELNlmp{P%{s9n52|_)2c0{VwreO^+W-GHO^s{ICBN!#<@WD;`N0SVIuE`i&Q}SiCBIQmMTj^3!1- znTZAOAn_4ASAKb|7|gjZ7C7^*t^K4Y0%VXo+G2=`albf?%Nb7QuWHN&^EqQ2LkZp1k%qU@MA+!mXrB zwc{UM&Xjkw^NQE&EcPxusGC14xPS7NSmVoFMEXPx?<4I`kcw66mT_w66uGG6h5jx! z2(8`pQvpFQwlrIFSDau`i!OCka!FD7Cxf_yp~sjf$BINIbThIFRoQ%g5_5wl&3hVq z*8c|%wbC8+luTX!qtYTHm=rlp#BZ@IAp(-Hn)8*5j&Cbg4nQoWp!p ztb4~suj4eam-@%%N=E(a2tR2w2kLOK4)c}5q`bU5JDA=)AXuCM#ZfZOoB5dKqj9th zjZJMIaI890qos`F(1f{!h{1z%K&Ox1S$kM;a=Jkd1=eFgnQj^mP zqMN=sD5hrR=}IRkwV#-7zccr@56oTMAXL+n(nE~9f?fH|c%dk|QdP8l7=hHE|M`m1 z#t7#lQ|6C1Z0v{h+*D&!vcPai-+srZP52S#2KIDDP6)VxTp*8Ux5p?%-2f%EKbtWyAj=S5YIgSzFjm>BnfM)mM20Jb-Z9>!>PaPtbzJ0yeq|FW{EfmbwxE= zfA~=Y+uTu_To&Z~FpL;l?S}M&4CJN;e-l@?63o-4Kr-fEsd*yth0(N^JWVtf;KQr5 zmlFMd^}pxE3OW*_&AEdz6S>5T>)Yy3Ru0B(Kws;JYveS0?wZe2)<42Lke;$)<<1KC@t{#icS_SsE-5u4Mv2 zGopWtBRAydD-Tmh2N!G87HIn=zvDv&yTH?=vV)TWGXz#i+I>}FV|(cVDIg6;3om(pts1Oi61oWXbZt9Z1t_+d)B4qbhkLEv!+lY zNoGcG?xW@C1(UGUc4Xz)fvhV>h&cf9A9LpzeqmH|{Td3Usw$(87Ikpd#8zrSOKHHc zJh9MF&b%Pu6Rj&q3c&y|ZYaK@%Ky2Oi`N~b zk9QPuX~;E&v-Pz4uu4KMPIvEimK{4qV;G!g-L*cD>j23s9;(*0a(=Z>fV25j|3WOA zSJj<)k2Xb0uNfhjjs*T;0+ba9fv3Lnf9nGgZ`ga>d_>hH`D1LBqmEy3(xC(DvNMNZ zbdNC^#6qqo78LV-6n!48Z^o#~M?Rmeb64|47l{Zi%a+ItJbFB_DIkBkhW%U9+kn~& z%$sm|Oh0B?gzmy%Sgmm>7Dsi&*z}Arm`faChd1eRuG*lk26`#!m{(a{`$8I^v6JnP z@&8CV2j@5(rw`vH7aNUj+qP|^abq{WIB9G&wrwYko5pC;*tT`=e1GrXuroWmpMB<8 z7jw^$5*VR%(Gmexf@`$eCAL3C*F($=Khv|OLlLtBM@u>vdBc(4-GTVfD>}@19!wRU zQfcjn=}$qg2hV87c#0>2kkOrx5aF%gdud}qY%ox;qgtD&TevXTUNeiniy8&Dp|LhA z$sqA%Ok>^bvvk2N`H&VYxhNz$BB8Mk@jl!h{X0Q=4 zP{DCmEB|bIy3^uZrn(2S4ThJ&txo`6giSOxIa0|E0HTWA@~2lT90!!6^<|5O4DXs+ zP7_;ae`GR5o|7FsS~KG)%o-@Cu3vaXkOLML`d|GTp4RUUi>E5*8K6O_g|i-hlY?e1 zoNGPCvpf`56-ng(vU!JI4R`Xq`w>)<)%bd@i??9>uD&DZy{(#3>jo=8qb&M$1stjXBn?gn0*TSMaEI`ILC&7%%z&a>_ z`3>KqBDWMwyx&@J=v5*3CGH=rktDM~7iMq^DRTY=*#|(%kI$buTUfBo%fop5QXsi_VwLxVgJvNd~!SP5F#I(ZCSi*27DgjP^lUmkm z07XG?T5>|ThoVhCoqZrjb4QuTws-i(?|*j&gB4xzHON%6&TLV@bpQe)^je<7bbLxz zvBM_JkY21R_K-(*dTOyp@LwqO2&FkdB6%lEtjE*;a$fWw+i3(OAJcfHuG2@N~Zmpc^`iuHzt(2eOlPEyHh$?*wE-RAq>A^^u0j0Dcbs#^9{5PyZL8TzLy`kJ)~1lP)vY`>uY9gzqnX8CPq zOpdoOo!asb0S<}CaA)$aAz1wBQcOb;9Xxiz3k_vTr5hYN6Yynsy3b#jBH)SS$$2wIA?*bK8K?nGFIy;#psxA%R~|0?TPp)i4?IjbSi zP}QBn*zRQ~Ph89Hx(J9(KMJOj#pe-5(e=tcx}2N5F_ZT%`a(M2kE5cJ0??G{`W`;E z>UdzJ8n!sThm9fdz}jmQ!0$ZEBB8jb4!pIuO%FWSub}u3`0=#!#E6XN1J|ZoIIcg# z`LT+SO8DU?j}+_>wq3fDWKPrm%ld-V=$|)%`*Yvd*Wq&ydo#mvxf8Tqe!ZN$ZY;n2 zTT*e)5M|_Biv2f0zL7r(4NH42CV)W%eflQQbyNWRo9C9y4&p+YV25S6+{&)4C_?^@ zRcVZeY+IM*JpJ?Ti-XX2)_ZwB-9A)P$gpP4sA{~n_K$Q@X)+l^)SOBxRUenR8QiZ5 z2>}t}A1u5>K^-VJC~WBirI20Y>vz$2KK}>Yz!(NS@p-5nLNYA*L?swyW3=>h_sYW? zs_{9#+6iv5aZ!i2l|TsnY553%T>O<- zM}5Hg)?lgV9bXR~9S}+h9-c_(!Rl2CDfr+L2!~ly3|~6h#VH1bsW@c+&&5^?Q*r3f zna%NGc#Jr4>)d)shZCNF?XnV(ig?qNezRtEgCy4C^IqXVUi5ZG73P-vw+LqMhuQQK z^(%%fDi=@w{aI5;$spbnflElJvs<;g;2#`yGJL5bi_cJ7izKCemBCA;>jat=aXWfz zi6Z7#n5e`tgjqjN(%a94Zy08sw3fYKHsor-3&9!zxR~K*Y~)X+pRU0cP{GPQuum** zx>!iKEPy7DY@+SNpV4+stHREFnE1V%IYg;2={yuaCB>ItqK6ABl`60YAvjNvbz+zt zz@;&YeYcn&>Yta7UP7oLTR#sW)v|>{XNhGFfLS9U+qR8UE;$Y-a6>S?(g9ka7)Vh% zyTRHzmZWQYb9H$pLvZ3Xp9$+yGMM$_7Wa??c8X0}zjp`m0NM5kqppE)vf%A?% z=s9ryJ@OyX`gPuuFzORe5PR7@nBiI{HG&yla)zA_9e%*}H_7imYbtUFAcH)EH3N~1kRru0SdW(DH-$Aa_@EtR2r6a&C*FXk#s$A~GM`Gi1NnN| zGC*E44FZlCb~7H(;Kh!04_@{7sd5zcD-@C&oZ1SsZOa~Ww!pPCYz}2j6%14~-2Jig zUXh=F_*7e}BV}-PVBISTqI9 z&>(SRRLuPnxce$Qij7S4GcdJ`-yY&{ARy1sB0Kj`6e6=K(7}6j$VhpAQm; z_A4eAJ$0zx{VI_1LkB5%V=M4SGo#+OaReYE174LFic=g1Irae8qeqp3L0}9onV9|o zh|!;Mp9QN}zY@@qHqNS(IQ+MO1jDeAdv7hfN zYH!oz*$k{w+N%zH6K4YQJr1?Z(G@QTxqg=m@a)hVBC=oymlT0u`~M2D>Wf^@{=n38 z!V`*^roGLD<95#A*R?_=c1Y5MfnIR(gv^M8Z;7bPg=jKlxc9tu2On3PSKZy{LcT!5 zA6_i<04Gtw;*l6!au&o)hf$<6o=SVG--q=?3RROy5{w5SMS5QZbYuT_R{9UYlo*^C zl0P#Y1>#{6o2Y&|Z3_MQ+lluFGW(6xEp-FR9KSV-S^7__zl)qmbKEHs{B+R(dvKO? z@M67t3LJ-p@`~G{Ni{DY4VNFSJmYq#4A#OD+p%GSQCQ!}i|8{EXqGD|`BZg^UR+5* z-kug?Hf0p3#8;FFS2WRcKlqeaH3M-y{)BvZ4;+S0vD{KPAi#%DS${E`))H z{wrcWkV(WE?(QrNAl~*#^;T2#!buchw(y{!F#JnbS3BtNR#Hj`jibdrdY%F`EpGLe zSJn_Gelue>;DOxrr94;bDUuw$RjbOHz*)}T%L6fdjUMFW2}$V7f#=_%@P`XU5g6VX%Nl?8)Uhva#`uuthyOjR#2Z_5qG;~vy*)plY^M9Wm%+<1W?-@sH zKE0Oc-V+u%|GOvmYOd_s{_Mr#ifl8h8kL6GRdZAaL-O9+|kz%B` zX_K4}dYy#P%?KG$@^tw^MWfS7`KK~=ZW$NyfE;MVRvt$)?=w6aPyNFTzVbSu~hfs@l`SyEjA{f`A1?(Uo!q@JN z-VEW&v#yZVZic8?Dg7-1wl?&?mi&oil|XbmY%znaqt?a8)R9OV006MqJW+Rcjsh>R z8iK6okiUwC?ZE(nQw%pKqIZ9rH z!q^U%ZO!PC(L+WAVm&Vpua|Fsm4~0ZvCCFVryC!#VmKW6h=C;TmW~s2HYSN_elg^q zmZ3kFd?j{MYybI`M$KxdFEzjt?xp306~~YO zFCkg_7(!n{cn&L7#YExYwt3e1Kmr1G8BRW z(<9E{qg{WjPQCIUVDulR2Bwo$QQQ#?BX97Fk0qCnmAq(SEmXJ|$1|1N`ckSYp6?*a zMf0x>6&hh4HhYP(+Q2~=iK79a1vB*El!+{{{os@Gg97rC03MNs0Ssfg08suLVWri7 z5BfgE`bZf3@uC_S|F0IgSW2mG*g@Yf^L?t3__q}%U&xbwo%!d0Psi2A7NTS!XMGTT z&;G_1lXbX5soGe{hNc-nJ~ZtllM@9Iz8U6SrCxNE6#%~cl5Mm3Rl#;r68&)V53jGE zw$)u^WK9Gwa@mXDu4F$HCAGvLX)QF#tDz`>)gBO>!DTie<344-p>zp9p)CfSoJ25X z@Q|Kk@k7M4mv}K@9X=&UvZE5djy_;Mb6`4VpznscS5Af1IxXa%DX!MBhN1D3{xOm` zkf_s{SpU%#;R)537`CsMhtPS|Zuc1+ZjL0x=$8mvy!0dx7P$O+_RZ1BT0=GWigQv& zbG1oj$ZjA0fkBPXlw7$ArlM$W1L6W@mpv@(dZn->jdUEWgnr23zrOQ{;@gv>{$2|twhT$MQ9Hv4Y?R1ZMRkT8f4Ug+L{EDC> z3^~I>jMrn|>$zKOo~1RX0U(5Pw9&}_uu|pf4u0sEKUR~zQ9cWVh*P%O z`rZhwFMxp=L9cKGV%synR=s<0XmHz3a-itsp>8DnTQc!C+n4C7X1x9p>91sizPn+2 z&!ko?ClwWh%8b{`H&-9MmC-%S4%jdpr_3UtT1egE$pQomLjpl`ElZdD?1yJ2$k1@R+k2(@uFCu-Y9(o{OKCCIsC* z7#v_~D{X5GbiWAxOxs+n!i)h!n0nywNF@*X-_d^Lyq_Bo!@VjH)O`o#J}%p1c&^iF zm$(xi|B1WqpCAtyIg5@R>AI`7my&HWQU5el7p|DJ;G3uooa$dydve~q|KD&sUEs#> zd`?Z&-ip83|H4CuUOmV`v)p?T<)6rpe}NkF{~ok91;?_F189@)nyCW|;=kz>yp$;0 zWyVRajla;r9#4ea@Huigw)i?*iY^HQ8Z`Nj28p&|e z*76CP%rmPsh&r%C3!~h5-Vo&kjajg9Nd&*V3wD|ixrAhVyI9h zTXp8p=rxNg#)BxR4g|HGr%3Tf<*5&rLz!P161vKAp!@Sr4X&6U3WDZeG_ayl!))?G zPvRK0GzHl%tsjFRggI))mk{e(%8a5BvJe27{ZQF3(vOilPPQtGPYVMvf7326A{JEo zx`@7hg)v{HEB!Luq%K(pp;_mu9Vyg(co?!O@K%G~YSN{~e<7f6d56TWZDYXwQ=+Y# zSE$adJX<4&a%T|0?5UFRokognxMG6f*{Ns^20KSSG|wLeV|~E8TaSef zekuIwjR%jxQS?(GrgPgEkeZ~)IZbTcM2; zVS(e|bnF{OAYXmGR7jZ9(IUveoW)!SH&4e*%qG)Y<)sHl;cNOU;Tl1PEVhUC--&;WRs6`s;W{oWYU62fm@|c8c zvM);*X|UMOs*h=_VN);N14T;Fz>T~7t&AU(Ni{qg4$yM?oQRupZx(V|)AcM!x(Dns z1eL1)OKv3!#iVs*Kl^_|evy!Yzhc$C=P zuI21za;Qy;6(DRu@w(CbiENp<+uMdBvL6yQz=9T0{(~P619tmsUc_9%&o@NTbSw%1};V@*qA_2*gC(bH@`)nN@aZ|&c~sW$7f4fO*W-A z?r&c48xU$Cx(V!(qA=QdHV`P=FkGw{_^O8;70nudGH$(Q`g)Ksgd2E5$u@t3FeU<< z<9~b=2$<$65c~0_-rgGC<`QOKMN;rRXj>^p#g6z#Sz3)F*&k}=iEBWBOI{p}k z+04@w&UOk%ibR9-;nem&hFAdSPo`NXrTR_<+u}42+|p(F4>^Cf>DB^&Gw!GrKv_KDi2$H8uw3bv(hG>w5g@Eg_|s)f_Q^%NSab zd)Do<{O^b|UF<`8z+)UR4iJwL+!`u2REJ2v_RtCj&Gr7e7jXw`UPIjl@R&<1>%5bt z>#Uh6)F>Rqi)xlqV8t(e zgLW|S?5Yg|MIndln9FtkM2Y3nxcVP*5;cDqzu5lxOvlkiIjTfQyQ9m6OcoZWQzt!!+U;s5-t8&3JTilN2|N-u?pCPUgdISs&hQ(>O(@K9YS z8RQIOhg~5)WDCHuVk%1LU=klqM_T5)Rt$@iWf_{a+uK1}l$nqJ{d*2O_;7_$f~yU8 zffROzuj{4V@4)9cg{@AUMhnp{7Md#b8Pt{t(6RpKJhWl(|Ps$tdCrkm1@EkJ7smm@MMyK+pbl za+vtnJ&+jG;LO@&2AZA)J^d|18*n#ZHTCC?LtKwqiKBRp3_fl>JEBFPl zfoV3cKS_0SL=iz`cmBO?>I73GPyIcCx!lr6oYw)4j;mkzj+DhQBzRV!j|J4Ndd3qc z3>lHlRtfA%{!@0!X%%$OZc0Uf5RW5rGMTJtw8S1`6&%h8ITmy3L(kjGV-b+ap)n@o z`g{7Mo^PDxMf~BsNbpaU=RWN>6v!n0B_q6FR%%DMaNbF{Vn&FmGhv22A0oP^`NNOo z7QVEhSA$EDDtLolKG;0g0)O#lJ|H*UdXjq_q*Fkt6&^reXOcPQ_dFat2p^}E+3;=< z42(^cXawq#mloU?w<6Mi^@6EH7Gzl^Nf(5>?iT$-qm$d0KTSBP@Drd}kr79&2?3+DRAfsG*qzxqiKS()0Z*` zvFBZEH5|yp;w~8QAh5XqDE}5mV|Z3ENU+qO+`{x|QY5Q&EX)x)!o1o8%>=08Bt-dM zIHmDps?IF-o3a)>D#f*CD)d~sYL&SI0(*#l$}^c;)t|9O?VqKgw&P(pGha2u6h6i) z(NbdI^pVcbe~o>f&I}!mWdeAWj|tonLP333%;$S({CrUm)2dlDp8}eL%g5gWr5mvm z2gP1y)EkioV=`*nKI@S0t(`F2>nj5t{wR#Q#(Gm5)+kw`e&)<`t-Mm#P=S64^z~o9 z)Y?u_LI;y)y}{XbbKWa+c~^tN7o9ZEG_a5H*48#v2q4+Yzdc>YK^95zZ&R2}wCTE) z!Wh^$YPRjMW5p0w{bJ9zAY9^BNQ#V!CPRq9j)TYMmiDFq*^sCWOHWjYji8|5;|4UM zI@s3>2;b0U)t(__R;xAr3q3+}E9uhY|K|Yu9&W8@#2Kj$DNF9G#Yj`O>I1KSG9_xj zQn`}&VAG_st4_&p->nkji;({v+N&(f2)?pCwIGCtE4@P4cW0Ois#HG9z_hOzNPc}^ z*=FVi_;a~~*wBx~&GW_L(V6}QyY;8(ogBON9Bu_2=l@C(g`Ba?|5;Gngy?)fF7G3y z!JW=Jal7EUpNQlg=l_zpAg~jvT@?f&v8GRYiopFk(C85eKvFVOE?LQ`8nBQkOYz6# z^Sl?jdkam*y?@ANab(u`BH@*5KtV?)o~1&?6U_U>dxp~8Y^t%X^CTMgo=^AVcX|!< zpRVakhiq#nM1ru}f;k3@Y<>n_TdsG7QDSSvlbMf`>rPyaD#5zK+9jNpHljO3RP4wE zw*>mu_tj3VmbuN#yz`SDREwShjYL+vFYszm7@vZDjEL}bW4Mt>O`mf$0PDe`v(K>F z4Vr%+a3JAqiSi=*lBC!F01Z1aYys}i(uB8G`(NWwV%C%BIc>qb=A`h9(z>e1rkyu- zgxxiS?-pXYq*oEO@1(LMMWY%(6^}Lx28ce@Z}WccZbfY5agwc1{O17g zxF38PxZmX;Ukzw@l9mYkk~52mY_@p!&Z)5o8QDc&v@(9^(K#+Ji^vABqXU4mso^5$-)!$7gnmIJ z&J#ZAkwsU!t&i&)-~NO;D)Ve(Oqn55nOWoj$9s2R-Q^@OliyPkU7P}Wy}|2=J5;;~ zFVvCjyhq-6Lnyco)((71aQ~WM{@zkeBs;7o*DSApLrGukJ?hmBDBs-i>2Lp5-|PK5 z*;l)I<=>it{Zdtxw)WP&$c&(;(P8NC9jT|TJVVlw6AX$s`5^NP#=yi{FAV2w_Cg#? zLkMGY>ZM=)XVudWs-UPBPpD!Ar^{~zQ%68153v*`psg5Z@b1}U=My z_tnYEQ|n{BS^o; z*MCe%NCi?drc}2uVG2E|XwenDh=5A0*XGQcXt9z3Oj)vN(2U)M5?f_(s@vA)7$_M3 zmbzRuq0{4Td|+Fh;UxRf{WCAz!O00byk)+on>c0;Gz6^M;WtQfRfe4;fV1b5NxQpw z_4qw8VlVB$XZYcRl*(v%#8P*NX`q;H>}O8GdXK)Ykr_ehacXJbdgCc1{J zNolB~5YL{;w*-f~xx_YLWOg6?W7DZ@uYLRHH)c2HMtJBBws;E6b|LwLg&9A=1&_%K zrNjArY9D%&;M@@OqLtMhP6J~4uyPNOjGr+V-aop%AG^#_AOTG4x*yg>!tdD7r#&Fq zS3d=y7lgI8Rr?Xq1Y8HrzRsBNT{4eu2Nk{%-I4dZx5>nQNB+IOE3{NR`7c?L7qQc@ zr(c6RwxE@6j%@L5bZilQbV-TDAqxY*iJysG6_orI1j<@SpPLLZ9MCT)(UK;l8m=Am zyl99H5^WGgNPSA+KVL6WN5RKMEp1-u z%=@$R!dTGp(aDM6WqFp6s5$0#cF>J+s*XY+2FySl(6U8;{LA*8A|;|IK3$!rvOCh< z<;9J^_=qAsytp|%2sZkx({B%NM~ePoe1sxOHlM5giZ#1@i)n3$OTI3)?z276$JIIR<7sjXrw9s5-Rzd zon5CxF_RDc_Uhc#6Oyixlw@-6)9Q+&9Svtz)f7B93t4K?^75Hq>DHCq=lv#y3ts(4 zpI#%NEbc)^F%b&4W6GlcW59PTbQ>Vupc<>RMw?e2&FzW*-ZmvLc3tU~{m9hkH;te+ z^G0Jh>3a~=M2|3+`}v|rZGtHN1uEzh0f(hKkTd`LZlf&>?-@G8P|)>91dD^X#?##S z8imm(r}PNF{l`9{Q-50jE{3vTUh-9`c#n-M^xtZ&rjT=TCIo|?bIr-mC0Nwt0|40* zph6;9Y64d*jTUZkFDkF|4EVY)`Udm*7wuy`7XEu4N7p%>@r!DI?|!ihlnNwKh}GB2 z#Zc~rbto_kCqprW6?|R@&;olU4mNBiKg>DgF#whU*_rN-KmBMwby#MO$xc${RhF%V zMA32Mz$&@T)lDS#b+oG91gw~&qIva(!Q-t$Bpz{0nU0vKx_++?0Q3 z`;bRhfs7#%I92~`)S`HZ%!^*3LTCW4Bov}}1LPHL6?zy=ACg687i+t7VZ;odhWB_U zlO-iL5DI)eT z?~;%N97$x-N7sS83g}JFK?SoXnS-?#Q&;}TpPij-ZU3?#H2UlbhSCUxb__KX8yFQ< z*OOB=LtB(1G9;BcQf>Ey$N)Sf-!(2_mV@-P$8=~A(kW*4$hL3>a)$cnS~wZX-Gp6@ z8sso#L*Nv80&iUamM=EwXjkAsZLoqHU@;G_pp5~_{b9TZkW3{t>^;+_GpPE09aQ}D z^D-!X7QAss#X8(#_3}_(5VQ4wQ@vU6?@_P%7paY{%~?>}HyopHHHTpqWJq+R@Ep^v ze1K*jEKT1~_RQZV%FZSaK6$7ByPW_~pkEzjB3%+))L7bC$#z{@fS*xhQbwUaukejM zZ4)SYHEMkqBkFonEip~_F}g!F=)^rGtNmTtSvPa)G+XzR^TI+YmUe1VTi2IQ=3;^+Ni|w#3%jho$CBT{kKC8t{*`OkV z%E-GnB*x@&xiZZPp{{O_V=*jK5=ah4l_fudjRa&`5L7%(oX3awqu#E$sA#vREPI9n6OyD%5Sc^1R zWrO%I8mg+?DssO%&Pm!o_GU15JF&M#?5p>S8n7=FOr$mv6gYXAYFM7vYH6o1HQo`u zJ;&^|FNMPN$}m2;naU9bV(d=_QZ`@5WQb{egWnNM%Oy;se3rDL8d9mQ*m|(&U%~`J zqA#CswsL%6a>9*nH%wKL>U-COiu5SZm-{E(glcm2sj29#Bp8pLr8B?m^DNi8BaEr~=hbR6U4dDd@xcWqi_dmf+Be7T-2#!&3C*-f*FObWf(| z3oZ^jT!jdy6J!`Vj7wI`(=rnz)-Oy3t!-!H7CaFP$ebXvoDchJ%ElJm6tiR|g=0oV zi!{K8D~5T+%wXi2lv85qsdv9<+*3?}%Pf@gsNdeiWv!Hm+-LS;!6z}cS1^$qp6lX# zNMn#Xkq3oe!{Q$wN82a2fI|yBpCEHZACy?>b2N~)aA=L#_+bM=@q<3k(RXG(|MdW6 zmhrNX?=wDScFf3toI_ZBV+;cmW6!9`u!-S&mHqE)3&#dJpwEleB0Kpv8G{yvgwFAp z&Wcg34b^f0Iw79LZLil?2@3v7klIQfV*$q*q$0#yjCm94`g|u~wfkWI&AD9ly%{3I z`_T(gqTPJMFc5t}{$tr>bn~%AVTNA_Ky2f(l#VX<%5ijtbEahBjR>;{cdJ?RLPyJx zD^pR|$W#<>QwMx={nQ#*gJ~hwD24{_4mD;xYa_WRjl!BK`7LK&cFe`t)nG#7>l;p6 z^qZdG5g`KeV`tqZgtfq8e3EVRL22Q5)IL-j5&65pa$bSpzY;O@NRYF-HXjCG(0$ zO36tD%t%ANk%mf_T{>HsQVZUD2D;86m^z6*Ds4Xyd=#26_{fye2W)U%kiQA6zbjdD zX#a1%iK4RUKG0NMHK&h(MUlX%>#3kC>|Dfp%vm8mQ!a`+;#78lDc#&95W#JKsB?=7 z-&*xXyg9#k%&pBWV6t@mke%n`FvCkz#9a!17vk${%)Z4;(OatW=;SC^33Yh&k0;mr zgInL7v(14BlL_n>g-c&#j?SoEER5i&&^}2reZeBAa+zlUSb5?Sw!Ml5`S+;*s zTIJl4MTbFm+h5Y1Yq5HhSGJ`CDa|JpxlZzo63t?(0@Pz+K&c&idW(q^Y}Z9}*yfFIFjy(+0bjw@Xk= z#jJSSD>PyiU~~|`iuN5$m7GtoY%jI#Y{Fz;@q?m z&AUe_N?_%91w-h|>u~UA5|%xZ4wM%B@Qu?ylYfElwgn^rrklQ5G)-s!8B3alM0_Ay z3Q(T)r&~7B8DAz97-TQ6FC~ant6vGPQ;3a9aSHa`5N3)OCl4*ct(8eSNFV{I(NXjC zYk%Xr6OA_?m}d7U4ly5czEYZS0&1}y}Q z_h;TNthC*aNqYKv_afD1X+D>Ak+6iY*Di`G-!=N5-CL?ghFxtRAm+m$-7ujreeJ%B`4WKo=6b24| zb1l7**ijHfon1`~pj**C4Pm4#(>RVfE=M(^+(xsP+R7&E?Gc;xx)crhu}J-+7+$V< z68}+?Alv*!vh}MRSuJ!vJF~o=l>C0+nX-A zd_JxWSKmPMfoJ_xpUqN!Ov%rz@!W4HRBv&w^5ruRo_sDBJR(IHAouQ+OZv1#);k#^ z+j>bkM?aZ=|K!v%;h@XVZdER(b)zH1Os4mT(*G;^pgf0FV846-nR_pdLNj+N?Oo%@ zdrawEDoS>P%ji=s4Cj}aK1HoQUy#H)4noN8X#0}umqnNsmhyN+S{2+n>Oe1CX~XN) zDryoyuNUTT6SL3KoQ$;cpXo$?d!CCoWpW0v&P0<*;@y@rfY#+S8w5pa(x>tIO(jVz z6&)Bx%o^js{y6=&Kd&=S6t0bFow{A~@~Ca`eLLD*%I1KJ5-iU&J-VplZh_%R4w|R@ z6vl}WD48-_Lw+%dbx*8upywOzS1^Mr03J##1y)A|d;IB8p1o<`*nfJB0bY)NkT$;* zF7R#Ucn@-Zbds?7;C!3{Im|fT5$$^jc|hH+BEk(C)1@DmN{g$JpW&H0rPGNHS4H( z8&aXNWkgGNHnmRFnU2C?P6h|dhlBIl_<+h2!Nt;>o_UQ`sQl<4Y$1kqbYUY(EDrc{O4c0c^hlY3o6b!}hK8l&<3@TO zcv?&2Fp14cPzFx5{Sq?2Q88X9He7)toD~}7Cf%%uH^L9ARxnM5M*X+lac+pinCkyY(1H!rjyNNkoBc!+qY(`jgU)`GR zL_;~bN5VLn7QxL{4i5&sY1Pk5+T+vyTO5OqT|N|Pl0%S2<#63zc9K@yn}p_(R}(Li zx0PkuMRcZp<7*3Vm;WyhVZf-p!CB|`47}8Ot()pvf68C?un52D^x#YLp)kQ@fbAx! z;Pp1-kniq}dxaZ5N~cc0^T;eZD(*xr6bPD*bnNo$H7n%`EQ331C)w9&E_@gsWXujA z(FuX+dGCKWnr0da>x&foZe_Y|2~A`(+UjwC7`1jw|WB8j0 zWXv7bzK&EeoM~aKa*s-f($-;j;ile7Qu9~y#NX%+J6aek;P?Hbsx!3%OPX;J1!H@j zs5E%R8>81!abl>1%L_baK7iO79Hr;krLz5MB2s6 z*A2z;gzfEXtzT1Z>8KxcbhUXeM7N^z_&7PtXf*%VdV-@y$gP#4s?1cAIc*}u0k+Zn zQfM|d2S|;%AgM*2NInC$?rPq&k+dNSWn+6Z6{5XE0nF*<&Q5u!O~-J~XRr9iaPF>@ z(K|0DxHhlGQVHxe2l*v~aI5pid%cng0t^Kg>7SZyvyDqhSinmWSD9eK6Ykpw&RJZf zSU(XeT^1`vO-$&o2>n;(K?$4J&ix4yWI4jVXA=uW4OQAT9i@tOu$pZQ&;)tvqBix# zQvu)0SJR%{Gl+k7aa%onYHo^p`rA<`XQ6_+Z9HMpB9smf3iiQti#Y}L^wEu6ihiY+ zy_I2D6)|j`-JDGzt@L-LeB)}5<=69lp)7LY)|r?YZNiDA4#w_9E!=SKEa?u6df;cc zlST)V(?I!^DE&ZziHWT|n9xA&#+MvAy}l>Yq;6=>^~7^!_SJ?oDJ*a=*Vq-J>sD9v zqBBAICoV_sL115*M`QYMqO6d-V{V#QT)z|k`;^AFH#xNCx8U&hESHZ4m*4EYom(5F zdj#`4Ag)istqUMdThNWrLJAVU)k^YDjc@AJk*9bSw6fIuO_wt;KTjm4>+mlsX$BztZcv%s$QB{cYtZvfVK9{Gn6PTRQId;ufA?(S2;uXO9l49kl*KrtQ&sqZURt%-ry4CJ8@=9b zILtjfZ2TfAdNRCwv_41g68G_t|1WRvbgulF;LtEcO0_?OElO&L#5l~?7uhoo;qsPr z0)Y6mO@+Fq`&Yycng*^t@1Ga3mA!kl@mAyxkWHR9j+|Ix_q&}fb*2qRirxQqoJE*R zUzjhXLiDJmhyW~r3u)wT`ViFeK0Eat0No|Is#igOW*7RzFm&=oQKR5^7uQ&c|Av&7 zYv|+%_efHo+^LGK zCuet<>MBNBVNi*-fv;UR%ux6^8+Gzx6QhULTffbfFPP-}Q{>5O{|ircnTzo&T+qR< zq6+$g`j0$3GNb{R6-zVxVOfswd`4hwCAuSS?}R4_t)V0t=Soi`I-gyRuOw3?z@mX z10r`)cSSQneq3)R7Fl75Qp(hlaV6)s<+kGqLlN0>5#M&Ac8>$s8`O?T_~5(J>4(+H z#`fO$<*UFFm^_O$J;S>TePbcp7|ujOvqMM%GZDxKdK4CxfMG{KGiCYf6evO~&epJ{ z(Fm*CZUs|5Su0Vl^w+oks3Y(j2E5jpEFaC`<8fWe-}VNe-H;tS0v)S%4=VcAOjy?b z^!OU2(|AUi?{J;1C&0ViShBsu=EmCs2}`mcn(LtNb-4Cvb}#?6$8{5>R10&@M}96*EEOSq zZF1WBj8^}Ul^PT_ZaIUo=2;}?&n`hX@AXDhrBn(9BIu$2DB}|H?23NsB%)Qjz#@86 z)f#wSAIeEZV>xOz!I7^fQYD&>?)wXT@_Xot_Y{f;zQw-af|#yYWxhPlu4zMsDf02S z|GEZbrsgw5>>S$&{i2^SxeJGmG0@vv5QWFXwbbQ(~!#)+xyplo(iQ6S^SUzue%v#v~KgYHD71z;->d2Iltk5%oaF_Z=*Goc3=i{hO&X zsO+4SSE(0ef&7LV%0>ki*xx&mAen85^s+A{=Da3n10EcfqEpRQmVvqPF z;LETUIUuP6_oyPo|zm25N%0x-U7D5j=GZ)_Z)u#C)Grb~YA z{oTnD3W_EH%t`Zvn7k~TMD79yIJ`&L2}C;?6ri=2Kg)6_in5m6V)q@UM>S9NUV!fb zb5gof;`*^0?n8beDrdF{9~{GJ>|YdvQ)>|4%H#FHs8sq|TN9sy^1z~GrI~H(&^Cwm z`uy)9UMuakTqDx2$AtA?c+adYWWl2Ncq&Ay3M0}O%O2Fg#kJIGn#EL}-r^6^Ny%J$ zOmK?q#^(&Ad${Bq6g}evNIK(AT?_FRi;Ej|g{=UFG5MWZHs8`{XO1Dc(^^di64dj0rI|fF9^+S@TL3e`w3c4=%__A{NF(2@_8+uC$l<-mCII?>@pVw zjt=@?)x}kaYMN{Y075N@SpB53%zDbN)O_D7_sbB-;#=KcYN+S2nZ)p({SFjxE#&Rg zy3b>Yn#&Qt-ieN0_VHZfm_d623#yD#Q~vS95R;!Bakr&LAMx*!DeH-86DqAe1+)iu z6DPgeD*yKy4t#Zqs>#qeGhz_4t!LsFvc7L`WgNo5H!M4nLR)qjR)&3ApEq-~t-N#h zf$YYs?SQh&?D}Ca@B@3$|1nTYE7AzH=(4lNdDs2D_HuL{?pN!oOSzn_*|aQVU*`V+ z7(nO0Te@l(q$qUL$;Lr_62jT1`X9gR%b7E0=;+a-G<8YHu56?QktF_d?ZlN7RS9BE<>-Qs1u$CpX~M0$TYf6X z`F9Ox#oa7cPpNg>P2xjT7Sqn}>jsMPd7a<1q-toFac*2m@TgHyt{S(hR3Z7=b_-fZ zQ%){->D%8(PyfMf27XPI1U`0!!W6znUCPt9LJ7PkKH ztZs@`oUMNIbMpqkwaq}HNqzunmy!^xSg=y)$EGA(0y*iw4G5je}_5`?hG$r2A{ zA$}fw-$&(-E#H@Yy^*Eq7ZPM$+_)#jHq50#gS;__SwUQT+Ti z9)E@|{wkW99DVgQdObFm6o5#6t@5_A4DK1BTd5E|krjxDi5%1F`_%o8tbh7z+&=}- z6!y_xTE>j_&@z7Xxn^H`hfrgErzLr!gtWx|%~p-`A9o3RK2_DYu%+>WSsw+8BhRmJikWxgwMlEuMl3{!xas8}`v%my>s# z9Qy`Q`AognGI*%t4nS1ir*3~M&n_37pL#|L=sNv=3j+uBRGHj)*d=*kP)9&&_@JV$ zHv#%6*0`a_>C)*46>}%dWG2&;3j(D|cGsO90sR2$FXiv>A3Os%^ZIO{ zpPeLQtD%e^B%Ez^2n4{wWyfguiPQ340YY-iF}r?>tFgITCkr2OHr?0F+^GXx&_P!^ z7W=&SJI>(SE&I3BArkto{W#yA#VB>p?{0>JGj61Rvjn)cu6&pb5s z?D7}ARl@+_rps5xuEksnIt4|7$&LAzz}w!{Y|Uf1DoX5pX*W&ySkb*d|3?B^Z~VS* zrI%73Y60H^@A(il>)T$6P83p~cXIZ}FTi-;}7PkJg z@Du0QPL9VN&DE|P!@>%5h5n0500s1vP7DG|wpa%FIu$P!fPgwB1NyGsTSo3mT=i=w zzx27PwVw=_<9aH0S5KBnd}N*iQ0~bH7rbKpjU^<5NZsD~8jYOD@Fd6~$*8s=lL3$Z z@on_*AAgFLue^jVX~}>azw6J@u^X?Zq08|%-$+j#J8JnBlE-xO4f^vn@02DGi}0x6 zHerH}GlNf4mao2;jzQ?ny!i4Dkn|hvaTSfAg5yCFY{?Y^ph{Z8H7W` z)>l+O$#yLg{?ueoWXaohL!O08UVj};TSn_+TClz{sx)?9tmgczGjg6F2&yuWTb`KD z_fGg38E<_FeQT$kZ&p{&I1#WgKQBoFcbi>5wy``Q?&sqmyZ}`pfGV4ht!fGSH*x@= zk4X7Zt84(ESP0$Z#IxKP!T{X*Uy=oogS__%$*=WFhd5``P&lA9V z_uNE#`)KxO*?&)yUY$6hF#fZLVR+7ptYj*a@SMkH>FViwsj#35K$LFmKgfad-3v8D z&SWNEs=TZT0I`;Y5-;ackVk-jn-!E95wO2Zo&?psE3&BZ{iKO@8Zvh|mq&V3-otua znWe}4hUL3{8K{&?JU_w#Jl>A*Ow7tiA*L=D#jukPVBFC5*0!_r^{A$KuA`lMv3P-8 z>A3$#r86wV5P$v|N+Y?FrC?aCZ5tG?+CgH0f~bi)-?A6=rnwq;c;w1sL5wLn-43ll4&_FInom$0g_=H=jh zwx(WXWRVuHI!@!K)_i;>AEz4U?Rim>W|aqtBV}T(#9Im^fW9H^l1Uxf`xF4^t!P=K z-20C9#)cOnYpnf9*4f6xY;scX8UV0qCkEvbdh+~`;Xff^UR87|BitQI=Hz6wesAO( zLZ7nrv!-!NJP5(L(VSKVXy5N{?}+X;SI_BMAY{q7L!Llakx)OMql)el0e#M)5&)4C zK>+r0PZ@nA`!@a+2{oYXUS2U7@E&k(?>&qXvry2r_#B%XYen~J_g`Gn%0~U_#Y$+V zq9>%FCs5pPF9qPoQ{`XA5J>I&Rq3;p&9jy?RkqcY+<(K>YGeu=+db$tEDWGbCCi#6 zG(9K;pnR3jinp7|OkOG(M(WI$KzIV@!N>%_v>7(O76z=yvO1Hll=kVWHzk=_*Fw$j zPoA89VmX%4kp*`j$Mt%$AtGPkpfL0$0`m?~&s}T1?~@R_+&KxYuda8_w{ql&VWX%` zl5b0t_AEY~-|8rm`;42 zK)7u~S+aY}x#UzZ;0EjE)|1cCE&td5h3@?E-)aeu7oMkr72o@Q`Ga!KFSg*{<6o&* z7KOO5Bz|NdIMoG&C^>`JQjKlLnBvPHoAv+l@BBI%f}H-$!&-WZwC}OSert2nyk|;s zz79&taMwqBP*8dmJmy?1uVrv%&#bMdGeta?kP3|Ll7K5&^07*uIk!8vfmkM6B0v&= zT7O_gmKFIrwwENHwBwU1wQ@YyBu}-SSI3lOm9O>Owe`)B{Z+xb?B^2KVm)@VC5`U< zvEQUW{lTB6+kfmgXubVBMB%cN0K-U>RY(`=RaP*dKCx?OTWPOTdk_T2fjwr@@6Olh3^mEKXaT)ENF4@L%d}Dbk;1yKncj~OU{5pU6 zbiox9JeBor79Yc8FFyW_Fc;pvAmR9&t5o@#CSFigNgfEWy|lDcJlWb;uBcOEKT>ec zV^+pC#-qK~HgD86&N=)_5*DU1rZKNnA+tX|%k|r9ZO40CSIJ0^;z>wEdx(19bjbQY zHlqQy&&|!#oXx$H*8g&v@^mK!2gG{*k>EfY7T7@TCZo5gdlVaoH%# zHj{&8KNqPpXQr?8v9JOw);Wvu^YzfdgIRju;!os;bJ;B{%x>im=kMHkpx2{Sk%=Yl zSNMW0|EUTVqeSKz9W4QdgIrk;yGmAVv6B$1Rv$ zKXGd6VF2s_u=4s>(E4W{aS%~?%%zH|8*s^1D<0Q<7m&@?pPU^SGD$GbR_@J+pOf#u zjUNBN?X=R~>$QLN8=qI^cCH=$#790$k9^=(N%|JSehNU8+hML66##2(S~(C*?q;s> z$<|w%#;x9!BnE8HbNNxauY0Fk?!QO63l*Lv7U)ve`7?C>93$10U9(iIf4dJzZ zoRC`s9lgxmEDiEi@SpFe7QrScnIO3Ap~hhu+>RhyE0KWZCSbgO8R2HOIy## zH@Tfm-o^^pOLYkr%;7nsujReT>vD{L4t;u$l@Y5#>ccDl4xu9s-fS(BWOnS`G~Ol5 zfV^$KwX9Cty2|Y_Sjr(=Nm5V zDDnR7+S;`9Q8ianWFEwW0to=wg+GydBB4DoSJhUcRp*`Lc|K|@Zwjivw)qEOxWE3V z3G09Px*G;?*!sWT^P*f_Ui9i68{ky7^Z@h(z0V>o}#-QP;dnR#R^M*=S` z35eS2U3Y89Qy=?0T{~q0faR+1`6jymGrullo)z9v3oN0?u!|wj0}{t=Z5b0XRbr88 z-?xpsOL$_9fJD@e2iRP_|8ctO$A3$n0x)%pE6a z^T}uJDpRoP<2fg{`~u`tE?OZz!@>fM3NiAHySGd4bO3s#ctuQKIMY3>rbmvf(1v)m zXn*C>aHAtfI^zQ#CN<*!gD60%I(-=N^Gy>K+~UzurvjoW#oQPM+>JzmYcwhnU@XXQ zkO6WA4sAaf@v{aw5XuR{rCFO#Nr}dPiCpon<ygz5pM8j&-wYfH+2hgU^h7?@Okx9HmSk@mn zMbj207D2@6nA85(7;;j&U#}dl_hpFM{B9(HTmAvqDfiZjE@>R4zee~rLVvCZz08Ts zu+CzgL7$$s`#;OZi6@Mt(9jv_@2T9Y%#&2Y>?%TDkg~4n+?|~8Q|o^+ZvpcxARRB< zHY+R3?O59;bLJ2)q?Nf9Cr$Z+G;W{Cx+ZvEAiqz!mJ+()JcG~WN(u#I0j@i=ZCrEF z3ksO-0`Ax!4qE@2R298dekirN=)9M>hV<9}NI7)+A{IO!ndnE3*?k*ktUi4KFBxC2 z5RPK~wDFPPKjZWGJnLWs5C;DT$)s@BnapIG^0FWRctEiglwIx5R#?erruS?Be_uoa zv(kSMo=lm1I9oCR-T=$X%d^R#C&Jn{dBXOhlnYa)epm;NM z7wxVTu!()jLZA2SyCI4H)Z2wmy|}a>?uZIhn%?<}H7Rve38H8{!0&c{v&8Jd8wOwq z$Fes-HjOEA`q^0i=URX_1X*d7^`+NeLmPKLMzD1W*a}J&k(JWRjVXo6U3(prN9zxY zJtkEuHR)q5$Me}4*z?~r0&<(qvxQqKVujt+H78ffMpojkik?Y?1c2s3ieytM8Ms#$ z|GI*8#%eO8tnuaTzxnGf9fb9t<;f4;>G#BU&2uy7w&0DsJh$`vQ5}O$ybr2$fzlW; zve>7i&{|#ukAV)#YYqUe(O1nEpwA2zTzFZCvTFT;jI7Z-1tjs*z+|w_*FrcouFPg$ zhUGlkK4KY6<3XmX0h7xv0Qc`yLczCKSZQ*X|D%G>%-T>n~Z0WaAdP#L@*-V zHK4yD_&kA*Nz_{p%KRNntrI-E43uIF*z2yvvy&6q)ioWr<}S}h8@AqiUrd_Ep`k){ z^Lh|t?@PSD%`sI~_9Y7i&<{FaWq`#pCzTSX5jaOZLSLhm{h;-KYkkwYN|MBXY&1A* z{fCwi83m9q`+1#|{mW}1$@;xr$q1H`uvULt=T7tL4db7m)9A8ccmS|Yx*y1oy6a5c zpUF_bd{?NG-$T*vOM!2EUws+sJzde&t>6<>|I<*5@9iu4`Befu(;so zE7Ax3IA0F?_S_9SV3?@b0Mv4Vl0t}W>?#VdG-$nZHN<2(-GbjCxa+c9`-9&>)iOV; zN|cOjfK05Wsel+E1SVXfD94`yBukzT+`*^bOb2 zv}NtYDPO64EwlNVrSBmHP>t^(APnStBX6+|X7oXQ2y#3pA4NH59z#18FE0rxZA>GF z$H<6(4$G49opk(<>R7P;95uxN9U{TV&3->9kxdpt(HQn#Lv;MQk z;8?)4?!(}}vc#0#VmNL!Tt?W8#jD1o#cN&-OE zN&9&_`T`z$X7roM5ahfj005xRrVc0re+K95djC=mK3N1>Vu4A9vmpZb+BsR_kZPGu zSE2&GcQVEMp(FvUR~A%hwZ(f3mb&M{7URZkhdrP<@3XWQvLH&5vVQ<6EF3#cRFoW? z33NgeTubpJrkvPku1E3F0T2qh+i(3dI3wi3Z|3I#NJxp)|X z5k64l;g+1jUu`522q0u1A5{wYK?*3*lsw6xw7U=h+X7s8+YTotON9_h1~x{Plu#3u zB_Zq3uUJYSO?2P8KP0&UrYSssRzCk>E-N7xPB4b{Py!}8)zcuni(oBps92lPSE5B& z$fw{%1(~ENC1T=0&uq0b6Do5!MHIIz`xJl3GDK}pYT2Ky|7n8KMw1{5?D_tdh2%D81IJ?0>B`m zT5d_DO$Jq!TT!5ZDC@6QLv@#%)L$bJ5Es|(9yy0NW)3-Fi-dLS`Ig|4{_S{tz zlYyIT->GReP5Aw?ut(k>iWEW|lDN4m$lXa}bDuQD))g94e`LWP)04N{O;`V)-aK}dPoAK)Pd?DTet{@t4~JDw+Nvpu#Ih4b(u)rN!$n zr|k!yHuv)Ex2JUI9{ z@LaPs*Usm=WA!>{$6T{GZgsnnj6=?(k9jNGa$3TPw2d)G6>wc(Jmz|N+v_LMPXqWD zc|*wC7)M}DI(YrxSlj44-=&o$dOqtvt`olleV_^bxJa1D{D^Sfi3+hw-TRRCY%CDS zy@KrP2BAXwx^lx6Gz5W8+I9Ee4|kkul(aAbYnoSuAn4;@ue-Y^SXSjV9i$GbPS5Kem91iP$ zlo)Q%2dq^Utpxsy)U_U9?;I>8DzZ465(SI0{b=tVni8`~YN^{@8%{aQYkuG_(&ClJ z{kox`z*^HZs5f2S=b%@$hW+fuKcHe znO^mif16gm`OD233IN*p@2D%MX85noq%>71aIH;r2Z*l+qxwk9{d)=oaK%}r0 zFEPv@+p90HDS&>;9{!?WuAzl?P8>q~KfC`^0GF}iiH9?Ubutt6##4N*M!p&_llPU5 zS9ta~DF6bc{crimiuXN!-QL`EK+Ys=ZB;(7W>5y{Z)B}qJ1PP6a~U{rM|U7#V;olz zLS7>H*E~smkX@v|{v(e8HnCpHrT>bY&HAt3AxR{N&F=4a`zUqJSgv(qo+m1;RRDAt zF(H8~$c=h=7-axgSIj8=uEWM2kBe{@UH79E|#h(+tswah6HcgSoJu)E$>k(UukNxF0 zwZQ*fwD`Jf&ia~0?en?(AAVa)27J3btC#>2@uwO$YvUzH@(AOCyg$?q{iYM=UQ(BcVN5xf5S5P@_Vt6E-i+A%7RT)7T&(KAX8VNEEdyfUBUJH zyFzr>XSvR7%)BX?m03gj*AGSL;rHD_LlSn|z2+bNCE6V;s9?9w%3MxUP~cMlXUWJ7 zx8PeY0e)owJ_k#`S@9X{VLQNoZ3*1?T!`rxz-CF^MrOeka-k}T1yLzFQHfzyfT^t_ z;HcfsVFhbhug%nSn_3c3<0_2$aYrgl-m3fgpq;j#KB2GPb zyaYmW*v`5a0bu`^FqiMu6VM0U`@s4k)+f1^s^kPHNf`A#6JA5948n;)LGY1{k(kRS z5+u?m+(KLhZ_55!s_$V{mr;_6SAYZERN89+`JC)jOv;VjyUmE#_PMcV(Wo^Duu%Zl zs6Rk1kCR2$=BbySi<+ZP24*Swt|w*{%h1f)GFLygr0H6)Xqqqy6W4Ve0oY8J3(^ zIRH40{-A9C0N7{Cu<_)AbDk~WmIZx0mOnm@e~UB4;_qyPEw+3d6AqJv7cTyemAwl~ z0@LfC?OkBLA@|;UA6I&pduk}UP$C%;D>t>( zpohY=yS_!w-uWOMA3%+17QT<;Z+ji>K6Qqk`t@5xIo@q{9i(xYBve#N#=OLu%vz!d zb>thjSn0{z|LWS6ZD0P);)DDGs22?@cd@FJq*US+P?h9I+?I)u910eH{Y_My;28DB z+U|;XeFI(g9bZF3lBaI@oP+=r!nP#BQhcXMcr|LtlleKF|1&29+-?b*U8+fwE=mps zQ$nTBwu<33Kk{9)aQ$WULWLFkSN`bt(y9OD{j~Nc_gKCG%~QZib%OUzRFpwjDt$y0 z5@RZ%RFrM(9-xO22JGfvER7r@&q)z^j$wj2X;-A}jZJY=uB_eL?pi>mc`5KEXq-Js ziL+$Si$8Bnv5X$ac=H^=*TcjcSw#hadxHaRfz-4m+OKsiaOqL)`y5_$#XG)|rY)RX zb+HE4!_#=JImp^+E;I>;XlI0x7=#T#kL^$lxu}!EaQ`QQ~`f z?pCjm^_pu2V*O`%?yiTtG#^L|H|_ZP0sv1=(qaAC`<(Rop~{Q4NxNU$4!dx(w>dtJ zV?K=6TFybjUoGEoB^`asYv^dZhAp%NG5~*HwjOwjcAh*<8+SiSYoEBE@>8pJoqA0j ze^4y3#BGv00G*|*A0Rv^Sef@<|9QUP1&(gX2(^@pi7zUO@&c+ZFE&2RdC z8jA3JUH08yFVEuX-?&8qeG59p)jX>OiW4ug@*@^0u|!ouh*TEet0fQXU=4vy$DUv+ zZk~AN?3#_ZQO)*TyG0OL{wWu06iaR12`q3oZF1vo@Hyx38`?IPz3c1g^6&Wu8k#&} z;UKjsekms>(2B)GKeN?p_qknQY1&v@qoc<(lmP%i`s>m>UGp!#i{`I;;ov{Yl|S%K z`eI84eDOCwE}xqm+*pCP63D;C-YYSfpy-MDFIfGP+O|u0kd5W`e;aG-)~_@Mcxh=_ z)&oA(VoM@3c`YDjcPvB%_t#WafC4`DC2<=6COd{C4Qk`>esAZd=rShGSiN2egye78C+3s zttfNtVd5|_hq>H9ZxiMSCZ!rntaiz_zF{!d|F!!c7tf9=uBoJT>s7K7DzFq+MmBqf z|I`J=_zd9RDJSR&_H+%DiU=T5+b@;Z3Z*y2{Ri8yKP{PJ4Amr@#f$KbM{TJ)Mh1KwHc-g-%Y5k`O zptb+G2l6}L7oq~!Q~Ia=Peay}GyqACHBNOQZM$)k2jl+Fa^}qHMEubW*XVAa$xNmx z=S>KJxP0y-&jv*QPt_5Dj(`CkL{6 z)`1Lete>)gu$sGU7`bfjx##TW9z4_i^xT=u!@)qJK8vAF=g^ ziwS|lWD&7t6NInxAg_m)n_w}H3rYMgE>0{%DFqlk018)LYLi1bD_L&?2&ZzNSV+6w zLH8Z+aw$nz%aSbOg*-}~MLJrVa$wr=UF`nF3Q!j1{`iOrXt~ySoGMhcc|3^HZdQ%D zM*VSe3kHD6iT8Y%h9-P37q=F$8~)?ppz6{U!kzCnB_UTu$=gYKY@(7cDJ=gL;+x~?}GIArEa!=Z4qP3LwTUuVCR9CJ@ZM4cQ-069azqAGDD_?sf zy_CWvz*YbB+uMa_-W1=)MkR}lJ1PpRyDv8daA~y&8~+u;J;?iy)athI5dKyGKb2Vj zxz=>QxUgu?Nj(a-+hb6J90?;KlKd~@6*acC10Q?!*(XPQv1OBMyr&3E$q26khT#Pe z0bp(9o0P(|?d(mUpm7*-`FDN|9s8Eo7J!6OkKFQRA(h-06@rPd@KyfO01)|;KieBq{1p$=L`Hcw$*49beNx3{)i_ z3cMRS{0E4G1UGgfgk@pv(`lrTdAx1mx=ZPm|KWS-vcLV!UveIiNy0`0CIXmL7+rBR zT#L1j=?|ha1mY0Dzv|5A`>+3OG|)bv&+N$2BQMhWA0Dk;SjorI^=9mx+pa4);Xr;O z{0^!rC{fn9he}x^vJ>V*@c@vJtQ5)XzLXpQLtKkza$(Bg34p^~{|^Gt@f>Fh$X_gp zgu_9?*M1Oz!DPa@yzc2s+IJy>VEcYCSLa$rt+jam@{4?7QgB${0N$v}VQJ?*?6@tY zlNk23)iolA3E30>`J$T2G3B_j5Km&AyJSP&b6o|Mkb^UqR5BLVK{-i5S<%eLCHuWv zxC;?7L@xjcD`?mK%kQS6Z+opP&n#}~Z9)PmgRE@HV?cro{*=jqy;x_1CBF_9S_L$f z0~$>XXpcUjjw=6-#k?6wqoK_wulmP- znU25x^#sq5U8^Dy=h6mwI;_ti9Y$v!Hu2yho7-VME+Jh2SycL2Dsz{R1m^w@f@SXL zBHi$>-!-VpAnYA<<}=YdDEU3A-@H8(OFr8PYa`5^5$P82%>N|DzAmJ=Mww){EQ{6u z+rNsg{ueJ!9+CY-@{9cY@1>=$yOFYa6E#NsVJ**oT_uN%mzq3a{pV^y+t5Fg=AMdG zsJ`U&-?nGphEbc#_wii*IeA+}uSd#VU9WIm$qgqm4_N=@?FeI8zTpZQf;{~2Bc2ni zFERWiKIfUtWZE)#0^lI)KTl?dmHL}@R(%dRIE(~f#rL4f02hiEK-cxmw-!*@V^}%n zYA7-~vfvAp$FX9uOGr*umS?qIki91d|B+$GIi&2Lm&Rf%=(1bZv0r~3kK}@$GX({@ zyDzLn#d1`R2N27>^OhRM#nNf8LY1~~Z|?S-i|ai08=@Bggq5?a|KVStD_cuVb@>rh z-Wv+m2yN$4ok}cfV-Da+V^xv4U&Pxgc}-~foE5ND2HIGhK!B$Jl1EbZ=Pd8d>tJU* zRt0Qvj;{RvZ=qNHi@zp`sfKE8co6Mwovy^UhVgFzS&5_K#lpz|Io>_n0NL2uko*i+ z{lj`s zVwG)qAHzNS1|NT}16`MAa$(7!2>@Qe4$At!w6t{S@k1!7cQzyd69AE&je@EJFLwbz z#^k7rIqlni90G6#wQZ*?ORPZI1m83zE;y3DSgd7%Z@S?OePS3o3zs)5F?>cAwM;%1 z!$=tTW6It0^tVSgKkzL6l6tH^6fq|%h(akQDoL!GQU(zj>(xr`XDa~2ew-6`4bclA zF5YaxyS4??N517NXjedi_b01#Api!C>qE$q(G_-VpJ5u+-)OfP4U+ zhzsOd`)^@!$rV<4z5Zfadi^WtTnm?=V&dV7fB0=wUv|_(Fm}bN8^Bj4Q(|?X?v6ES zWEpR2z2vbjbG@}6dpk&9vN47*6CsD%KEiXsoFxY2BRJs~Ck3pmFM?Ep6{?e1vi*16 z-*_8MQ`SzL@;NhyIRzm^{iz>NIQDPpFIHidEyrA8WN32r-+Mb<_C0U)bpf^LMN+)~ z943@f&7rY*psI=|1ah$gfFVICK%`>5V)e&dj()gw!{v1Szy6-Vfq#}$AGjlUj8RC2 zTIS~3@~xz}FlAj^$04pBarP;d(uj@0=ai}YUAyn`@BX@$05~_EL{XS@IQEy{gxk>B z4r_62TN@WxU+vL!)_E8Wu!)TZ@S=L5>%WXwpL}he&QS+3LcsP<6y|B_>MZ5j!&pzr zy)trO9?Eqi8F8lNf%M(aeeUzpcXoGo0s&P>y#9JTZA>zgnXn9+0N54x*2x0}rS$fb zF9rNF0B3jnQj%)2@ID-W{d|;cCIJphJgCW8Cd-AC3xK7>h~)#H^TD-O&z&#<&_IC; zmI#jnw*8v0Amrf23WW~~B(`e?UnPI|yCsB+IIvH9Jqd!8^)nY8$roC3Lc))a$A;~$ zkl+?mS=0c~6#SNq=E(p*5rAG*lHDc5vJTq|016jdd$0L{zd*14>F=kD*rk_>rGo(* ztZwXb-GH!5niR6KI_yGz)auR;SH{}1J(ubLrtFzzu-LrX?RDyTL}}Tsi{Ab^y5Xn3 zpDz7de_kviL$@y6_3wX0Jto54dEcN^${muDO0{LIW`R;wxAX6uc}?-Ny7ZmX&HjGu zZLgzO{>%Rh9eew01z1#JY{2pgAg6WBlei&|4Rm0hmU+alj|Ie9pSRhRU^@A(Z(fAEo!%lgmy0w<%^ajs=- zW7yOSUjHc&1*s6wzHi=p9_*j&=(tM?zm03gc0Wfho)92(mIg#zoj$DY!& z6fFNVlbH-g22B7kXr3gj7#-&N|9rqdpXk9m6bz@h$x3;_2=^* z*Qb(nSqv61%#9-gti8r-lP4 z1Y|FOhu-&58mh$56IPh7`hj=SjV%$d^37jP)nzL}bBt`d%o&-gCS71li}CC@m=fQOm1N<5dO`m$g62Xtj?f#&NvAKVJr^1pWfDY^IJ z_6ZWefPWYZrGuL5Zsl4eEwp4uwsCdrtFEVMi}sDbKv(_K@1S()iUPPqmdLA&8CcMe zqc7VS+ps(}7%E)$ke|o6DWN-XgGN#`^tVOvhSO)W%VlY|)pIVoP0MIAz|0xnzv74A zMbnhswM|-k;FMcm9cfSj05VUIjTeBuwAZ~hPHQKA?PeOPa36W~Pyao-`X9ZMM&>b6 zrq)6NkO7{?T+?Blww2NPP_g6Ei z;~%`;#=jAu0GFiT9%Nx*MiIlW#0k8G)SF6o0TGX9OS!n$BjMbrC1x&t*Yv7SJ=P9nG; z=sryN8c@oQ8P`4KTzaBet2cyb*iV>H*stUv6CwwB3A}uyWa=%M^HutjE5}|9L6)z- zk`V77`zGr5%EIW@2V3p-Sx~VqvNbRpkmPe7IeK&tTVFu7DlsXp?t$q~{cU&;20yUW z*uOu7kdP}{Pjq1};6@1$wREzgwwuQkUEdp148-!?*mn(k0epzAdFNM4Ld79Uf4&iq zfPeHC<(}6+`zW2c`E#`PnTKio)T);*LcBhMm&Qu3X#%cVlGj1&$=1(PWJxLwC13?_ z$Kre0x_|WRZfLE{ucO7+UUT5}4N=&#cmKO@a?=qAk67LimT$7>#)9nm0MnWYTx&wJ z3;g)lJT0_#pL&K){>hzm^*6tXhALc{ga3H$IDPZobmrstQ(oWF`P+Q^ zE4yce|8)s71xOr9BHJtVgh`F=0|2GK_81*|+iU6K?|Ab$iD`eK^27)4P_Q2eQS0X4ggYe{fRT1Ck{WSVjy zpK9^C%V`M0VWG(tGBJvbFJmy<9}^yw15C?;&TN5PPnJ;HV_Yf zjdo^`5wN6yg>RZJL*WUTjMYc8>2~ecmWokKMLR73mghhgf4RO*_x;=- z(rf?8chQh#QheX?>t7*%EZYx0MXPr`LR+7EjCP+sLz^d_R5x8Tjnz9B<&BIK5o@q1 zwb?9tto&ZQOvm4NEsd_dQ~*E6?4HlU;D7sx(}V9=-Y!8lrGm0RJ%&aQefaqs_Y?B{E`+m0AfGVQ(Q)>%S`a8qCgCI{=h8Uds>+ zbD}Af>@grAQ33|qb!Kym=9d;cH%GlPPgi`$*U(i1sr9}t1OVB1*h|7|g@oKC5DBD! zZr6f`jfVkjZ*0l?6Tki^gC+nVm^-fehixBd`^VZR?x(GG4%vC|Y1&!cv>0~-X*Q3K zvyxu`ez3G+Ot2+;sRc*uN`AB@qWJUqB9DLIcG@`g9L-rp5MP@Nk!mt9I=uf3W!Kl_+XgIU%~Cor(y%aoBE#ILQb zle-AE|E(N5`jV~xE>8K=IOsmuqhQkgOY*UH z`f-m&G-Q<8n|S^gCOa1CdaYa;5HKo%a$AnsiLh5v>xiB%p4+xipBf zmQ5#vtLDk~f10j($D8T+6w8vGtwf7t?5lGvSij`D%ZR@7&GMPQV}+gxj-4l-qh@1= z#%r5u#jL85+^Yp@qoa$Imgb~%AA3TuoBw{ljdPz5mVcIK?l?h@fAG_#ssR;nkNzR9 z-d3mHUDs1~?-{uJ7ll^U;Kh|C8nS>0*m>%73-C_R=?~pan-3OZsM#H>*BbHdHWIH} zx9dX;8S3;i8_39n4wqmi3G0p8!wA^htezWDePod?|IV+Ly7WV`06+b)d-iOLK)|bQ z7!cumPUZ$*n-`5vwN?^uXP0)ix1|3(efxd%)NNm&%f9;6biT;a>s}#$kY;_0wjOw@ zoiDa%=gBkjIR!Ed!oZc=mDiuSD~_HQR{s6u(ck^J1AmrS4MmdPQArqDDx-)wU)I{H z=Y5B&JY&St3lX24RAJ$lA-Mkch4VB#^gsQkTsIS4WnHDRcBisVv*lkyfAoum#cp`& zOSS$Z=ZUK$LI1!Hr?T^&@5%+1+(9{6{uI-Jd{-mhWgS@=Mn6~Uf6r^For962v8>m0 z-mKR%xiDmq1i(S={|t`z6P_>*OSJb=fqw{-06h2)x(>d#gWUO<9N_OKJp(@P%as5q zN^Yp>YczhexJCeU@4ffZP~_N~uBB%`^jTfJcu|b?iiuo_<(O~81p^=h_zPg%-1NkM zES&M&Gwt^l+bF(BQ(2@7`0u*;bzJ`Z1Zsud!|aALd%PM;TsKUk;;6~h}Kl2m6O>h0F9~f*XK$MspAa0AqfW%;4ua^7#x@-3AFWb)o z$WQwId{HJi>;K(9`9AxU9MDEj0Nz-m8UjFHMj0^mnsEGUCG`+L%>e0qkh#l_(eZEp zD*4-a@-%JU{TQvb7T+)4d4ihf42%$o;%>8rizfU^7Fv_c3aq1TY?fahhf6EV^xSjL z(dft$9si~;r%S%(HFW$NzkG0@kmLWKyX!&Ae^G_`NK0E93{awo$Y1eHPzRkw2&49& z=1WQ9M3I_`9{RPL&np6;FWhF+sBAGU;c75vzHm}JW025M*2_xu9i0y>fh<|bL#hx_ zMEyk(Ie5mwV4#G2sh%R%|F^$xkjW6?9l~KEV`7gvEqyv-GJtnTs$&3;yU~C&mkN6k zz2xgZkpth37hYN8jw z%efq2%x)f6pa}dUxZ*#Q0z7(j`tEz___Da*&ebDJTvd6Qvr_xs+?}hEpeS1L_||us z#RrxqO$NBm{fP=A-;wMjd0bVETqp}FehcUD-^Fne$kJZ2KAt0W6ms1YE~s+N);=h= z1Z8X2@&hzh51YdTwDz@TJzjrcjc)zXU!kx6w||$;XNhA!5(SgI1||^+@jU0d)!=jg zzdxieo_I`3AmFb&G}yfpjNX-z0l{ zMsZH^dE}zEy^e+|m%i(*wDxa)v%Tlq!v;CIV}e!P2-3CHH4VA5fy5+YtY#Ih{T&Gl z{3KU=gegWZfT)|q!P`H!C?(X}K0${`M9?0%2aGMBk!TC%NtykgGcDh63o!f0Q*5;|M{Nle2{zFc6{J}yG1RyJRZcNSBZ*VOHPQfydps) z2m+q@{N4jmh8S4H?h0|Vxk1m~eu9p_`35>)g*{%RlEDC~8Jr7w;sbZcYuD4OWN=3U zJk)td4Ra(IEfl716YD?ko5jUQ!YJ6Ih(YC7zv=sFCc_r44#H&3920_7DI2T)VO0sC z13|!jggpatwu&;v+}zI(pvNUAl8~j9LrAz11IODBRoHusL%}$73}JN87`=qy&X_ja zIS?d%)#{Xsi%YH>bPNX(@CPElBhICC69eY{KG>e~9?yXOZ^i8$-=^O2>e&H3ukmn) z3ioTqgZTk@Y&`ntqw?BG{_NEmQpYn=_oJE2WDqjQGJyMm+=HzD2Zaql&Se64&c(4{#pP+J;e>(H{r|f z0&Up4zqfwQxnr~6a}BAtQrjjcuEEdmIWf*rm4&?=6n2Q72)TGgB-Dc^SNiz#9Y6Wo z^z6Nl&`i!>Sv&bfy7Q;rEAJ~?YO0{?=u4?%mBg!-#DgbQQc{z&ylxXhBH-o6@7b-K|7J35dEnh2 zcCx2fh_jUi%_V0@@G^s!fLi;ryQ#A@IaK6v9#PjX?kl?%Vz>N;;evk_wsJ3AcbPl` zCM@{=#!iCibJ_?culc^0tjZKT3O%2SY$VrF+$$g|A>Iz! zy?=e_fdAh32f^Eb=rz5UFM~Y*h9V^dKm{)Tv3du*0M2(pe@``4BYxwmh!bJh5br2E$XU3XvZPgU5i=PuhOejeFp3rVT% zH}Jju7XM~z*-dql#9S4w#gaCS?3|-&B>UI(sNFV_eff37R$(K{cpr8NukE;x|MOp< z^~ax~nVf&J{`eQ^PyWe&v9@p9cw}RsM!y(|1yB1@?fp;tvBm&vUv2x9^}~emAp3Kl zt7RMal}CU37MjWVAbVI+Kv zl|7RrVLUIj`+oK(-YX#%Ga06wc=v~B^NDAu<3etILd&KWGC6rT9TiBK$mfa(WgD$Fq7296H55Y@7E9_LAM497e*Vd-S6ZBHjIb>lVwd4;H zc6Uekf`a9O)lWb7tn34isl^qu{`b~@2mR449o&dJ?)CK0pcm{}|HGhD&m5BQ8vyja z&arPr6Qa^KoDV2?aFDu&S+$_5o#V9~IU(x&T5+5SZVO@VF2r5nJy>`psTks&pY4iU$D8kvCo| zudpz%NZO%ngpYw?f{UVo^^Nrna*w>W-QmUuiHmat=6k@uxjafNZ0@nrwm8QO+D-%n zqQI{)>=PIN60c|Nkh_aEE8U!s$aW&cWxDHbrlQ=jm5xm5t29Quwm48eX7vk?)15!| zTQrmNNACQef0NcuoGM8$Nz3~&DHbz&&q)k#0sK`U%e2o_hX0dUeN7`I@)ApKX=%^% z@UPz7T6)iqiU1d?aGm$9C!X`U18pDOe`~k_C(AybEg_^K3-p5R&26!MR@Of_#E%oO zdY_`~G2@&IVD!*r_=Xc-j?CzEPS^i%Eaq$M z*C8VGjgt}bF?bpvY)7acgcNZ3#&BIs5mYM+l5c4Ua__zObjtljU6nCO)M53J&Io{+ z3`Yh>0PO2ZbO882%p!g+694TdFN6Tt@18FN0wCUc2k`cu2|NI_7VGq7<;E*zqSro` zJ##ley0gOpyl=MPzZo~q)GsbAnl&`Jb={eDmNdbNZ<0OVKzHGvlu#{-dl^h{)x#n^ zDTXgv58#@K&#J6fR{0fA?cFli|t(@AN$Eot4siRwd(SKsU_io_ z|K~pQpb^07+-gYUUnvWd@Rc=GW3ZlUd#q(Mnkz%<0~R|e#@J=KdT6$Z3pDco$WpJPkp z#(ONb;HR!C2RpURJ?3q$O?l}jg_J*-hGwn06s@_ zN`tEBPs|(9SrZM3YM%jc*8dru(20Q`y0{U9-?#U@wzjIeW2F}TrMCYkNtn3TP;xHT zf9NEAi@yIpb-f4n-e4qdj789fQW7V4R1PTtAcp`%nPiN?`x*G3$ipRrLZU{O>PQvZd!Cz7+A@2*6nr1m?lG|Fhh8-+c#$>RyOC{7lXtxgZFDnVheZ_PA8-*FT1m2cTYA zq{ViDiq|)=! zb>7Ew#^gQteg7`}^K9LTEdIaL>{Zu({4SKeBzv%eE|mam5!Gq{wSq%Rr3!&reK}(^ zTbgGw91+VuTUM=YrA@05&9P!?3IE`RU0bdPqLN%ntau;`pp+8ru|&beG=l_yVo0T5 z@*jiE&;I*gpSgPvNO;_CKY7~SxIvPtwZ85Ekt$g4wNvQiGd6I*;2$1V4EUFp7L8CX z&N#JDzLq{ni+k9i0=NG-=mpKUpP0z7v6J|1OM8Txymf}u*TL>tq6cbuTPN=w0l@L@sNmjFt3XScP73FTyKjJ72JEPrcrfTCDmr?gyN@IA`~K1j!gSK6sA50E_lP6EgYka1id^J@?MNPfXb@`bLQO=tj00)8L!$^Z^0_nr@6U>;w zg9KohsQ;LvdlkP9i2#rV$`)J}2?f9+XUfM`Yx!4qH{Fe0SZm9Q&a$sNA5n)@pVWW) z9t3{A@O_NsiwiWF0)ff}*%hazxaXO;OJ?r=7G{+Ov3q184{Ytt;d&=17jWdRsp{-g z$|>r0F6;I2AO887m3KCHkUnwzQ<#Gq$^4x< ziZy19_0?6|rqj&Pqeq=E>{~GFU^!;MiQEy~A9tQSO`rVX|2885&Y`fU&_nOLMe>6* z>?M}7mjU&BFtyF|fy9vtBDNna`QllIvVa!5uJZ~k+13|w76Jilk*;YZuJgQY+0ual>H+m1UxY?K)lI0UH@%3yMF-k8Bs3>Kp+k>#oroB+m9`Q zV`E7H`Tg>Z!*Tz=_14?uwTmyhVHL7PJ1)&+CPS0K5ddEbAU^Dv!$9~;DF>A&WI2eu zIH)Azg&>nG+kFoJOtxGF0F3OkW$F4W)oazPm?F?kb*0n9f2NGot?>#{N>^SB;(&cr!Y5Y+ZW)^-*Cyl@lHwnH@~>(z#rt2cm=dzAFd%DLvEoa z{2gM-8T@~uB@t&Nz)LSk5Gr$b`}{{$?R|l$gnb|xq)J%>nnW zCSSwUi=^+8o@n)fQ#5or^O=X_y0^D>n7QyVvAn!&8S+`wwMN(fo>e}`Ia&Y1ZyhMP zkPaCC?y14LFT57?BIV;y-2YknMyHgzx_L2d%)tLlhAHQb2f$(3@(%*VVr`m|7r+Z4 z0QS4)3xxoH%P8Ixr9GDavLAZ^+($zY@c>w!llO>C_wsnxq~F$KH4?4MjizL~JrC{{kIGgv?|nQA@uQZ=0z zeq*zDcgM7~vFQuF9G1L62c4#b5$UZ0anY45^a zV)X2{O(FO9L|u|XPp+p6mcI^pV}Jk_Kzy$WUxbDKQCH7&pg2EVS}|G1I>r)DI;ODzokKk?808?BvqqJ-|a<-hW>j|dmhdELlB zYd0kQ6z>o7n8JF<-G}4;$;lzLcp}e)^erP!Yx7Q#OzGjbN8$;f`)xk)%&c#`L~=Lh z2zmDhZLKcgbI%-+Q-=^tVf?04<`1kz5s3O)n9C=hEGT;5m9;3D4z+daIePA{2WhBs z`mTp)x9$6!ELf`wDZ$BQ|GZj8!t&pE!b8Z^)_*F$m6Z7ofI`ajM>0$yxkSMFPW=x6D3Kl=xs&~j9j5{|`6r{oR4AGtR` zvUW_Jdhf9FN_+OezVw00S%Bc`+jzf4vL&=VrRX|b%8DWJ8-HeN@6CVzf1VLVFQG8_ zXE4o#3s!PzXSn%N?zA&Y-B0Y8kU+~k1zO<4)=zxTapFtMi`~A280DON4oMvVhzbMc z7$l+NIfO~AKl>klnx44jZkovp7xV+p)q;5;<_J+R8s_|}DuAD07*Rrqo3IY9{w!lF zi5EetyjlV|J*=#|dkhD;fZEdoCIFuJ;HSlqw6n#!q>?CAoh12REQ?5{PuOF1P(SVU zAJ2Fq_^0UQs9SJPRY)ET5@7zyi)j9ei)aXP^5o-ACUJNQ9&QR=kCMo8qDR0?W-<&J zWDbD+Sh9oM>F4I==pbSCbZ2LW&Xw@*9Y#8gMx%YdJLq071P_3Id|G6w`}qJMLn#Hw za`X+aDvPiwuAIGhYpY}(W*5HE+=$Wyl%Jy|l#*Nb<-3UU^Mu7U^+*JA6Tw7LK%T<+ z$oJO;Jy-?eLETFxB-!%o&t!4FwI8ow(GRfFPGt3;E8i9^h6*N&#SmrXB=dY#atZME zGxwhq#q;4m{uIsRh0FcF{ipONKloqh*;YyJ0{G%`&7f-}gp9WH9I|^;3gE8lD0R^q zht3qedUA{fWmP^yDU@%Eb>Gf~>tf=liXjHcLP$un&U2sn!n<#xPyg6&&WNHHS(qsL zv$n4=_y@@6wvf1c4+p7>6_!HCPXP0nAwcp-z7#4RAIr-tX2mU*N(YwW2~ex`KViDAs?LTW`HpUg70CNl%5IKC}AIWT-Mo zB)Ol3`yfyZmz#rxE%N7zfr~(IKRJj1*pIAmx33FC%(y3lrkg~7@H2V*@y7>~2=M3| zua!k>+%(|lX?=CQ({@Xi!MAa1W?2;bpkKcS6CVfy>MqW3myQc=^iJz14Gb^+&ANZ@ zyQmE4;$60jl^_4Yefs@z%qAAdOzy~Ep^+20#fO2P$Le}!d6f72xbV)Il|MA0gF6;@21IHL7N7n4 z2_(UF+5}t7vhF7j4FLdTQPPO4WTcWqrGscYap^}slGl7*OOXkM6aURESbmizm;PnoqYAGP z;Pdr(xPgHiAp>k)A+y-==lkDtlO(yE%^lBQm@wqTtem+%l0b1y!#MS-E~$WiGIB`E z!ln*sh*?Bp|2yEYpj#c|x*f?$5q_X9^i9Vto@HlsgC6~zTWDzV;CpTs*MBbkhc$d| zVP3`&N~Ol7Ufw1RnbFN@5bJ;R5^#@#+zVCgv|(#JV_o0$A9xELX^kpF5ybz){U2*% z40S{Z0LzR7n8^_3ydnS&OXhbrUI6DJ7XX9z!>s>&tp`mC`;i?Ng8P48z}Ba@l9@!0 z5$+p9DF;}uEYSQF$K?HP+wZnEx72OX6p%#*|EagYroi4)V8|)D(d}JW;|cb71Y|7E zxvL3;v!}c0hB2y?e z1|4prSuM|G)}>ZSVt3vT|God*TJ+veGdVliS=*$~x6kY5fBaMQ%v}$7ruND#>9r^D zs*AgSs$I#iJ?=h9h(<~!vo~U{(XQgIYeWw@c%zPm*n4OIivV`~->4p`hY75G_D>T? zQpXYu&yi&5##rp}_jFgL2*ga2D`CSDP<`GcUp)Vl6h=J6s*YeDr56nD? zo`(ow_(MNSpa0oEpk`y+=4;Epkcx%hbG+2*mBA#A%oCKoG6+0%lFbJq82=G`QXm_1 z$(e-hjfCHol6M`VoQgrAZpk6`0@xbR9KhE9Qy;ip$^|=6PaOKfMuVd7$aX3q(}A>G zO$M_5Q&*pf?WnI6X=Fw&q=xB7jak?wx$;1S^-O-=MbGahUxuEJB!Dy5|CtO?>g%t+ z;a}6hgeU)lfck!xa~^bux%mTFA7*_&Xux{Xwh6+E5VN+2372p=DAZxU`{3Wcu#x~C z1bA(aR9uHIx#SZ1#&7%v8iH)Mi}=QUkBgGCac0dFU}c7n96i#uW8DG0EYWoilEOct zUM62xk^r<}C+T_)^xwzDI4;n8k14;|KNoeBv3T9E)L>t`=G0AMSlTnRYh^&d6u9U< zn1X9}&gEJp8@y^c7CT;^55GKp=LveKRpjT6EYU?bUQIKZERTQmv-HXT=@;qATRz7@ zwwhzXtZ1;tYZ)&K#R&1cBLiH>4WJf0OYT=C2LxzpB!<(zpn_h2ep0+$$X{&_*Kf=A z7)uHeP+@N>iJI^m<>>L+7Ty2eKc%%(Uu^rwHPTOJa=0+)V=tRW{_v9}zPmD)dn170 z!BN|HEJ)NS@8QV<2!VVO?WC%Rt149csN7R484);&x2^|!s5h9IB#C;uyL zeDMs8w|6z^ZTn1CmRD$ge%?J*D5+;lA=HsnvnzvH|9ks&4IA)gD0^t7B+^O`%ky;I zKln>D1mRHAU;Wizm43uHCF+6TIeTP~94nHn6_0j- zUR<^e)>0NQ`Jx%`BQC}IITKO0&lFd>!qZbA^I;{4jC-cZeG{&BaF;9!0{Q3uZxenu zptHEZH^C*a99Jwf6k-(BZP$)5OGd6N6L{8SP>nqUSd!g7k+ZrJx5^N^4p)gRX1oAG zwocyhW4|HR?XUR0Z=+ZJg|DTVs62JY{gN1u-MHbF>x2!FgFErEsCCHzn3qI%LCaTOOf%Ul>?QKRd;d%<|Ks(o zkmrG%paT#A_$yT!iZvKU$yoXm?q1{8vc|FhnC`1lMGH%dVIH!1%84Qcj&KccGG>SF z48*^|1O+v_+$-Amj5+w2M&@R|>T!}2$kjH|FK&~5@nvnF;J&eZ<#C!xnKz!f>s$t9 zS_qIKt^aw?Z{q*mTn`HRgSP=&|F0j8^`FB`)%p)3-Co@cp}M(8Jk4Y#Ly|!f04)0v z01_YAZr=|GGq`4w;Glc~EH5?*z`x0{iiZtyo)ixAAlUEP*=ym#V-XGBh6TR!ZEunt z5&>}Z4cAgLW{;39NmeItr(GBp7Ul^IxGGE`8*YyF&iGoG_}qc``c*QMMkESy=l^>b zslxpeP2g21(h-rd-?LZV3*Nfd5j8MXz&RX(l|jytpy0l9N2$FETM1{x7-UhS@5x5{x~T? zsBiTZCE;{iS$6;&C5*@{$3?RD$+5I;O*<_CB%WhqKCaRC?a$u#bALojR~)CyzTver z4dJQ@Cw}F_Rw`KgGxyyk3mL3a0m<-o!L#P4A;d`}N(Z?9yY7=x@XQE(f?^3kZQCKm z|D)Q}&d#nIrF8l-{f5I^Y>u1BOol9j3;|%_LA0MGoEM0L;{Ey9vnl(>3I^}jx5z)A z5CF08w!r^va|;M zq=$d+YbDaLdNdbHh{_!WJZ!BMR3Dxt1<;-6);Xd=&hwq?I{F`5-$3Jkp zgiMH~7B1aYiM1cqrQBQTC*8hMV(-yT$vsGf3~fo%wKHcN*f2S>a`Xswh|p9*1<-B| zI#Q%St);^>*GVepgh5q8R#F$JdVgfAUwiMTKJrB@^Qn9u;W_Fs|%z-RTVIwyX70>9N(4D;t7`T0!Kjr zb9=*+tP#?vl(fV9Cq8*EUHY}Jp@oZ&(z%p}{_qoY-_QJ^kWSm{n?6?NTm5upd09PI zh%Di)Ju99gO?Rk$K1Ht|=K2rM4UE~w*@x0@$T0vdatbGSIB>o%G@!NnG8(^O91eIL5YpNi1lDJ+BX&+gY7Uc0GumU2jFv_4FQ1T zINacDeussLhQqA?`&AF%>w*i|g(oQ}Z~;gXb=-p?*IjoVz4482q#?+2_dG(YU(lM^ zoWN&+2_R%K@5RAJNt1x{M2Ydu(OaOq;9^_q5C;7Pysr%83BOkU?afz^Cfq~r9Ea_m z4A7MD=*dy8%hUl==&=tJbtD_|5>f$ZVo_EiAzrfztj=7o`s7DHODEp@XSDvrvozn5 zHZMol@2Bqg0^R@KkI?P^`Pb;_TkloZZAt-**My{OEbQv+Jm&t*wShwEKOSa6owAZ3V>Z^-J8SB(;}>~Y3I!@J+BGZhV@;S}bRQ%Q zCErGFeT>8b2nTp!p>M>Fi9W_ez|(i$-;!t_p|!`qNb^h(y$t6K3HSKDTj+DY@JC|x z-#qnfm(&Su8^b+ndv<95D%DoKr3xfarulkgF8?++L~_Oj;6798ZA-l^v0dW|7O8a6 zEt|%V&pDC=nZ~VU_u)VI1kJT;!9}kd_Nbm#Q8HmqOR+_3MXk9id_8W8|m>s{8W1bBbr}aa3CX#U@ojTQBf|< zxM>T^VT*Ehu$7%Z@9$CGK@pNY-J8PBW9KMwm9*!#qw99cDV%lhzC`7^q8nh(>yOl` z-?+sG&!^)im^5Rwmw+O(gfwIQE^9zVFeJCwk*&wISbS=I@^Y7WN)ncl%hf*m$Dg7{ zT5Ip(6&KTGUwI?F@||Bpmw(l(>3kKo*zq67YctWoBB0IV^2ywztMFarmZjp_ZHfP? zqWnSmL~=LeqF_NdL6Zw11*J8co4xcOszQm#2=0RAHuaSG#HBTDFMxgSKMAg=#j`~F zS|vA`nh-KT=8~MUWti5m0O@y?S_n0xGZCU#F&G~Ez-{#C`){MgD=(r;-*h8g^-XV( zzQSPPQ9+Pm7Q!P2lpWy|>f;LmY zU6oLdOzsJw$>|C)1MdLL69^ZP@Ee;$G#5be=-@}sp%+yZsGrEsQ(8Infm?tHBUU-b;cPixLFnIRV7gKOxaovGi#( z!`pzQb~FeJ0qz1WlJpUovBf&96(j0|pB`Huq5w?HHB~bSNFN+oUy@ql?M?1Jd4?Wo z`w0K>{);zWL9h7cH_^pk_DZ_yYrlfdC*f@VCqMETdh}24q{r{Lk9Jo#w0&D^Xhyy?K>2#UL{vVHy?l!dSu=qpp9(ylJ>4OHos}yLu7q*t$1~{|CW}z?)C1?L1hjq z@H_(c68_UjP6+cHYCs2Si8wL>iR5}YHhe6k5$`${W`OIFBfO}^+?IuQH@fMB`Khn3B@xfUr@*gvb}|O7v;FJ*qTYy0rLFH?GUwsQlp*k10?~q zE#ZlTTp?O!Qd*X(Kq!6TJvT|X$Ls&WchVK#@H%=i<>~fW-}&ReNvjV%LGF9il<*dQ zri*R=uLGe*gmH*$8*#luUfXrSxAjd{Ly&dGsuVsFvIlg_snz2(bjDDufqe#$F! zfyjpNGgiYRKGRHQGH4k*syxUGfC2Mi8TDC#cs?=uFSeWw_-EPg9$5~%#|uNcF5-R5 ze_W6_ODnr-9X)z(WB4Y?h+RWpaVgDjk%JhqY9zHJaUFA6>})|)=`Na?y2=044Zbk` zdzNCe5M-kOO#if7Fl`70cJ2eQbO7eftRj_Is?SDR{2TWJ}Iu z;9r#Otd@raTc7?;$thq8PO?nGS*@3_=&?)tSTrPN5Hv9yA2x233=p??OAaRr|8tx4 zU~3IM(f;u@zT&N~rz_rYqgZ{pG}tsPeGJ^VbQQbzGw^4HlBHx-PiEP&=fL?xLNmBB zo;4s$ya0MmQ!SwYWpej^SoYDSw6B)m)V^Wa_hD(0#tarbQ~n{^y$act zs=Y}wS)r^tB!TsPf+tDv4lxo=4PccK2Hf^7iO^8!xoXKlA}T21+Ly9h-L|*4=*+G6 z(5X*-UXEK>T%cEc{p;!ItFM-RvV7$wgDOAy-2IQyQ=k4q+jkz9*Nqmq!lFwXI|VrG zj^*Y#1HZN^72sz%9spdbu)Rhseb)64&qidcKWY&U)U6M~}8Mm;I}1B>qd@ zFLGfx3H?ahy^sU2a*7q-tjow9(!eS_W-^C~tfcMEZOT{4q$DRP<@3l~pgjUWrLlg2 zxbe#RBmsc7|64urIIXtN_r!1i8P&`4bo|w?5F+5>H(XE0UvtgWiA0_|IGNw+6DR5E zPv776iIZfPZvDJ2?FIrTVf+JJrfyrOe)2p^Fsa-)=UGJgIw-; zL0?%}IqVcd0PGiE|56DvxJ*DCHVGU=P@L`kz5K-#{hSN%4GDbkC$(eS*B|+jAECeU zSH6>mAP@cg`|0W5zfBf%x3ng>%2pkVN`um5bT-4Xu=gs3u`dgI_kG-_{~nBX(_rDs zz27L;)X~AiciruiueB_UT?-zzH{q4Sb_M$Sd}2H}+8i$70@&K^yG_ad50U`Nyu^T- zqSV-aS{5z@QrNz$r_YFW8P90>=!yUnz6DP7$hG5-z4{s{4|dGz$iJ9?Z}sHU^u>D~ z7I#!u*ms{y|#|7q-cAw61Kq3LrSEt zSf5DRC*+9GhsNfI>R|zt%#B#jx3jxTYpZ9Z+J}Hop07D!osH?-G!83#R9HYMe#4~iJ1*A+ArJ&d+dzKJx!PCz^S8_qL7A+=H ztI&T6_(Q0Of<^hxK)-yCZG;LF)+=)MjQ#-X{G3id`>dE`g@|j3(c_nBxjk*Jz4MQk z0u6nFC|D7VlmbA(*k{=tYYqsu3QHSRx()5@uNm7&E00)zaSNqcEdjR1Zp|e5zS9re z54$a?!U+y9{)$)8%2k)pWv{)CE_&6K-Va{PzQFCzi3+*Rxj!)RvvKNK=@W44k81$> z0=#G_w50%c>l2=|kI6-w57Zl=asZ05e!k5}l9Wq0ks)yZO+2``_7pOwyUzJsqO7s4 z8Pw?yXm{PF;a_8`5CW*lb3XdT&Ujba8f`q5c|iZ9pIG?7!WGBq%5QufUG5)JFlqJzj9&W{RH0K@IYTJshx3>H$mtJ|$l5SB17H6u zy~Z*(w{2n1m)nS6Wj$UV(VKtqpU_a`o4)DK(dz1|&4tC)A9^~rb)U^lW-?4UFZ{|m z`5lu0lj3NQIPb9ddSuYw*w~<#Ivxj!Kn|)@0AY8cgS-@x^tzS-0{lRSlD%cef%8mjU&4QZ@z(R#hVd0*n03RgXglc6m?*i|xh(G!4rp4{5F3Ut6$}rkjI&oO9peA zfnMXgOSwUg0T6xPtXmSBS|?HPU}YJ@dSY5ICvRLov&s$wayL7h+q8USMLw`H$7S^R zFFa9IdKc$uQm zcz5iNQ4>N%%e`5#NS~dzvniO~E@T$C0K{A|=g(D%JLS)jIMBAJJh2xn9+Z(YfYf!h zNyJNU-+j^B0An5mTU`~8 z5OrTI&lSYv(&7^BY$-@-QIWh~Y`3|4e^q%|&It4i=qnxq?lobrs{HrL|269RpDj-V ztpDB(oR+gIdPojfUXu#XM0c^1=TGyL^m z$0fEkzGjiNqfu~l(HpO&p~&Yx_c`$_^?5T0ymaF;nlxw4WF|wB^MU~237vuPeinQH z=)*_=CIFbFW6=Flc>|oS)t}{{tp6-Lshkaoa3M$^;OjP`emDSLZ@XvgjO%-qk zpOr3>$rihu&2tr?$)STE-v!LFg}RG)S&Sj^*{BjgoqfymqOg`Ff9)?`cn{DK0a|yF z?;c-3%j5;ISnrCZrT~7#a~B0wl!b;mF`S74kgA~X)uKdNN*7$6v&F}I7V@SE z4;bDKE%s`aLbfd9UgsC)B|E>k)q6TSqUesOrPQJ_U%)?6qTrlsAisD7=(bvU4@w3E zsy!~ih`$HGb5NJNE{_x2+LgxAe~R)>6#F#Acj(~w4J7=lVnQnl-U9HcGkCPdt*n+tLXrZ&m@et@QfoYia^gnn|WxEwZ8yboXr3Q+SLEre_V3x^mYja z*lqi9y|nCQ`ZPSGax1)MC?_L)N@Bp|{VITe2QCE&@>tq&61=^}wvW%tS|0mSxxX$* z382NmX-1U@d`HJu(|l!ph|i08Lr4USJ12W8pJSq>TH7A|Jr(dzg_!jFDgUGLvA-U6*AtM4 z?qOp0>s|u36YhHqE4Rno7t)m10u60QT5&`=dL`=unHLni2KfG0Pn?oJTu&1SH4lvn zW1^GI-{yavM+#}eH@&sKNsGr9$}{zQI!11piQvClXzbhmQ`dw*H(?^kN@`3eJn$=F)gXSF{ogZp_ku$)cRfD1|blV}dsz)8ZD0EUtWpl&S#D{pue zZQT9n9;F3fO+bdlG5azc7Ur%uK-YTMU2t+acMo8Jod;ON`Fl96yHHa{_X^hzg)?<5 z4joXFqf24APQUj4eFEbVl+)~>5#bR9{1n9v?#bhzNYtW;X*_Q>Wlhwm%EAZ~m5G8U zN}5>##Y+Q9uUnZKiO1Y-=ZnfNcx!!w=8jp$-<3L5O;W*Qs_I{R+;+!AokhpdL{Z#?031>N8+3i)zR|vsq|4p;@SF<_9rDg z1mv^T-okJAzA>-hd+|M~?1$`l?gKTFP`3Y$96P4ZmP-9{`{ihVKtF!19W`Kk)UBQt=o$dgKVLudVC%?QtBRzr4Kc zc_VOcUhi_Fuo@mB0;a5gNer_+OO)><+>2e)X8RoD-LjWU>=*uB&OIQ4d5?suh>T85ugtS{O$?%8@ zvFCF{T{)1JXB51GDg*xtVylt_6#wiz7`T_Qkl*hmQZa#>C@2mxy}_ zfo!sMrG2mAAE_iYl;bKZ4OqyD%I4NF@;pcd3pu%-(|{@x@MT-$QYvc}AxDC|tqEQ@ zF@fKiGpBvsM`A@u3f%SyCWj;uCV(Z@xF)N|MaG&^031N$zX+zXW)E}y_Y)gy);2?=bMs!uL9xJoZYAO`Bx-kHTI6-|{WrLPL;?-trn+`^>{$ z^H`NJW9`QwhT9fvnm~5ssPu%cQSQ5I9m9V1w0xT^$~kuy{%l{G4qtvg?1bNjk|Us{ ziO)QBekUq(1o#(}bPC@^WksG&lg-GRg2GZiMjbIPWaTe2}I<@Quyg>&W1 z2n)9gLqV&GGPlu!q6EO!?!3IX>{cT(_iERr5|wgmskB5DGxMjA?2n3)FN$eMJjLH2 z6atD`!u85Ii;^!=QLt{6-zF%04(hx8*)D=2_%Hp7I{g@9ov2(7`UB$mK?Y_h`c?A8 zkd2of)Uj8iQbYs@+}3p<2PiqP7potDg@N16jg~w%>p%Ct`F6gZgX_Noe;p%8#0Y?& zsf^bY+|?f^MSREBaVERE9$(%KyuYKJ zV_%7YCYP?`bFKsCocuZZRN_Pm8Q4|IP>!oL!~7`3^ygHC{-|L_{JTsjl<)(+I1Vjo zs?w(Hld`o44ey*}}#22NXyavfC5aS${;kMUsJ133I|TNnu<& zILElA^6*d|5znczxhc*c#Vbg|1<;SGROS|d{z5)gVNI|+19ojb?sBo-?>GKS3-^Im z4&z_vR#@S4m ze$N{Jzj(vtG=KR;G!$VEfaGhI_N%U*j@R6~|3ovH$q?ndA^?z4e{F4T-+i7B3BbaG zGrHPKnI|qAHh~O)Tcwn|N$E=(*i1BRZf+h3{-2L0!G$E4P{WqawnzrBeCkuT4u$|& zzTrxFEy};$Pm>E!GsQ=(N@X88F0%3|If(K_xk^2yxhO=sp)Bf+DT*B>tJfVppM&64vfSxuf)SmAKsbjoi^NA~+1!Z^`Y{f(H;v6x}*uU1fn{GtQ>;le&L5xmdm` z%krJ6D4di{(GzfxRk^W$>Y}L%+RE~ZxN53mS&Masl{3zg4rK;K#fc8|&XoRd(n026sm0|umG;jD^v7M3=5;l{JFu~@2x==F^d{*h9EQ^|o4 z{}zMP^)qW0vz!HtTy*>*dv-`-sz;-Lp`Y0FNoYMrbV`<<^EhA zpIW)6*jKXu{$3BGvGqgrK_^qKP4wCeG1J%`rJQ{(j>IjVhmLEjrhzsx04X^D*wPG- zd`m)yF~GfZ$p}Sh`-U{vLQAs9&}`J*+;1Z15Z;n}{=nLiseDg1|6q(cpr+zsq#+?? z{3pyKxrA2%{8v8yqt_75h4~`;JW=ME&|qOsDg7JIquU41cKj2?d86zTJ!9bg0fG%N zV|usQTHdNfB+Mn6vtu_~A5Y20KNjb<;a(1G~?*VHEf42G7Lo491)ox#J+ka%l z%3RIF(29_58>{Pfv+8|QFW0_Sl(tQHAoA?d&+(jxy8eT#wSjKo6v+}U8iC&4&(Q%{ z{}KO>dxj@*4AG5qQuMxiK1Riv%;a3kc~@MXCqHK07)0+UOakx(^QBnP#gftfv1R|o zma{2G$l!mL`0wmQ*7GL!wv`EYNO=HwF{_prC~xej6^S%9w8Da#iaRH2OxyaelFCc& ztk%huQ7BOmKQwjU$M0Nsa&S!@;Lum5qi*I4e9_*@b;s-I?blTja`*U*bHh5CI|Pp& z0|ZL06phXL%lnMrc1Yxkm@68l432S4;%Q)3I$|)GOV)0(#9uXeK7eCKkI|XaXRHkv z2)0W5$})kSsKf8fiARCO$9k-(wO_Ux)W`)uMO$J}fG`ABPnVA@cQUFI9(4%>E#KKS z@YO{t9lnnVxkO2q@>g|vPSgc*B~y5Ef{bdvC!7p08tJ zaY=JC5R_XI;z4h`XH!b z`VS8S-ht!(tEvj)KUfW^v^i0jZi3S7uJK_Fz;nj6G&V=*uBkh>=oWH|E`S}OgrHu} zIBTDT+cI;emiYvYDt6IO6l2i(LRzp zV<-`oKychsf>%Rju68J^z*&~j3uN-pFxsRt2#f_ z0sQ!E6Y_v=2}^Wc*K9pJbfdnvs3}%jLP*waK!P&1)mfRoa0S?9W+P7?OOB zK}g$p8#`&x1i)9;(BvLl;aP^<8(Zx>pK|dSkYtdp-Z|fb%5mElc)Vdh)@3WiAm!`> z03?Ivp-7%rf@qlQzqCt(c1@DwCa0nYpbzkKKmPS!PD7DTeBu-KP9Gq*Q#3NV@di#d zInTiVOa?FK9Ra{1$+y~pbx;C5wzRXN)@SLaA-u>kVXUs_CCd z&riJt-+r#M#)kyW)OF45Nh+@$CBROaC+u!mqHAdgC(jxG^CKL15fyM9V_S3YW(^j( z)fX9~NwUK$=mz*Naj&X$*X{V+Yyl7hAprwByJC%Hr44SCqLNj1Vvs*Sm zV|JLD{2pQ{DtJ|tcI>t%`U6o=H0?uo|4y@cAC1@HosuFr%x)1cUjY258$K!th;`S% zy|#rVi?sV=LIBAdt2#?XhTY9=w-#2GSQesviQB&}ASC0tG;U$n@8C7kIDn%J5>P=1 z5)b;baYfVG$-x!5M}R(`>~6xvM8I3wUq}z}0$8EdwvQteXJd7hj$d+# z_Z3vsr~+6d1A_L{{n^Ak75p4I2HvgCZ2fGBv<_(L&*^a@LO&wf3l1rFfN`R-lV4*Z z&nc3_Gmrac+dnINWWUG%Ys^hcNgkbYlM{zT*+>^958Msf`*1QVXQm@7M`-oTs+~Ja zg^?pik4PWHoS*|^*IlRLT5Tk1_mL%c=jUVRWS&Vjt_o3tP!IgRgq(!u z46+DbDdGiz5GK3dWY;C_knubyEI`RawO*|8kMqF0EB2>IkaWhse5u<;HU_-BV}hqr znHx0(L_LS(J5<*2>ncDn&ch(wWIXOR($=;4PjJG><(5bUF}vK(DXXpSf*V?I$KCwJ z7yEA@>?-@pZ_g&K%Vp@fOm+RYHL>4rXeIPRSua->2jv0q!4KZ#L}JX(RmjEEAtRr! z;c+H2nTDK~1ON+w@iHt4&Ty@|uCXm5Dv%E7oTnf7?pZ0w3V6ffc z=9_P(@BGg1q#?-huYV0a^#`|F&2o}*W1Ns^6y3zLDjjY`jf*o&UrDlUWC|zw;*-lF zO{SOyCB+wg9NYgL+N%V_ed1zgUv>5`N?KQP@1z~;f`dkABKw@%e!Q{La|t&j3Q!`{ zYfgT!T58qRQ0pY@EzF5AfxWtd) zZfScv*i3ulRQX<>d+xL<8P;YiEhwrjK^^WpD(2BDI)Zh#rqB<}Mb|8IZXwJX9)Too zDHRd|=P62g@|+ABTG8z*aOq4?YnzoGrLk7qr>nC~+ZI`jtiT80sW|3vkF-G53f@My! z#oO4oYZ+O)xUwC=l>xtGvGTCI;y!E3d0`0F$edW;n?hd=z&v+>y!6A?(zVoDs<$>a z^tm+Z^&*L{3_uLGTEl~M z{3DM6#(y$W5MvnNCxt-?Pa;_T$@(UmNMq=29!}IDjb7;Z_r8$;!YfP8h~vVX8^*sA zmiAnP@T5>ClGhK}py#S2fnxiyZv3KE(Z+ImQNk0Gi z&&w-vhwa4@8m7pS!n!!~0GP>;<-8>TSk8t7VBy7;{}^PS3nJk80Dl&~k6Fh5FGa#) z8zx(iyKUvxTW=c-0U+f77h9mX)mqd7+szVVUa`Q(#Tg6gB&8^l1G+u$QHm#81fVD6 z2!192s(u&lDdJGLC<3Yewe_zzclV3$`&NZ`J#dSK5{JtxN-BvvDqPJeDBt2XEiT!~ z6w%r(I+R1~J0(%NIT2B9N?Nik#aZH`N0JX0OBEFiS5uobFUM)n|A8!>325m|8#xJmB?9ZNFqy>w2>pl4TP`jwoZa}Rur1DeVNQw1CF=IY z%94H-cW^y9!gk!1yHfXLkUb!4{CkP-?~cYs?(M~@w) z=f3!iJ@-n(iWU|K9wzJ!FjrTd`I+Z2^y3uJaI))VFSE+}beX180B<(iS>IRkM}MEJ z?X}N@yaPFh88Q_BF9WS4BGsQMXi*dVRla{F>hy~jef<0O5O$S|OSUH)tV(H4A+Q=t z2v}>|>%5;rf2kzNBcGdJ=hDd6mYU%GV+m1_AH!}4gow_o?Rv4jYk68Uk=zpNe;H#@ zpZSraN9oM7&k@2{)>hZ(V)Fus_t$-R!(RWLxTexK8p@sDX$I*2&z__sAw!o+!sZ~D z^Ry{!eV>8bBPqzq`zRd+p_Jl-X}`YdoxZ}*ftp#q8nDnp(* zbedAtpb#77OsS^~;+kV~^8cNz>w~;rKZ{+-`%ml-6pjZ7%E>Ly0Ju$6`d-Hprl`>R zLdk;wBPvp{a_|->=JI=QpBIM~B?G?_*3+2RjwEr@=iLOa2dxR;^|F9ltXx%91`o(B z)Wg>K0hIvkl~T6_>Hx@k&yfkO(gzHvP-&xtzC}1kNIKU(j3Y;m(CX>aJ|{27bW=G2h?$hSKdD|7$-OEt zhp5rm+7sb7;aS%P`cNZ&grtxFoK!qQ8cY7F#6u-xeRIRgA+{D^Nif<1L!BoyOsArf zA0~(KuO0zS82@sCvQJ$lcMDJ9!BkafH#;Yi{K>t*r9WYfg|#0^LG`9V1R#e(Ii-#z zE>#!v^dy_}5iRjjjDMCUfPZQAu=X^Ll=TI1{Ja4kKM2zy19W2x)2YxuQVAO&8$0sE zW&D?9iMUpbOMZQJb*mQo)z-LO6x&D1R$e7ACJub z&qw&T81%=#vlad=p4?~I{=XD4r8g`>U5i5L11C?Ol)tO5zM6(0Tn=#k?nlHr#7a4o zCRi9WlX)ZVhA9QDC9?eeE*`pV6BcfO1T4z1B;b{Tvg`^$rVd~{RGFaecA^mD2MOS} zyIB?GlGU0z%6z=_{;*E=gNdl)=3Uj5my{CS%ueKP?AbEldkiQpthj5c4ZbnOxe{>K zcpGGY&PP{{(%Sl}-xSAmE^$J@oLuqO1X0N3p78???vQwEy|wyzMs7+1u12lZAIdd! z(PE(uCAFv|=W@l;+oX^Mu)?|WZoduJQz$ku#3q&&L*g!vm5$0G(L{2pqx`#a*lo=H z`Wc9r*f%?hEA_#FwsjMda_MkEoUvNk8?WoF3G`4(va(oS_XtUaVBFc-ED7tVRBDlP zpb|w@`m`hvCTD;;H=6TC&{BYW{rc3CUZ~Fp{K^T< zm?TdI%Gk?A!cfpyXFL8=*u6716|ymc7wngN&&A`!eTvF9{&VRA6+&Fd=VVxWv;A{x zaxy+CV?Tgnb#X=?{Cg~)|iqQLf;U6haE6S;h?JfQ|JvDV2%q@5_+a|Lo7!@+&adZyMKm8k@V0z2Q2VzhXG$|L(v4 ze)k;S@41&vy+v^*Ga0bFEC>J=o~+qQ!LIj*g#GQ3aZ&aKJ(q>v)vuI_a*SiMFYUe{cNQv~H@rqA0{ir>b@odonI68f%RY#c zQ^j%ecM+U-fk6Nj0H;PGM5|3QOOqVhP$?mKl~E14T?I7C=*6Ud2^B{LUy9uYzsK{I7tWNsPtCC0Ei_%hm_!?VHKL zy}FQ>?9}9nX94_GXlISru1dq;8KQI`mCykJCvcUgq8#RMEjWeW^FGq=H^m*)Hkl`b zo~BqA_wIscy;KD4_P`EYIyRL1T zxjlI~wb+jEUoX~Eeaze^*;0At+0)j?xGdm0%^yGRr6uKgR+Z1qxZfPwXx+;G$ru~e zlI-lo82@FiiAaSybDDPxJ5NL1a(USf0@%X7{GG(bCj%`Zab0Cq5HQANo3)pMUY$>n zTr`H#)Se7f!8SkNjn+DhyboLolmVhNixD^BmfTZA$A78qp6!OcL?EURRBLc>j4@_y z?l}XBbyF?=2sI)H`brFxsu2l|;AQs6k#8mno>yf)o7VWp^J1b6-Zhv@y|PBrlzWtG zNFD}OTU(;P)&9J6{AEj$0x|}DlE*1mzCZ#$(E~a61(~;q=hLV<<8ryxYdHy^-6E~8 zt+jpSNJsZMU)F#A8k{h^v^dl*hme|MZ+SHhMcDQK)1SU$A|5E)%69L6GnvVGATJvN z0K)F{tbm`bH$W5+0xy;D#K27Aw5t-FuMz=2iz{x2H1mf){Nce602~Ie^14^j#@&w+ zxbTW`3Fn9k za`ZMRUJ2ot(04l9@GLuE-k?$={*CaYi9q-mG(qb-1Th(`Yu0Qw)V599fKGaPD;jvJBPji0LO8OHo$Xb z;KIa*{+L=ntGasO~^oFn2K39lfGtrAmB9RP{nZMbt;+e9r%a28)Fx1n9n(s_Ra-U8vj@qk)RUfhpxG$!5b^@ zrzJeeS}u?Qq~l5~+VL5qRG>~Q8XA?Enfn#$g-oGcMx1+c{`8mh4}@I|7FE; zSF<&A4KXPmCJD+W#dz5QE&z)0zSB_*gZ=wmIT927ZSg#@e}Nd#encgEdHce(xHSX5Zm%sax3Ywal~q?58Q{`BQ~C2n zJ$K|&;C_(|0C@Y78s01PVCygZd1U1vt5m`TcpLxKeyrxJ;46Sjxg4L%?<7(yc7jAw>F+owN4&qn7@F`~rGTZFBb~v9?KQ zR|??A=9WlMcGfD8BQ%`xk9Co#j1!O_6n-|P(D$i~y;AD5jBTH%ZSANrR;-;zAm6Nd zhOQ+XwyIvBqY$Fy-L`4`{*dW^d1Xnr*qXc6jyoj^&yV##+3ViYo7vC7-!0v61uYE7 z{hzByMZn*GhGl#AxFO(*~M%e(_nauCCI( z_uflGkxRezO`a$!F4n61WLLQQ%C1XLsGP+o>Hy)WB;hq$(e?B%1k+)X41f>0DZ zhR130AK84FvgJ<$W1SVwg1wj)Qlj zc-SQ$QOe~VzMjTHoK6qM8!-^2e&-}?Oyob2WnNw+%S9v~-UlFD6UhCf^pVW$h{nQb zfLNatV^L(yXM>Hr*W|e-wW#^}rx$RQw+&$;Yz&(&cbo1~3$23wPM%7Bcz}NkLejL{Hns+B$8`l%ll+=KRcSd>p(zMOn+9q2&GN>*Kp+ zbEjZPn7yOq{gio0t+^(%6Os}cJjRpaMa6Jkg&*gg0kR^4aaInW^dO26 zd#w2{g8Uep+f4daL~8=dw)Fivc;Bxi1u%}6=rzs?Megt7S!QJdy^Nx4PEvo!auG2~ zv3GraQoNHgw$~@xTkTNkOGlpN-K{<4B`>-?r(t6<9;c!o+ztC9xcttr@_%}I5;iiE zU~a>%lW!iH{1c2{D)L_`MmRpGD7?8Y*@)tDdr?XwGkF{+%Gpco$_$HQ%yCI!r|hAR z{h16iE{+R6{!NTQoc0bI36l{p^l$R$yGb$%$vY+eX5&CAPj;@CaT=F}M1vL@CnjKo z5@R9GI+7(S9>#*Sp%*Jzqc4Xh|MGp5y$87P zed;9|3Vr80-=TNjd8hNaofTlOM;dA9v=RmYAvwoWW(5Qg^AH3!ctpNRyZ2>~j_aM=$agIO}0|KJB4Khk8p z00ut`xW@a|*tLKfKlXM?9Fl;o3_y@Sr$IvoF0Ne{iKF;1z|R?k6Fqbj@MKOvNt@(U zIiC!`CTVAWJ)UIxGyxyGyq*~pg5dEXDVH*k6R+EJdPet-?ncimE0JsQBok5o#4ATq zN&@g}X-0!fQ_#!#>!m(ip-GyGF4M^KF7hdVBA@$ZLg1PV&uYdOPx|mK31>(7nGYw>lcp5v&NQL7^$_eiX{+krT zMQ*pCu(&dQoUEIVJV`rp_|E=r>Ng)|O0Y6g^-H37>|bfCu<_sHlz(_n%AXx$HlNG~ z^fBgI>RI}gylfCE#vqprab<~(16d2ty(|j}Z=mqYOMrH^x04bs$G;s#gHBqS5tjhC z(ARN1#Qeq6zn+aulW;uXnk(D?%SP_v{WqSu8jeXG3i0OAUCMp4eHuovkwzLat&{;k zh=rGD1&A?#J@tIeN;`+M2j89skS)HmXB>zB*oeUCWp=@+^gnLuf7xPR$Z>!}p{G9m zBHXz$EzT2oD$}1;RvG|Uo(Wh{N-JqlBa}bltugCsAZ-;SYT%6+!kJeTuR=+wcM^^fbummEPdzew#GiN zeJy>9&!pY$m{7pp^rbBe`x1eDt&&isfXKCKC(JYD%L>BXndd(o>zZbWgyXu_*E4vH z{YzvTOGQarQ%0+`Yy_ZW0Fp5qlsi|} z?DOn_i7T^C@(h&J?}5L`S}w~KD@8VTWMwwx$#vYk5|0HGVc_GEoAw96NT5p#efY^Q08_%)85v(UTZVZ);~e8x_MhW|sdH_6(o_e*dTG$iz6SfRwRW+L-C;$39F$BG~{i&wlg1 z2j9!H5&w_0JhYMq083$-W%A&&QqP_^HVTMxkAM7(@ zYuE8nM9|lozL`I|f+LK@qv)+4rP4%t}3JFy_6_U^#kbVVC}tW`j@o zm>B_O8Nurc z>s)`Q4NCS}0q-;}u`N}fb>xA4V3j!plo)QQHI7>27G(kdl0*f2@033&oD$_Djt7^=1u8Hleo;cD z9g1OU5wRVXMu1&dsp`(FR@8xZFZ#kX*x5Y@XqJ*Mq}go#^#plJBk0; zSe_9d@oolrI?O~^I|Ds-1l{t5P0q1fJe--cwEjVH$F*#)x4 zN-S?$_?-QBdU_fRHzvzg2;YDB zmd1GT|I;+{(I>|T%g2zW|Fg5`+u#1S3Tw#_D*P62jx^HHX*2+gw4~(H$7@b3cvqjz1Zgccw0Ah#DV=NXVnN~PGjg!` z(TwgS3Wl-86^djL{vt=tj zs9P~uq@S=n370;y&nkYY-=m0i&v}D!MA@8XMXqe9CQ6l> z4xQRLD*a*@&_*1IH?eEX!H__?U+bO8^XvfU)Aa3>ha5xcC?9o}XDm#hL1MM@Sjp4E zjr=ozo5?W3d7qq~g#7@7_&Sd3C^g%B?Ae<3I1f_(A+N4+l;eA_MWi+^vp~vwqZk2Q zI(~Gj@>R=@Qh)Pa3F|zoFqL!n=x#WU66H8$k`0;i&RCPv2Vi_mQ2xD7Ge#!KxG5)v z$T0Ca>n#8NlFNUIs0;xpvqi?@bKX;id@&H?j2S*Ib2|0O$V0TfyPGh}RPE#8GM{>e z2esbsvwv)4z7qD(hz3TMGu~rhh~NKd#x|sk*0GP6qLG>%B14+~kH`Np+4_pNKN~RNlD;kT?yT`R~m)-yGC&fKPnt#XK$Ul#l+SvL=p!dkAwy$+RH1 z1*!zhSPwu3P)-9P1XvhusVdjk0IMr5@@m0h3#iF`pK`DWSx|!@a&EqkDz9)+yvtV~ zH+tg|u54VHd5bqwG)Kqxj>8&WO69WW|M>V`27DXaTePu$g+zJBJ`p8Sv@v@xWlHPG zBgrQf5$m43(L@Fmcl2Xr5W(>UMOR*uQv?dThtd?akrKztib4 zttBO^PLB&TE=XHTp7Au2G?Cu_=kX3#0K zh@6^9k@r4G#%DA_WBr6*9v9?OaY^oSoB@6Rxm~7cOwY3rqW51m<=y+}hiFK|n?_rY zf6Mb9M9r7`kw#i3dh}c3k2KOFB*CikLGL4u^YyQPoj(8h&(jcyPXpL{=>v51FaC|< zT|U&}Env!)eXrL|+TWZ*POz=8zOJKJIqur}I-Q=J#CpsW|AX5H`7Cov zWl1}>+aKGtU6Phr2fXTWETQ`SRjThA{C9^rlWQH@QM+3(q`t%C3#j~Z+-8ocZo08{4JK_1aT@q_vOLO+vz?o``EvFwUp;d+e<#Z z-=s!6g*~ixck(8H{N6e_K29?OXfWUZsrN>4_Gyf}_-^3kN3*|Y|J{$#P>7vGylFH# zk!p%{u+6*(4jpNvq0ndm7-@;gHN94SFX3-|wrwN7+%QGmq4@$XN5_@-!?$i&v?z{5q zh^P9rr6=|=*viAE4ORq`my8|K-Q}wMJD9NPec@lmBOh;x34-A(c_=H!8~JDBR-<3@ zusPS*>3`O$|NQn@v^+D`rA{{PqVmtmj*Ww0fhk zd*6KDx9}h*@ zs~oRMq-TeaYw{uYXuKg)&+VPXjCM5O=t%6S!+rOr)lqpth{+@DYd8| z;OuS*%j$wB(y%N3DCJ)=)VhYg_Sj!3Cl9%L$^aCKR?NDp9N($@sf6m%lW*iD<&$bV zs$>P5RhOkn+DA=^Ru3Wl0(H>3w1YN-F5vqqmA0Ffd@6oHX~q7`W5=7gDm}`2$=~@_ zo$x)Ot7Q#3*$CC!9{Sq1Un?qJkR3z0Jv)+lY&T;l@l{5689Us&>T!`7`v5bC>oV4S ztq_1he}D2nQz}oVbm!oRWLZx!1b~4O^0LNL``%OUQ>WuB`p(5?E#oY1%-EG@-?zfX zuM}~ozhiytvE_N!GCy&w5NUN_4ge_s24Ha$%rO$z@*54I%% zTsVzWs7s-S0F{r%H0_P?Fkb|WvT2!J&aen&4@zT-VqO!OfCSd1<&mlKrrI!4fxZrK zjOlWmj($Mn!pwq0d)KaJjL*tUISwsR@|vTv;+;`cJSbcqlrd#UprQmcz(IguJ9YB4Z11xlC*h z@-^Rz7i-M$nisFi^Qtah`jfow>*V5hw!Q>qI%r?3ygJhkz#CbEh|_f~ZQ@HBNSeo< zX$NV~xL&-FgTBpipe&V{Bh^=u&UxKmxv?CKLn~&suYCKt?+BMMAZdL=&?-X;jO&=T z3^0`*>RX1lD>}aFheQt`|7=ifDaP~OO%fm9XR*z6qhVZ|clJ!DbY1WJzIUnO%X`IB zOCj$wItU+q^=ZY=<&$s5w~Bus4-$uW>rgEHeU}3yzJ$S$jS4-~K@w68-+~f3vC|UQf~<8ceY& zjz$`38EISsFw)XfSz{|ZPHXF}UVH1q1}}g1&;D5&3O(`ZAEDd-{J)x6^m&7>_;GaU zV@kd#V@xd|&}XG4lP-I|oolv{00QgDnYXqLH#CaH)^U+{Y`jsnmlGaD_|#*_Z{MQO{*gNak|=1rbNl_Hog4R6wSB{`I7;;Q^p8K~goybM2CNiglo>#A?x zyqQ2Qg$?VjKlw!Ar;7*0LXo5FafRu-3P^S=eX;$Ho?DqUk;gFb)a+O6N0Uy)ce?E) zU(2I2imDw8oIkhYts6HB4>Kd!6Hh#;YAG7A>|KEGpjMu-?Dl&N`&lU~rhZbVs_ig4 z@5{95)>zA9H?I4xc(P-}k?OZx^*LkdT=L)XE$GU(>%AD*Z77PU_*x~ow{IHx_r<|) zku7u4yjsTKsx0_M2=92^!U~qxzP$Ona3>tq7`u#5V%Xlno?5gsbQ zoyMFHdUiUMpB~Bp9~CVdhg|PH@^0&4y@c~TXVQlJ@6Np=Sf}b~XKyDz>!ZH*pVv3N z-b7<4lV8bGQ?JoJp^6h)f zerGUT&5ZE+cOKciS)s+G{2q~K^Xk^@=LTQ+z7yIA#{ymn8*y^Xdw1`~BP6e^U)c9Q zUQ=!lpDbW(px_|hBjMh?d-S27`cWDZz468y`5G~Z9zz{g(2+)3G8&fvjI`urfp&aB zw?33Yyaxd91uzuiWdKio`bGHYmuYh4<4@JcsE-slGT}^J`E)6`ec<1Mm%i)#$?PZ_ zp9x@WQPOOb#e1s- z=E?UE<)5b=-@9|KApT?tI66F1{l9ARkLj!u)|a*wXOw@Pr~E#M{I|w?rLZp`|EDLX zGvn^vIP+unw>5i*$a~~*$p8Met3}!NadX*=`u0Mf#smI|1&U=pqWSTL4B8^g<(6pGmo;9SFH=Xc=NN?o(+;#m0{{*uL;4mZ+pC2>AIAH zR$Wt|4kw~TMviSqZ}{~M9-IAW#zu>0?3b?g!g|G17<{UTr)y7KZ}QS=C#x{p=dCd7 zO>$I^Sx;@{U|yTxuPyIU%m3l+gY+sc-m%!EJ{VY5S^m4eL!}0XGHZ$dI6UH+=>6x@3!eV*AE6-; zEC27j^G?2R_nVcA{+V7QjWlE$4FDr8HEFQpI>C?n=+6Fl8NiTE1GxIq3$*#cr^9tv zE0;V8(+pyLvYvYdVr_lxZv}!37?ZdNiY0CZK!|!jb}b-nfiiXEF$JI?aeQHrkpEU) z5$p@^xf}phIgP1P3#7I{4*trs7JyVBmUnC3OS1r6JS)9A7L974Ou%aw@M>Lm0moK7 zEr7H6DMf6mcYJoh8^%=%LIZf?bo3Br`YyDo$rJOofLx8$p1N9D;Hk2FHa(?jz?*z> z!x|jdg>8Xj4D*5fP&M_UPCmNLe-<^SZKKhIjAl};E3g?lF0&sY6 zKxcd`+KS3Q8XNj(l>f&o|Cq0RF8nMa|2+Qr2;Ugh)AnwBk34Sq-`?ISOB!auEO%4W zXOBYuF^!amZOVV*%;0`Km>CQC_xYb5?)3i_wfd8&-?%c;NJFO405H;0Qw4B=xpAHFYdNiicYKtUf<^{d8|A{b6E(mOhIiGOpKk5! z%s}BW2Mj`@#a{D!unjKrQ7<9xbH^`yR)q1=;a< zORbdI@odMo9C%TYURm>(SmhBQ19x5 zRXYwv{&^>FY5lcu?AcEEliWC8KBIh<<-d!kQT{JZ{w-OhbrJbzV=gaqk#xL-XnSTz zya@T{O*eP z!pHyw5^!$fNKSkE`y^@_#|cxTbww)ht{$7X7T7DW0`a?)h8DQ9b#jnDrtzlCN_le) zFP+z3Jgf9s(A)y+EdY&U(^u7LduZ4I!(KZfKC7FRS4q=Sys#d~4=P5PM+mDF%!Ulg zwJ06bs7KD*j*APF|3g;nSteZ^alG!C4P95RTv2-|9M3@ishozfqViwW&$&_lFG&8e zzSKywsQmLZdpve8ZXi0jF!|ry*{1dN^@!|e!FTQ)h1oZ`tcNWB_WO_RgnY|%5jGa` zvmgA0KTksML?ugVB}~-y1To( z2cu)e6p)l=ASEzzFt+b{-|sJ+>zwwDM&l$?)X%Oo_&h5025PLPcg2yiWJu~`(x&4Y?OIyp z{2k*H68M;0?os-U`rf6C?l2_`GW9T($+yk*(`r|>AdXM1+%@aji6-+hT33Pn5dW^O z9qx)~b*y<+R+Cnkdd<&2z|DYd8vMQv=C7e2!)L7Vv%$WS56FM(D&Klmv8^Ab`Ctek zNyLht3ytETik^q<%e5te*p*e>HXyyTNS#D?rh@kR5_FBEsUQsofNWT)Dyg4-lb8-> z!uo((dWXpwC?v!sIE2mo-Xo!+DLve)Ed`=F1QPCYl&Fpk@F>5dXbCU#7(bUxs!ZJW zXt<*+y+;16sGO1_n-wMRhkKl%e^%8xUei03+W&w4QzSO)H^Y#FZkAu(Tj8Hgy9cF2 zD!~IWROf?ZRmqN43-b~3l!S9Q{uILC-KN0L0frPT3A9hE^I6Z>^pD==0jcuo3un@* z!e}aW5H`%LKc@QEf<Y|AN4bSVQ)(5;Xc`MqFP#hztX<%=nuNw<=^}! z!OedKVD@6P*ivOD7o1tI0OlH zT!^1DOm4N)p43}hn12#1y~D1sP!5xc36YQup2~L?P6#Blsf|xssu;SKO>T0F-2H=}J~S5xn(@(Z=fb z_psgT?P+ZIE!t%rEtui-A;cy&qnK3CFdp)`A4)Yuyr7q@WlRwT5oB`?F+Lthp%Y0+0|*~pY(h^g8^abpuyF-iLirq+fSRNnLW zUQKH8zFeMl#UyNR&CehFH(ROkQQX+>0B_@A-|xcOwE|cvlF2Ym(Jr|uSE1HvtSQRT zQMc|)mDg6%dGx0myMR<2esI#uCwR9&(4Y~s8jb&TtVGbWSrI^ah1>;l3LvD#eE7#M zr@#9xW@)sok-k-AdE+n)zi^bnCL*{PCx)}Y;WePrB6#Y4^zy^zqy@zWplG~6o!tJ7 zp|@JtQ)y*|XW_x*BAZmcD*dbagyT3LU3#e7ds|30JC7HR)gF!gE+^D&YDkPSmXqpT z@cV=`a<%LCFQW$B-jLbkrBM~HFnmLtThmXr3+RPBQC7IBa9ewF-dgu?rn?2vhH+>gh{<`|N z{qD^%k`#sq!2ACuMXnj6R#EoDA`#ULc|VPe}AwaNyL$Q?wRIOnWP^2mai#G_N%y8x(t?_AEH+t;Ule>usxlV*{}!9pCbf94HI zef@m84ui=>mJ~Upf(@<})4_|}Tp8fUC`aWt?q~`BVf^}u;na+lE=knJ-m=7zbC&>! zEJ)1l0F6v|NTwI&zVW36Of2nU8P~F(S-y@vx($P#(S20Ayk2#m>wrF-c*LDJj`=Qj zo~HCBsnEaquc4nsw;A^(v~{Se4T1=kSf2<2m%s;jZ}I{!ODdpevReBGqo?r(01cjB z975C>x^SkmO){>Z&;?>Cp{yDq~knE7SU)3f`OhAKfm`+M^6jV-;)S4D!60*Of& zf~qafR96nFWGy^qfx z4E#GY78%3BnAbjtv@RZbue7d;0)Itr*e51lTPR`7&gGKN;ipMgZG|5-)*@eEU6e>B zr}g)5Tbz>DqHZ5_usi!MxLa}Gmm7x`V~qxV;%+RW^WN#8v$mc;j2TX(%xM>=w@Qp{ ztFa3_`G2Xe{FOfQgM3@?Ol5Hui}q#5a)95Xgc*-&xS41^%1#Bu1&hkC>n}-dSZtQ2 z;u%<7hXRChp8kN_`j&9JFKDxMURwD|;u?l`AHJnAr5?dS9n?tR$l`*sB)I90vJ{$w z1$T)6bJQ!P`m_`uo;a~&uDC=w0$=>oIP6%q+NxB35{siiI2x`z`%tw~qR^gKiMO72 z{!IaDU#2sQqw{#Q;1j!v4t7+!(b`aYV$4~n0b<&&<#1E$p$-2|?RxU}LxUIofT>QE zT)V^q^Po#jac$e-W}@Rj8~D{Y)q%*@ zT&N(p35HC#@_6nNlWC^iNfR6WRp>41IDxn=-D1dAVle8Xua zi9%ou$rz5CTX^~oLG8 zfIGk5W+Mn84cl%=tVo!vD>bW*tL~_LY6Vo?e$mF~?ziJ(>BOau59?gd14CVT)*ND`>2RQT9AC zOjbn++LE(iw{oIUFy=fR%c(HZD)Ezb+|7w%y|7(*} zld+@5pqiIIof`tTzvB5 z73na_cXNRDTYmrTDb+>o5v3nh{n5ai>iDkA(L2lWMYBE^8R>lc_x+A|R(a=#3eO|R zr>wvEID4D%d}F|=4j?N^jvyv`hEUpuEja<-IIeI%QWte-oW?sAx2@S4Xn)eq%4=2a zu7R(WFBS62Ng1ZdRHQ{^iU4=oW}FpKtJK`8EiW~s6ByQ#3aPI1vaEg5sQD z{p#lH)m@wZdN2aap8K^qYb8813AKBB`x|K;h_!qrb%uq{GU3IVl*)t_c{v1ZBHZ9; zDRA<2(4W`zl)`&CrDitk5YhJ>aNDoCbN#Po)il&gfHtKXiZn~G(ll@^mnZ6JX3;bb zXhR3>^jRurYlq&KapWS;N7YdWR zAML`|WT!PA0XJ5AHqQP%pp!%&sRatPRSceP{1tC)PvqY{v4na}QB?#WjdeowbUlB& zFuqPb@+~SPSK81|gNd^+nDJ z{`^6BzW!mhjF?E}(#cek-l=r*?SC~^tz0rOI1ljmWm@@RhCS)&W!iY)s*RRu`L zeR=Hrd&!?>Nz*Han1BaQ;F09wFbw8QTkfJy2EtV{^ElQ5O)MTs&pr&tD{$w4J34$e zYcI1ZuC8sD0ldm-w0t(1g)O$cO?s){+ryaT$cl+p2o-#0!bq3I1NoqTT#fq~eM17M zp{8^uNJBe@yY+Sg9N*MahSRlgc2XSU&fd?t!~4IuQI%*KhO?}3_cxt>=Ag1!nD{vv zx2{s_%ve&|8}Wm=Pvh^w)+F}CqJstsxp>_^;=2pRuKb#PY-=_!pgsw;pGg;mVIL-; z<4MUmsRO>da{Phs7SZ+VYpa&LsQnbj56cGJU``)M!Pp}(Hn5(v$be-*@UKDZ`LUSa zp}~*{0CGOca5*D&8tyD+oNL(!v|EE6s<8{a{_jP6zI*_}bMD&Hct5zr7I1&3?s zpOrC0C(hWCaws-UXk0Fwo)?Dqd$=MRK*M5_m>{NbAMP0Xi{$0cO>sPY8*^3}eH$tR zU;dPUt5{MGLwFv30hOW4+iskfWu&!=#)Q;@$_JIfX?&ZHX<|s*0j25a#8VvZiuJ`n zVBDk>=f34EkK5UJuz~W3_~>3tvR>?>w2f>l?9nW{51w@PkP>u(1*U~@>lVKA(Gw*nEzN)Wq*&-a;s$Cej>=e;h<1AOrrSXLvh+(3 zw#sm!rx{fYmmbXmN~afK(Oga+FXP~UYSKK`3JR#icu&%?W5D}0NJ zt0XqAJ~8zVOHra~0_oo5{Q~sB?*yC?UCr&%wk7lcs$g2&KHMd<%qN>F_|iB(ctQx} z3s0)>ZH(W2Gwc7VBQJ?$teEEQckk6K9dH~CeOaO(gB1Z2Rts##jySug;dz^d$jjpw z^6rcI_jR?UiQ~o&JD1pZIFR%j%2mjE(cFb2bAjLM!%P|~5*-qWNI_~Q@|6efBA$@w z1XRzs6fgPqRSa3wTnb6U$||uPi{(Wta%dq#8>?PYGBnJss+W~Lz(OCM@dqQt~Efna&fO_?MwdC>Fg(Bx;h`30#BTW zR!Pqe;OLK)-==UV65ipHO$1U(EUHICfbXpML~y1=gowBBcsL<8;~A}`s|(sgMw>u3 z_1CneuP^vKpUC^&GX|GR*a~dA?4-59IKXMN3f(uZEH6EA$KQw$YwViy0Lz13;<-iH z0ZE?9bjHoqzYB54%@`Nu^*!$z`q%}1{>wH0C}DcLjg4k3!eF`NM$8&u-Tqg-OSs?k zstLIKZO-VqK~IeS7}O_h@r|1%qC!@4naoP6n7GrwvvG%Ti18y?mw?*EF2jQhLA=DH zXZOv)=cenpuR{1QK3rT(&jdV0GRHqi35;UqZ z50E7OkFkA7!q3q;6DPIdIcye)b`Cc_bi|r7SH|3HTaDck=f9lpjsB5N3PCygO7PJp z2f)4Wbt5~_8VxwA z(FmWc^{IWaD6edul1__@=y;cwCi;jjl?b&_b<(KHS-0vWJPKRp;j3Z;q{>!fj#my|W$1E*~sU0X(?&B>daO%}7LzsQJiQuohBMLM1%(kn+Q| zUUQ`N;TCa0wXjx}xJxQl+PHV3#y*kdFaz6?1w8+|*39ahSvIl*oCzs?YXITVIo!IDgaHYJPX5wx>O5a^h-=HxcI?J zrAdA~5wmYx#nTUzXb_ikM-GhP$-fbq$X+xpP=Ecgtfjx_*C^SjN6MS^#&^V>fk&KG z2fy@Xd5tgbejaU9gGGN_m@Vtg#R}{sClFs7nd0RIlV7H?cIFYZ@CxxByeG=oIov&$ zWnQ%ZFi87h%*0UBtEkJ>@Xf}QDo;^6zi;r)db-wCi--Fi#oR80IT<~+L&Xy(r@ELA z!RR6iHaZ{$!5YMP@cGSW1U3BF^LC}i9i9w17`OuM!zo>X-snDOQmB}s-ha?w#X6fT z40+}zA9-d6&cSL>52}pH%|*7Cw*}hpK~g|p(BYgQ*~~rGA9~|&OC(QsJvZ;j^3xFNw za_L8KY!u)s_zi|`5TF+gaLKFveT=wNcjp-i3x1+8UMp+SS?oF+u3Ft?Dzk4N)tIR)<023D^{Rp#eyt;1d# zz7&;ri+xmc*%@A$Kb)jVo(HHpNZ;?BjRJ z*D&a=Vjfb*@;rKm1M3t2clKby?Az1{r8veS=RG}YpA6_3Cv|!eGMT>@i1pop3Q^%6 z+1y<|v+9-<`sWn9Xb$!l?DT8}#(p*X&+f;0(KC+}gU(+ycC-K^JD;&oS0K||sMMbxEM{~Ij_dhB4#bYei{T}SWPHYBZj8XLr8Et`7LKY zqOUD7M}EK~b72=z_(?e;fnW53?XMc82>$MhSU zCa{X`dZp)*E5QL?b|_b5gAcw*)DP5ar>e^kgjh?);T;PSoCv`(hB(rl9G}RDpf;8_ zCIiQJa^c+8_9!}?0AqPI7!yM7VvQC1x+ofKh1y>h96Y^S>6X1lQjW_pWDn^@5~-a9 z@u2gPM9eq9d_8EZeqn|iyv#^wZ-%VA6tiDsq|z}8yC(sy8oUgmt@n%kEIO-}5%;g? zMyokMcwdjGfwLt@`>9P@-Tt zoFA48iNvOJ&N3)JUN{8>XFlVB_wi=RsKGY83fHvu=aL@+3?3bYH5=RSYk`++j~*UPVD;WyYs$;$&^?~i z|MPQP4h~rQ{abTqYHs4(^VY%$B^Zg{K*m*qzJY-!YJ>CpXH#v`!YE!5a!Nhaq%fL=*~oI!#6uVVeINJt53{9zCPYgVn%M!`hKJn)J!00&;|IQ? z?J12GEhbK)8~Thk^PpEBwrSEti(xU5Cuw6!3Zq?rm-&wPB`>FgBC8M23DA-*eB@6w znQbo2_(wH3KqpXup)uNL_T@#FYuwu?8;Jfqb%`vWV>Pz-7dr&T(81R7S?Qv&G}z^o z23+0y?J|=?chnL4R~4fJpB)89gLdTH##9Bc{)^W!p~`wheEjwKXbWTXR7-v<{O(i_SEEk?voK{;o-`}zW4Ob@b^}Xkgxa6OWCU6I2X3Q7i)vSzJvcmg& zVhp_D$&1;izK76DRt{fB4nmm_&{w1S(7Bs+z!~GlCDiqiSs$wp6K1&+MSE@Se z{#*9g@B_gIA-Sm}dQ>R71<5{^FMN_MoS7o~0aY+XO13J6Fzug9N%{EA)E31xZV{x4 z5=0@8Z7T0qwq$p$#VKf3db(9J%rML2{9`zub1u%S#>U3V-kZR_LtiFP62*v8?z{s? z=h%E(2V31^|CNbH3&-%!uAZC2(#%e!lZyW*7FUmZnIMGqbM*XB7h%j_AE<_6aod`J z-<>G47J&a3EAY2d^9-NvJOE87A5Chbj5G|3Oici-=X$>TVDqPE@xvio0B}Y7#!Pla zS6&T=p7uTQDb6>fr!Gz+?$lkk3vTpleyd#(gzVT&whxar=;Sh;@@$JW4o*ZX%!QfK4*H|`9xOZCsSYEBe3P#bvpeH z`GtMMb9ZwtM8wWvdk6Iy4T3)*AvJ-Xy#+k?%I#OC{JfT-Ob0RH0^V2@P9C>KC57J_ zXC@b{!U#VCJ|q4jn-2?l{B(?t4}WV3I`#s)+OukVN>Ze_oav&Bur3RELmY=J5Pg+k zAeCo;(b3VKye+^x@A0wwaxpvk@5<1pM+;)bCc(ug6DeM25^hb4n z=3-#BZ}=;mPcP(1s%vrBPofX-YI#P03LSXxboUpJ2#2fy2br&;;hUQ2;3dc}8E!4Y zg`&@XniNJ}1}B^JfL38Q2opc?G5ga|kcbM$Z(eT6_0Q;3xr*1FUVJ1HV_leCs_L0^ zRl^_rneJ^gqk6;*dZ~^4X*!DWrLxP;$6k3dyxo*49JR|C{TY{a^cP=tvDec%)mIJ3 z^XLRU%n;Gj`<@8L_509@7Y&W*qcM&KJq%BRt&w##!d(vq_1cNtwoIq6^hQ}*SWk}O ze1`1oq;#?thJD^iO$<10Bw3vEIA%V@>(>B+!v2x12YtNEI}NDl%Kaiz)q8LM4iIOB zO?oNwuj64H`Qh##!@pI{_$3imvg7WM^Q(d9M4jzD&m4f`V_9;;TVYd2=YaXB2SBpP zSV(9%bZdo9r~+V$LrnPbXG;l0jv`W?Y;pph2&lP0zrn53Pmyi`R4{?5Ff|6?-p~Tn z7q<0U3S&q=cG#8TAuRx{W$!EfC|g5bt-g2$q%5%Q*c&RzHU7nSRRls-V}$MPn9@}l zsp{USTbu7_{k8k}MM@>x=DGYUUZaow$(SwcE!51EozLmI3}px6`dZr*+W-(vs%~&4 z*fkruAY&?W=N%d34sQ=&OhE;P?F`Yt?cJgxlaq#GlTEIos@Rb(hyq95+^JybC2fQM zV*pBc61%W4b=2LIHRM}cke@$W4FjhGx#{NWyV2}|)o%N#U}F$!jTdf)+PCMaVZ(mr zFT7mX8nBg2V($< zo_jl|*V{D0j@D|fBV>JoAx*?|a#G!a znHK|b*l}L!c{eHsx3MoZ)<#nD76`I~06WO-_CWhplX}}Wm0H;drd%XFQ6jDHP+R~T z)p(s%v2_|*f_kZf=^~d&^Q4c*8}_TuL@VMbm!PE%&6yPT6Tv|l_z@B#1+`iZ_>CvI zvKLwzCK#S+@k!M58Eyf-{-GrU#dbdN+pJ&_){)Bad2drjN9?`#sLMWX&w zQkOX7p2@~cnzWvXQ$X^u7jlmNcM=cWiJ~@G45;fCFyBHqD$)PEv|}A7I;LM^yV? z{578*4e^Ps5MFfgBMSt3`YaCThIY={b4Y zX|{^rnp8|fGY1z6)+@N=uGq-ptOBpn&YXMEpQq!QWEkY{vQ_90X6OFBuo)R2P%RAj zaeOI6WJixo3U-#tdFB${hTYQK*k&bcd4$fw;SmU4#Y+?p!Y8qck_hp7^pUWj??d4! zM}C+H0}~V8uD(o-WFMKDu)xA=9jsU?D#{6(z5%03!ITlcwxk1fI30^(#u%D~C1Vg& zYd!u6+6g+mfRDgNyuv>mhd7(MUGL>o&3#+!&4UFWmcFwGFY;=POE8^ALf*;R@+hq| z#tbcl-hfpRHT7C|vK(r^$a)9kco5zJHi3I-tS7;UCGlZ&TJuN8V+t|U5zOLSZ-FX- z&v?bF+FO^?<5xR!+Nh0<4f2n_D?~uF{k)UlzMHk?xO2fCw8R+Q&n|?VAC^3s?et@y ztBe~9@reL5Ll0wQ2BEfb7c9Ljnj%{3_BDv}#L#4fg^qZ=U0wv1{D{B6wU#oin3Zvq&(yh|-p(I6a^p zc1oY4@37=lQ2tsaHwb)=g!@~EmoOS+f2@=&HA=_6%raF*ohDCQz~ls3dGY*Lz}xh7 z$>`N<8}ST{i9J z`EzE29M#1O*|SK)w4+txm}y0M;Yc4#iyzC%0vr`JR&@|_^_XGDQy1Ou`srL;V_UVC zeL)6*xvvDsutJ8prS@U6(d>sK=ZMN0XisW&eNYPWm#3HLkG`(9XXRLlor01Eb3~L= zvCx|FRrD#dV0uCy(p;T<&$++{7SCre(}PTQHm*LM8BM?yJ#JF{n*Va4G*+1_4Vj6pX|2-PS4~ATID`y1 zoZAN=*=LW!%lil*cW#AD+db`E<#^TSK1`h%opsIdN4wpSSC;+Vyfwfd7Uu#Rf9wbL zACD&2%|W`iUwr^tq!Y;I&<`zBxwX(>!V~IcTkwlG<-?m5B|*Qs0nQow4dhcZ28Wx# zwSb%6&^d>jdy@uzx~sSoWp3DP>lYWv&%gXGj8T>_($OJIn}^h> zT8IZ#BW=PU0meH*juf@O{4zkLi-IBO@mwuk&PMe(bh?LwE5j0#WWom)2;F4Sp;od~Y(R3K;|trpn(2)23UDAj0QbQP#sx8Q`Q}_QBT}=)?6YZ*AP^aHF!r zvwk&p%b@?pj+Dk`+cq0a+LSZYdW{3Rn3gz@+CaS|i_3rK5BzYN`Neh(Ecr6p5pS2L zDdkWJ@LG&T);-u*&N}2%$lsTnzbaV1hU^l*Pq|KJl|12vk`uPWPSrP%(pwkk9{C=# zx2F!3Ig3YWiq=}3tv;@DkEBm`+@|Zg3B5w(FOjDCUlLvt*3)o%KkV4#Hz!?u*$Yx3 zRnmcLw*Up7Dsjf}_zU#c-X5CbB>K8(7FZdobi)+$J*JVrTNP$jk*SD5FCE1`|9!Xj zZ@1n$*g6pTtwu+(Vr@@j_)LuUWgyr=FI6Y3&M4>R zR+IlAt-7}uTDMTHN*ilB6bfJ>0SJH;-X^4267U>R$k2pob7dYE5x?(ti)b$Mu(6ot zbJlBIGQZ#n5SAoiz!@d*?AU8@5`=46Q7%#SnFrEiF7o$$8$HOpTKMIxS(_kLRpV6{ z+o6}=T^hEUz?`m*`7$gz0Lk{(p zeBg9kuq^X0B@vgx?K|P^DsN7||8c3fx7cyf4oeAV6>QIglZe#$EcuaGs7UjS)#vO_ zUoPDjTw*sL3SOLIDG=ZXnBNjPOEhO5BXg92kg*vi4Y?nvKlQQ$?Q=cx8X@Px;`fFD zJK@mX1FZq|93vZUUu}(?QQzQ3kKv5^=R0|S_M@!#t=hULIDVj`G&^#0&j8=AyRyf9 zefFOd`guNR;E236m)u!klt7exm%;F%$YHtR%*KlUzZK zZmA9_eBx4ZJpITkvz?^Wv!FOM7-5r{O?v?Qs*ZOnuvsGB-@d5%Szj^c=FGX@n*`wQ z<~F-9Bd*L&`}6#qC@()(+?RFkvAE#9CP?0@Oe@>-O*yB;-tzx71U~$TIQ;cFV;(gHNTyeeDwitFaQM&SVa`s65Gw?fv=~wV$OAK{1c* z3D7MpHtgPv^NwSsc@d*K54RtU$hV?89uJ-x$emX>VMoY+{P?!`&{2-HV@PvEYf$Gn zG+qCja3~$UnpNXdM;2Z5f%GzQ2yqkB71W9SPud!O()FE1fQ+w#zg6u1n=gI6gkzn} zbAX90U+LxV<|8DFW^NTUH)N_>@P?DisdRy+w3O^&4` ztiLpZEbJ}%U)sX_=gvIXpqZ+4lEWh1w~fRq;_6v<7v)Bf^ql0y?~Xv}tEsuPjJh(? zwp(3v*jwrq;k3F`YLPM9E70g2#_Ac?E_V(l_%7%gAO5BmYFf-XFgJp4FJ)2= z+;ey{DMdKvPHfw#i+lx*$I!Hul$21+!4JnZfZpCdUxWI7<3Roc7YdF%_Gj0pxA!pB$9{=NIAXRIA^6pKH&|eWnrpz!TW7|D%o8!|A-ExiT zM0@qaGGxq6Jj{pd;`^y z9CCbf@8?avQmmhF3+eB8kIrqz>djE`?;>=Y-Q)I_ps ze~w<$uDyOkdUF$h`g63`|ME9HFgH@IS+6A!zAy?9{-MUezrM~+RzT6gTCY6xL+xK5 ziiS1lnGj$%1BlJb&)+*s-~K19bYeIn0iQ3`leT~H&j$7e>-g%`T^}4P8F=H~o8BK# zJGQdohcEeLN;xs!W`b8;Ef7|1R4DTFg}EB417;`)yw0vbTgVDSxL1THU)ncT+a>6) zjp$_HtXx4xd>*r(oJ2dD_#kKgIEtRqGLv+YFOu8fGx)|*W zk9or1zOz+|qXC|dIaeD|6uHG|(e<+ZJy9i-I*cZZ_JALs_N(vW= zonE+O+7R2oRqQ^(eDGe);T9>#{4gO(Y|?}s;{dQ*nr~826Xwe_H-MU;JKj%f<`SOF+8pu)D$`#hy3UgmmQYYsN<*CHlKLz8xUvw2f_N&Lv^4#229L5)&FD=^1oS&H{N?6Ex&Es8YL|5~yEeJW>_bYa0d(9=*)eA2< zhBtbp+=KEZl+T#up>uC3Fv;b?w#AjDbdfshol0kM-Dy(K!m^4ILySLt5tvQj<|+;z zX$~9wQ|dOT)?IU1xU^R+8hyPJ%eh-7jgxl(x1!Mca!cS+<(8)SSYC> zv!USbJ=vEhz8WXo{Cp!)d?!|Xe|ObaIWWBhvd?4ls;Z!ZuIZ~WH0MNVmwoR$)~T$1 zg(R=844JZ3D!P=IXfTTRY=&?o$ta17YYWr+uI*l9|QMixYQYcigN2%bF4(4;ZD`vJY# zclvgDSks`Nkz_nrD_jUy6Pgu@hGxZ%JXsW#rDK<;^KSEPYzm(9^qblDaM0}Yzi|_1 ztHt^M5>u1zcnA!O($8pXi>9xwZcH*Pv{jZ3Yk+7HR?z#N3RnILsSU?sBEAG!&iu@Ski3aS zSp54M5xN(QJ-(1B3}_D0c%CH`4ddsPsr=S?38k>2<{C^lh$Ce09%zB9Ygk&R`Dhb= zkKdKx2=JU=?BkZ{dKup=k~>y1uf>zQmk~_Pm}V9ob(1(Ies)KnU`11=<>Z`7?Z&Sd zR3>{!riUEyb8v@LQE;zEkdcQHdY0v~m2&E6`MT^`6Lb^`?S~{|7_Wg&R+{%w?M=%z zU6KnPr2F0+PgQY=-FGDth+MdiRTvYdKbJBG>Q##tX;PqQp-Seoy$#+=fl>CIv=(A{bH|V*ktFxz|)Yvq)~C zN2gklYWqAQBWd*CnI}%B8}^M@;Po*^#lUgtSUpOzfSYpVP^1Y4wt0=S1iIsu!FK7) zu3|Uk%DnOqm3|gOnILJ7W?h?fOxhVOOlpS7=EMRiuFf^ViNa4!Il48f+$?J@%M1n^ zPUI%-3_`q=^|HvRztuX@f&*bBLtk=U_dZ@Quqc}G^*T#IQLGzCTb1}CK89)keIC^) zCHkm;X6CWh!eVpCqkC4G>Q#~zoYmURlaX|?#OHK88|fh~ zD`sBv7Ut)hi z)aJUul8?8|h$ZkjCpw7-npVE7T?J&a(t5&hRAi-JpG-d9=#!D4kt-WJwwstYYSc6id1@rp zF)Bc+m&PnR=9ACJ%t(!O`pQ--)21qS86)>j@rBj>#+}uoT|300RC(oGg&t>3upX?t zEevk~eu(ZL9mT)0ZT|nk)oh9;T<(;lm~da8sgTaWl)>*m+`mNK5^07!!lVs%MJgXlm``vlW*+`lE?jabC9T~IRr5Uc)*H@H~$^@uDtq(1*S%gK&bK*dk<_?S(T!(FY__E^4j zx~@H^bBQHDBK_&Ybk5g@39io=T>J0Hlep&h&&0x24U8uxgRjQDuB>>PX4*@tqUz)t z?j6I@0H0;=5^2obWAT;Ue@2EBQ+$e8UhVtX%C`V4z(X*PiCh}}akr8c$uoY43H&qF zY2do9-}tTieA#exN^3^g&N`&)AJ*vpAF11T_x!CGFg)4L=FolxtdDVAbaYwDdgwiqdmy4` zYr4T+En1s!Ni6#W5yg}&WWdb}t&T-zBXpg+{_b$5i;2rOiiSdq0`6w*i#>_@)igBt zbEPe#1iWr8l1-)K@HAgWo%08?{>5u-?@@+>F=Insh9J%t1O*dgdht}m%-CokOJ(em zHPsmJn0~qbM}B$lYXMsUJ@Iloh`4ZHl-RC}D=mwRE47)m-h7@~!%NKJ~Pp`Q?knff`YHlhJSJ zt9L~4T(u_JBz9vt-mE4JcDrvF?|trtTH5;hXlKgmVNrcEs4}H4X|`W<;=OpW+=#Bg z54rNIEN9;3R_$QE!KOb`nxqwRY=oB;?Q81F>T9-;oh7bX9aW4`(1H0wwj>=ZR(fGb zicfj3NuQ}9AML|~RhxW)RWh8gZ$ZCC!Wl}|Wx7*f<&6r5d)Mvi&}O6{G3NLlJ`*fz z+D$F4o}Z5w+Yk4hgI361v5_TN`6ANxB%OZsmSfJvW_P%Z+kH_lcQX2JmUmtVqXOgzRBUcOzc4UOzLrCn6T&6%&4Bv_Uxymy!oOh zZR1^de2BfNoU^8cz}QHY9yzph?|qzH;oPcEXhwmKFa-tgl^KZ!;QbpMqQc4}3{8K@ zpg`N87X39k$(>&;(OGlxiuI#Ri#-FN;FQd?_@&1$-nm~nblYDXVV?M@MG_O`sy|LN z?=oK?qa8y;ExVeveI8G`p}5Al4wZr(3f@$#EWb9bw}DLuC_pGO4zCsPh=*MAtFgfu zVL2T*6ojZLjL$=$PTJj@64GVyPqEQ`B1E^yx~AQd48QGIA4;U2`akUC1OawXDsCVv zF^#ftM#8~6#f5UlZa?uT{m=5t9&y4#r#^&8!7E!ulK{p7_eMt_WyD5&7U#ybPa!hl zbA$@RNJWky_VnTWX8YXR=@4_pl|R1oatyD}_#I{l`VOYYr1y$++kys<8AiWS%9C*1TPQg z`?uYt#;_ireK*y);iJ6wFR^Dv0L1~Ghnv&SG~V%)QT?vp*xY7mZOa6Vo?F|>4(%6w_3ry8kKhw*Vc*exKH zOB?8K4JmCy!h8J3s675*cC851Q$Z!1{xaoyrYNFPp>U8emelQm-L0^u-)#bGLN1_* zV#d+v4B>xzMt-Udv7`$ugWUBf-@`NWu}^bU3D(m-z5a%dHb|HguHXDxOXsoDmOmXK zFyRt>K~E8>@~?6&WA%N6J#NYH6cseK=_-nPmFi_?SKMrUmePK^54~f#cL{Lk_C! zznAuq?%6m zS)|WYUzD$(@ID`%9hBX^O9FaYjlKZUm6topx?H!zkb;46A_q->Uj?AXL|o(qc(E>p zlHGxcN8K}{KQEb{A>`DVMoA_C92&(gxE@jrwu)P<$;aqZo7&BSSn>g%w@pOP<6e;_ zmqB8t_7Hv4j`^E+oNh7%=lAcw;?4N{l!g!8=>BKDQNI{$|2Cp!MG<3uC8UGST=EFg z+hm4v4^y1oU@;rafBA#0F+9b2WN)FCz=bB)#rfqMK=+nn_8jn5xeVqP&iLeto~ANb z5~x6^e)s{`R%UF< zIO}`xoi=^iSD@JiW(PqeN0`%11LX1J1Wb{5>cq4~KXdw&Dw4@EYpha@fq1o%%eSvY zi&(G71ksX`z1~EC({04hf#$9nOS@vto_hd10Pc0>mS{999aVAdtp3`GtLX%sv`Q1d ziuA36OXL9^qi_vPfGOi_vgt8-!L>p zxm6lCIxNC#mW%jGC{oddAp^WLuRu4}n7@^??j>P8+p1)@z>M7)b&(QQL2<+L$K1z7 zt1fiU<4Vo;(for9P2pzEOKxU!&apbb%g++*sDQ~%+}D$aAINJ_yi+6$8p;;ctug;r zi>bxA%8?EAQ(qsf45Yg(bR~k}d{0e@eOM0H9{(;lL=MuQ+k-CM&*2fo;zO|z8J9QQ zG(ZeIxAs-MRxE#8sa=@hu)!3=FJOa=|A(N0gu!IVY;PPZ68hj5j0yZwO-@&8>WKc1 zfV3`73iXUmb7q(5H)Hz+z09*Aqd}CTrm4XvA`b*J>q65e`^LZiW*(mh0;&SDGQQMb zvuIt_`WMw6HQlPqg^{7>N6eW%cLlA8r{y?zrngD<99BZ#7*5GvW0`WPW1Zj-vmzdGt3Q z)dz8Xv+WZqYms7OAu;~MW~kTV@#JEsx{Kn7z1z_ZAT9m70c_LO7x*bn?(j3Y=J!kd zI6j!Y4W57KTb@{2`rNa3p*?c*7)fg$(f12I8v7TD<#pMi=_Par@4uy@<%P~a_y^EU zAqSW;$!kYVAYaTl3!hmD0%8OmOym%I=@_O*Mn?2VY;8Z(32w(fYUz!gQZzQ0X)yw_*l(?Pd;$)4a-|a7`6p)n#KiXPFfY zpFmYx^ibQhFSg)H*WJt=M-u93C+1DZ=|DDY@K00}d=eeEVI7%)&^O#SiL91fC&(YFShTt2PMtWW)se{&RiPsdb`< z$PjPn_UAn_7KRTy=%$5k1=*sezv}l4u6U#Kf%MSFFkPV4!k=|=yhSE9YmE>zfS)rD z+e(RI@SZ>5x%AlV?#42m921cm6bGPfW2WS@-MFB`Ml821JJYJbyBoYWA@)^}KPss# z`#R9tr*xZD{>f2NgZp86B|jEEonIGthJ$Tu`;P9f@`yFt>;8otZEey77GT9DpIq2z z3*a3)S>A*?kqG%F@!pTx3rn?@ZnrR@okdA|GB8v)Zs5kP#9Tn^4aiq@jxqv77I<=Z z4d{H?m@bn^S3<1%(nLJlzO8#w4f2UqteN~J3T9NyBwXsrI@O>sqHkVD6v2-6UzWEx zO-+&d)95m{Z8-Dl+@V9F8qM}3O;6GY%t>2n%IIweA0_ac#B7 zt{MVzn?%5xfa8IUtnAdIp?MVi_jfYl__IJq3fcAwaZxGjL?Evcj-KiHLZzXh_&^OtI`^jp3ZS1F zNy!j~gT7Cr?WmJH(Ss78QO7sWC9x=HNdN~Hj9l&ZiT<89vqVh4kb3kafX&ezVl0`xek=E79!J^ zX!~$TgaK*K0pg>QTR;o`yFXJz9*2@MhTZVg^XOL9(?rTCyq!A5IE8i*6Rd^tRTJXF zYkMR&I0tgJ2bO-dtEfS8#617<{!sYUznLLX((cPkmXS-Y`=s?w5zRov=y(v6v2M=| zUy&M{M>C6hWXd>0lnA}yTTBS15$}e>I0W_XdwEb;Z6_Q^1o6@1UBr9(v=F+|HPtyh3sZF^pe*8JJuPYC=b~(;xkIy6GrFX_0Qm_Q8T9~hx zMnu8>7CJZ+sA|)OUAJ?)z(ZgkCsl(4ye`ehif2|CE5H+~Yvq_!b`Bp?sCNS1ln-aX zm9pzpZSSX3*xcrtsNz4y$YxYQcYf;Ps?oI~8=$waT?Gv{Fj&eSYR|!erkm-PNMpI~ zR6;<9TN?RsxERpl1K)a9>e@laxG55m72IeI+n2E(&yIN4pbf5)=!;~ik9+El!~woCQTTxJzjES%gwnG$a%6sD2M5R&mbT-%1=e@f?6h z|ECJH9*N!L%0@bS*QDO?NTU zaBb}iZohVW5$4u)F(DEupYgY; z>{K@<{$wTzvqbza6`^)>u4xq6*8qb3vLlNWYD&|px^nS&Iar4}iD7D;9K0ueIL_AX zX#Qtv8ie1!%uSL6G15ITrfxyH&|Idqc&9m!(#?{YSVdD*6(FIm0qZsxTkpsjRKJLNbQ!{xSwIfq6tD z`yaKQ=a91=`ZC~!7V7ubluS?Q+iEp(j&;%jgk}tWKhzwDK@}LTq6yixTYgMDi}wI@ zY6>v0IzJuN1wao5sDN@`->n+1<4V8&N~AX|0T4eT8nF-{M+;g|e{CV6XVEF+v z^k+~P@fwOAHT}Y&^y>boW=8C+Q+9sTwZ?`9&mx&SOL$t*H${+mp+V-6Hw9ASLvtZf z`SzdTqeW0+Aq60g{Nqv4_-$v6?--tRIt;(TLg$&^t(Sc_&IOzDCo!za} z-)}TAgrL|Hp?*N3zgAOUpB7Qz4cbo*%7*0;Of1`1foH*SJH~cQm$p7$zE#}5cH5%E zBcAGZkx~8DeHIm`X_owsk<@w5PG7&g<)eSnTGy7?k-oEeXYt7QY3DcRniG$m!P9qe zhL5-8Jj&~r?O|VUAvk~Z(XUFNC6E*y*|&M0;uy~Z4X4)I&te(3Y(J(Z4BsW5?}7`n zM&`kCs1zN?lH=iTu!rH|Rtn_k z!qDa`MLPPNPE>pXnA{|!VWf=kz7V4uk)iE&OGnpVO|k5t5mONNT3vLeh0o5M3ZkU} zaBkeL%5>yV6wN$5W9LS_ zJ9o6OX+A5{527@GoW(!;xYcGSwxBj{ef$`&s{Veln)V^WCwNoA12*#RZdl+*RBxv@ zz;Nkl3TQ!P<$SR0N=~1$#8o1Bk5!VXg6mK>XAJpej5kd;wH^z8HeDB#Xh`497BTj# zu^hhk7AJwO1zE^fq>4k4h{go@E~M(@fDgyCQ8VglTPecg@HZl_-vNbkx)r7ZPLl=o zHUm-@AEs>WP4QEYbS$gaXh%h+nM=BW`8H>Ooo&xNdqyL*-}W#Zl%V$%DdX~Ci}e_9~dN3;_0yjZfAPZ8G9y8v_+>obzi zKgB#$GPjD!i}7I?-Hn)W4N!d7A_badUBI|N;;zzFLIoT*t&-fo3L?LCE4r`&{^g$J(CppSDECZ?*7 z0jqO2nU<|@JhVewUZ@G(>V+_TX9rP(k3sVN)cmUJZIh%LtS z<}SBb9W8Pd(gU9n)Z4T{gDs1>r!xo_P-0nYNz4)|S>D_9e!uoM?(?5tt_ceu#8ngM zh5t+Eq%SK&FXwT;y+CO{`-BsDdvFk=_+tJ6kC>k(2wL^`1Mv{R(ZxI3;%+BbMHhoP z?Df~NOZpN#jev}ItbmH>Nz8S=SnyYqsokBuy--G}Zh9H3zZmf533(|ORkytAtJdm7 z!F}E9t8U%QJ}1zKK_`=1M9XGf&}Auh$`7^@_hrb=7I}^IFGUl3Y z!FUxE;<00@!9s`mye`SU@W@R9%drstO_Ka7)}J0LZC*Zm=f&j}>`wntuP#Lkd6J@fvvgzN54NP6(% z{$g?A=f{Y51pn2Ac!v$7li5sU^MaB%zzX3kMlX6$DU?OP;&kUueD40g(xmt?-6GE( z^xzJ_hRz76oHJ+!lRFp(?&+pSK;;AbM4|@?+-TM-#|d8daPjgSwD(G^jVoxGue)*A z%+@4WBQ8^FC>XBge4h-)7#c)v5^6ygCT~(gth}^elWeII0&Hsj8e1H0^_RFLZ#Nz3 z;F)jsq)M)Oz%JF|r>3YGw3mB|vEHx1BuXyAT`S~v#HsyTb9{w-A{s@!x{7VDcIrww zx%;O`wsV0?sXx`>+}$&GScFRt@5y%{AEAxHa9>(@%`~O4L_G2m#W>S2bJdl#5t<2~ zI!jDVhZrtv3kB<~0a+oJnNHSh>skjVEmK>M@l_L(lzXs-d|yk$;Px+D_P*bbQ1rOh zKR-|&at8g|ZwPx{^ZU4g^v3uz{T?;V6{-cb8DURaBD@tHpAI~aa4x+~}q za|t-tZDZ~E6Tr_)^5bZOW~?(wUU>ogx_R^EOAc;|b;n=aZw|O}bhm%G{&c8TZ!hzr z_auw79j~;(O~Q+n@TEI5U=HI|&W9-)jA5dJ4>;wfEi+3?Y`N9#T14(#xnJ1pcV3%K ziPuFqDyUIfIwh|+6)LoU2w1mp36;N8zWBYLtwI(2wkHi2Wy2#de8m17QdZbmDFW_E zkonfpv4YgIOf(>Q7*>t`{4K1pjooP-PJi3Y>Iwdw2RDC^SzjgfL8R=y)ai#!`>7G^}MlJz)b#F7;;(h16(0r z*a8umgq_( z%aVLj9_+hy9<&|+yPnZ1MoR$jY&umFR;t~k|8x=E`HVcb!1|AUNZD*eG+UitPzTTtcQa$s3yBiY z0&L0YRB4xxaybDHD{CdfYyQdMDxGBOOH(KZIGI}ErsNL_&5HO3pi!^QgCej(H1CbL z>!4dK_=`!AD}ccjt_2|P&BA_43LP(<8SBty>IB}ib9-s3k6fwqDmS%6su|&&7j-o= z(j7E!*Z_SRILAVu^7PQxB0|-JW9x43xU3z`Sh4x$8n6R>#(*_TUS)aLneHEiQOVuX zK`U>E?@Q-O@H=HKa+U*T-sWsmp_MxfbHr*Ea=*lWJIq?1HQY*r+v8_vD^}1}TrFP@ z@*QoAqgPSg@ac#yo&;PIE`;l~y3-9F$d3}9dwKg;AzXeN;ww}v=6!0bP~$vD6Ior3 z#LedJ17BL@ZPb#vJRUqsYd+dvO3IF8B*g7Z&g)d%kl4WeZod$aAX3 zK$kLy{XW)homur_UQv-2niCo$u>}{AOtTCW66cyp`dv6aO;?6B4rU>|n^OP|8_H$OcKDI=${mlb) zJLjrVg%hwpsKHOB#*=sNxxrVJgr16J7ewUD)eN#-Er(*+`Eyj@u z;VLAZ7ahsg4eX9^vY+;Dl72fW2HQ{0<}NlFGX8bWFNoN)0eahSnbV#7A$VQrTFT*T zN!g%ox^Sebaq=roE)zMF>)+OV{%-1xO|J ze(9ni4=vYqkUNf|vvD`b>qV}sN$P_QUHa;t+$Oa1`4$y6|1RR?B>w$?32GeaPF0ZS zA$sdq1YQf@kWQYm#w7{u-SeHHB!y3VL`m3GP1BX<`zGUY=LSS2|p zu)Gr|O5D^5$}KrV4lhvth`2_BMB7^>zcN};OV$!b$}G+rUbk44f1-z7m@Ft=PA}~l zS#WSuWAfLOs2wet6dgO_(g$20MB9uXsx)Yc>OI%&*lU!5j ze+U@78wq_fz<<&;m@SkNUH#<;%bIKogziZE+Ok{Nzw4*s@Xv0(3RZMLKog$iUMj?I zP5AU-e^OfyYjC+&RUEAQJEO)>P3hTcI$Si4b-0{AE@ntBJ$odj@YvdQOs~>#td`m| zNk~F^M$S>SW>d9Ii1_PwGh0roSFF&)@BKJEAZiSYyIka5p7$f>fNIFLy-3i`e?v$b^DT& zsm6L&eo=nGHy5jKnhUMt24^#@s)`YceYzhn$+n2oRJ&ynLMLpVN5kr$f40`%tj+(P z2bS@~ZMp!lm4{6@B(c_hsC-sLH&zeSaIA_*ay>3Cw2)iwVbxcmM&Px?96oNBM9k)$ zUxsMDBF`*46wU(9{5EpNx2V__ayq-~;jSyK(Jc{-Xd}8|(HbQEs*2*_8;R^SbKI8o z4D)m>P&nal z7Pmr+#2PkoX8PQ-fvM(Pza-F|BwCr8zw7?6!WzFhl}Bv#@B%g!f=G^}jrHUs8#cuS z{d*??Mv~N>yFG>vthBL9mjNdxuwRPDoyYtDan>H<O}ll!IW?HInVdj zGN8zzRz@D4on)QW{3IBqg2<}>HakD?`f?}#2bxQ)FyI=-;>>d%+}=1*J|Z+EwQet-i2>>(%J)JJgsN#jgPW{ zpA(N9?t7!K1uuRVk=_Zff|(~Uz=)l6$I>fV^h$0qrQBNa=uIF29 zvVRu9Q=D?*PRcZ(fVx?t&o3hig{NpGt<0N0C(Nd7@qUlS({p3KmF0M@fbYu;o^(lT(A^d^=5V{ z-DR)$(_x|w*1v280#tsfQg&}cVCTgPGA3(@aa z-{t4K6#dqD^&X5xzESwSq*dj6jsFhE6)}24vM7IgcxItrEeP@md4x=f4^7;@3RVQT zlm+7LlZ-O+ejrVFen)X!R2J+`ij#w^-ngF`FrUQx2QWm(HIFA%@PmaY$T<{1Grm2fOYhl z9xZhmWd`3@uX+_|s47ZiNPlkXihR{i?$UNxLzVg5w{rL9s+~v#qW#Jx;P|dq<<(7C z6%S0FgEL-zWly(euWzg{>~X&B_)k3%GsbWysWY1bP{g8?M%QL4TI~ zN~K^_RrQoAe*fVdLVd7VHeT1l4(lNi<1=lKqEB%9`0o-^*zdTB-Na{#s49O} zY@ZZ#ziFpP3sQ5&JG0@3#!)8UhU=Fu#Ie_XzU4!-pzUTX8hp}24Xvhw-hk#a6{tzP zHtu~Me9eUp%g-K<+0IM_T03cKbw}Z6snELnr1X&@ro&y&*C2a45(L0(m zy8;WOcs4Z{K?HDWFf}$)2!&w~Ax1WByvhpe`B53p+>=scV!Ob!UQh0UWF4GWIT()J z6AlUDT6I$ElMr3Y$^O%;W56%No$R__S29$2F^CT!8d!Kr2tH|ZPowhnAH^y0Fn62# z6=BzBzS-`6?`D{rHw3a`r zJ(PoOQ(V~Bv!Kfr$R7qDNETa$8ylU-bEO!ihe%dJ8|yb>`3T4}%enaj@yImv+ykn> z?D8|64Q?@9(a46|gmjG2=*$Hr`q#2^<*=T?1_US)S<&3vScsI&K#HZHl@SzB_x|5q zY&A0ty1pon+`L%m(TsVxTumqZV_0Fvu`?k5{Lp=IDo%kK2l3E*ou1f!DE4n``z>t+ zkRbUdHl6}w7reHcEsTYnPVZKeeFLIC53@v+)iN>+L;(V^L-5xJKVb#YxJuWBKhSF6 zFo-4-&&{J%>KJQ!&>9>J>RJYr>^`GiHAhS^9h}QNIb%D;O}p9;eL~@Hd;J$$`|qv0 zc+DqgFnLB@35vu(6rW`}{QO=$oBFW&P`DD2`qjoxh$B|F=5E7g{ zJksUI1LjDSz7gSQb!S4en&We|mAOAzP?uDIjac>#m@e4P%lQA?H7Lab%Qj>N`tkTP;U!Bd?!&_ktu7c~zb z6pcqR=O%gUQkc%s>`2OgZJjJiMFk53(3|2E3bbcvdjFUlT01shX}|55G@_~ig#ot;yN&;Hkyf1zM5^XpcJK58AW$pXC36}6o-)Q+nC zH_5^mTYH*$W9c8fiuTAIRRHXwCvxpbUWpM2_yAiiYV--WOLdG$M)$1@!xm1ma+p64 zi336n?flF&a6%~@sB1p~KV1xp3`Jvjei;=C%E1mYF6)C!vyldB11rcPiX4`NQoN2- zlnWchB%L)p1a&trK`$*9$h$`Hu8Lnib*10-L^4*!y=ZiK59HSNxUWp2uesFe&5fCs z_cC*&A9@j!PD_6nck)*AMjoWarWJ(+$Flp7LuTsh&*Z9~+p-LRO-6k$q;}8^kt|?W zTh{b3{LxL{jy$`ld_gJOvf5EM4d?Mn@73bo7|yvk5^~KLX|K zaqkSsLhdSbFYq*3&^Dks4tb0Z5%j*r)W*#TV*f*e&nAyyvJ#%kgJndZ)46HIl0gui9Q zT(WUYr3RWA1m`30pGiJnCBfU2z}TD+14gPsD7N*lW#y&st}QrT>9w@!w^rKYOY@`L zX>+K#d^D$~sa7m7173#^Ved@>DW86D1pjQJeK2GTN{GN1InN#;JqVPM`rgpbmkx8a z7!V-(`a8HxBP)M7$)P%6Flt z?Mif1-pC)2g+1TOmw6qv_-iLuvuAPj?_^&mBSUU@9SmL*7#wjqD%maTMi>J}2f=e4 zl7xDVFGd` zY-G4z4*|vi?s-2=dMA7f^;!Ymmc8lv7{63gB(m^yPHx$Q1%OthZxoyIN1g_*hjgC|Pk9#K z`(+YxM>fUb_d|Z4+-p)@#poi-FM@Wqb@9|BTc%6hoVJXI#s?GGR!+Xny!s{d#1PSq>V_oh0ZjbpX_{I#Y&htj}b?u z8skp=B)p-SGAm@9$#(6gijz~QhXqDE_rwWK*Z=+}uu-Hc#X7qGI^jX)?RsC&8sf)V z{=X}XR79DSTFCX9M`r-T@rh*iM=6d6+RxVughBDd>o0N`0qG+9c4Q>GrKrV1(%ga0 z8(-sEb~JmCs-91N%5>sgvjQe|=r{IShdx(>H~=U9S{meAgiElO;dYd_Qc%xZE$e_v z9Y(9G<>w1?4VamenhHMoM(N7Sk?g}=>N5@QPajw39#xhaR|TC_9U*#~_1~?QM98$- zf}01C+KfK~VpQ_Y9;UxcpDun-DY5n+rBoPt<+nI?#GlWlt*!4Pd2_oEqvb z5(|%aX)8r~&^jgy)8{&vAkX##6=>t0Smkvmoc;8#i^0k1Dw)_2hG!SS zF!bapchwXj5Onbw{P~wZv?dD4%+rj1*p`e4vBtxv-a!MmAujb4u%~PK8XMwjkGGC* zRwtCuS6;rS9s?G)Q&%fJk19F$JhrhwgEk(wEw`qOYGQ#nK|+%z(BVq0KPwGW+`k($ zF}ucIQ^_CjX0zs57perLo5Hg9*O1vQ`)9}>J+iXUy`FRBWmMuBL9b0#(8BBkzT7u^ zB`G5uNsLv}(tgL3pYd%x3}YBPB^0a#q3igtZQi3WS-Mw$*qKB@i5MwdIrv8wd(j(t zSGK(x%N+CAi>ZcB4x>+^PSSuZi5Q)DQGBj9QSWKa>w@Ol z*MD~3uG@z>lv0_bXcuE|$5HGUOT`I&oo-~=Mpuu#d_w8BaO3fFa(eYe1t(gxJ24f6 zNO$`K= z_HO_)hpv0~zl}|m;xxi!pS;SO_7#8qlARVob%pCofZc0H`x~rjBawiMT>uP)1z?+u zsu5{0H1mr991JZgp4PmCzlZPBE5W!RcKweLeX;ZszfQ**jZf*R^0z)5Kb&92}rzbx~EI49k zVEpsNW3sXeDTE?bW*jyE_7;tJU0Q)Tk+6C=Ps)s5e;=NR9%5~Ixg_={Q4*uCCs>Jv zWrUo#f(iY_%)N8H?koWvMf(;(w}bYF^W>ne*!0i7!n7=4qMN(!SxiN3477~cn#;JeVc}6V z6PvmnuO<7Z9}c>5LJve5C)Za0JJ2}%= z5sqD-p3<2w{h6SVs0RYPZ%1zMpx8y8oz+>wD321J*AVS@mG8fLx$AN0VBx>`y3Idd zD%=%(^s~+`RmuI`Co01xH(53#jZ2apIZ4BV=Lv=zaaXO+up9V-^brccQ<{$1%>~m{ zzo2a9!kD*0;sRa;!7xdBeYP04oR&|2iuBVUW2RuOam^UyUTf^T?K`e5)<2F*_!_0#UA!AOW%?LySQS>C0?`z-)$5CZ@>-P65jIaL@%z@Lr3{C6dG z>#uc=$M1)mM!6VI;Iwag-W}_aM^s5FYiY!0ss-*EOzW?mLk%eC`0CJm@bSCmoKmSr{+y z!+#t~_Rn)`mwb+f69$1oB2?D}r{SE~;N1qEnVDRK0~RxeMhSM{#hRey1I94_G87QX zy#C^|0{$_xG949I+4OmkfHocHDEu`s)+anlfiy!Eg4EV0wW@y#eu)ej0t<=4UIVH0 ztctwklmOmKfD04D%azD@Y}+9v_5m6Ux)7Z~n-|{dd-0MS z+I6foWXqL!#zQh!i-dVJQ5FYSr96$#ks^0{Po$e>T%O=J7QJnYYF0A2_{eHk@XI&8 z_3g;Gy|)c@HXSSlJd|uYY;Ulyr7`jCL)(^M{gX4N?oElomphV@_U~Gd_91^>1sdjaL9JSi zA#0$=^%@i>7iPdkw58r-oGz-tjW;pp34^uZG^tiP(CRyo#PK_jcUnnLGg|S`&-kjC z1|uKN3hVhJ&;;@awe5rH0X{c0Jr~9QVy`diGPmf29xN2%f1^H_o{P#O2pY4(13-i9 zfmSdvM-UPtC19FLE|^UPQ$_?B;A`H%icjHS%1iMu^dgLvgJP@~GfMYHkiGX4*;BoJ zcII?ex^I@nR-&VZ8LZZSN>b}zotS=>+)h8-jC|*&4?`VZJB6;=u99e_@b;Tw^Q0|#d;5YZL+&i(cPG5dWhkjWypSFPG+-j=&YI8G5bQ#C->uP!FX1v4{X)k z@KBq&`Km>g&bR`cA}Fshnwawv3!kXmFG+~~36>p2u~>`bs8!+%Xuk*ap&&GGQ|PS< z#L@fjCtv3djQtJYNch=@v$Y?OU6ocB-uvh4H!9;jl(z0-DweM;B&cq-15+UF^oZOj zx9~S^Xj)#Sv4eN^C{EguhYd^gQnAtPRL6hnOB>YoZUqfkKiRN1M7~Bom zzvH+UIFP8F$Z29>kYe5Sx6xXDxb!BnN(VO14$ZRc0W)5tW{q+*%9dxYALDbg)UqAj zs+xN}kPYQY*-K~Z?2X-1pPZi9P3?_c@V%s?8@55mJ#DCO?dp&<6hiXE*A_ndbbsvGt-roP%Boc3|Om^49nAr?BJxphYA- zvMKlV1!?%(sPol06?GY7|1)4O6R$fU%|=be>R4i1QEn(X-JRlBWsdIT8jBU9PdZd% zN3+`EGCC@j`6MJMP&G_PI{ZBS9HOwgM1YMH@hJhmug3JbR(^5zzxdK(8L{&jLSz;BD$t(~bb-Eh_f`OX4y!-En_VfD#>o zmePD|S#Y3agF&bSR%et{<^FgRdr(Q`j+lLhhy3ac7&>J^b3fWS_+|W`VYn|LxbEUy ztN_`L=K(Nxb$h936u1}?-nEB*7{p^xz(hU3(|hX4RDrg-z5Yoex7PQ*xj&^E3DP$3 zVoD~NgxSXsX($UUTt5_08N$C`+8EG*N+CDn zQ}_lyaHq+BS}xUr8Tk9`X%ulIPqDWYa=fbG=xGn*H;$?I9aO#F(Ge<1hOj7RtSMa` z-BS)`S;w_}agapp9d9&h|KEf{>*b9^7qLhtp+$oPiZv8{9p z@Y#YHKm%xpCoeS-tC*Ua{`^eWu;(RI-`6@0;BC~M_^(r^5-@`}``fXQ`DwoakdYyY z+DeZc7I`Le_0wIdf~Dq%4RbI5uZG-5ZQpx)5cLNjR&g$C6%F?umB2(MK+d3+m8s2N z3_DiJ$B{&q>DL=}2J@gA^-ZlyHe$AhUln@d ze)4Uky;RY%44kk8;;5V;8}0LYZ;L(+z)AI$^sa1JD`6VK)z4mxRbJcYia%z+^I-ka zFqOGjE$?eoIeVF91>RkFzx?vU5zt>2zB%;f=W}aI-A@B1RH}3ma|*?-zc4vq0+ZWp z{;)0{@x9Qe_YJdsvM-Au4V%?+LuEqJVXxTz?@UvERfg^evF|8Bzp~4U3~!lSrttW@ z)zBwq*`bcbQt_Am5YCQX$n`JS7K`?KnCD^*yxz71KdW)cNy_EaFGQ~OAT?)}QFlLL z+`ygZ!YTGxN{|{!k5tgrxTN~H6ndY&OT+SEd7=Mpv+|?M+}hIJcbK13QE?&2IZ$#O z(A?6JIulRs_|(tn9boI^$B&mgU;=3WME|5}Kr70cij$6_>amyDe_z<4D3Lp|Kcyv8 zzP8C42Qp~P+c8geAwVH?7IB-n?t4K{Zn5@;PyBD2hvJZ?VM98JU!Krh1LV2}MSgO2 zHlxZzgsxn3g6!fR%+n(cJ>erQn30L`zF4x@o^77pZVZ^yQT>c6>cLh8L3(*i98v+j z(}~#R0CKM9KLt06gVG*q7aiva0sVvpc3QwI5$K+c*_1{U*jm`EASLBGDGwt2{ za%b=&k++DKNOrZ9d@6<7dU~w;PBbnkwMUnbM0gRexd2YwMiN)Ye`%cpNnM~tj0DOo zeKSslI^$&=f11ukuAz}S&i5lns2+G~&9A;b;LpoDr;wmRywr(SO2;y#&jAG49*aJ= z7n`jyw>x@FZk0_AtDKmD5iM!tkuAC7>pk_JxBj86tGl_HdenHa0sw{f&xZ|B7mec} znb&?wgJ0w5MLKfK2wz-B@Uk0|#yN$9Wu=ysz4xy+EYZ=PI|q+iD~?&8U}$(r1R?&w zhahaucUX{a@THl-8xoLXWTu2D{)#WtsHq;_m4CiWa1pQ;*s#PLksXPsG>tTzF#JgI z`OHnxt26>C{@74?Qf!8+7VoGH#P6l}m`Y9rtOZ@D(81l8X3|%Z4n>@fKHz6>)n03* ze+x0t&6{MQJtn8$ESp#ro4KtEV1trlV@i8u^O}9s4UCq-VlXGGo8_*5?)`~nBU#FA zT>kD@ZMar&Pjp;TqoYN|aExm8`E+>dX)!q!Au&8HHQ^~apQI2z)s^8S@dH*01P)3s z?5s*!)jjRep|9dzQJ^V6M%VzQzimI~-4t_vyR(-6Ue&QuR2YU18111H!mxZoFj~@< z?_$1fls5bL>o~ie5GI*ym73N+W&4tubQjKhrAHN^V8VWA(lHevM!dkoad8~Z9kKnZ z6Rq}NKE~4AcL1`!3ZOtq|8a^bDMwVJl&`Lo@WEibq$sOh-vc{q3X`#e0N` z{>QFC?Qa*NIkV~|6(0gigAB*!*v;q2_RZXhvP?Kd$8+>$NdA2A8qudO!$@?xi}A)4 zc0H;!1_}4vS^&@(yO^IQGrH&OpRDg@C7EndW7gHEEmuZ<1gTCcoV=IK(vFm?o7}=q zWf-GQStUITPA@nPz4!FLdp1EDLr#o%^)~M__v3z@xsC{EcG+ z#TIPV_3BQRVw4C=CQ?`Xi79W4BpVIvI|i|AA_UcaY~GVKZnc9xzX4X2BlrALo)>7N z4v=um7+!8Rv`E~mPqZFqXe5in*%0wBev+C8$X2Xy>G+K6OXhc#bOPr1b4mjxARb6= zL1*Ql`*M?WW)HKhc(?z*!LL=R(+MGg!I}wuX1Rx?SPaPdJ?JEyNu(>52l1NGtBFU+ z0Cgd6o!g-QctaQzh}@!w=0B$a-q`2u3`6eG(1Q!*6H!K&>yeR7s=6YnVh{Yr1n{8U?go+i#T-cz18~d%l?CEtA_YN(~!~ zfW&fQO^tC+@(OfrQt4#ByU-lVGOeK4N@ivt*|y8I+vc_!Y~C5f7~1CUe@95y;@0My z&a+cuDl^*KV_9CFtk=(VZg(mD`GDp&fB^&rt{KxodY?zEfp2k&KjHT{8P4-xD&j`8fvS)$Yk9ch zExHPj6mo_GS5p?GOR(?98@xF>`8_z8>{pHtHnsp1JHF}XU)gTmbI#p^L9Mu}huNb{ zK)Hl_>jE;HPbFcM29&b-emJ^tnpl@m;M(x9ymKkceZ|_c$n)bLgZiQ!v*ER0+vvk4 zr#3eqiJL0#webr>c~n^;5*g``f=+QwM@GzWPCJV9Ir7n{#ym-Qf!KoQ++V4x79uYR zhj;=n()BXl@-Cl)%>!)&Vm^-9<#*4tFFu)Xv0mkWMkCNJB;1*sj79e%Hc4pODsth{ z`xyljsq7^Ba1Q@~edU3P#0A*L$z(F1tHt>>V zI*95>hfOT6w+#pF9uG_A8rWs=+7`c~Y^*KQ#NT2D)?9EOusz4A#}#(9`~3Z(CEv=zCPD;9@7&A~}dJ0GBuI&WK+Bg2(jq7#NJt72N(qQGNUM~9bP58}-LasAG)U)4OCu?{ zh?I0M-AgUGunX+6`}tkZ_r2bKVXm3E=RRl7nV3rkcb1!~pyCzvtmh*wHHrbPat>9;_B4tY&2ffNFN2BQqY=^2sN zD_eVZ1@Z3BLBD#lv_j7agR}15q0-aMM_)f9iMspEC6Z6%2gl$0@A-rIw58`k-#EN~ z{a_)e)|gQt>0^437-n?ngb3@A2};N>*s2M0BOG94W_q9SF2Y60)U9RuV%Pp5M4WJC zdA*pg)AVFsbsT-Rk$f^Hw;%DE_2z3Qb(7!QN=NPIvFXuHBE!l0?|<~_o7X%{yHO$; zw0jyCb_3Xc8oVP*JJsmEkL>c<=FWe*{V3Y3D>S6+){-0+ zO!!)o?#1vP`a~-g@{YXZ)g8CF#!5Z1$rhKXBhFN?A$F??-Tlhtd{L~7TlI-s`tq>! z1=T^v;q2C*6bGjZR>x*p9RYjC(P=^?k;`%{>^lvU9PLf!ZGaGEM%GN@j6c5>p?{`6 zzT!MygK#eI#Fxr5WuhGq_p=+!lvvH2B5Nd0)b$uc3g1HsjTZaGn5|XMQ zsrMgRojdX)8?2t#+k{_*o*=_79_)>L>Du=s3RUnvzW;n6_6|q>U5Gu&o;|PwxuwDE zt67%qLBNR_;R|=%FO~r=O}8~2kOK#-*7?n&-k=^s3K^|Dr!OaT^#j2sS2Znu3BfFZ zH=S-@tSC6>!=(fwpG1qN<;R>SHv1pzCbx$n7DpNUF1m7`gf-@m?wnv!wRimaDfmsx zH#r&ZxjHld7K!8WsGeRP)P_8Sl{3Fr`;BO8g?A(dujV1KOLNZ|%x!v*pD(h@7alsm z*Zg)izXhfj2Ea#rEKNs8;vBvY@cQi7BBsA*#wCOC1Omd-%QD=L9+cVV96~y(a$43wa>(pzCTax9WNs z`me9luxI}mdi3<2JAG~DS@cKZjbF3nX^oA?ALGS64t-K&?>T>aDM-NJ;QrEWP=n6Z zLb~bBd0cclYISw>$QH`BMNdj08gxsK!U*+NY2e6YRw}MrT>SaUT?{tD4VZ6IsYg8>E6o7YLq95hHXF{}{7%I~ z5DW-~<`iHqA!W9O|2f(0ryE-6=VFD&a!Gnn0-N8Laor)RCfwGPtF0Hn-yCxGYq^Q) zY;(~lFvGhWj$vSXCHhF=f5iTqhg_Yfw$x>;69o{zOii6zNwC%kSmd51zVA(sYS_hH z5%9`h%{^=Dzly~eeXj7 z5)qknMJaJ=a|XE0hOZB|+)a17g{l5!$lZ ziS?BZHeQ^r(*bnpKOPml4V?(@l(jfbGZwoNeTF3*LP2YZ+N8luA3TT zx?+>n64?_zy(>Pli=AIS052RO-b)!|S%Q|5mHiiFxo|o190<9Q(P$q<3Ox^%SaMq` zAn)V(dB)v#3d8{{CUjdq0QkZUKNjYJNeel)ilM-5i3Y=DhNr})lRs0NO{j)p|DZDZ z!Ux~U19JQA;81O(^IE{~P?AJfW6@APkHFZ!Q<+Zh=kM+n+_x_PIvPFrlhEiZ2d@rhFNbu}G8Brh z@uk{Lz`_G}d+bW=g3O_4&(D^!8<+YwMoyIax37a18n8=?8O?73LJsH||Mse@QL_=5wS2c#mNg+rzs8>qy!uy4waFHcL^nKzdT(uT7T2n_meZp_B-&rF45OqS<65R z&ywyI;9p?(OVi9kFysC$#nt}|5XmJ+6lJ#0=)vc86+Xc4WhgH73@Kw)x-!0uZanm-s()HQef&n(MtR8QFc|Uwz#bJfWszhOiW5%IxyL(7DJSjFJ`tRSrZ9?QV zx68ppMuVK2gH3$#bvK`17u>7oZ^9MY??*!~BkOObp0VA_`jKKq-2CzjN71l77gJ6c zq21r)_AW8^1cce%gD+#dFW)~$#9#;ZIAU}AF6_)*>}95Xj7#J?&)JwjPp6ia0vGl* zp0!q(|LV>)m8l(}?FjNajX0Q^N30ws1-QRw@vvk2LV2BNdBoO6pM$Q>PFj@iS4suP z5Pf_k)Sbt-rVqJz4(Mb0zk8qjsHKH;Uw&GeK06-Exl&2Y&{IQ+t@&I`%e&sJLqpSx z0_i!|g0H&Np8&_Bw`Mn|c@^BSrsqgDIM(^G6Wx8Z*OcS~T3h-qeBLTn{wgLL36Ps` zW5(8R9h*-e70t9DFvUOYX}8+;8+EOt)jh`gkUnHDs~^7OjoAcTsK~S)3Dj$e_?x{P z2QfIDH4SNixI;glEiu#0Vzb-9&_2-zbmtgR)HC2s|GSe1>!TzCX5a$yvsC#T`V4ED zhh==)M^R8FU=d2`E;UO0fJ?ra=&_3X+n#_fyYHcE3qu=`bUe1i?po>FkB9#iMX1Xr zL*?A;>90*nf@RQ24gf~X1lmv=*1{FgAS_DAJQhzTC`MeDx{I3XWy_Z0f9E<*3pe<^ zQq|a{$Mi8*@UYoTg7vl;6X7ro7na|XuF_Q<-+U&2x^VJ*5bg9$NH4pD`N*#_;fb$v zYfpw#T1W~~C>Z$`q>!IIfN?FE`Iw=Pcd=Mps1LhU&o*xqHc-U>9ekb>HEyTsBDs_i zBi<~lF4K7`%2s*`jDQm}VnVU4mW6d8$4;B=6Nn`6Ikv{0+^RjrAeEu`A}cF8mjtGs zGbn6#jq9;(Ktk`-TB^b!|IfOu=_hp<`8|T`&48>3p>Hbw)^gWe!ly>bCV%SwQcJY% zullXu>kRo1L9i{%r;=6AoiL+dA{y}7BM~Gs=jczxQ9A;9I{e%eVOYWXH*I;YTpvG{ z78AJdmbz#eM+HA1#;OKfJL^E8wJOssv^wjXvZvcg2>y<$4zK6>Lo=N( zZ)9f}QfmVODZ6&9u=#A0WxT-mnaC(5^fE+<>{)sRtz6*L9&y7AQ6-EUyU#C}dFwnY|-8 zc|iVlo#ste*N>GP-GaLe#lgCue;NcyYvtDbcYaV5kS}5x=w@Qb)EF6iZISSo^*)EM z8dmKd31T&_=aMC~3+U7w$LSGt<(?f4&RsH$Z zWZFYVWQzZaHbc3XUHbQ=b6xO4L%HmFR<{&8c!p$a1J^JNb?rcQ{RySEfZTeC!U4n3 zsEnAkK*Vu25=htThg8(;j2v|_tYPjaH7z~;jo;t@eDXVa2Fef}cfO(E(dEn?D*rpw z*cW@saaExm5}4MPl970FHTs^;fX*z~p^4UuzyjI3nfVtN+_Z33pIsJFkW{406>QXf zgnC*1jDPbX+7ya1y+n?%mD(1ac4B}ZU`cFliNL%0hhMUW;=^Q08=TueFse6v&!Mf2 zAsSZwl8I4ZGZ~XN^T?dL zCxjxuK3_lh{N%=OX`k^GR^7%iCs7$5WN`((P@0&AVC3=oCfr+^Kq!6>@HDzgdIxqQ z2Sw40Zg|zMB)!z7Ulpp|6XpS5xOeg1P<=tbo9b;1@Y(+f>IArcB{zC@4QYVXkq;kK zK}Koo!PeAytreDW*YLl&c`^&?gs|=r%ho|saAY^C#%-!x4z>3gTo(LaJxo#2z)-7h zICaIzjiNG5j~np$N3s{BPoDYeXt6xsO?)1?w)T_Pq+;&%K$`vE575mE+CfS4GTowM zq21&5ZAsX-JtnvwXI)>$`E2Sr644N>R*=&=W3xtK)gkF?V{lb>DWE9FsCu+>D&bXR zdhT@o@sWcLp-F(ZIrh_Sb~!(MFUAj1da?x_ai0`bAsIn3F0%8zY2w1L{Dv zzqvd}Uz2j2f!m&^2CM(P@Hn>Z^ogIN(|4`>?X4<^qKhA=We28^yHp22>IyPVn1-H*_ZPqV~>D z6ZX=@>kaI_b|_qEYH8fld6cg&7yqBU^xb)D0l0JCCF(xqtwsFH>ENwJP(vn6C3OR% z^6Jduf9IRbAGg0z>iKJMOToqU;;SQ`FGJmlp~vYZX)wAGQV2!0;^_pKx=_tv4L5)X z$l{hGq!K3m#ID+qA$iz(#~_;y)#RIyE!QJ(lPPvxMhSx5`B0;vmex8d4RYU^%HTuw z`rz8CNz(o}zsxcI3+x~Jar|w3VStAOoZvLiz|dGzlC2bgBu#6?OZ{2x;mSU?_Iy%T zumQGu>0%Eh@JXbRCfz+-fw{G?yy({NGnHvRTsPE;lgLZ|VZgM|B+zYoqt3MBUlVE; zCO(Sr7?Ot&o~gNYv1k)zMb^~RP0gHwUnLe3j6l<6M{Ux8s9U{NSG`;G!1xQV2 zaVE6hdl(S!KEH>Vv&4y&uC(GKm>GzaZ<4MyftS;7_PDakz&cT3YSD;jh3$u7DT4RT zFQ3pEWZT_JSTKByzA(;~S%s8`%iU%w&vKmGIDrM44{@ufq2dwHTjWTSMiVei(O3tX z+63e4p23D6N&G3uyt8EH**Ukt&w~Jc$trWyD+g1X?N&@57?y=|q_>esL6}cG`(h`m zDJ5zctbV^^@-Y0y+4z)}-EXOp$96UFlr*0i^2wl9E5iAMPfd9T%>63*A`Xj*8B9Rmlzc%`iEpu~+4N2%$P9 z6f+11vRpO=`a~y$?;+!DG^SCgw{xVbTFxCCMt%0*#nC$DMQ>b)-rT>U=LDQme~Y5J zg8Xdq9L#_kG$F%}Thqlxc#6Z{^b8>8>nnbKO;NC5gm!9*94}y*^9<-1DZPcF=1nhQ z00xlawJ`8KXZ^cXCwC}h5e*n_awfb?^6zA?9n7vt`d%{nzd--T)~TyCB);**gBJ!s zI+%cWqJS)>@vYdq%b(<_bzu+i99=iNt-b$1^0$BGHAa-3i8rL!ZsWi#C#m2k7Cb%a zX2&YzS0C!c#os0CKYVcgyytW?=P@arT6#I#jKMHfgmI*HnW0HfE;gNiM`Pca}t>c|>{qTddiZlk|tC9fsd;NMi zYvUG~RILQE>0zpYMwztel3u<@tu22&JEa2^x%BBco3TGeN^&xDF4}>qC6&x->14*u zOuTB!sNYR44zhIua026j+bWF7O-YVr@Gfidf9AMB1m6h#0|OuW#ujXdTfauur6E}Z z7~qzfdpeuZzR8@RfQ&T}KEU#JOK9q<`>N}m)-fa^)6)Lai(3HdaH{$BQ(G-|Jax5h zeaY=F5+rly=^N@FPrt`LA<*IOXCR!V6yyBTRLZCx!5{K~Ws75Y`pv7Z2yw-WKMhJH z@(#Tmk3`Y*M3-bqJjCM>Jc{?$C1-q`78BjWPW0D+voEip)`EX$5MaJZ8y(}`_+gQ zaE{=Pc$1=93nAam3Y*5jN$O3JdTVvwASn3gx^W1P^05%8y2_76kbaq(ZR>W;v#GqY zMeC(Tqoz0%GEFTnQbtOB)*5^(Tld~1ADirH0~sB&_?rN)^V>*Inpe8zI#oo`RD!lx zsyuCr4n=Golq%_$r;Opqi2QR>{PtC}CD8s6@yRnWN5nF)MCOdsN3cSCS@b=Q_1u2L@tRlA`xpwEBjS|zqn&q#uz;vjo zYg;J;ZL($bKqCYk-+cqc8%VN(v}uOqr=HdglJR0WY0@jc4HM`xdaD3tP8)F5V7RLP z=dUL2%9Kp=Ex|6;Ez?>8QX+fG-w+eZweM3sRg890JAKUBwe}|Riw!LT+XUS%7Pwht zJ!BqGwt#=tM$<91*DPFq6p-lhGJ%MP#7nkC`M(zrF)OoxKWQeTa>}=iy+s!=pox>I zA5LN4?zFxm-`setv$t@}shuV`A}uE}xOJo!YI7=6hAswUGv2&J)x%Qg&I`QyePbqJ zK2-_u4-{*w&Om=tSZ2;abuIK@AP`hx>j0dber6{948R*25ci}rc={D_X89iy_dS`z z$n*WLa`(m9Fn<(c0qu~(naj3`5W#0?lzqU&UPQ=QTN@o{fg;KQb}AP{(@Sji_FKU3 zO!HfDR^KvQ@;s{!j>T(tG`n|X;sSd=LGQF9&H{T5biZhMy2L?R6hAad5qmXv$8~pwpl1quqia^xmYvRCWk3<%K{)uW8df@l z?8LQY6}~=Ji--60OysV!^NKjt(R@=>qik*w_w^Qd`G)Z}omT>kW;XBkudujU_(#(O zY~WwN7{Z_est?~&a5%E%2G!2C)LfLop1g~-6Y%}S5)%K%_gSS#^_yMKOR<@U!H3t! z-6F_kJDW`Q^dZA4b1k)OnSrwrhNjd(9h_myBLx~qC=bBP`1Pf6klI8OU&$z zwaueWE0(pK=rd5GB387iVd&z4k?ffBQE3(8kTYB~DzEe(jYqWl_W+xm$2T}sv2Z2amABE@G z?!EunTSF0&)Q2IAXl9GVVG_bjWOn&cAj zkl*-Eyy!GgqiV~V8+(IyepQG=c(RUs@q1;<{Pvo-S6h9n&J+#m7aaiX0h6rSDP8z>DqBlfKS^vehOb9 zC+@>ERw;N_zfR;Wc5eurZm(JnzBTt=)`mt$4W(+!y@g!&@t76X)v++z54LbJ-mM6{ z{hsG8K>#vx-2j2C!qTYL(SMC-zEL9ChW=xQ;$VfER71{rDa|*BqBSL!?XWQaf<%e(`KXk5w5XWEdqvb+>Y_1ANodJZLS{OnW?128B4R|tbY2q zbm<)+e7rtam8L%!vaMPE<)Fsf+`Fwkek0`R<0=w^43WFGAwG#u^NkO`zvOOwe>wC@ zVYSiSQeif^;d56JlsbFA*ayE8+J(6I&TBfHX&b&jqZJjuG_^S@r0qr{C^Be44tf2+ zZuXA9ws${q#*!LO!Ov1naQ51IhFJr9$pZ9GhJ#;_MKzwtJbkCwiW7f zoUDkYiW~bBoL|WrFf$fTuUR?Kdb>cS!2*(htrYPU#D0VrV`^S zL}uq5m6~J>WXCdI-LD~FzC(F&_&9rjw>DuRFy)ykxw6YOtXIT|skQ}Zu2u4I?q}E6 zY?{N5kM_sW$Ki)m9+d&iiz_8cYWG_YjqKImOT0II@I;LGOBIo6nXHAmy?`9TM}vh> zNuDCpwqn2Lk!V?{$v2bm?+>|j&MS$t1ea^+CE`U`5=!2C+m7Lf^2oFonra114YX!s zzaV^u+DqO|;n(`u#^V9j@@0deinunqFBjckk0IqGot`(IQ)+pO?SU>! zYxn0|d|H>Gen)FNQkso_z2xjIxtcdH z9SRXbF2^Qr$`d4_x-0bL(e|ZbO}qnB8%1A&v87N|aeP`cqU^A+HQ@YaZ=}0=ZV%!5 zTP|ySnpK-!YZhhG|M~-^%FjBTVH0e_NEJ!pa$E{0)&bz!pDcj%P~Fwp|Su^ z_)X0a^|C@o$#uXvacga3&}!5DI)U3m%w8gA_|K401HlL(l4B|GdWd={4y{cqZ@+dPUy2*qE0RfXV^;+0%JQ}P zBOJpPVWGFt2W405no1FapsgW5bV6q4A#ROrrt@&`xxy{ci}x=mKp>)`{8$qcaroEY z#&%s-B79+ci}b(Q*ssW#Ik0Xrs(vzO3R0I#Oe1(eujRRti*Bih)+g_at>79G)laYI zJLfrz45Mlpa+da=a^VTX3-Q|kmtr}&s#fN4#iGUV6$hlD>swe>ath8;0$jiiYdQ2x zVv#ramP*_FdMuZA;q{%JkNIyY-cmC%lJp8nj8_{Q!YtKPtBCGfH13v&e`&z1C?6tS zKl1vNm04g`NXr{BE;U2-#Zd?^9=JU`JPK9vqTwgWJ(BX5PUdW=kRMWV+Artfsi`$T z(AtvC6ID`{ErNeq>{jPPMJ^7Hp!!#NODIl9OD0Ut&^BR%g<%bw4=7tos0ha<;hub- zRqD;0ON^jpr$(kwrXKN$9Tw)IGfw35xmCCcP~0~J{<)c6UO+U4*R6B~Q)_7vxnu|9 zmU!~^O%AWAX`5QssBL-}!C@UL0_6L^R;hea2nHCG=u^n59jUU+lW3}doL+BmwFGHRigSO6JyhPixk5`&MR%mB4oU{p# zUvvuWc-}25t4y$VBu=NJ51-1@Q+Ix;{~2>l3N05Ntu^m5D8U=r7cyMCT`c?x>?#7P zAJP}}RK>k===V_`yIU_qd&ft%f|~G;w?)bLR~7|`;uOu1xS>NIV9E}&9?(EvYa+XxiY4FD2!G5l5aUrsY2+AyhkxgNvpnbXi z2x4;e;&kl}$Vh9F1QbR->XJZ+z*YaZDb9}yIG0vPi9>8IBRSCbXMISc%Q=1s}t z*?+1e>Po5@?}s;2MS{h;OgNv2gq+XmiQaRz&!WQ;N=TnouQ{>Kr;pGQlmV&hULuc} z=zmjrHZv8(<&klCCDqAjej>@N$z+(8GI2m0bWh~`Vyw=h7%q9yz`$p!_S@kCq z!1HLVuCVzp_TUJNH?iuO#kqP>hsEi@Jz4ydd7nFl}S?A(IYOm@Nt7_xCT%BdRyy%wg*@SmpU?ycnnH)ye%cO&E z3LDw=Pd}J{eFM&DM$c3_&9g{eP1klIhCAds5lgj9vpgPaT{bcKYNxaVOFEUo9f_SV z*b|k+MLy|fXPslnsTi|Dm-nW1GwY*gdt_8Bv8>uhIR0aKeQ2$dR2xv(3{FaqbTdq5|jJ9A`WZ=O2`I!>+f2 zi}zz2eQKD$?i|kXsl3u^xfgBbZ27Cb%;*4Z*(_9}eVy7$-=?U%Ujj zhU}BY)!Hh-|B$hjSYn$2uIHEAIzY3@<%qKI*y$t?N(M60`fuPRxx+SU{6fktg&@bi zR;eenW&PYrL56oDIUmHtBYv>6eEP$%`+Cp&c%`)B*D8Z#ztef$`JF6YwO7S|wpCv? zws@>%b}t(h<4X4|vs4**`c>+?eZg>pDGfD1(|%kIPIkplK^2vDH>26g!1xJ3MfZ9c zzUdFLg#z^xz<7%#sOJPk1_JTDxv;v*=w|_~iTD!cN&982ohSNDzBiWlOx6lsXWE~u z3r?u*^sjwIm^%c1d%*vZ#=a(a{YhHi8x)3V870Fh)uy@AQ5!-oa|poWGT%_Pj1}kh zdw){6F*Z_jv(y9$u)aMq<>{(ZAtw{E-aj6pQSOSIiyx$0hF*1^|ezNuQ8%IRxAS*R>6S=S{q`Bj$ zzE0uB<};vr<~eJbm=D`oN%Q27+Imwq5leI#1-^yF{rMD4Dc=gl?}48@KqL2Jzya%> z8TZ4u;o!X`PLS1AI1wo9QR!O*52}(QVc@g6Bw_b0oaZ-jJEFGZ^Ur#kjRCemCt;UwE;n8calaVXs}9CVQ55_}(C9-ljU(dy1WJmU8t?KYh$F%bA;-Z&2=8MxHnm^f zxE1{ge)akO3|PCIzByK8qz%%Hb7Nl7rXSC*!xmX~d&eYduz1Hg0wELn?@yk$0FGc! zw%J6BN=RI3>euMoW$>Xy2uvRPR_eAr_w!KwHLx%kno(=^%s%uW_BI+3!3b(Q6d?c^ zvHX|tk~Uf@NH5oGU|xfDiMl8MgH+a^R4qz=Dih6VXv&o zZ$Guk7-Larj{0d|5;Wk*CbO3y7}pOiK%e&gOH~23*SD|v8@R-AbnnrOEqTjp9RLmyQ0>vN3N&>>*b^R0X2EdFKc#7Zo2cRy4#lUQuV0`M;cRoOn#U(bv!mn+|KG7luZ}6#{h=+XC9)cSmcxkwV3M? zt_2UjWr<*HwyK3hUgUg}m40s$;%vM-Us_eGz&K8-@Vs$pFela*^-+49D5S>!%QDTR zujw<`efFP`**v%H$;YVulM0kB_B^6O*6mMV0D#r5)~bMqFh6+}=#o$SIEeqE1?)Ry z-s%3!TUTS^Pji)FTm|7*)b3|MKu2ve;M98P*b;M1Q*i)NpAe*9Yhv=@?>w5to|eIY zX);pT1-6UJ8SR;9xl8f5XTi;9r#$$-KEpH!voKIt`hUoZLGons_vki!?d^z&8?K2O zzhILzGuc7(BD#A!Q0g2ly0J{`VI$jaWyGYgU=vfoND%*Iq2Gm_sCvqA$zi zwzqMDo?2iNqbE*x|GtYiz3Oj9%1Oait)jGzdwq(1R!5vKd_vmM_K5P#)?oyrSp3`* zy2#7J2g_=cY?duvwM^#StCsH`_>jNk19gQgIPpie%40k9DZb(k5L)2%=5;xkk|RzI zvAhgS?agFv#!jK!8JJ(YbRjJW2gr=9Fv)*7cfaYVbtGkF;9d>8kRuu zjL-&W{XCG2V9&j)?rg!(3zGKBOZ8c0#gT1(rS6gB ztN9ezH2I5LVFHQci*~<|i4V!}%R?GVp(40u&VGp}>9;3`xyr&{JL{;|)Res$dq(3X zy52K&BM{jA9TcoBs>v{eCoDGP{R-tQVz(@@#kI{Nr(`@u3}fFW*Cl20ap#z`#r&vo z6?`VgF|Iqfz^9nMFo4%8cyM{Rl@8m>L7{16*=C^v-g7WM=_uT)kF0D8qcpx2-I#!tS}6**;Y95mYz)k)|g>aP8BeqPBL)a+wc4 zRomaFfz3?D#DH-YazWb!FA@LRwr!EHx_kmq6d5xJ6d%!|1FzfevX}XK^lOln&m#JS z*ebE>My!8-LPn`)?jrMW8y*hg@--^SsEzrUM-~#TH_*(@on=i}|E*fbCIYsc>oU>p z*}|aN`Ql4?ToOdag7P_CRqCrDv1h-yP?Lj?V=MWG5+|4G>c~B8Clu=QX3uk_7F=wm z6zj|+lhPhs2`iK&Ns1!AbNcEkMsw^vF|pTvs>eID)A}a=)M(LHeogY{h`}J6^myL% zRcac|p8_gA)-IIn7vScmn2?(8LSbphWp z{_VI@_Ly+?H{>2%(^rl0rd&#BpZnw#h-2ezfJTjXrhtRoQuJ8xFIQdef?k;Y_oNU< zsOnn;Vbp_aF439jMQ7`9V=f+$T7(4GC0s~GpYs0DUWEqV7}GXyc{}|xX`(*%ngnER z{wHI0X6vH*k>4_{ys!7{XivR^fSo#2{ZKvH#thUrlon=lO3gnetPBR6l6rDC-(A2Qpl>n0wOE z;SS0JA8OD{>Q?-PtIzWrSic{yVL8&EoOvz5%h}G&@p?yEo4*T#OeERPS% zcUXo){}Nbu$x_b*mu~_2d4dIR%z9vIEpMJlVak?2Kia6khvN6Zh2L(=%Wh^M*>>jL zuWlZvBi=&V`4?M2pelm@VwSf12ck~}OfJl;z8+?C^%CG{5_TqjN&y&J1h*}56#vbQcDPvh zmGRT7KeaNI$CnqmC@P2w^#C`bI%;s5**akpU3?NHiFJ$)P-+YOY z@A2@QgQ=YE8qvdJc?oXw%ttPOi0@ZrJe&_7O(IW4C{e*o+&NzH91h;@qc$Niy7k%t zBIzwYw_c3W12tHdfcsxChD4xv(0_kB;eyx5jQ;s%h$Kx|Lan|B;aL_4)`jTUhYQ^X zEOLd>zw3i|_r(JD5~}2^|HN{765q)_uKpQ#l5IbNdLDG$&gAyP2c8vkqE6{kC;w6{ z_NM^4X~QW!*S32~Fq(Uip4tiB)pbI+S)R$$a&f5OC>=AqoA~1HxOv8__*EO>brNg6 zP_|}^*=(!Y!ks`1Sy8xE!xurlB6HRZcU+oiWQy9(RmYSWs_sBZP4 za0QLnps|~xW)t)QK9&4f+A~=T*a2&ngKx=V!z~O6=m55xA+>|sn~SuEx0o*3q%}WK z*f{|i2*g<~+?i`TZ&ZKU|9h@ZcmBB#nbmLgo(k+qnbV%o^bOBM8b_JPr?{Vv1K9+f zcB&i)v2x`IC(TMnn{3!ti7!3x-~6;EF84MuL0n-*{ASg}M21@nG24+=^}RL%6p^~` z<*1wU?ga*2fU+A5B))#eBwVhv1$5s2#KttAOSm++d<6aeCP*m0{!J=Ki8e# z4b}NYwcT-&hSsoVi#lJ=S;g;m-32Cu68hpnEQavXB>*$fZDrC^Wmq@$=PQ{*$a=de z1e0gWt@kN%349S^asSc~tV0f1znGsU=yCH897|x5gabTr{I&YwgG)D&me-KG=M#N> zazG>wi*hn3!DT{9cj7^yZKC@ikm|d6k+bEcKjIv>o|i!<_uY3#XS^q5uO=(m%?SlV zkBxK8em@RwZRxhS`}8{=3YR(k(*}PeDzDg*k^SK#Du3j%qsGDe3{G!Z-MZcOHz{96 zr<~F${2>G2L!I!k0D+67e|@&}kiOu0YFQe4Z+^y_BTntNsp7D4ZGRWEgMZ(T+3ctc zAO7PPwtD`2xE4C13Hik7*(stC9)5lI(5@BrSWxnK+G!*^^}wpXhKG6XwDwA`{3;jI z!c4F0)>tdYdb%{6w_QE*623Psrk7baa&fqkUQ?&%CFeNh7@BDi64V5I)gxPLGn|-5 zxVogz5OO0b#?8AX9ytKEI39&AThff+2K{oJ7ZhD{Ae*Un1B_c@s+v4J#dPu6(QKhv za_2EnX`eghTzu#*c~z(z1}|5V-D|Yf)3~E@rW}`er`A|ldH3;q>%M0)FEO^VoK_|r#!$OLD*@$@Pv#+Ox~l|V zP>~U$;mlK8HGDoJGASjA(v5?qu#_udYp6$wdHW!(G|zZwgL2oUTVXygCIsQ9Yuk!; zL2u*c(c&|Ua4OOfS%+ zJgJS;pav&C-cj~5FNYFjhZ`aY#0iD`VCeDD*Tpl^0aP+)BmF_z8-p1Eh|D@qR#8Gw zJiP=61bS2$KB;_11Z7-v%^?;+&-Uc>MS`GOVI^sV_vxA`m zPpVp;41P|^ce?Vo@ezZ_7V5jzMYb*`F`t_pUdJfvI3F@Bw~Q7&iIoiV?vr${r6o}- zn#>qF*Q^YI`8+`}9XKWZ>~P+@&Oxu|MQ<#9fc_c4-;)BLn1wV1{Ls#(d(p0a5s-Xr z8R3BHX8zrf=i1y>p3%H8JOaNBxX^5!Vgat}W>TcJXP%#DPXtHF;SRvYov^I}7Dc4} z>7zh2c|g?2XJ8XK)I|t-areJeWBB?*1WhR2!h%Xtk*)FgQ~U_Pp8|4S7x||p#cD~@ zmF|~gb%jhPArxJgDy-~ho(}Ok*_idqwo=E*%7eDyiW3g@J&6Y(cqeaD8f~vSzLG*DO;lboCj>(Y*5O9Y^B8N4O?MUOmFm zd7f76ELKd_b+o71y2F+^XjyXPQj&bUjmLF%4`Wu<@b$t9on3*mwP*{3E;)RR=)i}- zS76K3ZBr`--t8FKulNm%{KoiB4T4kp3WVM89kf%oY2!$q&mnHnNx-1HTX4wg#A(g5 z?f$$jEZ+h0C$tJ~%yr~%@>(u3j}TI0UrHk;s%VkFUDygBS2B9L_fH{W6FD49kW3;R zTt6TW3FJ`W*t^i2@*gDZ49V#L2=2%&0!pEC3`)L2Is(=XfN$VCP>)175ePK-%2D%G z*aoT!#X*4%@+FkP>=&!}h3R_|)=&M@3ab)=lzV~CHC!H%ZHYN?#9OPvRO>k>n+lI( z(kb@FGeaV(>VAV?Xw%zG+?r%GM@CiB^y_+ard*Gv&BZ3?cs2~-|5YUkijI6w=@%35 zls=S;%Q~$#Y|ejVm~CuHf%uGT7{!@;FNP<7Anfv`li;viGyPT8isC?;T&qreocCoO zLTCHM+p!gVbDPtgvxLB8IC72~%xc^kDR+Vo*F~~FZU)aEr+&cYppTs`Sqxp1U{=dO zI1v^>K%j2l19vc$H%mHC$sM|#Tm}oa>Abr{U@N>Ew;Fg-1*F_(JOa0YTZR8%0f)KC zEeQ40+P6UMebYe@xa?500uBQG2S2hax@5sIUW|oP>!!sVyTlSf=%aU11izsNF|F$g zWLhlcah5@ewU1^yy%cy=8SP8>XjP{f}0tM`ou5-CvEz5e0)G+5Ff7gDS*tV3O22bT{{oB)J>4gSwoa zIu%+(=eXW&@MZf`Sw{t9w1WBM>8~|!HUlBpd5UPuwh%2?ty%G3HSrO|`}B_!V-J?0 zw1XOzvw+m$1j1G`Gb~r`EabA?5(7Gho=em`rjj`W$zD$G#a;<}oT}g>J-hyorLXX7 z`hCBC(+EgP3n+X9X#u4}lu}B%Lx~~XNQ@Dp2m&JANOyM)kRB2eqX)<&MmHPVelNez z^Dms&b>H{7&NSZcyMGDeSVn*;D63)z5OZMBd_0tAMA-YF5yl@=3FOX$FTO z;zo5*G2K1scgVqPrrB(at=w{`5e5$TdHSNJWxHPC!`79{+|CiarDi%jlFTWm6H|tz zZotCJcl`FD3mxe%p1B0vT^Avcr-TLIuv|ab5g424rJ+5l^WnP4+foSnHyL)?-bkfyW#$L9y)q+5ZRFqh95PK$KC&KHcUYseBb;wna-=AD7yGkW(u|7 z#zufr=`vC_PTsvLeqQ?E!HRlO5S@SUzKWaI{Z4B0Vf&U7mkocZs)L5EjuSRuMrs79kU{c z=agfUHFgR+P|ACguKJyE=4Ld=;XH5ndeSMj5O)N1VY|Rr`tHondEb}NRl+_6@4SR0 z^_;|cv=vy#f_1OcYRzvAu(`5FPk=Bn!hfe!+0Hn%U-j!*BJcy5g<{QpIa2*vcb*PvJ)JO} zApv6h94*lg7o^HX0(zIvPG|ftl5RQ%7E1NlfmwR?~H0%$5x&FBDLjItgFg%x}fjLc( zF*ZJ9u_~A_vW7oea4RlxH7gn`c>dw$g}L0z@hLjL8?(RgQMp`OC~L-kM5_evGzT*(u zlqsI_TX#(?DseD1Eo@wI4s&U=s#r50IQ2rz<*21usZ=DqtqJLbf%r5;XcGzkRS6i6JJixOkcp=^MFxz_XQ61~O4-;<;h+~olWc8QKXiuCv6^yO6(JyN* zGg={8ru8Q~LH3ag0dqaY@(MY5jQL{9&e-RydV<`#_BD+aBF$%go$h7bT8fzXspG4b z_{jXKs&3J8vR016L!Usl8>qiqT5LYcd4QHDmZQEFrG6?m10mAQR8NlMxGT$#Z8H825$B$(% zyfZvTxwowaRM0l-=f@)H=nCS7OtfIcZR|EwHo4qkD(q!EtZ?K5Z2$EfBL*d1>SCR8cG8$L)}3G1nBjPb_^|0-s{X z;Szq2a$O&$?4u@+fi~!=AXH!X3^drIa_hE*xV%VngPFV-Qvz%q|MeB)s;SQ$UBs$$ zFbb+sP*C0R)9`Gznynz=Z?_!_yF-ObLwy3m0Ru+edPl(a_Y z6lyNgF_TLyAsOi}oG+Py?q}{x-nr84_TqS`lXGDrk3|%*&>p|8cXinV*4=@wE)fHG zl7BrGcH}at+5A>SB5*74*@BJC4x)#LY-c_%NUHmi=cqW2LEXt{qwoKTo4J2QnUElP zzAzygn^=g|FaQ8WVgFi$EK^yiN`UKs+)T~KW8WuN_)e8@!}!h*(3nUf3Y5Xms}jti z2-P|a5mfI_Y;PD(P}kh7Dk^{V!tI04IUa2wl|1CjM3KT`F2C)JYu90~mppEq?=X(m zTU)B??yA+Uh=TI;TlQrR$0nVX!|(cPPo6Pjxp^8!e{=6)m@@sq+u3%j{sV!wWL8vT zqmS9*<}uT7&5%LgMKi7q-FU!%e%eO++~d{XE>MnAu}xWxCRVX!tFEZSYjq_x_0nm)k(wGBkA_1zqpxd}%qDwMAr6avCOnOt{~x6%4D-EHJh~{~ zfd>akWk{;yu^F}Tw4QU89EITcwVR26DFL6Yi5cHb%u#;zS=w&D2~_)?5%hLbGfLuP zS@zQ5wI81o9v6rHPYRsL{$pb?G_W|RF7E0>M5C9zy*)|Qng{CH(L)_A zaMd@;_`#U7s#h@TJq>&LySN_l?;}2s;<-^REq-HPsu%ojg;y;(eV?Wap)8a$+wOl4 z-!1!gcm9Wlg~u3!vd3hcKjD^h&X)Brk2IOQ#&Hipzsw-;uVg<9SjS{aGK2Po2_`1q zLeJ_aSOoKKZj&u{Dn-*|tVM1#R+*6IzI+|(KxwjMxmgWVrFOyR|GIi^8fRI6n>o77 zlhp~pVevm$kPxF8EXm>gP$ER`H5fia2Ei^U;9rgT>T{m0LosSmqtb4 z*LjzF;3VO1p`v+5ZGWiIv!$Ua?(Ik>bH4?G<8AyVq%;;}U9{bEq17GYbM`o=4QI~} z%)ho%oJ^seOO)pEEOZh})l9Bgga?FcPW>{I03fU~JTazUX=~INg*zwGPWZH&cm?ETa2zu5gWK!XZgJU3P=xh?T29jX><(f;1{8=i9SOc&d&_RZ zN;`w+OS+?gsrHzepKmT$Z*KPMK+5SbUwyK2!J|_&tge26%CCyh6rGyn!VcwNd0L4RVp*Bk z=EDX_(D}5wNs#CBw|}-Ar-j4fIr7u+=UKkU{V47j|I;B9%8RMt!GIZCr0U03dM^6* zS<-HHtdX8#ma#c$cF4&aN(*drOiAi8sQR&cw-uP`9{DqqGBW#L{?#63{?rS9?$*e- zNr7}8o*LJ@to}Y;KRZmv50ia3?|W^rc4%~j%!UyB*fG~&4&w_#vLfG{$CrgUk- zk%xG>+~ws&xPQnArHv*#Mrx=3=1lb`=*uswPt=^URSiP^4cOW_q?RE(;>&BA^^2B@ zXr&_*IvAl6fJ@>M98xm#`%njkTuyFAV&C(HeT%tGLm0TQ0>C)seEOO|nlUY|8V@S#C4i?tV(6ZLZL#aTx;)*b$r+*UX9n!eXNiRLRXTZ^SS zn@TEgmvgDJ{Wg^P4$q{lY-=fV1F60rWLb=d&wnRJy>;u z>9Z@xy}qDXZ|h{t9Nen$drfIoqcQ77wL9^aG);8BPYrb)Q=jpFOMj#=bzAq;h*vKT zhI=K{y|fcmW64`I)v_hP;5Tn{tpdPzNhWfuz%u4!34U6mdoG3)%dZqV)i|Y@&Yzj3 zS$%nXlw6zP_VXa~s``Ylf6QR)W|P9d5j!-b*x`HPEk^r5v@Hlp!6CgsMQ#fBqdTy{ z4xPrgW^HMge2SO%KqdwKvhxTPUd6SBwt2eNxK;UgC>4@n?DThWK^a%@5H5F009YpZ zN7M-UtKa32(1x(n-Q>QtgClXr|EQWtmkqLyAS$l#GX-C7z{(Za7rAJ%v)P&}s#BI4 zw8ES&5Zq&Gt(qdeXAGinvO_R%aNCQ2F|3W+RHKx?urPbb7*qR|9$oS%zNjjw$kSPl z`ZW6S^fKA-cTB{rEa$#=CzmK?n2M=Gd~f6CgdB|{Yu=f)Lq-rWE2DqT%Kb`aR=%WP zw3RONYpty|QcL&mgQVa5fD0EGskeV>JpNFXu6-zXcBIg!nC-Uz%ur4+`|N$%+=ZB1 zoxuu2^CfF1X&VB6)408dJ#GriQkUXyjf3;I8hO-WLH8^*Lsq4*=)nE(XWwgN8)`Hl zoLlG3TsIFp{sl6KO5I@7Qr+SaM_x{1Gu(+fKlPz6FMDpQzJf}qO@imhsWyD$>8Uq8Hi*m-1rBSJ8aPK^9t)c8rkB;;b* z_uv-k{FRs?XCmvKB|AsTRr6Fy7bBxDi4V;~Gxf`qDKC;9dZ!>nN6#VVxnMJjxyZgU z=mUmE>eoo@A$-`r&M)qc`ea`|$311KJI=8RHzK9}0wI+yFFA8#4L`m~`!T7U=NcYl z#_3)PkK@pN?4NVUsx}@VL*lz?u`Ld}MZCgunzMr@f;gJ8dDmn!APR5my2(_$-2TJePEDhlPq_Jp0g@=WwwGjQGtzL z#Dzj5KGb@iCseI}FXM?bO&7W~UO8s<b1y358WSQ*+sWra$qpT+Uw+^C@i&vqd3Kv?YWU97XL+aqVgQIGqy_}IJmtfv zgX?cNvjzre6d+=E;_i zvZ8g9guarwOMI~g`mJYV^X|^J_OZ6n@T^D0BxqiQALVKDpWs79mUd&1^q{)#{Zc!= z_;T)LJxHf~Z7t4m{EnjUq0WDQI5j@ei6+55;TJ>B+|HM1uu{G|mj+LH+n{)Lr7?ay zC}t9@etwk-yOk2wHuo(-J$ZR;v~#fs(S!LrHipgt1;i)gW! zfh=hgPd-}mI~^^I;+w-Mx{n4Y4Zi-##i^PG{E8~IDN@3Wk2@2=t5PUgrzKM}CR6`8M$yi2mKnzLG0*5J=nbRMoUfHYymX15S3Lv}9bC;GzS0 zIv<$6doQ5cwbtxN<&(pJxW>{Vr~R1D?5K!-o&_~8zrH_*+`!)b)26Ue9fTGNGe7z( zdiubC%i@uI?Cx%Zw@@PQZc*18-ivxr(~UywwD3$cep+f(&F;^}XD$(L{PskSrrNCm zD}n#&G5Cz<%Imh8`(2^vm=5SOu)M?0&R#dux5Ju3WSc0JbZ?((ot+9#@WfwUFX=VD z6;+f?u##G9-EA&?u9K&zjsJ_db?La6w|MVb$FuH&|J%9~r4H3+*&7_$ZWn(M3t`ji zYGL~FpOIuKytRFrvnSn&d3Il7p`;@1AeIvqc~C4AaM4%OQ}xUNM)$Uba#;UysS(d> z8Yg(Ns$XEvFzupF{D`cMtM7d5dJBvOR*~Z|B*sH1>XY+mLuPE0%F*P@hh6i6B8nT0 z^#j$2NB|BW!0 zmZKh~pP8=v2%E1Y4@}jcgKbg~`ZAH`S1tmb#Gcq|4Rb`;*l$<=cV4^lkK zu#Hi|?A-z1B>CjxG-)iUsq5k0>h znr3~QQ#%{+R$D#I*-nBoo5-AHj!?maMxKeGK?|W{TQ~gq7tu!=N zOQvweMJH!wp?)9~BhuynO`sBGu6yuPu+~p#);Dm2EydtJUs@64f4jh2) zzz^A-cR(+G7T&{AmEPiWpl5f2_R33RCi$mp)0Q2ODD!X0JloJ!KbQOO@wf8Z+p=up7&T&p$j*M^vHzGy?RKJ_F1;ZVo_TzXSASygjH+i%l+FgBGaQ#V6$d_&Ju zFx03E0ojvYy@ex`rB*OZY=YUR_+4E{=0vUnT&@`Mi*;pE4VPt6m?ze-M;+EpkK@d4 zrc?)5CKFXTW^} zp3nQ7{4)RO(t1n!kv%^uP2qvVFLN60{guhhriF>XH67ByE(edR?BZ03MwMlZW4I7^ zjEyUNW>*{)pnq88gwI$}fZ-#lVybj5ls?S7>Oc;!$vAI_^5ba~uiv-dVZ-#- z+`F@e6g;It?L!Q&{J4A~aqe_FVIob@^YL*a9V$O0*FbTb9#?I45faVRGw_TVP}YPK zKB6!UJegrNiNm3&Mwca$%$2#RgRQ!AW}OAKzC+AHPk<&o$?6psdNtCRWFuiIResi#g5@>ick zx{(ep?!u;^1%}SQ!zu?vggJOY2b*kHE{T(H-fMKFo4Jg!ssOIDSyV zOOT)cWfO+7Z%}0xu`E;E7U<9oUr0kXXe~YEaYOfD)=b9fJz>JFQ|WKjds}g4R{{m-bMUo*baY?^^ksT(4X6*g)%mcpN`?jgG)KQ$>~XPLHtI!DBG`N$ZcyzSfR1iG^>TlXFu+t+vt&jJUryIA&G34UWo=qcl0>t@V;UdcxlYF3unl&GI}4R zWKnc0QSJ-DtXbQ6L!9Odmv*ZM@dX@?Fj6k|<=sXVY^zJDM3+*=jmtdPhZkrd=oM(7 zrv_fp90vc{V!xxl&Me%s82v|#?3#3@RV2i2qXPig=q7cZxz7yht5dz+`q)TtZAA4^ z3*ELISSRvx6Q75hfxHM<^<$3XI3RzlLa44MK;)-wQR*kDCXt@6;@|mnPe=8#bF6tY zWWI*d*mhUwlSuu7k$Z)rtmbo-AR&XdsgFaeXwX6f6F=pxUg~pq`Ep#($_b6!pS8ddB?RqkV zbLZ$}n5#DJ7dOssc|^F`lGlCyr1w%x?i|!SbHgc}u%kQovg6KA9Wpz|V`{*CK&S)r zAh%0(P3zsbIPlP21b9mNw3U6eq&nY)%7+QZ?q`^<1zW%9XU{3^a3LP5- z;aZ_ullY0W*l;3P^jrSR=Hv}LT%b>1g|hq=j|eIK(`k=~&EpJv<>O&yQ6dfb=RY=Ko@&91lv3w`IuIg!*Q*sMZDNm>5wx7K`vLff|U-o>G(i?a9LQGYd@ z|CIa#0{PWNU2B%}`XcBauEdhhJ+^o!?_)gG%|XS*mbB@$4;O?S|9zM>@W_D&8>%%m>rOt+PH{|3Z2Q4>Z2wiTDzIl`G;TTHM~QPfx4~WxGp<5 zav=4h+yX9EJb@8{YJXEsEH=nw_FBX2zns@h$q^_;NgG`F)G7^oZFRSzc00y`=m%>X zeJhAL7i;{(^cRh<+&J^I)&iugAV(HEz2$$1`@?bP&2q3{-u(pY7_6gJcZmFsYtOw- z{##-2@PEB+fNcs(6;Xb|^|snrL8d}L@GHbDpEN;ldZH_*;9m1v5w|52pF0osRI%l2 zTw~r1t38paH2eAuA~a$m6v^IvopvU?O7!|?>sL>tkrcs~Z%im1`iQSfyvOnprenM8 z@7HQ(lw(ClBhs0{I>^TRX(mz_tBMuH?S9ODPV9j+qi+sKn2&b|rs;Nx5NmS}njJjs zL}izdrtJH;4bJPe{0|?SbgeJqaO*^+h@J~kXq32cag53-nTT;1ickc zG{~OkHQ~Es(4{*D9=>FNT@mcZ@F#tlsK2=WvhT?zSZozF5U45{Mw7sB{A&`cbiT=B zb7vpUEf`jzY9=8bc+)dV{#ZYWpL@+NB93jlSEyh*ro>rYg^noLT1=t#!J$Q{FLahe zDtqt?9mYDh^)=7p#qxb@Ni?9d2| zotEu|(p{oJUj23yTMmDOdgRc5mv{b_?IZC>7|cBT)r==)C>Lu-|m-A*0f)*-4!h%-Jy%V&S=y+oj~sJKRS zy2Q5W-o>2E7mna6DlBH?WD!wiP{is==lD=c-J@YWNaz9m)nzxY$teAKXaFHb z^-i%S6Xoj`W*f=-n2A3lhn9@B)JcSSyld3a{=F@|AQ;0>*jK^ev-9QcqZx-!XChMO zJhi_ko7r@4FxHLMOhP;Lf4kCR47qmO?x=N2)CV!rI631KCux@}dJw4oM zGvPbRRzZ2FdN(8fJ}t`g5aSD9Q$%Wf!Cr#z|5yE|khNexQ8t!nOg1HY3GUV)!ZE?n z>E6N=|M1~N#Pe$dhLh5cI5$R3n$=JPx?SiEHb6HApylISf#VzVuyJS~t^LV{Dgl0{ zo;Vs8%gwwE<$KKUOOHt8en>qD$PZoZ8q}lBcJi!l62N|*qg(*7uKmvS}N_R zUOf$1+`VPzlJT~0f<9xBjPwG0i|<@@mkXI+TR3_V`>t9_H--(10k(|oA5PwR_j2@H z{;_g9O?5l^f|=c(MN7Z-+&% zfEv3$b;&Lx(OsH1`bpy75%2Ocqp#Y5O+++8F=tTb=WKH#I*AXZ26Xb)sNJ?)>z>#97ghg;Y0sp<{X6oqo+_sHy z0oLq-XVjDc6_w6UqQ!b4q{@N}Od{xQP*1+^p>#4B)La+hM_l0lnAk~KbU8CxI8e{Q zikS6>#?~d;O@{M)Tb{nUWx431dljyNiW{G8_F0Wm&|ba|1)jKdl1cm%JvBjAU>^i_ z-68* zutF>xamFNjgAI7Fgdk$w_&4uTQ@mm z1gH{~r2+lK{vN3m#Til&ws>oAJW?dVv%>u!Jc))}%9DXi5=CruO#XN4h(1gtk>o2O zykY;-B2goxJEMzyxbL};E!e-wveL@I-f%M+iLe{1d1nG+*rGRWqX4~$mWOe*!Cxv` zJl_ zPW8->8VZ^3ygnUf_8D>u1#6|j*m*Ns!68UR$QzfP@I#Uj6WZ@Ja4X z78TrJKSEC8#}MK?S&Q#jldeI=tMS?n4+{kW7H-WWKtq)RBiT`-_)6{-f}JZ^r`k)% zwn?wH9>Y@v2EqaB^#A)+hUD^=Y74{FA#03D6)^bvUlpX7{O zo8W|&XMu~yS;xhAZ@;YAxuooJBq?|(H=j*?Ni>+*C`Kz*UJ9eUJVO0xT#?0JGil66)2b~1x2bEfe3c(&)dz+aiPno z3eoYqTHU-61E-!zMg z)Inm|aZinVzvsHAZ&Ai-m1sXWPyvkgofcm2!5s2T<+*H&>T(e1GR23TL2lFLj^@Z) znxC8Mt(R@244Cy=Bp>n3UB3NKMEA?Vh##{`*IZD0MHc&_VmH0zPbKRj7PKhQ$e-TiBgd@Oc$POir| z8DYt_c49gl-6g>M!U)=h+)7X0Q<4@O^ib$-X{F#ZF{`b1o*Ic`kN+K~blpAUgwNXj z$9B>GhIMtL@S@D`@z{c!Em?w)KE#U2SgnO{y>)==X5OpCMWG2927fuB3if0F-MzoP zMC3np$X>oJ=K#ugAbGR+z~4B(CO%TiwlQahKWwgcJksglp!+3!>|5267l{%|9+*SP)9{wsfkrRq;F?Ru)c{+gtP| z-SLYf=R3{wGn?n^?x~^Id%R#bTr=2=)j24%9!|F7c-&!GZi12;U(&+`*~B*%8+k@xD$ zts*QFDY+zym^<3@8-9G7VR-CJSB?jl{ITy)OT6wc zLbE4Qeh`%WE`Gy&VR zX*DQ{UGG6r^|yj9qUT<~4!E8t|LAT-|xT_ zj@ifU>}8==t2p*YMZA<@<%1S$N<`1E&XB=C2Z<2rF7NSgF8Nm={I%$N?+tIiT=*Up z!NYWcCxt^|Z^|UCU&2bsCJLEqNu*?Ly?ws@njS^WJ_M(`T0oown9*Uyf5GKpv{~uCRq#P>t&d= zUj@$bDVabkb8}wY*Slq;G0doT_|?WeSI_t!ccb!dph+g~(B~umQ!pap9Ou@*i_62E zm+mI2bLPAn4@Owj8&l0YiIjQg1X>wZYLAyg%k=OD%0w{txS^v(Ho^wKzBi`kWX}bR z+F+FnSD)xy${M8sU$9wMz(FhQW%?LlZ%Co-NRj+a?D0x~19m}ja8X+P$mjL(RUqTE z9|C+N*g!BPY%As|70%2V7-5Y)h3}5})H1=^*q<-1c6^C|Q4zVAF-32i10XZufiWi` z5>~>T67XLTLlZZ`O#bvphH=ksBx^qmjoLE;0XxWQEdN`V!H_1JZZG{UM?_1HzO^gV z>YbeQBpqK2?$^G|OkTvtG@B9 zwg!Hqh92_DdR?*aeB!#bHXq)>E`Kt(3*LLSDp$6*0JS#T*Bacdk`=+x{LU+?9so2 zrTj1Tkc;7J>ETogJvZZWf892n>o{~mKsXfHF>zc5Z|$cOkiz~7TwbPy4m`$%y8 zeAgnz74W4rm0vMh-)FE9%_d;(xpeEep4+ZKfb~m`1x|#fl}mPBKZtDBvsMp~Sz3;M zwcA*u(it6@eM?0oKK)+s_(D*R_7^;!DDD|oH`cs<{}q$)r|PO#U-pbS+=e2|)&zc* z=f$C~zU0rxGjSsp-{uIPvKzZ-J*J_4>Pw7_TK5oF@0YAaWmJ0e8oGBLjr4Ih;}^25 zU-I?fb&4*J0A0nK|G;|&d6}{Rr>Nra?`!Z|-C5DSyevQDcjsEA%QC2AX%4y^{6UBt zl`mSp|8aFM2I%$wA22bKbe^x4a~$M;=;E^vqyhANA&Rt}UCJ2nk2N%gag(*~J9kpG z3c9QBe|S6y$Q{Ob>>c@Vkoa+98+}=A)q87kd$qrF0@hyHg4WGQK1hZ)>V`yGXW*=I zLfwg7d1xsNl;A_5?{8f`>&?^eZr*!b*sl#D6AtjTU7Hez|X&IM(F#6JsEUgmm z;|z3&TD6>GQBI$fyZWnlx(DZBoGE~Xyj{60IJe{d^py1OaCg9#T&S4nL8|d=3J&3Ld)2M%3Mc6G zjk8=znc!m3ie)n;30wVdzPQxI@vGTxQut4|vVDBsZoVt*&V$-qp6AveFXGz({3^}# zu;QiIKP&OhzR-%*dOti@_&#B+4hNA*E;y>}>xS`reBc4gRQY9Gy-iGbv$Ivnhdf;k z*kl)ds(4$zKdHTuV>siM@kf_;gxS#ri-i2!k%O2T#uJn6f#uINv8odr16~5Oj~Yn6 z7AhYZtZAssyDYblEq&7nt#^M0vbR>bf%T7dJdtGu zuLPZ(J~yW+?>l>5Lk?=OM(FEdC2I9vk$!`_-X{NQCTSuRiSqT@yZ@Lh5JouNAyP}P zT-8BAt0(;ARWX^#>5psc`^4=Nv{N45>bDjS+Ozb12kHN{$A>SV9aiZJx&#t@&6RH6 zDP1ZW(O`(1SeYEIf<`r*T2jUC$KY;K{uJ*Q+Q>Sxc`sFv?(;m_8mQ($dUHW?Hm!4g7W5`-rVI~SeUD`UBM!4JJz#Zt$jlj5qWrAY zuc2oiKb6Hq%Z8w=%fCB?aT&>n8V-U)byPxDAaC~_F zqD6bznTH9JG$lmDFW;`ALaf^k>XW`MbFx!~=x$(-Z9dT4A&CIpUOXfBd)NoRHwfyOG1RZKn2jLOOS3JvS;Re;0c| zwU8;9@OOdV(|!`hgr(w+T+Dc|k1|<`vY0J2cQVUZHELpHO~7OD$NR=__6@{onuscb zs-wDjaHD~u2wg4T)lF68>P7Zd^B>JSH(kv-7m9p7mhJQhMdIFU%n{jFuX0WJZ-xH0 z?(KgaTAaV-b(s@`Bj8ZIz?$~^Uk-g<;}hWsl`Mo0JNo#DPQI6`6yu|WPp)IG;_2-f zY5+1(m0xfS%IA|W$8`{2K(ct_{Wg$AL>?+>EMpk+uCwRJrz4%;F}xrf7US^6(`o|% zVB^0XfFf=Le}cKm7*;58NYx&AQr>r)UW1#g_X3{ulC#j)ORoB1k2vFa!e(w3dcXM( zU$Nt6{(Kq`Cqmobv263q9a!I*EY-~`Nr2pfcGW|-)XDdSzd!OkahaTsf~L!o_27i8 za%D-zG$6(_ynL)g-}Ut6LIwQl)qVkyegYju_YI6??v;6q+bcJ9jjN=;Nw;{zy-2SA zNixvSa5b(Y%RyP7N76R(aZqEg;-{5E$_sSy6!l(-an3At@+mp$YEG7W33bTqH?R7~ zwlYUdrJ03xcsvzXBbz34nb3uEl)YYJ-yK2eFcxr4W4nhbAU_h)6Tr1;MlOQWHld%6 z5uD{!Jr3+;nFlmFb8txoIqJ6D*pch#U6QYGlGGe!89=|kvoc{y=>1u&H}J%YC%t5k z(Z_jxi13q2RqeWX9H{Rg2Q_-2t$xw;Dw{AQ@B7!t(IPYa<+6>Y5~fip zmX#>=Yc*wB=|mW4x8Ed>Uz|il;Y!>Jy>!;RbFZnU?3wQdReox;sL2SbXT-18k1?m| z)$MJ$hMA4a#{m9pqkxpx|7iww{nFqctm~qI@p_4rp@OT~&fi?7Z1=bd49liB#XmHd z4yL<6XYcw&o{&XhwAnq+NlO=oZ z`X)}K{#&M?uknw14YKF^e;*We6?+09Vjlh<3X)s(xtJ2(ZO@vxG2IaO0MZ7aV9r#QT!bfeHefF1PnA5)O^6=mqu zKCDFPNwX$12*R|2%L{Pyx3v;%r;d_QC9~hZEGhDJ3mZ**cK#3ligixObLNh$J~@^_ zH4ppZJWn=U8J)_)gu8zNx!(AfrkchYLh*{Vo07ln6raNS{4=E9v}T=W#KpeS9$oz$ z_>2+={`Ff1c*of}+skcLe%VM7rz#7)lOlVVGNClt4%jZ5`l~a+wb>~o>5B@JEJ5#U z%~zJgiR@N^YfCL&3+)b{3r9OU#JLB=YW|lLf=ay?*!W7|Pp&0mS>OZF^XF^x58WdU zJv8b#--iv#UNn7F2~US_wzGo5A`G#{W1;OYHr~(euk)hiE1C^68_rLJOOK%j!C-AJk+3i-4vS z`MSLCvs2acvy8MF!^iR;dMg+@hprl|oPF~kwK_qpa-_}Si-%+!O1wB7?v|}071TlC zJy)GXq+UJbFGx`<00CwWM}n}&1hSWZz1^=F=E5Q~DUDJAUCj|zVpZnIT15+$)>wzh zZhES7KDuM?Pp?^btx4Hk=QpnBp3O1$T-Pjp8XmH!Z6Np7rxyNBmF(Rq%$QQ@+@9Qr z8XG5H8CI;-$2B&WbcR2!7PNp@a5sn(73@(wARFSjJW>k!*09?y>uJY-NVD>xiuN{Y zDz8WVKghFh{MZln5YYyY&hinLv|bNU4{qF$&D>3P_}v!iRAh!oB>qxa{Pb_N94VUU zrNi!hz{&?a@v~ti+0miwg49-HK&1=x{Npt4o!jqUPoo`WKYXe#Qk9wrA8J4T_f-ZL zW?^`z+5;>IUMD(ISL^NFl{mKCeej|E!>TOgON~|zArb>ql_Zd(zV7%V6zQ@p!l*-x ztGRc*B=bgwxFiB&-ePoDM?+gjA%*`|oYp4Q#EQJ^-Zj#cFt8qMElu1~#+qF#1VU_J zn?kp2>+fE5gQ#@|1Hl`O;kXv{UdPz0Bo(RSl}>)?XW|rjoO=7-T$!p z@Cw|j^`ieb!A_;v5WG6%T-^ZF`$v^c7)0EK$9fW13EaO~liDV~*nCR+8l)WA6Ut{W zOdvrQe1Uz!d#F&42ys`prh7^NBdk%a+ZW0qvd#6) zG}1nK;ml_0kcvdduljVMN4ucf2z`ZK^RrOxVzuR`@S!_zs;0#w3|8qTvI9$Y*m~6@ zhsc4{{=j_w?T52{?#IQV3TiY8=j%^5@lGf09x6(I?@v(^#_3$qkliFX0Lgzsi-*=4 z_Ep%F?gO@qtXkVC$)-EbPUQqx|I8Y2sk{8Y%g%O@>!W;`jR^-5;|=s)cI_Z#H#&lr z>+n!~P6!j<%dzKw#RwH|M#*-FxUK>0Uk^ns0H|A*zg)00P~TGDDdfUBJ;ZhX#$0eA zw!4CJwx2#$f+;lQ7y%aVWlU3>0(xrDCFf_oJ6;uyyO%~jG6(-yyMb$^p>$kPrV5bAj z6Ui%F`=i(z?L6Hg96)dEfFiZMEhN8kp8@!wh3L7i=-=sczRNEhlh)GWKzdp-k!@)l zi2{oaJk)gEXZc-ej`U&Mp`>b^?%xOn5nL6BtnO2F5A#5FhS-V6)v%f@{^T0ir)ooq zXgwqc(rGfr67Unb3MN8lhoxePTo#T;cDZ)>UYr`UP}9PZ+=ilv=eG4l4emFK?MY@8 z^i;_~Me9fZTwK|D1(A`)P`ZJAU;DiX2M|98P|mJdHSHZae|LrZEaI@lq{fBz`|RE5 z1V$^MSKvvlfrp%ByLWLL*Uo1Ncq9*&e)Q^_;q9z!>XUA$858yElsO%e$tk4I1LV#< zNHC4Y>Q7hZ$j@A%ZP#*ObSgIwKtxIip!?tBgwTNkP<`J3^%IQRg@G9`n`!<`>xP*x zjARoM@M>|lQCn;QvYb(hfsxn=yLWzP(o5>Eb;W zpC&tbH^v}HzU^VI5=8Na*7grn7m~Mtiz-x4&}SA>ymm~9NOdYT28blm6G~ryWqiEW_Gdc7}MJKAE8&)4R^MD_Klz*bpS+^ z9}ED!k%d^HYnjOCQVs|C#M+!>{vRH#jaGy&K0ET?x;6b@dtd$z_4meoW(Ffm$P(FU zA(OT2TV*SvXraQ`Rko~I#th1my<|z2vZcgWq6}k1$Pls{jC~zj_OZ-!>GS;~p69xr z*U#sDpL6bWu5+FD>pu7ECd0Z8YtL=Hn_iq~NffUzsHQx+woPsa!VS$Gv-M#ekWe3F znng7W2pHpHO>{TxEa{7OW*^*tMkHCv!5zi7jI6!;HKX?ZzBF7>=Mfo}w5<%cKLN$I{re~W zEi*No^S7pw`4r{Eh}ImF9dKWzs`D1 z=IuBCJ|;S(O-9>GNA>3Rc)V_3RZW*Wb)kc z%Xs`}zwl0Y$~fH?LvU~t)N)_Ic<@_!C$|x&JtcFbBGINGOtid$50rAr#Es5-Tf}ax zU(@9t^qAqIWq3k2qO^TC<&0hH(m&8+bQ9%yzTJ=!JEL{UE!;tgL8QmI`8oGYkXvh& zg{&_|g9l~81tX;^-Yi+nBQ1FPpQ<+r{u?r(!N5v~+#GkN)g4qhRAk{CYtp4tp}aZX?rVe~6V~UnzdwFI@f~}>!yRkw*lg0;r=NYCB_yx*y2a_h;{eZ>D;6&Qr^?UlPb4Qs zkbzWt%|GXL)7;C$MadQfI}O>=C;*0oebs#2l}gJwoLeOsrp<&RQNg7XT0Cj%*bz{( zz2sAFTZEC95-A8={$9|+GIkFTuseTJgmUzSQMn$=Pp8OCo44()4RrVHRvP55uVpz* zxrmd0X}I~xml15oX79E2S?OF1PJ~qJ{^(dY&o9nUGA}R5`yTh0 zq`YK&$%)}dxGOx#;dY|yFNjZhMO-cPrw~6Vt2*ua}tEap(n~+G$gz;Jvw=cph}su;<&O2N>S8gYE7k5({9a zpTE$IU#ZX8B^n&EIB`9qMpC6Cw2Kh@OYVJA)|(pV9}4H}u|?f>6ej&#ALvakcB_3m z^0KCY!lFZ~ziHn32++IP%hh*YdXo~lXCZXfCC2c&*+O`O9XmEmv=`nIR?ceLg)a6g z+Pm_YNe6^qdHk}yry@04!n)kd407MJ`{Y_JX5~z2Ar)-H>)aAY-3fL6p7RpkTmN`Dd1{Ry5jOTT73PcSvcWF5S0wE+K+*o+6qnX!G>dJ<2(TPHd z12M66M2%hf(>BtGlaOin6 z+G+c{UT*fNOo>ATv2_nbU-;hK_~)RUz;W#E>)ZLH4+6__{At8lqv{cMnq_m;oEGni zqd2GoL>AS!Y2^q-dk$bX6 ze4!q-15$%NUJITch!1SsfT(xA+^NcR!|!Er;0@sdWS<bzo>Rh-_M@PZx4RSQ^O zUE2EN^RWCB)1NKU^t5r$7Y>>vWaYvl|7OZ|;TnBWX$hJ9v{}%{m%vYs9Hay6=2Kqi zL-KBh{#;=}=DT3c{u6!F;LZZAy2Ih-TZD>c7UyM|abJfKd+eXbkDk=AA5MxobZqfe zJ+YWS6_zcP!-jFNmpzUt{y2oNRq54#riOJMpR*z-DG-FHL;9MrhRe%AR2x@KHJDZpx`N2Uz}Jgn?ttKT5o!|TgGBt16fZb6Yo z9_YhnVRVtfnvDL6`=417YPss%hHF~k(!OhJ$Bq7+9V+|5WNthx$ocXYX|-AtJz+p> zK?(q)dmF)h>Cwti<#OaGJbB~l1U~_RO00G}Z*Ty&L*5yJkhKQV65ob;II+@yN6$yT z%e+kRihj~(><9Z;1UFWFvn=XB(q-(!AXr*+fYho1KpXEssu@`4txe3&PYE#wk+98G5? zSA2WOhde#Qo&Y}^jWXVx?YG$e85XuCVk4J8Wox>U^>MdM4MG)wk)^(|O}Ty0t>Rs) zekqU4veMcdeYs#~Gh(TbWz5h=jqB9_qxf-pNcQs!b(x)sVP6HPgwrK9c{Ymt8264cOo*5hqsLh094G9 z?nR>~srkZh4~UePCnoZtO?p`n)s(N62*Z)dM^$;H#o|G)L}Ij};&p<^htb3Q^Y0;$O7l z8$;DbvD1*04cBg$o8|S`d#-O6fBmkxeU`2Kodxp{p>OcLbL?9a4>@4?@`BW?@k>KP0vDvyhE; z^8eh?ibR9!)XGP0Qnn9QcpjdM+u4>ok^EiC1o4s_RFVPtdH;)#_igKx$<0j@2Uufk zCpmC$YxMJ_xsCa5pDKtyJ@W4FcPa|86m(%~a=bo;)~$8$dR}Afam9#pqU(yu-HOGz zYD5)O^Xx{$K|ofzGoJf!$)Ij&l8rDimwt>udEr%O;#-VK`%XA7=L`o5(VUoA&$LhO z1#Yqr*?1T&3+tD)0J@cT`8D^Fu-u$##(2r{nLSY$Wf&AtL+Q?E`o(!rma+N5ozt8u3YkW&9 z?RkIZ$q=X0W61s+Q9*m(vpVC|j-O7~X80)8lk0Sc?ROl-(5Ssu8-f-HqHg`<{Kh)3SZn!>wcLiV zozzn#!ZWJG&(z@7t;%X1{q$f+=cE}79zZm^QfG1!;P4lS%lakc81b8)&4PY^{80V; z(Fn+H!!zh-w&*}(^6b61<>-M~!>fApvx_<%ETRjeY5c#`$-?S`_`QC zGFnwRd#?2>Uqu1WjeZK?anq-;nCE6l|E{s1c+<`Qmlt8vmmW<};@h1}XQ|6a+G!u| zIQ~GFYpSO_8sh}XZ~TWUDr^p47iCFL)>qD2=+seOlh)7Y!NZ}ACVa`4cTe5w%Baku z4)?B*RT)kBV1)rYaUq@=-39KF@^k|#1PdsI9b<<~4O)Ca{&2)*=Qw5hJD%UjIzOtl zJ7vc8a_ny{s@Sln=CnfM`c0j6zb8)?U#y!j(@Ra^qxV{K6+0o!Id6HeZ|1OY50{nNko~#1-EVvcUL#!) z9L;EunTo=Cg%W-FzXRlrLJLg)#-4V!u;m#n@7=yQj+ES7-@Gp;} z077aOu+MDDFLMQ5UDKmu02_9rELj;)J!rQ*1D#>7(=}ZGwyo5m-EWNMmC<1G8&@Rp ztL=ra!RdeGJZCffI%gaw1&{@p8Zj?qAeJy&xTzdKYn3YL6sE0Z8Kuxg! zCuST_=%p3`^7K-{3MNP`WaGvt@evW2bMtVk3>>%fnaTUG78~iN27BuhjUHLrkT2QS z%-Yl2`?6#5rk7i8$&*DkJw08w3hGNY>`8pIi4PL=;;HX8$&$3n3VK!0t!CJv?v)>W zL43z4x_-BU;MC=@G<0WMwY&fQZa!6$>o+RrFyO)O(_`LfzM!7ZVcVLOadk#bT-dHd zU$tmKIJj!VCjgmjnSy28dmqm=zB_bU$9|O zNX@sxLz?0f9-=eH$3xjq`>E!2xc~ir=lavtzY0z}xT0sm?)pp4c*~R($h1htgQOD# zNe-dtra;n~Q<_gB|Gm>&DwV<|QV>q2K+EEkQR~bCX?<>RRok(1L2YNnHxUR{Jz_-5 zD(a1c&X$(Zb(Z1&7sE#8BCG9mVh~J5L^))@V_;q}_Nf}REAp*J4M3^c?-|Q%mx1as z*v26RZ`ZY-YBT7h4q4&dQ)P6NEXYcI(q#X!^87o<{<#i8-&4;XO;BVbRal>CEbF_Y z6*yL^-PEyGW+{%fXT@A~gC6#fyoA(Fjw;+?Sf1R|rfhG1n6m6}8gxWuz=fFg#a3Sa zEzm*l4PUIwTYk)rlQ!LhA-NNb>M{cI%Tf52L3+R|mg5DS8=X`APNVTp=lJME*ulVq zZ-R@3xX%2PXg&6mv{!MD7gh{g>j$f!`}UVfi;}m?XL&o*;EGi8*AC6&p}dMuE;H}r zr+@i!Eh(9Vz?x~&%QdO}SmWr~i!~X(47m#@`o8X@` zTp(*zks?1zfMxvf08UdTU;0QIQjys;|h88$1c8CYvfY+$N?~3C>Seq(MqIFAQ~_%xzz^(0W^4LQnF4M6lAk za!(cgHObrexkgHjyJbq5n@;IED}lGvS5>^jdte^4b$k>AJg9Q*DK^ZwI0p(_by2K` zY0@(-&bIvE>~9dveaqe~FZxR?cC+#APflup#rgZgP8uavmG4p&>WODp;+yaZY3dscc7bV1Od=6f&toXP<5=5@n~|*QBCG}QB-QlSJTz6ygi#` zwnLm$U%`Xg?Tkasvn^lC-&?`@DGHAvarg(h9 z0bi|?_a%kE)7~ol6?Q*@3$#98c=OR6eNS47oZ=8^cV5X>i&=o)v!;|R1OOPgb|f1Huui$v z@MmHV@t?^K0X^OviFxc&aPBtPTJOEvmD_`LSwU@=*`>(Q)y;h?W|>wUocpD!&2)i} z>+W_owVH5nu59hMQ3D@M4XDpDJH2V~=}F>F643eE;8R@!XQk5u08@LUhX;UR)X75E z=&rNX_f?^9xhS5fLCtrMv|E#w-uhg>%p0fA&O}XZS=R|N8VKkL;@6E|lBz^yxjes} zq^_H_Qaica&6*wGATo2hbGnge{aKSJzoh(UlCQd?j79IaR~{l86v(74Oh zOlSSIQk;js^sEBQMbf2}^r8^QnNU4ts`%`7)F_eK9$Z}@V5GuSv*Mj*iK4lt{rURd zeM2+(x_icHlpq|{VN)dJ3co&2$JEToeh%Zpk58`iQ83REiumz4d0S0;9|nNA?>`^P zN|<(yF1#*h?R_*H8zxdxCqXCoiGM`Zdi9AGAmksGx@ts{#f+nfDd04DboJQ2KorKgJUfPw3F)GV(r5 zA!Bd=WWE2}B7ZAhqzj+P@8fbGvgx$vxcKwhC;wed%Ke+ceW-RH)#@bDsNd@s+FvB6 zfBfBC`ziL<@^{$ndr(}R`2yO^N@9vcQk=abAWjXch)<0CXz64!)x0pHcKb&M`xXG8 z3HonN+S(E=4(#7ejb`daJb&JAmF#5f)8kSi*?;-?)t<|_^l=8WjpfkqFsutMvp7PC ztAvkCP*rK&Y-oF-hkfm7{LDB+JwOwcC}W413wR!Cl_IQn_ys1;CP24@I&$5SKrH|w z*VO`q3^h_V`2;iEp4Tj^8DCC|edelz#t}mVUuYJ^*Ypz`wz+ED>G18L+2_4P?}-hc zBvVn{H$w04u`KonRW81sPwpD6JJ}x50tWz4kHkj-z`B+tvu~UBH>~`WOweugk-%&Q zwdj}O)4M>qUS`mhfwDtmv7 zZbi5!o7EOqS(j)9mkXo)*S}}fb_Qh?MxxEDq-_^%vNexR!M%TnA)v@xnnAYCTv8wu zk%m^P7rTYjv^z;xzQF(h#G``hNA3k51OWi%H~wv$|DXr{t?xe&7>|_r{s&&jk%Z9y zApYO_`~#BizaIbLUrmkw0mE^mWBotKLjQj!|M35yyY?6{9Is~m*ObzXUTP7C?$7f- zu(mEh5E%jXz6Y*<8xmWAcH0YL0|24*SKUOTd-u*L4BUnLCkJ+Thm$n4x~F|81PIWp z|N5l=CI64UzPoG9N|E>$)-c-E5(!=a04$8O*ZcY2VjzZ*hBw%ot(4h@0K#a!tA$p- zMwr%%;Cw?817Lv#2YcaW12HubmRkH+Tf+4Z?#DgD2HY(6o5e!M(|E3@Ban$gt!0yCOm}Q*?@;l~D zs5{ee>aIJE;R@4*^HbpvQ9u}NXbNGZWn5{5k)6zyS2ZxSF%~*xsdElmiL`Neuotb! z3I-nV%=BaI}_-Uj`yB7Ek*lMywVu}MH)BW7BA|n;Y5$Mta}O3R0f1>n+6Q4`?c{w z!$#+^Y5`SmMlpb~M9Rd{Mf0+{$ZB5%vciGWZRM*987mip;zPWIF(WoIumGM)DQT;k zZ?Ar%lmP)bo(^MPUOIKmDs0p^EvP}+Z&^SG0JRpe40JRe9_g(7Y*mEH3G3v1`oXZ@$iioRXC4vs6YtVKw33eJI>5?=WkYI1u%r* zSE-cY*{!yvQvl05<8%1yb}dyC;PAqO8r#FTDwVsS4a3`u;xFRek3Kbck0ru_m7A9Z zAQw}P1#X6h_<;KacDfS zDMs1r3(1-vK8#RT1Ofml+xADsLrHJO(eAR_DU|kUcFb`yf#T-yfM%8t-LVmSQeTI0l-G$u9U2 z_QO!+`P1Dc#F2ykj+SKR= zG2xnG+6;&=PJjvC;HKdooi;z+olWFuY4$wa-<=39ec85RZnSihqLt{J5m*xgGH z=LDF+dAokEz!SLOs`0>%nHfhJT<}L@U@n3zObiJzMHoK*vT=>_N#Pv;8#yIA*5Mb` zzq4&d33%LNu!myg{^;+oX~^Ri)%ci+(m&=8@&Vp3Uom@W?PtW1JWmSoHr5 z8Mr}>L;C3nBvV1VMpvfRB+bV0T4?f>oKJrNSC&z$;(}qf= z1C$RSB@-nto3<&GX==Uu*=fQDmw%IBBqP7*-0(^>Ri1H2PxOEv0z@r^wslzv(|pUM zc8P@QJTbuuI_)0zm>0#jhx|zunSW$1VX|UKq8*zS)y&sMOv89uv%_nIfQU{L@p^q) zDaq&1-;7CGEC;g$9o6&^o?LOPt)g&y08Cyk@wMjXos>k4Jw4b)Q2nbi88f!cT9v5! z&S|=V=%>uU-0@p`p8C9+r36(*h!W7Z)nDA}o-a!dS{HqgFyFA14w=AK90ls^BaL@HhT z-D^;EUcSRO#$u>KXRsqfEybk{wfM8cQ~L9Y`qZB#iQc7~`6uW=lD7j5aed!VF(JbK znCr>!);|*hd&*#NV1EAFT7ILC^_tA69>-y{&IezVAOz*c!^;LRuae$l=lrY8CYcR* zI>qMR;-2BIFkl?cPERe9^1q{2YeR?&Z$15l8aX;=EfB_-+ZniOS*R?}H`lx&1Zgw+ zEqB2a!kF$nB+WNi z;X{_;u`h0)?PM2Y0Bx;e0s#}9cU$*!`1%S<4_Qjk@OzhB2jPEd4|^>D1f^!ihIy}x20Zq zPcFWsTsZMm+52mAvBVf+k`rKGdaHnli>{e)a)T}G@R#x#B9j0>O3qE5p~!QYYp>j~ zTU4XJxu7fp2&wa)p!i4jeaq&MNKx}Mru|-75TD&lLdRw;d)Hs1l?69~@h|gqD_;m8 z7=M5dZ7ugaVc}7&r#`rUlBeB$fr%ySl9uwD7X0F&fB|E z+;SLB_97<9$vTs%_$tfr;0+39uIz$o9LjqIW|t?G<9^4n?$jqc;o|_ycG!aUql8oQOGn4ts6@7o#S5&#THns#6{EdwG9&g1;}GB8Jm3Z4wr@e+B?bb8pCi~utzCgYSW z55auQ_e6BD>p5zN!}1itW>~MP`|da$-RJ9{EWKl=OG#lnTX|2kub#cc1BNd0a+Zn= z_Ppupah5EW&SKX z#|JDCs#F+EpQ4q9+%5;CfxFR=Dzb@LJD0yq`)pE(-=i zBnd`o}W1{W~6Qk6NF)}=TiFp1;AFCRQVIc;~D{X>Z(6ZEDxGO zOg`E-17@a)p-H8(Ng-v`r-CSsElR??%*fvPw+D82O$X_szd7ZK@vnQs4OCPTy_ zuf^6X#G7et8ab%>w-@P+nPm6*;U(Z8RbpFr`N6E{?9_1dibkB zI2;Tp%tUdq_;?g0^~-QW=#Y2P?jed!Nj5MVYs;Rl&d0~fHR9LSeXT=bph(_hAtm=6 zh6oh^$d1TM&y!L-J~BN0GDps)U5zT=hrKv?wmf$(|K5*kUE=&j|{2V3M~$39=iB00Qn~E zT)7|jWd;C_HBEt3rJ-YXkfQSj+%CLVDgZ{hDXF))ZL(1(o#At<`ti~`4vZlh%7Bmw zfonGmxWxeiyPGxxFn74Sxf|{s3{H&!ULFqsu#F-x5W~vL1Y+RolfWF60O`acw$=YJ zH%FBdw40a!V1X$EU~bFKN^b`fgJNt#XSo5$wMgDOEdY@726@day@a_>enuOFZ0KjE z;w1)U4T3q}-|Q?q0W25BpO>WI#;D5RCxdlr>t?*$1;K=v0cYME-f$Ru5p>-Mr8M;< zD05bI=%V=@*_=BK>=fRkp>qVX=j-(eeriUI@{7mNV?X8Q|2mb<32Y(%KC1e}2iA?E z7zv$e&BwmIWD&*ww|a6sef|B9B6Alqr=}-a+8dbO-Sys#lYT7FH2Xi z%tvt$UR4i})Cf%@_8dMv2MugeS7PG%bM+#R>2b`H{^IXM(Zl-l4QxLKE(ty1{Cu5~ zsdPKy9Phckt)=MT6wigc$_IC6{PPu#UhJOrMa8#6Wa$btmvxXG1|t%8C7Cht3U{1% zX~-giImR4(Zm2P?jg4hJb*fOc;18`Uzy3UD`GZ8r%_GVpX^UDA^WtD{yE|d-IxT)g zVhn)K#uOXnd=`xPUW7TgYM-g7QPGB%E;wY5K?C1VbDY6o^=G~Fk>8C5jlc1SXoz!P zFc^^tcSHy%dx%gi`=3Iwt&KwA>!+C2P}Xzj(Lyk-voRt(1omsXz$^`QwG}$Iu)zML z`&oY2opTQT*0lj|9P<{_a549h60o#}A0Y5L<#H=q=N(y|Z<&Ssw<+N*O2-%hcA>mI94>e;H035Q(j@AVn<9_t=#Tfj%!PAW{8uBnFmes9%D!JZI4_KC z&5WGf5v_|XzWUI&=tlEa#zgBIsjiiObKv`)B4Zur)=XllpYL@D%za0FRvadWZE4eV zQy5i9A&tGi8sW?#p#H4WwY!FFk=5YR-yHXJaM>LzOUM*!3O%{x^i)7$$e-V>;-rjK zu0x&_HLIFKj0$gpY9VVYMVfvf^c1S9#P#F2^pwe3jrEKL#C%mgU*;=l9xL``Zw~){Thlz9Ap> zUGVp$M|}PC(~O<8->#{|H?#Xix$oW)XL=%FfTAL4Cwc}vQ#*Xn1ZkLJcq8VUqn!(4 zjw$l!7(JMgn zs!vYPJ=C?`uI$+bNJeaF`ohrbm#gbv>tZ^zi_Q9b(1kHV%A5762K0n#3iZAGMYzb( zsdtT!*%FG0b%wMNjOooha#c!Zxy-g?gypMt4 zaOqy>K~l?{-B=IYPMmwq@!Z%al`WhA#sdI$(M=BrNWx2A16qcI?Au-CYN0LJLkQzF z707P=+fxX4XKz81lum$T%xxN(69-2r6I;4Wd|sz3HU7}*dHKwE2<(DK*NQwO4vOS^ z2T+Y#{KpD!h1%?gmAh02Vrg2B_4F|5VCKEfZ;@MczZl_o|ru{d@5PI!T zrQW(MsUwQK_GpyQU(0Z)7(J4b%g`YZa1T>V^^27~PGG+lThzYv{__oD5IOqY*5@ba zhqIb6mI8r*whuFsaOB6_vOvDfHM@^-2gQWOGPQrB)@@~6=BJ<1Yi1kGcqfV>I)pu+ z6 z!;j+H%rrblprS`L!@&=(%OJ@Ecl~RGt}4XTHZ*oycUY-<+2T(>ALdS;6z)Y124x!Z z^Ls}JSyvUh6Wrj6bwBx|csZzL4wn7?vxZ0DL?A(IZs9sk;z9aidh6lfmzcbzqr0){ zw~&15kKYS&T>2OtHb>Va`Ab>6Lgl#&zENmiCQvb6nf%x;+7r53Td%;#bEb7~_;WZ? z0$>HJ^B3Px@c4s}ui{86c=Z6EE&s-au-L<5#ab6LP8hZyo00B0^pvMlOdeut@jN=9 z&o>HPDHV?FciJBIT6xU!h2`#XJYTLUtV&@{nE%v%^E8n)Ld&pKDCO76phW7q*m&X; z03rAFN+p;(sW+JO+F5(wu9~|eaLi1w|PWG}CIfM*oqIAkCzUv;} z!3j1NuQ2HyzmVg%eeNDTl3~iRt9R#HNE!PWeAUVx){?D_(o=Bkn6YYm!a`u@$We7* zncJ$mhgxvBUXC|=^I?&VS8AfiFgCuyl{)<0>uUqDio{$ssoBjX&rSmyPIqycq<*V` zHu-M-6iY3gwT|o~hNhflzga0|q}s-#wt5E2ld#1`*l&|x&9XmEX@aGRhoKY_zOmW% zg9s4w0`GdCy1E?hW&ONvLwFfFA&l8g{aNf3m`S3!4Q!%bXero7XdaPC8+_&_;(870 z;xs=wBI}if(2v4^6h^Y_AI6=MhGZgBI6ZIkQZLW)5fF{#|&Rj?rhbos^&ogOyKPr1+a z1Owb`AgKGT<`r2%!!tn3V_(?4@Qs4j63?f7+Z`_q#@Vj(cV^2(ou;d1`YYc0KkX(9;ztGXC_c?BM> z1=JeU#tmA{RKk)s*`^O5_V!=BZjTgt03hGGNij@ht;E))k+OD|&0m z1_!+A)Ns-6aEhYZCD~&joBvT@;51{xVI=z@a1qwP$W+bxcl%Vqo@;?XIH`v+oaIAU z((Sk5eo=RHzVMx1vZ9_?uILictJ6UM5E$)C*MdQ*MX~5GBm%+&$E>DSv%~Yl3?8Wb zN8X`}ATXX~j1?EWMu333$K_7(;w>V(u#uW|)R}BJI}9M$#9F_%6Dfkx@&X$!P>+2G zc74_BZq>ZM6P1a}p Date: Thu, 15 Feb 2024 23:05:13 +0100 Subject: [PATCH 607/651] Point launch.json to new build directory --- .vscode/launch.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index d93fddf42d..7c5225cff7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Desktop/bin/Debug/net6.0/osu!.dll" + "${workspaceRoot}/osu.Desktop/bin/Debug/net8.0/osu!.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build osu! (Debug)", @@ -19,7 +19,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Desktop/bin/Release/net6.0/osu!.dll" + "${workspaceRoot}/osu.Desktop/bin/Release/net8.0/osu!.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build osu! (Release)", @@ -31,7 +31,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Game.Tests/bin/Debug/net6.0/osu.Game.Tests.dll" + "${workspaceRoot}/osu.Game.Tests/bin/Debug/net8.0/osu.Game.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build tests (Debug)", @@ -43,7 +43,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Game.Tests/bin/Release/net6.0/osu.Game.Tests.dll" + "${workspaceRoot}/osu.Game.Tests/bin/Release/net8.0/osu.Game.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build tests (Release)", @@ -55,7 +55,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Desktop/bin/Debug/net6.0/osu!.dll", + "${workspaceRoot}/osu.Desktop/bin/Debug/net8.0/osu!.dll", "--tournament" ], "cwd": "${workspaceRoot}", @@ -68,7 +68,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Desktop/bin/Release/net6.0/osu!.dll", + "${workspaceRoot}/osu.Desktop/bin/Release/net8.0/osu!.dll", "--tournament" ], "cwd": "${workspaceRoot}", @@ -81,7 +81,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Game.Tournament.Tests/bin/Debug/net6.0/osu.Game.Tournament.Tests.dll", + "${workspaceRoot}/osu.Game.Tournament.Tests/bin/Debug/net8.0/osu.Game.Tournament.Tests.dll", "--tournament" ], "cwd": "${workspaceRoot}", @@ -94,7 +94,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/osu.Game.Tournament.Tests/bin/Debug/net6.0/osu.Game.Tournament.Tests.dll", + "${workspaceRoot}/osu.Game.Tournament.Tests/bin/Debug/net8.0/osu.Game.Tournament.Tests.dll", "--tournament" ], "cwd": "${workspaceRoot}", @@ -105,7 +105,7 @@ "name": "Benchmark", "type": "coreclr", "request": "launch", - "program": "${workspaceRoot}/osu.Game.Benchmarks/bin/Release/net6.0/osu.Game.Benchmarks.dll", + "program": "${workspaceRoot}/osu.Game.Benchmarks/bin/Release/net8.0/osu.Game.Benchmarks.dll", "args": [ "--filter", "*" From a9eac5924de12073d39e8c9b2b57f83be6185de2 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 16 Feb 2024 01:18:13 +0300 Subject: [PATCH 608/651] Remove seemingly unnecessary float casts --- osu.Game/Screens/Play/PlayerLoader.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 6154e443ef..fff1118622 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -550,8 +550,10 @@ namespace osu.Game.Screens.Play { if (!muteWarningShownOnce.Value) { + double aggregateVolumeTrack = audioManager.Volume.Value * audioManager.VolumeTrack.Value; + // Checks if the notification has not been shown yet and also if master volume is muted, track/music volume is muted or if the whole game is muted. - if (volumeOverlay?.IsMuted.Value == true || (float)(audioManager.Volume.Value * audioManager.VolumeTrack.Value) <= volume_requirement) + if (volumeOverlay?.IsMuted.Value == true || aggregateVolumeTrack <= volume_requirement) { notificationOverlay?.Post(new MutedNotification()); muteWarningShownOnce.Value = true; @@ -580,9 +582,11 @@ namespace osu.Game.Screens.Play volumeOverlay.IsMuted.Value = false; + double aggregateVolumeTrack = audioManager.Volume.Value * audioManager.VolumeTrack.Value; + // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. - if ((float)(audioManager.Volume.Value * audioManager.VolumeTrack.Value) <= volume_requirement) + if (aggregateVolumeTrack <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. const double target = 0.1; From d81b148b099e56f1a9ff8d7a20d282e7b970d7a9 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 16 Feb 2024 01:23:18 +0300 Subject: [PATCH 609/651] Remove mention of decibel units in comment Decibels are irrelevant in the volume bindables, as mentioned in PR already. --- osu.Game/Screens/Play/PlayerLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index fff1118622..c755923ace 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -585,7 +585,7 @@ namespace osu.Game.Screens.Play double aggregateVolumeTrack = audioManager.Volume.Value * audioManager.VolumeTrack.Value; // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. - // Note that we only restore to -20 dB to ensure the user isn't suddenly overloaded by unexpectedly high volume. + // Note that we only restore to 10% to ensure the user isn't suddenly overloaded by unexpectedly high volume. if (aggregateVolumeTrack <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. From 5431781f80692d8fc36a5a301126148b00ca916c Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 16 Feb 2024 01:23:26 +0300 Subject: [PATCH 610/651] Bring back target volume to 50% --- osu.Game/Screens/Play/PlayerLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index c755923ace..d3f75fe15e 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -589,7 +589,7 @@ namespace osu.Game.Screens.Play if (aggregateVolumeTrack <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. - const double target = 0.1; + const double target = 0.5; double result = target / Math.Max(0.01, audioManager.Volume.Value); if (result > 1) From 6751f95eb648b42cdb55baa83efcb07a757ea9a7 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 16 Feb 2024 01:28:47 +0300 Subject: [PATCH 611/651] Adjust test cases and approximate equality --- osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs index 67e94a2960..02a0ae6e6c 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs @@ -268,9 +268,9 @@ namespace osu.Game.Tests.Visual.Gameplay { addVolumeSteps("master and music volumes", () => { - audioManager.Volume.Value = 0.15; - audioManager.VolumeTrack.Value = 0.01; - }, () => audioManager.Volume.Value == 0.15 && audioManager.VolumeTrack.Value == 0.67); + audioManager.Volume.Value = 0.6; + audioManager.VolumeTrack.Value = 0.15; + }, () => Precision.AlmostEquals(audioManager.Volume.Value, 0.6) && Precision.AlmostEquals(audioManager.VolumeTrack.Value, 0.83)); } [Test] @@ -280,7 +280,7 @@ namespace osu.Game.Tests.Visual.Gameplay { audioManager.Volume.Value = 0.01; audioManager.VolumeTrack.Value = 0.15; - }, () => audioManager.Volume.Value == 0.1 && audioManager.VolumeTrack.Value == 1); + }, () => Precision.AlmostEquals(audioManager.Volume.Value, 0.5) && Precision.AlmostEquals(audioManager.VolumeTrack.Value, 1)); } [Test] From 7530b1f362451eb18e6fcfaceb5154f4bddddac6 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 16 Feb 2024 01:31:52 +0300 Subject: [PATCH 612/651] Adjust comment again --- osu.Game/Screens/Play/PlayerLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index d3f75fe15e..060074890c 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -585,7 +585,7 @@ namespace osu.Game.Screens.Play double aggregateVolumeTrack = audioManager.Volume.Value * audioManager.VolumeTrack.Value; // Check values before resetting, as the user may have only had mute enabled, in which case we might not need to adjust volumes. - // Note that we only restore to 10% to ensure the user isn't suddenly overloaded by unexpectedly high volume. + // Note that we only restore halfway to ensure the user isn't suddenly overloaded by unexpectedly high volume. if (aggregateVolumeTrack <= volume_requirement) { // Prioritize increasing music over master volume as to avoid also increasing effects volume. From ec85bf0ae66cf0127e5cfc7d0f231742dd87f8e9 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 16 Feb 2024 01:45:30 +0300 Subject: [PATCH 613/651] Update other VS code configuration files --- .../osu.Game.Rulesets.EmptyFreeform.Tests/.vscode/launch.json | 4 ++-- .../osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json | 4 ++-- .../.vscode/launch.json | 4 ++-- .../osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json | 4 ++-- osu.Game.Rulesets.Catch.Tests/.vscode/launch.json | 4 ++-- osu.Game.Rulesets.Mania.Tests/.vscode/launch.json | 4 ++-- osu.Game.Rulesets.Osu.Tests/.vscode/launch.json | 4 ++-- osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json | 4 ++-- osu.Game.Tournament.Tests/.vscode/launch.json | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/.vscode/launch.json b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/.vscode/launch.json index b433819346..0d72037393 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/.vscode/launch.json +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.EmptyFreeformRuleset.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.EmptyFreeformRuleset.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.EmptyFreeformRuleset.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.EmptyFreeformRuleset.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json index d60bc2571d..ec832d9a72 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.Pippidon.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.Pippidon.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.Pippidon.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.Pippidon.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/.vscode/launch.json b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/.vscode/launch.json index f1f37f6363..a60979073b 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/.vscode/launch.json +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.EmptyScrolling.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.EmptyScrolling.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.EmptyScrolling.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.EmptyScrolling.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json index d60bc2571d..ec832d9a72 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.Pippidon.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.Pippidon.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.Pippidon.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.Pippidon.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json b/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json index 201343a036..7b9291c870 100644 --- a/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json +++ b/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.Catch.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.Catch.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.Catch.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.Catch.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json b/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json index f6a067a831..b8dafda8b5 100644 --- a/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json +++ b/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.Mania.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.Mania.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.Mania.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.Mania.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json b/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json index 61be25b845..a68d6e12c0 100644 --- a/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json +++ b/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.Osu.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.Osu.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.Osu.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.Osu.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json b/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json index 56ec7d8d9c..5b192c795b 100644 --- a/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json +++ b/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Rulesets.Taiko.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Rulesets.Taiko.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Rulesets.Taiko.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Rulesets.Taiko.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", diff --git a/osu.Game.Tournament.Tests/.vscode/launch.json b/osu.Game.Tournament.Tests/.vscode/launch.json index 51aa541811..07a0db448d 100644 --- a/osu.Game.Tournament.Tests/.vscode/launch.json +++ b/osu.Game.Tournament.Tests/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Debug/net6.0/osu.Game.Tournament.Tests.dll" + "${workspaceRoot}/bin/Debug/net8.0/osu.Game.Tournament.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Debug)", @@ -20,7 +20,7 @@ "request": "launch", "program": "dotnet", "args": [ - "${workspaceRoot}/bin/Release/net6.0/osu.Game.Tournament.Tests.dll" + "${workspaceRoot}/bin/Release/net8.0/osu.Game.Tournament.Tests.dll" ], "cwd": "${workspaceRoot}", "preLaunchTask": "Build (Release)", From 22ffac1718f14f8509d46be93923a5837e80157e Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 16 Feb 2024 01:45:38 +0300 Subject: [PATCH 614/651] Update Rider configuration files --- .../.idea/runConfigurations/Benchmarks.xml | 6 +++--- .../.idea/runConfigurations/CatchRuleset__Tests_.xml | 6 +++--- .../.idea/runConfigurations/ManiaRuleset__Tests_.xml | 6 +++--- .../.idea/runConfigurations/OsuRuleset__Tests_.xml | 6 +++--- .../.idea/runConfigurations/TaikoRuleset__Tests_.xml | 6 +++--- .../.idea/runConfigurations/Tournament.xml | 6 +++--- .../.idea/runConfigurations/Tournament__Tests_.xml | 6 +++--- .idea/.idea.osu.Desktop/.idea/runConfigurations/osu_.xml | 6 +++--- .../.idea/runConfigurations/osu___Tests_.xml | 6 +++--- .run/osu! (Second Client).run.xml | 6 +++--- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.idea/.idea.osu.Desktop/.idea/runConfigurations/Benchmarks.xml b/.idea/.idea.osu.Desktop/.idea/runConfigurations/Benchmarks.xml index d500c595c0..a7a6649a4f 100644 --- a/.idea/.idea.osu.Desktop/.idea/runConfigurations/Benchmarks.xml +++ b/.idea/.idea.osu.Desktop/.idea/runConfigurations/Benchmarks.xml @@ -1,8 +1,8 @@ -

      u-%Hs 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%0A)gfldVW&|CqQnY^AyASRe;j{G;CxSHvf;;W` z@K+*J8SJ2Smz0 zO&ls#H$>Y|6Ju@trvfjE62T(4?6DDCR+fLkR+lf+u2}pQcp?+3yto)0_|~3~KNlEFr-d*PCMKo-BG- zYX3VuVQ-idH$RnlKim&=s}tr+mnLoT%}O2p5mUeQ69{(?sfy>k=}?Feqjr{c?MlRD zJ{yg(gQ@rFlmE_{+r9W^Rp;e`Gu5T#P-9lx(dA+}^-nLLX8D1BJfq%E52(}X`(xH? zmDOkSIXPAkt-pV37jVT<4a|e@yFB9AhQ=}6Az)IM$sA^q++35pc}&Ls!0=d(o?zwK zKEQN?2Yo?_?*RvW<_|jjy@I){X*!q{bdQ9GgXpgSUa9L!Dh0t3dCBL;u3ZZw{(Xg` zKMuQ`g`MQNVSm1&I?Y)LLwF1td3Z&9LB8!CMTA}LMQ(MABiXeZJ0rJK4Cn!Q#XL}a zU&1mb4s&7X9UOKv98`jcXO}65k3&5Ks_|0{VWI?k+@)g3lvl4kxgyE*+`6D$> zDhUF&keG)5ijTL39C?1+IODL+QlwVwpa=*MCtag^BrNhTy4`mjWf1ry#~?IgfGx_? z`252IEnnOOEdDKp-k~1sRPWRfd1^@asa-z$g{fX8b@RQgzzz>*Au78UvtOZjF(W-c z&UOH(r);w46=`+(PY_oe>9@Clm6&KO-b=>etwk=&+?NMk_9h@MptDG!F0}I^_|pdZ zf+^_EqW|Z-v-9c_d7GJsX063N=OJF&F~GL z4P=H8Z9t}$cua@{&e&c7$#UeNQH5gh9ObWur`KL!bU*v^gduLA8_XCdu4cLY8r$nQ z!$$^`*n~-U18t?DX|rrj7vZ~L{zArA&6njwuC}XOkW=wZa=g1jI~dmkX48Su@LLY? z!JrfXFJrGW^%6EzglA#uZHqksSW@{`T)h5G15JOj`-^^_lcn~K_brkfsijiN^Hfo7@My>gQF$iCiRIH@LhRFH)jzio?Kb_9{NKh>A5 zkYx9x4b#3qS;x?@&jCH%)QRz2@BZ8mk&$_MDNP$KF`AnVe$1T3`|=+pHGBnRv)a!> zRtn3~A~H@Mski2MjutF#^zYWbN!O=R`=oKVi;d!=)Wky}BH_N`ihlwP{YYz~c z4nj%JyO1<$Ac^X+zVCiM0b2#Tjp}+F_}4_POXD-umG5*D-z%C*_`^>L)F(_NOFNat z4s5QR2$Yr`~=g`@+ARl&$hWg@%U$&h@%Cm)w!hwbM}EiEzth)m%7Sl5U-J`84( z^`+LYKD6Gv9!aR@ZhEVKPWYtS=WJ9ptU{}lQM<~HOWIGd{i*opuP>6z9DCO8h()Pi zM4k>EK-1?8UzGnCT|S9B4(7SJFWpI^eHtsO7OK;UAfETOXNSmF}n9 z`?&U6bVj^XPbEl$hpI90McXP>=UvkL!Cv)qSsrG)xJX1N3YM%*4^%bv4e{YJ#80i* z|5lhN@o>NaWRqa@ zy~EL(^%3#O%NO6bSRJ(;dt-ZLm!5lH>5~^`dTCJW)Fm%Gq0w4R>1tAp?RbE>F+~q- z8IQYP%3vS{IXip1#!of*E6#of-K!|mB|$#<5Z2d*pIef7_R-dcRML;=L$2GqX;xAk zpPG1*mg9?5BYu>J_x@HUzTwK>G%)eH;XOFjd;f)V?}`!A%9v6`-DrzI8^%M8$3O;7 zB~4h!$ohGJK2h&5A`QqgGT%g{@yRVkRuAE;!dWZTwa_Oi;9h!Ciu<%n8_<1Zf!9W! zsBlJbYIMe%-p>@kjK=f5>6%US`lj{uQd7%FS+S$Ve;u~1pK_Mry;o@eja+ix-Mx*w zglmmtxeP8oIH7$fmgl`whp{*;FY$F)xaZ~YWiGSUgwC6JVx<6niFwlZuVS3Ee(iBW zdO(&9s_&Ea_h0YlnS?Y%tbH4lhi@;DS6DG7Z=wRRX}?S4Ut5`-y>x*auI{HSQ+n7J zt7?s6@AiCts;yzkH2Ul$;&h^pLEuS)P1dhv!D@ZRJ5_M!7uz*a+h1?Y*3ZqDshkft zNh30T5qbWgX7puS3m|zjZ0q!I0SpXr8KmLeh3)nqjPL;^Zxt(gYeRQ7(o?+TZQLe ztNQaAe%k!FJ^-k4yACnVJk~z#MU_s&doPhhJR_6)j118PUy$1ah9133Tnb{ra4Y{% zkMcV(NU$f2&Z8sN<)+X)H*gy=|3Iw+RX{@pCta8tSi8#nRB<$T#L1zW#z7{RcBFE@ z7Z-Rrvt7D#)rJ;U@(Ou8yAdz=AKZ`>U3i|Gnl%|hYlB&Pn7mTG84~J_+A;sp!uvuh z^I=a!{mvg$&Hms)e(8Qql}#Cn#%$DYq!e5a|7dh6qAS80)_V7rEZhA%ArGIwOF5BT z6uUHj{n>q`l|h#RqI5pbNudGdjNxQ;c!NAzCVG4XvhE2E@h`Ic=@*Z?TvL zG?WLjL79@Y1KnCZ)~OYDyl~5`Vcikl6s5`LB)+bc&LK2U)+MVnFdUl;bb;cB zx5F+sI!Sk3$$E6EHkZk&&LFET13v(c*KQuG&`uo!TJ|ERf8cIG48;U7hvFJl;NBrl;$if?mmz--H( zWXf8|-5H2kot{8dyB4}xDpli$RK`XWTe9vb6Uj=t)KwyFor$H$;do|fYB zo0|mzT-Z62%xLxzKTZnnnnZckM^!|LnE_MN!tIAKI@3~D`m(;!&n?k-waD>I#Tu!yHA0T5t za`CeqMwaI8oKW14>9f|?3IL$$?KS9R%2Z7MHBk5mLTspkew{=UUS1Hp!O~&G zj#W5y0L^m7mPZtB0wPyus{qV+;0Ku6bJ1DRHbKTL5``^CENbx>6IS98SUx2&K>D}{ zV?$4--QNgiF?^<@#GvpbFRT=2pcNujn z9WJt;IE(?XflzHx^C_YbDGZ)pUA$MkH3>TI^xjzkXE2Z?fC%^TpJ0b&N|NpN$t3_u zCn*4!lTrdedskE;h(mNt53yHoSw0QRV8ypd6cFIV=9}wr%uV~L=QOL@h|gObvQP&h zLb*OzL`j2z?9lnXG{Tnsv7*ugyVYV+1^X9bQB`8p_{KQ9Q%_L+9Qk_jrq}e31S3mR zkI_I5iVrU{BqmyJ_0S1d>Pjh`AyzkDZrc4K>ovNBMp2ftcMBhTS+MSkl2M%<)ZZGa zk&eZ3RY}cMc5e#Rr*1bLjownjvXDLd!?Zf!fnL*62z#EEF{H2zxGY*4VhW@zhlS344H0~0IIjefjfJHTxlljLVfM{O3*NE1(a81qcA+gc;AhzHG zffjwhu`}~7{)hv}L5&5$H;KcwgxGmHmSW3jbF~?lv32#b3bmUVXi@K?qnFcR zLf&ef5H6`lXPV-7;@pb-miCt9KLw3LZ(XfmKOtxK;2<0Sdzn{#buT2wBiC>Em-Pme zw=4#1uW@dgw`%UL=Rve`9oaOe%Vm5R_|zhztD29)7o;10uf4hYNI2g)WaQ&c>aGZ=5<;3gaC0y9VXfJ7)R<41RLC%bUdK$Jki?14=Z}6% zCRHU;zP66-;M1r+lRSm{ELJF{Jr3_erp3!7xJbAUv3uEDD{GKnnZU`@rSE>Ms62|n ztj8lOwG*x`}bMSXDH-B?#^-=tPkz7@qUZ%>-TrT`Y%*-Rpgov_b z#Ob{UZ;ghgz^$0Y@C`!+jnj)32>_`cNX(X4sG9*ldIO_h1wXnGEa8yN#LeSe9_59# zp@ZI}wV5bv`*AO3;SCT)oW^d&{M#(0YZ>Xtk_@eS+K{|-CmI_+!l%g}G9o@_IJj`B z7%n${k_d)Rs|8i;J|zA?F^$RchMj;rF1!Zf)%?*lptj+W+s5QySdOZ5)d^!h7K+bH zSCf`0A!Z`Yu30LH`nHjC)Js$2Gyp|El^q0+u-X|1Lm7z^tk= znW5fIfqxg}*d%UyLVL9cZ_W5H``dzSAu-stSdagbOju5cR#5wl(~VPx900N@=>Z@( zPF(EM`?P6v+w5c_aS#QKB;ck6zMhx_{e@1^U>6$kr!|KA8@(qDQen0cg&3et3X|0VEA?4~4M{K>XdgI=j zdS~c-;mkQs>qi;dGL`&*$`+G+D^#{DmfXjtN6G~jQlAEB7Y%QiDugbk%Z=`)mj&@6 zS{<7BI*qhh)XeL={LiYpqXHB8XXEu2wC|$BBs#p;$l2u6l+nmo066RZL81YrYCr-K2 zLs>Q*;!Ea53uEhqUwO)Z!}gwd2(0)E$PeYWXg$_0@tb@Y5fS6^io@*qd!)l$QXX{N z`q@uuvue#>ZfCoCsP@F&8od%mZsErz5USs~)3Oi$89)0};Qc1?DN!!YhG}w+UX&94 zXiYPE`zY&;D|M`q8hz`VwLZkg`oh0+2oLLEtecmc>cRQmLLEgOtvkOkl|!}8&Y8I4 zO}qJz^ng`-o`FULZKHPB;{E*k_38(DikMu#Mi$?*doqbE5ZU1;we?gh>7_ z0|9?T=P3bzSNNJSDusTCd>~n-FbFd&Hi6f75E0nLCoQCOL>Kil3+%K_z$}d)x|EF( zvf7Q$6Bv|UCLBXP)4vIQ<10jXl9_JQn&%)a0a6PccYSN|&<)itf;(JTH`L3!td4JL5e2U;vmBwkCi(=)VxW`!CiIrm@erbu%KmGt^Sp7_*UyFqW)~J zf?d?AIu;pd+{fvM%R}7Jf#+JChSDcwx!Rmwg3$}?OCXD=1MjN#N;uqL4 zJ>tDw$RQ}P>B5r<7ifd4$=|4gWQ~FAUp7x`S0aOu)4NH2XS4F_5mcEn!^oqGCzpAx z)Jc87_fd1&r&=ucmOhinzREunwvurwxwTn(=eYAqEM__=konI?Zp}LAblf(9ql?>_ z6xCI|{vTaseBbcY^jQoul?u(vR~t6BsLhJwJzDnFKjnXW8v1+RgT1?DOP7RgXUbgH zGu|jbJ^AD{r8d|`+DC0ug`$Y&+jMvk*mgZAdu_1F_-VX^v$@iy2+{*pmnq=FLZadD z`Ax~|ps}6Et1s0_Mbn4&^rd#di!ifjrT)4X51;k&==Y(;*EXH0lQ@~X1ohc&Ma}$> zs9{o2_b7oJxKNGOM7pys1&&-w!;8SM^VnM7Z55TXX3Mu6emjG_f^EC+aOWOl)j)9$_qZRqvik&8C;{4F?8y5k`gZoaX+(4_oRH3RR`ce;!<945p&~Lmw2Y9TXsbe8yRc^rkwl$fm}(ywY9HjA_}##y#E$amW(h zcb->Gvi%vcWplEv{3lMYU{|CgJo#9K`LW+trZNF>+MqoYfy4X660P47oGp3C zv9&wvvb*69I>t=sXG17~;3AT1&acbV@zQed%y$)!CK9MN{~j#H9T8N&p_{^cufIN} zhb_LMLfw6DJjfWeRR!m4qM`%Af=f=&-BAn|-esk<=svFoJ@v{>pUTnkN}XJYj{xqu zoA5i4iOeXKP>a5BM}s$KG4EnJ9@Aw;v@)%F;s`qTZv=wAkIxpP~!E#Ic?ZOBA@! zXU;b_3Qeqa(6WtR{^zf+O& z+i-%~vDa6WeZPAFO!^&`;pT&H?-kJCt%d=^QC(2Pd|PhCIOEZ%u6ogH`nS)jO=bI= zg*0wtX?E#Kl~i|)-gB7dzU3m{e6j9zI#f&;xv@NZK1({|4nadOqmyMXwoc&0Aa)83 zg4#8?Tm4_B$&QLG6Fx>CJN)(E;9*}Oc6#^n`Hm=gUCthiWT;;W;=74Bm}%hAkDG^g zXGC|2Ypy8BxugFjKKeDP4c;``ip#xuS)G@3gq35+H|W`?^f(X=QRLKT(PYhFPV4^l z-K70AI!Bu~yW()Lt?r{mvdmzZez-PuGUu(8k2*reVtih3pN_gE!*uCU3)Bv3t+(_< zWI~wgDm|h9Gn%=BEsnDP!2G_+F#>fVh?S;6B?k-q*pch~-FINy+9Sbt0uQu2!-(3W zeVKkUUFhhyC&|w{1Oec_49+RT zO>4CR%FQ24U_TsMh!Lw7T?kGc?Vwfip&pRgTDDho@XGXt@R+&&kb<#-!A6A zd`h#82^dMb=RfOj{kV6b;R%>;({4KKE%)}n%R{X*2cJu7S=XgHEdZ9vQuMnk3L`e?q{H~peX>~?rR|SuQF34r;(BQj&>l&ZPjCt4MFgukXd2|MV{OU3nnCAAjfVsk?)T&p z)@1#%+-I|Neh5@80eZKe^czF;uRk&V4}%1`S^gmi({p$`4flSMHZ!|l<%Tyl<7msX z`Igr4knH!t(@jc9cEm%E!6&Dmh#2_dwn&J-r-slZUWOC^Zg9|(001xZy|lV$5iHi7 zQ@Sb6JsByDYeN^Dz_IW8_76HvpXiUcbYAXlaOJ+F#_Og_eXIKF%lOX0E9QF+f zA49u52`6hnx~`98_vQ*c;}f~O?9C+`3Hgzb$xvJJXm+LLNxB<5Lh^1budVJVucg0% zh-lbnx5i&?AY_}qef4tWR4LZQm+gT|7K?VYI?qNoG%9W9>rbuG)v`!K1XxeV6Bn;^b%08I{z1@Sr{`;aTzl zw_~#7Vca-_UVi4+!*#lh&D~GL-%9gtPgo@SNs#Atm7_0^SO2k$e^--V79Wow;Uoiq zo$GUk?XUVD-VF!+0fpd&0$kIUjj3#*u1DQXA zRCZRMDH&*o7Q`P8?r<$e>I}0m_0CAXdi>nKt%lkwSc*dkr~W7 zLfbA`T7%{rBH)Z$l6Gh7syy~T@^w?LIFxb{{gLeY-tk#_(;_A8y}avg)z0iW^Rz&V zb@YEl8a;`Di*=*UeXG)x@uSFwE482Ec}^0ESS0hRMbW;f7_HB{Xd{RFZ#rBM84nz} z!k3>cb827A?-eDD@#V=sx3T0j^dD%)ckgT|Lm3stF>mIVqLkHpiANxHc6u?R4>Ee% z0ATm`8iiiceY@c!fa8nQ^!yIH5xt-^vqS8LT~uym5!V^}tloceLC0?u_n6EU3j^%) zGo|>?H0bD%{I?GOU=4Mc{lRA;Htdae|3W2#^FH43UW9BQ?j;ln>=dv)HZR-4h;}}L zUu>W8mhGLgIX4qjv>(t|*tQNsPNNw_`gY2u20L>M9h9Ukg(Z&94Eau<`sbb~I^@do z2c~e%Kh{mbSv`Xp%D1APzJz|@l*kRVkS>Lx6pIFVf0z(6{`$O6qPX-a$XMTrQ<5m@ zOF{VP&{qndpUSRJ|Gc~Np6D=A3ZqTnNE#GwmJ69qcNd(F8{gH&{#UV3g*cj(&pmZP_sS_vdZm@ zxOT?7^dy*(PDYT?bj6WE2vv(Z0N7CvkpjR=c{im+P=x%kuWC0MyNFSrQ>wV9Qkt_& zT=+y3^22cvU`1L)4x;h?-s}ypFB7PjN#G1r5KG0BPi-8>uVher;UizJTWVk!VfI8i zv}Ubt=s{Eow`foaOyKeuf2m4M1NmIG^qM)!9R5dcS?)WO%6Sr>raIzSKfc2jd7o3c z<&o5Jrd@=;6* zT}yTPM>b!0FCp(n~ zos8GIxknH|_&{RE>kAjxLiIwyLl>wd==|#7GAfu=9z+I2UYIM8zC1E9-fh8%rRuEp zE(h2P^h^dMSl`NpZU>0IPkprXgf)_Wg8WOl`MAjZwEn=;!P=_N=r0aE7)0WZ@uhI+ zfBw30Z;hw8n0w0A{zZ=ng9Estm`c*hGX|CHZBr?oCkiD_RlcF?4jNAb9JjfK-=iNC zuHV*SIGuDE`n7IG6~2iz^ZCK8vhX-}N1{@E3+>f@|JGnOvs=|E&t^bn8Gg|B!<;eb zqHi&l9n)g5T1-9!(*oV?AMVkVEEEjDueJ^FJ&{nh*pCG2cp2QY5J#n;+Hf~Z1%NTK z1+&;Nek(!M==y4)70kRDamicoW+85pOHhbw8!Pe3b zkGv!j6V6{cyYA$DNjISfghB+e5|>b%$~N_Htur6SnzQ5U&HwOshf_HJ1HCspnEZag z6mS3=;d*UKpV9S$T~gZvro*iJjEzt97{9%z1;P7%kUH{zS;Hmdz)~Q((-+7bo@%UF zS_GsYRi|&?#cr{Fg>>8_=1hZ>Q`abin^F&u;A*raMmJ-djb7%*u6oGd7aWqV^S(h^ z8%=+p4P$3Nis-I}f2r?}K_kf$f$DZKrnCy4m`Bx*(4uzpN!AQ%0XiF2~LS8Qf$&k@KD9RFSxQ6kv9rmegiiR#7 z5KpIc$Qt#7;g+rHJYPQHp1s160qsBj$0-F@E~Nu^jB{0V1n`@Bo5K$ezPha(*Psie z37=p(8Hg(@>H~4l*-IC(+#g`E6?La0@NR&Eh@A-YR9=>ks&m}=kJ|+%0alF|*M^h& zc@Jgh1XroXuM1xq6Zbr2lfbCdM?+ZhuMDh<=ma(Em`7^T4I&-MJ~-K}tKqgcGEL`E)m{_x@-9*K09?{2$Y$Vj*Vy#zdR9@q5as zxh4T~wEC?lZ_#ztJvNbA4(hc6+cC#umqUZ^Rzp{0OGs~&;@^KtVH529V1=!7K%^}L zqktV6HST;o8;xs{qpb=Fj-;=RCJ7;<`@&;9cKwI5c`g8>b7SQtY1a)dh7-Jm;U*#d z(uR)dJUwIpKpz1Bz>Tm|p`sJHkMF@Pd(W@xY_W$^(L`|2wpqZH0A8vMw-75-3OAY+ zk0v-h2KAp;vf{(Hu%GFO%E^KwF35kVsS^_q+IxX{{vo+6Be}LV?EglGTjQ=EOj}}S zGCZR6SFLG1#KvgMqOo@}-_NJUX)Z&~m-!X3-*+G%EkpixCB?#s^Xxy(HBPN&7>3TiWQ&h*EtzaKv|<@VHi=$fz+ znpp2fo5m&S-_{y)|2FKvy8yd%z8ZG4Ei~LfJSnz?-Py}+&Z{RePQ+IDw#6c@CM(CL zk%T(G{f>iYhz}%y9sRW_{ajlmijZ<_RNNVlujt*Gn z>i!Nx`mq`2EYHQ_yG5Upes7>oiJH|GEPv%Ee++yp_FU^s+;sT+8mVUVV)Ju&s&`E z@fwpp1KN%bQT^nvq4B3aDH$0D(i7s+pQ_OhS(okqE3_HS5ipUsgZyqZ-JZ;YI7S;! zmxc9rc~@7Y8Xh&!GxN{-RHFXs*23OC6LBl0nSQ(4!*KU=fUK-!lE`gELYw6Dh5X2m z6T8|1`6={XMFE}d13eVzO6S@^-MYHR#UiL1T;l>SD279uPawExdJ>>r?tkwd_;tdL z&Dnc|L%;4Ox;6aOohKE)!gipEe9fm54?x{%th<4WfoO#qCKADD!p|klD$#9B-I>X~ zlM+Wy;?yBS%FG&vIn^`C-r0<~AGP(XxOJ+W*sbAdili@Y-~eqO zL>?=VO$9fFg~!U@lcehyl3->HYh#BDpOtLejRmlXE>3G-WH%rE{*%4`c&K;9+{U;W z6EEI&U={nqMmtSi+93Bzn7aDKD(in@KF>C8P29sWoFO`8zov-}fLwZQSxdfq$KRH> za_Sv@t;;^EEB&5s+8p}#A9iZmT)4{lQ*y}T>9)fkl{E;*;)RmuGwPK^uCRqYkd3cw zB$eZd$Sz7NEXD8S+Xn|+suS$_uJZ82EN2>!c6#7C0eNjk=)QCM2Mz1s)@!(}xzvVP ze2>~#O#m5tI`4?_d={rQzxV?H8rN6iO?6@$^({9+Ey@jx0cCtA$R{iCVhr}gme??1 z)A&y3LEyf{#DStz3vux$O#wbooiw-`Ik=6?h=#7J5uracwg7AaFjkOJ1v@&GkC2mg zJ-;=B{$U{RnV~w{)cdrn3~wA}pAad>fvnD{HGQgPo|2ISHeAyqZ#m;OKa_Fde=6x` zZ$MM1WT}UE-*smz33>slqfcQO z%rDROxM!7Iq9mpqz|?lpHN6=Qx{OgIbsbC$ZaF~ABUEkyMX<;T>O?dn00{n1w12#o$bb$l?PY^=k2GB>Y+kCY}&7FKH5Alk4xP) zv9R1K`1UAUa__~SA-wV{LVL^O^}6`ZMo$e*J<-pt&x7Zo!T>~Xx$#jRtFSVzRP;ZD z9Qy@vP)&GBd`fGo?P?+Rv|JCVFAi>t{(#GSF{=S$ z7@D5XkVmcCT$2ee<&X=HqN0%7xn^Pvn7xN=9RyE?n z%^J$ktidZ3%;vld_Muth;deCLWZFMYh`7>Umh5|86YpBf4)`t6C@3*{e0>;y>hBYaG+)rF0TTjoTQ zpo|xZ7#TUVH7vp1JM(4^>M@%*NE( z4zt-PQ-LjZJF6TnVBH)1?4e1wd0|EWPxVQ()T{609T>XP&;YG1(;&t=lP=e{i;rI!K;z@aEcGZt~YG$H+rM zOX3peHgY3{?D&}J%H&o4p(n`rxzCc5s%!HHZQqY6KDCWT%GAOdv2=S`-(9m>O~}_d zf2B{C21k*geHk`%1_pJECIz1|g*P2O?t0}(f3MW6`>lV!)WD*-EH4`cT%{qmBveQ! zozBo2W3=frwND)yMd>zmD0!`x(@M%^OtSe&yP~aVyag+#w_3!sb@k z$dCsn4t`Mxm2Ar6u)PktyWYsihHl1}bF#GS0_sXGqs^f{AX4y zUh|gL|Iu_7UQM`f8y|?I(h7ofx3uIaX_$ZtNJ$AwN#__UA=2GU8l<}!28~R*87VPf z)EF?fz32No=lvI+=RVhSp6kBO^(j(`!jvJn5N#if^`k$_dBrTx;G3ahH2ujJ(E;TV za;v(#+8gGf^-sKoXB#S98##ey-=&2`1AMMKQGeT2v5dVA_9RcQNB4o%*2Vxy;@{Ou zEZP9TxBt2$0iX9y=Nh->JTtC#Pw}AJRYYkV2*@yqH3%Y%!zAwCA)mgzo~SgUcUAgs zblAWGJxsFJnNQfi+|B6P9PgEkWkv@1-~4vf7S~{qe7zV=N&M_`@-0?0_;c&3Q`=_5-j{&_4$irg{%sf-0SHj^O?G;&plXfo8Nr*HzDV#$LwID z7BFJdL%CV2?Vwg0d@fYebjZZrg&(~ZxHS2&4Z@H(AcmHk$i7C%%p`bnx#*$;_4Ssj z?h`lFwMbr1v~snRW_cg|nMeA zpLxX0>d+3$m|s7gTM&9>yIm8$R9z4!FZQH`OcHfvW*eZFoI-EgnLT!(-u3w4D@7Wl zqRng9_7*F_^5CZaSD{2?waR zUBvk>3R2t3;0h+Exqo-E3&F@UrNZFRL^qu!nB2WDm~e4E)-#N*z{Rfb2pOlwD?5z$ zO82S%ztCDkp@X#wGrG|^31z%G0S)c0IUq^ntvK2>AP@9!{X2Tc{=x*(leKUuRVKCkDNs2+&6&IO z?R)oXrO&lVl;8dui1=sUT}_!U*k3VNp_Bd|zqwnO*!Qs9=+dTkTy;apnM5-+m0qsL zoZ|Ijxmo#s$Zxb{%y}gOGb8<#4<=*1eH!@WpaZS?^E9%!>0CR(e`%ROD{`}_=%5e_VfY3+}QGqs{zl6l1p{etDo*W)r_VSYo1ina008-aZ>ZunT|Jjmv-2rr z{?!+P8)p5%Z0(Y74jdJRPi zgOKxF#z+fRj+BI##4ogHOARXdJ--){+V^8HI!n;f#lCHRzloB=M^nZXOCs!lpv ztVi7`wW+2Zt@oDA#Uq8PD~beF%7mG z<({z*KNSWeCxIn-;d`xqn;8|ZqfdDNLOc;b56_8~g6pf5u)t zZYf3pdITN905Tf*)W^fK-pr70`;Y~tu_R8HX;8qbJs!dG9|9M?YXudAV*`7FXb&QT&{e%p8@^fFBzvLq`iUnAM6Nr<*bESDd>>V2-li$$t-2HV zm%V}z<;Vr|z%5=cR?ZUrHpHSw*wVxY&ytV*QTQPb4WE~Z^e6SV!Gxa=LjECebVnZQ zwh^j4YSjPjsQx=3A{G4We2pnw7w&R-uY?2lMV8p`Q6cpK2zUkmPs^$faYj#w$8UF4 zPLI=K2LW3ugdTS}s!8JUae)S@K0|G8q81m+kb$xZ8Rs$mHKksUcX^vl8al9M+aj|C z^S*~NW&S(Zu+YLC&Wm3o35$PvTU#gIsXh#i*A=G7widLM*imMcdcyhLsI8YBQBNqX z31h|Ch-;uR*Q&mBE19FEK47Dyp#@qrrE>8_pPD6`Plm)Jor`>%werijDtfaOB) z4$K?jzYrtTFpu%yVK5}C%OBYF0$%cUABlwTVO>W%7Ktj;82bCh?n?k73ht5u0D%4D zc5=vSqst^ACFyo+B<_EizMFFb-b_mZu9*$V-GDaZQP)CP7NpRUnd7aC>fwy>hK}Tq z8C%+0RpNf#wgW**r8STl2fXGkuZfM?9=tP9f}kqV%+}~NI>%uZZRKzic~&VGe-bRm``Uho?h9p6A}?%s zuJH!T|IpvuyR{gZdeEBaQOrw*F`4Ic*}jXWJIcov*!oFat^X&O;ChZ_$=jc-#hLDzvFJ^S43PbvFhe0nq49D&Erq*c(uvEA0C`#WF_NuA5ZxBe1!%jbP9iRshS zhvtyEdegzb-rLB)#IlM+SxJR|*dkQ)M8;tWT+mT?Xa6X$5x2X1Z??+okHIgZ;og{#vw8n`TJjVkMo(Q{I+85dsaVMIh5$eGaWW6lM4^h#e-IbkbB*h2SyJ zhOO&WnQ-a63y{mXi@lc$X8RuTL^F_zg7DV%o}xF$&}mG=3r*EKt$jMoXu`0?4}r1W z)C4Or)B~zPMobp0K6bCq!_9f__-popJEhV)+m+mx&9tJt-+?%mfs3f;qo zUC%7TY+c;1FO?w0D=KYeALeD(nAe}VyS?b6;KA(u)~1biloVGSdvyI%Wl1Y#Jea5u zauFBsw133hSbp)S7t;r}Ckcu!4EdS>C=U|Jdk=Yav)`4J7_JD|l0*d!DVZOox!;|y zv!Rlwet7F$cdjT$lug*0ICPi$b)U?TSj^}BCgH!9D>#0U5IVI9O~Zjt%?S@|ZqAyy z;t@fTuz4B#TS#^nD6&uT$1ks*k7|nZ&FlMt_T~BNg)oHOil+Ne6WVu$=G!wS6NPx| z@(mUS2i8kh!&CM_1iabsuW7W?fo-&^J^#Epqr~~Tr3){yqh)mDdKbGB_8g2EWOA+e z@WSNr&Fw$p5cgGU?en)Y&DwMI&kS35GItOORZ6uDwuq)iSc>XUwL7TA8vII3Ua0yx z!g-WyY3&kp2hGw8)YM}e$P@GU3`+y1Tw=per_g$_rB>0cP+5X+echjPuyxGArvKeIGk`D_@=)>(X)q1a&QwWfS&3CUogW?W3 zrq1C&kRm-N3(=v#5+g5h7IrpE!p^o6D(-w5Fa_E*C&l?SAP?h-)L4LV;iotCtbLQN zjuCzVL<^!zoHyum&~M=RIgoIEG1uM~RX!RA3d>N1=iu!+Tp2K(B;nHXf1v2SZdZW( zKLiLnf5k6b0f(QQwc+L7eITyg5D#x!02oM(=D|Ua-oJo=CsAO#b3Ni$B}Z#0nN9H6T(7 z7K>;XC3oWKf2hnSeo0jQyy%@AI^ZT_z^oH}Dcf?~b=;WKg5{H66Y%iPpQH=!msEQA^5ThOr8T^JzN1Z zIiL_|f%B6T|1xb%qj%?x`9jDY0F_T0r;j5rK2MLs;odrsRW6?O-U6osnIVb#;Rjp+ z>^%HNf-pv4HOg=So-2eLz_9aigD_MxcIbEbEvodvP4m+ojyMQA0TeC_8|Y3uXns&9 zr_tXPZ9Qb79BnI_$i)Pm(34$DTWAlnJZ%xYmmy>d>G6i?)}%IO-GfgnRC|cL;uQqMt>?f9U!VF z*o0?G36CsXa!_Xo+>?74rFndnn?+SdvpY5`ACSuUgrDH{=`J@5_pPkgY@gehT>YoB zX!$OiNN}es(V9FfQJpg8(;uoQ1CNM}p{hohwNMF_GjdiU@dan3YZ6lJW?%Gn5=6G{ zy72lA0HGyr)8!OJXyVdDlE^bRC_F9VKyIZFf7{u8Gag}T;$0!rt$s3<4dNQTnwDp5&*Cd+!`JP08QoZb{5Q3&w zDRN@x?~6->K;h7_w`-p1YOr!`z$ZbB z>u<;Eq1*R}97wJ%Du5m;hx@BW2=+|aL-UW={mpNhK(>eyXXHJ=O0x6HU+=Z&KHH?f z>UFh<6YrEU>E?5F-5J>=;IRlDvmGQ1*HG{e9_zcaiWwnXom0rpLUGDUbjmUOI z3Y@g0o|R+ibT*4IFJmkJwvSKIf&lwX+x%FJBD@vV8X-E1;(S^k+(S?-(VwORmiZ=A z*|mdVLDn%>dsgzXiKm5weZD|m0JaAYUfy#nZ7J~P_>L9Lcq4|eC_A89WdYt$YokBuhr zV*J9gFsxx-D6zeR%5Rq@S-G7s+E4Nivl7mqgO_yvYDfI)U@wJ+ zr?V5dTDaDK$1=psQ3Do8+C~BW@~Lr564Bl&j&yMxE)+YBrt>y|1-NO{j&%Jm$P}IR z+%V^et`ijSm~>3J{8r+Kaaa zB1hGH$07+vZH9?0s~H;pf`RIWfx3=%H8f!K_d~m)f7`AJ)dfF}iL``vFw-+Qj?%g} z@$Xn}p4arI^EJNwu7ha27mMse8^Au}>xA+dCLF&_x6Vge^?68Pg5aoGOlMo2L_-Ih zr4^hxkx~cgZvPp6z*+b?jk0I=-`CE;gam+z3gI^@yl-*ljU5; zc!2i?vQ*Be+x2^Y_gDM`++I4xB zD(s%(>^Ubp#fj||{D3w$yJg{uae;WNR;YNQRy2mJU#>}(6yRACX7-2*!FWaLjYH21 zY})pmmyyvx=FGmHT>3PpjL$iG$~ZVXeeflUc@~2EXDa~nJN@_H+L;Etmvz{xEL&&O zVF)6WKr|6IpCu|KaiMKAL)w7LE2z`wf+SLMO=5T62!@N$@X81kpsH32R~n`K&OS(S zRG)FwPW;x1#k2gr`4*Ydur%M_FR>!eKmj;w^R=f+PL45Q%)N9 zzZm<@W?Rva^bKfg0fbc4iu=FDSi-}rj zPU?hQ8TXHeMM}$e3Ny8OoE*5BQbT}zL{&<=Bdu>L1w;I7uq6KC(MP@Y1w*Le^xh|U zB`~$$F02JO&C`FQmATdi`a4ID-49v72KzmU&f(Bdu{yXt=AOGio6^hkok|R4a)@Ny z>>n)n^1R%)(BBksudjDDt20M*ih>aWYUjR1^Yir^H-~gz3KUIcX7+v4y{65Frgk5< z5b&4KnSyvJ5_T{)Y5tQEb$j8h@i8PJiCA~kef5w}IljiG1#3Co`__ukY^wyxDa7J{ zMR~`;Dg|LX?{Zl%E57Y2>~h4zy-z&Is_4E2)KYUT;)XbJ?~W_nKzQ}!@GdQ~cv%wN z8S$I_H_O>AL=mhKagfvUdD;#5tKYx!bCbMiZ%Cz`$dg?GE7tw?8;WZCQhmpsFr3`Y zo(|9<0bsWEzmUZ(ju0gd*|CI9A|gLPPWPJswigk$v(BFbmUG^3VCL^04uVUu&FpMx2iWSV2=GjPsegF zRgNS(MZLR7k1an;m>sHyp%|pf97o~7I!~R)oPwd|&CMu&oO{xU-#pE3>=eQX3Qu)W zAmDH&okxCbXjLJ~@gD0%ai&sxi|8)nGqe&`@@`U>HQ9BmXVV_?PMPm|Gv+75X7@ahwIh=`#`fl`6ID5;KS3F zqH_nJbHS^JguoSVGNS|$c%Pb`MG(F|Y|F~zHVw47t8#b#^fUMr&Ij1G2MC1i!fEcD ztPxaTy^`-)gb;Dm1%oxd67`q$`zYnzg45g%-8GSvDLSq2jFyszQAXUOhL)~7jP*3L zlW^GdCrOEJN5DzJk@c0oh^x%2A%Y`D#CvKrNR`D^qb^!|Uv`^E4{YUR%5< z{H|xong0{+HwM^y#HlwbyJgO<1YC4Y&#j{yp|-jr^1A)HRZv?(!Ti#4v;Kiy(uX?D zj2YP@FRt?}%>K1bVQE@@XRLAW@vHyMIt}=;8Ctdrg{(~L{sbZy;Zsy9hjOwdbz z$t>`lg6;L9sj`>Wv&Lx=UJVG4;qz)*Yl8oEsy0y`GyyuMf0jHaqQGG zU!g_RN|G}y^-beb{tllwgUDe1hX%;ZNVStvB&yjrH;ao6|NA@_$1X1O6s>xI3ph|) zRgBy+9m*0N8=XY(!8*Ty_--#61?J1v%s1LWeQ?Prj}~TmBNyCBuP4W%|10|V5rqmL zn;WgFOLsD&#Y?IeVrO4rAN7_)nj~5XH)vrbOY@^61d|}f7tHP=#SkIaf3^EnQamZb z@B!D4ua;NrJRk^orI0VAyt`bo-XVD!TO#m(XWove1-|hyHF^D z{94dfBWBvU@<*~69nP;o%y0_OzoDg>@FF$ZU7zQHh~po6N*;g(Sz}uDfZHJj{t&(f z0-j3)HO)Q`5O)9P8Tv|ep57kLrtISmukid@L?^)Gg+)U^0GkWvx;IW*?_|6CW2m(8 z??-oSwv;OGm)TC2Zsqz<863&_IZ<(QUMHpx8E0gX)AZWC4A=V`5czB_7-XBEr+5*| zWQqbo<{u{d{=kPJGUf-Js`!YwT~zZyW~w^Ds|MQzgiI-W$uj-P6SHf0)widfY5yC|7I5yN<8DD{f41;g;7SRwMRrM(TykXiK#QkcdLX2P|u$ z_hvk(t|c?-5?hmgz$~SL=XI}S|F>`V5{5E?-(@1y6Vg=RCjw`N3{m)d?Ke>oFWc-igMp@ijpOElz zfbiT?{J6x|4!qbzLzUzFM$mx>=htxGa02ke$z+=}_+X~0tQmQJCnA9|?APYmbp~OZ ze{k$7iM5ZJL$RQYD9EOc$qT`hC}6J}=1a8BspX{`Mp(o2W#Q)#H+eF$zt7>DcBz+^ zA5qeTu@?}jW9WUNIo>z-iJRAV-h~Mm#RKdU_g)Qx&sbs8HO&Q~e%Qzl)@lRBAJ#fS zig2eX4=JK-zwD|8pl}@5K6CeMv4EB8SO_27UMGS@Uuip<{?c)k^nSbX zKUC!A1;$+Cg&w#S-5x6Q!*q7qg(x3Oy<5~;^__a_Z_fRKFsN4`^eOBze^s!I?E7L?dHlbF9UB@!Z-xiirAy}fzhTWzCyHRT7K;-^ z{6_+ij{Y*1Zb@RXZcrjY;m4%E8eQ|PC&4dl=&evj9+elug=GEAL*Ry4v$&s8$gcTp zbQ*^nt-qBry1#pE_l4lqx5t3%^u`&lvm$@EY)Hi7YV7-|o-dor)Pa|n0f^uv$HV2g>-`zek@lam;8pl$0$1g>LaCw;bs+;$l&wdN^$~ zJ|`UY*EG1RSF4A%OhcTZk8RRu2MJ1NP>+?$L4nBL`vGJEo~0} zMR7e)eE+Tao%(vLF%u7HM}#XCDELORgD*_5i+*+9Si;&-Ct(zPpnA390|cjG z+owP-H^m7%ii0oK-h4M41oX>4Fy@~kLsSMoo_sSj@N2VR%yAMS@Oy|eQ%xM6D8QQ1 z=@(BI;iZ^b#2Det9Q&qa&&{A5>qtdNC$}dc!bW04P$?S$-ah|+;y@NCNdB4EzoGYM zyE*dX3Iv!I;Q7g|ft|LCzd-RB*0h?4l&5@y}Um@EYjbP1@^)xypbNETCW=uWjtX&%yf5zPAlsRZ6EJB#po3` z6yo+APgu)#s&Qk7Bzzx*mM@$SL6>?jZdc;ITZuQI!_&S*v433aCLHG0sDv_rYWEey zXWyO$%!DSGz0M?87jvqrIPzOKy@dA6&;KHAC(wE~T`hZIdN(2*UT7H(qkj<36ucik!>qgkBFX9uHRmtUtGf>eZF>8kL(SM} zPqaLLb$Y~`s7oF`h$EAX!xJ_jR~2b_$8cjbCXVov?^fEgW~Yz|ow|yM#$&7gEhuxE z0VduaXMhs0wh2d=O=!D|#zHms7vjO^^_Xgz`Ove1Gp7%ISV z0khv<36#QAZ_O2g=zk8OA(ypQ;qga zD6%8Xr=A$|!|hkVB#6w+nVuBzC=Ed-K=+99*T&$Oe8m#&Cx6aPlEHYIP1Jh|9a;wx zeZP94wD@!QuTTP#aN{*;wRZL}mp)*eKn97k#s7=rDg_#%cZYCsm564u8Dz=h5to2&DeyRT#G?w@hP##;+() zqm|+$)iRsS8*(yA02jLry)d~86kBHX&1f(+cH{uD7~Qoib-K1SK1q>qf=s>iun-D&6MVOZ1#!)(Z`Bz!P>d4=m;=30aE0<5jGja-)7VEsAO^KJ}F+R6;+$|13*{V44Zlecw zI+1<{CNpjx;KL3*%&Z8bh^w~={n|*VFf*N?t%2-D2Kj}xlk;Y63sCH)CE|!#>|WU< zRrz!3GFY(CMYp68EPD(B(R}yl8skbZXeUfa*;M>ID;>Y@Mvy}Ssluh35hqU}Jg{D= z{*eq}_$oiMk)c$L=z<-K0>6(oAUBgPqJ#|9hxNP}cTwHKR-P`k#2o9Wo%jUQp`Y#h z0JGWrkrCKa`b>^{<}u^R&56iQT-|TpyY~>ONujdV2M4*H$#&TL3=`A`uj?sMX-J@q zwr*cFAFDbeK#IxF3Cc#X|NA4YyZ@)(!I;{9dGQ}m=uh~wJEDpY z;wEzQqDQV83DT)}e@BN@;Kz2Jqd$Ls*&CThZWF6#?k9F1>;7|yz7P-_Zo)-jq9($` zTUt2x?yJ0F<5}Iv^!L|Mq-d6tIpmUmw+RgGb1_17RgujUL~eKV4%PV`-dHFRCrNGO zQOHZ7yV4`|!;PnX3-)9AACS@iTos7$q4CpkH-#;X-6wx7!}n8_si$*zY(hup!cF3x z`jegcK%aYyr~8N%!IXywskPNec4{3qJGV*;&Z z2)9@Jw?Py#x7&Aq!?n2wXS|$N1}tRUNA~3o$S})&7u)ldou`V5=QxC>*~ZKIkO!+_ z=hb@~F&xwmP{9P^WXmS~`HvUVG{Q5MWDPt?B_FSGO`Yx3U(*ruARR_PHVdm4pfZ@C zkfU2W$x(4Nf0FQinEVOj-F_2l9s7Nf>7q2F#lV~Eq#-P1PZK6nRSHo&wEKzsY!2ai z!o(jDwTl3q?^fKp3EsyfO=GVg1GW`AJOd&u85w5KfBhA|W>tdySh4Z?$V5S}lezUo0INRla(fRjXLFA+I+lIq~gbUB+RE*R)ic z+f(VsjL5fvtG$^*aZiUKzdqbg5o+H!d|ZT!A+DUmJ9}4#8pKTDs}h2>&yLO2Pvty%YqWx-<8gOo19rHM)GwPfYR{d zyf~MVOCh!?L1TK8$?{^2xcacRPYaT>Z1tYCUy02#@+gZ1FJ^`s%KwDb(yx!SK#r~5 zKIS63UTEz*CYPONzv%GE3mr8wwH1D0)@T@oL;5?xUt4c)n#`+HNx?QYyMt*d=K!>G zlBF$Pj3f5I)kFuK_0)%)9<=P&XQq$PzSA~VtW0OV%n*=GK#iU1PCkBjG=Knq=2jCY zCGdj8E8yFXZ-&io?6(UT#S-K;eDP9(FB%u)GI_I12!nXuzr!uJ+7+{mFW}-fGJeNE zb+ah(6a9BVqPJ0)UEQZPz}H08{m`sjx}moLL`e;qw>{URP3Q! z!QezSW|7fO@yCCjS2JYIx(L-8Jt7ZCXq(=jQ$Fd(3h?3UZ8~~RZVA2|mx#y@coo?~ zAUTA`?8fBecB~^@kI~hPn1!L3D|g#^;JC$aqI8S<(V8aN^HkQ6mA^$IP^$PVQ1O#Z z8SmPIyF&;O&>=tKARbx8l%-*#8=A1ZXPLU=V_i!C=F|nHrY7vu#W(c=3txE*f07rK zoOGN!c-NBp)r_`VY{Z3+_I#|P>~}+1J^F(o<6XDPIC|qLT&7R)-%?|pj4b%F9G==E zFH>xw{rdWYivhPmzGmPgU2EYJCP?uBQ5CquSI!*95ak9+tbK_z3%QO)Diu2E|8}Y= zm>KiXO#kW)21g^fkwawm?>Ae;yEEM6@^?R}YrM~lAz33~r27wJA+AkQtMP2RXJT zNiCmG!wd5ZK8(CefaVPT_P=EXY{h0F@MLMbDwHx7Daw=`Duq>5F+C^RD>KtCOA#rY^cH zB!>|LXa{0yj~IneKmlAgsxNT*MMuEKSA(nFikm#WXu@DDE{6uYOU=MaqIJ={*Hq}@ zvzlCQRI;?z4ATb`l` zeq?dGo`5{%&lcs9OV+!c+JRwcRXsL4tAmd&&bn3Db8vh0`h&6GF02E|jC|3|?d*IG zstU%v6|d%|9mf17JZL%7V}CYC>rXf;_XtKOP@p#HcCmE!bpEXS=T1SS06V*f8omgM z8Ezq!U+=zn3yvfy7{i59)~dTNTP!@OWQ(<2$65>7&4eBFY+Ougbc(9#Us^siZiF2> zQ_2Z56aVx_%I|&ovmJA8bp_V4pXWylOm^U9$-V8$gHF>fKV5>V+aSfaD|`NP%XmkP z&Y;?6a$wUXVlXsGD>Fr2P`)WK#Z`u*Xb{c^gXe%=Ew{v(6An{d@k*Hsya8CR?0~fqLmWibijuIdawC z+;dM}ZyJopZRA=0(XcRh+ccg)>n_sAQ-)RR)AZjh2o%2uK$Qrc?sDK5ZLIwwSd?a= z23G=>cvck7C7=Am+T38MB`>{NJJYTuTAS!p|4aMG)i`>sdiL~Hn_l~q9$$^v8hQPm zh>Za%GaKVI3c2sU^en+;p9=$`w?d|>65aBCy9pEyK7Y$ft>It3?9Rd88R2J9yG9d5 ztr7*k`(tDmzH39ia}yE^Xz8Z**PG-*zb^gvDMIV2#aqeTLK#(S{g@F%ROR~!ZX`~N zzA-uZs!O5qtloX9B*p)1f9bL}XmbA3r2plPTh)U)CN!jz9-T3nD`;_-F4oh4ZZDiw zb5WX)Qkc$lB=`eUHq(p7o-esi~eHE-*6l~IHckdoL}535E~dhn3;|q%WOiGyiNR$6YxM098joF?gn+|YVJF# zFWXsN-_&pkQL`}o;9ym0k-gcE-jZtGBLO4jeS3P%&vOrGnxnN zF*{6)q`38y$UP=AQsxq}`w_7X14PUumCS$=y3ej^n#qg{_tgMhtPmW;>t#Xy>zvNH zo4L`I-I-p@OmFx1%Pt%6#G+Cl{>VBMVpo?T!jKc)>L;cCQU(4#RIcNtm@G|%(Cn4$ zLD{Q%L|9Lljh+Sk>J=zi-ScFym$2 zC(!`nH;KHcxJv~lL6T>~1g^INj)hD)Bn!KDpJ3MWsZ^UrjZzFP#e~^edv{d`#@_I5 z{j&xBd8hO-#Bt2DJtf!7n>}Wd`XO=T>#HNKXoWa%kI_kT&Q~} z3GEwLNL&qmd(2XiCT-H@n&5tqF7`D-wJN=AHl&R@tGcX@1V(YAH(fOp@qydB9<-FE ztBxk+5d!IVzE{;79Zf79d0K^HcqG`FoS`*hwK&o}HnuQnRf5~Bs+~-hD=fg5WU0NH zD#Imv(DS9b^11Q_mET7wddVp`w0al-Q+L0v25FxelSICP^XCnxoGrikV+9tbCP2G)`e-9aMUar)sOC=dQOYmqG?G9&Lo#-Ux1pmFUW4bl(zqfX; zNvyUU)XJXbZlp9)Co8)eebCnC{74PE(&wGmcUBDxR;4(((JJBcTXhz`XDL9S47j z*ElzS!@kZq#oTyhDJ+SHg2AF|07a@tX7=&4Dl=+W_3rUp z{->o<_3%@<;@q+H##3r7r&+@1J;+pJ8pSovc@LHf5hBYBY0MvKYA5?nko{ZX{;X=u zsp(M43@PY#>-Lz{3IpkRXG=8jS?pa%a8g0vtuXi+g@e@1@b*jKrgZj(Ah$!Sk~s^K zTd&Kp8Qrnp37mJFQBvA~gOi3Wazwg6Lp08583 zrzCdWocQ}_5wGB%;jaP`FC@N3-kY#^eJ7jpTiT>V5m5L2Os?RA@ea?I09T7{gYbgJ zw$B$bbjd`#5>-SK?qoGJ@g9=dd4fcZuEA-^YDyaSd7(SfI~ki%AGLHvf9X;-iqFn6 z>E>=llCHIjf%u+M3{zh`XseQBGS#RIX6X%n_vH-%a~H z3kYjWK{_IopWxt~N5;)Ui@LWAdKPWfWnH3Q?~rG5empxaE;X1>6v(?L$WB~!{L1%c z6nTLle1@2AZd%{n2m%nUA$US@APl>@BOgMXT_iq<8|{lgaL1e}cCao!xc4FBWu|x> z8o)fFih(3*cNth%a?HqaVMiC4#QeYwEAHwT!)AA8-4wm1io%cs{aP$xPM}W>aeIaO zxC65^EN3~Xf9%Ei6+VBolWI)8=LC3kva|as-<;0vEw1RP)<(dcr9lwO^FI%2C}j=q zQz(wTlk0kzq-RU&qw-wdr%~42QmWxd^ovESyW1uY4}IVPiN}1%bGM|_l1wc+&pYt< zpOCBRpzEBpDob=F@%nRhqG9HNHFD?Lp>0t}fLI&Pk3dR9#$$!TrGuo%Wb%;FVK(}Q z`Xj5@HJ1E4I+AA&$D4STsyKJ1SDk;`NW^)*^5(xWeEStMn;?H>vs6~vKG*x2VR>6G zT87hEX7{-{+x&vToWQGZcQ-XPDlj}evPh`Sg8WfrwN+!Cybr(dXWqXFe4IBkON?0( zy1~_W4sC+;zeOgq zIp@YF3@@r{nhY0jXF#}%`pKV86N(e1A&JcAr9V{L^WwVjzN+2n7;foQYd9Fa(RG;H znBQHPMQ&Zr^hg6mY%kPf%unJlKwb!_**WG=#A>*{O2vYpC2^(U<1K zrEbDWELC*yh^>dL5zlM{%}m$5B2tyt_WJ#DRgQISn&MN5f6G({(yb5rlA5w*G@i8@ zR>S2mnbvowakDm7`Ti;KY8M_2ZA%Yi|GZLDcscd_c=YYTfzm^WbQof{F7Yzw@jE)C z?T*mMmqYh!F^KZi+4Ew7$f#lNkoKllxj|at0uzmAH_NkJe0-xWn^O7JZr7wLcZTQH zmvpjS2EBE)n_RU@Z##b8^vlG;CGdqx?BQF4sEa$ZJUzPQP*_rySwmAe{8| zc(Bq>YdrC!Q(vD&kAqveWIq?^H>_j6q!0U&=@z_3>YkBM*^s0=MOW+IJ7rBBGAzt4 z5@~8yZ9UiE)@L7?xL*3i%kw^au*QY%GR^ZPUuJ6;rp=P5LL0x+{y>)VRqRUd-(5wE zX$=vP1_|e7sib?*z2bNy_Fl~ zovcAk|>mIUEdZj3><2 z;~hu63STss6?2(m2qk*l*!iPWxsm=UZHW1z%*oKZYY>3lvzoX658A21L9NL&B09pF zp7_V%s`9{2Iw?s*er!mA$OCQ z*~Q+kN6Y!3S0&F*5AXeIxmJ7^u3JnR0wo1Uy&91*Z_m%@&lDdGA~Yq;J9!h))5^2V zsEuyEGJ0+Y6|SDxi`0EgCPP~Zi~m>yhIV5`iG<8?^*(|)Or(mVG1)w!m_q?+N?YK1 z?*{hKg?7Hmv;8_54O^LyEzOiQj_4hGY9y(aBI=Tti^=PyQuz6iq^B13LyPdQJv^xo z9V;>Qk~ZY_F{E_H+JBh-9Tg;r5*FH*f z)`eHZ*v@&sse>ZIM!$JXxDT|*?)QN<)8S~Pd3L=nX7lDvrvklQ@`HZ=j;hBH1a>XZ zc@78dI}KRe+?yDyZ}U%1BlVy9fpW61Skmth(!#dUmW)QQcf-UVZW_@{Bhm+p< z2-a#?sFM=;TO{RaY%5)Do+g#Z z_jc4elN;PJg2fKC6s4ZVDz}qG4kw6Y!35$P@9*&+>&EhEm2PYI5-&AAEj%^81k3Sv zOqo9|6q82{e57f$c%QgMa`toAFf76WSK!JUU-5D)rT35i+2Nv-uuG;&!hf1KIAQ-YWv$ zBLscTv@bjiza58}D-+RHluS^+*ffnA3)@PNf15ScB;TLs)u)FM@lB(R$vv@f&KOI5 zCQigWB7TN)=^mOdC&OKQYziFd4N|V5$wUfFvYF1coA=mDm{?*UFSkMAxU{I-xMjlI zTv5Qc!<77kikfo?E4~r@XpZZh=N$m4mvQWWg@^e8ew}uX`9x~3jcwES0Lg6nZJh5? z;<+fsxIhXL>wZ*PUjZ#|M_2(s`i;7Y7M%vRBG1&_oSIg#p(PSS1L)f?F&F-Rk`p0I zbNpV-?Y1s8<|O;iZGZMuLM{z#PZuhW7-&_DvYG{|j}_h0QiyXon1njzpdRqYlm4YL z@RWKyJ414g=j~`vS}3jFYs$=yznAu44fci0g&4L@&`3K2x!mZEremr7%uCnFia7#n@0r7TjBfGVNAer{|E1&@kk{%ZD?{H@dD?G;Dc@Tj? zQZ$Irt_xR-TGkmxezhS9hZd`ht3Ae!uD!(g6R*D=-cub46@@LHL0-<`&RGV{VJAb* zBCr`Xqt+Ywc^&Fo9Va*LAH@Q71kxJGVfx@JRZhkmrLA0>soMndxD#tm0hwVQdK(WjSDqhUL>1&qHY#L01B#4DNV9d;ahgX*ByEboYu%m?VCl<^ zS6|ctYYKA=u{1|PYed0*F^xi6n#i&_h}v_8Yi!yG16_XPx8%UX&{zj?3g!=+9RU~$ zq-6HY-zEkv8=808X;jCr-Qk=G4{~o#lPY$Wg1op*CKl0piKVhL0x`0{~2NC4=CUdI9?l#kK#(YENdi+XXoN`_VS2+9P zB*qXytSc>(d_+=Qwo~mCr?>yuZqDlQ|E_uaY4(M`{O12TVwtnG=u)GUev;ia+_o-? z{S;o`H0qxrvPJX(IIk><1dibhRh7p>>d)T%?#8oPr{wsC*{hz9!wU#1n&#@+w-97I zUcud0MmCU;5JL3Wh`}8x0B|)OGvuZMWEa_05>-!p)n{KBJN1kOJbE)k5v6=3&W(AO z&Q2svY+jX=ne|C2kh80#Nr$)oPVHy7uJB`K9VspFG8Jcxwh^tGzt+9<^i*^pFDNly zi&(QTpFSbha6a%ewh?KR>|k5cwVqA6O^!0>RST}`aoAYiBU-_WxmdUu&meY_<&Bg5 zc@=08o>LL7hI_-h{Pqe@J-KiztnaeLQ%}`xtP3<$^8b&dv+#<#ak}_Y0-}nLD3*XP!#z2_0mQ zy3a#2NHSMav6RT0WI_ zXnfv++SUWd$o>vg-yON5W2&dZv~lF_#Y2NWoe=uWQBi6+H^R0diqBaN;>02qrE$c} z?8N+6pPn2(PHlPd?7|1ed1@kvsX)}5+oJfLJRdSOp%D;6-dzZ^H5qz}k35iPQDDX3i6Pr*4Nvle%Iai1VVBb(Pf6)NsVp=PyAG`yhTRKoFVsgKd?gTS7 zivlZ8DOe=7SFY`A?!1;eS_88PsykJP!}LeOyq@Fr6P;a?$GvI`#aA$A1aa0|6kYw1 z{8`7&+9si%t!!&OCy1^5)n;PQ{y>WX_u^OEcR5-%$H`{z6Ji?TDl@PlV3dE$NV}@V z{jxuLf6_gaZCfV?PW*%4NQ~-{=rkvNd z&}W+$kmvKx+Drmc_G&MWjgY+zz4#cIjTb_%g9;-Q27IC^p8J}WM9Qcv__AAe!Lnvp zAdIXxsvHoVY>}~Y>OFicGR!^XBG&MuJ!q{w8jm_V zng$AKG5aDtX4lJF`Oh=8WHdDsw1})T3U8PkeokbYn&@*Fm0g*mDAZDd({+OARY~We zKL;!^2ktZbe6{<}2RC;v;;Ekyd)Xdh3Gf5t_?UJ1ff!wT$0RLw79C0G7dvgzxYCp_ zwuO8`Iq}d2DKYUcyBF_hi=1PmC7cO6?){qC7CsAj!C&IF&3^Q{JFZY4i%o#yv$BTJ zS4Vpn^O;C1vwJ8|D=SE*Dbfs))M`a^OspD?X>oRMbtwp@dv;!8PjN<8y`bifrc&2$ zPv2zfwz~T8lzKu+6F$1FY%>gQbgwCw8De_{oGG)e5l4}HxdyJP^}5a3eB8wt9+hsXAw!v{v)_I1;7@4fC$ z@;|t)aH2yUmiii+Lv+(jkCv*P)5kvC|9?F;pMe(r$7@v3=>lj@ke|$_kM_kd!qHS3 z!ewtiXDoc$>zg?cz=`1=#6v0> zhqK_Px{Z~!{^WdEIQ>#% zUM1@qbtgX@eX_5JAP~$yYAvUuSjx01Dxr2%&MZ1_PnUZ_WHSci?L7c~Tro`!qL_36 z9vH)mEn_{dz|x=vpuq?9P)7*5_%o^iU_ZTbIZhBWFAp+3cC}t~g3yKAr*Mw- z5ACyv$tMJdV;e{+2q0aY@PXIhTYTshplSF%_BR+4fb9eCZt{kK-p-g&q~gr2RJ68VXSe+OlJH{JB2y zZU4IaLz0U!pTf3_?CqSUNTl6K2Kz*3w97=Uo$q^t6mp3?I#|Yz+cqn{^E}W~6*Lc+ z-|S7HEZMH%sS`wAq$sV6%;l|(CAY2{W+X!6{Sdqw*^B>IgPl=FfD_s!l}%$F;NL=w zi`_K${bUcVy*~i|oE1B9C+Q?)p(j}%=E{#`qeiHtshE9{z8GS&BZdopxPVN@gi9EE zqIeDUsl{+Sgs9I$VD)A`>Iw1>!OyM(n2xeQ8P2Ck>C#mVmeL!!q{!|SP!}hbq{I?Y>KY{ZW}42-RI2PUn!a6h7_TscnPEC-psH6e zRO>7~LKNN{``~yyz+p8fS%Nj@j`En3f02tI;jR1@CV|k-5i^V!mDc;|9maG;a`3fy z5K$y;L$@>Gt04TXUV@gQGt7U;OtummU)xTHiHE6mOnVlhXMqNi2l00wpTdqW_%Ba7 zZbOOz4g=Ms&=KF5#{%*I$8?&_;;YXe9~p+~A#qg%C}k~IF=!4@d6&Fc*3Q$QTCA$6F*EZXTC5-0Iy7FXpjkVuhxdWTYC^$S3(m~wsrdqLx1|aIvP;~PpMbA!yX>FEP9|Mxcv=Wsc63F(51rUBF=QMsX_v}KPU+WO;3N$~Sg zMd+inSz~^}eie2da9HGm@SO~6c)-t^hU?yqi}Op^eAJHJLn}0^NP2$K>KllH`dV47 z68k_RGqcj_^GybJXCG4Q?iduBPZwFhqg1g*lO#(~_fIB!*k5yJ=9qnUOQ0%4md+Ys z8YQr&X&=I%5&6YicdY^_wqw)~a}phrBVVn64Xxy7oKYfzm<_UXWh3p5y;7IAVAVqmO9AaYb_W@fv6H!q?D zguELx$McTiExIAw+!tH>BtHy>^dJ{Zw-*(C;s)sehNO&B6N|2mtN%9aIfYqzIp&A^ zLWPU>eV?>{la_^$mYBax@J?pvP>(W@m`478hUd9I|Y95@> zOmrUp827&UYJ;UN(R;3C$d&TQt|6Bb*?~R)?ws%mQc6Ia)TDBuhqQZxt%%Uh^_%J2 zEzf~u5UI^zwfUEhdA$FI*3>LeAMI-55y|Z@*lFVk)7#rOO|>~8@RTtbqXpxEN-h~_ zvsTdEyl04hAr`V}lV5U*nMf!3O`aaoVv^1l4`JOM zjr1+I)Yz;_m5M&=spr~sF*Gl+@Yh0CJ-YAj+C4FT*O=_E6M6@)09b1A_JEc8(J4T3 z+97%EtId-tput-;+r~ez86QLAWjXskzSZ@TXysL*dog(byhsTv@n^GKvuU%X11{!1 z3xUWI*IgAreR=w#eoQJ&;v(|9g8dN`7Mhc5AX1Z^N4~SK%x?o4MtDipsU>jgVuwxx z$<9pjL(~Qvqtn}|pke*l?mg{dt2Nci;_>ZEVj!7KS>W*g+UprSflS2L)gnlIxWpmN8+15dP=%pYyDKMhRPR9j`v}|- zBY|YRb%w#}g>6q)3QU^@y_<>5z-$~B?po--k_NiTnSs-X(9I}^xmB9)2;am4cvRZF zcI$|K+JCq@O9uXw5L(-=Vnv$A)Ah)og$3xec+SrO9hK4as-grLsw*wTS|jy@-Jwtc zK;0h$L6?hX6^VbE}oP7DPyLiY^!^5x& zF}$8Lbx$NaW(zg~BxL#nH$%Q1XKK(L(4!^rB)aObvlYNi5wLnUS1OT$J=CPBx|XoY zP@e({@ub@q;^H6il9~gPT)4J(rfS8MI3l=Wb?i{C<#-ce^B59lsiU(7sZ6r@>(|dD^8tNgmE0qOw8+Fe77BHA#e#`A4-2fz3Jjghh)39bAgpv zWWbK@ej(jve&{=8-<-xDbFvDS0o6&B*xBxV@JvBwz7JJbDCqW{|LU{53r*7nF!hj~|sKMvd#B!2UWex3}e-`ms24@F1cICTAh@cww zMnk)*@hePgi@?734hVf@MgW8O32iz2p=+o{J^bfhVEac3=an$4oT4>efwRpj%DvL6 zE|BuJfs9HLYT2UUY%1+a$o^T{p?@<=`E{&~gjRr&+q(!W(~GZGehO|Kucw|JO`1zp zrIQud+QqB9Z*r^O!*{9x;P0|!L)Zw^)`^#&K!X)#*fB(NgWz#O?34-3U=&+e1U8dH zFXpce^sns;iuh08NB!j}wj`_Q82=nPuZ!r4n6}zo^}jm+8^(VUOnRZ*M7VEl@p)0l zuh`Gcnz~zSsqYc|>nok%|gX%Q|Y4+J~JfB4G=b$<& z3|G!sMpJc?8Xl&^=^uE8xr16xd#!U@V#2OFp!8^>@#+)k==`>yQY+T>Pmnwv0(e{x~A-hFIw-2X-a?Zwq7yE~2j`RZq;gwEV7u z3gd{rK?Qc^33f;3=1En*vb{Y{Mw8~}PT1vu`aU`sUfVK)SzB)LGPw1PxtWFB zOg-sUsIC^T^6_8?uknv9PCNyz6<=W;W>_2ck)%jc=QN~iFn4060zh9ejrO7aXi>Em zO4Taf0T5vnxY0v$n@B#@o;ix zs!o`r`B&4A(8km8TQPkpR0U2ba&b1i*pI&Zvn;gr$+oQ`cO5)o%npVJwPM^fc{n^< zS~7RjD0zlDi$>qa+c|mf$#T5#3l*k=AuN{XPE7hf_FQe^jAj9@7qQuet1B|66 z2CzXM36Uzh57`bbIPsGo(`oL4SPe9ryZ(A9>r-#Md*4I{tcD(?ts^ z0_~(zZ!1Q>G1g(d>3n$94oeThTKF;c{{n}%EX&ypCE9nKq*f+%1;OAJg@oNo$gM^P zauZ++JSqhkOe%!20h`}p`+Syn59w1qRR^qoZ|<;;`qDCiiRhc14a1+7)_SGdPSfe1 zm|XSb-x>hf|A& z{C62jow|iRr{^M&?d<6hRXXs|(@Mng2dGlL9h%$mGm(mlcRf}CM|S!vM?pe-Zcd)h zZ9+bdldp?CL5^yk!&COMSiDw+T*cviaop2)x!WWH_3|=IGJ*|&LikoyA?URzgIOnO zf_e|Vt>zGfC3Bs%(v@{aR-S}qhxRnL(p}0fs3eqE~;(7~IIPST}# zoO%lz^v=nPYYbU`6k-P9kZK_EW&3YOONSNXvgKRb$_UBH)C zeU@Xui_{31RpNv=$(HV(lEkXk(PPq`OQ{w7;i$&TV&_vmY^*xo&)36(?$%f!){vP| z?s2F~GS!#(vI+YfApZPRa4dxUbXk5_FsH{>euB4B!T1UvG%8r~k?+1H3KuMXZM-UE zTKoiky|CK+4Qfxt^pVb>-9M(4>h!#EQdWLa`tp&0@qe6m${(^jIxtXIb6I;}d6C zg)LWKh^}q|2T6jXOYwSQDs1MFTe*|t^DR2GTgn42^?ufau& zX4g}u!FQSOoezsXOT-XnH%6;t@OVaEuHme<%lXZRtL_BG?_Z(UC4Ls?OY<-we>72Y zv8iQ|9P}ELGzU0^O*>E%8{q5^=mh(AJ9}Xk@eChx1%6v4<(AX}fVUGjEU#0C`bAQpd*nASj^zi=d znJaPAgzD?OTBJYWg;}ViS9G^)5zNCXE~CpEiT~T$nSy zd)&M2UjY|sPSuupeno+72?LVx%M`z#{`MO6HxhO51dRI^W} ziRmPw9=_7zrQw=Xxb?!<*OnAIE9O3%A8-J9r=FUBKb&8H05FJBcL*B3-P*NTI{YBq zDxjs|5*-@@24u=s>odT0)1I2o4#ClZRShFQY|j}%{GDB(4Dr*4L%)8j4YQ-(bWC63 z9k4bg-D@xD1M?_|z8$@TifrxM_1@b1ZUq0jy&nI=Y_*Gl2D$KfTe`wxxnd9%NZMs7 zfoPEJkf`IHms!oPrcGWR;W{C}=rT{itHbIYly>Ss?nA9zP8vS1LZ!`s z!#t98tP)+9`vjl$ABff@!C}gBX~id(K#(kHgGXltP-jy!St|c!jI1*r=1+YHrECv+ z$@~{5Iq&SiwnTJH7^$$B z=nsPl6S(V!x-*s=p3{?-mTt!Un|KL2k%vo@_H7obdGjBl5~GTNhL!UBG1s@W7iM3v>3=q! z>LuN3LzBOi3j{rA5|@6pZvZVX;TeP{fi!_*t>8q95G;X7!~IC@y_Y>%`DRh@tj$Uu zVK+yM%cTq#pQhzD??`F}Xpv? zDbjdZ#^Ps>YlBQ1&N_f(Lks6HOxEEC9Nzh-=iE!4_*T#Mv|90UDhTBWpJfx>`pMPA zBp4FpCgV6aIh3bs`_ZC@(;qz8&VaV4P*5pMBpThv6?hzm`FrlKD1Q0<0tZXBCr`qf3w%R*ToiO>DVi_Xvu$rX(R{a%LnJMI| zfD*?{%sAF3v0CLi5kfuToLb4P0#SQ6Bza{i1JGJQ)voR-Z{4Q=+tnF(Xy2MZx8Y)MJY|X3v(we04^J$H6vE z21}Gxa~xCmInA{p4~G=|=ZWqW+k})uzCaCSM-^1po-ew9y7@ySUmm{4+0tvHQQ=Nx zmZW;pCk4HFk|B>!{;i?Ho;a&?$ndl1wO|96;-W#d_rdDd)J2?vL3HskWgY3UT+;Rd zv0Vq^l>=hz);l1fBs21rD%?)0`PD@J;ZIx2;TJeOtd`W42=X~9l$?t36W{T?+izy+ z_4&E;7(t}viFuO;DUxb%q5^PpQI}8=C#?oJRQSG?@_cHPcERM^I+{>^=VLoIjmD0#dZ-&P?c4u*@0c!N#WuBl3mngav$qWVPEj~HdN!`Opofr#MlH#UV#x4uc3Zd z<%`(+(4EZuBGTY>yr%d6d;$7bWmTu8#nc49#3_#R;d%>LCRf|Qo|2Jcv(>*U;ox%L zcldHVCX~~^i%q>=NA`nipyD_-^yyYMze&%XN!;LA!C)vc!xkte}%)~sKO>L65Q;cQT(BMW;mQ+A2KGtaN%x}18P3H zM89s0L8V-okL{`*F|Iz>ZrRefY6b=&&3h%F|M@BIwk&xO-|t74uH+usgwOgX0=_XP zyoTmAbNC<mUFARo<7YtFF@ltQTR&4xB+iD5O)Wz?CauTN#C_QI@B0ePq&CQ*u`+JB*PPeyMMrg zW0PKlJIpK2$iIP9xhB{j#8|SYOgz+-sh>xe$v;_6EA!s=D`F#iE%uAT!zr>F+Y$OG zjaW!T#3pR?K>)t?w>;(ZHHFxay+HK?CL+gY4RLi^6%raD_psAo57RJ$0Y3AGR zMG4|>cswNdK?rpH;M0_wJlj9XvuhUmQY)rAOD0}J^&^7qU#>`eW+ai-2JnLv<7!fI zX7C2sSwUGwhsc+5GzfF7;(EyAa{pB7@RnHkD6J+-bb_D3lcxu@0BUXD4u^$tanycu z=X{8hGc=J4@TIwOK6>1*Cf7$aSA0aY_x`HxjRgJ_aY2@OQkP<#d4$_k#sUQql(gRg z{+EipL9=#KPl5!?@ z>=D^6%k|7VB5y2oo%>Uo?;itPe+-(%0)^cp;1lk zd{FhvC^NedSYr5&3O2&*=4SXDa2jf{bxw%dzCc;}!MPoi;jDqGsQCS}3Fa>=>?B>4 zoy26HaGQwlB|pg7IWoEbLt})3Q~xIebw8ia5Q1-WPRxF6iqDpeD1M4qzasn>Q#Zn! z&SU6>3;kSuj^@O<{r77mSZECtMZqazMi{Dkl7#%>CCbsm-GKM#bwro##pDGtJ|s@l zB2+_wXrMz#9W-QyjnAs=HKMK{5q318#_@#Cmgnw)$iMbU8K3e8XbiyrvK2ej$2d#5 zUdx87>Yh0#rd#1!9a>RNQhOlV}#EBq|xkb3Zu>Fw`^ zQ}vuj%nkK91y5>tXb;m1RyT>s3j~pR0!V!1tKV#C-A+8s=nA`ka*?W!>z^sHCT_KiSUdGnRb1Q_B$kX>o6Ud=Uu_9b z#uhhHZanhMzA?P9Cjn@|3)}viG-Uc*&loO&;~^;{8zmp&;bh~>Y|nfanSPjryW$&=56StB|FBf1$CrLtadp|6JvtB&*~)J{!G4UY zWHWv#SB2CFf$KiwQNj)#DB*1+yMEg~VIogb;inYHP%=$UlHX6ypu6@w3DmuaeEsXW zjTh$YHVo47g)#o^nOG)%+0zKS~sZT7hlyly-(t!+}l zM+jv(%(?SCpVL4RTd1ACk~p4S1fXdD4*o#)lIqj!!2gA}<ie;KFBW=6lMFjU|9 zv}gC*^qo7xVBV7W5HgXi0+>Un$^~R6*$%~G7jNtA?gUE}v#4Ao$nqcm z4kRNz%*p9Mj#F4I>1AmSBx zYEscfz}GL5q3iZjn)7NL6`U=VeEOv!H70@l>(L=-^TsUek%)T^RP$(iweH2_TKVv3&DAR4_n;6S9%V*<2g5{gCTBP-VD{q#KFw5(*}`}@9a~pe~IIrwtp5&xe3l9cx7BZSpug;i*o)x%e zO5X*RfJVwj!Jkjj7WX{Rxs}}bfI@wq#Qd%3yW$#IB{S_7`1QS$@%zzpDm9HQxJ-*e zK?JKSG$CL3)A5u+Pmb z?)5%+fyCKQ4CVfd7=0eFiUeP~cF*g;o)iIX{a**ttStmES^{wz>ITcUrq2YG0c9Ee z_&MSLrxKTJIKHNeiV>o*%k{XLfmvhBUvt0OJv2S^3J(&O#(f%c8nl0z54i7X0au^D z%pNXQKFgKt68eJwYyaEnU3@R%vF2`1$B@XTzCnA1SM@V)Jl4E&%Fn%Yqq0ij-S7TI z5d+nYF@}ay7l=-bScW$i-M)+6v91QBHz&gYBMK9s`~g{($yDjw#HeI2z7($grv~U7 zDm)S`v4M^^S+f4heB26Ne+myVsWFFTKVh>uRPVwHoFuOG#OjDZ?o(jkLX|EO%izlHhfCqZ zrnUBPzx@4^E+6}GAUh_yr2P>i^O~}`CU(cvQk41Yafwj3GsO)k#2L$ z)$$-B$p6?`o?v)@ZlM!GN|8LuC8r2mpDKM z{2TtnZCP@d-SF+i~pi2d!ERN~` zC9<|A)~7RB&p&C%B0Omm4=A_vXQ?kHd+Cffkkw0X-Z_U9dl(6M`L_5CGB7svNW2Z` zN_!CS(J)Pe*Ou9O7^yrX+lPpeeya9EF)w%#_U@UST45+0)A!n1!baDD5~`F^M{U%q zz<8@yR)5thZB0>fa^LhqWH9+7eB(IWrZ_b*gl8#4{ol9dr+BmV>mfAZF(Ko}t4`A4 zL9-Ab)4cmc5eSjp;#8@r#M;dIzOzWe=I7>hh#VNC8kz!!f;^&+lgAnx+k9MzQSPwi zRhAHNBNtTgw}UzV=rwoqDf{THQ!pq1fR%vqO^$Ry*SNO>miLOk8E}kF?C(xgKJmZw zZ`(`S&^Krw@e<$y8TF6nsowm_Axa>82>g&b;WgAE6K94x+KV!j8jIZRRzoaMbG_QE zV2&l4OrO^wS^dZPwJIHhb-1xBeM(V{AP3x`its+T#mayQDYV@vWhR69))!)Y$VFbE zm;!3`VxNj{)t#Rds47ABErOh%z{IWid>yRZv&SEn2&TVzlyFnbA#a)0ocw@NbA}7P zLv7rsGK)W%wP$^N$iLoM8L`k{GF*iSc3az)Y!ME6o2ld*l{a35-V|_{C`|L_c8z-! z_}fb0w3dpQi8$LR4LvmbIGU?omcnee7g^K?`-P$#%&8sa>>Ab7(qbUKw%!aZPB$PV zd1jAF{Ssg@)t2U+v}v@nx)0uQy<5x2nwk$8N7fc$DgVig%HQ0aj0DXA4f5(OHx|DP zh!4XBx+GDPr?I;8hx(PK+lP<%lR}h|348Pxnn&){KcWyVRJ2nF1tTp<9O|E z8^(UHD!*vOE(lF^A}}ZaB*cDrllC)sqRduu^bOkGypCykH1Vam52eysrZF(W5oF@C zE3Ljv%eu^?8 zb3uZmGEwCic|pN%tl3Hy0_&vV1zU2m)-P%o+BK}+W!3aQ2m?iU*wqCtcgb*aO zJtK1Ilh}I-!t1UcDGD*I8VTjEI#;3o1p=p3XxDxOnKs>+vu7U(^>C!|iWZujqF{8bVq zYlCcl^--XD(0ZL$3WgXHuO~# zRECQZuOuiaPD{B&XKGxVy4Iqwr(D-JHGtRSxZJ~^Kn!=&rRSgow04VgMU;G$-osAXr`f={atn zDzrVOHjzlvK6pYr_j|;D8t3Oo^Af?jTO?EXJ=r=j4mM>N8rwlSJjMbR7bgwPsPo5R zs!Yth*{vVZrv`~Vo*Nq7jp52G0Jgw)h-r%LFR z@aD{oQVQFdbF*7z?ilT9lRGHawv+n>Sux3#kKLLeHU>0Wyx(5*dCn>KfG_K$?@r+9 z%#R%{LPB|p&$s(~{@AG4);+p&HJC%u9ERNt9~{A-bp~85#`XII*UpalFP{tU4ay@v zdh^j(+uUh>{NXZquoYixdPMkeb5JBY1(2Hv_00`BujXr$M=vNb-xR)9lUS+1EI+gEVlIMu>9CI!Yiidb}#EgL1stA zW%a74P4<=B&mk0~@gwa}-!L>jc#Ey+{oP;SrqKtr3R8pjJ|}K#IsCNThJ;eQFW{nBoVG_gAMS~koJI@QBIq&o}O*#-n9OD+=MHlptjWd4@SfQTCd9Vs4P{1oPz&Axnk&6hEI! z0FnogrJZZD+L0}jq}3m`qvP9qkXkMzk(5u}>|3O*`03>Md(KxA%g_Fu^`uOyl}t`l zgfg5z0pAM>xq`J?H3mr5C$WT(#JCAA+%(Q3f-@~(A6)VuVlH44_Y?X!WNMe1E$IBd zgCX1k=TLt8BT2X^0rZL7cEbr!UYb|TG2#yfqOLFqjM{hHoC-AL9Cz^*&6^5=%q%`D zr;~&>gZELrAQl4bu}8yX3K1va!TBRcwKEZ%7nwP!in8SQlM%ZQdR#*w zwN#76{W5Q_NR%}1Jh~VJ*)Vol8xw^xtaC{H-L2%~!QrkgPf>USScSfxF!62(+oxC* zX5q<_pLB;#kc z>hhi+*sZT3Y}yTp?hhsKuJV9D|1I{1KV=qYo*(zQ#a@BwAYnnNLW+R0*F3Vfwsdkg0R{PD%FbmJ?xlh3)l@JIKe(%t z#!POZ6SVf-q~8pV;-i()ZaB=Z{i{xaonvLa7=i?Z^beZQ&HQQI&*{dj=UT235tecF zBfOPIN&h9)^aa_GPh;0>>Bk?${rAIuT6cQ@aa*g3>pd)K)#4-kY-+D>*c#U(1rqjG zRILu@A8R$`y-63y$ct2)J-%aHSLT=7od^z;Stz+RhnPD>x=PmbnClJ4bF0+mnwXKa zfY7&teT|*;%XH?2rUoamZ1MP3-~eGkyJgV@OE3QLH{C7U`mLD8D~@OBqKRYAtwXf5 zAJh;Vc$J1Egk;*Lrqtv4{3ef9$qUK6{*zed@uXIn;wNk$Sw26^POdG_Q?%+d6f)Jj zpzgbJXU4#y`U&wsj;Z!tTC3F4zX^mj!}bfy%&uY^318u05&E^~+R@d`d=~aLlw8-g zRSK&3Tf*OBf~Fw>aSwHp5sO>$2at(Z@`N=tSb48bOnNb3Pj5>_Bt*G&SOwgB&T)R< zUNII;KfF`i1Jft#h>22+SqN7k=F*NuWwK3rU4K63`yvBU1Fe5|Js&;2H6D@K#sSzXdwe1@?|P)VN-A6PVNbj7o;c1kp)>7nk)zjb zD-y6YAC;URsdK9zpdPmW>lL=;K>53SFUtJjM0w(-29V5a!Ym#5sG@3*>C5KyXCX&y zu98=~EXe#;hw;7!*UV|;0zl09y|Q&abMzAriWEHROHtg)@998^yHHd0qGH7U=QXxA zV6HDLS@YQ$A|LzLeOCALW5FE>e75?PScS@}h7mVoE|7t-ol@abVU`(I(y25jOfP1J zbPt|?>kg0YO;Rw1Bj|Bs>DK4g(~fYNYjP=v164iA-!VX|Evw$)TM^Y9w09imgPiK6 ziO$qO2Yl0y3R0q>f38%f+amGMv+pAq9;S_tS2q*dE``l*@j{O;YSKEcDOKfPYiA_V zhB1qO8?2rjk~_cK9o~=G8R!-Dd)uJ-g5m?FxR?bUe0T$0{xLigw>1>OS zhZ38TuoJn-A3e*^6o=H(FHb-6D=Xkwzk38~f));&wYFpF$+VaIA*GL3oGgf=iRWk= zuGgtSP5O&4u0QqUSUKzU=%)d7LaBnIG%W@=E$;_D@WNQ-inm6+3trx}NcLrwH#U&Z z(dtw>OM(K@4zkqZhSe{Hz?LUN-s+lXt`zF8Hz=9W>{`YAJ} z7LG5!*-=*Qv4k3VVrn8k>E`#;OXQOUB;fY05hB3v=wOYQJvM;(Q}@eUIR9UK2a_HP zMV({$>FVJUGxN5D|G|rjqZq?SE0I*NJ+EFf7JBs`&)`7n3I$+|jtRVv&u?R%s{U*zryd>H&=lZy6x9aUPLkiz^Ei(o|dW#E@I z$Oe7~ zO<@f%do64jvo_y&0|2MHNjSdp01%{)N6J3WQ`B&|=;2yKr(92N2H za`CTdjzxfL2a^eU`rp1u@~`x2UP-9^byW>iZ&#mC7y?=A7Y3G{*u<#om~E5uJjJGC zypHcH8W^{(MTxGzfaiYJ!QXQTT4ir#BvTUbSMz;IM*U&GVW;K>giMka7U^wKzIhV1 z=CxA5Lvln!`NIfj^@L%=+9ivLe-E!$u;QL`VLVb&4If0&I_k>?sMbtu z`S7IlMHZ@Y?SrOp*|22fJOW+-4p`dFs#H3R;szl<7^Tv;DZxuH;L!KIUFlNwZtuAy z+Qti$yxi579{BAI<2-eT&Wd_)!H;gYu;(kYZ5Pq0Xu>kUcb}$hMGpxTaziky0Tm@k z^M?8O5+vCy6!|cK&#fz`gMq>n@W@B_)<5^;Ywc?5-nzNtwbIXbyvZxK=uHcW_z0{W zi3&-u=ZAo6pMC$?9Le{I(%L1$Isfp ztkdA&V5U|t!7U#6JXDp&GKL#k_So?}XIbeY<#gi96E3s9=_-sab0$7zYMS>>?F*hl z0_PT(`&sFYtSzqwkE)e(WTFFeA*L`8Y5MwyvDq~D?(zI8bXOCHq4w8_ zxCj{E8~^&Bo(dpF#c#joVM6Ejt$T;+K!=k~eUuEkChqY^FLe7e3?gcvE}Q`k;nOg( zV@a|8n8s8Al=)<%#8Y*gWLxMl!T6LxG1gaAV@(-6-A0c<`eg^aT=MD?zf;RwRx8GP zEU|F@ef-+d_9I*!-habJ62r{Q7am4MW_M}B+b@AVwp(v2Kv_~kkSc1jz9+5pT7!`S zHeHYE(Wj&>g_E7v@-ukmp$IsQ)3G%%nYy()sjF>IHs)WuaIRT^DIad*f#PDu`d(*{ zyL0AOhg+etyl2zgC%S!%YxK!~7aQ~Om>h8K(-HP&)L4vL6xBRz{S9X!^=1+b(#f)8 zU?#fP|2#22P7u5^;u+tD`#YVYh;Eg(Dyf<+hermfh5kA~J0!tP;q1`TARgDK8$-*S z!A9s$VXdi6iT`_-9w8yd`jS~QeY0bN=q(ddX8Xxp+T&B7{dnIymj0LV@Mg=0e?l&N zhnMEHmt@#k2nFg}1E6Tg*_HWHTouqYCV8q^=R*Mjo&?a*&`-x9p)8`p9lOH#{b{~m zv59oBq&KDqB`!NXm$Iw(Id05bg~_y?+bst}zOMaB`}^7;k*s&?`V0b~OWYG;>Oker z;hU6cD+27(f)$njBTI6I9)7qt#_caK;`X^l^yt^uI~D^PjY}VUuul;5@d8)=&+E}J ztuM_R5Gk=3l?s+utIFVbPrG2=^`=jv(Qh3*qSFNPj0h>$s@!4rORrBB;Yv6L_<7Iz z&I!JhW`@xv}Z!KoNL zC!E2sUMTOK;Kj-*2VjEnM2l>4u%k`dm7?mv4^ur)$+8X9+}_t+Xf|G|L|d4y&{Lp} z3=hwe_v)Q$epjNfn8Q>)^c{_f!C-to9*F|*a;unas^vkuF#7;bEivUyZg^^C{m8GZ z|2Q!yp77R68R3Zm1_qV1_(XdaId4tCLiOEguR*>!vyfqxW?|6iA0M)bL4U&pMPksz zUl7UNGJ!^z|CWa6hAC6BxnbF;sR~p3Ge;#JS)3DZ*vzaOo&uQ2Gqv*B(stPeRi3=8 z;$#F~#KXQ1;QcIa?<&OuQ&?c+uQ&F^Erm(Vq)!J}}bI9Xi4f?JX z9m|jr7Kawk#ScHwjvcABKVIb!5NHG({Adnx#<_iT#jVc;GYwob@QD;n$@L*+O~4q> z?N19mN)npS#Rvgpq%yAWHHWBV_>c~*glfTfd`XAwK}Je9&f9Bf zIzBkk1@!+OZC$?2(-%~s2lSJ-D**O~H2}f>MCghslkGn?)4L+*1UYX)7EQbJfQK2l z8(kl^R7G*7HOQ0xys+X+VBaPh?s0X?AKj4TBCmY2#(?FZ>aBMS*G17ZUDQYUxN+0F zXTO5aXiMZPXiLyGt*2R46$$UB`7KrrDwZD@sr2U4D;=UA5&CD^{;7_t25|C`LEpNj z(CR>|LeYnhc47Fx$TDR|g>LTZ^mlM&MIyfzJ(@94o?@@jSW@hhYrj=v&DV?kbRj)s zg!*U;7CCaCr1{2qph^wf(6QrBb-D{q zdtB%v^J;Kc5@0Y5U8WB4+!<-^yX&GSlRC7G+9Qv=&4A?dj5LfZtwnj!?M7&QH8Zy= z9{Eq*sG4y4EuA+E+~M3z#9^g`pLR$2Vrr_xXMJ9I-lE|khaXG#O!?;D zjey?S$kX*wZh!);Ez0C~1X3;POE1#IRv$IKB~r;;nSCFEYGMLs-Q{voli=9c?d5nR zV(mb71jj5x!|~@Eu|x`#vFj;=mmK_0D1YTyBX|Q9Ma~sB$Y&n@C0iir(u@=M!;q48tues>~<7k@%uY%O&M2U!>KcR}=q64; zNh0~zxUKR^Hg7CefMEkM{ox=yegw~y11y3}6xZ?#9Zcv~k|xuG{=hwrUcrh=8c;>0 z_`^+n2hr=RuA|5wv)&&5x5aEzS4wA{?bmwe_Vz%JM_S|PXf7`yhl#xAdKCm6*R}13RD(4i_JpPT>$AwkzP5uHCw~}`jP{IGO{>5SN zlv6dmIauUPDirUhF8iz9cxmc_h6fq2C%nGQZA2HZ@~T8#JmNN&7L_;|774+|o>8FK zNjnA|5PZWnM?La>X53z_twA0x6(@zGOXoniG1?;3a(9>~X6>n!Y%3w(iv9izR>JwO z^W@#Gi8iNCm8<=JYOy?Ii?&3B74KIMhBGSqj>Otl>xJt^`W$C}o`&%+y~YkIO*N9v zKu0hi_N)7%;*Jo-Kw*8IPoczBIpBtBClhQ^Ub^(11q!fp*zEImM(O9FXrnSVi{E@^ zfba_zF4L)bkPs8k-9ZTIX*|%pwGJ(_2aPLUNneB`qYdPSMV(x;%zWGboAeh>(Zs$* zgYwCFeEHcXM`<&wl`clTOGC~hWD-?e^oZKdP|b5yz0V5BmxB{)nVS{^O< znA=nrQ(=O2ooXcSeBrt;l_ocl{fe-bi{s%AjQvZ847Iw} zCVN#g725bLI?5zn^Hygr{(LoL`j!#<^iGlcUT-*5p@vN*8QI9#-g;3*7Y>HBU2me54uSO(6hRghoj^O-f^W{p{_lz@k`Df9w3w`txkmZ%e#?~YuIZsE=pFUBPOm3n5ltYx zVIG>^jTfFYcTan@(ghLbxV6adAmLWx_^KDucajfiUa-v)?lB)(1hWn#dAYG7Hl`+8 zU;MrvTh!@J*)^WNmEo+TB`UVhMYqd#xyL@AR(Mf#;pR}4v{&|2^iT_^t7(GLRRb@D zJi=LHu!XIUG~?!gcKy+*M|B64K>A=gfHcZQ8a>OKg-!|37YgN3)@ft8ns% z0vZqJ7riT75y{&=%#Qc2Q2ubwfv{UmFn9Mc|GX3}H8>|iGq{cFn0j=uIn`p}QuKcQ zGdMknNGP8t`i)31kcQ`Kj@fw%o~LFRCzA^v35`#`m#&2bw#T}t(Rx<;H| z(ds+WcuP3Pc(EL5<@8hNwIc6Z3#K1)Y%FY73%J^|QA8VFOt_Q*56pjZQJfObz2B`q zAYIqKRbFQp4K{b=kc>8#bI@DwZE6oV1O;ldvzw~Hk~RF2jWyIZ-KOy53 zhWk%q57gC)0%PTzBDttGytsojCQp2tt~m>WH8zwkAl)>SZj(nmd%#D9dl*DS$1wd* zEC@Z`)3SQ-Y(UrYmaV4H47dmn6+uK*hkpF{+o}jV+UiLh_;W_7jL@{h^)b)ExQ-Ia zUrmu92Rq`{-KZ@Jx}2dEg|%z+-;O-jUG@tBNL)G;=$XmGTlgSd>BO*uukPP#(V3^`4 zMC;z*Xp9+-5q0r};1ttvbK!`aQivx?6B_PX7DU>s>8IBeS|?-#e?mH~C)|&*=sFs{ zB8-`yj7)NX>{;}*I^pbR8NM zX1B1mHSGecS0Awz_8TMRqsSc8NmqKa@;wY)mw#ZnSv704FoydxZ2h)Y2;{z=*E5=| zCfRKKMfv8!XmTocxMx*zi+Ih~=#clmh1CY{@c$fE6;h~Z+Fe7$+FG6|wdiW}6I>t- z?<{*}*NDuU$kIWaT@*@nrO0&b&KD}bov+_dY-nKn81W4xfzSIn9I^-JnC`(iqN$6#nk$K z{6X~_{i_l{TcuHH!H8YR3do9go7M}q(}ucZf}yXy>{t#>frSna8-j6J0&09v0sOd$(3uR%kD(c@b`^b%7}xvNE@3pci*3~psF zw1iXmn8wc2J=E?}y-kv|AK|aPQjGV?9{ zw{-mWE7KmdV#n!C>vBQx{_DdLJaOB@YQ~^xEfh`s^Nx9zk=F*NIQoi1ytP8T31~2e zJA=SVh|S0R6Hw06RnuVY@4j5l$xbIhJeu`SzY8 z4~yTE#LUz$zT%v}Nwsq7UyN7F$?PH4v+JLzQ}|?rxwCEL1IOOIayOgkx<_R873$(` z>V85`5?Ny~$?kKBnZ17=5$uvgi~}LIT3^Cz(4t-$ZaT`FMx#im&g+YIZwy=VPBgO` zpy!?O(QK9{f2ka}`U(^SyYJ1qzO?ClBOP(s?&)ap`&bBi()E#7&+^N){_F+dUT&k| zyC@Z3KXiOi6H$oAWuFsq{hf_uJZ6!&gSXn;YUAtBKX@RcQ^h~n$T`605G9XF5Hfgo z0c6cB?zLcgehuj5e=hU6FkOCSV}lxGv&m*=58t6-nAkhk#ibycpxqYNc@RAHY);cU z(|PJ#$Og5T^SFXqg))tSvbpwQ*iHUktmJjp=t^&qJa(ubNy}~Em8D& zMkZQrO?D?yKKM{(B1mElJx-1A(!hBW`0R*0SgvCQ$2;r8x>BA9M#Yh(zDISVB~`O= z;<*+2@fJgEJFX?4{MQ5bD+ph&zdyHr{O1P7udL1ueoI;G)A`-BBYf0MXSMIJ) zgYXJKs+Botiw?x<80P>MCGGrUgqk2b@8*hB+_lH&kC= zHlAIC`i;&g%4!KRT6HJd+QoLs;*=b zzjy8s(>Uc0%%}osIW+8@5ygN*oO=3?Jo?>Tj}h&sZSMcAAoEGTf6&lu1^!scX7Hvem7qS!#0Mlm8$AT z$Ws5ANK8VS?dv~a4c~=EZEpd>fUPVGNqP!ByFJmq&>>!2`reHPMWrAxuEB0HgRLd8 z5FUvbC#84(mwl_ACgO}=t|q`6s@L;PE(r>V4py}XRCcg<7Cf69sN3cte9nDmbem3>H0Ir1k&U(CEn8RM`ZkVYxz znEw3UfPYTDP3tA9x!o=A<1)kRE80V?%EwRVw$vmltrnW`y~Be2x7I&jKu)Q?@Lsg< zqEoK!-Ktby4Idc+k0@sL)c2GD*A$AnXOBG$avOJh&bK0Wd%}E*bHGNMOYgCIEUv@1 z(dQ7QPgn0t4b-}7fA3MliUxW3*?SJ8DZRG$NR#l7&!>&{;4rg02iq=?d0W{(9pdj) z+<7%3&ryc|Ao^Q+3wA9#gaf0C9Zxyws2TuiZ{my1(uGFaNzdT-YV>yC`~khooXBqs zc7Mt7;A%wTs6DyY36EWV^j_#hS*X;Pzm4co&{#uhCiEDE(yS<3+;& zT(eY?i=-Z_%$dfp)f>+fNiqI)AybO=rpRc#_b~fliu{_076KDQC6qE%D_dtJm z-F?j5tv8EjB$OS4sA>P1p9N(=L*NW%_yTdsDJkZdlJ7fEJ2Wo}=WFxyx65znqr*o@ zK616#j+eOy7>M0Xm>r)^@->GX%9VY|I`p|9;outr+q7@8C8B{pN1g6Ms|k zFXAQqGEMP(ZhStECBKD0rk0^@l370o_bZWWF`GDbmqe*k?L?49jKXso5R(&&`=@Bz z4=$*Igd|Bu*txqwfX_&WY9UvoY)3f5Z9?!XnofE@((GcQ9$VB%6zXf7cR1^NeB(u) zJ-M=CFwTe0reYj*&VB@oG3ev)+_R~P(+BnX1oM=st3B`X6iT1OOt8$2yg6IQ@8;rO z?|Xp67k|N$VVnC%5g2@M(^xm0@z@fT0LObxRYm(#3}*qZtBp8+F5pFez4d!mv{~RG zM=dW&^Ggg95o45YWY%`7kxe~Q<+Qn2)xpIT{;2jMfj@HWgHp_XQh)4zho!fRz7y0d zkZ5;ZNCg|UW&EJ2sCs28dn z*;q(g>NFHnQ_A&*=mQU?z!_riL9S_oNyp-g&sxfjr(;+FnM-o1< zg3uu`sFzoxooHyT0M5l~ZLK=#nnk2nGA{a0ChM$J7_AD;p^%<#kxa7q=QclbRnSR= z4MyUVsg)2p3yYybE_aPT_M2n=<-PKt&z|7Nd%O~m>A#G&TCMe`{9Q`LRBhS?pOIr6 zI$WK>L2e3VVtyj|ykyamK zGxEdqhx8)ed#{t8agwY%vCC}!JhdK`U1V%!_8QJ&{TtTbc0?qLSe z+aHECWTGsacbC+gFMA9q#cpc!NWE6rnwG%bm|@Y0DGdd=mpcST5n)CXX69|O|KYwm zKFo|4KSo@>v%d-8IaTJN3yCXc&gEUgrZ8HTiiELBy_gIW)`lq1sC7^KpV*NgQ?4BL`1B!`-Z5 zSmCACVFG6%O08V6O&YdbGziiLf+ACOoCt1vofz1vTxyk z(+CS0w0s4}S+eyr3Qd#=O593HX7qwU_UQY1yMrw7rJ<>Q6oRG0ss7vnft9D`caofJ zngxE36$gocga)kX-##9k0t7kX|9DR z;l}-bZ^3z<>oRcPVy64IM7rqco3BXSevXac@?3JglE_;ci0wx@Pd7}vnJ2kAG)}}K? z3tNTR2RUU>hci%;gS5{0>Kd#Cb;4DSZTO)kkl;_hmZ2P_f>D-Ll2Xpg$+irJ%5KQ5+c?~+*{WVLIbm(97B z>w!;mgU9&5@Gbmad7Su-6-S;-pyepx|C2}WQ?DJQuYi5zn>wLK*DKOWm$H#oqj33p zS{0SQGcf#~SiSZ#f-rxSEzg}e&H_&AMhn;;`)XaXA^eVNJr5^U+mAWAenYry(!hK* zk#JhEF|n5H)n)I~)57c-yn`o{NvnZ^t5!wUZsWA)3uah3A@u=9>vitqJlwx(5_l@R zO{i2GAJoTL&NovBt!W(4I-u$bAGpvRr2cD^ggp&ewvjd z7Vdw+2*jl0_Q{B(cW}}KMn)@o`s@wLBj-$ioI*LKeNf6eCJG*7#5X5ZP92;r2mNnv zp60bAN3M`!%#f@LK_(iG;o8-ufClol!1;V25(qh}>k2Le?5*`?y#Cgr#|QONC*kRQ zo_fbUX26c>cF%U53PtE)?!zeNv=dn$9=osDTibHFaX7cqlU+xpp<8Te)vdCijCv>7 zd7l?OR)YQUw-Y2o&pwE&Qf67ZBfLE&$51;Gi1=@%=VM{uUTH zQh-!paI{Qv)5h`oKsOtmWxfdvt_KM}tE3A%@~1GMO;ec7!Q=LaCGA&r(F(%_8)>OR zshg#9do9ep#%~v&7{BkW2{j1>1{$_TKA{c1Fo-?=U0p9v zw-dW0iI<;7J#Z>iLNwN*OX=4b=AcNrjT+26wRTsGJRuXe#YeVlk32=Uaz&t#dX9A#X2B5j%rUpUdu zlb?U>-YoqUpnBq!7L$>rg8%AJwWH6IqI-b54;I<L*}N4S2bYd^Lz&6c#Bi%>Pb=Bba;-my zGd|6nzWqF;Y0O1`g<&2{%-R^48OW~Yog;r;)~%&b+oCiaE2r+eZxu#TI6(5N-9p}8 zn$hgcQDDq4&Dqq_F&$N(s*~Gq9=g9&SCnrmyFJ^9Wn*a>u9~tZXAX9gQI)f1iZVT4 zadStWChqnKo%Q8}MJjy6B4EjGR`L@@64huR{~U7B?vquLF<=+Eup#7A`be_&7oreY zy3LDA4$F_9>}!^;9C%yyJGhTKNjG_MYv%M0iGu(S!C~~Ipx3U|aKOy>-9Kx~HoQ*J z+v?b5W%Tj5f}UQ+QN-Uwbk3%9L-kn+UiitoQROC|cxpVbcX}jhsr?mYgIwBI(dxZE z^ozctSEmC5%O`Sy4vkyw9xu-N!xi;&*f2YPJ}R9__^MZLZ@ z9OT(sXX0ubm>h*+HJV?0@*iHO*^qzWQM+1{n66$v-9hp(UK(}-xO zoF2Q=-`Lm__&Y8$YyoC=_2Ro@luW;#H19B_x$f9K{WMPiL0bZ5d9S*v+f(w;=YGmm zTr1p|7RL4J^+@#5(n7eMawc}pMbifeZEMkDvc3TN_Mmoh&6EB-Fkj@uTJlJSb?Xm1 z_2+qNI>nJ~$R4saS4>TykRFApiBoJSqv65bSN66QxN5I_NUMnj*4RO z=6Pd>O*1-kvSYRx?T;vRKyTKDXQc@RSEv7`RpNbnYqWgAaMbX^hT`vgl5OoFyt!5S z?++ai_uSW{w#cKHD#@J$ow_RZ_sV9PQC^2jTfmZB_bhK#eFc-I*A|qIuVi(b#SZm;>*qBHIHQ{%`ocNv(=mH!j3BK%J2I^~#`f$sr&VcmT{aFO`Y9CgP_q zN+~|8Omd~7R8^saV4d=R0Q1yCDEg<>kupBsoH%w{v`%dix1HgMjQEL0L;O#JeJIfE zfX3^~bJ5e`Xw^ys%qN1m`z9|9kt3|T`^Zr2;M3_A6lH$J#b|TngE^ymrEjp9?qp4E zp?2{=$w!n1B#u;_e-sh&Vm#hYe>Q!kPDOlMk8Od?HY$b~eSh#&%P%Zn=lk+Ny-BMn zQc91`E1lr{M@?XJ;L-vAcGCL%Oa*h_4`~l$ivWw{Ee#_+gqT(=K6*`^mrcwi#)5vPldc|##7XWpNG?|HV%^voCZTfiE zWqJPhd)7icdPCbS@}LEG!a9Bops07(`RNsv{)#T2K$aT=+8_U1(BLfK$63YP9p4p) zo}N}@1(*togw(Hy%-J>rYf^RiFHy^Af8X3QR_(WgCZJ4zUirB|Y-B`)hAhr8K|2lX z=dvqx3XerHIAgO~pjT?k*rJuBS5%F);o8{Z0X%^cC3LC-6tPrSIU`L@@Jhi;AZMJ^ z$|8dtxL&}v$Gi3CGjyk4xto|oIo zS=(Q`*~ z1iX8+tGW=vP4D6JSD~B2frItkEO4R07#)4deq5h=j$1p2LfxKikAm9Dk}Y# z{`&@RwR4BZ6}O*1N7P<*ZYef${~>C3oUIX^eQ*H5#SX(^O$IJ@_HaZ!VGDuh-WBV& zoZ|1CgBFQSzM}qE1@hZWH$)56W7l&52H`B_-YxSS7UnQ+wv{xKIpiSKnh1fBtHb)nCCwGQdq!zh6bO${#6Xj+WT?Trv6L^8z(yp4I^GR z0rfO{iV#Cnc(N?<_2Ij1UEwSDuLS-_T(M7d)eo7IXT!2=yp(E@8a1qt5iELKhh)(y zRwBl257O|LL*_-G2OLUCG|cLV0-*C}d{-KG*83VWz=`;FUHlw~Z$ZV5l^&5oUrg!y#G~iQ z5XHbXR&>ihC`06wwPJK+(WHMftJPyoxak1QquD!}hn@P{jOUzUWX0&I2ddv)-o^I( z-(tzF6YU)UKra{E+;#p%geHQO&mwrPiE)k^7cPG_zJ#eDcZvo2+t7!d_oUnGNH7^T)DH$d4`Cp?hnkcji4aG|4BDkEHz%&bKmDj~+G0 z%qa}njMNERQm|}@tbE_?QGjZU^iP%puf154u|@`4JTyorEAmD?K+EN)RVhUQP^ZxG zuo)Lb?!+z4Pzo1*!k!t50zY zxpS}~E86>JFkehB^#$~AVtaF*+hmG$tZ&^NO{X7^V3){C_g@kdZ(zL++})?NwS2Pa zETJ2wYL?8lh6jjnE5{x#%H5B=ES3#nMIxe~TB8fe@dSt1nifX-uR3SSQY+V^(`?z> zR&y+eU-$hwsj@+ixo#LtEIXd~Y?yHd7tIx32*tctC~ru9UT93Pmp?8LtfAd)Q9%~i z$QNhBkKx?0#hwJUbS||{IIR<FjVDsWe5hH)uZ13=;%r8X;Z3 zfIEG&nW)4-@43IlyCMDGtAu<>_$(o$K#r$x`px>o1Ipi8_EPD+HFskN@^VUV9GJ{b z3)k(>A#m3C%!J;L7MQq~jC>DjSDZ-28OpluVOHS1P%Bbp6Qe3KK;4J+9X9b;!+wgP zuG}J2lhhb^sdcZ;81faXWw*vg6Izq%7_jQ%hgytEFnbn^)J=^W) zF^w>Gaa^NOgxGRJ?!V|^)BVQIcel##6lM?)Zt^z5^MJzB(@X?EF6V-r$F%M7*RpPR z0loDlbp3-DFn%h^`6E!~_!$cBU{ZU)W+R$>*9`qII3J@*(ug0=8*E43Q$T*mq&7l3 z#zookEE6|V%^SDrzT;DHNevs$Ir9f~b57|dAG*C4pCx4FE09(%XW=9WAE3UiNzjs1 zWyU(mT)m-)@z2PjCO3!w`=USxX(!`{yAv-wKXD#zYO)J)7)7vCjtN7sGb&CCBbwU+ zb7dXg>R&9~UNpV&1mO%`da!iixaZi$Pi z1A41H88rM4n`DG5uuiOg=C{+M8{5jd7k9Gtf3NK-P&i|Iz=O{;!~{DoJ5Xp=O&+so zE{5mCkh{drT^uCPuRhz=v4apPKmOy(&OJM+?aN6em85EtUca;(Ew>RO3;rU zx6h$)ICtm8%Fe?Yvlxhdby;PJDc$0;H5_g*lS^Vr*uhsk#xK-m%P{JgdLk2yb2R7? zuMiPEt4Cka7gBEmZh_iw$jLM~Q`+X?oIo$2-}eou@`@Dlr~6X6xdqP9`6gHz|mH)K>1fV$;0fQawRCs#j+lTs#-&%+^+Lvn#v~ z4yrTR+z-I(P*AVyl(M-MnrrIKfsmN}#9%Um*qXY2KQS~sEWJQgj?`mp+eI;M0X zN5#_;A+@{EJksTwdlx_CY~Nx>uhWxUB0N+puyOuNS%_*Nb4e@VS8tybPeZ)~(c#KR zY}~%>pzT{MpF4s%LlSGsDXsJLwgVscr}6pXB^L5+vaN zW-mPg$-%P^7%6f*J^Yi7?%TNGhrlJL9WZVcMlUfXU?SfQGxjVZa4?QnPKCN|@<$C2 zLfz)Kq8R()qFAXYv{i*4RmFX6|Oi}>j76M;6X#zOKEhSH2VQ4c1>Yu3T49R@_} z;Yer<*Iyw=~PG8WTERe#7a?7ZBl z5f!1&4*`dK{NSEtR^9QRvX$2XKN?Um`TKVSs@H&BiQ0)f-$g)#Y-I1Z$VGXOQvMqL zg3YMxpaD75cwSPd^rppZFg!uyh3_X5VD%IlCbU5UmL@uf-(RzFNTh>QvPZw*uCMDv ze?b<7avZ;0r3bgrW^<-`%HlUNj_Y-Eu_yJbMm4;FpxZ#NmhM%gch^5wPxc!H<~8%- zuRy`4*<^Flwfpt|sy-^Q>oAr}+_VdioXYQ$G1=B_br8ok_pTr1&Zk*J9BD}&nbq9| z&J8gabKKXaejg)NMj%4!gQ~o4#N3MT!K?GTv$0Po?!q^~l7G9ip3Ij(OBDFxPmkK+ zVlzxg0nC25SEqGo1{9!+D-CS^ek=Rn=Zm67m;qf%Pfz9EeIogd%}0wy^Ze*oM;4}3 zqI=jeS8D7&1BeIG8bxSd8Dj>C>rF(qJH3fpvjyRcjj$i}-f1+5 zs>G6a22uxS@_E+gLNJP`dQr1U*IYdLTG{GjJboHn@kfTP5 z)B>f7snmq1IhY$vE|x*~C8VnR9nAz^>u0%II5Q}YlhB+YB~@OJ2gzZjOnj^h`+83g z+4Kqdd6PtTA*3Tikhn+-f ziVN+Tz{!37?&)}gOlQ1$B(oqIsoecdLGgXt}R;CAJuWrzt1SeOH{-z z)EA6BmB-h63+zk0yxSANC-dWqpHZP1?zz`4S`O&>xOKT$`u_&AQv%2Q}| zA*FAk5{Vw!rhZGC3gqz13G#TW@m$E0ju&t<|GiI?<@}LpKIMbZ4h3avO92DgER?!P zFVgVPd{lbN{$Ze@aR&S;*-v;bmjMdLyE^Yxsk}L_ld2E-1or_%0MfA?V<0{ccdXqpkxn;`KW*Oe1 z#+t@^LKXRo9^{J6!N$7FHn5H9`Blr~>N$Epmk$=o%lm_WBm9heu{$)^J~GOq50v+n zp2_nV&(bB!i{~Hj&YAx_6`i{D_NBP~*Aix(?swdiVPP-auyt4e%m{WVmA5D)C#`b@ ze$mS>d!Eh=(Q@9030$%Cb$X6x;MAx4CZO8+k7wbWG?F;%A3oxje)Y|(?lz9jjL7tU6Gb#e z?aK$3Ac&n|yVX@GPrCn$X7C9mco3)kzGaM(&Wg|TZ^C^i5-KxPe!9xqtnF~x-Q^{S z3@tU|pPL~C;OcZu13f%}%J zWA&s%a-JUA;03tcl?qrcJ^&vi?cg64RIU}v6xYbk|Q_qAQd<~~@L5?tY4Tno}!2YUEI@ z;mr!f9Q6{4#nT^RS4YTKCBG~BhpIDpM&8@t)hCRMzWU_IviK4V!>Q(pmj3ed_jjq@ z-%av|71mh=WbPhcCU^;xhl$?DyeuU(_pNZ^AM z|C`;_^9yAdcCE|xInJ=t^I7Oao4sqwb7*EBb0Qk@T8ec+W=dGSKo}P@hvo6l=s^?% zGUUfs=4ir!H~1KNKxWiOy#EF95DF|JK<{8n0DD>ZQ=MyCu)>z_zw`o}8f-%wH7`1h z0WS5F`9+_AtJF@rvJm&-W>R~Pz=k$%**arC8eYkgEq$xmLcQoYAdi_4{@4p(K@*knV2j4gu+qP6_D}kP-#~MH*?OC8fJz0BMkJgc&6U z7`hpl`M&G_yLd03>u0TV_WA664%Wak*x*}?i&ST9BeeJnH$9=h%tfydIYg@6bPF(d z4(GYKHg;LYe%Cf}jg4ttJrzdFVW)2KZtPmCwcYsV+IWtwDnvnnzhv;wzx4?rw4HnR zK|-D42icJH8s=H zd4D*!z`pA3?;bt{%*(nS-p#K5^lS}(pT%(Ar$S8oy>ssd65el38id>vs@vZ_91lh()t@8vL~eqJF?e1GC^gA$!VNGMPUmfG+#hTdx{30THH z>UAX;sBhfw^ru&mZa)+PtQM(4926JH+bQh7L_Pk$0%<8};c0yg68wz} zMWW9_@rFo6PMP`F~gc)1un9qLwc*3-1UL*whnw)xF+s1A|-^kEd z7bN=`4~E?@9TO6LYGJFfQag}2BZQXLvSY%$E-H2H-}EXRnM;v&bbPj&WL6K_F?ipE zcAor;ou<>1;Jl%D|LPhdFVW_eFms?FXfTMMC|dAmy z4D|K?l54Hx#3IO3Ek6LB1be&Tw_$n~F%;_L_ctn=_z|ee!W#^WqhH^|c=zBVMh~ikUyt(? zZ|w_?kTdREo-F%#{V!8~S-e)ZcOHu93jGN_mZl?j@dugexF5OqQ z1*ECt$Cvm+*|$1#;1)_vsr4&IU);sRa7Lu9gMi2NM|^B^@>(S0p)Uz4Mp`SJT>0Hq zq!2Rt*1MJqB`ZHdF% z_8>Uu?OMhxnN zgXcJ>{YK>MIzEY5dB^M)ihL1xxbmqPpLaEFk|gm~2S1Por*H+ZLc^Vp;{?FP)&kxd zzfe9EHK*ERwvU7+xvcFV zqS}oP;~X`S7URU`(BU33v)-2J@ri&P7JSn4lUBTFhs{57#4r(0Qf_7klYf?#t(bw`swe8$w~#)q?UhoQuF*ULwxCRrGGaEU^aQp7q|Q1U=w=J zou3x%#7hAO5?X+RjQ^2CxazOQ;CAH9wieXMDErR*8fZX5C;na_Y~|WLX*?{0hj9uH zoxMui3pO%un>)swe?!n*1Hx&+L>h&e?Bd5K8RN2NbZO$M`I+Fr2QVn+Vq2qu@}dgf;4l))?bpLo?gj8B4n%Ac5| z#u%Lc1K2)XtV~X()B>L$+pqob=*q>bZTgk5L;~{jdn<9Uv)dyuT1nR`BMb>N`76zs z)ZB?Xm; zJ$*nP9i>m}&b;J~k}!V|Jho3s`jb>EJ@5VPO6npyqGS_tVzZ|YET3Y|YFfUf7uRLb zfOIyox=^N5vRPct&U5W*g+1@rT0i2~F?`p<>7|{*8EEEwq($eT!KAgG_dA4O)L#~) zk+}2pQ)8*pkCEuRn&G*Wi{zxFfKWl~NrH~pKh%oWv(k>xiuo^+_-`g<48!cCTpK|j z4j`$xe3y|(+Yi_gjRsesk!_t>a7FzN;+R8B`FrRbV05#{W7YhOsla6jeq06ME`n(u zj*GPW3D;IGa{DNLY#e@EwmLuvV2VKv-F~r&S<<C(tc|_jZ}{Lh+e1Af_WC^rkj? zSDU$h7^%0T82z|RB^_+{l^jE==Z^Gf?^8w@tE_5fVAD&paJDDx$)zd7QR^6YYCh=$ zk@H>YWI3P7K9QiuuLHfH%#qS>UwU!7ub*{|>Bt2=3vc)IOV zA?XYyn>B!H1b6p~fu$-K9>4YlJQO=0sN;v{457`<4th90hysyBsdDRP|mIc#Yx z?nu+CtR>HB9J0+cALn##wuh&B0xzwxmL-?f*@U-@YWxF7`UM!VComw*x#dTJ`~#`V)HiMDDi=y?0{nct}#mOytpnbI; zUspOpzHth9@qJ^w{HD*;_^K#$&>faBm7k2mK4S8OY(cVb=fSG5Oa8~=b>Yr{WnjS| zWwh+TXaSxzurXZcePRM=70q8NJi{F0lzgHb3l`Q{u>l(8bp@Xwldt^)K8tIiSyA;~ zuvoS`gzv`v+a>UOr$5!`+kghWZ~y-3nMa*up2z~Z4588U$#QDRk2}c*$hlD~IX#<4 zf&AVJ>HNO4O+&2CKC*LvdEW+4h~;C1C;OZeRnFxtc&@s9G?((oFAEL*{Q$B4Xp1~O zwY_fPV|a@6*a-lB>ZEua)C83*2B`%69BSjkw<8AGJn^|&Wo^O!dkj)Q&e@(OZ4Yf) z+158r82@*?(w$XmvPSA)QYJF55VclVRyKA(>%9=DaM|-@n47fCNTgc9Ak^HXT^d_~ zn?_j4{;Oc6#=D(cb4$iQcbbioU#HAx+kz3v7@+F4ASRZB9cgE!rokg#%y}9T9ht4p zlC1as3iQ{n`1JZ@$dv8a-FE6DF2tpbBBtk_ROLwPkHaUW4-7RnC*sF*a$go>FcEux zaAXDrd%({EFHk!XGLfeqVV#vFs!IZPp`PQz}pSSW^nK8SrEB z5LYqCK6x2e#IfbV+VjHKzCD5(YNY~=jAaD^{P*WCt3+)A5ms5=(C}`wyxydiE<@O8 z$+ocG;7zTiAPM|WoxAsv^4McJH*o(L ze2&?RT2uHT1HR**{?qENrK7;X%|X>0g0QN;3i}n(x^}b##P=VA5Ec#_Kh&y2Xeihemj^pS+^UPm4 zykpb-`JCt#K*e3t3Z3o_ecD6_^x3rpG|IJ^CNt5lLKN(E@IJ0peO9$cFRbg&B7>Dp=&|G4w#IN*EMGRu&|m9$SvocHnDC#|LFr6ojOP z1Giu(J@2hs6WYQlqgue7D8jfdaqK8K<1m$Dkk})Newjj%VEdSL4HvC0yH!lJ{q#1-V#VcqjB`S}${LrT8dU`H4M9-DcRLxmHp8(ENlJ8%=A?8?fhuxl7{E>$yoOlvzE*3G%LNnFLe$Caff% zK+mXYDia*|_BaFj&xJ8B-p>@Jn2V5}y3-}&xj5vXs+HEP;`$BoGw>qNv~M$Fi<;`h z5+CezPdGf`^YSEZ45`>;asV`6ro9zy-5uGt8INAs6gbK|`ru1{ZTk?_Zy9|t?cRO< z=j$p(n_q?=cLjC?FBCxzEb~KWs?pG7v~yy6)Ul9O;8Jtfcc7;yP*xedmsMCC2-Fw$ z@m?@~u17TkYcmVoU^EK8e7>I4+_NNsY&-b8|6D){cJ7lob8`r;1@2H_8f5)}#))<0 z!!c(X(Zaq%bKbV%nAZAJ*f?ic(f%KsKb|LF@z&cWcufBT5Os;^v2Z$0%&If2#~kO( zW)x#L0G!2xt*SaPgtGl7A&#I|(D^qnV)_H_42dHtU#!)|e-0#7TnYI04F?3)y7z;< zcTr+0{6G~%vlRA*3Y)RyC98dm2xf=Wm3NOxn-f_SS+~q7`FPC3cTPfrewmphtWYOk zsZFmKC$DySF5^JKC!RwOa_as6gtNSGnQ1YUS`)n5e}yERjMEtmNN>X%PF@ zu1l;)aFqy$YM@q5%Pv$em{MK~^yNLJ&v;xZOX{EniOD^lIQOY)eY=GK+#yGeqgR3T z?o=y)v4E}PVEQ(1FY0DvH#uvz=YB8uBssYmm$O19LsD15>_1Z=mV)|ObF*T|TENNU ztFF>xU=?YrfnKahVH3?^Eo`>q=^&1+|NR>Sy(Tm)g%7hhwWPL$Xdkg9qyj|{b1D|pA?fFo=L*K{(2Dp z)!>Mh?OiHZ;PzOR_2VUwbNIpDcrLgpmi1~|dTUOu zI%g`YRSS^FO+vm4r=A3eR4^8fg3cmsaD>MAJr{yY>=X&V<;4N?oA8Cry6A>DNl{vV`K}oYB zJZ_5o&hK=bOp;p2i53~+1UU7<1fCHV73SPwIsinZO>C~g}c1O14mLVwL<^AH+* zO^MKx&vng+;p}|N$#GQ=L5JKs49@Hn$X(vm|7#V!9UZ-w)*U^#?~>RGD*32@vAwGE z?SHX!US2d#ChTt>fq_HWyWQ}I2UL8zgywFyc}qr!GSfGcX=wM@B&qw@Q6=&#;O%{3k~+3w^;~nl z9o)j1Ru6WgwUD1C$uw*nd)7JAAd#2zvoxE{l|6R+r`GnsU@1NSd z`DQA87L=8wx4y6uOyAK1GRWx5)q=hVEzWAt{W8_53h!gkke5LiKNdWC(?LaO*fKlu z|G6w`;cg2U1rn?6^1R*havpchl9)?*6K`AqNOt6S7=Lx5Hv|}iuSnTJA0JC~yw+Zs zS^_F>zqfG|^+s;n*3oQkHyuM`wTTRAZPlyMF*lp7XbGwZ%_0QyA*82#CK_eJ856z( zepnIs{1|`6*6*MIr0d!=791`|b|yWung2EFXPKnWk+`tg3+zgSGgtuTZJy3pm?*8Y zM`v7F;;# zhza-JK-zf!$2aEfCv3k7C{WmdQLR6Qv}<-AZBfCh;Ml@Y(SK_}R2+*4-Q4KV!S+DM;I|RYQtntv$y{p z8H*<~15vFI#a!^|XaI-uN&aFz_Ti>B+fG_kh?ib_;5AxM>U6eNr57*<0^re^iHWQ= z&R%B4TjaXqHpyBRPtJzO^=7-bjJM^?WEzS8Vl+*Z;U|lYTzgDy&qzg$7e`;h$0OWi zKZY`}T4DY7Nf(0z$eRuAN2rfzz_%dEHX~m zJ{{n1_eM$O#w!HptGDO+_be4vpZL0?+79G5csoVvr3wDwa?MOHt9AIxCoo~an#ovI zqqD^u{;T`iAxjU7#~z=r&LPl4EgORd_v5ce_{nf(9hp@Ai?hF>+cs{`8L#_gh}T7{ z6bx3{zjGvFKv;1*+fV+so`2UJ#2%Rz-|?0AyEd9FD4K4e?XYLCFd^8TvR*mlL>m0~ zlXZO@V5dd$+knBZuFGO+x#E_GY7P*Ye&GuPHs!&(KXe%^fOwnzo!8P}hC-WQl=}OZ zRT6WX2aqjR>iG9{9km5*&PsJ!Upn}!(NG9_66KX_oo!aTBiQh>esxE8noxn`7? zoI3LcywOy@C-hXKe8V5VLfujV8OQw_Zy{epZ>&?%-tEe0rwbOEbLXjra?(Qq5FJoy zU$l6E+=2rsnJn69=xyI^08-I2Z|v4sKt1KIc^3?Cek3amvCpTdk3dM1HvDhX+v(L9 zzdX|!`>NsG%;VI|Y$)`>#v<;_LL&IU*vd&zCG+3Y*|vvf^V^q%T=}ikws%kaGy6!Z zckT)A@szqsb)sS{n`G4$C6a4|@egI#ahuMOcyuJ`NfGc$kK5ke;!@tW`q0>0&n3UL zexCR)bbFc;Z#kdR506b>Q}1!9jKf zaUwq=oIM&m^4>YQtdIV?SFX&zh+D5Vbhh3J0&#(VABSFyEiw#RDr>l5L@>T~nri0d zG|$fu98a)P1%f^0LoqZ^QYou99-*#CTaI?kym+e*8n806j*VgCMZoKQ5$VOl9N2>@ zNiNT2Co3|@triIekb0b$6tGKWcp(W#(Y@LhOF%HSl?)_t?W!atHlMX<9c zjebs%#&NHXasABtO~I=V`(U~lpZRfSDDXb-Db2_FiIh*mtRqiR5_n@@qx&zx#r=wx$xk5=PP~d4B;>)Ma+L{l#JZG z7EN@Lc4s176&5~`&-v0fF-9;*PWxhB`YGZ}282;=31`n7ta0NT2u2?UEu0jV1vrKs zK6tzlwAsjEhiiNNz7im$Z*#cmNl7Oe640E&on-jdbP?um!tCjOvu*$8HnWDcu2F}z zY3@@5J@x?oFJFu*>n}~*GxnL zY+k_9)vrEmEr)=_@iU+b<$|IHWaQ8K)@^=tZ5C>;w|6y3Bwt}B%Wr!5C8M)WCHEMI z9)KR(wUU8h3=+YpFJX(cQIFXV15|yQTHh)PZ+t;r@&&=V_3yn|ItpTMdapc(C&lE+ zf%9%X^j)AiWekS9t3eJq!}L!;W_>K99mJ zgolG9Ys$|D(LNdi77%@jroEB#M5nyA*0qmen?De%6S~GR z?1H|Z>8~p|6>V_2|M1FDy(T+e0ei4UF|PS4bBMZ;O#VVBfEn_!>d2q?mWjFr6AjjV zN4pR3>yf<=0ilw2Gw}N}i$V

      public interface IStatefulUserHubClient { + /// + /// Invoked when the server requests a client to disconnect. + /// + /// + /// When this request is received, the client must presume any and all further requests to the server + /// will either fail or be ignored. + /// This method is ONLY to be used for the purposes of: + /// + /// actually physically disconnecting from the server, + /// cleaning up / setting up any and all required local client state. + /// + /// Task DisconnectRequested(); } } From 060b01eee8d30d996858515829568feb827cc8b4 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Fri, 16 Feb 2024 20:24:02 +0300 Subject: [PATCH 627/651] Make CreateJudgement public again and add remarks --- .../Objects/EmptyFreeformHitObject.cs | 2 +- .../osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs | 2 +- .../Objects/EmptyScrollingHitObject.cs | 2 +- .../osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs | 2 +- osu.Game.Rulesets.Catch/Objects/Banana.cs | 2 +- osu.Game.Rulesets.Catch/Objects/BananaShower.cs | 2 +- osu.Game.Rulesets.Catch/Objects/Droplet.cs | 2 +- osu.Game.Rulesets.Catch/Objects/Fruit.cs | 2 +- osu.Game.Rulesets.Catch/Objects/JuiceStream.cs | 2 +- osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs | 2 +- osu.Game.Rulesets.Mania/Objects/BarLine.cs | 2 +- osu.Game.Rulesets.Mania/Objects/HoldNote.cs | 2 +- osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs | 2 +- osu.Game.Rulesets.Mania/Objects/Note.cs | 2 +- osu.Game.Rulesets.Mania/Objects/TailNote.cs | 2 +- osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs | 2 +- osu.Game.Rulesets.Osu/Objects/HitCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/Slider.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SliderTick.cs | 2 +- osu.Game.Rulesets.Osu/Objects/Spinner.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs | 2 +- osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/BarLine.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs | 4 ++-- osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/Swell.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/SwellTick.cs | 2 +- osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs | 2 +- osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs | 2 +- osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs | 2 +- osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs | 2 +- osu.Game/Database/StandardisedScoreMigrationTools.cs | 2 +- osu.Game/Rulesets/Objects/HitObject.cs | 6 +++++- osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs | 2 +- 39 files changed, 44 insertions(+), 40 deletions(-) diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs index e166d09f84..9cd18d2d9f 100644 --- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs +++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform/Objects/EmptyFreeformHitObject.cs @@ -10,7 +10,7 @@ namespace osu.Game.Rulesets.EmptyFreeform.Objects { public class EmptyFreeformHitObject : HitObject, IHasPosition { - protected override Judgement CreateJudgement() => new Judgement(); + public override Judgement CreateJudgement() => new Judgement(); public Vector2 Position { get; set; } diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs index 748e6d3b53..0c22554e82 100644 --- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs @@ -10,7 +10,7 @@ namespace osu.Game.Rulesets.Pippidon.Objects { public class PippidonHitObject : HitObject, IHasPosition { - protected override Judgement CreateJudgement() => new Judgement(); + public override Judgement CreateJudgement() => new Judgement(); public Vector2 Position { get; set; } diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs index 4564bd1e09..9b469be496 100644 --- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling/Objects/EmptyScrollingHitObject.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.EmptyScrolling.Objects { public class EmptyScrollingHitObject : HitObject { - protected override Judgement CreateJudgement() => new Judgement(); + public override Judgement CreateJudgement() => new Judgement(); } } diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs index ed16bce9f6..9dd135479f 100644 --- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs +++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs @@ -13,6 +13,6 @@ namespace osu.Game.Rulesets.Pippidon.Objects /// public int Lane; - protected override Judgement CreateJudgement() => new Judgement(); + public override Judgement CreateJudgement() => new Judgement(); } } diff --git a/osu.Game.Rulesets.Catch/Objects/Banana.cs b/osu.Game.Rulesets.Catch/Objects/Banana.cs index 30bdb24b14..b80527f379 100644 --- a/osu.Game.Rulesets.Catch/Objects/Banana.cs +++ b/osu.Game.Rulesets.Catch/Objects/Banana.cs @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Catch.Objects /// public int BananaIndex; - protected override Judgement CreateJudgement() => new CatchBananaJudgement(); + public override Judgement CreateJudgement() => new CatchBananaJudgement(); private static readonly IList default_banana_samples = new List { new BananaHitSampleInfo() }.AsReadOnly(); diff --git a/osu.Game.Rulesets.Catch/Objects/BananaShower.cs b/osu.Game.Rulesets.Catch/Objects/BananaShower.cs index 86c41fce90..328cc2b52a 100644 --- a/osu.Game.Rulesets.Catch/Objects/BananaShower.cs +++ b/osu.Game.Rulesets.Catch/Objects/BananaShower.cs @@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Catch.Objects { public override bool LastInCombo => true; - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override void CreateNestedHitObjects(CancellationToken cancellationToken) { diff --git a/osu.Game.Rulesets.Catch/Objects/Droplet.cs b/osu.Game.Rulesets.Catch/Objects/Droplet.cs index 107c6c3979..9c1004a04b 100644 --- a/osu.Game.Rulesets.Catch/Objects/Droplet.cs +++ b/osu.Game.Rulesets.Catch/Objects/Droplet.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Catch.Objects { public class Droplet : PalpableCatchHitObject { - protected override Judgement CreateJudgement() => new CatchDropletJudgement(); + public override Judgement CreateJudgement() => new CatchDropletJudgement(); } } diff --git a/osu.Game.Rulesets.Catch/Objects/Fruit.cs b/osu.Game.Rulesets.Catch/Objects/Fruit.cs index 17270b803c..4818fe2cad 100644 --- a/osu.Game.Rulesets.Catch/Objects/Fruit.cs +++ b/osu.Game.Rulesets.Catch/Objects/Fruit.cs @@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Catch.Objects { public class Fruit : PalpableCatchHitObject { - protected override Judgement CreateJudgement() => new CatchJudgement(); + public override Judgement CreateJudgement() => new CatchJudgement(); public static FruitVisualRepresentation GetVisualRepresentation(int indexInBeatmap) => (FruitVisualRepresentation)(indexInBeatmap % 4); } diff --git a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs index 49c24df5b9..671291ef0e 100644 --- a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs +++ b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs @@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Catch.Objects /// private const float base_scoring_distance = 100; - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); public int RepeatCount { get; set; } diff --git a/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs b/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs index ddcb92875f..1bf160b5a6 100644 --- a/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs +++ b/osu.Game.Rulesets.Catch/Objects/TinyDroplet.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Catch.Objects { public class TinyDroplet : Droplet { - protected override Judgement CreateJudgement() => new CatchTinyDropletJudgement(); + public override Judgement CreateJudgement() => new CatchTinyDropletJudgement(); } } diff --git a/osu.Game.Rulesets.Mania/Objects/BarLine.cs b/osu.Game.Rulesets.Mania/Objects/BarLine.cs index 742b5e4b0d..cf576239ed 100644 --- a/osu.Game.Rulesets.Mania/Objects/BarLine.cs +++ b/osu.Game.Rulesets.Mania/Objects/BarLine.cs @@ -19,6 +19,6 @@ namespace osu.Game.Rulesets.Mania.Objects set => major.Value = value; } - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); } } diff --git a/osu.Game.Rulesets.Mania/Objects/HoldNote.cs b/osu.Game.Rulesets.Mania/Objects/HoldNote.cs index 4aac455bc5..3f930a310b 100644 --- a/osu.Game.Rulesets.Mania/Objects/HoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/HoldNote.cs @@ -112,7 +112,7 @@ namespace osu.Game.Rulesets.Mania.Objects }); } - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs b/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs index 92b649c174..47163d0d81 100644 --- a/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs +++ b/osu.Game.Rulesets.Mania/Objects/HoldNoteBody.cs @@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Mania.Objects /// public class HoldNoteBody : ManiaHitObject { - protected override Judgement CreateJudgement() => new HoldNoteBodyJudgement(); + public override Judgement CreateJudgement() => new HoldNoteBodyJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } } diff --git a/osu.Game.Rulesets.Mania/Objects/Note.cs b/osu.Game.Rulesets.Mania/Objects/Note.cs index b0f2991918..0035960c63 100644 --- a/osu.Game.Rulesets.Mania/Objects/Note.cs +++ b/osu.Game.Rulesets.Mania/Objects/Note.cs @@ -11,6 +11,6 @@ namespace osu.Game.Rulesets.Mania.Objects /// public class Note : ManiaHitObject { - protected override Judgement CreateJudgement() => new ManiaJudgement(); + public override Judgement CreateJudgement() => new ManiaJudgement(); } } diff --git a/osu.Game.Rulesets.Mania/Objects/TailNote.cs b/osu.Game.Rulesets.Mania/Objects/TailNote.cs index bddb4630cb..def32880f1 100644 --- a/osu.Game.Rulesets.Mania/Objects/TailNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/TailNote.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Mania.Objects /// public const double RELEASE_WINDOW_LENIENCE = 1.5; - protected override Judgement CreateJudgement() => new ManiaJudgement(); + public override Judgement CreateJudgement() => new ManiaJudgement(); public override double MaximumJudgementOffset => base.MaximumJudgementOffset * RELEASE_WINDOW_LENIENCE; } diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs index f07a1e930b..2c9292c58b 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs @@ -79,7 +79,7 @@ namespace osu.Game.Rulesets.Osu.Mods { } - protected override Judgement CreateJudgement() => new OsuJudgement(); + public override Judgement CreateJudgement() => new OsuJudgement(); } private partial class StrictTrackingDrawableSliderTail : DrawableSliderTail diff --git a/osu.Game.Rulesets.Osu/Objects/HitCircle.cs b/osu.Game.Rulesets.Osu/Objects/HitCircle.cs index 6336482ccc..d652db0fd4 100644 --- a/osu.Game.Rulesets.Osu/Objects/HitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/HitCircle.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Osu.Objects { public class HitCircle : OsuHitObject { - protected override Judgement CreateJudgement() => new OsuJudgement(); + public override Judgement CreateJudgement() => new OsuJudgement(); } } diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index fc0248cbbd..506145568e 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -275,7 +275,7 @@ namespace osu.Game.Rulesets.Osu.Objects TailSamples = this.GetNodeSamples(repeatCount + 1); } - protected override Judgement CreateJudgement() => ClassicSliderBehaviour + public override Judgement CreateJudgement() => ClassicSliderBehaviour // Final combo is provided by the slider itself - see logic in `DrawableSlider.CheckForResult()` ? new OsuJudgement() // Final combo is provided by the tail circle - see `SliderTailCircle` diff --git a/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs index 8d60864f0b..2d5a5b7727 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderEndCircle.cs @@ -46,7 +46,7 @@ namespace osu.Game.Rulesets.Osu.Objects protected override HitWindows CreateHitWindows() => HitWindows.Empty; - protected override Judgement CreateJudgement() => new SliderEndJudgement(); + public override Judgement CreateJudgement() => new SliderEndJudgement(); public class SliderEndJudgement : OsuJudgement { diff --git a/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs index 4760135081..8305481788 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs @@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Osu.Objects /// public bool ClassicSliderBehaviour; - protected override Judgement CreateJudgement() => ClassicSliderBehaviour ? new SliderTickJudgement() : base.CreateJudgement(); + public override Judgement CreateJudgement() => ClassicSliderBehaviour ? new SliderTickJudgement() : base.CreateJudgement(); } } diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs index 42d8d895e4..ee2490439f 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTailCircle.cs @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Osu.Objects { } - protected override Judgement CreateJudgement() => ClassicSliderBehaviour ? new LegacyTailJudgement() : new TailJudgement(); + public override Judgement CreateJudgement() => ClassicSliderBehaviour ? new LegacyTailJudgement() : new TailJudgement(); public class LegacyTailJudgement : OsuJudgement { diff --git a/osu.Game.Rulesets.Osu/Objects/SliderTick.cs b/osu.Game.Rulesets.Osu/Objects/SliderTick.cs index 1d7ba2fbaf..74ec4d6eb3 100644 --- a/osu.Game.Rulesets.Osu/Objects/SliderTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/SliderTick.cs @@ -32,6 +32,6 @@ namespace osu.Game.Rulesets.Osu.Objects protected override HitWindows CreateHitWindows() => HitWindows.Empty; - protected override Judgement CreateJudgement() => new SliderTickJudgement(); + public override Judgement CreateJudgement() => new SliderTickJudgement(); } } diff --git a/osu.Game.Rulesets.Osu/Objects/Spinner.cs b/osu.Game.Rulesets.Osu/Objects/Spinner.cs index 9baa645b3c..e3dfe8e69a 100644 --- a/osu.Game.Rulesets.Osu/Objects/Spinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Spinner.cs @@ -95,7 +95,7 @@ namespace osu.Game.Rulesets.Osu.Objects } } - protected override Judgement CreateJudgement() => new OsuJudgement(); + public override Judgement CreateJudgement() => new OsuJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs b/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs index 57db29ef0c..8d53100529 100644 --- a/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/SpinnerBonusTick.cs @@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Osu.Objects { public class SpinnerBonusTick : SpinnerTick { - protected override Judgement CreateJudgement() => new OsuSpinnerBonusTickJudgement(); + public override Judgement CreateJudgement() => new OsuSpinnerBonusTickJudgement(); public class OsuSpinnerBonusTickJudgement : OsuSpinnerTickJudgement { diff --git a/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs b/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs index cb59014909..7989c9b7ff 100644 --- a/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/SpinnerTick.cs @@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Osu.Objects /// public double SpinnerDuration { get; set; } - protected override Judgement CreateJudgement() => new OsuSpinnerTickJudgement(); + public override Judgement CreateJudgement() => new OsuSpinnerTickJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Taiko/Objects/BarLine.cs b/osu.Game.Rulesets.Taiko/Objects/BarLine.cs index d87f8b3232..46b3f13501 100644 --- a/osu.Game.Rulesets.Taiko/Objects/BarLine.cs +++ b/osu.Game.Rulesets.Taiko/Objects/BarLine.cs @@ -19,6 +19,6 @@ namespace osu.Game.Rulesets.Taiko.Objects set => major.Value = value; } - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs index 50cd722a3f..f3143de345 100644 --- a/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs @@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Taiko.Objects } } - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; @@ -103,7 +103,7 @@ namespace osu.Game.Rulesets.Taiko.Objects public class StrongNestedHit : StrongNestedHitObject { // The strong hit of the drum roll doesn't actually provide any score. - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); public StrongNestedHit(TaikoHitObject parent) : base(parent) diff --git a/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs index c1d4102042..dc082ffd21 100644 --- a/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs @@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Taiko.Objects Parent = parent; } - protected override Judgement CreateJudgement() => new TaikoDrumRollTickJudgement(); + public override Judgement CreateJudgement() => new TaikoDrumRollTickJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; diff --git a/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs b/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs index 44cd700faf..302f940ef4 100644 --- a/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/IgnoreHit.cs @@ -7,6 +7,6 @@ namespace osu.Game.Rulesets.Taiko.Objects { public class IgnoreHit : Hit { - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs b/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs index 227ab4ab52..14cbe338ed 100644 --- a/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs +++ b/osu.Game.Rulesets.Taiko/Objects/StrongNestedHitObject.cs @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Taiko.Objects Parent = parent; } - protected override Judgement CreateJudgement() => new TaikoStrongJudgement(); + public override Judgement CreateJudgement() => new TaikoStrongJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } diff --git a/osu.Game.Rulesets.Taiko/Objects/Swell.cs b/osu.Game.Rulesets.Taiko/Objects/Swell.cs index 76d106f924..a8db8df021 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Swell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Swell.cs @@ -38,7 +38,7 @@ namespace osu.Game.Rulesets.Taiko.Objects } } - protected override Judgement CreateJudgement() => new TaikoSwellJudgement(); + public override Judgement CreateJudgement() => new TaikoSwellJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } diff --git a/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs b/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs index be1c1101de..41fb9cac7e 100644 --- a/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/SwellTick.cs @@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Taiko.Objects { public class SwellTick : TaikoHitObject { - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } diff --git a/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs b/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs index 697c23addf..1a1fde1990 100644 --- a/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs +++ b/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs @@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Taiko.Objects /// public const float DEFAULT_SIZE = 0.475f; - protected override Judgement CreateJudgement() => new TaikoJudgement(); + public override Judgement CreateJudgement() => new TaikoJudgement(); protected override HitWindows CreateHitWindows() => new TaikoHitWindows(); } diff --git a/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs b/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs index f0f93f59b5..584a9e09c0 100644 --- a/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs +++ b/osu.Game.Tests/Gameplay/TestSceneDrainingHealthProcessor.cs @@ -358,7 +358,7 @@ namespace osu.Game.Tests.Gameplay this.maxResult = maxResult; } - protected override Judgement CreateJudgement() => new TestJudgement(maxResult); + public override Judgement CreateJudgement() => new TestJudgement(maxResult); protected override HitWindows CreateHitWindows() => new HitWindows(); private class TestJudgement : Judgement diff --git a/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs b/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs index a428979015..8ec18377f4 100644 --- a/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs +++ b/osu.Game.Tests/Gameplay/TestSceneScoreProcessor.cs @@ -196,7 +196,7 @@ namespace osu.Game.Tests.Gameplay this.maxResult = maxResult; } - protected override Judgement CreateJudgement() => new TestJudgement(maxResult); + public override Judgement CreateJudgement() => new TestJudgement(maxResult); } } } diff --git a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs index ea43a65825..1647fbee42 100644 --- a/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs +++ b/osu.Game.Tests/Rulesets/Scoring/ScoreProcessorTest.cs @@ -441,7 +441,7 @@ namespace osu.Game.Tests.Rulesets.Scoring private readonly HitResult maxResult; private readonly HitResult? minResult; - protected override Judgement CreateJudgement() => new TestJudgement(maxResult, minResult); + public override Judgement CreateJudgement() => new TestJudgement(maxResult, minResult); public TestHitObject(HitResult maxResult, HitResult? minResult = null) { diff --git a/osu.Game/Database/StandardisedScoreMigrationTools.cs b/osu.Game/Database/StandardisedScoreMigrationTools.cs index 576d08f491..403e73ab77 100644 --- a/osu.Game/Database/StandardisedScoreMigrationTools.cs +++ b/osu.Game/Database/StandardisedScoreMigrationTools.cs @@ -655,7 +655,7 @@ namespace osu.Game.Database { private readonly Judgement judgement; - protected override Judgement CreateJudgement() => judgement; + public override Judgement CreateJudgement() => judgement; public FakeHit(Judgement judgement) { diff --git a/osu.Game/Rulesets/Objects/HitObject.cs b/osu.Game/Rulesets/Objects/HitObject.cs index aed821332d..317dd35fef 100644 --- a/osu.Game/Rulesets/Objects/HitObject.cs +++ b/osu.Game/Rulesets/Objects/HitObject.cs @@ -173,8 +173,12 @@ namespace osu.Game.Rulesets.Objects /// /// Creates the that represents the scoring information for this . /// + /// + /// Use to avoid unnecessary allocations. + /// This method has been left public for compatibility reasons and eventually will be made protected. + /// [NotNull] - protected virtual Judgement CreateJudgement() => new Judgement(); + public virtual Judgement CreateJudgement() => new Judgement(); /// /// Creates the for this . diff --git a/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs b/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs index 499953dab9..bb36aab0b3 100644 --- a/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs +++ b/osu.Game/Rulesets/Objects/Legacy/ConvertHitObject.cs @@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Objects.Legacy public int ComboOffset { get; set; } - protected override Judgement CreateJudgement() => new IgnoreJudgement(); + public override Judgement CreateJudgement() => new IgnoreJudgement(); protected override HitWindows CreateHitWindows() => HitWindows.Empty; } From b0f334c39e4ac1c3b587fa31b7c7759cfa5ec281 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 17 Feb 2024 00:45:30 +0300 Subject: [PATCH 628/651] Fix DrawableLinkCompiler allocations --- osu.Game/Online/Chat/DrawableLinkCompiler.cs | 32 ++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/osu.Game/Online/Chat/DrawableLinkCompiler.cs b/osu.Game/Online/Chat/DrawableLinkCompiler.cs index 883a2496f7..fa107a0e43 100644 --- a/osu.Game/Online/Chat/DrawableLinkCompiler.cs +++ b/osu.Game/Online/Chat/DrawableLinkCompiler.cs @@ -4,9 +4,11 @@ using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; +using osu.Framework.Extensions.ListExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; +using osu.Framework.Lists; using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; @@ -23,12 +25,21 @@ namespace osu.Game.Online.Chat /// /// Each word part of a chat link (split for word-wrap support). /// - public readonly List Parts; + public readonly SlimReadOnlyListWrapper Parts; [Resolved] private OverlayColourProvider? overlayColourProvider { get; set; } - public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => Parts.Any(d => d.ReceivePositionalInputAt(screenSpacePos)); + public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) + { + foreach (var part in Parts) + { + if (part.ReceivePositionalInputAt(screenSpacePos)) + return true; + } + + return false; + } protected override HoverSounds CreateHoverSounds(HoverSampleSet sampleSet) => new LinkHoverSounds(sampleSet, Parts); @@ -39,7 +50,7 @@ namespace osu.Game.Online.Chat public DrawableLinkCompiler(IEnumerable parts) { - Parts = parts.ToList(); + Parts = parts.ToList().AsSlimReadOnly(); } [BackgroundDependencyLoader] @@ -52,15 +63,24 @@ namespace osu.Game.Online.Chat private partial class LinkHoverSounds : HoverClickSounds { - private readonly List parts; + private readonly SlimReadOnlyListWrapper parts; - public LinkHoverSounds(HoverSampleSet sampleSet, List parts) + public LinkHoverSounds(HoverSampleSet sampleSet, SlimReadOnlyListWrapper parts) : base(sampleSet) { this.parts = parts; } - public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => parts.Any(d => d.ReceivePositionalInputAt(screenSpacePos)); + public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) + { + foreach (var part in parts) + { + if (part.ReceivePositionalInputAt(screenSpacePos)) + return true; + } + + return false; + } } } } From ce903987e7e71b22ac138b5985fc6ed37b3c5507 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 17 Feb 2024 00:53:53 +0300 Subject: [PATCH 629/651] Fix cursor ripples being added on release positions in replays --- osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs b/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs index 4cb91aa103..d898f1a1a8 100644 --- a/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs +++ b/osu.Game.Rulesets.Osu/UI/Cursor/CursorRippleVisualiser.cs @@ -11,6 +11,7 @@ using osu.Framework.Input.Events; using osu.Game.Rulesets.Osu.Configuration; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Skinning.Default; +using osu.Game.Screens.Play; using osu.Game.Skinning; using osuTK; @@ -39,6 +40,9 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor public bool OnPressed(KeyBindingPressEvent e) { + if ((Clock as IGameplayClock)?.IsRewinding == true) + return false; + if (showRipples.Value) { AddInternal(ripplePool.Get(r => From 8169d1ac80de9b5cf123c0c5540f4a760fce8f3e Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Sun, 21 Jan 2024 18:32:07 -0800 Subject: [PATCH 630/651] Add twenty star counter in visual test --- .../Visual/Gameplay/TestSceneStarCounter.cs | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs index b002e90bb0..fa17b77b55 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs @@ -3,6 +3,7 @@ using NUnit.Framework; using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Framework.Utils; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; @@ -14,39 +15,47 @@ namespace osu.Game.Tests.Visual.Gameplay public partial class TestSceneStarCounter : OsuTestScene { private readonly StarCounter starCounter; + private readonly StarCounter twentyStarCounter; private readonly OsuSpriteText starsLabel; public TestSceneStarCounter() { - starCounter = new StarCounter + Add(new FillFlowContainer { - Origin = Anchor.Centre, + AutoSizeAxes = Axes.Both, Anchor = Anchor.Centre, - }; - - Add(starCounter); - - starsLabel = new OsuSpriteText - { Origin = Anchor.Centre, - Anchor = Anchor.Centre, - Scale = new Vector2(2), - Y = 50, - }; - - Add(starsLabel); + Direction = FillDirection.Vertical, + Spacing = new Vector2(20), + Children = new Drawable[] + { + starCounter = new StarCounter(), + twentyStarCounter = new StarCounter(20), + starsLabel = new OsuSpriteText + { + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + Scale = new Vector2(2), + }, + } + }); setStars(5); - AddRepeatStep("random value", () => setStars(RNG.NextSingle() * (starCounter.StarCount + 1)), 10); - AddSliderStep("exact value", 0f, 10f, 5f, setStars); - AddStep("stop animation", () => starCounter.StopAnimation()); + AddRepeatStep("random value", () => setStars(RNG.NextSingle() * (twentyStarCounter.StarCount + 1)), 10); + AddSliderStep("exact value", 0f, 20f, 5f, setStars); + AddStep("stop animation", () => + { + starCounter.StopAnimation(); + twentyStarCounter.StopAnimation(); + }); AddStep("reset", () => setStars(0)); } private void setStars(float stars) { starCounter.Current = stars; + twentyStarCounter.Current = stars; starsLabel.Text = starCounter.Current.ToString("0.00"); } } From 6e8d8b977e000481ca0e769f514371a8bb188bdf Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Sun, 21 Jan 2024 18:34:55 -0800 Subject: [PATCH 631/651] Move ternary inside `Math.Max()` --- osu.Game/Graphics/UserInterface/StarCounter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs index 720f479216..5fdc6a4904 100644 --- a/osu.Game/Graphics/UserInterface/StarCounter.cs +++ b/osu.Game/Graphics/UserInterface/StarCounter.cs @@ -115,7 +115,7 @@ namespace osu.Game.Graphics.UserInterface star.ClearTransforms(true); - double delay = (current <= newValue ? Math.Max(i - current, 0) : Math.Max(current - 1 - i, 0)) * AnimationDelay; + double delay = Math.Max(current <= newValue ? i - current : current - 1 - i, 0) * AnimationDelay; using (star.BeginDelayedSequence(delay)) star.DisplayAt(getStarScale(i, newValue)); From 7a74eaa2dec61e1342e9b3c8ca3f3eed1a0ce30f Mon Sep 17 00:00:00 2001 From: Joseph Madamba Date: Sun, 21 Jan 2024 18:47:24 -0800 Subject: [PATCH 632/651] Fix star counter decrease animation being delayed when current is over displayed star count --- osu.Game/Graphics/UserInterface/StarCounter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs index 5fdc6a4904..4e9e34d840 100644 --- a/osu.Game/Graphics/UserInterface/StarCounter.cs +++ b/osu.Game/Graphics/UserInterface/StarCounter.cs @@ -115,7 +115,7 @@ namespace osu.Game.Graphics.UserInterface star.ClearTransforms(true); - double delay = Math.Max(current <= newValue ? i - current : current - 1 - i, 0) * AnimationDelay; + double delay = Math.Max(current <= newValue ? i - current : Math.Min(current, StarCount) - 1 - i, 0) * AnimationDelay; using (star.BeginDelayedSequence(delay)) star.DisplayAt(getStarScale(i, newValue)); From 22f5a66c029bed6b135cbb3c99b63363e4248ecd Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 17 Feb 2024 15:46:38 +0300 Subject: [PATCH 633/651] Reduce allocations during beatmap selection --- .../Preprocessing/OsuDifficultyHitObject.cs | 8 ++++- osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs | 8 +++-- osu.Game.Rulesets.Osu/Objects/Slider.cs | 36 +++++++++++++++---- osu.Game/Rulesets/Objects/SliderPath.cs | 15 ++++---- osu.Game/Screens/Select/BeatmapCarousel.cs | 19 ++++++++-- 5 files changed, 67 insertions(+), 19 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs index 488d1e2e9f..0e537632b1 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Preprocessing/OsuDifficultyHitObject.cs @@ -232,7 +232,13 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing IList nestedObjects = slider.NestedHitObjects; - SliderTick? lastRealTick = slider.NestedHitObjects.OfType().LastOrDefault(); + SliderTick? lastRealTick = null; + + foreach (var hitobject in slider.NestedHitObjects) + { + if (hitobject is SliderTick tick) + lastRealTick = tick; + } if (lastRealTick?.StartTime > trackingEndTime) { diff --git a/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs index 74631400ca..6c77d9189c 100644 --- a/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Linq; using osu.Framework.Bindables; using osu.Game.Beatmaps; using osu.Game.Beatmaps.ControlPoints; @@ -149,8 +148,11 @@ namespace osu.Game.Rulesets.Osu.Objects { StackHeightBindable.BindValueChanged(height => { - foreach (var nested in NestedHitObjects.OfType()) - nested.StackHeight = height.NewValue; + foreach (var nested in NestedHitObjects) + { + if (nested is OsuHitObject osuHitObject) + osuHitObject.StackHeight = height.NewValue; + } }); } diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 506145568e..8a87e17089 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -252,18 +252,42 @@ namespace osu.Game.Rulesets.Osu.Objects protected void UpdateNestedSamples() { - var firstSample = Samples.FirstOrDefault(s => s.Name == HitSampleInfo.HIT_NORMAL) - ?? Samples.FirstOrDefault(); // TODO: remove this when guaranteed sort is present for samples (https://github.com/ppy/osu/issues/1933) + HitSampleInfo firstSample = null; + + for (int i = 0; i < Samples.Count; i++) + { + // TODO: remove this when guaranteed sort is present for samples (https://github.com/ppy/osu/issues/1933) + if (i == 0) + { + firstSample = Samples[i]; + continue; + } + + if (Samples[i].Name != HitSampleInfo.HIT_NORMAL) + continue; + + firstSample = Samples[i]; + break; + } + var sampleList = new List(); if (firstSample != null) sampleList.Add(firstSample.With("slidertick")); - foreach (var tick in NestedHitObjects.OfType()) - tick.Samples = sampleList; + foreach (var nested in NestedHitObjects) + { + switch (nested) + { + case SliderTick tick: + tick.Samples = sampleList; + break; - foreach (var repeat in NestedHitObjects.OfType()) - repeat.Samples = this.GetNodeSamples(repeat.RepeatIndex + 1); + case SliderRepeat repeat: + repeat.Samples = this.GetNodeSamples(repeat.RepeatIndex + 1); + break; + } + } if (HeadCircle != null) HeadCircle.Samples = this.GetNodeSamples(0); diff --git a/osu.Game/Rulesets/Objects/SliderPath.cs b/osu.Game/Rulesets/Objects/SliderPath.cs index dc71608132..f33a07f082 100644 --- a/osu.Game/Rulesets/Objects/SliderPath.cs +++ b/osu.Game/Rulesets/Objects/SliderPath.cs @@ -61,16 +61,17 @@ namespace osu.Game.Rulesets.Objects case NotifyCollectionChangedAction.Add: Debug.Assert(args.NewItems != null); - foreach (var c in args.NewItems.Cast()) - c.Changed += invalidate; + foreach (object? newItem in args.NewItems) + ((PathControlPoint)newItem).Changed += invalidate; + break; case NotifyCollectionChangedAction.Reset: case NotifyCollectionChangedAction.Remove: Debug.Assert(args.OldItems != null); - foreach (var c in args.OldItems.Cast()) - c.Changed -= invalidate; + foreach (object? oldItem in args.OldItems) + ((PathControlPoint)oldItem).Changed -= invalidate; break; } @@ -269,10 +270,10 @@ namespace osu.Game.Rulesets.Objects { List subPath = calculateSubPath(segmentVertices, segmentType); // Skip the first vertex if it is the same as the last vertex from the previous segment - int skipFirst = calculatedPath.Count > 0 && subPath.Count > 0 && calculatedPath.Last() == subPath[0] ? 1 : 0; + bool skipFirst = calculatedPath.Count > 0 && subPath.Count > 0 && calculatedPath.Last() == subPath[0]; - foreach (Vector2 t in subPath.Skip(skipFirst)) - calculatedPath.Add(t); + for (int j = skipFirst ? 1 : 0; j < subPath.Count; j++) + calculatedPath.Add(subPath[j]); } if (i > 0) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 70ecde3858..ae0f397d52 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -510,12 +510,27 @@ namespace osu.Game.Screens.Select if (beatmapInfo?.Hidden != false) return false; - foreach (CarouselBeatmapSet set in beatmapSets) + foreach (var carouselItem in root.Items) { + if (carouselItem is not CarouselBeatmapSet set) + continue; + if (!bypassFilters && set.Filtered.Value) continue; - var item = set.Beatmaps.FirstOrDefault(p => p.BeatmapInfo.Equals(beatmapInfo)); + CarouselBeatmap? item = null; + + foreach (var setCarouselItem in set.Items) + { + if (setCarouselItem is not CarouselBeatmap setCarouselBeatmap) + continue; + + if (!setCarouselBeatmap.BeatmapInfo.Equals(beatmapInfo)) + continue; + + item = setCarouselBeatmap; + break; + } if (item == null) // The beatmap that needs to be selected doesn't exist in this set From 62a7e315bf669fea52ea2bb153995f08f16e9661 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 18 Feb 2024 03:11:29 +0800 Subject: [PATCH 634/651] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index f61ff79b9f..85171cc0fa 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - + diff --git a/osu.iOS.props b/osu.iOS.props index 506bebfd47..f23debd38f 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -23,6 +23,6 @@ iossimulator-x64 - + From 0714a4fc1e23a4a3e7672ff7a075fe86d6878194 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 18 Feb 2024 03:18:50 +0800 Subject: [PATCH 635/651] Revert sample lookup logic that was not allocating anything --- osu.Game.Rulesets.Osu/Objects/Slider.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 8a87e17089..900f42d96b 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -252,23 +252,8 @@ namespace osu.Game.Rulesets.Osu.Objects protected void UpdateNestedSamples() { - HitSampleInfo firstSample = null; - - for (int i = 0; i < Samples.Count; i++) - { - // TODO: remove this when guaranteed sort is present for samples (https://github.com/ppy/osu/issues/1933) - if (i == 0) - { - firstSample = Samples[i]; - continue; - } - - if (Samples[i].Name != HitSampleInfo.HIT_NORMAL) - continue; - - firstSample = Samples[i]; - break; - } + var firstSample = Samples.FirstOrDefault(s => s.Name == HitSampleInfo.HIT_NORMAL) + ?? Samples.FirstOrDefault(); // TODO: remove this when guaranteed sort is present for samples (https://github.com/ppy/osu/issues/1933) var sampleList = new List(); From 0df6e8f5950aaeac17ff1fefee6fb80b3f73d4f3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 18 Feb 2024 03:22:10 +0800 Subject: [PATCH 636/651] Remove list allocations in `UpdateNestedSamples` --- osu.Game.Rulesets.Osu/Objects/Slider.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 900f42d96b..79bf91bcae 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -252,20 +252,16 @@ namespace osu.Game.Rulesets.Osu.Objects protected void UpdateNestedSamples() { - var firstSample = Samples.FirstOrDefault(s => s.Name == HitSampleInfo.HIT_NORMAL) - ?? Samples.FirstOrDefault(); // TODO: remove this when guaranteed sort is present for samples (https://github.com/ppy/osu/issues/1933) - - var sampleList = new List(); - - if (firstSample != null) - sampleList.Add(firstSample.With("slidertick")); + // TODO: remove this when guaranteed sort is present for samples (https://github.com/ppy/osu/issues/1933) + HitSampleInfo tickSample = (Samples.FirstOrDefault(s => s.Name == HitSampleInfo.HIT_NORMAL) ?? Samples.First()).With("slidertick"); foreach (var nested in NestedHitObjects) { switch (nested) { case SliderTick tick: - tick.Samples = sampleList; + tick.SamplesBindable.Clear(); + tick.SamplesBindable.Add(tickSample); break; case SliderRepeat repeat: From dd82de473a1b42ad77d871ad7faeea6b5f1c718c Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 17 Feb 2024 22:42:47 +0300 Subject: [PATCH 637/651] Revert BeatmapCarousel changes --- osu.Game/Screens/Select/BeatmapCarousel.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index ae0f397d52..70ecde3858 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -510,27 +510,12 @@ namespace osu.Game.Screens.Select if (beatmapInfo?.Hidden != false) return false; - foreach (var carouselItem in root.Items) + foreach (CarouselBeatmapSet set in beatmapSets) { - if (carouselItem is not CarouselBeatmapSet set) - continue; - if (!bypassFilters && set.Filtered.Value) continue; - CarouselBeatmap? item = null; - - foreach (var setCarouselItem in set.Items) - { - if (setCarouselItem is not CarouselBeatmap setCarouselBeatmap) - continue; - - if (!setCarouselBeatmap.BeatmapInfo.Equals(beatmapInfo)) - continue; - - item = setCarouselBeatmap; - break; - } + var item = set.Beatmaps.FirstOrDefault(p => p.BeatmapInfo.Equals(beatmapInfo)); if (item == null) // The beatmap that needs to be selected doesn't exist in this set From 572f693eec361a69d83dedc317fa9608bd816099 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Sat, 17 Feb 2024 23:28:35 +0300 Subject: [PATCH 638/651] Fix failing tests related to slider ticks --- osu.Game.Rulesets.Osu/Objects/Slider.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs index 79bf91bcae..203e829180 100644 --- a/osu.Game.Rulesets.Osu/Objects/Slider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs @@ -253,7 +253,7 @@ namespace osu.Game.Rulesets.Osu.Objects protected void UpdateNestedSamples() { // TODO: remove this when guaranteed sort is present for samples (https://github.com/ppy/osu/issues/1933) - HitSampleInfo tickSample = (Samples.FirstOrDefault(s => s.Name == HitSampleInfo.HIT_NORMAL) ?? Samples.First()).With("slidertick"); + HitSampleInfo tickSample = (Samples.FirstOrDefault(s => s.Name == HitSampleInfo.HIT_NORMAL) ?? Samples.FirstOrDefault())?.With("slidertick"); foreach (var nested in NestedHitObjects) { @@ -261,7 +261,9 @@ namespace osu.Game.Rulesets.Osu.Objects { case SliderTick tick: tick.SamplesBindable.Clear(); - tick.SamplesBindable.Add(tickSample); + + if (tickSample != null) + tick.SamplesBindable.Add(tickSample); break; case SliderRepeat repeat: From 9655e8c48af03283ee323ee0d35fd6f354454119 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 18 Feb 2024 17:54:29 +0800 Subject: [PATCH 639/651] Adjust xmldoc slightly --- osu.Game/Rulesets/Objects/HitObject.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/osu.Game/Rulesets/Objects/HitObject.cs b/osu.Game/Rulesets/Objects/HitObject.cs index 317dd35fef..04bdc35941 100644 --- a/osu.Game/Rulesets/Objects/HitObject.cs +++ b/osu.Game/Rulesets/Objects/HitObject.cs @@ -171,11 +171,10 @@ namespace osu.Game.Rulesets.Objects private Judgement judgement; /// - /// Creates the that represents the scoring information for this . + /// Should be overridden to create a that represents the scoring information for this . /// /// - /// Use to avoid unnecessary allocations. - /// This method has been left public for compatibility reasons and eventually will be made protected. + /// For read access, use to avoid unnecessary allocations. /// [NotNull] public virtual Judgement CreateJudgement() => new Judgement(); From 415a65bf59cdce4b8fab7d836fe3cdc4f7a2a168 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 17 Feb 2024 19:00:30 +0800 Subject: [PATCH 640/651] Add failing tests for beatmap inconsistencies --- .../Navigation/TestSceneScreenNavigation.cs | 63 +++++++++++++++++++ osu.Game/Tests/Visual/OsuGameTestScene.cs | 4 +- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs index 8ff4fd5ecf..7e42d4781d 100644 --- a/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs +++ b/osu.Game.Tests/Visual/Navigation/TestSceneScreenNavigation.cs @@ -4,6 +4,7 @@ #nullable disable using System; +using System.IO; using System.Linq; using NUnit.Framework; using osu.Framework.Allocation; @@ -18,6 +19,7 @@ using osu.Framework.Testing; using osu.Game.Beatmaps; using osu.Game.Collections; using osu.Game.Configuration; +using osu.Game.Extensions; using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; @@ -221,6 +223,67 @@ namespace osu.Game.Tests.Visual.Navigation AddAssert("Overlay was shown", () => songSelect.ModSelectOverlay.State.Value == Visibility.Visible); } + [Test] + public void TestAttemptPlayBeatmapWrongHashFails() + { + Screens.Select.SongSelect songSelect = null; + + AddStep("import beatmap", () => BeatmapImportHelper.LoadQuickOszIntoOsu(Game).GetResultSafely()); + PushAndConfirm(() => songSelect = new TestPlaySongSelect()); + AddUntilStep("wait for song select", () => songSelect.BeatmapSetsLoaded); + + AddUntilStep("wait for selected", () => !Game.Beatmap.IsDefault); + + AddStep("change beatmap files", () => + { + foreach (var file in Game.Beatmap.Value.BeatmapSetInfo.Files.Where(f => Path.GetExtension(f.Filename) == ".osu")) + { + using (var stream = Game.Storage.GetStream(Path.Combine("files", file.File.GetStoragePath()), FileAccess.ReadWrite)) + stream.WriteByte(0); + } + }); + + AddStep("invalidate cache", () => + { + ((IWorkingBeatmapCache)Game.BeatmapManager).Invalidate(Game.Beatmap.Value.BeatmapSetInfo); + }); + + AddStep("select next difficulty", () => InputManager.Key(Key.Down)); + AddStep("press enter", () => InputManager.Key(Key.Enter)); + + AddUntilStep("wait for player loader", () => Game.ScreenStack.CurrentScreen is PlayerLoader); + AddUntilStep("wait for song select", () => songSelect.IsCurrentScreen()); + } + + [Test] + public void TestAttemptPlayBeatmapMissingFails() + { + Screens.Select.SongSelect songSelect = null; + + AddStep("import beatmap", () => BeatmapImportHelper.LoadQuickOszIntoOsu(Game).GetResultSafely()); + PushAndConfirm(() => songSelect = new TestPlaySongSelect()); + AddUntilStep("wait for song select", () => songSelect.BeatmapSetsLoaded); + + AddUntilStep("wait for selected", () => !Game.Beatmap.IsDefault); + + AddStep("delete beatmap files", () => + { + foreach (var file in Game.Beatmap.Value.BeatmapSetInfo.Files.Where(f => Path.GetExtension(f.Filename) == ".osu")) + Game.Storage.Delete(Path.Combine("files", file.File.GetStoragePath())); + }); + + AddStep("invalidate cache", () => + { + ((IWorkingBeatmapCache)Game.BeatmapManager).Invalidate(Game.Beatmap.Value.BeatmapSetInfo); + }); + + AddStep("select next difficulty", () => InputManager.Key(Key.Down)); + AddStep("press enter", () => InputManager.Key(Key.Enter)); + + AddUntilStep("wait for player loader", () => Game.ScreenStack.CurrentScreen is PlayerLoader); + AddUntilStep("wait for song select", () => songSelect.IsCurrentScreen()); + } + [Test] public void TestRetryCountIncrements() { diff --git a/osu.Game/Tests/Visual/OsuGameTestScene.cs b/osu.Game/Tests/Visual/OsuGameTestScene.cs index 6069fe4fb0..b86273b4a3 100644 --- a/osu.Game/Tests/Visual/OsuGameTestScene.cs +++ b/osu.Game/Tests/Visual/OsuGameTestScene.cs @@ -153,6 +153,8 @@ namespace osu.Game.Tests.Visual public new Bindable> SelectedMods => base.SelectedMods; + public new Storage Storage => base.Storage; + public new SpectatorClient SpectatorClient => base.SpectatorClient; // if we don't apply these changes, when running under nUnit the version that gets populated is that of nUnit. @@ -166,7 +168,7 @@ namespace osu.Game.Tests.Visual public TestOsuGame(Storage storage, IAPIProvider api, string[] args = null) : base(args) { - Storage = storage; + base.Storage = storage; API = api; } From 882f11bf79d0ce405fb865cd0a7a1d552f540513 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 18 Feb 2024 23:19:57 +0800 Subject: [PATCH 641/651] Fix logo tracking container being off by one frame This was especially visible at the main menu when running in single thread mode. --- osu.Game/Graphics/Containers/LogoTrackingContainer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Graphics/Containers/LogoTrackingContainer.cs b/osu.Game/Graphics/Containers/LogoTrackingContainer.cs index 08eae25951..57f87b588a 100644 --- a/osu.Game/Graphics/Containers/LogoTrackingContainer.cs +++ b/osu.Game/Graphics/Containers/LogoTrackingContainer.cs @@ -82,9 +82,9 @@ namespace osu.Game.Graphics.Containers absolutePos.Y / Logo.Parent!.RelativeToAbsoluteFactor.Y); } - protected override void Update() + protected override void UpdateAfterChildren() { - base.Update(); + base.UpdateAfterChildren(); if (Logo == null) return; From 6b6a6aea54fadf4dd5b811629fd075fe1b7f5c34 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 18 Feb 2024 23:35:26 +0800 Subject: [PATCH 642/651] Apply NRT to `LogoTrackingContainer` --- .../Visual/UserInterface/TestSceneLogoTrackingContainer.cs | 2 +- osu.Game/Graphics/Containers/LogoTrackingContainer.cs | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneLogoTrackingContainer.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneLogoTrackingContainer.cs index 57ea4ee58e..8d5c961265 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneLogoTrackingContainer.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneLogoTrackingContainer.cs @@ -282,7 +282,7 @@ namespace osu.Game.Tests.Visual.UserInterface /// /// Check that the logo is tracking the position of the facade, with an acceptable precision lenience. /// - public bool IsLogoTracking => Precision.AlmostEquals(Logo.Position, ComputeLogoTrackingPosition()); + public bool IsLogoTracking => Precision.AlmostEquals(Logo!.Position, ComputeLogoTrackingPosition()); } } } diff --git a/osu.Game/Graphics/Containers/LogoTrackingContainer.cs b/osu.Game/Graphics/Containers/LogoTrackingContainer.cs index 57f87b588a..13c672cbd6 100644 --- a/osu.Game/Graphics/Containers/LogoTrackingContainer.cs +++ b/osu.Game/Graphics/Containers/LogoTrackingContainer.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -19,7 +17,7 @@ namespace osu.Game.Graphics.Containers { public Facade LogoFacade => facade; - protected OsuLogo Logo { get; private set; } + protected OsuLogo? Logo { get; private set; } private readonly InternalFacade facade = new InternalFacade(); @@ -76,7 +74,7 @@ namespace osu.Game.Graphics.Containers /// Will only be correct if the logo's are set to Axes.Both protected Vector2 ComputeLogoTrackingPosition() { - var absolutePos = Logo.Parent!.ToLocalSpace(LogoFacade.ScreenSpaceDrawQuad.Centre); + var absolutePos = Logo!.Parent!.ToLocalSpace(LogoFacade.ScreenSpaceDrawQuad.Centre); return new Vector2(absolutePos.X / Logo.Parent!.RelativeToAbsoluteFactor.X, absolutePos.Y / Logo.Parent!.RelativeToAbsoluteFactor.Y); From 998d8206668ba1733d7f7d6ff1afacde219f8a3a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 19 Feb 2024 00:21:54 +0800 Subject: [PATCH 643/651] Ensure audio filters can't be attached before load (or post-disposal) Will probably fix https://github.com/ppy/osu/issues/27225? --- osu.Game/Audio/Effects/AudioFilter.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/osu.Game/Audio/Effects/AudioFilter.cs b/osu.Game/Audio/Effects/AudioFilter.cs index 682ca4ca7b..c8673372d7 100644 --- a/osu.Game/Audio/Effects/AudioFilter.cs +++ b/osu.Game/Audio/Effects/AudioFilter.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using ManagedBass.Fx; using osu.Framework.Audio.Mixing; +using osu.Framework.Caching; using osu.Framework.Graphics; namespace osu.Game.Audio.Effects @@ -22,6 +23,8 @@ namespace osu.Game.Audio.Effects private bool isAttached; + private readonly Cached filterApplication = new Cached(); + private int cutoff; /// @@ -36,7 +39,7 @@ namespace osu.Game.Audio.Effects return; cutoff = value; - updateFilter(cutoff); + filterApplication.Invalidate(); } } @@ -61,6 +64,17 @@ namespace osu.Game.Audio.Effects Cutoff = getInitialCutoff(type); } + protected override void Update() + { + base.Update(); + + if (!filterApplication.IsValid) + { + updateFilter(cutoff); + filterApplication.Validate(); + } + } + private int getInitialCutoff(BQFType type) { switch (type) From 444ac5ed4d312fc0914b79888c8a2d00f414a728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 19 Feb 2024 09:34:52 +0100 Subject: [PATCH 644/651] Add failing test coverage --- .../TestSceneSkinEditorNavigation.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/osu.Game.Tests/Visual/Navigation/TestSceneSkinEditorNavigation.cs b/osu.Game.Tests/Visual/Navigation/TestSceneSkinEditorNavigation.cs index 57f1b2fbe9..9c180d43da 100644 --- a/osu.Game.Tests/Visual/Navigation/TestSceneSkinEditorNavigation.cs +++ b/osu.Game.Tests/Visual/Navigation/TestSceneSkinEditorNavigation.cs @@ -9,6 +9,7 @@ using osu.Framework.Allocation; using osu.Framework.Extensions; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; +using osu.Framework.Input; using osu.Framework.Screens; using osu.Framework.Testing; using osu.Framework.Threading; @@ -301,6 +302,25 @@ namespace osu.Game.Tests.Visual.Navigation switchToGameplayScene(); } + [Test] + public void TestRulesetInputDisabledWhenSkinEditorOpen() + { + advanceToSongSelect(); + openSkinEditor(); + + AddStep("import beatmap", () => BeatmapImportHelper.LoadQuickOszIntoOsu(Game).WaitSafely()); + AddUntilStep("wait for selected", () => !Game.Beatmap.IsDefault); + + switchToGameplayScene(); + AddUntilStep("nested input disabled", () => ((Player)Game.ScreenStack.CurrentScreen).ChildrenOfType().All(manager => !manager.UseParentInput)); + + toggleSkinEditor(); + AddUntilStep("nested input enabled", () => ((Player)Game.ScreenStack.CurrentScreen).ChildrenOfType().Any(manager => manager.UseParentInput)); + + toggleSkinEditor(); + AddUntilStep("nested input disabled", () => ((Player)Game.ScreenStack.CurrentScreen).ChildrenOfType().All(manager => !manager.UseParentInput)); + } + private void advanceToSongSelect() { PushAndConfirm(() => songSelect = new TestPlaySongSelect()); From 7f82f103171223518fe34341f07dd07ab4be6c8f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 17 Feb 2024 19:00:43 +0800 Subject: [PATCH 645/651] Fix beatmap potentially loading in a bad state Over-caching could mean that a beatmap could load and cause a late crash. Let's catch it early to avoid such a crash occurring. --- osu.Game/Beatmaps/WorkingBeatmapCache.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/osu.Game/Beatmaps/WorkingBeatmapCache.cs b/osu.Game/Beatmaps/WorkingBeatmapCache.cs index 74a85cde7c..8af74d11d8 100644 --- a/osu.Game/Beatmaps/WorkingBeatmapCache.cs +++ b/osu.Game/Beatmaps/WorkingBeatmapCache.cs @@ -9,6 +9,7 @@ using System.Linq; using JetBrains.Annotations; using osu.Framework.Audio; using osu.Framework.Audio.Track; +using osu.Framework.Extensions; using osu.Framework.Graphics.Rendering; using osu.Framework.Graphics.Rendering.Dummy; using osu.Framework.Graphics.Textures; @@ -143,8 +144,6 @@ namespace osu.Game.Beatmaps { string fileStorePath = BeatmapSetInfo.GetPathForFile(BeatmapInfo.Path); - // TODO: check validity of file - var stream = GetStream(fileStorePath); if (stream == null) @@ -153,6 +152,12 @@ namespace osu.Game.Beatmaps return null; } + if (stream.ComputeMD5Hash() != BeatmapInfo.MD5Hash) + { + Logger.Log($"Beatmap failed to load (file {BeatmapInfo.Path} does not have the expected hash).", level: LogLevel.Error); + return null; + } + using (var reader = new LineBufferedReader(stream)) return Decoder.GetDecoder(reader).Decode(reader); } From 1ca566c6b0001dace3e3a3911c51f66cbf8536fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 19 Feb 2024 09:45:03 +0100 Subject: [PATCH 646/651] Disable nested input managers on edited screen when skin editor is open --- .../Overlays/SkinEditor/SkinEditorOverlay.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs b/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs index 40cd31934f..93e2f92a1c 100644 --- a/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs +++ b/osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs @@ -10,9 +10,11 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Primitives; +using osu.Framework.Input; using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; using osu.Framework.Screens; +using osu.Framework.Testing; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Graphics.Containers; @@ -66,6 +68,7 @@ namespace osu.Game.Overlays.SkinEditor private IBindable beatmap { get; set; } = null!; private OsuScreen? lastTargetScreen; + private InvokeOnDisposal? nestedInputManagerDisable; private Vector2 lastDrawSize; @@ -105,6 +108,7 @@ namespace osu.Game.Overlays.SkinEditor if (skinEditor != null) { + disableNestedInputManagers(); skinEditor.Show(); return; } @@ -132,6 +136,8 @@ namespace osu.Game.Overlays.SkinEditor { skinEditor?.Save(false); skinEditor?.Hide(); + nestedInputManagerDisable?.Dispose(); + nestedInputManagerDisable = null; globallyReenableBeatmapSkinSetting(); } @@ -243,6 +249,9 @@ namespace osu.Game.Overlays.SkinEditor /// public void SetTarget(OsuScreen screen) { + nestedInputManagerDisable?.Dispose(); + nestedInputManagerDisable = null; + lastTargetScreen = screen; if (skinEditor == null) return; @@ -271,6 +280,7 @@ namespace osu.Game.Overlays.SkinEditor { skinEditor.Save(false); skinEditor.UpdateTargetScreen(target); + disableNestedInputManagers(); } else { @@ -280,6 +290,21 @@ namespace osu.Game.Overlays.SkinEditor } } + private void disableNestedInputManagers() + { + if (lastTargetScreen == null) + return; + + var nestedInputManagers = lastTargetScreen.ChildrenOfType().Where(manager => manager.UseParentInput).ToArray(); + foreach (var inputManager in nestedInputManagers) + inputManager.UseParentInput = false; + nestedInputManagerDisable = new InvokeOnDisposal(() => + { + foreach (var inputManager in nestedInputManagers) + inputManager.UseParentInput = true; + }); + } + private readonly Bindable beatmapSkins = new Bindable(); private LeasedBindable? leasedBeatmapSkins; From ec26ab51d18d5e4e46ee30782ebc388461c4073f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 19 Feb 2024 13:56:21 +0100 Subject: [PATCH 647/651] Use different wording --- osu.Game/Screens/Play/SubmittingPlayer.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs index 0873f60791..ecb507f382 100644 --- a/osu.Game/Screens/Play/SubmittingPlayer.cs +++ b/osu.Game/Screens/Play/SubmittingPlayer.cs @@ -137,11 +137,11 @@ namespace osu.Game.Screens.Play if (displayNotification || shouldExit) { string whatWillHappen = shouldExit - ? "You are not able to submit a score." - : "The following score will not be submitted."; + ? "Play in this state is not permitted." + : "Your score will not be submitted."; if (string.IsNullOrEmpty(exception.Message)) - Logger.Error(exception, $"{whatWillHappen} Failed to retrieve a score submission token."); + Logger.Error(exception, $"Failed to retrieve a score submission token.\n\n{whatWillHappen}"); else { switch (exception.Message) @@ -149,11 +149,11 @@ namespace osu.Game.Screens.Play case @"missing token header": case @"invalid client hash": case @"invalid verification hash": - Logger.Log($"{whatWillHappen} Please ensure that you are using the latest version of the official game releases.", level: LogLevel.Important); + Logger.Log($"Please ensure that you are using the latest version of the official game releases.\n\n{whatWillHappen}", level: LogLevel.Important); break; case @"expired token": - Logger.Log($"{whatWillHappen} Your system clock is set incorrectly. Please check your system time, date and timezone.", level: LogLevel.Important); + Logger.Log($"Your system clock is set incorrectly. Please check your system time, date and timezone.\n\n{whatWillHappen}", level: LogLevel.Important); break; default: From 012d6b7fe1058696e92eaf3c2eee589da50e4f3c Mon Sep 17 00:00:00 2001 From: Mike Will Date: Sun, 18 Feb 2024 22:16:54 -0500 Subject: [PATCH 648/651] Change `userBeatmapOffsetClock` to a `FramedOffsetClock` Assuming that the global audio offset is set perfectly, such that any audio latency is fully accounted for, if a specific beatmap still sounds out of sync, that would no longer be a latency issue. Instead, it would indicate a misalignment between the beatmap's track and time codes, the correction for which should be a virtual-time offset, not a real-time offset. --- osu.Game/Beatmaps/FramedBeatmapClock.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Beatmaps/FramedBeatmapClock.cs b/osu.Game/Beatmaps/FramedBeatmapClock.cs index d0ffbdd459..49dff96ff1 100644 --- a/osu.Game/Beatmaps/FramedBeatmapClock.cs +++ b/osu.Game/Beatmaps/FramedBeatmapClock.cs @@ -29,7 +29,7 @@ namespace osu.Game.Beatmaps private readonly OffsetCorrectionClock? userGlobalOffsetClock; private readonly OffsetCorrectionClock? platformOffsetClock; - private readonly OffsetCorrectionClock? userBeatmapOffsetClock; + private readonly FramedOffsetClock? userBeatmapOffsetClock; private readonly IFrameBasedClock finalClockSource; @@ -70,7 +70,7 @@ namespace osu.Game.Beatmaps userGlobalOffsetClock = new OffsetCorrectionClock(platformOffsetClock); // User per-beatmap offset will be applied to this final clock. - finalClockSource = userBeatmapOffsetClock = new OffsetCorrectionClock(userGlobalOffsetClock); + finalClockSource = userBeatmapOffsetClock = new FramedOffsetClock(userGlobalOffsetClock); } else { @@ -122,7 +122,7 @@ namespace osu.Game.Beatmaps Debug.Assert(userBeatmapOffsetClock != null); Debug.Assert(platformOffsetClock != null); - return userGlobalOffsetClock.RateAdjustedOffset + userBeatmapOffsetClock.RateAdjustedOffset + platformOffsetClock.RateAdjustedOffset; + return userGlobalOffsetClock.RateAdjustedOffset + userBeatmapOffsetClock.Offset + platformOffsetClock.RateAdjustedOffset; } } From 29900353d924e2dd2efc54f98df5b1fdd8bcd38b Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Mon, 19 Feb 2024 20:26:15 +0300 Subject: [PATCH 649/651] Reduce allocations in SliderSelectionBlueprint --- .../Sliders/SliderSelectionBlueprint.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs index e421d497e7..4d2b980c23 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs @@ -416,8 +416,22 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders DrawableObject.SliderBody?.ToScreenSpace(DrawableObject.SliderBody.PathEndOffset) ?? BodyPiece.ToScreenSpace(BodyPiece.PathEndLocation) }; - public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => - BodyPiece.ReceivePositionalInputAt(screenSpacePos) || ControlPointVisualiser?.Pieces.Any(p => p.ReceivePositionalInputAt(screenSpacePos)) == true; + public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) + { + if (BodyPiece.ReceivePositionalInputAt(screenSpacePos)) + return true; + + if (ControlPointVisualiser == null) + return false; + + foreach (var p in ControlPointVisualiser.Pieces) + { + if (p.ReceivePositionalInputAt(screenSpacePos)) + return true; + } + + return false; + } protected virtual SliderCircleOverlay CreateCircleOverlay(Slider slider, SliderPosition position) => new SliderCircleOverlay(slider, position); } From c7586403112e4616d12817e0dd3d52e7d8dea487 Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Mon, 19 Feb 2024 20:49:56 +0300 Subject: [PATCH 650/651] Reduce allocations in ComposerDistanceSnapProvider --- .../Edit/ComposerDistanceSnapProvider.cs | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs b/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs index b3ca59a5b0..b2f38662cc 100644 --- a/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs +++ b/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions; @@ -124,12 +123,34 @@ namespace osu.Game.Rulesets.Edit private (HitObject before, HitObject after)? getObjectsOnEitherSideOfCurrentTime() { - HitObject? lastBefore = playfield.HitObjectContainer.AliveObjects.LastOrDefault(h => h.HitObject.StartTime < editorClock.CurrentTime)?.HitObject; + HitObject? lastBefore = null; + + foreach (var entry in playfield.HitObjectContainer.AliveEntries) + { + double objTime = entry.Value.HitObject.StartTime; + + if (objTime >= editorClock.CurrentTime) + continue; + + if (objTime > lastBefore?.StartTime) + lastBefore = entry.Value.HitObject; + } if (lastBefore == null) return null; - HitObject? firstAfter = playfield.HitObjectContainer.AliveObjects.FirstOrDefault(h => h.HitObject.StartTime >= editorClock.CurrentTime)?.HitObject; + HitObject? firstAfter = null; + + foreach (var entry in playfield.HitObjectContainer.AliveEntries) + { + double objTime = entry.Value.HitObject.StartTime; + + if (objTime < editorClock.CurrentTime) + continue; + + if (objTime < firstAfter?.StartTime) + firstAfter = entry.Value.HitObject; + } if (firstAfter == null) return null; From 3791ab30c44acaaa312f4180c4a82263d2b1aa7c Mon Sep 17 00:00:00 2001 From: Andrei Zavatski Date: Mon, 19 Feb 2024 20:55:43 +0300 Subject: [PATCH 651/651] Reduce allocations in HitCircleOverlapMarker --- .../HitCircles/Components/HitCircleOverlapMarker.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/HitCircles/Components/HitCircleOverlapMarker.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/HitCircles/Components/HitCircleOverlapMarker.cs index 3cba0610a1..fe335a048d 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/HitCircles/Components/HitCircleOverlapMarker.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/HitCircles/Components/HitCircleOverlapMarker.cs @@ -78,9 +78,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.HitCircles.Components Scale = new Vector2(hitObject.Scale); - if (hitObject is IHasComboInformation combo) - ring.BorderColour = combo.GetComboColour(skin); - double editorTime = editorClock.CurrentTime; double hitObjectTime = hitObject.StartTime; bool hasReachedObject = editorTime >= hitObjectTime; @@ -92,6 +89,10 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.HitCircles.Components ring.Scale = new Vector2(1 + 0.1f * ringScale); content.Alpha = 0.9f * (1 - alpha); + + // TODO: should only update colour on skin/combo/object change. + if (hitObject is IHasComboInformation combo && content.Alpha > 0) + ring.BorderColour = combo.GetComboColour(skin); } else content.Alpha = 0;

XBd&sy>Z*v28z{p1a12%udhkcE2$6wCo8wH%%S* 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 IU3QK6Ka9S_WdHyG literal 326320 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