From e715487c27a62cfbc0cad2600bdf075175b0fdba Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 3 Jul 2024 22:46:55 +0200 Subject: [PATCH 01/32] chore: poc of basic abstractions --- .gitignore | 3 +- .../java-driver/build.gradle.kts | 50 +++++ .../javadriver/glossary/Abstraction.kt | 26 +++ .../AbstractRepositoryDaoAbstraction.kt | 14 ++ .../abstractions/RepositoryDaoAbstraction.kt | 46 +++++ .../dialects/javadriver/IntegrationTest.kt | 171 ++++++++++++++++++ .../AbstractRepositoryDaoAbstractionTest.kt | 45 +++++ .../RepositoryDaoAbstractionTest.kt | 62 +++++++ settings.gradle.kts | 3 +- 9 files changed, 418 insertions(+), 2 deletions(-) create mode 100644 packages/mongodb-dialects/java-driver/build.gradle.kts create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt diff --git a/.gitignore b/.gitignore index 74208f68..7cc99355 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,5 @@ packages/jetbrains-plugin/src/main/resources/build.properties /**/video /**/.DS_Store -FAKE_BROWSER_OUTPUT \ No newline at end of file +FAKE_BROWSER_OUTPUT +/.kotlin \ No newline at end of file diff --git a/packages/mongodb-dialects/java-driver/build.gradle.kts b/packages/mongodb-dialects/java-driver/build.gradle.kts new file mode 100644 index 00000000..5070281c --- /dev/null +++ b/packages/mongodb-dialects/java-driver/build.gradle.kts @@ -0,0 +1,50 @@ +repositories { + maven("https://www.jetbrains.com/intellij-repository/releases/") + maven("https://packages.jetbrains.team/maven/p/ij/intellij-dependencies") +} + +plugins { + alias(libs.plugins.intellij) +} + +tasks { + named("test", Test::class) { + environment("TESTCONTAINERS_RYUK_DISABLED", "true") + val homePath = + project.layout.buildDirectory + .dir("idea-sandbox/config-test") + .get() + .asFile.absolutePath + + jvmArgs( + listOf( + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt=ALL-UNNAMED", + "--add-opens=java.desktop/javax.swing=ALL-UNNAMED", + "--add-opens=java.desktop/sun.awt=ALL-UNNAMED", + "-Dpolyglot.engine.WarnInterpreterOnly=false", + "-Dpolyglot.log.level=OFF", + "-Didea.home.path=$homePath", + ), + ) + } +} + +intellij { + version.set(libs.versions.intellij.min) // Target IDE Version + type.set(libs.versions.intellij.type) // Target IDE Platform + + plugins.set(listOf("com.intellij.java", "com.intellij.database")) +} + +dependencies { + implementation(project(":packages:mongodb-mql-model")) + + testImplementation("com.jetbrains.intellij.platform:test-framework-junit5:241.15989.155") { + exclude("ai.grazie.spell") + exclude("ai.grazie.utils") + exclude("ai.grazie.nlp") + exclude("ai.grazie.model") + exclude("org.jetbrains.teamcity") + } +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt new file mode 100644 index 00000000..84586130 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt @@ -0,0 +1,26 @@ +/** + * Defines an interface for all abstractions that will be analysed for the Java + * driver. + */ + +package com.mongodb.jbplugin.dialects.javadriver.glossary + +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement +import com.intellij.psi.util.childrenOfType +import com.intellij.psi.util.parentOfType + +/** + * Represents an abstraction defined in the glossary document. + */ +interface Abstraction { + fun isIn(psiElement: PsiElement): Boolean +} + +/** + * Helper extension function to get the containing class of any element. + * + * @return + */ +fun PsiElement.findContainingClass(): PsiClass = parentOfType(withSelf = true) + ?: childrenOfType().first() diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt new file mode 100644 index 00000000..f2695d3a --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt @@ -0,0 +1,14 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiElement +import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction +import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass + +object AbstractRepositoryDaoAbstraction : Abstraction { + override fun isIn(psiElement: PsiElement): Boolean { + val containingClass = psiElement.findContainingClass() + containingClass.superClass ?: return false + + return RepositoryDaoAbstraction.isIn(containingClass.superClass?.originalElement!!) + } +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt new file mode 100644 index 00000000..2b526702 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt @@ -0,0 +1,46 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiElement +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.util.PsiTypesUtil +import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction +import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass + +object RepositoryDaoAbstraction : Abstraction { + override fun isIn(psiElement: PsiElement): Boolean { + val containingClass = psiElement.findContainingClass() + val classNameLowerCase = containingClass.name?.lowercase() ?: return false + + val nameIsValid = classNameLowerCase.endsWith("repository") || classNameLowerCase.endsWith("dao") + if (!nameIsValid) { + return false + } + + val javaFacade = JavaPsiFacade.getInstance(psiElement.project) + val mdbClientClass = + javaFacade.findClass( + "com.mongodb.client.MongoClient", + GlobalSearchScope.everythingScope(psiElement.project), + ) + + val mdbDatabaseClass = + javaFacade.findClass( + "com.mongodb.client.MongoDatabase", + GlobalSearchScope.everythingScope(psiElement.project), + ) + + val mdbCollectionClass = + javaFacade.findClass( + "com.mongodb.client.MongoCollection", + GlobalSearchScope.everythingScope(psiElement.project), + ) + + return containingClass.allFields.any { + val typeClass = PsiTypesUtil.getPsiClass(it.type) + typeClass == mdbClientClass || + typeClass == mdbDatabaseClass || + typeClass == mdbCollectionClass + } + } +} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt new file mode 100644 index 00000000..460a8bba --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt @@ -0,0 +1,171 @@ +/** + * Class that contains the JUnit5 extension to run tests + * that use the IntelliJ Java parser. + */ + +package com.mongodb.jbplugin.dialects.javadriver + +import com.intellij.java.library.JavaLibraryUtil +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.module.ModuleUtilCore +import com.intellij.openapi.project.DumbService +import com.intellij.openapi.project.Project +import com.intellij.openapi.project.guessProjectDir +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiFile +import com.intellij.psi.util.childrenOfType +import com.intellij.testFramework.PsiTestUtil +import com.intellij.testFramework.fixtures.CodeInsightTestFixture +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory +import org.intellij.lang.annotations.Language +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.* +import java.lang.reflect.Method +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicReference +import kotlin.io.path.Path +import kotlin.io.path.absolutePathString + +@Retention(AnnotationRetention.RUNTIME) +@Test +annotation class ParsingTest( + val fileName: String, + @Language("java") val value: String, +) + +/** + * Annotation to be used in the test, at the class level. + * + * @see com.mongodb.jbplugin.accessadapter.datagrip.adapter.DataGripMongoDbDriverTest + */ +@ExtendWith(IntegrationTestExtension::class) +annotation class IntegrationTest + +/** + * Extension implementation. Must not be used directly. + */ +internal class IntegrationTestExtension : + BeforeAllCallback, + AfterAllCallback, + BeforeEachCallback, + InvocationInterceptor, + ParameterResolver { + private val namespace = ExtensionContext.Namespace.create(IntegrationTestExtension::class.java) + private val testFixtureKey = "TESTFIXTURE" + + override fun beforeAll(context: ExtensionContext) { + val projectFixture = + IdeaTestFixtureFactory.getFixtureFactory().createLightFixtureBuilder(context.requiredTestClass.simpleName) +.fixture + + val testFixture = + IdeaTestFixtureFactory + .getFixtureFactory() + .createCodeInsightFixture( + projectFixture, + ) + + context.getStore(namespace).put(testFixtureKey, testFixture) + testFixture.setUp() + + ApplicationManager.getApplication().invokeLater { + if (!JavaLibraryUtil.hasLibraryJar(testFixture.module, "org.mongodb:mongodb-driver-sync:5.1.1")) { + PsiTestUtil.addProjectLibrary( + testFixture.module, + "mongodb-driver-sync", + listOf( + Path( + "src/test/resources/mongodb-driver-sync-5.1.1.jar", + ).toAbsolutePath().toString(), + ), + ) + } + } + + PsiTestUtil.addSourceRoot(testFixture.module, testFixture.project.guessProjectDir()!!) + } + + override fun beforeEach(context: ExtensionContext) { + val fixture = context.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + + ApplicationManager.getApplication().invokeAndWait { + val parsingTest = context.requiredTestMethod.getAnnotation(ParsingTest::class.java) + val path = ModuleUtilCore.getModuleDirPath(fixture.module) + val fileName = Path(path, "src", "main", "java", parsingTest.fileName).absolutePathString() + fixture.configureByText( + fileName, + parsingTest.value, + ) + } + } + + override fun interceptTestMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext, + ) { + val throwable: AtomicReference = AtomicReference(null) + val finished = AtomicBoolean(false) + + val fixture = extensionContext.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + val dumbService = fixture.project.getService(DumbService::class.java) + dumbService.runWhenSmart { + val result = + runCatching { + invocation.proceed() + } + result.onSuccess { + finished.set(true) + } + + result.onFailure { + finished.set(true) + throwable.set(it) + } + } + + while (!finished.get()) { + Thread.sleep(1) + } + + throwable.get()?.let { throw it } + } + + override fun afterAll(context: ExtensionContext) { + val testFixture = context.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + + ApplicationManager.getApplication().invokeAndWait { + testFixture.tearDown() + } + } + + override fun supportsParameter( + parameterContext: ParameterContext, + extensionContext: ExtensionContext, + ): Boolean = + parameterContext.parameter.type == Project::class.java || + parameterContext.parameter.type == CodeInsightTestFixture::class.java || + parameterContext.parameter.type == PsiFile::class.java || + parameterContext.parameter.type == JavaPsiFacade::class.java + + override fun resolveParameter( + parameterContext: ParameterContext, + extensionContext: ExtensionContext, + ): Any { + val fixture = extensionContext.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + + return when (parameterContext.parameter.type) { + Project::class.java -> fixture.project + CodeInsightTestFixture::class.java -> fixture + PsiFile::class.java -> fixture.file + JavaPsiFacade::class.java -> JavaPsiFacade.getInstance(fixture.project) + else -> TODO("Parameter of type ${parameterContext.parameter.type.canonicalName} is not supported.") + } + } +} + +fun PsiFile.getClassByName(name: String): PsiClass = + childrenOfType().first { + it.name == name + } diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt new file mode 100644 index 00000000..8068a6a0 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt @@ -0,0 +1,45 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiFile +import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest +import com.mongodb.jbplugin.dialects.javadriver.ParsingTest +import com.mongodb.jbplugin.dialects.javadriver.getClassByName +import org.junit.jupiter.api.Assertions.* + +@IntegrationTest +class AbstractRepositoryDaoAbstractionTest { + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; + +public abstract class AbstractRepository { + private final MongoClient client; +} + +public final class Repository extends AbstractRepository { +} + """, + ) + fun `does apply if the class extends a repository`(psiFile: PsiFile) { + val classToAnalyse = psiFile.getClassByName("Repository") + assertTrue(AbstractRepositoryDaoAbstraction.isIn(classToAnalyse)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; + +public abstract class MyService { +} + +public final class Repository extends AbstractRepository { +} + """, + ) + fun `does not apply if the class extends a another class but is not a repository`(psiFile: PsiFile) { + val classToAnalyse = psiFile.getClassByName("Repository") + assertFalse(AbstractRepositoryDaoAbstraction.isIn(classToAnalyse)) + } +} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt new file mode 100644 index 00000000..c68adec0 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt @@ -0,0 +1,62 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiFile +import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest +import com.mongodb.jbplugin.dialects.javadriver.ParsingTest +import org.junit.jupiter.api.Assertions.* + +@IntegrationTest +class RepositoryDaoAbstractionTest { + @ParsingTest( + "Repository.java", + """ +public final class Repository { +} + """, + ) + fun `does not apply if the class is named repository but it does not use the driver`(psiFile: PsiFile) { + assertFalse(RepositoryDaoAbstraction.isIn(psiFile)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; + +public final class Repository { + private final MongoClient client; +} + """, + ) + fun `does apply if the class contains references to the client`(psiFile: PsiFile) { + assertTrue(RepositoryDaoAbstraction.isIn(psiFile)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoDatabase; + +public final class Repository { + private final MongoDatabase database; +} + """, + ) + fun `does apply if the class contains references to a database`(psiFile: PsiFile) { + assertTrue(RepositoryDaoAbstraction.isIn(psiFile)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoCollection; + +public final class Repository { + private final MongoCollection collection; +} + """, + ) + fun `does apply if the class contains references to a collection`(psiFile: PsiFile) { + assertTrue(RepositoryDaoAbstraction.isIn(psiFile)) + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 834348c4..539a1177 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,9 +11,10 @@ pluginManagement { include( "packages:mongodb-mql-model", "packages:mongodb-dialects", + "packages:mongodb-dialects:java-driver", "packages:mongodb-autocomplete-engine", "packages:mongodb-linting-engine", "packages:mongodb-access-adapter", "packages:mongodb-access-adapter:datagrip-access-adapter", "packages:jetbrains-plugin", -) \ No newline at end of file +) From 4446cb04bed66fbd5663d4561b687e32267cfe37 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 3 Jul 2024 22:56:32 +0200 Subject: [PATCH 02/32] chore: check constructor injection --- .../ConstructorInjectionAbstraction.kt | 18 ++++++ .../ConstructorInjectionAbstractionTest.kt | 60 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt new file mode 100644 index 00000000..b0ef2e14 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt @@ -0,0 +1,18 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiElement +import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction +import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass + +object ConstructorInjectionAbstraction : Abstraction { + override fun isIn(psiElement: PsiElement): Boolean { + val containingClass = psiElement.findContainingClass() + if (!AbstractRepositoryDaoAbstraction.isIn(containingClass)) { + return false + } + + return containingClass.constructors.any { + it.text.contains("super(") + } + } +} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt new file mode 100644 index 00000000..3f45890c --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt @@ -0,0 +1,60 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiFile +import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest +import com.mongodb.jbplugin.dialects.javadriver.ParsingTest +import com.mongodb.jbplugin.dialects.javadriver.getClassByName +import org.junit.jupiter.api.Assertions.* + +@IntegrationTest +class ConstructorInjectionAbstractionTest { + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; + +abstract class AbstractRepository { + private final MongoClient client; + + protected Repository(MongoClient client) { + this.client = client; + } +} + +public class Repository extends AbstractRepository { + public Repository(MongoClient client) { + super(client); + } +} + """, + ) + fun `does apply if the class depends on a repository super constructor`(psiFile: PsiFile) { + val repository = psiFile.getClassByName("Repository") + assertTrue(ConstructorInjectionAbstraction.isIn(repository)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; + +abstract class AbstractRepository { + private final MongoClient client; + + protected Repository(MongoClient client) { + this.client = client; + } +} + +public class Repository extends AbstractRepository { + public Repository(MongoClient client) { + + } +} + """, + ) + fun `does not apply if does not call super constructor`(psiFile: PsiFile) { + val repository = psiFile.getClassByName("Repository") + assertFalse(ConstructorInjectionAbstraction.isIn(repository)) + } +} From 35ebbc48766067e48efd29c1fee56b2854fa75bf Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 3 Jul 2024 23:22:22 +0200 Subject: [PATCH 03/32] chore: support for more abstractions --- .../javadriver/glossary/Abstraction.kt | 42 +++++- .../DriverInFactoryMethodAbstraction.kt | 49 +++++++ .../abstractions/RepositoryDaoAbstraction.kt | 30 +---- .../dialects/javadriver/IntegrationTest.kt | 18 ++- .../DriverInFactoryMethodAbstractionTest.kt | 126 ++++++++++++++++++ 5 files changed, 233 insertions(+), 32 deletions(-) create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt index 84586130..09bdf0b8 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt @@ -5,8 +5,13 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary +import com.intellij.openapi.project.Project +import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement +import com.intellij.psi.PsiType +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.util.PsiTypesUtil import com.intellij.psi.util.childrenOfType import com.intellij.psi.util.parentOfType @@ -22,5 +27,38 @@ interface Abstraction { * * @return */ -fun PsiElement.findContainingClass(): PsiClass = parentOfType(withSelf = true) - ?: childrenOfType().first() +fun PsiElement.findContainingClass(): PsiClass = + parentOfType(withSelf = true) + ?: childrenOfType().first() + +/** + * Helper function to check if a type is a MongoDB Class + * + * @param project + * @return + */ +fun PsiType.isMongoDbClass(project: Project): Boolean { + val javaFacade = JavaPsiFacade.getInstance(project) + val mdbClientClass = + javaFacade.findClass( + "com.mongodb.client.MongoClient", + GlobalSearchScope.everythingScope(project), + ) + + val mdbDatabaseClass = + javaFacade.findClass( + "com.mongodb.client.MongoDatabase", + GlobalSearchScope.everythingScope(project), + ) + + val mdbCollectionClass = + javaFacade.findClass( + "com.mongodb.client.MongoCollection", + GlobalSearchScope.everythingScope(project), + ) + + val typeClass = PsiTypesUtil.getPsiClass(this) + return typeClass == mdbClientClass || + typeClass == mdbDatabaseClass || + typeClass == mdbCollectionClass +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt new file mode 100644 index 00000000..77492bd0 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt @@ -0,0 +1,49 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiMethodCallExpression +import com.intellij.psi.util.PsiTreeUtil +import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction +import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass +import com.mongodb.jbplugin.dialects.javadriver.glossary.isMongoDbClass + +object DriverInFactoryMethodAbstraction : Abstraction { + override fun isIn(psiElement: PsiElement): Boolean { + val containingClass = psiElement.findContainingClass() + + if (!AbstractRepositoryDaoAbstraction.isIn(containingClass) && !RepositoryDaoAbstraction.isIn(containingClass) + ) { + return false + } + + val allMethodCallExpressions = PsiTreeUtil.findChildrenOfType(psiElement, PsiMethodCallExpression::class.java) + + val callsReturningMongoDbObjects = + allMethodCallExpressions.filter { + it.methodExpression.qualifierExpression + ?.type + ?.isMongoDbClass(psiElement.project) == true + } + + val methodsOfPreviousCalls = + callsReturningMongoDbObjects + .mapNotNull { + it.methodExpression.reference?.resolve() + }.filterIsInstance() + + return methodsOfPreviousCalls.any { + val methodCalls = + PsiTreeUtil + .findChildrenOfType(psiElement, PsiMethodCallExpression::class.java) + + methodCalls.any { + it.methodExpression.qualifierExpression + ?.type + ?.isMongoDbClass(it.project) == true && + it.methodExpression.qualifiedName.contains("getDatabase") || + it.methodExpression.qualifiedName.contains("getCollection") + } + } + } +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt index 2b526702..effc63a4 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt @@ -1,11 +1,9 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions -import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiElement -import com.intellij.psi.search.GlobalSearchScope -import com.intellij.psi.util.PsiTypesUtil import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass +import com.mongodb.jbplugin.dialects.javadriver.glossary.isMongoDbClass object RepositoryDaoAbstraction : Abstraction { override fun isIn(psiElement: PsiElement): Boolean { @@ -17,30 +15,6 @@ object RepositoryDaoAbstraction : Abstraction { return false } - val javaFacade = JavaPsiFacade.getInstance(psiElement.project) - val mdbClientClass = - javaFacade.findClass( - "com.mongodb.client.MongoClient", - GlobalSearchScope.everythingScope(psiElement.project), - ) - - val mdbDatabaseClass = - javaFacade.findClass( - "com.mongodb.client.MongoDatabase", - GlobalSearchScope.everythingScope(psiElement.project), - ) - - val mdbCollectionClass = - javaFacade.findClass( - "com.mongodb.client.MongoCollection", - GlobalSearchScope.everythingScope(psiElement.project), - ) - - return containingClass.allFields.any { - val typeClass = PsiTypesUtil.getPsiClass(it.type) - typeClass == mdbClientClass || - typeClass == mdbDatabaseClass || - typeClass == mdbCollectionClass - } + return containingClass.allFields.any { it.type.isMongoDbClass(psiElement.project) } } } diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt index 460a8bba..194361c0 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt @@ -13,7 +13,9 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.project.guessProjectDir import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile +import com.intellij.psi.util.PsiUtil import com.intellij.psi.util.childrenOfType import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.fixtures.CodeInsightTestFixture @@ -56,8 +58,10 @@ internal class IntegrationTestExtension : override fun beforeAll(context: ExtensionContext) { val projectFixture = - IdeaTestFixtureFactory.getFixtureFactory().createLightFixtureBuilder(context.requiredTestClass.simpleName) -.fixture + IdeaTestFixtureFactory + .getFixtureFactory() + .createLightFixtureBuilder(context.requiredTestClass.simpleName) + .fixture val testFixture = IdeaTestFixtureFactory @@ -169,3 +173,13 @@ fun PsiFile.getClassByName(name: String): PsiClass = childrenOfType().first { it.name == name } + +fun PsiFile.getQueryAtMethod( + className: String, + methodName: String, +): PsiElement { + val actualClass = getClassByName(className) + val method = actualClass.allMethods.first { it.name == methodName } + val returnExpr = PsiUtil.findReturnStatements(method).last() + return returnExpr.returnValue!! +} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt new file mode 100644 index 00000000..dba94303 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt @@ -0,0 +1,126 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiFile +import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest +import com.mongodb.jbplugin.dialects.javadriver.ParsingTest +import com.mongodb.jbplugin.dialects.javadriver.getQueryAtMethod +import org.junit.jupiter.api.Assertions.* + +@IntegrationTest +class DriverInFactoryMethodAbstractionTest { + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; + +public abstract class AbstractRepository { + private final MongoClient client; + + protected MongoClient getClient() { + return client; + } +} + +public class Repository extends AbstractRepository { + public Repository(MongoClient client) { + super(client); + } + + public Document findAll() { + return getClient().getDatabase("my").getCollection("coll").find().toList(); + } +} + """, + ) + fun `does detect a factory method for a client`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findAll") + assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoDatabase; + +public abstract class AbstractRepository { + private final MongoDatabase db; + + protected MongoDatabase getDatabase() { + return db; + } +} + +public class Repository extends AbstractRepository { + public Repository(MongoDatabase db) { + super(db); + } + + public Document findAll() { + return getDatabase().getCollection("coll").find().toList(); + } +} + """, + ) + fun `does detect a factory method for a database`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findAll") + assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoCollection; + +public abstract class AbstractRepository { + private final MongoCollection collection; + + protected MongoCollection getCollection() { + return collection; + } +} + +public class Repository extends AbstractRepository { + public Repository(MongoCollection collection) { + super(collection); + } + + public Document findAll() { + return getCollection().find().toList(); + } +} + """, + ) + fun `does detect a factory method for a collection`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findAll") + assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; + + +public class Repository extends AbstractRepository { + private final MongoClient client; + + public Repository(MongoClient client) { + this.client = client; + } + + public MongoCollection getCollection() { + return client.getDatabase("myDb").getCollection("myColl"); + } + + public Document findAll() { + return getCollection().find().toList(); + } +} + """, + ) + fun `does detect a factory method in the same class`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findAll") + assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) + } +} From e034bd364abb6b2b961c165e558d213125889393 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 3 Jul 2024 23:28:21 +0200 Subject: [PATCH 04/32] chore: fix test --- .../abstractions/AbstractRepositoryDaoAbstractionTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt index 8068a6a0..ad118072 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt @@ -34,7 +34,7 @@ import com.mongodb.client.MongoClient; public abstract class MyService { } -public final class Repository extends AbstractRepository { +public final class Repository extends MyService { } """, ) From 431f85bca6fd9a9362c7806fdcd4ad293a602014 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 11:09:01 +0200 Subject: [PATCH 05/32] chore: support custom query dsl abstractions --- .../abstractions/CustomQueryDslAbstraction.kt | 52 +++++++++++ .../DriverInFactoryMethodAbstraction.kt | 4 +- .../CustomQueryDslAbstractionTest.kt | 86 +++++++++++++++++++ 3 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt new file mode 100644 index 00000000..62169ded --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt @@ -0,0 +1,52 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiMethodCallExpression +import com.intellij.psi.util.PsiTreeUtil +import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction +import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass +import com.mongodb.jbplugin.dialects.javadriver.glossary.isMongoDbClass + +object CustomQueryDslAbstraction : Abstraction { + override fun isIn(psiElement: PsiElement): Boolean { + if (!AbstractRepositoryDaoAbstraction.isIn(psiElement)) { + return false + } + + val containingClass = psiElement.findContainingClass() + val parentRepositoryClass = containingClass.superClass!! + + val queryLikeMethods = + containingClass.allMethods.filter { + it.name.startsWith("find") + } + + if (queryLikeMethods.isEmpty()) { + return false + } + + return queryLikeMethods.any { method -> + val allMethodCallExpressions = PsiTreeUtil.findChildrenOfType(method, PsiMethodCallExpression::class.java) + allMethodCallExpressions.any { methodCall -> + val methodCallName = methodCall.methodExpression.referenceName ?: return@any false + val isReferencedInParentClass = parentRepositoryClass.allMethods.any { it.name == methodCallName } + + if (isReferencedInParentClass) { + isIn(parentRepositoryClass) + } else { + false + } + } || + DriverInFactoryMethodAbstraction.isIn(method) || + isMethodUsingMongoDbClasses(method) + } + } + + private fun isMethodUsingMongoDbClasses(method: PsiMethod): Boolean = + PsiTreeUtil.findChildrenOfType(method, PsiMethodCallExpression::class.java).any { + it.methodExpression.qualifierExpression + ?.type + ?.isMongoDbClass(method.project) == true + } +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt index 77492bd0..16efef14 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt @@ -21,8 +21,8 @@ object DriverInFactoryMethodAbstraction : Abstraction { val callsReturningMongoDbObjects = allMethodCallExpressions.filter { - it.methodExpression.qualifierExpression - ?.type + it + .type ?.isMongoDbClass(psiElement.project) == true } diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt new file mode 100644 index 00000000..5b7f735e --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt @@ -0,0 +1,86 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions + +import com.intellij.psi.PsiFile +import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest +import com.mongodb.jbplugin.dialects.javadriver.ParsingTest +import com.mongodb.jbplugin.dialects.javadriver.getQueryAtMethod +import org.junit.jupiter.api.Assertions.* + +@IntegrationTest +class CustomQueryDslAbstractionTest { + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public abstract class AbstractRepository { + private final MongoCollection collection; + + protected AbstractRepository(MongoCollection collection) { + this.collection = collection; + } + + protected final T findById(ObjectId id) { + return this.getCollection().find(eq("_id", id)).first(); + } + + private MongoCollection getCollection() { + return this.collection; + } +} + +public final class UserRepository extends AbstractRepository { + public UserRepository(MongoClient client) { + super(client.getDatabase("production").getCollection("users", User.class)); + } + + public User findUserById(ObjectId id) { + return super.findById(id); + } +} + """, + ) + fun `applies for a class using methods from an abstract repository with a collection factory`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("UserRepository", "findUserById") + assertTrue(CustomQueryDslAbstraction.isIn(methodToAnalyse)) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public abstract class AbstractRepository { + private final MongoCollection collection; + + protected AbstractRepository(MongoCollection collection) { + this.collection = collection; + } + + protected final T findById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + +public final class UserRepository extends AbstractRepository { + public UserRepository(MongoClient client) { + super(client.getDatabase("production").getCollection("users", User.class)); + } + + public User findUserById(ObjectId id) { + return super.findById(id); + } +} + """, + ) + fun `applies for a class using methods from an abstract repository without a collection factory`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("UserRepository", "findUserById") + assertTrue(CustomQueryDslAbstraction.isIn(methodToAnalyse)) + } +} From 4f2c6a3600c07d952857f906e472b48a12da8b9f Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 14:28:16 +0200 Subject: [PATCH 06/32] chore: support for mms patterns --- .../javadriver/glossary/Abstraction.kt | 109 +++++- .../javadriver/glossary/NamespaceExtractor.kt | 310 ++++++++++++++++++ .../abstractions/CustomQueryDslAbstraction.kt | 12 +- .../glossary/NamespaceExtractorTest.kt | 132 ++++++++ 4 files changed, 540 insertions(+), 23 deletions(-) create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt index 09bdf0b8..912016e5 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt @@ -6,11 +6,9 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary import com.intellij.openapi.project.Project -import com.intellij.psi.JavaPsiFacade -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiType +import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTypesUtil import com.intellij.psi.util.childrenOfType import com.intellij.psi.util.parentOfType @@ -32,33 +30,118 @@ fun PsiElement.findContainingClass(): PsiClass = ?: childrenOfType().first() /** - * Helper function to check if a type is a MongoDB Class + * Helper function to check if a type is a MongoDB Collection * * @param project * @return */ -fun PsiType.isMongoDbClass(project: Project): Boolean { +fun PsiType.isMongoDbCollectionClass(project: Project): Boolean { val javaFacade = JavaPsiFacade.getInstance(project) - val mdbClientClass = + + val mdbCollectionClass = javaFacade.findClass( - "com.mongodb.client.MongoClient", + "com.mongodb.client.MongoCollection", GlobalSearchScope.everythingScope(project), ) + val typeClass = PsiTypesUtil.getPsiClass(this) + return typeClass == mdbCollectionClass +} + +/** + * Helper function to check if a type is a MongoDB Database + * + * @param project + * @return + */ +fun PsiType.isMongoDbDatabaseClass(project: Project): Boolean { + val javaFacade = JavaPsiFacade.getInstance(project) + val mdbDatabaseClass = javaFacade.findClass( "com.mongodb.client.MongoDatabase", GlobalSearchScope.everythingScope(project), ) - val mdbCollectionClass = + val typeClass = PsiTypesUtil.getPsiClass(this) + return typeClass == mdbDatabaseClass +} + +/** + * Helper function to check if a type is a MongoDB Database + * + * @param project + * @return + */ +fun PsiType.isMongoDbClientClass(project: Project): Boolean { + val javaFacade = JavaPsiFacade.getInstance(project) + + val mdbClientClass = javaFacade.findClass( - "com.mongodb.client.MongoCollection", + "com.mongodb.client.MongoClient", GlobalSearchScope.everythingScope(project), ) val typeClass = PsiTypesUtil.getPsiClass(this) - return typeClass == mdbClientClass || - typeClass == mdbDatabaseClass || - typeClass == mdbCollectionClass + return typeClass == mdbClientClass +} + +/** + * Helper function to check if a type is a MongoDB Class + * + * @param project + * @return + */ +fun PsiType.isMongoDbClass(project: Project): Boolean = + isMongoDbCollectionClass(project) || + isMongoDbDatabaseClass(project) || + isMongoDbClientClass(project) + +fun PsiMethod.isUsingMongoDbClasses(): Boolean = + PsiTreeUtil.findChildrenOfType(this, PsiMethodCallExpression::class.java).any { + it.methodExpression.qualifierExpression + ?.type + ?.isMongoDbClass(this.project) == true + } + +fun PsiMethod.findAllReferencesToMongoDbObjects(): List = + PsiTreeUtil + .findChildrenOfType(this, PsiExpression::class.java) + .filter { + it.type + ?.isMongoDbClass(this.project) == true + }.mapNotNull { it.reference } + +fun PsiMethodCallExpression.findCurrentReferenceToMongoDbObject(): PsiReference? { + if (methodExpression.type?.isMongoDbClass(project) == true) { + return methodExpression.reference + } else if (methodExpression.qualifierExpression is PsiSuperExpression || methodExpression.qualifierExpression is PsiThisExpression) { + val resolution = methodExpression.resolve() + if (resolution is PsiField) { + return if (resolution.type.isMongoDbClass(project)) resolution.reference else null + } else { + return (methodExpression.resolve() as PsiMethod?)?.findAllReferencesToMongoDbObjects()?.first() + } + } else { + if (methodExpression.qualifierExpression is PsiMethodCallExpression) { + return (methodExpression.qualifierExpression as PsiMethodCallExpression).findCurrentReferenceToMongoDbObject() + } + } + + return null +} + +fun PsiElement.collectTypeUntil( + type: Class, + stopWord: Class, +): List { + if (stopWord.isInstance(this)) { + return emptyList() + } + + if (type.isInstance(this)) { + return listOf(this as T) + (this.parent?.collectTypeUntil(type, stopWord) ?: emptyList()) + } + + return emptyList() } diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt new file mode 100644 index 00000000..7907a2a9 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -0,0 +1,310 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary + +import com.intellij.openapi.project.Project +import com.intellij.psi.* +import com.intellij.psi.util.PsiTreeUtil +import com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions.* + +object NamespaceExtractor { + data class Namespace( + val database: String, + val collection: String, + ) + + fun extractNamespace(query: PsiElement): Namespace? { + val currentClass = query.findContainingClass() +// val isAbstractRepository = AbstractRepositoryDaoAbstraction.isIn(query) +// val constructorInjection = ConstructorInjectionAbstraction.isIn(query) + val customQueryDsl = CustomQueryDslAbstraction.isIn(query) +// val driverInFactory = DriverInFactoryMethodAbstraction.isIn(query) +// val isRepository = RepositoryDaoAbstraction.isIn(query) + + if (customQueryDsl) { + // we need to traverse to the parent method that contains a reference to the mongodb class + // as we don't know who is actually calling the mongodb class, we will need to traverse upwards until + // we find the beginning of the method + val methodCalls = query.collectTypeUntil(PsiMethodCallExpression::class.java, PsiMethod::class.java) + val referencesToMongoDbClasses = + methodCalls.mapNotNull { + it.findCurrentReferenceToMongoDbObject() + } + + val constructorAssignments: List = + referencesToMongoDbClasses.firstNotNullOf { ref -> + val resolution = ref.resolve() ?: return@firstNotNullOf null + + when (resolution) { + // we assume constructor injection + // find in the constructor how it's defined + is PsiField -> { + return@firstNotNullOf resolveConstructorArgumentReferencesForField( + resolution.findContainingClass(), + Pair(null, resolution), + ) + } is PsiMethod -> { + val methodCalls = PsiTreeUtil.findChildrenOfType(resolution, PsiMethodCallExpression::class.java) + val resolutions = + methodCalls + .filter { + it.type?.isMongoDbClass(it.project) == true + }.mapNotNull { + runCatching { + extractRelevantFieldsFromChain(it) + }.getOrNull() + }.flatten() + .distinctBy { it.first } + + val containingClass = resolution.findContainingClass() + return@firstNotNullOf resolutions.flatMap { + resolveConstructorArgumentReferencesForField(containingClass, it) + } + } else -> + return@firstNotNullOf listOf() + } + } + + val resolvedScopes = + constructorAssignments.map { assignment -> + currentClass.constructors.firstNotNullOf { + val callToSuperConstructor = getCallToSuperConstructor(it, constructorAssignments) + + val indexOfParameter = + assignment.constructor.parameterList.getParameterIndex( + assignment.parameter, + ) + + Pair( + assignment.concept, + callToSuperConstructor!!.argumentList.expressions[indexOfParameter], + ) + } + } + + val collection = resolvedScopes.find { it.first == AssignmentConcept.COLLECTION } + val database = resolvedScopes.find { it.first == AssignmentConcept.DATABASE } + val client = resolvedScopes.find { it.first == AssignmentConcept.CLIENT } + + if (collection != null && database != null) { + return Namespace(resolveConstant(database.second)!!, resolveConstant(collection.second)!!) + } else if (client != null || resolvedScopes.size == 1) { + val mongodbNamespaceDriverExpression = + currentClass.constructors.firstNotNullOfOrNull { + val callToSuperConstructor = + PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { + it.methodExpression.text == "super" && + it.methodExpression.resolve() == constructorAssignments.first().constructor + } + + val indexOfParameter = + constructorAssignments.first().constructor.parameterList.getParameterIndex( + constructorAssignments.first().parameter!!, + ) + callToSuperConstructor.argumentList.expressions[indexOfParameter] + } + + return extractNamespaceFromDriverConfigurationMethodChain( + mongodbNamespaceDriverExpression as PsiMethodCallExpression, + ) + } else { + return null + } + } + + return null + } + + private fun resolveConstructorArgumentReferencesForField( + containingClass: PsiClass, + field: Pair, + ): List { + return containingClass.constructors.flatMap { constructor -> + val assignments = + PsiTreeUtil.findChildrenOfType(constructor, PsiAssignmentExpression::class.java) + val fieldAssignment = + assignments.find { assignment -> + assignment.lExpression.reference?.resolve() == field.second + } + if (fieldAssignment != null) { + val assignmentConcept = + field.first + ?: fieldAssignment.type.guessAssignmentConcept(fieldAssignment.project) + ?: return emptyList() + + val asParameter = fieldAssignment.rExpression?.reference?.resolve() as? PsiParameter + if (asParameter == null) { + // extract from chain + extractRelevantAssignments( + constructor, + fieldAssignment.rExpression as PsiMethodCallExpression, + ) + } else { + listOf( + FieldAndConstructorAssignment( + assignmentConcept, + field.second, + constructor, + asParameter, + ), + ) + } + } else { + emptyList() + } + } + } + + private fun getCallToSuperConstructor( + it: PsiMethod?, + constructorAssignments: List, + ): PsiMethodCallExpression? { + val callToSuperConstructor = + PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { + it.methodExpression.text == "super" && + it.methodExpression.resolve() == constructorAssignments.first().constructor + } + return callToSuperConstructor + } + + private fun resolveConstant(expression: PsiExpression): String? { + val javaFacade = JavaPsiFacade.getInstance(expression.project) + val constant = javaFacade.constantEvaluationHelper.computeConstantExpression(expression) + return constant as? String + } + + private fun extractNamespaceFromDriverConfigurationMethodChain(callExpr: PsiMethodCallExpression): Namespace { + val returnsCollection = callExpr.type?.isMongoDbCollectionClass(callExpr.project) == true + val collection: String? = + if (returnsCollection) { + resolveConstant(callExpr.argumentList.expressions[0]) + } else { + null + } + + val dbExpression = + if (callExpr.type?.isMongoDbDatabaseClass(callExpr.project) == true) { + callExpr + } else if (callExpr.methodExpression.qualifierExpression + ?.type + ?.isMongoDbDatabaseClass(callExpr.project) == true + ) { + callExpr.methodExpression.qualifierExpression as PsiMethodCallExpression? + } else { + null + } + + val database: String? = + if (dbExpression != null) { + resolveConstant(dbExpression.argumentList.expressions[0]) + } else { + null + } + + return Namespace(database ?: "unk", collection ?: "unk") + } + + private fun extractRelevantAssignments( + constructor: PsiMethod, + callExpr: PsiMethodCallExpression, + ): List { + val result = mutableListOf() + val returnsCollection = callExpr.type?.isMongoDbCollectionClass(callExpr.project) == true + if (returnsCollection) { + val parameter = + callExpr.argumentList.expressions[0] + .reference + ?.resolve() as? PsiParameter + if (parameter != null) { + result.add(FieldAndConstructorAssignment(AssignmentConcept.COLLECTION, null, constructor, parameter)) + } + } + + val dbExpression = + if (callExpr.type?.isMongoDbDatabaseClass(callExpr.project) == true) { + callExpr + } else if (callExpr.methodExpression.qualifierExpression + ?.type + ?.isMongoDbDatabaseClass(callExpr.project) == true + ) { + callExpr.methodExpression.qualifierExpression as PsiMethodCallExpression? + } else { + null + } + + if (dbExpression != null) { + val parameter = + dbExpression.argumentList.expressions[0] + .reference + ?.resolve() as? PsiParameter + if (parameter != null) { + result.add(FieldAndConstructorAssignment(AssignmentConcept.DATABASE, null, constructor, parameter)) + } + } + + return result + } + + private fun extractRelevantFieldsFromChain(callExpr: PsiMethodCallExpression): List> { + val result = mutableListOf>() + val returnsCollection = callExpr.type?.isMongoDbCollectionClass(callExpr.project) == true + if (returnsCollection) { + val field = + callExpr.argumentList.expressions[0] + .reference + ?.resolve() as? PsiField + if (field != null) { + result.add(Pair(AssignmentConcept.COLLECTION, field)) + } + } + + val dbExpression = + if (callExpr.type?.isMongoDbDatabaseClass(callExpr.project) == true) { + callExpr + } else if (callExpr.methodExpression.qualifierExpression + ?.type + ?.isMongoDbDatabaseClass(callExpr.project) == true + ) { + callExpr.methodExpression.qualifierExpression as PsiMethodCallExpression? + } else { + null + } + + if (dbExpression != null) { + val field = + dbExpression.argumentList.expressions[0] + .reference + ?.resolve() as? PsiField + if (field != null) { + result.add(Pair(AssignmentConcept.DATABASE, field)) + } + } + + return result + } +} + +private enum class AssignmentConcept { + CLIENT, + DATABASE, + COLLECTION, +} + +private fun PsiType?.guessAssignmentConcept(project: Project): AssignmentConcept? { + if (this == null) return null + + return if (isMongoDbClientClass(project)) { + AssignmentConcept.CLIENT + } else if (isMongoDbDatabaseClass(project)) { + AssignmentConcept.DATABASE + } else if (isMongoDbCollectionClass(project)) { + AssignmentConcept.COLLECTION + } else { + null + } +} + +private data class FieldAndConstructorAssignment( + val concept: AssignmentConcept, + val field: PsiField?, + val constructor: PsiMethod, + val parameter: PsiParameter, +) diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt index 62169ded..79692d96 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt @@ -1,12 +1,11 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.util.PsiTreeUtil import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass -import com.mongodb.jbplugin.dialects.javadriver.glossary.isMongoDbClass +import com.mongodb.jbplugin.dialects.javadriver.glossary.isUsingMongoDbClasses object CustomQueryDslAbstraction : Abstraction { override fun isIn(psiElement: PsiElement): Boolean { @@ -39,14 +38,7 @@ object CustomQueryDslAbstraction : Abstraction { } } || DriverInFactoryMethodAbstraction.isIn(method) || - isMethodUsingMongoDbClasses(method) + method.isUsingMongoDbClasses() } } - - private fun isMethodUsingMongoDbClasses(method: PsiMethod): Boolean = - PsiTreeUtil.findChildrenOfType(method, PsiMethodCallExpression::class.java).any { - it.methodExpression.qualifierExpression - ?.type - ?.isMongoDbClass(method.project) == true - } } diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt new file mode 100644 index 00000000..69a1d9bc --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt @@ -0,0 +1,132 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary + +import com.intellij.psi.PsiFile +import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest +import com.mongodb.jbplugin.dialects.javadriver.ParsingTest +import com.mongodb.jbplugin.dialects.javadriver.getQueryAtMethod +import org.junit.jupiter.api.Assertions.* + +@IntegrationTest +class NamespaceExtractorTest { + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public abstract class AbstractRepository { + private final MongoCollection collection; + + protected AbstractRepository(MongoCollection collection) { + this.collection = collection; + } + + protected final T findById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + +public final class UserRepository extends AbstractRepository { + public UserRepository(MongoClient client) { + super(client.getDatabase("production").getCollection("users", User.class)); + } + + public User findUserById(ObjectId id) { + return super.findById(id); + } +} + """, + ) + fun `extracts from a complex chain of dependency injection`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("UserRepository", "findUserById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("production", namespace.database) + assertEquals("users", namespace.collection) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public abstract class AbstractRepository { + private final MongoCollection collection; + + protected AbstractRepository(MongoClient client, String database, String collection) { + this.collection = client.getDatabase(database).getCollection(collection); + } + + protected final T findById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + +public final class BookRepository extends AbstractRepository { + public BookRepository(MongoClient client) { + super(client, "staging", "books"); + } + + public User findBookById(ObjectId id) { + return super.findById(id); + } +} + """, + ) + fun `extracts from a complex chain of dependency injection with different arguments`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("BookRepository", "findBookById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("staging", namespace.database) + assertEquals("books", namespace.collection) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public abstract class AbstractRepository { + private final MongoClient client; + private final String database; + private final String collection; + + protected AbstractRepository(MongoClient client, String database, String collection) { + this.client = client; + this.database = database; + this.collection = collection; + } + + protected final T findById(ObjectId id) { + return this.getCollection().find(eq("_id", id)).first(); + } + + protected final MongoCollection getCollection() { + return this.client.getDatabase(database).getCollection(collection); + } +} + +public final class BookRepository extends AbstractRepository { + public BookRepository(MongoClient client) { + super(client, "production", "books"); + } + + public User findBookById(ObjectId id) { + return super.findById(id); + } +} + """, + ) + fun `extracts from a complex chain of dependency injection with a factory method`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("BookRepository", "findBookById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("production", namespace.database) + assertEquals("books", namespace.collection) + } +} From 3a70ce8977e6298f7ac60e275b13d21700975d7d Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 16:31:45 +0200 Subject: [PATCH 07/32] chore: add more basic cases --- .../javadriver/glossary/Abstraction.kt | 104 +++++- .../javadriver/glossary/NamespaceExtractor.kt | 308 +++++++++++------- .../glossary/NamespaceExtractorTest.kt | 96 ++++++ 3 files changed, 377 insertions(+), 131 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt index 912016e5..49c02085 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt @@ -35,7 +35,7 @@ fun PsiElement.findContainingClass(): PsiClass = * @param project * @return */ -fun PsiType.isMongoDbCollectionClass(project: Project): Boolean { +fun PsiClass.isMongoDbCollectionClass(project: Project): Boolean { val javaFacade = JavaPsiFacade.getInstance(project) val mdbCollectionClass = @@ -44,8 +44,17 @@ fun PsiType.isMongoDbCollectionClass(project: Project): Boolean { GlobalSearchScope.everythingScope(project), ) - val typeClass = PsiTypesUtil.getPsiClass(this) - return typeClass == mdbCollectionClass + return this == mdbCollectionClass +} + +/** + * Helper function to check if a type is a MongoDB Collection + * + * @param project + */ +fun PsiType.isMongoDbCollectionClass(project: Project): Boolean { + val thisClass = PsiTypesUtil.getPsiClass(this) + return thisClass?.isMongoDbCollectionClass(project) == true } /** @@ -54,7 +63,7 @@ fun PsiType.isMongoDbCollectionClass(project: Project): Boolean { * @param project * @return */ -fun PsiType.isMongoDbDatabaseClass(project: Project): Boolean { +fun PsiClass.isMongoDbDatabaseClass(project: Project): Boolean { val javaFacade = JavaPsiFacade.getInstance(project) val mdbDatabaseClass = @@ -63,8 +72,7 @@ fun PsiType.isMongoDbDatabaseClass(project: Project): Boolean { GlobalSearchScope.everythingScope(project), ) - val typeClass = PsiTypesUtil.getPsiClass(this) - return typeClass == mdbDatabaseClass + return this == mdbDatabaseClass } /** @@ -73,7 +81,18 @@ fun PsiType.isMongoDbDatabaseClass(project: Project): Boolean { * @param project * @return */ -fun PsiType.isMongoDbClientClass(project: Project): Boolean { +fun PsiType.isMongoDbDatabaseClass(project: Project): Boolean { + val thisClass = PsiTypesUtil.getPsiClass(this) + return thisClass?.isMongoDbDatabaseClass(project) == true +} + +/** + * Helper function to check if a type is a MongoDB Client + * + * @param project + * @return + */ +fun PsiClass.isMongoDbClientClass(project: Project): Boolean { val javaFacade = JavaPsiFacade.getInstance(project) val mdbClientClass = @@ -82,8 +101,18 @@ fun PsiType.isMongoDbClientClass(project: Project): Boolean { GlobalSearchScope.everythingScope(project), ) - val typeClass = PsiTypesUtil.getPsiClass(this) - return typeClass == mdbClientClass + return this == mdbClientClass +} + +/** + * Helper function to check if a type is a MongoDB Client + * + * @param project + * @return + */ +fun PsiType.isMongoDbClientClass(project: Project): Boolean { + val thisClass = PsiTypesUtil.getPsiClass(this) + return thisClass?.isMongoDbClientClass(project) == true } /** @@ -92,11 +121,29 @@ fun PsiType.isMongoDbClientClass(project: Project): Boolean { * @param project * @return */ -fun PsiType.isMongoDbClass(project: Project): Boolean = +fun PsiType?.isMongoDbClass(project: Project): Boolean = + PsiTypesUtil.getPsiClass(this)?.run { + isMongoDbCollectionClass(project) || + isMongoDbDatabaseClass(project) || + isMongoDbClientClass(project) + } == true + +/** + * Checks if a class is a MongoDB class + * + * @param project + * @return + */ +fun PsiClass.isMongoDbClass(project: Project): Boolean = isMongoDbCollectionClass(project) || isMongoDbDatabaseClass(project) || isMongoDbClientClass(project) +/** + * Checks if a method is calling a MongoDB driver method. + * + * @return + */ fun PsiMethod.isUsingMongoDbClasses(): Boolean = PsiTreeUtil.findChildrenOfType(this, PsiMethodCallExpression::class.java).any { it.methodExpression.qualifierExpression @@ -104,6 +151,11 @@ fun PsiMethod.isUsingMongoDbClasses(): Boolean = ?.isMongoDbClass(this.project) == true } +/** + * Finds all references to the MongoDB driver in a method. + * + * @return + */ fun PsiMethod.findAllReferencesToMongoDbObjects(): List = PsiTreeUtil .findChildrenOfType(this, PsiExpression::class.java) @@ -112,10 +164,14 @@ fun PsiMethod.findAllReferencesToMongoDbObjects(): List = ?.isMongoDbClass(this.project) == true }.mapNotNull { it.reference } +/** + * Find, from a method call, the current MongoDB driver method is getting called. + */ fun PsiMethodCallExpression.findCurrentReferenceToMongoDbObject(): PsiReference? { if (methodExpression.type?.isMongoDbClass(project) == true) { return methodExpression.reference - } else if (methodExpression.qualifierExpression is PsiSuperExpression || methodExpression.qualifierExpression is PsiThisExpression) { + } else if (methodExpression.qualifierExpression is PsiSuperExpression || + methodExpression.qualifierExpression is PsiThisExpression) { val resolution = methodExpression.resolve() if (resolution is PsiField) { return if (resolution.type.isMongoDbClass(project)) resolution.reference else null @@ -124,13 +180,20 @@ fun PsiMethodCallExpression.findCurrentReferenceToMongoDbObject(): PsiReference? } } else { if (methodExpression.qualifierExpression is PsiMethodCallExpression) { - return (methodExpression.qualifierExpression as PsiMethodCallExpression).findCurrentReferenceToMongoDbObject() + return (methodExpression.qualifierExpression as PsiMethodCallExpression) +.findCurrentReferenceToMongoDbObject() } } return null } +/** + * Collects all elements of type T upwards until a type S is found. + * + * @param type + * @param stopWord + */ fun PsiElement.collectTypeUntil( type: Class, stopWord: Class, @@ -145,3 +208,20 @@ fun PsiElement.collectTypeUntil( return emptyList() } + +/** + * Returns the reference to a MongoDB driver call. + * + * @param project + */ +fun PsiMethodCallExpression.findMongoDbClassReference(project: Project): PsiExpression? { + if (methodExpression.type?.isMongoDbClass(project) == true) { + return methodExpression + } else if (methodExpression.qualifierExpression is PsiMethodCallExpression) { + return (methodExpression.qualifierExpression as PsiMethodCallExpression).findMongoDbClassReference(project) + } else if (methodExpression.qualifierExpression?.reference?.resolve() is PsiField) { + return methodExpression.qualifierExpression + } else { + return null + } +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt index 7907a2a9..d1796bd8 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -1,3 +1,7 @@ +/** + * This class is used to extract the namespace of a query for the Java Driver. + */ + package com.mongodb.jbplugin.dialects.javadriver.glossary import com.intellij.openapi.project.Project @@ -5,46 +9,41 @@ import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil import com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions.* -object NamespaceExtractor { - data class Namespace( - val database: String, - val collection: String, - ) +private typealias FoundAssignedPsiFields = List> +object NamespaceExtractor { + @Suppress("ktlint") // it seems the function is too complex for ktlint to understand it fun extractNamespace(query: PsiElement): Namespace? { val currentClass = query.findContainingClass() -// val isAbstractRepository = AbstractRepositoryDaoAbstraction.isIn(query) -// val constructorInjection = ConstructorInjectionAbstraction.isIn(query) val customQueryDsl = CustomQueryDslAbstraction.isIn(query) -// val driverInFactory = DriverInFactoryMethodAbstraction.isIn(query) -// val isRepository = RepositoryDaoAbstraction.isIn(query) - - if (customQueryDsl) { - // we need to traverse to the parent method that contains a reference to the mongodb class - // as we don't know who is actually calling the mongodb class, we will need to traverse upwards until - // we find the beginning of the method - val methodCalls = query.collectTypeUntil(PsiMethodCallExpression::class.java, PsiMethod::class.java) - val referencesToMongoDbClasses = - methodCalls.mapNotNull { - it.findCurrentReferenceToMongoDbObject() - } - val constructorAssignments: List = + val constructorAssignments: List = + if (customQueryDsl) { + // we need to traverse to the parent method that contains a reference to the mongodb class + // as we don't know who is actually calling the mongodb class, we will need to traverse upwards until + // we find the beginning of the method + val methodCalls = query.collectTypeUntil(PsiMethodCallExpression::class.java, PsiMethod::class.java) + val referencesToMongoDbClasses = + methodCalls.mapNotNull { + it.findCurrentReferenceToMongoDbObject() + } + referencesToMongoDbClasses.firstNotNullOf { ref -> val resolution = ref.resolve() ?: return@firstNotNullOf null + // we assume constructor injection + // find in the constructor how it's defined when (resolution) { - // we assume constructor injection - // find in the constructor how it's defined is PsiField -> { return@firstNotNullOf resolveConstructorArgumentReferencesForField( resolution.findContainingClass(), Pair(null, resolution), ) } is PsiMethod -> { - val methodCalls = PsiTreeUtil.findChildrenOfType(resolution, PsiMethodCallExpression::class.java) + val innerMethodCalls = PsiTreeUtil.findChildrenOfType(resolution, + PsiMethodCallExpression::class.java) val resolutions = - methodCalls + innerMethodCalls .filter { it.type?.isMongoDbClass(it.project) == true }.mapNotNull { @@ -62,10 +61,47 @@ object NamespaceExtractor { return@firstNotNullOf listOf() } } + } else { + val innerMethodCalls = PsiTreeUtil.findChildrenOfType(query, PsiMethodCallExpression::class.java) + innerMethodCalls + .mapNotNull { + if (it is PsiMethodCallExpression) { + val maybeNamespace = runCatching { extractNamespaceFromDriverConfigurationMethodChain(it) } +.getOrNull() + if (maybeNamespace != null) { + return maybeNamespace + } + } + + it.findMongoDbClassReference(it.project) + }.flatMap { + when (it.reference?.resolve()) { + is PsiField -> + resolveConstructorArgumentReferencesForField( + currentClass, + Pair(null, it.reference?.resolve() as PsiField), + ) + is PsiMethod -> { + val method = it.reference?.resolve() as PsiMethod + if (method.containingClass?.isMongoDbClass(method.project) == true) { + return extractNamespaceFromDriverConfigurationMethodChain( +it as PsiMethodCallExpression +) + } + return PsiTreeUtil + .findChildrenOfType(method, PsiMethodCallExpression::class.java) + .mapNotNull { + extractNamespaceFromDriverConfigurationMethodChain(it) + }.firstOrNull() + } else -> emptyList() + } + } + } - val resolvedScopes = - constructorAssignments.map { assignment -> - currentClass.constructors.firstNotNullOf { + val resolvedScopes = + constructorAssignments.map { assignment -> + currentClass.constructors.firstNotNullOf { + if (assignment.parameter != null) { val callToSuperConstructor = getCallToSuperConstructor(it, constructorAssignments) val indexOfParameter = @@ -77,37 +113,40 @@ object NamespaceExtractor { assignment.concept, callToSuperConstructor!!.argumentList.expressions[indexOfParameter], ) + } else { + Pair(assignment.concept, assignment.resolutionExpression) } } + } - val collection = resolvedScopes.find { it.first == AssignmentConcept.COLLECTION } - val database = resolvedScopes.find { it.first == AssignmentConcept.DATABASE } - val client = resolvedScopes.find { it.first == AssignmentConcept.CLIENT } - - if (collection != null && database != null) { - return Namespace(resolveConstant(database.second)!!, resolveConstant(collection.second)!!) - } else if (client != null || resolvedScopes.size == 1) { - val mongodbNamespaceDriverExpression = - currentClass.constructors.firstNotNullOfOrNull { - val callToSuperConstructor = - PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { - it.methodExpression.text == "super" && - it.methodExpression.resolve() == constructorAssignments.first().constructor - } - - val indexOfParameter = - constructorAssignments.first().constructor.parameterList.getParameterIndex( - constructorAssignments.first().parameter!!, - ) - callToSuperConstructor.argumentList.expressions[indexOfParameter] - } + val collection = resolvedScopes.find { it.first == AssignmentConcept.COLLECTION } + val database = resolvedScopes.find { it.first == AssignmentConcept.DATABASE } + val client = resolvedScopes.find { it.first == AssignmentConcept.CLIENT } + + // it's a collection = expression set up + if (collection != null && database == null) { + return extractNamespaceFromDriverConfigurationMethodChain(collection.second as PsiMethodCallExpression) + } else if (collection != null && database != null) { + return Namespace(resolveConstant(database.second)!!, resolveConstant(collection.second)!!) + } else if (client != null || resolvedScopes.size == 1) { + val mongodbNamespaceDriverExpression = + currentClass.constructors.firstNotNullOfOrNull { + val callToSuperConstructor = + PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { + it.methodExpression.text == "super" && + it.methodExpression.resolve() == constructorAssignments.first().constructor + } + + val indexOfParameter = + constructorAssignments.first().constructor.parameterList.getParameterIndex( + constructorAssignments.first().parameter!!, + ) + callToSuperConstructor.argumentList.expressions[indexOfParameter] + } - return extractNamespaceFromDriverConfigurationMethodChain( - mongodbNamespaceDriverExpression as PsiMethodCallExpression, - ) - } else { - return null - } + return extractNamespaceFromDriverConfigurationMethodChain( + mongodbNamespaceDriverExpression as PsiMethodCallExpression, + ) } return null @@ -124,32 +163,42 @@ object NamespaceExtractor { assignments.find { assignment -> assignment.lExpression.reference?.resolve() == field.second } - if (fieldAssignment != null) { - val assignmentConcept = - field.first - ?: fieldAssignment.type.guessAssignmentConcept(fieldAssignment.project) - ?: return emptyList() - - val asParameter = fieldAssignment.rExpression?.reference?.resolve() as? PsiParameter - if (asParameter == null) { - // extract from chain - extractRelevantAssignments( - constructor, - fieldAssignment.rExpression as PsiMethodCallExpression, - ) - } else { - listOf( - FieldAndConstructorAssignment( - assignmentConcept, - field.second, - constructor, - asParameter, - ), - ) - } - } else { - emptyList() - } + fieldAssignment?.let { +val assignmentConcept = +field.first +?: fieldAssignment.type.guessAssignmentConcept(fieldAssignment.project) +?: return emptyList() +val asParameter = fieldAssignment.rExpression?.reference?.resolve() as? PsiParameter +asParameter?.let { +listOf( +FieldAndConstructorAssignment( +assignmentConcept, +field.second, +constructor, +asParameter, +null, +), +) +} ?: run { +// extract from chain +val foundAssignments = +extractRelevantAssignments( +constructor, +fieldAssignment.rExpression as PsiMethodCallExpression, +) +foundAssignments.ifEmpty { +listOf( +FieldAndConstructorAssignment( +assignmentConcept, +field.second, +constructor, +null, +fieldAssignment.rExpression, +), +) +} +} +} ?: emptyList() } } @@ -171,7 +220,7 @@ object NamespaceExtractor { return constant as? String } - private fun extractNamespaceFromDriverConfigurationMethodChain(callExpr: PsiMethodCallExpression): Namespace { + private fun extractNamespaceFromDriverConfigurationMethodChain(callExpr: PsiMethodCallExpression): Namespace? { val returnsCollection = callExpr.type?.isMongoDbCollectionClass(callExpr.project) == true val collection: String? = if (returnsCollection) { @@ -193,11 +242,13 @@ object NamespaceExtractor { } val database: String? = - if (dbExpression != null) { - resolveConstant(dbExpression.argumentList.expressions[0]) - } else { - null - } + dbExpression?.let { +resolveConstant(dbExpression.argumentList.expressions[0]) +} + + if (collection == null && database == null) { + return null + } return Namespace(database ?: "unk", collection ?: "unk") } @@ -213,9 +264,10 @@ object NamespaceExtractor { callExpr.argumentList.expressions[0] .reference ?.resolve() as? PsiParameter - if (parameter != null) { - result.add(FieldAndConstructorAssignment(AssignmentConcept.COLLECTION, null, constructor, parameter)) - } + parameter?.let { +result.add(FieldAndConstructorAssignment(AssignmentConcept.COLLECTION, null, constructor, parameter, +null)) +} } val dbExpression = @@ -230,20 +282,20 @@ object NamespaceExtractor { null } - if (dbExpression != null) { - val parameter = - dbExpression.argumentList.expressions[0] - .reference - ?.resolve() as? PsiParameter - if (parameter != null) { - result.add(FieldAndConstructorAssignment(AssignmentConcept.DATABASE, null, constructor, parameter)) - } - } + dbExpression?.let { +val parameter = +dbExpression.argumentList.expressions[0] +.reference +?.resolve() as? PsiParameter +parameter?.let { +result.add(FieldAndConstructorAssignment(AssignmentConcept.DATABASE, null, constructor, parameter, null)) +} +} return result } - private fun extractRelevantFieldsFromChain(callExpr: PsiMethodCallExpression): List> { + private fun extractRelevantFieldsFromChain(callExpr: PsiMethodCallExpression): FoundAssignedPsiFields { val result = mutableListOf>() val returnsCollection = callExpr.type?.isMongoDbCollectionClass(callExpr.project) == true if (returnsCollection) { @@ -251,9 +303,9 @@ object NamespaceExtractor { callExpr.argumentList.expressions[0] .reference ?.resolve() as? PsiField - if (field != null) { - result.add(Pair(AssignmentConcept.COLLECTION, field)) - } + field?.let { +result.add(Pair(AssignmentConcept.COLLECTION, field)) +} } val dbExpression = @@ -268,28 +320,53 @@ object NamespaceExtractor { null } - if (dbExpression != null) { - val field = - dbExpression.argumentList.expressions[0] - .reference - ?.resolve() as? PsiField - if (field != null) { - result.add(Pair(AssignmentConcept.DATABASE, field)) - } - } + dbExpression?.let { +val field = +dbExpression.argumentList.expressions[0] +.reference +?.resolve() as? PsiField +field?.let { +result.add(Pair(AssignmentConcept.DATABASE, field)) +} +} return result } + +/** + * @property database + * @property collection + */ +data class Namespace( + val database: String, + val collection: String, + ) } private enum class AssignmentConcept { CLIENT, DATABASE, COLLECTION, +; } +/** + * @property concept + * @property field + * @property constructor + * @property parameter + * @property resolutionExpression + */ +private data class FieldAndConstructorAssignment( + val concept: AssignmentConcept, + val field: PsiField?, + val constructor: PsiMethod, + val parameter: PsiParameter?, + val resolutionExpression: PsiExpression?, +) + private fun PsiType?.guessAssignmentConcept(project: Project): AssignmentConcept? { - if (this == null) return null + this ?: return null return if (isMongoDbClientClass(project)) { AssignmentConcept.CLIENT @@ -301,10 +378,3 @@ private fun PsiType?.guessAssignmentConcept(project: Project): AssignmentConcept null } } - -private data class FieldAndConstructorAssignment( - val concept: AssignmentConcept, - val field: PsiField?, - val constructor: PsiMethod, - val parameter: PsiParameter, -) diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt index 69a1d9bc..317244bc 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt @@ -129,4 +129,100 @@ public final class BookRepository extends AbstractRepository { assertEquals("production", namespace.database) assertEquals("books", namespace.collection) } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public final class BookRepository { + private final MongoCollection collection; + + public BookRepository(MongoClient client) { + this.collection = client.getDatabase("simple").getCollection("books"); + } + + public User findBookById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + """, + ) + fun `extracts from a basic repository with dependency injection`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("BookRepository", "findBookById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("simple", namespace.database) + assertEquals("books", namespace.collection) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public final class BookRepository { + private final MongoClient client; + private final String database; + private final String collection; + + public BookRepository(MongoClient client, String database, String collection) { + this.client = client; + this.database = database; + this.collection = collection; + } + + public User findBookById(ObjectId id) { + return this.getCollection().find(eq("_id", id)).first(); + } + + private MongoCollection getCollection() { + return client.getDatabase("simple").getCollection("books"); + } +} + """, + ) + fun `extracts from a basic repository with dependency injection and a factory method`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("BookRepository", "findBookById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("simple", namespace.database) + assertEquals("books", namespace.collection) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public final class BookRepository { + private final MongoClient client; + private final String database; + private final String collection; + + public BookRepository(MongoClient client, String database, String collection) { + this.client = client; + this.database = database; + this.collection = collection; + } + + public User findBookById(ObjectId id) { + return client.getDatabase("simple").getCollection("books").find(eq("_id", id)).first(); + } +} + """, + ) + fun `extracts from a basic repository with dependency injection only`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("BookRepository", "findBookById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("simple", namespace.database) + assertEquals("books", namespace.collection) + } } From b35634054eaeaa6939f1827c4f7f78110eaf03a8 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 16:38:23 +0200 Subject: [PATCH 08/32] chore: merge with main --- .../javadriver/glossary/NamespaceExtractor.kt | 172 ++++++++++-------- 1 file changed, 94 insertions(+), 78 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt index d1796bd8..646f1dfa 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -8,11 +8,12 @@ import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil import com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions.* +import com.mongodb.jbplugin.mql.Namespace private typealias FoundAssignedPsiFields = List> +@Suppress("ktlint") // it seems the class is too complex for ktlint to understand it object NamespaceExtractor { - @Suppress("ktlint") // it seems the function is too complex for ktlint to understand it fun extractNamespace(query: PsiElement): Namespace? { val currentClass = query.findContainingClass() val customQueryDsl = CustomQueryDslAbstraction.isIn(query) @@ -39,9 +40,13 @@ object NamespaceExtractor { resolution.findContainingClass(), Pair(null, resolution), ) - } is PsiMethod -> { - val innerMethodCalls = PsiTreeUtil.findChildrenOfType(resolution, - PsiMethodCallExpression::class.java) + } + + is PsiMethod -> { + val innerMethodCalls = PsiTreeUtil.findChildrenOfType( + resolution, + PsiMethodCallExpression::class.java + ) val resolutions = innerMethodCalls .filter { @@ -57,7 +62,9 @@ object NamespaceExtractor { return@firstNotNullOf resolutions.flatMap { resolveConstructorArgumentReferencesForField(containingClass, it) } - } else -> + } + + else -> return@firstNotNullOf listOf() } } @@ -67,7 +74,7 @@ object NamespaceExtractor { .mapNotNull { if (it is PsiMethodCallExpression) { val maybeNamespace = runCatching { extractNamespaceFromDriverConfigurationMethodChain(it) } -.getOrNull() + .getOrNull() if (maybeNamespace != null) { return maybeNamespace } @@ -81,19 +88,22 @@ object NamespaceExtractor { currentClass, Pair(null, it.reference?.resolve() as PsiField), ) + is PsiMethod -> { val method = it.reference?.resolve() as PsiMethod if (method.containingClass?.isMongoDbClass(method.project) == true) { return extractNamespaceFromDriverConfigurationMethodChain( -it as PsiMethodCallExpression -) + it as PsiMethodCallExpression + ) } return PsiTreeUtil .findChildrenOfType(method, PsiMethodCallExpression::class.java) - .mapNotNull { + .firstNotNullOfOrNull { extractNamespaceFromDriverConfigurationMethodChain(it) - }.firstOrNull() - } else -> emptyList() + } + } + + else -> emptyList() } } } @@ -134,7 +144,7 @@ it as PsiMethodCallExpression val callToSuperConstructor = PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { it.methodExpression.text == "super" && - it.methodExpression.resolve() == constructorAssignments.first().constructor + it.methodExpression.resolve() == constructorAssignments.first().constructor } val indexOfParameter = @@ -164,41 +174,41 @@ it as PsiMethodCallExpression assignment.lExpression.reference?.resolve() == field.second } fieldAssignment?.let { -val assignmentConcept = -field.first -?: fieldAssignment.type.guessAssignmentConcept(fieldAssignment.project) -?: return emptyList() -val asParameter = fieldAssignment.rExpression?.reference?.resolve() as? PsiParameter -asParameter?.let { -listOf( -FieldAndConstructorAssignment( -assignmentConcept, -field.second, -constructor, -asParameter, -null, -), -) -} ?: run { + val assignmentConcept = + field.first + ?: fieldAssignment.type.guessAssignmentConcept(fieldAssignment.project) + ?: return emptyList() + val asParameter = fieldAssignment.rExpression?.reference?.resolve() as? PsiParameter + asParameter?.let { + listOf( + FieldAndConstructorAssignment( + assignmentConcept, + field.second, + constructor, + asParameter, + null, + ), + ) + } ?: run { // extract from chain -val foundAssignments = -extractRelevantAssignments( -constructor, -fieldAssignment.rExpression as PsiMethodCallExpression, -) -foundAssignments.ifEmpty { -listOf( -FieldAndConstructorAssignment( -assignmentConcept, -field.second, -constructor, -null, -fieldAssignment.rExpression, -), -) -} -} -} ?: emptyList() + val foundAssignments = + extractRelevantAssignments( + constructor, + fieldAssignment.rExpression as PsiMethodCallExpression, + ) + foundAssignments.ifEmpty { + listOf( + FieldAndConstructorAssignment( + assignmentConcept, + field.second, + constructor, + null, + fieldAssignment.rExpression, + ), + ) + } + } + } ?: emptyList() } } @@ -243,8 +253,8 @@ fieldAssignment.rExpression, val database: String? = dbExpression?.let { -resolveConstant(dbExpression.argumentList.expressions[0]) -} + resolveConstant(dbExpression.argumentList.expressions[0]) + } if (collection == null && database == null) { return null @@ -265,9 +275,16 @@ resolveConstant(dbExpression.argumentList.expressions[0]) .reference ?.resolve() as? PsiParameter parameter?.let { -result.add(FieldAndConstructorAssignment(AssignmentConcept.COLLECTION, null, constructor, parameter, -null)) -} + result.add( + FieldAndConstructorAssignment( + AssignmentConcept.COLLECTION, + null, + constructor, + parameter, + null, + ), + ) + } } val dbExpression = @@ -283,14 +300,22 @@ null)) } dbExpression?.let { -val parameter = -dbExpression.argumentList.expressions[0] -.reference -?.resolve() as? PsiParameter -parameter?.let { -result.add(FieldAndConstructorAssignment(AssignmentConcept.DATABASE, null, constructor, parameter, null)) -} -} + val parameter = + dbExpression.argumentList.expressions[0] + .reference + ?.resolve() as? PsiParameter + parameter?.let { + result.add( + FieldAndConstructorAssignment( + AssignmentConcept.DATABASE, + null, + constructor, + parameter, + null, + ), + ) + } + } return result } @@ -304,8 +329,8 @@ result.add(FieldAndConstructorAssignment(AssignmentConcept.DATABASE, null, const .reference ?.resolve() as? PsiField field?.let { -result.add(Pair(AssignmentConcept.COLLECTION, field)) -} + result.add(Pair(AssignmentConcept.COLLECTION, field)) + } } val dbExpression = @@ -321,26 +346,17 @@ result.add(Pair(AssignmentConcept.COLLECTION, field)) } dbExpression?.let { -val field = -dbExpression.argumentList.expressions[0] -.reference -?.resolve() as? PsiField -field?.let { -result.add(Pair(AssignmentConcept.DATABASE, field)) -} -} + val field = + dbExpression.argumentList.expressions[0] + .reference + ?.resolve() as? PsiField + field?.let { + result.add(Pair(AssignmentConcept.DATABASE, field)) + } + } return result } - -/** - * @property database - * @property collection - */ -data class Namespace( - val database: String, - val collection: String, - ) } private enum class AssignmentConcept { From b228c7eea8fd79fbd4408643d4ebd4fe8a4991cf Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 16:52:16 +0200 Subject: [PATCH 09/32] chore: run test when the driver is indexed --- .../jbplugin/dialects/javadriver/IntegrationTest.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt index 194361c0..d3b6aeeb 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt @@ -15,6 +15,7 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile +import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiUtil import com.intellij.psi.util.childrenOfType import com.intellij.testFramework.PsiTestUtil @@ -29,6 +30,8 @@ import java.util.concurrent.atomic.AtomicReference import kotlin.io.path.Path import kotlin.io.path.absolutePathString +private const val MONGO_CLIENT = "com.mongodb.client.MongoClient" + @Retention(AnnotationRetention.RUNTIME) @Test annotation class ParsingTest( @@ -117,6 +120,14 @@ internal class IntegrationTestExtension : dumbService.runWhenSmart { val result = runCatching { + val javaPsiFacade = JavaPsiFacade.getInstance(fixture.project) + val searchEverywhere = GlobalSearchScope.everythingScope(fixture.project) + var times = 0 + while (javaPsiFacade.findClass(MONGO_CLIENT, searchEverywhere) == null && times < 10) { + System.err.println("Driver not loaded yet. Waiting for 100ms") + Thread.sleep(100) + times++ + } invocation.proceed() } result.onSuccess { From 29c9dfca73d9e19931208f59e372c2e45796e93d Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 16:58:54 +0200 Subject: [PATCH 10/32] chore: we need the driver for testing --- .gitignore | 5 ++++- .../resources/mongodb-driver-sync-5.1.1.jar | Bin 0 -> 153556 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar diff --git a/.gitignore b/.gitignore index 7cc99355..7df3e7fd 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,7 @@ packages/jetbrains-plugin/src/main/resources/build.properties /**/.DS_Store FAKE_BROWSER_OUTPUT -/.kotlin \ No newline at end of file +/.kotlin + +# We need the driver for tests +!packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar \ No newline at end of file diff --git a/packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar b/packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..7e0ba71f51fbd4a9031e1ccb6262472ffc869aeb GIT binary patch literal 153556 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�rP61X-`!|?+vzLiq6JP^gL1#-WC&h{c}xbj_pm4B0+9d;ldZ0@XshyfxJ6id&Yx! z^}!c2phq7ijyh~c2$WYor0^0VEU)P+QEoi^_YIPO_(6;Y%j z!z6UBgj19vF~kpqvAVX8$zw&BSN5IXP?fQ*zc2zUheM7h6mp?Cu^7-OFi7dAVZ)l9dcC4k=hqI zD%DFWNQxlVmXGD$&DYJ%wdakUF1|DCDv@{7uh)ERu2&nxOn^F-EROfv-+bF^Uyjqg zQg8E~x*T8t_d}u^zYv5pCxK~4mw$$% zgoz67K9MwLZtU>iG>IiVeog0rJ7JXex#8aJ!UQ>134PY9(PP02_t#gT9uWng#SETz za)o6=k1G&R(_m}3fNAbanv}Ad%Z1s6cw3a~3gy1p@c|sb>F6m<#q9eLo#$4UdLbLbM=_}?2+7$=( zoXrD@m(E;}!cY1sz?v|ww~N2AEXKqsvvyLXVo)yh0XK@Pmw()xJK$30A?bTjK`$Vz zV^^I=#vLSqGWVj$~bH5iZ=X%1mcc z18B+eCW6};dul|dXej)j?m;s< z*}7&fyp61a-gg=8D$b!U-#BMi{Qi6=_K(sR0LNDVNB3HAxV}IvFSXFvKceLg&H$oz zbKpa(7Y)`dI4pPpv6eTGxV(_L0%fB{XUNfbH3Hda3gId?4`WH(?iNw&6k)>)w4W7IF70e^^G^cOxN^(F90%xB_;OQo%%VmMRy_L*mMh=|BgoH4&%;=#r75xl|_9Q!G-4MTJYAWsfc*=tDLHG zO_$6u$uQ!Y_mnze1l3|ZQr8Ba^;^ehY;iIw>O~GOL)gy)-_K13nH_D+j0%(C)?C?m*zN%^0|jMKQs2nEbOEWRGe*NK4?PVf2zt)(NDix2f3%iGM<&H?(lK^_6E;? zN13T}Vk6MH;lb4jzE*TbmV;pxL0af>2EmOg6k9K%0^^Oj~maC<1e-`wa4A&d7y^5ApDY*Mv zn;YXWDQq@99#4a4ceBq->Po0VWw`AhIo!F8p;qe#9QO;t zw*bZ_ESY*%xs*ST7?b-(^94U=?K@KL3?gN5vu;q=$qo8Tq9JiCKuah4RLg91+IMBw z+ATC8jIvs_f+2DQD~Duhf3lwotIKqILA)w#1ET3-1FwK(xRYE=U{WCMl9>jV;ZBd% zfXDcI1 zZA_wFgS-HiAy9MtRb9QWS2%Vlp;UEjQr#qp^#h??zo%b=3LI#Kq=|yJlAr0hTEOv5 zQ=|~rr~Ro21?eX1ow@&+urk}U-U#`jH9)B%tOGN*>WI3Uh~J!^8X8~Y!X`x0fH!A~ z;ZWSOt%A~WP6sS;I8*3amEFFU25<6kz`@sj(l>oh$h~=dqR=$PW#7F$7`AtO4Em12 z-Q!h_pYH41SK|F6!`r^enBNe7D!rwoF*SF$9-h`Tt?zEwmJMznu*!*A;?3FPm)kkq z;nL)*1g`4s-5hF|NJrbQflZsp04G$si{P?TC?`-~8TiU9A;8KGC+>ly%~8v>bvR$EG(uM6dptT(^43*$1gq%!^1lL?oAP|m zVU#*r4P$t!ZoI0o(?qnR;Jco$26`T>8P++g(*I)1K3v;ZfqhPJqR_0MesAWy8aPk7 z2uGi{K9qk=(^?B;+lj`yTDc|V)y-o5D90(!r@}gWNL+~nX+3eH+7jt%%4j+>sO0S2 z>mHynVB9V&5rSp#%8hZ|$qwqtRGbcB4GK4QjxhyTjdXPcK1$_W!n;DiK^%8 zP9UUMXiF8`C{IiDMmE{&Bg)i3`L@AS$d6-;9vl0AE&_+U1Uy|O#8;O)Lm zwsv;11{dJAR}7;R7gbqk974Xb+)C`^hLE5yO5{=QP~!niu|A`SbkJz{%%R!rXv z9n2Pi{Mg51fAwyS`yCj44y71~-79FBpv^C_+^rS)xL3*PgZ~|gMN#<|DW1_w<2f;H z5#IR&@hi>f*QbytcA5@<0?eY&#W#xX>`iZZk%UM7?o0wq!`8NPN5tvDuH_3fuJ0IQ zTex_;+U(7W_=@vcCzod1pAXc*_HS&?FEn4#Ps6@JhRb%i1X!XGe5VhhukZk&n=>0< z(aDw|iKxx-oM%3qhcC7T!TUudzA3qs48gSUUV3C(lI?x=U<5oju!!*vZ{9*kTLTk`Rt!!!lqU8p zrZ@Y%Q56lyBfYMpv_ z?fs{9mdx`N)hrl1Jc1<&{rp6XtXPRPcG^Wt+j9r8Aup~=ClS{W@^O_I z&N(pJl_WYPvC~k+bw*uVH6TZ1!)~=qg3ht(D^V&e@ zOx@)tQf6L@Em;|iNcus^={kB&AxoYKHNrAjIphM?A*oo|i1!7{kqKM+;^UfmWS+p* zX_Z3X@aQ)PXi<j;(Z|`@W2btV(1;ra#~H*EgqMhcNU1E# zO7_bBW;@+l%9QY?EX;2%54WlewO~mzTNp&%vk4^(&I>W=c1s}Aw6C{pk4`=G`%g+4 zrU_FRp+(<*@GJyACZe}pG7BG}{F3c7UZPiUPE}whn8e;19?-7J)53)qE>n2Mepf)w z=5iQIy2^$kU3a?!To1o^Q*?U_Je|U|S3atnK49nmC`d-bH{2w~hIDupfAvV@revM& z$A#p;?VQ-GgFzyHmuFvX)c7e{TAm@y4so!>{KV;aV{uMl;kM5vZyMVDV50-(hP|$j zhf!qJ=6cJY+!?l#Nee>q5w36VBRq}WsN$g6+){XhQEhl~xTM|spELMA5`K+fn z#D+te()9L3HrmwD+VEL~d3a}7OwKuh@E>cmUykqTU^J4*zU)ji_68>AoFlT_>&Jsj zc5*zW+cGi7ip;@+DcX`j>gG1KgkBf9{SND<$_Gs0mqN~C!L@~nUDo2ArN>bo9|3jx zO}v<)S-_>Q<2u7IsG8K~)oCN(R+(jvOmw-!BOjfCfcKJ+Pt7$=U6=2OlFatH^D5=W zO{M&_;ZYVx+~Nxw;W za)AMWBJ$#T%cW+5Ka!1J)j{u1Kb?H&OlGg4X?jxyV0H2Hj+-BHNloT69ZydQM+q$e zY;@fT;C?S7H#}3noyK3H`-4#lVe&{bzlE>$gMY+gM+kHLQYeU72pfV_^qv@>Ja-jNfVZBc;Q;yX9}-Hb&pED!Xb({p zdy4lu<72(Tc|+8^qV!8oBoiK+3QAE{RxuH$!axHM@kbuGK=0UfFx?||H%Mybz~jn3 zJS=Wo1T>=6-P$_2n=}+!Vp;p5I_hMBNTOhkhEAej)N+*dZ1ONl237g8LZ7P3J)#{8 z6I>Y+g@9v?c}QYNbi!W67pw10O6iXHt!9A`STbOM<2x{aLiIU?l56wIr~04`l0Z zqIF(@&Y0OJ*gzM5HR`zxp=JTi{Qhb7ZN$}8ZUETB&sj6JNoh2PeJO{1yPPb0DVuP@ z)|ewICdMsd)j9aowbM6MD;YS%lj;Qh;2~nov$<(s);_dU0 zs0(#M!nDxwiVg!AxR908Of# zH{WA(zr{3Jz`}wOe<9HGJ0Sf+O)ha(BtDe{Hd2QQ)AeskB+g=jf^u~bSnpTUQBCNM zR(c1`@Q+nbkn)FA))PQYlLLi{*lu{!TJ%8m$11-;y@QNCR@V=ea@6dq@qth^^=#CQ z(_dNvx3P8M6GA_F83)&!L2PSj=SC!=qKtHG`*sGd%S~ry+-DZQnMgX%C0>J91iK1V zM}e)_rHJ?hPPkGf*LAo5pENxqleRpC8_XMgV|3i!6e)B=+^1bH+h3c0`~(UgA@j=-B+qvK zzQG(516ii}()0ou#eyRRj=tf^6oFc{eSZ@vTOx!sgKgWDhnXFimshnte<*WRZE>Iq*Ue@$t#2Bg{w0y1IAW--o>t2BD?^mE{?5@Dg#+Qud3_8 z^Q|nO7bkqFs_FgG8GL`yOlbW3BiKLtGu-?*DT<)F@ZOXjQ;DO#zt}#A#-7O1Abm^l zZ2JvfpsP8)B)qrtw|oO7cdzR(w@T7);3>YR=;6@(R2LPM?q>f2)$?mfD78gMpA-!( zibs|wqA8Nml*ni#$=vBhu9CCHn?Q#Xit9r%DBr=Z4w=p%&Djh+=Y5_cTpB zIi=U!)JJ38d0+n}rM;iN;1h)EKG~%idm|O;nTbZ3c<+kHK^gYl29N;!=APbvZ*v z*pC#g&J4l$4lnS*EFU5%?WxVGD5~YK?}?%eK18F^Ea?^3RBdu^w^d6whR8^cUtruV zb;-jrXkq;<4hTy6eUkxXp}d#IG&3SOiB6SRlmLlBN4l*oIM*@_#4Z7Z3xr}l&63MF zGjowpO*VGMR2CaT{2mMxQ3lkyN{ERryzP`w?QdjRl-|0gkgE3lI7xTecOYTl(Mdw1 zM)rnn0A31OfGLrm4xxDRo9Q=m;J_?%(r@PS6bX!lv>`}b^d6o3iaO%?kQi5_Q*EPV zxQQyq#d;&1+1_5#yri<{zb4{e&%igPof@4Ykse^ihI7eb9%p1-ppeql4&-QCOPvRJ_*^IYr$GddLy0B8PJ{K$aEVt~*7wXJRB-V%23mk)*BAG6Sd4wu_?G~G` zSuIe%GP(+U!V9iak_o0;7Ctf39|@qfC+fq}9XAD?gpG>4f|FhDatltsPhswqS67|) z=w_+%E-7^nHPO7p9Wbt5ITH5oL7wd1G_|0lZgfHAVl;#ZGMM`K9TuUjVl3RWl5g#| z5V?EPU(|ln6+zQF@i$k(ACbMEj~Z4qn!y;8Yq>y}+#Cy=yVr29^^J@=_CiG7O4cF2 z?`l9@KJVqV&ufc$cMdKoz=BJ&;4m-Q%_7l&li|HX*E*&G_tuL+qj72lqkXsBwA z>y@w#k=YL`6vMOEqZx;FdDUZ^lOG*2RFdH~919jUq16IiAx}u1I02+5(YJ4RjjcrX zeEwh->WniUtWA8)4g5iOrG}4b?3WtUi;bRd@Z(j)OEjy`(B5NqGL8Vdin{Pu(00Mz z)?%?E?e2fsj0Id2wpDXXu!X7qVrK5l5#U=ZvW}a_T4mabl#8J2dwnSg4j#HIgFi^* zHc$jNmVdL(7#l}RrZXXKoHwpx43h^0u>xjE*r7tJ!z5jeBCf;e-ju{*-SBFm9K*Zi z3Ezb8H}!THX@c+sr=UQbejHwd-|~X6;Rxuy=p=r+1a?zJ?8(i2y9GXv<`17fxIE}Y zjv9_2dLc;I?F0O%W7x2U^A&@wP31u+2~i#2HN}ihwqTzMlSP2cJ*RhpZ|{u-0ser) z{OF_y?gf{;RbCC-4n_L_)C%Ma^1Knf!Tg}${t@)+^(cabw44%=Y5;RrrDbu>@ffoA z5eGPm&d)#C#xQ-2}!s!*bE- z!*qq*0GXj+YpO)4z-}klE$9f(8eSIZ%nH7d#&1_r$h+qbyb3vr*&^^HR0Qzm&ce~^ zLp9VYv_^Bh5&NSek?`g$XT$?~8>}HhZ4;*5GEdc(1<=P*XYL-M%cidaxsmp$Ai98k zL1Giqb1(-@LAfJED;>KyK3}-6{bBbcAwqXNd^|u;jcuF%p40Y!8?Axgbbh|@*i1Yg zJ?+DT-I58->_3*tN4|*1cvN%FWU__viM~*Nogqj)k@|R}`7Xuw62QXkohQA&%XkfB zN}e7+hyGe=j%!L=a5d1aw-ifcu>%u-Bz~nMrh0{diG)E+a(O8@&q)Z|UanSr4$i^<#TtNvW_KcE4SL z>0>Wt(T(mU@^1VRf9Km0_$^DqMqW-{=hPW?FIQWuBDylJw@cjlFLKGAu@jmSWf%@Q zicQ1_-b8?9MR{I%NkB;kR7M5LploZz-^EK{p1BDp>xxZiN7Uz5uIyTfuZ3{R2b#oG zZh)tR&JXAO%GF1G4Al#bv`dY&g%MeMRXzQdodIIh7xKDIVav?D3x2P^X}c)Ek&Z}> z&mdDe@k4m+YpWkTq9wMw<0_|}>GWlegwdYO`GI8|R)P#UR>}bG1#y%KgizZCx%GM~KcjmV@v`Pt3(BVjT49Jp3l#aFKlif#W&b8}~qyBAf z_|bOq0$mF79M~-sl+kuIZGu|Dkq9bQfTH~dXGxI<0-DSk)TM7=-!uxz1H9$qAH~9i zqBPLaYNjVQ&y17t1!q*c7&YVNIP)=GGJ+<~k(hFX68TD#K^6=X3fnX+BsvxnT}r5| zBt^n0gXBY-zk!sn{!LH)2d>%HBoU<7SG4%qV_@zT)l_x<5bld$TuDY z7|*dP#zy(H3lcuMBL2(}l^pY@r`f)F^6qX>TqWRLGO0hOSG_MXx{}k`1V^+P`$}jWsabdr;2q1fJ=IYmhENVH+SVxF-=u{iYzz^ zroBaosx6zOba{+~^d|F>^`5>6wBp@x!>f5P;Zw{ubbBVYod)2R*{{M)QRkGhKcf%k zG7BeVW0U8ShNQINk%Kapqn!@0e`o@DD{H6B1fa-9cO`N-1uN(-g^RihyYhnN<-iE(>(uLsI)KqDD+xpb=zu zy2d~6G<@^INc1JFB;?*O0lzZbhZ~wl0FaKn<=oPFA>>Tni z|B&_?irUE6neG%e65#b1^Pf0act5=0(c>Hhw2yu9a|#2t7?}lTn+QyzPWTkDuVsf= zoB!a6`^JmfcSMB6^?xEmB88qgQ9Aj&3= zZj*l0gufV;(ON_&qnSg~?`YHM#ApTz=UT~~G=7cqw9H9?ar8|axO?YI6s6mvf4)ia z>@?OZx2WetWA0<0E)7}@Qay_psxY(r_cCML&-vgKzmhJTIs&6el}Tue^fk)r3G>3> z5OK`Y0STjorJ4?nUcj=3rk{MciN>G{cvTqw6i^UY1wZ~(oSsF$srn3I(FQ2dDOXPR zst}`uNI@y=_Qs#V=>&{q{X;Reg1#`h@%kTRUC)glbnp*V=ksqfB>sgf_L6jl!1xnuNKA1y?9i-a*seOaMZ zN5-lk<4_L&Q;>u=m5La(8vq`Z{jfc%vPJya(5uPxC(g{~=M;?}@C9>SkOb})Wknf7 z)i*+F0M!7nH$!9oRFN2_MW_Uo=b+pzS0QH#W=FiZyT!xcpdlWKgvA6|dc=&wSMn@; zZ(1%V1L0S8|GSmJSRJdJM$Ytn{bYziR$K|okH#)SsCcDA$-|}0F|f7sJ^p}^foy(U z(&Lcc;d2~MOu>?T6U;}Vh6#-=E%+E2@cg+`f8yJ;gSc;?3Mjbr{WVrE0|VrGcjxHL zexC{qdk$&p2%a1?(Bhd{WPuX2N#gKnkYeIPP66`<)Re`9QJtEe)fN}|i9(9IU?73pfcX}$9w z_95i+M1SLdmVE4oMEx(8@PG0@?EjV}{3ikU-Q$^=7pO_xkCB(vxTx@XnDE1fXbR?b4j}kAOMTD z`Uj1xZ0Xc!y{f6vSn24z>afs$HrQ0~>b?I?m(l||;hi~h|0xfy?Ps4Arq{Q>Gg+W@ zV%-Dq=o`FlFmCdB^mGX)wb!zPo=Do+kMU}Y5vAvz33D}9N}n`V%gwdo7ZD>!CaRvC z=INhMpj3soW**G}oh2=W5W(bkeYSZRA^ic{(Q0kJzeEDE)30o(%6Hbc4g|{urg)C> z)N{o}4Ikr$xD&)lgJq}@PbHUr;uCV2_fOH_KFR$x)yUZp{N@sI#e5B z1qlWFOAzcH4=WK;+%xiw{V~!KC1p9J1#OltDaB~RQ$&@pBKTXaM41srHEA{$_}lR+ zCqw`Qb-bgHfeItql`P@YBxAv6@((Pp5_Vd+I@E&WSXy~fa*}lU+pv{tAG&OjCKCf; zTh(w1i^;I(8KgDy)N@Ajn~EsT|(v)Zn{9pBNz;5fRF0C^n=n9w)Z(YStzhH8p)*TuBsT=J;rV zfHSWOEy3K*h!r(M9m)hs7mo_3RJY3VVheEs&trDEP*+d5F0Ki+q4|QEejXr|Ik1Mo zRd$?hDT2234(Wyz7x5e#)mGxwl1&4D88fEYFqT3%2ed^Xj=Jd%T9qojTao&pdF+hiPH3#hjGxpFw9bOP_AmdjkA1bI1PhrO<1b|7rdAf zRx&0P!v?YiSv%17iE7(ST&yj9y;3c;B$BJ+i%l>oNFEaHIi*1<7Z%Id#N;r4S~(B+ zLSXx+Wh>hX*a?AHYB@rD(|&!=D?DItffDw4OX0VSX5aDRPq00p2lkOeHWGz7{RvEZ zyIT5#6}yn1%q$y%WX3p=;bqN4D)S~)0dZowzf;o4r5i8K!5z30?#R8i_FqK5enUW$?h&DvSWGvlP~tqx zN=1kmT!x1jF#kJQ*bhuz8*H&g#~ZLc_vXf-7sroa_)u6cq+EqGkHgERYaON~i%Xev zfI4Xz-{C)qIK@wU9v%YHTl8P*SOTo1)#5@;mS}q*g&>L(3|?D*(CLLbQ_V~>!}~9| zhf^gt*Tew6AWC7fQs|Y%oKM}32bczFRq<%TtkEr9MXLboD+Ijc^^F|~kcJQf(#YzIt`(nvgRuczksGU+;7l z(QzuYan(M@(i)49&*6ht8%g}=14!6+9>bgpa0~U#hU3}WiCn$4bsb0FVrMKLv!T98 zR`*1~=BjHml=?6$-BD+;upf!^C;6@=#(TOjA0Xe9KEM9X?=>=6)L?-@-73zXFfNpk zUzvjW#OTfrokl@5*6anV5Qh-qT{0&811gBlm+|69}? zTI`AIoA~!z(&pPXxY+$_D&0J${$g?@4BvKV1#D~3_QWGe50)>A7r z6-xz#g?N~4Z0%YcRj?E*3T115UX9O%CUdTfK3Y_XQyJ21gVlJ6d!J-_2eU_XioTQ& zbn=QEXaqMp9J;s6MaKq{v1@$(M}-HzPc7B{mA0?hw^5XKH)O z=sg!Vd(EM+++TiVnZ&f z_Sr5erq^<4o-%B|YN$*dG{l948Clo5ZA?rs3c+9Wkwl6@{u&p>bI3$Kr|w}q)naJu zZJemWd+e&x`LnmCKI%@dGE=G(QfgfCCbBh~GfGU9VqL!ydpLYgTwa%DB|$t-;lNxs zC-F?$p|B6NNaNG26YOmfm~W%(#W9UB#y9t(S1?myJEwXVv}P@$CUQfgwvo%_!NJDE z6?y@^%!J+$Qe`7f{Kg0jt6KFcf}2Et|4y^6s`F}fd007RLcKgKP@WG1y6;sXov=nK z$Z|S&$!Ni*RETFCFCUt3lj39?v~N#UPKD4>wO&DgpHX*He(7bX?M^kdu@&`e+nKh< zV*)V_|9%yEluollJ4{%vBFj4!%5K9i*`o*3(#exb!>LoamDXLs`(t(3{PcHzop zy^Z%eL08iG9WYb}VBcA@Tr>6KXtX5(zcvG)wLJ&2d*(x4jXDRyAu3SFbzM$5h*gXPHSCR&@9R25}`kT z7Jc>wp|>BNRK{?>P|%F8k7`pwO+5g~r}h^zv|P|o+MjfDwFrxTMM=LDJygJs@STk) z7iI&l405~1j8R2`OlKBx>5z|~dq|0A5U12D$O{{i0_^E^f&Ob3ziI`=RkY6VhsV0_ zq>PG^Tg{vDV?>SvlK1A3N66id-?Cc;?RDiIxU?uP6?u;A(r`hcWBxG}WIOjbAtT;c zt|1j6b%Ac%sGK>$1bM>d{1mJTn$>AxtkPZcq;aVB4J|;$C5^g(D`5E3x+pbXO-`@8 zbQdoA-2?n0KB=Z$WA{V-DRP_QPBj^K#9cK+&R4;QZEoN3)WFHiAbLz|t3Z65qocUw z11eKOvn9LqyL})mf|8e_*J_1n}W=bS<(h8fh*@c4ejU5Pt>=gaw5)(l-#AaG8`Og1ft-@*p)XIOrb@X{I;OC zK!hkugch4hrtr#3kyt|J-p_h0Z*_nSO>=Ko{QxvCIv4y%?{V|dTxba z<{7`4FU`>MRd9n`kn?$(GT+HJxi}p8ygva89%wyIJIyJt`!p^{6s`}yyxU;m71loo zZ@q;s2#Rj#U3L+#yqF``1*DV-z_{sLRVq362*s|Z2-{Vsb}1uqVanPs+F2}y?67V1 zqmOAOi^37>^+VeO<)AMTagYn;-8V%=E)0bZTSoA9osC8^jOrc3=}=aEk*>MoogsQv9uzm+$U{@;ur=_8-*J(mi!3~o$!#EFwImMqrG#=Z z1{%*ug5qYQ)njCkS=N?P_SIu&8@b7XzKDoe3qu8;JYpECs*nuXgB-%GiBjm1j*bzD zb`pio6`kT_nfUOG)i^|!e92zbdGWOlZO6W4 zlQe!Ow4gX<>0RDwVHr*z{5i!6QOv2I9!ri9k)RM!Kf(N{|Lw4&AT^^fcI-%=%$cNh z#}~*z&hwK?7+Lh-pd(?TBY`Y-8s3%E!!NNtEh_E+M zfRLkvZF~d+3kqJpb>*wEixV@}4>z;Wf^`fMlRJ1UvuCtKFzJS7+5(pI=mV*{es)xH zc&W*wTzaeZZtiu6((|;D6`$4edxdCw_i(#-x>q#zm3QGDJ}pDH@b6cg_?M{D=!!j= zPZX{d(TliDM|}gBWqI(r9A1yGm)wYQ!?;1_@uq-vBCj(;>;u z+@bnv|J2}3#h3Fx_B>v~t4BA)UnR*@%5-@FQ(mXjJb}HAhWq-_pI$LveZkR4q^?0eO^A2^M-(9|Pz6sNTf{Fac28Wkz#pf09|7cK`{ zftb@42}~nd+<+Vs26LUD(q%j;47dyg3Po?n6XK~yj{Zt@^#SJU_KuetNcf( zA>c<4%5u*@<7Xj{TqM0dr3WXiv^Tb7x7RcK(IfH&tzV%`*lzp8U-vjKpM2HAk~~)= zpo-kClB};F5!{kcaE2*NJ{tQQ?8dn#4edXWyhGKa%1>nX)uCyJn>GEbTqu)Y%4_6uw=<;siAp~2Utixy|?zt1~yf)5pc zh*p+!n%D|TwRWkMdf^%?-1CHQUe5djQZh}H$YUyazTniw1|t*V12j|V2DMFMQuU(* zwj@ETNaR#X5}mF;adi5Em{3Shxj2xoE&(5;Qx~Wm->qsjJsHTQl%iy#P&#vI-37`e zt1)Dk;o$NXR8CnZ7C}DcaLBqOpS8C&sSakb_|jaz*QM3hGjX1Ruft;t=?~&lr^<|s z9lvlWa*2lM65neNsVu!+PgNIjCA642u6pl%S@xTuu^TYWTS4x_#v-Hg~%R z*e#-27^Dq>;3ChTbf9qZz~1IzQEHxDQNavdwmRzq{Z=xddM;%#(fTLvE?Lj4bi){& z=r#RdXsmlxTh6fUf?#|*1T;*gBUJb8+4a_xce$9p+oo((_OQ9W zQx>K-wG}}$?H;-j#$wT6-BZn?%#ndCS^{_O z(L6)YQ2fV9pW1v%6J|=v0fRDI@jdptT&7Oay=)J_fX%nE!exz-;&B;RzhE_Jqi#zoLT#6vn6bHS+A77I+xsIyYQ~Rf&NiK#cF(& z`#)-#@xSfaX8pfV%l^+2`Y)|4Th&?>TNuTM^mqS+00kO~d2owdqMVwBc_ndy-|vNz z-vn}z8k<%r^iH~VjeiY40l)BgM9=%+@%Y{gxwqCfi^Nx@#rTN1xR{>ZbK0M$v)6pT z-_LCUBJJK01yzAIkvtGgF?i*5C>mMhwVQA{tQ{2>Ms$hCMt8&7q&UQwPzh^KV3u+U_FASeYx+)2F%CR> zLHzEPHUSW9OZrn6G=ZU?X2q17-)XQ`eMXTDcf6t{wIi z5hNc4Ihgv9q|ce&nYIazG#soQI}LjkmIDc?8vOQxxME&%@+Q_#T!MiVa;NBzP3%SU zN`CFW?c7GoT=@@2M}{t0g0{R1Y$O|~x1NH%vJuY@Q|X6kv9{pYa@A%hZTnGln9MQy z-vgB99bGEfF8s?$LChwYwCT$kmWnVz78A}v+i-MX3}pIvjDmFN-7&^Y8)6|Dyoj~D z(j~c!4l-%m$v2Q_W0#^EH3-+J4c5~~Qb5m`^KmimEb2fKDtkjHDyN?CqAo2v~#{dd19kkj7zIib#6am%)m*9L8{?5ceLp&9a`}Ru+}c4w{SHgKmInt zTq8zRlM<*PXW?&!CT%iauHPYs%T_gQ%ls5Mm1p*!EVyLW7noqz+N5eHDP0g{tF;@b zb%*fKe#grS(~-YqH6AW7`_X;YVdhy-hvg=b8*ntqPIp0YPDLek*N|@{oxM&ylXRiz zr_+$@s*hH`ib~5g&m==EX(~AcdzRc>Y8L#gTDf^Rhmc7KugG209fckQ;E_2Yps5~u zGqu$I7{KzpS{2Xm^^u9(XJwOScniZ&AyfG2a3Idi-Hc`@#)hV}cpJq5iC7v;WJ48b|>o zwh|A!JPHPR<_C}~&&BWTw;1>(3YnTclFL5essF;bODD7wyT<`?<3@b&t{?Xdapwba z;0EB%G7pU(!fyh>hz;n@G6|i?4nuq`H`pQk0rGXQfm!1miclrjrNR?HK{qYP52=FIFlh*-t)?E8*v}Ymbq&<%8PiKxB4{qy8fM4v6!zplmtS8 z_k>-;9Na?@V$KOZxVGlUSkOPlGigp?K!Ob`aO%YXRdsb}F`u;AR)K$>S?pH@5ECI7 z?E-XN?7OBkL0HY;1O^p_1rd19w>GBCH62>9v9cxxc3Vw1?IV$)cu zakcBLz?5e{wgw23;DsQ)t!Fuj_|LQ8WHMlRqWdqT>$C-?`E%R|9=}~B}~fU zFrtR~B}x7SCL$|Qw1OckC7};zU6xa&5LHSbNr0LTPB8D0#G0O)kAUpfcL<#pBFuyd z;mQxlR$uRa9pZjD#m0SneSX`sZP#fJ;!3HyOH&jL%-}{@^``*M+H>|>?35{yLnquy zQa<_>ESo>54zb{clCFo23nG5vk9<$E!YU%cvA$$EPW0sri3>-6ZqcJihI-0dcw~|X z$k2-*Du0U^3&MR8s4%7zbMY#o3+BD#lY~Qu3!2ROH9}i(7_D2^c$45g;<5f-T!@&y zJ0x|P+;T0yN-rZt(C_MS1wqPKMzB{jTq@Mqu9wxhxa@0?x|U@KW}6WkVrE50H}{Os zE96qJPmHVwxo+SwTjw6FRf@b)DYHDt*TkTyVaX=>`LedVZ|#KHK$_IQ?E9P<#kDL>A!?5kohzvbXoGc!r7p*K_g@TzbL6fq;M^O< zT0Y^=Jg-PptFB8kt0o>Z4cZ6JI_(8b;n<>US`ZK}523hI<z}@d zt@^o<-|psF=%a>ucaB77qIPF3k)fmnxQuJ2 ztc#`tEHW~nOo(NTCqNFML|GJzrd5>Ub7#5WDoA_kXTgeXzkIhd1C{EfQi!BgipiVm=#%sbF^lXNuCNf)h$(iKA= zQLBt0k4mk8V|(n+wna2W$z;bxd8{a?m~@N}$#jVpNL8)lch1>fj;}d~Tc(_>l5ItD z@=yTGYRXfZQRS%2nc1{2)wss`l_6xBl5C9;mui7Nb8V9yrVxXAwosJgxrdSXzF%;e$kEE>uft279Tn<3~0W z>iWnIP0^0UMR~0A{Lcz9{;gOyO!u+~Rt@QPQgx&aTkfiyN`@AV)bd;?1PK@hKbOpK zfoqAQvBi*wk}=PXcSZ{P)C1hn)97`TCYVj|rHpVu_dvz4l9Ak!9Jd+|jYaTK`6lXQ ztyN0Db8NU%XI9kfUW+r+9B28$Y@#UELs4ja< zGDU;Nfv#6};ljKCr;>=OYdWy)QfC_JDa?neEN$(OeB!#{Ay%bDF_ER!1UOo*zv??& zp-yE1IH*$;eZ|Di7Id9WRh$`4g&6^mw|k!M@9qd&Ry$-USA%a5WvRI`OQxjNO>-7i zPyBO#c_AjGVW5RfB>(Evw9mDlJVoN5+xPbjcFP^1VgWK4J&s2(Yad@CL9|KWDXNsIJDA0}4 z@mC_osymEIak(ooyx@E$yHGrwW2%Yg9VJ3oIAFg^bfJw-wWEBp^=C;mEq_P&tW0;9 zmMFCh>iFC+(6b05)%Gbv>rr+hV?fAyV~3T4ff&@%4Z8?ei8}qMpW`)NpC5iGb)SkG ze6GF*VwED6#!}+_*b3*SzNV=~KKQF*6Cw>5>57q%NBICP>Vrfd;7# zW9~z3icmF;cHmKGNhf_jCx@I&k8B0L%tP5m_rBr5?+;pjwbP1Y19t??Uc)LB&ANuv zC@R*j;G(OrWf<2>l5WJ;xylY~4xxIddfI+`0wPoPzV*bCi;;?ipiq1E8~T`2E#$l zVJh(x9j}5|8o7EK#?N`FxzBYm@Q~sLCC0n)kVu>(qWve5co^F@ar?bQ~UX1H-8FqTc z(#q~SiO~F}OwKq6*^;7dX*^4um2u(xJRjA+RtNE8zHxgGvZXUebYdf8UjefD{BqOK zRU^rgL1{#a*xkAt#^UK6=QSue5b+SqSxA+!9V?NFztF%T9ot$d_S(OBlEdO!Hyqx( zC>B?So2Y_&*QT2Alj#b)#qJWrSW0VawBI~yxD1cj-aWwX(y=LLf~Sa!*d9asYwd!| zy@{MA?lYo*%ju*cfK@33Y}%tY0dv7H!d9i&+cP8idCO0=0zGz?<2G=#LN}PUih%Zz zXO>5A-W_YF|8YR9?)Q?pX!U%*puZ*j;1-ZepG01*rygRtiLgWBTlIVgq`uy%^5+WM zhK}VZ@KGq>!=!#HXu$Z4FT-Fh2-S;*2b0U_ASmODF`y?4{b`o7xm|$(hJD)A;pR#| zP|)Y$!nfI(kAV?tIqAhntYUU=m^x;e%74enO&@K#qZ52*euZ1B5lN;aSEW9m+nf%D)0mL|pno)FQv3J}-UD@5%27LPAk*Gjs*wH@jtz}$3)v5%?4?NDIkH=l+VZ) zpgrcg4pg%1a8nnC&boMQEdjuK!wuJHyk&cHa?4S>(Q=2qWvR}@Z7+sGgk|Q>Eg$#q ze1fNFtNU2Hdk^eMD(Fv%zvOm6`l2{cQiH}N5&-H9 zB=fM@xFF8NAWkR==Yq_&L*Cfk*`~ky(McR=#cTI^&m2%}cch=hHYUlRg}r@Y>|t~z z!2Q=#Amp_8ONW>?JtJrlrX_*o)*c>OKlx22N4GuSWx}cvOR*1<;I7Wf6{KX{Qz9we zz5SQzXQ_8TA3XH@B;0+L=T|x~*3Du!rQ(Ng`OY;c_YbawK0(v5eA?o2-TnV+zSTL^ z<3KmR%OoEzfVfM{>t{10bjKy#60%Y>hKyk{kjEWXlJXOd`IpjqM<+S0D8c=oU;C5s}rX1c=NBP-w%4WbU25% zc6G6(!RiT+ZITacRddX^Oz@k9`JT@4v{|Z z%5+I!EVn(5=oMb;oxbl89PH6VfuN(C3<2w|H=G?xr8O32xHUj~-&1Gg$?rnY=Wc;t zZI1Hlh0QaE^4Vxldp-zoI2-VJmLcrySUqM;e03;|-W2gcuo^@GL84{7UH0ITBgnQZ zN!MZaf0W7L%*Xn*@R}``Azl{cAOF^mg1dYbbHjcEgE;?HKl)!g?b!p2tN>;vv=+9ecK=SP zl$E819}qyzK2R43AQUukr~?nH6ii4I2;8=9{Y$<61i9(R0Sd9B5S#}Xica6&^XLT8 z03a5WFtjS2NVUb&EG{MOb$p$3%e7s8^Ko!jQ!q7YPF9|)Z zt}gBaF#gqwe*}fy7kuCOw=3QvRIHN9meELe7t5pg1K?7g{G>N0tsi6piYy$t$miP%OWFYw~NFS?4 z%n;B_eI;CN{~>WoMrbovDw(y@U^q}WG6d2*T_lC>1e9^YwwNVsn=~u-}|F652P+Zj)H=a24Q$aYs7GN zcI8@OQqSRPapZoe4SkN6f|vq0Yfe*(;3Y_*UeGuAL<=;i!Mz`dk^-wt?~R|aJi>|$elTw!#g#q1DMz=kAi#?`E7DTBI)t~OD0GX9 z5f6U_;iYTj+ON@Ht95Tg^=U`Y)X(iW`L;Y(f9av|f(4mXpa z*qtEe_`I5PBt*+|X+E5+U4ORm6^=fX8>GC|5|3=&;J$$G0gEqR$uJUp_BsfK)wK{x z66@P2y{NEao9^p)rcRc4lBO_Wazj$a?~hSDi!bUJCW&a&>O|6q#m(u+f`jJ)$X#AN zWEnw*PJwg~c1t4tbGR?GWc9E~sh{KKV}=>mh1iq9hw6yfybYQ%B{F3-^mnmf1!3n4an)Fmn){WU)wrg}!xsWD_dg;HOSsNeF`nXLTzQ^`>_E zO#{t%cxuH56m|R2g;JQOz%Fd4*!IWY z-Qmf-(xU9HD57^A?$@E+>S^H4!C=diRETfge=1 zf&>L4EjXWF5+UIlQxV7SMwM%{Ah*;L!EmOHwdEM;Pmux`v3{%wv!2e z>Up*bcI7sPGa1w}oX4n1g;{!GsbI@0FonX2y=0^jf=BPWKS0-Lw~ndA7^D=MB}iPm zn6o)tfAy!9w@5bgqDLKTsUSmFaZrWobFy$wB_#I0<)cF(NVga&hzw&E{-H&U5;3L+ z#AGdmmN^@XNy6_@U4m06F=WFq8ZIo zkvRk^qedCJk1LgR)?-uZ!hfKlJwa1aku|w%(AYb=wCN9nxZ~i^8d>}NA}cm?LzYs~ z{lyOM*12=M#0p^_`42GBO!uBjY=>yK9nexDN~533J#qb|iiWVe%mL9T&8;pupvoDW z(-;|fa;0)Zm%UG7F2}Ae;EJ5qo^hZk^X`Jy8}MY$v>y>`8T>KFo14ulP3nu%Te9Or z<%@HbS3)xZBk;(s%ceQ59Pkq0dLmj<#YbmVTmJ4VK76$sbbc?a#pGPf?;S|mLpE~( z9bfdickdmkUP)q>3ets8-WPV`1?{UpOt1qOn6Q?q+Y3>;Y5T=s0Drj9*xFfE*4bNS zq;E%lRHDi&I@(xFFe0w{PKck7K*N&}u>j#Z&GcLFursd8UB!5SYAX0*wAp@6A`JR7 zJSmshJX+#*mj#~snS{IMfi3AF*y?%7ImIOJ6mi%`FO> z8xwXVCV8xsz7 zluy1+PM2jDBWXWZ>4qg2NR$j%Nt4oAwDgUftT09UmS@pM5u;o|if5Fxn|Pp4M@a2@ zg!2A64K=$lsek>11Nxtt(zvNo<{J=(Dh>Xwe8%pX3Yf&Uoi2^c^xq8W%vhixJ|2d7 z<_6nVxRL!9Z7FU+%HaYu1&f_4L|PSg2}G%0(J?C9Pt53$A9p$HwZ0l7{rYS37#T@QnwxhAx!%rxFrl?eId3S(Q1;E=B?Z=-Kt0;d-Uugb`;xqO zt&^%#KQr1HKo2NHq}?c^@eh98Y9&N-vQr1qSq*!$MTWS_5~1oLDfLQ0w%G)1$eav= zb(QY8pxHqVdA|sY43RNS5+hZp2$hHpoGm1-#i!1Q8r%r&jX{>a)hRRylsGD_^m<5@ zn%kx83PcT9R4R;9r+cOcqDBsrsg{HYnc8tA=oWcdBuGVBMARou1a5I~_nto{RYH*t z3gcG-!VuT75p)GtwhKgy>Wlen$(3))_3xZ!6LxI2ZiqcqY@x}6jX#mU&SRJ_Kn*@dEJ^)P&kIwlm%~+HoONri`(ru4 zhT*Ie1GFVVs3C;?BaGC}NLL+cs@yMa<>8WV6*Ad|QRYEDVgt=;U&EhPaGv}DoGl+A za`KvdpPFugh1K9|tcg*7-)Nh{s~a#8$m5Af{Jnfo{7xGqicBk?uj|AaKp0a?OP^>AG|^X)7)w+9mH_v~p%Nb5MmgUP@>nJ7L0H4s`j(BV67jzS(iC3|wZ z8Z)-ITt~dDHtfWteOM&LrRI@Nx<2>c|6P z`}D5Z43WuOeB3jMOgP0shd%V>M{JgA>{Rd2+(D0qMh*rs7{P#J)r)TSZH#kaSTp9` zTJEHfHWnEN&6I}X(wlKWHxI#Io8s;gD-Vr@<;o@F{FU|Nb`k~=fXwBQ(QDmn5fz1i zz-qw{98Hw?RIj3jw#IhXJwhrl@@jT)!n1;DvkpDd=tp+ddABxGmD~)DaiY!1QAWE1 zK?W?JL)1E{R(~-iI7U{k$-6`GVmRQci5&J%N=#8cnYPjgI&B`{lF>}%$R2l?C(6yX zfNsFU9!9TDNvB_;785IwtR2zFUzI33M5~r@uJbbZe;|UcF55mW*)7|HaCn_{=DWn$b1MF#IJW7D?;h)gbE_1 z|4jN@QdfgmWpK!jGv&CYIIPaZv?ZSLqpQ*!82?1g zD&Efgh4}P1s&o_ILrk-DcTlT6?II-dOvqP(3|5E9cQZ+23-KdaftdgIke2P+kbGkG zCz-EpJumy+9k_Mk-uE6~<%h@LY7}N3wQW20hA4FVS?`%QFLgCZwu9sdjG(D(I(8evH4ht~|TH@tN2mt=R9>wX})UnNFFO;1QVpHradh z7kWkP6Oxk4!h(F@ACx*getcF>k^Rc*%ah1Si7!l z{f~0nX_nq?R-%o>7@GEi8#<<7MmsGHih+$)(x&UHfX)?uC@3`rw+ZmCk#Sy<0Z!!G ziOwgro${DNTLt!5WgQ3)qGAX2xHOw&lsyP;yEMb>&yP@UAl`SEEK%pJmDaHyceb}E z@!8}FnJvLuk&-}YWCpc?x9)P`8rs7*0&MsET8X2%?Qz}KWRhF{tx^Sbh_ta#N@)K# zb@v}9exL4|UhYLlMzj`l^zz&O)UKgHsKBTn>-^lp8=Ezzhj)JE4KbDV_0_}($cf9b zkCWYBFbz@W;B^hfwul1zfZ|TAKj@7IJj2vy>_PU%J37Pf;VN?=koVx$zuGz5G`raX z!$ei1Oj2u?B4Qp&58=>+Z!{5Gr4w&soj9SPsj2^iINdbzGkOO96aWO{t8AKJ1R+?P zyns&D5y%PLg7#$<>NY*z8V~`+B3&Tx+K!V+XnNLADE# z>5}v=-m&d(oZdfyTKc;K667I+a{fyaM>%eIVNm6fJKYmk#t!J_vtW0NGyo%Be&Zt{ z^2gws+1*_Aj)jkD_;H-6CefF996LvV^)ey)qv7|6p^mVRHB^5cc-b|>^q)wDJw$-N zC zjvaWgZ=Q@Wr;gqM4qp;}@`!q|u^^9R7^vzOl#>T1*vM{Nub*pwJu>V@p;ln7TP69iA)ws`I0|)L7ED zaZlIl5HCiVS#YZqh4?rZnm}+<;0;sSz3HO%&Y= z-^7UEur-d+Yml99Yy^Wv+ee;df`n%26ibHvM#x)uPt&^v)a<5RX`gmX^M?;plwUxz zcO;lMc8vQ3nRONEzsf4Nt|qmvMh;LCrkX4PgT?2X9E&wGYgsDT^{SR%H#PWFM zIVbp&M=f1XaLqH5>rFR?J}~p9N~ha9#wz$XaVSQc<9q0k^n#7sj#lJM`bK%pAs8lMtxi67+ARWG$rxiEyFFJZ z6QR?)ep2@M^pn@_?PUr25oe)|&yti4`o-RguV{u5(9HLsu+t5z?6}e>0$L*r>M6g4@I{yr2=rMyAVd{K^!_*}Q0Wzq22Y zOB*b1ucxk}IYX)B3#5C>*Va{J`6LYpTT>@a+oe>d7n@{~rybWRLM5;r!$tpMx|U#? zqHdL4E6(O0v=iO0i|&M>l_4g;jek+CI&{xgo}w{lWt5a7%RuW;%OvGdvT%bkm@>4Y zvDu25nU0-AvpopOOk`3|9B^OzxSkQ%$9D}8-U-+8_zp$vnQS3{VCFnSJ?@mX!SL@n zo*lVE=ncPJW8)8;xr5r-6CE}Q2OpJ#(koEv6*F~-!IWoDNC11KpY7tQ$}_sUnky4) z>k`^81aU|`xD^61kcv@Tr8rft3ZYgDbGM(W^KXO&tx?pfr}=1$z{G;heHkeZ6%l{IzA zfBqXS@3HlGq5hlbk;nZ%B253Yh?VF6fC>ql18mJq{#~*BA8|eZ0)|K!|1U#(HASa& z5yVfrdg4*VtfqKGVVIJ(ianMDHndAHpL~zOhHUU8o?aQ zG+j*2G*PQ|l$?dl$*L{PqHC31RA^9LtiBGka%xT`&e39WuT^8;orE>ARdw5?yp1Oq z5!D((N??qo7eP$fYcy~J$R%INM8ON^ND=vz6kQ%VSN=i4>I0tJbzOUgx zH5X%damxW7iL^>IZYk`<7HOMyn9+5*+@8&~ToAM`+0%CVyy2@)YECYgJJ|zc{}R|| z&0D^HdNWFm=cU}BZ7{tdARas-gqso+2AP#EpAL)Z1i{l=(!;Go3DyvjKibXfBCZGSoh@DLX<08P` zY@n7J{|<|xa{61)@13uX&F8L0@#HS*rt_xg`4i(NA-FACI^9SEvo96UG@u)5Or)^W zkI5rVzZx9vK@ykLO_jLmb7#zc(r984gRO}?!%`dmsAc@j#yI8yO0>NzWUgy2oJlXG zfJsN7Y`^S`{m^03*|jmJkNq2lFp`ues;?H=C&F~QdQ4*&TUZ36qP@_G?(sC+G#}Ov zL2~VDe-2VjHi3`?It0M`owIe0A3sk7~mrdCv+upgDtyY8^N4<*iGV^I9x~-lFhDrgJr(R=B*^S zWz(CXEnPZNrz;7OnVv^@cX3lfqSb)Y-eY%mAUl$;oG1Mu+hvoL3E=F|Tm{-L zQcbRm>U!$F=XWj&|JEa5taj~8kmsrwric`u${=gy1-ab$sVmFGTQ62xI#dLnpP;8v zjMOWs1LA@&DQ|&a;K0^?4NHTSlq)Eurx_h$2t26=k$D%hDtcaMG`jZ*oIdt~NvspZ z#_CHN_YV*sb1=4Eadmi#X%3pjZL- z2{`Vo#3}ea3Rq$Wdv5;vAEy5L!8td3H{zyUs9JA!Nm_bE>IdN!>y|m_fnCgh1BA@H zn}pCf9{MN&bEEU;UJiXDJ?RnJ8r>{ZJdfxan(GEB)^l<9UEAeEzQ(n<>tb#e#Hx82 zT}dh@{|cdS{Pus*-SFW_=H|LI&F*a5i_tflo}Vi8Cz4cLh2Kovt>xVL_T+KC~V@FCC|zz8%PB;$fD`tHEF78P zaU`MOK|l?WxU!%GcP;smW{tXsa&&@OuQ^Fw9GfGzH3Jzt0=y_BD&iXnuEODthlS_z ztt^hxQ7Aq?U5W%;DELz38v~fHR(_R?#N!9{a6(jMrI~OucDCT0N|5AFY6l=%&&@Y~e_uC-n`ebLu ztlp6OJoW+FCQWj2Q6>#?G>yCXJeD!As5)dhrt)Nlv^y$(KGK>mgacjLC(>R@QlgWNcxX@mA~S-&X7a)F{Qz-(bddPS9O z79u#c8Ountnc{C~QcB4ERzO1C(Ba88ONBVlJMY^=)v4H}Iw!Gi8fZW`l>~IC)U9@z z;EkZ1$dyX8c|I~+Vn?3>osDwtQUa@>9z;QlAv&RQ>&MdZqlR3-WP{NjuaSOUsn+AX zK~g&jPX?I|G?19BYiNz62C4~(%Jq57hJrxn=I{PmgX%mo{b{vef@h|Q8gfJn z=EGSrQ9|;tfr*f{8WQ7%DUU2!n`b}4Z$+5SI(bNIm>y5H({LJ@^V z1#q!j*WTiecrU<=>!xCdf5-~GGNf8-6X?IB3Trf^W9W>Iad1K{ViR5-zKdDlt)TLp zJN8Z1NPAg7+dz)5;bRCZ!c96EEB8&W^5jIuRK9jbldNlNUWGJ{2^me26wF^v|Fhay z#EWWqWnp!3y0I<1f|%*T=akvk7P-gK{}M)ydt@!rw%}LZ*U=#?M9p5w5n^UPfw?Hh zmN!FWanl_HIEjZS(|oiiLQnEkzqTGI?F!iDVwP9%sg0a>#|Jol>ex(~#rg69j=VdD z|E`N-+zX-64@7Y`#~fQ|KbUy;R@I-gYR$M;M5X}`&T(aoO0iK|I_dLD{9&|ytK3j^ zWvWgz(XeJKBneMx?FTF#RZN-Z%LN7gtWQ; zRTdu&F6z-9#@hJfBQWLzFMg{zrG_;}G#)N`rRsoA480|;VWXW|ai^C(2oYS%KXx)! z0ykznfKb(jMvy?rommlObCECQT8%cQxmmBH#9ODkMu)v&;pYa0hY#qUffrhJzs)tMssUrT$6bK8Cdc@) zsyE2?{?9?ELQ?IyN^7Q;#$hq%gmL)2b*i4AtJ|MeRwB-gRzE451U1apFIP|wA9BE+ zH0Vy#r3sy)wuL=-IQ4tRnSJtiD1#-EN_)pVuYJ(?`w-gCF+W;FWt@lr+CUI^?h}(| z#!u;fzo??bJk%9dZbv>KEf`8Lp6zTb&UwiMYqei$l7i{9p3vwwv@ZP~IX`AklCkSu zzs!3v>aLvP`>O$E$?7pyV4!Bcdv(;XiLh(F0%&OSgB6q<*P9NBX{Ot zI?e59nUUg|xU7Y9qOaRj-k7AeWHf1agO+?F>$K*EE^{M!!v}^9=ZOtD_pqncO3R-! z)6=W-peOwY=+NcvBjwV82%Hlqts_3xyI1ZXhYz$uBr2hVwk=LRu5xlOW;rD+so-Xf zywvD$vpo~ZSMy-6f}A@iWd}#=ZFXxaYwFraVJ$731*MJ^ewY#5r9EB&rm{GF_N;{c z!-WRG^+7YXc)M-sfY%NL5<17Gyu5#(q?bng81_HGOD zYdGA|9DsU$&hiWq*}tVabiXm6YM#`co;8Caig!*&<|xbvF%f(-8vgeY46lDh_N=k> zPm5f;ko2ltCFD^gkCYV^%ev!AlRGxDW6o=sqveSGltt4I-|}+(ip&&TI~6nd-zHu& zw%Ohh7uD$ScWg#?EjH_r!gucp>WaN@q8g5l+UV|`|12HB>HK*lhv^XZ?{H%i4OqLE zdA3dh3fk)SRU5Q8(trDza^Ai-G`Es7=E9yq5bd%QvE|X#A{siHt>ed?Nv^IPQ(6xp zFZf?WR11_mrwIFxZmx`8eGWZIUz_>D7YurT!tlEls84m`%QJ3&rTnH{p}7h&kKbbu z+jn2Wlm}ut^28jC-@w|Y?$tbpqvVVG-8I1-5@owbDIM_@#PI>v*oB`%q8DwFI*+VH#doI*l@hqGi$&@9 z2u}H`^fD!UK#}04rxmK?Q8wq8JnkXH8rfx4igrE5T@dTY`8yEodQPgRcPPIlSj|Mi z;~?*EN=lbfWsKT9HolJ@qH6y|+)N045zN};WH7_5056RGDK%2zZ@7(EIFz<%h%e9< zaH>|DZj|+_;aVt)fQivJ)RzU00N#KJD{uUlg#qP9`5lG)hIw_mZ5{T2%RUzPC-yoi z=@#e#aWaN@)w2VoAw8N=y=nmI!Vbgx@t_=TzaUS<)hklJzvzLY^1oGOX;kqp9uDCHRgv&8V(j4jXev>f;-ql2!S27@;%_H;ly9E+p? z<_SKM_lim;GD9F_n3(tAl4LQt{oKzEA+A3Tt_dg_F-gcAdm^f2_GmWy#iTtdjH{@> z|1>Ck_ZsjI?;i0&v34gNJzuQd__m;!I9GH<~@B^I&x<{S&wQ=puFfZ{ucBZCI z$FyHIYn(#>n`Vt(5f6(2uhVsKQ-D>LsfR|jZTg%90lP+*OQDBc5x!c<(|zU+wyK0V^4Xx2rId-)%pY+(;G z5b~xk^R}>)R6|nNogdYEM6@HiD?wJ@Ni?XJZ|+OvoO?czM|yo)_{%`wPuCyo?i&Gb zGK0y5Da|Vsq@3mnv~M-z?`(S&>P6?jHL7-O!EF3~et=cI94h9LeW1Aob-xFQb3Uh< z=DtYwP_a5Ug=yndXcMPh3?jf)ogXQdzFF`r@Q2WECK*LcYtsN7GzRoYY5`jO43yhL zjP!@+M%)P3E?D~7FKf&(VOS?s-s^wGUa{k*foHB)_XKEe3a2^B8IIK$- zrr8@@R+5OtTYyqD2;bBEeBu6AJAJZxRec2i&p+MY`W@BDX`n6R~liLJA! zt&yXL{l7AP|C87?to1Mb&cjzu+JP(?Jq#2i3gS=jbdq5I-Bf{J!M`Majv+&;+?X69 ziIFh_On(;EG;6JQsGqHMs8luA;1C%Ts%|`OYCUz>H4isiYNvg*KXw1%OA3DV@#Fu~ zdDY`I-LvU+lwkL?0cDUnXC4*^iNI|JD#ICWcUt|IAgc~M6w9-=Eu$1)IX?w$r3 zqcgAoQ zfCs2|Vlb2yR?5(M)d$zGNIYe7#cJz34ZpUBGh?uit@#8SUt8RDG8f*Z^vlseRR$ui`k z%pwz#l>bVqd+0qegQ=`2NFixoS>hRnbiSY)3YlbqUCEHcz%=nP_z%xtI)eJ;2?c+o z#)e5oVGSoTKr-`9CxZtk{49gC0iD4gnEUvxQV6&JPK+?1J({>V2Qn+J%ZZJ^Sd5lD z2MtztvMa6zxn^z+AlASfl-T;(tNYxunzlbNvYjS^e@1T;{r;`;=q?Y;S6v-qZ(Nl3 zu*!UzIPm1hKa z5c055( zOzvZ?Ki#$3D2;)0+0H1H+~PG#_DDZ^^HS>~Bq$hpA`ixKJpY+6}(#w zEyS*$wEMSNBk;VLPTAgLv*0fU&T8bwV$W{8(AdqNg*`iKE}flXO*>beTfI{9-WUYm zamE^6>47S(*St%@xQ@{l==*WZn0Ii`B6YWk1jOMIV?b5-y?craRk;Lf| zB49+?Ga4W4gJFTa#ceO|BZ*NU-uar2V|}TzWFzbnq9IthgT}$1 zGm`ixtDZOB=S$i(IDN!JE&(0jW%T_rjCe&Ei=&dZ8 zfSR_alWY^_tw2t;^wH(j;TEsl8VVV+!KeXLzLxRHKVq7i=1Jrf-lwWSWxpiY5{G*>|Y=^@xgawI+A4{K-$-~u+`5+7)m;+ z`X9C}ITVXTDF_P{v8266x{ZWec!AQ~*X#I{-Mg?v9HIoef+prdn5@y1pV@84%VClI;R7S^=1h002 z7-KqHFfRY~XU0Ziil!ArhWF2*P#n-@OPr;l#Sxgy77* z7!BmnG|#{i>+rb%yg(q`<}pHYC>vG@5=@#Lyj-g??O!#ESTPqC_CtzUm7n6^^yf3H z<8d;DO$#CXhwf4Ed#0g>dn75?yKB=VWeseWsKzBE*$2lIG3c{~QxMhCflk*k`+b)N z7__tH;}e5SgR2&lw8|FkVxy4T9EONNrOphos19ArNILk}b`Nba{sLV}MXF7iIGmpg z)e!BEudE2aL9suUS7DA*6dY;QkTw9vE?6))LOWIW3jBUgM; z$m$v~L&lTQbSLSxiny5%UwBP&Vw>K>Dx%0~1GY-~XTqaFjK7$`;o4r#VnH`66^z3f zwv|D5t=W|9vwm!=3>jW_9;H-b2t9P3g)7H*0^WA0Y~N&X%b=``oN8v8<(2azFv-%J zk{Fk@8l`7JsKOcDZkwolz$E}AathcLA+O3sU;7;qXLXsr>CjABS$jR=y)U%6cQA)^ zo0dtGj<%=Mp`fv=eoI0ss+?2XRlA0IZI?t2(jZzE#o8gVVPw+Y^_k!HH$MvOEzRoQ z>J_f+BVXbzW6I@cM{MoFF;z!qnTHX^@+G_vh=ttY46AdERPX#TS4Xa!Hsdc-l%z$a z?WW90MF-^paXKsZ83L8pA~C;091oA7puY_yYf?tiX_s&#F1R2z9)@_@L;84d2oSwWpzB4Zqd#9v;H3-kn^r~K88vj0G4o-B0#|d#wjJUUW~F6dw>za= z7N;_@>INP1MQRzyJceG@6Q&+4207sPI&$!l^*-vVA>Z7>hk(x%>fI!k?9Arg zQ-_tkbMu$;!W;QWhp@m?BiBgxs;U(7bKx%jLv!S?;cSR34IAlBuC?ess=J-v<>Oa# z-LzcVaoaWHGT+nQ1Dj{C2-17eOTJOktH^ z(&hN3Ax0k>6hx!9Mar1|-7}Sx*~~4G=L09qnp0RmaU94`K$pK9_nC*BJYtoJPq7WG zu_I}!T6)QB@hdQx}?@ih#fnfZSzak_7aAnA1H<;cAn z2~1_a`NWTaGyR~>w;+AVB5RE|41n#c$9sKbBldt8 zm#8jYJ-66K&9qC$b$I`8oSkEkCD4|oD{bdZ+qP}nuC#4urER;?wr$(4v~5>TzW2Ig zraPj$XC~s_ANT(`cki?I+Urw;H*yoIZ5!zMN@HnNQbsL#&>~s9=pkx50e!H6>OXEX ztcj`!aj~eN!aBFWpw{5j>nfP4N-cUAuNQ_)<^1w<3n_y~&^nMMwvt1IMHw@ERxsvD zW3ZW><`**CQm~&UNzxF2TA?#xMxI#h9X1Tp6gzlJ{#*TPLgOUfgG6(HMK|m_^4JE+ z@SO=k%sg=$mu6H=>SA2OB&!^!lyW~Aibg@iGuE!cuR(E(B>fohCZ>zS)8KaCD$>J? zR>fo$FR34Y<>VEuubH^r(^kR!`9y1)H`??5JV%o5YvZxE0={*wdkTfw6g)1{pR}l+ zJ*QmR9e6RSKF(rN$W$KpHCF|u8IkBFFV$A85=Jc4LEh;_rBdurlDfHh4qb09o~JaG zm;Fr~dnagMP_DJFEk>ml4IZa?YEBBZJjZxr0P<-qjzXLjFJAp>LM@GWi7sc-R=!L6 z5Gta>)q-cYshcqaJ-C*P`dz+=LWVF#s#4_7z{g9`Vot_DMubl+_yEbINa9-nb>l>p zb*C9ncjrM9W0W@HUOBsu0rp2|0fpzDWQK(Z1e*VzimF4fOM%)e&MgzvC*o`UaHJs5 z0E&0207ORLGbAVYgFg}(1aZFIi|#;}IOwKfL-?;dT8OqwX8d`7*>T5vk@&ER(TNpf)m zJd|M`vZz;Koq-$Rdzw?8;xUa1b!Fhx5-FVwD3iT*t8;N&i18`W7FgJ7T#Sp8k?G|N z?%E1gBmHu1852$At}0P4&zs}qs&qrOPWk;6y>B3~m-^ElkgxMT<7>KLZo+R(khC03 zj1SVNF#pKETnwK9qGc=j5A#1r6Qw|VUg`h(Sctf(PAcN-g)eM6AKYy>aA4~8Li6W} zqZdG=GR=~h~YO}&d zU$Mbv$5Kyx}B@$=mO%&GJ57E6xcLi@0K8%E_XNIw?0x2B;izFqJvbCzY4En~`+ z6EDUHJ%~sj^R%j=381hb8!ORW_x?jCO($Ycu0$QhSvZhaO#;gp)fZ zUlqS$Eye4q94i#zSy{ttGt!=ZiU+ zBM_{_pU<|J1+QtUCmz>6&Lddfy_Z!rg>JHf#dxFqWXGHb$1@0o4^D0wst+NyLjbGP zWW1^$2E+h|W;@(3sxi7G1dLmJvNSZ6hsrq|xGl)PokYQM+_^2HazVGBUVJai=1$uH zP-kLORuor-(Jx$3ud1@tOz7$^^_Q;m=U76fMM78}gX{O(B2|6Zp&bxP^1Kvd-dhn` zb7en%r0fvFkA}9v@&n`J4UM_Omh3vf50JZGCgSAF?^^N%o^!C+4LYq33AUiq+xK>d zmE0oh4Sk!RYIdwTrHEASZr}lTPN;v17~Nx~Zun&TAy^>r=XtzEB5&%PYcg90sQOUf zQo4=02I`+DO=J;>+1GwKK|Ne*qkxp$9L(mPN3@2BhI{uxZYmAHz8(QJ1 zc%P%9=D={9xAQuEW*;IwP|ruMC%YAj0o60K9x||IMQgV9zbtm=p%>r%9?pJ$c0aR% zkA-YIz!rtX8VbsCZSATKu9DH7=56V2N*Ya3mF-Bs=u6&Or_q%8d!7+G%>WCyU5%-M zAAj&X8I<%VJG&B_9JtBsXMV!{L9)lqo`9bX+bDR^4x?Xl=!<)-7eZ!A0s+M{X=Dn? zb(w4lJeEq995?37$d^&2s%oP$X=h~@<{ZSrwTzBYuuS3{*O^oCPx2V|HUYxWm6%x6 zW4p40b#7mC?MJ05{`9^bauCb%hb}E;j+v&Q?+)9~-7DR9b8Q(TTWcC z>^{%=Jlv*M2YT4QBwPHgCX^lJ$-)p-{9sK}VYT4t$&@l)s?%UtZt5Vc%v2Zj$ulgg zywpUfDqXSeY<6lSw8D~8Z*CwngH1U-tDmhhHLVw7GiF)055$r$DI_3<$RvD{#8ffJ z6v2jzoy{X^3h5)Tq+*3GY@_Zj^inS*1|tMJk10HM=$=8SX4s-{KVOGLZ6+h8T_@FV ziOFsNCv4YL8J^TfE4qa7*3rMjjXS8-D5*hSfZM|GpfZ$W@W?_gVw8gI)t1h*n1#qB zGEs(#Y6R%GM06f)g*(RtmZA~`<@WNT3|-J&dPjMR?K!=mS|W6#@m;Prs#P4mJTcY~ zg^xaJ&C?iyOU|R+@x-BCsW)JsSPh^9Z$m8U%Nn0m3sFa0lS0DW3S+7yDH`~2&dF5s zmlRJoE!$MvrXmjco}pQx-Kukw;I)ctb1C_ka&QMv0%jCy^c@y)X%*QS}hTCi;9g-VFVO zof_=3@;QfFw0H39OeTB!WWp0j5R0M+#sTvLF<3QXv@1(rRnc==3{g>Hx!1H^W#lF> zLWKwylw0bAg?CXs{fpe(k0MB7uMsu<*?;fg@Vo;z*k%X~b4kpE*FOLo?YbHED|^|1 zkc(`;6;Tp=#(wA^Up5BJ{BJCCVd@;FYCViR!y@Se%cGsN($b5+w`&6S{Yr-6&N;!XyuMk=lisxLQ}D%EUP-cLsUZSVtdZr?Gk9g%%6MB z5o&p>u&3=NN-U1Vn_OijQz_sFAZbIGP-Z4s1N*Spkr3FbnM-EwG-bx*3(yu6$_IhA zSw@hiUGgjK2>_`W|Idh&Y5NA|vUBEFoy`WDNu~>}p8|@5-yZalgT3}$DGQ-7<6)J^ z5n=ZPgUA))V{h~t9Vq!mmR$=*lbrZlnw$c34>d+pa9Oif=0S7}i*Ac6=WT4_#c@#F zei(pR7U`Ms>u}gBLwJ;k7-JdrDM_t+iL`sL!2%qqZod_1%Zr+4=%k%*qQS`B=I`sH@>2GYDOE@pk$E(e41$a6J*HXB;)W z*Mw!O-?MhqXD83PEW5mwz3&>q2n>?cRuXdU5`=K8ZvAR-1`F|PO|$aqVk-g%z!~)4 zg3vwKCb;%pT{J0ohYk&R3?;fjX5_2{sl0keRkhQC@~3gDV7q41V|Ts5S4b6V3vynctdnKgOG2?c4$^I&6Y)D zJuvH+en}86GP2*=^uq42%N<_F$FGzyVW%knGft%_)n2wo>I{b|l$sQw&XdA@d&)C#26;nM!%rnVP80Sobz-ymb|!6+<7|W&wqat{5?IbZK8Ai zWz6MhixD=k{a}KFMe-b~6UmtB`BtioAaV7ye z#Z)bGp2P^6GwrS`B%62aF9@6%REU#=$;|x3_z-kDj*>#bQZtrF3ABP^q1mxl9yMN` z?OwT^?jJC}m|Gcx_#Ut&G{3jx`#bk*)~veA->F$QZVM}jw97}~l5Q@PI&0buD12NL z%K>F)iA&t$7RpK9d|y5y7-4EA9O>kfDPAVDY2W{bKnwj0H2r020c1?p`WJLZ$At-V zVErn^Q@-LVgdLT{bu0aRQOIIhYNWd&CD@H9X%hRiAP_V-gBXO{=gCmT_Bd#=(?^`9 zX3Sj>wC|4$@J5@x8)z{*6uU2(on#m4z9cqWv(DxI?(PmA{m?m)8^>dQa>)>JceSauyfGO zrfD6tS926xyy{#hT=IonOGbMs`}64J(z4V_Xz5tt3n>T6k zq;5SQ&-RcFK3Lr(_myG5CcDOy7Pyo@wv46Pj0BgkEQhUwXsCS2fz{vbnd9Q$k-4K_ zUM72w(IQ$UI9ja8+Bu%-6Op*=KgU6FyVlWwwQ;b;0cOP1~~B zdfCDpLupeWv0-lGZ+y=kzt}h4L%TlEmEB`-{#xA{(A^sN_n^L!IWLqC^3mT}S>RLp zF4e^S{pU5$R1Zb5{H6hNL;iQy{Qqt${~tTaf8FLP4GU+K6~NydT4sXiI!1ka*q{I) zO?~5Dl3x@mtA%NhnFLfLbd;EqM$8&HNX*128O2Gab{TA2*zF~Z%P-L`=D<(#8^%G<*7CCFlF$EE|&1=@R zb|nllgTn>OOSOATq$Gf}8;--vgl#aY5AwKUdap|^*)KBG67rEpl#Y1Mo9bZy1US^O z&WOM?Dh>j(FiyIGcCgl;!zUUhX~1;|`2FI-t%@&uY^$Z{(LO25F;q-5Bx4?tq5?^r7GWmPbXtjLp$+3 z(g53`*9C&Wv}Yxd3LlL(zt^JCqt-<(wA01U!)o?MV!Ty6d;TGA(+|A?@ zaAMJHgfN#kh3c~;$}JST+!?_U5yAhCHOK?}{_tUXc$EfDg3=+xquh)R%xY|5ATg6( zzdKtulGP7$bi*@MF#BEGg4!d^-4dSF@l7-r7_7oDMjRVZ)Wk2*C<26}0I!>sRCaol zg%P)2YOQCFj)tUHy$)HVa@&RD101+XxXV8+G*c%xg$u0Oqoj>_F=&#YZ#SjFBm&Iq zPST8nEVf#`HBwcC>qROj@$L*jM?fhyPe(Adq+7%6KdKLt=8Fo-CA{*4P~wiHu= z9XH2zYEWs{txu&Z|0|4Y~*SthK5n>r> z9JC->_KRfvtEMf1@F~E1tQoJuk>2ACZ&ui<2;T35swx>!a1;h0AQCD9?U8GBRqm z{M5(@EmEP9YYm>-saJ|O){r8p{ZN_=08=xW^s9lAGdpjZ*SV1s)^rSGtBx9D98xgv zFi6Jo8nd|5zOSt$Ib0js5=xLQmaexeZ(m)=jNHAT&}ho_3EzbF?7C;uYPCN*(9x@Z z{>^ZR5~+ZTj8oUB{9ZoQTB1U{hL0E; z!FmOmIXMpZFy$Bk;~6U>X>?n-$R;~wU7*fblO%!ozQM(PYG4emYm>g{_-Wp&;3OV% zC9C6Rz1*%_aha4dr8BXdZjPA&yw)$+_?4SURsL4^2Yyu+dZrzX9SoZ@5fkg#JY$T% zz7S#bh>_NUWwOt$^M$UPeCM6W_ZPm>HtUiu#aSyG6$CMwtb`C&vGdY{vWoDqV{Xoj z&#rTjHP|}|YkER-b69b->3m+oPu@GwDl{vx#OCq&`pcn)E$3yCv5Gt~9J{p8+?N~W z51HN>52IUS!7ptp1ngVmz+XRatB+QQy2C~wFIxCM;Cs+-AduvpYM&w+lJpKeDXAZ? zP_LIx+%>tj#IZcpsXs{tdw*gstDuqt`H{EIOP@m4qbmz*28ur1z5BY)4)#OvIkI4;W9}YdY#&9LKt!}i-$YpiW9KqJcvddg@%^mo3plp8Nu8!I@j+JRkF#UQ3j`uLXP#dwe z;fn^4P%Jg@V?TVq8iXJLf(p}JgD91{AifM5<0BgM+$Uq!WR;4Y}k2Bdsa9Y!y$ zT`hh_tSwoNBaB8h4g1T~tGpPH_SoR`ggo|`^x$On_n>buTV5n)W>st1in-SUVirB$ z;Dif-X4_U7F*y)2O?_$`e;RbOeUy}?k1L!UBB){I#>y%Bbh)Y8imBW|4+y3c(8icv zEa+fyr=aut{uaYHwYD2dwaHNwI`8(KNxjC|m>o7ZS9m}{bVvQY>s=9b|3n1Rm9t>! z?oXgg+&cIOaop(aI!X*Pj>xyiL=4l`h&dCjB7oKQ!9(a0P zy-(0(U4O1sMt?6i_twQGRfI-&vfFj7Mt8cscz-yY__g*wz4lOc-4QLadvjP5_OT`} zVlOApEH7qZrkk=!ZJ|=5U5#t+wGhw50T82L2ug+c{fs=;Hnov#NO=!w1QG~Ue}W}- zifLWvwgFjn5^iMD?aVKze6n;N!;-|>cg$+(drs=vES5nfulySH`YOG;6BVlVd%NPqiff~{T*&LFSJV;ytv#)q^hm#@oc^YwVh zcZVvkhphV}UHjRmhf;5>N!QZt7E@^pj`pbCr$txQ({I#oJ0oiq+@)G!{NR4NA(;Zq z$#T61v>s)>CvN9jPQS!o7=3p)KbgFqvD@E?U;Gtd_{ToN;qSJbKbb$j!2AaIXYcs` z@n~CCQ(v=$`tbt~_rL4r{tLeIfAU!V``gUg&dBOtyz6x%T&FMsqymxz&kuxP3~p(_&S16i zOqAK*zf&(GGd0^lJi~!MSQm9!gmeN2YTbu_-cuZ&v3N4_p-7JHTu72m_=I?x9gl`W zY>Ofq!V?bI<~L9*oT=nS6_6wgCC952jRNEgavqHoQI#t6$`hSJ+Kdy9QE|s)7-|Q8 z+-um^VHiSH@mI%gqZN%}q?l5HGs&75NS4kIzzO>#=FM?ty-Wv(QI53C_JmJ#n4d{tlO|z?G|@x^&5$$Uxm}?cb`g&+btGiENUMb}?nhrj{w` zf3VNJC|gD|$e{lKzh3Pbe2mp#iJ1=QPg&VM^XF45kdQJbyetr5}Q2&8V zK>^8t$|Xm?;pD!uW@E=s>O_#S^P|ztxMZ3oX#HD zLOL04I}avD_Q`Zx+wsVw=66n@8@TO=w*^!vGqGreP=a8Ey>0uQK$;JjM@aJ5ys1Q% zI(_wAto&RR0=n6dE*Qn|N9ijgogoovb*%pUUtSvJE$BS3h&{zn3Gcy0sA7IZLyaO< zqGz>m{@BWyZ2HFM?J^|dkYj=3?cRrv#40T00A^LLv_)%YI; zI(;Ap*&<+O%y|(YSJ-PJ5?HzF-M^Xwgh3zG%ppbXfe>0=~0??z3twn-#XYswUmvTFYq7Bnp-m zy6CzqElY1_1WX$27*GfzZ|`T`ck7NUzY&H4<7+`YM%5L53kl}+dcIHUb5x5DXqD0x zj~HfYuapiw6e}nojBrmO&Fm;h{MMIdz=^U0V3a=Tx%iae@m7jgHFXfjD|9`hUDm3h z&-a74T>7+}_`CZ=1fiN-hV<3FWmFS!Fi88C=VOopYhOwO4<|@&VLnygh&S2Gz(^Qm zJJ43c95gkxG(lS5ce4pTic$<%gUJC7=c`$3q_PAwd1QYlv5ODss6eAWofG=>GPrH2 zUb5V<7O`tfpA`+1t4yY<9lEa{>#E{X7R&9WrISL2pWxRCmns$O&|HA01teDb!}Cx{WtVCIr5SW!=b&n4(aWQ8cuNPH z?eMzicDe3K_BL3BnrhDCfeyTFgZ^->dVO$IY=()wO7DiWXbS~m0xPT}c3?P1t^65r z4w_rq1F+TTt1Quf$Ux{e_-xpccEteNx1RoOAfDcC3^>d0Q!>^k*X(t=D!Pe#^GPd@ zN+N*~Vk}T9QUdvGqOwR@PAs+p+p3VoijoW$^`iC8{qO+pT|#A0qoe5~wGE~oW<0nM zh%+w}!&HM*XnOA;KHKf+Lp=3}Z@eOAV-s!%V6!kEBpW!ghA&%iB^5H{?XgtACIf-V ztj3(>SZNH8A)sCLLNvCwJe?M0lsyTGCQ~hW_ny6UH8e9ls;(6+x}>o8?(7tF(ODAd zU9}SmYan8j{JE1z)<-SHh2WPjSbGEr#_##7gm5w-sOT`xv3zam_7uY6g3Zz6$ zD|esqNek2&shB>e>_MZ|Z1CdXf0=V*K#R55@369~Pa+cazS6Gas!v=jT1~73aX+cB z2W@UZ?E8)}9K{ZCm81}>uhK`ZvPr#Q_D2Ox3f|O(4>bk{>hu$Y>;C0$BWkk?6q^^m zzD9|$qTgVSNVSMYgQRTJs{cD8?VvEQc1B~Z4q#S@P@SNQsjU&@A@MeWa)17fh;mac z%!ug*;cRkSKWhE5Y0!ir?+<++ci#8TbA~pld%Xhrb2kAT_r}DV5D(ETlaYk+ux#`w z|4sump6V@z9Modhcuo{;Qs0uEhx%A&OIn>ZkLKT4o(jlWU0 zcCq{n(;)#QlabEjhQ`YDaWQY(DkYg*C2J&+Y}@(7AJW5M6`!+k;a!!59~rmwJaP;K z#E(@R7+e#ZD@VxzNPc0`{EW))5jE1XK9|CD{M=Ix9Vy@|fIidr#zLG{n?tytW6F~o zTJLJ+W=37b8}PHh4_vt@xO~A(p8Avid4uMA>09N77O*|suz+J!4_cd#-O~8BOgSB> z{5bKbd}PxcC2=ZL58;B@U9rdMEzcIP_P+dNFU>+#rI%o7bw;^%0^%z$-@>fT<EF*mCc)4p0<^rFc_XWSqiHYnfSwU)ns@Pl+dxX2$3KEUjwB6P0W0YY{5kS!oa~f&2oOi+9)$RE0Z50)-z7vMHrF>VYo0Sb8KNGBWmGAWW=9Z0@oCjz01F#KwsJt}1M9`s z_T1j}$=dbvi`J7DFJG)*Ppqi&P25izu#1I$hkeLYYDGZnam}5@jjA6;#VPWrRm4Ms zMzUw1!4^;7i%BOmM;B6pbE-Aq)f(<-2m#zfqteSI_xBm*RNVt@amgiYR=+YEh$8{U za+K2fq%(2@2a^NQPqwZRNOXi8e_=kG(e)i`wCWvygYAP*?%_dyeHOHqkb0kyeS<-r zltMp*j=0~}RST=0`4C0>kqN3nPOE|@6YJQLXr~s#KVnJwS(40NCkYs+E%}jDWY^Rg z4BHNaztxrq^Z4AZdKd;ikjdZ1#)MM-0A@`}26k51&`>fV#&b?Wn@_Z!9$)HUR2Ogv z43=<;6;``jyXi)=a~U?nh>Bf1|A10D<*ZeYhS{z~3*QzdERDHwt^t#X6A8gZ6}s6k zEt`yH3T!s?;I(_rpP#td@ggk0?GU7XPESd!HO*r=Hj(2j7swKNR2xbqoBVwgsH4DG zscjhzM4V9k^=eq8G4#GtS9us_$#JOe?Lq&=qOVg?x7gZVS%J={C;eIwhE-j8s4Mf= zC1i!O>1xSpI9}TeOVmt3OFP*O98dx~XZzRH5vw*>b{ibJ2MMrBr8e>H`;8pJs#`9t zaT3XH4Y5h?)Fxk6F6-=2(+Sn_FiRVS8>Rn90ouwUKBlko!6_;M~4?C%&N zR=ATRpnoPIKg1eF#el(r15t6Rv-q{D-#Mil*Aab7P%TgOijgd#%(fh3um(v*>9$l# z>LyLw(r(!&DSgg}n(4+mvK#jYW5hD^YRDO=Hn7KS9tuw-4*+wr#`X5(*@(?HRa6cA z_5%KWIlf8TMM*wxsP`gA3&B|RkxxiM%8Ob%;hCPk6jJKrX>^=V_J4R#Wr8GHJj8PZt6{qNf z;PW`l`0%RsQ)K9j5eG-`)&us5gLvQl9?Wdh2QA#zDs|+rVi)gNd*t>BX6zGd7RT+U26Kp)*kP{^ z@3ef(zB0Pfu9eAOpim4RLb7K9w7D;8hM*>QW;Ui^Y$P*CJTdYZN4J5jN3@vEWO=)R z4hL%65pH|(KfxUq@eh(!ZPz3R&lron`Jvo{YPX)A3^4#}l2nB+aN>6uI-~f2oe#%9 zm8uL%;A^AWzrq~SowJ@rn4Dzjc{xst^26(TT87o4^?RL%9csM#F>~Xm<6c|SYN&?o z?|9h0Q$M&P7vzmdXorUx#niL02aXRa7u-!@f3o;~RdhVzbmxTH0@n)wCrIa!uU0O% zkKE!ugXQ{oKL#r|_GIvR#_7ea%-FLd>>=%28s3Nn>THj+dh#c}yMo_BaNZBde0&dd zHvK)lQE7G7B0A!Fzm?IBTf#rv;qQzQ@^{-HNgU%UU!ZuyT}j^ja!$@!`^PtwAn52- zt^O8mvMjSPp%R4A`D0<*mwlJ<;yZ z;MSlbo5@4mh*4TXZz<$K#6Y2d7jvwzZFx8sql-{=h-M3DeR2jLKEQ&*$13RUcH(cw z4=9D`cx5`f@qO#uOGTp8fp%x?uCD+GAA)cV{8La4vB4OWy3p{|lJHexjo8GjR|@vO z7_Pgh>*2x(c;uF5H?Dei10IGSBz2!SML8z79P&K5gFfEAzn(|j{SuyYhm<9Ow?q@z z6$?OYG*t6z^EZLdkuANU^~?*7Bijx*y=V3sGHIV`oVkDE4A6_`wP*M2!chxQAtYh^ z;2rS(;A!&h6WdN6)2U`L8lKGw#VI*B-HyC87B4FgL_Y9tTITJ`?#U!EZ>aShBU6_h zSG|R(3v_fN<5Z1t=a{#&zosjLpilQ4#4poE8&916VmrBK`O6XVWmies_0&GI3-F(M zCAZ%{3LvR*tRU(s-@yz+qN$*A$LhBqhCE8MN<9PQ-&A`k+V71gs)C^>oNKjBI{?d~ zs;c%b%4O>+bJImoswPF}SC;oWQk!@OBhbt7;NzN?&j?ww>Vf(?~>-rI=_ZR7DXN0Dazo;-*aTzA* z$%*MD()i-%PWB7wpTM8-tiDsDZ*XEa+NST<7$x+KVn5kFwguVr1avxShF=%!<6Gat zW(i&OkavNlp0({xk4fanWwWB{tj5k9<)0(j=HxWFX=4}DTyiI0 zBUcTIx>tPSdGP~hb?LH<@(pDsjX1_rP4h_9Ct6B|`X|{BDeX8|(uvM7Q+iE=NH2YZ z6?FT6Jqt2cT!=z#Crysi0<($mJ4Ar~5I`sH>P5(k%_UB6m`U#$9_S8pB^;AZPEj5< zr;xHg>ruO?7Z2C=_M6JJV$!; zL_JfB1Xsmtrq4?sr8FXAt=(0c5HiWG+oY?INpF;E5oW@(Q|oFm(^JLMA1OKkq}tBM zlIW#Fl+te&wE9%NqMCH`H#D+AUX!h_n_pq?T;~GI`9c06?anm(xa0r!;=qypclyM) zJ@ki>oejN>ovoRju_3+DKOLX+|6AI%v$p=1y;Jg=F{5PS>}X-)YU22B`mTzVJj%B; zr~K`*8!xzv3sn%Qqa7`W%*TLBN{g#x1zLzD+b}5=Ze||4O4=?87dwX-_@^}2j20(K zl6mo`%?tlHtBsl8&*uwh2P(%bPAE3GFgbNh&OF zuwfJa=fN#VU(qx{U?tebFdQt?!Zw}NIIAS*akDNra2C~$$Fd(kkQ@ZU`6at3?mKMFf^rm1y6rvH9-Lv zsO@SV6|bz{H%53&2U~vZYm*1G*Cmol)h(3B7zcM6pR}7$5K=81gl7X-Q;Y z2ZVOZyJ)_%wM<;}gPej7l1&SS2i$CKIMrYE6dr{PmT}Fr{18dbw3H4jLLv!l$fx}F zmJ_MQe8Jy;H*5iFkoG$j5)Ag{FUGox7xVinh>%4rq~~`ZxEh#zV$^izvNkl_LngZ| zL-_n?qY#-><8&DH&2^ld2Yv)ilJiMI$e>;z+@8L49W_d(lR?vt)F_C0lp9`1+ZNL~T(kSf$#(6& zY;yWm-n9Q)<&FM-JlQrj2DZks298$$ex9S%U)`|3iLN;`W>GwKxJcN@2^w*65`P9$ zYB^?C>xF^qacD*e=~$w~=$}XmFd3O6jM{_fP|epYG&}50g)GebQYJWy_?wO&woiV} zIj#5m*d5FnQa&NfXSQ8$dG&O3bAP>k{rm#o!Al~B%##(=5an)We9)PtvyfD7KucI? zgVA}$XvSrw8So0rqs>V>7lE)yeOgzTCiv1ooRjV?n-CamZ*TZCO-k*eVXQcH2 zanDu!mLHOBO(#?|>$b3;s0ff=3l1}LHejlAWb5QSdqK>Hi-8UJv+BijGv{P~`=~7({^O7(hpXZ>= z8k^2U265-_>1~Q*mT~Lczm$c9!3|^cB%0$25ncfS3OJy8o$AP3~+^w1ibs$O? z+buhNJdX-*X1_Ty803`)@F9V+owI|cU??uEm*gG2t~x^l9DTFbnOe&9zHF+>2lk1U zl8c9ivdG{~$bH1_DuP-=s7yjrE>0@|4?2H_!o5srd22mrZU?C$qcp;wcN04F9-T_D zu;dxZJ(n~jPSrM~W{pJ-TIAMUDv0^WRV}EKY>fip2Fn!o9U>-0PMRvvN2TlRI51CO zt0SseLp;LQ2?YRot!~Uds1PIBEM)5zc=1OG@|@m8=T7`z*R4ifJpYg^ zU|mtY1HJ63Mc`KAOfg3q_rkl!Q_PKtBpKyW-Wo%oNZ9P8Hk6E#LzdKjZ{vl=^5CXv z@v2*3Iw}TLQ~}?%vJ`_5tJfr((?!3sOBoqFeD3UG$V;gf4iP!ZJqxfHX!QI6+v4oE z!-QShxaKT02Hli@qaDX2PXbx~$m^&(+hhd1||yCktRR9s?$PAQb0w}aqCONsN9 zHDxbc-F=9<5IWSSt74O^7uvt7b~HmWwE-csU;j`~+%Smb#-OQUAHaFqZFKLBf3Q=g zS!KG97m`^1nd#m@EH)jh-T@nr8onrRT!qXL*M{hpU&CP-gry!1++Z}t;tc)x5Rl38 z(Hx?7Pku{Oqj5ACv|kvs$%_W|#;U1s7nYGmqWVQ?`Lqs}pyJseS#X3C{SGE-L( z-KbJ=sXArCZu}dl1=pI5jdA`my4;$FBA3O$Ub+(DNVX>aPZpc=49*hH5ce8HRXz3? zXLg-7*r;{mRc#h?r&`ToHvHZ&My1kpsb{-B0qAIKoj{0YL%J!BM>bmYl}j!iyV1Gx zkd}lig!tY|P5A|SWN}fsG_Bt6nSotn-szSw@RQE<5rN+^wP^MnG!q%Nz2foQ3bni2 z`9_=}>2Ihc!9MYN*Ri=*2jP$oIs#%L1ViWN;NBa$Pw}B%>6z<=)G;UkvsXhc8v|Dz02Iqvo(A@)Hsz%znv(AG*pL zenAVWPm#=TghZAA{-{q5L8k*roFYtf;8-GIW(BkbjY9tev%7|h?CJ0IxEC=09(1?8 zAHI@GqmUoaJ>UlmcJ|3KsPa8S*Q2~WC1%MKe8>1<_aONfqAyNLQn~ir0B4GaurIFYI-Yq>}ZHEBtX77&ux(4^2@FZ@K39e=7}r1n~8S(q}@dkun1= zS(r@^J>$5v&}~z#G9Lzh5IyiqcbJ(UJ2)@UEQESMZ=#%xBs$;W!0%GR3L{)x7x(&x z@y7=Vqpl(lHX=6m{w3k-&n^0t`~bsG{On)H=*I+G`--rey*LIPZs9K4flm8gq7
c^uzJOO4Y7V4gia`3D=qgnS&eH#eC=M!llL1iRk2X|>BJ!ZM-f4atGLQ)C zqe`a3k`rP>Asg$!xr3ObtX?c3h3BZPUW!Lss8_;>NtUk2qJGKZFNi+uS$KX^Q0P2L zDF_F>PyN}&fbF7oP)?)c($J~R>rs~xt3Gr0+8T2AUK=Xh8Q;19oh+>ZE9RPgnSmAV z73IE}s7)lQkFS;f<-VA(yR85Z-$$5#RBHFyz*1R=A3tdRTTeLU|5T~}5#99fnd`|a zHu4J!sJ>T!+NXd~6u`UvsTsWUI>REc_Um1Y*VeJ57=jR1U8X2pFXvrKdq!t04Wk%8 ze)z@bMjfjeo3ltQc+L3a+&g~L)ti5I`)~oGYd1JDp9f&)Mdd0J}3Uou(AGjae^R3VhF|<$S5a` z=agGvzv*e(u~=%UnrU#IGrGfxi$)n_3El*z2){B7M#8WHp<@=qPYNr$%GS_Yb6$ zKQg!0Jl1~EQd&w3H`37LTVesBZMr~e+PJG-++hO_KQeNF2$=8`)a4%59Jq!^(RCq0 zOm>O4lL7+FIDY2rH>q-OK5GLnW0?N+;KUfrI9?N6WA)L!w-{{4k?apLsE8|3zZ`}XS|>Jtw65mF9O27U*%Z}Ep7 zAqDIXOW(r}G{_@4%^8P}fe%_xV}=+g9RWPB$@r`h=w*pNqELVY=$w9nw&3GhiRM|+ zSYw>XB-aS?nY%a(+=4n0Bea1T(0YY01`Bc&FpZcjwOT1AK|h4q;$8{|#?67ZM9Feg z-nIv~f1G80I(rwF@2*q-JK_7kp7)af-<;)ty`C<$|B*ko=G!yoIB)<=XdN>311M2a z2oaIcAJQP21PBE(Ga_-46f#JIABVxU)*;e<|kh&B!ze-_4sp;MJ+cCJb zd{w1(=r@zj&F+?v9yIuOX8X&-*WGlw>p17|{f`~L+uiB}0uQKuc*!gbLOrZ;=BQw` zzN=SZML9L{RT$`c`MR(mHBJq5$i5oO1%hf-INn(djH5c}K%aZn=-GTo((ajqYDW*Z z#!_kf!%ap=p4z4{u4VJy+;5lO2zc)LIsB(@!1RS}T|Pv>rJC#j-`BUvMV<$v-15N< zp>vD%Ai#fs&? zEWoDJCy!I0GZ}7T7Koq)PvabEk$(oKtN4v0+P% z#lJYeur)(v`l6HnZGS%b`CYC7_Hyt8Tvy8q<>e2d~*>o zCGusdWu$1os>_EKw#D`7JQ-)F=-R|G#Z24qpjIV{Ok;KPy4RkXbQUVh+Xi=_f!1J* z(@pHy61cL)vb*}v)@H1JR@=dYRwkx7h3j|Ta6o2sf&7S?`Y4d~MJ+vZY zc0!5aQ>#K-j}XA)<@sobIEY!tVsq(&`Ge}*^laXwV*pO+pwQd-V%k!wGbnI^AHWgLm7|;~Yb&byE0ZL{mi=;=2%G^jS zwKIdhvqJxiv3HElH0atyyVD)pd1BkPZQFM8#7@T@+qP}nwr$%w{myr09nG1UwdzOR zfA6)bcI|zMYW^jxO1uY31xH>t*K+4;pR9L_D8Q)Nb6*KX0xM#!ziT+hz|zmj+{gkuM+U z#eWNJ2n5)}#4vSh&b>rEJ;V=Hat()6)&fj2;U`uU*vnyhn z2_sRbCu}TJV08`%ZQiMD&|5D;BEk+>OP<<~(ho;m-Hbdq_`|m#)a(+k@1O~JxQjOQ z`AZjjh)cQdQC48JMj=;)rmVifb)N@p%WBWNB~kUHXcBU(iGW0U1Wu5Z3#(GTS@9HhbULL)Or+?iAqGnBLe#MIM)!WBFu1-nWlltK(e(v;fZl0?j|@+5JLbvZXIB znl;Ac9Bf*YC-s=@%=B{=m_vvrX{UF#@cYnUUFLgI>_jbY7>;Aop>bA>G4tbzNw80- zy4?O^u-vA5R4--vgH#0CG0T@1OBq89pIG*xRQ}z$d24K->tg7mQwI5BH#VrcUHOI! zCus9Uw>-$(!|>Qz(m3tgsFrY%V*(}{p1)}+@%WTAUXa5^2+HZ`vXp;i=lOCT-^m%& zC>*}>vD`9!WIzcXF|$MavndNCUN zDbYu-Oml07?Axms8bcYU;!fRikf@?tX}Q{+{t}|e+8z#~fHR%$_Vb$%(UZo%j?@wq z0;`^(Eqn~|B3b>D1evaUaOh;Px3q$YvYih;B8W0yB7dFqXcG3NO@FU?vA*aj z!XZJpH-q$OJOj1I5{vC>o1@(Q*`?>1CM(;eM!WlD(~z@_7U(=9ojyeQ7)O9*rH7VK zM%s8x?S=uqPZQluSSW+LBLDpgT2yUJgz&y<&Wfb)qId&)(SWwL?u4JB`IvC3Fxcnj zrYd_5qRjqpCTo@aq?Ej*6i$89v=UY~(^!gm<(83fG3!dC>IwZca;8+dBBFvts$;2I zg8EV1o6#?L!SL+ z%=(oCk~0`%D8Lz<2G9y$Me5K{C@Hm08;4DL+{>qjyqgX4)Bz4FjnE*GWY$#*mdCFG z!5TZR(od8*(9fe#m6pLck)piNcIR~xVYtRg)al31%wto3NB-FiIxCY*f^(Twd@K#K zBHp4Y@O`K=$C05b)Eq`lWC(#zhIF4_`HQiD`f< zb@6vuhDwR=`d{)(PTa>3BLYs*WjIip^j2gw80FL@aPe4GlR0wuFQ{iHux z0J6Jp$y@8lOHp~0?q9N-TV(IBkg0PdyC}{QalJQap;gd>)SU%8eRBlp(rU5d&HB1; zFU&vcyh0@>Vp=G8#s=ZtmD9?6-o%TxJIjLL(i|E!MO47Ch#0(;3*Yo?##rt!DYNdv zDo{Uh5RLkSA!5xDM&136vV#B457H5*h zr_hqF%Ztm&i=Kxy8^$A(MH_^6a#Iq8{*KC+v?*CB@kxpz^IS6S$sJm)eB<6IJTYX! zhv%sls5A^ZlJH;rhUY8hGvpGNs($6u%`7_EYD6Y>+`gb4QZ_ZHoOZ}ewoW} zu4k^^PU&0Ely5g|r4#Tt2MKLHQ97*pqEUbI(tPSEDvT+7eSD{UX)%2A-Mqu9j+SOw zg!7GM{An+2A@7f(e%M;tA#&Mn&BlRnlI8da{94W%i-hslrf(v-vfGyPTd^IiaWs95 z11ht?xiQUE&2F1E;ndF_Lbavo;t}3-P_@x(P~v27O2Ut3TbE*&Kxek&IDn>czOp z+Vpng#~j*IfdcjM8C`Z((ULuX49k&IuzEM#(0kBSVP&hcyiq-COG8d4L)F_rr>8Dt zitrqG((}t)z`kJw4w#Y&IeMQ5fL}&@MC z8sqTyXsik&bB56!7I~DZuZk+jN>rKAVU>~93aw3X@?t+<=4%hHn!FM!kLfO_*`WjC zU?fu$A5f9Ae^SY~X%X_wx>$M3x4Kt@Ir(Wy%FCmN4roXzrl@u>A^nYot&^7fs4`IOI<<~F6dlG23`@)vC5IEX&ISj8o!dg`$Ba;`ts%W> ze*pJiFPPVqqAkiFr7q8?O#TvW= zG$w0PyYym5bm~w-8AFZk7rVNU>Aenz4c;iD{^6zW*zsN>tHZ#oYVu=t(-+cX+~L3Ro#RgRRhk3rXW zeH-PC@GE^PE&|(??)@R4qds)|ZCy@z+vN8>0f$LHXDl(fL^aKZuI;`>(z8J^cw`q; znu?ARs6fR`i3+X?TRf#T#C@o_0xMz#_h2pSpP+>?_l=E^AoYnQ{CTR@V{V^nrym*l zkH@UMotaEmI~iOYS8!2nnfX`5AFdWNULJ!E95OT9V^J*TlHE(3IhBKOf+Uz_&Li%S zj`8B5ldaH2wXANo5il%s@h7q%5ANd@*h@tGb7!wO_VyKvaIdy|FBVZPA*|jB zVQvvmo^-Vx(PM6WiI2EdE*a;K4w3uXySP;|(9mSqgW7_FAO5P+4>d|FnfrX$ev0$NRBZ?EBJzvaCJcP|*jy=e{ccQ%a-)4NHuX4bt_>9}% zX51p!zT6;Ae3aW5AUe%gxU%6_yAdb2vUyb72Wg-Sn|8orEZ1_Pbh~lazYng5o=u{9 z{F;fyn+8@+lq=pZ4f_tLGh%XkU-Rr7g4bM`i0-XaUVsU3+WqgtH?GC^uPC|fqX;wh zV~r@!;QXwk6tmfgZLTd>&ZM=i=G8-QSN4;uoGYL0OK-X*@l2xo;s}ip zRcPt1Yk9ziV%-n!>Edrg*(W5DFUHSHjfnye)Ox!v2(-W8<10%yT`F}oI(0g2ZSp=P z&d%*pYSs2L9U$;)Z62V`kC4q(v{)78ZtR&=XIl+zVIjyr!rzdQuy&$vTR~n(gRFmb z)0!Wsxg&R%mDPvWP4{ReY=#V%`kL7b6n1g?Yrqvn!}ldfYD%|$oIr#n^r4Yf>6~f$ zfH|fZeyC4UTOQ~b+}TPiiI9XSXK;$94KY1y^Rp)9q&0PiYIyU^7s;%Y))=G*cu)AU zF>HJPsxmsiBh1rXjWppc`|`5oCYAc9x6RACRBd`+!8P_&C*_Pwg;DYuSY6#{*33Fk zL38bp%*sP`d-(u+t`acAOw`yG-S8naZ$t0Kx9--uk$4JHS(=C*TNr;S zJu*Y)qxrZvD$dOI?z-y}8QaYsawNMcCNh^eeOX6bcs+^#a{s+p=6wr+R{C^-_%ilB zK*a7*eSqsN-@%24;&==RU{e@+9t#}PP2He6&Wt%Nj>@>SFH7dsgfymv;fQu&h*V|I zj7yPdPZ?Zj#_%*|?R?aB5{D#V!b9{JD@oXmNvMx19jH`1bR+t89g{sG*SNTGq&{hL z$F!Dk5}`;k16iIb{@PixF*^?m8fmI6U?+X{fH z+b}I#gx>+jh4R0a&PB}6@Py;IyJQ>=z6x&gb(Mk+e2Kd;UJarLZtt^-D^=;kLDOCf zY}q=8gNtgMS7z0RakJ8>X4_Zh*q2FSb7+RHh*?LfBq=6uNod+wn<&!yq$EA7SLO9P zg|vn-1M|cWQHFw5a{j0A6!VcnI{l%cK;i{CQ5&DGDHarr#e!;)TmF!-K>nunXR)cT zShaTKttP`fZFj}0I~8txPl2w0ViH3~#R(|t(a`8LxK#;ER{}kke12Lp9$ylcDp*Go zc*z4wY9u}mE7w)i*bh~o;;*r!J!uE!OMB%^gxDkVw7n5}V$Bj18U;@h!d2tDrucSJ z?oBAJ4_77C_>sYK;nRhmpWfo5musTBoeJ_?_i)M+AJ)3gE+PspstQj+op(ot9ETlQ z8IFp!7xAv=XhPu;sZz;n) zZR7by95GvM!CP%3tw1>N9P|taV$Tmjl?wuqL+h4tWDlaTvnQYAwC%9!Qv$m>!n`d% z!|tZX=d@zgd^D5hQoEbCQ@16}bhoJR^o4wNeFSa!&fM;SlFP)hlP3lP+$VSbsBoRA zns1OE^%xP*+-C@jTU}`Zi#OV+ikeZJRV->0xi31Br7wh0F!_`5;S5gm+4Gn4D?1FT zsJqFQxBlF6S;OZHYN+l*9z&j_IVase|1;$W+v=H!MgQ?bRN#L$<^Nx58~=k?{dd1S zq5pjRk8Sc2lO&Y>5vYd0agzAWiKz)&=t?B`!4TN;@P8|y{Os+k8yhFK*w;@P82z0b zj!viB;Witd-4med*P{IT^FuzVnyVjyF(6Q=$n)*-z03guRoX32mqofC*Q6v=IJw}! z8=D4#>36o42QS?m%vzJ1ZH_TTuxcsuRv>Ew_-t=2UM9@()4}9SEaFpMjcO1J1r){j zh!l~K9&wxZW>x-CY9+A~&}koEsC*9*BWO<8rafQ}=ZM`uALeo( zeH>b;+E5L}%& z$OuR6L6%^!#GX8h@_SAi86)gv23hb`q$XQ=MQ~TiGhcXXeVT-I2r`7Enc25AN@Z3(FJuB?eU@pWn1LbGJ2@tEr={mP0zFw5mh2YQnG zDhK8Uj{W7<;mogrl3Pl_33HmbMS4jpoW1iX!;;32AS#H#pIyDc45alRngoqDbqgT7 zH64T}OFIu%eJC1siq}yc{3SM_k5vJKtOya0mHDq!u%PzgS?>w%fJisVPwJx6%6RJo z|Mdg7#drdczyiaIKOvGomifh@}U_G!@VR?_*EQ{(F*OVX$jg)P#`HWXf6g<;PXoG4&BjoPsaJJ;cXZ|i;kP#^lI&zM0M>-PT%!&va>Ayc_n8Q{^FcUII(qsBs=yq;uQ=Kj7M>^WRh z7VO+ZpA#+@JU(dTtcr}$XO9gDN+gd#nq@i7ytq*Dt5Ml~%sCIH3XrtBWqKlIHr7|d z0J@)||Cg`1Q8Yjept{a_=UUPLqj+yRpIaJvoHp6qs=8SZo9ww%6@?#K%B~1CrJuID zR4M@z559p~4{!4oxV|yR(I4bgG}+?vYKd(Iuzki{bAOGk)sOy$XlA)3mhE&3Kl!vcYGzyBikTVLW9#rfzvizkwkABJTKsd zc^6REvSA2yo-W>lJ)MlI{ZAEA=!1sltWWMyL! zraUAsiu=kPG~FFqQZs11U30J? z)ws6G%2cBs_V!Zdshtl1C)D&@KTNO6RKe4KWMUgmXrK=od`gyPq00PuJavBR)!aWs zfA*Uy)1YabA;)sP$Qr<+%ZeRvv0YQqMm3K$mw^7EI?o)GUC_E9g}eQ>BDBVXXZ-V) z@>H8kwwNXp22y5uwDMJ(c37UX_c8f27X`zR4kF!r6XF>r_F@$Ou-2vT7D$7z(vW}ef)bBt_~ z7RRuPF3g!}$7<}EC5W&q?hd6%KCX+_sqw*~ppYsyNpbmB{Fx$-0kha^ZjYd9AW!}r ziDgss3X3x+VKhnbg-!2La|2r4b|Mj@|uRCc|6WmSfACI+~ z=6&_d=)kuaRz1JW>AH#Aq|A8U}DnoskIM74;qNm(_CC-8A*5@QirdgPC#wo+Dh z_k6ux|?$n935$A-bmhvijl-XJY`A}2gRa+k$z6T{KeD zQnRq3hv&cv7lHx%APZk-nX6=pX^G_4!ssyTZgW(Cj|u`>PSS2fQVL?JT7TaxvqoV# z`Y^Ljq$-69LD+yiwK557bF=Ctn{#;>j0#JYT}^+G2k!7WfKt1wRQ!s?iH7^4^eVZ= z&p<;M&jnsoLW^e4RwXaZS8DWHpdiW zOke&|RWtyRWapMdHf74;Xz&c6c4^+T`te%}0N3Wlq`tnNzBnR5ym88$#+xl70F~m1 z!F|ssDi;d{y|NV&fWT(u%`{yY-8_eU)$iv&3*(Ev zSD107QtGJ$_F#{g9&OAB3ju<%p~NXi&c`&>_@qGXzne(3ak=_2AMDLGP8yH~Fy*GG zBFREO$^r=h{VPI%wA%)!=MqD#ehvUr-@a657f(Ip5kpt9fr9@(ZbOWopTqt3fu({1jtz7NJn-5N$o!kf|8G(JuBV=Cn zoK$}$?dP2L>Vhm>$^r?bouPWXWikq-fjt+k2yJ&hT`~|tErzuKC=LmZL6xPDZgFQS zI%16VP$HS5r8ZjQWXZDWdRca(lT?AV(DzfZf73E59(U_?8|?AyfqXy8yF8+KSF#SV z)Y9WZc^UHU_%hW_&lVT16tgP!7EXIyUb=UQ)3PLfwuPQ!z5;Zt(sfSQN=-GoR@ia!d+g#^Zw5>{Ud^4kDq&!Jjp{W>z~BC1bs3B zI7|&Wp5;iJ^Q93hxA+d1>|sDi`0@@jz?_>-C(0N02IMNqxNP0V|k0=4_EKG{B zN?ODlOm3=u=yc5-5v=TN5RRvX5JC=3ogVbf)Rh`wCovy;&_Fs<)M|K~JH$79AIXPo|M}%t?$XAruo4AG zc*ujec^rXvS5KoAZ3|l~(XWe%z&IEwE-jaftIH?%_cu*VZ=Ck^=EltB)!D`7_T~0? zOrax^#1S6_AxNyf0T`b9+e|Y!y>VrwSvxCaHHlI==yILfnVhm`pmx6M68bGwuaC&` zi<#A&>BVf`hh$3h^(i6#hCEneiGDg*nA5UJ>2k?S%~*%D%v~KoAk0B5TXi6I(v0#J zqLxO3$C4S18ELta$?BG@Oujt0BwLL{T)eP+7V)ln4QL;DG2j?~NgPZRk3KepOpYd@ zVdYEexeAVaN%GHaDbnmLnNGXEH$gYiU=${jdXWU2x-KjN2NBr73BfXBih8Y{(fLAb zEzAUmEFTz(&X;_khJDX1wuh7Yz9+Lk4#+`0q2CU9~d7jlFV->fi zKxGC*jmWQ*!-k*|6_rPDq`#-lU7t)=8#No^9y{A=h=W7T2H*)+PKnCd!pn!HIl(MEF zrp1BPQyMryWPfi7L1sb>ovJ3NT71Cf-k6(>70|qneS|b59;0a)TjFL%ht{4oQY-#t z1d?~W&Z3T3Cw?j-P1(T26mA?4RbYQII$3Pz>@?m!YGJ{nfc^Cj>j@*Tn^^B~~+0tMSUShDepmadv4gxWo z&{h4}7t~-yLj3o&n2vVt+ckGc$(q zz^*MatWvM6Z`ra)?Eh7MC@+Lm`rh-ttxC_4|@&+&8q0*Wl~C^p-3!hf{o z?s3By&@pQVd$(W;YzXfg1m4oq4(-pB8bt4MVD~^{pdNKCGg}biNAK&oiL~snr+%p* z;t${2rS156W-ufX3BI$Bo3M^Sd?gLvjRt+l7=p$OXc6ptqxn+hbp{oj-%Fbg9`rc^ z(Wwl$Z=UxgRfn(-?)p#64y}KNNleRF6LcoVB$aD`b|%JEnN-AO3QvoK{@A_CG#(#( z=t5yVrph^*pvlb@GnCRDg!7P`Iib@U>W`o?qnhA1QbAFnI`tMInBX(CTx)+EAZQwk z;L#QeyAR;7v^*c_JjnCHG6H%9dXlkG{Dp@sw`B=MR&^$>I1^W2>{ZqJ?^^>+meT>a z^MNDxrGm`i*ld?9?5}VLo>xds^8>^1>*38tpqCeR_LziJFICV}BB_DkyJ0R;aTg)Esma*fS_=x%^JMQG*6C^i>{Bc9%?!8j4Hbs+;RCX27 z?s9y(9lqEWIf^;61}Ta7FHA?u(s5Oo?q*5vqZJGvkM*m%qx1=L- z62ma|7gbu2tdCzu&sx6QnsE5>{!7^F(WS!a-1#$voINFik*)yfZ3q10loVbA8AevBh(z0hv^Tijx z2BVF}Ym!LCH|=bBh}h;%n$?S`oTqn^T;JI+(XI-83xv`-dJp|qE3#Xv;LdWV*ljwv z{j>MphSCJ9!tcd!cFpMx=DXkR2wW>*oMV?QA`!zkFnFsJ0@{wyh<$o z^)T9m|Fgjg`TtHIoiRF+bwp7dymg956{X zc?-R{znA9LR?Qo!T+|4UiViJXPe*4R*g(e+&25mA)90o`;J+22?MzKH;!Gr1yYVet zUCg$;wmIy!PTIfqK45xqz0QZB7VKY87V@GDtR^IbnnPgQV%2x1YG@)mXDRHF!G#7;)wgk1Zr|2(& zLSnqBZLl3+NjJckSI7>-Y<_e%=bV6H&Gku)^G7c+Adn*AFSo+Q&kafmxc?E$`eG-^)?6> zt)p0@3&>OP?2G-l#1;U>IiYqiXJx$mAyLqlQdwFxgrHl-hu#;<&4swPQn*8@J&7q;waZ85%#~a^dSdnd>J6R#6|F?6|@JWGWeDC6 zT6!?|vGk7!U__zGY_iM&eKi1v|6Q-Kf7IAL``us8XQvjv7;6lnO!Xs##6jkkH+6i- zC#6NH#5Vk`P}r1s8ek79lD5l#xY5Q=Me(i!)1G9B#K)L|g0wMN)5gy91PysT=#Bjh z9S4q)c9e*L$t4v_CncZf0nxqp(&!&@3(>y?Lg7H7TH@5mqL+AEU@Q9APBGW^>r(_# zlSUGLu|fAOd3PX&!eV)la_NhKcyGFX|F(X|BtO@!0ADXX}0_@%$WtC#;}Yb zZ>`O3+T|Z?v~NgvJ>8c;-O{XFF(wR4=84gkRKOVgqDrWkzvx& zs)#>-l|}B#-DYg-1UH*KaR|P4R3=UcQ=V6aDJ730_3qHYKU{Zb2<%YS4ovJjdV$VG zr$z}Lm_xH`v~Z6dS<}VANSqDbgPN7%Ap}D&APOEw4oB0D6e;zaVhK{TGvj{Nt|UxJPbL`h1~}Al(L(k#TciwY|=2 zkfQe(=(*u)qHDuE{uHYh7(rRroNK+D`gQ-M>7`(v$T=lk0#Q;QE~;^dvf1oX-G*@y zZu^4Xa>wlm*KPC0Vaf^F+-$6GacO95S`@?BWI8E43I<^3oBpXH@T0Cm?^$(cp4fXa zKW3Jl*h5QOV2D)8tn9Mbcp`vQ4%nXYMkqh+3XoO&Y2T0!Dqvl3|ElU_h}CvtL*_E; z3Qw^TUJgWQXNc%z54Ez#e5V%`IcBd4h_dCDFzP00FbYH=F3irs&6dyXl9QU}4l=u; z2AG0I@`N0h9vYWzBkI8B!tXvW924P+-GF}}HohQF)+#*n-I}dtbEL7|(DQuod!4hR zM4{?7cXa=K^S~~|<8i>i21F&F4*TGf7LKSTksdqkl#@Y!EIQ(=Br(UXUH07_1apnR z3e*87>c3jdJ|Wwtq=nFvbO>nLW!paSTfY&Oa^TMqhe$X0Re8uO8wP%K9D1kF|5mxDj+ot{o=~_mu*96=PUj>9eY?j`cZ`{IL#>t&=d74t*`MR!?o^eAm*fYc(Q*?GbPT7*QuK6k2taB%TJm<>)f~4)sNcm{EnO_4%f& zEHs-q#dbDb<`KzB;V`uV^NgDWLr;bGi0vw~C=m{;4VBvZgD7^zjd2RPOHM?|-9fuL!l*<_BivJQ2Y&5Sa8j4892Fq8;4!3zxPfO zVs@-u8DN;_NLL^gKb^~A*bD@eqytZgq=>Cycb^kitR(A#(vz;rsmbt-xSGAd`zxKS zVrNE@D}RF$To?SkPP&C~VIcOZFbTHqB5`y87GSht=WA26ftZ3s3&!50MBs8y)ikSO z%V0&VB;!1_!^D}i&nFVTJ`Fkv(^p1kq;{L0*j82hi1)?AtP4c|i9AgTYLX4ia58}x zWCtWR?iGTk(&EI}#w&PRm4xQtu|%eLqkGMe4;j7#^6# zgW2m~fXmc?<5CZ&Jpgv1y>wCB19m^MpwA#nxL3X|5F2-}e#;Qd-I6;Sk1j)bS~?mH z|6tIOfTf4c|*z953gX* zR-1kv>rA008cho*idLzlUN(;uwEi}=p8c%Rl9GN ztHngkBxVfOjv%y9=kOfz8D?GU7zwaEk|Mn~8>qY-Y|nH;lqbpQ<5pc9n{`T-^QEl7 z8)ISJMN(X@uRlywwcIlC|Z zYDy*34ddUln`@5IGP&&K@?AX}^wP)K9@G{^@dcNDQxn^}2;5ys!xXc2+pvTJk9x(S zKuq>whSNGof4j0z`&u1=j43p>s}GbMec70ngB0tsG}>@4?*iQ$ znI*oY9#%xA!I(=$ZP^4M&h;j$$e`_eCqpTt@SY@R+^_t2uI9p~CgnGe;ZzI(R-kMTvD7Js&%v-9+F_HJ^+{_34rU;-P2 z9@y6HCp3nkKW?^EQvQZ+v2=)#-svKeFs44YaAf8U!%Ft#`Bal#LRrg|3y3csN zaBc+)RmS1-n+SiO<1hOEN+J$oj4Vm@snb?89Ia}PVSL8dBa}6i1pnS@3d>BrDwz9% zcKMDXQ>`VN@02@5(F0e#RTh<~AgrHSHtMSruqGjUFoX!XW%Ta!M}&d?vQ<%e`zYo0 zEt}3hyD$F#Y=`l#TT5cLmr|9zNma5XSb7eedyVDPevtww+=j!89UFp#k{LgR#g2yM zKQf39jQYNmom1_)iRBsnWYD<9ahoWkus}ivxUpf_Li<>A>xBh5SVphA&+=#kgkUPeDOgv%>EX5IK{C4NQP15Mg`=K~TgEj6RVQ zSZ@hz@`X@KfAQ_H;(J2y(Tu*SCs!psSJ%K-jeu3(WdRzg^1`2gfarPP`pTe~hUH8^ zp$4N;{-8p+rcy>zB|lRg;h;+C2w*zbH#GcY`B_j_vHZ&rRCH<4x6vr&yGfKud;hPQ z3H7`qcu>tovE{+g*})KZt4-EH^=+hi_ve2zVm}%zreOM4mVX2OXJwi3f6;o2{>%0J zACzQGXeVqHz?W^@FCU)ZOW!i zI;A3B4hS#*VJ;|M4g@dxS`i8Y6a zM%SzT@2>Cm@6P9LWZc(j9M@m$el%5rkdh<`qc^!3xeRF-aPVY%0ij=A_RK}4x610_ z#mYQY1AXNUZoc4&iCrmc4BSXYad8wiY z1uo^}vWM#B#h)r_``DE2l{5m29%$Xx+slz9fPyC+OXf_;6IQ`no3bfy>0mW^k^7^! zElTAaMM2c%#xw&U?YbazdrdN0*)j2p?ASGR?FcfYQr$~Bekd@;{@I+{QjoM9KR?)$ zH`2hYrpA4m#W5)G2Sati%F}pBzf&+}yj2{*hDHq6Bx=g2d}aBl6E%ssssS1Z5?nF^ zmKgm+b6UQs3i^IurD?1{7@15DP-a_Q5tp zBHXjtk$nROAq#pY1_QuwUZ^on%E>VYlWuT&YvI00#vf!rk#OZter)J4^eJFzL_82G zfUXGEiXwR5ALkJiY0osxq`{uaWVCWk95jhRxuC(o`PV<^O!w9Z)ry?I7^*H0@;v<- zy)3DzQpF7zW&oLU&gN|+7%SS~AxXd`wis!~(q&lE-qK4~gXR$6M8D)hNpUvU)`m=h zopN2Jzrn^1$#nW4Uv9Usk&#ec%q1^WUD|xCrq_9Y48a=fS~Y>oZ1hBst?~eor#Cs^ z&pFJ|-vvW?){&D#a+A?OTGMlDKzdE;k`DK5(o$(sd5U=W$%-~iAD3~)IIJWQ)FrHB z#BwH?5j4sjO`0DDPA;her8u!+nWA(>;?5@{@1JlBXl!Mr{b6Pyr5R^}Blgu-;JW|-uP)?txh5 z#-tTZ>?)qE`xh>pTt@E44QnfuFI_y4gI91E<<*LB4RB=ap6UE>zl#@t3)JqVU&OFI zpmWk}jlhw!ed&=Kc_HQlt!QzQ=-xiVZwuC&ySv?A7~+Mj=s&eEP@;A+@YRv;#; zhD9S?(@Gjz`vl6+R2e}W5;Xhcp{LrEV7A|C0J8g!N4p6~01B=J1FK!B%^UdpqF%8} zcG}AC0gp-hmGM(raSxkyrF*qkYRa&XCOxB|L$< z7k%_RCwr7+FR*~^gVDcqm{P9S9l`ik~H9C@k7|7wd;-uxS%nOY88V4m7Q;>H0X;OAS5iERW%XRs&Q zpJ2(W{_^CN-{N?w^*tMNhYe$3LXFIjcbI=FCU7>Exf**I66f;xT}!?AMd0m;!AON0 z%P^D>(?li(_v&A{J0NJ4-udgkJW=cqGy3>v&z0?Iardiy&u?xz2D@Ky4=N25zh0eX zDQof(&n(?T2e-O=C>Xn11ptGhY$%&iTzsugPXX}PM<$aEly!@_a5{Sq!|586>)VVK z5>9j?*k;070>x-*M5nvFD%YdZVckrKDu$h5RkyDBb<`{cvnsX{vT&>0acQrglRm6; zBYdzZXt%)4*N&qU)VgiE&3$w9rFw@LA_oZ?-XH35QGbe`oIFa8cJXNKNzJQktt4N& za?i*7e>Z}4vUD&Ele|@q2jJYJ4R>$)R5d<-H_@Uw74CnSZkLm=#Cdn-#X}fZu;9uS z4Dqo}HW@$-zq;brKF>x5R}sFE7mMqxnhyEfmGiaIRltms`o6kyxedU+%V5-GV(Q~G ztdIe>R>c}oUk-;i;hTbGXSiK32<>pkWqq6xw>>s+)R_T7FgkXyIh)}ktJ%N}ieR$Y zN!u3pxNWwY)z5(&O zp9^=Bc*ycghOAIdU~gnp*faLZd+_}Dd6@SA^#vi3@D<1xAJ8!{s=B8_In89v9lZ=w zk$j6je^qbHwtuI0%jSWrD#82(*Zl4Eo2Y>v#G9o0&W+4OLtQ zmh|hgh_K!(^oJxGJF(dyI?yNrr!M@3k=QJ6Tvj>(519u~qv{~$KQ8ePF+^t^~ zWXt+s6@|!W-LBe(!**UfrhKV#wt_Ci(goO30#Noo27uQPXsA6=|VN?~)-7ZT>PWxT_j?WzygEJ5&p2RL)o!8)EPX z=wFZEFjTM*vx z>}l4nVa9Ij2;gVhj5kQr(+$}@9i9@;y$g*)vXvTXv$}FfIotc@-fQoX)A1*)dkM6i zy-Euln)UlUv_I_}CS{}nq05=EYBBt6Yl$cfb0<0^J zknSZ|Q;6zeKzVVyABDG!PA=MCxWM-L@8!9&V_?G9ztXgzR44ZxXn1I$n`&cJMm5AN?ULD2#pI^J*x(EGzlXoeS>Y5Oc3KDSb zj4d_?^xxA{GZkB_wfIztw ze)Y{0pMet!)ZiIM0-OgT8)U51x6Nn)Q&?DQM0ZAQ1Nd-m_(@^XUXBEE(zoNq23djq z_!og6b`>@2>w0+h#*xGJ_2*QGAa4K@f+@*c1uWY$5_<-NX%N5pn54DLEUsJQw?o&> z22^;TXju6!y6X{zvp*2InuhAiMb2L>r}i9S_i51Y*n~Dk5&|*8_wlF^yCc%OVb8FE zeswB(KN$7N0vYpv<)E2l%GAqJtWiL(Q6$w9K-pt zX!oeo^|Aj!v01Ri6LHX@{oLk{&eJwL7dj+fKl4kmZP_wv*)(k7HBLPzFnR!WshQZJ z@H03wIP-^co^P`U8dTaT1qtEA`C!#cH?XI?=+hN~wifo@Fa!1q6FZwhiyuDvr4sceQuU?rX8J z_f6lenqVD)Kd-qaI8R5yN=S*%N+U4bgg#63>6R4I8o~}X#<|;a2$n2DZL{2<3IwwZ zdtM5W&@40XxKAO}(QG&Lgm-7$US%Fd7pn~N9+$xbuSiq{pe5{kA>bhw(rr)T%1sji z=_iU1jZ}m}1uK;zOiWsXfWYcqPnvbd%*N{r@Uy?AYkcHu?pCW&^sF9EMkXfD0lnE{ zQZc5zz~Y=bf*Fnly-g<;9H%hKHe3eT8^m7^P4A&j#bWAZt=|z)I;9OrbLe&NTNvThXhRA-da!>wqbKZDQG5zX5OoQ)DRtsX0?Vmyw0d~F`g{%x30)jbbncI6*;Aj zzZ9vAieo8iDN8BQyu&x@Uv2}-CG^Hby3Ez)(bNNM=2MLf72o#jtjQ;35HR*VGzQQS zQQ|2v_%$R1xNEH&y`}mL>lwe}HA%CVNpzFq5+)M=o;5%Xj2LlL>0?IVF2>PQT@>T~ zMWv54CEW_nM@uP)peqcQHD_SZ{KH}1@n4=-Ot}Zdh$#V6cxwg!gN4w3A}*cD*biNa zrTTc9N`0Y%-u$3I?}hMKIY6!)p7VU`JoMGdPT(tR3H=Cdhw}xCpP2D6YgRuR-LFCZ z_`72#{s%Ufz%_-4Z{ww%`Qvxb0fCfkJ_=U4-;C~-W;^Wxhi2xc?P9v56%DDYI4|!a zEXVwlQ#s$|kytk?|Kh1EQ>dKGYvdN6ANqD?{-+eRJNFMzxiFxh@B z7bPxNQU75(+#VXJ_1BSub|<%Yd(C@qwgTNblNSf+ex{oJ!j;uyCZ@3GbyCe!myq)lu4x? zgncUA?AR9C-b@q}yQp0AX4AMQKDfXUe{k-#J>udf2h^wkcmr1Joy1(PtM3fBsC>nI zN7#vKWp`LgPBhk>8?nJlLx67DHosp>A*5rYA++9sr1>v=ff2?419fCtcO?TDM#mZq zc@hYvK$l+~sW(z!5*F}6WxPGj!H)wQn6-5R?=0-}yDIwJ;5C! zC!QGeU8%Le;0o*$`zSU&5f_w>X;M_{Nn?3`o-zg&#Z3z)7ZzM0?#Zi^vKbNvO{@+ z52YcnDJK~7Yjhi4kr4fzj1g1@XL@WG_Uqw4DzAh#LtXEeCaK*>r0@K}5M}PW*pwT< zRapk49XhBr>(EhK#*Gbrw+!eT-p9lzh&Ia8C}v#eEG0w*DL8cpVL}98y7gN-KsV)hz*?cSKbHrG%3>3C+N1?f zKcxAJRl9w-gNfCJnfwwR=xOxmCd&ff%{;8)c5eiIv;|S|M*PRD)c=)1 z?Q3E9zl8Kht6D2B2%__Ckerfs!rh{JhR>su@uS$%3!^}SQ~mfm!dgk5Mj@B6$Fv`- z1U>jSYX2*ufB%n4o*=x88M`~jQ;zfF}9esp@)MS4A0MH-R{y3U%Ei z*dd)*Z)l^D?{dBUH^X%{hTOYPW(VNk`r7CiGB^JLo=po zb$R|{dc{FxxOR3{H~?p)p6bxWMK}Z^WVe3*XwjyxZpjkY48JgqGK)%_iDtJrin%mt z@GcD-H>M9bne9u!f~i{yY<7T12JEw6O0?20Ty)ROD&o}lKSW0veyY@$FYai%7F8x@L^TK%WUwwANe}s? zbXc3FGfy$QSnImWGJp1H9NT6rW}q%-Sz#dlXNIQ^I&<&UIl-@!hz6Ci!>Kt`}p}l9<3idl#(#2Vw2Wy_PGX=i88BW>!E6bF((-PXlt*G%GkzRAf9n>YJQhXu9UXI) z^HY|ydte>7cj3^!RZ`YfeR{j>ay?tFdO6GO@c(wwD{q*Try`gh<`j%=#V~Q_B$N1% zzM4KZAvJCUL$0FR)Q%(dd(?xRMuGYVT>%`42(M|8v86~Zb1{W6wXCWOZSmg}qrdf- z(&ac6GqbG1iU__Ea z$THUNQO`Lq!83!*p@@nil(aK{+oU)TGL+!X*3M{BiPlaZ&!FHiT~u_l1vw?Wi8kgX z=Q}AiD>ab*MJNcD{BAvLi8dGWCaIYqy$Ju}@AfX*8CXbV z1A;8~pTbTKck+|?hC}7TJdpn-K@_V3Mf|quUIr5bl&kSmH;@?gMlwT1$(TnK#6h@# zDkY&b`t%O$(xCxE?geuX{A^Rs*78-yLs4zNG;L<3$}Ti^AE5&9{h~a%1jDQmNH8oh z-l(4zK;3x9ehE`&Fb%Fk4X$sXumksVoj}iOX%Cs+eG-#u`Rp0obF^XquA%;PCAL?40det#d^z^_bInPkd>a zK$zRGMCEhLnX=MRuAa`uE&d@`5DiYdsSYQ?DK<*C2T;#jP{SPqiy6FRr?DjxfYoI~KUVHsIDSqYgg zhgQmXA`R$*N6x7%DkZnL3&J4KH^bY5uy{6Qsh;r$%LTaf)?{VH_&IBAwPBJ^BpMZC zSyOhf!JeZf26eM{GirjP5THM*f%pG-NF5eR@8f`B3!ZeG; zM!pGEw=$rdMqX7+&>7+h;sH|XfT>L6fs|#@=^nm_ex<$I&3xi&m9J0It(k5|kaz-$ zCGKa&Gr zSbqLNe9JU}t=&az$4!{eXp0eKXHtU;gne7D&hwT zIM!pID}iY=eSeGsX5Ou1Zh+xm>-<{5&A2ki8(gkx{KkN>Q)hmYb=Gzh2l6K21-lbNL4c{O>Sc3~q>EVa2y{*t^Xu8244p^q)Ex ztKbxv*A~pegBXtXySCmuTXpJPkxyA|PnPFEpI=|{gRYoeZJ$`8x{LoNx(*IjyqciC zeIvv8PZ-Jf{|O`iC-^v|Zt1)rj_t<|F~Lj{(3elFVCRq(K%KNe90xDqfQlL#T!gNG zK7=x=L^GB&8?*&YZ!7RfbZLAr$4)CVKhW*!cq5$g zuKIXCPSpqNjJd*92vtS>Yg#EDVAx<~x`#6%qYYfRQIt(Tt&>r0kcBF1xzbrVJir!l zuAeLxg%M(vfEm;Hp1v!%%fB?swh(<*EX{*K%0GJg@4i3=Ps`tI%K*mZr1;W}WiysS z8vg=CM9LZe4-49Fw}W(~88rRW=7&FXiIoT(1T7;h0NKL=f*wb_rT6i;gt;uk1q}lOWmNVmL7JHvFDo(LCWCU%Ong{b z0Lp~iNC|<~d2x@P^pu%IIx_nn2BJT3pvmI4*hxDaFCv}d8hxb9!iHr=p~;MODZejk zX+cvygisEDY2Ku;>l!^B6Gyu)nm9>)$uNx4x}E}M&<)B{+%eg5XpWPU_MwCxG^j=&T`ea93U52AwdnZ4b?52J|BrPJK=Bqv?T=asQllv zL`Sw$ZoyNVYh?GFBC|`tbyKM{sH{P1SXdka&Z%12+L`wDKBRKZjUyrMBU_3h=(ohN z4;B5HYX$oVL+|=Mzwy(=uf|Bac9?@Kia`^1m%Q<|WiUIn*r>0fF;@FvP)wsi{$cZlqUZ-kj|ovI zQE^Nap&V z|CXRjSi1#M9^S2OdD z5t~5OIRVv3iy>`r{JBTsAzf{-pXG@e(DUQdDg>%lHqGKnT=IeC zV@Uh`@5)r(xmY6p$R7_*fwgg`pSZCd;tdq`O8f1FiG8W)nO-~urz~Zf0$uct&z$hI z9z4^n2bFuWHn9909E^lCQIHIC7jnKvqf+DCAF!4fa#RKwM}a+ z?1waetAtGT4&sC5OI0wQXhD&TRO2-s?u}l`mF2HH@W30|C6sI$&u1Lkn-?t3OLdd% zz2|j-fqaW-EGVe1VN!x6x5y4v`DHh{4h7xn>mbCde=0Z0-3=rZV!3(U<1d{#fZvss zRaVC?TR3hiz5jlwWAU80VL${4e;R(Ui8&{CPn|J|T-~n;-7$SSjV`cxooEZqo))Ui zGI*2fHV;W~=-}d=Xa;Fk3TK%4i=ZZ5YG^myBUf@E!}5dBH=4tm>L^z^abj4ZGt`~; zj>K%jL-cJwad`X&y2V6|cbkvAZrlt|ZgRsWXeQ@AF(FPqsn#5#7+OZ^kSHC3yRq9H z;JB-FrX&YtH^B!d1wnMXKs)X1G)G#saGaI~y-67j4SKUX4{3>05JITU4lq>?BL25$ z;>bRQoj2+_Y`zy#MT=wTFbuQ@7_EPlLFd^opl~J^DfM!5*gzf89VQ5(EzyOGlx}=1 z@fK6EA4}$h1b%`{J~a#K3I>7f$nvWQXp593HJ!M4b5-Jb6|CQlJm zGf4cGEaS}uY19lXy&H@cS&dlm>Lcta%5A@;mhLj;-omkO!JO)rvf(0-2iw{+${9_} zO`q%_5z-C%4mD`-FlXj6PktI&6t6Fou=8nD!LOTo`4Jj7*TA6uf;mATFNfYpL!yc? zjyq7cXsv#+xO0(0EApj?-BU@RpajP?m5lXc0wYhcz+p0)$Xm*{eIAGOxl-jD01J#+ zsJmT>;+sc(GE%_IKNg|3*O1VU`pFcrq6iZ`%5;wL(F0h0y`xmoj@TMrW~iHe?}ECY zNz1W=*d@nIeAcIuLn%yh#vFVD(rH>aUbtX9k$kLwJv|lWQ!8WZEBjW?I-Z~Ss*1#v zjsOUQS}6{;>HdOQoBF*R3WFRwH&u6>0=*nY?~ng|ro8(0T0HcHmqY0P2`_p6U*M&v zp^KrBq4WRjG`Xaq>AoP2{z1X1hAJ8$D7+xJCRLX`Se#VF2~l6m$qDZ$0SBq2i4xwM zq9j=y%;2J*cVX=>yxr~qW0_x4BJX<=YvpZTNtL1w$XXDQqX6PgZNB+#Z?*x)w?BE` zzxRUqtOP<;#v{kgh5Z;1TACcLFJ?BME;hCjUja}SZH{P<+YBd>a8q>S7(J?H0{M((9Xi`gaTzvq zwx#0n*7BJ{x}p4=I^r#^vZ;7)Yv#)afimg_v=leh23C=!y+a@G>k+KR&b~wrHn!t5 zwRa(WomJL1!`=(6uxh zb?es?=1%yt;}u&iSW8wcL9D-+)z1fYWiq zGB7PH60F}a7_}O(Qe?p_V@{WvFUF@d%5kXC&aB=FHoUOHx)dHN-9gsbU)wD~E5}Gi z8U-_;CEehR^Yb2PLl@r!%LkB+$yu6S*s>8vXNG+<>5TXX*cd#?Dl~5`u$r#-Ad_ti z!a0}|Wl5LF#>XYXlVi4#S0j**CmI67fp!dQT?oJ{f*81*m5BD-MVUSci&}9^%IB)s zJg5;LBgNb8D3c#%R?xDPqmALtowv6HcngO+wAt=#C_36b1xJAal-%0O%}aChE10r4 zCA2H?V^x_AHHIa#NR|NP714OskxJZN+vVO4RKXllaDO8HWR758+`h893$!A9!XPxz{LJ+Vm{UV;*a%VNV%gg%F$v4{PO66=JmiSqq|5cw5;~2&v-HQPsN&8 z8h8>$$>(50ksBu1+`04l{T$*Om9+PFxnQepDk~=5wj{MwMg8P@x)U zDgCOsp!Zjvqz0P>n&1hr?F;AJ*c3mJdv#e!@-LjMd^WjlDw@ptZB^ppx7np~BO2*c zx+=-hr^cicEc&GJYF7A29^l2e0Q5cZm{BjCr3|!KNY-0)QO0uZuR86PdC;PX_JFs( zW^d}Im=G#o5o`DM;`yE({mZmgztk83{dJhZp$c|&bZtN`rIFFEzYozS_XL$6OdnTRSa(;!ng!gr zrzGCz^Lkt$VUcX29alal%5R6~Ftv z)*tQ^_DiH#52IpyPKvQQi=c;~nGV(SQC_Tt{24KMZOj^?iD*;1PzXDs4PR@d zh5gwjIUz9K`{d8o+qW9}U55knSow-xpy)|xUAS7d^BVE%Iv>M@$z$oxd<@}vNeh1A z`QrieQGA!Q@BQhna9UBuokfHTJt@EP4jU0J>EL7Kb=vX9fu{`#Eyvh$c`n6QcKBbs zUV3-gnKr*7i6_*U)YkMLr zFU#fUcR@zE;kW$qsn4CF{EX_?>7_HrTs|kSow7oM(XOKHpTcLPQ937j;_YOMCty{TDG? zMfdEw`30io|Iv{4zbZHWFJe~G&cxK?e+Hp{)UB1#)Uo{#gKfeTS+QA%Xw?wH(=;#` z^HpG|@^?vKOIJ5gms>MzPRxw^wixx-ul^zYTjvJP=3Y20ksI-|^OxIr%A(7(K}9Q= zb`c+On9kul_RT%^+;-k-kpFx+RR4B-9gSyek-Br8_gxOuaO%U5HDR6peyhZpt%@-P zQ<0H>l97c#xfqDDl9H_Y8@Ytole%KinN}0(IIg^Gm}wyQmngw^<~g!tVWBB&#f>QH zExE7$*; z9Pr|rHToIq+uO?OO+^>6{S-WuOie{8s1fyKm$}iixuK5`xz<_gzKcFY59~)(yx7CB z>S|^Q<9+p?M`+Yg{s`dCN{i9DCkeHg6P=-kc__H~;kr9lT1!n_1LnfEMI>V+`5kaQ zhh$%`ES-h1gpeJ91mm%8ly`=q}FQ zon{Mk?EdhSG;v+d!CDb@xS>j7gLX%VpXB$R4uBdUeiiG_8Vub^_*f0yaY}l78LS5M z$H-rB%aS7MO)|d`fznS&jVKp21PNai#T8P_ax6Q2#P`7SviOA%dk?NjhPqSm;>jW1OEjGEbC$R#yMwo zJ{Wp1dsoAteysgNa(Xuq8p|;}A4pkqtFC+yFMCUX`CtHJKc7jyCb2DBj)Vc)|K;J| zRb{wgO17#E_|uF|e|j;@B<>LyqXf4C`;*#zm=}9QRfu9_A;ZwV-^@m68Z((nz=o1H z%s7E;f@;_Tr*OMI@-$D52dt)JCYwb|#LrS#W2f?|hXJz>O$8P^m?V)6p` zJss8~x5x>O(Q+ApjC$yB@R34!G{H(dF}gtRU-&ZnABBR;IaGoe7W`5*ORD4yv<~G? zzt{4`iVsLA=oYyR{(P%(7v`3tld^>7Em3}Yb1W0x!c1y z^zi(ewm5VXTWK!Bbf|Wxw`3*7AxlY3kZ!x|jFrEt)xuawnvz=X%T$y3NgaG=b3OTO z^0DGdPJw^d0eV&AhrgNiwvOWdl9>>Fsi=?IGAv6K_FU<^ZSuBWrlC-vy0~Mv!tZ4a z@ZtPfmFCgwC)&~_5-e#JX@UWhJCe3P-!lw9e&aM8(?tRSc0DSqSV&71^&7_rRl2ez zlJjv3PbCK!b&TYdEa%lZ6uZP#)m5p06}@lq*&7adoV# zglE2@CUTJ}vq&Dr%2KRbFY+(z*aq?4i_=B4d+Tm<`Abp##rZMHO!g$!L!*=GRK&W{ zCz-&M;XJe;-XB?mm5@3U`#iC*b;{=D?K^7Z*) z<_-&UQ9x-NE_kblJ8_WqgueL;4d?Gu+MWG=wdDn}kR3-~MeENCLdx_Wq_-YK76qeg zXy%e0ZLmV^K0177CFx+R8nZ76U|V86F$ysAmS%z|BO?!_yptI49d{m z$-obkt{&-sq?k)#Vr)i=(Hj5#RWkXhel*_2bRH$rWl&rTt*GNScM;C5Mm}|x zTMWK~Ilq0Jb32MpuyQE$myCcLDo8+U(+$=}@s>B(u9Mn>0L7R;GBtKm54F<=W*5+P zNX2&~0c#4o5y~pw;)d3b-;@x z$_W7W=b|ZgcT-}&5_IGkJgZrtsrv;4RgqG3a?^Cm88G@HCU-q*=y{Kt%^fw3+`k6+ z`87^SS-howk9+=%ophUmc&LMk8l3EP2+mD|smYX*=$pkXk|HjqRs&+hk-;aBv73^U zjZqAiEb$AFvPu0d*+GYYgeFop6Br)bfvQ&Ik?2{4+F}Tznv#b7Mo#%A`weG9V(kK} zOXQu45XvLvFz?)AB{yhkU)}^S{GrA*=buHNN1B=|7$U z1^!>00hLV+os2F1A3>~1^TmJR2wvqFfj5bmKh=PRCk zbFS`ubER+nKi)3izVV0qx8xx{fa8j?7KHESRO(5fyU>>~PEr=5dlLV))*PC}4$j|= z|CN5vDx&TcEjgyfS|}!15yl<{@ZIuU>nyi06JCaHSw>X4K2!{MJx$rN?0(z~HZwaFWen_mLY*k@+K09nN)aFs~p-1rnA|{OM(; zJsX1vb|z*c7`!_trL|xczcVKOcu?A$m!z$>(rrRv60A4m>CW4tUN?r zR#56KW|`I*dyU`=pY)_Z(^5yD9YbD<)-mdqK!QFsmzYU`gQ&p3yJ7A|(FI_=`)Do3 zPC$OO93>`${Ya*g>=>_q4NRb)m*mMml0xi6C(2TC8Vq*y3+b66Y2M)nsjUF&1>&p6 z=E<-cWe5Lx1Q_ZrSAZlcU{z@)y%a<_+?Z?%e8S^deAmnOKPLvO~ zq$(dUGza+UhywTk1z9s^=Anywr|AX#wR0j5dDX`lYcc7qVP9Nk4(b_z}>QeruoDW=8D%e@*+n^j;yU*ixuT1Jc^vs@TpV=@1d zoJawWRle~zqRM^wiXGoaH#9$8L0!b+32Mi>c>+Dvf=M%_> zb4C~gE+UeDV2otqDAkRh_NH@IVBdKuvdx5Yi2`HL9)YyV8N_J3LwcM|8Q-~LD#IY- zT3Qa#oypaK=P@Deej)c;AbdGE1+lDtOOOY`OF({35>P^D!W-OkNK0}ZZWiK%1oK7{ z#MhEegUx+daGZZE#Gsb`@U50OL?3&s+;bwg@|h4_ER8C@1R3GOW~R2uhH|_dOy5s! zkPA8TV%n+2coo0itx4HpAAgpbk_lE?&Gx; zg^-fo^7Kf<_vzoyE&d$>Lo(w~7kpFqhq&U|cK%hK%QZh8aP2{3f9bueDtTQ~#a{E} zL;XUi7`@nn_&-p>9=;O+ykAN&j@qNB&E;dqBGvX#YGpjRG`4YuFE!GM-WBL7zf7SY zgSyE3(96Bnp-b%CHBz15;X8Ha216_EFLx`N)$|4hV1heyA-Ki$xWUIfR#^<(Kd-lT z0)4^i9^VOH$#JckbosdP4GUY_ZTf3PbJGydMx$hVdE38 zj}ggl#E3W@rEj)S>B2oIA7atfJz#l=+eL2(E|r`9kulg_Cm$Ow+oH!;8v8*Kki+7& z0!-|`#(G!LkH&{d-i`6IR~F_#SMym{b4&U#*@DOX;SYLXXI4?{^dfPuDYbI#;nAV{ z@fPaF>fedF%weCTbP=RiUlHj`N1jew(4y}6t}!Tew} z)CKxuVF5j_uzphCo-rs3w%YfuaVslwcaKvx`QO2N$i6dZXZ*#twC9{>M|ONb4Cx_h zv)@~ZQT*;Q^1v!JvHH;r-#msZqq!sM9r*pS-aeSNcBos-nE4&F>|7^54+BjsaYKHd zqz2idHBi|2oJYPnOw*bIKmAx;j^bnG7rA}Id~}Y!Un3JktsFCLW_ia_)D|!gTW>XA z*tn*;E~DgkrM!Nw{0fcxM!My8j}F62DS+!)dd2NFC8>UWYU{f)+Y?O5E45M8l|lU8 zaQ~OvoVt4(H?lpV@M|-mjw1O*#-|&C{2=5JIxOx$9<`Mp@cSq1ZXMf6Q=t*P*Qbiy z6+|^RH)Fz_jz$UkXMkB}cylJF17~+skTiC~4_1#Klg4QEgfQ6*!Ey;)$3e5Ff*J*d z@UDg6>z_Yc|DMqO*w3orf~kQ<*@7`PrRyD+G!oMd!r)=792)O9;|a^tktjB^~G22Thism4LUFM&8^Bi);G znJ~28np-6F99~907EiKnlhDd}u&{J*Y7}XX=ri4J;Mg?xcZDC?rt2EP?=qL{#_){U z8eQmWe$~tM;xWmkd|;e?h_nu_MEIren0Ur(P{5E@iZr=>$|+@F!_g(`H)<+1&o+72 zxIwEswET>aRZ6Npy%IExz&$wo+H0OR|r3?L%> zPi(#F|6)^6cfb5-HSaAo_5CdRyW7lFkHsC7G&0 z-`xwzKw@~Fe5_&t_jx&AHczz}N(S0eKCc`P)jt@cwk0dLjioH55Pp!0JSXYe)?~D+ zz$QGPE@O^-`}l7;17X|0m|878B$mk)gb-_6yRxkw#wafD@~K+oTqlu4Qh38otRwx& zk_9L{S&|?&!|7tBmW~mZ14q~K7M%03X_-EGB-Pu{V9?dQ$Y9=kNj&_@rRmydhyQbb zDL$qwhd*T!N1JtP3JGDU-X{aWS^-{;J8SPoJ40p0u&wqgDtjp##ibkQ5bcd%<&+@{ zvM@4hc-=cbOs^o6CQxiJjA57MMm=n!fI!@(_!{aQgISSo0hb7-XP2hxG#|V=Uekb_ zOp~0O)hB2fec7jhpa7*{tlwKAWKX+x<<|v3afgTN_B-r5z5yMe$rlid$K8dxu8r`B z85CfL`qRBTcH`C&sK+^k#EI5tp2dT`QiC!n6Oi6Vzxl`Gm z0xROmVfRP>O8n#yk}1RGM)YgS9TmU=> z|1%l?FI;7O7PiDF=fM^NP!@0tF;cLWzt}YOQl*HUS*jupCqf55VtBw-H<8C zeQ|lt!UHdhazK}i2T$V>@S^}T|A!=8ymTH3&E79)nl0!Y4?&v3BwP|{bnAn)vDRM3SY zi4|{g9O8GLbAmS8 zVD(Y+eH@_l=Twepn$H1xuB^OoasFwc+mtQhrHY7|w8&#pusA5B?P2D(Z9*M@7AI!f zoDxaSppm!f6|UynTy^V?9S>$Tu*5DyzF&%UvG)CNreM;~u(*t$!&5JrMCh zVCAdAJ90)E-l|CyTSjdAP;79Yde48;WlO|wF5fk}aM{}fD0jU*)R zNc7{4uu?E}(%r%tk(v`9g)Jkm19qoNM^|Ii_~FK|k8*VQ3Q+Xd2}5UMMzMzwL2Eb2 z%raIj=A79yf;wa&5013JtE9Tf8pi0K2#NBdCMP}xHlpx}2R<|u`#NzkW}!`CW=fi; zdkw`=5R9~@Jo|r=DEK&Y`;4tn9suQKhu8yzuvnuWSPUi_bb~T!T4~NGQrJ){Vm(c1 zLYJ3t5bdwr8yrtAad&hG2fFefEFkxZR_xTc-2@|)c++lK;JNkcAWo0W@L_8pi>2t= zl)ft(37UO%QeCXI8ljpDdFh~PwU6I$tJLsPE2tR)1K3y?>oV<-RWq?fPjC##-#;_a ziN(XlgcvbOYT_=)7Y$ZJjJp9<8SsoB!JHM&)s~Y@-Ra@HIii6%ht@7L%;Bo3qs{5+aJj4@86Uj17{YAq#DL%oNF0tB_P6R zZ>onMpnZ{+B?hVy&s>b_W`b@zr|zsukxi%5VA`aL(E@{caM-bY9klr^sOr+Vv;0o; z{tgkeMy^E0-Yx3ji*%+u-@xMJ4wjS-Ch)kd;%6D=)DUa`L%kexm2fV#3@S!Ta+Tl- z@aBqrVorMI{0p`@!}kmZ0_w!BLRxWS<(1+ijbo2Mh|!NV`Em1G69~Jalqn`-^^15& z^bfEUUu(ieS7Ia$vZ7?ds=~|-g?J>5d>R8PSd6=o5&wAvo*g&?MzGLf5x%45kbEr2 zO%Sjpvvzu*KHW;Zbw-(ALrQI`K!R{Cr~N6W(eONDCx8>`CN>VsJyiSB&n%MIjy!=( z%a6lo;+N^4wuob$fVQF+(u4pVIV1gD{x@C`k!tSb^dPFeo?-b=NV?w;+a=L|Bhr~H zHnleSiko@_4yWj?wV&yU2OuqlYB)*nR%}%3-0yI%f?obg-J}Y>+15Y98`bG!z>O0n zVQ?-a{r&E;dmgSE>JdME;Grb^YRI{@lfNQRigqG98P)>8PicfSZ}~ zT(RNA_h3j)l#Yb5OLS8-M{j3BssDOTI9@gWk^Sq08&f|1!tOjLN!3DK=2Uw6Ch8my zGEKW`oYbH*&92^?GD2eZX8O7nD%XPIZMpmBj*4;_=Rc7OuUEH%r|m_*Yw3_q*eC+# z(G+bL9!k?+;TlK57$mOcSxHC}-_jrF!^ZiQVJ}EBwY%$vFD8Tx*K+djT7ki{ znt$8|!@1M#ZrZXM;EwDD&bBX1NUyo8c|D(Tc>@o!qSUAzN2s%RgVO~*xMm()NTTHI z^)=6r>URxpX|$MGd|O6eLU@l&2VaQEU5|~!FotHLj@KHwhg=)@3AA5eEhw|Yk6X8qt6bl%Q8Hr0^a z$NkV2^ZJ1F;>W2n@~b*AzuA5e?fK(H*!-$^j@)JU&{6rJgIyr6@m5~>;iN+ z(PsP||7*5@D-TPr#TrBYkzuTk-+w!@OEd!KFYByZ=E3cVPx)fKrFD!UUlL^;-E(x| zicwbL`h=zj+b#R~?|S}IIXq}7O?q>hGMjE#+-p6UJqt7iV}RE#c}wUMs&*-P8-aDB zD;U)sdX;GR5@zk4g54$h%78*z{i4MD3g#!FbT=1!ZJZQ7Cx5LhVRR3C&!QXq+0)CY z$RNHcrN_MIR^B_oTHSKe9j34O%(%N^S&0QhYk9c6)3V4|{$tq>`bhw^z0dzDFW!r7 zdm#M$jwIX;nXGKFp|!vtK0We|wtA8)8t_WL_)65zBh5UDp+SSLK{|Lw&ipFz>pLf5 zkg%dtLeB5fR03eugL*LRs!qmci~#aTR`d^9M}+CSm8?H$^~+ozsFwif1@=tR13t85 z&d8k>*w&XZU(1e3wC+ip-aERTBEJs_=Ye2aALNn+z&7Ix-Uv#gkmry~9004nPr?#g zGB|=jd^}*+EH2FyYCQ5e5wAESq%DZ42|taO&e`~b3(Yx|r#K~~49$!c`lx!3$<=+* z0kc>#EgV11%Q5YE&vPQSn3-Bqw1Mdf`3RDW$4q*X680zop9xlo zA8T^kqI&#)qwJl+Gwrr*(Lc6rezEOTY}>Z&q$>Gh+qP}nwyla$Nh;i#Ywf-E%{g

!yR1Sc|9i9ui@GJ6zss)>L!Xh8sJ?vD{o2%b~Sd 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 NSWtRq Date: Mon, 8 Jul 2024 18:04:54 +0200 Subject: [PATCH 24/32] chore: fix reference --- .../com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt index 1d3efd6c..0a325be6 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt @@ -30,7 +30,7 @@ import org.mockito.kotlin.any * * @see com.mongodb.jbplugin.observability.LogMessageTest */ -@ExtendWith(CodeInsightTestExtension::class) +@ExtendWith(IntegrationTestExtension::class) annotation class IntegrationTest /** From 402188aca77af66222ba945cb0a18a3c83e3bde2 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Tue, 9 Jul 2024 11:19:05 +0200 Subject: [PATCH 25/32] chore: fix test that does not depend on application --- .../mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt index 2a0b4894..2b97d893 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt @@ -57,6 +57,8 @@ internal class CodeInsightTestExtension : private val testPathKey = "TESTPATH" override fun beforeAll(context: ExtensionContext) { + ApplicationManager.setApplication(null) + val projectFixture = IdeaTestFixtureFactory .getFixtureFactory() @@ -71,8 +73,8 @@ internal class CodeInsightTestExtension : projectFixture, tempDirTestFixtureImpl, ).apply { - testDataPath = tempDirTestFixtureImpl.tempDirPath -} + testDataPath = tempDirTestFixtureImpl.tempDirPath + } context.getStore(namespace).put(testFixtureKey, testFixture) testFixture.setUp() From 3665f20ab63b0737daf2f901c60d4e165ef4f030 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Tue, 9 Jul 2024 15:51:00 +0200 Subject: [PATCH 26/32] chore: remove driver binary from project and use gradle dependency for tests --- .gitignore | 4 --- packages/jetbrains-plugin/build.gradle.kts | 1 + .../fixtures/CodeInsightTestExtensions.kt | 23 +++++++++++++++++- .../resources/mongodb-driver-sync-5.1.1.jar | Bin 153556 -> 0 bytes .../java-driver/build.gradle.kts | 1 + .../dialects/javadriver/IntegrationTest.kt | 23 +++++++++++++++++- .../resources/mongodb-driver-sync-5.1.1.jar | Bin 153556 -> 0 bytes 7 files changed, 46 insertions(+), 6 deletions(-) delete mode 100644 packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar delete mode 100644 packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar diff --git a/.gitignore b/.gitignore index 8488273b..1c0956e9 100644 --- a/.gitignore +++ b/.gitignore @@ -36,7 +36,3 @@ packages/jetbrains-plugin/src/main/resources/build.properties FAKE_BROWSER_OUTPUT /.kotlin - -# We need the driver for tests -!packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar -!packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar \ No newline at end of file diff --git a/packages/jetbrains-plugin/build.gradle.kts b/packages/jetbrains-plugin/build.gradle.kts index a206d895..fafb1fe1 100644 --- a/packages/jetbrains-plugin/build.gradle.kts +++ b/packages/jetbrains-plugin/build.gradle.kts @@ -41,6 +41,7 @@ dependencies { testCompileOnly(libs.testing.intellij.ideImpl) testCompileOnly(libs.testing.intellij.coreUi) + testImplementation(libs.mongodb.driver) testImplementation(libs.testing.jsoup) testImplementation(libs.testing.video.recorder) testImplementation(libs.testing.remoteRobot) diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt index 2b97d893..d631326b 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt @@ -16,10 +16,14 @@ import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.fixtures.CodeInsightTestFixture import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory import com.intellij.testFramework.fixtures.impl.TempDirTestFixtureImpl +import com.mongodb.client.MongoClient import org.intellij.lang.annotations.Language import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.* import java.lang.reflect.Method +import java.net.URI +import java.net.URL +import java.nio.file.Paths import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference import kotlin.io.path.Path @@ -87,7 +91,7 @@ internal class CodeInsightTestExtension : "mongodb-driver-sync", listOf( Path( - "src/test/resources/mongodb-driver-sync-5.1.1.jar", + pathToJavaDriver(), ).toAbsolutePath().toString(), ), ) @@ -183,4 +187,21 @@ internal class CodeInsightTestExtension : else -> TODO("Parameter of type ${parameterContext.parameter.type.canonicalName} is not supported.") } } + + private fun pathToJavaDriver(): String { + val classResource: URL = + MongoClient::class.java.getResource(MongoClient::class.java.getSimpleName() + ".class") + ?: throw RuntimeException("class resource is null") + val url: String = classResource.toString() + if (url.startsWith("jar:file:")) { + // extract 'file:......jarName.jar' part from the url string + val path = url.replace("^jar:(file:.*[.]jar)!/.*".toRegex(), "$1") + try { + return Paths.get(URI(path)).toString() + } catch (e: Exception) { + throw RuntimeException("Invalid Jar File URL String") + } + } + throw RuntimeException("Invalid Jar File URL String") + } } diff --git a/packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar b/packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar deleted file mode 100644 index 7e0ba71f51fbd4a9031e1ccb6262472ffc869aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153556 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�rP61X-`!|?+vzLiq6JP^gL1#-WC&h{c}xbj_pm4B0+9d;ldZ0@XshyfxJ6id&Yx! z^}!c2phq7ijyh~c2$WYor0^0VEU)P+QEoi^_YIPO_(6;Y%j z!z6UBgj19vF~kpqvAVX8$zw&BSN5IXP?fQ*zc2zUheM7h6mp?Cu^7-OFi7dAVZ)l9dcC4k=hqI zD%DFWNQxlVmXGD$&DYJ%wdakUF1|DCDv@{7uh)ERu2&nxOn^F-EROfv-+bF^Uyjqg zQg8E~x*T8t_d}u^zYv5pCxK~4mw$$% zgoz67K9MwLZtU>iG>IiVeog0rJ7JXex#8aJ!UQ>134PY9(PP02_t#gT9uWng#SETz za)o6=k1G&R(_m}3fNAbanv}Ad%Z1s6cw3a~3gy1p@c|sb>F6m<#q9eLo#$4UdLbLbM=_}?2+7$=( zoXrD@m(E;}!cY1sz?v|ww~N2AEXKqsvvyLXVo)yh0XK@Pmw()xJK$30A?bTjK`$Vz zV^^I=#vLSqGWVj$~bH5iZ=X%1mcc z18B+eCW6};dul|dXej)j?m;s< z*}7&fyp61a-gg=8D$b!U-#BMi{Qi6=_K(sR0LNDVNB3HAxV}IvFSXFvKceLg&H$oz zbKpa(7Y)`dI4pPpv6eTGxV(_L0%fB{XUNfbH3Hda3gId?4`WH(?iNw&6k)>)w4W7IF70e^^G^cOxN^(F90%xB_;OQo%%VmMRy_L*mMh=|BgoH4&%;=#r75xl|_9Q!G-4MTJYAWsfc*=tDLHG zO_$6u$uQ!Y_mnze1l3|ZQr8Ba^;^ehY;iIw>O~GOL)gy)-_K13nH_D+j0%(C)?C?m*zN%^0|jMKQs2nEbOEWRGe*NK4?PVf2zt)(NDix2f3%iGM<&H?(lK^_6E;? zN13T}Vk6MH;lb4jzE*TbmV;pxL0af>2EmOg6k9K%0^^Oj~maC<1e-`wa4A&d7y^5ApDY*Mv zn;YXWDQq@99#4a4ceBq->Po0VWw`AhIo!F8p;qe#9QO;t zw*bZ_ESY*%xs*ST7?b-(^94U=?K@KL3?gN5vu;q=$qo8Tq9JiCKuah4RLg91+IMBw z+ATC8jIvs_f+2DQD~Duhf3lwotIKqILA)w#1ET3-1FwK(xRYE=U{WCMl9>jV;ZBd% zfXDcI1 zZA_wFgS-HiAy9MtRb9QWS2%Vlp;UEjQr#qp^#h??zo%b=3LI#Kq=|yJlAr0hTEOv5 zQ=|~rr~Ro21?eX1ow@&+urk}U-U#`jH9)B%tOGN*>WI3Uh~J!^8X8~Y!X`x0fH!A~ z;ZWSOt%A~WP6sS;I8*3amEFFU25<6kz`@sj(l>oh$h~=dqR=$PW#7F$7`AtO4Em12 z-Q!h_pYH41SK|F6!`r^enBNe7D!rwoF*SF$9-h`Tt?zEwmJMznu*!*A;?3FPm)kkq z;nL)*1g`4s-5hF|NJrbQflZsp04G$si{P?TC?`-~8TiU9A;8KGC+>ly%~8v>bvR$EG(uM6dptT(^43*$1gq%!^1lL?oAP|m zVU#*r4P$t!ZoI0o(?qnR;Jco$26`T>8P++g(*I)1K3v;ZfqhPJqR_0MesAWy8aPk7 z2uGi{K9qk=(^?B;+lj`yTDc|V)y-o5D90(!r@}gWNL+~nX+3eH+7jt%%4j+>sO0S2 z>mHynVB9V&5rSp#%8hZ|$qwqtRGbcB4GK4QjxhyTjdXPcK1$_W!n;DiK^%8 zP9UUMXiF8`C{IiDMmE{&Bg)i3`L@AS$d6-;9vl0AE&_+U1Uy|O#8;O)Lm zwsv;11{dJAR}7;R7gbqk974Xb+)C`^hLE5yO5{=QP~!niu|A`SbkJz{%%R!rXv z9n2Pi{Mg51fAwyS`yCj44y71~-79FBpv^C_+^rS)xL3*PgZ~|gMN#<|DW1_w<2f;H z5#IR&@hi>f*QbytcA5@<0?eY&#W#xX>`iZZk%UM7?o0wq!`8NPN5tvDuH_3fuJ0IQ zTex_;+U(7W_=@vcCzod1pAXc*_HS&?FEn4#Ps6@JhRb%i1X!XGe5VhhukZk&n=>0< z(aDw|iKxx-oM%3qhcC7T!TUudzA3qs48gSUUV3C(lI?x=U<5oju!!*vZ{9*kTLTk`Rt!!!lqU8p zrZ@Y%Q56lyBfYMpv_ z?fs{9mdx`N)hrl1Jc1<&{rp6XtXPRPcG^Wt+j9r8Aup~=ClS{W@^O_I z&N(pJl_WYPvC~k+bw*uVH6TZ1!)~=qg3ht(D^V&e@ zOx@)tQf6L@Em;|iNcus^={kB&AxoYKHNrAjIphM?A*oo|i1!7{kqKM+;^UfmWS+p* zX_Z3X@aQ)PXi<j;(Z|`@W2btV(1;ra#~H*EgqMhcNU1E# zO7_bBW;@+l%9QY?EX;2%54WlewO~mzTNp&%vk4^(&I>W=c1s}Aw6C{pk4`=G`%g+4 zrU_FRp+(<*@GJyACZe}pG7BG}{F3c7UZPiUPE}whn8e;19?-7J)53)qE>n2Mepf)w z=5iQIy2^$kU3a?!To1o^Q*?U_Je|U|S3atnK49nmC`d-bH{2w~hIDupfAvV@revM& z$A#p;?VQ-GgFzyHmuFvX)c7e{TAm@y4so!>{KV;aV{uMl;kM5vZyMVDV50-(hP|$j zhf!qJ=6cJY+!?l#Nee>q5w36VBRq}WsN$g6+){XhQEhl~xTM|spELMA5`K+fn z#D+te()9L3HrmwD+VEL~d3a}7OwKuh@E>cmUykqTU^J4*zU)ji_68>AoFlT_>&Jsj zc5*zW+cGi7ip;@+DcX`j>gG1KgkBf9{SND<$_Gs0mqN~C!L@~nUDo2ArN>bo9|3jx zO}v<)S-_>Q<2u7IsG8K~)oCN(R+(jvOmw-!BOjfCfcKJ+Pt7$=U6=2OlFatH^D5=W zO{M&_;ZYVx+~Nxw;W za)AMWBJ$#T%cW+5Ka!1J)j{u1Kb?H&OlGg4X?jxyV0H2Hj+-BHNloT69ZydQM+q$e zY;@fT;C?S7H#}3noyK3H`-4#lVe&{bzlE>$gMY+gM+kHLQYeU72pfV_^qv@>Ja-jNfVZBc;Q;yX9}-Hb&pED!Xb({p zdy4lu<72(Tc|+8^qV!8oBoiK+3QAE{RxuH$!axHM@kbuGK=0UfFx?||H%Mybz~jn3 zJS=Wo1T>=6-P$_2n=}+!Vp;p5I_hMBNTOhkhEAej)N+*dZ1ONl237g8LZ7P3J)#{8 z6I>Y+g@9v?c}QYNbi!W67pw10O6iXHt!9A`STbOM<2x{aLiIU?l56wIr~04`l0Z zqIF(@&Y0OJ*gzM5HR`zxp=JTi{Qhb7ZN$}8ZUETB&sj6JNoh2PeJO{1yPPb0DVuP@ z)|ewICdMsd)j9aowbM6MD;YS%lj;Qh;2~nov$<(s);_dU0 zs0(#M!nDxwiVg!AxR908Of# zH{WA(zr{3Jz`}wOe<9HGJ0Sf+O)ha(BtDe{Hd2QQ)AeskB+g=jf^u~bSnpTUQBCNM zR(c1`@Q+nbkn)FA))PQYlLLi{*lu{!TJ%8m$11-;y@QNCR@V=ea@6dq@qth^^=#CQ z(_dNvx3P8M6GA_F83)&!L2PSj=SC!=qKtHG`*sGd%S~ry+-DZQnMgX%C0>J91iK1V zM}e)_rHJ?hPPkGf*LAo5pENxqleRpC8_XMgV|3i!6e)B=+^1bH+h3c0`~(UgA@j=-B+qvK zzQG(516ii}()0ou#eyRRj=tf^6oFc{eSZ@vTOx!sgKgWDhnXFimshnte<*WRZE>Iq*Ue@$t#2Bg{w0y1IAW--o>t2BD?^mE{?5@Dg#+Qud3_8 z^Q|nO7bkqFs_FgG8GL`yOlbW3BiKLtGu-?*DT<)F@ZOXjQ;DO#zt}#A#-7O1Abm^l zZ2JvfpsP8)B)qrtw|oO7cdzR(w@T7);3>YR=;6@(R2LPM?q>f2)$?mfD78gMpA-!( zibs|wqA8Nml*ni#$=vBhu9CCHn?Q#Xit9r%DBr=Z4w=p%&Djh+=Y5_cTpB zIi=U!)JJ38d0+n}rM;iN;1h)EKG~%idm|O;nTbZ3c<+kHK^gYl29N;!=APbvZ*v z*pC#g&J4l$4lnS*EFU5%?WxVGD5~YK?}?%eK18F^Ea?^3RBdu^w^d6whR8^cUtruV zb;-jrXkq;<4hTy6eUkxXp}d#IG&3SOiB6SRlmLlBN4l*oIM*@_#4Z7Z3xr}l&63MF zGjowpO*VGMR2CaT{2mMxQ3lkyN{ERryzP`w?QdjRl-|0gkgE3lI7xTecOYTl(Mdw1 zM)rnn0A31OfGLrm4xxDRo9Q=m;J_?%(r@PS6bX!lv>`}b^d6o3iaO%?kQi5_Q*EPV zxQQyq#d;&1+1_5#yri<{zb4{e&%igPof@4Ykse^ihI7eb9%p1-ppeql4&-QCOPvRJ_*^IYr$GddLy0B8PJ{K$aEVt~*7wXJRB-V%23mk)*BAG6Sd4wu_?G~G` zSuIe%GP(+U!V9iak_o0;7Ctf39|@qfC+fq}9XAD?gpG>4f|FhDatltsPhswqS67|) z=w_+%E-7^nHPO7p9Wbt5ITH5oL7wd1G_|0lZgfHAVl;#ZGMM`K9TuUjVl3RWl5g#| z5V?EPU(|ln6+zQF@i$k(ACbMEj~Z4qn!y;8Yq>y}+#Cy=yVr29^^J@=_CiG7O4cF2 z?`l9@KJVqV&ufc$cMdKoz=BJ&;4m-Q%_7l&li|HX*E*&G_tuL+qj72lqkXsBwA z>y@w#k=YL`6vMOEqZx;FdDUZ^lOG*2RFdH~919jUq16IiAx}u1I02+5(YJ4RjjcrX zeEwh->WniUtWA8)4g5iOrG}4b?3WtUi;bRd@Z(j)OEjy`(B5NqGL8Vdin{Pu(00Mz z)?%?E?e2fsj0Id2wpDXXu!X7qVrK5l5#U=ZvW}a_T4mabl#8J2dwnSg4j#HIgFi^* zHc$jNmVdL(7#l}RrZXXKoHwpx43h^0u>xjE*r7tJ!z5jeBCf;e-ju{*-SBFm9K*Zi z3Ezb8H}!THX@c+sr=UQbejHwd-|~X6;Rxuy=p=r+1a?zJ?8(i2y9GXv<`17fxIE}Y zjv9_2dLc;I?F0O%W7x2U^A&@wP31u+2~i#2HN}ihwqTzMlSP2cJ*RhpZ|{u-0ser) z{OF_y?gf{;RbCC-4n_L_)C%Ma^1Knf!Tg}${t@)+^(cabw44%=Y5;RrrDbu>@ffoA z5eGPm&d)#C#xQ-2}!s!*bE- z!*qq*0GXj+YpO)4z-}klE$9f(8eSIZ%nH7d#&1_r$h+qbyb3vr*&^^HR0Qzm&ce~^ zLp9VYv_^Bh5&NSek?`g$XT$?~8>}HhZ4;*5GEdc(1<=P*XYL-M%cidaxsmp$Ai98k zL1Giqb1(-@LAfJED;>KyK3}-6{bBbcAwqXNd^|u;jcuF%p40Y!8?Axgbbh|@*i1Yg zJ?+DT-I58->_3*tN4|*1cvN%FWU__viM~*Nogqj)k@|R}`7Xuw62QXkohQA&%XkfB zN}e7+hyGe=j%!L=a5d1aw-ifcu>%u-Bz~nMrh0{diG)E+a(O8@&q)Z|UanSr4$i^<#TtNvW_KcE4SL z>0>Wt(T(mU@^1VRf9Km0_$^DqMqW-{=hPW?FIQWuBDylJw@cjlFLKGAu@jmSWf%@Q zicQ1_-b8?9MR{I%NkB;kR7M5LploZz-^EK{p1BDp>xxZiN7Uz5uIyTfuZ3{R2b#oG zZh)tR&JXAO%GF1G4Al#bv`dY&g%MeMRXzQdodIIh7xKDIVav?D3x2P^X}c)Ek&Z}> z&mdDe@k4m+YpWkTq9wMw<0_|}>GWlegwdYO`GI8|R)P#UR>}bG1#y%KgizZCx%GM~KcjmV@v`Pt3(BVjT49Jp3l#aFKlif#W&b8}~qyBAf z_|bOq0$mF79M~-sl+kuIZGu|Dkq9bQfTH~dXGxI<0-DSk)TM7=-!uxz1H9$qAH~9i zqBPLaYNjVQ&y17t1!q*c7&YVNIP)=GGJ+<~k(hFX68TD#K^6=X3fnX+BsvxnT}r5| zBt^n0gXBY-zk!sn{!LH)2d>%HBoU<7SG4%qV_@zT)l_x<5bld$TuDY z7|*dP#zy(H3lcuMBL2(}l^pY@r`f)F^6qX>TqWRLGO0hOSG_MXx{}k`1V^+P`$}jWsabdr;2q1fJ=IYmhENVH+SVxF-=u{iYzz^ zroBaosx6zOba{+~^d|F>^`5>6wBp@x!>f5P;Zw{ubbBVYod)2R*{{M)QRkGhKcf%k zG7BeVW0U8ShNQINk%Kapqn!@0e`o@DD{H6B1fa-9cO`N-1uN(-g^RihyYhnN<-iE(>(uLsI)KqDD+xpb=zu zy2d~6G<@^INc1JFB;?*O0lzZbhZ~wl0FaKn<=oPFA>>Tni z|B&_?irUE6neG%e65#b1^Pf0act5=0(c>Hhw2yu9a|#2t7?}lTn+QyzPWTkDuVsf= zoB!a6`^JmfcSMB6^?xEmB88qgQ9Aj&3= zZj*l0gufV;(ON_&qnSg~?`YHM#ApTz=UT~~G=7cqw9H9?ar8|axO?YI6s6mvf4)ia z>@?OZx2WetWA0<0E)7}@Qay_psxY(r_cCML&-vgKzmhJTIs&6el}Tue^fk)r3G>3> z5OK`Y0STjorJ4?nUcj=3rk{MciN>G{cvTqw6i^UY1wZ~(oSsF$srn3I(FQ2dDOXPR zst}`uNI@y=_Qs#V=>&{q{X;Reg1#`h@%kTRUC)glbnp*V=ksqfB>sgf_L6jl!1xnuNKA1y?9i-a*seOaMZ zN5-lk<4_L&Q;>u=m5La(8vq`Z{jfc%vPJya(5uPxC(g{~=M;?}@C9>SkOb})Wknf7 z)i*+F0M!7nH$!9oRFN2_MW_Uo=b+pzS0QH#W=FiZyT!xcpdlWKgvA6|dc=&wSMn@; zZ(1%V1L0S8|GSmJSRJdJM$Ytn{bYziR$K|okH#)SsCcDA$-|}0F|f7sJ^p}^foy(U z(&Lcc;d2~MOu>?T6U;}Vh6#-=E%+E2@cg+`f8yJ;gSc;?3Mjbr{WVrE0|VrGcjxHL zexC{qdk$&p2%a1?(Bhd{WPuX2N#gKnkYeIPP66`<)Re`9QJtEe)fN}|i9(9IU?73pfcX}$9w z_95i+M1SLdmVE4oMEx(8@PG0@?EjV}{3ikU-Q$^=7pO_xkCB(vxTx@XnDE1fXbR?b4j}kAOMTD z`Uj1xZ0Xc!y{f6vSn24z>afs$HrQ0~>b?I?m(l||;hi~h|0xfy?Ps4Arq{Q>Gg+W@ zV%-Dq=o`FlFmCdB^mGX)wb!zPo=Do+kMU}Y5vAvz33D}9N}n`V%gwdo7ZD>!CaRvC z=INhMpj3soW**G}oh2=W5W(bkeYSZRA^ic{(Q0kJzeEDE)30o(%6Hbc4g|{urg)C> z)N{o}4Ikr$xD&)lgJq}@PbHUr;uCV2_fOH_KFR$x)yUZp{N@sI#e5B z1qlWFOAzcH4=WK;+%xiw{V~!KC1p9J1#OltDaB~RQ$&@pBKTXaM41srHEA{$_}lR+ zCqw`Qb-bgHfeItql`P@YBxAv6@((Pp5_Vd+I@E&WSXy~fa*}lU+pv{tAG&OjCKCf; zTh(w1i^;I(8KgDy)N@Ajn~EsT|(v)Zn{9pBNz;5fRF0C^n=n9w)Z(YStzhH8p)*TuBsT=J;rV zfHSWOEy3K*h!r(M9m)hs7mo_3RJY3VVheEs&trDEP*+d5F0Ki+q4|QEejXr|Ik1Mo zRd$?hDT2234(Wyz7x5e#)mGxwl1&4D88fEYFqT3%2ed^Xj=Jd%T9qojTao&pdF+hiPH3#hjGxpFw9bOP_AmdjkA1bI1PhrO<1b|7rdAf zRx&0P!v?YiSv%17iE7(ST&yj9y;3c;B$BJ+i%l>oNFEaHIi*1<7Z%Id#N;r4S~(B+ zLSXx+Wh>hX*a?AHYB@rD(|&!=D?DItffDw4OX0VSX5aDRPq00p2lkOeHWGz7{RvEZ zyIT5#6}yn1%q$y%WX3p=;bqN4D)S~)0dZowzf;o4r5i8K!5z30?#R8i_FqK5enUW$?h&DvSWGvlP~tqx zN=1kmT!x1jF#kJQ*bhuz8*H&g#~ZLc_vXf-7sroa_)u6cq+EqGkHgERYaON~i%Xev zfI4Xz-{C)qIK@wU9v%YHTl8P*SOTo1)#5@;mS}q*g&>L(3|?D*(CLLbQ_V~>!}~9| zhf^gt*Tew6AWC7fQs|Y%oKM}32bczFRq<%TtkEr9MXLboD+Ijc^^F|~kcJQf(#YzIt`(nvgRuczksGU+;7l z(QzuYan(M@(i)49&*6ht8%g}=14!6+9>bgpa0~U#hU3}WiCn$4bsb0FVrMKLv!T98 zR`*1~=BjHml=?6$-BD+;upf!^C;6@=#(TOjA0Xe9KEM9X?=>=6)L?-@-73zXFfNpk zUzvjW#OTfrokl@5*6anV5Qh-qT{0&811gBlm+|69}? zTI`AIoA~!z(&pPXxY+$_D&0J${$g?@4BvKV1#D~3_QWGe50)>A7r z6-xz#g?N~4Z0%YcRj?E*3T115UX9O%CUdTfK3Y_XQyJ21gVlJ6d!J-_2eU_XioTQ& zbn=QEXaqMp9J;s6MaKq{v1@$(M}-HzPc7B{mA0?hw^5XKH)O z=sg!Vd(EM+++TiVnZ&f z_Sr5erq^<4o-%B|YN$*dG{l948Clo5ZA?rs3c+9Wkwl6@{u&p>bI3$Kr|w}q)naJu zZJemWd+e&x`LnmCKI%@dGE=G(QfgfCCbBh~GfGU9VqL!ydpLYgTwa%DB|$t-;lNxs zC-F?$p|B6NNaNG26YOmfm~W%(#W9UB#y9t(S1?myJEwXVv}P@$CUQfgwvo%_!NJDE z6?y@^%!J+$Qe`7f{Kg0jt6KFcf}2Et|4y^6s`F}fd007RLcKgKP@WG1y6;sXov=nK z$Z|S&$!Ni*RETFCFCUt3lj39?v~N#UPKD4>wO&DgpHX*He(7bX?M^kdu@&`e+nKh< zV*)V_|9%yEluollJ4{%vBFj4!%5K9i*`o*3(#exb!>LoamDXLs`(t(3{PcHzop zy^Z%eL08iG9WYb}VBcA@Tr>6KXtX5(zcvG)wLJ&2d*(x4jXDRyAu3SFbzM$5h*gXPHSCR&@9R25}`kT z7Jc>wp|>BNRK{?>P|%F8k7`pwO+5g~r}h^zv|P|o+MjfDwFrxTMM=LDJygJs@STk) z7iI&l405~1j8R2`OlKBx>5z|~dq|0A5U12D$O{{i0_^E^f&Ob3ziI`=RkY6VhsV0_ zq>PG^Tg{vDV?>SvlK1A3N66id-?Cc;?RDiIxU?uP6?u;A(r`hcWBxG}WIOjbAtT;c zt|1j6b%Ac%sGK>$1bM>d{1mJTn$>AxtkPZcq;aVB4J|;$C5^g(D`5E3x+pbXO-`@8 zbQdoA-2?n0KB=Z$WA{V-DRP_QPBj^K#9cK+&R4;QZEoN3)WFHiAbLz|t3Z65qocUw z11eKOvn9LqyL})mf|8e_*J_1n}W=bS<(h8fh*@c4ejU5Pt>=gaw5)(l-#AaG8`Og1ft-@*p)XIOrb@X{I;OC zK!hkugch4hrtr#3kyt|J-p_h0Z*_nSO>=Ko{QxvCIv4y%?{V|dTxba z<{7`4FU`>MRd9n`kn?$(GT+HJxi}p8ygva89%wyIJIyJt`!p^{6s`}yyxU;m71loo zZ@q;s2#Rj#U3L+#yqF``1*DV-z_{sLRVq362*s|Z2-{Vsb}1uqVanPs+F2}y?67V1 zqmOAOi^37>^+VeO<)AMTagYn;-8V%=E)0bZTSoA9osC8^jOrc3=}=aEk*>MoogsQv9uzm+$U{@;ur=_8-*J(mi!3~o$!#EFwImMqrG#=Z z1{%*ug5qYQ)njCkS=N?P_SIu&8@b7XzKDoe3qu8;JYpECs*nuXgB-%GiBjm1j*bzD zb`pio6`kT_nfUOG)i^|!e92zbdGWOlZO6W4 zlQe!Ow4gX<>0RDwVHr*z{5i!6QOv2I9!ri9k)RM!Kf(N{|Lw4&AT^^fcI-%=%$cNh z#}~*z&hwK?7+Lh-pd(?TBY`Y-8s3%E!!NNtEh_E+M zfRLkvZF~d+3kqJpb>*wEixV@}4>z;Wf^`fMlRJ1UvuCtKFzJS7+5(pI=mV*{es)xH zc&W*wTzaeZZtiu6((|;D6`$4edxdCw_i(#-x>q#zm3QGDJ}pDH@b6cg_?M{D=!!j= zPZX{d(TliDM|}gBWqI(r9A1yGm)wYQ!?;1_@uq-vBCj(;>;u z+@bnv|J2}3#h3Fx_B>v~t4BA)UnR*@%5-@FQ(mXjJb}HAhWq-_pI$LveZkR4q^?0eO^A2^M-(9|Pz6sNTf{Fac28Wkz#pf09|7cK`{ zftb@42}~nd+<+Vs26LUD(q%j;47dyg3Po?n6XK~yj{Zt@^#SJU_KuetNcf( zA>c<4%5u*@<7Xj{TqM0dr3WXiv^Tb7x7RcK(IfH&tzV%`*lzp8U-vjKpM2HAk~~)= zpo-kClB};F5!{kcaE2*NJ{tQQ?8dn#4edXWyhGKa%1>nX)uCyJn>GEbTqu)Y%4_6uw=<;siAp~2Utixy|?zt1~yf)5pc zh*p+!n%D|TwRWkMdf^%?-1CHQUe5djQZh}H$YUyazTniw1|t*V12j|V2DMFMQuU(* zwj@ETNaR#X5}mF;adi5Em{3Shxj2xoE&(5;Qx~Wm->qsjJsHTQl%iy#P&#vI-37`e zt1)Dk;o$NXR8CnZ7C}DcaLBqOpS8C&sSakb_|jaz*QM3hGjX1Ruft;t=?~&lr^<|s z9lvlWa*2lM65neNsVu!+PgNIjCA642u6pl%S@xTuu^TYWTS4x_#v-Hg~%R z*e#-27^Dq>;3ChTbf9qZz~1IzQEHxDQNavdwmRzq{Z=xddM;%#(fTLvE?Lj4bi){& z=r#RdXsmlxTh6fUf?#|*1T;*gBUJb8+4a_xce$9p+oo((_OQ9W zQx>K-wG}}$?H;-j#$wT6-BZn?%#ndCS^{_O z(L6)YQ2fV9pW1v%6J|=v0fRDI@jdptT&7Oay=)J_fX%nE!exz-;&B;RzhE_Jqi#zoLT#6vn6bHS+A77I+xsIyYQ~Rf&NiK#cF(& z`#)-#@xSfaX8pfV%l^+2`Y)|4Th&?>TNuTM^mqS+00kO~d2owdqMVwBc_ndy-|vNz z-vn}z8k<%r^iH~VjeiY40l)BgM9=%+@%Y{gxwqCfi^Nx@#rTN1xR{>ZbK0M$v)6pT z-_LCUBJJK01yzAIkvtGgF?i*5C>mMhwVQA{tQ{2>Ms$hCMt8&7q&UQwPzh^KV3u+U_FASeYx+)2F%CR> zLHzEPHUSW9OZrn6G=ZU?X2q17-)XQ`eMXTDcf6t{wIi z5hNc4Ihgv9q|ce&nYIazG#soQI}LjkmIDc?8vOQxxME&%@+Q_#T!MiVa;NBzP3%SU zN`CFW?c7GoT=@@2M}{t0g0{R1Y$O|~x1NH%vJuY@Q|X6kv9{pYa@A%hZTnGln9MQy z-vgB99bGEfF8s?$LChwYwCT$kmWnVz78A}v+i-MX3}pIvjDmFN-7&^Y8)6|Dyoj~D z(j~c!4l-%m$v2Q_W0#^EH3-+J4c5~~Qb5m`^KmimEb2fKDtkjHDyN?CqAo2v~#{dd19kkj7zIib#6am%)m*9L8{?5ceLp&9a`}Ru+}c4w{SHgKmInt zTq8zRlM<*PXW?&!CT%iauHPYs%T_gQ%ls5Mm1p*!EVyLW7noqz+N5eHDP0g{tF;@b zb%*fKe#grS(~-YqH6AW7`_X;YVdhy-hvg=b8*ntqPIp0YPDLek*N|@{oxM&ylXRiz zr_+$@s*hH`ib~5g&m==EX(~AcdzRc>Y8L#gTDf^Rhmc7KugG209fckQ;E_2Yps5~u zGqu$I7{KzpS{2Xm^^u9(XJwOScniZ&AyfG2a3Idi-Hc`@#)hV}cpJq5iC7v;WJ48b|>o zwh|A!JPHPR<_C}~&&BWTw;1>(3YnTclFL5essF;bODD7wyT<`?<3@b&t{?Xdapwba z;0EB%G7pU(!fyh>hz;n@G6|i?4nuq`H`pQk0rGXQfm!1miclrjrNR?HK{qYP52=FIFlh*-t)?E8*v}Ymbq&<%8PiKxB4{qy8fM4v6!zplmtS8 z_k>-;9Na?@V$KOZxVGlUSkOPlGigp?K!Ob`aO%YXRdsb}F`u;AR)K$>S?pH@5ECI7 z?E-XN?7OBkL0HY;1O^p_1rd19w>GBCH62>9v9cxxc3Vw1?IV$)cu zakcBLz?5e{wgw23;DsQ)t!Fuj_|LQ8WHMlRqWdqT>$C-?`E%R|9=}~B}~fU zFrtR~B}x7SCL$|Qw1OckC7};zU6xa&5LHSbNr0LTPB8D0#G0O)kAUpfcL<#pBFuyd z;mQxlR$uRa9pZjD#m0SneSX`sZP#fJ;!3HyOH&jL%-}{@^``*M+H>|>?35{yLnquy zQa<_>ESo>54zb{clCFo23nG5vk9<$E!YU%cvA$$EPW0sri3>-6ZqcJihI-0dcw~|X z$k2-*Du0U^3&MR8s4%7zbMY#o3+BD#lY~Qu3!2ROH9}i(7_D2^c$45g;<5f-T!@&y zJ0x|P+;T0yN-rZt(C_MS1wqPKMzB{jTq@Mqu9wxhxa@0?x|U@KW}6WkVrE50H}{Os zE96qJPmHVwxo+SwTjw6FRf@b)DYHDt*TkTyVaX=>`LedVZ|#KHK$_IQ?E9P<#kDL>A!?5kohzvbXoGc!r7p*K_g@TzbL6fq;M^O< zT0Y^=Jg-PptFB8kt0o>Z4cZ6JI_(8b;n<>US`ZK}523hI<z}@d zt@^o<-|psF=%a>ucaB77qIPF3k)fmnxQuJ2 ztc#`tEHW~nOo(NTCqNFML|GJzrd5>Ub7#5WDoA_kXTgeXzkIhd1C{EfQi!BgipiVm=#%sbF^lXNuCNf)h$(iKA= zQLBt0k4mk8V|(n+wna2W$z;bxd8{a?m~@N}$#jVpNL8)lch1>fj;}d~Tc(_>l5ItD z@=yTGYRXfZQRS%2nc1{2)wss`l_6xBl5C9;mui7Nb8V9yrVxXAwosJgxrdSXzF%;e$kEE>uft279Tn<3~0W z>iWnIP0^0UMR~0A{Lcz9{;gOyO!u+~Rt@QPQgx&aTkfiyN`@AV)bd;?1PK@hKbOpK zfoqAQvBi*wk}=PXcSZ{P)C1hn)97`TCYVj|rHpVu_dvz4l9Ak!9Jd+|jYaTK`6lXQ ztyN0Db8NU%XI9kfUW+r+9B28$Y@#UELs4ja< zGDU;Nfv#6};ljKCr;>=OYdWy)QfC_JDa?neEN$(OeB!#{Ay%bDF_ER!1UOo*zv??& zp-yE1IH*$;eZ|Di7Id9WRh$`4g&6^mw|k!M@9qd&Ry$-USA%a5WvRI`OQxjNO>-7i zPyBO#c_AjGVW5RfB>(Evw9mDlJVoN5+xPbjcFP^1VgWK4J&s2(Yad@CL9|KWDXNsIJDA0}4 z@mC_osymEIak(ooyx@E$yHGrwW2%Yg9VJ3oIAFg^bfJw-wWEBp^=C;mEq_P&tW0;9 zmMFCh>iFC+(6b05)%Gbv>rr+hV?fAyV~3T4ff&@%4Z8?ei8}qMpW`)NpC5iGb)SkG ze6GF*VwED6#!}+_*b3*SzNV=~KKQF*6Cw>5>57q%NBICP>Vrfd;7# zW9~z3icmF;cHmKGNhf_jCx@I&k8B0L%tP5m_rBr5?+;pjwbP1Y19t??Uc)LB&ANuv zC@R*j;G(OrWf<2>l5WJ;xylY~4xxIddfI+`0wPoPzV*bCi;;?ipiq1E8~T`2E#$l zVJh(x9j}5|8o7EK#?N`FxzBYm@Q~sLCC0n)kVu>(qWve5co^F@ar?bQ~UX1H-8FqTc z(#q~SiO~F}OwKq6*^;7dX*^4um2u(xJRjA+RtNE8zHxgGvZXUebYdf8UjefD{BqOK zRU^rgL1{#a*xkAt#^UK6=QSue5b+SqSxA+!9V?NFztF%T9ot$d_S(OBlEdO!Hyqx( zC>B?So2Y_&*QT2Alj#b)#qJWrSW0VawBI~yxD1cj-aWwX(y=LLf~Sa!*d9asYwd!| zy@{MA?lYo*%ju*cfK@33Y}%tY0dv7H!d9i&+cP8idCO0=0zGz?<2G=#LN}PUih%Zz zXO>5A-W_YF|8YR9?)Q?pX!U%*puZ*j;1-ZepG01*rygRtiLgWBTlIVgq`uy%^5+WM zhK}VZ@KGq>!=!#HXu$Z4FT-Fh2-S;*2b0U_ASmODF`y?4{b`o7xm|$(hJD)A;pR#| zP|)Y$!nfI(kAV?tIqAhntYUU=m^x;e%74enO&@K#qZ52*euZ1B5lN;aSEW9m+nf%D)0mL|pno)FQv3J}-UD@5%27LPAk*Gjs*wH@jtz}$3)v5%?4?NDIkH=l+VZ) zpgrcg4pg%1a8nnC&boMQEdjuK!wuJHyk&cHa?4S>(Q=2qWvR}@Z7+sGgk|Q>Eg$#q ze1fNFtNU2Hdk^eMD(Fv%zvOm6`l2{cQiH}N5&-H9 zB=fM@xFF8NAWkR==Yq_&L*Cfk*`~ky(McR=#cTI^&m2%}cch=hHYUlRg}r@Y>|t~z z!2Q=#Amp_8ONW>?JtJrlrX_*o)*c>OKlx22N4GuSWx}cvOR*1<;I7Wf6{KX{Qz9we zz5SQzXQ_8TA3XH@B;0+L=T|x~*3Du!rQ(Ng`OY;c_YbawK0(v5eA?o2-TnV+zSTL^ z<3KmR%OoEzfVfM{>t{10bjKy#60%Y>hKyk{kjEWXlJXOd`IpjqM<+S0D8c=oU;C5s}rX1c=NBP-w%4WbU25% zc6G6(!RiT+ZITacRddX^Oz@k9`JT@4v{|Z z%5+I!EVn(5=oMb;oxbl89PH6VfuN(C3<2w|H=G?xr8O32xHUj~-&1Gg$?rnY=Wc;t zZI1Hlh0QaE^4Vxldp-zoI2-VJmLcrySUqM;e03;|-W2gcuo^@GL84{7UH0ITBgnQZ zN!MZaf0W7L%*Xn*@R}``Azl{cAOF^mg1dYbbHjcEgE;?HKl)!g?b!p2tN>;vv=+9ecK=SP zl$E819}qyzK2R43AQUukr~?nH6ii4I2;8=9{Y$<61i9(R0Sd9B5S#}Xica6&^XLT8 z03a5WFtjS2NVUb&EG{MOb$p$3%e7s8^Ko!jQ!q7YPF9|)Z zt}gBaF#gqwe*}fy7kuCOw=3QvRIHN9meELe7t5pg1K?7g{G>N0tsi6piYy$t$miP%OWFYw~NFS?4 z%n;B_eI;CN{~>WoMrbovDw(y@U^q}WG6d2*T_lC>1e9^YwwNVsn=~u-}|F652P+Zj)H=a24Q$aYs7GN zcI8@OQqSRPapZoe4SkN6f|vq0Yfe*(;3Y_*UeGuAL<=;i!Mz`dk^-wt?~R|aJi>|$elTw!#g#q1DMz=kAi#?`E7DTBI)t~OD0GX9 z5f6U_;iYTj+ON@Ht95Tg^=U`Y)X(iW`L;Y(f9av|f(4mXpa z*qtEe_`I5PBt*+|X+E5+U4ORm6^=fX8>GC|5|3=&;J$$G0gEqR$uJUp_BsfK)wK{x z66@P2y{NEao9^p)rcRc4lBO_Wazj$a?~hSDi!bUJCW&a&>O|6q#m(u+f`jJ)$X#AN zWEnw*PJwg~c1t4tbGR?GWc9E~sh{KKV}=>mh1iq9hw6yfybYQ%B{F3-^mnmf1!3n4an)Fmn){WU)wrg}!xsWD_dg;HOSsNeF`nXLTzQ^`>_E zO#{t%cxuH56m|R2g;JQOz%Fd4*!IWY z-Qmf-(xU9HD57^A?$@E+>S^H4!C=diRETfge=1 zf&>L4EjXWF5+UIlQxV7SMwM%{Ah*;L!EmOHwdEM;Pmux`v3{%wv!2e z>Up*bcI7sPGa1w}oX4n1g;{!GsbI@0FonX2y=0^jf=BPWKS0-Lw~ndA7^D=MB}iPm zn6o)tfAy!9w@5bgqDLKTsUSmFaZrWobFy$wB_#I0<)cF(NVga&hzw&E{-H&U5;3L+ z#AGdmmN^@XNy6_@U4m06F=WFq8ZIo zkvRk^qedCJk1LgR)?-uZ!hfKlJwa1aku|w%(AYb=wCN9nxZ~i^8d>}NA}cm?LzYs~ z{lyOM*12=M#0p^_`42GBO!uBjY=>yK9nexDN~533J#qb|iiWVe%mL9T&8;pupvoDW z(-;|fa;0)Zm%UG7F2}Ae;EJ5qo^hZk^X`Jy8}MY$v>y>`8T>KFo14ulP3nu%Te9Or z<%@HbS3)xZBk;(s%ceQ59Pkq0dLmj<#YbmVTmJ4VK76$sbbc?a#pGPf?;S|mLpE~( z9bfdickdmkUP)q>3ets8-WPV`1?{UpOt1qOn6Q?q+Y3>;Y5T=s0Drj9*xFfE*4bNS zq;E%lRHDi&I@(xFFe0w{PKck7K*N&}u>j#Z&GcLFursd8UB!5SYAX0*wAp@6A`JR7 zJSmshJX+#*mj#~snS{IMfi3AF*y?%7ImIOJ6mi%`FO> z8xwXVCV8xsz7 zluy1+PM2jDBWXWZ>4qg2NR$j%Nt4oAwDgUftT09UmS@pM5u;o|if5Fxn|Pp4M@a2@ zg!2A64K=$lsek>11Nxtt(zvNo<{J=(Dh>Xwe8%pX3Yf&Uoi2^c^xq8W%vhixJ|2d7 z<_6nVxRL!9Z7FU+%HaYu1&f_4L|PSg2}G%0(J?C9Pt53$A9p$HwZ0l7{rYS37#T@QnwxhAx!%rxFrl?eId3S(Q1;E=B?Z=-Kt0;d-Uugb`;xqO zt&^%#KQr1HKo2NHq}?c^@eh98Y9&N-vQr1qSq*!$MTWS_5~1oLDfLQ0w%G)1$eav= zb(QY8pxHqVdA|sY43RNS5+hZp2$hHpoGm1-#i!1Q8r%r&jX{>a)hRRylsGD_^m<5@ zn%kx83PcT9R4R;9r+cOcqDBsrsg{HYnc8tA=oWcdBuGVBMARou1a5I~_nto{RYH*t z3gcG-!VuT75p)GtwhKgy>Wlen$(3))_3xZ!6LxI2ZiqcqY@x}6jX#mU&SRJ_Kn*@dEJ^)P&kIwlm%~+HoONri`(ru4 zhT*Ie1GFVVs3C;?BaGC}NLL+cs@yMa<>8WV6*Ad|QRYEDVgt=;U&EhPaGv}DoGl+A za`KvdpPFugh1K9|tcg*7-)Nh{s~a#8$m5Af{Jnfo{7xGqicBk?uj|AaKp0a?OP^>AG|^X)7)w+9mH_v~p%Nb5MmgUP@>nJ7L0H4s`j(BV67jzS(iC3|wZ z8Z)-ITt~dDHtfWteOM&LrRI@Nx<2>c|6P z`}D5Z43WuOeB3jMOgP0shd%V>M{JgA>{Rd2+(D0qMh*rs7{P#J)r)TSZH#kaSTp9` zTJEHfHWnEN&6I}X(wlKWHxI#Io8s;gD-Vr@<;o@F{FU|Nb`k~=fXwBQ(QDmn5fz1i zz-qw{98Hw?RIj3jw#IhXJwhrl@@jT)!n1;DvkpDd=tp+ddABxGmD~)DaiY!1QAWE1 zK?W?JL)1E{R(~-iI7U{k$-6`GVmRQci5&J%N=#8cnYPjgI&B`{lF>}%$R2l?C(6yX zfNsFU9!9TDNvB_;785IwtR2zFUzI33M5~r@uJbbZe;|UcF55mW*)7|HaCn_{=DWn$b1MF#IJW7D?;h)gbE_1 z|4jN@QdfgmWpK!jGv&CYIIPaZv?ZSLqpQ*!82?1g zD&Efgh4}P1s&o_ILrk-DcTlT6?II-dOvqP(3|5E9cQZ+23-KdaftdgIke2P+kbGkG zCz-EpJumy+9k_Mk-uE6~<%h@LY7}N3wQW20hA4FVS?`%QFLgCZwu9sdjG(D(I(8evH4ht~|TH@tN2mt=R9>wX})UnNFFO;1QVpHradh z7kWkP6Oxk4!h(F@ACx*getcF>k^Rc*%ah1Si7!l z{f~0nX_nq?R-%o>7@GEi8#<<7MmsGHih+$)(x&UHfX)?uC@3`rw+ZmCk#Sy<0Z!!G ziOwgro${DNTLt!5WgQ3)qGAX2xHOw&lsyP;yEMb>&yP@UAl`SEEK%pJmDaHyceb}E z@!8}FnJvLuk&-}YWCpc?x9)P`8rs7*0&MsET8X2%?Qz}KWRhF{tx^Sbh_ta#N@)K# zb@v}9exL4|UhYLlMzj`l^zz&O)UKgHsKBTn>-^lp8=Ezzhj)JE4KbDV_0_}($cf9b zkCWYBFbz@W;B^hfwul1zfZ|TAKj@7IJj2vy>_PU%J37Pf;VN?=koVx$zuGz5G`raX z!$ei1Oj2u?B4Qp&58=>+Z!{5Gr4w&soj9SPsj2^iINdbzGkOO96aWO{t8AKJ1R+?P zyns&D5y%PLg7#$<>NY*z8V~`+B3&Tx+K!V+XnNLADE# z>5}v=-m&d(oZdfyTKc;K667I+a{fyaM>%eIVNm6fJKYmk#t!J_vtW0NGyo%Be&Zt{ z^2gws+1*_Aj)jkD_;H-6CefF996LvV^)ey)qv7|6p^mVRHB^5cc-b|>^q)wDJw$-N zC zjvaWgZ=Q@Wr;gqM4qp;}@`!q|u^^9R7^vzOl#>T1*vM{Nub*pwJu>V@p;ln7TP69iA)ws`I0|)L7ED zaZlIl5HCiVS#YZqh4?rZnm}+<;0;sSz3HO%&Y= z-^7UEur-d+Yml99Yy^Wv+ee;df`n%26ibHvM#x)uPt&^v)a<5RX`gmX^M?;plwUxz zcO;lMc8vQ3nRONEzsf4Nt|qmvMh;LCrkX4PgT?2X9E&wGYgsDT^{SR%H#PWFM zIVbp&M=f1XaLqH5>rFR?J}~p9N~ha9#wz$XaVSQc<9q0k^n#7sj#lJM`bK%pAs8lMtxi67+ARWG$rxiEyFFJZ z6QR?)ep2@M^pn@_?PUr25oe)|&yti4`o-RguV{u5(9HLsu+t5z?6}e>0$L*r>M6g4@I{yr2=rMyAVd{K^!_*}Q0Wzq22Y zOB*b1ucxk}IYX)B3#5C>*Va{J`6LYpTT>@a+oe>d7n@{~rybWRLM5;r!$tpMx|U#? zqHdL4E6(O0v=iO0i|&M>l_4g;jek+CI&{xgo}w{lWt5a7%RuW;%OvGdvT%bkm@>4Y zvDu25nU0-AvpopOOk`3|9B^OzxSkQ%$9D}8-U-+8_zp$vnQS3{VCFnSJ?@mX!SL@n zo*lVE=ncPJW8)8;xr5r-6CE}Q2OpJ#(koEv6*F~-!IWoDNC11KpY7tQ$}_sUnky4) z>k`^81aU|`xD^61kcv@Tr8rft3ZYgDbGM(W^KXO&tx?pfr}=1$z{G;heHkeZ6%l{IzA zfBqXS@3HlGq5hlbk;nZ%B253Yh?VF6fC>ql18mJq{#~*BA8|eZ0)|K!|1U#(HASa& z5yVfrdg4*VtfqKGVVIJ(ianMDHndAHpL~zOhHUU8o?aQ zG+j*2G*PQ|l$?dl$*L{PqHC31RA^9LtiBGka%xT`&e39WuT^8;orE>ARdw5?yp1Oq z5!D((N??qo7eP$fYcy~J$R%INM8ON^ND=vz6kQ%VSN=i4>I0tJbzOUgx zH5X%damxW7iL^>IZYk`<7HOMyn9+5*+@8&~ToAM`+0%CVyy2@)YECYgJJ|zc{}R|| z&0D^HdNWFm=cU}BZ7{tdARas-gqso+2AP#EpAL)Z1i{l=(!;Go3DyvjKibXfBCZGSoh@DLX<08P` zY@n7J{|<|xa{61)@13uX&F8L0@#HS*rt_xg`4i(NA-FACI^9SEvo96UG@u)5Or)^W zkI5rVzZx9vK@ykLO_jLmb7#zc(r984gRO}?!%`dmsAc@j#yI8yO0>NzWUgy2oJlXG zfJsN7Y`^S`{m^03*|jmJkNq2lFp`ues;?H=C&F~QdQ4*&TUZ36qP@_G?(sC+G#}Ov zL2~VDe-2VjHi3`?It0M`owIe0A3sk7~mrdCv+upgDtyY8^N4<*iGV^I9x~-lFhDrgJr(R=B*^S zWz(CXEnPZNrz;7OnVv^@cX3lfqSb)Y-eY%mAUl$;oG1Mu+hvoL3E=F|Tm{-L zQcbRm>U!$F=XWj&|JEa5taj~8kmsrwric`u${=gy1-ab$sVmFGTQ62xI#dLnpP;8v zjMOWs1LA@&DQ|&a;K0^?4NHTSlq)Eurx_h$2t26=k$D%hDtcaMG`jZ*oIdt~NvspZ z#_CHN_YV*sb1=4Eadmi#X%3pjZL- z2{`Vo#3}ea3Rq$Wdv5;vAEy5L!8td3H{zyUs9JA!Nm_bE>IdN!>y|m_fnCgh1BA@H zn}pCf9{MN&bEEU;UJiXDJ?RnJ8r>{ZJdfxan(GEB)^l<9UEAeEzQ(n<>tb#e#Hx82 zT}dh@{|cdS{Pus*-SFW_=H|LI&F*a5i_tflo}Vi8Cz4cLh2Kovt>xVL_T+KC~V@FCC|zz8%PB;$fD`tHEF78P zaU`MOK|l?WxU!%GcP;smW{tXsa&&@OuQ^Fw9GfGzH3Jzt0=y_BD&iXnuEODthlS_z ztt^hxQ7Aq?U5W%;DELz38v~fHR(_R?#N!9{a6(jMrI~OucDCT0N|5AFY6l=%&&@Y~e_uC-n`ebLu ztlp6OJoW+FCQWj2Q6>#?G>yCXJeD!As5)dhrt)Nlv^y$(KGK>mgacjLC(>R@QlgWNcxX@mA~S-&X7a)F{Qz-(bddPS9O z79u#c8Ountnc{C~QcB4ERzO1C(Ba88ONBVlJMY^=)v4H}Iw!Gi8fZW`l>~IC)U9@z z;EkZ1$dyX8c|I~+Vn?3>osDwtQUa@>9z;QlAv&RQ>&MdZqlR3-WP{NjuaSOUsn+AX zK~g&jPX?I|G?19BYiNz62C4~(%Jq57hJrxn=I{PmgX%mo{b{vef@h|Q8gfJn z=EGSrQ9|;tfr*f{8WQ7%DUU2!n`b}4Z$+5SI(bNIm>y5H({LJ@^V z1#q!j*WTiecrU<=>!xCdf5-~GGNf8-6X?IB3Trf^W9W>Iad1K{ViR5-zKdDlt)TLp zJN8Z1NPAg7+dz)5;bRCZ!c96EEB8&W^5jIuRK9jbldNlNUWGJ{2^me26wF^v|Fhay z#EWWqWnp!3y0I<1f|%*T=akvk7P-gK{}M)ydt@!rw%}LZ*U=#?M9p5w5n^UPfw?Hh zmN!FWanl_HIEjZS(|oiiLQnEkzqTGI?F!iDVwP9%sg0a>#|Jol>ex(~#rg69j=VdD z|E`N-+zX-64@7Y`#~fQ|KbUy;R@I-gYR$M;M5X}`&T(aoO0iK|I_dLD{9&|ytK3j^ zWvWgz(XeJKBneMx?FTF#RZN-Z%LN7gtWQ; zRTdu&F6z-9#@hJfBQWLzFMg{zrG_;}G#)N`rRsoA480|;VWXW|ai^C(2oYS%KXx)! z0ykznfKb(jMvy?rommlObCECQT8%cQxmmBH#9ODkMu)v&;pYa0hY#qUffrhJzs)tMssUrT$6bK8Cdc@) zsyE2?{?9?ELQ?IyN^7Q;#$hq%gmL)2b*i4AtJ|MeRwB-gRzE451U1apFIP|wA9BE+ zH0Vy#r3sy)wuL=-IQ4tRnSJtiD1#-EN_)pVuYJ(?`w-gCF+W;FWt@lr+CUI^?h}(| z#!u;fzo??bJk%9dZbv>KEf`8Lp6zTb&UwiMYqei$l7i{9p3vwwv@ZP~IX`AklCkSu zzs!3v>aLvP`>O$E$?7pyV4!Bcdv(;XiLh(F0%&OSgB6q<*P9NBX{Ot zI?e59nUUg|xU7Y9qOaRj-k7AeWHf1agO+?F>$K*EE^{M!!v}^9=ZOtD_pqncO3R-! z)6=W-peOwY=+NcvBjwV82%Hlqts_3xyI1ZXhYz$uBr2hVwk=LRu5xlOW;rD+so-Xf zywvD$vpo~ZSMy-6f}A@iWd}#=ZFXxaYwFraVJ$731*MJ^ewY#5r9EB&rm{GF_N;{c z!-WRG^+7YXc)M-sfY%NL5<17Gyu5#(q?bng81_HGOD zYdGA|9DsU$&hiWq*}tVabiXm6YM#`co;8Caig!*&<|xbvF%f(-8vgeY46lDh_N=k> zPm5f;ko2ltCFD^gkCYV^%ev!AlRGxDW6o=sqveSGltt4I-|}+(ip&&TI~6nd-zHu& zw%Ohh7uD$ScWg#?EjH_r!gucp>WaN@q8g5l+UV|`|12HB>HK*lhv^XZ?{H%i4OqLE zdA3dh3fk)SRU5Q8(trDza^Ai-G`Es7=E9yq5bd%QvE|X#A{siHt>ed?Nv^IPQ(6xp zFZf?WR11_mrwIFxZmx`8eGWZIUz_>D7YurT!tlEls84m`%QJ3&rTnH{p}7h&kKbbu z+jn2Wlm}ut^28jC-@w|Y?$tbpqvVVG-8I1-5@owbDIM_@#PI>v*oB`%q8DwFI*+VH#doI*l@hqGi$&@9 z2u}H`^fD!UK#}04rxmK?Q8wq8JnkXH8rfx4igrE5T@dTY`8yEodQPgRcPPIlSj|Mi z;~?*EN=lbfWsKT9HolJ@qH6y|+)N045zN};WH7_5056RGDK%2zZ@7(EIFz<%h%e9< zaH>|DZj|+_;aVt)fQivJ)RzU00N#KJD{uUlg#qP9`5lG)hIw_mZ5{T2%RUzPC-yoi z=@#e#aWaN@)w2VoAw8N=y=nmI!Vbgx@t_=TzaUS<)hklJzvzLY^1oGOX;kqp9uDCHRgv&8V(j4jXev>f;-ql2!S27@;%_H;ly9E+p? z<_SKM_lim;GD9F_n3(tAl4LQt{oKzEA+A3Tt_dg_F-gcAdm^f2_GmWy#iTtdjH{@> z|1>Ck_ZsjI?;i0&v34gNJzuQd__m;!I9GH<~@B^I&x<{S&wQ=puFfZ{ucBZCI z$FyHIYn(#>n`Vt(5f6(2uhVsKQ-D>LsfR|jZTg%90lP+*OQDBc5x!c<(|zU+wyK0V^4Xx2rId-)%pY+(;G z5b~xk^R}>)R6|nNogdYEM6@HiD?wJ@Ni?XJZ|+OvoO?czM|yo)_{%`wPuCyo?i&Gb zGK0y5Da|Vsq@3mnv~M-z?`(S&>P6?jHL7-O!EF3~et=cI94h9LeW1Aob-xFQb3Uh< z=DtYwP_a5Ug=yndXcMPh3?jf)ogXQdzFF`r@Q2WECK*LcYtsN7GzRoYY5`jO43yhL zjP!@+M%)P3E?D~7FKf&(VOS?s-s^wGUa{k*foHB)_XKEe3a2^B8IIK$- zrr8@@R+5OtTYyqD2;bBEeBu6AJAJZxRec2i&p+MY`W@BDX`n6R~liLJA! zt&yXL{l7AP|C87?to1Mb&cjzu+JP(?Jq#2i3gS=jbdq5I-Bf{J!M`Majv+&;+?X69 ziIFh_On(;EG;6JQsGqHMs8luA;1C%Ts%|`OYCUz>H4isiYNvg*KXw1%OA3DV@#Fu~ zdDY`I-LvU+lwkL?0cDUnXC4*^iNI|JD#ICWcUt|IAgc~M6w9-=Eu$1)IX?w$r3 zqcgAoQ zfCs2|Vlb2yR?5(M)d$zGNIYe7#cJz34ZpUBGh?uit@#8SUt8RDG8f*Z^vlseRR$ui`k z%pwz#l>bVqd+0qegQ=`2NFixoS>hRnbiSY)3YlbqUCEHcz%=nP_z%xtI)eJ;2?c+o z#)e5oVGSoTKr-`9CxZtk{49gC0iD4gnEUvxQV6&JPK+?1J({>V2Qn+J%ZZJ^Sd5lD z2MtztvMa6zxn^z+AlASfl-T;(tNYxunzlbNvYjS^e@1T;{r;`;=q?Y;S6v-qZ(Nl3 zu*!UzIPm1hKa z5c055( zOzvZ?Ki#$3D2;)0+0H1H+~PG#_DDZ^^HS>~Bq$hpA`ixKJpY+6}(#w zEyS*$wEMSNBk;VLPTAgLv*0fU&T8bwV$W{8(AdqNg*`iKE}flXO*>beTfI{9-WUYm zamE^6>47S(*St%@xQ@{l==*WZn0Ii`B6YWk1jOMIV?b5-y?craRk;Lf| zB49+?Ga4W4gJFTa#ceO|BZ*NU-uar2V|}TzWFzbnq9IthgT}$1 zGm`ixtDZOB=S$i(IDN!JE&(0jW%T_rjCe&Ei=&dZ8 zfSR_alWY^_tw2t;^wH(j;TEsl8VVV+!KeXLzLxRHKVq7i=1Jrf-lwWSWxpiY5{G*>|Y=^@xgawI+A4{K-$-~u+`5+7)m;+ z`X9C}ITVXTDF_P{v8266x{ZWec!AQ~*X#I{-Mg?v9HIoef+prdn5@y1pV@84%VClI;R7S^=1h002 z7-KqHFfRY~XU0Ziil!ArhWF2*P#n-@OPr;l#Sxgy77* z7!BmnG|#{i>+rb%yg(q`<}pHYC>vG@5=@#Lyj-g??O!#ESTPqC_CtzUm7n6^^yf3H z<8d;DO$#CXhwf4Ed#0g>dn75?yKB=VWeseWsKzBE*$2lIG3c{~QxMhCflk*k`+b)N z7__tH;}e5SgR2&lw8|FkVxy4T9EONNrOphos19ArNILk}b`Nba{sLV}MXF7iIGmpg z)e!BEudE2aL9suUS7DA*6dY;QkTw9vE?6))LOWIW3jBUgM; z$m$v~L&lTQbSLSxiny5%UwBP&Vw>K>Dx%0~1GY-~XTqaFjK7$`;o4r#VnH`66^z3f zwv|D5t=W|9vwm!=3>jW_9;H-b2t9P3g)7H*0^WA0Y~N&X%b=``oN8v8<(2azFv-%J zk{Fk@8l`7JsKOcDZkwolz$E}AathcLA+O3sU;7;qXLXsr>CjABS$jR=y)U%6cQA)^ zo0dtGj<%=Mp`fv=eoI0ss+?2XRlA0IZI?t2(jZzE#o8gVVPw+Y^_k!HH$MvOEzRoQ z>J_f+BVXbzW6I@cM{MoFF;z!qnTHX^@+G_vh=ttY46AdERPX#TS4Xa!Hsdc-l%z$a z?WW90MF-^paXKsZ83L8pA~C;091oA7puY_yYf?tiX_s&#F1R2z9)@_@L;84d2oSwWpzB4Zqd#9v;H3-kn^r~K88vj0G4o-B0#|d#wjJUUW~F6dw>za= z7N;_@>INP1MQRzyJceG@6Q&+4207sPI&$!l^*-vVA>Z7>hk(x%>fI!k?9Arg zQ-_tkbMu$;!W;QWhp@m?BiBgxs;U(7bKx%jLv!S?;cSR34IAlBuC?ess=J-v<>Oa# z-LzcVaoaWHGT+nQ1Dj{C2-17eOTJOktH^ z(&hN3Ax0k>6hx!9Mar1|-7}Sx*~~4G=L09qnp0RmaU94`K$pK9_nC*BJYtoJPq7WG zu_I}!T6)QB@hdQx}?@ih#fnfZSzak_7aAnA1H<;cAn z2~1_a`NWTaGyR~>w;+AVB5RE|41n#c$9sKbBldt8 zm#8jYJ-66K&9qC$b$I`8oSkEkCD4|oD{bdZ+qP}nuC#4urER;?wr$(4v~5>TzW2Ig zraPj$XC~s_ANT(`cki?I+Urw;H*yoIZ5!zMN@HnNQbsL#&>~s9=pkx50e!H6>OXEX ztcj`!aj~eN!aBFWpw{5j>nfP4N-cUAuNQ_)<^1w<3n_y~&^nMMwvt1IMHw@ERxsvD zW3ZW><`**CQm~&UNzxF2TA?#xMxI#h9X1Tp6gzlJ{#*TPLgOUfgG6(HMK|m_^4JE+ z@SO=k%sg=$mu6H=>SA2OB&!^!lyW~Aibg@iGuE!cuR(E(B>fohCZ>zS)8KaCD$>J? zR>fo$FR34Y<>VEuubH^r(^kR!`9y1)H`??5JV%o5YvZxE0={*wdkTfw6g)1{pR}l+ zJ*QmR9e6RSKF(rN$W$KpHCF|u8IkBFFV$A85=Jc4LEh;_rBdurlDfHh4qb09o~JaG zm;Fr~dnagMP_DJFEk>ml4IZa?YEBBZJjZxr0P<-qjzXLjFJAp>LM@GWi7sc-R=!L6 z5Gta>)q-cYshcqaJ-C*P`dz+=LWVF#s#4_7z{g9`Vot_DMubl+_yEbINa9-nb>l>p zb*C9ncjrM9W0W@HUOBsu0rp2|0fpzDWQK(Z1e*VzimF4fOM%)e&MgzvC*o`UaHJs5 z0E&0207ORLGbAVYgFg}(1aZFIi|#;}IOwKfL-?;dT8OqwX8d`7*>T5vk@&ER(TNpf)m zJd|M`vZz;Koq-$Rdzw?8;xUa1b!Fhx5-FVwD3iT*t8;N&i18`W7FgJ7T#Sp8k?G|N z?%E1gBmHu1852$At}0P4&zs}qs&qrOPWk;6y>B3~m-^ElkgxMT<7>KLZo+R(khC03 zj1SVNF#pKETnwK9qGc=j5A#1r6Qw|VUg`h(Sctf(PAcN-g)eM6AKYy>aA4~8Li6W} zqZdG=GR=~h~YO}&d zU$Mbv$5Kyx}B@$=mO%&GJ57E6xcLi@0K8%E_XNIw?0x2B;izFqJvbCzY4En~`+ z6EDUHJ%~sj^R%j=381hb8!ORW_x?jCO($Ycu0$QhSvZhaO#;gp)fZ zUlqS$Eye4q94i#zSy{ttGt!=ZiU+ zBM_{_pU<|J1+QtUCmz>6&Lddfy_Z!rg>JHf#dxFqWXGHb$1@0o4^D0wst+NyLjbGP zWW1^$2E+h|W;@(3sxi7G1dLmJvNSZ6hsrq|xGl)PokYQM+_^2HazVGBUVJai=1$uH zP-kLORuor-(Jx$3ud1@tOz7$^^_Q;m=U76fMM78}gX{O(B2|6Zp&bxP^1Kvd-dhn` zb7en%r0fvFkA}9v@&n`J4UM_Omh3vf50JZGCgSAF?^^N%o^!C+4LYq33AUiq+xK>d zmE0oh4Sk!RYIdwTrHEASZr}lTPN;v17~Nx~Zun&TAy^>r=XtzEB5&%PYcg90sQOUf zQo4=02I`+DO=J;>+1GwKK|Ne*qkxp$9L(mPN3@2BhI{uxZYmAHz8(QJ1 zc%P%9=D={9xAQuEW*;IwP|ruMC%YAj0o60K9x||IMQgV9zbtm=p%>r%9?pJ$c0aR% zkA-YIz!rtX8VbsCZSATKu9DH7=56V2N*Ya3mF-Bs=u6&Or_q%8d!7+G%>WCyU5%-M zAAj&X8I<%VJG&B_9JtBsXMV!{L9)lqo`9bX+bDR^4x?Xl=!<)-7eZ!A0s+M{X=Dn? zb(w4lJeEq995?37$d^&2s%oP$X=h~@<{ZSrwTzBYuuS3{*O^oCPx2V|HUYxWm6%x6 zW4p40b#7mC?MJ05{`9^bauCb%hb}E;j+v&Q?+)9~-7DR9b8Q(TTWcC z>^{%=Jlv*M2YT4QBwPHgCX^lJ$-)p-{9sK}VYT4t$&@l)s?%UtZt5Vc%v2Zj$ulgg zywpUfDqXSeY<6lSw8D~8Z*CwngH1U-tDmhhHLVw7GiF)055$r$DI_3<$RvD{#8ffJ z6v2jzoy{X^3h5)Tq+*3GY@_Zj^inS*1|tMJk10HM=$=8SX4s-{KVOGLZ6+h8T_@FV ziOFsNCv4YL8J^TfE4qa7*3rMjjXS8-D5*hSfZM|GpfZ$W@W?_gVw8gI)t1h*n1#qB zGEs(#Y6R%GM06f)g*(RtmZA~`<@WNT3|-J&dPjMR?K!=mS|W6#@m;Prs#P4mJTcY~ zg^xaJ&C?iyOU|R+@x-BCsW)JsSPh^9Z$m8U%Nn0m3sFa0lS0DW3S+7yDH`~2&dF5s zmlRJoE!$MvrXmjco}pQx-Kukw;I)ctb1C_ka&QMv0%jCy^c@y)X%*QS}hTCi;9g-VFVO zof_=3@;QfFw0H39OeTB!WWp0j5R0M+#sTvLF<3QXv@1(rRnc==3{g>Hx!1H^W#lF> zLWKwylw0bAg?CXs{fpe(k0MB7uMsu<*?;fg@Vo;z*k%X~b4kpE*FOLo?YbHED|^|1 zkc(`;6;Tp=#(wA^Up5BJ{BJCCVd@;FYCViR!y@Se%cGsN($b5+w`&6S{Yr-6&N;!XyuMk=lisxLQ}D%EUP-cLsUZSVtdZr?Gk9g%%6MB z5o&p>u&3=NN-U1Vn_OijQz_sFAZbIGP-Z4s1N*Spkr3FbnM-EwG-bx*3(yu6$_IhA zSw@hiUGgjK2>_`W|Idh&Y5NA|vUBEFoy`WDNu~>}p8|@5-yZalgT3}$DGQ-7<6)J^ z5n=ZPgUA))V{h~t9Vq!mmR$=*lbrZlnw$c34>d+pa9Oif=0S7}i*Ac6=WT4_#c@#F zei(pR7U`Ms>u}gBLwJ;k7-JdrDM_t+iL`sL!2%qqZod_1%Zr+4=%k%*qQS`B=I`sH@>2GYDOE@pk$E(e41$a6J*HXB;)W z*Mw!O-?MhqXD83PEW5mwz3&>q2n>?cRuXdU5`=K8ZvAR-1`F|PO|$aqVk-g%z!~)4 zg3vwKCb;%pT{J0ohYk&R3?;fjX5_2{sl0keRkhQC@~3gDV7q41V|Ts5S4b6V3vynctdnKgOG2?c4$^I&6Y)D zJuvH+en}86GP2*=^uq42%N<_F$FGzyVW%knGft%_)n2wo>I{b|l$sQw&XdA@d&)C#26;nM!%rnVP80Sobz-ymb|!6+<7|W&wqat{5?IbZK8Ai zWz6MhixD=k{a}KFMe-b~6UmtB`BtioAaV7ye z#Z)bGp2P^6GwrS`B%62aF9@6%REU#=$;|x3_z-kDj*>#bQZtrF3ABP^q1mxl9yMN` z?OwT^?jJC}m|Gcx_#Ut&G{3jx`#bk*)~veA->F$QZVM}jw97}~l5Q@PI&0buD12NL z%K>F)iA&t$7RpK9d|y5y7-4EA9O>kfDPAVDY2W{bKnwj0H2r020c1?p`WJLZ$At-V zVErn^Q@-LVgdLT{bu0aRQOIIhYNWd&CD@H9X%hRiAP_V-gBXO{=gCmT_Bd#=(?^`9 zX3Sj>wC|4$@J5@x8)z{*6uU2(on#m4z9cqWv(DxI?(PmA{m?m)8^>dQa>)>JceSauyfGO zrfD6tS926xyy{#hT=IonOGbMs`}64J(z4V_Xz5tt3n>T6k zq;5SQ&-RcFK3Lr(_myG5CcDOy7Pyo@wv46Pj0BgkEQhUwXsCS2fz{vbnd9Q$k-4K_ zUM72w(IQ$UI9ja8+Bu%-6Op*=KgU6FyVlWwwQ;b;0cOP1~~B zdfCDpLupeWv0-lGZ+y=kzt}h4L%TlEmEB`-{#xA{(A^sN_n^L!IWLqC^3mT}S>RLp zF4e^S{pU5$R1Zb5{H6hNL;iQy{Qqt${~tTaf8FLP4GU+K6~NydT4sXiI!1ka*q{I) zO?~5Dl3x@mtA%NhnFLfLbd;EqM$8&HNX*128O2Gab{TA2*zF~Z%P-L`=D<(#8^%G<*7CCFlF$EE|&1=@R zb|nllgTn>OOSOATq$Gf}8;--vgl#aY5AwKUdap|^*)KBG67rEpl#Y1Mo9bZy1US^O z&WOM?Dh>j(FiyIGcCgl;!zUUhX~1;|`2FI-t%@&uY^$Z{(LO25F;q-5Bx4?tq5?^r7GWmPbXtjLp$+3 z(g53`*9C&Wv}Yxd3LlL(zt^JCqt-<(wA01U!)o?MV!Ty6d;TGA(+|A?@ zaAMJHgfN#kh3c~;$}JST+!?_U5yAhCHOK?}{_tUXc$EfDg3=+xquh)R%xY|5ATg6( zzdKtulGP7$bi*@MF#BEGg4!d^-4dSF@l7-r7_7oDMjRVZ)Wk2*C<26}0I!>sRCaol zg%P)2YOQCFj)tUHy$)HVa@&RD101+XxXV8+G*c%xg$u0Oqoj>_F=&#YZ#SjFBm&Iq zPST8nEVf#`HBwcC>qROj@$L*jM?fhyPe(Adq+7%6KdKLt=8Fo-CA{*4P~wiHu= z9XH2zYEWs{txu&Z|0|4Y~*SthK5n>r> z9JC->_KRfvtEMf1@F~E1tQoJuk>2ACZ&ui<2;T35swx>!a1;h0AQCD9?U8GBRqm z{M5(@EmEP9YYm>-saJ|O){r8p{ZN_=08=xW^s9lAGdpjZ*SV1s)^rSGtBx9D98xgv zFi6Jo8nd|5zOSt$Ib0js5=xLQmaexeZ(m)=jNHAT&}ho_3EzbF?7C;uYPCN*(9x@Z z{>^ZR5~+ZTj8oUB{9ZoQTB1U{hL0E; z!FmOmIXMpZFy$Bk;~6U>X>?n-$R;~wU7*fblO%!ozQM(PYG4emYm>g{_-Wp&;3OV% zC9C6Rz1*%_aha4dr8BXdZjPA&yw)$+_?4SURsL4^2Yyu+dZrzX9SoZ@5fkg#JY$T% zz7S#bh>_NUWwOt$^M$UPeCM6W_ZPm>HtUiu#aSyG6$CMwtb`C&vGdY{vWoDqV{Xoj z&#rTjHP|}|YkER-b69b->3m+oPu@GwDl{vx#OCq&`pcn)E$3yCv5Gt~9J{p8+?N~W z51HN>52IUS!7ptp1ngVmz+XRatB+QQy2C~wFIxCM;Cs+-AduvpYM&w+lJpKeDXAZ? zP_LIx+%>tj#IZcpsXs{tdw*gstDuqt`H{EIOP@m4qbmz*28ur1z5BY)4)#OvIkI4;W9}YdY#&9LKt!}i-$YpiW9KqJcvddg@%^mo3plp8Nu8!I@j+JRkF#UQ3j`uLXP#dwe z;fn^4P%Jg@V?TVq8iXJLf(p}JgD91{AifM5<0BgM+$Uq!WR;4Y}k2Bdsa9Y!y$ zT`hh_tSwoNBaB8h4g1T~tGpPH_SoR`ggo|`^x$On_n>buTV5n)W>st1in-SUVirB$ z;Dif-X4_U7F*y)2O?_$`e;RbOeUy}?k1L!UBB){I#>y%Bbh)Y8imBW|4+y3c(8icv zEa+fyr=aut{uaYHwYD2dwaHNwI`8(KNxjC|m>o7ZS9m}{bVvQY>s=9b|3n1Rm9t>! z?oXgg+&cIOaop(aI!X*Pj>xyiL=4l`h&dCjB7oKQ!9(a0P zy-(0(U4O1sMt?6i_twQGRfI-&vfFj7Mt8cscz-yY__g*wz4lOc-4QLadvjP5_OT`} zVlOApEH7qZrkk=!ZJ|=5U5#t+wGhw50T82L2ug+c{fs=;Hnov#NO=!w1QG~Ue}W}- zifLWvwgFjn5^iMD?aVKze6n;N!;-|>cg$+(drs=vES5nfulySH`YOG;6BVlVd%NPqiff~{T*&LFSJV;ytv#)q^hm#@oc^YwVh zcZVvkhphV}UHjRmhf;5>N!QZt7E@^pj`pbCr$txQ({I#oJ0oiq+@)G!{NR4NA(;Zq z$#T61v>s)>CvN9jPQS!o7=3p)KbgFqvD@E?U;Gtd_{ToN;qSJbKbb$j!2AaIXYcs` z@n~CCQ(v=$`tbt~_rL4r{tLeIfAU!V``gUg&dBOtyz6x%T&FMsqymxz&kuxP3~p(_&S16i zOqAK*zf&(GGd0^lJi~!MSQm9!gmeN2YTbu_-cuZ&v3N4_p-7JHTu72m_=I?x9gl`W zY>Ofq!V?bI<~L9*oT=nS6_6wgCC952jRNEgavqHoQI#t6$`hSJ+Kdy9QE|s)7-|Q8 z+-um^VHiSH@mI%gqZN%}q?l5HGs&75NS4kIzzO>#=FM?ty-Wv(QI53C_JmJ#n4d{tlO|z?G|@x^&5$$Uxm}?cb`g&+btGiENUMb}?nhrj{w` zf3VNJC|gD|$e{lKzh3Pbe2mp#iJ1=QPg&VM^XF45kdQJbyetr5}Q2&8V zK>^8t$|Xm?;pD!uW@E=s>O_#S^P|ztxMZ3oX#HD zLOL04I}avD_Q`Zx+wsVw=66n@8@TO=w*^!vGqGreP=a8Ey>0uQK$;JjM@aJ5ys1Q% zI(_wAto&RR0=n6dE*Qn|N9ijgogoovb*%pUUtSvJE$BS3h&{zn3Gcy0sA7IZLyaO< zqGz>m{@BWyZ2HFM?J^|dkYj=3?cRrv#40T00A^LLv_)%YI; zI(;Ap*&<+O%y|(YSJ-PJ5?HzF-M^Xwgh3zG%ppbXfe>0=~0??z3twn-#XYswUmvTFYq7Bnp-m zy6CzqElY1_1WX$27*GfzZ|`T`ck7NUzY&H4<7+`YM%5L53kl}+dcIHUb5x5DXqD0x zj~HfYuapiw6e}nojBrmO&Fm;h{MMIdz=^U0V3a=Tx%iae@m7jgHFXfjD|9`hUDm3h z&-a74T>7+}_`CZ=1fiN-hV<3FWmFS!Fi88C=VOopYhOwO4<|@&VLnygh&S2Gz(^Qm zJJ43c95gkxG(lS5ce4pTic$<%gUJC7=c`$3q_PAwd1QYlv5ODss6eAWofG=>GPrH2 zUb5V<7O`tfpA`+1t4yY<9lEa{>#E{X7R&9WrISL2pWxRCmns$O&|HA01teDb!}Cx{WtVCIr5SW!=b&n4(aWQ8cuNPH z?eMzicDe3K_BL3BnrhDCfeyTFgZ^->dVO$IY=()wO7DiWXbS~m0xPT}c3?P1t^65r z4w_rq1F+TTt1Quf$Ux{e_-xpccEteNx1RoOAfDcC3^>d0Q!>^k*X(t=D!Pe#^GPd@ zN+N*~Vk}T9QUdvGqOwR@PAs+p+p3VoijoW$^`iC8{qO+pT|#A0qoe5~wGE~oW<0nM zh%+w}!&HM*XnOA;KHKf+Lp=3}Z@eOAV-s!%V6!kEBpW!ghA&%iB^5H{?XgtACIf-V ztj3(>SZNH8A)sCLLNvCwJe?M0lsyTGCQ~hW_ny6UH8e9ls;(6+x}>o8?(7tF(ODAd zU9}SmYan8j{JE1z)<-SHh2WPjSbGEr#_##7gm5w-sOT`xv3zam_7uY6g3Zz6$ zD|esqNek2&shB>e>_MZ|Z1CdXf0=V*K#R55@369~Pa+cazS6Gas!v=jT1~73aX+cB z2W@UZ?E8)}9K{ZCm81}>uhK`ZvPr#Q_D2Ox3f|O(4>bk{>hu$Y>;C0$BWkk?6q^^m zzD9|$qTgVSNVSMYgQRTJs{cD8?VvEQc1B~Z4q#S@P@SNQsjU&@A@MeWa)17fh;mac z%!ug*;cRkSKWhE5Y0!ir?+<++ci#8TbA~pld%Xhrb2kAT_r}DV5D(ETlaYk+ux#`w z|4sump6V@z9Modhcuo{;Qs0uEhx%A&OIn>ZkLKT4o(jlWU0 zcCq{n(;)#QlabEjhQ`YDaWQY(DkYg*C2J&+Y}@(7AJW5M6`!+k;a!!59~rmwJaP;K z#E(@R7+e#ZD@VxzNPc0`{EW))5jE1XK9|CD{M=Ix9Vy@|fIidr#zLG{n?tytW6F~o zTJLJ+W=37b8}PHh4_vt@xO~A(p8Avid4uMA>09N77O*|suz+J!4_cd#-O~8BOgSB> z{5bKbd}PxcC2=ZL58;B@U9rdMEzcIP_P+dNFU>+#rI%o7bw;^%0^%z$-@>fT<EF*mCc)4p0<^rFc_XWSqiHYnfSwU)ns@Pl+dxX2$3KEUjwB6P0W0YY{5kS!oa~f&2oOi+9)$RE0Z50)-z7vMHrF>VYo0Sb8KNGBWmGAWW=9Z0@oCjz01F#KwsJt}1M9`s z_T1j}$=dbvi`J7DFJG)*Ppqi&P25izu#1I$hkeLYYDGZnam}5@jjA6;#VPWrRm4Ms zMzUw1!4^;7i%BOmM;B6pbE-Aq)f(<-2m#zfqteSI_xBm*RNVt@amgiYR=+YEh$8{U za+K2fq%(2@2a^NQPqwZRNOXi8e_=kG(e)i`wCWvygYAP*?%_dyeHOHqkb0kyeS<-r zltMp*j=0~}RST=0`4C0>kqN3nPOE|@6YJQLXr~s#KVnJwS(40NCkYs+E%}jDWY^Rg z4BHNaztxrq^Z4AZdKd;ikjdZ1#)MM-0A@`}26k51&`>fV#&b?Wn@_Z!9$)HUR2Ogv z43=<;6;``jyXi)=a~U?nh>Bf1|A10D<*ZeYhS{z~3*QzdERDHwt^t#X6A8gZ6}s6k zEt`yH3T!s?;I(_rpP#td@ggk0?GU7XPESd!HO*r=Hj(2j7swKNR2xbqoBVwgsH4DG zscjhzM4V9k^=eq8G4#GtS9us_$#JOe?Lq&=qOVg?x7gZVS%J={C;eIwhE-j8s4Mf= zC1i!O>1xSpI9}TeOVmt3OFP*O98dx~XZzRH5vw*>b{ibJ2MMrBr8e>H`;8pJs#`9t zaT3XH4Y5h?)Fxk6F6-=2(+Sn_FiRVS8>Rn90ouwUKBlko!6_;M~4?C%&N zR=ATRpnoPIKg1eF#el(r15t6Rv-q{D-#Mil*Aab7P%TgOijgd#%(fh3um(v*>9$l# z>LyLw(r(!&DSgg}n(4+mvK#jYW5hD^YRDO=Hn7KS9tuw-4*+wr#`X5(*@(?HRa6cA z_5%KWIlf8TMM*wxsP`gA3&B|RkxxiM%8Ob%;hCPk6jJKrX>^=V_J4R#Wr8GHJj8PZt6{qNf z;PW`l`0%RsQ)K9j5eG-`)&us5gLvQl9?Wdh2QA#zDs|+rVi)gNd*t>BX6zGd7RT+U26Kp)*kP{^ z@3ef(zB0Pfu9eAOpim4RLb7K9w7D;8hM*>QW;Ui^Y$P*CJTdYZN4J5jN3@vEWO=)R z4hL%65pH|(KfxUq@eh(!ZPz3R&lron`Jvo{YPX)A3^4#}l2nB+aN>6uI-~f2oe#%9 zm8uL%;A^AWzrq~SowJ@rn4Dzjc{xst^26(TT87o4^?RL%9csM#F>~Xm<6c|SYN&?o z?|9h0Q$M&P7vzmdXorUx#niL02aXRa7u-!@f3o;~RdhVzbmxTH0@n)wCrIa!uU0O% zkKE!ugXQ{oKL#r|_GIvR#_7ea%-FLd>>=%28s3Nn>THj+dh#c}yMo_BaNZBde0&dd zHvK)lQE7G7B0A!Fzm?IBTf#rv;qQzQ@^{-HNgU%UU!ZuyT}j^ja!$@!`^PtwAn52- zt^O8mvMjSPp%R4A`D0<*mwlJ<;yZ z;MSlbo5@4mh*4TXZz<$K#6Y2d7jvwzZFx8sql-{=h-M3DeR2jLKEQ&*$13RUcH(cw z4=9D`cx5`f@qO#uOGTp8fp%x?uCD+GAA)cV{8La4vB4OWy3p{|lJHexjo8GjR|@vO z7_Pgh>*2x(c;uF5H?Dei10IGSBz2!SML8z79P&K5gFfEAzn(|j{SuyYhm<9Ow?q@z z6$?OYG*t6z^EZLdkuANU^~?*7Bijx*y=V3sGHIV`oVkDE4A6_`wP*M2!chxQAtYh^ z;2rS(;A!&h6WdN6)2U`L8lKGw#VI*B-HyC87B4FgL_Y9tTITJ`?#U!EZ>aShBU6_h zSG|R(3v_fN<5Z1t=a{#&zosjLpilQ4#4poE8&916VmrBK`O6XVWmies_0&GI3-F(M zCAZ%{3LvR*tRU(s-@yz+qN$*A$LhBqhCE8MN<9PQ-&A`k+V71gs)C^>oNKjBI{?d~ zs;c%b%4O>+bJImoswPF}SC;oWQk!@OBhbt7;NzN?&j?ww>Vf(?~>-rI=_ZR7DXN0Dazo;-*aTzA* z$%*MD()i-%PWB7wpTM8-tiDsDZ*XEa+NST<7$x+KVn5kFwguVr1avxShF=%!<6Gat zW(i&OkavNlp0({xk4fanWwWB{tj5k9<)0(j=HxWFX=4}DTyiI0 zBUcTIx>tPSdGP~hb?LH<@(pDsjX1_rP4h_9Ct6B|`X|{BDeX8|(uvM7Q+iE=NH2YZ z6?FT6Jqt2cT!=z#Crysi0<($mJ4Ar~5I`sH>P5(k%_UB6m`U#$9_S8pB^;AZPEj5< zr;xHg>ruO?7Z2C=_M6JJV$!; zL_JfB1Xsmtrq4?sr8FXAt=(0c5HiWG+oY?INpF;E5oW@(Q|oFm(^JLMA1OKkq}tBM zlIW#Fl+te&wE9%NqMCH`H#D+AUX!h_n_pq?T;~GI`9c06?anm(xa0r!;=qypclyM) zJ@ki>oejN>ovoRju_3+DKOLX+|6AI%v$p=1y;Jg=F{5PS>}X-)YU22B`mTzVJj%B; zr~K`*8!xzv3sn%Qqa7`W%*TLBN{g#x1zLzD+b}5=Ze||4O4=?87dwX-_@^}2j20(K zl6mo`%?tlHtBsl8&*uwh2P(%bPAE3GFgbNh&OF zuwfJa=fN#VU(qx{U?tebFdQt?!Zw}NIIAS*akDNra2C~$$Fd(kkQ@ZU`6at3?mKMFf^rm1y6rvH9-Lv zsO@SV6|bz{H%53&2U~vZYm*1G*Cmol)h(3B7zcM6pR}7$5K=81gl7X-Q;Y z2ZVOZyJ)_%wM<;}gPej7l1&SS2i$CKIMrYE6dr{PmT}Fr{18dbw3H4jLLv!l$fx}F zmJ_MQe8Jy;H*5iFkoG$j5)Ag{FUGox7xVinh>%4rq~~`ZxEh#zV$^izvNkl_LngZ| zL-_n?qY#-><8&DH&2^ld2Yv)ilJiMI$e>;z+@8L49W_d(lR?vt)F_C0lp9`1+ZNL~T(kSf$#(6& zY;yWm-n9Q)<&FM-JlQrj2DZks298$$ex9S%U)`|3iLN;`W>GwKxJcN@2^w*65`P9$ zYB^?C>xF^qacD*e=~$w~=$}XmFd3O6jM{_fP|epYG&}50g)GebQYJWy_?wO&woiV} zIj#5m*d5FnQa&NfXSQ8$dG&O3bAP>k{rm#o!Al~B%##(=5an)We9)PtvyfD7KucI? zgVA}$XvSrw8So0rqs>V>7lE)yeOgzTCiv1ooRjV?n-CamZ*TZCO-k*eVXQcH2 zanDu!mLHOBO(#?|>$b3;s0ff=3l1}LHejlAWb5QSdqK>Hi-8UJv+BijGv{P~`=~7({^O7(hpXZ>= z8k^2U265-_>1~Q*mT~Lczm$c9!3|^cB%0$25ncfS3OJy8o$AP3~+^w1ibs$O? z+buhNJdX-*X1_Ty803`)@F9V+owI|cU??uEm*gG2t~x^l9DTFbnOe&9zHF+>2lk1U zl8c9ivdG{~$bH1_DuP-=s7yjrE>0@|4?2H_!o5srd22mrZU?C$qcp;wcN04F9-T_D zu;dxZJ(n~jPSrM~W{pJ-TIAMUDv0^WRV}EKY>fip2Fn!o9U>-0PMRvvN2TlRI51CO zt0SseLp;LQ2?YRot!~Uds1PIBEM)5zc=1OG@|@m8=T7`z*R4ifJpYg^ zU|mtY1HJ63Mc`KAOfg3q_rkl!Q_PKtBpKyW-Wo%oNZ9P8Hk6E#LzdKjZ{vl=^5CXv z@v2*3Iw}TLQ~}?%vJ`_5tJfr((?!3sOBoqFeD3UG$V;gf4iP!ZJqxfHX!QI6+v4oE z!-QShxaKT02Hli@qaDX2PXbx~$m^&(+hhd1||yCktRR9s?$PAQb0w}aqCONsN9 zHDxbc-F=9<5IWSSt74O^7uvt7b~HmWwE-csU;j`~+%Smb#-OQUAHaFqZFKLBf3Q=g zS!KG97m`^1nd#m@EH)jh-T@nr8onrRT!qXL*M{hpU&CP-gry!1++Z}t;tc)x5Rl38 z(Hx?7Pku{Oqj5ACv|kvs$%_W|#;U1s7nYGmqWVQ?`Lqs}pyJseS#X3C{SGE-L( z-KbJ=sXArCZu}dl1=pI5jdA`my4;$FBA3O$Ub+(DNVX>aPZpc=49*hH5ce8HRXz3? zXLg-7*r;{mRc#h?r&`ToHvHZ&My1kpsb{-B0qAIKoj{0YL%J!BM>bmYl}j!iyV1Gx zkd}lig!tY|P5A|SWN}fsG_Bt6nSotn-szSw@RQE<5rN+^wP^MnG!q%Nz2foQ3bni2 z`9_=}>2Ihc!9MYN*Ri=*2jP$oIs#%L1ViWN;NBa$Pw}B%>6z<=)G;UkvsXhc8v|Dz02Iqvo(A@)Hsz%znv(AG*pL zenAVWPm#=TghZAA{-{q5L8k*roFYtf;8-GIW(BkbjY9tev%7|h?CJ0IxEC=09(1?8 zAHI@GqmUoaJ>UlmcJ|3KsPa8S*Q2~WC1%MKe8>1<_aONfqAyNLQn~ir0B4GaurIFYI-Yq>}ZHEBtX77&ux(4^2@FZ@K39e=7}r1n~8S(q}@dkun1= zS(r@^J>$5v&}~z#G9Lzh5IyiqcbJ(UJ2)@UEQESMZ=#%xBs$;W!0%GR3L{)x7x(&x z@y7=Vqpl(lHX=6m{w3k-&n^0t`~bsG{On)H=*I+G`--rey*LIPZs9K4flm8gq7

c^uzJOO4Y7V4gia`3D=qgnS&eH#eC=M!llL1iRk2X|>BJ!ZM-f4atGLQ)C zqe`a3k`rP>Asg$!xr3ObtX?c3h3BZPUW!Lss8_;>NtUk2qJGKZFNi+uS$KX^Q0P2L zDF_F>PyN}&fbF7oP)?)c($J~R>rs~xt3Gr0+8T2AUK=Xh8Q;19oh+>ZE9RPgnSmAV z73IE}s7)lQkFS;f<-VA(yR85Z-$$5#RBHFyz*1R=A3tdRTTeLU|5T~}5#99fnd`|a zHu4J!sJ>T!+NXd~6u`UvsTsWUI>REc_Um1Y*VeJ57=jR1U8X2pFXvrKdq!t04Wk%8 ze)z@bMjfjeo3ltQc+L3a+&g~L)ti5I`)~oGYd1JDp9f&)Mdd0J}3Uou(AGjae^R3VhF|<$S5a` z=agGvzv*e(u~=%UnrU#IGrGfxi$)n_3El*z2){B7M#8WHp<@=qPYNr$%GS_Yb6$ zKQg!0Jl1~EQd&w3H`37LTVesBZMr~e+PJG-++hO_KQeNF2$=8`)a4%59Jq!^(RCq0 zOm>O4lL7+FIDY2rH>q-OK5GLnW0?N+;KUfrI9?N6WA)L!w-{{4k?apLsE8|3zZ`}XS|>Jtw65mF9O27U*%Z}Ep7 zAqDIXOW(r}G{_@4%^8P}fe%_xV}=+g9RWPB$@r`h=w*pNqELVY=$w9nw&3GhiRM|+ zSYw>XB-aS?nY%a(+=4n0Bea1T(0YY01`Bc&FpZcjwOT1AK|h4q;$8{|#?67ZM9Feg z-nIv~f1G80I(rwF@2*q-JK_7kp7)af-<;)ty`C<$|B*ko=G!yoIB)<=XdN>311M2a z2oaIcAJQP21PBE(Ga_-46f#JIABVxU)*;e<|kh&B!ze-_4sp;MJ+cCJb zd{w1(=r@zj&F+?v9yIuOX8X&-*WGlw>p17|{f`~L+uiB}0uQKuc*!gbLOrZ;=BQw` zzN=SZML9L{RT$`c`MR(mHBJq5$i5oO1%hf-INn(djH5c}K%aZn=-GTo((ajqYDW*Z z#!_kf!%ap=p4z4{u4VJy+;5lO2zc)LIsB(@!1RS}T|Pv>rJC#j-`BUvMV<$v-15N< zp>vD%Ai#fs&? zEWoDJCy!I0GZ}7T7Koq)PvabEk$(oKtN4v0+P% z#lJYeur)(v`l6HnZGS%b`CYC7_Hyt8Tvy8q<>e2d~*>o zCGusdWu$1os>_EKw#D`7JQ-)F=-R|G#Z24qpjIV{Ok;KPy4RkXbQUVh+Xi=_f!1J* z(@pHy61cL)vb*}v)@H1JR@=dYRwkx7h3j|Ta6o2sf&7S?`Y4d~MJ+vZY zc0!5aQ>#K-j}XA)<@sobIEY!tVsq(&`Ge}*^laXwV*pO+pwQd-V%k!wGbnI^AHWgLm7|;~Yb&byE0ZL{mi=;=2%G^jS zwKIdhvqJxiv3HElH0atyyVD)pd1BkPZQFM8#7@T@+qP}nwr$%w{myr09nG1UwdzOR zfA6)bcI|zMYW^jxO1uY31xH>t*K+4;pR9L_D8Q)Nb6*KX0xM#!ziT+hz|zmj+{gkuM+U z#eWNJ2n5)}#4vSh&b>rEJ;V=Hat()6)&fj2;U`uU*vnyhn z2_sRbCu}TJV08`%ZQiMD&|5D;BEk+>OP<<~(ho;m-Hbdq_`|m#)a(+k@1O~JxQjOQ z`AZjjh)cQdQC48JMj=;)rmVifb)N@p%WBWNB~kUHXcBU(iGW0U1Wu5Z3#(GTS@9HhbULL)Or+?iAqGnBLe#MIM)!WBFu1-nWlltK(e(v;fZl0?j|@+5JLbvZXIB znl;Ac9Bf*YC-s=@%=B{=m_vvrX{UF#@cYnUUFLgI>_jbY7>;Aop>bA>G4tbzNw80- zy4?O^u-vA5R4--vgH#0CG0T@1OBq89pIG*xRQ}z$d24K->tg7mQwI5BH#VrcUHOI! zCus9Uw>-$(!|>Qz(m3tgsFrY%V*(}{p1)}+@%WTAUXa5^2+HZ`vXp;i=lOCT-^m%& zC>*}>vD`9!WIzcXF|$MavndNCUN zDbYu-Oml07?Axms8bcYU;!fRikf@?tX}Q{+{t}|e+8z#~fHR%$_Vb$%(UZo%j?@wq z0;`^(Eqn~|B3b>D1evaUaOh;Px3q$YvYih;B8W0yB7dFqXcG3NO@FU?vA*aj z!XZJpH-q$OJOj1I5{vC>o1@(Q*`?>1CM(;eM!WlD(~z@_7U(=9ojyeQ7)O9*rH7VK zM%s8x?S=uqPZQluSSW+LBLDpgT2yUJgz&y<&Wfb)qId&)(SWwL?u4JB`IvC3Fxcnj zrYd_5qRjqpCTo@aq?Ej*6i$89v=UY~(^!gm<(83fG3!dC>IwZca;8+dBBFvts$;2I zg8EV1o6#?L!SL+ z%=(oCk~0`%D8Lz<2G9y$Me5K{C@Hm08;4DL+{>qjyqgX4)Bz4FjnE*GWY$#*mdCFG z!5TZR(od8*(9fe#m6pLck)piNcIR~xVYtRg)al31%wto3NB-FiIxCY*f^(Twd@K#K zBHp4Y@O`K=$C05b)Eq`lWC(#zhIF4_`HQiD`f< zb@6vuhDwR=`d{)(PTa>3BLYs*WjIip^j2gw80FL@aPe4GlR0wuFQ{iHux z0J6Jp$y@8lOHp~0?q9N-TV(IBkg0PdyC}{QalJQap;gd>)SU%8eRBlp(rU5d&HB1; zFU&vcyh0@>Vp=G8#s=ZtmD9?6-o%TxJIjLL(i|E!MO47Ch#0(;3*Yo?##rt!DYNdv zDo{Uh5RLkSA!5xDM&136vV#B457H5*h zr_hqF%Ztm&i=Kxy8^$A(MH_^6a#Iq8{*KC+v?*CB@kxpz^IS6S$sJm)eB<6IJTYX! zhv%sls5A^ZlJH;rhUY8hGvpGNs($6u%`7_EYD6Y>+`gb4QZ_ZHoOZ}ewoW} zu4k^^PU&0Ely5g|r4#Tt2MKLHQ97*pqEUbI(tPSEDvT+7eSD{UX)%2A-Mqu9j+SOw zg!7GM{An+2A@7f(e%M;tA#&Mn&BlRnlI8da{94W%i-hslrf(v-vfGyPTd^IiaWs95 z11ht?xiQUE&2F1E;ndF_Lbavo;t}3-P_@x(P~v27O2Ut3TbE*&Kxek&IDn>czOp z+Vpng#~j*IfdcjM8C`Z((ULuX49k&IuzEM#(0kBSVP&hcyiq-COG8d4L)F_rr>8Dt zitrqG((}t)z`kJw4w#Y&IeMQ5fL}&@MC z8sqTyXsik&bB56!7I~DZuZk+jN>rKAVU>~93aw3X@?t+<=4%hHn!FM!kLfO_*`WjC zU?fu$A5f9Ae^SY~X%X_wx>$M3x4Kt@Ir(Wy%FCmN4roXzrl@u>A^nYot&^7fs4`IOI<<~F6dlG23`@)vC5IEX&ISj8o!dg`$Ba;`ts%W> ze*pJiFPPVqqAkiFr7q8?O#TvW= zG$w0PyYym5bm~w-8AFZk7rVNU>Aenz4c;iD{^6zW*zsN>tHZ#oYVu=t(-+cX+~L3Ro#RgRRhk3rXW zeH-PC@GE^PE&|(??)@R4qds)|ZCy@z+vN8>0f$LHXDl(fL^aKZuI;`>(z8J^cw`q; znu?ARs6fR`i3+X?TRf#T#C@o_0xMz#_h2pSpP+>?_l=E^AoYnQ{CTR@V{V^nrym*l zkH@UMotaEmI~iOYS8!2nnfX`5AFdWNULJ!E95OT9V^J*TlHE(3IhBKOf+Uz_&Li%S zj`8B5ldaH2wXANo5il%s@h7q%5ANd@*h@tGb7!wO_VyKvaIdy|FBVZPA*|jB zVQvvmo^-Vx(PM6WiI2EdE*a;K4w3uXySP;|(9mSqgW7_FAO5P+4>d|FnfrX$ev0$NRBZ?EBJzvaCJcP|*jy=e{ccQ%a-)4NHuX4bt_>9}% zX51p!zT6;Ae3aW5AUe%gxU%6_yAdb2vUyb72Wg-Sn|8orEZ1_Pbh~lazYng5o=u{9 z{F;fyn+8@+lq=pZ4f_tLGh%XkU-Rr7g4bM`i0-XaUVsU3+WqgtH?GC^uPC|fqX;wh zV~r@!;QXwk6tmfgZLTd>&ZM=i=G8-QSN4;uoGYL0OK-X*@l2xo;s}ip zRcPt1Yk9ziV%-n!>Edrg*(W5DFUHSHjfnye)Ox!v2(-W8<10%yT`F}oI(0g2ZSp=P z&d%*pYSs2L9U$;)Z62V`kC4q(v{)78ZtR&=XIl+zVIjyr!rzdQuy&$vTR~n(gRFmb z)0!Wsxg&R%mDPvWP4{ReY=#V%`kL7b6n1g?Yrqvn!}ldfYD%|$oIr#n^r4Yf>6~f$ zfH|fZeyC4UTOQ~b+}TPiiI9XSXK;$94KY1y^Rp)9q&0PiYIyU^7s;%Y))=G*cu)AU zF>HJPsxmsiBh1rXjWppc`|`5oCYAc9x6RACRBd`+!8P_&C*_Pwg;DYuSY6#{*33Fk zL38bp%*sP`d-(u+t`acAOw`yG-S8naZ$t0Kx9--uk$4JHS(=C*TNr;S zJu*Y)qxrZvD$dOI?z-y}8QaYsawNMcCNh^eeOX6bcs+^#a{s+p=6wr+R{C^-_%ilB zK*a7*eSqsN-@%24;&==RU{e@+9t#}PP2He6&Wt%Nj>@>SFH7dsgfymv;fQu&h*V|I zj7yPdPZ?Zj#_%*|?R?aB5{D#V!b9{JD@oXmNvMx19jH`1bR+t89g{sG*SNTGq&{hL z$F!Dk5}`;k16iIb{@PixF*^?m8fmI6U?+X{fH z+b}I#gx>+jh4R0a&PB}6@Py;IyJQ>=z6x&gb(Mk+e2Kd;UJarLZtt^-D^=;kLDOCf zY}q=8gNtgMS7z0RakJ8>X4_Zh*q2FSb7+RHh*?LfBq=6uNod+wn<&!yq$EA7SLO9P zg|vn-1M|cWQHFw5a{j0A6!VcnI{l%cK;i{CQ5&DGDHarr#e!;)TmF!-K>nunXR)cT zShaTKttP`fZFj}0I~8txPl2w0ViH3~#R(|t(a`8LxK#;ER{}kke12Lp9$ylcDp*Go zc*z4wY9u}mE7w)i*bh~o;;*r!J!uE!OMB%^gxDkVw7n5}V$Bj18U;@h!d2tDrucSJ z?oBAJ4_77C_>sYK;nRhmpWfo5musTBoeJ_?_i)M+AJ)3gE+PspstQj+op(ot9ETlQ z8IFp!7xAv=XhPu;sZz;n) zZR7by95GvM!CP%3tw1>N9P|taV$Tmjl?wuqL+h4tWDlaTvnQYAwC%9!Qv$m>!n`d% z!|tZX=d@zgd^D5hQoEbCQ@16}bhoJR^o4wNeFSa!&fM;SlFP)hlP3lP+$VSbsBoRA zns1OE^%xP*+-C@jTU}`Zi#OV+ikeZJRV->0xi31Br7wh0F!_`5;S5gm+4Gn4D?1FT zsJqFQxBlF6S;OZHYN+l*9z&j_IVase|1;$W+v=H!MgQ?bRN#L$<^Nx58~=k?{dd1S zq5pjRk8Sc2lO&Y>5vYd0agzAWiKz)&=t?B`!4TN;@P8|y{Os+k8yhFK*w;@P82z0b zj!viB;Witd-4med*P{IT^FuzVnyVjyF(6Q=$n)*-z03guRoX32mqofC*Q6v=IJw}! z8=D4#>36o42QS?m%vzJ1ZH_TTuxcsuRv>Ew_-t=2UM9@()4}9SEaFpMjcO1J1r){j zh!l~K9&wxZW>x-CY9+A~&}koEsC*9*BWO<8rafQ}=ZM`uALeo( zeH>b;+E5L}%& z$OuR6L6%^!#GX8h@_SAi86)gv23hb`q$XQ=MQ~TiGhcXXeVT-I2r`7Enc25AN@Z3(FJuB?eU@pWn1LbGJ2@tEr={mP0zFw5mh2YQnG zDhK8Uj{W7<;mogrl3Pl_33HmbMS4jpoW1iX!;;32AS#H#pIyDc45alRngoqDbqgT7 zH64T}OFIu%eJC1siq}yc{3SM_k5vJKtOya0mHDq!u%PzgS?>w%fJisVPwJx6%6RJo z|Mdg7#drdczyiaIKOvGomifh@}U_G!@VR?_*EQ{(F*OVX$jg)P#`HWXf6g<;PXoG4&BjoPsaJJ;cXZ|i;kP#^lI&zM0M>-PT%!&va>Ayc_n8Q{^FcUII(qsBs=yq;uQ=Kj7M>^WRh z7VO+ZpA#+@JU(dTtcr}$XO9gDN+gd#nq@i7ytq*Dt5Ml~%sCIH3XrtBWqKlIHr7|d z0J@)||Cg`1Q8Yjept{a_=UUPLqj+yRpIaJvoHp6qs=8SZo9ww%6@?#K%B~1CrJuID zR4M@z559p~4{!4oxV|yR(I4bgG}+?vYKd(Iuzki{bAOGk)sOy$XlA)3mhE&3Kl!vcYGzyBikTVLW9#rfzvizkwkABJTKsd zc^6REvSA2yo-W>lJ)MlI{ZAEA=!1sltWWMyL! zraUAsiu=kPG~FFqQZs11U30J? z)ws6G%2cBs_V!Zdshtl1C)D&@KTNO6RKe4KWMUgmXrK=od`gyPq00PuJavBR)!aWs zfA*Uy)1YabA;)sP$Qr<+%ZeRvv0YQqMm3K$mw^7EI?o)GUC_E9g}eQ>BDBVXXZ-V) z@>H8kwwNXp22y5uwDMJ(c37UX_c8f27X`zR4kF!r6XF>r_F@$Ou-2vT7D$7z(vW}ef)bBt_~ z7RRuPF3g!}$7<}EC5W&q?hd6%KCX+_sqw*~ppYsyNpbmB{Fx$-0kha^ZjYd9AW!}r ziDgss3X3x+VKhnbg-!2La|2r4b|Mj@|uRCc|6WmSfACI+~ z=6&_d=)kuaRz1JW>AH#Aq|A8U}DnoskIM74;qNm(_CC-8A*5@QirdgPC#wo+Dh z_k6ux|?$n935$A-bmhvijl-XJY`A}2gRa+k$z6T{KeD zQnRq3hv&cv7lHx%APZk-nX6=pX^G_4!ssyTZgW(Cj|u`>PSS2fQVL?JT7TaxvqoV# z`Y^Ljq$-69LD+yiwK557bF=Ctn{#;>j0#JYT}^+G2k!7WfKt1wRQ!s?iH7^4^eVZ= z&p<;M&jnsoLW^e4RwXaZS8DWHpdiW zOke&|RWtyRWapMdHf74;Xz&c6c4^+T`te%}0N3Wlq`tnNzBnR5ym88$#+xl70F~m1 z!F|ssDi;d{y|NV&fWT(u%`{yY-8_eU)$iv&3*(Ev zSD107QtGJ$_F#{g9&OAB3ju<%p~NXi&c`&>_@qGXzne(3ak=_2AMDLGP8yH~Fy*GG zBFREO$^r=h{VPI%wA%)!=MqD#ehvUr-@a657f(Ip5kpt9fr9@(ZbOWopTqt3fu({1jtz7NJn-5N$o!kf|8G(JuBV=Cn zoK$}$?dP2L>Vhm>$^r?bouPWXWikq-fjt+k2yJ&hT`~|tErzuKC=LmZL6xPDZgFQS zI%16VP$HS5r8ZjQWXZDWdRca(lT?AV(DzfZf73E59(U_?8|?AyfqXy8yF8+KSF#SV z)Y9WZc^UHU_%hW_&lVT16tgP!7EXIyUb=UQ)3PLfwuPQ!z5;Zt(sfSQN=-GoR@ia!d+g#^Zw5>{Ud^4kDq&!Jjp{W>z~BC1bs3B zI7|&Wp5;iJ^Q93hxA+d1>|sDi`0@@jz?_>-C(0N02IMNqxNP0V|k0=4_EKG{B zN?ODlOm3=u=yc5-5v=TN5RRvX5JC=3ogVbf)Rh`wCovy;&_Fs<)M|K~JH$79AIXPo|M}%t?$XAruo4AG zc*ujec^rXvS5KoAZ3|l~(XWe%z&IEwE-jaftIH?%_cu*VZ=Ck^=EltB)!D`7_T~0? zOrax^#1S6_AxNyf0T`b9+e|Y!y>VrwSvxCaHHlI==yILfnVhm`pmx6M68bGwuaC&` zi<#A&>BVf`hh$3h^(i6#hCEneiGDg*nA5UJ>2k?S%~*%D%v~KoAk0B5TXi6I(v0#J zqLxO3$C4S18ELta$?BG@Oujt0BwLL{T)eP+7V)ln4QL;DG2j?~NgPZRk3KepOpYd@ zVdYEexeAVaN%GHaDbnmLnNGXEH$gYiU=${jdXWU2x-KjN2NBr73BfXBih8Y{(fLAb zEzAUmEFTz(&X;_khJDX1wuh7Yz9+Lk4#+`0q2CU9~d7jlFV->fi zKxGC*jmWQ*!-k*|6_rPDq`#-lU7t)=8#No^9y{A=h=W7T2H*)+PKnCd!pn!HIl(MEF zrp1BPQyMryWPfi7L1sb>ovJ3NT71Cf-k6(>70|qneS|b59;0a)TjFL%ht{4oQY-#t z1d?~W&Z3T3Cw?j-P1(T26mA?4RbYQII$3Pz>@?m!YGJ{nfc^Cj>j@*Tn^^B~~+0tMSUShDepmadv4gxWo z&{h4}7t~-yLj3o&n2vVt+ckGc$(q zz^*MatWvM6Z`ra)?Eh7MC@+Lm`rh-ttxC_4|@&+&8q0*Wl~C^p-3!hf{o z?s3By&@pQVd$(W;YzXfg1m4oq4(-pB8bt4MVD~^{pdNKCGg}biNAK&oiL~snr+%p* z;t${2rS156W-ufX3BI$Bo3M^Sd?gLvjRt+l7=p$OXc6ptqxn+hbp{oj-%Fbg9`rc^ z(Wwl$Z=UxgRfn(-?)p#64y}KNNleRF6LcoVB$aD`b|%JEnN-AO3QvoK{@A_CG#(#( z=t5yVrph^*pvlb@GnCRDg!7P`Iib@U>W`o?qnhA1QbAFnI`tMInBX(CTx)+EAZQwk z;L#QeyAR;7v^*c_JjnCHG6H%9dXlkG{Dp@sw`B=MR&^$>I1^W2>{ZqJ?^^>+meT>a z^MNDxrGm`i*ld?9?5}VLo>xds^8>^1>*38tpqCeR_LziJFICV}BB_DkyJ0R;aTg)Esma*fS_=x%^JMQG*6C^i>{Bc9%?!8j4Hbs+;RCX27 z?s9y(9lqEWIf^;61}Ta7FHA?u(s5Oo?q*5vqZJGvkM*m%qx1=L- z62ma|7gbu2tdCzu&sx6QnsE5>{!7^F(WS!a-1#$voINFik*)yfZ3q10loVbA8AevBh(z0hv^Tijx z2BVF}Ym!LCH|=bBh}h;%n$?S`oTqn^T;JI+(XI-83xv`-dJp|qE3#Xv;LdWV*ljwv z{j>MphSCJ9!tcd!cFpMx=DXkR2wW>*oMV?QA`!zkFnFsJ0@{wyh<$o z^)T9m|Fgjg`TtHIoiRF+bwp7dymg956{X zc?-R{znA9LR?Qo!T+|4UiViJXPe*4R*g(e+&25mA)90o`;J+22?MzKH;!Gr1yYVet zUCg$;wmIy!PTIfqK45xqz0QZB7VKY87V@GDtR^IbnnPgQV%2x1YG@)mXDRHF!G#7;)wgk1Zr|2(& zLSnqBZLl3+NjJckSI7>-Y<_e%=bV6H&Gku)^G7c+Adn*AFSo+Q&kafmxc?E$`eG-^)?6> zt)p0@3&>OP?2G-l#1;U>IiYqiXJx$mAyLqlQdwFxgrHl-hu#;<&4swPQn*8@J&7q;waZ85%#~a^dSdnd>J6R#6|F?6|@JWGWeDC6 zT6!?|vGk7!U__zGY_iM&eKi1v|6Q-Kf7IAL``us8XQvjv7;6lnO!Xs##6jkkH+6i- zC#6NH#5Vk`P}r1s8ek79lD5l#xY5Q=Me(i!)1G9B#K)L|g0wMN)5gy91PysT=#Bjh z9S4q)c9e*L$t4v_CncZf0nxqp(&!&@3(>y?Lg7H7TH@5mqL+AEU@Q9APBGW^>r(_# zlSUGLu|fAOd3PX&!eV)la_NhKcyGFX|F(X|BtO@!0ADXX}0_@%$WtC#;}Yb zZ>`O3+T|Z?v~NgvJ>8c;-O{XFF(wR4=84gkRKOVgqDrWkzvx& zs)#>-l|}B#-DYg-1UH*KaR|P4R3=UcQ=V6aDJ730_3qHYKU{Zb2<%YS4ovJjdV$VG zr$z}Lm_xH`v~Z6dS<}VANSqDbgPN7%Ap}D&APOEw4oB0D6e;zaVhK{TGvj{Nt|UxJPbL`h1~}Al(L(k#TciwY|=2 zkfQe(=(*u)qHDuE{uHYh7(rRroNK+D`gQ-M>7`(v$T=lk0#Q;QE~;^dvf1oX-G*@y zZu^4Xa>wlm*KPC0Vaf^F+-$6GacO95S`@?BWI8E43I<^3oBpXH@T0Cm?^$(cp4fXa zKW3Jl*h5QOV2D)8tn9Mbcp`vQ4%nXYMkqh+3XoO&Y2T0!Dqvl3|ElU_h}CvtL*_E; z3Qw^TUJgWQXNc%z54Ez#e5V%`IcBd4h_dCDFzP00FbYH=F3irs&6dyXl9QU}4l=u; z2AG0I@`N0h9vYWzBkI8B!tXvW924P+-GF}}HohQF)+#*n-I}dtbEL7|(DQuod!4hR zM4{?7cXa=K^S~~|<8i>i21F&F4*TGf7LKSTksdqkl#@Y!EIQ(=Br(UXUH07_1apnR z3e*87>c3jdJ|Wwtq=nFvbO>nLW!paSTfY&Oa^TMqhe$X0Re8uO8wP%K9D1kF|5mxDj+ot{o=~_mu*96=PUj>9eY?j`cZ`{IL#>t&=d74t*`MR!?o^eAm*fYc(Q*?GbPT7*QuK6k2taB%TJm<>)f~4)sNcm{EnO_4%f& zEHs-q#dbDb<`KzB;V`uV^NgDWLr;bGi0vw~C=m{;4VBvZgD7^zjd2RPOHM?|-9fuL!l*<_BivJQ2Y&5Sa8j4892Fq8;4!3zxPfO zVs@-u8DN;_NLL^gKb^~A*bD@eqytZgq=>Cycb^kitR(A#(vz;rsmbt-xSGAd`zxKS zVrNE@D}RF$To?SkPP&C~VIcOZFbTHqB5`y87GSht=WA26ftZ3s3&!50MBs8y)ikSO z%V0&VB;!1_!^D}i&nFVTJ`Fkv(^p1kq;{L0*j82hi1)?AtP4c|i9AgTYLX4ia58}x zWCtWR?iGTk(&EI}#w&PRm4xQtu|%eLqkGMe4;j7#^6# zgW2m~fXmc?<5CZ&Jpgv1y>wCB19m^MpwA#nxL3X|5F2-}e#;Qd-I6;Sk1j)bS~?mH z|6tIOfTf4c|*z953gX* zR-1kv>rA008cho*idLzlUN(;uwEi}=p8c%Rl9GN ztHngkBxVfOjv%y9=kOfz8D?GU7zwaEk|Mn~8>qY-Y|nH;lqbpQ<5pc9n{`T-^QEl7 z8)ISJMN(X@uRlywwcIlC|Z zYDy*34ddUln`@5IGP&&K@?AX}^wP)K9@G{^@dcNDQxn^}2;5ys!xXc2+pvTJk9x(S zKuq>whSNGof4j0z`&u1=j43p>s}GbMec70ngB0tsG}>@4?*iQ$ znI*oY9#%xA!I(=$ZP^4M&h;j$$e`_eCqpTt@SY@R+^_t2uI9p~CgnGe;ZzI(R-kMTvD7Js&%v-9+F_HJ^+{_34rU;-P2 z9@y6HCp3nkKW?^EQvQZ+v2=)#-svKeFs44YaAf8U!%Ft#`Bal#LRrg|3y3csN zaBc+)RmS1-n+SiO<1hOEN+J$oj4Vm@snb?89Ia}PVSL8dBa}6i1pnS@3d>BrDwz9% zcKMDXQ>`VN@02@5(F0e#RTh<~AgrHSHtMSruqGjUFoX!XW%Ta!M}&d?vQ<%e`zYo0 zEt}3hyD$F#Y=`l#TT5cLmr|9zNma5XSb7eedyVDPevtww+=j!89UFp#k{LgR#g2yM zKQf39jQYNmom1_)iRBsnWYD<9ahoWkus}ivxUpf_Li<>A>xBh5SVphA&+=#kgkUPeDOgv%>EX5IK{C4NQP15Mg`=K~TgEj6RVQ zSZ@hz@`X@KfAQ_H;(J2y(Tu*SCs!psSJ%K-jeu3(WdRzg^1`2gfarPP`pTe~hUH8^ zp$4N;{-8p+rcy>zB|lRg;h;+C2w*zbH#GcY`B_j_vHZ&rRCH<4x6vr&yGfKud;hPQ z3H7`qcu>tovE{+g*})KZt4-EH^=+hi_ve2zVm}%zreOM4mVX2OXJwi3f6;o2{>%0J zACzQGXeVqHz?W^@FCU)ZOW!i zI;A3B4hS#*VJ;|M4g@dxS`i8Y6a zM%SzT@2>Cm@6P9LWZc(j9M@m$el%5rkdh<`qc^!3xeRF-aPVY%0ij=A_RK}4x610_ z#mYQY1AXNUZoc4&iCrmc4BSXYad8wiY z1uo^}vWM#B#h)r_``DE2l{5m29%$Xx+slz9fPyC+OXf_;6IQ`no3bfy>0mW^k^7^! zElTAaMM2c%#xw&U?YbazdrdN0*)j2p?ASGR?FcfYQr$~Bekd@;{@I+{QjoM9KR?)$ zH`2hYrpA4m#W5)G2Sati%F}pBzf&+}yj2{*hDHq6Bx=g2d}aBl6E%ssssS1Z5?nF^ zmKgm+b6UQs3i^IurD?1{7@15DP-a_Q5tp zBHXjtk$nROAq#pY1_QuwUZ^on%E>VYlWuT&YvI00#vf!rk#OZter)J4^eJFzL_82G zfUXGEiXwR5ALkJiY0osxq`{uaWVCWk95jhRxuC(o`PV<^O!w9Z)ry?I7^*H0@;v<- zy)3DzQpF7zW&oLU&gN|+7%SS~AxXd`wis!~(q&lE-qK4~gXR$6M8D)hNpUvU)`m=h zopN2Jzrn^1$#nW4Uv9Usk&#ec%q1^WUD|xCrq_9Y48a=fS~Y>oZ1hBst?~eor#Cs^ z&pFJ|-vvW?){&D#a+A?OTGMlDKzdE;k`DK5(o$(sd5U=W$%-~iAD3~)IIJWQ)FrHB z#BwH?5j4sjO`0DDPA;her8u!+nWA(>;?5@{@1JlBXl!Mr{b6Pyr5R^}Blgu-;JW|-uP)?txh5 z#-tTZ>?)qE`xh>pTt@E44QnfuFI_y4gI91E<<*LB4RB=ap6UE>zl#@t3)JqVU&OFI zpmWk}jlhw!ed&=Kc_HQlt!QzQ=-xiVZwuC&ySv?A7~+Mj=s&eEP@;A+@YRv;#; zhD9S?(@Gjz`vl6+R2e}W5;Xhcp{LrEV7A|C0J8g!N4p6~01B=J1FK!B%^UdpqF%8} zcG}AC0gp-hmGM(raSxkyrF*qkYRa&XCOxB|L$< z7k%_RCwr7+FR*~^gVDcqm{P9S9l`ik~H9C@k7|7wd;-uxS%nOY88V4m7Q;>H0X;OAS5iERW%XRs&Q zpJ2(W{_^CN-{N?w^*tMNhYe$3LXFIjcbI=FCU7>Exf**I66f;xT}!?AMd0m;!AON0 z%P^D>(?li(_v&A{J0NJ4-udgkJW=cqGy3>v&z0?Iardiy&u?xz2D@Ky4=N25zh0eX zDQof(&n(?T2e-O=C>Xn11ptGhY$%&iTzsugPXX}PM<$aEly!@_a5{Sq!|586>)VVK z5>9j?*k;070>x-*M5nvFD%YdZVckrKDu$h5RkyDBb<`{cvnsX{vT&>0acQrglRm6; zBYdzZXt%)4*N&qU)VgiE&3$w9rFw@LA_oZ?-XH35QGbe`oIFa8cJXNKNzJQktt4N& za?i*7e>Z}4vUD&Ele|@q2jJYJ4R>$)R5d<-H_@Uw74CnSZkLm=#Cdn-#X}fZu;9uS z4Dqo}HW@$-zq;brKF>x5R}sFE7mMqxnhyEfmGiaIRltms`o6kyxedU+%V5-GV(Q~G ztdIe>R>c}oUk-;i;hTbGXSiK32<>pkWqq6xw>>s+)R_T7FgkXyIh)}ktJ%N}ieR$Y zN!u3pxNWwY)z5(&O zp9^=Bc*ycghOAIdU~gnp*faLZd+_}Dd6@SA^#vi3@D<1xAJ8!{s=B8_In89v9lZ=w zk$j6je^qbHwtuI0%jSWrD#82(*Zl4Eo2Y>v#G9o0&W+4OLtQ zmh|hgh_K!(^oJxGJF(dyI?yNrr!M@3k=QJ6Tvj>(519u~qv{~$KQ8ePF+^t^~ zWXt+s6@|!W-LBe(!**UfrhKV#wt_Ci(goO30#Noo27uQPXsA6=|VN?~)-7ZT>PWxT_j?WzygEJ5&p2RL)o!8)EPX z=wFZEFjTM*vx z>}l4nVa9Ij2;gVhj5kQr(+$}@9i9@;y$g*)vXvTXv$}FfIotc@-fQoX)A1*)dkM6i zy-Euln)UlUv_I_}CS{}nq05=EYBBt6Yl$cfb0<0^J zknSZ|Q;6zeKzVVyABDG!PA=MCxWM-L@8!9&V_?G9ztXgzR44ZxXn1I$n`&cJMm5AN?ULD2#pI^J*x(EGzlXoeS>Y5Oc3KDSb zj4d_?^xxA{GZkB_wfIztw ze)Y{0pMet!)ZiIM0-OgT8)U51x6Nn)Q&?DQM0ZAQ1Nd-m_(@^XUXBEE(zoNq23djq z_!og6b`>@2>w0+h#*xGJ_2*QGAa4K@f+@*c1uWY$5_<-NX%N5pn54DLEUsJQw?o&> z22^;TXju6!y6X{zvp*2InuhAiMb2L>r}i9S_i51Y*n~Dk5&|*8_wlF^yCc%OVb8FE zeswB(KN$7N0vYpv<)E2l%GAqJtWiL(Q6$w9K-pt zX!oeo^|Aj!v01Ri6LHX@{oLk{&eJwL7dj+fKl4kmZP_wv*)(k7HBLPzFnR!WshQZJ z@H03wIP-^co^P`U8dTaT1qtEA`C!#cH?XI?=+hN~wifo@Fa!1q6FZwhiyuDvr4sceQuU?rX8J z_f6lenqVD)Kd-qaI8R5yN=S*%N+U4bgg#63>6R4I8o~}X#<|;a2$n2DZL{2<3IwwZ zdtM5W&@40XxKAO}(QG&Lgm-7$US%Fd7pn~N9+$xbuSiq{pe5{kA>bhw(rr)T%1sji z=_iU1jZ}m}1uK;zOiWsXfWYcqPnvbd%*N{r@Uy?AYkcHu?pCW&^sF9EMkXfD0lnE{ zQZc5zz~Y=bf*Fnly-g<;9H%hKHe3eT8^m7^P4A&j#bWAZt=|z)I;9OrbLe&NTNvThXhRA-da!>wqbKZDQG5zX5OoQ)DRtsX0?Vmyw0d~F`g{%x30)jbbncI6*;Aj zzZ9vAieo8iDN8BQyu&x@Uv2}-CG^Hby3Ez)(bNNM=2MLf72o#jtjQ;35HR*VGzQQS zQQ|2v_%$R1xNEH&y`}mL>lwe}HA%CVNpzFq5+)M=o;5%Xj2LlL>0?IVF2>PQT@>T~ zMWv54CEW_nM@uP)peqcQHD_SZ{KH}1@n4=-Ot}Zdh$#V6cxwg!gN4w3A}*cD*biNa zrTTc9N`0Y%-u$3I?}hMKIY6!)p7VU`JoMGdPT(tR3H=Cdhw}xCpP2D6YgRuR-LFCZ z_`72#{s%Ufz%_-4Z{ww%`Qvxb0fCfkJ_=U4-;C~-W;^Wxhi2xc?P9v56%DDYI4|!a zEXVwlQ#s$|kytk?|Kh1EQ>dKGYvdN6ANqD?{-+eRJNFMzxiFxh@B z7bPxNQU75(+#VXJ_1BSub|<%Yd(C@qwgTNblNSf+ex{oJ!j;uyCZ@3GbyCe!myq)lu4x? zgncUA?AR9C-b@q}yQp0AX4AMQKDfXUe{k-#J>udf2h^wkcmr1Joy1(PtM3fBsC>nI zN7#vKWp`LgPBhk>8?nJlLx67DHosp>A*5rYA++9sr1>v=ff2?419fCtcO?TDM#mZq zc@hYvK$l+~sW(z!5*F}6WxPGj!H)wQn6-5R?=0-}yDIwJ;5C! zC!QGeU8%Le;0o*$`zSU&5f_w>X;M_{Nn?3`o-zg&#Z3z)7ZzM0?#Zi^vKbNvO{@+ z52YcnDJK~7Yjhi4kr4fzj1g1@XL@WG_Uqw4DzAh#LtXEeCaK*>r0@K}5M}PW*pwT< zRapk49XhBr>(EhK#*Gbrw+!eT-p9lzh&Ia8C}v#eEG0w*DL8cpVL}98y7gN-KsV)hz*?cSKbHrG%3>3C+N1?f zKcxAJRl9w-gNfCJnfwwR=xOxmCd&ff%{;8)c5eiIv;|S|M*PRD)c=)1 z?Q3E9zl8Kht6D2B2%__Ckerfs!rh{JhR>su@uS$%3!^}SQ~mfm!dgk5Mj@B6$Fv`- z1U>jSYX2*ufB%n4o*=x88M`~jQ;zfF}9esp@)MS4A0MH-R{y3U%Ei z*dd)*Z)l^D?{dBUH^X%{hTOYPW(VNk`r7CiGB^JLo=po zb$R|{dc{FxxOR3{H~?p)p6bxWMK}Z^WVe3*XwjyxZpjkY48JgqGK)%_iDtJrin%mt z@GcD-H>M9bne9u!f~i{yY<7T12JEw6O0?20Ty)ROD&o}lKSW0veyY@$FYai%7F8x@L^TK%WUwwANe}s? zbXc3FGfy$QSnImWGJp1H9NT6rW}q%-Sz#dlXNIQ^I&<&UIl-@!hz6Ci!>Kt`}p}l9<3idl#(#2Vw2Wy_PGX=i88BW>!E6bF((-PXlt*G%GkzRAf9n>YJQhXu9UXI) z^HY|ydte>7cj3^!RZ`YfeR{j>ay?tFdO6GO@c(wwD{q*Try`gh<`j%=#V~Q_B$N1% zzM4KZAvJCUL$0FR)Q%(dd(?xRMuGYVT>%`42(M|8v86~Zb1{W6wXCWOZSmg}qrdf- z(&ac6GqbG1iU__Ea z$THUNQO`Lq!83!*p@@nil(aK{+oU)TGL+!X*3M{BiPlaZ&!FHiT~u_l1vw?Wi8kgX z=Q}AiD>ab*MJNcD{BAvLi8dGWCaIYqy$Ju}@AfX*8CXbV z1A;8~pTbTKck+|?hC}7TJdpn-K@_V3Mf|quUIr5bl&kSmH;@?gMlwT1$(TnK#6h@# zDkY&b`t%O$(xCxE?geuX{A^Rs*78-yLs4zNG;L<3$}Ti^AE5&9{h~a%1jDQmNH8oh z-l(4zK;3x9ehE`&Fb%Fk4X$sXumksVoj}iOX%Cs+eG-#u`Rp0obF^XquA%;PCAL?40det#d^z^_bInPkd>a zK$zRGMCEhLnX=MRuAa`uE&d@`5DiYdsSYQ?DK<*C2T;#jP{SPqiy6FRr?DjxfYoI~KUVHsIDSqYgg zhgQmXA`R$*N6x7%DkZnL3&J4KH^bY5uy{6Qsh;r$%LTaf)?{VH_&IBAwPBJ^BpMZC zSyOhf!JeZf26eM{GirjP5THM*f%pG-NF5eR@8f`B3!ZeG; zM!pGEw=$rdMqX7+&>7+h;sH|XfT>L6fs|#@=^nm_ex<$I&3xi&m9J0It(k5|kaz-$ zCGKa&Gr zSbqLNe9JU}t=&az$4!{eXp0eKXHtU;gne7D&hwT zIM!pID}iY=eSeGsX5Ou1Zh+xm>-<{5&A2ki8(gkx{KkN>Q)hmYb=Gzh2l6K21-lbNL4c{O>Sc3~q>EVa2y{*t^Xu8244p^q)Ex ztKbxv*A~pegBXtXySCmuTXpJPkxyA|PnPFEpI=|{gRYoeZJ$`8x{LoNx(*IjyqciC zeIvv8PZ-Jf{|O`iC-^v|Zt1)rj_t<|F~Lj{(3elFVCRq(K%KNe90xDqfQlL#T!gNG zK7=x=L^GB&8?*&YZ!7RfbZLAr$4)CVKhW*!cq5$g zuKIXCPSpqNjJd*92vtS>Yg#EDVAx<~x`#6%qYYfRQIt(Tt&>r0kcBF1xzbrVJir!l zuAeLxg%M(vfEm;Hp1v!%%fB?swh(<*EX{*K%0GJg@4i3=Ps`tI%K*mZr1;W}WiysS z8vg=CM9LZe4-49Fw}W(~88rRW=7&FXiIoT(1T7;h0NKL=f*wb_rT6i;gt;uk1q}lOWmNVmL7JHvFDo(LCWCU%Ong{b z0Lp~iNC|<~d2x@P^pu%IIx_nn2BJT3pvmI4*hxDaFCv}d8hxb9!iHr=p~;MODZejk zX+cvygisEDY2Ku;>l!^B6Gyu)nm9>)$uNx4x}E}M&<)B{+%eg5XpWPU_MwCxG^j=&T`ea93U52AwdnZ4b?52J|BrPJK=Bqv?T=asQllv zL`Sw$ZoyNVYh?GFBC|`tbyKM{sH{P1SXdka&Z%12+L`wDKBRKZjUyrMBU_3h=(ohN z4;B5HYX$oVL+|=Mzwy(=uf|Bac9?@Kia`^1m%Q<|WiUIn*r>0fF;@FvP)wsi{$cZlqUZ-kj|ovI zQE^Nap&V z|CXRjSi1#M9^S2OdD z5t~5OIRVv3iy>`r{JBTsAzf{-pXG@e(DUQdDg>%lHqGKnT=IeC zV@Uh`@5)r(xmY6p$R7_*fwgg`pSZCd;tdq`O8f1FiG8W)nO-~urz~Zf0$uct&z$hI z9z4^n2bFuWHn9909E^lCQIHIC7jnKvqf+DCAF!4fa#RKwM}a+ z?1waetAtGT4&sC5OI0wQXhD&TRO2-s?u}l`mF2HH@W30|C6sI$&u1Lkn-?t3OLdd% zz2|j-fqaW-EGVe1VN!x6x5y4v`DHh{4h7xn>mbCde=0Z0-3=rZV!3(U<1d{#fZvss zRaVC?TR3hiz5jlwWAU80VL${4e;R(Ui8&{CPn|J|T-~n;-7$SSjV`cxooEZqo))Ui zGI*2fHV;W~=-}d=Xa;Fk3TK%4i=ZZ5YG^myBUf@E!}5dBH=4tm>L^z^abj4ZGt`~; zj>K%jL-cJwad`X&y2V6|cbkvAZrlt|ZgRsWXeQ@AF(FPqsn#5#7+OZ^kSHC3yRq9H z;JB-FrX&YtH^B!d1wnMXKs)X1G)G#saGaI~y-67j4SKUX4{3>05JITU4lq>?BL25$ z;>bRQoj2+_Y`zy#MT=wTFbuQ@7_EPlLFd^opl~J^DfM!5*gzf89VQ5(EzyOGlx}=1 z@fK6EA4}$h1b%`{J~a#K3I>7f$nvWQXp593HJ!M4b5-Jb6|CQlJm zGf4cGEaS}uY19lXy&H@cS&dlm>Lcta%5A@;mhLj;-omkO!JO)rvf(0-2iw{+${9_} zO`q%_5z-C%4mD`-FlXj6PktI&6t6Fou=8nD!LOTo`4Jj7*TA6uf;mATFNfYpL!yc? zjyq7cXsv#+xO0(0EApj?-BU@RpajP?m5lXc0wYhcz+p0)$Xm*{eIAGOxl-jD01J#+ zsJmT>;+sc(GE%_IKNg|3*O1VU`pFcrq6iZ`%5;wL(F0h0y`xmoj@TMrW~iHe?}ECY zNz1W=*d@nIeAcIuLn%yh#vFVD(rH>aUbtX9k$kLwJv|lWQ!8WZEBjW?I-Z~Ss*1#v zjsOUQS}6{;>HdOQoBF*R3WFRwH&u6>0=*nY?~ng|ro8(0T0HcHmqY0P2`_p6U*M&v zp^KrBq4WRjG`Xaq>AoP2{z1X1hAJ8$D7+xJCRLX`Se#VF2~l6m$qDZ$0SBq2i4xwM zq9j=y%;2J*cVX=>yxr~qW0_x4BJX<=YvpZTNtL1w$XXDQqX6PgZNB+#Z?*x)w?BE` zzxRUqtOP<;#v{kgh5Z;1TACcLFJ?BME;hCjUja}SZH{P<+YBd>a8q>S7(J?H0{M((9Xi`gaTzvq zwx#0n*7BJ{x}p4=I^r#^vZ;7)Yv#)afimg_v=leh23C=!y+a@G>k+KR&b~wrHn!t5 zwRa(WomJL1!`=(6uxh zb?es?=1%yt;}u&iSW8wcL9D-+)z1fYWiq zGB7PH60F}a7_}O(Qe?p_V@{WvFUF@d%5kXC&aB=FHoUOHx)dHN-9gsbU)wD~E5}Gi z8U-_;CEehR^Yb2PLl@r!%LkB+$yu6S*s>8vXNG+<>5TXX*cd#?Dl~5`u$r#-Ad_ti z!a0}|Wl5LF#>XYXlVi4#S0j**CmI67fp!dQT?oJ{f*81*m5BD-MVUSci&}9^%IB)s zJg5;LBgNb8D3c#%R?xDPqmALtowv6HcngO+wAt=#C_36b1xJAal-%0O%}aChE10r4 zCA2H?V^x_AHHIa#NR|NP714OskxJZN+vVO4RKXllaDO8HWR758+`h893$!A9!XPxz{LJ+Vm{UV;*a%VNV%gg%F$v4{PO66=JmiSqq|5cw5;~2&v-HQPsN&8 z8h8>$$>(50ksBu1+`04l{T$*Om9+PFxnQepDk~=5wj{MwMg8P@x)U zDgCOsp!Zjvqz0P>n&1hr?F;AJ*c3mJdv#e!@-LjMd^WjlDw@ptZB^ppx7np~BO2*c zx+=-hr^cicEc&GJYF7A29^l2e0Q5cZm{BjCr3|!KNY-0)QO0uZuR86PdC;PX_JFs( zW^d}Im=G#o5o`DM;`yE({mZmgztk83{dJhZp$c|&bZtN`rIFFEzYozS_XL$6OdnTRSa(;!ng!gr zrzGCz^Lkt$VUcX29alal%5R6~Ftv z)*tQ^_DiH#52IpyPKvQQi=c;~nGV(SQC_Tt{24KMZOj^?iD*;1PzXDs4PR@d zh5gwjIUz9K`{d8o+qW9}U55knSow-xpy)|xUAS7d^BVE%Iv>M@$z$oxd<@}vNeh1A z`QrieQGA!Q@BQhna9UBuokfHTJt@EP4jU0J>EL7Kb=vX9fu{`#Eyvh$c`n6QcKBbs zUV3-gnKr*7i6_*U)YkMLr zFU#fUcR@zE;kW$qsn4CF{EX_?>7_HrTs|kSow7oM(XOKHpTcLPQ937j;_YOMCty{TDG? zMfdEw`30io|Iv{4zbZHWFJe~G&cxK?e+Hp{)UB1#)Uo{#gKfeTS+QA%Xw?wH(=;#` z^HpG|@^?vKOIJ5gms>MzPRxw^wixx-ul^zYTjvJP=3Y20ksI-|^OxIr%A(7(K}9Q= zb`c+On9kul_RT%^+;-k-kpFx+RR4B-9gSyek-Br8_gxOuaO%U5HDR6peyhZpt%@-P zQ<0H>l97c#xfqDDl9H_Y8@Ytole%KinN}0(IIg^Gm}wyQmngw^<~g!tVWBB&#f>QH zExE7$*; z9Pr|rHToIq+uO?OO+^>6{S-WuOie{8s1fyKm$}iixuK5`xz<_gzKcFY59~)(yx7CB z>S|^Q<9+p?M`+Yg{s`dCN{i9DCkeHg6P=-kc__H~;kr9lT1!n_1LnfEMI>V+`5kaQ zhh$%`ES-h1gpeJ91mm%8ly`=q}FQ zon{Mk?EdhSG;v+d!CDb@xS>j7gLX%VpXB$R4uBdUeiiG_8Vub^_*f0yaY}l78LS5M z$H-rB%aS7MO)|d`fznS&jVKp21PNai#T8P_ax6Q2#P`7SviOA%dk?NjhPqSm;>jW1OEjGEbC$R#yMwo zJ{Wp1dsoAteysgNa(Xuq8p|;}A4pkqtFC+yFMCUX`CtHJKc7jyCb2DBj)Vc)|K;J| zRb{wgO17#E_|uF|e|j;@B<>LyqXf4C`;*#zm=}9QRfu9_A;ZwV-^@m68Z((nz=o1H z%s7E;f@;_Tr*OMI@-$D52dt)JCYwb|#LrS#W2f?|hXJz>O$8P^m?V)6p` zJss8~x5x>O(Q+ApjC$yB@R34!G{H(dF}gtRU-&ZnABBR;IaGoe7W`5*ORD4yv<~G? zzt{4`iVsLA=oYyR{(P%(7v`3tld^>7Em3}Yb1W0x!c1y z^zi(ewm5VXTWK!Bbf|Wxw`3*7AxlY3kZ!x|jFrEt)xuawnvz=X%T$y3NgaG=b3OTO z^0DGdPJw^d0eV&AhrgNiwvOWdl9>>Fsi=?IGAv6K_FU<^ZSuBWrlC-vy0~Mv!tZ4a z@ZtPfmFCgwC)&~_5-e#JX@UWhJCe3P-!lw9e&aM8(?tRSc0DSqSV&71^&7_rRl2ez zlJjv3PbCK!b&TYdEa%lZ6uZP#)m5p06}@lq*&7adoV# zglE2@CUTJ}vq&Dr%2KRbFY+(z*aq?4i_=B4d+Tm<`Abp##rZMHO!g$!L!*=GRK&W{ zCz-&M;XJe;-XB?mm5@3U`#iC*b;{=D?K^7Z*) z<_-&UQ9x-NE_kblJ8_WqgueL;4d?Gu+MWG=wdDn}kR3-~MeENCLdx_Wq_-YK76qeg zXy%e0ZLmV^K0177CFx+R8nZ76U|V86F$ysAmS%z|BO?!_yptI49d{m z$-obkt{&-sq?k)#Vr)i=(Hj5#RWkXhel*_2bRH$rWl&rTt*GNScM;C5Mm}|x zTMWK~Ilq0Jb32MpuyQE$myCcLDo8+U(+$=}@s>B(u9Mn>0L7R;GBtKm54F<=W*5+P zNX2&~0c#4o5y~pw;)d3b-;@x z$_W7W=b|ZgcT-}&5_IGkJgZrtsrv;4RgqG3a?^Cm88G@HCU-q*=y{Kt%^fw3+`k6+ z`87^SS-howk9+=%ophUmc&LMk8l3EP2+mD|smYX*=$pkXk|HjqRs&+hk-;aBv73^U zjZqAiEb$AFvPu0d*+GYYgeFop6Br)bfvQ&Ik?2{4+F}Tznv#b7Mo#%A`weG9V(kK} zOXQu45XvLvFz?)AB{yhkU)}^S{GrA*=buHNN1B=|7$U z1^!>00hLV+os2F1A3>~1^TmJR2wvqFfj5bmKh=PRCk zbFS`ubER+nKi)3izVV0qx8xx{fa8j?7KHESRO(5fyU>>~PEr=5dlLV))*PC}4$j|= z|CN5vDx&TcEjgyfS|}!15yl<{@ZIuU>nyi06JCaHSw>X4K2!{MJx$rN?0(z~HZwaFWen_mLY*k@+K09nN)aFs~p-1rnA|{OM(; zJsX1vb|z*c7`!_trL|xczcVKOcu?A$m!z$>(rrRv60A4m>CW4tUN?r zR#56KW|`I*dyU`=pY)_Z(^5yD9YbD<)-mdqK!QFsmzYU`gQ&p3yJ7A|(FI_=`)Do3 zPC$OO93>`${Ya*g>=>_q4NRb)m*mMml0xi6C(2TC8Vq*y3+b66Y2M)nsjUF&1>&p6 z=E<-cWe5Lx1Q_ZrSAZlcU{z@)y%a<_+?Z?%e8S^deAmnOKPLvO~ zq$(dUGza+UhywTk1z9s^=Anywr|AX#wR0j5dDX`lYcc7qVP9Nk4(b_z}>QeruoDW=8D%e@*+n^j;yU*ixuT1Jc^vs@TpV=@1d zoJawWRle~zqRM^wiXGoaH#9$8L0!b+32Mi>c>+Dvf=M%_> zb4C~gE+UeDV2otqDAkRh_NH@IVBdKuvdx5Yi2`HL9)YyV8N_J3LwcM|8Q-~LD#IY- zT3Qa#oypaK=P@Deej)c;AbdGE1+lDtOOOY`OF({35>P^D!W-OkNK0}ZZWiK%1oK7{ z#MhEegUx+daGZZE#Gsb`@U50OL?3&s+;bwg@|h4_ER8C@1R3GOW~R2uhH|_dOy5s! zkPA8TV%n+2coo0itx4HpAAgpbk_lE?&Gx; zg^-fo^7Kf<_vzoyE&d$>Lo(w~7kpFqhq&U|cK%hK%QZh8aP2{3f9bueDtTQ~#a{E} zL;XUi7`@nn_&-p>9=;O+ykAN&j@qNB&E;dqBGvX#YGpjRG`4YuFE!GM-WBL7zf7SY zgSyE3(96Bnp-b%CHBz15;X8Ha216_EFLx`N)$|4hV1heyA-Ki$xWUIfR#^<(Kd-lT z0)4^i9^VOH$#JckbosdP4GUY_ZTf3PbJGydMx$hVdE38 zj}ggl#E3W@rEj)S>B2oIA7atfJz#l=+eL2(E|r`9kulg_Cm$Ow+oH!;8v8*Kki+7& z0!-|`#(G!LkH&{d-i`6IR~F_#SMym{b4&U#*@DOX;SYLXXI4?{^dfPuDYbI#;nAV{ z@fPaF>fedF%weCTbP=RiUlHj`N1jew(4y}6t}!Tew} z)CKxuVF5j_uzphCo-rs3w%YfuaVslwcaKvx`QO2N$i6dZXZ*#twC9{>M|ONb4Cx_h zv)@~ZQT*;Q^1v!JvHH;r-#msZqq!sM9r*pS-aeSNcBos-nE4&F>|7^54+BjsaYKHd zqz2idHBi|2oJYPnOw*bIKmAx;j^bnG7rA}Id~}Y!Un3JktsFCLW_ia_)D|!gTW>XA z*tn*;E~DgkrM!Nw{0fcxM!My8j}F62DS+!)dd2NFC8>UWYU{f)+Y?O5E45M8l|lU8 zaQ~OvoVt4(H?lpV@M|-mjw1O*#-|&C{2=5JIxOx$9<`Mp@cSq1ZXMf6Q=t*P*Qbiy z6+|^RH)Fz_jz$UkXMkB}cylJF17~+skTiC~4_1#Klg4QEgfQ6*!Ey;)$3e5Ff*J*d z@UDg6>z_Yc|DMqO*w3orf~kQ<*@7`PrRyD+G!oMd!r)=792)O9;|a^tktjB^~G22Thism4LUFM&8^Bi);G znJ~28np-6F99~907EiKnlhDd}u&{J*Y7}XX=ri4J;Mg?xcZDC?rt2EP?=qL{#_){U z8eQmWe$~tM;xWmkd|;e?h_nu_MEIren0Ur(P{5E@iZr=>$|+@F!_g(`H)<+1&o+72 zxIwEswET>aRZ6Npy%IExz&$wo+H0OR|r3?L%> zPi(#F|6)^6cfb5-HSaAo_5CdRyW7lFkHsC7G&0 z-`xwzKw@~Fe5_&t_jx&AHczz}N(S0eKCc`P)jt@cwk0dLjioH55Pp!0JSXYe)?~D+ zz$QGPE@O^-`}l7;17X|0m|878B$mk)gb-_6yRxkw#wafD@~K+oTqlu4Qh38otRwx& zk_9L{S&|?&!|7tBmW~mZ14q~K7M%03X_-EGB-Pu{V9?dQ$Y9=kNj&_@rRmydhyQbb zDL$qwhd*T!N1JtP3JGDU-X{aWS^-{;J8SPoJ40p0u&wqgDtjp##ibkQ5bcd%<&+@{ zvM@4hc-=cbOs^o6CQxiJjA57MMm=n!fI!@(_!{aQgISSo0hb7-XP2hxG#|V=Uekb_ zOp~0O)hB2fec7jhpa7*{tlwKAWKX+x<<|v3afgTN_B-r5z5yMe$rlid$K8dxu8r`B z85CfL`qRBTcH`C&sK+^k#EI5tp2dT`QiC!n6Oi6Vzxl`Gm z0xROmVfRP>O8n#yk}1RGM)YgS9TmU=> z|1%l?FI;7O7PiDF=fM^NP!@0tF;cLWzt}YOQl*HUS*jupCqf55VtBw-H<8C zeQ|lt!UHdhazK}i2T$V>@S^}T|A!=8ymTH3&E79)nl0!Y4?&v3BwP|{bnAn)vDRM3SY zi4|{g9O8GLbAmS8 zVD(Y+eH@_l=Twepn$H1xuB^OoasFwc+mtQhrHY7|w8&#pusA5B?P2D(Z9*M@7AI!f zoDxaSppm!f6|UynTy^V?9S>$Tu*5DyzF&%UvG)CNreM;~u(*t$!&5JrMCh zVCAdAJ90)E-l|CyTSjdAP;79Yde48;WlO|wF5fk}aM{}fD0jU*)R zNc7{4uu?E}(%r%tk(v`9g)Jkm19qoNM^|Ii_~FK|k8*VQ3Q+Xd2}5UMMzMzwL2Eb2 z%raIj=A79yf;wa&5013JtE9Tf8pi0K2#NBdCMP}xHlpx}2R<|u`#NzkW}!`CW=fi; zdkw`=5R9~@Jo|r=DEK&Y`;4tn9suQKhu8yzuvnuWSPUi_bb~T!T4~NGQrJ){Vm(c1 zLYJ3t5bdwr8yrtAad&hG2fFefEFkxZR_xTc-2@|)c++lK;JNkcAWo0W@L_8pi>2t= zl)ft(37UO%QeCXI8ljpDdFh~PwU6I$tJLsPE2tR)1K3y?>oV<-RWq?fPjC##-#;_a ziN(XlgcvbOYT_=)7Y$ZJjJp9<8SsoB!JHM&)s~Y@-Ra@HIii6%ht@7L%;Bo3qs{5+aJj4@86Uj17{YAq#DL%oNF0tB_P6R zZ>onMpnZ{+B?hVy&s>b_W`b@zr|zsukxi%5VA`aL(E@{caM-bY9klr^sOr+Vv;0o; z{tgkeMy^E0-Yx3ji*%+u-@xMJ4wjS-Ch)kd;%6D=)DUa`L%kexm2fV#3@S!Ta+Tl- z@aBqrVorMI{0p`@!}kmZ0_w!BLRxWS<(1+ijbo2Mh|!NV`Em1G69~Jalqn`-^^15& z^bfEUUu(ieS7Ia$vZ7?ds=~|-g?J>5d>R8PSd6=o5&wAvo*g&?MzGLf5x%45kbEr2 zO%Sjpvvzu*KHW;Zbw-(ALrQI`K!R{Cr~N6W(eONDCx8>`CN>VsJyiSB&n%MIjy!=( z%a6lo;+N^4wuob$fVQF+(u4pVIV1gD{x@C`k!tSb^dPFeo?-b=NV?w;+a=L|Bhr~H zHnleSiko@_4yWj?wV&yU2OuqlYB)*nR%}%3-0yI%f?obg-J}Y>+15Y98`bG!z>O0n zVQ?-a{r&E;dmgSE>JdME;Grb^YRI{@lfNQRigqG98P)>8PicfSZ}~ zT(RNA_h3j)l#Yb5OLS8-M{j3BssDOTI9@gWk^Sq08&f|1!tOjLN!3DK=2Uw6Ch8my zGEKW`oYbH*&92^?GD2eZX8O7nD%XPIZMpmBj*4;_=Rc7OuUEH%r|m_*Yw3_q*eC+# z(G+bL9!k?+;TlK57$mOcSxHC}-_jrF!^ZiQVJ}EBwY%$vFD8Tx*K+djT7ki{ znt$8|!@1M#ZrZXM;EwDD&bBX1NUyo8c|D(Tc>@o!qSUAzN2s%RgVO~*xMm()NTTHI z^)=6r>URxpX|$MGd|O6eLU@l&2VaQEU5|~!FotHLj@KHwhg=)@3AA5eEhw|Yk6X8qt6bl%Q8Hr0^a z$NkV2^ZJ1F;>W2n@~b*AzuA5e?fK(H*!-$^j@)JU&{6rJgIyr6@m5~>;iN+ z(PsP||7*5@D-TPr#TrBYkzuTk-+w!@OEd!KFYByZ=E3cVPx)fKrFD!UUlL^;-E(x| zicwbL`h=zj+b#R~?|S}IIXq}7O?q>hGMjE#+-p6UJqt7iV}RE#c}wUMs&*-P8-aDB zD;U)sdX;GR5@zk4g54$h%78*z{i4MD3g#!FbT=1!ZJZQ7Cx5LhVRR3C&!QXq+0)CY z$RNHcrN_MIR^B_oTHSKe9j34O%(%N^S&0QhYk9c6)3V4|{$tq>`bhw^z0dzDFW!r7 zdm#M$jwIX;nXGKFp|!vtK0We|wtA8)8t_WL_)65zBh5UDp+SSLK{|Lw&ipFz>pLf5 zkg%dtLeB5fR03eugL*LRs!qmci~#aTR`d^9M}+CSm8?H$^~+ozsFwif1@=tR13t85 z&d8k>*w&XZU(1e3wC+ip-aERTBEJs_=Ye2aALNn+z&7Ix-Uv#gkmry~9004nPr?#g zGB|=jd^}*+EH2FyYCQ5e5wAESq%DZ42|taO&e`~b3(Yx|r#K~~49$!c`lx!3$<=+* z0kc>#EgV11%Q5YE&vPQSn3-Bqw1Mdf`3RDW$4q*X680zop9xlo zA8T^kqI&#)qwJl+Gwrr*(Lc6rezEOTY}>Z&q$>Gh+qP}nwyla$Nh;i#Ywf-E%{g

!yR1Sc|9i9ui@GJ6zss)>L!Xh8sJ?vD{o2%b~Sd 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 NSWtRq TODO("Parameter of type ${parameterContext.parameter.type.canonicalName} is not supported.") } } + + private fun pathToJavaDriver(): String { + val classResource: URL = + MongoClient::class.java.getResource(MongoClient::class.java.getSimpleName() + ".class") + ?: throw RuntimeException("class resource is null") + val url: String = classResource.toString() + if (url.startsWith("jar:file:")) { + // extract 'file:......jarName.jar' part from the url string + val path = url.replace("^jar:(file:.*[.]jar)!/.*".toRegex(), "$1") + try { + return Paths.get(URI(path)).toString() + } catch (e: Exception) { + throw RuntimeException("Invalid Jar File URL String") + } + } + throw RuntimeException("Invalid Jar File URL String") + } } fun PsiFile.getClassByName(name: String): PsiClass = diff --git a/packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar b/packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar deleted file mode 100644 index 7e0ba71f51fbd4a9031e1ccb6262472ffc869aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153556 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�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

!yR1Sc|9i9ui@GJ6zss)>L!Xh8sJ?vD{o2%b~Sd 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 NSWtRq Date: Tue, 9 Jul 2024 16:08:35 +0200 Subject: [PATCH 27/32] chore: add new func to changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 308c03bc..07d8f758 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ MongoDB plugin for IntelliJ IDEA. ## [Unreleased] ### Added +* [INTELLIJ-29](https://jira.mongodb.org/browse/INTELLIJ-29): Shows an inlay hint near a Java query that shows in which collection the query is +going to be run in case it could be inferred. * [INTELLIJ-17](https://jira.mongodb.org/browse/INTELLIJ-17): Added a toolbar that allows to attach a MongoDB data source to the current editor. This data source is used for autocompletion and type checking. * [INTELLIJ-14](https://jira.mongodb.org/browse/INTELLIJ-14): Send telemetry when a connection to a MongoDB Cluster fails. From 65820a9eca441a0787e7c60fbeed9f7cf5e6be0b Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Tue, 9 Jul 2024 17:00:06 +0200 Subject: [PATCH 28/32] chore: rename to a likely better name --- .../dialects/javadriver/glossary/JavaDriverDialectParser.kt | 2 +- .../javadriver/glossary/JavaDriverDialectParserTest.kt | 6 +++--- .../main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt index 60fff091..379bcbfc 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt @@ -9,7 +9,7 @@ import com.mongodb.jbplugin.mql.Node import com.mongodb.jbplugin.mql.components.HasCollectionReference object JavaDriverDialectParser : DialectParser { - override fun canParse(source: PsiElement): Boolean = + override fun isCandidateForQuery(source: PsiElement): Boolean = (source as? PsiMethodCallExpression)?.findMongoDbCollectionReference(source.project) != null override fun attachment(source: PsiElement): PsiElement = diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt index ba12d063..7a7bf538 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt @@ -35,7 +35,7 @@ public final class Repository { ) fun `can parse a mongodb query using the driver`(psiFile: PsiFile) { val query = psiFile.getQueryAtMethod("Repository", "findBookById") - assertTrue(JavaDriverDialectParser.canParse(query)) + assertTrue(JavaDriverDialectParser.isCandidateForQuery(query)) } @ParsingTest( @@ -66,7 +66,7 @@ public final class Repository { .findChildrenOfType(query, PsiReferenceExpression::class.java) .first { it.text.endsWith("collection") } - assertTrue(JavaDriverDialectParser.canParse(query)) + assertTrue(JavaDriverDialectParser.isCandidateForQuery(query)) assertEquals(collectionReference, JavaDriverDialectParser.attachment(query)) } @@ -128,7 +128,7 @@ public final class Repository { val parsedQuery = JavaDriverDialect.parser.parse(query) val unknownReference = - parsedQuery.component()?.reference as HasCollectionReference.Unknown + parsedQuery.component()?.reference as HasCollectionReference.Unknown assertEquals(HasCollectionReference.Unknown, unknownReference) } diff --git a/packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt b/packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt index ccdfc5f2..ae8bb9f2 100644 --- a/packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt +++ b/packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt @@ -25,7 +25,7 @@ interface Dialect { * @param S */ interface DialectParser { - fun canParse(source: S): Boolean + fun isCandidateForQuery(source: S): Boolean fun attachment(source: S): S From 4539fbc1755d944944b6651970e48e6e514f30a0 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 10 Jul 2024 15:56:19 +0200 Subject: [PATCH 29/32] chore: add anna's suggestions and comments --- .../javadriver/glossary/NamespaceExtractor.kt | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt index bead93b4..db71fcf1 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -184,6 +184,26 @@ object NamespaceExtractor { return null } + /** + * Returns all the relevant assignments and fields that are target of the received + * field + * + * Example input: + * + * containingClass = PsiClass:MyRepository + * field = Pair(AssignmentConcept.COLLECTION, PsiField:myCollection) + * + * Example output: + * listOf( + * FieldAndConstructorAssignment( + * concept = AssignmentCollection.COLLECTION, + * field = PsiField: myCollection, + * constructor = PsiMethod: MyRepository(MongoCollection), + * parameter = PsiParameter:MongoCollection@index 0, + * resolutionExpression = null, // because it's an assignment without any additional logic + * )) + * + */ private fun resolveConstructorArgumentReferencesForField( containingClass: PsiClass, field: Pair, @@ -212,7 +232,7 @@ object NamespaceExtractor { ), ) } ?: run { -// extract from chain + // extract from chain val foundAssignments = extractRelevantAssignments( constructor, @@ -234,16 +254,27 @@ object NamespaceExtractor { } } + /** + * Gets the relevant call to the super constructor within the current + * constructor, if it's compatible with the current constructor signature, + * based on the field assignments. + */ private fun getCallToSuperConstructor( - it: PsiMethod?, + currentConstructor: PsiMethod?, constructorAssignments: List, ): PsiMethodCallExpression? { - return findChildrenOfType(it, PsiMethodCallExpression::class.java).firstOrNull { + return findChildrenOfType(currentConstructor, PsiMethodCallExpression::class.java).firstOrNull { it.methodExpression.text == "super" && it.methodExpression.resolve() == constructorAssignments.first().constructor } } + /** + * Extracts the namespace from a chain of calls like: + * ```kotlin + * client.getDatabase(...).getCollection(...) + * ``` + */ private fun extractNamespaceFromDriverConfigurationMethodChain(callExpr: PsiMethodCallExpression): Namespace? { val returnsCollection = callExpr.type?.isMongoDbCollectionClass(callExpr.project) == true val collection: String? = @@ -277,6 +308,17 @@ object NamespaceExtractor { return Namespace(database, collection) } + /** + * Extract all the field assignments from a constructor that are relevant + * for the current method call expression. For example, if we have the following + * callExpr: + * + * ```kotlin + * client.getDatabase(...).getCollection(...) + * ``` + * + * The only relevant field to extract is client from the constructor. + */ private fun extractRelevantAssignments( constructor: PsiMethod, callExpr: PsiMethodCallExpression, From 198e7a6af1f3188f936dcf89c8c86ac44fbc65f2 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 10 Jul 2024 16:19:41 +0200 Subject: [PATCH 30/32] chore: run only coverage if tests were successful --- .github/workflows/quality-check.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/quality-check.yaml b/.github/workflows/quality-check.yaml index dfed3297..b98f4093 100644 --- a/.github/workflows/quality-check.yaml +++ b/.github/workflows/quality-check.yaml @@ -120,7 +120,10 @@ jobs: sudo apt install -y docker docker-compose - name: Run Test Suite run: | - ./gradlew --stacktrace --console=plain "clean" "cleanTest" "unitTest" "jacocoTestReport" -x "packages:jetbrains-plugin:uiTest" + ./gradlew --stacktrace --console=plain "clean" "cleanTest" "unitTest" -x "packages:jetbrains-plugin:uiTest" + - name: Generate Coverage Report + run: | + ./gradlew "jacocoTestReport" $(./gradlew "jacocoTestReport" --dry-run | awk '/^:/ { print "-x" $1 }' | sed '$ d') - name: Publish Test Report uses: mikepenz/action-junit-report@v4 if: success() || failure() # always run even if the previous step fails From 5412bb584203b3ce487ec1c9be65446230eba88f Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 10 Jul 2024 17:18:48 +0200 Subject: [PATCH 31/32] chore: fix test flakiness --- .../fixtures/CodeInsightTestExtensions.kt | 81 +++++++++++-------- .../fixtures/IntegrationTestExtensions.kt | 8 +- .../accessadapter/datagrip/IntegrationTest.kt | 8 +- 3 files changed, 59 insertions(+), 38 deletions(-) diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt index d631326b..00c1115b 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt @@ -7,27 +7,35 @@ package com.mongodb.jbplugin.fixtures import com.intellij.java.library.JavaLibraryUtil import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.intellij.openapi.project.guessProjectDir +import com.intellij.openapi.util.Disposer import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiFile import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.fixtures.CodeInsightTestFixture import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory -import com.intellij.testFramework.fixtures.impl.TempDirTestFixtureImpl import com.mongodb.client.MongoClient import org.intellij.lang.annotations.Language import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.* + import java.lang.reflect.Method import java.net.URI import java.net.URL import java.nio.file.Paths import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference + import kotlin.io.path.Path import kotlin.io.path.absolutePathString +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout /** * Annotation to add to the test function. @@ -51,34 +59,26 @@ annotation class CodeInsightTest * Extension implementation. Must not be used directly. */ internal class CodeInsightTestExtension : - BeforeAllCallback, - AfterAllCallback, BeforeEachCallback, + AfterEachCallback, InvocationInterceptor, ParameterResolver { private val namespace = ExtensionContext.Namespace.create(CodeInsightTestExtension::class.java) private val testFixtureKey = "TESTFIXTURE" - private val testPathKey = "TESTPATH" - - override fun beforeAll(context: ExtensionContext) { - ApplicationManager.setApplication(null) + override fun beforeEach(context: ExtensionContext) { val projectFixture = IdeaTestFixtureFactory .getFixtureFactory() .createLightFixtureBuilder(context.requiredTestClass.simpleName) .fixture - val tempDirTestFixtureImpl = TempDirTestFixtureImpl() val testFixture = IdeaTestFixtureFactory .getFixtureFactory() .createCodeInsightFixture( projectFixture, - tempDirTestFixtureImpl, - ).apply { - testDataPath = tempDirTestFixtureImpl.tempDirPath - } + ) context.getStore(namespace).put(testFixtureKey, testFixture) testFixture.setUp() @@ -99,21 +99,17 @@ internal class CodeInsightTestExtension : } } - PsiTestUtil.addSourceRoot(testFixture.module, testFixture.project.guessProjectDir()!!) val tmpRootDir = testFixture.tempDirFixture.getFile(".")!! + + PsiTestUtil.addSourceRoot(testFixture.module, testFixture.project.guessProjectDir()!!) PsiTestUtil.addSourceRoot(testFixture.module, tmpRootDir) - context.getStore(namespace).put(testPathKey, tmpRootDir.path) - } - override fun beforeEach(context: ExtensionContext) { - val fixture = context.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture - val modulePath = context.getStore(namespace).get(testPathKey).toString() + val parsingTest = context.requiredTestMethod.getAnnotation(ParsingTest::class.java) ApplicationManager.getApplication().invokeAndWait { - val parsingTest = context.requiredTestMethod.getAnnotation(ParsingTest::class.java) - val fileName = Path(modulePath, "src", "main", "java", parsingTest.fileName).absolutePathString() + val fileName = Path(tmpRootDir.path, "src", "main", "java", parsingTest.fileName).absolutePathString() - fixture.configureByText( + testFixture.configureByText( fileName, parsingTest.value, ) @@ -131,22 +127,29 @@ internal class CodeInsightTestExtension : val fixture = extensionContext.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture val dumbService = fixture.project.getService(DumbService::class.java) dumbService.runWhenSmart { - val result = - runCatching { - invocation.proceed() + ApplicationManager.getApplication().invokeAndWait { + val result = + runCatching { + invocation.proceed() + } + + result.onSuccess { + finished.set(true) } - result.onSuccess { - finished.set(true) - } - result.onFailure { - finished.set(true) - throwable.set(it) + result.onFailure { + throwable.set(it) + finished.set(true) + } } } - while (!finished.get()) { - Thread.sleep(1) + runBlocking { + withTimeout(10.seconds) { + while (!finished.get()) { + delay(50.milliseconds) + } + } } throwable.get()?.let { @@ -156,11 +159,21 @@ internal class CodeInsightTestExtension : } } - override fun afterAll(context: ExtensionContext) { + override fun afterEach(context: ExtensionContext) { val testFixture = context.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture ApplicationManager.getApplication().invokeAndWait { - testFixture.tearDown() + runCatching { + val fileEditorManager = FileEditorManager.getInstance(testFixture.project) + fileEditorManager.openFiles.forEach { + fileEditorManager.closeFile(it) + } + fileEditorManager.allEditors.forEach { + Disposer.dispose(it) + } + + testFixture.tearDown() + } } } diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt index b0796227..997ee17b 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt @@ -15,7 +15,8 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.project.impl.ProjectImpl import com.intellij.serviceContainer.ComponentManagerImpl -import com.intellij.testFramework.junit5.TestApplication +import com.intellij.testFramework.common.cleanApplicationState +import com.intellij.testFramework.common.initTestApplication import com.intellij.testFramework.replaceService import com.mongodb.jbplugin.observability.LogMessage import com.mongodb.jbplugin.observability.LogMessageBuilder @@ -39,7 +40,6 @@ import kotlinx.coroutines.test.TestScope * * @see com.mongodb.jbplugin.observability.LogMessageTest */ -@TestApplication @ExtendWith(IntegrationTestExtension::class) annotation class IntegrationTest @@ -56,6 +56,8 @@ private class IntegrationTestExtension : private lateinit var testScope: TestScope override fun beforeTestExecution(context: ExtensionContext?) { + initTestApplication() + application = ApplicationManager.getApplication() as ApplicationEx project = ProjectImpl( @@ -73,6 +75,8 @@ private class IntegrationTestExtension : application.invokeAndWait({ ProjectManager.getInstance().closeAndDispose(project) }, ModalityState.defaultModalityState()) + + ApplicationManager.getApplication().cleanApplicationState() } override fun supportsParameter( diff --git a/packages/mongodb-access-adapter/datagrip-access-adapter/src/test/kotlin/com/mongodb/jbplugin/accessadapter/datagrip/IntegrationTest.kt b/packages/mongodb-access-adapter/datagrip-access-adapter/src/test/kotlin/com/mongodb/jbplugin/accessadapter/datagrip/IntegrationTest.kt index 97bb8134..0cd70f60 100644 --- a/packages/mongodb-access-adapter/datagrip-access-adapter/src/test/kotlin/com/mongodb/jbplugin/accessadapter/datagrip/IntegrationTest.kt +++ b/packages/mongodb-access-adapter/datagrip-access-adapter/src/test/kotlin/com/mongodb/jbplugin/accessadapter/datagrip/IntegrationTest.kt @@ -18,8 +18,9 @@ import com.intellij.openapi.progress.EmptyProgressIndicator import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.util.Disposer +import com.intellij.testFramework.common.cleanApplicationState +import com.intellij.testFramework.common.initTestApplication import com.intellij.testFramework.junit5.RunInEdt -import com.intellij.testFramework.junit5.TestApplication import com.intellij.util.ui.EDT import com.mongodb.jbplugin.accessadapter.MongoDbDriver import com.mongodb.jbplugin.accessadapter.datagrip.adapter.DataGripMongoDbDriver @@ -50,7 +51,6 @@ enum class MongoDbVersion( * * @see com.mongodb.jbplugin.accessadapter.datagrip.adapter.DataGripMongoDbDriverTest */ -@TestApplication @RunInEdt(allMethods = true, writeIntent = true) @ExtendWith(IntegrationTestExtension::class) @Testcontainers(parallel = false) @@ -76,6 +76,8 @@ internal class IntegrationTestExtension : private val versionKey = "VERSION" override fun beforeAll(context: ExtensionContext?) { + initTestApplication() + val annotation = context!!.requiredTestClass.getAnnotation(IntegrationTest::class.java) val container = MongoDBContainer("mongo:${annotation.mongodb.versionString}-jammy") @@ -162,6 +164,8 @@ internal class IntegrationTestExtension : runBlocking { driver.runCommand("test", Document(mapOf("dropDatabase" to 1)), Unit::class) } + + ApplicationManager.getApplication().cleanApplicationState() } override fun afterAll(context: ExtensionContext?) { From 4d33199bf90bdc34d8ede78085aa55c6cda2a83c Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Wed, 10 Jul 2024 17:54:53 +0200 Subject: [PATCH 32/32] chore: fix references to new files --- .../editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt index 4764448e..85eeb49a 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt @@ -51,7 +51,7 @@ class JavaDriverToolbarVisibilityUiTest { remoteRobot: RemoteRobot, url: MongoDbServerUrl, ) { - remoteRobot.ideaFrame().openFile("/src/main/java/alt/mongodb/javadriver/JavaDriverRepositoryExample.java") + remoteRobot.ideaFrame().openFile("/src/main/java/alt/mongodb/javadriver/JavaDriverRepository.java") val toolbar = remoteRobot.findJavaEditorToolbar() assertTrue(toolbar.dataSources.listValues().contains(javaClass.simpleName)) @@ -63,7 +63,7 @@ class JavaDriverToolbarVisibilityUiTest { remoteRobot: RemoteRobot, url: MongoDbServerUrl, ) { - remoteRobot.ideaFrame().openFile("/src/main/java/alt/mongodb/javadriver/JavaDriverRepositoryExample.java") + remoteRobot.ideaFrame().openFile("/src/main/java/alt/mongodb/javadriver/JavaDriverRepository.java") val toolbar = remoteRobot.findJavaEditorToolbar() assertTrue(toolbar.dataSources.listValues().contains(javaClass.simpleName))

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

!yR1Sc|9i9ui@GJ6zss)>L!Xh8sJ?vD{o2%b~Sd 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 NSWtRq Date: Thu, 4 Jul 2024 16:59:37 +0200 Subject: [PATCH 11/32] chore: clean up, we don't need the loop --- .../jbplugin/dialects/javadriver/IntegrationTest.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt index d3b6aeeb..bd7879f8 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt @@ -15,7 +15,6 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile -import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiUtil import com.intellij.psi.util.childrenOfType import com.intellij.testFramework.PsiTestUtil @@ -120,14 +119,6 @@ internal class IntegrationTestExtension : dumbService.runWhenSmart { val result = runCatching { - val javaPsiFacade = JavaPsiFacade.getInstance(fixture.project) - val searchEverywhere = GlobalSearchScope.everythingScope(fixture.project) - var times = 0 - while (javaPsiFacade.findClass(MONGO_CLIENT, searchEverywhere) == null && times < 10) { - System.err.println("Driver not loaded yet. Waiting for 100ms") - Thread.sleep(100) - times++ - } invocation.proceed() } result.onSuccess { From d23ba1f33577d4652578607901ea8d8123ae1e8b Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 18:02:55 +0200 Subject: [PATCH 12/32] chore: add example from the basic project --- packages/jetbrains-plugin/build.gradle.kts | 1 + .../AbstractMongoDbInspectionBridge.kt | 69 +++++++++++++++++++ .../jbplugin/inspections/MongoDbInspection.kt | 16 +++++ .../inspections/NamespaceCheckInspection.kt | 28 ++++++++ .../src/main/resources/META-INF/plugin.xml | 9 +++ .../messages/InspectionsBundle.properties | 1 + .../javadriver/JavaDriverRepository.java | 22 ++++++ .../JavaDriverRepositoryExample.java | 13 ---- packages/mongodb-dialects/build.gradle.kts | 3 + .../java-driver/build.gradle.kts | 1 + .../javadriver/glossary/JavaDriverDialect.kt | 10 +++ .../glossary/JavaDriverDialectParser.kt | 32 +++++++++ .../glossary/NamespaceExtractorTest.kt | 32 +++++++++ .../com/mongodb/jbplugin/dialects/Dialect.kt | 33 +++++++++ .../mql/components/HasCollectionReference.kt | 18 ++--- .../jbplugin/mql/components/HasFilter.kt | 3 +- 16 files changed, 269 insertions(+), 22 deletions(-) create mode 100644 packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt create mode 100644 packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt create mode 100644 packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt create mode 100644 packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties create mode 100644 packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepository.java delete mode 100644 packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepositoryExample.java create mode 100644 packages/mongodb-dialects/build.gradle.kts create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialect.kt create mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt create mode 100644 packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt diff --git a/packages/jetbrains-plugin/build.gradle.kts b/packages/jetbrains-plugin/build.gradle.kts index 963adb14..a206d895 100644 --- a/packages/jetbrains-plugin/build.gradle.kts +++ b/packages/jetbrains-plugin/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation(project(":packages:mongodb-access-adapter:datagrip-access-adapter")) implementation(project(":packages:mongodb-autocomplete-engine")) implementation(project(":packages:mongodb-dialects")) + implementation(project(":packages:mongodb-dialects:java-driver")) implementation(project(":packages:mongodb-linting-engine")) implementation(project(":packages:mongodb-mql-model")) diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt new file mode 100644 index 00000000..49c75fb5 --- /dev/null +++ b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt @@ -0,0 +1,69 @@ +package com.mongodb.jbplugin.inspections + +import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.util.Key +import com.intellij.psi.* +import com.intellij.psi.util.CachedValue +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager +import com.mongodb.jbplugin.dialects.Dialect +import com.mongodb.jbplugin.mql.Node + +typealias CachedQuery = CachedValue> +typealias QueryCacheKey = Key + +/** + * @param dialect + * @param inspection + */ +abstract class AbstractMongoDbInspectionBridge( + private val dialect: Dialect, + private val inspection: MongoDbInspection, +) : AbstractBaseJavaLocalInspectionTool() { + private val queryKey: QueryCacheKey = + Key.create( + "QueryForDialect${dialect.javaClass.name}", + ) + + override fun buildVisitor( + holder: ProblemsHolder, + isOnTheFly: Boolean, + session: LocalInspectionToolSession, + ): PsiElementVisitor = + object : JavaElementVisitor() { + override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { + dispatchIfValidMongoDbQuery(expression) + } + + override fun visitMethod(method: PsiMethod) { + dispatchIfValidMongoDbQuery(method) + } + + private fun dispatchIfValidMongoDbQuery(expression: PsiElement) { + ApplicationManager.getApplication().runReadAction { + var cachedValue: CachedQuery? = null + if (dialect.parser.canParse(expression)) { + val attachment = dialect.parser.attachment(expression) + attachment.getUserData(queryKey)?.let { +cachedValue = attachment.getUserData(queryKey)!! +} ?: run { +val parsedAst = +CachedValuesManager.getManager(attachment.project).createCachedValue { +val parsedAst = dialect.parser.parse(expression) +CachedValueProvider.Result.create(parsedAst, attachment) +} +attachment.putUserData(queryKey, parsedAst) +cachedValue = parsedAst +} + } + + cachedValue?.let { +inspection.visitMongoDbQuery(holder, cachedValue.value) +} + } + } + } +} diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt new file mode 100644 index 00000000..9d4eaf4f --- /dev/null +++ b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt @@ -0,0 +1,16 @@ +package com.mongodb.jbplugin.inspections + +import com.intellij.codeInspection.ProblemsHolder +import com.intellij.psi.PsiElement +import com.mongodb.jbplugin.mql.Node + +/** + * A MongoDb inspection that works on an MQL AST. + * This inspection is dialect agnostic. + */ +interface MongoDbInspection { + fun visitMongoDbQuery( + problems: ProblemsHolder, + query: Node, + ) +} diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt new file mode 100644 index 00000000..654de5d6 --- /dev/null +++ b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt @@ -0,0 +1,28 @@ +/** + * Represents an inspection. This is a placeholder example and will be removed. + */ + +@file:Suppress("FILE_NAME_MATCH_CLASS") + +package com.mongodb.jbplugin.inspections + +import com.intellij.codeInspection.ProblemsHolder +import com.intellij.psi.PsiElement +import com.mongodb.jbplugin.dialects.javadriver.glossary.JavaDriverDialect +import com.mongodb.jbplugin.mql.Node + +/** The inspection implementation. **/ +object NamespaceCheckInspection : MongoDbInspection { + override fun visitMongoDbQuery( + problems: ProblemsHolder, + query: Node, + ) { + } +} + +/** The connection between a driver and the inspection. **/ +class JavaDriverNamespaceCheckInspectionBridge : + AbstractMongoDbInspectionBridge( + JavaDriverDialect, + NamespaceCheckInspection, + ) diff --git a/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml b/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml index 4bb02a32..d9f4e0de 100644 --- a/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml +++ b/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml @@ -22,6 +22,15 @@ bundle="messages.TelemetryBundle" key="notification.group.name" /> + diff --git a/packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties b/packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties new file mode 100644 index 00000000..7d4023f3 --- /dev/null +++ b/packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties @@ -0,0 +1 @@ +inspection.type.checking=Lol \ No newline at end of file diff --git a/packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepository.java b/packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepository.java new file mode 100644 index 00000000..18fb3186 --- /dev/null +++ b/packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepository.java @@ -0,0 +1,22 @@ +package alt.mongodb.javadriver; + +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.Document; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public class JavaDriverRepository { + private final MongoClient client; + + public JavaDriverRepository(MongoClient client) { + this.client = client; + } + + public FindIterable exampleFind() { + return client.getDatabase("myDatabase") + .getCollection("myCollection") + .find(); + } +} diff --git a/packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepositoryExample.java b/packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepositoryExample.java deleted file mode 100644 index 0aec6101..00000000 --- a/packages/jetbrains-plugin/src/test/resources/project-fixtures/basic-java-project-with-mongodb/src/main/java/alt/mongodb/javadriver/JavaDriverRepositoryExample.java +++ /dev/null @@ -1,13 +0,0 @@ -package alt.mongodb.javadriver; - -import com.mongodb.client.FindIterable; -import com.mongodb.client.MongoClient; -import org.bson.Document; - -public class JavaDriverRepositoryExample { - public FindIterable exampleFind(MongoClient mongoClient) { - return mongoClient.getDatabase("myDatabase") - .getCollection("myCollection") - .find(); - } -} diff --git a/packages/mongodb-dialects/build.gradle.kts b/packages/mongodb-dialects/build.gradle.kts new file mode 100644 index 00000000..67a652ef --- /dev/null +++ b/packages/mongodb-dialects/build.gradle.kts @@ -0,0 +1,3 @@ +dependencies { + implementation(project(":packages:mongodb-mql-model")) +} diff --git a/packages/mongodb-dialects/java-driver/build.gradle.kts b/packages/mongodb-dialects/java-driver/build.gradle.kts index 5070281c..66f49db0 100644 --- a/packages/mongodb-dialects/java-driver/build.gradle.kts +++ b/packages/mongodb-dialects/java-driver/build.gradle.kts @@ -39,6 +39,7 @@ intellij { dependencies { implementation(project(":packages:mongodb-mql-model")) + implementation(project(":packages:mongodb-dialects")) testImplementation("com.jetbrains.intellij.platform:test-framework-junit5:241.15989.155") { exclude("ai.grazie.spell") diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialect.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialect.kt new file mode 100644 index 00000000..b44464e9 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialect.kt @@ -0,0 +1,10 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary + +import com.intellij.psi.PsiElement +import com.mongodb.jbplugin.dialects.Dialect +import com.mongodb.jbplugin.dialects.DialectParser + +object JavaDriverDialect : Dialect { + override val parser: DialectParser + get() = JavaDriverDialectParser +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt new file mode 100644 index 00000000..ab29dd1e --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt @@ -0,0 +1,32 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiMethodCallExpression +import com.intellij.psi.util.PsiTreeUtil +import com.mongodb.jbplugin.dialects.DialectParser +import com.mongodb.jbplugin.mql.Node +import com.mongodb.jbplugin.mql.components.HasCollectionReference + +object JavaDriverDialectParser : DialectParser { + override fun canParse(source: PsiElement): Boolean = + (source as? PsiMethodCallExpression)?.findMongoDbClassReference(source.project) != null + + override fun attachment(source: PsiElement): PsiElement = + (source as PsiMethodCallExpression).findMongoDbClassReference(source.project)!! + + override fun parse(source: PsiElement): Node { + val owningMethod = PsiTreeUtil.getParentOfType(source, PsiMethod::class.java) + ?: return Node(source, emptyList()) + val namespace = NamespaceExtractor.extractNamespace(owningMethod) + + return Node( + source, + listOf( + namespace?.let { +HasCollectionReference(HasCollectionReference.Known(namespace)) +} ?: HasCollectionReference(HasCollectionReference.Unknown), + ), + ) + } +} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt index 317244bc..cf95d775 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt @@ -225,4 +225,36 @@ public final class BookRepository { assertEquals("simple", namespace.database) assertEquals("books", namespace.collection) } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.Document; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public class JavaDriverRepository { + private final MongoClient client; + + public JavaDriverRepository(MongoClient client) { + this.client = client; + } + + public FindIterable exampleFind() { + return client.getDatabase("myDatabase") + .getCollection("myCollection") + .find(); + } +} + """, + ) + fun `extracts from a hardcoded example`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("JavaDriverRepository", "exampleFind") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("myDatabase", namespace.database) + assertEquals("myCollection", namespace.collection) + } } diff --git a/packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt b/packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt new file mode 100644 index 00000000..ccdfc5f2 --- /dev/null +++ b/packages/mongodb-dialects/src/main/kotlin/com/mongodb/jbplugin/dialects/Dialect.kt @@ -0,0 +1,33 @@ +/** + * Represents a dialect, which is a way of writing MongoDb queries. Each dialect must have a + * parser, that will convert the input content to an MQL AST. + */ + +package com.mongodb.jbplugin.dialects + +import com.mongodb.jbplugin.mql.Node + +/** + * Represents the dialect itself, S is the input type of the dialect. It's an opaque type, + * we don't expect knowing anything about it. For any parser that depends on IntelliJ PsiElements, + * S = PsiElement. + * + * @param S + */ +interface Dialect { + val parser: DialectParser +} + +/** + * The parser itself. It only generates an MQL AST from the source, it doesn't analyse + * anything. + * + * @param S + */ +interface DialectParser { + fun canParse(source: S): Boolean + + fun attachment(source: S): S + + fun parse(source: S): Node +} diff --git a/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasCollectionReference.kt b/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasCollectionReference.kt index 3e693243..bd16e006 100644 --- a/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasCollectionReference.kt +++ b/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasCollectionReference.kt @@ -1,27 +1,29 @@ package com.mongodb.jbplugin.mql.components +import com.mongodb.jbplugin.mql.Component import com.mongodb.jbplugin.mql.Namespace /** * @property reference */ -class HasCollectionReference( +data class HasCollectionReference( val reference: CollectionReference, -) { +) : Component { data object Unknown : CollectionReference + sealed interface CollectionReference /** - * @property namespace - */ -data class Known( + * @property namespace + */ + data class Known( val namespace: Namespace, ) : CollectionReference /** - * @property collection - */ -data class OnlyCollection( + * @property collection + */ + data class OnlyCollection( val collection: String, ) : CollectionReference } diff --git a/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasFilter.kt b/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasFilter.kt index 9725a22b..7c684cda 100644 --- a/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasFilter.kt +++ b/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/components/HasFilter.kt @@ -1,5 +1,6 @@ package com.mongodb.jbplugin.mql.components +import com.mongodb.jbplugin.mql.Component import com.mongodb.jbplugin.mql.Node /** @@ -8,4 +9,4 @@ import com.mongodb.jbplugin.mql.Node */ data class HasFilter( val filter: Node, -) +) : Component From ba7755b3e20ba18b7fd7da2ac83a46e77b7bd1b7 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 18:12:12 +0200 Subject: [PATCH 13/32] chore: fix compilation error --- .../AbstractMongoDbInspectionBridge.kt | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt index 49c75fb5..7baf165f 100644 --- a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt +++ b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt @@ -48,21 +48,21 @@ abstract class AbstractMongoDbInspectionBridge( if (dialect.parser.canParse(expression)) { val attachment = dialect.parser.attachment(expression) attachment.getUserData(queryKey)?.let { -cachedValue = attachment.getUserData(queryKey)!! -} ?: run { -val parsedAst = -CachedValuesManager.getManager(attachment.project).createCachedValue { -val parsedAst = dialect.parser.parse(expression) -CachedValueProvider.Result.create(parsedAst, attachment) -} -attachment.putUserData(queryKey, parsedAst) -cachedValue = parsedAst -} + cachedValue = attachment.getUserData(queryKey)!! + } ?: run { + val parsedAst = + CachedValuesManager.getManager(attachment.project).createCachedValue { + val parsedAst = dialect.parser.parse(expression) + CachedValueProvider.Result.create(parsedAst, attachment) + } + attachment.putUserData(queryKey, parsedAst) + cachedValue = parsedAst + } } cachedValue?.let { -inspection.visitMongoDbQuery(holder, cachedValue.value) -} + inspection.visitMongoDbQuery(holder, cachedValue!!.value) + } } } } From 41ae81e5fbcd1ea08e1c0a3962e7fc2f6408f5ee Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Jul 2024 18:45:20 +0200 Subject: [PATCH 14/32] chore: fix name of the file --- .../editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt index 9a68bb03..ce21c536 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/editor/javaEditor/JavaDriverToolbarVisibilityUiTest.kt @@ -14,7 +14,7 @@ class JavaDriverToolbarVisibilityUiTest { @Test @RequiresProject("basic-java-project-with-mongodb") fun `shows the toolbar in a java file with references to the driver`(remoteRobot: RemoteRobot) { - remoteRobot.ideaFrame().openFile("/src/main/java/alt/mongodb/javadriver/JavaDriverRepositoryExample.java") + remoteRobot.ideaFrame().openFile("/src/main/java/alt/mongodb/javadriver/JavaDriverRepository.java") val toolbar = remoteRobot.findJavaEditorToolbar() assertTrue(toolbar.isShowing) } From 82cce347df882f692d639962cce68700fc9d61f2 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Fri, 5 Jul 2024 12:24:54 +0200 Subject: [PATCH 15/32] chore: add clarifying comments, this is a bit complex --- .../javadriver/glossary/NamespaceExtractor.kt | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt index 646f1dfa..774be3aa 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -32,16 +32,17 @@ object NamespaceExtractor { referencesToMongoDbClasses.firstNotNullOf { ref -> val resolution = ref.resolve() ?: return@firstNotNullOf null - // we assume constructor injection - // find in the constructor how it's defined when (resolution) { + // we assume constructor injection + // find in the constructor how it's defined is PsiField -> { return@firstNotNullOf resolveConstructorArgumentReferencesForField( resolution.findContainingClass(), Pair(null, resolution), ) } - + // this can be either a chain call of methods, like getDatabase(..).getCollection() + // with constant values or references to fields is PsiMethod -> { val innerMethodCalls = PsiTreeUtil.findChildrenOfType( resolution, @@ -72,14 +73,13 @@ object NamespaceExtractor { val innerMethodCalls = PsiTreeUtil.findChildrenOfType(query, PsiMethodCallExpression::class.java) innerMethodCalls .mapNotNull { - if (it is PsiMethodCallExpression) { - val maybeNamespace = runCatching { extractNamespaceFromDriverConfigurationMethodChain(it) } - .getOrNull() - if (maybeNamespace != null) { - return maybeNamespace - } + // if we can remove the namespace from this call, return directly + // we don't need to traverse the tree anymore + val maybeNamespace = runCatching { extractNamespaceFromDriverConfigurationMethodChain(it) } + .getOrNull() + if (maybeNamespace != null) { + return maybeNamespace } - it.findMongoDbClassReference(it.project) }.flatMap { when (it.reference?.resolve()) { @@ -108,6 +108,8 @@ object NamespaceExtractor { } } + // at this point, we need to resolve fields or parameters that are not known yet + // but might be resolvable through the actual class or the abstract class val resolvedScopes = constructorAssignments.map { assignment -> currentClass.constructors.firstNotNullOf { @@ -133,12 +135,17 @@ object NamespaceExtractor { val database = resolvedScopes.find { it.first == AssignmentConcept.DATABASE } val client = resolvedScopes.find { it.first == AssignmentConcept.CLIENT } - // it's a collection = expression set up if (collection != null && database == null) { + // if we have a parameter for the collection, but we don't have the database + // assume it's a call to getDatabase().getCollection() return extractNamespaceFromDriverConfigurationMethodChain(collection.second as PsiMethodCallExpression) } else if (collection != null && database != null) { + // if we have a parameter for a collection and database, try to resolve them either + // from the parent constructor or the actual constructor return Namespace(resolveConstant(database.second)!!, resolveConstant(collection.second)!!) } else if (client != null || resolvedScopes.size == 1) { + // if it's not a client and there is only one resolved variable + // guess from the actual constructor val mongodbNamespaceDriverExpression = currentClass.constructors.firstNotNullOfOrNull { val callToSuperConstructor = @@ -219,7 +226,7 @@ object NamespaceExtractor { val callToSuperConstructor = PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { it.methodExpression.text == "super" && - it.methodExpression.resolve() == constructorAssignments.first().constructor + it.methodExpression.resolve() == constructorAssignments.first().constructor } return callToSuperConstructor } From d6fd3d8b8fbb9ee3c0d70ed2ac32f9faf83deeac Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Fri, 5 Jul 2024 12:29:26 +0200 Subject: [PATCH 16/32] chore: simplify tests --- .../javadriver/glossary/NamespaceExtractorTest.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt index cf95d775..0c245955 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt @@ -168,13 +168,9 @@ import static com.mongodb.client.model.Filters.*; public final class BookRepository { private final MongoClient client; - private final String database; - private final String collection; - public BookRepository(MongoClient client, String database, String collection) { + public BookRepository(MongoClient client) { this.client = client; - this.database = database; - this.collection = collection; } public User findBookById(ObjectId id) { @@ -204,13 +200,9 @@ import static com.mongodb.client.model.Filters.*; public final class BookRepository { private final MongoClient client; - private final String database; - private final String collection; - public BookRepository(MongoClient client, String database, String collection) { + public BookRepository(MongoClient client) { this.client = client; - this.database = database; - this.collection = collection; } public User findBookById(ObjectId id) { From 3dddb528c265c127edb5d5201a350b2f424e2b9b Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Fri, 5 Jul 2024 12:48:16 +0200 Subject: [PATCH 17/32] chore: support for constants --- .../javadriver/glossary/Abstraction.kt | 26 +++++++++++- .../javadriver/glossary/NamespaceExtractor.kt | 16 +++---- .../glossary/NamespaceExtractorTest.kt | 42 +++++++++++++++++++ 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt index 49c02085..5a89868a 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt @@ -5,6 +5,7 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary +import com.intellij.lang.jvm.JvmModifier import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope @@ -171,7 +172,8 @@ fun PsiMethodCallExpression.findCurrentReferenceToMongoDbObject(): PsiReference? if (methodExpression.type?.isMongoDbClass(project) == true) { return methodExpression.reference } else if (methodExpression.qualifierExpression is PsiSuperExpression || - methodExpression.qualifierExpression is PsiThisExpression) { + methodExpression.qualifierExpression is PsiThisExpression + ) { val resolution = methodExpression.resolve() if (resolution is PsiField) { return if (resolution.type.isMongoDbClass(project)) resolution.reference else null @@ -181,7 +183,7 @@ fun PsiMethodCallExpression.findCurrentReferenceToMongoDbObject(): PsiReference? } else { if (methodExpression.qualifierExpression is PsiMethodCallExpression) { return (methodExpression.qualifierExpression as PsiMethodCallExpression) -.findCurrentReferenceToMongoDbObject() + .findCurrentReferenceToMongoDbObject() } } @@ -225,3 +227,23 @@ fun PsiMethodCallExpression.findMongoDbClassReference(project: Project): PsiExpr return null } } + +/** + * Resolves to the value of the expression if it can be known at compile time + * or null if it can only be known at runtime. + */ +fun PsiElement.tryToResolveAsConstantString(): String? { + if (this is PsiReferenceExpression) { + val varRef = this.resolve()!! + return varRef.tryToResolveAsConstantString() + } else if (this is PsiLocalVariable) { + return this.initializer?.tryToResolveAsConstantString() + } else if (this is PsiLiteralValue) { + val facade = JavaPsiFacade.getInstance(this.project) + return facade.constantEvaluationHelper.computeConstantExpression(this) as? String + } else if (this is PsiField && this.hasModifier(JvmModifier.FINAL)) { + return this.initializer?.tryToResolveAsConstantString() + } + + return null +} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt index 774be3aa..5955c195 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -7,7 +7,7 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil -import com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions.* +import com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions.CustomQueryDslAbstraction import com.mongodb.jbplugin.mql.Namespace private typealias FoundAssignedPsiFields = List> @@ -142,7 +142,9 @@ object NamespaceExtractor { } else if (collection != null && database != null) { // if we have a parameter for a collection and database, try to resolve them either // from the parent constructor or the actual constructor - return Namespace(resolveConstant(database.second)!!, resolveConstant(collection.second)!!) + val databaseString = database.second.tryToResolveAsConstantString()!! + val collectionString = collection.second.tryToResolveAsConstantString()!! + return Namespace(databaseString, collectionString) } else if (client != null || resolvedScopes.size == 1) { // if it's not a client and there is only one resolved variable // guess from the actual constructor @@ -231,17 +233,11 @@ object NamespaceExtractor { return callToSuperConstructor } - private fun resolveConstant(expression: PsiExpression): String? { - val javaFacade = JavaPsiFacade.getInstance(expression.project) - val constant = javaFacade.constantEvaluationHelper.computeConstantExpression(expression) - return constant as? String - } - private fun extractNamespaceFromDriverConfigurationMethodChain(callExpr: PsiMethodCallExpression): Namespace? { val returnsCollection = callExpr.type?.isMongoDbCollectionClass(callExpr.project) == true val collection: String? = if (returnsCollection) { - resolveConstant(callExpr.argumentList.expressions[0]) + callExpr.argumentList.expressions[0].tryToResolveAsConstantString() } else { null } @@ -260,7 +256,7 @@ object NamespaceExtractor { val database: String? = dbExpression?.let { - resolveConstant(dbExpression.argumentList.expressions[0]) + dbExpression.argumentList.expressions[0].tryToResolveAsConstantString() } if (collection == null && database == null) { diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt index 0c245955..d07d6010 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt @@ -89,6 +89,48 @@ public final class BookRepository extends AbstractRepository { """ import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; +import java.lang.String; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public abstract class AbstractRepository { + private final MongoCollection collection; + + protected AbstractRepository(MongoClient client, String database, String collection) { + this.collection = client.getDatabase(database).getCollection(collection); + } + + protected final T findById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + +public final class BookRepository extends AbstractRepository { + private static final String DATABASE = "staging"; + private static final String COLLECTION = "books"; + + public BookRepository(MongoClient client) { + super(client, DATABASE, COLLECTION); + } + + public User findBookById(ObjectId id) { + return super.findById(id); + } +} + """, + ) + fun `extracts from a complex chain of dependency injection with java constants`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("BookRepository", "findBookById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("staging", namespace.database) + assertEquals("books", namespace.collection) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; import org.bson.types.ObjectId; import static com.mongodb.client.model.Filters.*; From d38bc5b5429b981058beb5e52feaa3190ba6e577 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Fri, 5 Jul 2024 17:41:45 +0200 Subject: [PATCH 18/32] chore: show namespace of query --- .../inlays/JavaDriverQueryNamespaceInlay.kt | 73 +++++++ .../src/main/resources/META-INF/plugin.xml | 9 + .../InspectionsAndInlaysBundle.properties | 1 + .../javadriver/glossary/Abstraction.kt | 3 +- .../javadriver/glossary/NamespaceExtractor.kt | 188 +++++++++--------- .../glossary/NamespaceExtractorTest.kt | 85 ++++++++ 6 files changed, 269 insertions(+), 90 deletions(-) create mode 100644 packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlay.kt create mode 100644 packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlay.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlay.kt new file mode 100644 index 00000000..15deda36 --- /dev/null +++ b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlay.kt @@ -0,0 +1,73 @@ +package com.mongodb.jbplugin.inlays + +import com.intellij.codeInsight.hints.declarative.* +import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiMethodCallExpression +import com.intellij.psi.util.parentOfType +import com.mongodb.jbplugin.dialects.javadriver.glossary.NamespaceExtractor +import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass +import com.mongodb.jbplugin.dialects.javadriver.glossary.isMongoDbCollectionClass + +/** + * This inlay shows for the current query in which namespace is going to run, if possible, + * according to the extraction rules of NamespaceExtractor. + * + * @see NamespaceExtractor + */ +class JavaDriverQueryNamespaceInlay : InlayHintsProvider { + override fun createCollector( + file: PsiFile, + editor: Editor, + ): InlayHintsCollector = QueryNamespaceInlayHintsCollector() + + class QueryNamespaceInlayHintsCollector : SharedBypassCollector { + override fun collectFromElement( + element: PsiElement, + sink: InlayTreeSink, + ) { + val asMethodCall = element as? PsiMethodCallExpression + + val callsAcollection = + asMethodCall + ?.methodExpression + ?.resolve() + ?.findContainingClass() + ?.isMongoDbCollectionClass( + element.project, + ) == true + + val callsSuperClass = + asMethodCall?.findContainingClass() != null && + asMethodCall.findContainingClass().superClass != null && + (asMethodCall.methodExpression.resolve() as? PsiMethod)?.containingClass == + asMethodCall.findContainingClass().superClass + + if (callsAcollection || callsSuperClass) { + val namespace = + runCatching { + NamespaceExtractor.extractNamespace(element) + ?: NamespaceExtractor.extractNamespace(element.parentOfType()!!) + }.getOrNull() + + namespace ?: return + + val documentManager = PsiDocumentManager.getInstance(element.project) + val document = documentManager.getDocument(element.containingFile)!! + val lineOfElement = document.getLineNumber(element.textOffset) + + sink.addPresentation( + EndOfLinePosition(lineOfElement), + emptyList(), + "Inferred MongoDB namespace for this query.", + true, + ) { + text(namespace.toString()) + } + } + } + } +} diff --git a/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml b/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml index d9f4e0de..bfbe035f 100644 --- a/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml +++ b/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml @@ -31,6 +31,15 @@ enabledByDefault="true" level="WARNING" implementationClass="com.mongodb.jbplugin.inspections.JavaDriverNamespaceCheckInspectionBridge"/> + + diff --git a/packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties b/packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties new file mode 100644 index 00000000..75ce4dbc --- /dev/null +++ b/packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties @@ -0,0 +1 @@ +inlay.namespace.name=MongoDB Namespace Inlay \ No newline at end of file diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt index 5a89868a..9682c25d 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt @@ -172,7 +172,8 @@ fun PsiMethodCallExpression.findCurrentReferenceToMongoDbObject(): PsiReference? if (methodExpression.type?.isMongoDbClass(project) == true) { return methodExpression.reference } else if (methodExpression.qualifierExpression is PsiSuperExpression || - methodExpression.qualifierExpression is PsiThisExpression + methodExpression.qualifierExpression is PsiThisExpression || + methodExpression.qualifierExpression == null ) { val resolution = methodExpression.resolve() if (resolution is PsiField) { diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt index 5955c195..3212a1e7 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -7,7 +7,6 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil -import com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions.CustomQueryDslAbstraction import com.mongodb.jbplugin.mql.Namespace private typealias FoundAssignedPsiFields = List> @@ -16,98 +15,111 @@ private typealias FoundAssignedPsiFields = List = - if (customQueryDsl) { - // we need to traverse to the parent method that contains a reference to the mongodb class - // as we don't know who is actually calling the mongodb class, we will need to traverse upwards until - // we find the beginning of the method - val methodCalls = query.collectTypeUntil(PsiMethodCallExpression::class.java, PsiMethod::class.java) - val referencesToMongoDbClasses = - methodCalls.mapNotNull { - it.findCurrentReferenceToMongoDbObject() - } - referencesToMongoDbClasses.firstNotNullOf { ref -> - val resolution = ref.resolve() ?: return@firstNotNullOf null + val outerMethodCalls = query.collectTypeUntil( + PsiMethodCallExpression::class.java, + PsiMethod::class.java + ) + PsiTreeUtil.findChildrenOfType(query, PsiMethodCallExpression::class.java) + val innerMethodCalls = outerMethodCalls - when (resolution) { - // we assume constructor injection - // find in the constructor how it's defined - is PsiField -> { - return@firstNotNullOf resolveConstructorArgumentReferencesForField( - resolution.findContainingClass(), - Pair(null, resolution), - ) - } - // this can be either a chain call of methods, like getDatabase(..).getCollection() - // with constant values or references to fields - is PsiMethod -> { - val innerMethodCalls = PsiTreeUtil.findChildrenOfType( - resolution, - PsiMethodCallExpression::class.java - ) - val resolutions = - innerMethodCalls - .filter { - it.type?.isMongoDbClass(it.project) == true - }.mapNotNull { - runCatching { - extractRelevantFieldsFromChain(it) - }.getOrNull() - }.flatten() - .distinctBy { it.first } - - val containingClass = resolution.findContainingClass() - return@firstNotNullOf resolutions.flatMap { - resolveConstructorArgumentReferencesForField(containingClass, it) - } - } + val referencesToMongoDbClasses = + outerMethodCalls.mapNotNull { + it.findCurrentReferenceToMongoDbObject() + } - else -> - return@firstNotNullOf listOf() + val constructorAssignmentFromConstructorRefs: List = + referencesToMongoDbClasses.flatMap { ref -> + val resolution = ref.resolve() ?: return@flatMap emptyList() + + when (resolution) { + // we assume constructor injection + // find in the constructor how it's defined + is PsiField -> { + return@flatMap resolveConstructorArgumentReferencesForField( + resolution.findContainingClass(), + Pair(null, resolution), + ) + } + // this can be either a chain call of methods, like getDatabase(..).getCollection() + // with constant values or references to fields + is PsiMethod -> { + val innerMethodCalls = PsiTreeUtil.findChildrenOfType( + resolution, + PsiMethodCallExpression::class.java + ) + val resolutions = + innerMethodCalls + .filter { + it.type?.isMongoDbClass(it.project) == true + }.mapNotNull { + runCatching { + extractRelevantFieldsFromChain(it) + }.getOrNull() + }.flatten() + .distinctBy { it.first } + + val containingClass = resolution.findContainingClass() + return@flatMap resolutions.flatMap { + resolveConstructorArgumentReferencesForField(containingClass, it) + } } + + else -> + return@flatMap emptyList() } - } else { - val innerMethodCalls = PsiTreeUtil.findChildrenOfType(query, PsiMethodCallExpression::class.java) - innerMethodCalls - .mapNotNull { - // if we can remove the namespace from this call, return directly - // we don't need to traverse the tree anymore - val maybeNamespace = runCatching { extractNamespaceFromDriverConfigurationMethodChain(it) } - .getOrNull() - if (maybeNamespace != null) { - return maybeNamespace + } + + val constructorAssignmentFromMethodsRefs: List = innerMethodCalls + .mapNotNull { + // if we can remove the namespace from this call, return directly + // we don't need to traverse the tree anymore + val maybeNamespace = runCatching { extractNamespaceFromDriverConfigurationMethodChain(it) } + .getOrNull() + if (maybeNamespace != null) { + return maybeNamespace + } + it.findMongoDbClassReference(it.project) + }.flatMap { + when (it.reference?.resolve()) { + is PsiField -> + resolveConstructorArgumentReferencesForField( + currentClass, + Pair(null, it.reference?.resolve() as PsiField), + ) + + is PsiMethod -> { + val method = it.reference?.resolve() as PsiMethod + if (method.containingClass?.isMongoDbClass(method.project) == true + && it is PsiMethodCallExpression + ) { + return extractNamespaceFromDriverConfigurationMethodChain( + it + ) } - it.findMongoDbClassReference(it.project) - }.flatMap { - when (it.reference?.resolve()) { - is PsiField -> - resolveConstructorArgumentReferencesForField( - currentClass, - Pair(null, it.reference?.resolve() as PsiField), - ) - - is PsiMethod -> { - val method = it.reference?.resolve() as PsiMethod - if (method.containingClass?.isMongoDbClass(method.project) == true) { - return extractNamespaceFromDriverConfigurationMethodChain( - it as PsiMethodCallExpression - ) - } - return PsiTreeUtil - .findChildrenOfType(method, PsiMethodCallExpression::class.java) - .firstNotNullOfOrNull { - extractNamespaceFromDriverConfigurationMethodChain(it) - } + val allInnerExpressions = PsiTreeUtil.findChildrenOfAnyType( + method, + PsiMethodCallExpression::class.java, + PsiExpression::class.java + ) + + val foundNamespace = allInnerExpressions + .filterIsInstance() + .firstNotNullOfOrNull { + extractNamespaceFromDriverConfigurationMethodChain(it) } - else -> emptyList() + if (foundNamespace != null) { + return foundNamespace } + + emptyList() } + + else -> emptyList() + } } + val constructorAssignments = constructorAssignmentFromConstructorRefs + constructorAssignmentFromMethodsRefs // at this point, we need to resolve fields or parameters that are not known yet // but might be resolvable through the actual class or the abstract class val resolvedScopes = @@ -225,12 +237,10 @@ object NamespaceExtractor { it: PsiMethod?, constructorAssignments: List, ): PsiMethodCallExpression? { - val callToSuperConstructor = - PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { - it.methodExpression.text == "super" && - it.methodExpression.resolve() == constructorAssignments.first().constructor - } - return callToSuperConstructor + return PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).firstOrNull { + it.methodExpression.text == "super" && + it.methodExpression.resolve() == constructorAssignments.first().constructor + } } private fun extractNamespaceFromDriverConfigurationMethodChain(callExpr: PsiMethodCallExpression): Namespace? { @@ -259,11 +269,11 @@ object NamespaceExtractor { dbExpression.argumentList.expressions[0].tryToResolveAsConstantString() } - if (collection == null && database == null) { + if (database == null || collection == null) { return null } - return Namespace(database ?: "unk", collection ?: "unk") + return Namespace(database, collection) } private fun extractRelevantAssignments( diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt index d07d6010..eda53ace 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractorTest.kt @@ -54,6 +54,44 @@ import com.mongodb.client.MongoCollection; import org.bson.types.ObjectId; import static com.mongodb.client.model.Filters.*; +public abstract class AbstractRepository { + private final MongoCollection collection; + + protected AbstractRepository(MongoCollection collection) { + this.collection = collection; + } + + protected final T findById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + +public final class UserRepository extends AbstractRepository { + public UserRepository(MongoClient client) { + super(client.getDatabase("production").getCollection("users", User.class)); + } + + public User findUserById(ObjectId id) { + return findById(id); + } +} + """, + ) + fun `extracts from a complex chain of dependency injection without explicit super call`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("UserRepository", "findUserById") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("production", namespace.database) + assertEquals("users", namespace.collection) + } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + public abstract class AbstractRepository { private final MongoCollection collection; @@ -291,4 +329,51 @@ public class JavaDriverRepository { assertEquals("myDatabase", namespace.database) assertEquals("myCollection", namespace.collection) } + + @ParsingTest( + "Repository.java", + """ +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.Document; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +abstract class BaseRepository { + private final MongoClient client; + private final String database; + private final String collection; + + protected BaseRepository(MongoClient client, String database, String collection) { + this.client = client; + this.database = database; + this.collection = collection; + } + + protected final MongoCollection getCollection() { + return client.getDatabase(database).getCollection(collection); + } +} + +public class JavaDriverRepository extends BaseRepository { + public static final String DATABASE = "myDatabase"; + public static final String COLLECTION = "myCollection"; + + public JavaDriverRepository(MongoClient client) { + super(client, DATABASE, COLLECTION); + } + + public FindIterable exampleFind() { + return getCollection().find(); + } +} + """, + ) + fun `extracts from a mms like example`(psiFile: PsiFile) { + val methodToAnalyse = psiFile.getQueryAtMethod("JavaDriverRepository", "exampleFind") + val namespace = NamespaceExtractor.extractNamespace(methodToAnalyse)!! + assertEquals("myDatabase", namespace.database) + assertEquals("myCollection", namespace.collection) + } } From babdee40a2b62108ac981a2d535800e6408ba494 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Mon, 8 Jul 2024 11:57:49 +0200 Subject: [PATCH 19/32] chore: refactored so we don't need to check abstractions --- .../glossary/JavaDriverDialectParser.kt | 9 +- .../{Abstraction.kt => PsiMdbTreeUtil.kt} | 10 +- .../AbstractRepositoryDaoAbstraction.kt | 14 -- .../ConstructorInjectionAbstraction.kt | 18 --- .../abstractions/CustomQueryDslAbstraction.kt | 44 ------ .../DriverInFactoryMethodAbstraction.kt | 49 ------- .../abstractions/RepositoryDaoAbstraction.kt | 20 --- .../AbstractRepositoryDaoAbstractionTest.kt | 45 ------- .../ConstructorInjectionAbstractionTest.kt | 60 --------- .../CustomQueryDslAbstractionTest.kt | 86 ------------ .../DriverInFactoryMethodAbstractionTest.kt | 126 ------------------ .../RepositoryDaoAbstractionTest.kt | 62 --------- 12 files changed, 6 insertions(+), 537 deletions(-) rename packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/{Abstraction.kt => PsiMdbTreeUtil.kt} (96%) delete mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt delete mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt index ab29dd1e..60dcc935 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt @@ -16,16 +16,17 @@ object JavaDriverDialectParser : DialectParser { (source as PsiMethodCallExpression).findMongoDbClassReference(source.project)!! override fun parse(source: PsiElement): Node { - val owningMethod = PsiTreeUtil.getParentOfType(source, PsiMethod::class.java) - ?: return Node(source, emptyList()) + val owningMethod = + PsiTreeUtil.getParentOfType(source, PsiMethod::class.java) + ?: return Node(source, emptyList()) val namespace = NamespaceExtractor.extractNamespace(owningMethod) return Node( source, listOf( namespace?.let { -HasCollectionReference(HasCollectionReference.Known(namespace)) -} ?: HasCollectionReference(HasCollectionReference.Unknown), + HasCollectionReference(HasCollectionReference.Known(namespace)) + } ?: HasCollectionReference(HasCollectionReference.Unknown), ), ) } diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/PsiMdbTreeUtil.kt similarity index 96% rename from packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt rename to packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/PsiMdbTreeUtil.kt index 9682c25d..a8d3c9a3 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/Abstraction.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/PsiMdbTreeUtil.kt @@ -1,6 +1,5 @@ /** - * Defines an interface for all abstractions that will be analysed for the Java - * driver. + * Defines an a set of extension methods to extract metadata from a Psi tree. */ package com.mongodb.jbplugin.dialects.javadriver.glossary @@ -14,13 +13,6 @@ import com.intellij.psi.util.PsiTypesUtil import com.intellij.psi.util.childrenOfType import com.intellij.psi.util.parentOfType -/** - * Represents an abstraction defined in the glossary document. - */ -interface Abstraction { - fun isIn(psiElement: PsiElement): Boolean -} - /** * Helper extension function to get the containing class of any element. * diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt deleted file mode 100644 index f2695d3a..00000000 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstraction.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiElement -import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction -import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass - -object AbstractRepositoryDaoAbstraction : Abstraction { - override fun isIn(psiElement: PsiElement): Boolean { - val containingClass = psiElement.findContainingClass() - containingClass.superClass ?: return false - - return RepositoryDaoAbstraction.isIn(containingClass.superClass?.originalElement!!) - } -} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt deleted file mode 100644 index b0ef2e14..00000000 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstraction.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiElement -import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction -import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass - -object ConstructorInjectionAbstraction : Abstraction { - override fun isIn(psiElement: PsiElement): Boolean { - val containingClass = psiElement.findContainingClass() - if (!AbstractRepositoryDaoAbstraction.isIn(containingClass)) { - return false - } - - return containingClass.constructors.any { - it.text.contains("super(") - } - } -} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt deleted file mode 100644 index 79692d96..00000000 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstraction.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethodCallExpression -import com.intellij.psi.util.PsiTreeUtil -import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction -import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass -import com.mongodb.jbplugin.dialects.javadriver.glossary.isUsingMongoDbClasses - -object CustomQueryDslAbstraction : Abstraction { - override fun isIn(psiElement: PsiElement): Boolean { - if (!AbstractRepositoryDaoAbstraction.isIn(psiElement)) { - return false - } - - val containingClass = psiElement.findContainingClass() - val parentRepositoryClass = containingClass.superClass!! - - val queryLikeMethods = - containingClass.allMethods.filter { - it.name.startsWith("find") - } - - if (queryLikeMethods.isEmpty()) { - return false - } - - return queryLikeMethods.any { method -> - val allMethodCallExpressions = PsiTreeUtil.findChildrenOfType(method, PsiMethodCallExpression::class.java) - allMethodCallExpressions.any { methodCall -> - val methodCallName = methodCall.methodExpression.referenceName ?: return@any false - val isReferencedInParentClass = parentRepositoryClass.allMethods.any { it.name == methodCallName } - - if (isReferencedInParentClass) { - isIn(parentRepositoryClass) - } else { - false - } - } || - DriverInFactoryMethodAbstraction.isIn(method) || - method.isUsingMongoDbClasses() - } - } -} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt deleted file mode 100644 index 16efef14..00000000 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstraction.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiMethodCallExpression -import com.intellij.psi.util.PsiTreeUtil -import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction -import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass -import com.mongodb.jbplugin.dialects.javadriver.glossary.isMongoDbClass - -object DriverInFactoryMethodAbstraction : Abstraction { - override fun isIn(psiElement: PsiElement): Boolean { - val containingClass = psiElement.findContainingClass() - - if (!AbstractRepositoryDaoAbstraction.isIn(containingClass) && !RepositoryDaoAbstraction.isIn(containingClass) - ) { - return false - } - - val allMethodCallExpressions = PsiTreeUtil.findChildrenOfType(psiElement, PsiMethodCallExpression::class.java) - - val callsReturningMongoDbObjects = - allMethodCallExpressions.filter { - it - .type - ?.isMongoDbClass(psiElement.project) == true - } - - val methodsOfPreviousCalls = - callsReturningMongoDbObjects - .mapNotNull { - it.methodExpression.reference?.resolve() - }.filterIsInstance() - - return methodsOfPreviousCalls.any { - val methodCalls = - PsiTreeUtil - .findChildrenOfType(psiElement, PsiMethodCallExpression::class.java) - - methodCalls.any { - it.methodExpression.qualifierExpression - ?.type - ?.isMongoDbClass(it.project) == true && - it.methodExpression.qualifiedName.contains("getDatabase") || - it.methodExpression.qualifiedName.contains("getCollection") - } - } - } -} diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt deleted file mode 100644 index effc63a4..00000000 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstraction.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiElement -import com.mongodb.jbplugin.dialects.javadriver.glossary.Abstraction -import com.mongodb.jbplugin.dialects.javadriver.glossary.findContainingClass -import com.mongodb.jbplugin.dialects.javadriver.glossary.isMongoDbClass - -object RepositoryDaoAbstraction : Abstraction { - override fun isIn(psiElement: PsiElement): Boolean { - val containingClass = psiElement.findContainingClass() - val classNameLowerCase = containingClass.name?.lowercase() ?: return false - - val nameIsValid = classNameLowerCase.endsWith("repository") || classNameLowerCase.endsWith("dao") - if (!nameIsValid) { - return false - } - - return containingClass.allFields.any { it.type.isMongoDbClass(psiElement.project) } - } -} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt deleted file mode 100644 index ad118072..00000000 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/AbstractRepositoryDaoAbstractionTest.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiFile -import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest -import com.mongodb.jbplugin.dialects.javadriver.ParsingTest -import com.mongodb.jbplugin.dialects.javadriver.getClassByName -import org.junit.jupiter.api.Assertions.* - -@IntegrationTest -class AbstractRepositoryDaoAbstractionTest { - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; - -public abstract class AbstractRepository { - private final MongoClient client; -} - -public final class Repository extends AbstractRepository { -} - """, - ) - fun `does apply if the class extends a repository`(psiFile: PsiFile) { - val classToAnalyse = psiFile.getClassByName("Repository") - assertTrue(AbstractRepositoryDaoAbstraction.isIn(classToAnalyse)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; - -public abstract class MyService { -} - -public final class Repository extends MyService { -} - """, - ) - fun `does not apply if the class extends a another class but is not a repository`(psiFile: PsiFile) { - val classToAnalyse = psiFile.getClassByName("Repository") - assertFalse(AbstractRepositoryDaoAbstraction.isIn(classToAnalyse)) - } -} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt deleted file mode 100644 index 3f45890c..00000000 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/ConstructorInjectionAbstractionTest.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiFile -import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest -import com.mongodb.jbplugin.dialects.javadriver.ParsingTest -import com.mongodb.jbplugin.dialects.javadriver.getClassByName -import org.junit.jupiter.api.Assertions.* - -@IntegrationTest -class ConstructorInjectionAbstractionTest { - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; - -abstract class AbstractRepository { - private final MongoClient client; - - protected Repository(MongoClient client) { - this.client = client; - } -} - -public class Repository extends AbstractRepository { - public Repository(MongoClient client) { - super(client); - } -} - """, - ) - fun `does apply if the class depends on a repository super constructor`(psiFile: PsiFile) { - val repository = psiFile.getClassByName("Repository") - assertTrue(ConstructorInjectionAbstraction.isIn(repository)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; - -abstract class AbstractRepository { - private final MongoClient client; - - protected Repository(MongoClient client) { - this.client = client; - } -} - -public class Repository extends AbstractRepository { - public Repository(MongoClient client) { - - } -} - """, - ) - fun `does not apply if does not call super constructor`(psiFile: PsiFile) { - val repository = psiFile.getClassByName("Repository") - assertFalse(ConstructorInjectionAbstraction.isIn(repository)) - } -} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt deleted file mode 100644 index 5b7f735e..00000000 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/CustomQueryDslAbstractionTest.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiFile -import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest -import com.mongodb.jbplugin.dialects.javadriver.ParsingTest -import com.mongodb.jbplugin.dialects.javadriver.getQueryAtMethod -import org.junit.jupiter.api.Assertions.* - -@IntegrationTest -class CustomQueryDslAbstractionTest { - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import org.bson.types.ObjectId; -import static com.mongodb.client.model.Filters.*; - -public abstract class AbstractRepository { - private final MongoCollection collection; - - protected AbstractRepository(MongoCollection collection) { - this.collection = collection; - } - - protected final T findById(ObjectId id) { - return this.getCollection().find(eq("_id", id)).first(); - } - - private MongoCollection getCollection() { - return this.collection; - } -} - -public final class UserRepository extends AbstractRepository { - public UserRepository(MongoClient client) { - super(client.getDatabase("production").getCollection("users", User.class)); - } - - public User findUserById(ObjectId id) { - return super.findById(id); - } -} - """, - ) - fun `applies for a class using methods from an abstract repository with a collection factory`(psiFile: PsiFile) { - val methodToAnalyse = psiFile.getQueryAtMethod("UserRepository", "findUserById") - assertTrue(CustomQueryDslAbstraction.isIn(methodToAnalyse)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import org.bson.types.ObjectId; -import static com.mongodb.client.model.Filters.*; - -public abstract class AbstractRepository { - private final MongoCollection collection; - - protected AbstractRepository(MongoCollection collection) { - this.collection = collection; - } - - protected final T findById(ObjectId id) { - return this.collection.find(eq("_id", id)).first(); - } -} - -public final class UserRepository extends AbstractRepository { - public UserRepository(MongoClient client) { - super(client.getDatabase("production").getCollection("users", User.class)); - } - - public User findUserById(ObjectId id) { - return super.findById(id); - } -} - """, - ) - fun `applies for a class using methods from an abstract repository without a collection factory`(psiFile: PsiFile) { - val methodToAnalyse = psiFile.getQueryAtMethod("UserRepository", "findUserById") - assertTrue(CustomQueryDslAbstraction.isIn(methodToAnalyse)) - } -} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt deleted file mode 100644 index dba94303..00000000 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/DriverInFactoryMethodAbstractionTest.kt +++ /dev/null @@ -1,126 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiFile -import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest -import com.mongodb.jbplugin.dialects.javadriver.ParsingTest -import com.mongodb.jbplugin.dialects.javadriver.getQueryAtMethod -import org.junit.jupiter.api.Assertions.* - -@IntegrationTest -class DriverInFactoryMethodAbstractionTest { - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; - -public abstract class AbstractRepository { - private final MongoClient client; - - protected MongoClient getClient() { - return client; - } -} - -public class Repository extends AbstractRepository { - public Repository(MongoClient client) { - super(client); - } - - public Document findAll() { - return getClient().getDatabase("my").getCollection("coll").find().toList(); - } -} - """, - ) - fun `does detect a factory method for a client`(psiFile: PsiFile) { - val query = psiFile.getQueryAtMethod("Repository", "findAll") - assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoDatabase; - -public abstract class AbstractRepository { - private final MongoDatabase db; - - protected MongoDatabase getDatabase() { - return db; - } -} - -public class Repository extends AbstractRepository { - public Repository(MongoDatabase db) { - super(db); - } - - public Document findAll() { - return getDatabase().getCollection("coll").find().toList(); - } -} - """, - ) - fun `does detect a factory method for a database`(psiFile: PsiFile) { - val query = psiFile.getQueryAtMethod("Repository", "findAll") - assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoCollection; - -public abstract class AbstractRepository { - private final MongoCollection collection; - - protected MongoCollection getCollection() { - return collection; - } -} - -public class Repository extends AbstractRepository { - public Repository(MongoCollection collection) { - super(collection); - } - - public Document findAll() { - return getCollection().find().toList(); - } -} - """, - ) - fun `does detect a factory method for a collection`(psiFile: PsiFile) { - val query = psiFile.getQueryAtMethod("Repository", "findAll") - assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; - - -public class Repository extends AbstractRepository { - private final MongoClient client; - - public Repository(MongoClient client) { - this.client = client; - } - - public MongoCollection getCollection() { - return client.getDatabase("myDb").getCollection("myColl"); - } - - public Document findAll() { - return getCollection().find().toList(); - } -} - """, - ) - fun `does detect a factory method in the same class`(psiFile: PsiFile) { - val query = psiFile.getQueryAtMethod("Repository", "findAll") - assertTrue(DriverInFactoryMethodAbstraction.isIn(query)) - } -} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt deleted file mode 100644 index c68adec0..00000000 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/abstractions/RepositoryDaoAbstractionTest.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.mongodb.jbplugin.dialects.javadriver.glossary.abstractions - -import com.intellij.psi.PsiFile -import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest -import com.mongodb.jbplugin.dialects.javadriver.ParsingTest -import org.junit.jupiter.api.Assertions.* - -@IntegrationTest -class RepositoryDaoAbstractionTest { - @ParsingTest( - "Repository.java", - """ -public final class Repository { -} - """, - ) - fun `does not apply if the class is named repository but it does not use the driver`(psiFile: PsiFile) { - assertFalse(RepositoryDaoAbstraction.isIn(psiFile)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoClient; - -public final class Repository { - private final MongoClient client; -} - """, - ) - fun `does apply if the class contains references to the client`(psiFile: PsiFile) { - assertTrue(RepositoryDaoAbstraction.isIn(psiFile)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoDatabase; - -public final class Repository { - private final MongoDatabase database; -} - """, - ) - fun `does apply if the class contains references to a database`(psiFile: PsiFile) { - assertTrue(RepositoryDaoAbstraction.isIn(psiFile)) - } - - @ParsingTest( - "Repository.java", - """ -import com.mongodb.client.MongoCollection; - -public final class Repository { - private final MongoCollection collection; -} - """, - ) - fun `does apply if the class contains references to a collection`(psiFile: PsiFile) { - assertTrue(RepositoryDaoAbstraction.isIn(psiFile)) - } -} From 2507f6a5f4901b37efd62638b46ca769621a27d1 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Mon, 8 Jul 2024 15:23:53 +0200 Subject: [PATCH 20/32] chore: add more tests and cleanup --- .../glossary/JavaDriverDialectParser.kt | 4 +- .../javadriver/glossary/NamespaceExtractor.kt | 35 ++--- .../javadriver/glossary/PsiMdbTreeUtil.kt | 19 ++- .../dialects/javadriver/IntegrationTest.kt | 30 ++-- .../glossary/JavaDriverDialectParserTest.kt | 135 ++++++++++++++++++ .../glossary/JavaDriverDialectTest.kt | 11 ++ 6 files changed, 201 insertions(+), 33 deletions(-) create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt create mode 100644 packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectTest.kt diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt index 60dcc935..60fff091 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParser.kt @@ -10,10 +10,10 @@ import com.mongodb.jbplugin.mql.components.HasCollectionReference object JavaDriverDialectParser : DialectParser { override fun canParse(source: PsiElement): Boolean = - (source as? PsiMethodCallExpression)?.findMongoDbClassReference(source.project) != null + (source as? PsiMethodCallExpression)?.findMongoDbCollectionReference(source.project) != null override fun attachment(source: PsiElement): PsiElement = - (source as PsiMethodCallExpression).findMongoDbClassReference(source.project)!! + (source as PsiMethodCallExpression).findMongoDbCollectionReference(source.project)!! override fun parse(source: PsiElement): Node { val owningMethod = diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt index 3212a1e7..bead93b4 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/NamespaceExtractor.kt @@ -6,7 +6,7 @@ package com.mongodb.jbplugin.dialects.javadriver.glossary import com.intellij.openapi.project.Project import com.intellij.psi.* -import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.PsiTreeUtil.* import com.mongodb.jbplugin.mql.Namespace private typealias FoundAssignedPsiFields = List> @@ -16,14 +16,13 @@ object NamespaceExtractor { fun extractNamespace(query: PsiElement): Namespace? { val currentClass = query.findContainingClass() - val outerMethodCalls = query.collectTypeUntil( + val allMethodCallsInMethod = query.collectTypeUntil( PsiMethodCallExpression::class.java, PsiMethod::class.java - ) + PsiTreeUtil.findChildrenOfType(query, PsiMethodCallExpression::class.java) - val innerMethodCalls = outerMethodCalls + ) + findChildrenOfType(query, PsiMethodCallExpression::class.java) val referencesToMongoDbClasses = - outerMethodCalls.mapNotNull { + allMethodCallsInMethod.mapNotNull { it.findCurrentReferenceToMongoDbObject() } @@ -43,7 +42,7 @@ object NamespaceExtractor { // this can be either a chain call of methods, like getDatabase(..).getCollection() // with constant values or references to fields is PsiMethod -> { - val innerMethodCalls = PsiTreeUtil.findChildrenOfType( + val innerMethodCalls = findChildrenOfType( resolution, PsiMethodCallExpression::class.java ) @@ -69,7 +68,7 @@ object NamespaceExtractor { } } - val constructorAssignmentFromMethodsRefs: List = innerMethodCalls + val constructorAssignmentFromMethodsRefs: List = allMethodCallsInMethod .mapNotNull { // if we can remove the namespace from this call, return directly // we don't need to traverse the tree anymore @@ -96,7 +95,7 @@ object NamespaceExtractor { it ) } - val allInnerExpressions = PsiTreeUtil.findChildrenOfAnyType( + val allInnerExpressions = findChildrenOfAnyType( method, PsiMethodCallExpression::class.java, PsiExpression::class.java @@ -123,8 +122,8 @@ object NamespaceExtractor { // at this point, we need to resolve fields or parameters that are not known yet // but might be resolvable through the actual class or the abstract class val resolvedScopes = - constructorAssignments.map { assignment -> - currentClass.constructors.firstNotNullOf { + constructorAssignments.mapNotNull { assignment -> + currentClass.constructors.firstNotNullOfOrNull { if (assignment.parameter != null) { val callToSuperConstructor = getCallToSuperConstructor(it, constructorAssignments) @@ -133,10 +132,12 @@ object NamespaceExtractor { assignment.parameter, ) - Pair( - assignment.concept, - callToSuperConstructor!!.argumentList.expressions[indexOfParameter], - ) + runCatching { + Pair( + assignment.concept, + callToSuperConstructor!!.argumentList.expressions[indexOfParameter], + ) + }.getOrNull() } else { Pair(assignment.concept, assignment.resolutionExpression) } @@ -163,7 +164,7 @@ object NamespaceExtractor { val mongodbNamespaceDriverExpression = currentClass.constructors.firstNotNullOfOrNull { val callToSuperConstructor = - PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).first { + findChildrenOfType(it, PsiMethodCallExpression::class.java).first { it.methodExpression.text == "super" && it.methodExpression.resolve() == constructorAssignments.first().constructor } @@ -189,7 +190,7 @@ object NamespaceExtractor { ): List { return containingClass.constructors.flatMap { constructor -> val assignments = - PsiTreeUtil.findChildrenOfType(constructor, PsiAssignmentExpression::class.java) + findChildrenOfType(constructor, PsiAssignmentExpression::class.java) val fieldAssignment = assignments.find { assignment -> assignment.lExpression.reference?.resolve() == field.second @@ -237,7 +238,7 @@ object NamespaceExtractor { it: PsiMethod?, constructorAssignments: List, ): PsiMethodCallExpression? { - return PsiTreeUtil.findChildrenOfType(it, PsiMethodCallExpression::class.java).firstOrNull { + return findChildrenOfType(it, PsiMethodCallExpression::class.java).firstOrNull { it.methodExpression.text == "super" && it.methodExpression.resolve() == constructorAssignments.first().constructor } diff --git a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/PsiMdbTreeUtil.kt b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/PsiMdbTreeUtil.kt index a8d3c9a3..84a38866 100644 --- a/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/PsiMdbTreeUtil.kt +++ b/packages/mongodb-dialects/java-driver/src/main/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/PsiMdbTreeUtil.kt @@ -205,7 +205,7 @@ fun PsiElement.collectTypeUntil( } /** - * Returns the reference to a MongoDB driver call. + * Returns the reference to any MongoDB driver call. * * @param project */ @@ -221,6 +221,23 @@ fun PsiMethodCallExpression.findMongoDbClassReference(project: Project): PsiExpr } } +/** + * Returns the reference to a MongoDB driver collection. + * + * @param project + */ +fun PsiMethodCallExpression.findMongoDbCollectionReference(project: Project): PsiExpression? { + if (methodExpression.type?.isMongoDbCollectionClass(project) == true) { + return methodExpression + } else if (methodExpression.qualifierExpression is PsiMethodCallExpression) { + return (methodExpression.qualifierExpression as PsiMethodCallExpression).findMongoDbCollectionReference(project) + } else if (methodExpression.qualifierExpression?.reference?.resolve() is PsiField) { + return methodExpression.qualifierExpression + } else { + return null + } +} + /** * Resolves to the value of the expression if it can be known at compile time * or null if it can only be known at runtime. diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt index bd7879f8..79c4a647 100644 --- a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/IntegrationTest.kt @@ -29,8 +29,6 @@ import java.util.concurrent.atomic.AtomicReference import kotlin.io.path.Path import kotlin.io.path.absolutePathString -private const val MONGO_CLIENT = "com.mongodb.client.MongoClient" - @Retention(AnnotationRetention.RUNTIME) @Test annotation class ParsingTest( @@ -75,17 +73,19 @@ internal class IntegrationTestExtension : context.getStore(namespace).put(testFixtureKey, testFixture) testFixture.setUp() - ApplicationManager.getApplication().invokeLater { + ApplicationManager.getApplication().invokeAndWait { if (!JavaLibraryUtil.hasLibraryJar(testFixture.module, "org.mongodb:mongodb-driver-sync:5.1.1")) { - PsiTestUtil.addProjectLibrary( - testFixture.module, - "mongodb-driver-sync", - listOf( - Path( - "src/test/resources/mongodb-driver-sync-5.1.1.jar", - ).toAbsolutePath().toString(), - ), - ) + runCatching { + PsiTestUtil.addProjectLibrary( + testFixture.module, + "mongodb-driver-sync", + listOf( + Path( + "src/test/resources/mongodb-driver-sync-5.1.1.jar", + ).toAbsolutePath().toString(), + ), + ) + } } } @@ -135,7 +135,11 @@ internal class IntegrationTestExtension : Thread.sleep(1) } - throwable.get()?.let { throw it } + throwable.get()?.let { + System.err.println(it.message) + it.printStackTrace(System.err) + throw it + } } override fun afterAll(context: ExtensionContext) { diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt new file mode 100644 index 00000000..ba12d063 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectParserTest.kt @@ -0,0 +1,135 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary + +import com.intellij.psi.PsiFile +import com.intellij.psi.PsiReferenceExpression +import com.intellij.psi.util.PsiTreeUtil +import com.mongodb.jbplugin.dialects.javadriver.IntegrationTest +import com.mongodb.jbplugin.dialects.javadriver.ParsingTest +import com.mongodb.jbplugin.dialects.javadriver.getQueryAtMethod +import com.mongodb.jbplugin.mql.components.HasCollectionReference +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue + +@IntegrationTest +class JavaDriverDialectParserTest { + @ParsingTest( + fileName = "Repository.java", + value = """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public final class Repository { + private final MongoCollection collection; + + public Repository(MongoClient client) { + this.collection = client.getDatabase("simple").getCollection("books"); + } + + public Document findBookById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + """, + ) + fun `can parse a mongodb query using the driver`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findBookById") + assertTrue(JavaDriverDialectParser.canParse(query)) + } + + @ParsingTest( + fileName = "Repository.java", + value = """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public final class Repository { + private final MongoCollection collection; + + public Repository(MongoClient client) { + this.collection = client.getDatabase("simple").getCollection("books"); + } + + public Document findBookById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + """, + ) + fun `the attachment happens in the collection method`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findBookById") + val collectionReference = + PsiTreeUtil + .findChildrenOfType(query, PsiReferenceExpression::class.java) + .first { it.text.endsWith("collection") } + + assertTrue(JavaDriverDialectParser.canParse(query)) + assertEquals(collectionReference, JavaDriverDialectParser.attachment(query)) + } + + @ParsingTest( + fileName = "Repository.java", + value = """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public final class Repository { + private final MongoCollection collection; + + public Repository(MongoClient client) { + this.collection = client.getDatabase("simple").getCollection("books"); + } + + public Document findBookById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + """, + ) + fun `can extract the namespace of a query`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findBookById") + val parsedQuery = JavaDriverDialect.parser.parse(query) + + val knownReference = parsedQuery.component()?.reference as HasCollectionReference.Known + val namespace = knownReference.namespace + + assertEquals("simple", namespace.database) + assertEquals("books", namespace.collection) + } + + @ParsingTest( + fileName = "Repository.java", + value = """ +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public final class Repository { + private final MongoCollection collection; + + public Repository(MongoCollection collection) { + this.collection = collection; + } + + public Document findBookById(ObjectId id) { + return this.collection.find(eq("_id", id)).first(); + } +} + """, + ) + fun `handles gracefully when the namespace is unknown`(psiFile: PsiFile) { + val query = psiFile.getQueryAtMethod("Repository", "findBookById") + val parsedQuery = JavaDriverDialect.parser.parse(query) + + val unknownReference = + parsedQuery.component()?.reference as HasCollectionReference.Unknown + + assertEquals(HasCollectionReference.Unknown, unknownReference) + } +} diff --git a/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectTest.kt b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectTest.kt new file mode 100644 index 00000000..984722e1 --- /dev/null +++ b/packages/mongodb-dialects/java-driver/src/test/kotlin/com/mongodb/jbplugin/dialects/javadriver/glossary/JavaDriverDialectTest.kt @@ -0,0 +1,11 @@ +package com.mongodb.jbplugin.dialects.javadriver.glossary + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class JavaDriverDialectTest { + @Test + fun `returns the correct parser`() { + assertEquals(JavaDriverDialectParser, JavaDriverDialect.parser) + } +} From cc99300d643bf810bc0cc52cdad3a3a2220284b9 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Mon, 8 Jul 2024 15:36:22 +0200 Subject: [PATCH 21/32] chore: remove unused code --- .../AbstractMongoDbInspectionBridge.kt | 69 ------------------- .../jbplugin/inspections/MongoDbInspection.kt | 16 ----- .../inspections/NamespaceCheckInspection.kt | 28 -------- .../src/main/resources/META-INF/plugin.xml | 10 --- 4 files changed, 123 deletions(-) delete mode 100644 packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt delete mode 100644 packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt delete mode 100644 packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt deleted file mode 100644 index 7baf165f..00000000 --- a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/AbstractMongoDbInspectionBridge.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.mongodb.jbplugin.inspections - -import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool -import com.intellij.codeInspection.LocalInspectionToolSession -import com.intellij.codeInspection.ProblemsHolder -import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.util.Key -import com.intellij.psi.* -import com.intellij.psi.util.CachedValue -import com.intellij.psi.util.CachedValueProvider -import com.intellij.psi.util.CachedValuesManager -import com.mongodb.jbplugin.dialects.Dialect -import com.mongodb.jbplugin.mql.Node - -typealias CachedQuery = CachedValue> -typealias QueryCacheKey = Key - -/** - * @param dialect - * @param inspection - */ -abstract class AbstractMongoDbInspectionBridge( - private val dialect: Dialect, - private val inspection: MongoDbInspection, -) : AbstractBaseJavaLocalInspectionTool() { - private val queryKey: QueryCacheKey = - Key.create( - "QueryForDialect${dialect.javaClass.name}", - ) - - override fun buildVisitor( - holder: ProblemsHolder, - isOnTheFly: Boolean, - session: LocalInspectionToolSession, - ): PsiElementVisitor = - object : JavaElementVisitor() { - override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { - dispatchIfValidMongoDbQuery(expression) - } - - override fun visitMethod(method: PsiMethod) { - dispatchIfValidMongoDbQuery(method) - } - - private fun dispatchIfValidMongoDbQuery(expression: PsiElement) { - ApplicationManager.getApplication().runReadAction { - var cachedValue: CachedQuery? = null - if (dialect.parser.canParse(expression)) { - val attachment = dialect.parser.attachment(expression) - attachment.getUserData(queryKey)?.let { - cachedValue = attachment.getUserData(queryKey)!! - } ?: run { - val parsedAst = - CachedValuesManager.getManager(attachment.project).createCachedValue { - val parsedAst = dialect.parser.parse(expression) - CachedValueProvider.Result.create(parsedAst, attachment) - } - attachment.putUserData(queryKey, parsedAst) - cachedValue = parsedAst - } - } - - cachedValue?.let { - inspection.visitMongoDbQuery(holder, cachedValue!!.value) - } - } - } - } -} diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt deleted file mode 100644 index 9d4eaf4f..00000000 --- a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/MongoDbInspection.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.mongodb.jbplugin.inspections - -import com.intellij.codeInspection.ProblemsHolder -import com.intellij.psi.PsiElement -import com.mongodb.jbplugin.mql.Node - -/** - * A MongoDb inspection that works on an MQL AST. - * This inspection is dialect agnostic. - */ -interface MongoDbInspection { - fun visitMongoDbQuery( - problems: ProblemsHolder, - query: Node, - ) -} diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt deleted file mode 100644 index 654de5d6..00000000 --- a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/inspections/NamespaceCheckInspection.kt +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Represents an inspection. This is a placeholder example and will be removed. - */ - -@file:Suppress("FILE_NAME_MATCH_CLASS") - -package com.mongodb.jbplugin.inspections - -import com.intellij.codeInspection.ProblemsHolder -import com.intellij.psi.PsiElement -import com.mongodb.jbplugin.dialects.javadriver.glossary.JavaDriverDialect -import com.mongodb.jbplugin.mql.Node - -/** The inspection implementation. **/ -object NamespaceCheckInspection : MongoDbInspection { - override fun visitMongoDbQuery( - problems: ProblemsHolder, - query: Node, - ) { - } -} - -/** The connection between a driver and the inspection. **/ -class JavaDriverNamespaceCheckInspectionBridge : - AbstractMongoDbInspectionBridge( - JavaDriverDialect, - NamespaceCheckInspection, - ) diff --git a/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml b/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml index bfbe035f..6a3a7dab 100644 --- a/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml +++ b/packages/jetbrains-plugin/src/main/resources/META-INF/plugin.xml @@ -22,16 +22,6 @@ bundle="messages.TelemetryBundle" key="notification.group.name" /> - - Date: Mon, 8 Jul 2024 16:49:11 +0200 Subject: [PATCH 22/32] chore: make sure nodes support valid components --- .../kotlin/com/mongodb/jbplugin/mql/Node.kt | 2 + .../com/mongodb/jbplugin/mql/NodeTest.kt | 54 +++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/Node.kt b/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/Node.kt index 017972cb..fa0ac08e 100644 --- a/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/Node.kt +++ b/packages/mongodb-mql-model/src/main/kotlin/com/mongodb/jbplugin/mql/Node.kt @@ -37,6 +37,8 @@ data class Node( ) { inline fun component(): C? = components.firstOrNull { it is C } as C? + fun component(withClass: Class): C? = components.firstOrNull { withClass.isInstance(it) } as C? + inline fun components(): List = components.filterIsInstance() inline fun hasComponent(): Boolean = component() != null diff --git a/packages/mongodb-mql-model/src/test/kotlin/com/mongodb/jbplugin/mql/NodeTest.kt b/packages/mongodb-mql-model/src/test/kotlin/com/mongodb/jbplugin/mql/NodeTest.kt index 51c234a0..5f0cd662 100644 --- a/packages/mongodb-mql-model/src/test/kotlin/com/mongodb/jbplugin/mql/NodeTest.kt +++ b/packages/mongodb-mql-model/src/test/kotlin/com/mongodb/jbplugin/mql/NodeTest.kt @@ -1,9 +1,10 @@ package com.mongodb.jbplugin.mql -import com.mongodb.jbplugin.mql.components.HasFieldReference -import com.mongodb.jbplugin.mql.components.Named +import com.mongodb.jbplugin.mql.components.* import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.MethodSource class NodeTest { @Test @@ -27,9 +28,14 @@ class NodeTest { val node = Node( null, - listOf(HasFieldReference(HasFieldReference.Known("field1")), HasFieldReference(HasFieldReference.Known( -"field2" -))), + listOf( + HasFieldReference(HasFieldReference.Known("field1")), + HasFieldReference( + HasFieldReference.Known( + "field2", + ), + ), + ), ) val fieldReferences = node.components() @@ -60,4 +66,42 @@ class NodeTest { assertFalse(hasNamedComponent) } + + @MethodSource("validComponents") + @ParameterizedTest + fun `does support the following component`( + component: Component, + componentClass: Class, + ) { + val node = + Node( + null, + listOf( + component, + ), + ) + + assertNotNull(node.component(componentClass)) + } + + companion object { + @JvmStatic + fun validComponents(): Array> = + arrayOf( + arrayOf(HasChildren(emptyList()), HasChildren::class.java), + arrayOf(HasCollectionReference(HasCollectionReference.Unknown), HasCollectionReference::class.java), + arrayOf(HasCollectionReference(HasCollectionReference.Known(Namespace("db", "coll"))), + HasCollectionReference::class.java), + arrayOf(HasCollectionReference(HasCollectionReference.OnlyCollection("coll")), + HasCollectionReference::class.java), + arrayOf(HasFieldReference(HasFieldReference.Unknown), HasFieldReference::class.java), + arrayOf(HasFieldReference(HasFieldReference.Known("abc")), HasFieldReference::class.java), + arrayOf(HasFilter(Node(null, emptyList())), HasFilter::class.java), + arrayOf(HasValueReference(HasValueReference.Unknown), HasValueReference::class.java), + arrayOf(HasValueReference(HasValueReference.Constant(123, "int")), HasValueReference::class.java), + arrayOf(HasValueReference(HasValueReference.Runtime("int")), HasValueReference::class.java), + arrayOf(HasValueReference(HasValueReference.Unknown), HasValueReference::class.java), + arrayOf(Named("abc"), Named::class.java), + ) + } } From 5cbccbfa9178e2a53910d861a837ef8f4d1b317f Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Mon, 8 Jul 2024 17:54:23 +0200 Subject: [PATCH 23/32] chore: add inlay tests --- .gitignore | 3 +- .../jbplugin/editor/EditorToolbarDecorator.kt | 9 +- .../InspectionsAndInlaysBundle.properties | 1 + .../messages/InspectionsBundle.properties | 1 - .../fixtures/CodeInsightTestExtensions.kt | 184 ++++++++++++++++++ .../fixtures/IntegrationTestExtensions.kt | 2 +- .../JavaDriverQueryNamespaceInlayTest.kt | 42 ++++ .../resources/mongodb-driver-sync-5.1.1.jar | Bin 0 -> 153556 bytes 8 files changed, 238 insertions(+), 4 deletions(-) delete mode 100644 packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties create mode 100644 packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt create mode 100644 packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlayTest.kt create mode 100644 packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar diff --git a/.gitignore b/.gitignore index 7df3e7fd..8488273b 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,5 @@ FAKE_BROWSER_OUTPUT /.kotlin # We need the driver for tests -!packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar \ No newline at end of file +!packages/mongodb-dialects/java-driver/src/test/resources/mongodb-driver-sync-5.1.1.jar +!packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar \ No newline at end of file diff --git a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/editor/EditorToolbarDecorator.kt b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/editor/EditorToolbarDecorator.kt index 9586cc87..cc4f0c6f 100644 --- a/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/editor/EditorToolbarDecorator.kt +++ b/packages/jetbrains-plugin/src/main/kotlin/com/mongodb/jbplugin/editor/EditorToolbarDecorator.kt @@ -41,7 +41,14 @@ class EditorToolbarDecorator : EditorFactoryListener { private fun isEditingJavaFileWithMongoDbRelatedCode(): Boolean { val project = editor.project ?: return false - val psiFile = PsiManager.getInstance(project).findFile(editor.virtualFile) ?: return false + val psiFileResult = runCatching { PsiManager.getInstance(project).findFile(editor.virtualFile) } + + if (psiFileResult.isFailure) { + return false + } + + val psiFile = psiFileResult.getOrThrow()!! + if (psiFile.language != JavaLanguage.INSTANCE) { return false } diff --git a/packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties b/packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties index 75ce4dbc..3f777388 100644 --- a/packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties +++ b/packages/jetbrains-plugin/src/main/resources/messages/InspectionsAndInlaysBundle.properties @@ -1 +1,2 @@ +notification.group.inspection.results=MongoDB Inspection Results inlay.namespace.name=MongoDB Namespace Inlay \ No newline at end of file diff --git a/packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties b/packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties deleted file mode 100644 index 7d4023f3..00000000 --- a/packages/jetbrains-plugin/src/main/resources/messages/InspectionsBundle.properties +++ /dev/null @@ -1 +0,0 @@ -inspection.type.checking=Lol \ No newline at end of file diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt new file mode 100644 index 00000000..2a0b4894 --- /dev/null +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/CodeInsightTestExtensions.kt @@ -0,0 +1,184 @@ +/** + * JUnit extension to run tests that depend on code insights without building the whole IDE. + * They are more lightweight than UI tests. + */ + +package com.mongodb.jbplugin.fixtures + +import com.intellij.java.library.JavaLibraryUtil +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.DumbService +import com.intellij.openapi.project.Project +import com.intellij.openapi.project.guessProjectDir +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiFile +import com.intellij.testFramework.PsiTestUtil +import com.intellij.testFramework.fixtures.CodeInsightTestFixture +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory +import com.intellij.testFramework.fixtures.impl.TempDirTestFixtureImpl +import org.intellij.lang.annotations.Language +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.* +import java.lang.reflect.Method +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicReference +import kotlin.io.path.Path +import kotlin.io.path.absolutePathString + +/** + * Annotation to add to the test function. + */ +@Retention(AnnotationRetention.RUNTIME) +@Test +annotation class ParsingTest( + val fileName: String, + @Language("java") val value: String, +) + +/** + * Annotation to be used in the test, at the class level. + * + * @see com.mongodb.jbplugin.accessadapter.datagrip.adapter.DataGripMongoDbDriverTest + */ +@ExtendWith(CodeInsightTestExtension::class) +annotation class CodeInsightTest + +/** + * Extension implementation. Must not be used directly. + */ +internal class CodeInsightTestExtension : + BeforeAllCallback, + AfterAllCallback, + BeforeEachCallback, + InvocationInterceptor, + ParameterResolver { + private val namespace = ExtensionContext.Namespace.create(CodeInsightTestExtension::class.java) + private val testFixtureKey = "TESTFIXTURE" + private val testPathKey = "TESTPATH" + + override fun beforeAll(context: ExtensionContext) { + val projectFixture = + IdeaTestFixtureFactory + .getFixtureFactory() + .createLightFixtureBuilder(context.requiredTestClass.simpleName) + .fixture + + val tempDirTestFixtureImpl = TempDirTestFixtureImpl() + val testFixture = + IdeaTestFixtureFactory + .getFixtureFactory() + .createCodeInsightFixture( + projectFixture, + tempDirTestFixtureImpl, + ).apply { + testDataPath = tempDirTestFixtureImpl.tempDirPath +} + + context.getStore(namespace).put(testFixtureKey, testFixture) + testFixture.setUp() + + ApplicationManager.getApplication().invokeAndWait { + if (!JavaLibraryUtil.hasLibraryJar(testFixture.module, "org.mongodb:mongodb-driver-sync:5.1.1")) { + runCatching { + PsiTestUtil.addProjectLibrary( + testFixture.module, + "mongodb-driver-sync", + listOf( + Path( + "src/test/resources/mongodb-driver-sync-5.1.1.jar", + ).toAbsolutePath().toString(), + ), + ) + } + } + } + + PsiTestUtil.addSourceRoot(testFixture.module, testFixture.project.guessProjectDir()!!) + val tmpRootDir = testFixture.tempDirFixture.getFile(".")!! + PsiTestUtil.addSourceRoot(testFixture.module, tmpRootDir) + context.getStore(namespace).put(testPathKey, tmpRootDir.path) + } + + override fun beforeEach(context: ExtensionContext) { + val fixture = context.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + val modulePath = context.getStore(namespace).get(testPathKey).toString() + + ApplicationManager.getApplication().invokeAndWait { + val parsingTest = context.requiredTestMethod.getAnnotation(ParsingTest::class.java) + val fileName = Path(modulePath, "src", "main", "java", parsingTest.fileName).absolutePathString() + + fixture.configureByText( + fileName, + parsingTest.value, + ) + } + } + + override fun interceptTestMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext, + ) { + val throwable: AtomicReference = AtomicReference(null) + val finished = AtomicBoolean(false) + + val fixture = extensionContext.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + val dumbService = fixture.project.getService(DumbService::class.java) + dumbService.runWhenSmart { + val result = + runCatching { + invocation.proceed() + } + result.onSuccess { + finished.set(true) + } + + result.onFailure { + finished.set(true) + throwable.set(it) + } + } + + while (!finished.get()) { + Thread.sleep(1) + } + + throwable.get()?.let { + System.err.println(it.message) + it.printStackTrace(System.err) + throw it + } + } + + override fun afterAll(context: ExtensionContext) { + val testFixture = context.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + + ApplicationManager.getApplication().invokeAndWait { + testFixture.tearDown() + } + } + + override fun supportsParameter( + parameterContext: ParameterContext, + extensionContext: ExtensionContext, + ): Boolean = + parameterContext.parameter.type == Project::class.java || + parameterContext.parameter.type == CodeInsightTestFixture::class.java || + parameterContext.parameter.type == PsiFile::class.java || + parameterContext.parameter.type == JavaPsiFacade::class.java + + override fun resolveParameter( + parameterContext: ParameterContext, + extensionContext: ExtensionContext, + ): Any { + val fixture = extensionContext.getStore(namespace).get(testFixtureKey) as CodeInsightTestFixture + + return when (parameterContext.parameter.type) { + Project::class.java -> fixture.project + CodeInsightTestFixture::class.java -> fixture + PsiFile::class.java -> fixture.file + JavaPsiFacade::class.java -> JavaPsiFacade.getInstance(fixture.project) + else -> TODO("Parameter of type ${parameterContext.parameter.type.canonicalName} is not supported.") + } + } +} diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt index 0a325be6..1d3efd6c 100644 --- a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/fixtures/IntegrationTestExtensions.kt @@ -30,7 +30,7 @@ import org.mockito.kotlin.any * * @see com.mongodb.jbplugin.observability.LogMessageTest */ -@ExtendWith(IntegrationTestExtension::class) +@ExtendWith(CodeInsightTestExtension::class) annotation class IntegrationTest /** diff --git a/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlayTest.kt b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlayTest.kt new file mode 100644 index 00000000..5104c5a0 --- /dev/null +++ b/packages/jetbrains-plugin/src/test/kotlin/com/mongodb/jbplugin/inlays/JavaDriverQueryNamespaceInlayTest.kt @@ -0,0 +1,42 @@ +package com.mongodb.jbplugin.inlays + +import com.intellij.psi.PsiFile +import com.intellij.testFramework.fixtures.CodeInsightTestFixture +import com.mongodb.jbplugin.fixtures.CodeInsightTest +import com.mongodb.jbplugin.fixtures.ParsingTest +import org.junit.jupiter.api.Assertions.* + +@CodeInsightTest +class JavaDriverQueryNamespaceInlayTest { + @ParsingTest( + fileName = "Repository.java", + value = """ +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import org.bson.Document; +import org.bson.types.ObjectId; +import static com.mongodb.client.model.Filters.*; + +public class Repository { + private final MongoClient client; + + public Repository(MongoClient client) { + this.client = client; + } + + public FindIterable exampleFind() { + return client.getDatabase("myDatabase") + .getCollection("myCollection") + .find(); + } +} + """, + ) + fun `shows a inlay hint when the namespace is resolved`( + psiFile: PsiFile, + fixture: CodeInsightTestFixture, + ) { + fixture.testInlays() + } +} diff --git a/packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar b/packages/jetbrains-plugin/src/test/resources/mongodb-driver-sync-5.1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..7e0ba71f51fbd4a9031e1ccb6262472ffc869aeb GIT binary patch literal 153556 zcmb5WV|Zolwk;alb}CNAwko!5+nlj&JE^#0n-x}U+qQkP*4pQsz1Laacki9gGyjcu z{uraR-g@t?jVUh$3Wf#*1qB5ZDm$V!NcC@Is)h$gEk*sU-i`H1cCehQ9fUl;TnW&*zVdffN)oif9%-P(vEwn`f)y5R!2k;fq zTv7X62TRV#iwCS5{X5=*+Py%}>>@5u{D!uZM*`jL-=h5HZ-S`yD5o~(h06NrxV9MO z27OGn`M(s~HgT5%rW>SBwY#DwvA5$Lj+ubu3`nk-RiOVse7Dx=iOSSoX%e9xFoH9L z%YehdfYzp^Bn^^`{+z-0CX28I2g*R~FEoVn07cZm707>h0_|WRz;$jyme3tpYADlj zhcRub@Tm-8Ps79;o=TQTfNo+;4TFOLolO5j7Mr_L#CG*0n~!uF7sp(`OFURF=gzIB zmoKQ1^PNhk6lBumyE}CW4elPavMlu4bp4G52F6uORE$n^z7-9jBkhS8CAlojmA)P1 zKD-W)TxY>5$@KT?vKfOxr|R<0e5D~v{%W7IYIat?5=!}8!8!SNNUB~ZUCeBk*?{XH z+%1}VpUc}OqbSqYxrDT0Lui7=F@?GT$&x3+mpt-UrKs@L>$9>V6;PmyLBf@VKJ%U) z1o5qF|LAQE*i+!0BV7UUzo*@MH(S^Ff6ZoFl#*&IiB>p?1 ztE5V-o*Vp)0w1`O*`sYBt@V?6W9UPdHUAPEQ^*|01^sbdtf*7vcNZ)IKbh{O6oZ&V zA=fAHoP#Eh1lir!#f3^lT|q5uEGYPkP8V`FD)W@l{p|LZL3 zznwL*wlJ}E{@b4j`L~Kh^`C#@hnbn9iJ5`3iG;I>qk*Bd37wI(fs<3Eik8}}08&np zWs7nvW!MflGJ^;iF@Uon)JgJtL`gts%FEU)`5AO%CJn{1{k7V28R7?!Z_<#2B8&vJ z@Rf;~ndxDs9eLuqUbpWXm>)P`783hNktj2e+Fr$9LTRau7Ej6=w`~~PrBJtyCRI~- zhE+nx(7sF{_D5l>l98T6?&8ADJc|K1dK)^{64|TpVSnu%yisa~Vz4gwAUBW~)Ldc~ z=l78Srzrhig`ZNR>{H?#n2^+CuXX#|=>e*|{(2YzN;_zZb$w-)V~$~WI>MTr9E!EN zn}s=(CI-+yDA>Hkm@?VYhNhn5Tl$Lub$c9w2|qF9{A;o7)11~1JBF=@Y(jU_RWk7w z80$eU8y*!{yNtEjgN4X5A}8r87@Q`!?m#zqVH0JC zGFv5mIpZat5OC6)=PIfjVB7b2eo}v#;d>Wr=}+y6`-udOAs4G6(>7K+gIb}@!694n zOC{LqID`Vv8yoYiT5fh0;2D0!5r2jNo1w@D9){W|r$hflD|mI+us|P+Vz!7|6S)$# z2w(C?xhT{#iy^DifYvwR0wB+5&c`R5eB>3_7IKxwL**Qk!S!x3if2ZMNKP-w!>(3A z)3lnpk{@{wlM*+?dS;9A$`gUlWcQ|Y;Di#?QT*XpK2Y_pFFx`FNj0Tsf}rzg6WDft z^aHC5Ch-cwLE|TTv_@;+m0-3kH!F!lTtTPN&sJFJu|q?p)44L&+17cAgIaR0#lmu$ zpX@WDCTu-J6g;3*TfE_uullO~e1Cv{c0epn&&Dpm!S#HTRQYWrl!uz@vnDoy`)f03 zJB2Ucr80=m17pdiW!5o zLBEh6qyXq6i@yJqWnU3-{F5(T&V>H&r2lsY(f(%!37H$%nwcm$JDM2S{7({fs;(=} z3ZU_6Q5DJWiwPt7B8do!>>!5C1Sr8o=>vx@=-TgE&rU%kT2m~`-^qBv+FkcTUghD* zC9ts-=?hICOV@AaICZ^GT;ycm-Yz~80x=*`dm{x@K?NDvgSSCTOG%@$7N@G$ev>RC zKGl{^E!9n^UyCbk8a4^UP)-+U5NK7NpwhGFp|+kdUWt-kqJHTA2Ga@FMmEZj{zG5Z zT%yLNPc)@rH#bZms;7sDH$Oi@)S=m)Qi=y;5lT8sWcC|xd6M%8E$Gm^04#;pvt6(^uk~&|26fIJ8w;O-%TwD>doXw~#u}DW)GcOK)WbC`u|L z=*6f@yob7lr?&pamwI#sdM|r9MNZQE)oCy|n@WL}OdiF~*$$!0qzo6kuDXNx9rLW- zfhxhNr)uPtil`(QL1VdUbLm#JQ;z|}sVQUg=_yR(m-dGHXw>ApIt$5cDOazkSZtiE zfQU=gDOe_CBef73S z0Y%aW{xq6sfz<6K_R)Jb{c0kO&{8a;EWX9iqVU&}Wr<;NieNcFcS@tgId_eA1OG#i z>q4+*e|!mY_?LeEA3^?iZj%26H~*=VN+wQD7IwD(Qnn%`8M$5oq-+sz^khWzAN`ZC zolB9BM$yog($ex#Wc`5ECMyl4reYn2H`ae@nu9uy&~Gpl#PikV3C~;8=G*)CYiJ;f zn$!R=fA7`HBYeG--E>-|I8u9t5%|z! z2PXf3(LGSi08VmP51L<`vVNOT%4M3~NrbP~NR+&;!F%`%J4DSqs;IrG%K7Auqm0FM zE}Qo}5$=E1%x7y%r8bPl{UYL46gkt&EhoVoDf{$Z+|+~G#)QkkBKkT9abcB%wSJS8 zByfVUmET`4z*h#pE-i$4?9w{AaxBanBjAjMBtST>;gu1nl*B`7aE={caqvsg`bsn1 zPMB~vIpL(n+Io`i&$zvWuq`wClO?tXjM(--Y3H&}k~`6vBJ#uSxU9 zb+2)Kx^Og>o#-#$wfm3TwuF`>#J)cb1)gva1L~h>wt9*jq7-Ywrcp#C`c1H+RB=?% zszh5Lu!A-Jd>`xc2*QP7FK9v9#z0dj56XaEQgwJ{-}tQ}QtA4yx(pDn75N1W1oZgz z{QvsdfB(N#VZ`XL~+ z{hUqdx=PY9gie&nvQAO(O|E{~Lc9{=+-N9D3)qd2Hp}q59OmR?&)gfDwA%#U;(St) z4`4(bnY9NVgr*^*f>$JKx1>iv`JK-4BhV~lwBH)1*n$SjKRhkNxO;%#=L|kAx|1HYW?f2p7*TR98VpF`QYIWGNi0YNo*W z^!fRaD_wt2PU=joP13ik5nufKCK`5abx(<^#(Vv3{9&2xl+43|y@!{ItsyrJ)bL)_ zb6F(7ZtkGmJOS$Om+6LH8P^H9@y0VEk^u`a-KXhmY+LMcljfSvL5;kM zh%9urS_juAtAdZv*vmETEH&MscM1knhvBAM7Sp!%?%Dcy$zMnE<2HPhDdT)Yu!{6c z;~nMK$9?e=v%YrbZtiiNQKGq}_WQ=i)t&7piL}Y5K{ocMwzhM_sMN8D_Ru^%xB;>C zYUB*yv+Av38qjpVqbgB?%7LJCLo}jZx6sF~fe8=P7;^)kiJn&|pSjks0@&pO8i@d- zz~$vFV>VHj`nCS{&_g4;D{9}!o&v71)&_j7!1RHA{qUDsKpypxhsa7CyPJi5^SF49 zq7i-nS$(3DsbZd$%SL3z(OYZ6`eW{*srt4 z0S{PI#o`b&PLY_-)aJQ=oIyt`0v>av(Y6&WUK9K~c= zvC3`I9969mpy?M>@=tW-T*B@s8tk9pG+Hzl@{7Av^-&#*t~_FlnJH%-ab5VZ_}xurAo?t-n6aV zJAWfA7AKxw6~zQ4D25di^HP&IP&OLYJSL-~F|0jiI0e-vUW;rtDen{!joBiYg~nQl z?gj#V;TXu{qw#n*X^9s~*qPt$C=3N)t?@e42+L{-52 z{vO`k*O~)Df-A{C&oLb^S!@=YP)|-HcggHQ6Lf06{z$K&fkCGfn*N}`Jic<1)k4Q5 zx(RldIax*D7(?GIY!-R?%MGLZWyEUxg1mNoY}J?5DHZyp&Gf@QGgOyDN5GvY2=IxX zCe+N+E^RXH`znhbBmxK*FLp3uD1E@j!WUROdqst!<(Yv|EEVO39zfFS3R% zhq?t*(6;?a|O1II4V5jhm184Zxn`Nk0-02$uz|S;WwDb;OD&w zfVn<~;sZ4U<%xOH2Ftw^_Q^}UCYA=1PDRp-*`j8^-umAEj%=c~ttsHcE6E4X?0+p< zer>8REf!s$&9ZqS?Aflgr%kb&Ej!pA-;svwg?JFS^*X%;{$_H&8XEnefYhNr6bt%h zOcN@hE1318BZLIn8q!Y23!DU4uVxccJ z=%YJb1PKL=T#~-Jbc@sw=yUvA=f$)t5AF|o;lMnX33@=Vmrk~{zN8n^0%#nrwXGKd2C&r}U!Z9sdXn}q2%IMv$ z0)2D6?aIAJsUo`Xy;;5-WH2F#7pE;Ry)zQ~`$a{Kx`Fh$7RLt)Sc+n@3?ZrO0H$vL zdPTEaB!UknLH;HpwW738^T1SFYnsY_a}cUGkB-d1^J~47lM!;HDp!3`meXW)%W3*s z;icJJ?mCRjq;jI>nW5C-3|y&%2JZHp0sk=;w<59>wd>2s)z|7dvswOA&S^S$X$vI> z%Feb4e$uliSC3L)!8ja`0fT4*Y?+9v*RXge(4TuSn#o0}I?E~*GJ&cNPF$@q@IM>n zvYRR0G9%=Udi|`8+TXEhdMIu{*YfIRq4ZJRj;&RFKp&^7P9Do|feBPyZ~wXSK~Dp5 zTKMWR+`hItf8Av;{C~mCzhS0QSxav2YXDSQIEN{(paf_r?6DM#Yqt-B>#G7=4w_HctyT5+B}SXIcJFeL8>wn_E8``M?j<7zOD z|KQhzm-Cb9VIwFMYp0jPzqPx^TI;^W@tzm+7t&FKSCJ9Dbn+cBS!|lD4YnO9{JCOK zO*TO+8Eg6=$ZwPFDu~|*Qp^S`R_ca66p0}e6_ZLa6V1xAK?ZwmNh4D{@dEWgxpF0$ z(2T~%JUz>WYzFwf1y-zlGd?)OiC+M6 zCR~QqEo7XY5P2m{FdI^k+C8KG%?+AF48Sf8+Ct<0rwrlMQd8?d0*CNvg6>-#;anT5 z@jkHk7HQaIn|#?k@NS|L?cioc`0*EcYr?xy&fHH6DVciy99Q7`jA@N`3?TXl7rV_l zqpScRM5k4W(SnZtpHn*1VDV$yLv>7b*N82Hu?&p zdOmv?Igy09;;eFfoD$?jsIb^N#B0z4Xmu0b+v!3CEI6d3r*ZC6R#;3o>czBpJHvL* z+jr9HXixRU=;0yq$Z434@t;EpmV@u&5tJ$;XADSHy8A2R^Gg>ptUQ!TrlEy*$M{?GE>4CFFSN?b1rIt| z)&>zhg;1g>jcKC_TIS0DLylm$UlLfCWFb1EgV`=4zxDW=>DmKS7K-+gjIAA=SRmS4 zH4;v$lmX|fePdnnn9xSX4nI8_^o6L&xt7ruMTu*``T1`m$L(y8b7rg^n?wt1z-iwP zz|}ADZg1#~adUT+d%)IZcjL-TeL?V_k@Qqcg4BsqeL9(2+%`f zP7f*Y-<3?!|0ZjA`C!o=oOk(Z_kjY`3{0UW2q3H9p*s+qglfD{IvBz1H1#du!8Zh7 z*&x`FCeqndNA!Azf15Q7=@WDpgZE@{KhZv%fzb32SGiUGQLGm3p5krU)auOrhjcn< z_>6OZ!4eqq?@A!eU&B(u*4PB_e}i&e_DeGP>d~46gChdW(c^{dEq8RqTWVxblguSm zzct(qmM@59ZnVP}9C~u4eBlZX(Pufx&qZuOG9b{d;c^#UW9q!#dK>}6$K7j); zYzq}ZBr=F>S>)F-C^4x7a!7-j%>*G&%7`H>A&+v0Sm3~lZi!0EI8N>BDfl8g=ZNf* zv3dVO`9(N0$%3X_ye;eX2W7X9#XlLAk`L{wqbzs2fM8O76{aaaVE~7&S9rMJQpXtW z!h2Z8=`6)QjZTh?Rh8uW!C-N^fmtTmjE+yqPFC%W)q0_X;1{;d`Az7(Ey(Pnh?W> zbR^w)s$BOk-S=5_LM@Uzu9x>vtENwucNb8)S7$Yi>>9TYbNk}}Q(X-7E1Bya$hV=Z z&h!eTG=H4@%rKrbk*LWD>>MHOP_19^*F0;Y$Ea{Epz>Up6Iqcl^ONgp^DS9F5HXBaj+ZbdBunaQd9qFr3CO}v|ktVFmUv%}jv<=03suNrQ6X`J#I_{^uEf-E=eYxcCDkA=kOKJk%q+IFPbs(i$=??|11$y;2JSJt z%+Ckjzm?xS@YfhjlwW?4)x!A1vzQVCMRxnsfBH97e_&Y_bVHbQl4qwF zv?*fYK3Sk#Og|;K+4>dB5%cnH2N@)n+*0pcu~GeEkKOEgC9u~ca}YnsR!^@MpPEi?-)jfrEP1nr8 z)9GkLQ@*O}c*KaXr_(!KC`wTK5Ljm$_*O=^P8pCyyAUO0-bsrV(Ymkt23$GF3c%DX zZ}nwMSTZ1B3%ena>4RL88arTYwKD`8NeYE}0-5&@b)I?=UbBojUxW4|ZY!`qIrv`D zm~yep!r|mPN6WoNJ6+M>9rj(jv!4q>b|38woN8V|<+7G9&;}o&}dm zLS+p3J!2MN1ZNApl;1G__As|Mg=4D8*1*(qww*DCn*mmefBYjPl6$9bU zHl!Zzrup+8os#&ANdv5VV`ogV(%Pl8sgN^f<#efI`S1q}QNB{vNioBxS+EivSYrOi z;W775YF+oCEjaf z@XVC3s)Co{d3a@JEUE!-^0rV0iZ_Vf*4ez=RDh*+7Z8bkzDOl5n8@nucg`6Rk;%{F zGyHDT&U&qz*cCv!gQf#*_R9SPIFAAb1S4+0DFH&1MC;I1lV;ee9-E}&5+AW9pO6%x z8fb&!g||wC6@`rNIo}AMB5IY*6z#$AXii++-nG#jxy|a_w*)ryw1|zfcvxOfX?gaN zuvl9V ztalc_z?Y1mav;#k`ht=H>pAcNNj*JU0*}mI056xbeCr(#y zVS%!Ke+x+QOAMgWh^Mtk8SOQ1(A{9M=TU3wpW{}Z=V-~$2D1WzfW0p)G?3jmfTi&Q z!v}_>Zl|FJzmvLCst^js=FLa1@pR6Lqc+h^Ois0~`lY|{lGbWbqpJoevC78ns7dL# z$*`u?r+=nv%rZiWQpg%gURO?4ecqDqd1tUfi{_W}nZ%3z2ub)xA|HrWgEVmo}(C?jAvV1_Zj)jGUH_Bw%L!*aoPS$bS*Hb}IA zZPNEVe$72Y=;8jyU8iDcy1@F9@#U}YUk}5i|5?WWb=Uvtx%}%+52&qvb%0nOn6$}> z80hGT0HDUk9*=K>OOpL;q@>^|k}V7h%sLb%!xvG@=>v;Bp1J+71U;clAKVMa4-9Rz zk-E-i-Pxa4-k*3}x9>yEMnLNR$uv>w42Slc51dvvvGA+c+9QRX*uNt@CVMqt9U=GP zmIw@FJlh=v@ZY#Be>c3GIJWON{E+A?z>sDstw52$5&q_pQ{BjW%4Dxmuly?=<>P@` zgW)?Vv~f1fwxj89!LI5>`Vd;`JIzTqbr)wl--IW$_gOc{5sr9b*oi$@&tJ1n!5EDq zUQ|(0NipyefxmFD%quR~u;UH4Es$hHsS~Jqc@Di6#O|*EqF_Qr`lM`||V2+>Y0vGA?X^35>tb&q!OG{WB zu9QJ7%(4%_!m4pT6w^Dv52k7i2${K8Hh?TxJ=dXYI^D5%6%RBI3x0>-hZCNW-_S%{ zM@@dU3UH*DcZCV8=RC_XjawCG&anvFC~4ZpQpS5feLuJay{B_n*esmz^v_nI%IZ;p)PYTD`!a@%C}CdDbe*D@bq@`;rd-&$1`iF{ z{r1D^!Rxt+6077MwYQ1GSqEE4Po!;rdx??HT-339@h6qd0StOTSwENn&n-cz5j0tW zM~;jTyOpkjjfo6JE4TK*l}_foAhR%fa~wC_aLhP*3QuK&i)cCXPi?*IEM4JG7-JS* zTHD+>n<`H^gSRmB=3aW+kU0Fx9Muj#w#9HT(RJql(AP{$C-1c$eEua%G5G_`e*YYV z{*d~*RDKnmg8vc!`FFRG`u`RFq6S9Jc8>1<6{b;LSHe|6`&<{OBeez>1QxPtSCImt zTwTzl)$g7Wun?L_2os!dTh{LFHDzD7)=aw|hs@1(7~Eb@=X)}A3Gv}jd6|LyBrPe( zY1dc*va&MsYV~~BaGD&te4AK)->nYq2IdHF#1b@5oT4L%f)aX+aFtS$887?wJOlGJ zi2f-wz`no^X_~w02to)cXwy+CZ&IlpB~xLCw{1PC0LXaWBo((e)o=J?EzjDF5;KR` zplc7+P%-{lqS$7|);Tggx_@KU?o+0>xHnOwPS4^|;ou~YG;tGSX6$g267&*VTlMj% z(Gw+n!6q%pDP34|p${IQB<-Lh@&7SGo0*$4F~*2D*>qs6PUl85t~?r|T6@-Jb>uSN zK#k5+VR}5A9gcu!{KREOJzQ{KsOWTt&V;vGhJt1kk+5*orlOGGYC%@o z(nL&*U*AAw6El8Ic404dxYN^cu3|FmiZ(v0VWq&ON5?&4)2E}lc8{a>G#+9aLEYQ@ z=PoX)Po9#nO?MuueYSFm6*;}-!;r(fQnn+!nY4p;mofxvPOU$fNc*5jG&qm`8`zJZ zXhPkoxhrFG-VlOt5>bD!2Dp=;6}CDom`D|U;s_*|R0~G%Wv;@B@dK&0)1r3sN4)(t z;dDkdy%$^ogM0a;E)M6s=`EjpLL~!>+Mj*~zEp9#gj2&8ej+~%If7@I1{r^#71&2A zXRM39b%;dsB{)EseP^!rxYq%)!8BG-=cV5bfT9;won`a4ZAGDDf@{L)J8c=un6M(A zM38385?_U{uTXE2GM-^gWgq^|A+feCOU;T-jHAF5!a^5*Kp3&jR3-jrBuyk{`zkUs zYbW*yfr1c@B9JQE``Y^?x4bv#5v30g1|@=tZ;+?2R&5V&0EMiu2|CT)g5$HOo6Kv( z-dt?`l(nxqk$(rvW9C_#E|G3x&xsvopf!DsMaZk#GsIhYsI6S%qQjI8s{Wxtr&vsF zp$1T;Kd-fc}GgRxU1uQ<9{ez}j5U z4#RoXxkFbr7^{~Qq&y^qDOuI!FW~z|JxErLgW)ah$+%MCxX9snWQV5eEz6ga3f0?6 zF<8-onY9q1o10G^nn^SL-(2M36611S75eOW*>c##S^k}4IH-#bL0vzI7`y~ee?G;{ zRQG?ws1f&Elt3VgU`sfT4Oo~o7b~JDFazunEa}MYJ86<^93XZ5RI#Png6Jxw2n<27 zm^OJJX+8bfNy|nc+b~p+dE^z91MmDyuXU6cc!lar-kW)}-ZP%dh{TWN6Er2L#iObI zt+Cg;;~Gdz5X(Di58|dkOWf8Fz>^Th)6))zn}#+69YULhlZrBfTDUVE)DVuy&e-Y? zD#&x#dj23hd5kZ7@zyzi!gWnO1A8s~+GOYGi8$L$(fi1Fi@HB`vG0xTpgD;wjyWX* z`t+@sA<9Bq7(>nc4I`dHy2=oIQGeF@4F=pxsC{$B>n+CbBd6j`00$A8%zqtkyFLK< zh!Ry*r0!3x@DYkBUyfjz{&F7x7Q!Nw#{!*Pgs6~;CZY;H7O6lmWSD+RPE*E;byE|a zU1F4|6>&xhFKLQ|e;_QVw%(VR^fB)OeX+<7XR^$<-w9TD_xZKu0T$xI1KnrB53RDf zBeMDPpRVh*scHr7*B&7Q=I@%2zi?guTNC2+U-ef->mReyhio30WefTMZUCjARvgt% zW0-!Y3M|z;6(V1uMUZ}m^UNH!Z+!JjK-AdNNfiIc^%)z9zpA3?nUHI{=fvar^8{ym zw~y~9us*>l3~>IR8J+RAK*k9JScV+M0xHvye7)*%a?R3x4>Qy|cB&Ir zQ6=pm2iQSH!XGt#CJE1dwM+pX0#^tqY!89pV=y6yjM}ub)>l2O{5ZA~K9?=%G7QZ_ zoTMDFs3SzcZxp=-S<3d30~T4FKkXtZp(RUgHBI`+q$v^%@}<}8u$af8Cca~-FoxU) zm9o9JP&HW2zc@3v3SNjW!*j2Iqhm7u2pidg!t4_=>XwlHE)KPy5Cpru{B5kM*QO2@ z&jw`{#5bg7As?jg1|OtaKc#*tUqE`5SzD_U)}+13o)c z>4OGzZQYvIJXJKE&BaTB1xu(Fv3E0cqRsFqU1~h?;v~rSu&x};nN78t)k$!V$*Oe#GF+cEwyj-v2UJYfMYLah z&Ti*+v9X~ENC!fwiwPbAc9#19W+a2Vs|Rv8wU22d)bqW_+Zxqo-g-l{@r>c??kVjm zF}hciRaYL1e!;BuP%^m|&1M=RETJ*HB3bB8aJgCj3Ud{`D_Of)Yn1kZ%)zSK03|n< z-T3cs5P_NXg4_WaM*eFRMe~*+Ers5y+QGl1u9c?xCP%z|-0R;iQMmRjFX_yAH?HBQ z@$bC0!FxeJT(6->3rB@E_hE<~8>vOOk1(6!{m$_SuGMVRw-|G-C_9|G9^uK+Jj=dG zpI?JBUO+G?^9(Q(7F5qe??85{J!Wrxzv+5(XhPZ0ARys+xZD!9#5HSXb3-w0 zF*xZ9TZTbJ%7L8!AU43ktCD)G%XgG}WUGI*OCp`)uVG2J<~(Ow@Mw`(E6 z;wCl9bza)R^VWxuV#>AidqRoO2y7*E@PX20TFw|VB~4LLzXyek2wNRWJ;jM7&Zivp zemvb|Fk)hX%>D&|7Mbs-HgnMUhH)J-#4#zV9@Q+(I~0o?`>z;}Q|}~=*OxI1{I_(b z{JW;=e>=1PV)VGSyFS`Hwr?O5Ib|qi>%n-fo#_V6K`wpw z^TzAMW7p#b-s_bSA|6Q)%>ua`St1J)y$($wj0lO=7+lHBGalvHw2ipy)2@o1+i zEcK<^iqqmnw7TKQMx?2gX>I#TBh&uS=>tJ`O1$+8g(P!@A*o`re5WjdE-U&6BMk+A z=+Z(&CotNUS}XdTtH4($@8uP&_^iyTc&LJ`B_gQ}Wsx@|jAvXMEAzM+om20^ux)e> zP}bSZFMIQ83r6O{xrz78f08LjkY=yt>y~kB$Tnvo4~>kZ{LCY^@Y1s;s%kY@KEcbU z)_fEDRhZq$C=#YRkrqaY)4GNq9>@03pZG0DKxV-FoSHN zHA!=ru0a!C6`b{|uApboEGJsAxYBN{t`N+T&idMN4cOQ(g(h#xHdwfwi`;BC9BO+G zPm}5p#v|Rd=8uL9%gl*|pvnl<~vr zB$|fjZW?>|#G1Pqb&!7hd+@3>1>#nAjszIU4Bt4l;fhU^uDkL$k`OP-HMr#1H$E2= zB3qEA{xvKKfR?y=a9YzjBfF&nlLw2fC@#}##+~&-p+=L`+#f|F+8Hu+X`|**fz~mAhF5!kKGCVnkr%+-Qffr>7@CksWic2tN1Uly z#Gc8cjZj%pPj1eS!@WdTHrCSE|1qb`D9Iw_y`py&#KvDo^|S(9(H`0!?3Ebb{!?QqtU6=>!aPAZaeGJHYqb z%lPy!_Mr|C6RF0xJ$V+OD)V204$9g^;+}Uz_I3%6Qm8njGJVN!Yydx%c7?-c8g&^Z zYKj#nBAn%uT8e9L4`3b7O5ars4iw6a%L40q&+7ehSkK))WNdgy^wxqEy5~$~qFXnm zLKo^SGn3S{y-Sr<8H5eq3T>w}Qfwt1n} z?)s(8)n$*78CP!9+5FJ*?Ra83C!B~Z)aUe#xQgMmdP`y5%yOqCCf@j_|y zs70+85KvBhg&d0~n(PRwZqEW7N#|uoo&jY=Idc7@(m}I^9cv=$8i{b%__gnHQ!QT! zl)8Zl%@z$J)508ji_m!n*hq>YoA+w@~83iVOzLg=)~ps&`P#UToulwt{_6 z?Z!R{Xw=0X%mmAKSI=IAR&Q1kv502DL7<@zbc9pwzo zHy5yDa3(syg?CXI>DhM80C15`M*yvsIgv-Bg7n0(4JLuAw+zg&J7$?7cmO-tUKpq| zqYY&>Q5h%mMy|FjzY)g#qds)SCdxB2oFIAJqNi?`s9JdF#DO5v$@0<2}Z=TOWtVk$9*`lQZU7*Ltw;)S}Kk~I< zlQj_0LVwZ;1i!Jnn?@la=1yvO_NO#8zo`bF&8Rx{Tz46^?+s!7XiA#%iQm2q+|B-N zF`qZkhu@(K!NXwM*=dOxqaXZ;D{s06P8`BrvYc-U-zh_6s*&_OkGV4tACqAbfcVg6 zZ=@V)^!>r1ntA4xm@ap36GxUxPEoIxYGRLf*gadgszf6hmtsQX1AIw`C{>F6p?tQI z=%hi*_lI{dLd7^Q(<-_9tqI$?11QaBr(y%z+%pqN!^M+?W!(df*R%F^<39A7JD1s% zd?%p+P5^xcNhj=Hk+no2B6dZNgKtK7I9AL9x(Eki5ubr7#-s%YM#V}~&4k6^ytmC+ zV3gFJbRv$2{{jLB4(DQN(PDmME?WavC9E~_-AcGp>U!KmO_%$UO2l`PjQz+J5MQ&Y z)4~lN`HD1)mE=*S=qzB>Ib-?;F7rK*P*#ug_U5@QN-b?>&=)A1?0jU`5b}l1@kCZf zrgXsy!kR2eS%byQrFn_M^lghhQ2hrAwuqbHvfdE@DkLZSzM^Xg9pvK3i_cmfYg1=fuLfN#0>Qv_lBz+vCQtxGG#x}TwHss3Yj60U`=$cV&ntMSQTEQ5r;sobZKx{~u zz_COd2us4+hAq-mVQxSh;Q-97^)Nk%CzyUutgeI(ylWM|YS9kNE7q`T@Hd$LMMf{) zR^YdmoU`4#!?*XW?%Z2D;%Y&6c2GXQCybtI(Kno)W?~=OKFDF4Z-?JF z`;SjKInu#xM=)OWfZq1R82z%=!R~r%=!5wbxfXg2nopc+X@sE6%m+yaG z{d!)%wIaF`I$mFhZGh5k1paxgiF`!5iD?B8{@4)H>4+t|+@;%~hmyBC?|1AUY_tj6%EXYypVcWVERyO$}@Ez%YJb_w)Bw{yw(29`4xe zf8-sI^p-x`ZU3Ss`#E^L$@vah@(JdVHFV1nd+2aOFZ&69$G_K|^$|Ne#NnN_Y_B+v z(quB_C!6snWzZGr^PjP}LM3fQ{jVq`wbtJa;eYD{{5Q`f_$vzcl?C}IMr)b^*(Y{X z>6qDXvh+d`6vUAcPsx}nM&#pMM>tP9M@Y{WdB*;L$@OM>`FZ&jpj@{3UdeiIGI{?x z!O86Ouy}dN57f~gNu!8WA2(ruhYEK~>obu3M|_i$QP8P?Md(BOcyY}tC!8(S9}WjD z6a10wmIsE1L}d$21xeH<5Anqoh_N${A}B z>(L7xCZsk%r;$NO1l1=O68_Mpl8ncQXp$inP~;flz*YSWR-3^?6CO(r+-)Qd8D6Vi zv);{#fJHu9his2(A!rKgTI5LH`$vvAiRK-Ff-xJZetHrAAi18Bp^mnUDJjVw4{YQL za1duOeojbNsv7YY6sB&5+nW^Jh4NxL=VDnwI88_<&;`j+wb%$%+B?XPyw31rMnt8g z*h~jIOmVIXTIV>5@scX`Ri(2@}=XG@)zsv3r)iCskmXzV?(l_rZH^j$b z(`&f^q|8F!2wyzX)MmG?02|-Hfh+9R*_fu+TUe988?&R#LC}{f6b$o(Y7uW;`9cwV zZFxC90!8C+tZ>BGD=hH_3V6LYkSS|z&bqs`_>;wey%>a+^p-&PeHS%uXONGedrx|<{7zL zB77rrcB0uO=OnM)BUz^J$NMQKP!=d3geMwD9ye>{!BU7)rFol)u^} z=A5;K$^kKz$G_7;dpB63+eW=m2}9uGjBz9)vQ!qeyM}daPdPRnj4kfDcw$5o&7D_S zy>r~I{H>_%8^#M=(BL1~O_5*3h>Ok3e^3=lp5uy6XlzQtlrNB%De<@vov(EyxtM+!Q}Mkfo))uJt=Z6# zN-nn4;|E%ys+a1PZa2~B^QY402SpkeT~j{JypTHz*#&sL3Cd#_FP6m(T^Srlo^rO& zv2F-pHo^y%A%f!3L44UMkD`7xS9?{@cW7UbPEd@T<#BlCmOB7UmI{g6 zqF~8I-K36c?NJh(647`EoD8)HU;K}?QWueA?t-27r##Q1c68G4Pg+-)BonHX4l1kT zsV2pnr0=^Ye~cIA{E~gxjxq=&>7|e9%zl$Kx(o53xit2Hd-0y^pfTFPS0AOM*zM|g z3+p1yJ{xa0J?TG~Ea#@8(ks^6-q<*{u2wSM6<%awnBgCK3U1=R&#P(RIqWR{OS7er;9@MNnC|ey%0Mk>1}V+Z>!~!HkLIu0GS=1r<8cJK zOtI+LuNo}7RL`doBDpcXM!mGboYfy|ry^D}#G>vWueKLW*~p<0PVANFc<4`d^k&bJ znD^UL3%1I4zMtKgwy}e0l$Bmpv8nL&{t zsZgolT_OOTt<|t@e{PUXvbV~fN2pCqK;V@dh;Qs?6rYNK7-s~Dir?p#vkwUsj49^R z_EiZ(3I0ys|E?PT&le<;m1OL`{xZNjv(Uu?1U?T;@|n^f^xx;Z&)XMW*O#u2O1l6EQtp|$2uw0$)l~Q(>9#Kn^G~mvtLz;46xuSwIjWe6A za$Tj+s$5odla@4OIWJwECE+)9dL(zTB(*7r?SGnmZ5_P}D7-f_sdP?E87gesJDq1O zb-15n_)aopUd+8>D%T>3K4o`T7hkEfe-EkrKa{;wlwiS@t(~^*th8-c+O}=mwr$(C zD{VU~ZQK0w^yxABcK?0Oxc6bd#zVx~5qr=0)|`8Hi8bddEYD=TN@{1Hzzpf4q!QZmR~XKhyI2-(olaLLygk(6@2?0S_YmCD;VtB8$3vu{NOJANRn^?LlXh> zuNrI+`pg>aa`OHzs#-ii5&?T!j95IFPf!v8Lxh#acXGEB0h`{LeCQfXm?z9bQh}X{ zL&!@Dkq$#G(crRLZx6Vaj7(76WOV$klE)zdU*sPh?;r1<4hVwb|3iuE0pG3pbCZI> z{R*jL$87t<%=RC<5m>1yV&%^Sy!|}?#U1@mTP3Xjy>d()%#BPO|DWto{sqhapCgI> z3@D-~;B07V?DWrXz3#LLjh{Qj5m|&twxVAV5PPuns3c)!dfhE*)p^1Z&X(&^l6l#u zsYSou+8vMAgQ4;J(Cv1CU*vpbLV%l?Da^6fg?)7s(!V(zO^zlHuY0$B0rbF9I`aer zZgHq6NJOBeCMeqrWXg(BejtL(ap)K!PL;808J34#X7v@ZWb^vouJi%%U)q zee|hiE){Q75;Vxlnv7yO7(u-$dPcg*>(^cL=2cCWMx*(|Inh1Rn;M(f*FjlT)%$qW zxZ$5Zqz584toe8?OO^wybe*ErkcU6gt!wc9qs;p(Y$Id-^|)|}g_jaSGcmtZ4L&6} zm5Qa^rZjjw7#2xMyg{@=h1F?P#+2stXyhb0xq6~J$?!L$MZG`)AoFRa=I%6Iu_m@%lO?GP0wi0(AdZ?VpUToEj+ALC1c*Vi9wb z_vq;)Vj5NIDqMTmBFPMUq}w$q*NNC}6W|e2V`6$u#G93@sO_dXr`{JSZ0pl@_`WIJ z)}BwFHd3!=pWN>CnMP@i?k&2}nm$gqoRtXSA)WDjecqrWZ)?FbBi{GzunRNy84u@W z$?7U(-izut95-I6LwIvw1=EvbeH(tDll{67Tb0%6qzso_g-&En<$8<6;c77G0L9mE z5lda|)2icnAEJ@ys-_+qhdZ7n1x{xLug�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