From c965df75abc89a9985df5667419ac701375b205d Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Tue, 16 Apr 2013 03:35:43 +0300 Subject: [PATCH 01/14] Adds a refactor that removes fairly accurate a field in all places (it is based on FindReferences). --- .../ICSharpCode.NRefactory.CSharp.csproj | 1 + ...veFieldRefactoryActionRefactoringAction.cs | 110 ++++++++++++++++++ .../RemoveFieldRefactoryActionTests.cs | 96 +++++++++++++++ .../ICSharpCode.NRefactory.Tests.csproj | 1 + 4 files changed, 208 insertions(+) create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 09463aeed6..b3b9add5b5 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -535,6 +535,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs new file mode 100644 index 0000000000..7f44799942 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs @@ -0,0 +1,110 @@ +// +// RemoveField.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using ICSharpCode.NRefactory.CSharp.Refactoring; +using System.Collections.Generic; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.NRefactory.Semantics; + +namespace ICSharpCode.NRefactory.CSharp +{ + [ContextAction("Removes a field from a class", Description = "It removes also the empty assingments and the usages")] + public class RemoveFieldRefactoryAction : ICodeActionProvider + { + public IEnumerable GetActions(RefactoringContext context) + { + var fieldDeclaration = GetFieldDeclaration(context); + if(fieldDeclaration==null) + yield break; + + + yield return new CodeAction(string.Format(context.TranslateString("Remove field '{0}'"), fieldDeclaration.Name) + , script => GenerateNewScript( + script, fieldDeclaration, context), fieldDeclaration); + } + + + void GenerateNewScript(Script script, FieldDeclaration fieldDeclaration, RefactoringContext context) + { + var firstOrNullObject = fieldDeclaration.Variables.FirstOrNullObject(); + if(firstOrNullObject==null) + return; + var matchedNodes = ComputeMatchNodes(context, firstOrNullObject); + + foreach (var matchNode in matchedNodes) + { + var parent = matchNode.Parent; + if (matchNode is VariableInitializer) + { + script.Remove(parent); + } + else + if (matchNode is IdentifierExpression) + { + if(parent is AssignmentExpression) + { + script.Remove(parent.Parent); + } + else + { + var clone = (IdentifierExpression)matchNode.Clone(); + clone.Identifier = "TODO"; + script.Replace(matchNode, clone); + } + } + } + } + + private static List ComputeMatchNodes(RefactoringContext context, VariableInitializer firstOrNullObject) + { + var referenceFinder = new FindReferences(); + var matchedNodes = new List(); + + var resolveResult = context.Resolver.Resolve(firstOrNullObject); + var member = resolveResult as MemberResolveResult; + if (member == null)//not a member is unexpected case, so is better to return no match than to break the code + return matchedNodes; + + FoundReferenceCallback callback = (matchNode, result) => matchedNodes.Add(matchNode); + + var searchScopes = referenceFinder.GetSearchScopes(member.Member); + referenceFinder.FindReferencesInFile(searchScopes, + context.UnresolvedFile, + context.RootNode as SyntaxTree, + context.Compilation, callback, + context.CancellationToken); + return matchedNodes; + } + + FieldDeclaration GetFieldDeclaration(RefactoringContext context) + { + var result = context.GetNode(); + + return result; + } + } +} + diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs new file mode 100644 index 0000000000..3b2023a10c --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs @@ -0,0 +1,96 @@ +// +// RemoveFieldRefactoryActionTests.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using NUnit.Framework; + +namespace ICSharpCode.NRefactory.CSharp.CodeActions +{ + [TestFixture] + public class RemoveFieldRefactoryActionTests : ContextActionTestBase + { + [Test] + public void RemoveOneField() + { + Test( + @" +class A { + int $field; +} +", + @" +class A { +} +" + );} + + [Test] + public void RemoveOneFieldAndAssignmentValue() + { + Test( + @" +class A { + int $field; + A() { + field = 3; + } +} +", + @" +class A { + A() { + } +} +" + ); + } + + [Test] + public void RemoveOneFieldAndAssignmentValueAndMethodCall() + { + Test( + @" +class A { + int $field; + A() { + field = 3; +if(field!=0) + Method(field); + } +} +", + @" +class A { + A() { +if(TODO!=0) + Method(TODO); + } +} +" + ); + } + } +} + diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index bdae167fa6..caba03e74c 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -410,6 +410,7 @@ + From dd8caea759555b18ee88748b8744e746f763940a Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Tue, 16 Apr 2013 17:56:50 +0300 Subject: [PATCH 02/14] Fixes bug 11709 part of Xamarin's bugzilla: https://bugzilla.xamarin.com/show_bug.cgi?id=11709 It makes ConvertToStaticMethod as an issue. --- .../ICSharpCode.NRefactory.CSharp.csproj | 2 +- .../ConvertToStaticMethodAction.cs | 100 -------------- .../CodeIssues/ConvertToStaticMethodIssue.cs | 125 ++++++++++++++++++ .../ConvertToStaticMethodIssueTests.cs} | 83 ++++++------ .../CodeIssues/InspectionActionTestBase.cs | 6 + .../ICSharpCode.NRefactory.Tests.csproj | 2 +- 6 files changed, 177 insertions(+), 141 deletions(-) delete mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs rename ICSharpCode.NRefactory.Tests/CSharp/{CodeActions/ConvertToStaticMethodActionTests.cs => CodeIssues/ConvertToStaticMethodIssueTests.cs} (57%) diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index b3b9add5b5..9c4c3aa1d8 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -278,7 +278,6 @@ - @@ -536,6 +535,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs deleted file mode 100644 index 0d18436be4..0000000000 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs +++ /dev/null @@ -1,100 +0,0 @@ - -// ConvertToStaticMethodAction.cs -// -// Author: -// Ciprian Khlud -// -// Copyright (c) 2013 Ciprian Khlud -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System.Collections.Generic; -using ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod; -using ICSharpCode.NRefactory.CSharp.Resolver; -using ICSharpCode.NRefactory.Semantics; -using System.Linq; -using ICSharpCode.NRefactory.TypeSystem; - -namespace ICSharpCode.NRefactory.CSharp.Refactoring -{ - [ContextAction("Make this method static", Description = "This method doesn't use any non static members so it can be made static")] - public class ConvertToStaticMethodAction : ICodeActionProvider - { - public IEnumerable GetActions(RefactoringContext context) - { - // TODO: Invert if without else - // ex. if (cond) DoSomething () == if (!cond) return; DoSomething () - // beware of loop contexts return should be continue then. - var methodDeclaration = GetMethodDeclaration(context); - if (methodDeclaration == null) - yield break; - - var resolved = context.Resolve(methodDeclaration) as MemberResolveResult; - if (resolved == null) - yield break; - var isImplementingInterface = resolved.Member.ImplementedInterfaceMembers.Any(); - - if (isImplementingInterface) - yield break; - yield return new CodeAction(context.TranslateString(string.Format("Make '{0}' static", methodDeclaration.Name)), script => - { - var clonedDeclaration = (MethodDeclaration)methodDeclaration.Clone(); - clonedDeclaration.Modifiers |= Modifiers.Static; - script.Replace(methodDeclaration, clonedDeclaration); - var rr = context.Resolve (methodDeclaration) as MemberResolveResult; - var method = (IMethod)rr.Member; - //method.ImplementedInterfaceMembers.Any(m => methodGroupResolveResult.Methods.Contains((IMethod)m)); - - script.DoGlobalOperationOn(rr.Member, (fctx, fscript, fnode) => { - if (fnode is MemberReferenceExpression) { - var memberReference = new MemberReferenceExpression ( - new TypeReferenceExpression (fctx.CreateShortType (rr.Member.DeclaringType)), - rr.Member.Name - ); - fscript.Replace (fnode, memberReference); - } else if (fnode is InvocationExpression) { - var invoke = (InvocationExpression)fnode; - if (!(invoke.Target is MemberReferenceExpression)) - return; - var memberReference = new MemberReferenceExpression ( - new TypeReferenceExpression (fctx.CreateShortType (rr.Member.DeclaringType)), - rr.Member.Name - ); - fscript.Replace (invoke.Target, memberReference); - } - }); - }, methodDeclaration); - } - - static MethodDeclaration GetMethodDeclaration(RefactoringContext context) - { - var result = context.GetNode (); - if (result == null) - return null; - //unsafe transformation for now. For all other public instances the code should - //replace the variable.Call(...) to ClassName.Call() - const Modifiers ignoredModifiers = Modifiers.Override | Modifiers.Virtual | Modifiers.Static; - if ((result.Modifiers & ignoredModifiers) != 0) - return null; - - var usesNonStatic = StaticVisitor.UsesNotStaticMember(context, result); - if (usesNonStatic) return null; - return result; - } - } -} diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs new file mode 100644 index 0000000000..a00a1498ee --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs @@ -0,0 +1,125 @@ +// +// ConvertToStaticMethodIssue.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using ICSharpCode.NRefactory.CSharp.Refactoring; +using System.Collections.Generic; +using ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod; +using ICSharpCode.NRefactory.Semantics; +using System.Linq; +using ICSharpCode.NRefactory.TypeSystem; + +namespace ICSharpCode.NRefactory.CSharp.Refactoring +{ + [IssueDescription("Make this method static", + Description = "This method doesn't use any non static members so it can be made static", + Severity = Severity.Hint, + IssueMarker = IssueMarker.Underline)] + public class ConvertToStaticMethodIssue : ICodeIssueProvider + { + public IEnumerable GetIssues(BaseRefactoringContext context) + { + return new GatherVisitor(context).GetIssues(); + } + + private class GatherVisitor : GatherVisitorBase + { + private bool initializerInvoked; + private ConstructorInitializer initializer; + + public GatherVisitor(BaseRefactoringContext context) + : base(context) + { + } + + public override void VisitMethodDeclaration(MethodDeclaration declaration) + { + // TODO: Invert if without else + // ex. if (cond) DoSomething () == if (!cond) return; DoSomething () + // beware of loop contexts return should be continue then. + var context = ctx; + var methodDeclaration = declaration; + + var resolved = context.Resolve(methodDeclaration) as MemberResolveResult; + if (resolved == null) + return; + var isImplementingInterface = resolved.Member.ImplementedInterfaceMembers.Any(); + + if (isImplementingInterface) + return; + + AddIssue(methodDeclaration.StartLocation, methodDeclaration.Body.StartLocation, + context.TranslateString(string.Format("Make '{0}' static", methodDeclaration.Name)), + script => ExecuteScriptToFixStaticMethodIssue(script, context, methodDeclaration)); + } + + private static void ExecuteScriptToFixStaticMethodIssue(Script script, + BaseRefactoringContext context, + AstNode methodDeclaration) + { + var clonedDeclaration = (MethodDeclaration) methodDeclaration.Clone(); + clonedDeclaration.Modifiers |= Modifiers.Static; + script.Replace(methodDeclaration, clonedDeclaration); + var rr = context.Resolve(methodDeclaration) as MemberResolveResult; + var method = (IMethod) rr.Member; + //method.ImplementedInterfaceMembers.Any(m => methodGroupResolveResult.Methods.Contains((IMethod)m)); + + script.DoGlobalOperationOn(rr.Member, + (fctx, fscript, fnode) => { DoStaticMethodGlobalOperation(fnode, fctx, rr, fscript); }); + } + + private static void DoStaticMethodGlobalOperation(AstNode fnode, RefactoringContext fctx, MemberResolveResult rr, + Script fscript) + { + if (fnode is MemberReferenceExpression) + { + var memberReference = new MemberReferenceExpression + ( + new TypeReferenceExpression( + fctx.CreateShortType(rr.Member.DeclaringType)), + rr.Member.Name + ); + fscript.Replace(fnode, memberReference); + } + else + { + var invoke = fnode as InvocationExpression; + if (invoke == null) return; + if ((invoke.Target is MemberReferenceExpression)) + return; + var memberReference = new MemberReferenceExpression + ( + new TypeReferenceExpression( + fctx.CreateShortType( + rr.Member.DeclaringType)), + rr.Member.Name + ); + fscript.Replace(invoke.Target, memberReference); + } + } + } + + } +} + diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToStaticMethodActionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ConvertToStaticMethodIssueTests.cs similarity index 57% rename from ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToStaticMethodActionTests.cs rename to ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ConvertToStaticMethodIssueTests.cs index 2b8a224406..a32fa16d80 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToStaticMethodActionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ConvertToStaticMethodIssueTests.cs @@ -1,10 +1,10 @@ // -// ConvertToStaticMethodActionTests.cs +// ConvertToStaticMethodIssue.cs // // Author: -// Ciprian Khlud +// Ciprian Khlud // -// Copyright (c) 2013 Ciprian Khlud +// Copyright (c) 2013 Ciprian Khlud // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,50 +23,53 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -using ICSharpCode.NRefactory.CSharp.Refactoring; + using NUnit.Framework; +using ICSharpCode.NRefactory.CSharp.Refactoring; -namespace ICSharpCode.NRefactory.CSharp.CodeActions { - [TestFixture] - public class ConvertToStaticMethodActionTests : ContextActionTestBase - { - [Test] - public void Test() - { - Test( - @"class TestClass +namespace ICSharpCode.NRefactory.CSharp.CodeIssues +{ + [TestFixture] + public class ConvertToStaticMethodIssueTests : InspectionActionTestBase + { + + [Test] + public void Test() + { + Test( + @"class TestClass { void $Test () { int a = 2; } }", - @"class TestClass + @"class TestClass { static void Test () { int a = 2; } }" - ); - } - [Test] - public void TestWithVirtualFunction() { - - var input = @"class TestClass + ); + } + [Test] + public void TestWithVirtualFunction() { + + var input = @"class TestClass { public virtual void $Test () { int a = 2; } -}"; - TestWrongContext(input); - } - - [Test] - public void TestWithInterface() { - - var input = @"interface IBase { +}"; + TestWrongContext(input); + } + + [Test] + public void TestWithInterface() { + + var input = @"interface IBase { void Test(); } class TestClass : IBase @@ -76,20 +79,22 @@ class TestClass : IBase int a = 2; } }"; - TestWrongContext(input); - } - [Test] - public void TestWithStaticFunction() - { - - var input = @"class TestClass + TestWrongContext(input); + } + [Test] + public void TestWithStaticFunction() + { + + var input = @"class TestClass { static void $Test () { int a = 2; } }"; - TestWrongContext(input); - } - } -} \ No newline at end of file + TestWrongContext(input); + } + + } + +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs index f20d38102f..ecef790c70 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs @@ -95,6 +95,12 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues Assert.AreEqual (1, issues.Count); CheckFix (context, issues[0], output, fixIndex); } + + protected static void TestWrongContext (string input) + where T : ICodeIssueProvider, new () + { + Test(input, 0); + } } } diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index caba03e74c..be51d7f2e8 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -109,7 +109,6 @@ - @@ -411,6 +410,7 @@ + From 0d391896fb82c0c466552f48d495878a3ced4055 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Tue, 16 Apr 2013 23:42:49 +0300 Subject: [PATCH 03/14] Fixes bug #10731 https://bugzilla.xamarin.com/show_bug.cgi?id=10731 It will look as a separate issue checker for basic interfaces and it will give the first implementation that works as base (so it will not give 5 possible conversions, even all are possible). In practice works really well. It is losely based on the ParameterCanbeDemotedIssue so I exposed the code to not duplicate it. Yet the code is much simpler this action. --- .../ICSharpCode.NRefactory.CSharp.csproj | 1 + .../ParameterCanBeDemotedIssue.cs | 27 ++- .../ParameterCanBeIEnumerableIssue.cs | 162 ++++++++++++++++++ .../ParameterCanBeIEnumerableTests.cs | 98 +++++++++++ .../ICSharpCode.NRefactory.Tests.csproj | 1 + 5 files changed, 275 insertions(+), 14 deletions(-) create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 9c4c3aa1d8..54f7ca42f3 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -536,6 +536,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs index a7d0cb65aa..9bc34b073c 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs @@ -148,7 +148,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring TypeResolveCount += possibleTypes.Count; var validTypes = (from type in possibleTypes - where !tryResolve || TypeChangeResolvesCorrectly(parameter, rootResolutionNode, type) + where !tryResolve || TypeChangeResolvesCorrectly(ctx, parameter, rootResolutionNode, type) select type).ToList(); if (validTypes.Any()) { // don't demote an array to IList @@ -165,24 +165,13 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring internal int MembersWithIssues = 0; internal int MethodResolveCount = 0; - bool TypeChangeResolvesCorrectly(ParameterDeclaration parameter, AstNode rootNode, IType type) - { - MethodResolveCount++; - var resolver = ctx.GetResolverStateBefore(rootNode); - resolver = resolver.AddVariable(new DefaultParameter(type, parameter.Name)); - var astResolver = new CSharpAstResolver(resolver, rootNode, ctx.UnresolvedFile); - var validator = new TypeChangeValidationNavigator(); - astResolver.ApplyNavigator(validator, ctx.CancellationToken); - return !validator.FoundErrors; - } - IEnumerable GetActions(ParameterDeclaration parameter, IEnumerable possibleTypes) { var csResolver = ctx.Resolver.GetResolverStateBefore(parameter); var astBuilder = new TypeSystemAstBuilder(csResolver); foreach (var type in possibleTypes) { var localType = type; - var message = string.Format(ctx.TranslateString("Demote parameter to '{0}'"), type.FullName); + var message = String.Format(ctx.TranslateString("Demote parameter to '{0}'"), type.FullName); yield return new CodeAction(message, script => { script.Replace(parameter.Type, astBuilder.ConvertType(localType)); }, parameter.NameToken); @@ -190,7 +179,17 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } } - class TypeChangeValidationNavigator : IResolveVisitorNavigator + public static bool TypeChangeResolvesCorrectly(BaseRefactoringContext ctx, ParameterDeclaration parameter, AstNode rootNode, IType type) + { + var resolver = ctx.GetResolverStateBefore(rootNode); + resolver = resolver.AddVariable(new DefaultParameter(type, parameter.Name)); + var astResolver = new CSharpAstResolver(resolver, rootNode, ctx.UnresolvedFile); + var validator = new TypeChangeValidationNavigator(); + astResolver.ApplyNavigator(validator, ctx.CancellationToken); + return !validator.FoundErrors; + } + + class TypeChangeValidationNavigator : IResolveVisitorNavigator { public bool FoundErrors { get; private set; } diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs new file mode 100644 index 0000000000..9708cbc704 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs @@ -0,0 +1,162 @@ +// +// ParameterCanBeIEnumerableIssue.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System.Collections.Generic; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.Semantics; +using System.Linq; + +namespace ICSharpCode.NRefactory.CSharp.Refactoring +{ + + [IssueDescription("A parameter can be demoted to base class", + Description = "Finds parameters that can be demoted to a base class.", + Category = IssueCategories.Opportunities, + Severity = Severity.Suggestion, + SuppressMessageCategory="Microsoft.Design", + SuppressMessageCheckId="CA1011:ConsiderPassingBaseTypesAsParameters" + )] + public class ParameterCanBeIEnumerableIssue : ICodeIssueProvider + { + bool tryResolve; + + public ParameterCanBeIEnumerableIssue() : this (true) + { + } + + public ParameterCanBeIEnumerableIssue(bool tryResolve) + { + this.tryResolve = tryResolve; + } + + #region ICodeIssueProvider implementation + public IEnumerable GetIssues(BaseRefactoringContext context) + { + var gatherer = new GatherVisitor(context, tryResolve); + var issues = gatherer.GetIssues(); + return issues; + } + #endregion + + class GatherVisitor : GatherVisitorBase + { + bool tryResolve; + + public GatherVisitor(BaseRefactoringContext context, bool tryResolve) : base (context) + { + this.tryResolve = tryResolve; + } + + public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) + { + methodDeclaration.Attributes.AcceptVisitor(this); + if (HasEntryPointSignature(methodDeclaration)) + return; + var eligibleParameters = methodDeclaration.Parameters + .Where(p => p.ParameterModifier != ParameterModifier.Out && p.ParameterModifier != ParameterModifier.Ref) + .ToList(); + if (eligibleParameters.Count == 0) + return; + var declarationResolveResult = ctx.Resolve(methodDeclaration) as MemberResolveResult; + if (declarationResolveResult == null) + return; + var member = declarationResolveResult.Member; + if (member.IsOverride || member.IsOverridable || member.ImplementedInterfaceMembers.Any()) + return; + + var collector = new TypeCriteriaCollector(ctx); + methodDeclaration.AcceptVisitor(collector); + + foreach (var parameter in eligibleParameters) { + ProcessParameter(parameter, methodDeclaration.Body, collector); + } + } + + bool HasEntryPointSignature(MethodDeclaration methodDeclaration) + { + if (!methodDeclaration.Modifiers.HasFlag(Modifiers.Static)) + return false; + var returnType = ctx.Resolve(methodDeclaration.ReturnType).Type; + if (!returnType.IsKnownType(KnownTypeCode.Int32) && !returnType.IsKnownType(KnownTypeCode.Void)) + return false; + var parameterCount = methodDeclaration.Parameters.Count; + if (parameterCount == 0) + return true; + if (parameterCount != 1) + return false; + var parameterType = ctx.Resolve(methodDeclaration.Parameters.First()).Type as ArrayType; + if (parameterType == null || !parameterType.ElementType.IsKnownType(KnownTypeCode.String)) + return false; + return true; + } + + void ProcessParameter(ParameterDeclaration parameter, AstNode rootResolutionNode, TypeCriteriaCollector collector) + { + var localResolveResult = ctx.Resolve(parameter) as LocalResolveResult; + if (localResolveResult == null) + return; + var variable = localResolveResult.Variable; + var typeKind = variable.Type.Kind; + if (!(typeKind == TypeKind.Class || + typeKind == TypeKind.Struct || + typeKind == TypeKind.Interface || + typeKind == TypeKind.Array) || + !collector.UsedVariables.Contains(variable)) + { + return; + } + + var candidateTypes = localResolveResult.Type.GetAllBaseTypes().Where(t => t.IsParameterized).ToList(); + + var validTypes = + (from type in candidateTypes + where !tryResolve || ParameterCanBeDemotedIssue.TypeChangeResolvesCorrectly(ctx, parameter, rootResolutionNode, type) + select type).ToList(); + if (!validTypes.Any()) return; + + var foundType = validTypes.FirstOrDefault(); + if (foundType == null) + return; + + AddIssue(parameter.NameToken, string.Format(ctx.TranslateString("Parameter can be {0}"), + foundType.Name), + script => + { + script.Replace(parameter.Type, CreateShortType(ctx, foundType, parameter)); + + }); + } + + public static AstType CreateShortType(BaseRefactoringContext refactoringContext, IType expressionType, AstNode node) + { + + var csResolver = refactoringContext.Resolver.GetResolverStateBefore(node); + var builder = new TypeSystemAstBuilder(csResolver); + return builder.ConvertType(expressionType); + } + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs new file mode 100644 index 0000000000..2ad475e739 --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs @@ -0,0 +1,98 @@ +// +// ParameterCanBeIEnumerableTests.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using NUnit.Framework; +using ICSharpCode.NRefactory.CSharp.CodeActions; +using ICSharpCode.NRefactory.CSharp.Refactoring; + +namespace ICSharpCode.NRefactory.CSharp.CodeIssues +{ + [TestFixture] + public class ParameterCanBeIEnumerableTests : InspectionActionTestBase + { + [Test] + public void CheckIEnumerable() + { + var input = @" +using System.Collections.Generic; +class TestClass +{ + void Write(string[] texts) + { + foreach(var item in texts) { } + } +}"; + TestRefactoringContext context; + var issues = GetIssues(new ParameterCanBeIEnumerableIssue(), input, out context); + Assert.AreEqual(1, issues.Count); + var issue = issues[0]; + // Suggested types: IList and IReadOnlyList + Assert.AreEqual(1, issue.Actions.Count); + + CheckFix(context, issues[0], @" +using System.Collections.Generic; +class TestClass +{ + void Write(IEnumerable texts) + { + foreach(var item in texts) { } + } +}"); + } + [Test] + public void CheckIList() + { + var input = @" +using System.Collections.Generic; +class TestClass +{ + void Write(List texts) + { + if(texts.Count == 0)return; + foreach(var item in texts) { } + } +}"; + TestRefactoringContext context; + var issues = GetIssues(new ParameterCanBeIEnumerableIssue(), input, out context); + Assert.AreEqual(1, issues.Count); + var issue = issues[0]; + // Suggested types: IList and IReadOnlyList + Assert.AreEqual(1, issue.Actions.Count); + + CheckFix(context, issues[0], @" +using System.Collections.Generic; +class TestClass +{ + void Write(ICollection texts) + { + if(texts.Count == 0)return; + foreach(var item in texts) { } + } +}"); + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index be51d7f2e8..1dfe33f783 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -411,6 +411,7 @@ + From 3fae6d6cd66d47f478416aed81e0c5a142aedb94 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Tue, 16 Apr 2013 23:56:10 +0300 Subject: [PATCH 04/14] Fixed description --- .../ParameterCanBeIEnumerableIssue.cs | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs index 9708cbc704..a8e4dd9ccc 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs @@ -32,16 +32,14 @@ using System.Linq; namespace ICSharpCode.NRefactory.CSharp.Refactoring { - [IssueDescription("A parameter can be demoted to base class", - Description = "Finds parameters that can be demoted to a base class.", + [IssueDescription("A parameter can IEnumerable/ICollection/IList", + Description = "Finds parameters that can be demoted to a generic list.", Category = IssueCategories.Opportunities, - Severity = Severity.Suggestion, - SuppressMessageCategory="Microsoft.Design", - SuppressMessageCheckId="CA1011:ConsiderPassingBaseTypesAsParameters" + Severity = Severity.Suggestion )] public class ParameterCanBeIEnumerableIssue : ICodeIssueProvider { - bool tryResolve; + readonly bool tryResolve; public ParameterCanBeIEnumerableIssue() : this (true) { @@ -108,9 +106,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring if (parameterCount != 1) return false; var parameterType = ctx.Resolve(methodDeclaration.Parameters.First()).Type as ArrayType; - if (parameterType == null || !parameterType.ElementType.IsKnownType(KnownTypeCode.String)) - return false; - return true; + return parameterType != null && parameterType.ElementType.IsKnownType(KnownTypeCode.String); } void ProcessParameter(ParameterDeclaration parameter, AstNode rootResolutionNode, TypeCriteriaCollector collector) @@ -129,7 +125,9 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring return; } - var candidateTypes = localResolveResult.Type.GetAllBaseTypes().Where(t => t.IsParameterized).ToList(); + var candidateTypes = localResolveResult.Type.GetAllBaseTypes() + .Where(t => t.IsParameterized) + .ToList(); var validTypes = (from type in candidateTypes @@ -143,11 +141,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring AddIssue(parameter.NameToken, string.Format(ctx.TranslateString("Parameter can be {0}"), foundType.Name), - script => - { - script.Replace(parameter.Type, CreateShortType(ctx, foundType, parameter)); - - }); + script => script.Replace(parameter.Type, CreateShortType(ctx, foundType, parameter))); } public static AstType CreateShortType(BaseRefactoringContext refactoringContext, IType expressionType, AstNode node) From d225305f0d4d8f7bb0f3156e86b6b103edac84b2 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Fri, 19 Apr 2013 21:45:37 +0300 Subject: [PATCH 05/14] Fixed the range of the ConvertToStaticMethodIssue --- .../CodeIssues/ConvertToStaticMethodIssue.cs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs index a00a1498ee..882899b3e8 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs @@ -23,9 +23,8 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -using ICSharpCode.NRefactory.CSharp.Refactoring; + using System.Collections.Generic; -using ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod; using ICSharpCode.NRefactory.Semantics; using System.Linq; using ICSharpCode.NRefactory.TypeSystem; @@ -49,8 +48,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring private ConstructorInitializer initializer; public GatherVisitor(BaseRefactoringContext context) - : base(context) - { + : base(context) { } public override void VisitMethodDeclaration(MethodDeclaration declaration) @@ -69,7 +67,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring if (isImplementingInterface) return; - AddIssue(methodDeclaration.StartLocation, methodDeclaration.Body.StartLocation, + AddIssue(methodDeclaration.NameToken.StartLocation, methodDeclaration.NameToken.EndLocation, context.TranslateString(string.Format("Make '{0}' static", methodDeclaration.Name)), script => ExecuteScriptToFixStaticMethodIssue(script, context, methodDeclaration)); } @@ -92,8 +90,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring private static void DoStaticMethodGlobalOperation(AstNode fnode, RefactoringContext fctx, MemberResolveResult rr, Script fscript) { - if (fnode is MemberReferenceExpression) - { + if (fnode is MemberReferenceExpression) { var memberReference = new MemberReferenceExpression ( new TypeReferenceExpression( @@ -102,8 +99,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring ); fscript.Replace(fnode, memberReference); } - else - { + else { var invoke = fnode as InvocationExpression; if (invoke == null) return; if ((invoke.Target is MemberReferenceExpression)) From 17b26e4ce0757f523493defd1f469c21c65f9e8e Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Fri, 19 Apr 2013 22:52:35 +0300 Subject: [PATCH 06/14] Added more unit tests to: https://bugzilla.xamarin.com/show_bug.cgi?id=10728 There is a bug in conversion between double and float (in Convert part of the base classes) --- .../ExpressionOfCompatibleTypeCastIssue.cs | 6 +- ...xpressionOfCompatibleTypeCastIssueTests.cs | 70 +++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs index c84b2e80c5..15c2fe684b 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs @@ -56,8 +56,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { base.VisitAssignmentExpression(assignmentExpression); - VisitTypeCastExpression(assignmentExpression, ctx.Resolve(assignmentExpression.Left).Type, - ctx.Resolve(assignmentExpression.Right).Type); + var leftExpressionType = ctx.Resolve(assignmentExpression.Left).Type; + var rightExpressionType = ctx.Resolve(assignmentExpression.Right).Type; + VisitTypeCastExpression(assignmentExpression, leftExpressionType, + rightExpressionType); } private AstType CreateShortType(AstNode node, IType fullType) diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs index dda08566be..8dba18ed40 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs @@ -59,5 +59,75 @@ class TestClass Test(input, output); } + [Test] + public void TestConversionDoubleFloat() + { + var input = @" +class Foo +{ + void Bar () { + double c = 3.5; + float fc; + fc = c; + } +}"; + var output = @" +class Foo +{ + void Bar (){ + double c = 3.5; + float fc; + fc = (float)c; + } +}"; + //TODO: + //Test is failing as conversion seems to have a bug that + //considers that double is implicit convertible to float, + //when should it be explicitly convertible to float + + //Test(input, output); + } + + [Test] + public void TestConversionEnumToInt() + { + var input = @" +class Foo +{ + enum Enum { Zero } + void Bar () { + var e = Enum.Zero; + int val; + val = e; + } +}"; + var output = @" +class Foo +{ + enum Enum { Zero } + void Bar () { + var e = Enum.Zero; + int val; + val = (Enum)e; + } +}"; + Test(input, output); + } + + [Test] + public void TestConversionSameType() + { + var input = @" +class TestClass +{ + void TestMethod () + { + int x =0; + int y = 1; + $x = i; + } +}"; + Test(input, 0); + } } } \ No newline at end of file From eca73de6e4a854e14531e2029ea63d516f0b566f Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Sun, 21 Apr 2013 11:10:34 +0300 Subject: [PATCH 07/14] ExpressionOfCompatibleTypeCodeIssue will not convert class types any longer. --- .../ExpressionOfCompatibleTypeCastIssue.cs | 6 +++--- .../ExpressionOfCompatibleTypeCastIssueTests.cs | 13 +------------ 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs index 15c2fe684b..d1402bd314 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs @@ -54,10 +54,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring public override void VisitAssignmentExpression(AssignmentExpression assignmentExpression) { - base.VisitAssignmentExpression(assignmentExpression); - + var rightExpressionType = ctx.Resolve(assignmentExpression.Right).Type; + if (rightExpressionType.Kind == TypeKind.Class) + return; var leftExpressionType = ctx.Resolve(assignmentExpression.Left).Type; - var rightExpressionType = ctx.Resolve(assignmentExpression.Right).Type; VisitTypeCastExpression(assignmentExpression, leftExpressionType, rightExpressionType); } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs index 8dba18ed40..dd6fb0d6de 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs @@ -45,18 +45,7 @@ class TestClass x = i; } }"; - var output = @" -class Base {} -class Test: Base {} -class TestClass -{ - void TestMethod (Test i) - { - Base x; - x = (Test)i; - } -}"; - Test(input, output); + Test(input, 0); } [Test] From ad0c12d1dabd31181f01956baa49aa3e5d23d635 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Wed, 24 Apr 2013 22:38:22 +0300 Subject: [PATCH 08/14] Sample implementation for bug #11866 https://bugzilla.xamarin.com/show_bug.cgi?id=11866 The test fails because EOLN issues for now, and it works just for methods that return void for now. But it does look for methods inside the classes that have same: arguments, return type and modifiers (so are duplicates) --- .../ICSharpCode.NRefactory.CSharp.csproj | 1 + .../CodeIssues/DuplicateBodyMethodIssue.cs | 186 ++++++++++++++++++ .../DuplicateBodyMethodIssueTests.cs | 64 ++++++ .../ICSharpCode.NRefactory.Tests.csproj | 1 + 4 files changed, 252 insertions(+) create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 54f7ca42f3..bf5e6b4bc3 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -537,6 +537,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs new file mode 100644 index 0000000000..71e56d2b91 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs @@ -0,0 +1,186 @@ +// +// DuplicateBodyMethodIssue.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System.Collections.Generic; +using System.Text; +using ICSharpCode.NRefactory.PatternMatching; +using ICSharpCode.NRefactory.Semantics; +using System.Linq; + +namespace ICSharpCode.NRefactory.CSharp.Refactoring +{ + [IssueDescription("Methods have duplicate body", + Description = "One method has the same body as other method", + Severity = Severity.Hint, + IssueMarker = IssueMarker.Underline)] + public class DuplicateBodyMethodIssue : ICodeIssueProvider + { + private Dictionary> _dict; + + #region ICodeIssueProvider implementation + + public IEnumerable GetIssues(BaseRefactoringContext context) + { + var visitor = new GatherVisitor(context); + visitor.GetMethods(); + return visitor.GetIssues(); + } + + #endregion + + private class GatherVisitor : GatherVisitorBase + { + public List DeclaredMethods; + + public GatherVisitor(BaseRefactoringContext context) + : base(context) + { + DeclaredMethods = new List(); + } + + + string GetMethodDescriptor(MethodDeclaration methodDeclaration) + { + var sb = new StringBuilder(); + sb.Append(methodDeclaration.ReturnType); + sb.Append(";"); + sb.Append(methodDeclaration.ReturnType.ToString()); + sb.Append(";"); + foreach (var parameter in methodDeclaration.Parameters) + { + sb.AppendFormat("{0}:{1};", parameter.Name, parameter.Type); + } + sb.Append(methodDeclaration.Modifiers); + return sb.ToString(); + } + + public void GetMethods() + { + ctx.RootNode.AcceptVisitor(this); + } + + private void ComputeConflicts() + { + var dict = new Dictionary>(); + foreach (var declaredMethod in DeclaredMethods) + { + var methodDescriptor = GetMethodDescriptor(declaredMethod); + List listMethods; + if (!dict.TryGetValue(methodDescriptor, out listMethods)) + { + listMethods = new List(); + dict[methodDescriptor] = listMethods; + } + listMethods.Add(declaredMethod); + } + foreach (var list in dict.Values.Where(list => list.Count >= 2)) + { + for (var i = 0; i < list.Count - 1; i++) + { + var firstMethod = list[i]; + for (var j = i + 1; j < list.Count; j++) + { + var secondMethod = list[j]; + if (firstMethod.Body.IsMatch(secondMethod.Body)) + { + AddIssue(secondMethod.NameToken, + string.Format("Method '{0}' has the same with '{1}' ", secondMethod.Name, + firstMethod.Name), + script => { InvokeMethod(script, firstMethod, secondMethod); } + ); + } + } + } + } + } + + readonly InsertParenthesesVisitor _insertParenthesesVisitor = new InsertParenthesesVisitor(); + private TypeDeclaration _parentType; + + private void InvokeMethod(Script script, MethodDeclaration firstMethod, MethodDeclaration secondMethod) + { + var statement = + new ExpressionStatement(new InvocationExpression(new IdentifierExpression(firstMethod.Name), + firstMethod.Parameters.Select( + declaration => + GetArgumentExpression(declaration).Clone()))); + statement.AcceptVisitor(_insertParenthesesVisitor); + script.Replace(secondMethod.Body, new BlockStatement { statement}); + } + + static Expression GetArgumentExpression(ParameterDeclaration parameter) + { + var identifierExpr = new IdentifierExpression(parameter.Name); + switch (parameter.ParameterModifier) + { + case ParameterModifier.Out: + return new DirectionExpression(FieldDirection.Out, identifierExpr); + case ParameterModifier.Ref: + return new DirectionExpression(FieldDirection.Ref, identifierExpr); + } + return identifierExpr; + } + + public override void VisitMethodDeclaration(MethodDeclaration declaration) + { + var context = ctx; + var methodDeclaration = declaration; + + var resolved = context.Resolve(methodDeclaration) as MemberResolveResult; + if (resolved == null) + return; + var isImplementingInterface = resolved.Member.ImplementedInterfaceMembers.Any(); + + if (isImplementingInterface) + return; + if (declaration.Body.IsNull) + return; + + var parentType = declaration.Parent as TypeDeclaration; + if (parentType == null) + return; + if (_parentType == null) + _parentType = parentType; + else + { + //if we are here, it means that we switched from one class to another, so it means that we should compute + //the duplicates up-to now, then reset the list of methods + if (parentType != _parentType) + { + ComputeConflicts(); + DeclaredMethods.Clear(); + + DeclaredMethods.Add(declaration); + _parentType = parentType; + return; + } + } + + DeclaredMethods.Add(declaration); + } + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs new file mode 100644 index 0000000000..f19a07420b --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs @@ -0,0 +1,64 @@ +// +// DuplicateBodyMethodIssueTests.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using NUnit.Framework; +using ICSharpCode.NRefactory.CSharp.Refactoring; + +namespace ICSharpCode.NRefactory.CSharp.CodeIssues +{ + + [TestFixture] + public class DuplicateBodyMethodIssueTests : InspectionActionTestBase + { + + [Test] + public void Test() + { + Test( + @"class TestClass { + void Test () + { + int a = 2; + } + void $Test2 () { + int a = 2; + } +}", + @"class TestClass { + void Test () + { + int a = 2; + } + void Test2 () { + Test (); + } +} +" + ); + } + } + +} diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index 1dfe33f783..08aa57084b 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -412,6 +412,7 @@ + From 9db3f46cbc4ae0d97c4f5b458410e50754c95836 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Sun, 28 Apr 2013 13:05:57 +0300 Subject: [PATCH 09/14] Support non void arguments --- .../CodeIssues/DuplicateBodyMethodIssue.cs | 24 +++++++++------- .../DuplicateBodyMethodIssueTests.cs | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs index 71e56d2b91..dbad68bf66 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs @@ -46,6 +46,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { var visitor = new GatherVisitor(context); visitor.GetMethods(); + visitor.ComputeConflicts(); return visitor.GetIssues(); } @@ -62,15 +63,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } - string GetMethodDescriptor(MethodDeclaration methodDeclaration) - { + static string GetMethodDescriptor(MethodDeclaration methodDeclaration) { var sb = new StringBuilder(); sb.Append(methodDeclaration.ReturnType); sb.Append(";"); - sb.Append(methodDeclaration.ReturnType.ToString()); - sb.Append(";"); - foreach (var parameter in methodDeclaration.Parameters) - { + foreach (var parameter in methodDeclaration.Parameters) { sb.AppendFormat("{0}:{1};", parameter.Name, parameter.Type); } sb.Append(methodDeclaration.Modifiers); @@ -82,7 +79,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring ctx.RootNode.AcceptVisitor(this); } - private void ComputeConflicts() + internal void ComputeConflicts() { var dict = new Dictionary>(); foreach (var declaredMethod in DeclaredMethods) @@ -96,6 +93,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } listMethods.Add(declaredMethod); } + DeclaredMethods.Clear(); + foreach (var list in dict.Values.Where(list => list.Count >= 2)) { for (var i = 0; i < list.Count - 1; i++) @@ -128,7 +127,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring declaration => GetArgumentExpression(declaration).Clone()))); statement.AcceptVisitor(_insertParenthesesVisitor); - script.Replace(secondMethod.Body, new BlockStatement { statement}); + if(firstMethod.ReturnType.ToString()!="System.Void"){ + var returnStatement = new ReturnStatement(statement.Expression.Clone()); + + script.Replace(secondMethod.Body, new BlockStatement { returnStatement }); + } + else { + script.Replace(secondMethod.Body, new BlockStatement { statement }); + } } static Expression GetArgumentExpression(ParameterDeclaration parameter) @@ -171,8 +177,6 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring if (parentType != _parentType) { ComputeConflicts(); - DeclaredMethods.Clear(); - DeclaredMethods.Add(declaration); _parentType = parentType; return; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs index f19a07420b..d5283702bb 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs @@ -59,6 +59,34 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues " ); } + [Test] + public void TestNonVoid() + { + Test( + @"class TestClass { + int Test () + { + int a = 2; + return a; + } + int $Test2 () { + int a = 2; + return a; + } +}", + @"class TestClass { + int Test () + { + int a = 2; + return a; + } + int Test2 () { + return Test (); + } +} +" + ); + } } } From 9a482c26530df4953d5ffe10979a44e52e0dd278 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Sun, 28 Apr 2013 13:08:51 +0300 Subject: [PATCH 10/14] Remove unused field --- .../Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs index dbad68bf66..7a108541e7 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs @@ -38,8 +38,6 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring IssueMarker = IssueMarker.Underline)] public class DuplicateBodyMethodIssue : ICodeIssueProvider { - private Dictionary> _dict; - #region ICodeIssueProvider implementation public IEnumerable GetIssues(BaseRefactoringContext context) From fe53dec6151b137f21021ce40e79aac87d1aa676 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Sun, 28 Apr 2013 13:11:04 +0300 Subject: [PATCH 12/14] untracked files on master: 9a482c2 Remove unused field --- ICSharpCode.NRefactory.Demo/CSDemo.resources | Bin 0 -> 180 bytes .../MainForm.resources | Bin 0 -> 180 bytes .../SemanticTreeDialog.resources | Bin 0 -> 180 bytes ...arpCode.NRefactory.Tests.csproj.test-cache | Bin 0 -> 926281 bytes NRefactory.sln.DotSettings.user | 5 ++ NRefactory.suo | Bin 0 -> 318464 bytes NRefactory.userprefs | 52 ++++++++++++++++++ 7 files changed, 57 insertions(+) create mode 100644 ICSharpCode.NRefactory.Demo/CSDemo.resources create mode 100644 ICSharpCode.NRefactory.Demo/MainForm.resources create mode 100644 ICSharpCode.NRefactory.Demo/SemanticTreeDialog.resources create mode 100644 ICSharpCode.NRefactory.Tests/test-results/ICSharpCode.NRefactory.Tests.csproj.test-cache create mode 100644 NRefactory.sln.DotSettings.user create mode 100644 NRefactory.suo create mode 100644 NRefactory.userprefs diff --git a/ICSharpCode.NRefactory.Demo/CSDemo.resources b/ICSharpCode.NRefactory.Demo/CSDemo.resources new file mode 100644 index 0000000000000000000000000000000000000000..6c05a9776bd7cbae976fdcec7e3a254e93018279 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh literal 0 HcmV?d00001 diff --git a/ICSharpCode.NRefactory.Demo/MainForm.resources b/ICSharpCode.NRefactory.Demo/MainForm.resources new file mode 100644 index 0000000000000000000000000000000000000000..6c05a9776bd7cbae976fdcec7e3a254e93018279 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh literal 0 HcmV?d00001 diff --git a/ICSharpCode.NRefactory.Demo/SemanticTreeDialog.resources b/ICSharpCode.NRefactory.Demo/SemanticTreeDialog.resources new file mode 100644 index 0000000000000000000000000000000000000000..6c05a9776bd7cbae976fdcec7e3a254e93018279 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh literal 0 HcmV?d00001 diff --git a/ICSharpCode.NRefactory.Tests/test-results/ICSharpCode.NRefactory.Tests.csproj.test-cache b/ICSharpCode.NRefactory.Tests/test-results/ICSharpCode.NRefactory.Tests.csproj.test-cache new file mode 100644 index 0000000000000000000000000000000000000000..90f7d1e4a0ad726635372ca9798edbc2faece4cd GIT binary patch literal 926281 zcmd441$Y}r_dT3#lW{i8j19M`+aztu;KTv9Nu0)ka;n(tSdA>XlAOe4W@ct)W@ct) zW@dc*ox7_mjig=ejCT9~eed(UryA$Zz30r%&d$ybv@_bZYxghyNB^b&by)*2du}40 zsJ2#Gu|!MdyhZV7dg6%1Rx%Y$#J8ASIkj^A%JnCXnBE#owgvB>eGp2 zMMhJ{>51l+NYYC7Ag9w44c7c*Vr8_!N_M0_)J6BS+Cx@KERMultyH^qYp&U@Lx;{C z-D1_SuhA}?Yl{4Tz1_xJk$_H}h`iaJpaY->{h|^O0UO?O_D!UfoQS|k;%pA%_G zCt7x{wo)tTzw;JYjkcb)otH)9JC7beJrQq=E^kdnsH7(BTr<6{DUxgkCz5&HAz)vY6`=Od^;}Foj?Pf(;3#5^O}UF~KGTn-XkBusOjN1X}_s z=sMY4=y9aUWh-PcwcyN@k1;F45Gl*iDvZKR$9sQ;%JJRLA&c9>hbSBBpP6{u|Elq z0G1DdMqdKva+nx)>w+Jm3DAiY)udABDT}DD1F<_y#``O99HIzUz}~Q1GW-xRKyT+( zsA^sowc_=bQ+Cbx2cNQw!(@_AWV`2_?>XTWvc)%~xd%)Py9LG%kpv8I$k(=}TUzt4 ze#+OKNW)~RiUJq+ttEr6^bKyVf{9^2Nbp0f2K1}8TGCB3qsdghk~UvwVo#WCP+EzH z^Sw$0-rF~@xerVX`$>o&VqZY_nTcd`B%O}NmpfHyKVL6mf0(RWntp*-)Z_z@$*`Zl z_#qAibgqdvWcykN;SWAF_+Xg$G<=drgggWp4Et%1AL39uLL4ua>G^p5ji;Nel$FYB zf)2AyoH|PPwbZ}ObQ{ItFxjlM_L`D0j_{{(q%RHgD3};_9|k|f(F70$ZQ>Z;%;H#> zc=cT~4_e0=%J4YY8g@U4VjK?`vR$i{Y@4yVC26H-j0C?TxR9Av`~+C|T*nh(vT5le zEE(b?UlJ$#k}yw!iD7sB@I#ym=*$BPxD~`{z8=KsF!8C5l1CKf8OUHzN0WMU;!Hrt z1y(8%!;?^)g_KXRoedM8?h(5~uybH-*qu`R5a$B=X6kj)YMhfutY~dmS>r{SEd(4y1<*ng{maXi(qMN4X_LGV*HSFIknc&bqW4SP1mKc)YT zNICjU7Ii7=+r&dk9>v2j+r;BS$TB>lJW`6nqe>La$6#j61laZJas22#%Sub-o%qI+t6Q-TZE^)LO-n(+I$9P#w>s>FDivJUxJx28(@=v89xTiiR{^C-x&=>wfGe!r{YzZZSH?DN(6e% zhsf(nM9eo}X4C*|b#LMa+OEdT$EDd;tcCCXx0L*ew_&!CzcBY0?|6rQS1G*t9?Xnw z0Jfa>@ncY(m5fGW_;gi#u|B}RE3{}I!c5^}l?e2a50Q_Rh?t+i%-9xStNRo`x)qFS zeWv6{d=9hq{jXAi^DkTieyJ4D{0e5q9DvRIYy9X%w=4Qe_-cf&R!$@Ejgm9*EzG>$ zk)=k!CBSzcfxlM@Z2kZ**wbtpi$X&pnU{!LsTl@?Qub!Aa zAdb(yK0$s_qVlUB74tV(81n$Oz~AvB)76}xj5bHp(UsP8e2a80)*pV}#GkP6dg5e+ z*~3aM&i^VI`ftC`=0C77Y5}&8|KUfkg-Od=n2g|+Diw)268`n`BWUE?YY5np;NsRm zCbw{F;O`}?g1IIvD(b+h+!6QoaA4A815=Qz9oW?x_@Oy?UqN0vl9yfB3*Eq)UQF`R ziJ&t<7lN(?-3Yo9^dRU-(2JlqK_7y?1pNs56AU02NHBJ!TJP~2qqIuA=rRmLxQOU8xd?wunEDY z1e+0TPOt^RmIPZ7Y)w!_FpXe3K{de)f|&%f2xb%15Nt!REx{auxdihFY6<2OY)7zw zppIZ6pd!N8t*8EVTSQ(K6D%Rvo?r)p9SL?K*qLA#f?Wxg66{70Ay`IGPtZU>vsfyY zGogw4gc`}qa)Ks;D8cRoD+po)%>;3R1VIbI9t25(6hWGxm0%^oDuUGnZ3KG~>_xCQ z!9E2066{B?KfwV62NE1aa4^9k1cwqFMsPU65d=pP97S+6!7&8K5*$ZxJi!ToiWOWg z^lZ_*!A>MEClQ=Xa0}E2TupEd!LO&}FA=;< z@Cw1J1g{aiPVff7n*?tWyiM>9!MlKpJ^14F*1ve~k(c)gJ|Osz;3I;M2|gkCl;AUh z&k4RD_>$l&g0Bg_A^4WyJA&^CegIUgVroL4+K=SrCxV{|ej)gk;5R_UKI|C@-5UEl zIXHkF&;wet%Krfe=AQ(A5&TW?55fNk{w1IpPo@E=ID`Y?&$@xuAO}aWgMRuB)+8G3 z2|5r6f(n9;1SUZzg3bgq-p&!F+=42o@035iBHF zM6j4(3BmRRI}q$huoIx-B4*!RpZ(6{Wfy{736>J@CKwuFx5-cZZB8U>~ z4yd?-Y4p{nv4XtB2$~7v1POu`f;|Y51Sx_vK`X&Zf>i{o3EBwuB-o2!Z-RXY_9fU4 zP;niT?5t06fAVqw!GQz^5gbf#2*IHQhY=i3a0J1TfQnlEz`M^6~(CY0>v`CV4rF;B10(2+k!q zkKlZQ3kWVGxQO6lf=dW4CAf^>a)K)et|YjM;A(#J$C3ubCb%Hkt-XwU7;BA6;2;L=lkKlcR4+uUa_=wuOCHRcsbAm4jz9jgH;A?_!2)-rwj^KNO9|(RV_=(_Wf?o)JCHRftcY;3%{v`N| z;BSI|2>wU#FG0IC0S3Vu1ekY@=PE%50zptg(2;;9!B^1WdAT)~=AfIM$;&hBrJH_@ z?LuC<5_BWzPSAs(CqXZQ-UNLJ`V#ab=ua?!U?8A^hM#R69rPItA}@mph7b%T7zU`I zQD56Bz1nN`zJ`;R5d=m0%-+jR`g(*py&1g3SrGAlQ;%D}t>FstBeLOed%&m_aa;U>3n_f*OKt z2(~4dLok6T!{|yAbS3u#{jof(XGf zf_j1m0*j!LU^zh(L6l&3f)xZYf@Xp^L4u%#U=M;ML5d(v&`Pk9U=_h?f;NIZ3HAb1 z(3rVh8OG{YhP}zlJ_P#`>_@Oa!2tvZ5*$QuFu@@NhY}n{a5%vc1V<7aMQ}91F$BjF z97k|G!3hK>5}ZVEGQlYXrxKh-a5}*m1ZNVQMQ}F3IRxhtoJVjz!3BT{8c#3xHn@61+z6I>8$RZxXyk@HW9a1n&~ONANzu2LvAyd_?du!6yWt5`0GR zIl&hMUlM#p@HN3V1m6;TNANwt4+K9F{6z3G!7l{A68uK+JHa0We-ivf@HfFf1pfn6 z&?gGJGPK8kHQU60$xAzAG!23^02TDHpj>}zl9%=b9S8*Zqp^A0-zfZ7lV1gS=}15; ztISRWoe8=SbS3CU(4BymT$w!ydJ*&{=tIz#pdUehf&l~r2?h}iCKy66lwcUaaDov8 zBMH_b7)3CeU<|=nf^h`n2_^t4{$Z&|=t^CiysSeokzidw#hUcOO8-Y!Lf2mH3#XGfPe#qj^!%+@W`9g8htyS1W9?}%HKCbYFWA+rj$Mg=RKhSUfw zcbJDss;TP4yaeXHB=O;HW-`${1ItNkF}XD_?^fKEn77BLHv`YlMrtW;Ifs-rbm^*rlI%r1v|4KmHtrS48ZCTud{Iq=`Vs-dAO zo}lurs;|ckSYEy`7ysxp9h9aN^Foh#Fs~}jRWh&iidtKW(tIsS=5{bQI5+7O6MbcOnuZp0+V)6wgtSE|n(DiQmMgI% z%)Ms5Wp1hhMRpiW$=!)abYT)ZBQlU2W>rZGE1q9!#D>&Tsw-bIhst}vgWUZF}w zUg}3}H!W&r1m;Fp7QPIrF_{HGxRc^-&571jwH33LN3i%gF(=ZztRdnQLA_QS(E#&W zjUsRsA^C8y)af>A(KVOD+~~%|(u7nWE|%0n>5F1fY!C8{zr0~1i;S6qxzU3)rjZ()DOCIi>wK|B z0&`IkHH}WCZq@QGR>EB8zIH0LYvfga)K+UzGuvQp^km_CBE=QB+Nxiem~E|g6z`?w zR_qOP{fnC)avx7J`)ZLf_k+37i#6_#)Wpoi#kvYdr zrZQ9bx>a~v zX>u;_8Cs6TnK1WxwRCwt7Y0461fjFF2$|==-006r&qZooR+?$p7AClbac$$y(~2j~ zhxroidzl+qA1)W@)4x!QzIhSMjR9O-7bCSE7Z=7>oLT6}9LpLEM$pW3drOf_Z|4%N zh~iS1@1S2`s%$PRN5bV=63i=LZVco?yAr8&GKJ>!_opQqq$Q=ezc3tNKT4fj>?*Bj z;%b;L(k?J1CfDdvzgCO7c^%A+L0nMRyGF|u4&9fTWw=g3-Jlgs+z9g^1yzE{O}f-? z)}n6S0&`<97u2mtjn365yg(+3-|Orr)NNW}#O*MjS58$bLE#Q%vUh5cHSdDCF@($H zZlw5`Rktci!#LTOkbAToi+f?N|I8{3dS3}b_iGU{AAq?rl$Ab+)WFQuheoO4voHBW zTE4}@FrTh{$z9?;QkvGITC~i^U~UX!$&Vw|A1kcUOiqi`ufRZ79d=U54AMQJO>y*^d{`X?YgU!(3Zzanu(|QF>8} zlKB$MjS(#NWuyi>Wjs9=NnvQLK86)kG>qW1@vmrk7q7xxr;lydDfh^)`B8gai< zXNsaVmBvRMs_$;&3m<5O5g)=_=W*tgMrjHkDU&zx%#Bf8CZ8hJ+bNUmXtCYA zf2QSCd=7K3m3S@#_-+xu@S^gi78Ua=m>Z*6;MYj?al*}rw>I0`uR3@9H(GARw=mZk zK(H@zLCEhs$$YOx#{2>1#u(Q4BT@r18tp0_UzwLjxO4EX|qQ}Q=*~h zx!YOGz32jSpO5i*!(6szkI-Fx$#v5rXLg6Vu{LX`Eulv_+H0|LIEL*|mPAnot+Y{? zymY;%Rus_-=5uws9;F%dR;AiUi>lcd=Egc)ApMZaJZiDE3U-G`+uN3>M1L)>VgSsw zAGP@r2YOK%q(#LX40B^53mk&fK&OUVF8A3`E#G1o%rzcE-f@SQrZqx~mN^pU#=0zd zEu^N>=HYSLw9UEEYMiGpy;;~JZqfRpzuP^mQCfk;XqfM&Uhm5!H70z;ibOC zdRjik`Y_j+5>y;-k~@vbS~SclFgMm`X&WHbD-%k-lpAU}6;olZ(V1}xxRD2ujkSoF zo50+d#OgLhYS7GBw51kpIrX-ylFRLV&NJU5Hq&x0Hivn&`u$xZ@D@JAw$vhKZUu8= zGOOMiDeR?%LmeQTLcN-gLInqGN6gb7KRRIR~kM9MTz6o)cMS#WIz5u9j~x59S&VYwx(V zrD@IAqGfIeb7Mo6ya1^o+2Nk5Wf%;@!$#UmP1I?*7Ykvo(Hk!rdXX==#aiUdB``Op zvi9wf8lEM9&!<)r2fkSR1=@MU?w}Px>eJ2%)J8MxicY(RF5f{R)NcAtK z;fP*ySZj zHEEGDqcAr%VZFN}HOko~x}g79hh-U&-0=k~w4#U@%r)LORTwm@QjKd-H4`v5Hsu0o zL8>3_^kkx;wH^l(VDKMnIGoD9hn8cJgt^9-N{^ta5`@xPgv?f$8=JAxl}MqgXOueI z$<<({gQInomTR#Z=2}(VBWznqQhREVGWUYHu{rDA+i^{YJ=8Q-#T)9PG^MC9Gn}xG zmTR#u%(e7-gx#+ssr|J`nFqk!*n;&Qh*U4UR@-{*i|Sn2gS4EAgJG`m9^n%35Dy}U zY7sFHgSoLKt2-R2eyFb0p)faAL60gy=x8lM<}olgwqm8n zA~kZGL^Li9gQEHtE}T0~D~328<{IB3{o|jYM)O21n&wF`H@4=YI2oz#M5RvJtosx# zkK$CAd+oFAGRR*T?KC$Er)yC#&w#m6#iGtcs@GgAx!jtE+G{mndZk^9&(d-#&W5?h zed-eM91kMrY7sHdgSjz{)t!%2-?@pESWbhpP^@HKJqB?dffs1`6&J!>oFtmU8J_l9Gv`WQqvcgx3v-Q84!4Ncc~QAui;8&z%#9f=@J6KiFR+?X zor`BW-K6DN+zfM#S0S&cx0IrEs}?2mHkcbTS?ujd^~{9DE5DT)M4E=1=c&Eqdk?FgI#g z{*y>$s`mnGd3HwIQ(8X7(=gYr-g3NW+-W?kMZ!y;!JSs?9WAfoU6^Y;YTY8f=SAgxEh^>*FgND1 zzz>n?UYAIw?QTToT7IPEQG5(@jjn!Sv`^e9e5ysk{0!#CJQnpiQft*=)B$^BWM|U4 zyvu!|6-0aq^EvA6t^$Ft6p4PVMb!KT=0+`-#ct1^3O>1utUpD@-JF0#jh~en1ELl?l)HwziW{&|A4u%9qalNsj0LA z$7R|E76y6E^swJ^|I!L9{)V~6jE*u%{S!dY|Fi^||H9l@z$MuZTW9xKl*)Z$%5HaJ z;9u0|5Q;Tmt}*l0HRPI}WZG+yF+0HAsAG*H7hl$>Hsu>iig8 z|6(k1D7-A^;uT!?yzt|E=#AH5N?mg1ddOky$lBLO3L8zx+IjAp6MvF!05KUkW(TQL zcne+kVoT)EtLom-w<=9;Yh7|?6>=E6u=Z(4^`O;Pd6K8=dKJ~kp)jf-UF4#mGhC_6 z)TLt1LJnhB7C0NJp_qR;y){Y4u4mU&*o%0aySYX;gxCf-^q%0Q8EorMa*i%Zb1rfi zOSv58A=MYNt1!Njy9kc{T3y#-K5{6`g~$b}bdS89H>m}>q|7?xFm_|T3z6!Q*AHK$ z>rpI54u#PqNoHQaB}Ejr*QH?YfE-4IMeT@Gk9k-Wly|r8r0Z4ej2wD*Yf;c$T&e7; zOT}D@9L6#hxEoUaYM0S@%0(L~M09>G&le#ouRKzVV_Zlo?#ZDOhi!ueV`s@SHxuC;}p z|Cn$T&rMVj2L+OFFmmry?nT4a-MkmP7d=^8l%*Yppgrh_dS_9BGbAGp4zub&L<(a!mF?s=X@?Q=@^qf6%pFge!JqdKuk|ZZiQ}=2U8*-(`#mWXTfbZ zYMB$5g5lf&;_N^~&q40;t3f^$nR1*dpN{~Y(dwo$`{IZT0`a{NxfMo#y$UwRLnfPG zvX{VnS7$~2uI#6yH!WF8ily9vU_G5Y+eDUQpE9TP?+m2iF634i>L^)vBsMbf zG!wrUG1}93khm`p*ZYyX{Pvm%$n;v7-a~NPo&MFHIhg5eJRFGWBgkF;Gq8Y*OnN1g zejE{c%-Ew9yT7K}xQ{KK2*mnH(zfw(@0+zKy+9`)8{ zAQN281YabAc0~{`1tR!zAc8gnnP3|ed<}jp@P(Zw#EI7fQG5fr6_&|(lwpR0Oma^q z`8GTcor%*%+P0$_+8D*AiUl{=JAtUbi`)uZ*?Unh#Y`5o7Yq6T@%q`zwRt{Fw#zI& z45Z{E>*6HH@x?EjHuvi;+Y4Z-7NJ9M7%F@ z`wC>JyN={ISJ+Dl+9Gnes#g=to~WXT=iBA~AY~rCP9#X=Ze_ST_*$ zO5`rT)ZHn`5{_aClMtxm!epDhm`+R%M0yHxD@>R2Xl|H$}@ZSk$GoyH_#@fW@f!J<=+~t35%h8aj9?Mj>hVyQV;*n%_ zuq7p`0@0m@+~wbR`BY@e$1&v@2+-Z`E!M=djm6ABoM$0-`QuszTx8P6GwE#*VVuji zY`g17WBt;+5wUF`F>{bxVcm(xov6rB7I^}TtVLvVNmDe2EvYbyGe3}w?U1|tSMe+h zndpg3bRm2XaYjUOl1Nz%(_@KLE1w3k2o~f0Ux{i`sa7i`7Q1ZVdV+mNyod`8P@v3T?6mpOKn#jYUWZ{8z-~y-H;la z`)ofq(tv$F>hR3w`fgtvXYx`+CyrPKYlWvZU;FILfsz#JHRv|z&^0Ys8>euwG*aGa z(e$cl%5p~A@g`UsM>l?EEV4XBgPT&pEZ2!7nqaLku#+hmWfD;>%Dd}OHdnyfIF$=0 zhSV^cIe;Bu?74mRSXm02IMK8Tr>->X_!n_lD?A%BMdA}Wp+K)ihn~3ytc}xHeiEq( z4u{M;(ahF(JsqhtGilFd;;-sXNu+c_i8QPgMr!g(LWM=E9_f`jq|H^ZHcsdAS&h`% zG+QD!DXF#*L%^6JfmbnFXhm=I^nh>*s7)u9*b~+YpJ1~Eq)cNkP1<|w&^GshwQ&X) z(Y{EHqj?&Uq%|#(h*^<1b$AvgTdmsU%t$OHm(PAWfyDl>Rv6yk@=@e)fDYjUbqJdW z!P+>JOXgst*3Og+c7lkcsay)j;-$)Sh)yhVD6BOqk5f1*G!E0GeYg&7^9WcQXK@i7 ziPQv4-pQQ?J`dlwrY9mXD^-uP+c5Osf(h3=k@6^=P~vD9XTjPymrLMmq$W+TTYu8zjTTtg_clHk zM~z_~>NIO+B8E+6tcGcARdM-bSbMVeIXWT5xv<_*_5G((pUrvYi8xV#a@oo(CSv2 zlSijr;-uirXS&=?a)pk2aV4x3#>`l8$;emvle=1noOunbjSE=&wMg}yvAW)Bq0TDq zktVGFclu!0>9`fw!&+f7PDZnP#2dWH+^9pwyb0FEg{<*rq{i^}?oM+^AMtA9n7%S2 zQr{%i>|1ogh+AQ;utFoN*_riOn!#=AWN+6YYu*8C<03ATJCRyD*BP%#RmE0C+ETTR z7$sbZeI6SMI^=ih#1ePITD?!DLE|1x+V|?vHt&PAaWNOs{YXuaxy`fiF!L;-2XsP- z2Vt$=r&4F}kRIuWbx50!z}mQk%jZ$bn`2hnXm`=GZ*%mvC*4_(=|mEb!&-ejM47}B zT9lvEp=>?{YvWQboTrf*hxP?GJ2pknp6-XP2M_2;W%Gi(iaUu{bx4@6!P>Z-b-j+% z=$ZyBKu0$MuU^@Av1v)n1d|^!Z|Fo3Z^ByP(1natB?50LQ+->9s`(DAjVri7-bJcE zjqza047R|Ir}5brucFT7eox1-cpugZvsAeZJYs%OiqMBTgv^g%ZCuGpKSpXeDaHN+ z_1JEeMnSO~!0bq>iKdM>ia*f_AU=h)`g@jN?9WsPey&5%`~ud-Ra^pJ+IhJIvc0?P z{IJ?&gO$u){I7H(iLYU;{w&BAg&&D;v?zb8L)rWe*2dLbINu}HrzS-`s_9r0i-O>j z)_>6PDt?5u!rBME3)}+! zN2Ds9_weGk;y@70l5wk4E`!qkZ;I>CC0@+gxgmCj|*@1jHB>O)VZBlq_wH$aD+IS|&yO{{$oQe&Ob#g&*wU3|WV zR0xB0;)o%zR-a~|NMWc3-C;U(&Ec>%ZsuYcfz+^hiE5l)fH~)QkKj+oQgMvb@h{eb zwfYmpC-f)^Q_=+`7CyW>mYxTi8H3k#Z z$*!$K)?5eH#;sf?6OkHS^dy;{XpJ>Yv+7nvTd;`S>0zy_6Gc?QTK&~hiNJcwRM*#` zYEFW+aT^!NWTXaVAF0zL@o82y4sgM?Cr&X;(eW)dfVIM;(adwBMA!{|Xie3jWo`s( z<93$3F;c_wW7lLJ7}(Dc|fVFW4%il83zx(UORyzL0 z*03%^zI*5@1$xtT=$X@DZQRN7tC7l8_~KWJ89KhjOjwsu;fur0@}V_bhn86bYvV4K zybV&rv$d`^9&2-^B<8(JZL1SN%z?G~po(AYxhe$b=@2w)VQt*aB`_bUwVj16ayKB( z$2HqawxnLcb~>@d0$8hmqtT#Ir%8LE4sCN0tc`oPh!#`c>_JENqC9DGINm9mBT@k^ z(TOCshqd~+lQM}Nv?%YWL)qL3*2cYDI6EVSv!F7kK;<(-7!8(QTD->zQbZDB*ur?mxqKG3kB+CUKEUh__ zWmZhOKN33LMGLIeN2^K(-ouw#QiqzEg0=A=3r{1}TZ*5qZ*n@$tvXJ{N?0qLV_}zP zs?sgqDla0db%>a4ur?lIb$cQ;Fc&TN2JL9vOUJd?8`cU-Yl<`$M%|}0seN@wnft-o zc$oF>j}%UZ%e3<|@@EPkpyOB^2y68ZZC)`CDn;mE9YW?Iur?lHrH3LlDjU__AV+%K zOZV+zIzhzYuvS=lTzHL3#6Lon=#e@^&7)v#Jj$hUG*US5GIQN==)0A~8p?t}l4EoN zh+|=`-b40_eVhux<8=s{C&1cxj7#7|q{d`fWS12$N=24qe}KFx&nM}G5huf1eXvN4 z!71uwPt_r7o(5~MeE9@{;*e)nBxj>)%g*xQT zi(qX$$z^phQtKC#RV`*G#bTJTU{8jOrlZ)VYfmdF71t#?5yhpj-a+{bl{T5n%93!o zjs)`xSQ}4qp>VV4=!j|uF~-@u7 z24^`eY>K7|wBMlPT-*q2^+gk<;@;#(>}DNe<}I)`o?+FuBGoS!Jt0q0yG_ThxE^X>w>a*7e#GwA zA!a@RYvVaq{UB1gH$M9m+JZX$kdAlpFs#dX<8urAh%dEAb*Pz-!PT~sU(A^)X6@rL)Lr-*2W85CeI?ZPImt;XTdT} z-m@C0XzZOT@@Bz{=X8RJ=V852<8heTeqDjb3%bN#)FE!Z1Z(3(E~S@|T02`xxn*Ru zGa#0CS7SQcN@ux%)5Uy6Czf~>*6O3s8Z=(hr2V=MZSxIS8!vGYy@}L1e2R8eJP~he zPPAhB8}0pwJu|ErEuoT^@4lrIOuP+i^@^m!;~ib%@9GdY--EUBGMCc(NDXr~i;_kh zoee(hN%2-ve4yiBdq|>XZNzvU~Rm{G&5v!&>7Oa88Hu3jK=$yc%9|{j?{>SP1vr#!Kse5ScI3dH_Ekd3Fj{OLnngx6V?hFmS;NIzQO-eqWHHC zMe`q68*gwS{12&N)UU{XUoQTx{;!UI(azMV13sY*IP;^o25iQw_H4{GVQsw0^4lXd za8Vp}puUNYnWhC2Qs=XSj%y)ctv)#K9krq~sg63NOcU0|TdcPeQiJnO@GfZdI_o$W zU0|*Lo>eMtS3hFibcmVVVQsw4s(TCFKDF+B zraBJJJ5R^%7Kvu(Y>n~dk(_{Rev6D;NJ^1qdLJ;oiE!J6--PHxjaaulewE1Px6gnJ zKRL8a@Ixjz34Z(8B}Xs+&Miy}*6^Sflgpzz1=;*QrnyjcCn1ymh)GXHgf4W(2Fnv0 zl}B}BWGkao<n3&F`hhrA*x@$b>&(!dt_C zXX(XERF%hb8nTsf8%dF6dY>}A8E`vLGQui>XdGW|u+JP7>df-U&O$c7$vfVKO1DTp z51IOBOnn;!;i^Dc>Y8v)rQH&2TOR8<$X0$;$fF<={+tQd!hc_>tf^gawt5%y%VWG9 zviZHNl`iKT2buC0OnD&!40ENNEA2()abJvVezV?Gxo649BEDo1J0Mbp{c?-}p&iR( zyA!hc9qaAFHWO8*^%c|F6)t<&gKN%&Is1)OEG>`UZph}>rFG#~7+xm&H509e@6L{; z!?B?}jux_&(S%8nWqRK*y(YLFEE!RiPPFp27|E1~mPdDYWb<3h;#s72K@~EQ>3_@g zn-QjyL*MQj#LHuwKsLXrbDnG|uuSedCYOZQJ~?u^R#~LVqnSpwGTK--3NqpEneZz3 zAMIvccrC>0@&vRYo8J_UlI5H$!$L~3pdVP!-iX&bCn(#}iG9lBzb~@+ePArfKg&R- z`y%ybZEL!vHUH4=gOGRo^72;tGBaE0RcNLCD)bYJ zI@A`G-8{M`?mEpy92P*-;Xy?CF_T68%%YA$#No8yOS&#pBc=I|DRFcFNyi|s(w$O# zjVpb4$%1}iLB}KB(3*HG8prdrndWL$rDwz&Xd9`_);Z#Y0CG-5UcZlK_Ko8rrz9&` z%&#ow6h!M@w)HJf~9Itn30Q#pPuTsP7Lcf5AO!zk@d?x&N+0jZS=Fo;D*j-qh z6@cy8$g4E6;lfrXAyfUGsh$VtJ!k|aa~sdYh;d4skH2nEx>>2lriM*3qsdf$gLDCM z`ZTHTIV%fEn0ry{v$x&){K0fDhWq|xIV~26ub6}C?QB1l#%O}L1pl~hY1TPwXVmCY zf4T)(Y@Tk>FDpgua&2nn706=z$-=Khs+%o5iI@DkbX&|4S7|#HS0js0&&XA8F6cEb zM6T5)VqS+V#$T-NdZY%By4+@SIU3>yZTI3vWbwJfa{=tCU|(0)@Hdqtce6G*^A=<= z{$}mBBGrp1fGP#z;}2Mx>K8wc^9%6|FF`#ks3&0 zx3#Pm%r>#NsiQl0K`VCB7WZiT7xyBI&pUrkTu!ii{QFANyI-50`2eyQ|6}Dw4I74 zk)@2rN(%av3z4U_iI~qIi_vZkJdW@*63+td#){q)=V04XtO}u>3GKaQ#B!P;L&stesnOOlb67JBHuqU}<=iYz|+OS;{)*^sXlk$7F3 zg!u-t7;CVuH<9WgT}HdD5O3kH6H0d|q&(tnnEU9G%qykePPlhmNxZ8?!h8?r#+t0_ zeWdzVH8>|1&>Ky*{~w8o5Acth`N_k##pZSIO9`Eg-(u0|K1ai}pwbYE3(YM0T=F zwlkCMD3P5a%%EgDg+z9WOtuS??JAMoKy(XAwtGlqH;~D8WwO2CeXuhhofbIM#ByveG3j*>q4UCIw0;E+mQJN7 ziHSiuuL}o0;|--bOKfDyy_xd*`IIM%NkJ)34v%u)gQX8s-Y}o?6frd@<&DClocDO? z%ak|Gr@VpKEGXs8!=s${km<*ix5}ryq1ZYo<*M)~Zz$L0{!F<#pYl{OBPivW;ZdF{ zQy##SYY?C>H_h~EGkea2*d{3XZQ;OY$1|U{BlF0}<0Z=&$TH?3RC{|Yw-&!fmwx|q z<`awgu=E-0a4ajyai>n^cF151;*blF>Lm4f>XZX7gyniF6f1M?5q=ScAI#wwBh|&8 zn-z)KbHc?EWdhs7(r3bPM!6gS6m}pALzu#jNOiLf>#SI#GeEMFGKrmGIYp@y3PSAS z5_VVBu;x-&8bevaZb*%*!}HzVtHM5|s;&*Ei!|d#prZ!!27e-|LBujx`s@IdDPYyu z^*TfwREe4vERA7Y8jVPGk_MBPtNIa5uvDwkIrpefQ3^kt!|#q%XKIU_lO9rHg>w8D zEZ0}6Op<>PXeI(9m_QtOc+ZqcE?6FR)f8|N9-9;+Fr=-GdV;_S`jl@ z%qSMKFQWC6#5mK#93}e&RI)$v`#iE$l}NN?8KYUoL0K8wB%(Mwks#d-|9*L-7;)sAsjzs>zRm+W;EM_c=IfmHURm&|)=_VqIHsaWT zYL7$y)}U=fS=8m?7{|qNBIxwYcSp7Jq<|_=WwJd-~SQTpVYX6oeW z0r{VS{66PlXz+JP$r2{8gtHN7LpKTjHSwH)8qY=kmH;)eEY@-%tj&dR0hn}k7K%`* z(n!>W0mWT}{5}IwB`;te8=3SvO!`tpz+o)tNjKP@>>Y|0MB>XWURXLanP|rJJv17Z z1ypl6^80-8Q&iJdf~G8UBFnrAq5Jb;bk$a>-oop1d^r}9u1JZi1M0d4`F+07mel3J zOBS*&3%MS#x^f1G{tW@?--!G{Dp?*InRF$Sz6B8~^UVC)g@p|OiunQMm-IPyN4rq@|V=92+sK85_TaIau##cpmk@JY-a|Q6m9*%ns<=I(SQDpSjI)89csZcJSCBu* z>%SsTS?Go=^mW8u=rk>JBk{JpcTM~9Wu6-gBgy3!_V<;>KhP#&R3x|Jhe~KV9n6dK z<*WwrM!-^e6Zwxb0$lh1LX}*GQ@IS^0n;UJ(WEB3>|%U3U@^Xj{3nK8j3EeRqaY#E{e^# zD1HT*Nd-lL#~xp9dV_OD!|9l?+Lp{As^YhRW$-)l2kFjeGnU0~&f@<9ixKD>P_M1% zUgln)_&cE1e~^EtAlKW6pe$_*me#H_-NPO^>R_kx$OyZp@w--7_Lsi906NnI*S^KRFB*m zhm54P)cuK3u-!;azO{BsqRv&2V0-#TDG>i#aiEs#3XeR=499! zGg;RZq)eKO>Rg)*)E$WpVe2!gBdaDCVQPNBjno608^hL^#mqNBsw4K2aENcJ?ni6} zTc6o5IpQ2(^Sp3dsE0GRgsm}~X>Wzp0BIhd(|_gKw6(flQ3YF{14kqo*@=Vs0jHIu zGhLmISq)pGhGot`s=G5wih8oW*!pZjBdbGWo{KZvEqIN3aB~~j8r!gz zZIS9y-4;j3q28%&bJTr_xv=$_NS76o7i3;h*jn|l=6u*1+p>i1km}DPz=fA(fx25! z2V0-5BeQC};w>yiW|2A>b1`gi^ zJ)K#%a}tRatu2naz11CxePHXe)poYsE{?RXJAwVw37GrC)~I7e2O!m1ZlVuVcO?#j zt?Kvz4#M;p*owZ(J_oAB6x7(ncYfT zCp+3sR(C5-fvsxG;1%!GQe;k3Cu5!tTVn}pJOe2lUugG7s?yXf1J+0cz3YPQLU5N`|tJ+Y=F)l0&dXaii^J3T< zJ23xCkm}{~WV%${qqq#Vsy#QCP?vj9xI&$Rc_nO(9a+>>q1VRTbqD z>RJy9*Qrx5uZOL%6N|b5sqTy7sYoMc5Hw`Q!){b}CvJkRYLi|V=VrIyx2OjoDF^%%0?GEJk`i8BLzf$62 zUO+2AF0@yG?81cawh6al;zrz_pd{`INci5MgmYYE!n-oz2jIVBO|^5*n0PQC+lP?f zYrI{hc$tVybtzMQ6wZ6pG&{4uc=Sg+7LfAe$nUkvUx{)7A({GaO#LYY8IajiiDtp& zAJp-5Knc$vzt?V2N)nvSo{EUcQX(wnc?26QNlCP(^VPf%P|b_Tzu4m~Qd3PKH(Ag! z7W4|@b;Kzj&aU&X24w#l@&~#DGDKvm^-T563{`tUpLi=E)whFFwTZ}78<^^Qa9%;j z*rUHA-Vez11LXHwNfUs+7ayo|c1m)qUb7}Kvnn34QBgR2ld_w&_s45-FL z{+%^1K%Sb+6n{^Kvbbgz*9B20`HI6#>-_#o*MMTXA-~sjJEcqKC$^BWEI!WSdxAwp zrjZrB0!r$Q{JPIu`TAve$V3xNv>$x;%NP{2!J>aa-UE=|YgxIxroJ|U(94RQQLGb?@vjnOrNA+W=m>7dAf|2BbO_`MoxyRjJ4Yd}QJ) znfNA%(PeIQwbhWhC&i`#S#O5?x;@dn0+z_glvgq3EfJuSdKO_uwT9S*>eYpUP)xiZA^JK0t}U{sQJ$C|I`H3unqEi zos^|=1xm7$MeWI==DLYOm6ZD9^8$*h4OvtkJ6Y6TENTHFcAcNZN}zOfrA0T2s0%1! zA@X}IjaRucd2D3Tdo$@Jh|qpvQxsE^0&?8}`Mo9qs&FL|GR1wE;?8i~m;SZ5=I;`a z^RCE0Kfr5_D=S&VzAPewNIls+TbIPLfCB1~Uw4p7Zu*ND$>jHA@{NenYq6DFh7U8% znT@_^6~^*_?3<83$UAc}C7J&IOn(K!49=^9Rm&19t?XoQ5rcu(H|M;3nQu~ge{;U# zH^apa8a1idMP=Tf@)?@f&``j&_E5k9EUN_}hm^=PS?m#9R}wCE{LgevmW3V2!dek? zR0&}<@deg$+C6+_aDA)b!fQ{MJPMwdzSMPNrn1a~SmvGx-LEE&wW2r*uOTm(*ekfQ zz2U-ZL$JJH-pbs`$zl#>G5e92xvjBulnz$R^Dp)fF6MyXV%*8eVh&+32P0a4cl*iW zkl<<#g^NYOZYmFUvYbO%&JhSV$~^;}fSJGw-ZX|m=Zkb+vDy##N-uh{pd(q(IfysbBM0?j>FYb6igs>rdFR1J zL$JE2MphPk6pOtO(Yxg@5)&8UZ(j4=@(Q<-CyY4VsEd(L?ZZ!AzRLXY=1tUHy4mh7 z9nCZ^gX=ER?4OjlyiAf;AfMWsPCiLFxJ>aFrg$|R_ktBZw9ey zRwl>Wkx%VCA)jL|v`p`Krgs|`eP9DH_j23<4NA|;+L zliv%-S59-EA6}+;3e$WUt~+7-ZtSg)rmaw4DU;%>$XCuip9?M1JC*6Z0k_@lhpyEa zjbp?RQ)I=PWpaEA`O0ZK3*yT}Ph+C*!gtraY0u)lGHJe#d|pTMmby#wqRS*tXObVm zb6^NMNLCi+ak?U(AfwlTils6-GdT)93i?n+n;Coeo-#pFOku!5|redPe3MmCKLSzz6Vuff2)PjW~&-Ikl;mM>dlC6 z@$X*UJ*s5RF$tB^t@>ze4%Wa}nMpI>A)nU(V2ON{-c-!{sGRS&%lRy(|0BZmoDr{2 z(4M<pLr@Bfg`Yl43%zAhYO!sjw!qbpk8%*a** z>z8e^Yv7ONRNys{&+DcuMYbTmO!Pb^D&V_+O+0QTvHMmkm0fUc6Rs$ea7X0x`odkB zuqzLl`1wq{Gh+0d8%Z}+)hAN9+pSBPl)EBdIk#I81DWgvOtuHS4|Vzzb}?rsy4oqb ztb3M8ychC$eO)S5)+O1$!YVxoiKd&Im1 zw}eXcXqe!RvubGAi&6?*{C>Brc9DvK$~axP;zl?c}pCr(?<%VKT0Pmb$_ zq-K5i@%qZ6rKXUfEaq|+GX>FlU?@F15MWoN4MNhgA^enc`{r~ySEi7lEaeK8vN3{n zv-_}-IL={Dt-|;0O+pf~Dg1cNV$G5DuVVT1WEoeoj4cpqINQ-$6K9Y0L>iwJxz>p- zL(;Vs{46V@r9m_0PjB+{}uJ*&#`(fuAs1w_=L&Rk?=c%t5%3wrw(kCt<2KP779&(FP0KpJzWG zi@71Gn+HE$A3AcCO!3Al#aI@5EsNa_(T5jzSE?EstcHaNTu7{N77Id>S_eO2+-p93 zWue!x(8Y*7u{dLGylNT7(6Rlf(^F32eJ^dlpo%3Ssooxb5+SrOI^^XdxSoq(ClKjX z9gAV4JCRK1p4&TzBy<<}3FAI3rYOs~f#vLma1*K%t;=G$X-`XezWO{`Ga0SNZJhb) zBO)QGTn0a0D{FM_S7qk1_#0Wg1s20I8`@>3-p!7r<|VS%H6{YSva|dAdxj)n zFZl6VbE9)Pn3zocHm1HWg7mUKbviF?iKM;uN$eMri2dOwjK;i}qAcfjmU9roZJB4A zs%uKL#u}zs3oLqE;TVck_7g3JytA)sEI%a<4oUhU@N<9>LemgTk6cc7a5)_gZo3Ba zOFPj|Z%w6f=9oPqkw|7fjiP(ID1}AYM}$<4N5anq|M%tSr&liLJGq>X0rwI7DZVqS_WdKXJQ5y8i@)Y7ve#7Q9uJ{f+z zP7*9faB14I?7La^X|nA6>ss5mC{Ewg8hEb4=^@EJBV^g7Y0I+jVcBPc!p3~HOXpv@ zFyU-gnf**7&Izd?&V`@7!f0VL6<$|}Tr~G`(Odvh8)l2f*?uVB@d7K|n#6Y7bSN5j z)2dH9<%2_MLn@bx;AeH1<)WiPE|mMYP%Z_dEx1r(ZQ1g$8tkW#%Ts!qMUQ8mO@-&l zWg!*LRj#F!n=@0~pD8M-t3xWOYvAYL|E#2RB*~@q z0GHPFpf^jYv}Q+ETCRrNbxDaELMpQx;pfQzXJzIuOfIg6h zc%9%^PPfLDtt|3k7I_~ckFm$-vv2P9fF{k%cRpg^tYy)U zu;_=uppTuswy`l~Nf-2ykTgCDKVG|l=v+`YlCq>nS<({-IC5qzvK*fsvah(AUIw4O ziV^uIL(=yY{DkrG!I!Zt_AwUwETRw3blt11n6(_U@s`fQA+$KQV1?y$zQuDPNqruE z!WhK#;VTP$oQ1xG*y9T`W_#6Ck)-cU;^mMOzXCriLbyRyiObTTVCk=e#DGE%izCS> z%~KO^ge3J%`0+Y%QRhDOA}ULJlBK0sC5~w{J!ucaYG&V0M%EJS1sfz)u)s z@2)ImQO~fbuMx4M-AXoCtHn1V>G&3Y!Wgt>Vlwq-nfeb1f^ECdz=OK;0j#bC6R0Dx z=$_7q+K(a0`3ZiOhSK(Vla(bt#}a=<;1Mh_D-IviaX)20e2L#elKDIQgfVdFM_88n zJWKrx!SVP`OOqsNrp~lT%F0bN{W~P3|G-Z;kMELvWuY&y(01ME%*)J{+S!o}yTTR? z6&kRe7QEt#HQ*alddEKkpRan>~CWKTTYr{|czbubp?s5UV$px@3czD*2n%r8dhD9kf`q{$7=}va% zQ&fgj9_zu+e_22LrO3te78lQC&>B<|M~jh_jxjW}CYf=hDIv+<0Dg7}r8;;~mF2z7 z@-{+Pv^HoC8?n7Hzswf&0Olpq(=48?oDv&{BzY6~*&`ImI`rjYc!!H&b5I#HH zMPgN{>=LE&K*skHfSWMwuR>6L}J<7Ud#%q z5N5+q81I}ud}X2Uv(Rl3dz6$hyB~j{*f}AIoeMvWpeW88Aq#+}uzxv@MeB)yIB6ULWgCDyX&Pg!&n4EkYIpbk$~8hpm= z;&eJ0U53|9v3p1=SHMpg_o6#ZS=MJPD~^!sXP<-I^Y!Ln8(WS>HN`{QF;3*6HiiI7Bm_rLQ(E8Zy5SKV8BzXtJ zPZ$%AO0tzje$65eL*xO4+4%KT93GOsBj6{D@B3avWoh5Aw4)KUs0qQ8ER3#*V?q*k zEd2ZzO^8ENmh~;mIsqa3^A%cJXGLOG1CJSq6GPH<68wa6zd5_zwH5G`g?-1uPDRWr z7FIAa;`QAp`%ay;7pH|(1gFDKD3fplOOi|LdoHcBKyN({*PgRR&km_<&Vip~7+r-- z^~hem(z9OWg7|?8;(TyfhYMn1QzSRAlFHVO8Z4|$FODYDt&y0xAf!UL5PrfKSk~Y! z7r>8P0GEJAUv@$-?wA{!`M7jxNK!9@pD^CwTv^JZeqvEqBH}>V9OuTY#QegHu&Y86 zb~XHX9V)5SugFwnD*imCvbdjF+;xaLIA2_5*Mf|^>qC-v1N?+BR#JkiEbtc=cr)Vm z<(D&Bc$a%UyCo!Px57^tRnnEEEb3Plbq692c6O$mk6jC}I|1#1=L|~N3y|*&N!nfT z6UJ35!BrOc8wq4>}B{_5Jr8rcL2-|P|8C7W+AU3)<8!H_T8&(%wIe&UJpsq8}JiGN5GS*Ebbo` z_co#qk+Se}mg{3myc3eXci|_D3ALrj$`b#_54VL&l0uQ8OnVCqgiX`nV(U#_VqCbSB???Cv zqv`NuDvMi##r=Y)6Em;0Ma_ou8eK4*1{qUM_+)xd{FQkpbB10h_2> zynQckCz}#~;a|(yKl^XwD`zEz7ZI6yd#3&`g7jOoaORZB#l+inFORr^d|symvx;PSR#e%n33|(Z*+?bwdji+k{?o%fHzJchwQIYAJOn(5v^dQOhJ0efn8dxUjLC80~j81eR0hwwi zraBbPdrePT7%@X7Z;8h2)h?67F#LTJg`jQq7~jBSWp~`;)mDpz#TfDWHZdI8z0UTP zn;7@(mBob2N9b&fNA0sQIy3pTT**%sqk@qi9WwdJGWjk{ejK87x988)HfFX$Pl@sP z!o0W2%$jd?XhRdaHa!QElU#XewRXn4v$peEL(6RpHyY8+~71a_M(x zNmCJUglkquj57~wqw*DPjI3U#OiDMbvLcC=ET{(y+6?jfv!GPLmD#*}9a|u)!UL+5 zjsi9^{hmyJYlImh(O(o_hTcs>b=27BT~|`rB{Z z_T*!H@}{MoHR+TUYZNof*DwoN%e)RAY-IYqnf^8ivu;s_?5iowj9Q#Ikg_o&YTNQf z%|TX$`Fm~`MvJ2?wGT_JMey~C+$>y`sIfO>$Kq=0WTW!d&@>?{Nw4Z+e)(dzLsqM- zM^U9FOIdDTmb(z)huSA1H{jf^IGrhql>ju|G~0kLDqq}UWK}q>!R<x*k_UOp%cTn3njUMlrzuUeCWK)<31{SjR zN<~((tRXCG6+(`LgPa~bC5i>DE>BP!vZ*ztg@Q`+k);e}DSIQ>s6r{3o=)D?*{3`) z`y!j#JyKGP3nN+1FqU%w!u7WwDELTSaIT&>usjI|A)CVJUSS3EU?I~U&a@9j2)ARd z4#VFS-umZ6_H46H(rhR^RI~7)DsebGDtr=9_vm)?)oaugylyuIBUs{52<&q7)zP6V zJO&;W=5XjJEIJNL5;&3t9*?-i$6=iiy1o*`RJrHx@}7bB?K@miOJF7Hx!47XKvIdV&?x?@@56$q?w z$=e8Uk{Jr-n*VFCY{$Fxq^>p@i&2m z-qBn)hh7r5z@x$pJB^A^ToT@AjmgC_fs5sKP;xu2>yFUH-wBW5-uEs?cuCcMZI*Zs z0&5)Mb#Lg(?}Nvc{;!TYmtFNhGWnXX!v*pn`1l^{^-$==@Gv}v+z$90^(EDYi7fsx zu*f^=>+#TqJ^_yk(}#7gckawA`HHT~qMk-XkK@0d30>Z^@Tf3hv^;s)eY#Sz&`K8i z0%8{)3HD;>3SWZ9aC=~OFEe|JnJjHRmi8)w=8g$_Ep$<@!=u9Jg2rVdQ8YLv%UPf0 zyoGRXM~A%~y0CZPG291B-t1lb#4}mqB$oI-0tY=#?1RvY<3o5nN@4#;oeRCv!cote zbG%#*W62x(=KX`R_Hx-x=Cb<)EdT2x#y$~FL3UAQ3^#m{n4Wbb0zzG%C!1akWDVHjkvu22YzLqWA<<8h1IS{yLJcuM}_6=@SI;}UPrXaCABe^)S4g{ z@Nl#Ca1rjejSldrau8J+?NE6Ko=GkBCR}nIK{A8`&&<$EuM<2T``^^Jywb}onTT30 zovy-j-Q>ErDVJbZ5Do1Rv~Ho7V|REw`Tw9C6%Iy|>f>fyn!P|boP*JNhhCI@;PHh2 zcSWguSejIhn{zq#2UnlN(guWHKm*}%_y45#>5MuTEEAA#$1Pa+5O7dDKy7H~1uzUA zlc5%X{XHo=Vq?!tp+)M>)Czla029RJg4mJ^VkEe@AF8%i=(Q^@EGnV2#B%IwUOn_Vmb2=uJl20wV_L#5047F$7t2o5{JV{&)nH8yABlm4~JVA zy7Wcx81C>cUtMWy8M;ZcD{SPeUc>UY2Myl?<8}yL{f_V$c9%n*G+lJ)oh*JE7QYKv zs2(D>Yv^UL6duDJ+ooZ+Xni!dxWaX8S}uxhxhR%_O!i>8`p~uhf5e@2fE(5K#oIzB zP2F9oKnrZ$fC5`zs4KQ zs0E|c<)i$C`SiA$Ep2revddYqET>-L9Kt%>czYcI#bf@T+biKuZ?ielW=A1IM`iAg zHr`0bKykI<<7bXBm2%FgKAxyI%3Nub-WS z%2zkZ_BTeB6q(<>3` z_V*S0>ySo~h5a5g-Ug3D(d-iq+1enZM4{dgi=`o+LN2+A{XK2m`7=;7yKm|?-_UcJ`^kK)oHx& zq28yJVs--QW8-&9uVW7B8S{X20t_I`Ew|meLf}Kv)uC6 z?JgC&n-D%@n!=-u{6^MS#?5{W#rmD5?9_Fu%f#w;2%fVT;rGV9{s2Y8`)`f{h1$`% zO3eO@=mrWD{$jjYeubjphvsE~7kNuG@oH4!_x0ftlotF0i8?M?_^0vq`U{E&nLP|R zEM%w+ul=QQHX|!Xg$(~S-Z1|`(d?}Q8AnAFX4FT_a%q%CZE&?KBB{jGxv|5b%5Iax7!zRYf`k}bAUUq`aB8b{>uMxw|5kGGc#1_Uaw}hhEbt=7o z@#h%61skZ$y!{*!(`}GJj>3p-joWPpMYF>>Yt;#TIETe(N5sxsEU}YuyPctEws$jX zA=-;q>0f5371Q02L5>27-HqGr0Y$^T8_ZTzQQLP{h|%7N?Y5|5ALA{t6%-9WMWH7>%4)>aW|tNzHY*h-57jJM6!P&E7CVAiI|C>p6x3Q=i_K}e=x^~G(Cx50K$G<$PO zYXf^qNUb2Ln~#b4!N?+`BI6L_W`{zth-zdGmhSA5f9jE<^qH?t%#A?QJXIP;8n-zL zie}GVw91AlU#Us?T+&K0JQnfuS8m+FxaS?AX!Z$s&9j`zWW9h}CAN1)3OTDe?qb~W zu23|4z0VPB4`uyv_mnb4IM+tZOko=T82jC-C5MYGcrAGOO`$5JU{-OGI`N5L>-iXo-3(--0QhsH5b+9t2$1kZ3wf6DiVP9-q#P|M_ zF|`IL$&;0CAk^HZI}~631SK=w=QTGfNAY8EP%_Vy3E|%na4d z942O#7ceu-s`g^0rk>0U)6E<%W@-zV8E&ocVkS~gW`^r#ju10-1psc zcsUvy*TYdJW%oZ?tQ?o$%5dv=FIG;dA1f(4|1o0ac>jTj(?n3ITyk5oW_h?Vx8y3%lX*29!_IMF41@VH`kAqvAUI$#ma36#>dv8f%wBu@ry!Uhgr9Kv2h1Bp6T*B)V>VM%t*Iz zideWCfqE(nGg00<{w0&-6_Ijsj~6HRV&fu84<|!rTu|mrOgD6@7z2mfJ8Duy$7!ZNLc}f0h!^x+dBAy}1KZhu7;#SK-@|LUhyqC;hz{W*X>dV{g$z1d{KU30v z86kRSq@DW0_fYEu}iVQQH5h8I(B)}yJE0d}^SdIu5J zg8RHMSNPCefk+@!5m1Ye{E79h7enu1W7nsM96-6!(tGF}G4mm!^~+lZ)JWiz)X(P^r`KJ{YlGi+SMCohV(mYSSy>^w2{C1Uo> zVk~~7QKmL|G4&NTc73GJpO|jwd@=Mb;`PX~U2@X2zVqVedu&|9$JC1Mq-0*YoeRXy zPY5?Subr}xK7>_={p`iyFW9(uBKW+4`uuPkQejdvVkP8=E|YXo=~DE)zqo5pO`2K1$t@)kT=q#*4AG*tm!~ z&_#DumIQT!my5v;h?}jJcSroZh-*T5&^J)HmUky87EvUuc*ShByf^ZG_^0ZA_!VNY zD*|V!<=xG=!|qTlq7R)o%&6t98N5;q_CnmuTHd{l`|AV6B5HX%@Rw1`TeEkS*z1R| ziJH&xTHgJQn;QVdA}S6#GM7@zTeEhxSR06-1#5W^GVXO-C>HUcs|&Aufj3(%Z_WHQ zV!i}fB>FX8%X_eKuS1|%Km8i7<*iw}R;&$2&}_B5M;Ny^5{hPL)hxBVHH+7Y#W4t6 zL@n>J#vShf#UctTI32usYk6x8aJ@9ZIOI{VmiNxa?e79bv-@sl1?%`XN8+`-HS;%! z`SHlYSuO7g##>?{6pMIn(7`~+Y>7OzytQVzQJQ56Qp#4#d#Z8sWl%J`-)E`ity#QD zEKWmU2erJX8+Sefibd4&cGB%d*YegH^TMX6jZkwHG4hsO7!4aeMnfv5436+}TUqPKo+8qqm9C z{SZ67mUp>vhfAPn_6$s&WhQHRYu0WTYXJmJ*79Cz+|)8C7P0p0pxbDQD-C*2-63}N zN4RXYyq6m{Rt-h72bPq#qm3NiB0fLpr19e456xN2 zTeE+U*gphm6kE&tP~(ko7!-?mZP`U5#P510K3J1lepsKR@0F%lt2agJ?`PEVKGJwo z993^kk>85m6!%F}9E)V!*YZBjc;g%o#bRoCyBH|>TPI5`Z*4ESU)t*=l7#!Q_I^;V>znjt+mtx(o&}*Ighox&oJI%XF{=NETtN?I+ZG>61CQH4@%3O zgCq^q@;=vi>zxP1Vm?dewe{k!t`}F!TWi6Gqy;ZTqQ+`@Uu3);FNR_<;I)x3Mdv+%iB;>7G29*YsW{V9j`{N1!{R;W4wW`g<=s;i@0c? z?6tf#uV-DeR#rIz<|#vMKnMYA^=;vKBMYOa}jT1>r!hktQ>0d26Ph5!36DL5^D9uN$}f1{BTSU5WRpdQqljmE8i3PrQayVASbM+teL!K;wCC&PmDn*A5V{ufB2U@h-2jl16jMboDo`D=M= z=3f-^-yn-(Yk7ZbybZpCqS>`=E>#v$%Uf%Tm!v6vL^6q5-ai@l`ZE-Zct6d-jvlXJ ztPkp!#msMrX0n#|@5bBX4=5H>%iDQ_B);3|zIM6Zrmskw{*8>K6106#wEi*PESsTN z#A|WRTP5=_{;C*j&<^J-Su0{&4e?LY3cvJSd^%PmD4IQA$(p&|gRhCv#)vIF7_a4R z88_&IV!iZW{A21HlP>_Q7h_Ek(`_y9X2x5fITVZe3U%?L2DNbIjr7C=KkAi~oVB;r zQjb*STHe|)d0Q;^MFLK1dG|Bk4E>>4L@jSe&ETk(x7IZ8NYiYCr1I7B z9%#H720_v6XvkB`TeJMGSl%89c&g=HV!TZTL$R1z-VVlwms;LhtGy?!HVi2itmQr2 zc*~4{qSAXk<}TE$=bL8(=IHi>T%8Xk^5y!j-B4a@O+J z8sP(Jgq@H{-df({jGNyXie?v*lf9p}=RXwFrN|&xE${Kh{Z4>l5#FSJ5~I5#cHvsy(~Ntb4n?!8t=Z~Wr_}P+ z?0+owXCaLuYkAK$-Uf4^X!ePQY;BNP%Uf%RPoyE{BbQvYycZaEz7UFL_w5|Dyfv#E z#p<32?!1=wUd9_?ZzvW~%iF;Om$+&!wwAZnJfBMQEJj)xMRMb{y!SKS2<1>TI}+kE zUV1HW&FW`jwGzRz*YXY+H@XyxW*_58H=2Ie`*X1wMChEgy!SWmbU74@_{fjbaUCs9 zbg9(x*821dF&jek0=2xu#x2)E(d@%{>75(@c&z=nihj!Sr5KMQhupQiW5zw#LDB5< zDe0c&mcMRylh|F2@EOxoyq5PG<7N+lV*O52@mk*6kp4=n9*p2QYk41H-0PuGG`#=j zsO7Dh{aVZ(f#?Qmd9O9zEJs4o@I&)5z>B;^n0PfR@%#Fo@r|_LF-X*LE$?HEx7Tq{ zETWdTlf!_+THf05`c@j}L}cZtmiI}<8|Gvvn!R-(> z&w!%Yt6j05QiWXKHNF?4XCro=THfavH+wD=izqkeVkgL~<*oJX4`TQN#LrvH`$FTE zFM^`kbt=7o@#mCU-kRwj#q_1fAV)3l%Z%H-9ExU#vkZpvCDnn%Ij=sPe-fitA$Hzc z-d7v9dkqxL_HMpf-dgYeET*qV203bZ-(cMCjZie)yTNR=yfvf0h|yaR+iflHTaCBG zZBR7)6ovL&q?20ST3h`pZFMKIE4G&RUB=tyZYY|4a4>7rWY+T5n&LNUiu;gE!CKz; z8*hULplJ5yl-36JdUjeZZ_WJgV*X)dkx|S05#webg<=sO!k3x6@W)z9(rbBZ=Kc_K zk0WZHTHa3>xA`O#&7Qqzb*)prQj_w9nm@(xGl-wRmiM#9JwFFUvroWlp5;s?>jm6j zV*5p;kh7NeOU50)3`Mio`~0d>wp!lWp#EFTzJ};}E${Wl{k;ywB0kFPU}vR2drHzz z%l;8dZy{j*THbFPH~9_}%??|dl<$wnztgA|=+fU@*etf+M+$jrd4FKs^M_D0J3aAH zyX>{RwW0g382%XXoz?RG#CRKQgreDRayqKztu@Pk(k!1NrG9Gn4@9{lF}JR^HXOlQ zKzKka6bvmZjRfWf%BusF)))BAAw@jS9gEae#Ofje4#}wXCAKQ&HLR4aN{UIyzljes zf2F==-e61o5r4A2W|F&y!mC0Y9f?;)dB(ap5PYgtYD=~5KJLfZFRRLAjB9Ym|a3DG(jOhjc5R4^uf#mDlR)h9# z{Wipwhc|R(*rWr!of=C!ZHe3_IfxQ(py;HfOEFaiR|dwHM+0hBv>Ll^APZX_P~Yv7 zJ9E8ZENK`&-7F}tt_$RBox~_f`3vm{{EsHq)N(rZSsS-Dd>b8AiyCqU+S6Urh z7ODw^VhgK+vB2Eg@``}f3jZ)JM<30P1*@Yas0vXVj$#9x`_$lo9gARZ!wwe3uBHyT ztsybnlSE0D%>2J{_y0}p{!PS2JA`UBK7zz2MJviNTebI|eg{aDc}ri*NKe}@X?I45 z?h~rR(Liaa($2heDNcA2wyiGSeRPFHu6MbL>q(pjMr3K+MirwoII2h6^7iKQt9c2nu(#U5D%pyxC$!+z6|F9R$uQ{`axorw{e!4m~NuEnAjST+E1#f zjjfqmw?yA-t!=#97zl|u-fUz`O*hg)jBJNkZ6<{(({`5ay}KxZM6QC(MUJbCymSjK z#llboY9YTmAzU2}S;M@iKO7Rd>Ki*uU*)8y-bzv*m701@O}RDNd+K9MrjDHS)LTpH zJ0eKOWUJ%XF!8DbUewyjyN7X*$n}1_BM?A^o^NaVWOci0hW+37vePVDT4aBX2HswN~}IjJMRwYzsG(;(sT z=#ZJ1Zlb-In2AX3@Vn~07IhX?X}g%^-NkH3csv!%l9_I!gV>mdP($>CTfz@-jVnjd zvQS#DTJyboTmXq&pPwso%sEY4Z-9={0E>`Ew{)dh;b?4WaP_>v>X@~scdvUvVv)Cl zeVz<;Tb;z#z6jYhW1~nwTrKwQYClNi`m~tK9-Ng(P&d_COjRIaV|(hZ^qzkJ5)-`j zO2(AkMN+MTc+axX%JS-9<&3(TC4q?D8D*j5)k@I2hy5Xu>n3TDeULv%y&t-Yxf(>p zE8SVl*_{*eZY&H5kAo|Bg1V`0Vk&}&cxgMs6eof4fu-R{U}A7tFoxMM*@IEj>|5)ti92>(i)3j!&1_>&?+yn&Skd(?$eW z1|ngk$qDcR?`AH9gvTM3 zk(X|vpIEqr7I3y6Oto;ScMF$!w~&#SZlS+exDtW7&c(irp;d*?R#sp|n=|*^z%t%s zu&(m%4Um}b?Z}#zm7f0AlK#yI(@gJ#TfC=! zDx#xXR+x-ciE;Up(ne&B>Mu?TgS&hGTj&5 zr~48%bvYQ))6f$xk%V7`zMt!4Gb5FOi1ix&Iyi6Z%!>p9^CIOqb&X=Yt6SddvC&wE z8cNx)I$e6%{G|-(d&zph{1o7txz~YebJvraIK?LzS(FzC=HwKQVyVn%IUI z2>1?_K%62R1{y?xqeQ?(*KW%+wj;Ku)CnTR|2xd3gerrHA;eJXohEuNybYtkIU?Yq z7lt#95yVJh6fv3@LyRSMAa(?N7fB!&v*=D#8At3)>_Y5HloI2K3B*KV65zW+qVfL@ z+j%lorVvw!GU{C?dX1gy?M9W|iD|@iVg}&5#e?Wfs>~v06LW~UfbT95ZR9-Dc~qHC zl?Oz{#gJb>m4(C}lv*cJE{@KNsIn)q7qK_753w(?81OwU^1Yq=-H$5e#1f){s3Zc! zQeqiVMFffciRDB!QA31?Fi}gaARx>ULL3VCUKDRG z`tmTU98Q(>qT-@2kD$t0;z&xpBT{&-+39X|6jhEUjvY!6RlfG1aw%0V zqsot>;$ptPoC3d#fQ!L!1=F~axQbGnMaspDel=CDA+9B^Bd#ZIAZ{dXB5o#b0eo9< z=A~;FGw`icxsAA;xP!P8@cBj5g@wDQayM}gaW8QnaX;|@@gVUK@i5?PCDFP#AEJ*? z8J|I3MHUPeE5~I2E7#~sPW8xEHBk?Km8Sy#s1@R@ZiTH~6 z8u0azxGsjkH&pqS_>TCV_<{J5_=)(L_=Wft@NF&8xbHY@$=|5*JMjncC-t@$J^tUJ z-d|MtoA`&=O#BP@hIWtcbR8p6QlUX-rszk7z>piKav|qB+rm zXi2mpS`%%EwnRIkJ>c6#5^^z>cA&r{4+0%2u)7HG{|-B^6Mb|hx)5E7Zh&vLh`O-V zodOF*z{L@w2h-?D^rF;0BIV-9*_$eTs8S&+E-q2FqDo()AJLx}Kx|EHLkuJa0luIF zaxoQbOO@@2?THd%FfoJ}N(>{06C(g$SfaV;sF4(?69E@<$tb2VnixZjrQU&}=c2cE zpvsO^Ib2j+WVI7j#t}OcyHM{K(R0yEyHemJ5pZ!}DPF z-HB;{?+l6SqB*BiWd>Ew6BQSG<4mf|B4$(S5|MIoAvT99bBTGxd}0Bykk|w8UFAW3 z5moji_9FHs_96Bq76ZN;MBc^u{eDy_CzcQuL?sabe7A|Ri*{K`m1RT~5hV5}mJ`*0 z?;eqN(StQq2@zpRJtR^t+Mt#yD~JdYC1OM!;Coz@T_m}ZDyxXqlzLXATucCKsB!>t zAaM}&UKTwU`_aKvIfN>2h>DA8+RTnvU2sB$845~Y3?DHkL5WU8D(oJyQVoKBnp`2G}S7sKLAs+>iY z|3t+_erHqV9O7K!JmP%f0>IapiX3b%^1F~K7g42|sJQ5gi>Y!6aVe$Rh?I+jE~Coj zROuutF81y#sB$H76>&B7dWhbx&d-6bp~|(yb;R|=4aAMaO~lQ_EyS(FZN%-w9mJi) zUBunQJ;c4leZ>951H^;GL&U?xBgCV`I^r?napDQ$N#ZHuY2q2;S>ie3dEy1)MdBsm zW#Sd$RpK>bJ@Gp62Jt5G7V$Rm4)HGW9`Qc$0r4TRf%u5{nD~U)NPJ3sMtlzV`byis z?!4{4pvsrTCgLmNYvLQ?TjD$7d*TP;N8%^qXW|#)SK>F~cj6D?PvS4)Z{iEG$t&HY)L{p*}(VS>Ov?N*)t%){7TcRD&p6EbyBsvkDi7rG} zq8rhj=t1-(dJ(;eKEzf;U!ot;pBO-FO>9F9BnA=N65A2m6D7o8VhAym7)A^yMi3*3 zQN(Cs3^A72f!LAQi5N%hOzcAJN|X}gi3!9+ViGZ#m_ke?%81>F-HB<$bYccElbA)! zCgu=xiFw3)Vga#`*n?O^>`ClJ>`m-L>`N>r_9M!PB}4^LNd$VoI;#RoJO2ZoI#vPoJE{XoI{*ToJX8bTtHk%Ttr+Tti$-Tt{3_+(6t&+(g_=+(O(++(z6^+(Fz)+(q0?+(X<;+(+CG_y)@S z(%Sj_@&HvHBpxCjCLSRkCDsv-5swp35Kj_M5l<7(5YH0N0lvW=a(SLAFAy&hFA*;j zuMn>iuMz8s*NHcXH;K21w~2R%cLCo>$pz0-I9>O7k1FpI9}piB8;FmHkBLu+jl`$K zXT;~k7sQvuCgLmNYvLQ?TjD#wx1;38lOu=gQr}bM2jWNKC*o(oS1O_|&SZX}%CE$4 zl$s(^E>47hr^+A1pTu9p-^4$}X5wGsKfpI#0=a022A!eOkZ43~L2L>5=8C9`hGF-HB<$ zbYccElbA)!Cgu=xiFtr;xtJN?e9+9N$^v2`u?Mk;*pt|c*qhjg*q2yL>_?OnONa`h zk_Zq>iDg6;5hV5}mJ`)P4G|*3L@lv`h!9aCM${22iB-gEVhwQs;9DWiT`cq*NR@+# zgNZ|kLy5zP!vWtak>~#%PMb$iWi4?eaTIYhaSY&F#DsY*>0-(_mMX^)$5U#tNZ~I| zlRSYcClV(SCljX-rxK?TrxRxoXA)--XA|cT=Mv`;=MxtY7ZMi{7ZaBdmlBr|mjk|l z;(DJxKA_5d zqT*sGe@K-L#7C5RM5J8w<;PU{gxE-YO1&pVudVah`!lM1PJBUpNo*p%BEBZRA-*NP zBfckoAbuo%B7P=*A$}!(1ANa*RxWnf->LEk@h9;Y@i*XmRYYCvVE<5MGx0C+AJG60 z-S`^+Y#FnCB$H22r-lx2KX9sK&k=byw8VI zWdt#j7)3pw=(*^b(Nq~jj3ss;b_9GaMAXHUwi8vx5jzvRP_LZ_y*Hf6R9$Zm`qF|rV?euZp7}yG-5h2gP2LoB4!hFh`Gc(Vm`5eSV-(aEF$(K_9FHs z_96Bq78Cms<-`)A0`T<`Z!Sh+B~=2%QeqiVMFffciRDB!;Op-pPz_Z=M3|^0RuB;) zO2mjdz_+agaxqV?q`*)S;Qt+7bgg0j5wS) zf>=u&NgPESO&miUOB_cWPnh;$iCT ziuMz8s z*NHcXHv!)=$TSUr5i#MjgT_WJZk;OE8RCz#DT#T?LRPhr{ ziDpD|q6N{CXhpOJeCs5TiwoH{RB21JBia)kh>n2oX%EVssM49}LUbj%5#0gbi=yn} zNY{fZJ&9gKZ|bcVJr`Zphbmi92BX%dI5z~no#7w~VyQJo#C1+7(HZg}% zn>|R)rOG^FKBczc(B#DCVxTXe%0jC6Ma9Lb?jBTGMC?iIMeI%NL+nc|CiWxBi6uk@ zQAq>ghf85foiF;f`|}N zB1Y5^D~VOaYGMs>0C6C35OFYZ2yrNJ7;!jp1hJMlk~oSunm7jV^^u%i9O#dw%5lW; z#0kWSfbTjHb#X>^5>-wnP9aVuP9shy&H#M3h`fuX=QF8t7I8Ll4skAV9&tW#0dXO5 z5pgkb32`ZL8F4vr1#u;D72vx|vT|{tx|%B25Z4mdQSSlKH&yN-?j`Oc?k64~9wZ(j9wr_k9wpWh zj}ea(PY_QMPZ3WO&k)ZN&k@fPFAy&hFA*;juMn>iuMz8s*NHcXH;K21w~2R%cZv6i z_lXaP4~Y%LN5sd(C&WhLQ{pq?bK(o)OJWo874bFk4e>4U9q~Q!1MwsA6Y(?g3-K%Q z8}U2w2k|HI7x6do53!l}m-vrp&<$uvG$OVjwj>%87U3hB5PqU5;CoRzd7Sf3Zbp^n zL<^!N(TZqIv?1CO?TGe72cjdJyHIAUjF7h+eUlo(G; zASM!%h{?nhz_(r+8-H;+3rwX-8L=C&J28!zPRt-?60?Ze#2jKSF^`x}EFcyVdk~9= zJ&C=Dy@`E@eTl`yendI31n|8h7F;~CR6&(WB0wx9mJwA%kl3GCPE->$M2H9zwZsY{ zLPUueQAeyKRuQX-HN*kLfy6 zi6@9BiKmFCiD!ssiRXyti5G|$iI<3%iC2hMiPwnr#OuTx#GAxh#M{I>#Jj|M#QVet z#D~NN;v?c?;uB&c@hR~c@j3AY@g=c|_=@TCV_<{J5_=)(L_=WhD_>K6T z_=EV9_>1_P_=ng`{7d{tG{DZ`Z%8yEwjj178WR@bBbpF?qAAggXil^sS`w{@)_^Z4 zgTcirb{nd+CE5|~i4H_Zq7%`X=t6WQx)I%p9z;)~7tx#OLu^I#CHeur8p+Sab$oxS z3?Q~9wjl-*gNSX3?Eqg?Vw5}IA-1PV2{D)$LJTE_5yOcQ#7JTkF`5`dj3ss;b|iKp z#t}OcyAZn)rNnq*0x^-8L`){85L1aVVmD%UVj3}>m_f`WW)ZWAImBFI9xWgD&IicJR5^t>l{k$!oj8LylQ@ewn>dF!mpG3&pSXay5b$-CH1HJ>rzc()QRQOd z65>+gGU9UL3gSxQD&lJ58sb{wI^ufb2I5BICgNt|7UEXoHo(_gl60}d-cFS}h&ze9 zh`Whh=++sh)0Qa#AC$c#1q7m#8ZH8I|8 zJ|I3MHV_{X9}}Mt8;MVe&xp^7FNiORO~hBk*Tgr(x5RhE_rwpxkHk;J&wy`?_;oRI zexb^*#Bap!#2>_;#9zeUfNy7s;o=PHAF6Do%0y9damM{GRsJIy;NrvIkZ43~L2OAh zCM?27G$H&%Q=%E*+f6c<>3nQ7r%DT=CDDp#O|&7}677igLD#E!&H#5iJSVi#gpqLdgL#3y6ip9>gMIPrx@zx)I~S>0GiGRrV(KA@(H}6Z;Y6#1f){s3Zc!QeqiVMFffc ziRDB!QA31?Fi}gaARuop^(IlX#1Gn|OzKmw1nOpZI|I zkk~+cM0`wqLTn^HB|alQC%z!QBsLLW5nmJE0KSm4#&GAY@hw%pBfckoAbuo%B7P=* zA$}!(BYr3TApRu&BK{`+AvP2L68{kmdIAlJM#L7xmPBL1B78&>!cR0Mni0*37DP*; z715e#L$oE@5$%Z%L`R|%(V6H%bS1hG-H9GVPofv#i%HYDxCPsrDt(Bph`vNWqCYW! z*qYde7)T5vwk5VBwkJx6!Nd?^C@~E19U!Uk{|@)4;Zzwxj3h=8qlq!ZSYiiaM`9;p z9N;@lLb^Dd>`awih+TmJ-W| zDk4biPb?>@i5enAgo#>W1rZ^lM2x5-RuZd-)x;X&0OCO6AmU)+5aLkcFye6H2x2X9 zBykjRG;s`ZEO8uhJaGbXB5@LNGI0uVDsdWdI&lVZCUF*VHgOJdE^!`lK5+qYA#o9L zF>wiTDRCKbIdKJXC2xom$;9(pLl?Hka&oAn0SPElvqbRMm!GqE|%afmgSzH%9F%X z#M8tx#IwY6#Ph@p#EZmB#LL7h#H++>#Cqa&;tk?W;w`{;rR3-0&hpz-d53tHc#nG5 zi=K<;6yB%G2gHZO2I3>)W8xEHBk?Km8Sy#s1@R@ZiTH~6n)rtJmiUhNp7??Ik@$)D z8SvdIIlEXD`h_aL62B3@6MqnY5`PhY6aNsKiGPXzhz5Aj-rtaD1o-ZjG+f*(--0Sz z5{-d|s@w}^Ld(M6noXz*R4gAKT(%5_b$s~2=p5B(Ca6kKC8a1KvnCphmXt0DP6*f3 zmPc4YE*gtkO|WsU632x$F43~^565Wpj{urBR7Gi+YBPwpP`@;3MO}GyFt)~O?j_k4 z*f>`?sN#~9JoI!``5dO(8uD#ax@DmXwo)vJ3g=cEFDbXh#<^;`6_>J}i=MVB_`|e2 zAVlwsv{|Alvb4N{B?Cjt0#-*aE;?c3T;&0syGTn-H>C;~(NtGN?50dj55%g%l@r3D zXe?4548`Jpx_R-_9UISexy#t2K6_TW6;+0bR(c^=7iDGMnpzYGO*7Kli;+Iqc(x}a z*>citu#gl_^{jpf)ib9J)R+qlv-*4SG5{OrDjitdAj{@OC8irvg{^34AmX(|cT}QC zUKkT(X{gc~grDtPWP45wEDfS4SD+N-p_heNiPN4^w}nQo3Y6(Sa%hyKrsW^Y$#n-c zxvG*}OuqzSI%>Z+X?1NRfK z%g!*}jw+KzJ7aR%8E%a=U}uN=vNK$_qYA#!&Nzf?p$)c~5o>1yE_Q*&G;?EYW<*b3 z6{=(M;}OM&(%;j<;aY2gfwU(=BUk0bV)yWPK6=8cs2&rZ0{ymgR|R7gRSSc$swv@E znA4aw)j;lL&?xqZk!yC!Oij0;$^z2HG=%Dq`nympud9w((+xP80gZVc2T#`QbTg{F zAUy8kIHc0@gwU zS?>XjsUF)sk&&LXDgw#2-U|^>TsayWU$<=R$l+tHz43!xiwrq8P*Wa?1uLcomsM5c zzZeQ<+Xv=-pi=B?lT)Qc%getDkITENjG#l=l3k3DxD%D9YwmqhvSFFsyPT zE|x&0*yD137wHM=c2pTo+6f?BS7oOz8VlDwWW=dm!p==Mp^Dbh#2Q3W z6GFzmbAS;i2SUZngpi(~Zby~hrJX|%uA}M`Rhzi9I#?dvJ+Nj~I8tdHYQ)fCP+4fE zYcf*QEvaI{w6qoh)i9eJ3{+RfhuM)vyc`7;Gs8^FO*f&6A=AXMh@^&@`bB-uKhB7g zLyh&Zkjv?kvrQa;|r0xyK{}WI}a+047tlp zQn#hbi__MH2-%Xh;tPPd7O*ZdV&-C~%rs&qnVN1v6-TFq%MhqT(t_SCmm6_%1yqV% z$jg6@U^~$=)D5XZ?=*BZ;&n+HN}nmNF=FaksO)L5d(yJhjj7`GGQKny1z*2_jbz5Tr$?7&6i_NzY zy1Ct(kqO~y9IW0kV(DF|6non+{}jKV+)hkS-;(q{Kp1siF26ND8i=SHr@X`Pp%E(^ zpkn5{JX?~wEuYx>1R>So7h43&@z_TE@Vn87p--V==J1=Eo^GXySos3M)ZtftS3mrI zX~fSasF*qYX30@End5(sz(4u%usvj9NIh6Z6mHlKw2Uq~BDM|4~aGGlTV$ndE;qnmiKIlW!);|Ar{7 zRm<1K!ZM9pznih}2V@GICluZOT6(&X=3?Y;#OgLN9Ei>c$EKI#-sl7(5algWPGHtQ z_=O!EjVYzTZP`9iYcm82EIg*UNfju`lbwG)2i5{Luv&1aH@O+Qzh_cZ5aOE1SnO7IhAy8lyHGg;H z%uTn`TI{q!xL%mq=0|ZC)SgUBt81&umjrN!w7l9L_O0F!S6>VfSFJVTSVBV=nCJBOaRlI!IzIe%|#*RY*< z?}NW}6z_BDLiT=Shu+Fv1gkH$EAZ$?Ui)cj^vjcCe|IVR2VlE~?WGa6#^1K2XKNe$ zslZd%dg|(t(Xyq96^gQ`T1-<1+<}nVt@xQIkCZxv^DpKxc0YBD?I4M7hZyRHI8Go# zYih!EQF~R{+TNUx5=a%e;3=|6>{HRyOm$lw#nw=SR43Ha%4?QXmRrNjxfu?r0{1MP zxUmz|O>`0yqY%lj&Jone8jZgexCN3DI2>AumDWVR$|DlmQC9Q%(Cv2-`@15I zmbfs~uUkv&!|!;A7Ff`8JYGst6W0xP6@!xy*PaU}<4*;i7tfYKbRHk*j6W|v1sVlj z!6~F+&wk4}6sy%x>?W!12646QjdKX>D;SMQxBRl0!H7_KX$8&zziC+J`Ugt%P~uvZeO!us@_+45{SHKnW@Pge>ujkAD^SkJW1b z*hQ&vz@U1FN$vidrFa=E9JwblyR^%;ip6H``atMi5<129s)*1S%^7m2+cw zbe69_Sy6KyV~{HFU{<#MD3`~KTy<;x#M&wZ^>F~<xjInZ!^GMb{Hy2F1k54MM>gYCAG z>iLOOFTkG)JaLm{TE&Z~)xnBj3`ckztobMYUmd{8d9%^Ba3QpvAAgF{wymwDwIh|a z?Znz82&!&kPg)&}^1Y?_O4X(HX!J5@2OST%;*F+S@oToX7u#1N1$ErQNv{%)1yj4k zx~d)<;A&_`>#+fHnbMo0M4I9{B%@}^(nzFyjdeZ#I^J<^I6nxKS5(al;}7;|z5zN8 z?ww(NGPFB?7fhZp>AfVn7J3xRBuefTtXZ78M1Ld zbWHU|JU89IFfs5D;@HQehw&%p$0Qz(!aS(p#3O1w0uATKq!bN%;y#5V|5P>dhfAuD zLA>L1yx1JXktA_F6fFytEwvuUzd66E#f5BGKTS~{o`BTej`xFXQYG1w^`Av^XDf3f z#N5+}s`d)p0!v;}SkIXA^(>?uJa-YFp0fI4XQ$+;TN){rUO>Q>>Q@sN_STE${JaDy z=R10CKZzuDGo!@JtB9svCz=>ss+O~~HIBJ7L+U)3#-tkKu#KQ?FY6G%B<0?Tbr-5kl5v~G3>G5Z;! ztBXNdf6!XT`rMq$FCgXoVla_f<%^UMKoFxbYr;qx~%<)5?mL>zwTuHYQ)NKP;qxIp*4uIk|R&u+|FX|PefHOkK-5~ zjp0d0&DUQ>eEkg-cjpqBzS2|FE$t$f{zX9b@_2kQP`8r)GvcK|AGdo;x)&`s-Nde9 zVhcpF?<8U11uADotS#{q?>kIms5oEw&bGtMh$p6}Un=Q0K^Qe-%?PUlsozNQO`+oa zMp)M5Ra$!L<0bVL2%=tI#X3QjouZ`?C#|4T;N{iAv!B}8vu3Fqn;^#8YR2TVo17}} zenu1@!)a&4SbLMkGPBf;O%!9D5K})qb~fUq3slSuw)jC&JGM-c)Vm`{3m#kW0$Z?B z%~U;%WZx4i&esI8?J9}P^tPWY2Kpe5y(X{~{^VkwkDsZ{3(E>-*45v>5O;BKEJ|GM zM*hoq2I9+|U(OZpHO-A~eX3aB7D=e{0$Gw|c8hlUCaWDfXI++h^5*X@Ql2>ST*ccjI;IUF)}*N+G|d{#vPkJH1(^OS4Qw zO5L;#W$4I`WlgHzCYcO*7gJ2J`&AxidUMQ><|sot+vnMcd$D~NR&JtOyVY+4?GE{4 z>T%a{WL9spnbKx6kfD8p49gLT`yAFx{Mf-;PVx17`yqY4R+pUBu-qa~li4dSvmm|9 z@qSc{v^o!CPLl-}-a97}5nk#Fpg>ylAKK zYd&oN&lQtP5Lw-7SQrV1mSNvhPXbodpVdl8FRi~_R=1(|>O3*L4Dr?Kd~#Yz?BZ6H zN8br0b&?lflC`I*Af%nYeUt3s+|r4u%KpB8;urmQaKgG%O<42Ael^n22X#&TISxVE z%b-pe$!JXFI6kN~lMBS;3Pf%eZ@TJm#d0fxA2?rtfI?;Yym00lWSH-xRur1fSIzQj zmS{Qq?_=-XuX=Bx7+Z;$t?ge*4qt0kJ-Ay9%>ti%%RVFJZn3z#Wa7HTJ;dUH2;2!% zv;8?wz7}WuT_nC(ZLe;o1wC@R?V8qFZP;q|po6QN9NKz8i?d&afP7youXveHbFdSiNty7KI zIn9`z^aOP~`-q)05l%l^on^$t*-&x5n4Yaq;>RFu@7PyTKMz6Fof~^QF37~oTg(ih zK*ae*oLm4E=f|LIPO@gH_sL>0b}?eA$B^S|Oj5Mt5+jZ-g^Kexz0>_<#kA)cb1J)8q#{ql;6i8WMq#ol(KGinV5YF(T8Si zxe%i|Fo$K0l2=*yqE0xrAQ;8B$||j=O}T#tLe7`#i|Oq`9`xp@lID0G>GX*=M_D9- ziajgw_?Z2b&p@;^Hm@o$2?ZQqFlGNm2svMx%xyn+&br;8*nI`z`^7)KGA$UwcVr@X zq&85AiRj@gzUU~AW$2f83`_9 zLA=D6#GTcTOgZ})Le8JU$>JC2Uiit*B;Z1D)w|GH0cX_b3Hc+V^rLnfaZx~rO*%Cs| z?;RB|m7cC{GA1T{h}>sJ*#3$q-mbL|cynWcTJ0znwVIf6>W7e#Gs%KE>vrqJZgYh1 zk~o{nIDKqk%4SOl8QJf0=BnFUDfZeRY`6GBW4O0n9t`0WIXP!Wt+u8Nwu6xK8)jKX zY@Td&i>t(9M+9y?H;5;014(06CsV#UL&(TsIz2_*%xW>y4bht0ziGFF)!mel9uP7z zPwMIECf10F-iXwDF1{Y3y=q$;s!Yru_GL>SQ^vM}kdcLmLMiKJ4-m8c5xvXYShyBf z*`<*s!B_<)#HktM?-veqph zES5(gfr0UjWtlk9zj862?B|iDjE{nlkwxO7bJy)3BKF53jXt>~lD2m+WqU^m89CP} zn6qy8P_er+!nd0rS{@3o3fV&$=Xbbbw{|gQa90Q!x!so~OWo38Vrc>bs%J3lgA&>$ z60j!XhYqUe*zXREFRxgRb0ei-Ke09mGEOdQ)hh@YGU_1`Ej$17yleS_x@&p3*qEBI zf#-XJ6}F8sGd6ZJXd{`OZsQ2CF&&{=vhn5y%BusF_~>cCn&HO9gsSq;vOuM(xNUdF zOvpGndr_T{A!Bz&B02x7?2Fe_U#t}qa}p-(b4r?+YsSPpgC-Km=_Za86AKYZy)4IB z3^it|%cD`%9ebE@vIsIx9_z{19jO`Wc8(G|dn25B0UO_^8aiau=%Lm=_{k&(%kg#s zYzFOyusyW)g_MIrE%tPwS~OkCeqbz~qW>)puD8|TI$DgBrx_V$Eiq@LqF#&)(~TS> zMwTL${iy=BDc_Y%Jo9HQGiRv^Qcf1Rb9b}q8`Wzm$?E2g6?4lG)&9sthB@v;!>np^ z4r?G)Ze$?maHulYZ5}5!YY|#a684ZTjm09tC3UfYwZfde2&A0ce<{>~>faNY>b8y- zTXhJjYB;9Zvb%1jId7{V<)pxZGjAFFc7hl@0CCkxk2V!q2b%MB5Tu+>?%C#6dq^gI z>-}}2*f|v8`g1DQ>`Yo6!$l^}$4Zw(aYc<6JSlG-X3pf{kaF^3chW@GS-)WJy7iO9 z`jJRtyEN;QBjFnRN;~oW{p7<8)=}nK;AluWd0MUb7RYNsZ-|qnA&x^X{n8pD@q)Ly ztB)eUOIh;ocykSK0;KjgIQ1qQC~NAv@l(Y3$;d&QgD0)72-K>(`lp!lc`Brg&%udI zbz7&3tus<>CB9c+ooUY2S@mHnk*RL$G_iFqLfR(=s;|{AtaYZ%JqAJN$F*ce>8+(-VGn14Z&*1=b6dmigT=4(9K^U=AT0r>O;sGeOwj_p)`!Tz+@Y;q5M|i^jq=>hPSnw8Of(ltXzB znoeHYD?(GvYW|I!t3Oq9^(A8ELj+UxK;&sbm6kR~SR3lW;z!VQz8~jpHf1rF3Eldo zVtpf$P_JIvyMWY-wLZnq$2px~Woyn0QR_2EIKID>BB33Ji+C-$oqd;+wKuHq@G~bhDO3*J z5+As%3)o%qJv5wr9XE@HGLlTo|2_NT2h|@}Ncuk^jQZ*)i`w%jSY`c;A31r9(~i6n z&&0&PAS9J#eu0qVTgdh_V}DO6E~I=U^7H>n8^0+VSBj0_5lZU?t{z)|nDX%_gdE=@ z%jLuF4<@J^xk`-ugIM-0eKn^m6>GC8C;vjo@l>7DNisv-%GF|}Vc&S4lqMb_vKrxM zJ2;)ICIU-ojwua|}F z`}pxM-nQ{*sV%m5eB-K+rPLgCgV&3}4v4Ehwl%YkwYJMKxT>qIjvn1~!uF0Yzti1l z3F)cdAgOmn5PLO4J$PYvgi61g$Mm~ndnZL2)xjn$eS1nxCZ$`rQ7rUISV*2MD;=x1 zM+<#SSV&7sw{VkK=!Zb+8g^b)Fq(FgOq~<*eaQYE-3-9?j@OjZIwVhiy0M$Z*g(Wo zpN`bO-!{w|&f3L$qz@A)Pvm! z{A4Gm2dgqX61_SQv5(Osq2Tx!tt+U5M&f|iurZF&jew>NZjw@N6PSe!8hU#nco;REM_2y-(?qsh-`GLBa6_P&~Zam*QO# zzxyBm7v08PVq+RYb;OercKKSIMJ3O2t?BqTCzV3gJU9&>w5^t>;_V%K26PZmZ)r7w{J{+#L78)|J z2Xq{t`sFad#PrnfmDKk_5cP;oOg3pP1iq~)j^x=#%4hj{8b zBkh;%YmDSakgak<2A4p`$tNar?0)u9kxzytJ0U%1-SGWlIDq(>*Bwg@xmyMu$4d%1 zx=+6_(ycroR`y3Q{fmIh4VkEhj^o9)946vl1=MD<2POS5!eqaUsx@R}1#}$WJI!Gv zfFUaf zLdWqcVverS^3#nxB1R5DEVZBD@s|;!##)Es?~|RLR@w8sc5B5x3pfl~jt`sJwbYbm zr|56Nqkl_v^nX-rtVJlbIE~*KHG1^OVZ*E=4LUgrT8;--ekXR8x|wxi=Gb&Iqpjl% znmN9n%#7B}JSJvN(#?z=K6b=d>tuswPN@eoDofqW<6`D?MBA2wJN3qzHuB5(#;ucs3M`9XJ*c(g%MCWh70_B?e5@3*pf|(Q(hOH46;-ay9&d7IAimF_GFPQ_ zjX~$vLd(eqAc`9XS+ds6J|kvtKy>Y4>BJ(6JWZDQZt__% zc`G7o@95aSiHnt)OXa}<)zw^nzs;cG+o9$7$+?0%c%JNa^UsO-yO2fd67k&zJ>CN? z$CrEDZ!>lI_I(`aTL4yaD{Hg1< zUlQBT7G-<5^_)T5&;KuN57%wKEVf@l3hE_m)nthmtksx)*`U=|pyl`tfjs+cX1cn) zSH#|Wgzd_+C0i=vX3FaZExrLQ$4{N-v6ww&-R7%e^KFDyYhJU;qtO|4)zx@Ytd5`H zwB9jj@Lgy*euX8E!SrNxYp;p54-iz%y(qJ?5(QY}k9KM29oB~iJ#K)O$+Gg%f+dWeQs;FptaGU%TJ+Ya&OE`SGV`N*!u!u)gx5eCqv@yzBK4=6SN$E z(IL+`&B#_a_lB7J22s^R)Ap}t8K>VG^!OdLoP5Si+h4RL7tV}Pb=jUPY2E6ZV)aJ^ zSI@}cWhT5ioj7Xn@liD~Hy2HpM)Eys6v^7d%XymiBGiQ(T6Urj=6Fy+ub_0vuO ze>Z6N4``X3gmPxBn|)i%{*CDNiwytZPmb@{%v>3WRENtek)ynoeVx&R8__O@u*IqQ^ZwoWJopW_z|O-d5g^eN5_R}SN2gqt|-eMa_)&9A7pDa99v#X`@Y`*8GPi?yiya|Z z551V0xNh=8G1&!??MKAb2R6#9lXFg2^FF&l((x%k;T>{jdhWW_4Pvz?f~x^5j}rv2 z*kkoF@3J=}>tVp^Y3l|*5`%paw~u`SZl4>?iiB$ek=UBD(1bdazX`?EHF7`vn&bDv zM9MxS_J@Sy4^*T`loZU<--XA=uIl*su~^&&fms~Wl++c|67Q)GhJ=%vu4*F7Og*tasr7NLjPJdzk|X$6pna1T-(nmx$ya^?vzE z?94|vHO;3^kJbY3P8LGKz%-wlm~P^0F|j8iWqI&$FYg}qhJ@o+(xkzYy^;F3p*F0( z5ethEsH?r?6;KcQCBJk?8EZfMyMq_8b*0n?_sb#V;6yd2P>KF8smc0#@hq;lI*a>O z3|1m;;`zO?!^eyqX$4GqS_&Ztk0I)rr!E*8DnH%EcVZ)$W@Ge7YkyNVme+%g z(Ia&m-;0e9LM6W3G-mX0D{RU{ErcBGF$Mc#EV9!r{2&&h2&7JW<^*cOEBVo7JPmKf zO!=sTkb?(8^ZU?K)Xn@TW>zDbdYwxDP1L7DDWBEqF~c>cd>sHG2PZ(q`_i)2E&e1H z4@O{h88;_TTaE9RmSS1u5L2!Wg^+_YfI_Y$LEXsDV&n+Kir@W`-{X2xup$_<)|xVO zB!nEidRwd^NmMuXix@iwG1VSrp9qzOs!>qZI@Xk>;~->gkJ3}r&HO56PDC{IaT)zL z#lCftDN`py$iYp#{QZDM>fy@6U6J0qUIMcWH*RkxHldZ`${`)NO_N(eh;h>zw~d zYn+QHtBb$9^41#Z9`#1~LmK4*WYjBOOL$ITSzUE`#J-xempXV29N zr?y?TP64xeEBz_0bSYBnEESj4wUXXEm;Fzg=W;|@Q}1IZmr1=@{*q?73Mr{KJWE62 z(3+ZX9lkB0o>IOV|KOm?2zrv=s!vl<7ev-IkaFdQ z@2y$4nzMErq#QiYTF6>Tp1P&YV(Crf(A)x+amaZu38}`7lDOC4dR| zy12UMXgz`-?dZ7Glb@Ke9)*B|4~)d^Bn4DwCGznP<>WC;O&$$8;*Sj)G_W2=2(@&n z_Cos%PJQyydcte=PeQ=K5?S`_)6>#TG!zrhq?pjZ3ihm56VDklp{1ppXe1_HM5HY1 zd@p%*@G=A(JZY1?8&cQ!w1KpRr2ksB^oLpNy{7-V>GX%`t-qzD{}#gZjC;4w3e+b{ z^%XShZTyadF9xNk*=GmuK*7P&yO|33q=-8A$dRIdG`fC#F6HkF&;GuIf`dnwQ!>iwFC|IcUK6qR zHNtM4BF1fk71`Ry`o^=%Z=vAe3DA_pvbfBht8UgWW`98R0V$fgKuTj-KYI516BHag z$CQ#+0k0{k>Q5OpVeTm;Z+xZ;|4n9Ph#ZEFEJ>_PS@?Qwh(q7R@r2V(& zwEuyEgYO(=Njo(qJ@w|2`hN(b9@@dZprJ#?j2vS%==3K5=e#W_IC$15OM}Pr9;GtU6K^Sr`}M?!jv6|4xYg8i;?0aD zt}@aSZzYMhOiz5Q)yi|?t&Ju=R!_XOB;HO>eAK96s3Y6nbK)J0C9X2k6K^Alch(c< zXFNt&T|6h=)mY*xBR%o9l6ViqkUOqp#ta{6_4J%}FDN+p%46ry&W>J--g*9f0|f)E|aT+wKMU=a5>gwX(jJNscG|=6CkIa`tH<22JT@f|!{e!TzQZBm;Md1plQQSlISRC z_nc533WZ~`ojm35pQj$MWe;K^_cLSO>>?{U% zMBD*6x0@3vubdgGUSlsR?}Xp=Y;+t%9K0;&&}d4+y5TNjcvr+96u)_>Y(*DV1uLqi zm&Yoq=2Zoxcloj)d&Vj?VR}47928p3Zo2rSb>m&d_$1`eEv}&!3$!Io<@EoEI}7kO zu5Al9h0`i+Q)XsPZJEnYE+yJ>jJ6emy3NVf8VqA05}+w9 z&R~;Nnq8jFwq?yuz@Gvv?&CP^GovW0Vf`T!9Z4L$|km1#(~^4|Bw7Zg&ub9ryi^ z(Mx;lOxjoLxm2)Dj{ z8Z>uyj!(E77BG0=cGR+~(K5^9Y2D9RxFf)bhPz^$W~${JHI{oqClTPONh`k#b?ABL z*L-N&Ja`~><3B@(tj|es9*oe2T(63odXoHnT&O{Q0dxY4G7OZ0MaT<0OW+L{_+rGT zW*oqoEh?8NpqPLv!6ph~W%z1tQVJ5y zH!HE;0-YdlM}sswB~44@YDT^t2D}Bg)mw1yP$In(I_d@2>s11V8Soy&UD4+0ghVus zH{R@1L`-kotHgL8bONj#Em?90wkt7f81q4dF5H>)kP_I#&KN*2M0CeppTVDkbZp}(99EOJgugvH zEgr!_yUf?GpM_+Ay?w2NOVZOk)H4tICvp5|=#Y8_c>%F#g(=Ml(6mkj$CJK@pSK9o ze@Z74oqZh+3)mW(GA}_T5J)i<^6qgLN`WDi#(#zmX<(375zE~UV87kQKFn+QxqOh< zp`rsqeN1*IK^ht4EySXuaXpuA>C776*E1DoIlZky^bS;ljKanT%$njhC0Y}sy^o;o zvVWOJVtecdDr_G@CBPO%3?UXNyj1KwY&oA2ZX<^K1W`k_+>eeXF?;qY{u-!1pD}^= zqn=2*75gCEI`kQIf((5zOrB1r7QtDle;yd!6aN`HWMek}C8E%{UAxnPK9czgf7fvT zHFN^Cj>S`f+`HDK{Y}{ZcL?J)$KMAvj#DwytzFIWPI{0NpX0oS2~*_>hiK{T4>!)a98CZe6=5=lJE=rn>1*S|_! zbF3L?zg$VKfy_$8Ef{ew1a|Al-1t*~Jqv7sDu!D-=7B;*fbzFAl|j zh7M_FoAW_>RlJp^T4ITg>A8i%iODIPUYz~A3E{dR4|cpOVD-$l(FhtwCxR6Z)I%8x zl_2x2MOB6mZZ~w4MLn8OTNrgg1Yg143rmv{cBfxkS03ds70QL6669rVV9EiVO282e zxG3T-mRWewoDy$ni>Y8O4wWEHL~*Pl{v^yuhFJ>HmM?N~u1GGeLbVK3f=oR6rpg+X zc%v9^d4yd(iN@+^C|SwRJJMW{Fd-Y^EiEMZvUj%M6d5PsPVZZXJJRUlV` zN|0W5Nys8LCE6H9TN6Q7%Ak#n#`nnGC(aXHONDQ3s010?E6F#IR|&Z#L#~I&OJpGN z7~~}n_EeDdRnRtoN`Nmjqr+b0`NF4qcpXZhRtBmCKb^D0;Ws#W;H zP$|Fu`7tbUw_@Bngy-WZ=;dCl$xE4f6~qRp1X++%JPR|31tuld){M0gLavgzLu~GK zvoV*28>{eb0+p#{H=%>Nm7rr8baTXB62*G!cw%PUE~UbiYS0cNfS6?D7LC)hsaiPWbY z&k(JML^H_3(AX$4Wh-r_tsxlT;17RHd9FhOv5gVOBQU*qW)AytKXzi;@N<*@+F<>- zce+_LA$a*Sx_jyE(lN3{B~@9FGQibkhw5h6YK+p^6NsrF^RD~W9*Mm z{KDm)+Qgs#H3#6I0_=_&hr??pB`9cnN1`_~>3JYT0xV4{D#EW@UVovBZ1Z|CHLp7` z&LIf5UZ(3SIvpdUN$l~6*^h}N;;D49uLHXT?Z})tR0Hxbh)nn2M=1^&z_mo*kXd<=fblZYSPGZ!P9{4agH9 z5@39_IAm#~5^!e*JQ;DGV4B&Qx2xE#2)T#dG^ijf6N0B72pa5M@xvq}i2|=3JN> z>MqHlb&BU{ke&~b0DW|uD+TTQ@SG`Wd^a|J5n{NX4cenG5{st$&Bgd7z-eWTnT!1BOe&AZ;Y*s>bGSqE|NHuJ%lS)x(yj>UR4#+9jFt#dz90s}@@o1=v zui|oek1p4}kP9#&=O?T3980_|#(Mx^-Qmaw@uvVMMNH_!m_aJq>CjxV+xk5Oi2#dB zibzn47rM^2bk|c$H;s)x3T=0!Vq`Scn@B~b#vJol`JNw#M1ZwJ19@)Exsvv~+5S@q zLyOYvbBlXUqElg>E+6F?NCar82SORZp~Q+Z*7FFtvdw%R9ALDRWP71}wih80pz}K* zTV{x*m`w?|I|IIgxK#be_j!8v=GF35TCvLQ(N^KZN2IR&3&) zfhCgEYk#YJoVOvNQ2YjPD6wLU^&UdfAibR%!afEZDuVGQ^M3g-A3!3&Zq9-7#^XyO z^f1E52*g_s6ECmYwIj@i*1%~ zrDi$K_P;^fJaz2u1rK+y#ZQ75*9jw6XtJ$&3pe$L^%uBK6B`VdMm;FctU;-DQi_ z-BhghV2s}pO6*K&ArbROxdeYgAi!8`K@t#wn+2{VX+Fv3|3(zIDA7qWBka*f=AUxC z{|kWt)5QaL&pDFTQ*3?CwKCoJNy&cK_gwg;tWq;K1Og1)7x&F}r0F!9o);0^r$ENE z>wLa)orfS0ya~-K@9dmBN&9_le*uJ{E(TvZI*Ofxv3|2)xd6i;5a1zJI_Wd6B*F|v zSOkHFxwp5)9a_X<7R7G?MpoRr=~nEv!$(dM$^PaJ+c$9=pT!^-;8k`Ix#3>3p$BXm z^dPlCGZ|`0L|oZ>ooCSneH6(orHi>VpsbqZ zbyHyl$juD;s2Z^BZEZhtq3|D4lL+R>4I9 zc5}EXJkjawi+5r-95oQOzv!0tRUsB&lW$3};hA}u>^9as=b^`J@qe6(|DKGz1`I4X zA?aWzA?7w{u4YY5z_lP2U@EROpvR}g*^6=3MYv_Mm*Gspw3F(kgRBT`Jx#RrAr@du zuTQjm&k}QQ#@rC0mvaSEZbv1rkXC7eRzobn#)i_MC0t9?eHgVC!KshvE}Fr*C_DXB zhhGEtSKNEuidPSTzGUhib*ZjsB=A|WRem^$9 znb&+~dD-UpHPDMIedcpiPj9+ktZ_42Kqk;jUr`y+Q+LHfFWFppnQ~!&1{r}^?&#-8 z{3*bhl$1o+#@E_4I+mE(iZ6*JdNXfHqo5R^-!rfhA%xzrw%;V%2e9oev$k9DrvQVt z-e7Kd-wF}|25pN-xJKWzM&Bo+2eQ#|&~^`sKu>OlV`ok=d7Q$L$Y~ljHsf(YfaR3! ziKKgDCav3Wdw^$1-tFYu_A!e%3w>g7J|&!k7-u5Ftz=Uz|E3nFI~wnFk=n~cnuOZ} zjH3BL67D3{!HhKpA(tYoSQNuIsWAz>@h33RKMH$vw<`~4d)yvi=%Xl3p(}}T2xIJo zP;>}VYdk-HunZ_WRgp3~mxr_qZVxb1Qw(VkhZ65l#)}~AFq=!`qO+XN_HO+BxgpNK8#IwA;Q|$bhhV3?L9W(IPSU7t#;Ew1fR6T_@S9r9!@uI53mZT z7>*yC67+BeosQU4__7N4LvJ#H!Lw8%=`MOgJCic8@)&z?dzpoA5Qh@)2*&G0SUSnc zCYoL7L~R{yp0ybm#a!GT<$)z}dw?~n#WHU|ZxZQ9M(RVrwQSLx9G`Btm)H}@>5YKe zzveDXB+#}K3}~dxjPl@S;`RV91jXQdxRjVjG3K5KO}%97@X9VuGJE0I0G-@+9L}2- zW67RZXq$#9vo{oj6wE;t>FF#@hrY6pzi@_3XuCo;}C2$wlTK0Ym$T`OYF)#5o1LIGA#mCl=X%sS^xN}!V%=t9J!{Nb#j z-Nxo3EuM=Zq?SJ(j}qr(#<>jP#MESF@Z)m)x{?18Yf4l(>Tw0`4=}rze?OHi_eqi& z?)c5NSie(?bqZU*8bOL}47{dH^Vj13pbf5oC-Zq*1BLxl+5Qa(vv6iNK0a80Zx7gw z_&4I$01G&6A1K=4PF>{Izf4NtOI8lnvtcaXNp~mk`3+tg<33YvLXEs(*rra5va`(gJa#@M- z37p2_Nj3Apf09-YBFf(XT~ZZt%EUR76Xy}QS|XP?SOdr(b2E?rC&}^{qRjXYlSL59 z1UZWnHNZ_4I*{Jxog zuai^u9oGF6PIfN%1!x2qL@lNrgFwZr?zd$_dGCT9UZAwUBT*MeZA{33JkHR7P*cP2k%%sg8&FOS9 zI<+tD&=5MG3f+p@*zJND0W?EK|?SiJNq)z+6zOdZC!H;$ot<_AwtSH{^Wp{{n}BL|cX~$u{YU zc-onjcE2ULh%(%w(CZA;xRop$)W+u?M#8y-y^>*Y4Nd|aBW#Fm` z01x0@0$?si(8ktH!|*~2v2*mS}>7dch;i%(DySoQ|8yN6pMg z2aT%JNu6Ulfjkn+w5;Ql5ywMMyO|l#y@bA%p|^p9HEicW-sUzm+09EC_=(E!?a=F0 z?mrAlArs*?PK0gYgc_ew@xGqsRJP+~rYIwC2R-e^C(pA4yqy7eMBJrqF6UkB9v-lh zGUd+D^RY=OP)k(IxJ12!QFlXd8rgU6;15Wch%)3<==oTFIUA5{S>oNvcn-qS)&Vb` zn~`10jMJd!V|{lSjO1H_-o>E1BX%|)ZG=cNn!B@{T=v5*gbCxCE-Hew&*la%L zu66UVSDA4S=v5*g^L$Itdl)p0*z|U43v6q=1zYWNp9>YMhx?S7XFyN;?X)z4#J`vE z`(cBI-rRfhmwN1}OuZNMw1?h`I+w8bG3>sGz79WTaBiJdUrwqS8^nwkk z5B}0t6h5CsCdU1o7ze>kwgIC9)7{b5gO#ZdfnFsVu$*Oy_WVg4=)~>=%f;{8F+Cu$0`#a2R$F_Ep1~Qb7$Y)ww$j1&wjx@Dh=a^}6@BxT-{q37c??SQ-k14#6T8T~Yv zaHmA`(cAl`cElp7REGX^W%@Iq7gv5OD#$)BgG_)&I04Rv4|*Hsn+r4k9A)%#p{M;e zJfM3C{U}3U00*?WDbtwcnz0L&SucW~kI(D`D&+a5CE{a@cqsx?!A>8e41FW? zw1;j6rI3m6Bqzcxa6+?yt$6xHJEG}K0clPqBmMb(kz19M;Wp@L&jR}3kO}b=C&Zob zLjAEkf&4VMOF0ehhMsnRtTckef12^{gAIE1D1EQnp3XA&E2qK((9?eP@I@jM;~7qj zhvA0Wc$R4Ij&vqw+Ro`C%HWSePrHpTa4jL9WymKGnI_0u8Z)ci`wbW#;Fhr@gGDgntSCJcGY9065OJu^)4H zGy7#_@K-7iF8xdJ7a06?c%Y%9Oo}^q1~ zGZZ;SJM@xy$$D3r^*!im&rlRIE>T}%)DIEd?XqOEGt*_Gk7v1)Z~S`skuv$m&{OZS z49+1F;$=>V&){X49WJD#v)P?8pDXiz0X-k5I|X{r%Gs4zuQ1lv2uTBft!SI4uDu|=2u2spz?^d67g+D zTnK@wH&k@MePLzHMWCnM8!Bd8qQ1kZiz7H4R?;@ZNyZY9&Jl?|oK3WZGUJla+evv? z-Q!roy~}XRAS%6x+e?!ero+K)c=Xs8@nw|(mxG@6i+F)+3HcsFu87E)llY=N_&
fcH58R)Y^3iNNCR!nMg^v$`_(8qm`oi70Me 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
Bwv!m*2*hn#tH7h;Yc!@})za6#ZJ z;bDviu5a|zW6LVL>|KzH_9=d(Vvaz-@z)~!17M?2?q%2yw99@F CG*Ny4 literal 0 HcmV?d00001 diff --git a/NRefactory.sln.DotSettings.user b/NRefactory.sln.DotSettings.user new file mode 100644 index 0000000000..3ab0486b72 --- /dev/null +++ b/NRefactory.sln.DotSettings.user @@ -0,0 +1,5 @@ + + SOLUTION + True + RemoveOneField + <Session><Elements><UnitTestElement Provider="nUnit" Id="ICSharpCode.NRefactory.CSharp.CodeIssues.DuplicateBodyMethodIssueTests" type="NUnitTestFixtureElement" Project="63D3B27A-D966-4902-90B3-30290E1692F1" /><UnitTestElement Provider="nUnit" Id="ICSharpCode.NRefactory.CSharp.CodeIssues.DuplicateBodyMethodIssueTests.Test" ParentId="ICSharpCode.NRefactory.CSharp.CodeIssues.DuplicateBodyMethodIssueTests" type="NUnitTestElement" TypeName="ICSharpCode.NRefactory.CSharp.CodeIssues.DuplicateBodyMethodIssueTests" MethodName="Test" Project="63D3B27A-D966-4902-90B3-30290E1692F1" /><UnitTestElement Provider="nUnit" Id="ICSharpCode.NRefactory.CSharp.CodeIssues.DuplicateBodyMethodIssueTests.TestNonVoid" ParentId="ICSharpCode.NRefactory.CSharp.CodeIssues.DuplicateBodyMethodIssueTests" type="NUnitTestElement" TypeName="ICSharpCode.NRefactory.CSharp.CodeIssues.DuplicateBodyMethodIssueTests" MethodName="TestNonVoid" Project="63D3B27A-D966-4902-90B3-30290E1692F1" /></Elements></Session> \ No newline at end of file diff --git a/NRefactory.suo b/NRefactory.suo new file mode 100644 index 0000000000000000000000000000000000000000..4b44c665777a8a57cc9fb80fd6837c6b80fc7953 GIT binary patch literal 318464 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�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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From bd486b50b0a628f35c67c7cd4a20ac2ef97aeebd Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Sun, 28 Apr 2013 13:16:48 +0300 Subject: [PATCH 13/14] Code updates --- .../ICSharpCode.NRefactory.CSharp.csproj | 5 +- .../ConvertToStaticMethodAction.cs | 100 ---------- ...veFieldRefactoryActionRefactoringAction.cs | 110 ++++++++++ .../CodeIssues/ConvertToStaticMethodIssue.cs | 121 +++++++++++ .../CodeIssues/DuplicateBodyMethodIssue.cs | 188 ++++++++++++++++++ .../ExpressionOfCompatibleTypeCastIssue.cs | 10 +- .../ParameterCanBeDemotedIssue.cs | 27 ++- .../ParameterCanBeIEnumerableIssue.cs | 156 +++++++++++++++ .../RemoveFieldRefactoryActionTests.cs | 96 +++++++++ .../ConvertToStaticMethodIssueTests.cs} | 83 ++++---- .../DuplicateBodyMethodIssueTests.cs | 92 +++++++++ ...xpressionOfCompatibleTypeCastIssueTests.cs | 73 ++++++- .../CodeIssues/InspectionActionTestBase.cs | 6 + .../ParameterCanBeIEnumerableTests.cs | 98 +++++++++ .../ICSharpCode.NRefactory.Tests.csproj | 5 +- 15 files changed, 1004 insertions(+), 166 deletions(-) delete mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs rename ICSharpCode.NRefactory.Tests/CSharp/{CodeActions/ConvertToStaticMethodActionTests.cs => CodeIssues/ConvertToStaticMethodIssueTests.cs} (57%) create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 09463aeed6..bf5e6b4bc3 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -278,7 +278,6 @@ - @@ -535,6 +534,10 @@ + + + +
diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs deleted file mode 100644 index 0d18436be4..0000000000 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToStaticMethodAction.cs +++ /dev/null @@ -1,100 +0,0 @@ - -// ConvertToStaticMethodAction.cs -// -// Author: -// Ciprian Khlud -// -// Copyright (c) 2013 Ciprian Khlud -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System.Collections.Generic; -using ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod; -using ICSharpCode.NRefactory.CSharp.Resolver; -using ICSharpCode.NRefactory.Semantics; -using System.Linq; -using ICSharpCode.NRefactory.TypeSystem; - -namespace ICSharpCode.NRefactory.CSharp.Refactoring -{ - [ContextAction("Make this method static", Description = "This method doesn't use any non static members so it can be made static")] - public class ConvertToStaticMethodAction : ICodeActionProvider - { - public IEnumerable GetActions(RefactoringContext context) - { - // TODO: Invert if without else - // ex. if (cond) DoSomething () == if (!cond) return; DoSomething () - // beware of loop contexts return should be continue then. - var methodDeclaration = GetMethodDeclaration(context); - if (methodDeclaration == null) - yield break; - - var resolved = context.Resolve(methodDeclaration) as MemberResolveResult; - if (resolved == null) - yield break; - var isImplementingInterface = resolved.Member.ImplementedInterfaceMembers.Any(); - - if (isImplementingInterface) - yield break; - yield return new CodeAction(context.TranslateString(string.Format("Make '{0}' static", methodDeclaration.Name)), script => - { - var clonedDeclaration = (MethodDeclaration)methodDeclaration.Clone(); - clonedDeclaration.Modifiers |= Modifiers.Static; - script.Replace(methodDeclaration, clonedDeclaration); - var rr = context.Resolve (methodDeclaration) as MemberResolveResult; - var method = (IMethod)rr.Member; - //method.ImplementedInterfaceMembers.Any(m => methodGroupResolveResult.Methods.Contains((IMethod)m)); - - script.DoGlobalOperationOn(rr.Member, (fctx, fscript, fnode) => { - if (fnode is MemberReferenceExpression) { - var memberReference = new MemberReferenceExpression ( - new TypeReferenceExpression (fctx.CreateShortType (rr.Member.DeclaringType)), - rr.Member.Name - ); - fscript.Replace (fnode, memberReference); - } else if (fnode is InvocationExpression) { - var invoke = (InvocationExpression)fnode; - if (!(invoke.Target is MemberReferenceExpression)) - return; - var memberReference = new MemberReferenceExpression ( - new TypeReferenceExpression (fctx.CreateShortType (rr.Member.DeclaringType)), - rr.Member.Name - ); - fscript.Replace (invoke.Target, memberReference); - } - }); - }, methodDeclaration); - } - - static MethodDeclaration GetMethodDeclaration(RefactoringContext context) - { - var result = context.GetNode (); - if (result == null) - return null; - //unsafe transformation for now. For all other public instances the code should - //replace the variable.Call(...) to ClassName.Call() - const Modifiers ignoredModifiers = Modifiers.Override | Modifiers.Virtual | Modifiers.Static; - if ((result.Modifiers & ignoredModifiers) != 0) - return null; - - var usesNonStatic = StaticVisitor.UsesNotStaticMember(context, result); - if (usesNonStatic) return null; - return result; - } - } -} diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs new file mode 100644 index 0000000000..7f44799942 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs @@ -0,0 +1,110 @@ +// +// RemoveField.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using ICSharpCode.NRefactory.CSharp.Refactoring; +using System.Collections.Generic; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.NRefactory.Semantics; + +namespace ICSharpCode.NRefactory.CSharp +{ + [ContextAction("Removes a field from a class", Description = "It removes also the empty assingments and the usages")] + public class RemoveFieldRefactoryAction : ICodeActionProvider + { + public IEnumerable GetActions(RefactoringContext context) + { + var fieldDeclaration = GetFieldDeclaration(context); + if(fieldDeclaration==null) + yield break; + + + yield return new CodeAction(string.Format(context.TranslateString("Remove field '{0}'"), fieldDeclaration.Name) + , script => GenerateNewScript( + script, fieldDeclaration, context), fieldDeclaration); + } + + + void GenerateNewScript(Script script, FieldDeclaration fieldDeclaration, RefactoringContext context) + { + var firstOrNullObject = fieldDeclaration.Variables.FirstOrNullObject(); + if(firstOrNullObject==null) + return; + var matchedNodes = ComputeMatchNodes(context, firstOrNullObject); + + foreach (var matchNode in matchedNodes) + { + var parent = matchNode.Parent; + if (matchNode is VariableInitializer) + { + script.Remove(parent); + } + else + if (matchNode is IdentifierExpression) + { + if(parent is AssignmentExpression) + { + script.Remove(parent.Parent); + } + else + { + var clone = (IdentifierExpression)matchNode.Clone(); + clone.Identifier = "TODO"; + script.Replace(matchNode, clone); + } + } + } + } + + private static List ComputeMatchNodes(RefactoringContext context, VariableInitializer firstOrNullObject) + { + var referenceFinder = new FindReferences(); + var matchedNodes = new List(); + + var resolveResult = context.Resolver.Resolve(firstOrNullObject); + var member = resolveResult as MemberResolveResult; + if (member == null)//not a member is unexpected case, so is better to return no match than to break the code + return matchedNodes; + + FoundReferenceCallback callback = (matchNode, result) => matchedNodes.Add(matchNode); + + var searchScopes = referenceFinder.GetSearchScopes(member.Member); + referenceFinder.FindReferencesInFile(searchScopes, + context.UnresolvedFile, + context.RootNode as SyntaxTree, + context.Compilation, callback, + context.CancellationToken); + return matchedNodes; + } + + FieldDeclaration GetFieldDeclaration(RefactoringContext context) + { + var result = context.GetNode(); + + return result; + } + } +} + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs new file mode 100644 index 0000000000..882899b3e8 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ConvertToStaticMethodIssue.cs @@ -0,0 +1,121 @@ +// +// ConvertToStaticMethodIssue.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System.Collections.Generic; +using ICSharpCode.NRefactory.Semantics; +using System.Linq; +using ICSharpCode.NRefactory.TypeSystem; + +namespace ICSharpCode.NRefactory.CSharp.Refactoring +{ + [IssueDescription("Make this method static", + Description = "This method doesn't use any non static members so it can be made static", + Severity = Severity.Hint, + IssueMarker = IssueMarker.Underline)] + public class ConvertToStaticMethodIssue : ICodeIssueProvider + { + public IEnumerable GetIssues(BaseRefactoringContext context) + { + return new GatherVisitor(context).GetIssues(); + } + + private class GatherVisitor : GatherVisitorBase + { + private bool initializerInvoked; + private ConstructorInitializer initializer; + + public GatherVisitor(BaseRefactoringContext context) + : base(context) { + } + + public override void VisitMethodDeclaration(MethodDeclaration declaration) + { + // TODO: Invert if without else + // ex. if (cond) DoSomething () == if (!cond) return; DoSomething () + // beware of loop contexts return should be continue then. + var context = ctx; + var methodDeclaration = declaration; + + var resolved = context.Resolve(methodDeclaration) as MemberResolveResult; + if (resolved == null) + return; + var isImplementingInterface = resolved.Member.ImplementedInterfaceMembers.Any(); + + if (isImplementingInterface) + return; + + AddIssue(methodDeclaration.NameToken.StartLocation, methodDeclaration.NameToken.EndLocation, + context.TranslateString(string.Format("Make '{0}' static", methodDeclaration.Name)), + script => ExecuteScriptToFixStaticMethodIssue(script, context, methodDeclaration)); + } + + private static void ExecuteScriptToFixStaticMethodIssue(Script script, + BaseRefactoringContext context, + AstNode methodDeclaration) + { + var clonedDeclaration = (MethodDeclaration) methodDeclaration.Clone(); + clonedDeclaration.Modifiers |= Modifiers.Static; + script.Replace(methodDeclaration, clonedDeclaration); + var rr = context.Resolve(methodDeclaration) as MemberResolveResult; + var method = (IMethod) rr.Member; + //method.ImplementedInterfaceMembers.Any(m => methodGroupResolveResult.Methods.Contains((IMethod)m)); + + script.DoGlobalOperationOn(rr.Member, + (fctx, fscript, fnode) => { DoStaticMethodGlobalOperation(fnode, fctx, rr, fscript); }); + } + + private static void DoStaticMethodGlobalOperation(AstNode fnode, RefactoringContext fctx, MemberResolveResult rr, + Script fscript) + { + if (fnode is MemberReferenceExpression) { + var memberReference = new MemberReferenceExpression + ( + new TypeReferenceExpression( + fctx.CreateShortType(rr.Member.DeclaringType)), + rr.Member.Name + ); + fscript.Replace(fnode, memberReference); + } + else { + var invoke = fnode as InvocationExpression; + if (invoke == null) return; + if ((invoke.Target is MemberReferenceExpression)) + return; + var memberReference = new MemberReferenceExpression + ( + new TypeReferenceExpression( + fctx.CreateShortType( + rr.Member.DeclaringType)), + rr.Member.Name + ); + fscript.Replace(invoke.Target, memberReference); + } + } + } + + } +} + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs new file mode 100644 index 0000000000..7a108541e7 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/DuplicateBodyMethodIssue.cs @@ -0,0 +1,188 @@ +// +// DuplicateBodyMethodIssue.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System.Collections.Generic; +using System.Text; +using ICSharpCode.NRefactory.PatternMatching; +using ICSharpCode.NRefactory.Semantics; +using System.Linq; + +namespace ICSharpCode.NRefactory.CSharp.Refactoring +{ + [IssueDescription("Methods have duplicate body", + Description = "One method has the same body as other method", + Severity = Severity.Hint, + IssueMarker = IssueMarker.Underline)] + public class DuplicateBodyMethodIssue : ICodeIssueProvider + { + #region ICodeIssueProvider implementation + + public IEnumerable GetIssues(BaseRefactoringContext context) + { + var visitor = new GatherVisitor(context); + visitor.GetMethods(); + visitor.ComputeConflicts(); + return visitor.GetIssues(); + } + + #endregion + + private class GatherVisitor : GatherVisitorBase + { + public List DeclaredMethods; + + public GatherVisitor(BaseRefactoringContext context) + : base(context) + { + DeclaredMethods = new List(); + } + + + static string GetMethodDescriptor(MethodDeclaration methodDeclaration) { + var sb = new StringBuilder(); + sb.Append(methodDeclaration.ReturnType); + sb.Append(";"); + foreach (var parameter in methodDeclaration.Parameters) { + sb.AppendFormat("{0}:{1};", parameter.Name, parameter.Type); + } + sb.Append(methodDeclaration.Modifiers); + return sb.ToString(); + } + + public void GetMethods() + { + ctx.RootNode.AcceptVisitor(this); + } + + internal void ComputeConflicts() + { + var dict = new Dictionary>(); + foreach (var declaredMethod in DeclaredMethods) + { + var methodDescriptor = GetMethodDescriptor(declaredMethod); + List listMethods; + if (!dict.TryGetValue(methodDescriptor, out listMethods)) + { + listMethods = new List(); + dict[methodDescriptor] = listMethods; + } + listMethods.Add(declaredMethod); + } + DeclaredMethods.Clear(); + + foreach (var list in dict.Values.Where(list => list.Count >= 2)) + { + for (var i = 0; i < list.Count - 1; i++) + { + var firstMethod = list[i]; + for (var j = i + 1; j < list.Count; j++) + { + var secondMethod = list[j]; + if (firstMethod.Body.IsMatch(secondMethod.Body)) + { + AddIssue(secondMethod.NameToken, + string.Format("Method '{0}' has the same with '{1}' ", secondMethod.Name, + firstMethod.Name), + script => { InvokeMethod(script, firstMethod, secondMethod); } + ); + } + } + } + } + } + + readonly InsertParenthesesVisitor _insertParenthesesVisitor = new InsertParenthesesVisitor(); + private TypeDeclaration _parentType; + + private void InvokeMethod(Script script, MethodDeclaration firstMethod, MethodDeclaration secondMethod) + { + var statement = + new ExpressionStatement(new InvocationExpression(new IdentifierExpression(firstMethod.Name), + firstMethod.Parameters.Select( + declaration => + GetArgumentExpression(declaration).Clone()))); + statement.AcceptVisitor(_insertParenthesesVisitor); + if(firstMethod.ReturnType.ToString()!="System.Void"){ + var returnStatement = new ReturnStatement(statement.Expression.Clone()); + + script.Replace(secondMethod.Body, new BlockStatement { returnStatement }); + } + else { + script.Replace(secondMethod.Body, new BlockStatement { statement }); + } + } + + static Expression GetArgumentExpression(ParameterDeclaration parameter) + { + var identifierExpr = new IdentifierExpression(parameter.Name); + switch (parameter.ParameterModifier) + { + case ParameterModifier.Out: + return new DirectionExpression(FieldDirection.Out, identifierExpr); + case ParameterModifier.Ref: + return new DirectionExpression(FieldDirection.Ref, identifierExpr); + } + return identifierExpr; + } + + public override void VisitMethodDeclaration(MethodDeclaration declaration) + { + var context = ctx; + var methodDeclaration = declaration; + + var resolved = context.Resolve(methodDeclaration) as MemberResolveResult; + if (resolved == null) + return; + var isImplementingInterface = resolved.Member.ImplementedInterfaceMembers.Any(); + + if (isImplementingInterface) + return; + if (declaration.Body.IsNull) + return; + + var parentType = declaration.Parent as TypeDeclaration; + if (parentType == null) + return; + if (_parentType == null) + _parentType = parentType; + else + { + //if we are here, it means that we switched from one class to another, so it means that we should compute + //the duplicates up-to now, then reset the list of methods + if (parentType != _parentType) + { + ComputeConflicts(); + DeclaredMethods.Add(declaration); + _parentType = parentType; + return; + } + } + + DeclaredMethods.Add(declaration); + } + } + } +} diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs index 3ecadf1e8f..4a3afffe23 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionOfCompatibleTypeCastIssue.cs @@ -54,10 +54,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring public override void VisitAssignmentExpression(AssignmentExpression assignmentExpression) { - base.VisitAssignmentExpression(assignmentExpression); - - VisitTypeCastExpression(assignmentExpression, ctx.Resolve(assignmentExpression.Left).Type, - ctx.Resolve(assignmentExpression.Right).Type); + var rightExpressionType = ctx.Resolve(assignmentExpression.Right).Type; + if (rightExpressionType.Kind == TypeKind.Class) + return; + var leftExpressionType = ctx.Resolve(assignmentExpression.Left).Type; + VisitTypeCastExpression(assignmentExpression, leftExpressionType, + rightExpressionType); } private AstType CreateShortType(AstNode node, IType fullType) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs index a7d0cb65aa..9bc34b073c 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedIssue.cs @@ -148,7 +148,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring TypeResolveCount += possibleTypes.Count; var validTypes = (from type in possibleTypes - where !tryResolve || TypeChangeResolvesCorrectly(parameter, rootResolutionNode, type) + where !tryResolve || TypeChangeResolvesCorrectly(ctx, parameter, rootResolutionNode, type) select type).ToList(); if (validTypes.Any()) { // don't demote an array to IList @@ -165,24 +165,13 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring internal int MembersWithIssues = 0; internal int MethodResolveCount = 0; - bool TypeChangeResolvesCorrectly(ParameterDeclaration parameter, AstNode rootNode, IType type) - { - MethodResolveCount++; - var resolver = ctx.GetResolverStateBefore(rootNode); - resolver = resolver.AddVariable(new DefaultParameter(type, parameter.Name)); - var astResolver = new CSharpAstResolver(resolver, rootNode, ctx.UnresolvedFile); - var validator = new TypeChangeValidationNavigator(); - astResolver.ApplyNavigator(validator, ctx.CancellationToken); - return !validator.FoundErrors; - } - IEnumerable GetActions(ParameterDeclaration parameter, IEnumerable possibleTypes) { var csResolver = ctx.Resolver.GetResolverStateBefore(parameter); var astBuilder = new TypeSystemAstBuilder(csResolver); foreach (var type in possibleTypes) { var localType = type; - var message = string.Format(ctx.TranslateString("Demote parameter to '{0}'"), type.FullName); + var message = String.Format(ctx.TranslateString("Demote parameter to '{0}'"), type.FullName); yield return new CodeAction(message, script => { script.Replace(parameter.Type, astBuilder.ConvertType(localType)); }, parameter.NameToken); @@ -190,7 +179,17 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } } - class TypeChangeValidationNavigator : IResolveVisitorNavigator + public static bool TypeChangeResolvesCorrectly(BaseRefactoringContext ctx, ParameterDeclaration parameter, AstNode rootNode, IType type) + { + var resolver = ctx.GetResolverStateBefore(rootNode); + resolver = resolver.AddVariable(new DefaultParameter(type, parameter.Name)); + var astResolver = new CSharpAstResolver(resolver, rootNode, ctx.UnresolvedFile); + var validator = new TypeChangeValidationNavigator(); + astResolver.ApplyNavigator(validator, ctx.CancellationToken); + return !validator.FoundErrors; + } + + class TypeChangeValidationNavigator : IResolveVisitorNavigator { public bool FoundErrors { get; private set; } diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs new file mode 100644 index 0000000000..a8e4dd9ccc --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableIssue.cs @@ -0,0 +1,156 @@ +// +// ParameterCanBeIEnumerableIssue.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System.Collections.Generic; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.Semantics; +using System.Linq; + +namespace ICSharpCode.NRefactory.CSharp.Refactoring +{ + + [IssueDescription("A parameter can IEnumerable/ICollection/IList", + Description = "Finds parameters that can be demoted to a generic list.", + Category = IssueCategories.Opportunities, + Severity = Severity.Suggestion + )] + public class ParameterCanBeIEnumerableIssue : ICodeIssueProvider + { + readonly bool tryResolve; + + public ParameterCanBeIEnumerableIssue() : this (true) + { + } + + public ParameterCanBeIEnumerableIssue(bool tryResolve) + { + this.tryResolve = tryResolve; + } + + #region ICodeIssueProvider implementation + public IEnumerable GetIssues(BaseRefactoringContext context) + { + var gatherer = new GatherVisitor(context, tryResolve); + var issues = gatherer.GetIssues(); + return issues; + } + #endregion + + class GatherVisitor : GatherVisitorBase + { + bool tryResolve; + + public GatherVisitor(BaseRefactoringContext context, bool tryResolve) : base (context) + { + this.tryResolve = tryResolve; + } + + public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) + { + methodDeclaration.Attributes.AcceptVisitor(this); + if (HasEntryPointSignature(methodDeclaration)) + return; + var eligibleParameters = methodDeclaration.Parameters + .Where(p => p.ParameterModifier != ParameterModifier.Out && p.ParameterModifier != ParameterModifier.Ref) + .ToList(); + if (eligibleParameters.Count == 0) + return; + var declarationResolveResult = ctx.Resolve(methodDeclaration) as MemberResolveResult; + if (declarationResolveResult == null) + return; + var member = declarationResolveResult.Member; + if (member.IsOverride || member.IsOverridable || member.ImplementedInterfaceMembers.Any()) + return; + + var collector = new TypeCriteriaCollector(ctx); + methodDeclaration.AcceptVisitor(collector); + + foreach (var parameter in eligibleParameters) { + ProcessParameter(parameter, methodDeclaration.Body, collector); + } + } + + bool HasEntryPointSignature(MethodDeclaration methodDeclaration) + { + if (!methodDeclaration.Modifiers.HasFlag(Modifiers.Static)) + return false; + var returnType = ctx.Resolve(methodDeclaration.ReturnType).Type; + if (!returnType.IsKnownType(KnownTypeCode.Int32) && !returnType.IsKnownType(KnownTypeCode.Void)) + return false; + var parameterCount = methodDeclaration.Parameters.Count; + if (parameterCount == 0) + return true; + if (parameterCount != 1) + return false; + var parameterType = ctx.Resolve(methodDeclaration.Parameters.First()).Type as ArrayType; + return parameterType != null && parameterType.ElementType.IsKnownType(KnownTypeCode.String); + } + + void ProcessParameter(ParameterDeclaration parameter, AstNode rootResolutionNode, TypeCriteriaCollector collector) + { + var localResolveResult = ctx.Resolve(parameter) as LocalResolveResult; + if (localResolveResult == null) + return; + var variable = localResolveResult.Variable; + var typeKind = variable.Type.Kind; + if (!(typeKind == TypeKind.Class || + typeKind == TypeKind.Struct || + typeKind == TypeKind.Interface || + typeKind == TypeKind.Array) || + !collector.UsedVariables.Contains(variable)) + { + return; + } + + var candidateTypes = localResolveResult.Type.GetAllBaseTypes() + .Where(t => t.IsParameterized) + .ToList(); + + var validTypes = + (from type in candidateTypes + where !tryResolve || ParameterCanBeDemotedIssue.TypeChangeResolvesCorrectly(ctx, parameter, rootResolutionNode, type) + select type).ToList(); + if (!validTypes.Any()) return; + + var foundType = validTypes.FirstOrDefault(); + if (foundType == null) + return; + + AddIssue(parameter.NameToken, string.Format(ctx.TranslateString("Parameter can be {0}"), + foundType.Name), + script => script.Replace(parameter.Type, CreateShortType(ctx, foundType, parameter))); + } + + public static AstType CreateShortType(BaseRefactoringContext refactoringContext, IType expressionType, AstNode node) + { + + var csResolver = refactoringContext.Resolver.GetResolverStateBefore(node); + var builder = new TypeSystemAstBuilder(csResolver); + return builder.ConvertType(expressionType); + } + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs new file mode 100644 index 0000000000..3b2023a10c --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs @@ -0,0 +1,96 @@ +// +// RemoveFieldRefactoryActionTests.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using NUnit.Framework; + +namespace ICSharpCode.NRefactory.CSharp.CodeActions +{ + [TestFixture] + public class RemoveFieldRefactoryActionTests : ContextActionTestBase + { + [Test] + public void RemoveOneField() + { + Test( + @" +class A { + int $field; +} +", + @" +class A { +} +" + );} + + [Test] + public void RemoveOneFieldAndAssignmentValue() + { + Test( + @" +class A { + int $field; + A() { + field = 3; + } +} +", + @" +class A { + A() { + } +} +" + ); + } + + [Test] + public void RemoveOneFieldAndAssignmentValueAndMethodCall() + { + Test( + @" +class A { + int $field; + A() { + field = 3; +if(field!=0) + Method(field); + } +} +", + @" +class A { + A() { +if(TODO!=0) + Method(TODO); + } +} +" + ); + } + } +} + diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToStaticMethodActionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ConvertToStaticMethodIssueTests.cs similarity index 57% rename from ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToStaticMethodActionTests.cs rename to ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ConvertToStaticMethodIssueTests.cs index 2b8a224406..a32fa16d80 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToStaticMethodActionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ConvertToStaticMethodIssueTests.cs @@ -1,10 +1,10 @@ // -// ConvertToStaticMethodActionTests.cs +// ConvertToStaticMethodIssue.cs // // Author: -// Ciprian Khlud +// Ciprian Khlud // -// Copyright (c) 2013 Ciprian Khlud +// Copyright (c) 2013 Ciprian Khlud // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,50 +23,53 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -using ICSharpCode.NRefactory.CSharp.Refactoring; + using NUnit.Framework; +using ICSharpCode.NRefactory.CSharp.Refactoring; -namespace ICSharpCode.NRefactory.CSharp.CodeActions { - [TestFixture] - public class ConvertToStaticMethodActionTests : ContextActionTestBase - { - [Test] - public void Test() - { - Test( - @"class TestClass +namespace ICSharpCode.NRefactory.CSharp.CodeIssues +{ + [TestFixture] + public class ConvertToStaticMethodIssueTests : InspectionActionTestBase + { + + [Test] + public void Test() + { + Test( + @"class TestClass { void $Test () { int a = 2; } }", - @"class TestClass + @"class TestClass { static void Test () { int a = 2; } }" - ); - } - [Test] - public void TestWithVirtualFunction() { - - var input = @"class TestClass + ); + } + [Test] + public void TestWithVirtualFunction() { + + var input = @"class TestClass { public virtual void $Test () { int a = 2; } -}"; - TestWrongContext(input); - } - - [Test] - public void TestWithInterface() { - - var input = @"interface IBase { +}"; + TestWrongContext(input); + } + + [Test] + public void TestWithInterface() { + + var input = @"interface IBase { void Test(); } class TestClass : IBase @@ -76,20 +79,22 @@ class TestClass : IBase int a = 2; } }"; - TestWrongContext(input); - } - [Test] - public void TestWithStaticFunction() - { - - var input = @"class TestClass + TestWrongContext(input); + } + [Test] + public void TestWithStaticFunction() + { + + var input = @"class TestClass { static void $Test () { int a = 2; } }"; - TestWrongContext(input); - } - } -} \ No newline at end of file + TestWrongContext(input); + } + + } + +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs new file mode 100644 index 0000000000..d5283702bb --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/DuplicateBodyMethodIssueTests.cs @@ -0,0 +1,92 @@ +// +// DuplicateBodyMethodIssueTests.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using NUnit.Framework; +using ICSharpCode.NRefactory.CSharp.Refactoring; + +namespace ICSharpCode.NRefactory.CSharp.CodeIssues +{ + + [TestFixture] + public class DuplicateBodyMethodIssueTests : InspectionActionTestBase + { + + [Test] + public void Test() + { + Test( + @"class TestClass { + void Test () + { + int a = 2; + } + void $Test2 () { + int a = 2; + } +}", + @"class TestClass { + void Test () + { + int a = 2; + } + void Test2 () { + Test (); + } +} +" + ); + } + [Test] + public void TestNonVoid() + { + Test( + @"class TestClass { + int Test () + { + int a = 2; + return a; + } + int $Test2 () { + int a = 2; + return a; + } +}", + @"class TestClass { + int Test () + { + int a = 2; + return a; + } + int Test2 () { + return Test (); + } +} +" + ); + } + } + +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs index dda08566be..dd6fb0d6de 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionOfCompatibleTypeCastIssueTests.cs @@ -44,20 +44,79 @@ class TestClass Base x; x = i; } +}"; + Test(input, 0); + } + + [Test] + public void TestConversionDoubleFloat() + { + var input = @" +class Foo +{ + void Bar () { + double c = 3.5; + float fc; + fc = c; + } }"; var output = @" -class Base {} -class Test: Base {} +class Foo +{ + void Bar (){ + double c = 3.5; + float fc; + fc = (float)c; + } +}"; + //TODO: + //Test is failing as conversion seems to have a bug that + //considers that double is implicit convertible to float, + //when should it be explicitly convertible to float + + //Test(input, output); + } + + [Test] + public void TestConversionEnumToInt() + { + var input = @" +class Foo +{ + enum Enum { Zero } + void Bar () { + var e = Enum.Zero; + int val; + val = e; + } +}"; + var output = @" +class Foo +{ + enum Enum { Zero } + void Bar () { + var e = Enum.Zero; + int val; + val = (Enum)e; + } +}"; + Test(input, output); + } + + [Test] + public void TestConversionSameType() + { + var input = @" class TestClass { - void TestMethod (Test i) + void TestMethod () { - Base x; - x = (Test)i; + int x =0; + int y = 1; + $x = i; } }"; - Test(input, output); + Test(input, 0); } - } } \ No newline at end of file diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs index f20d38102f..ecef790c70 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/InspectionActionTestBase.cs @@ -95,6 +95,12 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues Assert.AreEqual (1, issues.Count); CheckFix (context, issues[0], output, fixIndex); } + + protected static void TestWrongContext (string input) + where T : ICodeIssueProvider, new () + { + Test(input, 0); + } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs new file mode 100644 index 0000000000..2ad475e739 --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeIEnumerableTests.cs @@ -0,0 +1,98 @@ +// +// ParameterCanBeIEnumerableTests.cs +// +// Author: +// Ciprian Khlud +// +// Copyright (c) 2013 Ciprian Khlud +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using NUnit.Framework; +using ICSharpCode.NRefactory.CSharp.CodeActions; +using ICSharpCode.NRefactory.CSharp.Refactoring; + +namespace ICSharpCode.NRefactory.CSharp.CodeIssues +{ + [TestFixture] + public class ParameterCanBeIEnumerableTests : InspectionActionTestBase + { + [Test] + public void CheckIEnumerable() + { + var input = @" +using System.Collections.Generic; +class TestClass +{ + void Write(string[] texts) + { + foreach(var item in texts) { } + } +}"; + TestRefactoringContext context; + var issues = GetIssues(new ParameterCanBeIEnumerableIssue(), input, out context); + Assert.AreEqual(1, issues.Count); + var issue = issues[0]; + // Suggested types: IList and IReadOnlyList + Assert.AreEqual(1, issue.Actions.Count); + + CheckFix(context, issues[0], @" +using System.Collections.Generic; +class TestClass +{ + void Write(IEnumerable texts) + { + foreach(var item in texts) { } + } +}"); + } + [Test] + public void CheckIList() + { + var input = @" +using System.Collections.Generic; +class TestClass +{ + void Write(List texts) + { + if(texts.Count == 0)return; + foreach(var item in texts) { } + } +}"; + TestRefactoringContext context; + var issues = GetIssues(new ParameterCanBeIEnumerableIssue(), input, out context); + Assert.AreEqual(1, issues.Count); + var issue = issues[0]; + // Suggested types: IList and IReadOnlyList + Assert.AreEqual(1, issue.Actions.Count); + + CheckFix(context, issues[0], @" +using System.Collections.Generic; +class TestClass +{ + void Write(ICollection texts) + { + if(texts.Count == 0)return; + foreach(var item in texts) { } + } +}"); + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index bdae167fa6..08aa57084b 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -109,7 +109,6 @@ - @@ -410,6 +409,10 @@ + + + + From 3dcad6981056d176dc55b6fc396bbb923ca14444 Mon Sep 17 00:00:00 2001 From: Ciprian Khlud Date: Sun, 28 Apr 2013 13:19:06 +0300 Subject: [PATCH 14/14] Remove "Remove Field Refactory" as it is dangerous. --- .../ICSharpCode.NRefactory.CSharp.csproj | 12 +- ...veFieldRefactoryActionRefactoringAction.cs | 110 ------------------ .../RemoveFieldRefactoryActionTests.cs | 96 --------------- .../ICSharpCode.NRefactory.Tests.csproj | 15 +-- NRefactory.suo | Bin 0 -> 3072 bytes 5 files changed, 3 insertions(+), 230 deletions(-) delete mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs delete mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs create mode 100644 NRefactory.suo diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index bf5e6b4bc3..2a1aa591af 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -534,7 +534,6 @@ - @@ -546,16 +545,7 @@ - - - - - - - - - - + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs deleted file mode 100644 index 7f44799942..0000000000 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/RemoveFieldRefactoryActionRefactoringAction.cs +++ /dev/null @@ -1,110 +0,0 @@ -// -// RemoveField.cs -// -// Author: -// Ciprian Khlud -// -// Copyright (c) 2013 Ciprian Khlud -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using ICSharpCode.NRefactory.CSharp.Refactoring; -using System.Collections.Generic; -using ICSharpCode.NRefactory.CSharp.Resolver; -using ICSharpCode.NRefactory.Semantics; - -namespace ICSharpCode.NRefactory.CSharp -{ - [ContextAction("Removes a field from a class", Description = "It removes also the empty assingments and the usages")] - public class RemoveFieldRefactoryAction : ICodeActionProvider - { - public IEnumerable GetActions(RefactoringContext context) - { - var fieldDeclaration = GetFieldDeclaration(context); - if(fieldDeclaration==null) - yield break; - - - yield return new CodeAction(string.Format(context.TranslateString("Remove field '{0}'"), fieldDeclaration.Name) - , script => GenerateNewScript( - script, fieldDeclaration, context), fieldDeclaration); - } - - - void GenerateNewScript(Script script, FieldDeclaration fieldDeclaration, RefactoringContext context) - { - var firstOrNullObject = fieldDeclaration.Variables.FirstOrNullObject(); - if(firstOrNullObject==null) - return; - var matchedNodes = ComputeMatchNodes(context, firstOrNullObject); - - foreach (var matchNode in matchedNodes) - { - var parent = matchNode.Parent; - if (matchNode is VariableInitializer) - { - script.Remove(parent); - } - else - if (matchNode is IdentifierExpression) - { - if(parent is AssignmentExpression) - { - script.Remove(parent.Parent); - } - else - { - var clone = (IdentifierExpression)matchNode.Clone(); - clone.Identifier = "TODO"; - script.Replace(matchNode, clone); - } - } - } - } - - private static List ComputeMatchNodes(RefactoringContext context, VariableInitializer firstOrNullObject) - { - var referenceFinder = new FindReferences(); - var matchedNodes = new List(); - - var resolveResult = context.Resolver.Resolve(firstOrNullObject); - var member = resolveResult as MemberResolveResult; - if (member == null)//not a member is unexpected case, so is better to return no match than to break the code - return matchedNodes; - - FoundReferenceCallback callback = (matchNode, result) => matchedNodes.Add(matchNode); - - var searchScopes = referenceFinder.GetSearchScopes(member.Member); - referenceFinder.FindReferencesInFile(searchScopes, - context.UnresolvedFile, - context.RootNode as SyntaxTree, - context.Compilation, callback, - context.CancellationToken); - return matchedNodes; - } - - FieldDeclaration GetFieldDeclaration(RefactoringContext context) - { - var result = context.GetNode(); - - return result; - } - } -} - diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs deleted file mode 100644 index 3b2023a10c..0000000000 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/RemoveFieldRefactoryActionTests.cs +++ /dev/null @@ -1,96 +0,0 @@ -// -// RemoveFieldRefactoryActionTests.cs -// -// Author: -// Ciprian Khlud -// -// Copyright (c) 2013 Ciprian Khlud -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -using NUnit.Framework; - -namespace ICSharpCode.NRefactory.CSharp.CodeActions -{ - [TestFixture] - public class RemoveFieldRefactoryActionTests : ContextActionTestBase - { - [Test] - public void RemoveOneField() - { - Test( - @" -class A { - int $field; -} -", - @" -class A { -} -" - );} - - [Test] - public void RemoveOneFieldAndAssignmentValue() - { - Test( - @" -class A { - int $field; - A() { - field = 3; - } -} -", - @" -class A { - A() { - } -} -" - ); - } - - [Test] - public void RemoveOneFieldAndAssignmentValueAndMethodCall() - { - Test( - @" -class A { - int $field; - A() { - field = 3; -if(field!=0) - Method(field); - } -} -", - @" -class A { - A() { -if(TODO!=0) - Method(TODO); - } -} -" - ); - } - } -} - diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index 08aa57084b..04902be570 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -1,4 +1,4 @@ - + {63D3B27A-D966-4902-90B3-30290E1692F1} @@ -409,7 +409,6 @@ - @@ -435,17 +434,7 @@ False - - - - - - - - - - - + diff --git a/NRefactory.suo b/NRefactory.suo new file mode 100644 index 0000000000000000000000000000000000000000..cb425d482667ddc550fd81d6ade9dc6610b411db GIT binary patch literal 3072 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*3Bx2!nwD0|OI~0pkDr|NlQkkbwcn90fxt z1pWfu3W`4vW`V}#5OV&gQz;CAAclM(EMZV!aAn8?(nSoFu&hiJEylnK&-2U#bS!9I zz2&F#IYyAW1E9hK2m*jM<}+k5cmi!t1F~EhDj*U>l48J82ssFd)W!fTzQDkrp%m!r z9EMDw{UDsq5Dere0&yzXEhYpER3XEDP?>25El3I3Z%o*JMvzgU-~@#O0p(z6P?;_T zwI7u4L3%-P0?PlaKnxON2htos%n8I?P%)7CqhNT20QVF@*|d+0ZcQJwlUoaee*>eM zBrt=?nZb%7h9Q)p7?@*47sx9E(r!Q(rvgiY6bw@;8Ibj%yBT5!vI;$*EyWDUyH!Gr)$SH-TM|8W{-a_E zP;Np`I}8k87zZ}|LV$iQ28KQ;-jKtcx?zT}1rj!L8@VoiI(+n2`8D%v^0~VtK&1|5 N*pQSEM-`J50sw)RZxjFk literal 0 HcmV?d00001