From a42b7826cfdcddab04cf609589f0a1700acb2f83 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 20 Feb 2025 17:01:02 +0100 Subject: [PATCH 001/179] Next development version (v3.4.4-SNAPSHOT) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6bb4715e0201..f80f7541c4d2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=3.4.3-SNAPSHOT +version=3.4.4-SNAPSHOT latestVersion=false spring.build-type=oss From 7ca27136659b019c34a4eaa5c1097cfb7b522a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Sat, 22 Feb 2025 10:08:28 +0100 Subject: [PATCH 002/179] Fix typo --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ac1e19c52078..8c09950db2f6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,7 +9,7 @@ jobs: build-and-stage-release: name: Build and Stage Release if: ${{ github.repository == 'spring-projects/spring-boot' || github.repository == 'spring-projects/spring-boot-commercial' }} - runs-on: ${{ vars.UBUNTU_MEDIUIM || 'ubuntu-latest' }} + runs-on: ${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} steps: - name: Check Out Code uses: actions/checkout@v4 From c211b05660213be360f72ad1dacd8a1decf806bc Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Thu, 20 Feb 2025 23:16:49 +0700 Subject: [PATCH 003/179] Adapt reference to JooqExceptionTranslator This commit updates the reference guide as JooqExceptionTranslator has been superseded by ExceptionTranslatorExecuteListener. See gh-44385 Signed-off-by: Tran Ngoc Nhan --- .../src/docs/antora/modules/how-to/pages/data-access.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc index 9cbc563ef622..b7e9dcef3d92 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc @@ -398,4 +398,4 @@ include-code::ElasticsearchEntityManagerFactoryDependsOnPostProcessor[] If you need to use jOOQ with multiple data sources, you should create your own javadoc:org.jooq.DSLContext[] for each one. See {code-spring-boot-autoconfigure-src}/jooq/JooqAutoConfiguration.java[`JooqAutoConfiguration`] for more details. -TIP: In particular, javadoc:org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator[] and javadoc:org.springframework.boot.autoconfigure.jooq.SpringTransactionProvider[] can be reused to provide similar features to what the auto-configuration does with a single javadoc:javax.sql.DataSource[]. +TIP: In particular, javadoc:org.springframework.boot.autoconfigure.jooq.ExceptionTranslatorExecuteListener[] and javadoc:org.springframework.boot.autoconfigure.jooq.SpringTransactionProvider[] can be reused to provide similar features to what the auto-configuration does with a single javadoc:javax.sql.DataSource[]. From 2f288bf614db0e90b15a36152a022cfc60b1487d Mon Sep 17 00:00:00 2001 From: Dmytro Nosan Date: Thu, 20 Feb 2025 15:21:53 +0200 Subject: [PATCH 004/179] Clarify which Mongo properties are ignored when URI property is set See gh-44384 Signed-off-by: Dmytro Nosan --- .../autoconfigure/mongo/MongoProperties.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java index 768d52c5b740..cca3c8bb8f10 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,19 +52,19 @@ public class MongoProperties { public static final String DEFAULT_URI = "mongodb://localhost/test"; /** - * Mongo server host. Cannot be set with URI. + * Mongo server host. Ignored if Mongo 'uri' is specified. */ private String host; /** - * Mongo server port. Cannot be set with URI. + * Mongo server port. Ignored if Mongo 'uri' is specified. */ private Integer port = null; /** - * Additional server hosts. Cannot be set with URI or if 'host' is not specified. - * Additional hosts will use the default mongo port of 27017. If you want to use a - * different port you can use the "host:port" syntax. + * Additional server hosts. Ignored if a Mongo 'uri' is provided or if 'host' is + * omitted. Additional hosts will use the default mongo port of 27017. If you want to + * use a different port you can use the "host:port" syntax. */ private List additionalHosts; @@ -86,17 +86,17 @@ public class MongoProperties { private final Gridfs gridfs = new Gridfs(); /** - * Login user of the mongo server. Cannot be set with URI. + * Login user of the mongo server. Ignored if Mongo 'uri' is specified. */ private String username; /** - * Login password of the mongo server. Cannot be set with URI. + * Login password of the mongo server. Ignored if Mongo 'uri' is specified. */ private char[] password; /** - * Required replica set name for the cluster. Cannot be set with URI. + * Required replica set name for the cluster. Ignored if Mongo 'uri' is specified. */ private String replicaSetName; From 7fd19556b24bd21e76c1afac03d4ac67b18d5c2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Sat, 22 Feb 2025 18:32:19 +0100 Subject: [PATCH 005/179] Polish contribution See gh-44384 --- .../autoconfigure/mongo/MongoProperties.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java index cca3c8bb8f10..740c97dff7f9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java @@ -52,19 +52,19 @@ public class MongoProperties { public static final String DEFAULT_URI = "mongodb://localhost/test"; /** - * Mongo server host. Ignored if Mongo 'uri' is specified. + * Mongo server host. Ignored if 'uri' is set. */ private String host; /** - * Mongo server port. Ignored if Mongo 'uri' is specified. + * Mongo server port. Ignored if 'uri' is set. */ private Integer port = null; /** - * Additional server hosts. Ignored if a Mongo 'uri' is provided or if 'host' is - * omitted. Additional hosts will use the default mongo port of 27017. If you want to - * use a different port you can use the "host:port" syntax. + * Additional server hosts. Ignored if 'uri' is set or if 'host' is omitted. + * Additional hosts will use the default mongo port of 27017. If you want to use a + * different port you can use the "host:port" syntax. */ private List additionalHosts; @@ -86,17 +86,17 @@ public class MongoProperties { private final Gridfs gridfs = new Gridfs(); /** - * Login user of the mongo server. Ignored if Mongo 'uri' is specified. + * Login user of the mongo server. Ignored if 'uri' is set. */ private String username; /** - * Login password of the mongo server. Ignored if Mongo 'uri' is specified. + * Login password of the mongo server. Ignored if 'uri' is set. */ private char[] password; /** - * Required replica set name for the cluster. Ignored if Mongo 'uri' is specified. + * Required replica set name for the cluster. Ignored if 'uri' is set. */ private String replicaSetName; From 133ecab3cf5d0e2d5678340feeea231470e5f200 Mon Sep 17 00:00:00 2001 From: Johnny Lim Date: Fri, 21 Feb 2025 20:29:47 +0900 Subject: [PATCH 006/179] Replace unconventional Optional usages See gh-44393 Signed-off-by: Johnny Lim --- .../boot/autoconfigure/amqp/RabbitProperties.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java index 1510e9adbed7..7dd84a7957e9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java @@ -20,7 +20,6 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import org.springframework.amqp.core.AcknowledgeMode; import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.AddressShuffleMode; @@ -194,7 +193,7 @@ public int determinePort() { if (port != null) { return port; } - return (Optional.ofNullable(getSsl().getEnabled()).orElse(false)) ? DEFAULT_PORT_SECURE : DEFAULT_PORT; + return Boolean.TRUE.equals(getSsl().getEnabled()) ? DEFAULT_PORT_SECURE : DEFAULT_PORT; } return this.parsedAddresses.get(0).port; } @@ -235,7 +234,7 @@ public void setAddresses(List addresses) { private List
parseAddresses(List addresses) { List
parsedAddresses = new ArrayList<>(); for (String address : addresses) { - parsedAddresses.add(new Address(address, Optional.ofNullable(getSsl().getEnabled()).orElse(false))); + parsedAddresses.add(new Address(address, Boolean.TRUE.equals(getSsl().getEnabled()))); } return parsedAddresses; } @@ -475,7 +474,7 @@ public Boolean getEnabled() { * @see #getEnabled() () */ public boolean determineEnabled() { - boolean defaultEnabled = Optional.ofNullable(getEnabled()).orElse(false) || this.bundle != null; + boolean defaultEnabled = Boolean.TRUE.equals(getEnabled()) || this.bundle != null; if (CollectionUtils.isEmpty(RabbitProperties.this.parsedAddresses)) { return defaultEnabled; } From 56bd551ce93cb5341f556ffd895fd1037deed7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Sat, 22 Feb 2025 18:43:30 +0100 Subject: [PATCH 007/179] Update copyright year of changed file See gh-44393 --- .../boot/autoconfigure/amqp/RabbitProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java index 7dd84a7957e9..5d63ff2c8582 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From b9438bef9e6b167be24b486e671cf05a0bdc9d81 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Wed, 19 Feb 2025 16:43:54 +1000 Subject: [PATCH 008/179] Consider properties on outer class in nested @DataJpaTest tests See gh-44348 Signed-off-by: Bernie Schelberg --- .../jpa/DataJpaTestContextBootstrapper.java | 9 +-- ...DataJpaTestPropertiesIntegrationTests.java | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/jpa/DataJpaTestPropertiesIntegrationTests.java diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java index 0fdbbb9c3748..12f8c31173e5 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java @@ -17,8 +17,7 @@ package org.springframework.boot.test.autoconfigure.orm.jpa; import org.springframework.boot.test.context.SpringBootTestContextBootstrapper; -import org.springframework.core.annotation.MergedAnnotations; -import org.springframework.core.annotation.MergedAnnotations.SearchStrategy; +import org.springframework.test.context.TestContextAnnotationUtils; import org.springframework.test.context.TestContextBootstrapper; /** @@ -30,10 +29,8 @@ class DataJpaTestContextBootstrapper extends SpringBootTestContextBootstrapper { @Override protected String[] getProperties(Class testClass) { - return MergedAnnotations.from(testClass, SearchStrategy.INHERITED_ANNOTATIONS) - .get(DataJpaTest.class) - .getValue("properties", String[].class) - .orElse(null); + DataJpaTest dataJpaTest = TestContextAnnotationUtils.findMergedAnnotation(testClass, DataJpaTest.class); + return (dataJpaTest != null) ? dataJpaTest.properties() : null; } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/jpa/DataJpaTestPropertiesIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/jpa/DataJpaTestPropertiesIntegrationTests.java new file mode 100644 index 000000000000..784f9ea83e6b --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/jpa/DataJpaTestPropertiesIntegrationTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.data.jpa; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.core.env.Environment; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for the {@link DataJpaTest#properties properties} attribute of + * {@link DataJpaTest @DataJpaTest}. + * + * @author Bernie Schelberg + */ +@DataJpaTest(properties = "spring.profiles.active=test") +class DataJpaTestPropertiesIntegrationTests { + + @Autowired + private Environment environment; + + @Test + void environmentWithNewProfile() { + assertThat(this.environment.getActiveProfiles()).containsExactly("test"); + } + + @Nested + class NestedTests { + + @Autowired + private Environment innerEnvironment; + + @Test + void propertiesFromEnclosingClassAffectNestedTests() { + assertThat(DataJpaTestPropertiesIntegrationTests.this.environment.getActiveProfiles()) + .containsExactly("test"); + assertThat(this.innerEnvironment.getActiveProfiles()).containsExactly("test"); + } + + } + +} From 2a94ee158643268c1f3aece6ab2f013a1c785084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Sat, 22 Feb 2025 18:53:51 +0100 Subject: [PATCH 009/179] Polish contribution See gh-44348 --- .../orm/jpa/DataJpaTestContextBootstrapper.java | 2 +- .../jpa/DataJpaTestPropertiesIntegrationTests.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) rename spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/{data => orm}/jpa/DataJpaTestPropertiesIntegrationTests.java (89%) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java index 12f8c31173e5..8dd518551b57 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestContextBootstrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/jpa/DataJpaTestPropertiesIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestPropertiesIntegrationTests.java similarity index 89% rename from spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/jpa/DataJpaTestPropertiesIntegrationTests.java rename to spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestPropertiesIntegrationTests.java index 784f9ea83e6b..b4990c013d40 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/jpa/DataJpaTestPropertiesIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestPropertiesIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,13 +14,12 @@ * limitations under the License. */ -package org.springframework.boot.test.autoconfigure.data.jpa; +package org.springframework.boot.test.autoconfigure.orm.jpa; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.core.env.Environment; import static org.assertj.core.api.Assertions.assertThat; From d781ce164dfd0b071c1ea07f689a66ebf3cd21be Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Thu, 20 Feb 2025 23:44:05 +0700 Subject: [PATCH 010/179] Use Javadoc attributes for Gradle reference guide See gh-44388 Signed-off-by: Tran Ngoc Nhan --- .../docs/antora/modules/gradle-plugin/pages/packaging.adoc | 4 ++-- .../src/docs/antora/modules/gradle-plugin/pages/running.adoc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/packaging.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/packaging.adoc index 1b2a13aa0818..86a13d1761fd 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/packaging.adoc +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/packaging.adoc @@ -9,7 +9,7 @@ The plugin can create executable archives (jar files and war files) that contain == Packaging Executable Jars Executable jars can be built using the `bootJar` task. -The task is automatically created when the `java` plugin is applied and is an instance of xref:api/java/org/springframework/boot/gradle/tasks/bundling/BootJar.html[`BootJar`]. +The task is automatically created when the `java` plugin is applied and is an instance of {apiref-gradle-plugin-boot-jar}[`BootJar`]. The `assemble` task is automatically configured to depend upon the `bootJar` task so running `assemble` (or `build`) will also run the `bootJar` task. @@ -101,7 +101,7 @@ See https://github.com/spring-projects/spring-boot/issues/33238[#33238] for deta [[packaging-executable.configuring]] == Configuring Executable Archive Packaging -The xref:api/java/org/springframework/boot/gradle/tasks/bundling/BootJar.html[`BootJar`] and {apiref-gradle-plugin-boot-war}[`BootWar`] tasks are subclasses of Gradle's `Jar` and `War` tasks respectively. +The {apiref-gradle-plugin-boot-jar}[`BootJar`] and {apiref-gradle-plugin-boot-war}[`BootWar`] tasks are subclasses of Gradle's `Jar` and `War` tasks respectively. As a result, all of the standard configuration options that are available when packaging a jar or war are also available when packaging an executable jar or war. A number of configuration options that are specific to executable jars and wars are also provided. diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/running.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/running.adoc index 4c82fce250ad..be4016963a85 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/running.adoc +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/antora/modules/gradle-plugin/pages/running.adoc @@ -8,7 +8,7 @@ To run your application without first building an archive use the `bootRun` task $ ./gradlew bootRun ---- -The `bootRun` task is an instance of xref:api/java/org/springframework/boot/gradle/tasks/run/BootRun.html[`BootRun`] which is a `JavaExec` subclass. +The `bootRun` task is an instance of {apiref-gradle-plugin-boot-run}[`BootRun`] which is a `JavaExec` subclass. As such, all of the {url-gradle-dsl}/org.gradle.api.tasks.JavaExec.html[usual configuration options] for executing a Java process in Gradle are available to you. The task is automatically configured to use the runtime classpath of the main source set. From 332ad7bb70e242832df8ed991872fe55682febd1 Mon Sep 17 00:00:00 2001 From: Johnny Lim Date: Tue, 18 Feb 2025 21:24:02 +0900 Subject: [PATCH 011/179] Polish See gh-44323 Signed-off-by: Johnny Lim --- .../boot/build/antora/antora-asciidoc-attributes.properties | 2 +- .../freemarker/FreeMarkerServletWebConfiguration.java | 2 +- .../boot/autoconfigure/jersey/JerseyAutoConfiguration.java | 2 +- .../autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java | 2 +- .../autoconfigure/web/servlet/WebMvcAutoConfiguration.java | 2 +- .../web/servlet/ConditionalOnMissingFilterBeanTests.java | 1 - .../src/docs/antora/modules/ROOT/pages/redirect.adoc | 4 ++-- .../modules/reference/pages/actuator/observability.adoc | 6 +++--- 8 files changed, 10 insertions(+), 11 deletions(-) diff --git a/buildSrc/src/main/resources/org/springframework/boot/build/antora/antora-asciidoc-attributes.properties b/buildSrc/src/main/resources/org/springframework/boot/build/antora/antora-asciidoc-attributes.properties index 82eba8024b6b..0183ad7e7c12 100644 --- a/buildSrc/src/main/resources/org/springframework/boot/build/antora/antora-asciidoc-attributes.properties +++ b/buildSrc/src/main/resources/org/springframework/boot/build/antora/antora-asciidoc-attributes.properties @@ -27,8 +27,8 @@ url-gradle-dsl=https://docs.gradle.org/current/dsl url-gradle-javadoc=https://docs.gradle.org/current/javadoc url-kotlin-docs-kotlin-plugin={url-kotlin-docs}/using-gradle.html url-micrometer-docs-concepts={url-micrometer-docs}/concepts -url-micrometer-docs-observation={url-micrometer-docs}/observation url-micrometer-docs-implementations={url-micrometer-docs}/implementations +url-micrometer-docs-observation={url-micrometer-docs}/observation url-native-build-tools-docs=https://graalvm.github.io/native-build-tools/{version-native-build-tools} url-native-build-tools-docs-gradle-plugin={url-native-build-tools-docs}/gradle-plugin.html url-native-build-tools-docs-maven-plugin={url-native-build-tools-docs}/maven-plugin.html diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java index adf878e6b10b..143859aaae3f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java @@ -75,7 +75,7 @@ FreeMarkerViewResolver freeMarkerViewResolver() { @Bean @ConditionalOnEnabledResourceChain - @ConditionalOnMissingFilterBean(ResourceUrlEncodingFilter.class) + @ConditionalOnMissingFilterBean FilterRegistrationBean resourceUrlEncodingFilter() { FilterRegistrationBean registration = new FilterRegistrationBean<>( new ResourceUrlEncodingFilter()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java index 2f739bf74fe7..e32355b18a3f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java @@ -98,7 +98,7 @@ public JerseyAutoConfiguration(JerseyProperties jersey, ResourceConfig config, } @Bean - @ConditionalOnMissingFilterBean(RequestContextFilter.class) + @ConditionalOnMissingFilterBean public FilterRegistrationBean requestContextFilter() { FilterRegistrationBean registration = new FilterRegistrationBean<>(); registration.setFilter(new RequestContextFilter()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java index 6db961ccc1c1..7a088eb8af99 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java @@ -134,7 +134,7 @@ static class ThymeleafWebMvcConfiguration { @Bean @ConditionalOnEnabledResourceChain - @ConditionalOnMissingFilterBean(ResourceUrlEncodingFilter.class) + @ConditionalOnMissingFilterBean FilterRegistrationBean resourceUrlEncodingFilter() { FilterRegistrationBean registration = new FilterRegistrationBean<>( new ResourceUrlEncodingFilter()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java index f5fff60f90a6..8685b2f65e92 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java @@ -365,7 +365,7 @@ private void customizeResourceHandlerRegistration(ResourceHandlerRegistration re @Bean @ConditionalOnMissingBean({ RequestContextListener.class, RequestContextFilter.class }) - @ConditionalOnMissingFilterBean(RequestContextFilter.class) + @ConditionalOnMissingFilterBean public static RequestContextFilter requestContextFilter() { return new OrderedRequestContextFilter(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java index 3c3e1c3a6b28..6d79bdc79b62 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java @@ -46,7 +46,6 @@ class ConditionalOnMissingFilterBeanTests { @Test void outcomeWhenValueIsOfMissingBeanReturnsMatch() { - this.contextRunner.withUserConfiguration(WithoutTestFilterConfig.class, OnMissingWithValueConfig.class) .run((context) -> assertThat(context).satisfies(filterBeanRequirement("myOtherFilter", "testFilter"))); } diff --git a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/ROOT/pages/redirect.adoc b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/ROOT/pages/redirect.adoc index c895003a8dec..60fcfa517d1e 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/ROOT/pages/redirect.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/ROOT/pages/redirect.adoc @@ -1192,8 +1192,6 @@ * xref:reference:actuator/metrics.adoc#actuator.metrics.supported.system[#actuator.metrics.supported.system] * xref:reference:actuator/metrics.adoc#actuator.metrics.supported.system[#production-ready-metrics-system] * xref:reference:actuator/metrics.adoc#actuator.metrics.supported.tasks[#actuator.metrics.supported.tasks] -* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#actuator.metrics.supported.timed-annotation] -* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#production-ready-metrics-timed-annotation] * xref:reference:actuator/metrics.adoc#actuator.metrics.supported.tomcat[#actuator.metrics.supported.tomcat] * xref:reference:actuator/metrics.adoc#actuator.metrics.supported.tomcat[#production-ready-metrics-tomcat] * xref:reference:actuator/metrics.adoc#actuator.metrics.supported[#actuator.metrics.supported] @@ -1212,7 +1210,9 @@ * xref:reference:actuator/monitoring.adoc#actuator.monitoring.management-specific-ssl[#production-ready-management-specific-ssl] * xref:reference:actuator/monitoring.adoc#actuator.monitoring[#actuator.monitoring] * xref:reference:actuator/monitoring.adoc#actuator.monitoring[#production-ready-monitoring] +* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#actuator.metrics.supported.timed-annotation] * xref:reference:actuator/observability.adoc#actuator.observability.annotations[#actuator.observability.annotations] +* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#production-ready-metrics-timed-annotation] * xref:reference:actuator/observability.adoc#actuator.observability.common-tags[#actuator.observability.common-tags] * xref:reference:actuator/observability.adoc#actuator.observability.opentelemetry[#actuator.observability.opentelemetry] * xref:reference:actuator/observability.adoc#actuator.observability.preventing-observations[#actuator.observability.preventing-observations] diff --git a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/observability.adoc b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/observability.adoc index ac4c260c8cf4..3af8df6bbb40 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/observability.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/observability.adoc @@ -104,9 +104,9 @@ The next sections will provide more details about logging, metrics and traces. [[actuator.observability.annotations]] == Micrometer Observation Annotations support -To enable scanning of observability annotations like javadoc:io.micrometer.observation.annotation.Observed[format=annotation], javadoc:io.micrometer.core.annotation.Timed[format=annotation], javadoc:io.micrometer.core.annotation.Counted[format=annotation], javadoc:io.micrometer.core.aop.MeterTag[format=annotation] and javadoc:io.micrometer.tracing.annotation.NewSpan[format=annotation] annotations, you need to set the configprop:management.observations.annotations.enabled[] property to `true`. +To enable scanning of observability annotations like javadoc:io.micrometer.observation.annotation.Observed[format=annotation], javadoc:io.micrometer.core.annotation.Timed[format=annotation], javadoc:io.micrometer.core.annotation.Counted[format=annotation], javadoc:io.micrometer.core.aop.MeterTag[format=annotation] and javadoc:io.micrometer.tracing.annotation.NewSpan[format=annotation], you need to set the configprop:management.observations.annotations.enabled[] property to `true`. This feature is supported by Micrometer directly. Please refer to the {url-micrometer-docs-concepts}/timers.html#_the_timed_annotation[Micrometer], {url-micrometer-docs-observation}/components.html#micrometer-observation-annotations[Micrometer Observation] and {url-micrometer-tracing-docs}/api.html#_aspect_oriented_programming[Micrometer Tracing] reference docs. -NOTE: When you annotate methods or classes which are already instrumented (for example xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-data-repository[Spring Data repositories] or xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-mvc[Spring MVC controllers]), you will get duplicate observations. -In that case you can either disable the automatic instrumentation using xref:reference:actuator/observability.adoc#actuator.observability.preventing-observations[properties] or an javadoc:io.micrometer.observation.ObservationPredicate[] and rely on your annotations, or you can remove your annotation. +NOTE: When you annotate methods or classes which are already instrumented (for example, xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-data-repository[Spring Data repositories] or xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-mvc[Spring MVC controllers]), you will get duplicate observations. +In that case you can either disable the automatic instrumentation using xref:reference:actuator/observability.adoc#actuator.observability.preventing-observations[properties] or an javadoc:io.micrometer.observation.ObservationPredicate[] and rely on your annotations, or you can remove your annotations. From bf1dc09c86ca6273e98dd22a514b83b30d91f03c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 24 Feb 2025 07:52:35 +0100 Subject: [PATCH 012/179] Update copyright of changed files See gh-44323 --- .../freemarker/FreeMarkerServletWebConfiguration.java | 2 +- .../boot/autoconfigure/jersey/JerseyAutoConfiguration.java | 2 +- .../boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java | 2 +- .../web/servlet/ConditionalOnMissingFilterBeanTests.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java index 143859aaae3f..4e10385f3e83 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java index e32355b18a3f..be0d886e57e9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java index 8685b2f65e92..a05c1dfbe378 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java index 6d79bdc79b62..9be535ab8201 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBeanTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From ae2cfebd937fc1042fe90338687f62c5e1020a10 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Sun, 23 Feb 2025 22:01:00 +0700 Subject: [PATCH 013/179] Fix typo in fold attribute See gh-44413 Signed-off-by: Tran Ngoc Nhan --- .../automaticmetadatageneration/MyServerProperties.java | 2 +- .../nestedproperties/MyServerProperties.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java index fdc5f258768a..2dd469ef1a9b 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java @@ -60,6 +60,6 @@ public int getPort() { public void setPort(int port) { this.port = port; } - // fold:off + // @fold:off } diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java index 67a35712c632..75654ce80e85 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java @@ -65,7 +65,7 @@ public int getPort() { public void setPort(int port) { this.port = port; } - // @fold:off // getters/setters ... + // @fold:off } From 41656bf4ee1bd2fa8c67d806a4545984dc23c0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 24 Feb 2025 08:21:07 +0100 Subject: [PATCH 014/179] Update copyright of changed files See gh-44413 --- .../automaticmetadatageneration/MyServerProperties.java | 2 +- .../nestedproperties/MyServerProperties.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java index 2dd469ef1a9b..381ce63216fc 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/MyServerProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java index 75654ce80e85..fbb00298d855 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/appendix/configurationmetadata/annotationprocessor/automaticmetadatageneration/nestedproperties/MyServerProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From c498fcbc4e7275e3791c380553c471c7866a8ac6 Mon Sep 17 00:00:00 2001 From: Johnny Lim Date: Mon, 24 Feb 2025 22:24:28 +0900 Subject: [PATCH 015/179] Add a project icon for IntelliJ IDEA See gh-44424 Signed-off-by: Johnny Lim --- .idea/.gitignore | 2 -- .idea/icon.svg | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 .idea/icon.svg diff --git a/.idea/.gitignore b/.idea/.gitignore index 1c55b6bf3a6d..5b9c492bcc3f 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,8 +1,6 @@ # Project name .name *.xml -# Project icon -icon.svg /modules/ /shelf/ /workspace.xml diff --git a/.idea/icon.svg b/.idea/icon.svg new file mode 100644 index 000000000000..d84ae1cf9fb2 --- /dev/null +++ b/.idea/icon.svg @@ -0,0 +1,20 @@ + + + + +icon-spring-boot + + + + + + From 453002b77bb4fb349d92cbee430cd8666b4baa75 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 26 Feb 2025 10:46:12 +0100 Subject: [PATCH 016/179] Add class of SslBundleSslEngineFactory to Kafka config map Closes gh-44414 --- .../boot/autoconfigure/kafka/KafkaProperties.java | 4 ++-- .../boot/autoconfigure/kafka/KafkaPropertiesTests.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java index 7352d8dfe244..ea8ebdf64d29 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1455,7 +1455,7 @@ public Map buildProperties(SslBundles sslBundles) { private Map buildPropertiesForSslBundle(SslBundles sslBundles, String name) { Properties properties = new Properties(); - properties.in(SslConfigs.SSL_ENGINE_FACTORY_CLASS_CONFIG).accept(SslBundleSslEngineFactory.class.getName()); + properties.in(SslConfigs.SSL_ENGINE_FACTORY_CLASS_CONFIG).accept(SslBundleSslEngineFactory.class); properties.in(SslBundle.class.getName()).accept(sslBundles.getBundle(name)); return properties; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaPropertiesTests.java index 08fb63213aeb..808bb4ba2705 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaPropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaPropertiesTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -108,7 +108,7 @@ void sslBundleConfiguration() { Map consumerProperties = properties .buildConsumerProperties(new DefaultSslBundleRegistry("myBundle", this.sslBundle)); assertThat(consumerProperties).containsEntry(SslConfigs.SSL_ENGINE_FACTORY_CLASS_CONFIG, - SslBundleSslEngineFactory.class.getName()); + SslBundleSslEngineFactory.class); } @Test From abf320d27354c1cbcb1ec5c979fc05c5cfa17ef1 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 26 Feb 2025 10:51:48 +0100 Subject: [PATCH 017/179] Register reflection hints for SslBundleSslEngineFactory Closes gh-44435 --- .../kafka/KafkaAutoConfiguration.java | 16 +++++++++++++++- .../kafka/KafkaAutoConfigurationTests.java | 14 +++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfiguration.java index 18e02adb854a..f933157274cc 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,9 @@ import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.producer.ProducerConfig; +import org.springframework.aot.hint.MemberCategory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -38,6 +41,7 @@ import org.springframework.boot.ssl.SslBundles; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.ImportRuntimeHints; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; import org.springframework.kafka.core.DefaultKafkaProducerFactory; @@ -73,6 +77,7 @@ @ConditionalOnClass(KafkaTemplate.class) @EnableConfigurationProperties(KafkaProperties.class) @Import({ KafkaAnnotationDrivenConfiguration.class, KafkaStreamsAnnotationDrivenConfiguration.class }) +@ImportRuntimeHints(KafkaAutoConfiguration.KafkaRuntimeHints.class) public class KafkaAutoConfiguration { private final KafkaProperties properties; @@ -230,4 +235,13 @@ private static void setBackOffPolicy(RetryTopicConfigurationBuilder builder, Top } } + static class KafkaRuntimeHints implements RuntimeHintsRegistrar { + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + hints.reflection().registerType(SslBundleSslEngineFactory.class, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS); + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java index 0c3d0cced728..521297b534ba 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,6 +45,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.aot.hint.MemberCategory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; @@ -856,6 +859,15 @@ void specificSecurityProtocolOverridesCommonSecurityProtocol() { }); } + @Test + void shouldRegisterRuntimeHints() { + RuntimeHints runtimeHints = new RuntimeHints(); + new KafkaAutoConfiguration.KafkaRuntimeHints().registerHints(runtimeHints, getClass().getClassLoader()); + assertThat(RuntimeHintsPredicates.reflection() + .onType(SslBundleSslEngineFactory.class) + .withMemberCategories(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS)).accepts(runtimeHints); + } + private KafkaConnectionDetails kafkaConnectionDetails() { return new KafkaConnectionDetails() { From a5f86421278638c1575732d8e59afabfba4d15ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 26 Feb 2025 13:52:28 +0100 Subject: [PATCH 018/179] Start building against Spring Framework 6.2.4 snapshots See gh-44442 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f80f7541c4d2..933406a5f987 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ mavenVersion=3.9.4 mockitoVersion=5.14.2 nativeBuildToolsVersion=0.10.5 snakeYamlVersion=2.3 -springFrameworkVersion=6.2.3 +springFrameworkVersion=6.2.4-SNAPSHOT springFramework60xVersion=6.0.23 tomcatVersion=10.1.36 From 4d99e4a69fc07fe8d65cb45629c5c1db12778ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 26 Feb 2025 14:35:04 +0100 Subject: [PATCH 019/179] Revert "Start building against Spring Framework 6.2.4 snapshots" This reverts commit a5f86421278638c1575732d8e59afabfba4d15ff. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 933406a5f987..f80f7541c4d2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ mavenVersion=3.9.4 mockitoVersion=5.14.2 nativeBuildToolsVersion=0.10.5 snakeYamlVersion=2.3 -springFrameworkVersion=6.2.4-SNAPSHOT +springFrameworkVersion=6.2.3 springFramework60xVersion=6.0.23 tomcatVersion=10.1.36 From d04620d5b341a41ecc11db2d75df9458857297a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 26 Feb 2025 15:15:30 +0100 Subject: [PATCH 020/179] Polish test Include at least a bean declaration to make sure the cglib proxy is created --- .../org/springframework/boot/SpringApplicationTests.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index ccd17f15ae3d..669f4f1f5924 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1588,6 +1588,11 @@ static class InaccessibleConfiguration { private InaccessibleConfiguration() { } + @Bean + String testMessage() { + return "test"; + } + } static class SpyApplicationContext extends AnnotationConfigApplicationContext { From 3acea583ad0f97b2cfa3dc463668ec1488ef254c Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 24 Feb 2025 10:22:58 +0000 Subject: [PATCH 021/179] Add support for working with resources in tests Closes gh-44444 --- .../classpath/resources/ResourceContent.java | 44 ++++ .../classpath/resources/ResourcePath.java | 48 +++++ .../classpath/resources/Resources.java | 130 ++++++++++++ .../resources/ResourcesClassLoader.java | 62 ++++++ .../resources/ResourcesExtension.java | 189 ++++++++++++++++++ .../classpath/resources/ResourcesRoot.java | 41 ++++ .../resources/WithPackageResources.java | 45 +++++ .../classpath/resources/WithResource.java | 57 ++++++ .../resources/WithResourceDirectories.java | 39 ++++ .../resources/WithResourceDirectory.java | 47 +++++ .../classpath/resources/WithResources.java | 39 ++++ .../classpath/resources/package-info.java | 20 ++ .../OnClassWithPackageResourcesTests.java | 44 ++++ .../resources/OnClassWithResourceTests.java | 89 +++++++++ ...OnSuperClassWithPackageResourcesTests.java | 43 ++++ .../OnSuperClassWithResourceTests.java | 62 ++++++ .../classpath/resources/ResourcesTests.java | 132 ++++++++++++ .../resources/WithPackageResourcesClass.java | 27 +++ .../resources/WithPackageResourcesTests.java | 53 +++++ .../resources/WithResourceClass.java | 27 +++ .../resources/WithResourceDirectoryTests.java | 56 ++++++ .../resources/WithResourceTests.java | 100 +++++++++ .../classpath/resources/resource-1.txt | 1 + .../classpath/resources/resource-2.txt | 1 + .../classpath/resources/sub/resource-3.txt | 1 + 25 files changed, 1397 insertions(+) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourceContent.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcePath.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/Resources.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesExtension.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesRoot.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResources.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResource.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectories.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectory.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResources.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/package-info.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithPackageResourcesTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithResourceTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithPackageResourcesTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithResourceTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/ResourcesTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesClass.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceClass.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectoryTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-1.txt create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-2.txt create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/sub/resource-3.txt diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourceContent.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourceContent.java new file mode 100644 index 000000000000..85a81e3aa395 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourceContent.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation that indicates that the content of a resource should be injected. Supported + * on parameters of type: + * + *
    + *
  • {@link String}
  • + *
+ * + * @author Andy Wilkinson + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface ResourceContent { + + /** + * The name of the resource whose content should be injected. + * @return the resource name + */ + String value(); + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcePath.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcePath.java new file mode 100644 index 000000000000..95644acee2f2 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcePath.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.File; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.nio.file.Path; + +/** + * Annotation that indicates that the path of a resource should be injected. Supported on + * parameters of type: + * + *
    + *
  • {@link File}
  • + *
  • {@link Path}
  • + *
  • {@link String}
  • + *
+ * + * @author Andy Wilkinson + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface ResourcePath { + + /** + * The name of the resource whose path should be injected. + * @return the resource name + */ + String value(); + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/Resources.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/Resources.java new file mode 100644 index 000000000000..331b2b640590 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/Resources.java @@ -0,0 +1,130 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; + +import org.springframework.util.Assert; +import org.springframework.util.FileSystemUtils; + +/** + * A collection of resources. + * + * @author Andy Wilkinson + */ +class Resources { + + private final Path root; + + Resources(Path root) { + this.root = root; + } + + Resources addPackage(Package root, String[] resourceNames) { + Set unmatchedNames = new HashSet<>(Arrays.asList(resourceNames)); + try { + Enumeration sources = getClass().getClassLoader().getResources(root.getName().replace(".", "/")); + for (URL source : Collections.list(sources)) { + Path sourceRoot = Paths.get(source.toURI()); + for (String resourceName : resourceNames) { + Path resource = sourceRoot.resolve(resourceName); + if (Files.isRegularFile(resource)) { + Path target = this.root.resolve(resourceName); + Path targetDirectory = target.getParent(); + if (!Files.isDirectory(targetDirectory)) { + Files.createDirectories(targetDirectory); + } + Files.copy(resource, target); + unmatchedNames.remove(resourceName); + } + } + } + Assert.isTrue(unmatchedNames.isEmpty(), + "Package '" + root.getName() + "' did not contain resources: " + unmatchedNames); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + catch (URISyntaxException ex) { + throw new RuntimeException(ex); + } + return this; + } + + Resources addResource(String name, String content) { + Path resourcePath = this.root.resolve(name); + if (Files.isDirectory(resourcePath)) { + throw new IllegalStateException( + "Cannot create resource '" + name + "' as a directory already exists at that location"); + } + Path parent = resourcePath.getParent(); + try { + if (!Files.isDirectory(resourcePath)) { + Files.createDirectories(parent); + } + Files.writeString(resourcePath, processContent(content)); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + return this; + } + + private String processContent(String content) { + return content.replace("${resourceRoot}", this.root.toString()); + } + + Resources addDirectory(String name) { + Path directoryPath = this.root.resolve(name); + if (Files.isRegularFile(directoryPath)) { + throw new IllegalStateException( + "Cannot create directory '" + name + " as a file already exists at that location"); + } + try { + Files.createDirectories(directoryPath); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + return this; + } + + void delete() { + try { + FileSystemUtils.deleteRecursively(this.root); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + + Path getRoot() { + return this.root; + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java new file mode 100644 index 000000000000..1459f60680ac --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +/** + * A {@link ClassLoader} that provides access to {@link Resources resources}. + * + * @author Andy Wilkinson + */ +class ResourcesClassLoader extends ClassLoader { + + private final Resources resources; + + ResourcesClassLoader(ClassLoader parent, Resources resources) { + super(parent); + this.resources = resources; + } + + @Override + protected URL findResource(String name) { + Path resource = this.resources.getRoot().resolve(name); + if (Files.exists(resource)) { + try { + return resource.toUri().toURL(); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + return null; + } + + @Override + protected Enumeration findResources(String name) throws IOException { + URL resourceUrl = findResource(name); + return (resourceUrl != null) ? Collections.enumeration(List.of(resourceUrl)) : Collections.emptyEnumeration(); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesExtension.java new file mode 100644 index 000000000000..72b75d24e360 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesExtension.java @@ -0,0 +1,189 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ExtensionContext.Namespace; +import org.junit.jupiter.api.extension.ExtensionContext.Store; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.junit.platform.commons.support.AnnotationSupport; +import org.junit.platform.commons.support.SearchOption; + +import org.springframework.util.StreamUtils; + +/** + * {@link Extension} for managing resources in tests. Resources are made available through + * {@link Thread#getContextClassLoader() thread context class loader}. + * + * @author Andy Wilkinson + * @see WithPackageResources + * @see WithResource + * @see WithResourceDirectory + */ +class ResourcesExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver { + + private static final String RESOURCES_KEY = ResourcesExtension.class.getName() + ".resources"; + + private static final String TCCL_KEY = ResourcesExtension.class.getName() + ".tccl"; + + @Override + public void beforeEach(ExtensionContext context) throws Exception { + Store store = context.getStore(Namespace.create(ResourcesExtension.class)); + Resources resources = new Resources(Files.createTempDirectory("resources")); + store.put(RESOURCES_KEY, resources); + Method testMethod = context.getRequiredTestMethod(); + resourcesOf(testMethod).forEach((resource) -> resources.addResource(resource.name(), resource.content())); + resourceDirectoriesOf(testMethod).forEach((directory) -> resources.addDirectory(directory.value())); + packageResourcesOf(testMethod).forEach((withPackageResources) -> resources + .addPackage(testMethod.getDeclaringClass().getPackage(), withPackageResources.value())); + ResourcesClassLoader classLoader = new ResourcesClassLoader(context.getRequiredTestClass().getClassLoader(), + resources); + store.put(TCCL_KEY, Thread.currentThread().getContextClassLoader()); + Thread.currentThread().setContextClassLoader(classLoader); + } + + private List resourcesOf(Method method) { + return withAnnotationsOf(method, WithResource.class); + } + + private List resourceDirectoriesOf(Method method) { + return withAnnotationsOf(method, WithResourceDirectory.class); + } + + private List withAnnotationsOf(Method method, Class annotationType) { + List annotations = new ArrayList<>(); + AnnotationSupport.findRepeatableAnnotations(method, annotationType).forEach(annotations::add); + Class type = method.getDeclaringClass(); + while (type != null) { + AnnotationSupport.findRepeatableAnnotations(type, annotationType).forEach(annotations::add); + type = type.getEnclosingClass(); + } + return annotations; + } + + private List packageResourcesOf(Method method) { + List annotations = new ArrayList<>(); + AnnotationSupport.findAnnotation(method, WithPackageResources.class).ifPresent(annotations::add); + AnnotationSupport + .findAnnotation(method.getDeclaringClass(), WithPackageResources.class, + SearchOption.INCLUDE_ENCLOSING_CLASSES) + .ifPresent(annotations::add); + return annotations; + } + + @Override + public void afterEach(ExtensionContext context) throws Exception { + Store store = context.getStore(Namespace.create(ResourcesExtension.class)); + store.get(RESOURCES_KEY, Resources.class).delete(); + Thread.currentThread().setContextClassLoader(store.get(TCCL_KEY, ClassLoader.class)); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return parameterContext.isAnnotated(ResourcesRoot.class) || parameterContext.isAnnotated(ResourcePath.class) + || parameterContext.isAnnotated(ResourceContent.class); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + if (parameterContext.isAnnotated(ResourcesRoot.class)) { + return resolveResourcesRoot(parameterContext, extensionContext); + } + if (parameterContext.isAnnotated(ResourcePath.class)) { + return resolveResourcePath(parameterContext, extensionContext); + } + if (parameterContext.isAnnotated(ResourceContent.class)) { + return resolveResourceContent(parameterContext, extensionContext); + } + throw new ParameterResolutionException( + "Parameter is not annotated with @ResourcesRoot, @ResourceContent, or @ResourcePath"); + } + + private Object resolveResourcesRoot(ParameterContext parameterContext, ExtensionContext extensionContext) { + Resources resources = getResources(extensionContext); + Class parameterType = parameterContext.getParameter().getType(); + if (parameterType.isAssignableFrom(Path.class)) { + return resources.getRoot(); + } + else if (parameterType.isAssignableFrom(File.class)) { + return resources.getRoot().toFile(); + } + throw new IllegalStateException( + "@ResourcesRoot is not supported with parameter type '" + parameterType.getName() + "'"); + } + + private Object resolveResourcePath(ParameterContext parameterContext, ExtensionContext extensionContext) { + Resources resources = getResources(extensionContext); + Class parameterType = parameterContext.getParameter().getType(); + Path resourcePath = resources.getRoot() + .resolve(parameterContext.findAnnotation(ResourcePath.class).get().value()); + if (parameterType.isAssignableFrom(Path.class)) { + return resourcePath; + } + else if (parameterType.isAssignableFrom(File.class)) { + return resourcePath.toFile(); + } + else if (parameterType.isAssignableFrom(String.class)) { + return resourcePath.toString(); + } + throw new IllegalStateException( + "@ResourcePath is not supported with parameter type '" + parameterType.getName() + "'"); + } + + private Object resolveResourceContent(ParameterContext parameterContext, ExtensionContext extensionContext) { + Resources resources = getResources(extensionContext); + Class parameterType = parameterContext.getParameter().getType(); + Path resourcePath = resources.getRoot() + .resolve(parameterContext.findAnnotation(ResourceContent.class).get().value()); + if (parameterType.isAssignableFrom(String.class)) { + try (InputStream in = Files.newInputStream(resourcePath)) { + return StreamUtils.copyToString(in, StandardCharsets.UTF_8); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + throw new IllegalStateException( + "@ResourceContent is not supported with parameter type '" + parameterType.getName() + "'"); + } + + private Resources getResources(ExtensionContext extensionContext) { + Store store = extensionContext.getStore(Namespace.create(ResourcesExtension.class)); + Resources resources = store.get(RESOURCES_KEY, Resources.class); + return resources; + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesRoot.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesRoot.java new file mode 100644 index 000000000000..f3d7123c30d9 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesRoot.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.File; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.nio.file.Path; + +/** + * Annotation that indicates that the resources root should be injected. Supported on + * parameters of type: + * + *
    + *
  • {@link File}
  • + *
  • {@link Path}
  • + *
+ * + * @author Andy Wilkinson + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface ResourcesRoot { + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResources.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResources.java new file mode 100644 index 000000000000..074d05bdf7ec --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResources.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * Makes resources in the package of the annotated class available from the root of the + * classpath. + * + * @author Andy Wilkinson + */ +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +@ExtendWith(ResourcesExtension.class) +public @interface WithPackageResources { + + /** + * The resources to make available from the root. + * @return the resources + */ + String[] value(); + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResource.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResource.java new file mode 100644 index 000000000000..bb573bb666c5 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResource.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * Makes a resource directory available from the thread context class loader. + *

+ * For cases where one resource needs to refer to another, the resource's content may + * contain the placeholder ${resourceRoot}. It will be replaced with the path + * to the root of the resources. For example, a resource with the {@link #name} + * {@code example.txt} can be referenced using ${resourceRoot}/example.txt. + * + * @author Andy Wilkinson + */ +@Inherited +@Repeatable(WithResources.class) +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +@ExtendWith(ResourcesExtension.class) +public @interface WithResource { + + /** + * The name of the resource. + * @return the name + */ + String name(); + + /** + * The content of the resource. When omitted an empty resource will be created. + * @return the content + */ + String content() default ""; + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectories.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectories.java new file mode 100644 index 000000000000..973931c65c29 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectories.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Container annotation for {@link WithResourceDirectory}. + * + * @author Andy Wilkinson + */ +@Inherited +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +public @interface WithResourceDirectories { + + WithResourceDirectory[] value(); + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectory.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectory.java new file mode 100644 index 000000000000..95fb2ef7585f --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectory.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * Makes a resource available from the thread context class loader. Typically used when a + * test requires an empty directory to exist. + * + * @author Andy Wilkinson + */ +@Inherited +@Repeatable(WithResourceDirectories.class) +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +@ExtendWith(ResourcesExtension.class) +public @interface WithResourceDirectory { + + /** + * The name of the directory. + * @return the name + */ + String value(); + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResources.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResources.java new file mode 100644 index 000000000000..1f9b72e767b9 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/WithResources.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Container annotation for {@link WithResource}. + * + * @author Andy Wilkinson + */ +@Inherited +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +public @interface WithResources { + + WithResource[] value(); + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/package-info.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/package-info.java new file mode 100644 index 000000000000..ddc2e5c98ecb --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Custom JUnit extension for testing with resources. + */ +package org.springframework.boot.testsupport.classpath.resources; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithPackageResourcesTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithPackageResourcesTests.java new file mode 100644 index 000000000000..31949514396f --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithPackageResourcesTests.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WithPackageResources} on a class. + * + * @author Andy Wilkinson + */ +@WithPackageResources({ "resource-1.txt", "resource-2.txt", "sub/resource-3.txt" }) +class OnClassWithPackageResourcesTests { + + @Test + void whenWithPackageResourcesIsUsedOnAClassThenResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("resource-1.txt").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("one"); + assertThat(new ClassPathResource("resource-2.txt").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("two"); + assertThat(new ClassPathResource("sub/resource-3.txt").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("three"); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithResourceTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithResourceTests.java new file mode 100644 index 000000000000..a1c701e166c7 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnClassWithResourceTests.java @@ -0,0 +1,89 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WithResource} when used on a class. + * + * @author Andy Wilkinson + */ +@WithResource(name = "on-class", content = "class content") +class OnClassWithResourceTests { + + @Test + void whenWithResourceIsUsedOnAClassThenResourceIsAvailable() throws IOException { + assertThat(new ClassPathResource("on-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("class content"); + } + + @Test + @WithResource(name = "method-resource", content = "method") + void whenWithResourceIsUsedOnClassAndMethodThenBothResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("on-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("class content"); + assertThat(new ClassPathResource("method-resource").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("method"); + } + + @Test + @WithResource(name = "method-resource-1", content = "method-1") + @WithResource(name = "method-resource-2", content = "method-2") + void whenWithResourceIsUsedOnClassAndRepeatedOnMethodThenAllResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("on-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("class content"); + assertThat(new ClassPathResource("method-resource-1").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("method-1"); + assertThat(new ClassPathResource("method-resource-2").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("method-2"); + } + + @Nested + class NestedTests { + + @Test + void whenWithResourceIsUsedOnEnclosingClassThenResourceIsAvailable() throws IOException { + assertThat(new ClassPathResource("on-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("class content"); + } + + } + + @Nested + @WithResource(name = "on-nested-class", content = "nested class content") + class WithResourceNestedTests { + + @Test + void whenWithResourceIsUsedOnEnclosingClassAndClassThenBothResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("on-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("class content"); + assertThat(new ClassPathResource("on-nested-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("nested class content"); + } + + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithPackageResourcesTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithPackageResourcesTests.java new file mode 100644 index 000000000000..2a3b3739a097 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithPackageResourcesTests.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WithPackageResources} when used on a super-class. + * + * @author Andy Wilkinson + */ +class OnSuperClassWithPackageResourcesTests extends WithPackageResourcesClass { + + @Test + void whenWithPackageResourcesIsUsedOnASuperClassThenResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("resource-1.txt").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("one"); + assertThat(new ClassPathResource("resource-2.txt").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("two"); + assertThat(new ClassPathResource("sub/resource-3.txt").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("three"); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithResourceTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithResourceTests.java new file mode 100644 index 000000000000..2e47735fb148 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/OnSuperClassWithResourceTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WithResource} when used on a super-class. + * + * @author Andy Wilkinson + */ +class OnSuperClassWithResourceTests extends WithResourceClass { + + @Test + void whenWithResourceIsUsedOnASuperClassThenResourceIsAvailable() throws IOException { + assertThat(new ClassPathResource("on-super-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("super-class content"); + } + + @Test + @WithResource(name = "method-resource", content = "method") + void whenWithResourceIsUsedOnASuperClassAndMethodThenBothResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("on-super-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("super-class content"); + assertThat(new ClassPathResource("method-resource").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("method"); + } + + @Test + @WithResource(name = "method-resource-1", content = "method-1") + @WithResource(name = "method-resource-2", content = "method-2") + void whenWithResourceIsUsedOnASuperClassAndRepeatedOnMethodThenAllResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("on-super-class").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("super-class content"); + assertThat(new ClassPathResource("method-resource-1").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("method-1"); + assertThat(new ClassPathResource("method-resource-2").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("method-2"); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/ResourcesTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/ResourcesTests.java new file mode 100644 index 000000000000..c91d508c68e0 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/ResourcesTests.java @@ -0,0 +1,132 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link Resources}. + * + * @author Andy Wilkinson + */ +class ResourcesTests { + + @TempDir + private Path root; + + @Test + void whenAddResourceThenResourceIsCreated() { + new Resources(this.root).addResource("test", "test-content"); + assertThat(this.root.resolve("test")).hasContent("test-content"); + } + + @Test + void whenAddResourceHasContentReferencingResourceRootThenResourceIsCreatedWithReferenceToRoot() { + new Resources(this.root).addResource("test", "*** ${resourceRoot} ***"); + assertThat(this.root.resolve("test")).hasContent("*** " + this.root + " ***"); + } + + @Test + void whenAddResourceWithPathThenResourceIsCreated() { + new Resources(this.root).addResource("a/b/c/test", "test-content"); + assertThat(this.root.resolve("a/b/c/test")).hasContent("test-content"); + } + + @Test + void whenAddResourceAndResourceAlreadyExistsThenResourcesIsOverwritten() { + Resources resources = new Resources(this.root); + resources.addResource("a/b/c/test", "original-content"); + resources.addResource("a/b/c/test", "new-content"); + assertThat(this.root.resolve("a/b/c/test")).hasContent("new-content"); + } + + @Test + void whenAddPackageThenNamedResourcesFromPackageAreCreated() { + new Resources(this.root).addPackage(getClass().getPackage(), + new String[] { "resource-1.txt", "sub/resource-3.txt" }); + assertThat(this.root.resolve("resource-1.txt")).hasContent("one"); + assertThat(this.root.resolve("resource-2.txt")).doesNotExist(); + assertThat(this.root.resolve("sub/resource-3.txt")).hasContent("three"); + } + + @Test + void whenAddResourceAndDeleteThenResourceDoesNotExist() { + Resources resources = new Resources(this.root); + resources.addResource("test", "test-content"); + assertThat(this.root.resolve("test")).hasContent("test-content"); + resources.delete(); + assertThat(this.root.resolve("test")).doesNotExist(); + } + + @Test + void whenAddPackageAndDeleteThenResourcesDoNotExist() { + Resources resources = new Resources(this.root); + resources.addPackage(getClass().getPackage(), + new String[] { "resource-1.txt", "resource-2.txt", "sub/resource-3.txt" }); + assertThat(this.root.resolve("resource-1.txt")).hasContent("one"); + assertThat(this.root.resolve("resource-2.txt")).hasContent("two"); + assertThat(this.root.resolve("sub/resource-3.txt")).hasContent("three"); + resources.delete(); + assertThat(this.root.resolve("resource-1.txt")).doesNotExist(); + assertThat(this.root.resolve("resource-2.txt")).doesNotExist(); + assertThat(this.root.resolve("sub/resource-3.txt")).doesNotExist(); + assertThat(this.root.resolve("sub")).doesNotExist(); + } + + @Test + void whenAddDirectoryThenDirectoryIsCreated() { + Resources resources = new Resources(this.root); + resources.addDirectory("dir"); + assertThat(this.root.resolve("dir")).isDirectory(); + } + + @Test + void whenAddDirectoryWithPathThenDirectoryIsCreated() { + Resources resources = new Resources(this.root); + resources.addDirectory("one/two/three/dir"); + assertThat(this.root.resolve("one/two/three/dir")).isDirectory(); + } + + @Test + void whenAddDirectoryAndDirectoryAlreadyExistsThenDoesNotThrow() { + Resources resources = new Resources(this.root); + resources.addDirectory("one/two/three/dir"); + resources.addDirectory("one/two/three/dir"); + assertThat(this.root.resolve("one/two/three/dir")).isDirectory(); + } + + @Test + void whenAddDirectoryAndResourceAlreadyExistsThenIllegalStateExceptionIsThrown() { + Resources resources = new Resources(this.root); + resources.addResource("one/two/three/", "content"); + assertThatIllegalStateException().isThrownBy(() -> resources.addDirectory("one/two/three")); + } + + @Test + void whenAddResourceAndDirectoryAlreadyExistsThenIllegalStateExceptionIsThrown() { + Resources resources = new Resources(this.root); + resources.addDirectory("one/two/three"); + assertThatIllegalStateException().isThrownBy(() -> resources.addResource("one/two/three", "content")); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesClass.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesClass.java new file mode 100644 index 000000000000..754e48c8fb7d --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesClass.java @@ -0,0 +1,27 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +/** + * Class to test the use of {@link WithPackageResources} on a super-class. + * + * @author Andy Wilkinson + */ +@WithPackageResources({ "resource-1.txt", "resource-2.txt", "sub/resource-3.txt" }) +class WithPackageResourcesClass { + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesTests.java new file mode 100644 index 000000000000..8d5f425b30c5 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithPackageResourcesTests.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WithPackageResources}. + * + * @author Andy Wilkinson + */ +class WithPackageResourcesTests { + + @Test + @WithPackageResources({ "resource-1.txt", "resource-2.txt", "sub/resource-3.txt" }) + void whenWithPackageResourcesIsUsedOnAMethodThenResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("resource-1.txt").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("one"); + assertThat(new ClassPathResource("resource-2.txt").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("two"); + assertThat(new ClassPathResource("sub/resource-3.txt").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("three"); + } + + @Test + @WithPackageResources("sub/resource-3.txt") + void whenWithPackageResourcesOnlyIncludesSomeResourcesThenOnlyIncludedResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("resource-1.txt").exists()).isFalse(); + assertThat(new ClassPathResource("resource-2.txt").exists()).isFalse(); + assertThat(new ClassPathResource("sub/resource-3.txt").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("three"); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceClass.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceClass.java new file mode 100644 index 000000000000..0b386bbd5fbc --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceClass.java @@ -0,0 +1,27 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +/** + * Class to test the use of {@link WithResource} on a super-class + * + * @author Andy Wilkinson + */ +@WithResource(name = "on-super-class", content = "super-class content") +class WithResourceClass { + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectoryTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectoryTests.java new file mode 100644 index 000000000000..7e3d29a4de6f --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceDirectoryTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.IOException; + +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WithResourceDirectory}. + * + * @author Andy Wilkinson + */ +class WithResourceDirectoryTests { + + @Test + @WithResourceDirectory("test") + void whenWithResourceDirectoryIsUsedOnAMethodThenDirectoryIsCreated() throws IOException { + assertThat(new ClassPathResource("test").getFile()).isDirectory(); + } + + @Test + @WithResourceDirectory("com/example/nested") + void whenWithResourceDirectoryNamesANestedDirectoryThenDirectoryIsCreated() throws IOException { + assertThat(new ClassPathResource("com/example/nested").getFile()).isDirectory(); + } + + @Test + @WithResourceDirectory("1") + @WithResourceDirectory("2") + @WithResourceDirectory("3") + void whenWithResourceDirectoryIsRepeatedOnAMethodThenAllResourceDirectoriesAreCreated() throws IOException { + assertThat(new ClassPathResource("1").getFile()).isDirectory(); + assertThat(new ClassPathResource("2").getFile()).isDirectory(); + assertThat(new ClassPathResource("3").getFile()).isDirectory(); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceTests.java new file mode 100644 index 000000000000..87e15b16c410 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/java/org/springframework/boot/testsupport/classpath/resources/WithResourceTests.java @@ -0,0 +1,100 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.classpath.resources; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WithResource}. + * + * @author Andy Wilkinson + */ +class WithResourceTests { + + @Test + @WithResource(name = "test", content = "content") + void whenWithResourceIsUsedOnAMethodThenResourceIsAvailable() throws IOException { + assertThat(new ClassPathResource("test").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("content"); + } + + @Test + @WithResource(name = "test", content = "content") + void whenWithResourceIsUsedOnAMethodThenResourceIsAvailableFromFileResourcesRoot(@ResourcesRoot File root) { + assertThat(new File(root, "test")).hasContent("content"); + } + + @Test + @WithResource(name = "test", content = "content") + void whenWithResourceIsUsedOnAMethodThenResourceIsAvailableFromPathResourcesRoot(@ResourcesRoot Path root) { + assertThat(root.resolve("test")).hasContent("content"); + } + + @Test + @WithResource(name = "test", content = "content") + void whenWithResourceIsUsedOnAMethodThenResourceIsAvailableFromPathResourcePath( + @ResourcePath("test") Path resource) { + assertThat(resource).hasContent("content"); + } + + @Test + @WithResource(name = "test", content = "content") + void whenWithResourceIsUsedOnAMethodThenResourceIsAvailableFromFileResourcePath( + @ResourcePath("test") File resource) { + assertThat(resource).hasContent("content"); + } + + @Test + @WithResource(name = "test", content = "content") + void whenWithResourceIsUsedOnAMethodThenResourceIsAvailableFromStringResourcePath( + @ResourcePath("test") String resource) { + assertThat(new File(resource)).hasContent("content"); + } + + @Test + @WithResource(name = "test", content = "content") + void whenWithResourceIsUsedOnAMethodThenResourceContentIsAvailableAsAString( + @ResourceContent("test") String content) { + assertThat(content).isEqualTo("content"); + } + + @Test + @WithResource(name = "com/example/test-resource", content = "content") + void whenWithResourceNameIncludesADirectoryThenResourceIsAvailable() throws IOException { + assertThat(new ClassPathResource("com/example/test-resource").getContentAsString(StandardCharsets.UTF_8)) + .isEqualTo("content"); + } + + @Test + @WithResource(name = "1", content = "one") + @WithResource(name = "2", content = "two") + @WithResource(name = "3", content = "three") + void whenWithResourceIsRepeatedOnAMethodThenAllResourcesAreAvailable() throws IOException { + assertThat(new ClassPathResource("1").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("one"); + assertThat(new ClassPathResource("2").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("two"); + assertThat(new ClassPathResource("3").getContentAsString(StandardCharsets.UTF_8)).isEqualTo("three"); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-1.txt b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-1.txt new file mode 100644 index 000000000000..43dd47ea691c --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-1.txt @@ -0,0 +1 @@ +one \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-2.txt b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-2.txt new file mode 100644 index 000000000000..64c5e5885a4b --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/resource-2.txt @@ -0,0 +1 @@ +two \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/sub/resource-3.txt b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/sub/resource-3.txt new file mode 100644 index 000000000000..1d19714ffbc2 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/test/resources/org/springframework/boot/testsupport/classpath/resources/sub/resource-3.txt @@ -0,0 +1 @@ +three \ No newline at end of file From 56c955158d76461e3c1434c4a3dc6c7cdde04191 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 24 Feb 2025 10:51:30 +0000 Subject: [PATCH 022/179] Use Framework's default class loader as default in ImportCandidates Closes gh-44401 --- .../boot/context/annotation/ImportCandidates.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java index 59fe569e94fb..24450a9aaab1 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import org.springframework.core.io.UrlResource; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * Contains {@code @Configuration} import candidates, usually auto-configurations. @@ -74,7 +75,8 @@ public List getCandidates() { * Every line contains the full qualified name of the candidate class. Comments are * supported using the # character. * @param annotation annotation to load - * @param classLoader class loader to use for loading + * @param classLoader class loader to use for loading, or {@code null} to use the + * {@link ClassUtils#getDefaultClassLoader() default class loader} * @return list of names of annotated classes */ public static ImportCandidates load(Class annotation, ClassLoader classLoader) { @@ -92,7 +94,7 @@ public static ImportCandidates load(Class annotation, ClassLoader classLoader private static ClassLoader decideClassloader(ClassLoader classLoader) { if (classLoader == null) { - return ImportCandidates.class.getClassLoader(); + return ClassUtils.getDefaultClassLoader(); } return classLoader; } From 5be5eaf7f28bc2aea5d512f46a3786604dc60e4e Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 24 Feb 2025 19:46:52 +0000 Subject: [PATCH 023/179] Use ClassLoader from ResourceLoader to load PropertySourceLoaders Fixes gh-44427 --- .../context/config/StandardConfigDataLocationResolver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/StandardConfigDataLocationResolver.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/StandardConfigDataLocationResolver.java index beb076ad8692..5da6bd1bb7a3 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/StandardConfigDataLocationResolver.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/StandardConfigDataLocationResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -89,7 +89,7 @@ public StandardConfigDataLocationResolver(DeferredLogFactory logFactory, Binder ResourceLoader resourceLoader) { this.logger = logFactory.getLog(StandardConfigDataLocationResolver.class); this.propertySourceLoaders = SpringFactoriesLoader.loadFactories(PropertySourceLoader.class, - getClass().getClassLoader()); + resourceLoader.getClassLoader()); this.configNames = getConfigNames(binder); this.resourceLoader = new LocationResourceLoader(resourceLoader); } From 88745820d32398a0965cc48ed4e5b8629ead6f49 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 26 Feb 2025 12:38:30 +0000 Subject: [PATCH 024/179] Close InputStream after reading banner resource Fixes gh-44441 --- .../main/java/org/springframework/boot/ResourceBanner.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ResourceBanner.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ResourceBanner.java index 4164f92bd2a9..5ed5bfe7c763 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ResourceBanner.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ResourceBanner.java @@ -16,6 +16,7 @@ package org.springframework.boot; +import java.io.InputStream; import java.io.PrintStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -63,8 +64,8 @@ public ResourceBanner(Resource resource) { @Override public void printBanner(Environment environment, Class sourceClass, PrintStream out) { - try { - String banner = StreamUtils.copyToString(this.resource.getInputStream(), + try (InputStream input = this.resource.getInputStream()) { + String banner = StreamUtils.copyToString(input, environment.getProperty("spring.banner.charset", Charset.class, StandardCharsets.UTF_8)); for (PropertyResolver resolver : getPropertyResolvers(environment, sourceClass)) { banner = resolver.resolvePlaceholders(banner); From 8577718b228a133d24ff0303c8a0607fde64eeed Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 26 Feb 2025 13:03:28 +0000 Subject: [PATCH 025/179] Close InputStream when loading PEM content from a resource Fixes gh-44443 --- .../java/org/springframework/boot/ssl/pem/PemContent.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ssl/pem/PemContent.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ssl/pem/PemContent.java index cadb6b215ad1..ebdc4f4ce022 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ssl/pem/PemContent.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ssl/pem/PemContent.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -118,8 +118,8 @@ static PemContent load(String content, ResourceLoader resourceLoader) throws IOE if (isPresentInText(content)) { return new PemContent(content); } - try { - return load(resourceLoader.getResource(content).getInputStream()); + try (InputStream in = resourceLoader.getResource(content).getInputStream()) { + return load(in); } catch (IOException | UncheckedIOException ex) { throw new IOException("Error reading certificate or key from file '%s'".formatted(content), ex); From 3de189a1df1335a2b2c24ccd3078c0178e5f17eb Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 25 Feb 2025 21:10:19 +0000 Subject: [PATCH 026/179] Minimize test resources and move remainder to appropriate packages Closes gh-44397 --- .../boot/BeanDefinitionLoaderTests.java | 36 +- .../springframework/boot/SimpleMainTests.java | 4 +- .../SpringApplicationBannerPrinterTests.java | 6 +- .../boot/SpringApplicationTests.java | 28 +- .../boot/WithSampleBeansXmlResource.java | 47 ++ .../SpringApplicationBuilderTests.java | 15 +- .../annotation/ImportCandidatesTests.java | 15 +- .../AnsiOutputApplicationListenerTests.java | 10 +- ...essorBootstrapContextIntegrationTests.java | 20 +- ...edWithProfileSpecificIntegrationTests.java | 21 +- ...ironmentPostProcessorIntegrationTests.java | 796 +++++++++++++----- ...nfigDataEnvironmentPostProcessorTests.java | 5 +- .../config/ConfigDataEnvironmentTests.java | 59 +- .../ConfigDataLocationRuntimeHintsTests.java | 21 +- .../config/StandardConfigDataLoaderTests.java | 31 +- ...andardConfigDataLocationResolverTests.java | 80 +- .../LoggingApplicationListenerTests.java | 35 +- .../ConfigurationPropertiesTests.java | 21 +- .../convert/StringToFileConverterTests.java | 8 +- ...queBeanDefinitionFailureAnalyzerTests.java | 29 +- .../OriginTrackedPropertiesLoaderTests.java | 43 +- .../env/OriginTrackedYamlLoaderTests.java | 91 +- .../PropertiesPropertySourceLoaderTests.java | 64 +- .../env/YamlPropertySourceLoaderTests.java | 11 +- ...aSourceScriptDatabaseInitializerTests.java | 3 +- .../boot/json/AbstractJsonParserTests.java | 23 +- .../boot/json/GsonJsonParserTests.java | 6 +- .../boot/json/JacksonJsonParserTests.java | 4 +- .../logging/java/JavaLoggingSystemTests.java | 7 +- .../log4j2/Log4J2LoggingSystemTests.java | 63 +- .../log4j2/SpringProfileArbiterTests.java | 66 +- .../logback/LogbackConfigurationTests.java | 45 +- .../logback/LogbackLoggingSystemTests.java | 131 ++- .../SpringBootJoranConfiguratorTests.java | 167 +++- .../netty/NettyRSocketServerFactoryTests.java | 62 +- ...bstractScriptDatabaseInitializerTests.java | 42 +- .../boot/ssl/jks/JksSslStoreBundleTests.java | 9 + .../boot/ssl/pem/LoadedPemSslStoreTests.java | 8 +- .../ssl/pem/PemCertificateParserTests.java | 5 +- .../boot/ssl/pem/PemContentTests.java | 23 +- .../ssl/pem/PemPrivateKeyParserTests.java | 67 +- .../boot/ssl/pem/PemSslStoreBundleTests.java | 12 +- ...stractClientHttpRequestFactoriesTests.java | 4 +- .../JettyServletWebServerFactoryTests.java | 27 +- .../jetty/SslServerCustomizerTests.java | 7 +- .../NettyReactiveWebServerFactoryTests.java | 9 +- .../tomcat/SslConnectorCustomizerTests.java | 11 +- .../TomcatServletWebServerFactoryTests.java | 6 +- .../UndertowServletWebServerFactoryTests.java | 24 +- .../view/MustacheViewResolverTests.java | 8 +- .../result/view/MustacheViewTests.java | 9 +- ...AbstractReactiveWebServerFactoryTests.java | 23 +- .../web/server/WebServerSslBundleTests.java | 11 +- .../ServletWebServerMvcIntegrationTests.java | 6 +- .../AbstractServletWebServerFactoryTests.java | 75 +- .../view/MustacheViewResolverTests.java | 9 +- .../web/servlet/view/MustacheViewTests.java | 9 +- .../test/resources/META-INF/spring.factories | 13 - ...portCandidatesTests$TestAnnotation.imports | 6 - .../spring-boot/src/test/resources/a-file | 0 .../src/test/resources/ansi.properties | 1 - ...e-in-profile-specific-file-test.properties | 4 - ...rofile-in-profile-specific-file.properties | 1 - ...trap-registry-integration-tests.properties | 6 - .../application-customdefault.properties | 1 - .../test/resources/application-dev.properties | 1 - ...mport-with-placeholder-imported.properties | 1 - ...rt-with-placeholder-in-document.properties | 3 - ...er-in-earlier-document-imported.properties | 1 - ...placeholder-in-earlier-document.properties | 6 - ...rlier-profile-document-imported.properties | 1 - ...der-in-earlier-profile-document.properties | 6 - ...placeholder-in-profile-document.properties | 6 - ...ication-import-with-placeholder.properties | 2 - ...t-and-direct-profile-import-dev.properties | 2 - ...riant-and-direct-profile-import.properties | 2 - ...import-with-profile-variant-dev.properties | 1 - ...th-profile-variant-imported-dev.properties | 1 - ...t-with-profile-variant-imported.properties | 1 - ...ion-import-with-profile-variant.properties | 2 - ...es-in-profile-specific-document.properties | 6 - ...s-in-profile-specific-file-test.properties | 1 - ...ofiles-in-profile-specific-file.properties | 1 - ...les-list-in-profile-specific-file-test.yml | 4 - ...clude-profiles-with-placeholder.properties | 9 - .../application-include-profiles.properties | 7 - .../application-includeprofile.properties | 1 - .../resources/application-node.properties | 1 - .../resources/application-other.properties | 1 - ...ic-import-with-custom-import-p1.properties | 1 - ...cific-import-with-custom-import.properties | 2 - ...ic-import-with-import-import-p1.properties | 1 - ...ic-import-with-import-import-p2.properties | 1 - ...cific-import-with-import-import.properties | 1 - ...-specific-import-with-import-p1.properties | 2 - ...ile-specific-import-with-import.properties | 2 - .../resources/application-props-no-extension | 1 - .../application-withwebapplicationtype.yml | 1 - .../src/test/resources/application.custom | 0 .../src/test/resources/application.properties | 6 - .../src/test/resources/application.yml | 1 - .../src/test/resources/banner-utf8.txt | 1 - .../resources/bindtoapplication.properties | 1 - .../config/..hidden/testproperties.properties | 1 - .../config/0-empty/testproperties.properties | 0 .../config/1-first/testproperties.properties | 1 - .../config/2-second/testproperties.properties | 1 - ...root-and-config-with-profile-p1.properties | 3 - ...root-and-config-with-profile-p2.properties | 3 - ...in-root-and-config-with-profile.properties | 3 - .../nested/3-third/testproperties.properties | 1 - .../test/resources/config/specific.properties | 1 - .../customprofile-customdefault.properties | 1 - .../profiles/customprofile.properties | 2 - .../profiles/testnegatedprofiles.yml | 17 - .../profiles/testprofileexpression.yml | 12 - .../configdata/profiles/testprofiles.yml | 18 - .../profiles/testprofilesdocument.yml | 12 - .../configdata/profiles/testprofilesempty.yml | 12 - .../configdata/profiles/testsetprofiles.yml | 10 - .../properties/application-dev.properties | 0 .../configdata/properties/application.other | 0 .../properties/application.properties | 1 - .../configdata/properties/other.properties | 0 .../resources/configdata/yaml/application.yml | 3 - ...gimportwithprofilespecific-prod.properties | 1 - ...configimportwithprofilespecific.properties | 2 - .../resources/custom-config/application.yml | 1 - .../resources/custom-console-log-pattern.xml | 4 - ...-file-log-pattern-with-fileNamePattern.xml | 4 - .../resources/custom-file-log-pattern.xml | 4 - .../src/test/resources/custom-location.yml | 1 - .../src/test/resources/customapplication.yml | 1 - .../customprofile-customdefault.properties | 2 - .../customprofile-specific.properties | 1 - .../test/resources/customprofile.properties | 2 - .../spring-boot/src/test/resources/data.sql | 1 - .../src/test/resources/dispatcher.properties | 1 - .../src/test/resources/enableother.properties | 3 - .../enableprofile-myprofile.properties | 2 - .../resources/enableprofile-other.properties | 1 - .../test/resources/enableprofile.properties | 4 - .../resources/enabletwoprofiles.properties | 2 - ...root-and-config-with-profile-p1.properties | 3 - ...root-and-config-with-profile-p2.properties | 3 - ...in-root-and-config-with-profile.properties | 3 - .../src/test/resources/gh17001.properties | 1 - .../test/resources/invalidproperty.properties | 1 - .../src/test/resources/log4j2-nondefault.xml | 17 - .../src/test/resources/log4j2-override.xml | 8 - .../src/test/resources/logback-broken.xml | 11 - .../test/resources/logback-include-base.xml | 4 - .../resources/logback-include-defaults.xml | 12 - .../test/resources/logback-invalid-format.txt | 0 .../src/test/resources/logback-nondefault.xml | 11 - .../logback-springprofile-in-root.xml | 13 - .../test/resources/logback-without-extension | 11 - .../resources/logging-nondefault.properties | 2 - .../test/resources/moreproperties.properties | 2 - .../org/springframework/boot/animated.gif | Bin 899314 -> 0 bytes .../springframework/boot/black-and-white.gif | Bin 44 -> 0 bytes .../org/springframework/boot/colors.gif | Bin 95 -> 0 bytes ...AddsImportedSourceToEnvironment.properties | 1 - ...sFromIgnoreProfilesContributors.properties | 1 - ...ontributorsWhenNoProfilesActive.properties | 1 - ...MovesDefaultProperySourceToLast.properties | 1 - ...ApplyOnlyAddsActiveContributors.properties | 4 - ...ocessAndApplySetsActiveProfiles.properties | 1 - ...sActiveProfilesAndProfileGroups.properties | 2 - ...cessAndApplySetsDefaultProfiles.properties | 1 - ...tenerCallsOnPropertySourceAdded.properties | 1 - ...enHasListenerCallsOnSetProfiles.properties | 1 - .../separate-class-loader-spring.factories | 2 - .../properties/bind/convert/resource.txt | 1 - .../context/properties/testProperties.xml | 12 - .../analyzer/nounique/consumer.xml | 8 - .../analyzer/nounique/producer.xml | 8 - .../org/springframework/boot/env/anchors.yml | 6 - .../existing-non-multi-document.properties | 32 - .../multi-document-properties-2.properties | 10 - ...multi-document-properties-empty.properties | 12 - .../env/multi-document-properties.properties | 10 - .../springframework/boot/env/recursive.yml | 7 - .../boot/env/test-empty-yaml.yml | 5 - ...st-properties-malformed-unicode.properties | 1 - .../org/springframework/boot/env/test-xml.xml | 5 - .../springframework/boot/env/test-yaml.yml | 38 - .../org/springframework/boot/foobar.txt | 1 - .../org/springframework/boot/gradient.gif | Bin 817 -> 0 bytes .../org/springframework/boot/large.gif | Bin 142 -> 0 bytes .../logging/log4j2/multi-profile-names.xml | 8 - .../logging/log4j2/production-profile.xml | 8 - .../logging/log4j2/profile-expression.xml | 8 - .../logging/logback/include-with-profile.xml | 5 - .../logging/logback/include-with-property.xml | 3 - .../logging/logback/multi-profile-names.xml | 7 - .../boot/logging/logback/nested.xml | 9 - .../logging/logback/production-profile.xml | 7 - .../logging/logback/profile-expression.xml | 7 - .../logging/logback/profile-in-include.xml | 5 - .../logback/property-default-value.xml | 6 - .../boot/logging/logback/property-in-if.xml | 10 - .../logging/logback/property-in-include.xml | 5 - .../boot/logging/logback/property.xml | 6 - .../boot/rsocket/netty}/test-cert.pem | 0 .../boot/rsocket/netty}/test-key.pem | 0 .../boot/rsocket/netty}/test.jks | Bin .../springframework/boot/sample-beans.groovy | 5 - .../org/springframework/boot/sample-beans.xml | 9 - .../boot/sample-namespace.groovy | 7 - .../org/springframework/boot/ssl/jks/test.jks | Bin 0 -> 6536 bytes .../springframework/boot/ssl/jks}/test.p12 | Bin .../org/springframework/boot/ssl/pem/dsa.key | 21 + .../org/springframework/boot/ssl/pem/file.txt | 1 + .../boot/ssl/pem/pkcs1/dsa.key | 12 + .../boot/ssl/pem/pkcs1/rsa-aes-256-cbc.key | 30 + .../boot/ssl/pem/pkcs1/rsa.key | 51 ++ .../boot/ssl/pem/pkcs8/brainpoolP256r1.key | 5 + .../boot/ssl/pem/pkcs8/brainpoolP256t1.key | 5 + .../boot/ssl/pem/pkcs8/brainpoolP320r1.key | 6 + .../boot/ssl/pem/pkcs8/brainpoolP320t1.key | 6 + .../boot/ssl/pem/pkcs8/brainpoolP384r1.key | 6 + .../boot/ssl/pem/pkcs8/brainpoolP384t1.key | 6 + .../boot/ssl/pem/pkcs8/brainpoolP512r1.key | 7 + .../boot/ssl/pem/pkcs8/brainpoolP512t1.key | 7 + .../boot/ssl/pem/pkcs8/dsa-aes-128-cbc.key | 23 + .../boot/ssl/pem/pkcs8/dsa.key | 21 + .../ssl/pem/pkcs8/ed25519-aes-256-cbc.key | 6 + .../boot/ssl/pem/pkcs8/ed25519.key | 3 + .../boot/ssl/pem/pkcs8/ed448.key | 4 + .../boot/ssl/pem}/pkcs8/key-rsa-encrypted.pem | 0 .../ssl/pem/pkcs8/prime256v1-aes-256-cbc.key | 7 + .../boot/ssl/pem/pkcs8/prime256v1.key | 5 + .../boot/ssl/pem/pkcs8/rsa-aes-256-cbc.key | 54 ++ .../boot/ssl/pem/pkcs8/rsa-des-ede3-cbc.key | 54 ++ .../boot/ssl/pem/pkcs8/rsa-pss.key | 28 + .../boot/ssl/pem/pkcs8/rsa-scrypt.key | 54 ++ .../boot/ssl/pem/pkcs8/rsa.key | 52 ++ .../boot/ssl/pem/pkcs8/secp224r1.key | 5 + .../boot/ssl/pem/pkcs8/secp256k1.key | 5 + .../boot/ssl/pem/pkcs8/secp256r1.key | 5 + .../boot/ssl/pem/pkcs8/secp384r1.key | 6 + .../boot/ssl/pem/pkcs8/secp521r1.key | 8 + .../boot/ssl/pem/pkcs8/x25519.key | 3 + .../boot/ssl/pem/pkcs8/x448-aes-256-cbc.key | 6 + .../boot/ssl/pem/pkcs8/x448.key | 4 + .../boot/ssl/pem/sec1/brainpoolP256r1.key | 5 + .../boot/ssl/pem/sec1/brainpoolP256t1.key | 5 + .../boot/ssl/pem/sec1/brainpoolP320r1.key | 6 + .../boot/ssl/pem/sec1/brainpoolP320t1.key | 6 + .../boot/ssl/pem/sec1/brainpoolP384r1.key | 6 + .../boot/ssl/pem/sec1/brainpoolP384t1.key | 6 + .../boot/ssl/pem/sec1/brainpoolP512r1.key | 7 + .../boot/ssl/pem/sec1/brainpoolP512t1.key | 7 + .../ssl/pem/sec1/prime256v1-aes-128-cbc.key | 8 + .../boot/ssl/pem/sec1/prime256v1.key | 5 + .../boot/ssl/pem/sec1/secp224r1.key | 5 + .../boot/ssl/pem/sec1/secp256k1.key | 5 + .../boot/ssl/pem/sec1/secp256r1.key | 5 + .../boot/ssl/pem/sec1/secp384r1.key | 6 + .../boot/ssl/pem/sec1/secp521r1.key | 8 + .../boot/ssl/pem}/test-cert-chain.pem | 0 .../boot/ssl/pem/test-cert.pem | 22 + .../springframework/boot/ssl/pem/test-key.pem | 59 ++ .../springframework/boot/web/client/test.jks | Bin 0 -> 6536 bytes .../boot/web/embedded/jetty/test.jks | Bin 0 -> 6536 bytes .../boot/web/embedded/netty/test.jks | Bin 0 -> 6536 bytes .../boot/web/embedded/tomcat/test.jks | Bin 0 -> 6536 bytes .../web/embedded/undertow}/restricted.jks | Bin .../web/reactive/result/view/template.html | 1 - .../boot/web/reactive/server/test-cert.pem | 22 + .../boot/web/reactive/server/test-key.pem | 59 ++ .../boot/web/reactive/server/test.jks | Bin 0 -> 6536 bytes .../boot/web/reactive/server/test.p12 | Bin 0 -> 7441 bytes .../boot/web/server/test-cert-chain.pem | 32 + .../boot/web/server/test-cert.pem | 22 + .../boot/web/server/test-key.pem | 59 ++ .../springframework/boot/web/server/test.jks | Bin 0 -> 6536 bytes .../springframework/boot/web/server/test.p12 | Bin 0 -> 7441 bytes .../boot/web/servlet/context/conf.properties | 1 - .../boot/web/servlet/server/test-cert.pem | 22 + .../boot/web/servlet/server/test-key.pem | 59 ++ .../boot/web/servlet/server/test.jks | Bin 0 -> 6536 bytes .../boot/web/servlet/server/test.p12 | Bin 0 -> 7441 bytes .../boot/web/servlet/view/template.html | 1 - .../spring-boot/src/test/resources/other.yml | 2 - .../src/test/resources/override.properties | 4 - .../spring-boot/src/test/resources/schema.sql | 4 - .../src/test/resources/some.properties | 4 - .../src/test/resources/specific.properties | 1 - .../resources/specificlocation.properties | 2 - ...lication-config-property-source.properties | 1 - .../test-banner-with-placeholder.txt | 3 - .../src/test/resources/test-banner.txt | 1 - .../resources/testactiveprofiles.properties | 1 - .../resources/testprofiles-default.properties | 1 - .../testprofiles-thedefault.properties | 2 - .../src/test/resources/testprofiles.yml | 12 - .../test/resources/testproperties.properties | 2 - .../test/resources/testsetmultiprofiles.yml | 4 - .../resources/testsetmultiprofileslist.yml | 6 - .../testsetmultiprofileswhitespace.yml | 4 - .../src/test/resources/testyaml.yml | 4 - 303 files changed, 2876 insertions(+), 1272 deletions(-) create mode 100644 spring-boot-project/spring-boot/src/test/java/org/springframework/boot/WithSampleBeansXmlResource.java delete mode 100644 spring-boot-project/spring-boot/src/test/resources/META-INF/spring.factories delete mode 100644 spring-boot-project/spring-boot/src/test/resources/META-INF/spring/org.springframework.boot.context.annotation.ImportCandidatesTests$TestAnnotation.imports delete mode 100644 spring-boot-project/spring-boot/src/test/resources/a-file delete mode 100644 spring-boot-project/spring-boot/src/test/resources/ansi.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file-test.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-bootstrap-registry-integration-tests.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-customdefault.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-dev.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-imported.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-document.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document-imported.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document-imported.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-profile-document.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import-dev.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-dev.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported-dev.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-document.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file-test.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-include-profiles-list-in-profile-specific-file-test.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-include-profiles-with-placeholder.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-include-profiles.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-includeprofile.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-node.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-other.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import-p1.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p1.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p2.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-p1.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-props-no-extension delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application-withwebapplicationtype.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application.custom delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/application.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/banner-utf8.txt delete mode 100644 spring-boot-project/spring-boot/src/test/resources/bindtoapplication.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/..hidden/testproperties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/0-empty/testproperties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/1-first/testproperties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/2-second/testproperties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p1.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p2.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/nested/3-third/testproperties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/config/specific.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile-customdefault.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testnegatedprofiles.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofileexpression.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofiles.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesdocument.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesempty.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testsetprofiles.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/properties/application-dev.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/properties/application.other delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/properties/application.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/properties/other.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configdata/yaml/application.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific-prod.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/custom-config/application.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/custom-console-log-pattern.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern-with-fileNamePattern.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/custom-location.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/customapplication.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/customprofile-customdefault.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/customprofile-specific.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/customprofile.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/data.sql delete mode 100644 spring-boot-project/spring-boot/src/test/resources/dispatcher.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/enableother.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/enableprofile-myprofile.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/enableprofile-other.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/enableprofile.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/enabletwoprofiles.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p1.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p2.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/gh17001.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/invalidproperty.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/log4j2-nondefault.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/log4j2-override.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logback-broken.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logback-include-base.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logback-include-defaults.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logback-invalid-format.txt delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logback-nondefault.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logback-springprofile-in-root.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logback-without-extension delete mode 100644 spring-boot-project/spring-boot/src/test/resources/logging-nondefault.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/moreproperties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/animated.gif delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/black-and-white.gif delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/colors.gif delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplyAddsImportedSourceToEnvironment.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplyDoesNotSetProfilesFromIgnoreProfilesContributors.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplyDoesNotSetProfilesFromIgnoreProfilesContributorsWhenNoProfilesActive.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplyMovesDefaultProperySourceToLast.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplyOnlyAddsActiveContributors.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplySetsActiveProfiles.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplySetsActiveProfilesAndProfileGroups.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplySetsDefaultProfiles.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplyWhenHasListenerCallsOnPropertySourceAdded.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/ConfigDataEnvironmentTests-processAndApplyWhenHasListenerCallsOnSetProfiles.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/config/separate-class-loader-spring.factories delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/properties/bind/convert/resource.txt delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/context/properties/testProperties.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/consumer.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/producer.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/existing-non-multi-document.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-2.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-empty.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/recursive.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-empty-yaml.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-properties-malformed-unicode.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-xml.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/foobar.txt delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/gradient.gif delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/large.gif delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/multi-profile-names.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/production-profile.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/profile-expression.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-profile.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-property.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/multi-profile-names.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/nested.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/production-profile.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-expression.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-in-include.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-default-value.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-if.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-include.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml rename spring-boot-project/spring-boot/src/test/resources/{ => org/springframework/boot/rsocket/netty}/test-cert.pem (100%) rename spring-boot-project/spring-boot/src/test/resources/{ => org/springframework/boot/rsocket/netty}/test-key.pem (100%) rename spring-boot-project/spring-boot/src/test/resources/{ => org/springframework/boot/rsocket/netty}/test.jks (100%) delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.xml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-namespace.groovy create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/jks/test.jks rename spring-boot-project/spring-boot/src/test/resources/{ => org/springframework/boot/ssl/jks}/test.p12 (100%) create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/dsa.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/file.txt create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/dsa.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa-aes-256-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa-aes-128-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519-aes-256-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed448.key rename spring-boot-project/spring-boot/src/test/resources/{ssl => org/springframework/boot/ssl/pem}/pkcs8/key-rsa-encrypted.pem (100%) create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1-aes-256-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-aes-256-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-des-ede3-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-pss.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-scrypt.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp224r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256k1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp384r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp521r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x25519.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448-aes-256-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512t1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1-aes-128-cbc.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp224r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256k1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp384r1.key create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp521r1.key rename spring-boot-project/spring-boot/src/test/resources/{ => org/springframework/boot/ssl/pem}/test-cert-chain.pem (100%) create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-cert.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-key.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/client/test.jks create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/jetty/test.jks create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/netty/test.jks create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/tomcat/test.jks rename spring-boot-project/spring-boot/src/test/resources/{ => org/springframework/boot/web/embedded/undertow}/restricted.jks (100%) delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/result/view/template.html create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-cert.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-key.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test.jks create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test.p12 create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert-chain.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-key.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test.jks create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test.p12 delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/context/conf.properties create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-cert.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-key.pem create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test.jks create mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test.p12 delete mode 100644 spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/view/template.html delete mode 100644 spring-boot-project/spring-boot/src/test/resources/other.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/override.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/schema.sql delete mode 100644 spring-boot-project/spring-boot/src/test/resources/some.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/specific.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/specificlocation.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/spring-application-config-property-source.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/test-banner-with-placeholder.txt delete mode 100644 spring-boot-project/spring-boot/src/test/resources/test-banner.txt delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testactiveprofiles.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testprofiles-default.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testprofiles-thedefault.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testprofiles.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testproperties.properties delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testsetmultiprofiles.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileslist.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileswhitespace.yml delete mode 100644 spring-boot-project/spring-boot/src/test/resources/testyaml.yml diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java index 86c30311a7f9..e4de8e40ba37 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import org.springframework.boot.sampleconfig.MyComponent; import org.springframework.boot.sampleconfig.MyNamedComponent; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.support.StaticApplicationContext; import org.springframework.core.io.ClassPathResource; @@ -72,8 +73,9 @@ void loadJsr330Class() { } @Test + @WithSampleBeansXmlResource void loadXmlResource() { - ClassPathResource resource = new ClassPathResource("sample-beans.xml", getClass()); + ClassPathResource resource = new ClassPathResource("org/springframework/boot/sample-beans.xml"); BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, resource); assertThat(load(loader)).isOne(); assertThat(this.registry.containsBean("myXmlComponent")).isTrue(); @@ -81,8 +83,15 @@ void loadXmlResource() { } @Test + @WithResource(name = "org/springframework/boot/sample-beans.groovy", content = """ + import org.springframework.boot.sampleconfig.MyComponent; + + beans { + myGroovyComponent(MyComponent) {} + } + """) void loadGroovyResource() { - ClassPathResource resource = new ClassPathResource("sample-beans.groovy", getClass()); + ClassPathResource resource = new ClassPathResource("org/springframework/boot/sample-beans.groovy"); BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, resource); assertThat(load(loader)).isOne(); assertThat(this.registry.containsBean("myGroovyComponent")).isTrue(); @@ -90,8 +99,17 @@ void loadGroovyResource() { } @Test + @WithResource(name = "org/springframework/boot/sample-namespace.groovy", content = """ + import org.springframework.boot.sampleconfig.MyComponent; + + beans { + xmlns([ctx:'http://www.springframework.org/schema/context']) + ctx.'component-scan'('base-package':'nonexistent') + myGroovyComponent(MyComponent) {} + } + """) void loadGroovyResourceWithNamespace() { - ClassPathResource resource = new ClassPathResource("sample-namespace.groovy", getClass()); + ClassPathResource resource = new ClassPathResource("org/springframework/boot/sample-namespace.groovy"); BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, resource); assertThat(load(loader)).isOne(); assertThat(this.registry.containsBean("myGroovyComponent")).isTrue(); @@ -114,7 +132,8 @@ void loadClassName() { } @Test - void loadResourceName() { + @WithSampleBeansXmlResource + void loadXmlName() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, "classpath:org/springframework/boot/sample-beans.xml"); assertThat(load(loader)).isOne(); @@ -122,6 +141,13 @@ void loadResourceName() { } @Test + @WithResource(name = "org/springframework/boot/sample-beans.groovy", content = """ + import org.springframework.boot.sampleconfig.MyComponent; + + beans { + myGroovyComponent(MyComponent) {} + } + """) void loadGroovyName() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, "classpath:org/springframework/boot/sample-beans.groovy"); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SimpleMainTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SimpleMainTests.java index 24b9f9f73011..0935aaf56c10 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SimpleMainTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SimpleMainTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -61,12 +61,14 @@ void configClassContext(CapturedOutput output) throws Exception { } @Test + @WithSampleBeansXmlResource void xmlContext(CapturedOutput output) throws Exception { SpringApplication.main(getArgs("org/springframework/boot/sample-beans.xml")); assertThat(output).contains(SPRING_STARTUP); } @Test + @WithSampleBeansXmlResource void mixedContext(CapturedOutput output) throws Exception { SpringApplication.main(getArgs(getClass().getName(), "org/springframework/boot/sample-beans.xml")); assertThat(output).contains(SPRING_STARTUP); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java index 50250c8c0c00..1335c0aa690e 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; @@ -47,9 +48,10 @@ void shouldRegisterRuntimeHints() { } @Test + @WithResource(name = "banner.txt", content = "\uD83D\uDE0D Spring Boot! \uD83D\uDE0D") void shouldUseUtf8() { ResourceLoader resourceLoader = new GenericApplicationContext(); - Resource resource = resourceLoader.getResource("classpath:/banner-utf8.txt"); + Resource resource = resourceLoader.getResource("classpath:banner.txt"); SpringApplicationBannerPrinter printer = new SpringApplicationBannerPrinter(resourceLoader, new ResourceBanner(resource)); Log log = mock(Log.class); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index 0bce832b5705..57a473052645 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,6 +74,7 @@ import org.springframework.boot.context.event.SpringApplicationEvent; import org.springframework.boot.convert.ApplicationConversionService; import org.springframework.boot.testsupport.classpath.ForkedClassPath; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; @@ -226,19 +227,24 @@ void sourcesMustBeAccessible() { } @Test + @WithResource(name = "banner.txt", content = "Running a Test!") void customBanner(CapturedOutput output) { SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); application.setWebApplicationType(WebApplicationType.NONE); - this.context = application.run("--spring.banner.location=classpath:test-banner.txt"); + this.context = application.run(); assertThat(output).startsWith("Running a Test!"); + } @Test + @WithResource(name = "banner.txt", content = """ + Running a Test! + + ${test.property}""") void customBannerWithProperties(CapturedOutput output) { SpringApplication application = spy(new SpringApplication(ExampleConfig.class)); application.setWebApplicationType(WebApplicationType.NONE); - this.context = application.run("--spring.banner.location=classpath:test-banner-with-placeholder.txt", - "--test.property=123456"); + this.context = application.run("--test.property=123456"); assertThat(output).containsPattern("Running a Test!\\s+123456"); } @@ -289,6 +295,7 @@ void enableBannerInLogViaProperty(CapturedOutput output) { } @Test + @WithResource(name = "bindtoapplication.properties", content = "spring.main.banner-mode=off") void triggersConfigFileApplicationListenerBeforeBinding() { SpringApplication application = new SpringApplication(ExampleConfig.class); application.setWebApplicationType(WebApplicationType.NONE); @@ -540,6 +547,7 @@ void commandLinePropertySourceEnhancesEnvironment() { } @Test + @WithResource(name = "application.properties", content = "foo=bucket") void propertiesFileEnhancesEnvironment() { SpringApplication application = new SpringApplication(ExampleConfig.class); application.setWebApplicationType(WebApplicationType.NONE); @@ -572,6 +580,8 @@ void additionalProfilesOrderedBeforeActiveProfiles() { } @Test + @WithResource(name = "application.properties", content = "my.property=fromapplicationproperties") + @WithResource(name = "application-other.properties", content = "my.property=fromotherpropertiesfile") void addProfilesOrderWithProperties() { SpringApplication application = new SpringApplication(ExampleConfig.class); application.setWebApplicationType(WebApplicationType.NONE); @@ -584,6 +594,7 @@ void addProfilesOrderWithProperties() { } @Test + @WithResource(name = "application.properties", content = "foo=bucket") void emptyCommandLinePropertySourceNotAdded() { SpringApplication application = new SpringApplication(ExampleConfig.class); application.setWebApplicationType(WebApplicationType.NONE); @@ -814,11 +825,13 @@ void loadSources() { } @Test + @WithSampleBeansXmlResource + @WithResource(name = "application.properties", content = "sample.app.test.prop=*") void wildcardSources() { TestSpringApplication application = new TestSpringApplication(); application.getSources().add("classpath*:org/springframework/boot/sample-${sample.app.test.prop}.xml"); application.setWebApplicationType(WebApplicationType.NONE); - this.context = application.run(); + this.context = application.run("--spring.config.location=classpath:/"); } @Test @@ -1139,6 +1152,8 @@ void reactiveApplicationConfiguredViaAPropertyHasTheCorrectTypeOfContextAndEnvir } @Test + @WithResource(name = "application-withwebapplicationtype.yml", + content = "spring.main.web-application-type: reactive") void environmentIsConvertedIfTypeDoesNotMatch() { ConfigurableApplicationContext context = new SpringApplication(ExampleReactiveWebConfig.class) .run("--spring.profiles.active=withwebapplicationtype"); @@ -1195,6 +1210,7 @@ void circularReferencesCanBeEnabled() { } @Test + @WithResource(name = "custom-config/application.yml", content = "hello: world") void relaxedBindingShouldWorkBeforeEnvironmentIsPrepared() { SpringApplication application = new SpringApplication(ExampleConfig.class); application.setWebApplicationType(WebApplicationType.NONE); @@ -1329,6 +1345,8 @@ void bindsEnvironmentPrefixToSpringApplication() { } @Test + @WithResource(name = "spring-application-config-property-source.properties", + content = "test.name=spring-application-config-property-source") void movesConfigClassPropertySourcesToEnd() { SpringApplication application = new SpringApplication(PropertySourceConfig.class); application.setWebApplicationType(WebApplicationType.NONE); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/WithSampleBeansXmlResource.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/WithSampleBeansXmlResource.java new file mode 100644 index 000000000000..91359f63bcfb --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/WithSampleBeansXmlResource.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.boot.testsupport.classpath.resources.WithResource; + +/** + * Makes an {@code org/springframework/boot/sample-beans.xml} resource available from the + * thread context classloader. + * + * @author Andy Wilkinson + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@WithResource(name = "org/springframework/boot/sample-beans.xml", + content = """ + + + + + """) +@interface WithSampleBeansXmlResource { + +} diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java index 81897b33a215..3f4b5a4ed9f5 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplicationShutdownHookInstance; import org.springframework.boot.WebApplicationType; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -72,14 +73,21 @@ private void close(ApplicationContext context) { } @Test + @WithResource(name = "application.properties", content = """ + b=file + c=file + """) + @WithResource(name = "application-foo.properties", content = "b=profile-specific-file") void profileAndProperties() { SpringApplicationBuilder application = new SpringApplicationBuilder().sources(ExampleConfig.class) .contextFactory(ApplicationContextFactory.ofContextClass(StaticApplicationContext.class)) .profiles("foo") - .properties("foo=bar"); + .properties("a=default"); this.context = application.run(); assertThat(this.context).isInstanceOf(StaticApplicationContext.class); - assertThat(this.context.getEnvironment().getProperty("foo")).isEqualTo("bucket"); + assertThat(this.context.getEnvironment().getProperty("a")).isEqualTo("default"); + assertThat(this.context.getEnvironment().getProperty("b")).isEqualTo("profile-specific-file"); + assertThat(this.context.getEnvironment().getProperty("c")).isEqualTo("file"); assertThat(this.context.getEnvironment().acceptsProfiles(Profiles.of("foo"))).isTrue(); } @@ -194,6 +202,7 @@ void parentFirstCreation() { } @Test + @WithResource(name = "application-node.properties", content = "bar=spam") void parentFirstCreationWithProfileAndDefaultArgs() { SpringApplicationBuilder application = new SpringApplicationBuilder(ExampleConfig.class).profiles("node") .properties("transport=redis") diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java index 2d4551f00edf..8af49ee43a1e 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -32,7 +34,18 @@ */ class ImportCandidatesTests { + private static final String IMPORTS_FILE = "META-INF/spring/org.springframework.boot.context.annotation.ImportCandidatesTests$TestAnnotation.imports"; + @Test + @WithResource(name = IMPORTS_FILE, content = """ + # A comment spanning a complete line + class1 + + class2 # with comment at the end + # Comment with some whitespace in front + class3 + + """) void loadReadsFromClasspathFile() { ImportCandidates candidates = ImportCandidates.load(TestAnnotation.class, null); assertThat(candidates).containsExactly("class1", "class2", "class3"); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/AnsiOutputApplicationListenerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/AnsiOutputApplicationListenerTests.java index 75c4b9bbcd67..cf198bf2c237 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/AnsiOutputApplicationListenerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/AnsiOutputApplicationListenerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,11 +28,9 @@ import org.springframework.boot.ansi.AnsiOutput; import org.springframework.boot.ansi.AnsiOutput.Enabled; import org.springframework.boot.ansi.AnsiOutputEnabledValue; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.StandardEnvironment; -import org.springframework.test.context.support.TestPropertySourceUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -81,11 +79,9 @@ void disabled() { } @Test + @WithResource(name = "application.properties", content = "spring.output.ansi.enabled=never") void disabledViaApplicationProperties() { - ConfigurableEnvironment environment = new StandardEnvironment(); - TestPropertySourceUtils.addInlinedPropertiesToEnvironment(environment, "spring.config.name=ansi"); SpringApplication application = new SpringApplication(Config.class); - application.setEnvironment(environment); application.setWebApplicationType(WebApplicationType.NONE); this.context = application.run(); assertThat(AnsiOutputEnabledValue.get()).isEqualTo(Enabled.NEVER); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorBootstrapContextIntegrationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorBootstrapContextIntegrationTests.java index 45d8eec77158..93a3d39efacc 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorBootstrapContextIntegrationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorBootstrapContextIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.context.config.TestConfigDataBootstrap.LoaderHelper; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; @@ -45,9 +46,24 @@ void setup() { } @Test + @WithResource(name = "imported.properties", content = """ + spring.config.import=testbootstrap:test + spring.profiles.active=test + myprop=igotbound + #--- + spring.config.activate.on-profile=test + myprofileprop=igotprofilebound + + """) + @WithResource(name = "META-INF/spring.factories", content = """ + org.springframework.boot.context.config.ConfigDataLoader=\ + org.springframework.boot.context.config.TestConfigDataBootstrap.Loader + org.springframework.boot.context.config.ConfigDataLocationResolver=\ + org.springframework.boot.context.config.TestConfigDataBootstrap.LocationResolver + """) void bootstrapsApplicationContext() { try (ConfigurableApplicationContext context = this.application - .run("--spring.config.import=classpath:application-bootstrap-registry-integration-tests.properties")) { + .run("--spring.config.import=classpath:imported.properties")) { LoaderHelper bean = context.getBean(TestConfigDataBootstrap.LoaderHelper.class); assertThat(bean).isNotNull(); assertThat(bean.getBound()).isEqualTo("igotbound"); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.java index 0b9f5e58c621..c4e28c206d59 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,6 +33,7 @@ import org.springframework.boot.context.config.ConfigData.Option; import org.springframework.boot.context.config.ConfigData.Options; import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorIntegrationTests.Config; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; @@ -45,6 +46,18 @@ * * @author Phillip Webb */ +@WithResource(name = "application.properties", content = """ + spring.config.import=icwps: + prop=fromfile + """) +@WithResource(name = "application-prod.properties", content = "prop=fromprofilefile") +@WithResource(name = "META-INF/spring.factories", + content = """ + org.springframework.boot.context.config.ConfigDataLoader=\ + org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.Loader + org.springframework.boot.context.config.ConfigDataLocationResolver=\ + org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.LocationResolver + """) class ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests { private SpringApplication application; @@ -60,16 +73,14 @@ void setup() { @Test void testWithoutProfile() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.name=configimportwithprofilespecific"); + ConfigurableApplicationContext context = this.application.run(); String value = context.getEnvironment().getProperty("prop"); assertThat(value).isEqualTo("fromicwps1"); } @Test void testWithProfile() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.name=configimportwithprofilespecific", "--spring.profiles.active=prod"); + ConfigurableApplicationContext context = this.application.run("--spring.profiles.active=prod"); String value = context.getEnvironment().getProperty("prop"); assertThat(value).isEqualTo("fromicwps2"); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java index 940db092ec43..12005f44db17 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,16 +20,17 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.UUID; -import org.apache.logging.log4j.util.Strings; import org.assertj.core.api.Condition; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -46,6 +47,9 @@ import org.springframework.boot.context.properties.source.ConfigurationProperty; import org.springframework.boot.context.properties.source.ConfigurationPropertyName; import org.springframework.boot.origin.Origin; +import org.springframework.boot.testsupport.BuildOutput; +import org.springframework.boot.testsupport.classpath.resources.WithResource; +import org.springframework.boot.testsupport.classpath.resources.WithResourceDirectory; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; @@ -59,6 +63,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.util.FileCopyUtils; +import org.springframework.util.FileSystemUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -115,6 +120,7 @@ public ClassLoader getClassLoader() { } @Test + @WithResource(name = "application.properties", content = "foo=bucket") void runLoadsApplicationPropertiesOnClasspath() { ConfigurableApplicationContext context = this.application.run(); String property = context.getEnvironment().getProperty("foo"); @@ -122,13 +128,15 @@ void runLoadsApplicationPropertiesOnClasspath() { } @Test + @WithResource(name = "application.yaml", content = "yamlkey: yamlvalue") void runLoadsApplicationYamlOnClasspath() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=customapplication"); + ConfigurableApplicationContext context = this.application.run(); String property = context.getEnvironment().getProperty("yamlkey"); assertThat(property).isEqualTo("yamlvalue"); } @Test + @WithResource(name = "testproperties.properties", content = "the.property=frompropertiesfile") void runLoadsFileWithCustomName() { ConfigurableApplicationContext context = this.application.run("--spring.config.name=testproperties"); String property = context.getEnvironment().getProperty("the.property"); @@ -136,45 +144,84 @@ void runLoadsFileWithCustomName() { } @Test + @WithResource(name = "application.properties", content = """ + duplicate=properties + only-properties = properties + """) + @WithResource(name = "application.yaml", content = """ + duplicate: yaml + only-yaml: yaml + """) void runWhenPropertiesAndYamlShouldPreferProperties() { ConfigurableApplicationContext context = this.application.run(); - String property = context.getEnvironment().getProperty("duplicate"); - assertThat(property).isEqualTo("properties"); + assertThat(context.getEnvironment().getProperty("duplicate")).isEqualTo("properties"); + assertThat(context.getEnvironment().getProperty("only-properties")).isEqualTo("properties"); + assertThat(context.getEnvironment().getProperty("only-yaml")).isEqualTo("yaml"); } @Test + @WithResource(name = "moreproperties.properties", content = """ + the.property=more + only.more=more + """) + @WithResource(name = "testproperties.properties", content = """ + the.property=test + only.test=test + """) void runWhenMultipleCustomNamesLoadsEachName() { ConfigurableApplicationContext context = this.application .run("--spring.config.name=moreproperties,testproperties"); - String property = context.getEnvironment().getProperty("the.property"); - assertThat(property).isEqualTo("frompropertiesfile"); + assertThat(context.getEnvironment().getProperty("the.property")).isEqualTo("test"); + assertThat(context.getEnvironment().getProperty("only.more")).isEqualTo("more"); + assertThat(context.getEnvironment().getProperty("only.test")).isEqualTo("test"); } @Test + @WithResource(name = "application-default.properties", content = "my.property=fromdefaultpropertiesfile") void runWhenNoActiveProfilesLoadsDefaultProfileFile() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testprofiles"); + ConfigurableApplicationContext context = this.application.run(); String property = context.getEnvironment().getProperty("my.property"); assertThat(property).isEqualTo("fromdefaultpropertiesfile"); } @Test + @WithResource(name = "application.yaml", content = """ + --- + my: + property: fromyamlfile + other: notempty + --- + spring.config.activate.on-profile: default + my: + property: fromdefaultprofile + --- + spring.config.activate.on-profile: other + my: + property: fromotherprofile + """) void runWhenActiveProfilesDoesNotLoadDefault() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testprofilesdocument", - "--spring.config.location=classpath:configdata/profiles/", "--spring.profiles.default=thedefault", - "--spring.profiles.active=other"); + ConfigurableApplicationContext context = this.application.run("--spring.profiles.active=other"); String property = context.getEnvironment().getProperty("my.property"); assertThat(property).isEqualTo("fromotherprofile"); } @Test + @WithResource(name = "application-thedefault.properties", content = "the.property=fromdefaultpropertiesfile") void runWhenHasCustomDefaultProfileLoadsDefaultProfileFile() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testprofiles", - "--spring.profiles.default=thedefault"); + ConfigurableApplicationContext context = this.application.run("--spring.profiles.default=thedefault"); String property = context.getEnvironment().getProperty("the.property"); assertThat(property).isEqualTo("fromdefaultpropertiesfile"); } @Test + @WithResource(name = "application.properties", content = """ + foo=bucket + my.property=fromapplicationproperties + """) + @WithResource(name = "testproperties.properties", content = """ + my.property=frompropertiesfile + the.property=frompropertiesfile + """) void runWhenHasCustomSpringConfigLocationLoadsAllFromSpecifiedLocation() { ConfigurableApplicationContext context = this.application .run("--spring.config.location=classpath:application.properties,classpath:testproperties.properties"); @@ -187,29 +234,68 @@ void runWhenHasCustomSpringConfigLocationLoadsAllFromSpecifiedLocation() { } @Test - void runWhenOneCustomLocationDoesNotExistLoadsOthers() { + @WithResource(name = "application.properties", content = """ + foo=bucket + my.property=fromapplicationproperties + """) + @WithResource(name = "testproperties.properties", content = """ + my.property=frompropertiesfile + the.property=frompropertiesfile + """) + void runWhenOneCustomOptionalLocationDoesNotExistLoadsOthers() { ConfigurableApplicationContext context = this.application.run( "--spring.config.location=classpath:application.properties,classpath:testproperties.properties,optional:classpath:nonexistent.properties"); - String property = context.getEnvironment().getProperty("the.property"); - assertThat(property).isEqualTo("frompropertiesfile"); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("frompropertiesfile"); + assertThat(context.getEnvironment().getProperty("foo")).isEqualTo("bucket"); } @Test + @WithResource(name = "application.yml", content = """ + --- + my: + property: fromyamlfile + --- + spring.config.activate.on-profile: prod + spring.config.import: file:./non-existent.yml + """) void runWhenProfileSpecificMandatoryLocationDoesNotExistShouldNotFail() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testprofiles", - "--spring.config.location=classpath:configdata/profiles/"); + ConfigurableApplicationContext context = this.application.run(); String property = context.getEnvironment().getProperty("my.property"); assertThat(property).isEqualTo("fromyamlfile"); } @Test + @WithResource(name = "application.yml", content = """ + --- + my: + property: fromyamlfile + --- + spring.config.activate.on-profile: prod + spring.config.import: file:./non-existent.yml + """) void runWhenProfileSpecificMandatoryLocationDoesNotExistShouldFailWhenProfileActive() { this.application.setAdditionalProfiles("prod"); - assertThatExceptionOfType(ConfigDataResourceNotFoundException.class).isThrownBy(() -> this.application - .run("--spring.config.name=testprofiles", "--spring.config.location=classpath:configdata/profiles/")); - } - - @Test + assertThatExceptionOfType(ConfigDataResourceNotFoundException.class).isThrownBy(() -> this.application.run()) + .withMessageContaining("non-existent.yml"); + } + + @Test + @WithResource(name = "enableprofile.properties", content = """ + spring.profiles.active=myprofile + my.property=frompropertiesfile + the.property=frompropertiesfile + one.more=${my.property} + """) + @WithResource(name = "enableother.properties", content = """ + spring.profiles.active=other + my.property=fromenableotherpropertiesfile + one.more=${my.property} + """) + @WithResource(name = "enableprofile-other.properties", content = "other.property=fromotherpropertiesfile") + @WithResource(name = "enableprofile-myprofile.properties", content = """ + my.property=fromprofilepropertiesfile + the.property=fromprofilepropertiesfile + """) void runWhenHasActiveProfilesFromMultipleLocationsActivatesProfileFromOneLocation() { ConfigurableApplicationContext context = this.application .run("--spring.config.location=classpath:enableprofile.properties,classpath:enableother.properties"); @@ -220,13 +306,27 @@ void runWhenHasActiveProfilesFromMultipleLocationsActivatesProfileFromOneLocatio } @Test + @WithResource(name = "enableprofile.properties", content = """ + spring.profiles.active=myprofile + my.property=frompropertiesfile + """) + @WithResource(name = "enabletwoprofiles.properties", content = """ + spring.profiles.active=myprofile,another + my.property=fromtwopropertiesfile + """) + @WithResource(name = "enableprofile-myprofile.properties", content = """ + my.property=frommyprofilepropertiesfile + """) + @WithResource(name = "enableprofile-another.properties", content = """ + my.property=fromanotherprofilepropertiesfile + """) void runWhenHasActiveProfilesFromMultipleAdditionalLocationsWithOneSwitchedOffLoadsExpectedProperties() { ConfigurableApplicationContext context = this.application.run( "--spring.config.additional-location=classpath:enabletwoprofiles.properties,classpath:enableprofile.properties"); ConfigurableEnvironment environment = context.getEnvironment(); assertThat(environment.getActiveProfiles()).containsExactly("myprofile"); String property = environment.getProperty("my.property"); - assertThat(property).isEqualTo("fromprofilepropertiesfile"); + assertThat(property).isEqualTo("frommyprofilepropertiesfile"); } @Test @@ -249,14 +349,18 @@ void runWhenHasLocalFileLoadsWithLocalFileTakingPrecedenceOverClasspath() throws } @Test + @WithResource(name = "application.properties", content = """ + my.property=frompropertiesfile + the.property=frompropertiesfile + """) void runWhenHasCommandLinePropertiesLoadsWithCommandLineTakingPrecedence() { StandardEnvironment environment = new StandardEnvironment(); environment.getPropertySources() .addFirst(new SimpleCommandLinePropertySource("--the.property=fromcommandline")); this.application.setEnvironment(environment); - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testproperties"); - String property = context.getEnvironment().getProperty("the.property"); - assertThat(property).isEqualTo("fromcommandline"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("the.property")).isEqualTo("fromcommandline"); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("frompropertiesfile"); } @Test @@ -268,15 +372,17 @@ void runWhenHasSystemPropertyLoadsWithSystemPropertyTakingPrecedence() { } @Test + @WithResource(name = "application.properties", content = "my.property=fromapplicationproperties") void runWhenHasDefaultPropertiesIncludesDefaultPropertiesLast() { - this.application.setDefaultProperties(Collections.singletonMap("my.fallback", "foo")); + this.application.setDefaultProperties(Map.of("my.property", "fromdefaults", "my.fallback", "fromdefaults")); ConfigurableApplicationContext context = this.application.run(); - String property = context.getEnvironment().getProperty("my.fallback"); - assertThat(property).isEqualTo("foo"); + assertThat(context.getEnvironment().getProperty("my.fallback")).isEqualTo("fromdefaults"); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("fromapplicationproperties"); } @Test - void runWhenHasDefaultPropertiesWithConfigLocationConfigurationLoadsExpectedProperties() { + @WithResource(name = "testproperties.properties", content = "the.property=frompropertiesfile") + void runWhenHasDefaultPropertiesWithConfigNameLoadsExpectedProperties() { this.application.setDefaultProperties(Collections.singletonMap("spring.config.name", "testproperties")); ConfigurableApplicationContext context = this.application.run(); String property = context.getEnvironment().getProperty("the.property"); @@ -284,13 +390,15 @@ void runWhenHasDefaultPropertiesWithConfigLocationConfigurationLoadsExpectedProp } @Test - void runWhenHasActiveProfilesFromDefaultPropertiesAndFileLoadsWithFileTakingPrecedence() { + @WithResource(name = "application.properties", content = "spring.profiles.active=myprofile") + void runWhenHasActiveProfilesFromDefaultPropertiesAndFileLoadsWithActiveProfilesFromFileTakingPrecedence() { this.application.setDefaultProperties(Collections.singletonMap("spring.profiles.active", "dev")); - ConfigurableApplicationContext context = this.application.run("--spring.config.name=enableprofile"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactly("myprofile"); } @Test + @WithResource(name = "application-other.properties", content = "my.property=fromotherpropertiesfile") void runWhenProgrammaticallySetProfilesLoadsWithSetProfilesTakePrecedenceOverDefaultProfile() { this.application.setAdditionalProfiles("other"); ConfigurableApplicationContext context = this.application.run(); @@ -299,6 +407,8 @@ void runWhenProgrammaticallySetProfilesLoadsWithSetProfilesTakePrecedenceOverDef } @Test + @WithResource(name = "application-dev.properties", content = "my.property=fromdevpropertiesfile") + @WithResource(name = "application-other.properties", content = "my.property=fromotherpropertiesfile") void runWhenTwoProfilesSetProgrammaticallyLoadsWithPreservedProfileOrder() { this.application.setAdditionalProfiles("other", "dev"); ConfigurableApplicationContext context = this.application.run(); @@ -307,9 +417,12 @@ void runWhenTwoProfilesSetProgrammaticallyLoadsWithPreservedProfileOrder() { } @Test + @WithResource(name = "application.properties", content = "spring.profiles.active=myprofile") + @WithResource(name = "application-myprofile.properties", content = "the.property=fromprofilepropertiesfile") + @WithResource(name = "application-other.properties", content = "other.property=fromotherpropertiesfile") void runWhenProfilesPresentBeforeConfigFileProcessingAugmentsProfileActivatedByConfigFile() { this.application.setAdditionalProfiles("other"); - ConfigurableApplicationContext context = this.application.run("--spring.config.name=enableprofile"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactly("other", "myprofile"); String property = context.getEnvironment().getProperty("other.property"); assertThat(property).isEqualTo("fromotherpropertiesfile"); @@ -318,13 +431,19 @@ void runWhenProfilesPresentBeforeConfigFileProcessingAugmentsProfileActivatedByC } @Test + @WithResource(name = "application.properties", content = """ + spring.profiles.active=myprofile + one.more=${my.property} + """) + @WithResource(name = "application-myprofile.properties", content = "my.property=fromprofilepropertiesfile") void runWhenProfilePropertiesUsedInPlaceholdersLoadsWithResolvedPlaceholders() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=enableprofile"); - String property = context.getEnvironment().getProperty("one.more"); - assertThat(property).isEqualTo("fromprofilepropertiesfile"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("one.more")).isEqualTo("fromprofilepropertiesfile"); } @Test + @WithResource(name = "application-dev.properties", content = "my.property=fromdevpropertiesfile") + @WithResource(name = "application-other.properties", content = "my.property=fromotherpropertiesfile") void runWhenDuplicateProfileSetProgrammaticallyAndViaPropertyLoadsWithProfiles() { this.application.setAdditionalProfiles("dev"); ConfigurableApplicationContext context = this.application.run("--spring.profiles.active=dev,other"); @@ -333,6 +452,8 @@ void runWhenDuplicateProfileSetProgrammaticallyAndViaPropertyLoadsWithProfiles() } @Test + @WithResource(name = "application-dev.properties", content = "my.property=fromdevpropertiesfile") + @WithResource(name = "application-other.properties", content = "my.property=fromotherpropertiesfile") void runWhenProfilesActivatedViaBracketNotationSetsProfiles() { ConfigurableApplicationContext context = this.application.run("--spring.profiles.active[0]=dev", "--spring.profiles.active[1]=other"); @@ -341,21 +462,43 @@ void runWhenProfilesActivatedViaBracketNotationSetsProfiles() { } @Test + @WithResource(name = "application.yaml", content = """ + --- + my: + property: fromyamlfile + other: notempty + --- + spring.config.activate.on-profile: dev + my: + property: fromdevprofile + """) void loadWhenProfileInMultiDocumentFilesLoadsExpectedProperties() { this.application.setAdditionalProfiles("dev"); - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testprofiles", - "--spring.config.location=classpath:configdata/profiles/"); - String property = context.getEnvironment().getProperty("my.property"); - assertThat(property).isEqualTo("fromdevprofile"); - property = context.getEnvironment().getProperty("my.other"); - assertThat(property).isEqualTo("notempty"); - } - - @Test + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("fromdevprofile"); + assertThat(context.getEnvironment().getProperty("my.other")).isEqualTo("notempty"); + } + + @Test + @WithResource(name = "application.yaml", content = """ + --- + my: + property: fromyamlfile + other: notempty + --- + spring.config.activate.on-profile: dev + my: + property: fromdevprofile + dev: + property: devproperty + --- + spring.config.activate.on-profile: other + my: + property: fromotherprofile + """) void runWhenMultipleActiveProfilesWithMultiDocumentFilesLoadsInOrderOfDocument() { this.application.setAdditionalProfiles("other", "dev"); - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testprofiles", - "--spring.config.location=classpath:configdata/profiles/"); + ConfigurableApplicationContext context = this.application.run(); String property = context.getEnvironment().getProperty("my.property"); assertThat(property).isEqualTo("fromotherprofile"); property = context.getEnvironment().getProperty("my.other"); @@ -365,106 +508,223 @@ void runWhenMultipleActiveProfilesWithMultiDocumentFilesLoadsInOrderOfDocument() } @Test + @WithResource(name = "application.yaml", content = """ + --- + my: + property: fromyamlfile + --- + spring.config.activate.on-profile: dev & other + my: + property: devandother + --- + spring.config.activate.on-profile: (dev | other) & another + my: + property: devorotherandanother + """) void runWhenHasAndProfileExpressionLoadsExpectedProperties() { - assertProfileExpression("devandother", "dev", "other"); - } - - @Test + this.application.setAdditionalProfiles("dev", "other"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("devandother"); + } + + @Test + @WithResource(name = "application.yaml", content = """ + --- + my: + property: fromyamlfile + --- + spring.config.activate.on-profile: dev & other + my: + property: devandother + --- + spring.config.activate.on-profile: (dev | other) & another + my: + property: devorotherandanother + """) void runWhenHasComplexProfileExpressionsLoadsExpectedProperties() { - assertProfileExpression("devorotherandanother", "dev", "another"); - } - - @Test + this.application.setAdditionalProfiles("dev", "another"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("devorotherandanother"); + } + + @Test + @WithResource(name = "application.yaml", content = """ + --- + my: + property: fromyamlfile + --- + spring.config.activate.on-profile: dev & other + my: + property: devandother + --- + spring.config.activate.on-profile: (dev | other) & another + my: + property: devorotherandanother + """) void runWhenProfileExpressionsDoNotMatchLoadsExpectedProperties() { - assertProfileExpression("fromyamlfile", "dev"); - } - - @Test + this.application.setAdditionalProfiles("dev"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("fromyamlfile"); + } + + @Test + @WithResource(name = "application.yml", content = """ + --- + my: + property: fromyamlfile + other: notempty + --- + spring.config.activate.on-profile: other + my: + property: fromotherprofile + --- + spring.config.activate.on-profile: "!other" + my: + property: fromnototherprofile + notother: foo + + """) void runWhenHasNegatedProfilesLoadsExpectedProperties() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testnegatedprofiles", - "--spring.config.location=classpath:configdata/profiles/"); - String property = context.getEnvironment().getProperty("my.property"); - assertThat(property).isEqualTo("fromnototherprofile"); - property = context.getEnvironment().getProperty("my.notother"); - assertThat(property).isEqualTo("foo"); - } - - @Test + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("fromnototherprofile"); + assertThat(context.getEnvironment().getProperty("my.notother")).isEqualTo("foo"); + } + + @Test + @WithResource(name = "application.yml", content = """ + --- + my: + property: fromyamlfile + other: notempty + --- + spring.config.activate.on-profile: other + my: + property: fromotherprofile + --- + spring.config.activate.on-profile: "!other" + my: + property: fromnototherprofile + notother: foo + + """) void runWhenHasNegatedProfilesWithProfileActiveLoadsExpectedProperties() { this.application.setAdditionalProfiles("other"); - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testnegatedprofiles", - "--spring.config.location=classpath:configdata/profiles/"); - String property = context.getEnvironment().getProperty("my.property"); - assertThat(property).isEqualTo("fromotherprofile"); - property = context.getEnvironment().getProperty("my.notother"); - assertThat(property).isNull(); - } - - @Test + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("fromotherprofile"); + assertThat(context.getEnvironment().getProperty("my.notother")).isNull(); + } + + @Test + @WithResource(name = "application.yml", content = """ + --- + spring: + profiles: + active: dev + my: + property: fromyamlfile + --- + spring.config.activate.on-profile: dev + my: + property: fromdevprofile + """) void runWhenHasActiveProfileConfigurationInMultiDocumentFileLoadsInExpectedOrder() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testsetprofiles", - "--spring.config.location=classpath:configdata/profiles/"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactly("dev"); String property = context.getEnvironment().getProperty("my.property"); assertThat(context.getEnvironment().getActiveProfiles()).contains("dev"); assertThat(property).isEqualTo("fromdevprofile"); assertThat(context.getEnvironment().getPropertySources()).extracting("name") .contains( - "Config resource 'class path resource [configdata/profiles/testsetprofiles.yml]' via location 'classpath:configdata/profiles/' (document #0)", - "Config resource 'class path resource [configdata/profiles/testsetprofiles.yml]' via location 'classpath:configdata/profiles/' (document #1)"); + "Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' (document #0)", + "Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' (document #1)"); } @Test + @WithResource(name = "application.yml", content = """ + --- + spring: + profiles: + active: dev,healthcheck + """) void runWhenHasYamlWithCommaSeparatedMultipleProfilesLoadsExpectedProperties() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testsetmultiprofiles"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactly("dev", "healthcheck"); } @Test + @WithResource(name = "application.yml", content = """ + --- + spring: + profiles: + active: + - dev + - healthcheck + """) void runWhenHasYamlWithListProfilesLoadsExpectedProperties() { - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testsetmultiprofileslist"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactly("dev", "healthcheck"); } @Test + @WithResource(name = "application.yml", content = """ + --- + spring: + profiles: + active: dev , healthcheck + """) void loadWhenHasWhitespaceTrims() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.name=testsetmultiprofileswhitespace"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactly("dev", "healthcheck"); } @Test - void loadWhenHasConfigLocationAsFile() { - String location = "file:src/test/resources/specificlocation.properties"; + void loadWhenHasConfigLocationAsFile() throws IOException { + File properties = new File(this.temp, "specificlocation.properties"); + Files.write(properties.toPath(), + List.of("my.property=fromspecificlocation", "the.property=fromspecificlocation")); + String location = properties.toURI().toURL().toString(); ConfigurableApplicationContext context = this.application.run("--spring.config.location=" + location); - assertThat(context.getEnvironment()).has(matchingPropertySource("Config resource 'file [" + Strings - .join(Arrays.asList("src", "test", "resources", "specificlocation.properties"), File.separatorChar) - + "]' via location '" + location + "'")); + assertThat(context.getEnvironment()) + .has(matchingPropertySource("Config resource 'file [" + properties + "]' via location '" + location + "'")); } @Test - void loadWhenHasRelativeConfigLocationUsesFileLocation() { - String location = "src/test/resources/specificlocation.properties"; - ConfigurableApplicationContext context = this.application.run("--spring.config.location=" + location); - assertThat(context.getEnvironment()).has(matchingPropertySource("Config resource 'file [" + Strings - .join(Arrays.asList("src", "test", "resources", "specificlocation.properties"), File.separatorChar) - + "]' via location '" + location + "'")); + void loadWhenHasRelativeConfigLocationUsesFileLocation() throws IOException { + File buildOutput = new BuildOutput(getClass()).getRootLocation(); + File resources = new File(buildOutput, "resources-" + UUID.randomUUID()); + try { + resources.mkdirs(); + File properties = new File(resources, "specificlocation.properties").getAbsoluteFile(); + Files.write(properties.toPath(), + List.of("my.property=fromspecificlocation", "the.property=fromspecificlocation")); + Path relative = new File("").getAbsoluteFile().toPath().relativize(properties.toPath()); + ConfigurableApplicationContext context = this.application.run("--spring.config.location=" + relative); + assertThat(context.getEnvironment()).has(matchingPropertySource( + "Config resource 'file [" + relative + "]' via location '" + relative + "'")); + } + finally { + FileSystemUtils.deleteRecursively(resources); + } } @Test + @WithResource(name = "application-customdefault.properties", content = "customdefault=true") + @WithResource(name = "application-dev.properties", content = "my.property=fromdevpropertiesfile") void loadWhenCustomDefaultProfileAndActiveFromPreviousSourceDoesNotActivateDefault() { ConfigurableApplicationContext context = this.application.run("--spring.profiles.default=customdefault", "--spring.profiles.active=dev"); - String property = context.getEnvironment().getProperty("my.property"); - assertThat(property).isEqualTo("fromdevpropertiesfile"); + assertThat(context.getEnvironment().getProperty("my.property")).isEqualTo("fromdevpropertiesfile"); assertThat(context.getEnvironment().containsProperty("customdefault")).isFalse(); } @Test + @WithResource(name = "application.properties", content = """ + spring.profiles.active=customdefault + customprofile=true + """) + @WithResource(name = "application-customdefault.properties", content = "customprofile-customdefault=true") void runWhenCustomDefaultProfileSameAsActiveFromFileActivatesProfile() { - ConfigurableApplicationContext context = this.application.run( - "--spring.config.location=classpath:configdata/profiles/", "--spring.profiles.default=customdefault", - "--spring.config.name=customprofile"); + ConfigurableApplicationContext context = this.application.run("--spring.profiles.default=customdefault"); ConfigurableEnvironment environment = context.getEnvironment(); assertThat(environment.containsProperty("customprofile")).isTrue(); assertThat(environment.containsProperty("customprofile-customdefault")).isTrue(); @@ -472,13 +732,18 @@ void runWhenCustomDefaultProfileSameAsActiveFromFileActivatesProfile() { } @Test + @WithResource(name = "application.properties", content = "spring.profiles.active=${activeProfile:propertiesfile}") void runWhenActiveProfilesCanBeConfiguredUsingPlaceholdersResolvedAgainstTheEnvironmentLoadsExpectedProperties() { - ConfigurableApplicationContext context = this.application.run("--activeProfile=testPropertySource", - "--spring.config.name=testactiveprofiles"); + ConfigurableApplicationContext context = this.application.run("--activeProfile=testPropertySource"); assertThat(context.getEnvironment().getActiveProfiles()).containsExactly("testPropertySource"); } @Test + @WithResource(name = "application.properties", content = """ + foo=bucket + value=1234 + """) + @WithResource(name = "override.properties", content = "foo=bar") void runWhenHasAdditionalLocationLoadsWithAdditionalTakingPrecedenceOverDefaultLocation() { ConfigurableApplicationContext context = this.application .run("--spring.config.additional-location=classpath:override.properties"); @@ -487,6 +752,12 @@ void runWhenHasAdditionalLocationLoadsWithAdditionalTakingPrecedenceOverDefaultL } @Test + @WithResource(name = "application.properties", content = """ + foo=bucket + value=1234 + """) + @WithResource(name = "override.properties", content = "foo=bar") + @WithResource(name = "some.properties", content = "foo=spam") void runWhenMultipleAdditionalLocationsLoadsWithLastWinning() { ConfigurableApplicationContext context = this.application .run("--spring.config.additional-location=classpath:override.properties,classpath:some.properties"); @@ -495,6 +766,9 @@ void runWhenMultipleAdditionalLocationsLoadsWithLastWinning() { } @Test + @WithResource(name = "application.properties", content = "value=1234") + @WithResource(name = "override.properties", content = "foo=bar") + @WithResource(name = "some.properties", content = "foo=spam") void runWhenAdditionalLocationAndLocationLoadsWithAdditionalTakingPrecedenceOverConfigured() { ConfigurableApplicationContext context = this.application.run( "--spring.config.location=classpath:some.properties", @@ -504,12 +778,19 @@ void runWhenAdditionalLocationAndLocationLoadsWithAdditionalTakingPrecedenceOver } @Test + @WithResource(name = "application.custom", content = "") + @WithResource(name = "META-INF/spring.factories", content = """ + org.springframework.boot.env.PropertySourceLoader=\ + org.springframework.boot.context.config.TestPropertySourceLoader1,\ + org.springframework.boot.context.config.TestPropertySourceLoader2 + """) void runWhenPropertiesFromCustomPropertySourceLoaderShouldLoadFromCustomSource() { ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getProperty("customloader1")).isEqualTo("true"); } @Test + @WithResource(name = "gh17001.properties", content = "gh17001loaded=true") void runWhenCustomDefaultPropertySourceLoadsWithoutReplacingCustomSource() { // gh-17011 Map source = new HashMap<>(); @@ -581,75 +862,123 @@ void runWhenConfigLocationHasMandatoryDirectoryThatDoesntExistThrowsException() void runWhenConfigLocationHasNonOptionalEmptyFileDoesNotThrowException() throws IOException { File location = new File(this.temp, "application.properties"); FileCopyUtils.copy(new byte[0], location); - assertThatNoException() - .isThrownBy(() -> this.application.run("--spring.config.location=classpath:/application.properties," - + StringUtils.cleanPath(location.getAbsolutePath()))); + assertThatNoException().isThrownBy(() -> this.application + .run("--spring.config.location=" + StringUtils.cleanPath(location.getAbsolutePath()))); } @Test + @WithResource(name = "META-INF/spring.factories", content = """ + org.springframework.boot.context.config.ConfigDataLocationResolver=\ + org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorIntegrationTests$LocationResolver + + org.springframework.boot.context.config.ConfigDataLoader=\ + org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorIntegrationTests$Loader + """) void runWhenResolvedIsOptionalDoesNotThrowException() { ApplicationContext context = this.application.run("--spring.config.location=test:optionalresult"); assertThat(context.getEnvironment().containsProperty("spring")).isFalse(); } @Test + @WithResource(name = "application.properties", content = "spring.profiles=a") void runWhenUsingInvalidPropertyThrowsException() { - assertThatExceptionOfType(InvalidConfigDataPropertyException.class) - .isThrownBy(() -> this.application.run("--spring.config.location=classpath:invalidproperty.properties")); + assertThatExceptionOfType(InvalidConfigDataPropertyException.class).isThrownBy(() -> this.application.run()); } @Test + @WithResource(name = "application.properties", content = """ + my.import=imported + spring.config.import=classpath:${my.import}.properties + """) + @WithResource(name = "imported.properties", content = "my.value=iwasimported") void runWhenImportUsesPlaceholder() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.location=classpath:application-import-with-placeholder.properties"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getProperty("my.value")).isEqualTo("iwasimported"); } @Test + @WithResource(name = "application.properties", content = """ + my.import=imported + #--- + spring.config.import=classpath:${my.import}.properties + """) + @WithResource(name = "imported.properties", content = "my.value=iwasimported") void runWhenImportFromEarlierDocumentUsesPlaceholder() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.location=classpath:application-import-with-placeholder-in-document.properties"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getProperty("my.value")).isEqualTo("iwasimported"); } @Test // gh-26858 + @WithResource(name = "application.properties", content = """ + spring.config.import=classpath:imported.properties + my.value=application.properties + """) + @WithResource(name = "imported.properties", content = "my.value=imported.properties") + @WithResource(name = "application-dev.properties", content = "my.value=application-dev.properties") void runWhenImportWithProfileVariantOrdersPropertySourcesCorrectly() { this.application.setAdditionalProfiles("dev"); - ConfigurableApplicationContext context = this.application - .run("--spring.config.location=classpath:application-import-with-profile-variant.properties"); - assertThat(context.getEnvironment().getProperty("my.value")) - .isEqualTo("application-import-with-profile-variant-imported-dev"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.value")).isEqualTo("application-dev.properties"); } @Test + @WithResource(name = "application.properties", content = """ + spring.config.import=classpath:imported.properties + my.value=application.properties + """) + @WithResource(name = "imported.properties", content = "my.value=imported.properties") + @WithResource(name = "imported-dev.properties", content = "my.value=imported-dev.properties") + @WithResource(name = "application-dev.properties", content = """ + spring.config.import=imported-dev.properties + my.value=application-dev.properties""") void runWhenImportWithProfileVariantAndDirectProfileImportOrdersPropertySourcesCorrectly() { this.application.setAdditionalProfiles("dev"); - ConfigurableApplicationContext context = this.application.run( - "--spring.config.location=classpath:application-import-with-profile-variant-and-direct-profile-import.properties"); - assertThat(context.getEnvironment().getProperty("my.value")) - .isEqualTo("application-import-with-profile-variant-imported-dev"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.value")).isEqualTo("imported-dev.properties"); } @Test + @WithResource(name = "application.properties", content = """ + my.import=application-import-with-placeholder-imported + #--- + spring.config.import=classpath:org/springframework/boot/context/config/${my.import}.properties + #--- + my.import=badbadbad + spring.config.activate.on-profile=missing + """) void runWhenHasPropertyInProfileDocumentThrowsException() { - assertThatExceptionOfType(BindException.class).isThrownBy(() -> this.application.run( - "--spring.config.location=classpath:application-import-with-placeholder-in-profile-document.properties")) + assertThatExceptionOfType(BindException.class).isThrownBy(() -> this.application.run()) .withCauseInstanceOf(InactiveConfigDataAccessException.class); } @Test // gh-29386 + @WithResource(name = "application.properties", content = """ + my.value=application + #--- + my.import=imported + spring.config.activate.on-profile=missing + #--- + spring.config.import=${my.import}.properties + """) + @WithResource(name = "imported.properties", content = "my.value=imported") void runWhenHasPropertyInEarlierProfileDocumentThrowsException() { - assertThatExceptionOfType(BindException.class).isThrownBy(() -> this.application.run( - "--spring.config.location=classpath:application-import-with-placeholder-in-earlier-profile-document.properties")) + assertThatExceptionOfType(BindException.class).isThrownBy(() -> this.application.run()) .withCauseInstanceOf(InactiveConfigDataAccessException.class); } @Test // gh-29386 + @WithResource(name = "application.properties", content = """ + my.import=imported + #--- + my.value=should-be-ignored + spring.config.activate.on-profile=missing + #--- + spring.config.import=classpath:${my.import}.properties + """) + @WithResource(name = "imported.properties", content = "my.value=imported") void runWhenHasPropertyInEarlierDocumentLoads() { - ConfigurableApplicationContext context = this.application.run( - "--spring.config.location=classpath:application-import-with-placeholder-in-earlier-document.properties"); - assertThat(context.getEnvironment().getProperty("my.value")) - .isEqualTo("application-import-with-placeholder-in-earlier-document-imported"); + ConfigurableApplicationContext context = this.application.run(); + assertThat(context.getEnvironment().getProperty("my.value")).isEqualTo("imported"); } @Test @@ -665,38 +994,69 @@ void runWhenHasNonOptionalImportAndIgnoreNotFoundPropertyDoesNotThrowException() } @Test + @WithResource(name = "application.properties", content = """ + spring.profiles.active=p1 + spring.profiles.include=p2 + #--- + spring.profiles.include=p3,p4 + #--- + spring.profiles.include=p5 + """) void runWhenHasIncludedProfilesActivatesProfiles() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.location=classpath:application-include-profiles.properties"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactlyInAnyOrder("p1", "p2", "p3", "p4", "p5"); } @Test + @WithResource(name = "application.properties", content = """ + spring.profiles.active=p1 + spring.profiles.include=p2 + #--- + myprofile=p4 + spring.profiles.include=p3,${myprofile} + #--- + myotherprofile=p5 + spring.profiles.include=${myotherprofile} + """) void runWhenHasIncludedProfilesWithPlaceholderActivatesProfiles() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.location=classpath:application-include-profiles-with-placeholder.properties"); + ConfigurableApplicationContext context = this.application.run(); assertThat(context.getEnvironment().getActiveProfiles()).containsExactlyInAnyOrder("p1", "p2", "p3", "p4", "p5"); } @Test + @WithResource(name = "application.properties", content = """ + spring.profiles.active=p1 + spring.profiles.include=p2 + #--- + spring.config.activate.on-profile=p2 + spring.profiles.include=p3 + """) void runWhenHasIncludedProfilesWithProfileSpecificDocumentThrowsException() { - assertThatExceptionOfType(InactiveConfigDataAccessException.class).isThrownBy(() -> this.application.run( - "--spring.config.location=classpath:application-include-profiles-in-profile-specific-document.properties")); + assertThatExceptionOfType(InactiveConfigDataAccessException.class).isThrownBy(() -> this.application.run()); } @Test + @WithResource(name = "application-test.yaml", content = """ + spring: + profiles: + include: + - p + """) void runWhenHasIncludedProfilesWithListSyntaxWithProfileSpecificDocumentThrowsException() { - assertThatExceptionOfType(InvalidConfigDataPropertyException.class).isThrownBy(() -> this.application.run( - "--spring.config.name=application-include-profiles-list-in-profile-specific-file", - "--spring.profiles.active=test")); + assertThatExceptionOfType(InvalidConfigDataPropertyException.class) + .isThrownBy(() -> this.application.run("--spring.profiles.active=test")); } @Test + @WithResource(name = "application.properties", content = """ + my.import=imported + spring.config.import=classpath:${my.import}.properties + """) + @WithResource(name = "imported.properties", content = "my.value=imported") void runWhenImportingIncludesParentOrigin() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.location=classpath:application-import-with-placeholder.properties"); + ConfigurableApplicationContext context = this.application.run(); Binder binder = Binder.get(context.getEnvironment()); List properties = new ArrayList<>(); BindHandler bindHandler = new BindHandler() { @@ -712,107 +1072,158 @@ public Object onSuccess(ConfigurationPropertyName name, Bindable target, Bind binder.bind("my.value", Bindable.of(String.class), bindHandler); assertThat(properties).hasSize(1); Origin origin = properties.get(0).getOrigin(); - assertThat(origin.toString()).contains("application-import-with-placeholder-imported"); - assertThat(origin.getParent().toString()).contains("application-import-with-placeholder"); + assertThat(origin.toString()).contains("imported.properties"); + assertThat(origin.getParent().toString()).contains("application.properties"); } @Test + @WithResource(name = "config/first/application.properties", content = "first.property=apple") + @WithResource(name = "config/second/application.properties", content = "second.property=ball") + @WithResource(name = "config/third/nested/application.properties", content = "third.property=three") void runWhenHasWildcardLocationLoadsFromAllMatchingLocations() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.location=file:src/test/resources/config/*/", "--spring.config.name=testproperties"); + ConfigurableApplicationContext context = this.application.run("--spring.config.location=classpath:config/*/"); ConfigurableEnvironment environment = context.getEnvironment(); assertThat(environment.getProperty("first.property")).isEqualTo("apple"); assertThat(environment.getProperty("second.property")).isEqualTo("ball"); + assertThat(environment.getProperty("third.property")).isNull(); } @Test - void runWhenOptionalWildcardLocationDoesNotExistDoesNotThrowException() { + void runWhenOptionalWildcardFileDoesNotExistDoesNotThrowException() { assertThatNoException().isThrownBy(() -> this.application - .run("--spring.config.location=optional:file:src/test/resources/nonexistent/*/testproperties.properties")); + .run("--spring.config.location=optional:classpath:nonexistent/*/testproperties.properties")); } @Test - void runWhenMandatoryWildcardLocationDoesNotExistThrowsException() { + void runWhenMandatoryWildcardFileDoesNotExistThrowsException() { assertThatExceptionOfType(ConfigDataLocationNotFoundException.class).isThrownBy(() -> this.application - .run("--spring.config.location=file:src/test/resources/nonexistent/*/testproperties.properties")); + .run("--spring.config.location=classpath:nonexistent/*/testproperties.properties")); } @Test - void runWhenMandatoryWildcardLocationHasEmptyFileDirectory() { - assertThatNoException() - .isThrownBy(() -> this.application.run("--spring.config.location=file:src/test/resources/config/*/")); + @WithResourceDirectory("config/empty") + void runWhenMandatoryWildcardDirectoryHasEmptyDirectoryDoesNotThrowException() { + assertThatNoException().isThrownBy(() -> this.application.run("--spring.config.location=classpath:config/*/")); } @Test - void runWhenMandatoryWildcardLocationHasNoSubdirectories() { - assertThatExceptionOfType(ConfigDataLocationNotFoundException.class) - .isThrownBy( - () -> this.application.run("--spring.config.location=file:src/test/resources/config/0-empty/*/")) - .withMessage("Config data location 'file:src/test/resources/config/0-empty/*/' contains no subdirectories"); + @WithResourceDirectory("config/empty") + void runWhenOptionalWildcardDirectoryHasNoSubdirectoriesDoesNotThrow() { + assertThatNoException() + .isThrownBy(() -> this.application.run("--spring.config.location=optional:classpath:config/*/")); } @Test - void runWhenHasMandatoryWildcardLocationThatDoesNotExist() { + @WithResourceDirectory("config") + void runWhenMandatoryWildcardDirectoryHasNoSubdirectoriesThrows() { assertThatExceptionOfType(ConfigDataLocationNotFoundException.class) - .isThrownBy(() -> this.application.run("--spring.config.location=file:invalid/*/")); + .isThrownBy(() -> this.application.run("--spring.config.location=classpath:config/*/")) + .withMessage("Config data location 'classpath:config/*/' contains no subdirectories"); } @Test - void runWhenHasOptionalWildcardLocationThatDoesNotExistDoesNotThrow() { + void runWhenOptionalWildcardDirectoryDoesNotExistDoesNotThrowException() { assertThatNoException() .isThrownBy(() -> this.application.run("--spring.config.location=optional:file:invalid/*/")); } - @Test - void runWhenOptionalWildcardLocationHasNoSubdirectoriesDoesNotThrow() { - assertThatNoException().isThrownBy(() -> this.application - .run("--spring.config.location=optional:file:src/test/resources/config/0-empty/*/")); - } - @Test // gh-24990 + @WithResource(name = "application.properties", content = "spring.profiles.active=test,other") + @WithResource(name = "application-test.properties", content = """ + test1=test1 + #--- + spring.config.activate.on-profile=other + test2=test2 + """) void runWhenHasProfileSpecificFileWithActiveOnProfileProperty() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.name=application-activate-on-profile-in-profile-specific-file"); + ConfigurableApplicationContext context = this.application.run(); ConfigurableEnvironment environment = context.getEnvironment(); assertThat(environment.getProperty("test1")).isEqualTo("test1"); assertThat(environment.getProperty("test2")).isEqualTo("test2"); } @Test // gh-26960 + @WithResource(name = "application.properties", content = """ + spring.profiles.active=p1,p2 + application=true + """) + @WithResource(name = "application-p1.properties", content = """ + application-p1=true + spring.config.import=import.properties + """) + @WithResource(name = "import.properties", content = "import=true") + @WithResource(name = "import-p1.properties", content = "import-p1=true") + @WithResource(name = "import-p2.properties", content = "import-p2=true") void runWhenHasProfileSpecificImportWithImportImportsSecondProfileSpecificFile() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.name=application-profile-specific-import-with-import"); + ConfigurableApplicationContext context = this.application.run(); ConfigurableEnvironment environment = context.getEnvironment(); - assertThat(environment.containsProperty("application-profile-specific-import-with-import")).isTrue(); - assertThat(environment.containsProperty("application-profile-specific-import-with-import-p1")).isTrue(); - assertThat(environment.containsProperty("application-profile-specific-import-with-import-p2")).isFalse(); - assertThat(environment.containsProperty("application-profile-specific-import-with-import-import")).isTrue(); - assertThat(environment.containsProperty("application-profile-specific-import-with-import-import-p1")).isTrue(); - assertThat(environment.containsProperty("application-profile-specific-import-with-import-import-p2")).isTrue(); + assertThat(environment.containsProperty("application")).isTrue(); + assertThat(environment.containsProperty("application-p1")).isTrue(); + assertThat(environment.containsProperty("application-p2")).isFalse(); + assertThat(environment.containsProperty("import")).isTrue(); + assertThat(environment.containsProperty("import-p1")).isTrue(); + assertThat(environment.containsProperty("import-p2")).isTrue(); } @Test // gh-26960 + @WithResource(name = "application.properties", content = "spring.profiles.active=p1,p2") + @WithResource(name = "application-p1.properties", content = "spring.config.import:test:boot") + @WithResource(name = "META-INF/spring.factories", content = """ + org.springframework.boot.context.config.ConfigDataLocationResolver=\ + org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorIntegrationTests$LocationResolver + + org.springframework.boot.context.config.ConfigDataLoader=\ + org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorIntegrationTests$Loader + """) void runWhenHasProfileSpecificImportWithCustomImportResolvesProfileSpecific() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.name=application-profile-specific-import-with-custom-import"); + ConfigurableApplicationContext context = this.application.run(); ConfigurableEnvironment environment = context.getEnvironment(); assertThat(environment.containsProperty("test:boot")).isTrue(); assertThat(environment.containsProperty("test:boot:ps")).isTrue(); } @Test // gh-26593 + @WithResource(name = "application.properties", content = """ + root=true + v1=root + v2=root + """) + @WithResource(name = "application-p1.properties", content = """ + root-p1=true + v1=root-p1 + v2=root-p1 + """) + @WithResource(name = "application-p2.properties", content = """ + root-p2=true + v1=root-p2 + v2=root-p2 + """) + @WithResource(name = "config/application.properties", content = """ + config=true + v1=config + v2=config + """) + @WithResource(name = "config/application-p1.properties", content = """ + config-p1=true + v1=config-p1 + #v2 intentionally missing + """) + @WithResource(name = "config/application-p2.properties", content = """ + config-p2=true + v1=config-p2 + #v2 intentionally missing + """) void runWhenHasFilesInRootAndConfigWithProfiles() { - ConfigurableApplicationContext context = this.application - .run("--spring.config.name=file-in-root-and-config-with-profile", "--spring.profiles.active=p1,p2"); + ConfigurableApplicationContext context = this.application.run("--spring.profiles.active=p1,p2"); ConfigurableEnvironment environment = context.getEnvironment(); - assertThat(environment.containsProperty("file-in-root-and-config-with-profile")).isTrue(); - assertThat(environment.containsProperty("file-in-root-and-config-with-profile-p1")).isTrue(); - assertThat(environment.containsProperty("file-in-root-and-config-with-profile-p2")).isTrue(); - assertThat(environment.containsProperty("config-file-in-root-and-config-with-profile")).isTrue(); - assertThat(environment.containsProperty("config-file-in-root-and-config-with-profile-p1")).isTrue(); - assertThat(environment.containsProperty("config-file-in-root-and-config-with-profile-p2")).isTrue(); - assertThat(environment.getProperty("v1")).isEqualTo("config-file-in-root-and-config-with-profile-p2"); - assertThat(environment.getProperty("v2")).isEqualTo("file-in-root-and-config-with-profile-p2"); + assertThat(environment.containsProperty("root")).isTrue(); + assertThat(environment.containsProperty("root-p1")).isTrue(); + assertThat(environment.containsProperty("root-p2")).isTrue(); + assertThat(environment.containsProperty("config")).isTrue(); + assertThat(environment.containsProperty("config-p1")).isTrue(); + assertThat(environment.containsProperty("config-p2")).isTrue(); + assertThat(environment.getProperty("v1")).isEqualTo("config-p2"); + assertThat(environment.getProperty("v2")).isEqualTo("root-p2"); } private Condition matchingPropertySource(final String sourceName) { @@ -820,21 +1231,12 @@ private Condition matchingPropertySource(final String s @Override public boolean matches(ConfigurableEnvironment value) { - value.getPropertySources().forEach((ps) -> System.out.println(ps.getName())); return value.getPropertySources().contains(sourceName); } }; } - private void assertProfileExpression(String value, String... activeProfiles) { - this.application.setAdditionalProfiles(activeProfiles); - ConfigurableApplicationContext context = this.application.run("--spring.config.name=testprofileexpression", - "--spring.config.location=classpath:configdata/profiles/"); - String property = context.getEnvironment().getProperty("my.property"); - assertThat(property).isEqualTo(value); - } - @Configuration(proxyBeanMethods = false) static class Config { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorTests.java index f7139ad750ad..283b3be3a87d 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import org.springframework.boot.DefaultBootstrapContext; import org.springframework.boot.SpringApplication; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.env.StandardEnvironment; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; @@ -103,6 +104,8 @@ void postProcessEnvironmentWhenNoActiveProfiles() { } @Test + @WithResource(name = "application.properties", content = "property=value") + @WithResource(name = "application-dev.properties", content = "property=dev-value") void applyToAppliesPostProcessing() { int before = this.environment.getPropertySources().size(); TestConfigDataEnvironmentUpdateListener listener = new TestConfigDataEnvironmentUpdateListener(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java index d602bf215444..656e93c2670b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package org.springframework.boot.context.config; -import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Collection; @@ -28,7 +27,6 @@ import java.util.function.Supplier; import org.assertj.core.api.InstanceOfAssertFactories; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; import org.junit.jupiter.params.ParameterizedTest; @@ -42,6 +40,7 @@ import org.springframework.boot.context.config.TestConfigDataEnvironmentUpdateListener.AddedPropertySource; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.logging.DeferredLogFactory; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.env.ConfigurableEnvironment; @@ -149,8 +148,8 @@ void createCreatesInitialImportContributorsInCorrectOrder() { } @Test - void processAndApplyAddsImportedSourceToEnvironment(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); + @WithResource(name = "application.properties", content = "spring=boot") + void processAndApplyAddsImportedSourceToEnvironment() { ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null); configDataEnvironment.processAndApply(); @@ -158,8 +157,14 @@ void processAndApplyAddsImportedSourceToEnvironment(TestInfo info) { } @Test - void processAndApplyOnlyAddsActiveContributors(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); + @WithResource(name = "application.properties", content = """ + spring=boot + #--- + spring.config.activate.on-profile=missing + other=value + No newline at end of file + """) + void processAndApplyOnlyAddsActiveContributors() { ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null); configDataEnvironment.processAndApply(); @@ -180,8 +185,8 @@ void processAndApplyMovesDefaultPropertySourceToLast(TestInfo info) { } @Test + @WithResource(name = "application.properties", content = "spring.profiles.default=one,two,three") void processAndApplySetsDefaultProfiles(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null); configDataEnvironment.processAndApply(); @@ -189,8 +194,8 @@ void processAndApplySetsDefaultProfiles(TestInfo info) { } @Test - void processAndApplySetsActiveProfiles(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); + @WithResource(name = "application.properties", content = "spring.profiles.active=one,two,three") + void processAndApplySetsActiveProfiles() { ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null); configDataEnvironment.processAndApply(); @@ -198,8 +203,11 @@ void processAndApplySetsActiveProfiles(TestInfo info) { } @Test - void processAndApplySetsActiveProfilesAndProfileGroups(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); + @WithResource(name = "application.properties", content = """ + spring.profiles.active=one,two,three + spring.profiles.group.one=four,five + """) + void processAndApplySetsActiveProfilesAndProfileGroups() { ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null); configDataEnvironment.processAndApply(); @@ -207,8 +215,8 @@ void processAndApplySetsActiveProfilesAndProfileGroups(TestInfo info) { } @Test + @WithResource(name = "application.properties", content = "spring.profiles.active=test") void processAndApplyDoesNotSetProfilesFromIgnoreProfilesContributors(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null) { @@ -281,8 +289,8 @@ protected ConfigDataEnvironmentContributors createContributors( } @Test + @WithResource(name = "application.properties", content = "spring=boot") void processAndApplyDoesNotSetProfilesFromIgnoreProfilesContributorsWhenNoProfilesActive(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null) { @@ -307,9 +315,8 @@ protected ConfigDataEnvironmentContributors createContributors( } @Test - @Disabled("Disabled until spring.profiles support is dropped") void processAndApplyWhenHasInvalidPropertyThrowsException() { - this.environment.setProperty("spring.profile", "a"); + this.environment.setProperty("spring.profiles", "a"); ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, null); assertThatExceptionOfType(InvalidConfigDataPropertyException.class) @@ -317,8 +324,9 @@ void processAndApplyWhenHasInvalidPropertyThrowsException() { } @Test + @WithResource(name = "custom/config.properties", content = "spring=boot") void processAndApplyWhenHasListenerCallsOnPropertySourceAdded(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); + this.environment.setProperty("spring.config.location", "classpath:custom/config.properties"); TestConfigDataEnvironmentUpdateListener listener = new TestConfigDataEnvironmentUpdateListener(); ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, listener); @@ -326,14 +334,14 @@ void processAndApplyWhenHasListenerCallsOnPropertySourceAdded(TestInfo info) { assertThat(listener.getAddedPropertySources()).hasSize(1); AddedPropertySource addedPropertySource = listener.getAddedPropertySources().get(0); assertThat(addedPropertySource.getPropertySource().getProperty("spring")).isEqualTo("boot"); - assertThat(addedPropertySource.getLocation()).hasToString(getConfigLocation(info)); + assertThat(addedPropertySource.getLocation()).hasToString("classpath:custom/config.properties"); assertThat(addedPropertySource.getResource().toString()).contains("class path resource") - .contains(info.getTestMethod().get().getName()); + .contains("custom/config.properties"); } @Test + @WithResource(name = "application.properties", content = "spring.profiles.active=one,two,three") void processAndApplyWhenHasListenerCallsOnSetProfiles(TestInfo info) { - this.environment.setProperty("spring.config.location", getConfigLocation(info)); TestConfigDataEnvironmentUpdateListener listener = new TestConfigDataEnvironmentUpdateListener(); ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, this.environment, this.resourceLoader, this.additionalProfiles, listener); @@ -343,17 +351,18 @@ void processAndApplyWhenHasListenerCallsOnSetProfiles(TestInfo info) { @Test @SuppressWarnings("rawtypes") + @WithResource(name = "separate-class-loader-spring.factories", content = """ + org.springframework.boot.context.config.ConfigDataLoader=\ + org.springframework.boot.context.config.ConfigDataEnvironmentTests$SeparateClassLoaderConfigDataLoader + """) void configDataLoadersAreLoadedUsingClassLoaderFromResourceLoader() { ResourceLoader resourceLoader = mock(ResourceLoader.class); - ClassLoader classLoader = new ClassLoader() { + ClassLoader classLoader = new ClassLoader(Thread.currentThread().getContextClassLoader()) { @Override public Enumeration getResources(String name) throws IOException { if (SpringFactoriesLoader.FACTORIES_RESOURCE_LOCATION.equals(name)) { - return Collections.enumeration(List.of(new File( - "src/test/resources/org/springframework/boot/context/config/separate-class-loader-spring.factories") - .toURI() - .toURL())); + return super.getResources("separate-class-loader-spring.factories"); } return super.getResources(name); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataLocationRuntimeHintsTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataLocationRuntimeHintsTests.java index e4a822bd4db0..7db561f8198d 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataLocationRuntimeHintsTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataLocationRuntimeHintsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import org.springframework.boot.env.PropertiesPropertySourceLoader; import org.springframework.boot.env.PropertySourceLoader; import org.springframework.boot.env.YamlPropertySourceLoader; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.test.io.support.MockSpringFactoriesLoader; @@ -41,9 +42,11 @@ class ConfigDataLocationRuntimeHintsTests { @Test + @WithResource(name = "application.properties", content = "") + @WithResource(name = "config/application.properties", content = "") void registerWithDefaultSettings() { RuntimeHints hints = new RuntimeHints(); - new TestConfigDataLocationRuntimeHints().registerHints(hints, null); + new TestConfigDataLocationRuntimeHints().registerHints(hints, Thread.currentThread().getContextClassLoader()); assertThat(hints.resources().resourcePatternHints()).singleElement() .satisfies(includes("application*.properties", "application*.xml", "application*.yaml", "application*.yml", "config/application*.properties", "config/application*.xml", "config/application*.yaml", @@ -51,6 +54,8 @@ void registerWithDefaultSettings() { } @Test + @WithResource(name = "test.properties") + @WithResource(name = "config/test.properties") void registerWithCustomName() { RuntimeHints hints = new RuntimeHints(); new TestConfigDataLocationRuntimeHints() { @@ -59,13 +64,15 @@ protected List getFileNames(ClassLoader classLoader) { return List.of("test"); } - }.registerHints(hints, null); + }.registerHints(hints, Thread.currentThread().getContextClassLoader()); assertThat(hints.resources().resourcePatternHints()).singleElement() .satisfies(includes("test*.properties", "test*.xml", "test*.yaml", "test*.yml", "config/test*.properties", "config/test*.xml", "config/test*.yaml", "config/test*.yml")); } @Test + @WithResource(name = "application.properties") + @WithResource(name = "config/application.properties") void registerWithCustomLocation() { RuntimeHints hints = new RuntimeHints(); new TestConfigDataLocationRuntimeHints() { @@ -73,13 +80,15 @@ void registerWithCustomLocation() { protected List getLocations(ClassLoader classLoader) { return List.of("config/"); } - }.registerHints(hints, null); + }.registerHints(hints, Thread.currentThread().getContextClassLoader()); assertThat(hints.resources().resourcePatternHints()).singleElement() .satisfies(includes("config/application*.properties", "config/application*.xml", "config/application*.yaml", "config/application*.yml")); } @Test + @WithResource(name = "application.conf") + @WithResource(name = "config/application.conf") void registerWithCustomExtension() { RuntimeHints hints = new RuntimeHints(); new ConfigDataLocationRuntimeHints() { @@ -87,7 +96,7 @@ void registerWithCustomExtension() { protected List getExtensions(ClassLoader classLoader) { return List.of(".conf"); } - }.registerHints(hints, null); + }.registerHints(hints, Thread.currentThread().getContextClassLoader()); assertThat(hints.resources().resourcePatternHints()).singleElement() .satisfies(includes("application*.conf", "config/application*.conf")); } @@ -100,7 +109,7 @@ void registerWithUnknownLocationDoesNotAddHint() { protected List getLocations(ClassLoader classLoader) { return List.of(UUID.randomUUID().toString()); } - }.registerHints(hints, null); + }.registerHints(hints, Thread.currentThread().getContextClassLoader()); assertThat(hints.resources().resourcePatternHints()).isEmpty(); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLoaderTests.java index 908c4a29c0f5..ad06f8e77cbc 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import org.springframework.boot.env.PropertiesPropertySourceLoader; import org.springframework.boot.env.YamlPropertySourceLoader; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.ClassPathResource; @@ -41,32 +42,36 @@ class StandardConfigDataLoaderTests { private final ConfigDataLoaderContext loaderContext = mock(ConfigDataLoaderContext.class); @Test + @WithResource(name = "application.yml", content = """ + foo: bar + --- + hello: world + """) void loadWhenLocationResultsInMultiplePropertySourcesAddsAllToConfigData() throws IOException { - ClassPathResource resource = new ClassPathResource("configdata/yaml/application.yml"); + ClassPathResource resource = new ClassPathResource("application.yml"); StandardConfigDataReference reference = new StandardConfigDataReference( - ConfigDataLocation.of("classpath:configdata/yaml/application.yml"), null, - "classpath:configdata/yaml/application", null, "yml", new YamlPropertySourceLoader()); + ConfigDataLocation.of("classpath:application.yml"), null, "classpath:application", null, "yml", + new YamlPropertySourceLoader()); StandardConfigDataResource location = new StandardConfigDataResource(reference, resource); ConfigData configData = this.loader.load(this.loaderContext, location); assertThat(configData.getPropertySources()).hasSize(2); PropertySource source1 = configData.getPropertySources().get(0); PropertySource source2 = configData.getPropertySources().get(1); - assertThat(source1.getName()) - .isEqualTo("Config resource 'class path resource [configdata/yaml/application.yml]' " - + "via location 'classpath:configdata/yaml/application.yml' (document #0)"); + assertThat(source1.getName()).isEqualTo("Config resource 'class path resource [application.yml]' " + + "via location 'classpath:application.yml' (document #0)"); assertThat(source1.getProperty("foo")).isEqualTo("bar"); - assertThat(source2.getName()) - .isEqualTo("Config resource 'class path resource [configdata/yaml/application.yml]' " - + "via location 'classpath:configdata/yaml/application.yml' (document #1)"); + assertThat(source2.getName()).isEqualTo("Config resource 'class path resource [application.yml]' " + + "via location 'classpath:application.yml' (document #1)"); assertThat(source2.getProperty("hello")).isEqualTo("world"); } @Test + @WithResource(name = "empty.properties") void loadWhenPropertySourceIsEmptyAddsNothingToConfigData() throws IOException { - ClassPathResource resource = new ClassPathResource("config/0-empty/testproperties.properties"); + ClassPathResource resource = new ClassPathResource("empty.properties"); StandardConfigDataReference reference = new StandardConfigDataReference( - ConfigDataLocation.of("classpath:config/0-empty/testproperties.properties"), null, - "config/0-empty/testproperties", null, "properties", new PropertiesPropertySourceLoader()); + ConfigDataLocation.of("empty.properties"), null, "empty", null, "properties", + new PropertiesPropertySourceLoader()); StandardConfigDataResource location = new StandardConfigDataResource(reference, resource); ConfigData configData = this.loader.load(this.loaderContext, location); assertThat(configData.getPropertySources()).isEmpty(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLocationResolverTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLocationResolverTests.java index 6b221e15f2b7..83291ff7f07c 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLocationResolverTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/StandardConfigDataLocationResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.context.config; import java.io.File; +import java.nio.file.Path; import java.util.Collections; import java.util.List; @@ -26,6 +27,8 @@ import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.env.PropertiesPropertySourceLoader; import org.springframework.boot.logging.DeferredLogs; +import org.springframework.boot.testsupport.classpath.resources.ResourcesRoot; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.DefaultResourceLoader; @@ -71,23 +74,22 @@ void isResolvableAlwaysReturnsTrue() { } @Test + @WithResource(name = "configdata/application.properties") void resolveWhenLocationIsDirectoryResolvesAllMatchingFilesInDirectory() { - ConfigDataLocation location = ConfigDataLocation.of("classpath:/configdata/properties/"); + ConfigDataLocation location = ConfigDataLocation.of("classpath:/configdata/"); List locations = this.resolver.resolve(this.context, location); assertThat(locations).hasSize(1); assertThat(locations).extracting(Object::toString) - .containsExactly("class path resource [configdata/properties/application.properties]"); + .containsExactly("class path resource [configdata/application.properties]"); } @Test void resolveWhenLocationIsFileResolvesFile() { - ConfigDataLocation location = ConfigDataLocation - .of("file:src/test/resources/configdata/properties/application.properties"); + ConfigDataLocation location = ConfigDataLocation.of("file:configdata/application.properties"); List locations = this.resolver.resolve(this.context, location); assertThat(locations).hasSize(1); assertThat(locations).extracting(Object::toString) - .containsExactly( - filePath("src", "test", "resources", "configdata", "properties", "application.properties")); + .containsExactly(filePath("configdata", "application.properties")); } @Test @@ -143,49 +145,55 @@ void resolveWhenLocationHasMultipleWildcardsThrowsException() { } @Test - void resolveWhenLocationIsWildcardDirectoriesRestrictsToOneLevelDeep() { - ConfigDataLocation location = ConfigDataLocation.of("file:src/test/resources/config/*/"); + @WithResource(name = "config/0-empty/testproperties.properties") + @WithResource(name = "config/1-first/testproperties.properties", content = "first.property=apple") + @WithResource(name = "config/2-second/testproperties.properties", content = "second.property=ball") + @WithResource(name = "config/nested/3-third/testproperties.properties", content = "third.property=shouldnotbefound") + void resolveWhenLocationIsWildcardDirectoriesRestrictsToOneLevelDeep(@ResourcesRoot Path resourcesRoot) { + ConfigDataLocation location = ConfigDataLocation.of("file:" + resourcesRoot + "/config/*/"); this.environment.setProperty("spring.config.name", "testproperties"); this.resolver = new StandardConfigDataLocationResolver(new DeferredLogs(), this.environmentBinder, this.resourceLoader); List locations = this.resolver.resolve(this.context, location); assertThat(locations).hasSize(3); assertThat(locations).extracting(Object::toString) - .contains(filePath("src", "test", "resources", "config", "1-first", "testproperties.properties")) - .contains(filePath("src", "test", "resources", "config", "2-second", "testproperties.properties")) - .doesNotContain(filePath("src", "test", "resources", "config", "3-third", "testproperties.properties")); + .contains(filePath(resourcesRoot.resolve("config/1-first/testproperties.properties"))) + .contains(filePath(resourcesRoot.resolve("config/2-second/testproperties.properties"))) + .doesNotContain(filePath(resourcesRoot.resolve("config/nested/3-third/testproperties.properties"))); } @Test - void resolveWhenLocationIsWildcardDirectoriesSortsAlphabeticallyBasedOnAbsolutePath() { - ConfigDataLocation location = ConfigDataLocation.of("file:src/test/resources/config/*/"); + @WithResource(name = "config/0-empty/testproperties.properties") + @WithResource(name = "config/1-first/testproperties.properties", content = "first.property=apple") + @WithResource(name = "config/2-second/testproperties.properties", content = "second.property=ball") + @WithResource(name = "config/nested/3-third/testproperties.properties", content = "third.property=shouldnotbefound") + void resolveWhenLocationIsWildcardDirectoriesSortsAlphabeticallyBasedOnAbsolutePath( + @ResourcesRoot Path resourcesRoot) { + ConfigDataLocation location = ConfigDataLocation.of("file:" + resourcesRoot + "/config/*/"); this.environment.setProperty("spring.config.name", "testproperties"); this.resolver = new StandardConfigDataLocationResolver(new DeferredLogs(), this.environmentBinder, this.resourceLoader); List locations = this.resolver.resolve(this.context, location); assertThat(locations).extracting(Object::toString) - .containsExactly(filePath("src", "test", "resources", "config", "0-empty", "testproperties.properties"), - filePath("src", "test", "resources", "config", "1-first", "testproperties.properties"), - filePath("src", "test", "resources", "config", "2-second", "testproperties.properties")); + .containsExactly(filePath(resourcesRoot.resolve("config/0-empty/testproperties.properties")), + filePath(resourcesRoot.resolve("config/1-first/testproperties.properties")), + filePath(resourcesRoot.resolve("config/2-second/testproperties.properties"))); } @Test - void resolveWhenLocationIsWildcardAndMatchingFilePresentShouldNotFail() { - ConfigDataLocation location = ConfigDataLocation.of("optional:file:src/test/resources/a-file/*/"); - assertThatNoException().isThrownBy(() -> this.resolver.resolve(this.context, location)); - } - - @Test - void resolveWhenLocationIsWildcardFilesLoadsAllFilesThatMatch() { + @WithResource(name = "config/0-empty/testproperties.properties") + @WithResource(name = "config/1-first/testproperties.properties", content = "first.property=apple") + @WithResource(name = "config/2-second/testproperties.properties", content = "second.property=ball") + @WithResource(name = "config/nested/3-third/testproperties.properties", content = "third.property=shouldnotbefound") + void resolveWhenLocationIsWildcardFilesLoadsAllFilesThatMatch(@ResourcesRoot Path resourcesRoot) { ConfigDataLocation location = ConfigDataLocation - .of("file:src/test/resources/config/*/testproperties.properties"); + .of("file:" + resourcesRoot + "/config/*/testproperties.properties"); List locations = this.resolver.resolve(this.context, location); assertThat(locations).hasSize(3); assertThat(locations).extracting(Object::toString) - .contains(filePath("src", "test", "resources", "config", "1-first", "testproperties.properties")) - .contains(filePath("src", "test", "resources", "config", "2-second", "testproperties.properties")) - .doesNotContain( - filePath("src", "test", "resources", "config", "nested", "3-third", "testproperties.properties")); + .contains(filePath(resourcesRoot.resolve("config/1-first/testproperties.properties"))) + .contains(filePath(resourcesRoot.resolve("config/2-second/testproperties.properties"))) + .doesNotContain(filePath(resourcesRoot.resolve("config/nested/3-third/testproperties.properties"))); } @Test @@ -208,6 +216,8 @@ void resolveWhenLocationIsRelativeAndFileResolves() { } @Test + @WithResource(name = "config/specific.properties") + @WithResource(name = "config/nested/3-third/testproperties.properties") void resolveWhenLocationIsRelativeAndDirectoryResolves() { this.environment.setProperty("spring.config.name", "testproperties"); ConfigDataLocation location = ConfigDataLocation.of("nested/3-third/"); @@ -240,6 +250,7 @@ void resolveWhenLocationIsRelativeAndNoMatchingLoaderThrowsException() { } @Test + @WithResource(name = "application-props-no-extension", content = "withnoextension=test") void resolveWhenLocationUsesOptionalExtensionSyntaxResolves() throws Exception { ConfigDataLocation location = ConfigDataLocation.of("classpath:/application-props-no-extension[.properties]"); List locations = this.resolver.resolve(this.context, location); @@ -248,19 +259,20 @@ void resolveWhenLocationUsesOptionalExtensionSyntaxResolves() throws Exception { assertThat(resolved.getResource().getFilename()).endsWith("application-props-no-extension"); ConfigData loaded = new StandardConfigDataLoader().load(null, resolved); PropertySource propertySource = loaded.getPropertySources().get(0); - assertThat(propertySource.getProperty("withnotext")).isEqualTo("test"); + assertThat(propertySource.getProperty("withnoextension")).isEqualTo("test"); } @Test + @WithResource(name = "application-dev.properties") void resolveProfileSpecificReturnsProfileSpecificFiles() { - ConfigDataLocation location = ConfigDataLocation.of("classpath:/configdata/properties/"); + ConfigDataLocation location = ConfigDataLocation.of("classpath:/"); Profiles profiles = mock(Profiles.class); given(profiles.iterator()).willReturn(Collections.singletonList("dev").iterator()); List locations = this.resolver.resolveProfileSpecific(this.context, location, profiles); assertThat(locations).hasSize(1); assertThat(locations).extracting(Object::toString) - .containsExactly("class path resource [configdata/properties/application-dev.properties]"); + .containsExactly("class path resource [application-dev.properties]"); } @Test @@ -297,4 +309,8 @@ private String filePath(String... components) { return "file [" + String.join(File.separator, components) + "]"; } + private String filePath(Path path) { + return "file [%s]".formatted(path); + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java index 1d8c729d22e6..44191581879a 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java @@ -18,6 +18,10 @@ import java.io.File; import java.io.IOException; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.nio.file.Path; import java.util.Collections; import java.util.HashMap; @@ -62,6 +66,7 @@ import org.springframework.boot.logging.java.JavaLoggingSystem; import org.springframework.boot.system.ApplicationPid; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.context.ApplicationEvent; @@ -160,8 +165,9 @@ void baseConfigLocation() { } @Test + @WithNonDefaultXmlResource void overrideConfigLocation() { - addPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml"); + addPropertiesToEnvironment(this.context, "logging.config=classpath:nondefault.xml"); this.listener.initialize(this.context.getEnvironment(), this.context.getClassLoader()); this.logger.info("Hello world"); assertThat(this.output).contains("Hello world").doesNotContain("???").startsWith("null ").endsWith("BOOTBOOT"); @@ -178,8 +184,9 @@ void throwableFromInitializeResultsInGracefulFailure(CapturedOutput output) { } @Test + @WithNonDefaultXmlResource void trailingWhitespaceInLoggingConfigShouldBeTrimmed() { - addPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml "); + addPropertiesToEnvironment(this.context, "logging.config=classpath:nondefault.xml "); this.listener.initialize(this.context.getEnvironment(), this.context.getClassLoader()); this.logger.info("Hello world"); assertThat(this.output).contains("Hello world").doesNotContain("???").startsWith("null ").endsWith("BOOTBOOT"); @@ -226,8 +233,9 @@ void overrideConfigBroken() { } @Test + @WithNonDefaultXmlResource void addLogFileProperty() { - addPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml", + addPropertiesToEnvironment(this.context, "logging.config=classpath:nondefault.xml", "logging.file.name=" + this.logFile); this.listener.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); @@ -248,8 +256,9 @@ void addLogFilePropertyWithDefault() { } @Test + @WithNonDefaultXmlResource void addLogPathProperty() { - addPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml", + addPropertiesToEnvironment(this.context, "logging.config=classpath:nondefault.xml", "logging.file.path=" + this.tempDir); this.listener.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); @@ -779,4 +788,22 @@ public int getPhase() { } + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "nondefault.xml", content = """ + + + + %property{LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT + + + + + + + """) + private @interface WithNonDefaultXmlResource { + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesTests.java index a290f0a4950d..f666137e211f 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,6 +69,7 @@ import org.springframework.boot.convert.PeriodStyle; import org.springframework.boot.convert.PeriodUnit; import org.springframework.boot.env.RandomValuePropertySource; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -260,6 +261,21 @@ void loadWhenBindingWithoutAnnotationValueShouldBind() { } @Test + @WithResource(name = "testProperties.xml", + content = """ + + + + + + + + + """) void loadWhenBindingWithDefaultsInXmlShouldBind() { removeSystemProperties(); load(new Class[] { DefaultsInXmlConfiguration.class }); @@ -633,6 +649,7 @@ void customProtocolResolverIsInvoked() { } @Test + @WithResource(name = "application.properties") void customProtocolResolver() { this.context = new AnnotationConfigApplicationContext(); TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, @@ -1356,7 +1373,7 @@ static class WithoutAnnotationValueConfiguration { @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties - @ImportResource("org/springframework/boot/context/properties/testProperties.xml") + @ImportResource("testProperties.xml") static class DefaultsInXmlConfiguration { } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/convert/StringToFileConverterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/convert/StringToFileConverterTests.java index a3cb2b37af07..015e6ab1cfad 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/convert/StringToFileConverterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/convert/StringToFileConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.provider.Arguments; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.convert.ConversionService; import org.springframework.core.io.ClassPathResource; @@ -52,9 +53,10 @@ void convertWhenFilePrefixedReturnsFile(ConversionService conversionService) { } @ConversionServiceTest + @WithResource(name = "com/example/test-file.txt", content = "test content") void convertWhenClasspathPrefixedReturnsFile(ConversionService conversionService) throws IOException { - String resource = new ClassPathResource("test-banner.txt", this.getClass().getClassLoader()).getURL().getFile(); - assertThat(convert(conversionService, "classpath:test-banner.txt").getAbsoluteFile()) + String resource = new ClassPathResource("com/example/test-file.txt").getURL().getFile(); + assertThat(convert(conversionService, "classpath:com/example/test-file.txt").getAbsoluteFile()) .isEqualTo(new File(resource).getAbsoluteFile()); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/NoUniqueBeanDefinitionFailureAnalyzerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/NoUniqueBeanDefinitionFailureAnalyzerTests.java index e8600faabe2a..550b0deb6577 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/NoUniqueBeanDefinitionFailureAnalyzerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/diagnostics/analyzer/NoUniqueBeanDefinitionFailureAnalyzerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import org.springframework.boot.diagnostics.FailureAnalysis; import org.springframework.boot.diagnostics.analyzer.nounique.TestBean; import org.springframework.boot.diagnostics.analyzer.nounique.TestBeanConsumer; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -38,6 +39,17 @@ * @author Andy Wilkinson * @author Scott Frederick */ +@WithResource(name = "producer.xml", + content = """ + + + + + + + """) class NoUniqueBeanDefinitionFailureAnalyzerTests { private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); @@ -78,6 +90,17 @@ void failureAnalysisForObjectProviderMethodConsumer() { } @Test + @WithResource(name = "consumer.xml", + content = """ + + + + + + + """) void failureAnalysisForXmlConsumer() { FailureAnalysis failureAnalysis = analyzeFailure(createFailure(XmlConsumer.class)); assertThat(failureAnalysis.getDescription()).startsWith("Parameter 0 of constructor in " @@ -131,7 +154,7 @@ private void assertFoundBeans(FailureAnalysis analysis) { @Configuration(proxyBeanMethods = false) @ComponentScan(basePackageClasses = TestBean.class) - @ImportResource("/org/springframework/boot/diagnostics/analyzer/nounique/producer.xml") + @ImportResource("classpath:producer.xml") static class DuplicateBeansProducer { @Bean @@ -200,7 +223,7 @@ String consumer(ObjectProvider testBeanProvider) { } @Configuration(proxyBeanMethods = false) - @ImportResource("/org/springframework/boot/diagnostics/analyzer/nounique/consumer.xml") + @ImportResource("classpath:consumer.xml") static class XmlConsumer { } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedPropertiesLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedPropertiesLoaderTests.java index 6fdb3e743bb4..e5f3e7d399e1 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedPropertiesLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedPropertiesLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import org.springframework.boot.env.OriginTrackedPropertiesLoader.Document; import org.springframework.boot.origin.OriginTrackedValue; import org.springframework.boot.origin.TextResourceOrigin; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PropertiesLoaderUtils; @@ -92,9 +93,10 @@ void getUnicodeProperty() { } @Test + @WithResource(name = "malformed-unicode.properties", content = "test-malformed-unicode=properties\\u(026test") void getMalformedUnicodeProperty() { // gh-12716 - ClassPathResource resource = new ClassPathResource("test-properties-malformed-unicode.properties", getClass()); + ClassPathResource resource = new ClassPathResource("malformed-unicode.properties"); assertThatIllegalStateException().isThrownBy(() -> new OriginTrackedPropertiesLoader(resource).load()) .withMessageContaining("Malformed \\uxxxx encoding"); } @@ -326,8 +328,43 @@ void getPropertyWithEscapedTrailingSpace() { } @Test + @WithResource(name = "existing-non-multi-document.properties", content = """ + #--- + # Test + #--- + + spring=boot + + #--- + # Test + + boot=bar + + + # Test + #--- + + bar=ok + + !--- + ! Test + !--- + + ok=well + + !--- + ! Test + + well=hello + + ! Test + !--- + + hello=world + + """) void existingCommentsAreNotTreatedAsMultiDoc() throws Exception { - this.resource = new ClassPathResource("existing-non-multi-document.properties", getClass()); + this.resource = new ClassPathResource("existing-non-multi-document.properties"); this.documents = new OriginTrackedPropertiesLoader(this.resource).load(); assertThat(this.documents).hasSize(1); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java index ce5fa86434b1..ccabf50b3703 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,10 @@ package org.springframework.boot.env; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.List; @@ -27,6 +31,7 @@ import org.springframework.boot.origin.OriginTrackedValue; import org.springframework.boot.origin.TextResourceOrigin; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; @@ -48,11 +53,12 @@ class OriginTrackedYamlLoaderTests { @BeforeEach void setUp() { - Resource resource = new ClassPathResource("test-yaml.yml", getClass()); + Resource resource = new ClassPathResource("test-yaml.yml"); this.loader = new OriginTrackedYamlLoader(resource); } @Test + @WithTestYamlResource void processSimpleKey() { OriginTrackedValue value = getValue("name"); assertThat(value).hasToString("Martin D'vloper"); @@ -60,6 +66,7 @@ void processSimpleKey() { } @Test + @WithTestYamlResource void processMap() { OriginTrackedValue perl = getValue("languages.perl"); OriginTrackedValue python = getValue("languages.python"); @@ -73,6 +80,7 @@ void processMap() { } @Test + @WithTestYamlResource void processCollection() { OriginTrackedValue apple = getValue("foods[0]"); OriginTrackedValue orange = getValue("foods[1]"); @@ -89,6 +97,7 @@ void processCollection() { } @Test + @WithTestYamlResource void processMultiline() { OriginTrackedValue education = getValue("education"); assertThat(education).hasToString("4 GCSEs\n3 A-Levels\nBSc in the Internet of Things\n"); @@ -96,6 +105,7 @@ void processMultiline() { } @Test + @WithTestYamlResource void processListOfMaps() { OriginTrackedValue name = getValue("example.foo[0].name"); OriginTrackedValue url = getValue("example.foo[0].url"); @@ -112,6 +122,7 @@ void processListOfMaps() { } @Test + @WithTestYamlResource void processEmptyAndNullValues() { OriginTrackedValue empty = getValue("empty"); OriginTrackedValue nullValue = getValue("null-value"); @@ -122,6 +133,7 @@ void processEmptyAndNullValues() { } @Test + @WithTestYamlResource void processEmptyListAndMap() { OriginTrackedValue emptymap = getValue("emptymap"); OriginTrackedValue emptylist = getValue("emptylist"); @@ -138,8 +150,15 @@ void unsupportedType() { } @Test + @WithResource(name = "test-empty-yaml.yml", content = """ + --- + --- + + --- + --- + """) void emptyDocuments() { - this.loader = new OriginTrackedYamlLoader(new ClassPathResource("test-empty-yaml.yml", getClass())); + this.loader = new OriginTrackedYamlLoader(new ClassPathResource("test-empty-yaml.yml")); List> loaded = this.loader.load(); assertThat(loaded).isEmpty(); } @@ -165,8 +184,17 @@ void loadWhenLargeNumberOfNodesLoadsYaml() { } @Test + @WithResource(name = "recursive.yml", content = """ + &def1 + *def1: a + test: + a: + spring: 'a' + b: + boot: 'b' + """) void loadWhenRecursiveLoadsYaml() { - Resource resource = new ClassPathResource("recursive.yml", getClass()); + Resource resource = new ClassPathResource("recursive.yml"); this.loader = new OriginTrackedYamlLoader(resource); Map loaded = this.loader.load().get(0); assertThat(loaded.get("test.a.spring")).hasToString("a"); @@ -174,8 +202,16 @@ void loadWhenRecursiveLoadsYaml() { } @Test + @WithResource(name = "anchors.yml", content = """ + some: + path: &anchor + config: + key: value + anotherpath: + <<: *anchor + """) void loadWhenUsingAnchors() { - Resource resource = new ClassPathResource("anchors.yml", getClass()); + Resource resource = new ClassPathResource("anchors.yml"); this.loader = new OriginTrackedYamlLoader(resource); Map loaded = this.loader.load().get(0); assertThat(loaded.get("some.path.config.key")).hasToString("value"); @@ -205,4 +241,49 @@ private String getLocation(OriginTrackedValue value) { return ((TextResourceOrigin) value.getOrigin()).getLocation().toString(); } + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + @WithResource(name = "test-yaml.yml", content = """ + # https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html + + name: Martin D'vloper + job: Developer + skill: Elite + employed: True + foods: + - Apple + - Orange + - Strawberry + - Mango + languages: + perl: Elite + python: Elite + pascal: Lame + education: | + 4 GCSEs + 3 A-Levels + BSc in the Internet of Things + example: + foo: + - name: springboot + url: https://springboot.example.com/ + bar: + - bar1: baz + - bar2: bling + empty: "" + null-value: null + emptylist: [] + emptymap: {} + --- + + spring: + profiles: development + name: Test Name + + --- + """) + private @interface WithTestYamlResource { + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/PropertiesPropertySourceLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/PropertiesPropertySourceLoaderTests.java index 67b24310faba..f38cafabbe14 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/PropertiesPropertySourceLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/PropertiesPropertySourceLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.ClassPathResource; @@ -41,17 +42,28 @@ void getFileExtensions() { } @Test + @WithResource(name = "test.properties", content = "test=properties") void loadProperties() throws Exception { - List> loaded = this.loader.load("test.properties", - new ClassPathResource("test-properties.properties", getClass())); + List> loaded = this.loader.load("test.properties", new ClassPathResource("test.properties")); PropertySource source = loaded.get(0); assertThat(source.getProperty("test")).isEqualTo("properties"); } @Test + @WithResource(name = "test.properties", content = """ + #--- + #test + blah=hello world + bar=baz + hello=world + #--- + foo=bar + bling=biz + #comment1 + #comment2 + """) void loadMultiDocumentPropertiesWithSeparatorAtTheBeginningOfFile() throws Exception { - List> loaded = this.loader.load("test.properties", - new ClassPathResource("multi-document-properties-2.properties", getClass())); + List> loaded = this.loader.load("test.properties", new ClassPathResource("test.properties")); assertThat(loaded).hasSize(2); PropertySource source1 = loaded.get(0); PropertySource source2 = loaded.get(1); @@ -60,9 +72,20 @@ void loadMultiDocumentPropertiesWithSeparatorAtTheBeginningOfFile() throws Excep } @Test + @WithResource(name = "test.properties", content = """ + #test + blah=hello world + bar=baz + hello=world + #--- + foo=bar + bling=biz + #comment1 + #comment2 + #--- + """) void loadMultiDocumentProperties() throws Exception { - List> loaded = this.loader.load("test.properties", - new ClassPathResource("multi-document-properties.properties", getClass())); + List> loaded = this.loader.load("test.properties", new ClassPathResource("test.properties")); assertThat(loaded).hasSize(2); PropertySource source1 = loaded.get(0); PropertySource source2 = loaded.get(1); @@ -71,9 +94,22 @@ void loadMultiDocumentProperties() throws Exception { } @Test + @WithResource(name = "test.properties", content = """ + + #--- + #test + blah=hello world + bar=baz + hello=world + #--- + #--- + foo=bar + bling=biz + #comment1 + #comment2 + """) void loadMultiDocumentPropertiesWithEmptyDocument() throws Exception { - List> loaded = this.loader.load("test.properties", - new ClassPathResource("multi-document-properties-empty.properties", getClass())); + List> loaded = this.loader.load("test.properties", new ClassPathResource("test.properties")); assertThat(loaded).hasSize(2); PropertySource source1 = loaded.get(0); PropertySource source2 = loaded.get(1); @@ -82,9 +118,15 @@ void loadMultiDocumentPropertiesWithEmptyDocument() throws Exception { } @Test + @WithResource(name = "test.xml", content = """ + + + + xml + + """) void loadXml() throws Exception { - List> loaded = this.loader.load("test.xml", - new ClassPathResource("test-xml.xml", getClass())); + List> loaded = this.loader.load("test.xml", new ClassPathResource("test.xml")); PropertySource source = loaded.get(0); assertThat(source.getProperty("test")).isEqualTo("xml"); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/YamlPropertySourceLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/YamlPropertySourceLoaderTests.java index c5d076a55dee..029c2b18585d 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/YamlPropertySourceLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/YamlPropertySourceLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.ByteArrayResource; @@ -86,8 +87,14 @@ void timestampLikeItemsDoNotBecomeDates() throws Exception { } @Test + @WithResource(name = "test-yaml.yml", content = """ + a: b + --- + c: d + e: f + """) void loadOriginAware() throws Exception { - Resource resource = new ClassPathResource("test-yaml.yml", getClass()); + Resource resource = new ClassPathResource("test-yaml.yml"); List> loaded = this.loader.load("resource", resource); for (PropertySource source : loaded) { EnumerablePropertySource enumerableSource = (EnumerablePropertySource) source; diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java index a723a3de5186..508b9cbd05dd 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -70,6 +70,7 @@ void whenDatabaseIsInaccessibleThenItIsAssumedNotToBeEmbedded() { } @Test + @WithDataSqlResource void whenCustomizeIsOverriddenThenDatabasePopulatorIsConfiguredAccordingly() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setContinueOnError(true); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java index fed13ff2b31c..0fbef469064e 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,14 @@ package org.springframework.boot.json; -import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; -import org.springframework.util.StreamUtils; +import org.springframework.boot.testsupport.classpath.resources.ResourceContent; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -192,26 +191,22 @@ void mapWithKeyAndNoValue() { } @Test // gh-31868 - void listWithRepeatedOpenArray() throws IOException { - String input = StreamUtils.copyToString( - AbstractJsonParserTests.class.getResourceAsStream("repeated-open-array.txt"), StandardCharsets.UTF_8); + @WithPackageResources("repeated-open-array.txt") + void listWithRepeatedOpenArray(@ResourceContent("repeated-open-array.txt") String input) { assertThatExceptionOfType(JsonParseException.class).isThrownBy(() -> this.parser.parseList(input)) .havingCause() .withMessageContaining("too deeply nested"); } @Test // gh-31869 - void largeMalformed() throws IOException { - String input = StreamUtils.copyToString( - AbstractJsonParserTests.class.getResourceAsStream("large-malformed-json.txt"), StandardCharsets.UTF_8); + @WithPackageResources("large-malformed-json.txt") + void largeMalformed(@ResourceContent("large-malformed-json.txt") String input) { assertThatExceptionOfType(JsonParseException.class).isThrownBy(() -> this.parser.parseList(input)); } @Test // gh-32029 - void deeplyNestedMap() throws IOException { - String input = StreamUtils.copyToString( - AbstractJsonParserTests.class.getResourceAsStream("deeply-nested-map-json.txt"), - StandardCharsets.UTF_8); + @WithPackageResources("deeply-nested-map-json.txt") + void deeplyNestedMap(@ResourceContent("deeply-nested-map-json.txt") String input) { assertThatExceptionOfType(JsonParseException.class).isThrownBy(() -> this.parser.parseList(input)); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/GsonJsonParserTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/GsonJsonParserTests.java index 3a7b7f04aa84..f597fd1902ce 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/GsonJsonParserTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/GsonJsonParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,6 @@ package org.springframework.boot.json; -import java.io.IOException; - /** * Tests for {@link GsonJsonParser}. * @@ -31,7 +29,7 @@ protected JsonParser getParser() { } @Override - void listWithRepeatedOpenArray() throws IOException { + void listWithRepeatedOpenArray(String input) { // Gson does not protect against deeply nested JSON } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/JacksonJsonParserTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/JacksonJsonParserTests.java index 4e79ac568614..57f445c64dd6 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/JacksonJsonParserTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/JacksonJsonParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,7 +52,7 @@ void instanceWithSpecificObjectMapper() throws IOException { @Override @Disabled("Jackson's array handling is no longer stack bound so protection has been removed.") // https://github.com/FasterXML/jackson-databind/commit/8238ab41d0350fb915797c89d46777b4496b74fd - void listWithRepeatedOpenArray() throws IOException { + void listWithRepeatedOpenArray(String input) { } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java index 495193de4bb2..eccdef167ae0 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ import org.springframework.boot.logging.LoggerConfiguration; import org.springframework.boot.logging.LoggingSystem; import org.springframework.boot.logging.LoggingSystemProperty; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.util.ClassUtils; @@ -123,6 +124,10 @@ void testSystemPropertyInitializesFormat(CapturedOutput output) { } @Test + @WithResource(name = "logging-nondefault.properties", content = """ + handlers = java.util.logging.ConsoleHandler + .level = INFO + """) void testNonDefaultConfigLocation(CapturedOutput output) { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, "classpath:logging-nondefault.properties", null); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java index 7d089c175089..fc14599eb5e7 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,10 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.net.ProtocolException; import java.util.EnumSet; import java.util.LinkedHashMap; @@ -59,6 +63,7 @@ import org.springframework.boot.logging.LoggingSystemProperties; import org.springframework.boot.logging.LoggingSystemProperty; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.logging.ConfigureClasspathToPreferLog4j2; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; @@ -158,16 +163,16 @@ void withFile(CapturedOutput output) { } @Test + @WithNonDefaultXmlResource void testNonDefaultConfigLocation(CapturedOutput output) { this.loggingSystem.beforeInitialize(); - this.loggingSystem.initialize(this.initializationContext, "classpath:log4j2-nondefault.xml", + this.loggingSystem.initialize(this.initializationContext, "classpath:nondefault.xml", getLogFile(tmpDir() + "/tmp.log", null)); this.logger.info("Hello world"); Configuration configuration = this.loggingSystem.getConfiguration(); assertThat(output).contains("Hello world").contains(tmpDir() + "/tmp.log"); assertThat(new File(tmpDir() + "/tmp.log")).doesNotExist(); - assertThat(configuration.getConfigurationSource().getFile().getAbsolutePath()) - .contains("log4j2-nondefault.xml"); + assertThat(configuration.getConfigurationSource().getFile().getAbsolutePath()).contains("nondefault.xml"); assertThat(configuration.getWatchManager().getIntervalSeconds()).isEqualTo(30); } @@ -461,15 +466,18 @@ void shutdownHookIsDisabled() { } @Test + @WithNonDefaultXmlResource + @WithOverrideXmlResource void compositeConfigurationWithCustomBaseConfiguration() { - this.environment.setProperty("logging.log4j2.config.override", "src/test/resources/log4j2-override.xml"); - this.loggingSystem.initialize(this.initializationContext, "src/test/resources/log4j2-nondefault.xml", null); + this.environment.setProperty("logging.log4j2.config.override", "classpath:override.xml"); + this.loggingSystem.initialize(this.initializationContext, "classpath:nondefault.xml", null); assertThat(this.loggingSystem.getConfiguration()).isInstanceOf(CompositeConfiguration.class); } @Test + @WithOverrideXmlResource void compositeConfigurationWithStandardConfigLocationConfiguration() { - this.environment.setProperty("logging.log4j2.config.override", "src/test/resources/log4j2-override.xml"); + this.environment.setProperty("logging.log4j2.config.override", "classpath:override.xml"); this.loggingSystem.initialize(this.initializationContext, null, null); assertThat(this.loggingSystem.getConfiguration()).isInstanceOf(CompositeConfiguration.class); } @@ -678,4 +686,45 @@ static class Nested { } + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "nondefault.xml", + content = """ + + + ???? + ${sys:LOG_FILE} %d{yyyy-MM-dd HH:mm:ss.SSS}] service%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n + + + + + + + + + + + + + """) + private @interface WithNonDefaultXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "override.xml", content = """ + + + + + + + + + """) + private @interface WithOverrideXmlResource { + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/SpringProfileArbiterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/SpringProfileArbiterTests.java index e27a1e4cdb89..f410ca55c548 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/SpringProfileArbiterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/SpringProfileArbiterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,10 @@ package org.springframework.boot.logging.log4j2; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.Set; import org.apache.logging.log4j.LogManager; @@ -32,12 +36,12 @@ import org.springframework.boot.logging.LoggingInitializationContext; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.logging.ConfigureClasspathToPreferLog4j2; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.mock.env.MockEnvironment; import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.util.ClassUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -93,6 +97,7 @@ private void cleanUpPropertySources() { // https://issues.apache.org/jira/browse } @Test + @WithProductionProfileXmlResource void profileActive() { this.environment.setActiveProfiles("production"); initialize("production-profile.xml"); @@ -101,6 +106,7 @@ void profileActive() { } @Test + @WithMultiProfileNamesXmlResource void multipleNamesFirstProfileActive() { this.environment.setActiveProfiles("production"); initialize("multi-profile-names.xml"); @@ -109,6 +115,7 @@ void multipleNamesFirstProfileActive() { } @Test + @WithMultiProfileNamesXmlResource void multipleNamesSecondProfileActive() { this.environment.setActiveProfiles("test"); initialize("multi-profile-names.xml"); @@ -117,6 +124,7 @@ void multipleNamesSecondProfileActive() { } @Test + @WithProductionProfileXmlResource void profileNotActive() { initialize("production-profile.xml"); this.logger.trace("Hello"); @@ -124,6 +132,7 @@ void profileNotActive() { } @Test + @WithProfileExpressionXmlResource void profileExpressionMatchFirst() { this.environment.setActiveProfiles("production"); initialize("profile-expression.xml"); @@ -132,6 +141,7 @@ void profileExpressionMatchFirst() { } @Test + @WithProfileExpressionXmlResource void profileExpressionMatchSecond() { this.environment.setActiveProfiles("test"); initialize("profile-expression.xml"); @@ -140,6 +150,7 @@ void profileExpressionMatchSecond() { } @Test + @WithProfileExpressionXmlResource void profileExpressionNoMatch() { this.environment.setActiveProfiles("development"); initialize("profile-expression.xml"); @@ -148,13 +159,56 @@ void profileExpressionNoMatch() { } private void initialize(String config) { - this.environment.setProperty("logging.log4j2.config.override", getPackageResource(config)); + this.environment.setProperty("logging.log4j2.config.override", "classpath:" + config); this.loggingSystem.initialize(this.initializationContext, null, null); } - private String getPackageResource(String fileName) { - String path = ClassUtils.getPackageName(getClass()); - return "src/test/resources/" + path.replace('.', '/') + "/" + fileName; + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "multi-profile-names.xml", content = """ + + + + + + + + + """) + private @interface WithMultiProfileNamesXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "profile-expression.xml", content = """ + + + + + + + + + """) + private @interface WithProfileExpressionXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "production-profile.xml", content = """ + + + + + + + + + """) + private @interface WithProductionProfileXmlResource { + } } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackConfigurationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackConfigurationTests.java index 0e6ad7bd18c2..37382c9350b5 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackConfigurationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,9 @@ import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy; import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.ResourcesRoot; +import org.springframework.boot.testsupport.classpath.resources.WithResource; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -43,11 +46,17 @@ class LogbackConfigurationTests { @Test - void consolePatternCanBeOverridden() throws JoranException { + @WithResource(name = "custom-console-log-pattern.xml", content = """ + + + + + """) + void consolePatternCanBeOverridden(@ResourcesRoot File resourcesRoot) throws JoranException { JoranConfigurator configurator = new JoranConfigurator(); LoggerContext context = new LoggerContext(); configurator.setContext(context); - configurator.doConfigure(new File("src/test/resources/custom-console-log-pattern.xml")); + configurator.doConfigure(new File(resourcesRoot, "custom-console-log-pattern.xml")); Appender appender = context.getLogger("ROOT").getAppender("CONSOLE"); assertThat(appender).isInstanceOf(ConsoleAppender.class); Encoder encoder = ((ConsoleAppender) appender).getEncoder(); @@ -56,11 +65,17 @@ void consolePatternCanBeOverridden() throws JoranException { } @Test - void filePatternCanBeOverridden() throws JoranException { + @WithResource(name = "custom-file-log-pattern.xml", content = """ + + + + + """) + void filePatternCanBeOverridden(@ResourcesRoot File resourcesRoot) throws JoranException { JoranConfigurator configurator = new JoranConfigurator(); LoggerContext context = new LoggerContext(); configurator.setContext(context); - configurator.doConfigure(new File("src/test/resources/custom-file-log-pattern.xml")); + configurator.doConfigure(new File(resourcesRoot, "custom-file-log-pattern.xml")); Appender appender = context.getLogger("ROOT").getAppender("FILE"); assertThat(appender).isInstanceOf(FileAppender.class); Encoder encoder = ((FileAppender) appender).getEncoder(); @@ -69,11 +84,17 @@ void filePatternCanBeOverridden() throws JoranException { } @Test - void defaultRollingFileNamePattern() throws JoranException { + @WithResource(name = "custom-file-log-pattern.xml", content = """ + + + + + """) + void defaultRollingFileNamePattern(@ResourcesRoot File resourcesRoot) throws JoranException { JoranConfigurator configurator = new JoranConfigurator(); LoggerContext context = new LoggerContext(); configurator.setContext(context); - configurator.doConfigure(new File("src/test/resources/custom-file-log-pattern.xml")); + configurator.doConfigure(new File(resourcesRoot, "custom-file-log-pattern.xml")); Appender appender = context.getLogger("ROOT").getAppender("FILE"); assertThat(appender).isInstanceOf(RollingFileAppender.class); RollingPolicy rollingPolicy = ((RollingFileAppender) appender).getRollingPolicy(); @@ -82,11 +103,17 @@ void defaultRollingFileNamePattern() throws JoranException { } @Test - void customRollingFileNamePattern() throws JoranException { + @WithResource(name = "custom-file-log-pattern-with-fileNamePattern.xml", content = """ + + + + + """) + void customRollingFileNamePattern(@ResourcesRoot File resourcesRoot) throws JoranException { JoranConfigurator configurator = new JoranConfigurator(); LoggerContext context = new LoggerContext(); configurator.setContext(context); - configurator.doConfigure(new File("src/test/resources/custom-file-log-pattern-with-fileNamePattern.xml")); + configurator.doConfigure(new File(resourcesRoot, "custom-file-log-pattern-with-fileNamePattern.xml")); Appender appender = context.getLogger("ROOT").getAppender("FILE"); assertThat(appender).isInstanceOf(RollingFileAppender.class); RollingPolicy rollingPolicy = ((RollingFileAppender) appender).getRollingPolicy(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java index 83ae188abb4a..14a46fddb610 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,10 @@ package org.springframework.boot.logging.logback; import java.io.File; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.nio.charset.Charset; @@ -62,6 +66,7 @@ import org.springframework.boot.logging.LoggingSystemProperty; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import org.springframework.boot.testsupport.classpath.ClassPathOverrides; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.core.convert.ConversionService; @@ -132,16 +137,30 @@ void cleanUp() { } @Test + @WithResource(name = "include-defaults.xml", content = """ + + + + + [%p] - %m%n + + + + + + + """) void logbackDefaultsConfigurationDoesNotTriggerDeprecation(CapturedOutput output) { - initialize(this.initializationContext, "classpath:logback-include-defaults.xml", null); + initialize(this.initializationContext, "classpath:include-defaults.xml", null); this.logger.info("Hello world"); assertThat(getLineWithText(output, "Hello world")).isEqualTo("[INFO] - Hello world"); assertThat(output.toString()).doesNotContain("WARN").doesNotContain("deprecated"); } @Test + @WithIncludeBaseXmlResource void logbackBaseConfigurationDoesNotTriggerDeprecation(CapturedOutput output) { - initialize(this.initializationContext, "classpath:logback-include-base.xml", null); + initialize(this.initializationContext, "classpath:include-base.xml", null); this.logger.info("Hello world"); assertThat(getLineWithText(output, "Hello world")).contains(" INFO ").endsWith(": Hello world"); assertThat(output.toString()).doesNotContain("WARN").doesNotContain("deprecated"); @@ -199,10 +218,10 @@ void defaultConfigConfiguresAConsoleAppender() { } @Test + @WithNonDefaultXmlResource void testNonDefaultConfigLocation(CapturedOutput output) { this.loggingSystem.beforeInitialize(); - initialize(this.initializationContext, "classpath:logback-nondefault.xml", - getLogFile(tmpDir() + "/tmp.log", null)); + initialize(this.initializationContext, "classpath:nondefault.xml", getLogFile(tmpDir() + "/tmp.log", null)); this.logger.info("Hello world"); assertThat(output).doesNotContain("DEBUG") .contains("Hello world") @@ -406,12 +425,13 @@ void testCleanHistoryOnStartProperty() { } @Test + @WithIncludeBaseXmlResource void testCleanHistoryOnStartPropertyWithXmlConfiguration() { this.environment.setProperty("logging.file.clean-history-on-start", "true"); LoggingInitializationContext loggingInitializationContext = new LoggingInitializationContext(this.environment); File file = new File(tmpDir(), "logback-test.log"); LogFile logFile = getLogFile(file.getPath(), null); - initialize(loggingInitializationContext, "classpath:logback-include-base.xml", logFile); + initialize(loggingInitializationContext, "classpath:include-base.xml", logFile); this.logger.info("Hello world"); assertThat(getLineWithText(file, "Hello world")).contains("INFO"); assertThat(getRollingPolicy().isCleanHistoryOnStart()).isTrue(); @@ -444,12 +464,13 @@ private void testMaxFileSizeProperty(String sizeValue, String expectedFileSize) } @Test + @WithIncludeBaseXmlResource void testMaxFileSizePropertyWithXmlConfiguration() { this.environment.setProperty("logging.file.max-size", "100MB"); LoggingInitializationContext loggingInitializationContext = new LoggingInitializationContext(this.environment); File file = new File(tmpDir(), "logback-test.log"); LogFile logFile = getLogFile(file.getPath(), null); - initialize(loggingInitializationContext, "classpath:logback-include-base.xml", logFile); + initialize(loggingInitializationContext, "classpath:include-base.xml", logFile); this.logger.info("Hello world"); assertThat(getLineWithText(file, "Hello world")).contains("INFO"); assertThat(ReflectionTestUtils.getField(getRollingPolicy(), "maxFileSize")).hasToString("100 MB"); @@ -468,12 +489,13 @@ void testMaxHistoryProperty() { } @Test + @WithIncludeBaseXmlResource void testMaxHistoryPropertyWithXmlConfiguration() { this.environment.setProperty("logging.file.max-history", "30"); LoggingInitializationContext loggingInitializationContext = new LoggingInitializationContext(this.environment); File file = new File(tmpDir(), "logback-test.log"); LogFile logFile = getLogFile(file.getPath(), null); - initialize(loggingInitializationContext, "classpath:logback-include-base.xml", logFile); + initialize(loggingInitializationContext, "classpath:include-base.xml", logFile); this.logger.info("Hello world"); assertThat(getLineWithText(file, "Hello world")).contains("INFO"); assertThat(getRollingPolicy().getMaxHistory()).isEqualTo(30); @@ -506,13 +528,14 @@ private void testTotalSizeCapProperty(String sizeValue, String expectedFileSize) } @Test + @WithIncludeBaseXmlResource void testTotalSizeCapPropertyWithXmlConfiguration() { String expectedSize = "101 MB"; this.environment.setProperty("logging.file.total-size-cap", expectedSize); LoggingInitializationContext loggingInitializationContext = new LoggingInitializationContext(this.environment); File file = new File(tmpDir(), "logback-test.log"); LogFile logFile = getLogFile(file.getPath(), null); - initialize(loggingInitializationContext, "classpath:logback-include-base.xml", logFile); + initialize(loggingInitializationContext, "classpath:include-base.xml", logFile); this.logger.info("Hello world"); assertThat(getLineWithText(file, "Hello world")).contains("INFO"); assertThat(ReflectionTestUtils.getField(getRollingPolicy(), "totalSizeCap")).hasToString(expectedSize); @@ -546,12 +569,13 @@ void customExceptionConversionWord(CapturedOutput output) { } @Test + @WithNonDefaultXmlResource void initializeShouldSetSystemProperty() { // gh-5491 this.loggingSystem.beforeInitialize(); this.logger.info("Hidden"); LogFile logFile = getLogFile(tmpDir() + "/example.log", null, false); - initialize(this.initializationContext, "classpath:logback-nondefault.xml", logFile); + initialize(this.initializationContext, "classpath:nondefault.xml", logFile); assertThat(System.getProperty(LoggingSystemProperty.LOG_FILE.getEnvironmentVariableName())) .endsWith("example.log"); } @@ -698,9 +722,23 @@ void whenContextHasAotContributionThenProcessAheadOfTimeClearsAndReturnsIt() { } @Test // gh-33610 + @WithResource(name = "springprofile-in-root.xml", content = """ + + + + %property{LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT + + + + + + + + + """) void springProfileIfNestedWithinSecondPhaseElementSanityChecker(CapturedOutput output) { this.loggingSystem.beforeInitialize(); - initialize(this.initializationContext, "classpath:logback-springprofile-in-root.xml", null); + initialize(this.initializationContext, "classpath:springprofile-in-root.xml", null); this.logger.info("Hello world"); assertThat(output).contains(" elements cannot be nested within an"); } @@ -756,9 +794,10 @@ void correlationLoggingToConsoleWhenHasCorrelationPattern(CapturedOutput output) } @Test + @WithIncludeBaseXmlResource void correlationLoggingToConsoleWhenUsingXmlConfiguration(CapturedOutput output) { this.environment.setProperty(LoggingSystem.EXPECT_CORRELATION_ID_PROPERTY, "true"); - initialize(this.initializationContext, "classpath:logback-include-base.xml", null); + initialize(this.initializationContext, "classpath:include-base.xml", null); MDC.setContextMap(Map.of("traceId", "01234567890123456789012345678901", "spanId", "0123456789012345")); this.logger.info("Hello world"); assertThat(getLineWithText(output, "Hello world")) @@ -766,11 +805,12 @@ void correlationLoggingToConsoleWhenUsingXmlConfiguration(CapturedOutput output) } @Test + @WithIncludeBaseXmlResource void correlationLoggingToFileWhenUsingFileConfiguration() { this.environment.setProperty(LoggingSystem.EXPECT_CORRELATION_ID_PROPERTY, "true"); File file = new File(tmpDir(), "logback-test.log"); LogFile logFile = getLogFile(file.getPath(), null); - initialize(this.initializationContext, "classpath:logback-include-base.xml", logFile); + initialize(this.initializationContext, "classpath:include-base.xml", logFile); MDC.setContextMap(Map.of("traceId", "01234567890123456789012345678901", "spanId", "0123456789012345")); this.logger.info("Hello world"); assertThat(getLineWithText(file, "Hello world")) @@ -834,30 +874,55 @@ void applicationNameLoggingToFileWhenDisabled(CapturedOutput output) { } @Test + @WithResource(name = "broken.xml", content = """ + + + + + ${LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT + + + + + + + """) void whenConfigurationErrorIsDetectedUnderlyingCausesAreIncludedAsSuppressedExceptions() { this.loggingSystem.beforeInitialize(); assertThatIllegalStateException() - .isThrownBy(() -> initialize(this.initializationContext, "classpath:logback-broken.xml", + .isThrownBy(() -> initialize(this.initializationContext, "classpath:broken.xml", getLogFile(tmpDir() + "/tmp.log", null))) .satisfies((ex) -> assertThat(ex.getSuppressed()) .hasAtLeastOneElementOfType(DynamicClassLoadingException.class)); } @Test + @WithResource(name = "invalid-format.txt", content = "Not XML") void whenConfigLocationIsNotXmlThenIllegalArgumentExceptionShouldBeThrown() { this.loggingSystem.beforeInitialize(); assertThatIllegalStateException() - .isThrownBy(() -> initialize(this.initializationContext, "classpath:logback-invalid-format.txt", + .isThrownBy(() -> initialize(this.initializationContext, "classpath:invalid-format.txt", getLogFile(tmpDir() + "/tmp.log", null))) .satisfies((ex) -> assertThat(ex.getCause()).isInstanceOf(JoranException.class) .hasMessageStartingWith("Problem parsing XML document. See previously reported errors")); } @Test + @WithResource(name = "without-extension", content = """ + + + + %msg + + + + + + + """) void whenConfigLocationIsXmlFileWithoutExtensionShouldWork(CapturedOutput output) { this.loggingSystem.beforeInitialize(); - initialize(this.initializationContext, "classpath:logback-without-extension", - getLogFile(tmpDir() + "/tmp.log", null)); + initialize(this.initializationContext, "classpath:without-extension", getLogFile(tmpDir() + "/tmp.log", null)); this.logger.info("No extension and works!"); assertThat(output.toString()).contains("No extension and works!"); } @@ -895,11 +960,12 @@ void shouldRespectFileThreshold() { } @Test + @WithNonDefaultXmlResource void applyingSystemPropertiesDoesNotCauseUnwantedStatusWarnings(CapturedOutput output) { this.loggingSystem.beforeInitialize(); this.environment.getPropertySources() .addFirst(new MapPropertySource("test", Map.of("logging.pattern.console", "[CONSOLE]%m"))); - this.loggingSystem.initialize(this.initializationContext, "classpath:logback-nondefault.xml", null); + this.loggingSystem.initialize(this.initializationContext, "classpath:nondefault.xml", null); assertThat(output).doesNotContain("WARN"); } @@ -935,4 +1001,33 @@ private static SizeAndTimeBasedRollingPolicy getRollingPolicy() { return (SizeAndTimeBasedRollingPolicy) getFileAppender().getRollingPolicy(); } + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "include-base.xml", content = """ + + + + """) + private @interface WithIncludeBaseXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "nondefault.xml", content = """ + + + + %property{LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT + + + + + + + """) + private @interface WithNonDefaultXmlResource { + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java index 4bcc73127c2b..3779663c5407 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,11 @@ package org.springframework.boot.logging.logback; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + import ch.qos.logback.classic.BasicConfigurator; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; @@ -30,6 +35,8 @@ import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution; import org.springframework.boot.context.properties.source.ConfigurationPropertySources; import org.springframework.boot.logging.LoggingInitializationContext; +import org.springframework.boot.testsupport.classpath.ClassPathExclusions; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.mock.env.MockEnvironment; @@ -77,6 +84,7 @@ void reset() { } @Test + @WithProductionProfileXmlResource void profileActive() throws Exception { this.environment.setActiveProfiles("production"); initialize("production-profile.xml"); @@ -85,6 +93,20 @@ void profileActive() throws Exception { } @Test + @WithResource(name = "profile-in-include.xml", content = """ + + + + + + """) + @WithResource(name = "include-with-profile.xml", content = """ + + + + + + """) void profileInIncludeActive() throws Exception { this.environment.setActiveProfiles("production"); initialize("profile-in-include.xml"); @@ -93,6 +115,7 @@ void profileInIncludeActive() throws Exception { } @Test + @WithMultiProfileNamesXmlResource void multipleNamesFirstProfileActive() throws Exception { this.environment.setActiveProfiles("production"); initialize("multi-profile-names.xml"); @@ -101,6 +124,7 @@ void multipleNamesFirstProfileActive() throws Exception { } @Test + @WithMultiProfileNamesXmlResource void multipleNamesSecondProfileActive() throws Exception { this.environment.setActiveProfiles("test"); initialize("multi-profile-names.xml"); @@ -109,6 +133,7 @@ void multipleNamesSecondProfileActive() throws Exception { } @Test + @WithProductionProfileXmlResource void profileNotActive() throws Exception { initialize("production-profile.xml"); this.logger.trace("Hello"); @@ -116,6 +141,7 @@ void profileNotActive() throws Exception { } @Test + @WithProfileExpressionXmlResource void profileExpressionMatchFirst() throws Exception { this.environment.setActiveProfiles("production"); initialize("profile-expression.xml"); @@ -124,6 +150,7 @@ void profileExpressionMatchFirst() throws Exception { } @Test + @WithProfileExpressionXmlResource void profileExpressionMatchSecond() throws Exception { this.environment.setActiveProfiles("test"); initialize("profile-expression.xml"); @@ -132,6 +159,7 @@ void profileExpressionMatchSecond() throws Exception { } @Test + @WithProfileExpressionXmlResource void profileExpressionNoMatch() throws Exception { this.environment.setActiveProfiles("development"); initialize("profile-expression.xml"); @@ -140,26 +168,31 @@ void profileExpressionNoMatch() throws Exception { } @Test + @WithNestedXmlResource void profileNestedActiveActive() throws Exception { doTestNestedProfile(true, "outer", "inner"); } @Test + @WithNestedXmlResource void profileNestedActiveNotActive() throws Exception { doTestNestedProfile(false, "outer"); } @Test + @WithNestedXmlResource void profileNestedNotActiveActive() throws Exception { doTestNestedProfile(false, "inner"); } @Test + @WithNestedXmlResource void profileNestedNotActiveNotActive() throws Exception { doTestNestedProfile(false); } @Test + @WithPropertyXmlResource void springProperty() throws Exception { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment, "my.example-property=test"); initialize("property.xml"); @@ -167,6 +200,7 @@ void springProperty() throws Exception { } @Test + @WithPropertyXmlResource void relaxedSpringProperty() throws Exception { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment, "my.EXAMPLE_PROPERTY=test"); ConfigurationPropertySources.attach(this.environment); @@ -175,30 +209,35 @@ void relaxedSpringProperty() throws Exception { } @Test + @WithPropertyXmlResource void springPropertyNoValue() throws Exception { initialize("property.xml"); assertThat(this.context.getProperty("SIMPLE")).isNull(); } @Test + @WithPropertyXmlResource void relaxedSpringPropertyNoValue() throws Exception { initialize("property.xml"); assertThat(this.context.getProperty("MINE")).isNull(); } @Test + @WithPropertyDefaultValueXmlResource void springPropertyWithDefaultValue() throws Exception { initialize("property-default-value.xml"); assertThat(this.context.getProperty("SIMPLE")).isEqualTo("foo"); } @Test + @WithPropertyDefaultValueXmlResource void relaxedSpringPropertyWithDefaultValue() throws Exception { initialize("property-default-value.xml"); assertThat(this.context.getProperty("MINE")).isEqualTo("bar"); } @Test + @WithPropertyInIfXmlResource void springPropertyInIfWhenTrue() throws Exception { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment, "my.example-property=true"); initialize("property-in-if.xml"); @@ -206,6 +245,7 @@ void springPropertyInIfWhenTrue() throws Exception { } @Test + @WithPropertyInIfXmlResource void springPropertyInIfWhenFalse() throws Exception { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment, "my.example-property=false"); initialize("property-in-if.xml"); @@ -213,6 +253,19 @@ void springPropertyInIfWhenFalse() throws Exception { } @Test + @WithResource(name = "property-in-include.xml", content = """ + + + + + + """) + @WithResource(name = "include-with-property.xml", content = """ + + + + """) + @ClassPathExclusions void springPropertyInInclude() throws Exception { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment, "my.example-property=test"); initialize("property-in-include.xml"); @@ -220,6 +273,7 @@ void springPropertyInInclude() throws Exception { } @Test + @WithPropertyXmlResource void addsAotContributionToContextDuringAotProcessing() throws Exception { withSystemProperty("spring.aot.processing", "true", () -> { initialize("property.xml"); @@ -253,7 +307,8 @@ private void doTestNestedProfile(boolean expected, String... profiles) throws Jo private void initialize(String config) throws JoranException { this.configurator.setContext(this.context); - this.configurator.doConfigure(getClass().getResourceAsStream(config)); + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + this.configurator.doConfigure(contextClassLoader.getResource(config)); } private interface Action { @@ -262,4 +317,112 @@ private interface Action { } + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "property-default-value.xml", content = """ + + + + + + + """) + private @interface WithPropertyDefaultValueXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "property-in-if.xml", content = """ + + + + + + + + + + + """) + private @interface WithPropertyInIfXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "property.xml", content = """ + + + + + + + """) + private @interface WithPropertyXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "profile-expression.xml", content = """ + + + + + + + + """) + private @interface WithProfileExpressionXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "production-profile.xml", content = """ + + + + + + + + """) + private @interface WithProductionProfileXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "nested.xml", content = """ + + + + + + + + + + """) + private @interface WithNestedXmlResource { + + } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @WithResource(name = "multi-profile-names.xml", content = """ + + + + + + + + """) + private @interface WithMultiProfileNamesXmlResource { + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/rsocket/netty/NettyRSocketServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/rsocket/netty/NettyRSocketServerFactoryTests.java index 0c1f8196b200..a1d1d41e39a4 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/rsocket/netty/NettyRSocketServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/rsocket/netty/NettyRSocketServerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,6 +52,8 @@ import org.springframework.boot.ssl.jks.JksSslStoreDetails; import org.springframework.boot.ssl.pem.PemSslStoreBundle; import org.springframework.boot.ssl.pem.PemSslStoreDetails; +import org.springframework.boot.testsupport.classpath.resources.ResourcePath; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.web.server.Ssl; import org.springframework.core.codec.CharSequenceEncoder; import org.springframework.core.codec.StringDecoder; @@ -156,91 +158,107 @@ void serverCustomizers() { } @Test + @WithPackageResources("test.jks") void tcpTransportBasicSslFromClassPath() { testBasicSslWithKeyStore("classpath:test.jks", "password", Transport.TCP); } @Test - void tcpTransportBasicSslFromFileSystem() { - testBasicSslWithKeyStore("src/test/resources/test.jks", "password", Transport.TCP); + @WithPackageResources("test.jks") + void tcpTransportBasicSslFromFileSystem(@ResourcePath("test.jks") String keyStore) { + testBasicSslWithKeyStore(keyStore, "password", Transport.TCP); } @Test + @WithPackageResources("test.jks") void websocketTransportBasicSslFromClassPath() { testBasicSslWithKeyStore("classpath:test.jks", "password", Transport.WEBSOCKET); } @Test - void websocketTransportBasicSslFromFileSystem() { - testBasicSslWithKeyStore("src/test/resources/test.jks", "password", Transport.WEBSOCKET); + @WithPackageResources("test.jks") + void websocketTransportBasicSslFromFileSystem(@ResourcePath("test.jks") String keyStore) { + testBasicSslWithKeyStore(keyStore, "password", Transport.WEBSOCKET); } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void tcpTransportBasicSslCertificateFromClassPath() { testBasicSslWithPemCertificate("classpath:test-cert.pem", "classpath:test-key.pem", "classpath:test-cert.pem", Transport.TCP); } @Test - void tcpTransportBasicSslCertificateFromFileSystem() { - testBasicSslWithPemCertificate("src/test/resources/test-cert.pem", "src/test/resources/test-key.pem", - "src/test/resources/test-cert.pem", Transport.TCP); + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) + void tcpTransportBasicSslCertificateFromFileSystem(@ResourcePath("test-cert.pem") String testCert, + @ResourcePath("test-key.pem") String testKey) { + testBasicSslWithPemCertificate(testCert, testKey, testCert, Transport.TCP); } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void websocketTransportBasicSslCertificateFromClassPath() { testBasicSslWithPemCertificate("classpath:test-cert.pem", "classpath:test-key.pem", "classpath:test-cert.pem", Transport.WEBSOCKET); } @Test - void websocketTransportBasicSslCertificateFromFileSystem() { - testBasicSslWithPemCertificate("src/test/resources/test-cert.pem", "src/test/resources/test-key.pem", - "src/test/resources/test-cert.pem", Transport.WEBSOCKET); + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) + void websocketTransportBasicSslCertificateFromFileSystem(@ResourcePath("test-cert.pem") String testCert, + @ResourcePath("test-key.pem") String testKey) { + testBasicSslWithPemCertificate(testCert, testKey, testCert, Transport.WEBSOCKET); } @Test + @WithPackageResources("test.jks") void tcpTransportBasicSslFromClassPathWithBundle() { testBasicSslWithKeyStoreFromBundle("classpath:test.jks", "password", Transport.TCP); } @Test - void tcpTransportBasicSslFromFileSystemWithBundle() { - testBasicSslWithKeyStoreFromBundle("src/test/resources/test.jks", "password", Transport.TCP); + @WithPackageResources("test.jks") + void tcpTransportBasicSslFromFileSystemWithBundle(@ResourcePath("test.jks") String keyStore) { + testBasicSslWithKeyStoreFromBundle(keyStore, "password", Transport.TCP); } @Test + @WithPackageResources("test.jks") void websocketTransportBasicSslFromClassPathWithBundle() { testBasicSslWithKeyStoreFromBundle("classpath:test.jks", "password", Transport.WEBSOCKET); } @Test - void websocketTransportBasicSslFromFileSystemWithBundle() { - testBasicSslWithKeyStoreFromBundle("src/test/resources/test.jks", "password", Transport.WEBSOCKET); + @WithPackageResources("test.jks") + void websocketTransportBasicSslFromFileSystemWithBundle(@ResourcePath("test.jks") String keyStore) { + testBasicSslWithKeyStoreFromBundle(keyStore, "password", Transport.WEBSOCKET); } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void tcpTransportBasicSslCertificateFromClassPathWithBundle() { testBasicSslWithPemCertificateFromBundle("classpath:test-cert.pem", "classpath:test-key.pem", "classpath:test-cert.pem", Transport.TCP); } @Test - void tcpTransportBasicSslCertificateFromFileSystemWithBundle() { - testBasicSslWithPemCertificateFromBundle("src/test/resources/test-cert.pem", "src/test/resources/test-key.pem", - "src/test/resources/test-cert.pem", Transport.TCP); + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) + void tcpTransportBasicSslCertificateFromFileSystemWithBundle(@ResourcePath("test-cert.pem") String testCert, + @ResourcePath("test-key.pem") String testKey) { + testBasicSslWithPemCertificateFromBundle(testCert, testKey, testCert, Transport.TCP); } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void websocketTransportBasicSslCertificateFromClassPathWithBundle() { testBasicSslWithPemCertificateFromBundle("classpath:test-cert.pem", "classpath:test-key.pem", "classpath:test-cert.pem", Transport.WEBSOCKET); } @Test - void websocketTransportBasicSslCertificateFromFileSystemWithBundle() { - testBasicSslWithPemCertificateFromBundle("src/test/resources/test-cert.pem", "src/test/resources/test-key.pem", - "src/test/resources/test-cert.pem", Transport.WEBSOCKET); + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) + void websocketTransportBasicSslCertificateFromFileSystemWithBundle(@ResourcePath("test-cert.pem") String testCert, + @ResourcePath("test-key.pem") String testKey) { + testBasicSslWithPemCertificateFromBundle(testCert, testKey, testCert, Transport.WEBSOCKET); } private void checkEchoRequest() { @@ -318,7 +336,7 @@ void tcpTransportSslRejectsInsecureClient() { NettyRSocketServerFactory factory = getFactory(); factory.setTransport(Transport.TCP); Ssl ssl = new Ssl(); - ssl.setKeyStore("classpath:test.jks"); + ssl.setKeyStore("classpath:org/springframework/boot/rsocket/netty/test.jks"); ssl.setKeyPassword("password"); factory.setSsl(ssl); this.server = factory.create(new EchoRequestResponseAcceptor()); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializerTests.java index 84b250e45616..efd5886d77f6 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,15 @@ package org.springframework.boot.sql.init; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.Arrays; import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.dao.DataAccessException; import static org.assertj.core.api.Assertions.assertThat; @@ -35,6 +40,8 @@ public abstract class AbstractScriptDatabaseInitializerTests { @Test + @WithSchemaSqlResource + @WithDataSqlResource void whenDatabaseIsInitializedThenSchemaAndDataScriptsAreApplied() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setSchemaLocations(Arrays.asList("schema.sql")); @@ -55,6 +62,7 @@ void whenDatabaseIsInitializedWithDirectoryLocationsThenFailureIsHelpful() { } @Test + @WithDataSqlResource void whenContinueOnErrorIsFalseThenInitializationFailsOnError() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setDataLocations(Arrays.asList("data.sql")); @@ -64,6 +72,7 @@ void whenContinueOnErrorIsFalseThenInitializationFailsOnError() { } @Test + @WithDataSqlResource void whenContinueOnErrorIsTrueThenInitializationDoesNotFailOnError() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setContinueOnError(true); @@ -112,6 +121,8 @@ void whenNoScriptsExistAtAnOptionalDataLocationThenDatabaseIsNotAccessed() { } @Test + @WithSchemaSqlResource + @WithDataSqlResource void whenModeIsNeverThenEmbeddedDatabaseIsNotInitialized() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setSchemaLocations(Arrays.asList("schema.sql")); @@ -123,6 +134,8 @@ void whenModeIsNeverThenEmbeddedDatabaseIsNotInitialized() { } @Test + @WithSchemaSqlResource + @WithDataSqlResource void whenModeIsNeverThenStandaloneDatabaseIsNotInitialized() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setSchemaLocations(Arrays.asList("schema.sql")); @@ -134,6 +147,8 @@ void whenModeIsNeverThenStandaloneDatabaseIsNotInitialized() { } @Test + @WithSchemaSqlResource + @WithDataSqlResource void whenModeIsEmbeddedThenEmbeddedDatabaseIsInitialized() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setSchemaLocations(Arrays.asList("schema.sql")); @@ -145,6 +160,8 @@ void whenModeIsEmbeddedThenEmbeddedDatabaseIsInitialized() { } @Test + @WithSchemaSqlResource + @WithDataSqlResource void whenModeIsEmbeddedThenStandaloneDatabaseIsNotInitialized() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setSchemaLocations(Arrays.asList("schema.sql")); @@ -156,6 +173,8 @@ void whenModeIsEmbeddedThenStandaloneDatabaseIsNotInitialized() { } @Test + @WithSchemaSqlResource + @WithDataSqlResource void whenModeIsAlwaysThenEmbeddedDatabaseIsInitialized() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setSchemaLocations(Arrays.asList("schema.sql")); @@ -167,6 +186,8 @@ void whenModeIsAlwaysThenEmbeddedDatabaseIsInitialized() { } @Test + @WithSchemaSqlResource + @WithDataSqlResource void whenModeIsAlwaysThenStandaloneDatabaseIsInitialized() { DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); settings.setSchemaLocations(Arrays.asList("schema.sql")); @@ -195,4 +216,23 @@ private void assertThatDatabaseWasNotAccessed(T initializer) { protected abstract void assertDatabaseAccessed(boolean accessed, T initializer); + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + @WithResource(name = "schema.sql", content = """ + CREATE TABLE EXAMPLE ( + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + name VARCHAR(30) + ); + """) + protected @interface WithSchemaSqlResource { + + } + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + @WithResource(name = "data.sql", content = "INSERT INTO EXAMPLE VALUES (1, 'Andy');") + protected @interface WithDataSqlResource { + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/jks/JksSslStoreBundleTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/jks/JksSslStoreBundleTests.java index 82c3cad9d2fb..7ff33dddd37a 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/jks/JksSslStoreBundleTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/jks/JksSslStoreBundleTests.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.io.ApplicationResourceLoader; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.ssl.MockPkcs11Security; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; @@ -77,6 +78,7 @@ void whenTypePKCS11AndLocationGetKeyStoreThrowsException() { } @Test + @WithPackageResources("test.jks") void whenHasKeyStoreLocation() { JksSslStoreDetails keyStoreDetails = JksSslStoreDetails.forLocation("classpath:test.jks") .withPassword("secret"); @@ -86,6 +88,7 @@ void whenHasKeyStoreLocation() { } @Test + @WithPackageResources("test.jks") void getTrustStoreWithLocations() { JksSslStoreDetails keyStoreDetails = null; JksSslStoreDetails trustStoreDetails = JksSslStoreDetails.forLocation("classpath:test.jks") @@ -95,6 +98,7 @@ void getTrustStoreWithLocations() { } @Test + @WithPackageResources("test.jks") void whenHasKeyStoreType() { JksSslStoreDetails keyStoreDetails = new JksSslStoreDetails("jks", null, "classpath:test.jks", "secret"); JksSslStoreDetails trustStoreDetails = null; @@ -103,6 +107,7 @@ void whenHasKeyStoreType() { } @Test + @WithPackageResources("test.jks") void whenHasTrustStoreType() { JksSslStoreDetails keyStoreDetails = null; JksSslStoreDetails trustStoreDetails = new JksSslStoreDetails("jks", null, "classpath:test.jks", "secret"); @@ -111,6 +116,7 @@ void whenHasTrustStoreType() { } @Test + @WithPackageResources("test.jks") void whenHasKeyStoreProvider() { JksSslStoreDetails keyStoreDetails = new JksSslStoreDetails(null, "com.example.KeyStoreProvider", "classpath:test.jks", "secret"); @@ -120,6 +126,7 @@ void whenHasKeyStoreProvider() { } @Test + @WithPackageResources("test.jks") void whenHasTrustStoreProvider() { JksSslStoreDetails trustStoreDetails = new JksSslStoreDetails(null, "com.example.KeyStoreProvider", "classpath:test.jks", "secret"); @@ -137,6 +144,7 @@ void storeCreationIsLazy() { } @Test + @WithPackageResources({ "test.p12", "test.jks" }) void whenLocationsAreBase64Encoded() throws IOException { JksSslStoreDetails keyStoreDetails = JksSslStoreDetails.forLocation(encodeFileContent("classpath:test.p12")) .withPassword("secret"); @@ -169,6 +177,7 @@ void invalidLocationThrowsException() { } @Test + @WithPackageResources("test.jks") void usesResourceLoader() { JksSslStoreDetails keyStoreDetails = null; JksSslStoreDetails trustStoreDetails = new JksSslStoreDetails("jks", null, "classpath:test.jks", "secret"); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/LoadedPemSslStoreTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/LoadedPemSslStoreTests.java index c590a721cefe..fc701972d00f 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/LoadedPemSslStoreTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/LoadedPemSslStoreTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.io.ApplicationResourceLoader; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; @@ -37,6 +38,7 @@ class LoadedPemSslStoreTests { @Test + @WithPackageResources("test-key.pem") void certificatesAreLoadedLazily() { PemSslStoreDetails details = PemSslStoreDetails.forCertificate("classpath:missing-test-cert.pem") .withPrivateKey("classpath:test-key.pem"); @@ -45,6 +47,7 @@ void certificatesAreLoadedLazily() { } @Test + @WithPackageResources("test-cert.pem") void privateKeyIsLoadedLazily() { PemSslStoreDetails details = PemSslStoreDetails.forCertificate("classpath:test-cert.pem") .withPrivateKey("classpath:missing-test-key.pem"); @@ -53,6 +56,7 @@ void privateKeyIsLoadedLazily() { } @Test + @WithPackageResources("test-key.pem") void withAliasIsLazy() { PemSslStoreDetails details = PemSslStoreDetails.forCertificate("classpath:missing-test-cert.pem") .withPrivateKey("classpath:test-key.pem"); @@ -61,6 +65,7 @@ void withAliasIsLazy() { } @Test + @WithPackageResources("test-key.pem") void withPasswordIsLazy() { PemSslStoreDetails details = PemSslStoreDetails.forCertificate("classpath:missing-test-cert.pem") .withPrivateKey("classpath:test-key.pem"); @@ -69,6 +74,7 @@ void withPasswordIsLazy() { } @Test + @WithPackageResources("test-cert.pem") void usesResourceLoader() { PemSslStoreDetails details = PemSslStoreDetails.forCertificate("classpath:test-cert.pem"); ResourceLoader resourceLoader = spy(new DefaultResourceLoader()); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemCertificateParserTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemCertificateParserTests.java index db8f71f6b744..b15136fbecba 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemCertificateParserTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemCertificateParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.core.io.ClassPathResource; import static org.assertj.core.api.Assertions.assertThat; @@ -35,6 +36,7 @@ class PemCertificateParserTests { @Test + @WithPackageResources("test-cert.pem") void parseCertificate() throws Exception { List certificates = PemCertificateParser.parse(read("test-cert.pem")); assertThat(certificates).isNotNull(); @@ -43,6 +45,7 @@ void parseCertificate() throws Exception { } @Test + @WithPackageResources("test-cert-chain.pem") void parseCertificateChain() throws Exception { List certificates = PemCertificateParser.parse(read("test-cert-chain.pem")); assertThat(certificates).isNotNull(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemContentTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemContentTests.java index 9387362aa7c2..147148d12083 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemContentTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemContentTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,8 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.io.ApplicationResourceLoader; +import org.springframework.boot.testsupport.classpath.resources.ResourcePath; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; @@ -51,6 +53,7 @@ void getCertificateWhenNoCertificatesThrowsException() { } @Test + @WithPackageResources("test-cert-chain.pem") void getCertificateReturnsCertificates() throws Exception { PemContent content = PemContent.load(contentFromClasspath("/test-cert-chain.pem"), new ApplicationResourceLoader()); @@ -69,9 +72,9 @@ void getPrivateKeyWhenNoKeyThrowsException() { } @Test + @WithPackageResources("dsa.key") void getPrivateKeyReturnsPrivateKey() throws Exception { - PemContent content = PemContent.load(contentFromClasspath("/org/springframework/boot/web/server/pkcs8/dsa.key"), - new ApplicationResourceLoader()); + PemContent content = PemContent.load(contentFromClasspath("dsa.key"), new ApplicationResourceLoader()); PrivateKey privateKey = content.getPrivateKey(); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); @@ -122,6 +125,7 @@ void loadWithStringWhenContentIsPemContentReturnsContent() throws Exception { } @Test + @WithPackageResources("test-cert.pem") void loadWithStringWhenClasspathLocationReturnsContent() throws IOException { String actual = PemContent.load("classpath:test-cert.pem", new ApplicationResourceLoader()).toString(); String expected = contentFromClasspath("test-cert.pem"); @@ -129,21 +133,24 @@ void loadWithStringWhenClasspathLocationReturnsContent() throws IOException { } @Test - void loadWithStringWhenFileLocationReturnsContent() throws IOException { - String actual = PemContent.load("src/test/resources/test-cert.pem", new ApplicationResourceLoader()).toString(); + @WithPackageResources("test-cert.pem") + void loadWithStringWhenFileLocationReturnsContent(@ResourcePath("test-cert.pem") String testCert) + throws IOException { + String actual = PemContent.load(testCert, new ApplicationResourceLoader()).toString(); String expected = contentFromClasspath("test-cert.pem"); assertThat(actual).isEqualTo(expected); } @Test - void loadWithPathReturnsContent() throws IOException { - Path path = Path.of("src/test/resources/test-cert.pem"); - String actual = PemContent.load(path).toString(); + @WithPackageResources("test-cert.pem") + void loadWithPathReturnsContent(@ResourcePath("test-cert.pem") Path testCert) throws IOException { + String actual = PemContent.load(testCert).toString(); String expected = contentFromClasspath("test-cert.pem"); assertThat(actual).isEqualTo(expected); } @Test + @WithPackageResources("test-cert.pem") void loadWithResourceLoaderUsesResourceLoader() throws IOException { ResourceLoader resourceLoader = spy(new DefaultResourceLoader()); PemContent.load("classpath:test-cert.pem", resourceLoader); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemPrivateKeyParserTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemPrivateKeyParserTests.java index 22ceb5455b43..b337dfb28c30 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemPrivateKeyParserTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemPrivateKeyParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,36 +47,25 @@ class PemPrivateKeyParserTests { "rsa.key, RSA", "rsa-pss.key, RSASSA-PSS" }) - // @formatter:on + // @formatter:on void shouldParseTraditionalPkcs8(String file, String algorithm) throws IOException { - PrivateKey privateKey = PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs8/" + file)); + PrivateKey privateKey = PemPrivateKeyParser.parse(read("pkcs8/" + file)); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); assertThat(privateKey.getAlgorithm()).isEqualTo(algorithm); } - @ParameterizedTest - // @formatter:off - @CsvSource({ - "rsa.key, RSA" - }) - // @formatter:on - void shouldParseTraditionalPkcs1(String file, String algorithm) throws IOException { - PrivateKey privateKey = PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs1/" + file)); + @Test + void shouldParseTraditionalPkcs1() throws IOException { + PrivateKey privateKey = PemPrivateKeyParser.parse(read("pkcs1/rsa.key")); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); - assertThat(privateKey.getAlgorithm()).isEqualTo(algorithm); + assertThat(privateKey.getAlgorithm()).isEqualTo("RSA"); } - @ParameterizedTest - // @formatter:off - @ValueSource(strings = { - "dsa.key" - }) - // @formatter:on - void shouldNotParseUnsupportedTraditionalPkcs1(String file) { - assertThatIllegalStateException() - .isThrownBy(() -> PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs1/" + file))) + @Test + void shouldNotParseUnsupportedTraditionalPkcs1() { + assertThatIllegalStateException().isThrownBy(() -> PemPrivateKeyParser.parse(read("pkcs1/dsa.key"))) .withMessageContaining("Missing private key or unrecognized format"); } @@ -94,9 +83,9 @@ void shouldNotParseUnsupportedTraditionalPkcs1(String file) { "secp384r1.key, secp384r1, 1.3.132.0.34", "secp521r1.key, secp521r1, 1.3.132.0.35" }) - // @formatter:on + // @formatter:on void shouldParseEcPkcs8(String file, String curveName, String oid) throws IOException { - PrivateKey privateKey = PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs8/" + file)); + PrivateKey privateKey = PemPrivateKeyParser.parse(read("pkcs8/" + file)); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); assertThat(privateKey.getAlgorithm()).isEqualTo("EC"); @@ -115,8 +104,7 @@ void shouldParseEcPkcs8(String file, String curveName, String oid) throws IOExce }) // @formatter:on void shouldNotParseUnsupportedEcPkcs8(String file) { - assertThatIllegalStateException() - .isThrownBy(() -> PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs8/" + file))) + assertThatIllegalStateException().isThrownBy(() -> PemPrivateKeyParser.parse(read("pkcs8/" + file))) .withMessageContaining("Missing private key or unrecognized format"); } @@ -128,7 +116,7 @@ void shouldNotParseUnsupportedEcPkcs8(String file) { }) // @formatter:on void shouldParseEdDsaPkcs8(String file) throws IOException { - PrivateKey privateKey = PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs8/" + file)); + PrivateKey privateKey = PemPrivateKeyParser.parse(read("pkcs8/" + file)); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); assertThat(privateKey.getAlgorithm()).isEqualTo("EdDSA"); @@ -142,7 +130,7 @@ void shouldParseEdDsaPkcs8(String file) throws IOException { }) // @formatter:on void shouldParseXdhPkcs8(String file) throws IOException { - PrivateKey privateKey = PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs8/" + file)); + PrivateKey privateKey = PemPrivateKeyParser.parse(read("pkcs8/" + file)); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); assertThat(privateKey.getAlgorithm()).isEqualTo("XDH"); @@ -164,7 +152,7 @@ void shouldParseXdhPkcs8(String file) throws IOException { }) // @formatter:on void shouldParseEcSec1(String file, String curveName, String oid) throws IOException { - PrivateKey privateKey = PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/sec1/" + file)); + PrivateKey privateKey = PemPrivateKeyParser.parse(read("sec1/" + file)); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); assertThat(privateKey.getAlgorithm()).isEqualTo("EC"); @@ -183,14 +171,13 @@ void shouldParseEcSec1(String file, String curveName, String oid) throws IOExcep }) // @formatter:on void shouldNotParseUnsupportedEcSec1(String file) { - assertThatIllegalStateException() - .isThrownBy(() -> PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/sec1/" + file))) + assertThatIllegalStateException().isThrownBy(() -> PemPrivateKeyParser.parse(read("sec1/" + file))) .withMessageContaining("Missing private key or unrecognized format"); } @Test void parseWithNonKeyTextWillThrowException() { - assertThatIllegalStateException().isThrownBy(() -> PemPrivateKeyParser.parse(read("test-banner.txt"))); + assertThatIllegalStateException().isThrownBy(() -> PemPrivateKeyParser.parse(read("file.txt"))); } @ParameterizedTest @@ -208,8 +195,7 @@ void shouldParseEncryptedPkcs8(String file, String algorithm) throws IOException // openssl pkcs8 -topk8 -in -out -v2 // -passout pass:test // where is aes128 or aes256 - PrivateKey privateKey = PemPrivateKeyParser.parse(read("org/springframework/boot/web/server/pkcs8/" + file), - "test"); + PrivateKey privateKey = PemPrivateKeyParser.parse(read("pkcs8/" + file), "test"); assertThat(privateKey).isNotNull(); assertThat(privateKey.getFormat()).isEqualTo("PKCS#8"); assertThat(privateKey.getAlgorithm()).isEqualTo(algorithm); @@ -221,8 +207,7 @@ void shouldNotParseEncryptedPkcs8NotUsingAes() { // openssl pkcs8 -topk8 -in rsa.key -out rsa-des-ede3-cbc.key -v2 des3 -passout // pass:test assertThatIllegalStateException() - .isThrownBy(() -> PemPrivateKeyParser - .parse(read("org/springframework/boot/web/server/pkcs8/rsa-des-ede3-cbc.key"), "test")) + .isThrownBy(() -> PemPrivateKeyParser.parse(read("pkcs8/rsa-des-ede3-cbc.key"), "test")) .isInstanceOf(IllegalStateException.class) .withMessageContaining("Error decrypting private key"); } @@ -233,8 +218,7 @@ void shouldNotParseEncryptedPkcs8NotUsingPbkdf2() { // openssl pkcs8 -topk8 -in rsa.key -out rsa-des-ede3-cbc.key -scrypt -passout // pass:test assertThatIllegalStateException() - .isThrownBy(() -> PemPrivateKeyParser - .parse(read("org/springframework/boot/web/server/pkcs8/rsa-scrypt.key"), "test")) + .isThrownBy(() -> PemPrivateKeyParser.parse(read("pkcs8/rsa-scrypt.key"), "test")) .withMessageContaining("Error decrypting private key"); } @@ -244,8 +228,7 @@ void shouldNotParseEncryptedSec1() { // openssl ecparam -genkey -name prime256v1 | openssl ec -aes-128-cbc -out // prime256v1-aes-128-cbc.key assertThatIllegalStateException() - .isThrownBy(() -> PemPrivateKeyParser - .parse(read("org/springframework/boot/web/server/sec1/prime256v1-aes-128-cbc.key"), "test")) + .isThrownBy(() -> PemPrivateKeyParser.parse(read("sec1/prime256v1-aes-128-cbc.key"), "test")) .withMessageContaining("Missing private key or unrecognized format"); } @@ -254,13 +237,13 @@ void shouldNotParseEncryptedPkcs1() { // created with: // openssl genrsa -aes-256-cbc -out rsa-aes-256-cbc.key assertThatIllegalStateException() - .isThrownBy(() -> PemPrivateKeyParser - .parse(read("org/springframework/boot/web/server/pkcs1/rsa-aes-256-cbc.key"), "test")) + .isThrownBy(() -> PemPrivateKeyParser.parse(read("pkcs1/rsa-aes-256-cbc.key"), "test")) .withMessageContaining("Missing private key or unrecognized format"); } private String read(String path) throws IOException { - return new ClassPathResource(path).getContentAsString(StandardCharsets.UTF_8); + return new ClassPathResource("org/springframework/boot/ssl/pem/" + path) + .getContentAsString(StandardCharsets.UTF_8); } } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemSslStoreBundleTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemSslStoreBundleTests.java index fd78a1e711e6..77e7e1311028 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemSslStoreBundleTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/ssl/pem/PemSslStoreBundleTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.util.function.ThrowingConsumer; import static org.assertj.core.api.Assertions.assertThat; @@ -120,6 +121,7 @@ void createWithDetailsWhenStoresHaveNoValues() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void createWithDetailsWhenHasKeyStoreDetailsCertAndKey() { PemSslStoreDetails keyStoreDetails = PemSslStoreDetails.forCertificate("classpath:test-cert.pem") .withPrivateKey("classpath:test-key.pem"); @@ -130,9 +132,10 @@ void createWithDetailsWhenHasKeyStoreDetailsCertAndKey() { } @Test + @WithPackageResources({ "test-cert.pem", "pkcs8/key-rsa-encrypted.pem" }) void createWithDetailsWhenHasKeyStoreDetailsCertAndEncryptedKey() { PemSslStoreDetails keyStoreDetails = PemSslStoreDetails.forCertificate("classpath:test-cert.pem") - .withPrivateKey("classpath:ssl/pkcs8/key-rsa-encrypted.pem") + .withPrivateKey("classpath:pkcs8/key-rsa-encrypted.pem") .withPrivateKeyPassword("test"); PemSslStoreDetails trustStoreDetails = null; PemSslStoreBundle bundle = new PemSslStoreBundle(keyStoreDetails, trustStoreDetails); @@ -141,6 +144,7 @@ void createWithDetailsWhenHasKeyStoreDetailsCertAndEncryptedKey() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void createWithDetailsWhenHasKeyStoreDetailsAndTrustStoreDetailsWithoutKey() { PemSslStoreDetails keyStoreDetails = PemSslStoreDetails.forCertificate("classpath:test-cert.pem") .withPrivateKey("classpath:test-key.pem"); @@ -151,6 +155,7 @@ void createWithDetailsWhenHasKeyStoreDetailsAndTrustStoreDetailsWithoutKey() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void createWithDetailsWhenHasKeyStoreDetailsAndTrustStoreDetails() { PemSslStoreDetails keyStoreDetails = PemSslStoreDetails.forCertificate("classpath:test-cert.pem") .withPrivateKey("classpath:test-key.pem"); @@ -173,6 +178,7 @@ void createWithDetailsWhenHasEmbeddedKeyStoreDetailsAndTrustStoreDetails() { @Test @SuppressWarnings("removal") + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void createWithDetailsWhenHasKeyStoreDetailsAndTrustStoreDetailsAndAlias() { PemSslStoreDetails keyStoreDetails = PemSslStoreDetails.forCertificate("classpath:test-cert.pem") .withPrivateKey("classpath:test-key.pem"); @@ -184,6 +190,7 @@ void createWithDetailsWhenHasKeyStoreDetailsAndTrustStoreDetailsAndAlias() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void createWithDetailsWhenHasStoreType() { PemSslStoreDetails keyStoreDetails = new PemSslStoreDetails("PKCS12", "classpath:test-cert.pem", "classpath:test-key.pem"); @@ -195,6 +202,7 @@ void createWithDetailsWhenHasStoreType() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem" }) void createWithDetailsWhenHasKeyStoreDetailsAndTrustStoreDetailsAndKeyPassword() { PemSslStoreDetails keyStoreDetails = PemSslStoreDetails.forCertificate("classpath:test-cert.pem") .withPrivateKey("classpath:test-key.pem") diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java index 3e7e24def71a..1c276a6b5415 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import org.springframework.boot.ssl.SslBundleKey; import org.springframework.boot.ssl.jks.JksSslStoreBundle; import org.springframework.boot.ssl.jks.JksSslStoreDetails; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.web.servlet.DirtiesUrlFactories; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.Ssl; @@ -124,6 +125,7 @@ void shouldSetReadTimeoutsWhenUsingReflective() { @ParameterizedTest @ValueSource(strings = { "GET", "POST" }) + @WithPackageResources("test.jks") void connectWithSslBundle(String httpMethod) throws Exception { TomcatServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(0); Ssl ssl = new Ssl(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java index 3bd6529897ee..681e5d8d5cf8 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,6 +62,8 @@ import org.junit.jupiter.api.Test; import org.mockito.InOrder; +import org.springframework.boot.testsupport.classpath.resources.ResourcePath; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.web.server.Compression; import org.springframework.boot.web.server.GracefulShutdownResult; @@ -230,9 +232,10 @@ void sessionTimeoutInMinutes() { } @Test - void sslCiphersConfiguration() { + @WithPackageResources("test.jks") + void sslCiphersConfiguration(@ResourcePath("test.jks") String keyStore) { Ssl ssl = new Ssl(); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore(keyStore); ssl.setKeyStorePassword("secret"); ssl.setKeyPassword("password"); ssl.setCiphers(new String[] { "ALPHA", "BRAVO", "CHARLIE" }); @@ -261,9 +264,10 @@ void destroyCalledWithoutStart() { } @Test - void sslEnabledMultiProtocolsConfiguration() { + @WithPackageResources("test.jks") + void sslEnabledMultiProtocolsConfiguration(@ResourcePath("test.jks") String keyStore) { JettyServletWebServerFactory factory = getFactory(); - factory.setSsl(getSslSettings("TLSv1.1", "TLSv1.2")); + factory.setSsl(getSslSettings(keyStore, "TLSv1.1", "TLSv1.2")); this.webServer = factory.getWebServer(); this.webServer.start(); JettyWebServer jettyWebServer = (JettyWebServer) this.webServer; @@ -274,9 +278,10 @@ void sslEnabledMultiProtocolsConfiguration() { } @Test - void sslEnabledProtocolsConfiguration() { + @WithPackageResources("test.jks") + void sslEnabledProtocolsConfiguration(@ResourcePath("test.jks") String keyStore) { JettyServletWebServerFactory factory = getFactory(); - factory.setSsl(getSslSettings("TLSv1.1")); + factory.setSsl(getSslSettings(keyStore, "TLSv1.1")); this.webServer = factory.getWebServer(); this.webServer.start(); JettyWebServer jettyWebServer = (JettyWebServer) this.webServer; @@ -393,9 +398,9 @@ void whenARequestCompletesAfterGracefulShutdownHasBegunThenItHasAConnectionClose assertThat(((HttpResponse) requestResult).getFirstHeader("Connection").getValue()).isEqualTo("close"); } - private Ssl getSslSettings(String... enabledProtocols) { + private Ssl getSslSettings(String keyStore, String... enabledProtocols) { Ssl ssl = new Ssl(); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore(keyStore); ssl.setKeyStorePassword("secret"); ssl.setKeyPassword("password"); ssl.setCiphers(new String[] { "ALPHA", "BRAVO", "CHARLIE" }); @@ -426,6 +431,7 @@ void wrappedHandlers() throws Exception { } @Test + @WithPackageResources("test.jks") void basicSslClasspathKeyStore() throws Exception { testBasicSslWithKeyStore("classpath:test.jks"); } @@ -479,12 +485,13 @@ void specificIPAddressNotReverseResolved() throws Exception { } @Test + @WithPackageResources("test.jks") void specificIPAddressWithSslIsNotReverseResolved() throws Exception { JettyServletWebServerFactory factory = getFactory(); InetAddress localhost = InetAddress.getLocalHost(); factory.setAddress(InetAddress.getByAddress(localhost.getAddress())); Ssl ssl = new Ssl(); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore("classpath:test.jks"); ssl.setKeyStorePassword("secret"); ssl.setKeyPassword("password"); factory.setSsl(ssl); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/SslServerCustomizerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/SslServerCustomizerTests.java index aa8ec85690ab..43f2dfb8561c 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/SslServerCustomizerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/SslServerCustomizerTests.java @@ -30,6 +30,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.OS; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.junit.DisabledOnOs; import org.springframework.boot.testsupport.ssl.MockPkcs11Security; import org.springframework.boot.testsupport.ssl.MockPkcs11SecurityProvider; @@ -53,6 +54,7 @@ class SslServerCustomizerTests { @Test @SuppressWarnings("rawtypes") + @WithPackageResources("test.jks") void whenHttp2IsNotEnabledServerConnectorHasSslAndHttpConnectionFactories() { Server server = createCustomizedServer(); assertThat(server.getConnectors()).hasSize(1); @@ -63,6 +65,7 @@ void whenHttp2IsNotEnabledServerConnectorHasSslAndHttpConnectionFactories() { @Test @SuppressWarnings("rawtypes") + @WithPackageResources("test.jks") @DisabledOnOs(os = { OS.LINUX, OS.MAC }, architecture = "aarch64", disabledReason = "conscrypt doesn't support Linux/macOS aarch64, see https://github.com/google/conscrypt/issues/1051") void whenHttp2IsEnabledServerConnectorsHasSslAlpnH2AndHttpConnectionFactories() { @@ -77,6 +80,7 @@ void whenHttp2IsEnabledServerConnectorsHasSslAlpnH2AndHttpConnectionFactories() } @Test + @WithPackageResources("test.jks") @DisabledOnOs(os = { OS.LINUX, OS.MAC }, architecture = "aarch64", disabledReason = "conscrypt doesn't support Linux/macOS aarch64, see https://github.com/google/conscrypt/issues/1051") void alpnConnectionFactoryHasNullDefaultProtocolToAllowNegotiationToHttp11() { @@ -98,11 +102,12 @@ void configureSslWhenSslIsEnabledWithNoKeyStoreAndNotPkcs11ThrowsException() { } @Test + @WithPackageResources("test.jks") void configureSslWhenSslIsEnabledWithPkcs11AndKeyStoreThrowsException() { Ssl ssl = new Ssl(); ssl.setKeyStoreType("PKCS11"); ssl.setKeyStoreProvider(MockPkcs11SecurityProvider.NAME); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore("classpath:test.jks"); ssl.setKeyPassword("password"); assertThatIllegalStateException().isThrownBy(() -> { SslServerCustomizer customizer = new SslServerCustomizer(null, null, null, WebServerSslBundle.get(ssl)); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java index d67008187107..fdd41b0f9af7 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,7 @@ import org.springframework.boot.ssl.SslBundles; import org.springframework.boot.ssl.pem.PemSslStoreBundle; import org.springframework.boot.ssl.pem.PemSslStoreDetails; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFactory; import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFactoryTests; import org.springframework.boot.web.server.PortInUseException; @@ -133,12 +134,14 @@ void useForwardedHeaders() { } @Test + @WithPackageResources("test.jks") void whenSslIsConfiguredWithAValidAliasARequestSucceeds() { Mono result = testSslWithAlias("test-alias"); StepVerifier.create(result).expectNext("Hello World").expectComplete().verify(Duration.ofSeconds(30)); } @Test + @WithPackageResources({ "1.key", "1.crt", "2.key", "2.crt" }) void whenSslBundleIsUpdatedThenSslIsReloaded() { DefaultSslBundleRegistry bundles = new DefaultSslBundleRegistry("bundle1", createSslBundle("1.key", "1.crt")); Mono result = testSslWithBundle(bundles, "bundle1"); @@ -231,9 +234,7 @@ protected void addConnector(int port, AbstractReactiveWebServerFactory factory) private static SslBundle createSslBundle(String key, String certificate) { return SslBundle.of(new PemSslStoreBundle( - new PemSslStoreDetails(null, "classpath:org/springframework/boot/web/embedded/netty/" + certificate, - "classpath:org/springframework/boot/web/embedded/netty/" + key), - null)); + new PemSslStoreDetails(null, "classpath:" + certificate, "classpath:" + key), null)); } static class NoPortNettyReactiveWebServerFactory extends NettyReactiveWebServerFactory { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/SslConnectorCustomizerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/SslConnectorCustomizerTests.java index 09444ef595c6..f8ff57396d4b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/SslConnectorCustomizerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/SslConnectorCustomizerTests.java @@ -28,6 +28,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.ssl.MockPkcs11Security; import org.springframework.boot.testsupport.ssl.MockPkcs11SecurityProvider; import org.springframework.boot.testsupport.system.OutputCaptureExtension; @@ -71,6 +72,7 @@ void stop() throws Exception { } @Test + @WithPackageResources("test.jks") void sslCiphersConfiguration() throws Exception { Ssl ssl = new Ssl(); ssl.setKeyStore("classpath:test.jks"); @@ -85,10 +87,11 @@ void sslCiphersConfiguration() throws Exception { } @Test + @WithPackageResources("test.jks") void sslEnabledMultipleProtocolsConfiguration() throws Exception { Ssl ssl = new Ssl(); ssl.setKeyPassword("password"); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore("classpath:test.jks"); ssl.setEnabledProtocols(new String[] { "TLSv1.1", "TLSv1.2" }); ssl.setCiphers(new String[] { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "BRAVO" }); Connector connector = this.tomcat.getConnector(); @@ -101,10 +104,11 @@ void sslEnabledMultipleProtocolsConfiguration() throws Exception { } @Test + @WithPackageResources("test.jks") void sslEnabledProtocolsConfiguration() throws Exception { Ssl ssl = new Ssl(); ssl.setKeyPassword("password"); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore("classpath:test.jks"); ssl.setEnabledProtocols(new String[] { "TLSv1.2" }); ssl.setCiphers(new String[] { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "BRAVO" }); Connector connector = this.tomcat.getConnector(); @@ -126,11 +130,12 @@ void customizeWhenSslIsEnabledWithNoKeyStoreAndNotPkcs11ThrowsException() { } @Test + @WithPackageResources("test.jks") void customizeWhenSslIsEnabledWithPkcs11AndKeyStoreThrowsException() { Ssl ssl = new Ssl(); ssl.setKeyStoreType("PKCS11"); ssl.setKeyStoreProvider(MockPkcs11SecurityProvider.NAME); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore("classpath:test.jks"); ssl.setKeyPassword("password"); assertThatIllegalStateException().isThrownBy(() -> { SslConnectorCustomizer customizer = new SslConnectorCustomizer(this.logger, this.tomcat.getConnector(), diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java index 1b684e981841..3bad808a85f0 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,6 +80,7 @@ import org.mockito.InOrder; import org.springframework.boot.ssl.DefaultSslBundleRegistry; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.web.server.PortInUseException; import org.springframework.boot.web.server.Shutdown; @@ -683,11 +684,12 @@ void shouldUpdateSslWhenReloadingSslBundles() throws Exception { } @Test + @WithPackageResources("test.jks") void sslWithHttp11Nio2Protocol() throws Exception { TomcatServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); factory.setProtocol(Http11Nio2Protocol.class.getName()); - factory.setSsl(getSsl(null, "password", "src/test/resources/test.jks")); + factory.setSsl(getSsl(null, "password", "classpath:test.jks")); this.webServer = factory.getWebServer(); this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java index ec7812ee82d8..52d9bf1c26a5 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,9 @@ import jakarta.servlet.ServletRegistration.Dynamic; import org.apache.hc.client5.http.classic.HttpClient; import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.ssl.SSLContextBuilder; import org.apache.jasper.servlet.JspServlet; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterEach; @@ -46,6 +48,7 @@ import org.junit.jupiter.api.Test; import org.mockito.InOrder; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.web.servlet.ExampleServlet; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.GracefulShutdownResult; @@ -55,6 +58,7 @@ import org.springframework.boot.web.servlet.server.AbstractServletWebServerFactory; import org.springframework.boot.web.servlet.server.AbstractServletWebServerFactoryTests; import org.springframework.http.HttpStatus; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -155,7 +159,7 @@ void deploymentInfo() { @Test void basicSslClasspathKeyStore() throws Exception { - testBasicSslWithKeyStore("classpath:test.jks"); + testBasicSslWithKeyStore("classpath:org/springframework/boot/web/server/test.jks"); } @Test @@ -286,6 +290,7 @@ protected void addConnector(int port, AbstractServletWebServerFactory factory) { } @Test + @WithPackageResources("restricted.jks") void sslRestrictedProtocolsEmptyCipherFailure() { assertThatIOException() .isThrownBy(() -> testRestrictedSSLProtocolsAndCipherSuites(new String[] { "TLSv1.2" }, @@ -294,6 +299,7 @@ void sslRestrictedProtocolsEmptyCipherFailure() { } @Test + @WithPackageResources("restricted.jks") void sslRestrictedProtocolsECDHETLS1Failure() { assertThatIOException() .isThrownBy(() -> testRestrictedSSLProtocolsAndCipherSuites(new String[] { "TLSv1" }, @@ -302,18 +308,21 @@ void sslRestrictedProtocolsECDHETLS1Failure() { } @Test + @WithPackageResources("restricted.jks") void sslRestrictedProtocolsECDHESuccess() throws Exception { testRestrictedSSLProtocolsAndCipherSuites(new String[] { "TLSv1.2" }, new String[] { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" }); } @Test + @WithPackageResources("restricted.jks") void sslRestrictedProtocolsRSATLS12Success() throws Exception { testRestrictedSSLProtocolsAndCipherSuites(new String[] { "TLSv1.2" }, new String[] { "TLS_RSA_WITH_AES_128_CBC_SHA256" }); } @Test + @WithPackageResources("restricted.jks") void sslRestrictedProtocolsRSATLS11Failure() { assertThatIOException() .isThrownBy(() -> testRestrictedSSLProtocolsAndCipherSuites(new String[] { "TLSv1.1" }, @@ -374,4 +383,15 @@ protected String startedLogMessage() { return ((UndertowServletWebServer) this.webServer).getStartLogMessage(); } + private void testRestrictedSSLProtocolsAndCipherSuites(String[] protocols, String[] ciphers) throws Exception { + AbstractServletWebServerFactory factory = getFactory(); + factory.setSsl(getSsl(null, "password", "classpath:restricted.jks", null, protocols, ciphers)); + this.webServer = factory.getWebServer(new ServletRegistrationBean<>(new ExampleServlet(true, false), "/hello")); + this.webServer.start(); + SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( + new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); + HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); + assertThat(getResponse(getLocalUrl("https", "/hello"), requestFactory)).contains("scheme=https"); + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewResolverTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewResolverTests.java index a64f17b00149..0868b81a33be 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewResolverTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.support.GenericApplicationContext; import static org.assertj.core.api.Assertions.assertThat; @@ -32,8 +33,6 @@ */ class MustacheViewResolverTests { - private final String prefix = "classpath:/" + getClass().getPackage().getName().replace(".", "/") + "/"; - private final MustacheViewResolver resolver = new MustacheViewResolver(); @BeforeEach @@ -41,7 +40,7 @@ void init() { GenericApplicationContext applicationContext = new GenericApplicationContext(); applicationContext.refresh(); this.resolver.setApplicationContext(applicationContext); - this.resolver.setPrefix(this.prefix); + this.resolver.setPrefix("classpath:"); this.resolver.setSuffix(".html"); } @@ -51,6 +50,7 @@ void resolveNonExistent() { } @Test + @WithResource(name = "template.html", content = "Hello {{World}}") void resolveExisting() { assertThat(this.resolver.resolveViewName("template", null).block(Duration.ofSeconds(30))).isNotNull(); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewTests.java index 2431bf79bc39..485f2403fca9 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/result/view/MustacheViewTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test; import reactor.test.StepVerifier; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.support.StaticApplicationContext; import org.springframework.http.MediaType; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; @@ -38,17 +39,15 @@ */ class MustacheViewTests { - private final String templateUrl = "classpath:/" + getClass().getPackage().getName().replace(".", "/") - + "/template.html"; - private final StaticApplicationContext context = new StaticApplicationContext(); @Test + @WithResource(name = "template.html", content = "Hello {{World}}") void viewResolvesHandlebars() { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test").build()); MustacheView view = new MustacheView(); view.setCompiler(Mustache.compiler()); - view.setUrl(this.templateUrl); + view.setUrl("classpath:template.html"); view.setCharset(StandardCharsets.UTF_8.displayName()); view.setApplicationContext(this.context); view.render(Collections.singletonMap("World", "Spring"), MediaType.TEXT_HTML, exchange) diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java index c1d20a9be109..40ebd773a54a 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package org.springframework.boot.web.reactive.server; -import java.io.FileInputStream; import java.io.InputStream; import java.net.InetSocketAddress; import java.net.ServerSocket; @@ -54,12 +53,15 @@ import reactor.netty.http.client.HttpClient; import reactor.test.StepVerifier; +import org.springframework.boot.testsupport.classpath.resources.ResourcePath; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.web.server.Compression; import org.springframework.boot.web.server.GracefulShutdownResult; import org.springframework.boot.web.server.Http2; import org.springframework.boot.web.server.Shutdown; import org.springframework.boot.web.server.Ssl; import org.springframework.boot.web.server.WebServer; +import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory; @@ -165,13 +167,15 @@ void portIsMinusOneWhenConnectionIsClosed() { } @Test + @WithPackageResources("test.jks") void basicSslFromClassPath() { testBasicSslWithKeyStore("classpath:test.jks", "password"); } @Test - void basicSslFromFileSystem() { - testBasicSslWithKeyStore("src/test/resources/test.jks", "password"); + @WithPackageResources("test.jks") + void basicSslFromFileSystem(@ResourcePath("test.jks") String keyStore) { + testBasicSslWithKeyStore(keyStore, "password"); } @@ -199,6 +203,7 @@ protected final void testBasicSslWithKeyStore(String keyStore, String keyPasswor } @Test + @WithPackageResources("test.jks") void sslWithValidAlias() { String keyStore = "classpath:test.jks"; String keyPassword = "password"; @@ -228,6 +233,7 @@ void sslWithValidAlias() { } @Test + @WithPackageResources("test.jks") void sslWithInvalidAliasFailsDuringStartup() { String keyStore = "classpath:test.jks"; String keyPassword = "password"; @@ -254,6 +260,7 @@ protected ReactorClientHttpConnector buildTrustAllSslConnector() { } @Test + @WithPackageResources("test.jks") void sslWantsClientAuthenticationSucceedsWithClientCertificate() throws Exception { Ssl ssl = new Ssl(); ssl.setClientAuth(Ssl.ClientAuth.WANT); @@ -265,6 +272,7 @@ void sslWantsClientAuthenticationSucceedsWithClientCertificate() throws Exceptio } @Test + @WithPackageResources("test.jks") void sslWantsClientAuthenticationSucceedsWithoutClientCertificate() { Ssl ssl = new Ssl(); ssl.setClientAuth(Ssl.ClientAuth.WANT); @@ -275,10 +283,10 @@ void sslWantsClientAuthenticationSucceedsWithoutClientCertificate() { testClientAuthSuccess(ssl, buildTrustAllSslConnector()); } - protected ReactorClientHttpConnector buildTrustAllSslWithClientKeyConnector(String keyStoreFile, + protected ReactorClientHttpConnector buildTrustAllSslWithClientKeyConnector(String keyStore, String keyStorePassword) throws Exception { KeyStore clientKeyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - try (InputStream stream = new FileInputStream("src/test/resources/" + keyStoreFile)) { + try (InputStream stream = new ClassPathResource(keyStore).getInputStream()) { clientKeyStore.load(stream, "secret".toCharArray()); } KeyManagerFactory clientKeyManagerFactory = KeyManagerFactory @@ -312,6 +320,7 @@ protected void testClientAuthSuccess(Ssl sslConfiguration, ReactorClientHttpConn } @Test + @WithPackageResources("test.jks") void sslNeedsClientAuthenticationSucceedsWithClientCertificate() throws Exception { Ssl ssl = new Ssl(); ssl.setClientAuth(Ssl.ClientAuth.NEED); @@ -323,6 +332,7 @@ void sslNeedsClientAuthenticationSucceedsWithClientCertificate() throws Exceptio } @Test + @WithPackageResources("test.jks") void sslNeedsClientAuthenticationFailsWithoutClientCertificate() { Ssl ssl = new Ssl(); ssl.setClientAuth(Ssl.ClientAuth.NEED); @@ -334,6 +344,7 @@ void sslNeedsClientAuthenticationFailsWithoutClientCertificate() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem", "test.p12" }) void sslWithPemCertificates() throws Exception { Ssl ssl = new Ssl(); ssl.setClientAuth(Ssl.ClientAuth.NEED); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/server/WebServerSslBundleTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/server/WebServerSslBundleTests.java index 5ed64b09109d..d8efdb30f849 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/server/WebServerSslBundleTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/server/WebServerSslBundleTests.java @@ -22,6 +22,8 @@ import org.springframework.boot.ssl.SslBundleKey; import org.springframework.boot.ssl.SslOptions; import org.springframework.boot.ssl.SslStoreBundle; +import org.springframework.boot.testsupport.classpath.resources.ResourcePath; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.ssl.MockPkcs11Security; import org.springframework.boot.testsupport.ssl.MockPkcs11SecurityProvider; @@ -47,6 +49,7 @@ void whenSslDisabledThrowsException() { } @Test + @WithPackageResources("test.p12") void whenFromJksProperties() { Ssl ssl = new Ssl(); ssl.setKeyStore("classpath:test.p12"); @@ -77,11 +80,12 @@ void whenFromJksProperties() { } @Test - void whenFromJksPropertiesWithPkcs11StoreType() { + @WithPackageResources("test.jks") + void whenFromJksPropertiesWithPkcs11StoreType(@ResourcePath("test.jks") String keyStorePath) { Ssl ssl = new Ssl(); ssl.setKeyStoreType("PKCS11"); ssl.setKeyStoreProvider(MockPkcs11SecurityProvider.NAME); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore(keyStorePath); ssl.setKeyPassword("password"); ssl.setClientAuth(Ssl.ClientAuth.NONE); assertThatIllegalStateException().isThrownBy(() -> WebServerSslBundle.get(ssl)) @@ -108,6 +112,7 @@ void whenFromPkcs11Properties() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem", "test-cert-chain.pem" }) void whenFromPemProperties() { Ssl ssl = new Ssl(); ssl.setCertificate("classpath:test-cert.pem"); @@ -135,6 +140,7 @@ void whenFromPemProperties() { } @Test + @WithPackageResources({ "test-cert.pem", "test-key.pem", "test.p12" }) void whenPemKeyStoreAndJksTrustStoreProperties() { Ssl ssl = new Ssl(); ssl.setCertificate("classpath:test-cert.pem"); @@ -163,6 +169,7 @@ void whenPemKeyStoreAndJksTrustStoreProperties() { } @Test + @WithPackageResources({ "test.p12", "test-cert-chain.pem" }) void whenJksKeyStoreAndPemTrustStoreProperties() { Ssl ssl = new Ssl(); ssl.setKeyStore("classpath:test.p12"); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/context/ServletWebServerMvcIntegrationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/context/ServletWebServerMvcIntegrationTests.java index 24d04bdb3be1..ac717b24fa8b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/context/ServletWebServerMvcIntegrationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/context/ServletWebServerMvcIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.testsupport.web.servlet.DirtiesUrlFactories; import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; @@ -86,6 +87,7 @@ void undertow() throws Exception { } @Test + @WithResource(name = "conf.properties", content = "context=/example") void advancedConfig() throws Exception { this.context = new AnnotationConfigServletWebServerApplicationContext(AdvancedConfig.class); doTest(this.context, "/example/spring/hello"); @@ -161,7 +163,7 @@ HelloWorldController helloWorldController() { @Configuration(proxyBeanMethods = false) @EnableWebMvc - @PropertySource("classpath:/org/springframework/boot/web/servlet/context/conf.properties") + @PropertySource("classpath:conf.properties") static class AdvancedConfig { private final Environment env; diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java index bafcd060dc88..0b3329fd732d 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -121,6 +121,8 @@ import org.springframework.boot.ssl.pem.PemSslStoreDetails; import org.springframework.boot.system.ApplicationHome; import org.springframework.boot.system.ApplicationTemp; +import org.springframework.boot.testsupport.classpath.resources.ResourcePath; +import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.boot.testsupport.web.servlet.DirtiesUrlFactories; @@ -426,16 +428,19 @@ void errorPageFromPutRequest() throws Exception { } @Test + @WithPackageResources("test.jks") void basicSslFromClassPath() throws Exception { testBasicSslWithKeyStore("classpath:test.jks"); } @Test - void basicSslFromFileSystem() throws Exception { - testBasicSslWithKeyStore("src/test/resources/test.jks"); + @WithPackageResources("test.jks") + void basicSslFromFileSystem(@ResourcePath("test.jks") String keyStore) throws Exception { + testBasicSslWithKeyStore(keyStore); } @Test + @WithPackageResources("test.jks") void sslDisabled() throws Exception { AbstractServletWebServerFactory factory = getFactory(); Ssl ssl = getSsl(null, "password", "classpath:test.jks"); @@ -451,9 +456,10 @@ void sslDisabled() throws Exception { } @Test + @WithPackageResources("test.jks") void sslGetScheme() throws Exception { // gh-2232 AbstractServletWebServerFactory factory = getFactory(); - factory.setSsl(getSsl(null, "password", "src/test/resources/test.jks")); + factory.setSsl(getSsl(null, "password", "classpath:test.jks")); this.webServer = factory.getWebServer(new ServletRegistrationBean<>(new ExampleServlet(true, false), "/hello")); this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( @@ -463,9 +469,10 @@ void sslGetScheme() throws Exception { // gh-2232 } @Test + @WithPackageResources("test.jks") void sslKeyAlias() throws Exception { AbstractServletWebServerFactory factory = getFactory(); - Ssl ssl = getSsl(null, "password", "test-alias", "src/test/resources/test.jks"); + Ssl ssl = getSsl(null, "password", "test-alias", "classpath:test.jks"); factory.setSsl(ssl); ServletRegistrationBean registration = new ServletRegistrationBean<>( new ExampleServlet(true, false), "/hello"); @@ -483,9 +490,10 @@ void sslKeyAlias() throws Exception { } @Test + @WithPackageResources("test.jks") void sslWithInvalidAliasFailsDuringStartup() { AbstractServletWebServerFactory factory = getFactory(); - Ssl ssl = getSsl(null, "password", "test-alias-404", "src/test/resources/test.jks"); + Ssl ssl = getSsl(null, "password", "test-alias-404", "classpath:test.jks"); factory.setSsl(ssl); ServletRegistrationBean registration = new ServletRegistrationBean<>( new ExampleServlet(true, false), "/hello"); @@ -499,9 +507,10 @@ protected void assertThatSslWithInvalidAliasCallFails(ThrowingCallable call) { } @Test + @WithPackageResources("test.jks") void serverHeaderIsDisabledByDefaultWhenUsingSsl() throws Exception { AbstractServletWebServerFactory factory = getFactory(); - factory.setSsl(getSsl(null, "password", "src/test/resources/test.jks")); + factory.setSsl(getSsl(null, "password", "classpath:test.jks")); this.webServer = factory.getWebServer(new ServletRegistrationBean<>(new ExampleServlet(true, false), "/hello")); this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( @@ -516,10 +525,11 @@ void serverHeaderIsDisabledByDefaultWhenUsingSsl() throws Exception { } @Test + @WithPackageResources("test.jks") void serverHeaderCanBeCustomizedWhenUsingSsl() throws Exception { AbstractServletWebServerFactory factory = getFactory(); factory.setServerHeader("MyServer"); - factory.setSsl(getSsl(null, "password", "src/test/resources/test.jks")); + factory.setSsl(getSsl(null, "password", "classpath:test.jks")); this.webServer = factory.getWebServer(new ServletRegistrationBean<>(new ExampleServlet(true, false), "/hello")); this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( @@ -546,14 +556,15 @@ protected final void testBasicSslWithKeyStore(String keyStore) throws Exception } @Test - void pkcs12KeyStoreAndTrustStore() throws Exception { + @WithPackageResources("test.p12") + void pkcs12KeyStoreAndTrustStore(@ResourcePath("test.p12") File keyStoreFile) throws Exception { AbstractServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); factory.setSsl(getSsl(ClientAuth.NEED, null, "classpath:test.p12", "classpath:test.p12", null, null)); this.webServer = factory.getWebServer(); this.webServer.start(); KeyStore keyStore = KeyStore.getInstance("pkcs12"); - loadStore(keyStore, new FileSystemResource("src/test/resources/test.p12")); + loadStore(keyStore, new FileSystemResource(keyStoreFile)); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "secret".toCharArray()) @@ -563,14 +574,15 @@ void pkcs12KeyStoreAndTrustStore() throws Exception { } @Test - void pemKeyStoreAndTrustStore() throws Exception { + @WithPackageResources({ "test.p12", "test-cert.pem", "test-key.pem" }) + void pemKeyStoreAndTrustStore(@ResourcePath("test.p12") File keyStoreFile) throws Exception { AbstractServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); factory.setSsl(getSsl("classpath:test-cert.pem", "classpath:test-key.pem")); this.webServer = factory.getWebServer(); this.webServer.start(); KeyStore keyStore = KeyStore.getInstance("pkcs12"); - loadStore(keyStore, new FileSystemResource("src/test/resources/test.p12")); + loadStore(keyStore, new FileSystemResource(keyStoreFile)); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "secret".toCharArray()) @@ -580,7 +592,8 @@ void pemKeyStoreAndTrustStore() throws Exception { } @Test - void pkcs12KeyStoreAndTrustStoreFromBundle() throws Exception { + @WithPackageResources("test.p12") + void pkcs12KeyStoreAndTrustStoreFromBundle(@ResourcePath("test.p12") File keyStoreFile) throws Exception { AbstractServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); factory.setSsl(Ssl.forBundle("test")); @@ -589,7 +602,7 @@ void pkcs12KeyStoreAndTrustStoreFromBundle() throws Exception { this.webServer = factory.getWebServer(); this.webServer.start(); KeyStore keyStore = KeyStore.getInstance("pkcs12"); - loadStore(keyStore, new FileSystemResource("src/test/resources/test.p12")); + loadStore(keyStore, new FileSystemResource(keyStoreFile)); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "secret".toCharArray()) @@ -599,7 +612,8 @@ void pkcs12KeyStoreAndTrustStoreFromBundle() throws Exception { } @Test - void pemKeyStoreAndTrustStoreFromBundle() throws Exception { + @WithPackageResources({ "test.p12", "test-cert.pem", "test-key.pem" }) + void pemKeyStoreAndTrustStoreFromBundle(@ResourcePath("test.p12") File keyStoreFile) throws Exception { AbstractServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); factory.setSsl(Ssl.forBundle("test")); @@ -608,7 +622,7 @@ void pemKeyStoreAndTrustStoreFromBundle() throws Exception { this.webServer = factory.getWebServer(); this.webServer.start(); KeyStore keyStore = KeyStore.getInstance("pkcs12"); - loadStore(keyStore, new FileSystemResource("src/test/resources/test.p12")); + loadStore(keyStore, new FileSystemResource(keyStoreFile)); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "secret".toCharArray()) @@ -618,7 +632,9 @@ void pemKeyStoreAndTrustStoreFromBundle() throws Exception { } @Test - void sslNeedsClientAuthenticationSucceedsWithClientCertificate() throws Exception { + @WithPackageResources("test.jks") + void sslNeedsClientAuthenticationSucceedsWithClientCertificate(@ResourcePath("test.jks") File keyStoreFile) + throws Exception { AbstractServletWebServerFactory factory = getFactory(); factory.setRegisterDefaultServlet(true); addTestTxtFile(factory); @@ -626,7 +642,7 @@ void sslNeedsClientAuthenticationSucceedsWithClientCertificate() throws Exceptio this.webServer = factory.getWebServer(); this.webServer.start(); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - loadStore(keyStore, new FileSystemResource("src/test/resources/test.jks")); + loadStore(keyStore, new FileSystemResource(keyStoreFile)); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()) @@ -636,6 +652,7 @@ void sslNeedsClientAuthenticationSucceedsWithClientCertificate() throws Exceptio } @Test + @WithPackageResources("test.jks") void sslNeedsClientAuthenticationFailsWithoutClientCertificate() throws Exception { AbstractServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); @@ -650,7 +667,9 @@ void sslNeedsClientAuthenticationFailsWithoutClientCertificate() throws Exceptio } @Test - void sslWantsClientAuthenticationSucceedsWithClientCertificate() throws Exception { + @WithPackageResources("test.jks") + void sslWantsClientAuthenticationSucceedsWithClientCertificate(@ResourcePath("test.jks") File keyStoreFile) + throws Exception { AbstractServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); factory @@ -658,7 +677,7 @@ void sslWantsClientAuthenticationSucceedsWithClientCertificate() throws Exceptio this.webServer = factory.getWebServer(); this.webServer.start(); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - loadStore(keyStore, new FileSystemResource("src/test/resources/test.jks")); + loadStore(keyStore, new FileSystemResource(keyStoreFile)); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()) @@ -668,6 +687,7 @@ void sslWantsClientAuthenticationSucceedsWithClientCertificate() throws Exceptio } @Test + @WithPackageResources("test.jks") void sslWantsClientAuthenticationSucceedsWithoutClientCertificate() throws Exception { AbstractServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); @@ -706,7 +726,7 @@ protected Ssl getSsl(ClientAuth clientAuth, String keyPassword, String keyAlias, return getSsl(clientAuth, keyPassword, keyAlias, keyStore, null, null, null); } - private Ssl getSsl(ClientAuth clientAuth, String keyPassword, String keyStore, String trustStore, + protected Ssl getSsl(ClientAuth clientAuth, String keyPassword, String keyStore, String trustStore, String[] supportedProtocols, String[] ciphers) { return getSsl(clientAuth, keyPassword, null, keyStore, trustStore, supportedProtocols, ciphers); } @@ -767,17 +787,6 @@ protected SslBundle createPemSslBundle(String cert, String privateKey) { return SslBundle.of(stores); } - protected void testRestrictedSSLProtocolsAndCipherSuites(String[] protocols, String[] ciphers) throws Exception { - AbstractServletWebServerFactory factory = getFactory(); - factory.setSsl(getSsl(null, "password", "src/test/resources/restricted.jks", null, protocols, ciphers)); - this.webServer = factory.getWebServer(new ServletRegistrationBean<>(new ExampleServlet(true, false), "/hello")); - this.webServer.start(); - SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( - new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpComponentsClientHttpRequestFactory requestFactory = createHttpComponentsRequestFactory(socketFactory); - assertThat(getResponse(getLocalUrl("https", "/hello"), requestFactory)).contains("scheme=https"); - } - protected HttpComponentsClientHttpRequestFactory createHttpComponentsRequestFactory( SSLConnectionSocketFactory socketFactory) { PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() @@ -949,7 +958,7 @@ protected void sslSessionTracking() { AbstractServletWebServerFactory factory = getFactory(); Ssl ssl = new Ssl(); ssl.setEnabled(true); - ssl.setKeyStore("src/test/resources/test.jks"); + ssl.setKeyStore("src/test/resources/org/springframework/boot/web/server/test.jks"); ssl.setKeyPassword("password"); factory.setSsl(ssl); factory.getSession().setTrackingModes(EnumSet.of(SessionTrackingMode.SSL)); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewResolverTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewResolverTests.java index ba3e9c8d40ff..050de81ad363 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewResolverTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.context.support.GenericApplicationContext; import org.springframework.mock.web.MockServletContext; import org.springframework.web.servlet.View; @@ -33,8 +34,6 @@ */ class MustacheViewResolverTests { - private final String prefix = "classpath:/" + getClass().getPackage().getName().replace(".", "/") + "/"; - private final MustacheViewResolver resolver = new MustacheViewResolver(); @BeforeEach @@ -43,7 +42,7 @@ void init() { applicationContext.refresh(); this.resolver.setApplicationContext(applicationContext); this.resolver.setServletContext(new MockServletContext()); - this.resolver.setPrefix(this.prefix); + this.resolver.setPrefix("classpath:"); this.resolver.setSuffix(".html"); } @@ -53,11 +52,13 @@ void resolveNonExistent() throws Exception { } @Test + @WithResource(name = "template.html", content = "Hello {{World}}") void resolveExisting() throws Exception { assertThat(this.resolver.resolveViewName("template", null)).isNotNull(); } @Test + @WithResource(name = "template.html", content = "Hello {{World}}") void setsContentType() throws Exception { this.resolver.setContentType("application/octet-stream"); View view = this.resolver.resolveViewName("template", null); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewTests.java index ee266a60f84c..e5acdd254a5c 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/view/MustacheViewTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; @@ -37,9 +38,6 @@ */ class MustacheViewTests { - private final String templateUrl = "classpath:/" + getClass().getPackage().getName().replace(".", "/") - + "/template.html"; - private final MockHttpServletRequest request = new MockHttpServletRequest(); private final MockHttpServletResponse response = new MockHttpServletResponse(); @@ -55,10 +53,11 @@ void init() { } @Test + @WithResource(name = "template.html", content = "Hello {{World}}") void viewResolvesHandlebars() throws Exception { MustacheView view = new MustacheView(); view.setCompiler(Mustache.compiler()); - view.setUrl(this.templateUrl); + view.setUrl("classpath:template.html"); view.setApplicationContext(this.context); view.render(Collections.singletonMap("World", "Spring"), this.request, this.response); assertThat(this.response.getContentAsString().trim()).isEqualTo("Hello Spring"); diff --git a/spring-boot-project/spring-boot/src/test/resources/META-INF/spring.factories b/spring-boot-project/spring-boot/src/test/resources/META-INF/spring.factories deleted file mode 100644 index 0ab92a3d7b83..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/META-INF/spring.factories +++ /dev/null @@ -1,13 +0,0 @@ -org.springframework.boot.env.PropertySourceLoader=\ -org.springframework.boot.context.config.TestPropertySourceLoader1,\ -org.springframework.boot.context.config.TestPropertySourceLoader2 - -org.springframework.boot.context.config.ConfigDataLocationResolver=\ -org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorIntegrationTests.LocationResolver,\ -org.springframework.boot.context.config.TestConfigDataBootstrap.LocationResolver,\ -org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.LocationResolver - -org.springframework.boot.context.config.ConfigDataLoader=\ -org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorIntegrationTests.Loader,\ -org.springframework.boot.context.config.TestConfigDataBootstrap.Loader,\ -org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessorImportCombinedWithProfileSpecificIntegrationTests.Loader diff --git a/spring-boot-project/spring-boot/src/test/resources/META-INF/spring/org.springframework.boot.context.annotation.ImportCandidatesTests$TestAnnotation.imports b/spring-boot-project/spring-boot/src/test/resources/META-INF/spring/org.springframework.boot.context.annotation.ImportCandidatesTests$TestAnnotation.imports deleted file mode 100644 index 8274f7c72c5c..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/META-INF/spring/org.springframework.boot.context.annotation.ImportCandidatesTests$TestAnnotation.imports +++ /dev/null @@ -1,6 +0,0 @@ -# A comment spanning a complete line -class1 - -class2 # with comment at the end - # Comment with some whitespace in front -class3 diff --git a/spring-boot-project/spring-boot/src/test/resources/a-file b/spring-boot-project/spring-boot/src/test/resources/a-file deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/spring-boot-project/spring-boot/src/test/resources/ansi.properties b/spring-boot-project/spring-boot/src/test/resources/ansi.properties deleted file mode 100644 index d99e75a60b97..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/ansi.properties +++ /dev/null @@ -1 +0,0 @@ -spring.output.ansi.enabled=never diff --git a/spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file-test.properties b/spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file-test.properties deleted file mode 100644 index 36e382cb6cdf..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file-test.properties +++ /dev/null @@ -1,4 +0,0 @@ -test1=test1 -#--- -spring.config.activate.on-profile=other -test2=test2 diff --git a/spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file.properties b/spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file.properties deleted file mode 100644 index d7ec8875c8cd..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-activate-on-profile-in-profile-specific-file.properties +++ /dev/null @@ -1 +0,0 @@ -spring.profiles.active=test,other diff --git a/spring-boot-project/spring-boot/src/test/resources/application-bootstrap-registry-integration-tests.properties b/spring-boot-project/spring-boot/src/test/resources/application-bootstrap-registry-integration-tests.properties deleted file mode 100644 index 6fe0d5673ad2..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-bootstrap-registry-integration-tests.properties +++ /dev/null @@ -1,6 +0,0 @@ -spring.config.import=testbootstrap:test -spring.profiles.active=test -myprop=igotbound -#--- -spring.config.activate.on-profile=test -myprofileprop=igotprofilebound diff --git a/spring-boot-project/spring-boot/src/test/resources/application-customdefault.properties b/spring-boot-project/spring-boot/src/test/resources/application-customdefault.properties deleted file mode 100644 index 899e25633bb5..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-customdefault.properties +++ /dev/null @@ -1 +0,0 @@ -customdefault=true diff --git a/spring-boot-project/spring-boot/src/test/resources/application-dev.properties b/spring-boot-project/spring-boot/src/test/resources/application-dev.properties deleted file mode 100644 index 14634a49e75e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-dev.properties +++ /dev/null @@ -1 +0,0 @@ -my.property=fromdevpropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-imported.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-imported.properties deleted file mode 100644 index e80c76a43997..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-imported.properties +++ /dev/null @@ -1 +0,0 @@ -my.value=iwasimported \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-document.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-document.properties deleted file mode 100644 index 556143a77205..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-document.properties +++ /dev/null @@ -1,3 +0,0 @@ -my.import=application-import-with-placeholder-imported -#--- -spring.config.import=classpath:${my.import}.properties diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document-imported.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document-imported.properties deleted file mode 100644 index 3864e4a45335..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document-imported.properties +++ /dev/null @@ -1 +0,0 @@ -my.value=application-import-with-placeholder-in-earlier-document-imported diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document.properties deleted file mode 100644 index feee42ed7202..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-document.properties +++ /dev/null @@ -1,6 +0,0 @@ -my.import=application-import-with-placeholder-in-earlier-document-imported -#--- -my.value=should-be-ignored -spring.config.activate.on-profile=missing -#--- -spring.config.import=classpath:${my.import}.properties diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document-imported.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document-imported.properties deleted file mode 100644 index 96b8574a861b..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document-imported.properties +++ /dev/null @@ -1 +0,0 @@ -my.value=application-import-with-placeholder-in-earlier-profile-document-imported diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document.properties deleted file mode 100644 index ced93c8d9f7e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-earlier-profile-document.properties +++ /dev/null @@ -1,6 +0,0 @@ -my.value=application-import-with-placeholder-in-earlier-profile-document -#--- -my.import=application-import-with-placeholder-in-earlier-profile-document-imported -spring.config.activate.on-profile=missing -#--- -spring.config.import=classpath:${my.import}.properties diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-profile-document.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-profile-document.properties deleted file mode 100644 index 890f961e5f16..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder-in-profile-document.properties +++ /dev/null @@ -1,6 +0,0 @@ -my.import=application-import-with-placeholder-imported -#--- -spring.config.import=classpath:${my.import}.properties -#--- -my.import=badbadbad -spring.config.activate.on-profile=missing \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder.properties deleted file mode 100644 index de35cff62404..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-placeholder.properties +++ /dev/null @@ -1,2 +0,0 @@ -my.import=application-import-with-placeholder-imported -spring.config.import=classpath:${my.import}.properties \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import-dev.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import-dev.properties deleted file mode 100644 index 0ee51673facf..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import-dev.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.config.import=classpath:application-import-with-profile-variant-imported-dev.properties -my.value=application-import-with-profile-variant-and-direct-profile-import-dev diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import.properties deleted file mode 100644 index 3bde4a37706a..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.config.import=classpath:application-import-with-profile-variant-imported.properties -my.value=application-import-with-profile-variant-and-direct-profile-import diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-dev.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-dev.properties deleted file mode 100644 index 2fab0529571c..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-dev.properties +++ /dev/null @@ -1 +0,0 @@ -my.value=application-import-with-profile-variant-dev diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported-dev.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported-dev.properties deleted file mode 100644 index 358d119e620a..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported-dev.properties +++ /dev/null @@ -1 +0,0 @@ -my.value=application-import-with-profile-variant-imported-dev diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported.properties deleted file mode 100644 index 7627d37b4b5e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported.properties +++ /dev/null @@ -1 +0,0 @@ -my.value=application-import-with-profile-variant-imported diff --git a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant.properties b/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant.properties deleted file mode 100644 index d2354c3974ed..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.config.import=classpath:application-import-with-profile-variant-imported.properties -my.value=application-import-with-profile-variant diff --git a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-document.properties b/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-document.properties deleted file mode 100644 index 646513a9ce6f..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-document.properties +++ /dev/null @@ -1,6 +0,0 @@ -spring.profiles.active=p1 -spring.profiles.include=p2 -#--- -spring.config.activate.on-profile=p2 -spring.profiles.include=p3 - diff --git a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file-test.properties b/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file-test.properties deleted file mode 100644 index 70251f9e7f05..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file-test.properties +++ /dev/null @@ -1 +0,0 @@ -spring.profiles.include=p2 diff --git a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file.properties b/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file.properties deleted file mode 100644 index f841722a2f15..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-in-profile-specific-file.properties +++ /dev/null @@ -1 +0,0 @@ -spring.profiles.active=test diff --git a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-list-in-profile-specific-file-test.yml b/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-list-in-profile-specific-file-test.yml deleted file mode 100644 index b6f2fc555807..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-list-in-profile-specific-file-test.yml +++ /dev/null @@ -1,4 +0,0 @@ -spring: - profiles: - include: - - p diff --git a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-with-placeholder.properties b/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-with-placeholder.properties deleted file mode 100644 index e1baa5d408a4..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles-with-placeholder.properties +++ /dev/null @@ -1,9 +0,0 @@ -spring.profiles.active=p1 -spring.profiles.include=p2 -#--- -myprofile=p4 -spring.profiles.include=p3,${myprofile} -#--- -myotherprofile=p5 -spring.profiles.include=${myotherprofile} - diff --git a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles.properties b/spring-boot-project/spring-boot/src/test/resources/application-include-profiles.properties deleted file mode 100644 index c20ed9ad301e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-include-profiles.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.profiles.active=p1 -spring.profiles.include=p2 -#--- -spring.profiles.include=p3,p4 -#--- -spring.profiles.include=p5 - diff --git a/spring-boot-project/spring-boot/src/test/resources/application-includeprofile.properties b/spring-boot-project/spring-boot/src/test/resources/application-includeprofile.properties deleted file mode 100644 index 213a72823c17..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-includeprofile.properties +++ /dev/null @@ -1 +0,0 @@ -spring.profiles.include=specific diff --git a/spring-boot-project/spring-boot/src/test/resources/application-node.properties b/spring-boot-project/spring-boot/src/test/resources/application-node.properties deleted file mode 100644 index 292bb08658cb..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-node.properties +++ /dev/null @@ -1 +0,0 @@ -bar: spam diff --git a/spring-boot-project/spring-boot/src/test/resources/application-other.properties b/spring-boot-project/spring-boot/src/test/resources/application-other.properties deleted file mode 100644 index 34cfee2a78b7..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-other.properties +++ /dev/null @@ -1 +0,0 @@ -my.property=fromotherpropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import-p1.properties b/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import-p1.properties deleted file mode 100644 index 0457702de8db..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import-p1.properties +++ /dev/null @@ -1 +0,0 @@ -spring.config.import:test:boot \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import.properties b/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import.properties deleted file mode 100644 index 692617a8946d..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-custom-import.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.profiles.active=p1,p2 - diff --git a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p1.properties b/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p1.properties deleted file mode 100644 index c9ad018fd9f4..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p1.properties +++ /dev/null @@ -1 +0,0 @@ -application-profile-specific-import-with-import-import-p1=true diff --git a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p2.properties b/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p2.properties deleted file mode 100644 index e72f2f191d51..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p2.properties +++ /dev/null @@ -1 +0,0 @@ -application-profile-specific-import-with-import-import-p2=true diff --git a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import.properties b/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import.properties deleted file mode 100644 index e92241ad1edd..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import.properties +++ /dev/null @@ -1 +0,0 @@ -application-profile-specific-import-with-import-import=true diff --git a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-p1.properties b/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-p1.properties deleted file mode 100644 index 836dcc3f5eee..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-p1.properties +++ /dev/null @@ -1,2 +0,0 @@ -application-profile-specific-import-with-import-p1=true -spring.config.import=application-profile-specific-import-with-import-import.properties diff --git a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import.properties b/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import.properties deleted file mode 100644 index 4b94ad9212ab..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.profiles.active=p1,p2 -application-profile-specific-import-with-import=true diff --git a/spring-boot-project/spring-boot/src/test/resources/application-props-no-extension b/spring-boot-project/spring-boot/src/test/resources/application-props-no-extension deleted file mode 100644 index b3efe414930f..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-props-no-extension +++ /dev/null @@ -1 +0,0 @@ -withnotext=test \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/application-withwebapplicationtype.yml b/spring-boot-project/spring-boot/src/test/resources/application-withwebapplicationtype.yml deleted file mode 100644 index 1556b9eca165..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application-withwebapplicationtype.yml +++ /dev/null @@ -1 +0,0 @@ -spring.main.web-application-type: reactive diff --git a/spring-boot-project/spring-boot/src/test/resources/application.custom b/spring-boot-project/spring-boot/src/test/resources/application.custom deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/spring-boot-project/spring-boot/src/test/resources/application.properties b/spring-boot-project/spring-boot/src/test/resources/application.properties deleted file mode 100644 index 2325ace12061..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application.properties +++ /dev/null @@ -1,6 +0,0 @@ -foo: bucket -value: 1234 -my.property: fromapplicationproperties -sample.app.test.prop: * -my.placeholder: ${my.fallback} -duplicate=properties diff --git a/spring-boot-project/spring-boot/src/test/resources/application.yml b/spring-boot-project/spring-boot/src/test/resources/application.yml deleted file mode 100644 index 74fe76ca7cea..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/application.yml +++ /dev/null @@ -1 +0,0 @@ -duplicate: yaml \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/banner-utf8.txt b/spring-boot-project/spring-boot/src/test/resources/banner-utf8.txt deleted file mode 100644 index f3077be2fc5e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/banner-utf8.txt +++ /dev/null @@ -1 +0,0 @@ -😍 Spring Boot! 😍 diff --git a/spring-boot-project/spring-boot/src/test/resources/bindtoapplication.properties b/spring-boot-project/spring-boot/src/test/resources/bindtoapplication.properties deleted file mode 100644 index 33406d213f83..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/bindtoapplication.properties +++ /dev/null @@ -1 +0,0 @@ -spring.main.banner-mode=off diff --git a/spring-boot-project/spring-boot/src/test/resources/config/..hidden/testproperties.properties b/spring-boot-project/spring-boot/src/test/resources/config/..hidden/testproperties.properties deleted file mode 100644 index 1537a17cf26f..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/..hidden/testproperties.properties +++ /dev/null @@ -1 +0,0 @@ -fourth.property=shouldbehidden \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/config/0-empty/testproperties.properties b/spring-boot-project/spring-boot/src/test/resources/config/0-empty/testproperties.properties deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/spring-boot-project/spring-boot/src/test/resources/config/1-first/testproperties.properties b/spring-boot-project/spring-boot/src/test/resources/config/1-first/testproperties.properties deleted file mode 100644 index 1c97e4c41267..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/1-first/testproperties.properties +++ /dev/null @@ -1 +0,0 @@ -first.property=apple \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/config/2-second/testproperties.properties b/spring-boot-project/spring-boot/src/test/resources/config/2-second/testproperties.properties deleted file mode 100644 index a568eac54e05..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/2-second/testproperties.properties +++ /dev/null @@ -1 +0,0 @@ -second.property=ball \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p1.properties b/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p1.properties deleted file mode 100644 index ffbd719314e1..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p1.properties +++ /dev/null @@ -1,3 +0,0 @@ -config-file-in-root-and-config-with-profile-p1=true -v1=config-file-in-root-and-config-with-profile-p1 -#v2 intentionally missing \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p2.properties b/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p2.properties deleted file mode 100644 index 5ead8d0cd908..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile-p2.properties +++ /dev/null @@ -1,3 +0,0 @@ -config-file-in-root-and-config-with-profile-p2=true -v1=config-file-in-root-and-config-with-profile-p2 -#v2 intentionally missing \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile.properties b/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile.properties deleted file mode 100644 index 556c851a5f22..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/file-in-root-and-config-with-profile.properties +++ /dev/null @@ -1,3 +0,0 @@ -config-file-in-root-and-config-with-profile=true -v1=config-file-in-root-and-config-with-profile -v2=config-file-in-root-and-config-with-profile \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/config/nested/3-third/testproperties.properties b/spring-boot-project/spring-boot/src/test/resources/config/nested/3-third/testproperties.properties deleted file mode 100644 index d00e7f0a62f7..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/nested/3-third/testproperties.properties +++ /dev/null @@ -1 +0,0 @@ -third.property=shouldnotbefound diff --git a/spring-boot-project/spring-boot/src/test/resources/config/specific.properties b/spring-boot-project/spring-boot/src/test/resources/config/specific.properties deleted file mode 100644 index 744e563a5af2..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/config/specific.properties +++ /dev/null @@ -1 +0,0 @@ -my.property=specific diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile-customdefault.properties b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile-customdefault.properties deleted file mode 100644 index 0888bcc45919..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile-customdefault.properties +++ /dev/null @@ -1 +0,0 @@ -customprofile-customdefault=true diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile.properties b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile.properties deleted file mode 100644 index 4e2652099958..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/customprofile.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.profiles.active=customdefault -customprofile=true diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testnegatedprofiles.yml b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testnegatedprofiles.yml deleted file mode 100644 index bf25b22a21f0..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testnegatedprofiles.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -my: - property: fromyamlfile - other: notempty ---- -spring.config.activate.on-profile: dev -my: - property: fromdevprofile ---- -spring.config.activate.on-profile: other -my: - property: fromotherprofile ---- -spring.config.activate.on-profile: "!other" -my: - property: fromnototherprofile - notother: foo diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofileexpression.yml b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofileexpression.yml deleted file mode 100644 index c212cc0c9b5b..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofileexpression.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -my: - property: fromyamlfile ---- -spring.config.activate.on-profile: dev & other -my: - property: devandother ---- -spring.config.activate.on-profile: (dev | other) & another -my: - property: devorotherandanother ---- diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofiles.yml b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofiles.yml deleted file mode 100644 index 98a993ef7659..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofiles.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -my: - property: fromyamlfile - other: notempty ---- -spring.config.activate.on-profile: dev -my: - property: fromdevprofile -dev: - property: devproperty ---- -spring.config.activate.on-profile: other -my: - property: fromotherprofile ---- -spring.config.activate.on-profile: prod -spring.config.import: file:./non-existent.yml - diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesdocument.yml b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesdocument.yml deleted file mode 100644 index 159f728f9b30..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesdocument.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -my: - property: fromyamlfile - other: notempty ---- -spring.config.activate.on-profile: thedefault -my: - property: fromdefaultprofile ---- -spring.config.activate.on-profile: other -my: - property: fromotherprofile diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesempty.yml b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesempty.yml deleted file mode 100644 index be357f780e76..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testprofilesempty.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -my: - property: fromyamlfile - other: notempty ---- -spring.config.activate.on-profile: -my: - property: fromemptyprofile ---- -spring.config.activate.on-profile: other -my: - property: fromotherprofile diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testsetprofiles.yml b/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testsetprofiles.yml deleted file mode 100644 index 260670becfe6..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/profiles/testsetprofiles.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -spring: - profiles: - active: dev -my: - property: fromyamlfile ---- -spring.config.activate.on-profile: dev -my: - property: fromdevprofile diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/properties/application-dev.properties b/spring-boot-project/spring-boot/src/test/resources/configdata/properties/application-dev.properties deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/properties/application.other b/spring-boot-project/spring-boot/src/test/resources/configdata/properties/application.other deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/properties/application.properties b/spring-boot-project/spring-boot/src/test/resources/configdata/properties/application.properties deleted file mode 100644 index c9f0304f65e5..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/properties/application.properties +++ /dev/null @@ -1 +0,0 @@ -foo=bar \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/properties/other.properties b/spring-boot-project/spring-boot/src/test/resources/configdata/properties/other.properties deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/spring-boot-project/spring-boot/src/test/resources/configdata/yaml/application.yml b/spring-boot-project/spring-boot/src/test/resources/configdata/yaml/application.yml deleted file mode 100644 index b93638efd6c5..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configdata/yaml/application.yml +++ /dev/null @@ -1,3 +0,0 @@ -foo: bar ---- -hello: world \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific-prod.properties b/spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific-prod.properties deleted file mode 100644 index 6b16e80391cb..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific-prod.properties +++ /dev/null @@ -1 +0,0 @@ -prop=fromprofilefile \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific.properties b/spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific.properties deleted file mode 100644 index de523ae42dd5..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/configimportwithprofilespecific.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.config.import=icwps: -prop=fromfile \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/custom-config/application.yml b/spring-boot-project/spring-boot/src/test/resources/custom-config/application.yml deleted file mode 100644 index bb56b055142c..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/custom-config/application.yml +++ /dev/null @@ -1 +0,0 @@ -hello: world diff --git a/spring-boot-project/spring-boot/src/test/resources/custom-console-log-pattern.xml b/spring-boot-project/spring-boot/src/test/resources/custom-console-log-pattern.xml deleted file mode 100644 index 60fd81a46466..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/custom-console-log-pattern.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern-with-fileNamePattern.xml b/spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern-with-fileNamePattern.xml deleted file mode 100644 index 1ae820bc92de..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern-with-fileNamePattern.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern.xml b/spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern.xml deleted file mode 100644 index b94a60abfdf5..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/custom-file-log-pattern.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/custom-location.yml b/spring-boot-project/spring-boot/src/test/resources/custom-location.yml deleted file mode 100644 index 69a696159948..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/custom-location.yml +++ /dev/null @@ -1 +0,0 @@ -foo: ${fooValue} diff --git a/spring-boot-project/spring-boot/src/test/resources/customapplication.yml b/spring-boot-project/spring-boot/src/test/resources/customapplication.yml deleted file mode 100644 index 9bda1a4411aa..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/customapplication.yml +++ /dev/null @@ -1 +0,0 @@ -yamlkey: yamlvalue \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/customprofile-customdefault.properties b/spring-boot-project/spring-boot/src/test/resources/customprofile-customdefault.properties deleted file mode 100644 index 4770be45e42f..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/customprofile-customdefault.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.profiles.include=specific -customprofile-customdefault=true diff --git a/spring-boot-project/spring-boot/src/test/resources/customprofile-specific.properties b/spring-boot-project/spring-boot/src/test/resources/customprofile-specific.properties deleted file mode 100644 index cc4c955469b3..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/customprofile-specific.properties +++ /dev/null @@ -1 +0,0 @@ -customprofile-specific=true diff --git a/spring-boot-project/spring-boot/src/test/resources/customprofile.properties b/spring-boot-project/spring-boot/src/test/resources/customprofile.properties deleted file mode 100644 index 4e2652099958..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/customprofile.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.profiles.active=customdefault -customprofile=true diff --git a/spring-boot-project/spring-boot/src/test/resources/data.sql b/spring-boot-project/spring-boot/src/test/resources/data.sql deleted file mode 100644 index 06acad8464bd..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/data.sql +++ /dev/null @@ -1 +0,0 @@ -INSERT INTO EXAMPLE VALUES (1, 'Andy'); \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/dispatcher.properties b/spring-boot-project/spring-boot/src/test/resources/dispatcher.properties deleted file mode 100644 index 0ffbf1791fa3..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/dispatcher.properties +++ /dev/null @@ -1 +0,0 @@ -main.sources: org.springframework.boot.main.DispatcherMainTests diff --git a/spring-boot-project/spring-boot/src/test/resources/enableother.properties b/spring-boot-project/spring-boot/src/test/resources/enableother.properties deleted file mode 100644 index f21b4e998982..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/enableother.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.profiles.active=other -my.property=fromenableotherpropertiesfile -one.more=${my.property} diff --git a/spring-boot-project/spring-boot/src/test/resources/enableprofile-myprofile.properties b/spring-boot-project/spring-boot/src/test/resources/enableprofile-myprofile.properties deleted file mode 100644 index 88ee464f6753..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/enableprofile-myprofile.properties +++ /dev/null @@ -1,2 +0,0 @@ -my.property=fromprofilepropertiesfile -the.property=fromprofilepropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/enableprofile-other.properties b/spring-boot-project/spring-boot/src/test/resources/enableprofile-other.properties deleted file mode 100644 index 04e2d9608b52..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/enableprofile-other.properties +++ /dev/null @@ -1 +0,0 @@ -other.property=fromotherpropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/enableprofile.properties b/spring-boot-project/spring-boot/src/test/resources/enableprofile.properties deleted file mode 100644 index 885285226242..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/enableprofile.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.profiles.active=myprofile -my.property=frompropertiesfile -the.property=frompropertiesfile -one.more=${my.property} diff --git a/spring-boot-project/spring-boot/src/test/resources/enabletwoprofiles.properties b/spring-boot-project/spring-boot/src/test/resources/enabletwoprofiles.properties deleted file mode 100644 index 90d74d0f4170..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/enabletwoprofiles.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.profiles.active=myprofile,another -my.property=fromtwopropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p1.properties b/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p1.properties deleted file mode 100644 index c4de4d2a978d..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p1.properties +++ /dev/null @@ -1,3 +0,0 @@ -file-in-root-and-config-with-profile-p1=true -v1=file-in-root-and-config-with-profile-p1 -v2=file-in-root-and-config-with-profile-p1 diff --git a/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p2.properties b/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p2.properties deleted file mode 100644 index c60d2dafc39b..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile-p2.properties +++ /dev/null @@ -1,3 +0,0 @@ -file-in-root-and-config-with-profile-p2=true -v1=file-in-root-and-config-with-profile-p2 -v2=file-in-root-and-config-with-profile-p2 diff --git a/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile.properties b/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile.properties deleted file mode 100644 index b34ddf5169ba..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/file-in-root-and-config-with-profile.properties +++ /dev/null @@ -1,3 +0,0 @@ -file-in-root-and-config-with-profile=true -v1=file-in-root-and-config-with-profile -v2=file-in-root-and-config-with-profile diff --git a/spring-boot-project/spring-boot/src/test/resources/gh17001.properties b/spring-boot-project/spring-boot/src/test/resources/gh17001.properties deleted file mode 100644 index b61799d2cdee..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/gh17001.properties +++ /dev/null @@ -1 +0,0 @@ -gh17001loaded=true diff --git a/spring-boot-project/spring-boot/src/test/resources/invalidproperty.properties b/spring-boot-project/spring-boot/src/test/resources/invalidproperty.properties deleted file mode 100644 index 4729d6f015ff..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/invalidproperty.properties +++ /dev/null @@ -1 +0,0 @@ -spring.profiles=a \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/log4j2-nondefault.xml b/spring-boot-project/spring-boot/src/test/resources/log4j2-nondefault.xml deleted file mode 100644 index ecaa4dc5effc..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/log4j2-nondefault.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - ???? - ${sys:LOG_FILE} %d{yyyy-MM-dd HH:mm:ss.SSS}] service%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n - - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/log4j2-override.xml b/spring-boot-project/spring-boot/src/test/resources/log4j2-override.xml deleted file mode 100644 index f0cdfa02d2bc..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/log4j2-override.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/logback-broken.xml b/spring-boot-project/spring-boot/src/test/resources/logback-broken.xml deleted file mode 100644 index 7f8454941cff..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/logback-broken.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - ${LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/logback-include-base.xml b/spring-boot-project/spring-boot/src/test/resources/logback-include-base.xml deleted file mode 100644 index b8a41480d7d6..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/logback-include-base.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/logback-include-defaults.xml b/spring-boot-project/spring-boot/src/test/resources/logback-include-defaults.xml deleted file mode 100644 index 0124d8a7e357..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/logback-include-defaults.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - [%p] - %m%n - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/logback-invalid-format.txt b/spring-boot-project/spring-boot/src/test/resources/logback-invalid-format.txt deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/spring-boot-project/spring-boot/src/test/resources/logback-nondefault.xml b/spring-boot-project/spring-boot/src/test/resources/logback-nondefault.xml deleted file mode 100644 index 5d1622c51841..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/logback-nondefault.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - %property{LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/logback-springprofile-in-root.xml b/spring-boot-project/spring-boot/src/test/resources/logback-springprofile-in-root.xml deleted file mode 100644 index 284c547a0b32..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/logback-springprofile-in-root.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %property{LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/logback-without-extension b/spring-boot-project/spring-boot/src/test/resources/logback-without-extension deleted file mode 100644 index 1d55bbaf83fb..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/logback-without-extension +++ /dev/null @@ -1,11 +0,0 @@ - - - - - %msg - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/logging-nondefault.properties b/spring-boot-project/spring-boot/src/test/resources/logging-nondefault.properties deleted file mode 100644 index d4f6d6970b5e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/logging-nondefault.properties +++ /dev/null @@ -1,2 +0,0 @@ -handlers = java.util.logging.ConsoleHandler -.level = INFO diff --git a/spring-boot-project/spring-boot/src/test/resources/moreproperties.properties b/spring-boot-project/spring-boot/src/test/resources/moreproperties.properties deleted file mode 100644 index d72233548bda..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/moreproperties.properties +++ /dev/null @@ -1,2 +0,0 @@ -my.property=frommorepropertiesfile -the.property=frommorepropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/animated.gif b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/animated.gif deleted file mode 100644 index 104a96af516833b7a0bbaab900667a46804303f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899314 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 DF6)BgT~PngooTze@p7b2 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 yA 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%0A5|5p1fUO?Sxu3x`gyA|_1^Np^*n0DsN%9H6DIX{ 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

@?6 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

  • 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

    vwTQj=E@mQ<&ie!O&pXp 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≤@VhIbSJB_m)bCi8to1GsH~; z1JQukf#3-^h8(?6Xbs&$MxDeU!-#MnJe*2PuY5^skAvpmM>fLC)0e;@-1@)^Z-I1< z=hVjG6;X)<##P8#j~4k_FH6CXq!CUAqsegi0-8HO4Q+T)YIrFg?ySUjKZwYH7U&qryd)kf9P33I}S_II2JcHJf3|2uC5L zt4`c~zip%+18T;Cm~$rG*$CyeOI`|KA_<{aiH@hWO4FdObVPfhKrN$yp9uPGTMamZ z)ERKd+NG>~6dej53`Sa+PeNQL+o({~_@zb=c=wbQj(SS!B<{NG80vI7cYhh`2Wr=A zt+U$%?;|5B`vg*OfJ2GnA@_mXlj8d+$?!Fl#eo@!>lhDZ%=UnH!H;8oI9iR6O!GEV zfr>010kh^W?d?M)5OW9p;h7kwa3%U$p$l^L5M{z~4h(;Fn5P$qf1`onGS7wBH-Ofe zf;3DE1JV+k+{;E+Z~&f~9$Y0_(N0H&Tw>r_&K2%SGQfw3@CMp-Q8}J$eEYz*O94uD z4*{Wde6JD(o`*r|(?FuQyO1$t@MeOrYk@^gsJs23qPf*>UND>5V zK;0HuK*i$2vwdUw6hK(qE}|p~5Tp!OA!NZVS1u%-lsfazuE zgkiB8ryx8~{7k+e;XBlXzR#V6=wOaY^`T-pU`f)T{ulG9HBcPmHmY?7&Ou-GKi?v7 zu9ue9hsL&okisrHcIO3cvA|dpSg{9T#e>}%?R%!CyI0Bd2y1{h=#GKQd4etI&qS$( z)&=P`^bKpB65b)xR#ZG~-0d+qiGujBBhXDmxZxmDMRXut8V&;bOE9^aE9Wx6EpnHj zt!VyT4hTWIBu+)wQ~KN2p*K?nsThP(UAZd`jz5Zx(tv~06(_a2zw3?{sFhL4?) zv?|_yHe|*cJk}v_k^%gK1@pWTyhuWM3Xan=|2Zh0zZHYnGY8VAaqESD- zPe48u4y2y~KAE79}Gq{pU}XtS#Y;vDcn!n5OD*xesjE7KvXR>Q)AvvBNe z3m62$LH-zH8rdk03+5~c+R~?yMn{BkxZg4u9xc$zMiA*9d<>{3eZb!NUmc5aNK!;b-dN$&;UUxUSRv3}+!A&H1=ZA%B>3;z@d>HCgH?;Q zSx|bLuM0nLZDkB-*tX|*9w&cq0h`F-#S!w3UI_9d^_R*R2(GWabq*>rR z385n>Irs}MY9`c4ev)pimTrtl0WHR_p|OQtLJDAAdYdhE_ILUbX$~xzh4}naqy&%9 z2dyZxp?S0m_Ed!B6L5hLc%SOq4(6NVmFP@1d`?M1f&dlX6>4NnrKh;_a;5@^@X0qK ztt3=1_eNMYmjnUgzlG=oB)4QFjVBE5a8DE5^anUfM>Mk%f_BlTbKiS`(RFx40Fz3Y z0AVmNZ_dkuV01Pfkov7RH)b!u&Jn7CrYhH1cki|aW{h<5460{AG_oMBJ&=R%Ch`2A zbZ$Z|KrjpPCvy6lagDheif=#VOZfpB_+=2;1XmdOi%96 z<#uLtc4ANLr2o;@=y%p1h@0fKkY>Yz7@MBksAeMk?Q)KCeZ8TFRQH4Hy(3G311>0Q^>&8-(UfH9HK_*_!%jVFDNc+2fDbEBej$E{QPu~WXj(C zM!+vqn;ijtr=$j@*{omH5U@0Rfx1haI~I#>CLogth%l~wk_>R0GWLI9&;I;o|AAS7 zU>pBHH)KDV1b#BZe=;XS)LFYmWQYppkG{6`)7U@X&iwgN@#l8nb!l2TXu*ojlr%c| zYg0F$)#1x0ZJ8_Px^DZg5X$w1eYv#3jVjN1Pc5Hb|LeNnogX^awH|CihpBtqu9b;? zHreR@`rv7c%>PLU^~SB^zmW#ddtN*;)#Ulst2f~KNkG!;o%iLiJE!fM|3eyldLvKr z@CW~q#P|Q#NP}=LX;A+q<$oW7!X*Anv^4l% zqNVsw*W@1e%u4}(Bai>^12eDqaKRFkn}@ko5o%{d&Oq3|qNV(S@RI9M6*vDDMryC8 z|1FG+`E%op(pfHEB8nSl{HHK-{J((&6SyG3`v3Tq>i*&-(oZjB&=<3~LZvhF*=H6g ze~E(ACI3PuxI(4B$;CoR*JAnkm6CIlw65uz^LJ`4OgH{_u3+zS^`*tX{Sn4e-QWJm za?9|G(*t+fhwq*Li=BAb!SyIzdwBjYSMVX@`r5ghYu$g#BloV3J^tGtnS40>*Q4}o zl)2H#?T<{p>6v~pF#mRNhJAH@ee|zB>B%hX+06ZC^N*h{EOI>EGqFo;p4gC=NdY05utVK=Cdav=EDDJS<15LnzJ z!>N1Gt3_5$=)tLFS0?2w)N+q7os?UtYZ2BxCJ?;oz&*RxkOa==^NDL(hGI-{ggaIC zXh)r7SLUlI zT12H}fHbSK(P~6Khqg~0pCyeGHu3iQN{(=}{_FF1CKq2mhoCKIH?a<%&l(=du8*+! zb+=XbkVgjQM_*{=_^Df%G3ID{scfX?&x0FN#Wm{e>jSPXUFD*(d*xsB;$c5Jb?tQV zh23A;zrN4g@~Es*bgKTx^OWJNv>UH$HlU+Mr0#LwuyU5U_{Eb6m1DE=#J`DGA*4OU zf^zoQ@K)vu9T}B#6!%zSj6+e13=l7Y8GA-G@)rmSg%AmlJuV(~YdA7}>9rg%k1@sYtn&}2R-0-ihKYNL$|_Dvi{T7@)Ni9twZCk!);fLCXp~GU(bFMX z4@WbD_R}0Tnb~NAUktl&*R}0@A(@dV@aQ3BVm7b62N*HZ|DbY8(0G^0%;r6Cz-ngT z4|4&YWxyb+k88zI#v7v#q?SkqY-m7v2h)O196FKGnu`hcrK`H|;L~huG4pK&l5Rp& z=pKVjjKIwA(I7jl%_O(R!ifI40jLVe0TOzT;|fGQr1~Zn><_fsvwo9*=yypMO1MMJ zD{waa^kL@`$w0hL?jGY!X6|jlHSjZxVLOWo{lxdM4Nz%r*3e3Ik(=r?l@h2t1$wyl zl+Pe{B^Ux>x>T2lRu`sDlJv%M_n12Bp2PygEiM|0L`(j{%1<(9> z+3h!vDt1B;67L=n$AJ~gxoexc+`+W?V*}tl%zDb`4A$Z_%bWDJuTnx!F9~#t5k6M0eJG|}a)tar_pYwP?;IPZXyGZj@u(79@Qd22QR=?rLlM4HI{2h=^$gb5|JsAcs5 zxvo__ztqD4NDC@T4Mk!?>^i)aDXD@x}^^e*#h(le; zhSOYHqc+yv$nAxX2yjJ0Z`_%cM^i}xP-Tuvs0tWSA>d&C==$4~f&FEz*q$U6V+`Ow za9c#qAV{fjOrVX^y;~(Sdwt&J-GNhSbqN1=fd$>r*kGPh%O4VXPi($5Fx{VbV47X5 z=4eGZQ_uxcKi`I8N>m{YbEQ<>z?h?#a-*sQvyL9aLeeMlpAhrs+y;5cOULyo6S8-U zK9%Nva^?-D2lFDy$|86wrVW2fRkbz#LD2bfo~1|J(>g@AQ1&~H+O$X(Gk(Z-5Y=5= zI!cK?p-ThTIE2FbTDB*>>@}c{Bq+{f%xtE|3a*Sj}5SAHwA*hL_%W|7xhiNXyU9@J|{ z!ecWqHA3d4BjG!g5$F}69?q13xHf9gEl1UZ%Hzkf;w}coJJ>Xg-%B6>+S9q}$m^KY zE}J8(EfMSVwI!KD_R#)RS5Fo0F z_*hiiy_p8TC7^AAy>*B$;@Q*uy|}1n*C<9t?aAYPCz9elJ@sLlEI%J3QyvP@jRee9 z{T+zmDPSZqN}w)euTTWaOZ&PqDw&b->P5`VEBH)O)(j}ljhL1!EEPyPcy9MIqUEES zE)gP<8>Ll6f+tHfU52|bpuuuS2fwDgpRlwXidq*8C?g}@=SzHer4z%3hq2-6-n=be zEL5%>w)28-SRv~?64f{S)@#Ff?D6}UM#6$3>q+r@ULVOB0!6A=Mm<7$*(D?}4bH8> zBM5n3g}gSkp4wtEmp!Fc04X&Ot7UsaYd=U46F(il&yES(aVM522bmtujhVH~#m2v^ zar1ncTR)hQjzp+7!1WwY+|E&U$H=_M2_=JyTY_Qg`Uc?!777@sk^$@pd7m2z9z#?) z9Ov8QSX$u)-m?ZJCZyIG7W2CYvW)Wrlu7|I8l-$+9O7U=)@v1}48XYVcNd&eDqi0U1HIl!?FvgeMg@yuAQ!8F86&O> zWM2};mnEhcw*xP+;x(PJ?G=;>WYE+EGxITshsmlUTx5flt!W%Y1t+qet5#8kIKUK@ zDvamf@%RCQ>at)y_`nKIQdexmp>HwzC<@Ic)9^v@BTxA0*VTCpw?Lgr>2H>XG@S?> zqDB!B0IKTnEaeP&E2mb}T!n*{s!Wy4QrC7XVw6Mq73%sig%4g8+u2Kz@w6<01m>l- z6eIHN*=Qv^RPkdDe8I?v2Bf=!#gXnMweg|`U@_dm%I(f*H?9s; z<^4S*+bfns8@4DQJ3so^EX4uMD)}CB1sijqALD6e-9~gl!! zMm4Vtw~S8{CrD+_sm;TvM)~RH)92))&mKt<^3(;{eK9#>M*~7Y4cTOvr(DI=>G}&! zP;aNx<+Kc_IwFpi>Uh|?YPXxm9cFmc#4?;g<>yil_<}1Pfsco2usLoScF%CUkh`hEKAWKkdM7bj=;D1bD zc6dt{TI&&VOEw#Rhyy}WgmEigJlmK9Z;})mvXWR8vB`dsgt8GLEszGBZKppL@|#_c zxZPnC{83`avEpiwnlTOP0EOTfuuD*cI|;U|fIN(Y;L!V1ol{*uMedXBe@YRa%Y~!vK;e1sbMG#al3)%vK~Bu0JIKQS9D+SFv#>|!mPzlc|i~H;h>4J zvd0;scm`~|8lg=B<6G-#_27R8L1FZU!q%3orqnw-@FYBM%M@W{w)%@(bt&G=lw`)# zP4S1>Xft9+-Y^>i5L6?pjRS-I&ht3uO=ZArxUQNDa^?)MgmBwJcfBkHVn){J_3^xXR-zZ(8;$83 zr{(FL@1+&>m4c+ckDuN0>@WaB^f|zduZUE_WoZNCejLPv3vR{0O(?q|M%yV$YhW!< z_S`3A$u=GzArVQ7h@teG?6>KB4P2f|jiC>gaFp!axdBZ#Rz)zU&Z22?z=~6nOM!}m zun|OLIvuVLg0O63U?n=2`m3I*nALj)R+v>=Y77tJ%shmmkC5SuA{VSQkXws#)~TeL zTV8S;?s7wq%Qa}18Pb>m#^Ip3>fFGJ%tJc#Rfv&fD#UI1czu_?I$!1S<05JK$~8<{ z3pUydC)1b**KZunCdmwhnC;u>yO(ey>k}f82%_)uOr_0DJCBSwZeCDTfKn+-*UYo;&%Frfq30&qJm_P=oCE$B2XrNIv zfi)u|s5n&XlZfxVM)nM&D0?yUP8rF(jdJn;k?P-^WhjEgFfbAcsmlO2m?M?RAbU0< ziwPH`fj2M1wb|gueK)FU8M|GT5=!2CCtEYK5Ac54f74buI&cMP6&zdw8-hrVaT8Zn zCa}^99q*aWrh$4Ltz zo6Ke&Yxrq@RT+oJW7T*wTlsF<=zP{Tcpphzp8>W9-OHkZF$`d~=Qaj&<%hY5I1$!w zWn&J4?zNItryD4zwJC;6d^5|l9Xv6M3;munzMbTkD2a+@>29iBY7m137;9}8ss6}+9OQS=0P=}YdbYTX$2Igi^s?bO4QexrTD zjqkhw#MmyRBe-3WX4aWWJrP~VW9n9HYyT9lu(1LOk|1>N+cT$bmpr}Q?*?CI1$m7Qx{8DVGsY=yZ|fUbhs z0RPkBG$-`7NQDDPjy;sahDqQ-F}$EEe`F+R`Fixw=_}A>L8*@}&&9qX^LBj#`!j}h zx*p$Rs*$YmD79l(?NG5Sz?1_KAsQIHK7wWjJMZ=qque74gMHN~u7 zH-1heJ&!+LtYRG6e@I63IeQe-3rV@t4{`VGa& zJa6@R9zDbD_GRrDSbiyad6(q$Fd3$>SnMx$w~?qI&s`mGy|H`jFu};`nc9~{Yt~v8 zMkAyjx|`kX!-Ba!TdITmH9t~oxvViLi~#N7wF^E^UEa9R!shhsp4y zBE+RoCpZ8B2MMWng;EaLEeJ>k3FT-A_6J0q;9PIs79HM(NX)Gl(lV??q`X*aBK$H_ zR(v|=VNPU4_-oG)`n$8Nx7WQ@2Jf2oge*H#YGY$qCs>t!jlcoA6pqeK(qW{5i?8Cx z(-Xs|bCttQUMw(N2Evuw?SZ;$_t`izZ{g2|w!2RiAHY)>AEpS15SlVEAJ(fNllqQt zED2sW8~d=R~-t{7n8o0>wfU*$Evc|V*X6S9{M zwWQc|JmcdxFp-OcD&>8q%e`9#skT6!dn(k(j7JZMfn0*yDX0iA741NWvB$oyFh=b` zBw6Oqgp_YnthZ5&>W>#w%xKWSSi8bDJrO*lKUqgl1n0AFPoblgCKIEMhy8f~m&-z5 zj)WJC0M0~Mi&q(Ip~@sqV%AB{-_PrMLTIbDy~`TAw5_L@h#!u@erK8deb zn2?WO?hn7)Zjw9wjtl&KuU=yu^uoSM)pLdUMp?Ukwvx?GFloz~LU}B#_A#uK_DfcT zk1qABZ_Z*Q4Sj#1MQ+peASeNQK^A9iB6J>RtMG{64Hwipvc!qabrNole&;BUGVJko zi5~gZ6)O)lD+D0Mo@{#dDteC;=4{FVqTY4>YW3RLnl94OsoYHb_Ih5qv`bUycGau- z=Cssl-y5YS?mn`3XO1_K##|$YLwAeoyoBCd&PU52&#LFx3n=*wX6V?wJ@oSSX!_4b z9*8>?65{F&URy$I;o)fXp4+swJRWhgI`gmN(L4YAt%|7I*i9DzJdG;2X(kvLX1V01 z$k{klD!Iw*?}g4^<5oq&#?*|s^EoypXOBuN3@JDLFdI@~xr+>?S?_TQt+baZ3axV1o(ru$Xo(7|aXaV~R_k@7D6GymW-hG$ z$Vt@EhTw9iS2&IGl0O?=O{W#N&SrSqA?ix$>_E7u^Ue9E##1xylC;%7prWyV!Cc|A$r#$~@xKi3xdbkltA6Ug7~aiu87+%x^oJRzZxnUjto_U8 zn#-oo_Tq)67^qsQ_s`V_6gegnflJTzZR#zoUS{k|0Y;z=dmcdNw+?)-%1^0Z!wDkPb0{frGYp++if~U354_a{VNmhtlI(9*U;N8kH7c%MDY4MO_jYD6UFO@a3P6dV z3dOeX#o%6B^8}`Uk!~o0Pe4djRjhUWmgG&E@Q)%v(f2eNLL^H}&UzAw^G2`tO(Y)* z9ZLInRc(I6U`;~X`vF@+^&lFp==QB}J^${TOG&DMv7e@0PMIfMt?FpofEB4FFvwy! zf)yZYP;;Q~#g}ByeOI3D7OJ$Ix^|kH`sf{p8C;MJg`9UcUJG`t(LKRTKcoIAManFp z^yLf%icJ6n&_ZM;_`O=|q~IQPt1026Q$v9ssWb%cFl@_#CKFyr1Oa%;YX{k}VOM*f za8^>Q`$?L;@8L9|6q<~uK9LJoa#lj-P zHL_{sV>1=0m_nMgSvwBGEBKDcqRf`rovw9uS`I5fzI4swkvyP-;FF}sD%XdUO&xU$ zSX*eVhX*Xc_{=!MdAx@hFBPb6Bi~e9se67X1zF}Q&q`W>z%Nf5s2fGN`u~vYDvBM^ znZ!)+c>sL7&KM^QwfkKDOqWfqv#Rw4H32~41}fBn-)1v{Sm3`VAynVlmPV90>Y~~$ z>(2PG)R;{;uSvXeqnjub>#wsW96q_$>f>Iswsw{r^Q1cOM6VxBIvg_y<>6ChfKVC2 z4uEjg-CO6bnYS$Ulzsf#YA3LFfMf-OVK8R^^BPyUsBc&7+n(jY{rH0_Ut2ettM4CG3`pH+c+@8)ez>%istEK!JA+DjHl^ih1Zc|6t~6a>$*6 z-Px0?;CvCI0kSn*nSBL(M3X@o1CahK>pjHqzWkGSll+HV;PcdiS1CISUj(gA(8k!J znsh@jl$QX42;=ak0?swD7y4@g58kJoo^Sp6H16}l^mBVk%SQksD}82O*n?v%dbG#y z+Izh)83(Djp1xG6FiopmR!R|W5XR$A{DxBQ(qe82lgQQrzO!kXpLO$AuSkp}Kb;aZ zL7vRsOu53c7Tj9om$^ZLOnWjR;_G)?1OYn-d@Vn``n6@nmV;mD}~BGsJd6#uu@SsBS*-p zGeMAxHa*^A8if7sXVsfA?vHN4$_+hl=!tA z>vguB^eP+h@gEoc_(D!^kFH{J`UIa=krRLLN4OErn!9OeVyOz_&p!?kC?q>cYqs(P zZnmiGQ^Q)WTJe!sr@4!LGy9)0D;e=C(*BJ!%PyeImj8B2sd&+o@R8$4@Qxj-m3>Cb{xlj23=kqsTsopKq;<+<-iCbg#btE#Gg0{rSXo36ytBj`;Lazs62P=5ns(+*!oFSYPq)&imjjfp zg&-de6e_8XA@Mjc3eN`da%sA0Bo_q=2#hEcgJ8+oqN-MCthBlqL1U^W&G%aCjace0 z=30r!+Jhp!f7boWKwv2lRD+D+HDu81lyFcDmOS4XwYB71Damt5g=NJnceCvD5c;Yo z;NDtb|F=zG4RbI&?)_!nE&{@y1~KK=s8`xZSkiPcvguGpTBan=q~s>GzJ9uOSdj7@ zaHPO+)Bh9(uwe(o&Kc~6-6Gzxym$d!e?aB8hL@7q8r(oN812T`Do!2^(|WN3mOy-z z`SpYG&*#ph0m8kyj$fIsAwxoqHuL*Md>@K3QYT}|KXnI^V1^u%h3KV&QQ67pFF=k( zMfqoVv0INL-g*z|Q$q1IU-0Ys?{~gSg9QfYh@Jy#z#qx4z5PNDeqKIQGF0b}R5TBoY=ah$rEAx-xv5X~^`c7hsQAZlgwSsc}@Z)ce zm$boK3fV%7AcPrHf6w`s=6nS|k}n_n(uniSu8+bE2z5z7h3JMaB>zbXP+@Nw;H^cU z5t>?^4R-_|s0U>3RxsL%vFni)!z{P!S2z4dw|Zy3gY~r`%id#rgR)x*W2DrJcdty( z?N*+-PH~mT>|0SHKtyR7DAEbeScbb%B9axUvEg7RoW-=w@>e?SypigVr@oY!dPFF; zK}fPl52A!O?CroIh@hV2Y|kMa4-TwEhuDJf+x3~)F0+z{W-YZb%5jLn$BBEaoi!=a zMegB{tFgSqTwc22o7X8NqETXWNU6P4h+Nhwhn&-O0XGT|;%-vXk8(_iw&!4!+1HWw zOGlB$i40}1A_ZbXfdvqxu@Sb#TSdo$?<(!`QYN`a~$@Tf%)2aL7^` zDkXN87nH6v&5AkVV#ZAQZ7eL6vMi8khPYbH^dEu&Z#v z0ciHfv@wv8Z%1^G$*CFP#)8rZU&AACqHB+fVsj&vDBz$a5D%ePEv1mBkjs~ga>v0Z z$BL(2<-DyG5(^LM=z0u#OAUX6U7Ib66)FUKpX9+8mn6q_Ts?Wu2$H-5^B_sNdP|)k zAPlf&b3t<73#1-6WP-9wjN$JWYX2t5AfvPeB^U-o4Zr86`@D@Hqh__AcD+oN_Fv z1nQ>Xlbv<5RtZ#9Y3eBcODLAIRI!&0*_essBj%!LQ3rg=HBBIz?07d;zQlKmgm{H_ zu$)Ll$Ue6ckX!BgSePTtL3X(a)XfD`fyW#6mUYG-m;;FtAev;TBfeI5*jq1K^NMa+ zPL0H$R%Orc@S4eliN_VOLXsQx87gxi=Ryi2UoyT3_F6ylS*NmJNc9_K1-5%z4xsm@Jd4z3tDCw(i(ie3b> zl87i7g4eun;D|4lifA2^QsLeQi6;p0i|h_O&&))=7zvpXrusI3wO0C!b=cc9e=d-HCU}9EQB!Ls*jb@Sa+E~6`t~L%FE9vbOrBsDnDwRh~{L7v)lH} zrQ1Gq^An8Jsgffso*ARU53^nVs7f9kP6DT%Dr{|=f0Hqb+jcCf z%vvcVP%M0$>!_QMlwzmY&*#L+r_@*Kjv~{EP6u|66(2kpdB**P*7pKL2@sG%llUWk z>ggucY7?SQ5Y@(4iP83!h$g@7E=)ngoG^eZL*!twl&ku=O!wMvwFp`m0u3&h8u?{n0=Ausmms+?c-nIm>3B~yX^Z8_c&P24A5QYB<*&G6ax z0O-d1<@Re_sg{e)6l9C3@@T`28J^?c4lxSCIP0mer7q8aq zFoRuoH*U}pdBv#u+31dII$hY*oz!H|40R_1ZUmSTy$v;YqR4S1_eWF!MOM>upZo(v zfNn{zpT{rHN-{XS->k21w-SO*t5G6`yP_@?_qV~Axj7PXuesT}$>I4YqsE11DdNND zt*(a*LruuTij3<^ItLx`!2K7)Y_riP`@0U|$inJ}QANY1&8n5Jw1LI4ccHDQ#$nG8D+oxi^wAi1{ZSE0Z^pnO$E~5kFK#`EMsd zioj1Uh@TxU^^`~M2Z75(qi|wpQdHvflv~bpjK};??YSjvXD}SdyvDzpw=fuKDAlXa zfgL7@M-Zz6h}kBHN$u|tdCjEB@%1gNgV$ylE&1{B!a z6u^c8dtC|a@^qN4X@GIFMHY&ezim@u@gZtIQ?v0BTBU)BQSk(6RmyeKJh*qgWaUV#;<_fwIxAV_B9hm$WiZmr-~kGT$~;P%VQFS7}qZk$zSh7cws=IL^wRw=toUv zwp!)%$laJ?VieE4`eRqwwMjpG?~R2|eC?Bu!XVOFu%n*<3X1@E1z*JOS!N5(($P)0wbfIsi)0>CyLyBxjz#A}6hmyHT&@ z@QCoE-E684&dWPxWEP*qYst$3sWG_!I$4Q3Fqdj=o)BoJ;t{^EyGl=*pT;J*M4M39 zh)qAK^;oMa=XtPLVlet@+Z!>90Jtxk3l;=iNYD!XBc_z(s{7>+I&butbMJ@DHV=^i z3;N?Hoke5ahMC>Q+ zAqFIXElGN+ACGf35f117IOjoxPfJ(MT^x*mVG{R#WgI;9`M^_Qx)?e62_FjS|;Y%vD6y5Yw=@;yBfhkw}#w@zzz(AJBan=GyGR) z`ET3P{JMh?z8(x!Ji4Bp{xScevBeoDfZb@USKl-~djiS^DUzfNF>vU5BftC+al6x7 zDWjWZU2gH~-(Dl?MP2XPh-=87THKNnBD6n6%Ni3A?_R>iJ|C=&g6(y#{kl9YbN2S_ zGR%+9E4$z)yNDMbrHe}(r1yZJFjx3*p#*jfRPYB(;LEt8cI0lqw+Z0N@;5qe0DHj6 zkL+>)^OCYXj{#I1CT@>e$0LuuKgth`dM~$=SLBgVcaHc8+kHx~@~0>93AT&kipvn- zeK-t>4NKDA(!xjec+{RM>N55zdX$P8wuvdUOZc#n72^?K>Xe8g!j9tn#cFMCdBfAn z1BKqC-+3$Ce0TMSVnEh?SkH$3h~xgQ{EXoaQz%!Li38gbr=L$1$eK6^7`)Y-aua^@ zE}->ImiFNiDPP}S;PP?UvyGPY;-yqKm2n2zF9Q0@)-C;_fgt5mAkJA;_iEYn0(1EpK$hKad0PVG_+`SEHK@D zU%)>mDW4Q}v-jz9&ut^Pf)gNR%E1pFwyzB!#5spj;{-Lk@89&5Jm<_vo)%5_OeE6A zj|H9X{(ec40iCFW>9Qk79)ZL;HmCS%v+@n*49>UkIVg{zDBdHFMS-#@-Y*VdUtjvk;>mmLz;R1;Z=D%KUzt?0@wjK5@s*jJr1aKCVNEnhN{L4(WY6Rgo{ zBV-%?eYYCg;1as~H&OCe=}@bEpDC^t*)r{Y(|2p)6)x>%vio?ARtptojW=HqO0{du8Uu8~R>G7fS{04Q17B@}Uy5az$$GENdS1?CbCN zzJ%I&?cev&yO)00D!PzYJf@hC%X^T%2A8k-rglH{=9Dgf1+s0TTR6$U$$3#CNw{iQAk*<}9G5A3lC#I`q>%2O_#l5I zj|A?UTq`HLY-^7tPI=kN!W$59G`scwW0{5rm%(oA+~G4{^ykxi^xl)B!Nt;%Sr{vr zk@CgiO~m$9pCY+5vC=%WDv?0ttHO_LNvK$sz4_I~-BMNFGhljr=T}2Ru_A@M1`|*v zwIYl-7_*q2ceoeDs%^yJVvSYWwG%i0z|FZk@+za`34RCj*eTItqp>rx1?F*cDxITo z^LuB^x4@O{|0aWap9y49ZVW_ zPQ7+8vD-D}f)}^ibaIeeYVzj3`%{MkD5E}kJ;w`sPUQ55=8c3DUO!sgA5(hcc*Q^> zm)%x%Bcb~8$+{a{BaUa@_}}1-+i~I+oGPceu(oI}tgZIn)a^gjrc<{wTJL9_zFEZW zHT@;B%@nlV$!i@iX`kona4Omsayp;nbaHh#_se=#OFO12yQgcpVcXxN?QYA(`!$!A z|4MQC9@qChsr?(aaiuuZ9o(>O=yvzjyMKF4S08r#&D&Pa{mt9{Q*FAj(awC*JO1d( zf6v&sQk=1^a}yiA(_0s(Ui^o!w)I!4dw1&^>z`|PKMio%YX639i_dP|WsfhcO)vf{ z)#b))Z~j)BmUpIBxBnV({)eP(`S}+Xn;WxjJ$>=@(aTRyxD2)bP0Yq^I;H>L({!py ziVXCQU3%W0?CnV~wzPZ3-fD^TCTIuzTK%$j&-+I6+@xr6~B=t%W<(UI#eGl z+Hu30Z}Qm4*Jr2ELbBf9nrUs4b`lc!+kW8o*&5v_Mf(BwyfgfA%ECXG_^|?OIVDBj zLZfVe2WQj%**3XQ*m_xyYtEdLL2~KI7hW&X_l@BQ zmt~#S_qqIB?#2V6_qmrsmppGws;LjINXK~JG9G}&vLrS1Rp|JL>AR;)q8`xIa>ArU z^woa4mAJp!-)Ky~kJS~dQfzEXe%CeF-;vljmu(ky@~8u&X)I|Rdn-faDo(|+Ws z@13T(^kX(Jcufaltb@!$&w)3Jo2-&KJ%fUsiBWoQYV__8Dkq#ayNBpwFuB1 z_Ln3QqF7^73iA^q<}0h;-v<@Iun$5W3&jiN%cQNe=6OZEd2@_6x%Fbcj9l6;CV}Ty zW{{{zu7K{T$lZ&rO}VqgLa)fz!k6s;;X*loGc@qk-}`)ogMXZ=grKh!Ph0(SG}dG6 zu|!zS?$n*UYtaP`$(O&VmZpl@hr{7m47NbLw$Z>LS0PTNqh_-Gt8A9Q4J!aJ#eB4v zTJ?|36VC`zVP|}?b2_>=`0h-*ul7|uTyC{{q0y(YNR^$Mw0ZRy{>e*`M`bn{1iO~> z4V?n<8c+BmtEBZJFG|I$aoH?6w1cC#eh|Upu6SN5;oZUoxoD!5 zjX(i$7A{^p=lZt&b4%A-?Sxe;hf6oH9|7$C15{-AQK=F@GEQpzUF1D$NiF&K1AUWN zB5h4u;@%wrgw*j-+v^oH5SWmwR9BT<0n?V`Sug-{14V z<(RVZLVCMdK&6gRXGWR%k z{gIjb^{Zufb~^hd@Z72ReRyJ~=nmQsrmC`oI|XOLU$B$(t1Zs8xmML_sQBG>3dFn2 zk~6S-IfKVmLT5)up4ciL&R)&w)4r)UJ-y!^zeS@M?xf}1W&a_rH^fn;y!72iB=*v6 zr~>4o<3Ha!_=Y(*UcbJd_1T4+e!y8P*X<|qS*U zp!nMtwCqL-U3^)#ABBd>`}%I!-`BiBU&Fy;-HTbixwiNLdbTN=)+QFV5h>D#jNq_A<1UnOifod=3$5grPhq%(IlStz^Os%i+#5F zh(1o@^s5)mcQdb(!o-d)1Q~`1t5$|JQfvi zIqop;tG9^drTY^Q>JFB=aIq&w4Hm-Y9bgdW~+l%Z4VCwGjU zQ$Fe(Y}UzWC7AonpMsC#*M|%XZ-GB(3tLQqYqvm1K?{}>IGbgrWH^0CZThMw`f+XQxyG* zcD{DqR3W3XRgpuy#@3>3SsCfH!^8TU-zz^n?_=Cna8C1qFTT7{)x?+w!(WvdzEyiDaXI<&>WpBzc!oVoYWY~>a` zVOK%P&y7vo8OHD)ZymQ?&xj=hYV5tv(tRBrbW|9&*#9c!z~L9Nw>F)Y%jFhj_ugvW z&qeDcUHi^LT{VX`J3S()B@8|UH4CDFqVp@R@6@HM&nJ&Sr8Zr|XLadtGjp-}>X6#? zUA44Bllj=t$33RTD$Z>@j}c+Vg?QW;Yiq*nZ+?dO#h>|4?_c6 zKftygT|(@rBzL%f4953yF;Tp4^3lSG_~gpKB0jiPA@yCt5{@H8SBf3Lrq5{3kAChJ zPtx9BduVpkY))L+?5e@#!)pQ8<66=sm|f5?t@%(z`XHXq8v2|(H)FE<%XE6*Axfac zt}S;lLOUxnZXXW<6MXG36uy1<7&pFi5ZG62LqsNUN0eb?yx{N}rkZSP2jSHGV4 zc}Ez3h&7S5Gx-ls1RNjSr}A{7RP|eVee0h3yKNZPg+NgFZ>vD-JD}(|i0=}tE#bGG z8EZgGA6Y%Ay_**0@$-z;E=_BRtbX*K1R8`l^EHu8(dRYB07E_?;b6c zgRAv?ilOEA3CcH75JgVgplye9`{NH_`O1@~pcd^qCY zVe!Ai4m{TKZz@S~GJBU9YhbJ|xhXXZ%kyfF?_Xa|y$SVcFB-FKA&3j;wF}Cur*`jtsaxAEwSXKA8lt z!oe7h%3I0-`X=@G5Zf_KbHl^gYNyK0Fp`6`iMk{ZFaUGQw%uSyh8_#iTtC@$EdE=4 z*qFQ5i$Oy80=Sz7J)#jqAjvFw_}4!X&z4Z0yPJdWaW@TBO~rW#8T49A$oDWKI2LM8 zgP(3uEq#X_xw<1G2gxMFz8Z909Ff>3pr6xbsC6Zds%maW(Qg>)fUAUBwp{su&vkZ? z5g&r&2SKoa1PkiR(s}cmzSZ2%uQ{VU5Os&y@+7QYN%K;+!y5=|27bfqMD<8zHA2mq9?12 zlet9X&0v&87X(TW?tx&RSNH0!``-;lypYWkLnbCJlp-T{+gPBE(uH~#h!>~$Xyo3` zL>nN>P|sp7D>OM`oXq5MB0`s%Zh)h)@Ci zLtmlzvGNA5qpztu>Mrb$M#nzzP_}uzLC8PLW;t z`Mo*M5pJ*hHR?uViXa}qHI0CNw>ya`w*JwzKQ*-B0VxQNw<9_NFFEtaHqXq;6x0lw zoKmaKvaXrPMbO-AEA(!zCS1`{Y%R@*G~^UB_uZgWg<)%Ny-}fi)S8Z)$EkVLd(%_A zDtr3^IZmAK+6GUPk9fZGJa{4OsLq}?v+Q?r!6|s3HDu*KhUoGvr_x22EgLQOhOeHM{Cps6I)4U*!~I2I2f?>HN=S_Nyf)ZFUu2 zm+)d*XWUCwURx(|p-DL!xj!4xQ|3ChhTzcl+J?zl{ZR5btB}B~7&1BJeBHsMB64N` z)jB2r(_hB_Sw45oEQzbndRFLIqV6I*y9#&u!)`virhd|w_>b@m@4~jSdVK0eR5aE* zpO6%T-RI4W2)MqtEslQJnRAS3gK<}Dv1BD?y97dAv>7V@Bvu!#wM0}Yx3X<84CyRq ztutLNP7U}=es=q$sPF7pTet?D5(+%L+kJ8tg@-nJk>RP!O0$-7=3yPB7`ASAYz^GVw%R8HR0C~^Ee%sgD+IaUc zlP=>Jl;j57oolQIz$P27z!NFTL)#yJvn^#i8{W8LyqPd!hoG@QqNJHGpRAnelrX&A zU|3^n#%W=3tG|GRyyJ!NA%Ip15EU#KsKCw4?H_M&GHsAqyw-Wm$n>G4lQRdZNHE_` zDz1WSl~Q4!)~!E!fbw4O2!RvT%ICt@(uF~U>jFoV1rP-w_=6Hg4$vb@kOepHq*@)F zqNFQOatSrD0@=IiLc}is5ddm@n57-8#vGz5gAd=`1)#7%QUrja-_qkiZTaA~ z;l?EHp3&1OS6jDz%5!+X2%0bbG4=^*`Bg=or??vh9jJ31&iopTw*8 zhYi)Y>o0vYC<_hLVnSU6eX2$ylJ=uW#-OcMYB;uQB^T+ygy@hFLeas-kGi|^RFOPO zW*6ljukKU=9M6SVEHJM&s2>YUV-3W)#0gu^Cn z^J70V0Nzv%)uIQezaP8(`@to{@tIv?2{SN55>$e0w2clO{dP~+c1OzQ!(Z{yF&m%@ zZRb83GR1%IHT=NVC*f8QX3U4DScC;=x{G{9MRGwE02Fs1hFEl$xE7|65#?|0)jVPR zGwc5)a0>5VYL7(>JYk%(4GC+T_7p%=xUhyb!li1gcKtL*fN<(6crvJBYJWMgzHRp{ zRG0uFD}dN>u~{3+Ln1qzl+fi8+cbC(4Hi_NE}j~3(OV3i^;lZN7$Us-O)!KnDn7}e zBiwNi9Ou|O8lwFElhXqDRbL6M?k7pN6is)ED$M2*2B?YukyIb+{;yrZ^TfYyYQIxFZ}v_9%)U?|XDH`N zR9=6qFoydtWavKuTyXwy=>I^5{$r&Ujv)SBzCSoxF`QB}k#>%sT6LRMcPsDQXlC66 z`}|;@FoydVFEo1ke>U$zEA>=<>&%(&2uRd(~Zvc1g@rC~{fSd2Q^{DIiO!uwDraNz1MxR{!S4sWqmT=xazTAIz zwOcrEpLjC-;N{SxXa99j-+%gA=rNcPZrdNN@}`zXXFmv42KWCB-99{gA{hA}p3wj6 zpnknR{V!7J)Bhe*fiRwn`rjDOwFLW9$d-1L{Xq}ru242kbbDITe(MhToB7LLEfX%K1ZL=!LAjqVEEWU+JNC>1^@9FM-F$ z$Hhd^SQDCj>-}v=(~sw5?**?ym6E{V zBT2!hD@`IsVyl8P$BUG$TjXrkFC2c(*q=6bg+ZA)t0snb{j?D5xJ^>aGBJ`>&(1)! z7$%!D)SP65b86zxHO4Sf7GohstoQwE4uKK{KDoWPnjxv%%q%?TGKrN}+WmqQpIs`e zX3UzYiCkd8U?E~@CM_~#2vWt1;Qz2z+FeR(?@ju8SgEY4$%5r-A&(uoY}Q8~###y2 z!>E?`-W>CB^y63h5tGsfW4?tgDelC5Ykq>*>7|w}8&XRQrazLcPe%{Fx0m0WXpOor z7bH5Bj?qQ2DVh=7=WFJy!28jSxQ@FxYyFP!De|s*QufUTX{3eT9kc6r@Cx%;f<`S;I^* zlPB{_!{6Q5vRKN1oD=?)^fDPocQissF%AJx><;T``&tk)U?<%*HwQuTt__DEHJ4cw=@R`mTU5K;)CMsuw73Un z`w5$g-JjWQt`Y27d}-D-mZ&YapHvS^tnI$xHM{9YE zN$)qQAHiM{nHqV&)vLD-m)zrc%TIc4$MZpij>KPER)S$qtRwVKWV(Mo|9M7ln8B%W z887nChfI2-HkX)IJO`DKcvB^MW+w5pag~Wn%N0IEhpr54Y6>XdaUa75I&Kf zE;ju}NwNyEg)-EWR~&~^wdK`Du-W=15VSLaFh9g3%NwbRQnjIJid;ZozF?vfIXFEq z4VPISg&6afR2!HXq9(w}QDYX8&TPy5^ANOae1+-NBKM#N6UB|+5QfO@&kEj}tmo|~ zZf@n4BU-q}3whgoaxcnUON7vWyl0E-CD{KXwRGH#KlC9VYd7lTfej;v;QW}-fj;Lm zA6x6B1o3ss1)L;LSvCl?%Ag16m<;zfdD%j|p!kyL!SOngd*5$4stWX|C{FJ#VLUR4 zD@&VXLF5JLJjRmfmh7Y76-}`7EdZhb7btt1pSh#il@)bEgD9;5hJTBPX>wi3+YCF; zn{bhNOW-X+Fi>O8Gt(lm(FNEkp|#dR8JTb|p@xV27| z#2)F#j~<5^ifWYm%8os`e!PwgQKm!0K~#I=w~`&6q)|C#qY3Cnj=j+XjqjnY)+BLn zk4O}3F+e7h&_{reqiv;o2|L{%0NcYBb+l_UpdG)pFDiyn=-p@G{umPG;O58D@N%K% zmyM!YLd3`Wv$DihkLn7@_hMH>b#L-uLyObm2O3c(sFjP`1B)V`OU~_(wn44f*|HM} zpr#4rM0AbYp}k!~;EY=p$Q?&wWt?6IUv4K#9p1c6&l=?v)^wzXik`m#x8>#L^|w~) zjdAr4Q$``$6x&C(ra!$&Ki2*7F(6r7;7n~H^KtXw1l2h z;z=J7GemrHV_*#MgvZh{+3QA-L6xnRl)vS&O7n>@LE?88G)lN;QnZ$_7FdwXosyjW)b+Dv4`As~5az4HaO;g0)wI+YT8 ze<$2W#LavS-_y0SJ&h4hHII{Q;DdUiX!*7G)43sr?d4G%leQ_H+aR%Fd!O_;y|#A7 z*>%9;^3T+Z`fau4lO{OR!w3W8AzT=Q7kQJA(crK0Zo#y~m@~-tq^FCV|74=pTN&l5 z36tm3gTb0c5m!MTtC=byD>ddw7;i!E=0mn^4FCalP~%*PK7%J+K05yqI>W2Z&ULfI zxN7F(6f0$=Y*#I(TV`1ut8DSaD9iz@d(2bCVD(Qa0UMt$mUQ1;-ag6f&`JH0&TR`EEoKQ29s zIqfA!L|Jz|4fbdzVeyKG_9QXzEt>OlwNCf4U!_aE_?>0c%x-tC{3>HDNr*PF3Odj= zW@uG^J#U`n#OM#&=GEma{Z*1{nJQ)3 z=3=X?43qAb$W@lp*sme#T)Det{g#2qJ}mbJGO(ny)8Ar#3wi~~{@Bz0<(PQi<9E>q zP->!Ud0(+C7>gF?%1H{QA*bkAyGHsO%2LZyThqlqQ^zB$L__$|^2c+2smiVf%^OuT z9On=xW3+)is=xnfA@?iGDjvLNG_-9bZ%SF4IKmav^L!XusPpN?1FdpX;;z(XVyMaI z!PrbGOJ4U6HmC^Uki|(;i%TDYd6pb(w#n5f!E>dz{p@V(Ro3V2ev1#Z;0o*EAbcI- z_swGZseuYRWet#c9Sok^iDnbYk~1(eR-0ugn+=h_6b!vP=H8~2_BRc2$Nq@cm3^}2 zs8GQ{9hgeHjo3A{lPX)ZlPeC+tPL?-*U1Vj;-ETc!wcNuiFg~9sh916w;=xC!n9a$yN4@qtFORc+Wf4Ki)?In{o(tj73mBt`GJlT+PJ3KHCn z3}%K|W-^5$6@s8XPtF~&`(2*JI~kg6Ru&ndzcXxQ#H3&W?{BnC0*9@-%K|x&U1n%q zA8^Z|9G69QawU_k1XeL&LN&!y=jU`e%OS94iyF@m3AK1+A-V_sO!v2=B zbfB_q{^d_Nmn8(g8HjNt=j?;3aaU!Igo}6K5R62F8M;~!Ic2yHBEPgd*RSwbOK#zS zskcqiB^dQgob}>r#XmnzE+x+e_NnhF7|7k=$qe~= zg$@_yYoy*B22scS^hsJaJkYKm|M%U{dnIR7JW#>31MjXJU9UtqGGWhbwzeJA&K^zJ zCE5ZglH-fXF>zG#_ytZRzXC3$GEQ{po6Re#KWwN|+Qo?Mko0=hjM`+Y+oDTsE%t1X z0a<`qB!_V2fdjIfAR4uN-pZCvsMK*Vc)xdYZU5n<0{2{+05K9++wPz zdBtd>%pNHCXA?E*E&Eb3Geqi)M}=pcHt2pW@!UKkz4&asDS}sph>+bo`OUGw-Gf00 zdo<5#Z#8av&q{7`DC$b@O9`|k!GDBDx-Dd2sXC z$%Hf9i}qZrZ%1b*&$@HyrMKn+r96VewZOGvsD4##(JWZAC9M#_XUwUUsu&@T8u~bK zVF@10zLDB|lB+Ud*Co{H4HA}azKfm=7y}J|s>0O*^1?W7Wc$qOlmmT<~2A8xFkZb=FLxmz5#SmkVH$Mvh# zKGl!%LOX+hOlnRKmUqXUO|Hy2h*jNqoM_Fd+OonXp2}G z^Z|-lRyodfEd1cIBgTw%O6SDiz$KG_#`zI2a|&i`MA(l_KTU`45SC~__Rq@7rGQ>vo3jo>^ek${=sXD(^G*d z%f6;mbL<>vp-b1(uW#A@A&6nBtus~CsqTZpF zoZU4a$Og_mkCN5>yRZHtM#<(Oee7g8;psnId(iI(R%+izYWw1J{xU^%I~! zKRPxacfB}vMEb^ojcW0^ty$i;u_KbDxZ1ZBX6xX!gtq-AT_0*H-#xYIs>HM98#daF zZsr+KXrS*z_P3;tD5?iZS5_rl?2Lv) zk0MCSTnYEWk5=bcG3fOAvYQlVM$w*C%b(9%yUup@-aF#o zRaZbqICQDW89e%m1w^s1C-wS!uqp}*kiR5OI%f9ggd3g@;df8LCq+1Z?RV-hZE<7Z z-mdV8Sk#T~=KK`p`4;r1sQi?>p15n|AGq5&jX39p60jmVED1hB5Z^dIMDU zfen-(z7yyTy#>!6-0qbP-XG>*W#D!2r(ja(0n?gC8Zq5Z2inZwseb4a;d(q(%#~rw zy?Oafm!4=T#W@N<|E_yxcf%c50vX{)qOgAdXiUu^=4+|4duW8M*&7NET@)Ul zw2X?O<}en(!k7uYml%f-J&1=^*XILUKSBbyFK+){3^uFoZxhK~JM7k}E>#mj|tt%Qe(_Lm%y!BO6 z#k9kc^)PGAx?2YRN%1950Qc`QA_yQ_Web$xNcFlGFEf|=OG)PRy<$RLbm9Ryh+EJf zRg8MrB`DN)6YQj%;Nt^d8$T?HyQh^66VHTodM-|{TqInuxW)-+fc+xkjW?vLHyI-2#g)00>DBLw%}&y!Lk(E4iB?=xQ+ci1f;=(o z0xp;KerzcrlF=W(4|x39Fe`Q}6ds_nR!zMu8S%S$;R<2?{GcxC3T$f+r?&ITLc*5C zKYhx6ucX-;hdPg4i~a4WHC9%9*ifcbq){vEVLY@ySk^lm6{Z)?&?Ng6ycBh>`aSm9 zbqsVE4U8KqY~SmGa{bVXm3*Gu>sp&a3-EA6s4=Eo27@M6To6t>(0uZ&25-*L%EV-+nbZX!dR;Y`5dS&6I)@x}Rm`*|3OFT@^m8 z)9^<<*6>j;q-HmG3ZmA77Zcol;9g5L$uJAOye-5O?!9mdK-HIq!p&#(ryxIW6k)U= zP=$q^*DDeCY}wW<^H1G^^R))Eq?B#Fr!p-qCeI-bf-n|yX{|nZc(%NvWng@6brW?> zn`+YA&FIOf+_cXM1x+?W)W@_nE8aTI&ZtrPzDddHS#7!OkBM>VH!U}P{Pu4t=_k42 zrufA5xOi1e>PN-DH7@i_@oh5u=1j9Po1&X2*Eg@c)lqMn3CUD9`~FGjtUjOH9P~O2 z9{7DOYc{@TZIB|O{$Tl<-89TDW804AOqV7%bcy==hFbSTp(tCGlE_sk3A=Bfq3%-c zYFG5sI_==?z67tae2#O4$sD2KeN%^VP=FV?i$N_Z&U?7JZW4+rsg1fVFrFUH7L&Cr zxH+9?+HO#{|9aBVXZCZAM%0tP6M&6OY;1r^*xD3#FdOGMY4TyZ$+4JVQ=zLnW1r6< zSOxUWF`DvZO%5qoh0k92Sk`$v{e40VB`Xhs!fX*XIT?8`??#P$+I-I&;pCiZTsCM3 zaVQNByDe)NJj@hPvh6I{dTHira(VN58beGjuP~|>XTszJqdYGK<;Oa9VYMc;9kWsM zQ#XRD3|x~|Y4tLH0 zQTA=E8pY4B{DRzZ1Ju+=;$Mff_oexhrYMfL9Z^m)Z5!MS^f)c!9Ab}l@nacB6P6P4 znT74-p^UYDdzlwM8w)Tb{1lj~sO;n+TblAXWH%?*y+YiMiGPd~!_#=S_L227QK0O? zU^=IOk!88ER#A!FN?sU5%N$;Wm&9*Pl#1kj%^F-#^nx35;oUMTv*LIZ+cRQTzxfI}3{+ft12pvB zV7;JrY6$c@&atbTUxv364jm`E)!4`~mM>0NO8QF%#7<@U1|6d;(8{_msbqpms`C(AJx3>5!Mp>Hs6LFeKZOsk-0R5x_I?WUejFU0v_!f`(Z=<*~Qt zlRCA{x6RSgUo34YXpu+JNr24_|7f}37M>8`kya6r_G0|L|Etrwm!y00L>?Yjd&3O5 z((C35F;|Pg+u0GRWeR!HWOFhZsC(p`G<^=IvU14sJ3k$*GI^Ty-mKB!>{IB~GuCRF z#*29~0p>CGwM85ohKM!6#!KJ2ip&Fs&pr@rASUW>T<3jHX_+{I3%BcbU*FY&Vgch zg|)4yXXGnJwO}Bi)&?%NDLuTJb3yU=eGBn9;TI;prVY(NnF|QG&YiZnx~0xSC! zqv`KsQM`*P=NLP~cw~$WT>Ja-e9@_q(LEKBrA8~>cYZJKJ7P&n-+d%3Qz4B9GjW7U zSXWPYj(h}_w1dP?VZ8Lc6Jc7~w$ev~vy>{iFqKWnekO)rz;QrTq#xK=UooiP{s3V& zXY25qsKzigD5Gh-Gjum|km8f&v<^K)j?7A{@hOLH>+0<_4$gnGwL0q@FBjmG9M6re zebkwGE(`0yyCb zsgGH57w!Yv$wOA@sTxZ{mq5EPEzBXOE1Cgi0fB6q5-wyTHaS8LzSna)!q>k;`w zuMu9%nQyy&MRuCMN=?OPIbs*V6yf!nZZx>|{@7p?@YhhYueLn1yj*jR{BFsYB`M1u zRNM>79Uws_3|*7M+h647)ntgb4`>gSbHN>cEYb;!qoc3vZ8bW9z=dC|ApE-4dUojv833*PE0SYZDbEVq9P>+YSAJ;Kh~ z`tW5t=4FS3PM80(+=R{bQDJlauQSIb<@(;F4v&;eK4~3+$GY8*_j#q=5Ej`1r>^;* zY-gO}d9iN$vaTEuLfz6Yg=Jrg`M1};@$ZpIPH$A+mDtlaV+%SH3p^+l3czSGL}%J~xt4H<5mR=s#`vgUp7J zf(sJ`jnkPI<}zEJF!%^8gIX^|F4rrh=>~!YI$a_jLu#ke{$#E^IL-- zn}*(WjDGAG|8jYBspsC?{=4tHCqDK~F5eU$u}posJ-OC9vvKpjuv>pV{Ahlh|MKqi z%ll7X3A^>#M{fqF-j2+C9De*}a&G0(lMnaiKR$S}K0LoMHorOYeEt6GpAY`++272* z{5bP!`Co6(tF`HW8FDMHgjM^}&l%xy%j)LK|KD*7@PFS+$a3@kKf!X_XlmV8(lFMV z*jm=w>=!W>71B5a1(8GfK}=$Hu|-)=n{`Um!vYKvIxa>?Vg&(l@0443P1DcrD1UbJ z=lI6H5Y2=ddjOT`yvDPD!)yCMsI4Ar_% zp55AWolD>WH|@tme~&algRjBqxtN33PQyVMmY^McF+@jG+C-WKXYj8|Yk6t|tRQJ~ zoQJwGg#bh#0}ZR#E?Eudf-qiKj8mHEMcL4=jLI@42SOJC8W|W|qVADvN>|cUmU4pQ zNZQ%Xd;Lg6=&Q$$_5!i& z*XEmqMHW2iny17zQ7jAXJ*1u|5v)D$-gmIv@E>_k{;^c;#!9jNp*6zUmB6+?)pl`E5Z17v@FnC+V3u zZ?7qYVp(>{yXI|6ev0z7wO$kIX{@+_=mRI<6^!J(3#=eGfy;x--1N@G9p+8lRp+If zU=;ZF0#nqz{M}h#KzN6c_SP^Jm02x*nM7RvatlqucA;Y4+zq}Ys$%ZFM*@QUW zxfN$Gdf>6W4D_py04h#ZF9z}cWSm_HT73$RcX<(z86idXRS%WIFJ>!MOUF(X;s?Gf zIaW*#Qbf@m(oaHA$=NVTf0p50uW~T6)&U|+jr8uAXzd8csK`@iZom1mQ9k^qEtk#60jUWtBgi#ix$RH z{gf)qu{!7H409ANUI--n>6}tBqwG7uuu0TWD2|^9`*`+X+$j1a?@ry~uPn8SN)I&N zp1}2w34P2NQ7p+#&!-6E24$&HRj<5d>g2+^i!xn|@fCE|dLA($*#@4HbV*s}q=@so zKS2wZSHn*}{a)i2hxQ_8$i$7f7Ax(kd`hsh(5kRg#>cz$GXS$!ewwt}h6u9yo>NNWgb4({A@* z&c(35Ol6*VY3oiQcZzm7K6RFZhJyM`oxmyT=Of@jxSAG$#nCNq~DAquND8GoIA z%}Uz9x^zGsa`RYXicc>XJY#6tI<44ZRSPOJ_uTeVSLQLL1yml*b9s(n2|mjgOOhQ)Kw%+jP423NG_i$-aM&GL zP_l5GjWjbRhGV#A3W0qTReXi1qogWev@gvomnc0{j|#Z&i>o8+un7$qI6ywG>4E;t z(~Y*urP!%=XUjN}xBs=3_&`n^g0m_kZ`bsbrH~DCj*r@-CkFZI-^o_~DcP9)o6Z1W*!K%1apM~P#j6bX>A0+jBupaV8ZEa@?{ z*Z%dr;)yk5TZmDv+RY)4AD28Z^y2%_1BATSQJ{pyDxh7Z1JwqP5@>>Apoz9CPu3>c zT{1GPtv^%dBtkq}&_X6nX+iy1MWVzO-20_-F-c7#d%6l0;Xu09Ksg~71#Q&l`sEfZ zp%UG<0MT&CJoC*5#wIPciW}KjJKj;iadn&BZXA*0pQ|268|o$hWNQ)Br4j~euj#7h z!vnViF)fp}M>OEv8FP>itYJ7ZDJgPQFvs+j?mWmUYg8O8EGY)@Ed|ku+GW@DViBfW(*;rcb{kuMQTl}(OGb? zInpB$ep30+8G4O|pqJ1zmvOtgDP!hglP8Mz4i?EoyUQ}HP`ShDK`~iyZ=ly1ZLiqO zw=~!_G>go$v#;^><4H3D$kle;aZq>zl@BsDp(qc7ELX2k9Ex`YUcHWbmO{OXeea$_ zaKgHnSY%`V&eJ+fhHzeT5v_>9<3tZ{Adqm$>0Z@pe;9I?kvhIX?LHFefu5QVgP8EH z?xS?0WCEX>{z_rtW)%s4OQ}P;Nc@Z$&x=ZSAc6f}E9e+olIoAD=Vbl)t;S!<=h7A>#!|pFQ|3T++tfFJJJ! zG4bzEDodZDegECjwk0Foui}~|&^)iN9xZJWy+7LbGt(&&>lRA zPxSmN+gaP~lVP6J?(9WTV8z6-$8HQEEfPAQojdJwch5r(<>N(65uYY6n z4GWJV;&!i9L2+izulM$6?gXreM;wcxglFYIApNgsrz}PKQ5K5ty@qibRUQ8-ckV6& zU6(gpuhak^7>`C&wX($I7gHKDp$<4vKzwWqTkNo~YFw66BGa`yr)|$N`us;eBu+)b zJ-6YP+SFi!s3+U}ray6KK5rhex6FBf_A7yo#zB~<49la)Q&=1(hzV|AklT!hm~xKl z?v$vLly;2=Q~>xkT>LLzSNo}Bc_uJdJ~9M}`|Jhr9XTmKCB2>RwW&_nECWmdI1ecy zu#+*R!_FoMAy9~|3TzP_wvENa$l#lJ$nl+f&tOlAETVp`>rlJ)$Qxp!`G6!|ld%>b z_gMZx7E1;a9LInL^A5+aL88X6971MmA)Yj2%lT3fGf4aTBT^jjAn%m;p!1V*h0|TJQiI_0 zHRGw`=pA=+eiDHsw#u<$z>kwam_msFKx8xKd>3rD1fa~!CZqDq1Spwzl0^WrAp<;y zz!i7Fuk_071rj9&(T27%lBLlQu1d|CKD}7w<*@ZOI_!Wsu9yoE&gE>V3`TcuojF#q zW%q4IdNzkh ziAcoiA{m&|T&45fXY7dRSl;o@AMST^tdU({bvUk(4o_`Si7$(;WoNk^vxMp>3EO|w z?k$)c*13>`Eu+H?6CtV0Qxg6@R91)$5gkQ>nbLFCHqFoQKq(DrnJnDpaE5P-GIiWR2b;}D)Zu(( zIPo%5DC-2sb{WlpIoCbYMN>qjmtU+<4v_4 z$4b%$N_>7=x1j)N7xd0OTnh)W<0<46H9VCBc{~l!B9NYh9c}QtP)lMryF@^4qHiwOD93>zn%4PBD(qJ|75F#KP#CHhN&!~(!K+`SlBW$ zSYQV$7oZ#S47{-=c5HMS!P0aAj5Ws!x9(dyo?rmqjt1CCkq^6T`58KU{D~~VdlW)a zDqnd5vb+LmcZ@9dj0p$J5kSult9E#SU!h2MAN&bAXitainE*GI|E1ehtvg7gR z7Y;?RtFy^2b!%WbhuWvsDaAgKI4*afn)^Jjv*-P}KK~jh2_AS4XC(kod|;n5Rvv0+ zW4z-;G5#PcO$tEDN^PMJb9)xdu=_}sXZT%GB-bgNgU?QEo=ba!(-M<)BqiNpS%rHu}f|}|0?{b1wamUV${~TgTdGkp~XA%nbAFe z>|PqI@;$1c9eaTbDcaxBrhV3nvps>pP|PYO4}63`)BRT!+4OouC^V&@j6;u8Ix zyDJj6o`O-|(0Gj#SDdlzayq{FM$t#>J9+`5AGspO^9Mz4z7sxy_Y6gMRC`LoJ9BIU zUn`Rc;JBw9*H8^15Go%TnRrDj1eQc#!53}kj5;OUF*_Cj&i&4S$b8xMtQ`)3d9=)} zpEu>>Q0*3e6EWBlCSs%HkW5#VBMt+#LS_(z!kZ&5H1x%+lUHuELv3J(;u|H?2cb+w zsDHmt-fhXH;pJ5L*9lx1HvozSiIY2Z6%3I8@`nTd2)D;efarfKM@_*hBpDRw;*4~Z z(7ckzkvAhwm**fWL0<2d>jbF4TX_&|OOV;aLZR2t{`9tKA*P&Oyn2 zsP43e-k7tz8VufGV;fV{t(Fs0&ojG%{umw4^jiGu2O!M#ZMk6yE)7!rf+IztzXYvHPyu7V1=BwfhJ-w=h)d%e-;M5;iXA+mEe+*E zP7=09lV#S@uslZFRjt6^Z#54rJg{XTt$*zB6|Fw#yJaNF*mQ=0n?J6W z1m;9FAE_C<_|*w_DIZP_CKO|0ureKC*t_qfxa_<_x)nyy>a>VXrNg9I2A3{kOS`~7 z9`Kc&I1UT)=I?W1?f0WxJN7`IRL9&^?VbyJ8Bk2J4UL1}*TRqz)hF&rCW^^K{QzOs z*it4U>`jzx+~eib&BqppZ>4fOf_7+ZX*}^9K-5mn!E9*eyh+kR#;$TT6pu$`poUr; zr?s+>4B=0p;>lQ?WOdf<=)p;_LkM|qnb9tikvOdc*jQuJ=?EDF2HOlOGh!KLXXbbB`?#Ou*f00-yx9B)yhyUv zb$+hzc^b{cWdPpVN!3~)ZWr6k+WJgACeSv#;tf^j%1&ao&KlEYkb2|e>$g$0tDqD+ zow79Y$$8Y#9f+X$q4>c*gdFX0{)Nss(o*rHIKwbgDF3r)gAU`F(agQ5@mDSLFLY#p zgYO_@1i=efqz-7lNiMi?r88$$0Ny=Q(D#=pdyNgQ7|&%sr4F|WQ>aa zbXkYC8E}*#`1#PI^1yxJJt^T(w~L_`fc%+9d%&_ov9K0Wy_gyO5C{$NPl&1KS)B6Z zw`bve>=DYjVn@AGyizn2i3&!uvsTb0yCDMn>wUo0j+CW{@e}`v;n(1}O(wJ0SDzO> zml>R2u6nT0*FFY0ByHE>{_a`4$TL8%b;s^zgXH8n|~j9j}4(#0xl_n;Hw;oNO{ znThFYvPI%2tb59t5l!-8#=vsvkLnede>%Z~0Fe%T`WQ#?7^RoVb0>1J+a0&weG&7k z$zO<>D*z`-E>P35AvY=F%545;%PkPm6@NBvOAkU6#}`M8}sBr_#dH@z}+=Tg-^~*|6!ZCJJ0cXC}P@R|CgowNYW6Z3yCC0k!sKRZxLSB#^ z1Ckga{mhRG?tlby_trV1^-F>sbps`CTYa}Z*+>-xtNE=xoV$)duF@j_6ds2P@Q9-9 z>(&G%Lu-Bes_m689}bs4q}?E|U?>N2R;U$iKe%Z4NuU>Qr&`DBQ_8l;ZH~BoUT4yH zT5>-_aWvlbi{^6-?eWCq(IBAgl;vAkbzcP<#VUlOx>wQbM2N6Z(OM?LLyid%y+a8 zxEI!LY36>JDmZV44J6vsT$U72Cch){D@rQhO^Xvf5?-C8LneCDKyD!#qy~+lHt6Ga zF{`iBXSz*Ce3ss8nAudwHM|8|%{toJXJ@FW6>jZy$}&159P?4}a&^|M z+RrUEZBzE$P?KqvJ~QW`DA1858)>@QUd?IKonK~n!d=4CKbv&QX6?NDv@T$GC{MDY#ooQizeU&#Ta`6yYKNS&K zEbUYZ*E?t-(a#WoQV?j~A?J@6hg+BZ3Na)w%iN-HtCbB9Ml`VncQY3qc&@HGc`KX2 zD=?^FaXe;Jn=5A4E=JQr@HPj`gGve{Q`Win`pkor5;?{4UhG@7FCU;bYQR{966n&b zP^w>9Rp*oM08eM+1zRN!nIY4!Ta~#r#XHaVGO(Fe8;!#UDD`)Cz7<>dd)7GR&58x! zh{JWBMxd%o!-r+R$KDiOj9vFN-{SGhvEYKa*)I=7PiPHl{sxmZ$;b}IOW`z|nexT< zhGBOgH%y}iD6<-(1q#$8!eh4IhYD!g6kvmU{Eg@AMH=*Dp*q>7Ih(nZF(ehnRA=6J zKcY2pyW;cE9)?LpsP9?TRcjeFmedZ{$5|Sgx-++dW;korVIocvwZYDM?Zg`~HlHC! zyxAC`0P?hNYFJqlBz&uono1ajcYw?{CQ&xJ=*yTytIm9bd}*nkCzxofhq!{LH|593 z5jq>sBqahlJI^82ZRVqZz%JoQ=NbUV1~jZbV*}EuX-WMI>3WQB3-1;Mr<%BKvmyqM zRddL|L*IT0tPUH;z_$A6b=`9Kf~0`E=7s`;qmZTHTt~v8tqng@0OXVmb6D5d!7|?m3`7}*x43#1oB!by9-O^&IXmQ{8N=eTi4Wrw#ywr`faB8i zXC?yWZFWM2Yy;-9kFw)Z)i%cp z#@{&sEmU4VG9XNAT9KDM`@p?en#jaNi_I8vd~W*gLy{C!cgqm@lroFdAS8dWcLBHQ zLu>eb%0UVRgeNevZJ`;IdUj&fsQlZ3FqSTXskT*Ktvl$Rxx7bF}Y*Z5yBH=~L^9A(~ip%3$;v|c}s zrXD3&`cL~z z3pg@Vc*Ouw!bO-W8MdUoWy|(mmUs$gRJCYdYafni#rA_5`;xp3o=Z{Vfdb6~N*#dA zg|EH+fs`dpyqm^yk!|CF>TDaBRofh5ZlV~SPCqXgd;Z=Tgu&m*-Od;-4_aD?f|9~u ztptrVsI?irb+Cgl!>xRsDIPXF?9!>CFG4j_2GJz);23L0Hw^;y$ zB(SwK388AOjg~ZJL#xV!#uaNp>wq2`@Ajl^ZUgv``K=qITy#*#EU8LnRk&=P2O?*V zTD$FzDiJWZ9jH;?aGf{IKmL@{RQ(hgFQchDn_IY3B0fd-Mb-W>+*h1H-WB$nA$0zL zG;Kir8OqI~vGb3D+Or=jo__~D(6#H&GRt=kzk2HU*B|hpi_H(4@A7D}-PbH5lLM~- zCJoO|vlf6upzQDr>3qIlYQP?by44PU;`{EPqi;(THBahhPd`ch)hBny*UZajxVm5e z0^W!Ajzplips3#K{mJdJD+P)_T6Ry_gTmU6YO8VXlvuX`>}0ZUbSVz;<#xW#^;afq zl)yqBWt+^_XI6pYGfwwoDp-!S4u@7og5bxWB@r1zpH@6#LLX0fYoD4IS~968#NY}yEZ>mGyfs=cK@OZy*l1vo(S^8o#qlq$&p=`~Y^+b#6s!EgBUmKM9; zow;Bq%sP8nMu@?1C{BiVmN79ah%s{QRJl&JT(?ZFS0~r+lp74m4X5NrujIxHaudV= zg*-qt8@Pq}KjaAV;x4(WfQL$V#7W)%0Uj59k}j@Ex$s}WBlSPPSlpjh+Ld|oYG%c?V|@8P%tLr<`#*Kjp&dmdvB!rJ zPmIQ^q(|wUe;T8wRMO*KnyPPbdgy5RaQfN1|K&X-_m9>*I(q7|;B;4Rc@OW*718;t z1(It;wf&_{*H51tR0R+ORWebPf~Q*gS3Rf-AQU#;J5f8C-SAkYK5`o-Ma}mMTb~sC zm--kLtJFu^(AkTlXQX%jqdtl+DgIgg_mBFRI@>j^QXf^9ltt2+6P>dsyJsqUU!Cip zt5VsIj+-j@QKy0*-J{LDcU!wBYkO6#QWgA|uDd$fcI`<^|5(S3f8a;mjn@sb=?k)Z zR|bCR9k~BbxAZ^opRL4>)$rsLE^g5NM6H`JR+qa-p7tlI3i1Ur16@-t;lC>IxR^#hE4X@!9E{%{b*_ zTs{C}&wJ-s>k)5n#>OiU`fZUb$i{xJUNa2qI_m;;*O{?pWtqB-Z#JA9ql4vUF^*e< zB=ejsB+{93Q!nASkx~Lnp2YZ(D{*Nit&Uw2`Bs_3bY_^D5Dc_x*T8M8c5$ZE>6y${23twg2X5;|`%`l? zNELZJ)QSb@K51jNBg!a!ejM9w-%do4uE`%YU8WsS4fnP#h_lqGnXefoZ_a(yh2eEo z#}6ee{vLifS;PZz zA!+m6z1LPwSZt0_hU*^X_H(K?O#RV%EMCKqg;_DCWMpH+^Mj-?=W!oR&uO+d7hk8X zU0%ACKFH1JM;6;O&&h8a?M#yAbgf@=(^ofnnvhE->q3%yI!sm`f6d>a{3UhI5AItZJHAZ8n<;ETKuNd+hH>{g^l9phoHLo?2n>3iBkFa;w_& z<#FnZxeSdB{eB01&h=B_VVe!uV0`K#h_iy-Es5>MO;tCtI^xyyjeA_8Bpt`F;e(oo zQukoaZQr9EzTN7_>s6x-t;hSecqVa1ZeBJp8#TP1c8ssFW3GDC24(##0Fso-UY`#7 zy)}=Q_wYK52X(ItePg3$3b#QDgE8@M{PS;%_VvW{-EL}IyB0IJG~p%=| z9&$X(3$nM;@{0j+-kyB)rXP1kY!31bRlDkv=d*g9i*ccgQrD&CxoqE#|H+A#%ck2CXBXn?gXqK@Dr^Ck@-^(!Yx8X zFExfp*$O6xR%fr_&m`>5gza+{=j|fKkiwQI)8T6yasrwXG~<(B>(f$1I8|hV-ZW%K z>%bb(OV7nM^K`W3PG6rg zgh8zHD_Fj3jMia=?Cttdgx02Pt>}2UF_sOW)0sr5*w=g+z=ta(BsD@7W~r76Rs7+8 zR2M8)r^E9Dmd}uC4|6yBmh}-5JCPzMJ1NrK2|yx&^G?C2e_7pq8nkg{gT32>)ojN30qN9O7R8?vlzw@SVNO& z_4!T>G6$jNJO$$zoAst+d7^tkCDxxq0mI?nSX-hnA`S!X6fuma(Zlp9Z#<$7WhGd$ zkeU^i_)2@BMM`BKcsYjT=D+907M?JtiG|j-Dy7a(io=1Bm@SW_oBovQXq*j2p)WAZ z@ilOa;UeHlkp|+%LHOc?8r92RclRlt+t6ETm{>Kk2C^@R1<1&J8N-?-WX@8wk%X)z z?k`ypdXdoUsIn~3zeTFmF37{u^Kw!?0ilJg)mES7C3P0%&VU zJZLC$0GMT{)%Fai{Y|*+yB7dq?lRJ4N)}rABT&*4jX$IZAdYgOguq;tGkV>RRDzd? z=0qPQ5tnLDSce$9nD0LjYbnXf`!=L$Jr@+7vJTo*lcT17aM*6?)qLDl{TvPWS6B_z zNo@s5DPMQ17@oVkOy7{}fWus}?1Qwm7Imf-e!$&4;=3;pOF^RM5SP~W*(8Fk{xezI zP!MQ~iRrHF1+=Y#bJgRAv0sb=b?PGszPs-iQicaM(eL?aJdGw1&oIhMk0O@wmA|fz z@^##hK(MoWT1LlQ+7tu6lHa2oT2Ud}cT#mbq$2N*ckj@+G5uhEHt^)H&jTl4I^o{e zjA068Fch!}TNgAW0e1AS$5iX#!j8}`^9EyA%zvNYMg=iTe+?g#Jk2wF;K@hj7mb&I zYu04rgf1IkIMBG|T}~k;Y2b}%4MtOqt2X&-z#Y>iGg!Y{3_0mhEkNN;{zPobg|WdZ zli>X9#?`M@Ci@!FQej!E>xM%O`G4IQ%OrDF|nGMu zl-0?&pm`o89jcNb-f#dM9j+k`%i(5-iqY$2@Z}K9i2`5F_BtrZFyr8U@6yR+WJ4ev zodnPUa-$MS_{_)ikAaNC?uxxwO1dF`lYNr&i(2X%4!B%~E;H954sHY&A@_OUDJ;ij zJm<3{ujGjNc+_7LKn0zU zcYjmW9H|vR6FOl0CTO(`jAR||mf$qwqKu+g=}~_E-XaYv6OaoSK#^9-sKc?w@FZCC zA~d`Pz$IZ;kEb*&hb^9j>>KSwNOWO6R&)S(-AJgCBJ>X!pYj)dm?|nqf+sf<3%D@2 z!l7Td6Ph_VJe=tjwF3tMG;XGO*G{syh&LZclx@@J>@iO-=&=%CFAFPw4J+mnODM@G zRTu;~fGya$;StJeNC&RB`kZ^!t|`G<(gqmhv>O5j@3LGO<9|W6ALZ^!S z;fBb!Cd+_gDyWt;A7@BMCSK*_CxW*{ar74`W+zH|yAo(|jjmb3>8q9FLM2XHA0gM1vr9L-Bx(L*>bvD0K9wQe|#UFwC{ys+gumdV5{Xih0PJH^SNc-;TsuHTmxUxWFMN32KMUzi(@BG|Lbe^W73Q5I! z4!4GVC&e(f;gVLTX+^b<8lFfX{fwiKnt-8`zS;%V z>9-&BJ=T~bJ;$2C__LRM>pGxzDS%A^9NY>$MfZZ;I0Ut5Hua3UEGuDduez}m7zz=E@WqDUAF-fwapU97DFeJ$`Ewe zQK))y>2QUQYW=UX=&vrQQW^6qj<831zPfKsjb8WH(^bl*%R3CHK4%EB_x*|<^l_i# zTVjn}w~*T?bx%{AJKtZEjbGJfo|W9Wp6b!a4C<+WTy9`M+$HJBl0ZKSjEt1*Vco9% zK^P~igRCvU^9JaF`(>5isb|A>?5b*L=44p+9PGO;>dK)O_vq6whhBr~A>i^eY~Sj5 zf)i}FWOH2gRdhA>7z(@|LAVS_kt1!xEd#jzv*86jLKmQU7v#Lf_wNYuQKe)(gmwOI z;!ps+2m)Zc2}d7v-OYEt`?#q7u*ssOtC2JyP zO;!x{)3xP?hqS73n-BNJtn3+Xx<0IS?(R1eOGTq^YtQJ_UFmj!z2qbdykMM(U5&g@ z!aR?VWBbn(Y039)9vL9M9|#fk7w(0xd@}#bmaB?LtCwpPp!6X(;30oTk z<$GT4IurWEuZMJJ{i>iU%Qk!Uh3ooE6lXTAO;GIGY(%1=}_wFg@i`Q5bym!hQ}sQOB*L0 zGik2}Y9YHj@gWq%N7wVGuaaVwxARXnz^k!iGkbR$)Nk~lT-YL0d&DaTbtHKCIe3@&i% z*jH@l3s)1=tpBWF54SMO(W_&B@%=uj=_us?xN>Bv*JrT0*`yj9pA0a0kg3%k`DJv& zAee|IU%Xo%*9{@>m;+W&{FxCQKH47YQTOTIou;iphi}_Y%;Oqs(w`#;{*}zQ8czu6 z;<)J?X?V}(2lgfVl@9u1i+2geYtY1KhI@RbG0_%4Tt;`M5f5{XiQE(2^ABMFtjiKQ zBdu4pXYLu1DwV~kCs4~Oz@Lpf${j?A(NY{SMv166*SK42mwGC=n(JuCQQM~sKw3tx z^Sfhoe7yY+(rKCDt2veZJX-b;ebf%v>qe9?F!zI)uDOQyJ#`Ec(4Q zZ~$n%9X4xF0exG0=U@@ZVK3l_C#<5^9WkFyEJ42d(SJdT4iISXQ_LX8F@EzV8xEc_ z4)|rN9`VBmASz!ZvPN+d++{_nd5RML33Kzw!}D#VHV7V^I6)}hsQ(#oRa%D~0jtF5 zpTSR0FN2K#y8HJwQpER&Q=?EB<(eooBe4eO)H8c!^IKPm)FZz9Mdq02r*3TG-H5WY z@Ai~z?zn@LPU?x4Zs=A)RqR@ur=;5zz=03YO7Y#N1D}LZJA7PT#2EgHC(JLS&pRih z9=M@b8WUvcTs__g)Rac z&k6Ini;!^sOqV*jGO5dU8zDylfMRe1a50V}ENTFCEDxS7SM&v30z? z@dQAUr~9DQzGy39_-h7pv=s03Crj^uV?>}0Fp zGUN?B`Duj{JnP2J-=Rve8G7AwxX*VWDoDu?Akl%r0tSz;8Xh}Bmq2_J8)d(3sDks- zui&IJg&og;Luv@j5cB5vY}*P8Y79qj>dKEI)L1tow>9p1=ef#mZFpURLO z$IosCs3=04;o5b5D#M}YRaO6mg3O@oR0oy;`GFuL7 zWI^=Mt#m2R?`hppPo+=E=ig>emt)M*Ba+22JncxOVNfI5>rbbWaOsU zRxJ|*!jAnm<0U_U+2!-%K~rrrk8~i;i{HvUVVmWtI(JBtp=_tq)?8b0d|EZ=?DjI3 zi)x~R*JIUnlNdeU(gjt*!fR_MHA&(~!>u1mqwPT8$cX95*tyz(p-6Ox9v?t-TA5pK zDU-bgslV-DQ$n@l*8%qa#UrKeWCjoIN-y!f@(n{DxPfx{Jj|=^B&tT2G=>cH+U?y^ zG?>04#s@W0@d+@D*>abUC?sC0#o_30+ugm|$7|N@bXN}5@T8avzjOWVoAG$YUi_Al zeoY80K0|K^Ns%addLGyb3a3B*t{K7xs_QdzYhIe+fw}sCOF^NxQeab7VhX_2n|OCn z&0=mF!kN3?Txn6`y}ocEzSx+P8&z)UZJX3O=)s zr{?-10xk5slsoR}H&YDhYA@;TvLYS@V!5Y>m3%8PDr^cWc1%QIOWBgph7HG|sXA8J zo0RZIn5<`KmV&zhT$UPY{Txr3eh;JA%&cg*KWxa0@HD7kPF0-J63b49@Z;M$dR(1P z>Q}PD9$16ah0ljeS1gM!Q9Yt62TP0Q6|Ah4t52%Ew24(+WDzZF5*3oX z&hFSaP&#%(P?20CL9u4Fg|l$VF#nI!p2ZKr3F``Zq3^^(wx)pDM)@5vIEUw3y4iBiGy}%b-E18sFofefZvE-VA`Tk>4 zdcBy5w3q>(EYW9itYNO3J#A>Qrvc}+`6-g zAna-vzFI0XZ!6)Zu^|tTpZ$&2+Ju07xYi#45m~}hdqq({it)9r%tIQ- za|<}ruaOz^2&ctr(m8*mnF}p{#qMO#709uTk>l7QEX@P)EW8bu<`&98?dzF!Hn)LR zXCDWU3K`N_IXc%9P;Q?hGu%I)y-W#`^)LI|TDj*MPRT&Rw|M`8M~J^pgW}AdI7?3u zw;@$vHmnC~FNo2O@zv<%Ju(E%jDk$%qLR~p@u^P~FV~d=B(6XgGmd4c(=^c+;KuW^ z)&8k8a&@cp6cDMNEs@pQ8vF9fkPUvsj5Jb*mb!1JtWUDrTaVidbjcNU?8AO`Ndazc%CHM3^QOjnaJm;7?w-}gP6A$`e zy;)?Uj7MNo!!DNO*!*VgzkK&8HRnAr5!i753eIZU!;Q+(3_$X zUzXlvgcj%1e{KLsQjqFXJ@mu%5v{EUb{I;6+aXGKz5cSv@yJUqJ_6C<_3dt`|J8OuP z^%bba`A*;E;aa)#CjNK{pRTM{r1c`84{IDO;(I68{^@NvJY~NvO|H58yvQzi96tBa z9I?UukJhht1)kYaQc42v`>^`_){i$QO09M$K4m?O;R;ZAh=^{YYaYkY*Mu-# zeX9J;GL>7qnxEldXWjTcFET4|x9JbgHAFYoo@I5fOT9r&HAU-sEpKAfLm)b;P6dr2FKO0D<^F6ekic{jpqsm7JtH-ic zn-pqC^Z!uSewd3E*P`>QG{@XM#3@y}PM7XKRz z468~J|CH!mB_dJ{yV zI$JdrNf>h86*%5dS3(hpj573do*4ue8#!!AtgBaUk|9+cRE(}P{SyF)LBk$)w)%@Z zdfzI>qw7#PYKZCe*CnS|TZr|~SbNpK0UC}KJJ$Tn^26e%QnbX|_@M=-91bk~Y~L{~ zHgb(htzb(t_5y(O_2Kj9=YP?AnsA`>);r{)iH`=jbS`|H;W!PtKWA^(4B!|!tn=K? zV?-hGW>Jqa>mLmXW^W=QpY(YcyJ_c zj#)z6-1EmNq!bJ%({`sY4!9fUHeNxh|Bw4ZQ^yq5kjvGqdFEC@4`^0v5A(MMmPnvJzI+W;BQk}Db(CsEq=Xr6 zdeO3RQmUlr4QnJ@1EpSksga6(b#q^AVY>jVQ$`gxlG+o z99!Z$siBpUt7*~Xg3#F-6oWBJSoNoNjCvcxidEzsEu`Jl%3EpHWomYD*U{~J#T_nd zWu}wR>7q)kOXm0`--9|2D)vUwz9MzbeHVLc2$El1!>_;;XK6>KZbqAI|HRCWB+pYk zS%vXYSrOnY^pjOIJ)W(xhQ>+p+fJ!0r7Z`#oSW=ZLLL?+RW=18!qyM~QNm3m$ApoVVyIfDU3HdTp=c{mUXCc0cmG~(v^M-bpzQXZc} zfh{f6$aS5pAa4pERmf4(*Cr7BGO6pxO?> z%n`Z6xdc2{=f0c&1{S%*0Q6Fc?#eA1its6+^*B_$Rjw~O@-1+C~te9n+=F~TmuQBcvh-Z+06Br-NYJ_%UIWT`nXnb9K zYDl^P?Xy)?AdLl$e|Az2v0uljmSSXQGC5FKG2EJ)Wue+7uRkt_&mZ_D&z*H1$&+FC zHlUYJg*wp+-e+tH%u-DQPH1q3^ibY>dgMmR=Q~RVkyES(#Y#SG0Re!h1<0Gt154j} zGq3vzj6m)_*6{n-j`05Pktb<;-Ji;aMuuoD9rP1#&*I;)Zx(kR$n6ORuoS0>k+aoT zQ|=FBl1U)Z>Y&5kd03Qg9NNj{lN9RVX+(QKp@QJN-L?+{ZvkD0kusR~?%_#jN4D4) z!B%5eV9!El2K^{7^A`UgdxnX9Qy!tk5U^79e)QRk=4M>k!Wj2Ob`KwATO;3v9l#hh zVH|bb9k#dlWz{EuUFx5*^a7jU&cN*6Idz~tiDGn`$1lP)f!<_h&JZPxDpD%@5L~|1 zhu9O=l??0v?|z!$uZ(K40j_6H~`vRRM1sZ?#B0WHU1wd_b>z-w+NeMg=% zAKnvKgD+&EG^gJIQSQUKo|L<`lFiheJu}Y(kB~iM+Pz|SzSq*#1JIwoTNYMWcIwX~ zvgYK-o&h;!iBdAFh2=xcmMnZ?M(#VWSKT((sju1R$zJ`8N@2oh27;fZb&Z0D98X5u zQIK`?D+>Fa{#Ok~dbXJ6z#!RuxQ7>Har(z39?XjI$SYf25%pSo9yBgF4>8&<6<28{m+cg~QA{AD0T1`|EXTpxBRQ`_f4T26Mg z>b_m!_57! zUudgt>N9=T^lmGg+s1{t0e><95Rr)GVFUm|i_8E>ciwdOUWqddl<}@b-Jn`Oh(Fp$ zdYx)!nFh%lqZ4n&`5gcl?DQZeN=r(s)PixY0Ds?xyriZu2o>`yX*V0WMz9+Zwg2x_ zAdU`gB2mH_`#YHELk}2V%nrh>l1RG1a;1PNNBPa`{Wt&>QY--mShZ82b-`fK1z2=D0$EIFf|1 zW5(vC0)M#1E(h!l0JM)B6$071%5ua!jJ^(F&pU7&KrQt-FE@!okIo!TfZLZw!P^fK zY0!a(f`jVS$cY7@bdHokKYY&(%4Bm7@6UzF(V=hj&&3l`d9Hi1?F)-tY$w2)9O543 zzDZ&dDGD_)1Z;C9XHvEk6s`!WC2Ss+5eD&SI;{-^%gd(iVcuA09SYq3{3&9pLfbYP ziN2DMA_qb&$(c!q2CcZ+6nKXBF7ymyiDMV*M;Ps8=U)*+@5_>IM)8i-_hCOZwvb@kv*!nLZ7ZvaR^-h z4JtkaD8tD1Ir|!P09Vy4$2E zwp+-CaL9*lxu2VUD*ha{9saQ*n>?QA4==+_`3eIne0qx;4*{0eC1xU2eiDMd9|+-z zLUrI?YYs7rlNNm7T@}#JD{d}As8-h-S62D=DHlD_iRBrm&_Iqc0U2Zs1Uy1H@@$Qy z2z5Ey4TE^|n3T*Y>5BnZDpQe6-4}6$Xz6Ytp?>Ufd~Qf>){4A^StON@Ftd(a$_G#_ zjo~f{P%xteZ9}%swH1ZISB67JDBx+AauO4+K3|&GDajdWY__iNJKdn$4#!h;8p}*C zzdQ=M`%E{OL`)zB4MS)R*uBCf@-gtIG*2QmO zU{wMEZ+$SX3H|XP&{+ZHDzlYt`5n<%WB|>!s-^ z&%b*s9G?KR-w~+vT?kIom%8v$8)(a#GuLqBY^q+}Eb7bVrDHs+{HHkh9S_10-r*@) z8zI8JD6PKArY!q0F#m?YZZtp^n`&~m^&dL!?RMF>&lN{Mnd7m2Uk1cybK|!VQYp3J zq!xn5sr&wIwgW)v2*K$4B?KQ~Kso3`-=Q1mU};HyqHnJ)E);XoR+E6Gq#mAJ(9no9 z8HFxe0~ku%CL4PVo1z8x+96nT5gCY9BNA=_mRu-?2k(tLh6Inm!~#}((*g?_nvHSo zc8gN9ARJ3v}W+1oROypp%w&R;F?Jr~f>xxabAEfHtCA}$&b4uUcfx)|d!5A+dG&R^>y zZ*{I7uYxIn{LPSo%LY!!u3sz;9(xL-o{yDBE7@~0STfqWVb>uhWZmtiJ0t%4P4mux_HCV#++x??-U>haJ6wHB z$OaHzYpx*q%Tl6_2>~!-s?LSV?}7DUINPvX#6z=PtV}}WmfFpMSA_-Fh>4X)-xCBp zmH2=k7)Eb~K!gI^z%5?V7`nRpQ%jFPw4DnVMb)T&=MakPWCCXE=#3arec6XD|3yLr z@m4|xW+!lD1&JxwHlvAx{i_F)c|f8&=CN(co!&aUi7t0dk`s_JpdufN z5nn1TZCcI5&>1;C8BmMIiuDXs&*n1*stp0XcXPul)u!&tz7bNPsKd9Q7^Mj)IX%-$ z3jJZnlFH#T2t%H(>6ao>8^N_v_sM&S(PPQO4n}e^_{(F$aUSx+mktzXPh>ZI?MKos zoc(@7qi(giJbo0S0H3L-}-gww~`1>4O#W3Iz-W z5iH*ePT-*@>Ca#pMaA1<+9rwh>OOQ+ChE>%fW^*(F>eTq0j$I!joZgee$cRVyH}HN z;(qjF6HdylmY|0}pEljnwZIWgt#xMdm$zyhu$1&MsLw#j4ox|l!MOJ5FG6NGU}>c{ z{&~Z(YmDP&!<1^(+oRjm9%zSz)~W;ZXN#yxWY%9KU7K~|yP$*YBRx(pYR=_HKfZsp zQ&-=q!-S9d*|_V^2p_8)TLy&opNCa3_xW&?4VyP<&fHVyPEs6?e*x{ew&{g0XDG?& zceIm9-|O6bKo~!ML5?6CCB4ItWsDFv~ik)>xnyk9TVr zyp#A!hl{xHK_)IXo{$!Bt#r09TBv+X3ck^jpTD0VMsaRuT-&t-PYyd{W8*_byQL$O z?p@MIbfvTW>068Dwui|BE^wvzxCgX2RdK8`nGq4wK^GGZF8dvU@bJ+Zjj#1!Tw+ z?(GwiZzk}B%mp|56TQZ1cK~%BtQB@kxB1;{03xUqZk0(&){!4HB4iUNU$S+r?G5r6 zYqzJ0cbxMsxmf5+7x*&8r(JsAv>5PvX&UVDb^LsSA6&bVCLaDZ*Vj3-cE2~Z(cGS3 zB`zh)&_I?w{GJYv1>E|$+-KedRQ?iMx{Rb)+T+W)gciR#eFp$PYd!f35I!SYJLyF+ zj)>}AMlzwiSdW)SNgN3coPR*9-d#d?$D_bYoD_C3hg|uiTa$D9 zR_>m^-lXOILbfJuO3EqOJPus=<2Z9BC*?;0zWB*k+9+ZiZ4|rr#4jbnFx_*cchEQ{ zO{u5P@(q~T3|z6H+?P?wDrEk4{2?p7Ws?lu4f$sd0z(Eh`I=hM?KErZG686m^5WF9z`ox%nUp zrKu~Ix@&S)>m0+|h*Ka_k7}3nt*P*!iY}RScdZROoiB<301J_aZu9Q_$NJ*rio2k( z*`n+N&6ldJ!J;vDZT@RV))5ga@^Bw%w18(xg66Y!sUVRkAP_41YbGNs%aX;o&p;D2 z%$d@*_VA9qpK~QdEbu*mgT$+8 zLw~+Wyo$>w-&r|lNvLsd(y0;WH@q0m%-EnKc5-ZCd}xA{Pxcj2)R?v-NV_V{R{vDn zY<61y)xQ3f1c}_u`U`n}7*aEow20N`BHfMFHERMQ!i~jYh(L2tv=iA}d-_2pPl=<`HpHz~KZAeCbf3&sOu~DV1W( zD>*`X{jBy&M5dN+TC^RJCY9sttBgM|4ahnS04-cJG;*@1nR6?T2$wh_GAOO>MXIlc z*KPA9*`gW0nBfB54eX7%*42K4dFm!G$;@_%b;*yHGQYtjtwVIDR$ZH=NYPl^ziaq3 z!}b+tRYxG4O0JOgd1Nl(Qc-839p1KRt}*JvI$5IWDuz}HU$f;;VsP06-YDWqB~UTl zbknd4pgh!Wcf)HN@&P_bmx^+H44zyzM4TQq@=g;<)C1SQ^%IEzgklUgJFNK^po_82 z$t9Ga6z6(Lt^>L1_8;H2BU!jUqO<*+k@x))&LfuFm|{Z<`uC;yseo zSS^|ri=aszk+y5R`fF$Nm)LH2U59I&nbTzUa;%k7Qfy?Cq1do`&6DdRh2L2W1%he5 zd2IjEr5le54oiAwF6N^%{@8^Wh<6|*%3_`RrbmGLHoPNyx@tEk?IL0rFnVo0Icw83NxQFpd)$Q2F$UF_64QpS|GfsUrGn&CXkorbl%D9uJ z=qJy|zC`BH9JYn*YMLKcwKfRC{>pR<-SEQwhAMEyQ7>cs<>U&J$41A#zE*v8=(6tL zBX(%u9h?XRXJnp}FwZdzizef4UE?~U)pQ&_P zLn(lF2N3Z4ZAh4f&zpcrI^f4y9jVX^Ah~85m5UGz2I9Avx-6T?*5$Bk@h=kxcWy9f zEAZYC!82UmI(8?!w^o(5WwNw0Z5+2#HejG;s=GY+1j2G$-{(F5QqAN#qMGhY)E>6D zCwZFa!{XkK7Jzqz;UH1OL8!@V|6#g=4_bFc;5f@tjhnXbj&e8X0#J7*0sJusB02T| znAq$*CqhH+ENSN209VXAwVJk8h`{wEEjsAfn~nTt{!FLI~mBtLU4Ek&i%aCj?5 zS-SHiI`Uhs9N)Dh9VqDP!|8k*d4t*S70yk8-4Jwig0j$qQAZ&?}=UH5*x4E-V94W>5Si<8qVmdDQ!1BP>O(aQA9y{K)Oj-2ptKLdTu zx*FA9V=a-CF4n`v(8@XcChPRm0Bh1A8i%8W7!}L330Ja z;SpAe)&{R0Tw)U%L>OaUO%xAEGm*Kf?!+Peinr9sW-ht79*GXVvKr9sy5E>ME=Kd} zmW(;wa}K}P-v!@1tdu3?GVC0~f(>%`m)%FD%+?({E}Ky0m;-w@^_y;bvs=U9K}cdw z{#iXqhURh_Ixt%{U|8(gwyf1N>;sG(n|Q-DD4%YZZkn$MQ>(nL)sGjRef1zirfVb= z6GL#Re+sWXJ0B3j!@WImZBl{OTg*lkJQ&zpacz6PW@!Gkf5c~Eg1S{73Ci;nv4Jv&`LQt%ty8Fzj|Aj{S1>BlHZPYo6>A@e@vqu;kxSTe@)ZXo(Kt6d3?W{EBEOg& z<{+u%(6II*gA^%@lh~%9$bh+kHE9^2Dc)tmU`t#a=*Hl@W#pQGP}l2 ze@N_B;Eu1^o%>6ISrp+JFuJqrPHSQ{r9=28eDz^%?gsxoOulx;?DNEnD^qYQZdzmS zZbneAi{3d;22MTB;B9K}-5Y!G>C@jZ2fK!xW8=%7KKtF{;MIq{u?GlOo<9F8<6zGP zz5h4oM8t(v|1AOh2TTB)C(e8P2TX9;{bvsVHc$Bc025r@2)6-}+cqaRZ9M|F0c5az z!v8;Dg6^QBO(DlxLypV+VgH1lK-PuW)JtI*J-f1d!+#PAV)A!^nY9wxAvBf?<*OE zAqD%(ZzukQ6dZ+(6mXfKVj`jD{$c6;WA&5AOFMo-3cAJBoq4dALVEoNq@bzyC!}B` zrKT_I2c!V*77XS!jKZ9P-1_^ejZ>*DPcxeyWVJlVYkQh^rvHD`6r&~QhN@sSg>396 zq~OU9NWsNtr5Er2n@~`5{@;XxS0}H${7EQyTYY{2R#TjT>jfP*eyS;Mx50#ht_O`* zrli-No$0xE?)vlA-rGOx1v7BH09I2p_q{j=t10?^s3|%Io?RNce{J~TuQw-qMxOi> zRJ=YrIM@1bLIK=4xcOH0qjvD>+MW5Uu%P1h!sYv4uHF04Gy20(G5Et#@#4RZiu*qt z75{}4yuSPB-SCq?Za-RpAq7K^zsjF{9eVch|Hdi!p{e-o{XNCscNBj;`oSr9_iXy( zgIC{v$SU4^o%%mURslBv4*&nr0O)AB-^8!?uJ*qCw(V@-+34lTt+dll0Vy-X;@X%g z9lxvWoXeO081k?GoHiw{?GvMt@W$h3ufV%Yq?$l#GkR`1qw70hUQ`bvuOI%PmeliQ z#S0YjV=T*UP8N|OTO4B^4*Dwvs}nyjDe5HdX{SSBn5r$}@;j%WUoYCW>SD@8zcD~9 z(VThS|M2;kq_%?>QXISX|B`eE5tt_1o{&k3Q#s`;nwA z5Asf>x94X3O27q5UphPAcilh9aTU-fVJy_gxRN0>iUv*6QWwigSfW`GxPv~!@L>Ft z{E>j6llXFkCe4KDdr4@BCM2yE^<`Yivm@#g6)QPJan)jxS)S4tL-)fm(^Oq>)@ih0 zX*<@iuKZ$_7S}=a80p^t-ts!!!Kq1hYz*+yY#kQpQp>nV`xdn!s^@6=3UT6&antmgo|?}FiFsw1Hp zr73SY7=!r2aHBf8>^gK^I|;%&bi`f`?B7bNiFK6-W;Ujz~8{V6-{;~&|)*^>~#A}J*uB^TpIwRow?Kuy1eg_`t!PUDVj4+ zF_>C43Xp3i>k2irjb$9YR*pX8C~Bs1`VE^|?#*-sI2koa?_{Bk$i5kR2?}2lDy2{+ zL|ZnCRWdm!Bkwr%3}clQer&C0WZ&jb+u^T;e4^hLihetj#DT94N0~_9Wi(_d!~3@^ zj}8$ziL)|&5mKKe##&7_qlKK}HS-|@?+q(ZECEt;xK9_ckmE~YBCuVc>DC*$+;Ti( zZP)N}_zlTc3{nYS{nh*5XmGtQy4Dzjsxk(K%jl=p3m49pj5Uvm z+Z_Z{Xwz20qz>$+;S{`@QsjbC1{Vv#x*bA!&R~ki>!m)B1sUerjY&fSV*&u6UWDxs z;1U@q*2mu^+rEp6=XRyJhJ$4ncucHLB(URqN-b7kLNK3y0Iaj)<+L#~RQIR3n)_l@ z*}rcL#VDhmq}Bgo6}QHyK>!(kBKYbK~$MCRPkD(BOyDlJ ze2HF67pt8F1`wfhWthuyVxwruoR{R9$)$*DC|^@OSJ<9K&Ch$kUCmvgA_d`l-l{C4CKv#fmEG6S?GHL^Cs zDkQB9N)$VA21%y;VEr*k>SxpqFf?m0f;J%|$A~+aT_zz&DPYl@V6xDVk1(E-a0VGZ zM;Ym?Sy`1lOaiPlsiYQ@j`NgCJ3G*}a*E7PO^ffePJ30$__ zc$d1ikFzw4VeHCiu2Vfo;qngq=I8|jzF%%xZR!|bPnK#KZf~~242=~BSWepz*}mM! z+NVgV;0AK_kZwa*jG@?=7k9p;V*vdsc~vCZO| zT14*5W(AIHHd9X%Hflwtuv&QB{dC1(>a(|ih69`Hupqid65!<}-lnIXgXUHOo?i{|ovfmD`A8;rm2(5{WlrxU zSMH8DWT$!vvyxGh`bI%$9!IDWaB`B>QD}J@LrMhPmd#|asCI^Cryb&5H zvuFjkc~A7_wP)1#vy0X1di~r^;W3~87}7qpT4bGPZ+5tA9$>KNQc14&9h64g198|M zT?II_gJ5<%Y5Ud1YjK!8ks6d|O+(h(Vz`YN!ID8RyB`^$t zD9s6shNt;jn(f*Wtz+xdPRS5!XVIQQS3AiOQX!#rF{VvQi;{xm6ksJkjZjGN7O`yD zv6|NSuw^+a_0DMarsJ~=kiBnNA1*2d(B+`?AwVBEMye(970F(4M91+1Xf{}r1jWe@ zqxiV!KuQKD=N8WF+M5Dl0A?jl&56C~@nrzVK}-%qXSV=N88lT-6S5)l^g(E?avec- zLT$mjZnEH3*A69XwRbbcIcXzKh@@si)dCZWBHp7AW5^FcL+C9{5J?D}N}==!wybS% zwtkiVbYN-E9}avU!NE&I+=vult)vi3ArK@0j-RkDFaZZ0-149)FI8Y*U_qWGA%nv~MT z0#$r?L*U7$A1d@TDzxKVCMHi(eanp2pm*yRs zVp;DmJFaQl+0AE(B-NHgc*L3(hu z0GN|J#He-iF)^q#2qcDa6Sx$7-73JB6Boq}hGSjCL}`{95)1d`7@)MVVg_HeU#sRs zJg`h&XJ3}L3ZhhVOsI;&wS^93#%aVf&U&1Y2poi&)-Dd&>SE%^vXhztb$iUEhrU*i zbOAa!lrqj{H#n-AJ_xcA@er+A24dmACTaXquY>?U9c<(mAs5QhUhh={35$~rNbi$o z=EXH%S$V<=%>|s9z{E-JRrea|=7d^u;+$#;`$Zbd6-j98)^NX8jBkTce-&O_)6?i& zdezzcTP6_QGV_+Po0F}#Q1+q>!yb=oJOwoaB@7IL;p?GwsYp(}|)$Q);jeusyqN1aU@om|n%ZZLrd)yfi!{2`Yh020Bw zd*Ya5%Zyju%j~k4Xc>}?{7_D*Xmsg>h$HEMom7IJ-hC-_lgk2L6KZyrLiuL^U8OT3 z1gB4^gIrHt|5{P@WT}8Csbg);dHIGif(9E``=KQ*q&O5+>ahP1wPQR1FIYuruNRc! z_6-pEfF>rI(yq)skS#m-r196*#$`DyGj@Xpg)pz3lm-axx*!=}X!e!bpeV(&(K*pj zfh-mYU@iwX|H=bidsBX|ukbzGG%!_w-gEhO^W|XoK)vy%ULhW<3784RxI$dP>dL$3 zh$ImAek*id)`3F}%uHQ;8C3OTAXkTZ_O~sN zb)?B|VQ;U52yFq31XgQZi7k!*?=6%O&4P!7+iqUdu5}`Z4xn=Lu0@;NYnGGS`=4%w z%EptC<0v<8oHfJHUsB={(j2?08^3_Pl7>{NU#A_1$?Lj)^;B79ONGl!!IFw?!uJYF zBiry_(NH%V6CRH+*aFXqYRS@em%b!C=ZMPX#Dmd@5pPO4lvy0zV%2i<%o-MBd|2Ce zedhaGEVvI1Ab3ttjsOfDKpON=#p5k#5zgf*^l@}K9zyQfM(IHJ%@Lb~2vfM(ZphUy z|I{fArkq!lA|d2iA#@tjf%vt(f@GFtKL^D2HUP0mO5V-o{)%JTaYSg@=zQBv!yuD# zUyD6OhtwDLWpOe6(eQozv|bVVus@bNMhzF`5|sFBZIJg7E!Oujn)qhYngL3%#d{|U zF}_we1cM3&)~=D`IY_zsEsQkRkwk+XwnpzSA+IcLLkdRfwa)zc>`w41fN*eZT{>$$ z|F&NHk@*JbGu&4jyj|B#4Q7KNqlsE5Mkx$YzcXI;23Ua=x%o{^WLD%h+vt$~3wYDFl3w!(9re4H>#X%Dx8+&)ajy6c5P+8>^@aO0 zY-!TpKTjEf;jY?Qp`w56pkZ9ME*s9midSq1>5BS zWV0y&jD)OE^z0FbPqQo^l@s<$DO&bw>%VkUo~CQ09)-?Jhx6}&K_Z%U7VD_wuIhsK z{f&>Ag}7R^zC9P0Z_^Idvv$D?tB91_ej72Tw$M&V5t)nVH-A90z2HhUGeZiI(BTww z?&j0?JNGMnn9LMB0A8qqjxbWu0zki-c3y@80Kgi$0>#B+rATxp%km%i;>VqC^|%zr z8mdPIYpY>+Nqxakqx=B*;-q&w@#*Af&O0c79q7)+alf2c7KhIi!G{*cdNbJYEo!fv zfyFkMjI%2rfrypSvK3P_D@uMkutq^J%*#CAr0$ui5uis{#jse~HK=}!*2OWwNHZz5 zNSqKbcuHI{y?*cgKeV06K;n7$yF|{^nzc`XamQ%J{1T$WyY_o3zj3d<`nB;B zRCz0=ofvJq2@j!Tph^wdtcULtvL6;a4_%QUahw_C0ygWw^9{^gd%f{qIXcA#pp7G& zWVnXdx$oN>E%_2WlbA$)hwM9wVgSEes&D7WkcjWlp+sgcZgB}@8w}~_!HOF|u|L%7^f>AqEhB?vC0I&oU`GiJ zk$BC1KW@iHSN!hQ7o=%EMFga7g=!G13x@v41=WTU%$AP-TkgW{vd`MpnKXxBto zLp5;Q3*r$d`GIpaF658f+V9u9;>&p8-s8|x46u^jWLTvklF*9Txf>*eM}Nlbzdd<& zfAePHD{tR3LbXN$GfmI=4tC-eiUTe#QD>`x!|XYX>|mYzDFQsq3I6O=`$U8N7p@Rv zB0Tat^V&|fXSW&cQvs}Ui@h}u0E5sRz55YWy+eTA)E&95|j{RJ*BqF z+j`bL_g4x?*5fX>zpbBmNcIEW`L_x<@LuFoZN?;l`dy+Y30pk~P^j#h9p=p>S+)D?2eQU5_DSO_)5;0Z_a%GVjW1=&OFaq*rR z@6zSlqi1Yh?m}p11}|^0GjUB>QDT=9?(9YT4{;-*;^4;q>n4pPx1ty~Cy_bj)=z9QjUAxQT3jCwv5We9EWPhasZ zs7}zRYHJ?x&lE>6Qgbr36t`R^Dh#>W^rzF31F*0QL}$h`dk1HBQ8!j?-=DDw?Is3M z_QBIs;y4DS+0!wjLUFHr%tHoERS4vFPEZQM@~JO(>1`i6cefgib3@h=?6am*#RyEH zrPp%tY{|F8d|7k3CdBy~4{z)pM@rOrX$aN4i&(aq?;AxvfY6i+)}Rt*bC(4RMIw9D zF`UHEcW#nlmsPS}jx}di+u|~h)pIPQ7#fdtBDtSXc z|00Je21;KkMJtS%=)7vjNyD?jv$*x=)teId`77-CB4CIR$-#2mqoUSMI4%BldE27w zr8u*6{XUSi6uC~i+)lKF%Ugdj-Wb!=7Mbt8*0Xp3?o&6lWDB)Pe^ui-P1BX&RV)pk?9u;pb+g}_~aBpqWJss2Lm%{oEN z_@0%wrugCzb!D4UaZcCMRw&k)W2772DqZ6`+TfT?ffvt1_Vs~pvaI`5EQiL{kdAcq zlQ`zq>&~Rdw16N!isf(Q?=)RcGT`y&?@dI%`z32-Lu+KI9?JnIaVT~?gU|BFGTN4D z@#IYLA8cuVo<-++g&%TP3}>@Jn!Ju=4~3+un(8l?rW(0qqv`%{cB2ZN9>}@yJ5*LX zu!E?+7i3;tT6Eu@>sPT$44dV-^mCv8jx4Cu&p5>J7fGd8e8aVN7g{t--Vt448jQ|?7(5HXu5MAJ|*Tio*O?JGQ%L)rtB~ysvI~K3Z0|*!l%>GuwHB6{1wFgFDslYH>hf^W{m=W`Q%@Q})tqrl$KpW!EW~&1OUKRCX z^5eh}dXQ!ISBN{xssD#9oRy9fgv0e}fxLHRVRDibVPLhN&>+W55li-I_zH8Ucb`dbF3??jq1G{XGDYt=;p=U#i+O z%8}y?d_zD#o}nd2T@UnvfrST9k>Ku}`(9)gu%FZnCJB~!YPO34Q)4MYd#6qImXsO5 zF4A~;uSTw8*BQ`3QJ-k;n-N+V2eS$gOpkWR3(7i9A4ZyOiO;ng7V&+2IeO8|jccwO z;%MVVnh(Be2k3@k7m9U|PHdEw)RnZld}C%0G?bTDr@E$De&_Q?i$hN)O10_(MKKH6 zR>M-GbniPEEJ5n(#cB0R0+#oBUxJHtddIel!C)IdJIC90O-~31xwM7p{(yMgii8nw})HJ$jtB-K9$7EQ@7kKT?j)yetg z(DtA)pG{j`g0tV`BQT7LR+Hy#tS{tsi) z6^jDP?~DxXga)^OSyXH2nr978n-Q3c77RYiY^|gZqrNzdJ_ckxR(pJv7lqc(v*+jz zuD9qCp_zlqXD0#}*kr-$#D}>h&VcV~>^Jejooa0%o92vY&7c;dPyXri<7Jm-L6_fO zHLjh%c;ZdT_N?)Z4> z&cPe|Yd-ZvxO|zqdmNJ>MLS1wHJ*%TdL-1T_eOfGdNOe$BcWlLbCma%t>f^~6Z7kj zM?wIw{PF1-a2?2mBY0R0@MDL6>3`e+KO*@5;WhpN*a~pj z{|G$Ahphlt1AkZn+Tid#;79o0`O^x}7M6B48Wsbj{Yc(Jv#AvjRvGlru zyfe4*U_C&?{j@Vvsm)I_ntr+g;Ml#fzqn|Xv; z3{VM+0Xm;nUzk2|>DA9kKWqhfTXVkuhZW%8lm4GpfVR#Dbw8{CKPUaL72x{Qe^2@^ z_P(mW{`ySc^YijMov;<)N8tYS($Irz!;h}t_^%bB{|&KX(3i{zbd@BD8}eI10O z_UGS5A5Tv_oq6#5-Gdi1Pktx?7GNd7-Tx>7;Hdo*9JN1q{qaZCKKu3g|1oL%k8A$_ z@c~Eh|KE!N;1T}+ir`xxo(;Sd{e1M3QS*iZ(!+}VnRluk59`)?KfHWyU`zGq^4gc~ znd#SPbiPm~2h*?lv^vbqbSmXOCwmh5LYM<7C_Ij5#pr%NgFvf=32ok-oIZEqeOg>f zDgrr-V%W}BPM=RFBx?vvILQ~$`b{p|oOg#4RfrPX6_LG01a;el&kcz)%}~vnfSN!l zv^p^ivpW7=P4`@h)G4fIDXEW}o}*!tq#5^Zkp0kfg^!Ix7U}Ef1?TD=-Jy#)SBk&3 zc$t8zPrE;k=&vmiY!w26H-d0HABOKZjThcDI}3FXOcNGPp4#an5TA~qCE9pmKKh1( zI_MhIdXu1LsXSHHz8uK6dlZqXaX@%6lfEz!0jlhH7B_lKtJ?;bgXEL~x{V#IB8%h0 zLICKP7#1PvLiRwJ?)TU7BdgxP6~IWxC|9y@#x>NlZGPGqBuz42d)CVPID64{fgGHJ zvg?I;8a-#!tSSJZuWD`?_$GDF%W0g~2}Xz>=xG<<(&s(Rsu^Q2B;Hj7-{r{9+Jz;mew6~MSM z)rqQ;gXL(y^&YJP>;8N-g>b}@w)*0_uyS9?cF*?jUUWN@V@{Th23=#P^|&{w0>*aLueSg7$%%VjN>btmIT>ckoMar(Z$e8dv`%2y z3L+<~J0M4PlF~4fj|evrrKU1bR_VhjG$8|Ve~f1X-$e+?WgahXzjLJ=9>>H(7+cML z3Uq{L6ubp6)(!Q)AOR6%IrwQ)7}ai)N;>B$@qrA9RtkBIEI~_mA}gO2R&!eT@dhSF zgrubm=(!Z$OiO#IQm)na+g9UDtwhmYjkq*A3{KExPtcFykYszMqtE7yWOO8ew3CZN z<2fip8ECVPzdOUm_-zeW|Qm9k3ev{{EhNBm2=x?)E$NmNUGDB zD~3fN$a|HF5NcsWMc5s1- zTg0qcaMNN;}IsNQTTCoHij0eKp15?nRz z(>MT(xF8<@wCJqRHId~t2*kofdIEy{*E8dANQAsQ?M^W%*FZcuDG8{0N!perMrFJK zHoF4HPE!!5u<+qD2SbuJBe+z55N-A{j2dPL&~%SLn`S_g9lIs;*Oi%2MnaOBqN>? z{`xy=L@h=&c@NKEk=LhL?wYZE2zPzcd3NZL>f{ zwFPBoo2o^g7eG2ggz!%q+rgsu#2dAAPV)|j_=%#57G)L*QYSO_?_rK~Ky0-2Szps_em{Ji+CGb4{q1^5EWB?AY}F^h zrqc+VT}U{RJDKbnxsZWj0>i)5iY7;5CH;pj{=m4dW7^1?(4@c3G9y86jqsp!UBkVA z(Dk>9{!Ai{0~l!@adlrh4G!w0k&NUU@QV2o@33-v+s9X3t#T@e9z!bD=RxlGKbA+S z4pIf>6vUR(C70Jm9#*BA6GTYE34Df-o+!W^6W~ruk1;3*%6;)z*X6)XOBm=pZyH0} zOgqcQZOrtCkE1usp?VRb$QqHQpfq!E`1nwk`o^IL=z~Cl?lj!HM_llL9`uLWMG_+f zh{q=pPa>xBBUgF42p11`#An*0CmhvIlg4_1R^} z)CA8p{)?9O%vi7I;!tk=Tdf=m7)&~b314o zmfAxDND}w-Na860h?A}OjHMlvdol#<)535yc?O<|jsBRZU5NiZ)yRh%ao-MDp}-mz zBK6n+3>a9}K!_-HCr|Ht{0XhINUabeLtg z?kWAq(1mcmZzx4V1S>5CS-6G-fw?!Je0C5*f+*zBiuN1vW_Mg*XR1l|;;m5>j#h@0 zvQKt|jL15XvMa|pOGlZn4`Q=D7zkhdy$%rQgf1zP(E!+GO5^fDPy%d&w%aQKoCJwq zAdol?Hd2Z*=|sX8XH^>`qIy268 z-lH*GT*EO~AWV^QH9(xn>LQ)ulD;%8RtFdasEtxN8yUn-CAPd4u@|81&$9e}liHZ6 zWeFuB+EZb&eTfiJRG6n3hr3@KqjTSU(?E%8$}VliF+C8^5^+r+d>g~hieI4Wi(Uu> zJ}gpOMMzcIikM9hVl!a79|}~a!9@f=9;MhbXT4X1u~$(h&-MOHw7xa*xO|PO9Jzz1 zRreJ-Dg+;+v1Jw1{5QZB&pgzE&0iUKZ0%vJ6x8%3`qYPW-0o1hK_M&&)2(oIbjI#xDA(>xuL8@wGl*5zrILMTVbz5WIK=IyBCJBq?jA@s}D9VL?z$hL#^xjX0%MjH8?s z0Q-|oPL0%yn`=#`z?sLC3U&li2-uHj!LE4#O4-&;jXbF(N>JTJ$975>#a%k2wyRW3nmr z9G}XOnwqHEd9#gPEhqH8Qj))vSQ=3(AoF$I)RRihfk_DR2kI{+e!>72>;^g$Z!8o1 z^|s=MO;uP3FwVEgjW3T&P-1`^iLr_)L(MWb_!52H1Q zbjIFhx30zuK@04FU7X zS?b%`lY%%2o|T~N6q$lQlA61^7Hf=@sZfXo^bM!)t$D5P`p37nKi||)zto(*RYJN& zY3H99&p}c>5%EtUY>w7psM5x_t~{hO_*)E1eXq_0Ztv2q`a`+B@1xq61x3UXC?z69 z`80B?$b^KaXde`ABT(BUsK*CUCoQ6iJpr5?{LP};iy`_eyZhAB*3v3+a6{cU8NvV(ie+_rp~;T6oBD#6m8G*DbNIlfT+@4ZDC-edY;lrTSO` zyG-GG?WX!Cl=mOnY*YLaGH(WMxS${GFt&}d^wC6Xz#NM8(%C1h$4vMV7}(>M)Epsr ze(?q+?tC@|r4Qnl%LL~S4pm!Z=T7|x+u2S<9U=diU z)+Zc!19)ts)IRz3(9??SA#+Ke`2$q`WBaqZeaPGvAnT?}=u`ySns`V77ka_YWNH!P z777@mER>T|u*c6*@XM;Ib6YoZH*Pc>>+4(N0}Rlt4RCCvw%RpCE4(^i|6+(bZJ`w` z8YadCkhy?|?8e^Y-qMC^f8e!{z*uC__{_y0^ZvskEmirs_#)u1ddM@PXJWvQPD@)&=6K1N(Yh)j31&UR^(hmYP)o>ikTsFJ7w{SSf39 z=u5o(URrXsP?0boo};X=Z670yMflzMwT+#wq&)m`sw|n%*xrwx#&1)&V7saN_!c_K z0n!3CvW`0)41_$TG-!F+RQBb(zQ_LKg6VC_c~TUHlBb!7#1*0$GV1_Fw391t!;>x& zrKj>KA|G%pVxqt2QKnx%Fz#N%|HJs9vDhFE-<-M^=Ue!fQ|Ki&PFLh;%{k;U9fK7D z$Nqu1nOf@sJjq;3k8@wA9sl;huMD$?J*iwD#hCWQ^+y>XcMpV!2CO9!dF=H=MzrGJ zfru`sW(fm;5XpT`)joR)aTLlF z#&%dhyP*@sFrCjgMq=!>>d4-K5M+qrC^L?*YU)W^L=st)vocZ`9n61+6(BLoZfs8|3gZb9=N|(ZoZpZW548D$c~4;J(D?91 zFk5FJ9oC)XUIGrlS9KAX1QB@5f#Pk?@Yabol87S`dxWTNlP~_=>jFYM#z+8=`Di-h zSfG?v&rU#%pCE;lem5oV6zs+EZ~Isi9&QGVC3SfCKI~&c1F*`yv^TFfaKyiwEwC3l zX=g`$aa3n`Y8@Pfwo0w~Y7rsTv{5&m^@2y)k1u;Q1f+QZ2swgULu-<*kluv${INWL zgqEj_YX37-CgE$eB$A@{stWqNLkJt$D{;8NPV`e!~KR3r)fm zoFJL6M>=3~0kRJ=@rSwPc?v9Hxeu!2%Jjg$9(O)i7xMA(jko9! zj1R})mxvWj&>ph%Yrq6vAaqe-pu^e33le1EX=HvEo+JRi{PDXW>L`qNoA85@8E6() zhpt3Dncm3E`nah**1~hWE`P>p986p?Ja_!y(SLT(EEy&1FdH3g}Ly7Fjv&)F)NT|2VaF8@3Gml?R;xuoC90|A+xp^xez( z)7%V|y|6Gy-aT%%s`ik7tpv-ljmnYf_GLCIo>kt+_94m>Hk z=XJWs`RGytZjV2WZe~h%0Gdt?c$lIX=fHs0yWTi8W2r29lfD_zX~*{Q^xykjya>jM z(CE3XozDK?lXm8AZ)od|zUXo<*OU`GA9SK)l)i-^(mZ(j)lBp#iU@l`hp}!5bW$Mt zM%9$m$bsZXUTW?_-`<|Fn*p(uqO9;S2Tc;6y$iGRM!`+7dEka;jE(Q|LC~u}V z>D`ljdFu$ycM}Big|K>WT^@j7D&3S#{Ob;TG7TKcrJZWW@b&#zP7qVi0k{W`wdB3=X zy5(EK+1pEAyWxzQ`Jq73=uo4v2t9nv9GUiMwu`jElQ;^$oR~NWr9OycSo+{Z1lC}5 zWz$&ppNhev0s;d-EFXS_Qq>pYN&qu09nl4p=46Puu0Bqb@{2zD0Ao|n8W@a^<-Vrc zHcQ2+y%~Sop>&cYdwLNHP4uPBy+XL9OPJ()KL}eUM`+t*`4M~@wAmouT*ZFUoWYiZ z>%(1#3psVOeJQx3^LL+oa*+0uoW9E&iXHvEhUg2Jd*&zo9j1*{oqEa*>S$v|sV08f)8k2E=hU=MGmAuKU_c1!gz2Frk#fo@bK5T<+GRKV zOS2R>B8e>i6EP>#Nb#!sytaJsljY=e!P6K#BIT@f@rkLO3-4`iOa!KsV(eFBSS007 zl;xR5LgHO@UrbJQs(tae9o=Rl;^ulgT4zyL$ww6>mm_7PpwA@vKwk+jtGy{qrLUf# zW^Xq)TOV`#DqHA!VPgtOsHheAKwD-{>ais8O)cf`3jIc3>D>pAQ>}HW-MS9v$+jIz z!(>*`;}nvOva4Rg^$AICaOPhhP1)JxIG9!v$PfD>*d%@?($w9#M~>wG{rrl5yhLIC z)Zj~`m=i|Xxnr6ts`vf#Ze=d9zpTQEl>w~3HMn&t6wD}L0NAg&8b)`JMIJx~w#h3S zsg!kg2E2@lNaju*D@rF1=b+Wo7_vYxvt)ymAj(eH#iePZCV``SC~o+$b)fz;zIhs- z0~BOr({5N$>B_tdi2YetZlh6~%e_teMdy+IeUzB#0j$$z@g{Za9Ur_$=nj)~CT^cq z#y2mMtBG`Cfa~hF{_r6VBC{%a!MA|b@7Yye;VqOKc}(>Kp7GcrneV!o2`(P56fq{_ z!b3wjFek2SEUC`6qas^Fe;V=`1Gh6uDgr{MGp4(03kpz=$P7ihRn!~ETXtuITsD%{ zR;Tv7s0f{+aFa?6G4Iwtg!oHd-5xX6EAzu{YvsH&YU49iv8&THr0xJFP(YSddMh*N zxUHn(_>);Py1!_ZTQK3cO=t_KLPp(klX&0AcATMM_$kj=xk*PR=(aA207i% zs0VaWAi-x?zC{S3cYK>6ud}8g^|O9ixE$%QO*29e;EJIKHq|uu5mZ0(2`xQ_MC0ZN z%wacQ+@B&BH2b%KW4o{{zTA9EUkkcQi1iHEXIv#pC230h5O$&h%Z*Hn7mSe;c^t1_ zqaKozX0BW^20)^WquR*MaGnQgwSq~D9pap@)hVhwhQ;W`mqrgXS8{lt4C$L!mu(Ks zh!6^j&(UQ|0D8mTwT$P#VCWpMQQaO%lNG#eMgjjq{a@_8S5#ALKyUQJx%a+O}7HM*U2*W7b7LLjqFn z&*e^=m}ySk6X}+DqrV^NA*RkEt)GYg_Aa^#u}+tc4w*y#h3QonLgHIP$}IXfc%YRE zbvB#W+D}e}|G35Dc60CF5PS?HN)=}fl>BSlB#X#Kgpom29`SPc@&dpUGo7ZDI5vOY z?op+d&IewuO4s-u!Nyybx4V$~4AlhAMgFd{=q%^N=mV>>+fvf+;#m}vp3$0e>k0ks zOVgg--HJ&rzvZ^W{@Bx@SfAvIN8LLdFF(DvH#@oVm0Rq8kKkYYx4HY+3r_zb?QQ=> z+MB(27hu_a&7L+^V!L-rr%y_|fBNNrWcS7Nea5-S1C4O^9yZ-W4qc4+hqNDRTqNzV z;GW&IThhHFzkBDA^BFKphr9REOKGxesd;_>qkI29uz3oM&5!@;-Y-h(qnU8@{&+`r zS?6N(zOp0#R9C*dyAbB&u%TXet)db}<#!iRx%^Ic)xE4mN&Rkq-TkArV=yfj!nFMC z=sykog0nY&N$Pi{4MW9?wEQ1Q{ox`lZ+UVImeenfRsIvezc5wU@(Y+>f+h8rr@G&s zywF$Gc6$++cfgYRK*N=LO}`BFDmZ}O^|0~!vxe*UE?ysPy*3RS>eY*e`l6fOvB=5C zZrq-@GVtsg48{j$F8yNT-S^&I{l&&R9?V^N__h1)KPLK5 zui1CRV0Doh$@9$6iPeSlu8@nKEIxSpYtmYd;zIJP+SQgE29+-~2&S}!CHwdnJ=3yT z2$4$#Ao7N;ffLo(J?DsJ@N<;LDSLn7wE;A}U+G>@ak&6h7pDKblnblyj154%CVXVh zDkgeR$>%y7`0k>tG!A6Ll@~+ zXE$J`gC4~|&f63QhrLk88oUw=q9Q?Es=&7?Q&J&Fe)ZH}KrmQ=xTEe&AFf0P)+O3_ zWo~2i#OioWk)o?%U0fb54nkr2ZR1!Z1I^y-&8I`7P{Jk{`5NYOhK& zUg^T}kr);CuGCY{U}QcEO@O35>eHA?h-N->hN+>G?BLh7!^NOaH(C#sizZ9XGW88s zA-pf+9nxF+(e+cJ%bM+qw?2ZB{mt=ovE6A8p7QHckj~qN)8}hR`RWf4s~}TbHpIMW zx6@0azb`OWK-lUvIZX8xU*h7dc6y=nQCvv8@C2dyDGLe0tlw0h<|9UD$h4ci)j~1(F_SWhsm89kM&=A96T=%S zAE9#1zDJV|M~eGNmA|LQ!+J*`tVDig7Uu; z6n_}XndSTbrKp@T;{!QC7JS&Gg1LksTA*h`P0W|RbKkmq}i zVbjsgW*VCSLrjy@`Yr?^zxCowU*9^u1ij2`D&Lqm>r3)bz5=v()Ps^_06Rl4O>sgb zZ#m;CUkT^{{ZF8{0%NzK%yod3S9#KcdBhPvQ! z%KIBnh$m8!I&nSZ>z`=^26dTyKo&Pz0;s0WqAb6$NWDyq3ra}JiSl}kl8Sz8_EOc> zQ2?1r`qVcNO@SuKOOm`_cis;`QJL3vebq&bH>96>JG5hNxgnNXzd9k^<2_;S8rFy< zHB?qc5~DCGR3*x%ynnD_*n7s!o>k?1U+7fR;kbwHHgiRqF&1NVgKu%{${NM*M6ZSi zKlox&A`<>A37F~!@nnwTHMKh1K8U-#YGf$ZarsF?cRXPM?`5h7;{Aa+o3vn};q0i` z?1vI%wE&z&{t&KlXvjrfk9y-}#!>_a?;yZCTRMb`(A`Rab8^4gtOiq{!Jb-O{1#_6 zrjczmb{3^WKYH0B)tuUA2^C3j1e4)j@3J!_FZk{+yCtVacZL-7Z8FK@rS=n5rN6ba zN=zS5Y%o&{j&5Y;_HnXT%NuCnalZj3mfG%3e1uMT&jXzBoCaGCJR;ruJwbG=RZx{} zlM5NtNm1Xf9063gVScw@Y1P(C)d<=~9=6u=Ak1J4yY zPMu1b9J@XDLy14q8qb1QNY+Pw)i$d>?V)n`x`!F@mh4$9$~U|1N>!6CV?m@9-zL%b z8clVX6{Krv8W}<~VhYcSb&1Lcx$>RcoRJ!1BC!k3?A&D=O_fS+lb|3FDgl8H$h#eCnP2ro##mnPQL zA;0yf7CBYD>o>{W|9egdZ7J)c#wcz>!g+k&T&@~*PS=>fZ+k0ELxT8>ykp>VBV5v^NPDgG^;#; zA7?$y?9KW7A-0iG=2`S_vCxbIaxiEWD$uC=Bx|akAQ0aW5 z>(bnr)z_xQ>SlBnrQFVwLhpwr|Fjg1gW-1NQp!pe_OCURi{eJj*;T=yDu=JO5}Uba9Qg*791(kQ_QRNVQuda6ZgMua;~?gBOb zN4U8URTyw5@4tx#nr(NYoth%8TqI00JNcj;^JLI^Ux@>m&)4Afky1DyrlNi#a_Kv4 z2#{-HQVtN^1hk@iFnFEg{8`!a!ndkVd#)JlQrkx0Tvq5hu7c1-7N|pgY_rFTR=+b= zfmcv5Vpk6w;`xy$=qgAS+A-|Khsw8FGGUK;b ziIgWq}VaoQk@HO?(CZSSzt(RDJT2u3N8XlYkZfrg70k_CP%vGn~57bdo&7 zuD`IN#W4d6wO}J#fX&PdEf(){M<6`neV>erm7)%7?A>cg5e*-_oyEk`&{o5yu3?Y} zVk03$e<+DZ4!SmWcmO^I>lBWh(Is*aWF3-BiEb|5jJ3n33xMTijA#Hg`vz0CgK`du z!IRK5rimdN>ZsBEJ%+UL;bDTwLGFsJ?x9&@=X70pSbY|bpL77%gR9O4F2>>y*qd8Z zF(E0G9ZKz>GU%d*(Pv+X$347dA1MbwTF?(x1T8yKLJead{Qf3Qzvp0#=_V|E$ErC7 zY(?S^GL{(kB7-22TTcRPBEnw;eKRFs)e{jG*sNfQ#gUY((AgY(3s50I zN&oQuQwI1-Gf+{O%0wP|BtDR7=FCLxhQut{3UKZaiiWmhn(W|*d9-BWxfq>R%!Lis zyF#o-&*c@C<(+c`NF4OQMf7bFg2RLQ%mE{2#&vshi)o$*SXf(|fKOa`3bh2$gPU8P zK%N(5_8Z(XH~cZn2EHABBFP){D$tnE#4Uo2vI}N+FH9p*mv|$zmTsZZTq$$rOe}^9-0Qm;dT73BS+GO9D1qkUu^3--QG6cbJ;+u zgp|NQHWwosDCoWoKx#Z*s=#_N&9sIcSyPzPcHmJ7JT^ry};tNuNhecW|Be@GUw!p(A`p9iI8W zUy{ukU_OE*<6>SVB9ZHCL@Q?Q+TKqkTmg;nj%x zQd}@xNyxsR#`55W>jKQi>_E!!UN-?QKxyvG5UP&g;%}ziFD4ahNxA5A=hB4-J8PS) z4ytE2Y4zaJESyl=fZrydBnA52{2DiK<>^G!_#jloLf=6qPz% zQn$mg`5_rS4Jsu3ZuwTLmWxh39#Ma{;zn>VA!)AR>m?$tItOhH$vW)ZL|np7%{zHu z776&1YV$%|^+=E}lO|1fmDvy&ounv?WXV<&-U)pcin6}CA$)_77r7fIH zAgY3t2Ouv88!3y@)OyN|*7vp!Vp*IT7x@65gg@tSIVOYkF7IZ|YzAF&Bk@+%Pi^4z zD^fThq_@Ba!N3}2q`K?`h6_FmAnQ}M(0Q0x1BI|14ezAvevPW6egdWsEHkif7Vgs zqrrOyBw4}PG-`yZ0&tZdB=#&wkxH=t1UW^4HmJU+5#dVrf>w2{usujBmLg3uh0pB` z8{8fkC2XV08iXmBQiXqWNW>mIyk>wd&Lfxg9MpnPyQP_!s;y!_C`(xgLP)5Kl&`E= z{WIf$^TAv1(oI16i^L(Cjcr-eei?s+!I?#%(#9;ZiKySGePik{He#JG&)P+lR0qihAo2puo z_VpMCMwvU%Ynb@Vv?{TdazV;;6?mgw7eZ?C69gVbOtq%3#PoLH(3Zd^YO#12eLG6D zJ~1cK8M=NCnAxmUUfK?4UMABizqLp5k*6IlmVabwnwbg+?+)HPUO4LR~8KAs_P|xE`Jli!Y*8XylH_3g;T+Y z^W`}_xJ7=I6NFk}3Pj3JWpEMU-bzf=E{hXD(IBNjiD`@47%az@$Y-}SLzs<0KME-Y zJP%#Pi=!?GFD{hIOD0k-1c3OcVH74fMbr}fNB_*$EZ6Z&iiEo7_Nxvo3%>{2V#r0I zpU1>~LGBr%Xncyd01BqVOJ(_DwXeksQ* zUvq^9+L!-sAxcINV6_UtzCDzDCHnQlY(fw&itFRTNAtJy@EMv*lE0|IMurr{sDYp~ zA2lZ8#saz8jLl%?`;Vb>w^0vWncO7M;ulFQrKmuz7lD>ni@TI(5rh6&z7cT3%0)Jq7u#KuNhsKjlFKAZRuCNzc{*LjXP8(@| z#nu+5m_GW;xi!0XbfT&WOXpF)w;HQKKB{{)Hxt8tf60Hb&ivTXpfV;N2r}^i5s{RQ z9{-SbLwDF)C1it0Ms1?bz)&t8iNLYBteiZ&me?V$Jowe3>~68g2>@vgFw*m$q@|f|vl&8*{Q%K^2#t-G1*>;Qm?f zTekT+n8D*_A~ZTVz|7D7m9GGWw*SG>FQ;h|5hyOTkyBJ+Ku|LquaJ9^#93Eie@T?b zy?=7+(uD>Rm3hQd)e@cXaK;x;)YV|LNME9mXq4XppGM1@FNxbUG!klhJ%ra$-(Ir| zIECsMVtHMU;pPm_We9>;@eTS)v2d~JTq_myj=->%S#dptkX@rw;APV1gxr7q&_U)_ zCkyN@JJIOBkKQi?2vTKUi4M)H&?2S32SMn4|Gv&3j~@g1&_T$=$(}<6(IIieAfmt& z{t;pi+`N%3oV5};8VoRQE2sj3P%Errn}*B%^l7Y0Z^LfIm9@jPT*iH_nT9UO8X*EC z?->G61qu|9CCs-p_mFRXSdTK)MH`jsL8ZBelEcXPc|?yRxO&LU9&a@!UwG;905TBa zDK_$>oyU(^fdfSw_4DHPgIQ%!0FK7Iea?c#!f%j5(bY`1eJf2r#LUcjW z#E_4L^NKru22rRU<}Amw;GKXRhsNGuNu zvSEai0`y?C*M_W^j^;HR8^(R)CnM{2Pa-B~9t+7K(uZ9WYZt^fZTuhi%Mpa`F{ig# z)TgSBCHJgB@Ft_*#C-jfJmppRP33o@%UkNB`(g(~FlhE=H$mMZ?kly9AH$aevmS3c>LD}wYVm!xjjxHqz;pR?)GURC_fLMFsZLb z`a?si`G2>`(e6iL^Xw4zoy*euPSczC2711CRaT=V;El67@lRT>_Da4qx!csqn;lEW z7Jg?PaY{fKnvn|r&db~Dx&Ag!JU{#a8wE{nT$oWJpKz(TujJqUwt!Aqlvpq_;nOMi zUcUYnv#?~^+6~vu%Kc{Lh(r6;P~O-q$czts+%M*0>_q1?QLan=8pJcCz~>Uan(2_C zc4UkZwP9|z?3-}s4-bqc`gU;j{$R4&Cn>AFCl-$j(fQ-C?hSK(xDWBUsiftm6apDS z8Y*PRwDT&5nI)>5%jc*rj+o

    z<@BtOU486fD$ps`sh z8t$v+9-?M>?|ZFIm-ADTxK#H9b&YlMfPdL2-0wrL!w_1 zptZHW_q}>m|4j+jA&jhb*AS{cKMt_6`;gT1-;ar@rS*^(&P72W`m==JvOnd+%4e;|(SC$^ zTERLWIbtK#CSJ=Q4Xd+MZATeR=sZ#w!_t1?*e(1Ja6EIPSg zXCE+dbdBEfRspDsPQ_OGnHnXg>8et-Pr`k%M<9{Sp~b>WXEH~x+0@zHKvg!Z@s>%$Xj zc5^W+$9vSXd17<7D8h#EUhUhw>=oTnYRjys|E)yswAgWP`R~TuI~KWiYDYl&<#qq; zx$i%}XppD1F6P@|gZ$txu6+t^TaJ#(NA*$H(j5A4e~`M-u<%r#_L+eWV7PI~7z`1JQ7SS5e@_4dT~f2!?66EFYEBZqPM=U*QAzn=U9&8HVV@`ta#O#Xk~ zBZtxU-v3w7c1CDv!`fpmxxdd0tZ(47bT*XM5klmy+plwve-eMBSclvm8o5|Ut_#_T zG|i;Y3rY-EcBf{R&Ulvb>m!1MjV6Hr?xb8>He#`JJwg~l5j*OgLUVq zUFw$wRFPUk<~d*Smr31+uX2y-p4Vm{GO@7vTGxttDrNE&2;w?1i*0$ruGZf=f7TA8 zExF?OLgyGi>Gb;0l3`ny2#T#cFr`ZliTiQJkiNWHuu&_PI-|@_g!N z?Q#wfsnn<1=|i2-L6t*1{yu6581CDoOsr8;)#3E0CEEmZtWVN)Zj-~Kozdwh#h+dV zNIK;wK?XGH&u$s-6ya2CDHJH$ z5W^GKXnW@zfbeSA4B&ZFk~-=w?kupW#3PuV9MS@unTWS;RF6)dHuq>r_voj%JMfto zeu8{}k_&aoYy-cfDTroMp!eQ#6Uak#T$cfA2Yb{GP-rNC*@@c4%DbWy4}zzCIVKvq zRq&KheVg4Yi@q4{_d6(drvspq$%hEs<%lnz*0D zIGmZXPj|U5Dpwmvk^cs|me|Ow*f<7&O5l&#pI+uTcdG?&JAJzb<7M#9E8mRu7O>^) zPVo$9$~PNaOs8P*9CZ$W$%yRYSclg!E7YRH%`gkt9Iau6EM^JnE&@*hM826#@{?yU zeT@F&>UQ}(h{E@Y{@x9{IKXLB1C4Z#Hiw>AY~bE65{(fxE`T{UY#(G3HEzgM*%mGy z)KJ<}|9pd5F%6#H)LBik-S5!y*FG|FI>Wnavb8794rh|@?dqghf-j!i0;#Ee`7_Vw zL?0J8edvxL&nNZIKM}@SS4PF7n11 z`G-N25X5l>xcNae*&)YST&1#bdmfDTd1-Cm|YVEcX$G+xNzBD_F(1=@);5_be@o8M&YH|;u*8)Cu zi&8sCkMeX9i0rMEY7ZN6S}t(GU>JUqpTWX67b#G9XeLy8>YjzN^h@N3YFZ>hPf>}d zG)p?Hd(LZ-Pdg?yte>!oMwppqEsu=ej$!qYzAr~OhI>&u$$Tu4ee3<`Z zIY{TS$k7XC5_7YsPIy>#5C5Tr*AKD*NRHYDcxq?zM5?H3A$R}TbH;g;VN#9za+d5y0M;WhDPUect_zU zkZv5x7j*%jG^+aFFz;V=Sdxj-Dy#qxqvkGzTQfc5DtiL;8HRbCN7s#$A1!el$yvG$ z2uAVZ)WtxyGo_c@B7M)K3dGkPxll*k25m2-t$REl>!HIstPw^E;Ld{)-xh*xf z4`#>DjePYM;1(xy9j&1pti?zXe^hNFCnwZ4q8N7;+m9GB$j;h!eBHU}f#)u`Cfjx%O~__00PafXjy?~v_PzpKIs@y2Lp3e@ z73X2UvX-y9%d#yl!SJU~PVQghD-78;BM?E^KiN#oW+&vGenmf#H&0#WHiqz@B!~Br zKtj4DsE3ujus~_)J1LOaiqddy^&Situ6IfC>tA@_)Fr2P;1T)y1_5~EkA9j%*?g-X zT<}h@Lhb%0NZ&vSI4k}4eA$U~aqFe7DqpHb5$2t5-uc9Z=1uxGh6tY3$p2}@daltc zioCmSNq;D-sXjGc!2a_Jfz;cBnG-JmdmAK6V(!{Y!c10cZpG>DLqr1~>%uKDD&q=O zfR-ncPXKzr9P0<)`+(guOOH>_m^=Q;Qhba=&>#QeIKETO>ivgfoYM901wAY3a)csOnR%9d`KZ}Rmi?0#D8OX5 z_wg)^Z+$}U>S&c3yV*Q^FXr4z=7aSc`|dy-q0QK)(?89@BK)UZa|6N)KRZ0=w>-K?$FV{k?!;zkGQ&{yskDx&v1+MNeDWntJ zb{(OsHGgzZ(nTlJIwlGiL%`XgJ44O3F%X~}IL^_Gl}F&_(3@(Yb^r@PfWimDiNiAF z2eqT{%*U*6Z4KIO)F*rLy8juJ#;3^&hs%*^_Fo{tHsRjvhicp7r zRFdR7)LVAz+U-ge?=h8xt%>sm0c4sbsW}SpkwCFLR02kSov&t@(l%lSYU2tHSwIJe z87Rn6XN0h2c*Af`SirdPZ1$dss#NWfJt#S#>Z>A@Z^-$i_b*M&ggQfOeS3Z&=UyCqJVwN4!0j0aNHr(8YX2(VGu@bc(L3r&X<`W~rJB}#&V zfK7Zt-^)lApVXnm>?#)zV{PKH@~s}T5L|>t2wdt-Ln;xaiv6>J%nQZ(1m4Avzs7RIIKHcGseo%!?0Bq5h$s1&Nm5+-Pf2*7ErOyr6qHLwAj zkX0rRCE7BAR|?HEJooqQx%*H@noY3YzNBW-4wXdY$`uI=z?#Ey#zOh(r0kz8+kOl9 zKZ$fvfhzfw9at`Yj+3rQryI1Sk$aH8Jp_m}vl<6q&RlY!U;$q{B7|5fi5vjUT{0)m z*6xAxaWtltRK^xwnmyVql&akZ8_N&kWrTVQ&}pv3NscF1B6g!XhxczZstE|*B+J5pkB^D#Q-&>jH7q-Ot`AeDbD2fUelXbO8lT%si- zTnH)SeaoILi$124vykq|T}k2rthGC!!wg?59*_45p(<01u4Oe#K?t3}~2I2>-n zVNGy3MRgU1W09S4R=meehpf(R5)J%iMki6S6yKpdIWoVAB8 zA?@+YWyY6JI+e9<^mW)sDl#ia1ratal-eLh?9;xXFQidm`8^YXLpxX0POTiGla46C z;dtNkNoD_z%Qt?@Y6>H*mKJrr#(8r&NmBM|PrbM2C{iwBf`xlC0CiBa&CZfo*n{_8 z$-ZkBCA>a5>v%-72jlMtR48*1J(#PTy(=K7D4U@cnm`4=P>81fq`?RNu=%l zfuq{JymQ+o4ddhf8*Mu>17TR76kh$^aVo;I5pzbl zqSGaeGIFXFRrTO){iV9H;<}|8@uU)tHAuylnISRI`Q#Ynjg1aIGQ#xdz};4H-b!5i zoI6U6+8#jy<8mVg4|@(2`a3lx_yLdN;Y>h*U3MlFD8}3Eat&{G4O(>qbM}aQdm>}i z@4mqH9MUDOAa7&MVU^b1?8tU!lA~W{snWf1#Z^oq#)?lfi-EUxMYizJwgNO+A8zjl z7!2>wt|AndRLtj=uNgn;On?a{9EBnQzJS#*PQsOU5}XNkS7i3s%?pl{OsWO!PLCdd zJ`KiyhsPS^ak@0K2>p^x)g4njWz6D%2NaWg{>3hM#Jotn2aaC6ry; zs3`MQ7xu|)=iR+o0dp(GZ zwgDsu{}MI*Tj46Fa~_gZ^sVp=T-dI9cmkW6e{I26xpJ%G1bSqjj(yihyzJ7f47emzB?xK>wYT(-1b<%N0|_BW{4yQs}mv0{tq9 zVCTT$O?NkR@elWt^xg&Py@BRkJAJC~p542iB?E}p@3 z{t+Wt-?l$*sU+ItfFYm6{kCaXt2)AM5765cYUR4AQ5E{K)4hX-PrpBBa=6?`NOB%NU9l#WLA3&f$qrze?U*X-vEvN-KqjRHxUUMJR!I8Mf(En_xMrhy5bNUv zIrwv*PH&eZnd5j0Ca4^XlM^xU4cEW)36!S_Bg)Z7czk(8eTb_mUENVW$K`wg;z z+kq4|8`vsM`mEFPy-89Spjo#MAS#fzqg%Pme#|^RsssIMGv(Ou!TFnZ4RoMaHS(4S z*b^{w`_tCgmKa$U@&q5+E44C$C$R0Vxcfp?>z@*Puw7z$!hMSOQZPohTW9lpMj^8|ASWJ;^u>kX4R^&WORxG(qGCec&4kKjCuE#LmVNYg}~ zaP0>^Y1l0874nPazRaRh-^BLtZ6Yko`lk$geJRvH#W_(y*K}-v-pdAy8e|mKpxux- zd;uZAgHJj`Y+@lO3mep> zbz*%B4-?GwrvRv9!`H&9cxH#7oq7Rw%L$u!bcrp+l`|JJID=*R$Wr4^DX}{1TGr16 zZ;CoNa~0b8P_|cS?}elYaO(!oLG;S{3sStcW1tCu5-ZArY5UX4@8VkVu1s)r+Sd6Y z{?Z|`iYs6vhh6hGch=bP0n7@m#LdIlol`hEm$R$;&@sNDVZ9-KpOX@lg{-(I^v-dam02$^X27EnzNI&m-p zs!kh#87u#d2r^Zn!^<>!S4K%D#sSj>m%8p+%nl~nM5(iKALfLzDKh9dj`M{CGW*Li zP#m-Rj~ajZnbjDag>M9T@Q`{6K%cXHgOB0&@q2MhQlMsiL}ZN zdu|Yavxg6wek%|^%H_`+zueN@BZMB#^FO)v(6SrZ*V;-oPI=K;fgMu-LPx%5)u&Nz z@*3D8=hYYIY3{PqPG4Fcb)447IXPEwXtc%$jUii)c|$ep>&9Q*JK7!sAu8&&xzz?v zv!j{X165!cp1-?v?054I!X<;F6XEavL;zapIDdmDLjCFZcyM)Sq z>88H=LmdK}uFp{GG6RIBKF=jA#HlTl4*<-LS%HfE7oBC4a1_x>vl_!z@bwUHz0}=a z>xlBLQsh!sjE+K%G3eBJS)ldN+JpsN{?T$p@{#eOK4cG%YvCO6mR;&{shoyD;z!j5 zC>_N@3&!%4Qb=IDlZ({c<`^2oHa_ft)g)oMNtfXcr$PZrFWp|Ocd9)4L4e29%WL3k zTyem<7}GPjQ(+u4Yp+Ol0D476(@PZt4`}U;uF;8QY__=q@FeP|QCp9fRDz6GF}(4ihbP0lnz)c(PulJ=7D z@=;ihVMga?y!Gwzhy4LbKiKL*YIq0t*xjTV)G4oT_=a`ev;IQE$mBfDcg%%&PMr~* zDzP*i9jHVk*P0-*%Pbzf)0m z(d3zV!Nr^#RqH4D$$ZM=bpKM;F5X3fRl*-^%Sn#5P8L6T8NXA!PfE7XAbE7=88{%*%hado^?_f(ltYFp(Ee zC;( z^IbS^g;_O&vUe`(CxOq`ol~mibFx0{0aZdHO^EJX1;V7LY?W3bCPS&*A2FXj=D>H` zZu8RW6IF2UgYRnD)F8@{G2rLO=YhafyO9W(-+#|@WO@KS!Dk0sqsVKa9@D?R>0Ica zu{$U(zI3G606J;A0^hmCDs_MU+L<1Fe*ge77LL1sl#AsgS*>~tKgX3@h3>5f)NV7e zifh^X3cHy(`>x#ktF9Unl;1SC3T4}uOsO607w^>@&2{}jMPW!iYGuLq+GwlB=2(y6U`K* z2i{5{3iTSRb;6@9ZZon7ENhf@k5Kmg)}^Dh9`xEC1tQ(vbXDba?dofO^rbR0{meHW z4g^H$YxvmGrkA|#E9&9&Xv63l<~dyXh;}(Pq`BFvE?Fs5^HT6}ohcaiSyuH~2HMzM%%_)2ld|K<9w|!TfCnBGdZW5m=vC*t!WO>y)61j8hZ+N*rJ2%|wvL

    q+Mw?>$MSU6HRHpImv6wI}6_>*jZ1Pp&?>wP#;P*XED= zo^-uH?@hm@U&;smTNds3AJh65j{eWAc=P|%G>3^atXcnGaP%+Dx|Or&ST9bAM<1$> zUaXmSZ_K^0H>ZJ@*OYRkd4J)>lq20RYThrsv`^NZ@*mCm=1!O@!(DP1DVM{7bx%g+ zy~Qo?ibc)(0K5Wz;<5y0$hF6*pO@9Dap`RWfqm+!=o5(d9+ulCp^tWNJ^(&O-*Ru~KnGuig6jITV60%?Fr1|xFihJZ+N>Jf1D2cfSv;e+f^7A9TP6$b zlZlO9zqecd1XPJjWV0o5@V1(@Qevc&F;rI~!9q+Xnp5J?uM<(pVIeigrCx@A>N zE*ooVt!m<{(J5=-BQjW*o-}vk8BB2hWB&F=%c=QZ0L5fZ`NjMpM_{mDULCv8{VtRb zpi{b@TDkU@C=weCf+%ugdK4=`vGNVaYS+h}Z+Odoi6)oh5Jf3&tr?ei5 z$=j-|%!3Ex`JJl6N|AxFMhRBOf+^QZCTQBXpcM>a=NZQtT;ZqF1PT6JJ$+?hvE` zeaOJjvgf8=hIkR9ZmQDjV2#V=72q0_`FxcEl`s;x9Y8ic%G|l(m|x%}y40eRyVPW#B9tpspmWWpiJEL? z!q`5Ah#p|C$`zEP)G)zu;_|P9QP+rk!LH3M8y0E?RaJ|qIVPbfRY|pm`s=wKak>Dr zH9F8Rf-XH*4x-7!cTwgw740Ql#>%=LNFqg9n6dCv0SNUXjLiUtx1nxIb^GIKqyvL) zf@ok7?4)Q@pIWu`)f=GKC0Ff6Fs>>b+BL+(WltcMbu81<@QWgcMG?Zz$$j&e9I*cb zVO0ptLw!g2F{dP%4J*8tS`iN4w5Q=>TUiu(wBwczi#0fX)Nu*WgWeXfV(#-=v%k2w z8O=WI&1WiTHAktxrUw)=th2{D=B7&91(lt+NUdPWDXR*p+SRv(npgMLdnj4>Rf+)Z zv=wv{&EE2*k!4$OEqtw(Hj-q46C~L8*>)(!0zbFQ%jC5Jd6BDBX zjtHx>mM9ciTdqn_UU43VI1*Zg{hHXG(XZpeU?RTdNcFA6T3cM~j4)tIt{m=}GC*>9 z6p5T@u1fdxFrA-L$q11riJ`1ja4&sjx?&%~Us`Alt;NT&hMZgkAXf>evvpa79`V&E z=3dIkf@k2yo5=h3w?lp{U_FB&rVmZEA$5ZgYXFi~ckTuqiD#s5aE@LiJP+7WMW}Fq z=qKYPl#M8(wSWLqPF0g=KBzjI!ms=bP>(oyvza<4R@erB{?(vSun-sd+fW3C!+JJN(YRbI!O{^5j|f@4nUlz+qC?h*VZF zrnX#uo=fF)%J1#;q{abedSpi$C$l?bO4d{(`PJc|j^eMV3&(DcWo*T_u{3_Gtt7?0 zvU5F)e5vFK+CEWeh2z4l3M;d^g$7)BcEC>8?QW)eqGj8t;1bGQmUE`XO{&jjCwDa^({iU+uJwLN;rmGCOA)0Kz=9`8=-=fs5d)RRfPjZ(SJ6KY9>f zy6~xASY}giwsGaW#DbY&tRdB3XU+N=w+Ik6Qs2-HNEQ>^xE$*j-C$kS+;QG8@?()I zro^r6e#R|%8Vf;Qt2&wIpa7O-R-_g2i!xcb5PC-Vg0%YAG*%aG zHV3g>Igo=|@2d@ra0syouQ*d2J{PB3$+Of;j_Y^++L~A2V5=>E!~6z`E-A)U zZ)g&9j;}~gvrSm`s9D|&s*&erd1Gp^o|;S2KZOTWP(j<){sx zp|#dKfl%}G@bIU*oAnW@?`eh@UWeFoly&4uvY(z%X`3=A9fOA z&us-R>{$~oEi+|OAI~RfxX5%r9%keWS&>FAa$eDe%4#@hL82MKb<2-wT(Y= z3LaCzo;9O}K1x1_p?xs4!>wVg7&H0!jDLIRZ z%woA~q=eu&;6W;C=sjR8(=<$B??%K_++F?)BIXqMlghB~a`Rp3@O{|bL`*E!m7`_N z#Z+aG<2g=97%M*s8HoWb6R~sD%6gutXa**N)?YwaUkJ>-HnmHiwI@Fu{LDHC%>aGp z4mF%ia%&}z1OpTRbL}d$`;MOM{)VA_#7{3xf^pXA=I)^df%YxLhHZ4rbij5eKwF7H z_h8*Q$fcrc%-STfBLrUT!IEgpI|MqUXT*4_OIjQ2&dS{VGliH*REjw<7D7ZCIieb@ zF+S$-U8&Jl*F*`KMWQ%`Luyi=)=-qzHe#BTS)Unov>+e(!2=_PZySkOV&qUca`6Gq zqS@Gx5sL`KjwiUL$_l(y}iLbE(TItB4t5mLcaS-B>K1zoNZIc=D5f=#2Qd1c*o? znte>xNSNFi^4&4Up1xm?KMwH=;C6D3p!oWT& zE}uw$50Lo>ZKgp#c8Q3O*_dmH-bc=6I=?j`9%P~~lmo`fQtjC23#?of7eG0-d|Wg1 zFLH_Bdr(BFA~VeIn?pIw6ok^}PY(*mg*?;-XfR`-DO5}xaO(~+T}jzL6Bt~WuWTvQ z^#s%+^HF?YG@V%fK<}&&nj2sKv}MiBYVxkH)x;jy>jr)&f*mdJk~3br`S417N&SM@ zanOpu6>1VOX)VC{8fc4>5_ez6pO5nsVC!hL%UHqFjoKRGTAit|{m!|qRk{YbRVOSe zhW_xMwGa7q9Lj=_N)yx#A7}yL+1^V|moocbL(xmJ2xB%dbdAVrstO-0-2A@y*#4D2 z7Y6R&5=C-nf)cT%5IO)LcRM88ts*1a0pHh9F24XP2hLwRsx83jOxHBHFkbjp-0`S) zpD)iU1MaLMs`xnL&q2s`HVQ~x`m$=7V!ujCMsTBkyP#H&h^@m(uvz&I`wy!vitP&l zV;(V^TSj^9cm*xd>>xiHU=ll^c!n#1Yxf3SqfJY7JiAlHx6a3}?xGzNvsixos}JN;SVvJwNh{&T@E)FR=KBDrC#?K9jqCC z?V)S|lAVaAyq$I(P=<6}sHAwwW9sDR0cfurVcd!}j%>2NYl816ls6i`jHsvZtH!@t z5#;-{1P(c8su7OqgRH~0((-j>k;DOL;47dBpz;)}Chs?CrtE)a(f&NC(_6na;B=P!bdUAW?isQGsG2Tm8s^5GZL#yGh2HNj+noA%8B&kA!VLm@t>K zenruvwTD$6ZWO7+)Rz%gN7bMOaUpcnPNP&q@5Xh*CX-{AP_#|Q=G_k3%PtvX-|S$Y z^R7s*(=~09%|1JWe|Sa(zw?G4v4Fc19E|c%f`_Wn^9k5G0bsF-yi6;W;Djli0(7Hd zZq{|vtceG|{rq@Sek5N0IP0Qso%Ct#5V?$voxCg-b?gAFH^)djHq$cz1(3djj zAyRKgeW|#O%mdvxL!}DrO8N4Z^Tcea&T&dN$E{_9Tb0`c(GdW1QkMrp#uUzebPCRe znd+}X&SxN*0k{NZcWAzAX|aw2cTBSkQB*n7P&;BCJ&++8(6~ZeqXZ)3g&C8fhx+@w zEOa!ew^*=sm`JhD@k97Qgm}QEgBVS3v0YtJb6)lucl`n)Tt7uZfb`8A=%m!2u|3!$ zcHq8kh7e7vqf!x)HleJ4>`2a)mHp`DewweI9%-x_OWmvaXE{9}Cs z%09i+Uh(V9ql_wT#t}I25$X+?^AUer_^aF9#VGUPikBT#$5eyEGSO+)(n#UPK3tvq z2ff12o_5xUc;-~!?WI2^?nOg2SFJLE+10d77t8^tcF3_&+mClmFL26aZ~cWhC!Z+L zM)}zKvUk$r*s@`ao>Y5_j2zy=MgTDTC_EU8Wc@|VgHz`m9ba_J5dpt5StCH8TGWUe;3+JCmk9W zNtRM>kzXEMx#uku3@iFe$+--ar6OjV%xDW^sBt~?v$t&|^Xc9|$BL*0$S#{Ae&Rb^ zWGPJwS^-%oO_3Z>_5_#7MM_}7#~STCMh5ckqRJdnLs>wdEi#q4BS7=JH-Pzh?3H)1 zC)a3;#OTArg{>=y)=>4yV)9Kdq;&I+gM>XF#&NJb{IHRJp#1dT*EZyqLb=q-dWXp0 zGC>j>dsD?6ly3kAu)zp$1^*e_4%=V-U{^$)Mqnl$+IxS$*@ECVOd!I?q#!XL7o$nZ zo_yuifL$fCf;|jZ?&)nk1ie4WBtw&4Q_+4)W60q*vvKo*Jn+)G*T;&N+}mT3dl-xP z-=Hnkt3F$h??h-hF|jEHHb{rdNnA%2`Qqqq{jkB;CEPYmDsf}8w%6n((Ssr<`Rld& z4so1;Q_^!`5pKV!5wqNy^Zbcz19l(Q&!Z3t;S@e5UcTOI7rBIy(o>#i zira}7BZw(j3IK|3lHYFo&61O`zI9w>M)VQs6#s`p?5zJ|KX9=N>QHP~SKckrGeQyqai z+0k6*&CwxX&I|)0JP?lX%sO_2?Q2PqLkSb?f1BcgP2LPY%MeIo>vOhug03}#3t#iO z8pT`^4KgNjK_r<=2}zki3nMAp^%F22LbT?jeo<}6>mX6q8EzY=$+w}|-=;ahMc_qm zjfuB+-J1$v^hj3TJyJe!yfivl+BKQe8Gb%p`~6pTBOAXwB!00+2qsp!0ffvZOjpltfy}!{j{{X&ipKj;PywvA>WfDTqJ=^Zj+&UpLm2v>ruHm zzj~=cySG}CO|QaTt$@);hfVt@T-_}ln6&(jcUVrARJoMN-&yI9V7p}p0x^s-{T^jK ztzZiEDCpX$19w+velsEx8|=UwZFj%g$q25Hw1fKFDr6GWeyL2E84FaYnm?nKEQ}M1 ziV3sNPE|30cvtk=-tl6pZW0rJn>+FxrwT!_g^ndu8xs&EjU_;~9mpKy4j~^~N@-^U zNE@h$?x~bD3g3=LA^P-AL_aUMcfrHB-RoH!A3=zKn#&x89AAE&s#0EPdBQWv4xvhU zquOl$9+?NGW-kTPShsjMK_h1YTEA9r?sAE>#X`f4=DJRJmxU=ctUd=%!~v((pKM}q~ADd&SVuk_CNU}FeEhMS%5^NJ${lf(dI~V@0cW7 zRgtB%Lbvjm9csFwv{HoLmNQKcP*I8|bz8SaAha!Q=9!!DFJsTiR{>(9L5XfwLlkMn z(lew#!P-X7$5;a4b1mZq({^bwaq~sL+5jUeMgf@%tpxk-oaeQyfqKnFg%X1FKkG{;`I|M#%nYzJddmlSkR|$wUbok8BQjp zy{jeBkVrz&;>y<5_5J|z%(|@Gt{KY%eDCS*m=yjD8v}Q>W@JyB6KAmSCc&n+O^}Dg z_7wFfI)Omw#cZL@x*kOV(jz2j-RR zW%{V)A30bD38=c+2XSZvP_qbwmFzu<+h&TL)izy{Xm)@i29OWpe*q5#pi>N$? zcU+O-90uux4pCqNU{$3U4k~KUaP9-3+6I2#Jy~94jtl%_QIX4n|LxtvdmdpLxgIXY z`;Wz5r_RG$FR3EfEVgtksPVGd)5DRj(;*$I(vFdXqbM~XTG&0XZXIh8xOZLnr+wVd z=r%bv<^$pK6-6%T!unvh@4pzi=WDKS5Jeh)^FeQru0GQs-Ani~vhmCKy46y?-Cob( zyWT-Kd*@`;i*K$|o+6x7fg30X&NGd*cYL~zG0~eI&8uZCO(IPh!z%G@$mJS6`50rl zU6}rhiH{uA{Sbb!t;^;^^k=!_uYX^=Q}hU3u9SPKvZ4LsNZmC>()Fn{?vf#2~89q8v!M>0Ar7Ks=`I)y5Z(Q%g}`== z7bCyi_mq6Rr;vn3`_RO^j>g9dNpafK5)5O>NavFhlRi0{>gLjP@z|%X(%>ZEl`~U! znk#WsZZRf7R~6a$!w&~tKnv9#aO^?QMOHGkY}ZWklBWml@6pukZwTp%9fD;qnFhuwM*tGSh( zN+we1>^=C)DO~t~(A|?VvLnK%jX3c2WP_VSqaxSV+w*zODJ}Gn+r_fwLWR{<7pqHu zU&QJ5N_9es!Rnu))#;X0V?;EwAIOujDOW_)uGT~!Y2(h?XHNH50BS2rc?HCB?8<3w z&Y@2T-SgYESJpSD!)L$}Qlra~#jdTpot20~YjcDs@~NnyvJ^3iRbh(EZ{u?Kgpk<@oG(hZOHr@+`dZJ`38YX^ zfm){UZcB3Bdt5INXR8mMAN@)tRZir;(P<|papx=iEsYBoW~Xu|g~ZkxgWs5m%rzW@ zcIyIq1snmr{q=cZ@?eR?JWy*cVC5y&6`E+;2z?l2) z)S5?+UwOm&;)}a8G|xSH@_XLC3oqRFWIcHF^z)T{mxf8u{}u-LZ{7TVb*}$^>*i@^ z{WJUjajp-+&h_BTQ=$K8*Q55qjq~1+gBRe&IZOpa96TBOKMVE#7u8zoz!_G8ii89Ig9dYKNhMd;c-D z|I;f|Y4d@*C;!tmzteT` zar?!aXMU{GpEdrx(DcL9{`8dm*13@%XaVeNKM&IdS7y&&dvs~!ZOh2>uF=H~7&Ev6 zPtsrfAPug=ll1u^m^YYwd+FAPzPleT-urUtAAS2}m^b*LZ~q55fV<|8ewn#F|4-Wd zAL?M{*U|rxxWB#oPu+a>>H8_gpSR}zyGoz?c<)Eu{KNkh zLU$Mj*!h1P253Ey{%SpBKxg=rb|8JU?d#bVPh2ZDYO9hlkPkzej5ve3Ufm*#y{5UL zbKtsHVPPTW4D#0Tn@7W}BQO4>%^i>3cK7k+V zM_}v^K*d*l+A*lUt#%4Yh52u+(4)UGreeY2c#Ph8k>SlhX_khiDq=5L?2X+8N8irN zx!Fv?_?E+;kMCv#5MH4%3`yC#onxU@T}y8#t-p_yx*colJpID_+U8$ZVtO7HEMC{R z37^@yZ2bMKrxjc|GjjAr+4Xfb5e-5F!9fO+62E-@B{sH15sgqun=9~X3m8FR2&$Z6 zOh&WQTv+?)FcUFb#mMuO&I^XoUt<|#CT5nJp79Uo_TUr1Ah)y>SHvGWgvMg7e8&jdm)!^&~%}>h~jU~NL&_HH(Q}e zt4s$q?GKh?)niuyxrP~w4#iYe3O`o=!_5%ydVJC((j@m;!Z=|zkSbc=hC;L<^!Tv} zEsSM;+)GlIr0vdGxjc_M(4NTA3x%q3w=_16d-0{O{8y&$|=h$tAsTFUFG@Yvw~S5CkriQ0{g-0@FBdpoF4+~Ke1*H ziz*AzSh9?1xQj4<-Rksoqt&|8%Gj&PdJfX?NYL{@_2|1iNlhibi?RX$czJrHFeyFu zlCDLNXNTrI6QjdTCVE|TpWgJlR*=~4s=>bGXN5b}#>Pk0HAUl*k!W+7ynwPG_qZ75 z!|GOlQ#5!YM6YXMW+&d zS5E%%G#e{k%$-Rz)8End*9$({0hseLD0{;jj?8}5^2?#PdGPuX^{<00bP&;Ag(ZdP zV;UYW_r1eJCtVt}YIC@URM}<4{Pt8eLNTnma$1T=bcHQXYV-+e=q~>?S7x&hAJeQQ z$MF!~J!>Nxz_tX&$bS8x{SScY7iiM1Zmkm%6s20a=8j!b8k#9r+l|4oIYQELCCYNm z@Njraqecz|W$;p#J39#=`}Qy6F0oC1*)Cefp_F5~s9mDyID&4{1Hg$TW42(c8|#gLx1Bo%W3giB!*H$Pj(r5`t;yf3m$;_g8( znd%zh?dyRajFqmQ;w@0H9*Fb8NI`G%-r8RiyOJLo9XoF*&s`I3Oo|w|f%*0d8p2US z5u9N|OPEOf$VAWAYN!n`^43QeYWkWNW9}$DS#stcw7488m19Gi*|0m2g{2O<69eW* znsb-6C{n#W56W+-bSlPT2X`nR9v6*u1Rj4w5#$1LTZ_Yz&4v{(A5ctM-R4uKDKU}24J1vKU;27;d-}68lbj)RC`1OTD#q)HF1QS zwRk~`lXGjf?Prn~mcCi8eA_T{~`I7f%%o8gYcC(q0T99W1t*t=tv>u5*+%XE783C`)%hwC#agd&JqSU+` zdy~q=d@1)g39+g-{dkUA?EDs};}UWM8aBalFuc!K4a#a~;DA^AvjnSFH_s6IX<%f# z{k&&Oa-+)D&fz7~LyyE36a9ct_A845KE2DL;v94?r^{Bh^r|PQ`i?y=BaY~H12f)+c82AiUzWk|G8rj&tWL$BqK;SeGyyILbj%M&uzQyf zOaOz5RbB1FM4ngtTo{n)<%+u;_+A`XoFT)kRW_d8xn*GTkI2E0j zAE_*VZuHt=obD=s!y%A|F*=NBi=52m0zxH#36vonIY|Cqw1~gK#10o*z6z?R;e5l6GbcyS$}cvt-jOA`iKe};IHiwq$rO0YyJgk8x5 zVe@M8G%1$njpl43(-6nPL3f!*&kjvfa0Q;3%|>(=W}c3Kuv|!6b{D<={>lta?rLs0 zYi{dE&mrPFuL~g#QIkIzf*2#I>r(hAeY?57*IqAxnnw>z3tAbamcG+H2OGM8bRd)6 zWS%ODJiHyoR&0r#+ypQ5*2$a-eOx=o3kHo6zhH^|`Lu8@I*SGDQVP)^AwwEv$w3F# zkf0i1nQ{+7z;Wb&f0=S|BYU#X0_})WuV4rDRi&ZRdkxEQW)(oR5*IApOB8KWAsW^6 zAj5&8RVkM6u5(QlIpSVUWZ%H(mA)PB|jB5s_*ftrb+fVOes=LXoznZF?No zx7Kg({zNry30V+~<$x0rDp0rx#te63l7$3A%eL%XaI;5 zr|8Y$B=4)O>816vIfnZKuhv>FS5%Ux3e~+b`pOK}acfa2*cgUeBr}4wG=(hd2eMos zqAy~p9G%C(4WfZ9JaOWHXV_@L9~7TI3yxfgtZz0)>d$SB3*w++kKZEZqFLBY4ElK* z`4@@hp#mtFf>fQ%gc6SrSzs4yiKn4sq2v=EQ77IH9(gzD6xmLU;N__^_g8smRxrv> zOE-FZVxl$4vC6IPRZ!X_%4!7R5P@~V0rYlae(DiDzZ3qmP4@=eqZCIeb{JEIZE_s+ zON5pYABPkWf)q$H1G$%*wRRY*;|xb>8{mX_n8^V1I z%gJ7Aim+SkSKbU!c)+${R48>xGp7BNn*d*9b{G|iQbJb?E$r9KE+(J+fm@q7rao6)Z~IL95eJ3lE~=) zMTdxNX}ym-!K$mQbuA5VKIpuTSV1+@R+O&~)w>l4uHsO<8!(YO#E3H7ZibgDWRIOH z)VVhRfhkwoZG@gDbS=C5wzqGO2hY5Ls$_JMm`|W>+Rp;r8Tg;g$c+ra3WX>CzWXLl zA9||Lcj?a|^(o}_nVj+Ve(xJSJ9fB^*7oTM@LH2PKNUjRylfm7sohCh+Of-HpNFx` zAcN6ivA<%O@+>hHefEX^lhuPyA07YQT>pdL>8xgA8}HKiIq1M7>epw$@13OMy!|c; z{KW_`a2>vOlZrdPPm3|E8i-jgZT-;UzP+gOkEEeTIY2`zu|uxkG6F56+%_<3KB6MPIpO4kdM7BZU1J@sBV^;VJbvJ6D6ZCm%K@0xmu1K zy?hYgFo0G9o?Xx>X_t7&y?N`r@$J+mZo%;Y2jHvlbz@Cd|AjXb%Tp|Ie9$5CvOgctlA}Ub<7=)Wy}>GXDx#UxjvvN8 z2n6;jQ}kf$$h^z+d*?8LJNk&Y{H6rmL#XF!t1!pIuG_{%k|`IE+Pq7%!&8K^*notS zu9i6K3s(#uJy=S;o!x{^Um$MNzJn;!hl)X#3}1N#*;ECbai0v-|n7}CdT^ka@=6xg0yaKf#G*>n> z8UP*TCZT|bhI3fFxc|^WEfv7_?m1WFB-&u<6ft}!u*wTE3`L9%qq(c0oH_#zV}@mi z;c!4ZSzs_v7b!zwc0os#(SK@QrN-v4$L?0g-^@$_!fVJX(D`fDbiIV)C_$NoB~l_-3nl+Z}V9!tX?a*BCPP?6qEG_fF_BA?*7i z$teV3IEfVU{Uy9rzwd*(Andj>!~r*r8Xylry=m2}Lu)BEXdtM|qya0Sxk%4V+z>1c zw_g`bqLSMg_^|ZrmCD2=D=jnXFQ}<_JP%y7){wxT<*&J2D}mr|nI-~)l@LI@#AiyS zhb(a&$xsbdAM}2)^b_}`@4_Yo=yzoL(#AuVG@<*ZAZ`mEN#}yEv~?V0=(Ne)hcbYZrt*dZ-D`1ngEKLiI3Tfzf7l|s@vEz1BGa7XX zMS5IF3A$n%h>cXZZ&u7dsXX&x>*U!sU=RPn-^9+}%(e#tA5>{uM;hMS#GbYJk@+K>W?&#~IY87vG`6`*3c& zc%D*6=WfFw4I)DDH}6teLIi$Q{rS4EUF?9BkSYa2s4Rzg6%vgoq!7eb-(MP&_(5s} zx*{u*qjj!~-i5kdAnp?V%Km&!k-KHlt_!M466WpEg2NS(6 zM^qtk%-5o*&!dr<`eFkPy=2%BT9Y+Wd;R8Bm57WtSEl1V5xO~Hc+KZ=Z-qT;oRYH) zFJWIDw=*~R$fpX>a3M}RDbW7=e0WfZ?1Xh(`eafvEP<5#-s^dI;dPUVmJ6;5 zr3&AZnl)#|S0c=wHx*9xi=J|(JCX;Lr1<#o_U}mKPLYDIjk}gE$pG2J*R~v8OE4l!rmMlk86v5&F5F~g_ zTp>9+;wO)|7LP<_i^JQx(K{-b_-sB2L$I zb36ESSF*#3fK-W`zq)h8x8zUVFO7a{s&Uc~gn9uu=(i#Yz3ev(L~RT=?VuwE-hY{B zjx_bP6=2^h((d(kQyQ#o^@&Bx%&)|;mx+9=KQ$4APzF6D$ys_59Qc?@PbNhGb~UOj zVV8=q;OxUrjVT$QSn?54zv3V#(n5J$F8>H_fVw_?Cwx!43(FafEaC+I4(M(!`VE0r z`|7kJObL~Ox}ygzs#r-KeC%IP=Ut-{88DGAV$s@pEZDuh;o6~Z$~s+-W`jhjloBt1X(>1kW) z+s>du4{*iuFPW38zOSyOdx@obHX8O1e${X))0OACJB*}tUAOv{P_D0UBNbWPNq0M? zU!upSO1RgMIVgC?y{=fpqLB~OYsD75G4=4uKgaLn<0~M;T{$HjVm$tnM!}p~!p<#L zM7nr{d%tGG>xP9UJNxD@&);-Y^ZgK^{+a=Q8Umnx_3eVH8j^%RVVRomluX@%=L*7M z2#{iMalwqYw~&${=3{uEP}|p2i>zETK;jG z$lwW%M*!G2o2c9?fDl%tY&?;PUw&S3!gBIAdXaJj(|NxF%@C+N2Tq^@LL8gsM0icU zroL(o#F+lTAb@TuXL#3$dAMJMu!1o&5NB(^lm2p+xB@f3YOc1wv79tg=*D27AA>dO9ZKDm$Gw-Goec*1xwO*yID%KUhY|No5i_o5 zkL5cm=?d2~=Ky`#?x~te+%;cGz*{36#Aa`XtssmBl!|OU!fy!>v8boY+onb_-x8`n zBzZ35BproaTm*|G>`&h;0n83&-fAgZlTB7zh2;V&3PClzh#;V-fM$KSR-3}pKrV&V zl=dK9Auu4POuR}%z%wr9(hhN9NgBLLk;uubK$S*^5taSM{!gwv1290vZgPPjy&Hj& z_6dj=dPg)Ea>=DwDt50AYORVV{gN8jcjPS2Bug>0tmuwqbFWZEpU*$TSm}kQ1RNWCdX3VD|9)9dy?XFgc z+aX6;O$gNY&3KwP3kc`$d?K9y&}No)O9iaQ!|I(Zf|npz3;w~54IcNvwdfv?On$q6 zP48Vjn*xY^fK~g~dC#ydX9yc7V^vlTFeAfTuL>N~t>Z>vPX-fte^K7oo%pLN11@bY zO~bAfe$*g*gKeJL6P9JP{`}nvwInHFpThGzx1nw_PN8;$am~`%4sXwFz%<0vdiH(I zTm4v|x}_IDQ)h$TFQ)W1xhF=F#gF>n>zX3&i#_)~UQy$wY(y+H9LtcScCQjb3EZQM zQ+&eB?l{e~C!^GtOpNJUZhuHcQsgR`h#_q}j4A8hcTR>hDB$+5{&hn^C&q?XScdQk zWRm3o&Pyt6dmpN8Z8MBo`sLU5J-`AU8B`3KCNon%zZH<1pM+f~ zGS6^2f+L}g%agv2&`IH#oTlv)cM;|akPfl%JETZM292cL z=kV!}SZDxqIu5&Kz7|kDdQ@J9WR`7FD_6B6_n*cmN_fF>sildylTLPEsI$ z_RxxM1}K@d79k;L_We3!sQcrm3%?0)Yv>3Xhpx%2oB0F75naoA{Ftv4GRx11LN_mH z8jEg#Tlrcw+26@w5-uVw0OLK8ziiCIk5u$@Z_S6)=J>gI!$md8#?jbo=mp78?e5>g zD_PHif`%zUA(AtL1SOq2jjw&lihbjLHf*h}IB&GEBPoyI~DpZDf|DItjGATN4Ze_^RO2-GDH4t?v>-DnFmT$Z0>?g*75 z?I*$b#j8Ipefs&QrO&_o{WrWIA^!wpv=nDEL6%c)(>qjl%;J>MW!N`9i z0b&0}0^mYGZs*RNv+)Jzw&h)jE4a8d@67hXzFox^cEZkvl2hqr-3Lp1_Z}Whfk6y$ z-@dY;^oqXhs-XjtOF!|4!~Xv)#^{bC*S7!L34kL3RsR?r{)q$}sGm3hOC4%qsl$&> zz#+I3P<2))>C62ukx|re@o>|Hiq;E~_De^Pjs6n}7%phIk^3VO@Wb(t)AlgG^-fX8 zy^>B?@Bp(I{}uu!{t-M}KPsCz-Zfp`{jmJ>9m#)LjHCUJ>;EYP9O->l1%ntv3-$kF zcevI8+a3DvHVsU-!fk*HcTWAs?r^u~;`64TU$*>c1N_(SFbX3W(?4IG8M^l9A{+)7 zdD}WN-!-<_d1e00wI2vZ&kqFS`OvNZwF>aZ`8)p+KfqOhe<+M66aQ2Jrf)qP`KJo- zL;L_E7_-0r%U@iD`HR`FqmMsKJpFe4f6+fY{N?q`zX*on_xt~b0sezve0=os>;GLI z2pGqR|38jnTu*=V;dHpCL~gwtGH;R#CkWCGNTGTkjcqw|{i>RWV6N zi%enixlAFDiB&u)mJ8KZ*H06)t`%+2*EiHKp1e^5Y`&Te9|Ry5L9u<#%AF3H>xxSV z``%e@<;G&v%{Fv|uwt4pxfl@e+3dz-VlC_T`a77cyOE2pL>hCMm#=BNN;a%_&nzMz zx6wAl;h0ia!K3qMZJTqvFue0>JK$rvRf?uW7X?HtXRu5D_>3g=)CPj51uE<1(d=A1 zV)f8HH3pMhAV2xY^x%Smm5z&6peS|LCj(8RfrSX$>@dQzL}jXjA58OTFMxf(cusn8~`A z$nYSCzXfrolIR9@x?^;#k=4!E)I$Au=fKNoRn+I-9{sLcIL~I9#pUbsM8v!$a**`p zInqJ@z%i{&V(_Z!K@A9Pw0@m&p}J<9KNI7SS(b0wK{hVLq{c$)xN67j2?p^BE(@{y zLkqAh$;YS2G-EUtO?I7DohhI7H}wgDMOR)7qmSU_AXk>pVa#hT9h#Jb(ddGJL=m}M!d3|~ zb$LUPC%7*Nv_=_uZu1}%F^Zy^3JQIVq^>2Ir{PDjwVH#xzVE{GqJVdeivbF(Mx^IwoK(Q_6KQb7 zy7zEWfb2#h5qw43OM}`#03TD;RzNF~HIdDCP^0vb^eHbsiVI{{F&Z>BaTXu>f|(F3K#&RCmLrOtq`v{b(8sMT%kpjb)M}6c zV0w8sKa;2Z`9%dLmk3wgjYDY?F7i@x)G^HfS}Pf(V^pD9RRw=L@%6oGeQ9CN1@?)} zl3`R^FxX_nc4}}&jA#HBg%{Y%ELQW?fFZ~uX_#$!8PGaZR2HrTk$5E2!z3s-OM|a= z(qU;l_JcI{;%`ZZH{O|0uQmqo&5m@Fkz(ATVlj&ny93-ISN(%}z4SukvbL5DSsdo$ zTVdsZCG}LSBMqa?2m}M=6I?2579k_yzR z%s>@ek!B)Kke=DbZSi5-typ30rSK3$5IMWI`9iZiNOs!Meg^NV_V#P59lyk0e z_udCy=k_H95_wu&&awL5XKDeeZ&X`dAwLH>fRzh85yPjz%s1xM5quC{^%YBn zDo;tWv1C_}_C*94A6%?aA0g;k=vqK5*(}sri|_n9yHN z;8+Mmhq|^~EaZ)4F0M93}bS!7dXStmk4qdj|RCy!ev>1&CQlnCQ&OWs!1kykQAy9$dE8xLgdPUJH z>nA6JIJV$7PT7+y7-;FYYkC)!!k^^H5Y?|Adi>!(QWW0x?6PS)8@FoWCL;W*%D$g` zbZszv^U>vIZ4pU0xqcb_Wao@&87_Mg=_CayJe%W{?yXmeCo|Tzc>%tYn@MwcQz}(o znc`YT2#^_7VTh;tBkq@h!3>RRh2!=4kVU%Q1ZtBp4ZFo7+?=0IoFn)vxR+j#8f1bQ zuT+&XEY>Ur1tHu9h}BZR@!ahjj9sD?X;eErT-6R*$S_LHw4QAi{5J@l0@J8!5WqXy^}*lbUqtRG$r2z;K>dQ$6%8LlJRz6WJbOUW+yYF`wp>M zymRqcNt>kTHs#1EbB+Ipy!U)-D(xF~*IMbJtrRe!na~6T3`LrNNdN&w42Xa|ASz7_ zs0fIdK!8vUy@(nRA%JMWh7M|I3fK_AiW(3dEaOB66`i@6y`1}gpW}Jpf%y|qpIY&3P z#9y8dD6y|@k}P%_!7#d}8s;+&r76l>CbzzF+Jm#liyAj+JtD3GQc=iGy-UfblnQl> ziNWz6nrgp-j<7_n43y~$H{eIR4%b`;2XDwTVhQa)81jAyZw~-c*#-8KxH$;i?GICv7Mz*Ft+Rk7O7KDn`kM=B zJ0sZXNmbMLs&}Q)#vOPwsqtb4I&sFjb*Ng9T)9jXk7a>uM#@?kT4oZBwLc6sl<5Z_ zdDdlQ*9Qm zV=25=nTTeU9!c5N99weB>PTDH{@boW07GnyOw?5TWCDH#3ux6v-%NoG763;+Q(~V1rD`m#U&Ec$3;9?EDT$!lNI_d$I z;%oUGs>+MGnA8Z^QDLS9m%}}TRqA3Aq3E{N5q3u-Cb)k_sO2z4V^$1*Rw4X~X>nErjdox;@E-J!6&serb3mCKPRObw|Avuv~? z^d_1Gt--j%2a|wh=bK#;WAnZ7^Oyi5Yh@+Aq&NwW(vRF*T2@zTdgA8gLjBr(;c29J znQ@3K{1lz7t;AAu;dQCVjkNTYS+vH}5E}_x&POUf0KS5>T~$-|)aUk4li_gvnK%g& z5#J+gSxeK1Vgzruh);ua^#$o3^~62GC3H3F(L-Q4qX+^CProSxhh?ACtZZK5PyZKYmPUUMMpceG8Hcrf$F69M}X0iKgp>t3-ygcaQIsZ6P8ep1I-*=hS4 zXWWDP^=T&taaTX#bq}$l=(X-0i4fGLd7o%H+;}E}lmzTtv8=^AuGS)6GA|*m^GC*A z@(mZ{u>>gV;3#9DXWo#Bq<*N=SyhOH5B zqj9_kE&ECoD#Gyuxf}Bm_Di@%3DH7zqF5!hlNrCu-H^&)cm~jEC%#9 z(1Rqk>1B?YoE}2Fa0wC4t!svl@I(hB7f7FofwDp_u_&k#;4~O8(fCw>xpUV zHMjw%RM_8+amv#kX<$^(lmc6%g#JHMASt@OmUKvJ*LJXT*VDpbLiHb(px_n>`~Kqj zjj+>|B+q@A>>40~)#Y{nr~r-eUE9oOk2 z*D>~|$4MBG5*7H+FKsbJnsSLH#cdHT(Ph*V?$=C5A294dkz|FR+L~t9UtHxt6QV$3O!9sS2vfMA>ESiH~fTY3sg|S99)Gx5-TkAK5l)hx( znL#gEw+hRtHuyTkDDjW^rG7raC|G*aXp-=*4U(y&UEozieV1K&PXBF|iA}5loY9%N z_aZ*rq=5S`5U*#X)){X|&@3Vq2_T5kL#z)Enx2<&I`Cj>GIsK^O|BorslHG$z=+%< zN|4y!H21i}O=!gAv&nk99^iuU!6Oz^$;XdAq0Hk%wSbdR|O6XZ*;YBBGO+uOc) zrCe^(?-Fsz6#(l}a99pDWZN}b0VU}8(T;a;=DQo~%C1LFU2yLNpI*TKeLsYyn!?%- z1wOjwZcms``ULEJ0jI5#=%_9UMhVY%RG~VE!&gn2Ditmg54O5OhbU$2gu@?UNK<@; zZk??GtYi?O5`s(df)nm3Vwh3iMUBIAE+a5 zZTfg-=0@Yk-IThp(Jkt`&}53wIH0Ao@Hh{B`&oiEiTKh#_Dmq9Pzizzz)mni>Djxi z*C%lJ&67zvD%$hr2e@WrFG>kppt8Y96KRywidswoQ#EjK`1Kmoe z%(>6duAJfW4!$b^cQqM3#G0a1)(3GUtY1*T2w{07VNn678%#Jf^=s06C|ZUoJFXYY zZZrLBPLqi{{|*y)jp8H#9{uXXo%Lx|5IJz^K^@dcI#sU1>V>c!mcZ@njQ)hE!X2YX z28t&K0-A`sls@0rt5-x4B$Vv9x}u4IN!Jd%h0K)B`b!(Uy>tG1CtL$u4Af<{+6Akg zYnS|1xS0Aze_EeS5(yyT@|}HQ#qN430X>%C-?8lrHOk?mWi;wpMR;-IA38nTApkIa zv@MMQJdCCSU|Uco5(=OS085Fi(NtxVru z!p5@5>wgpSrR+@4_MjL2HET`GwXo4-A=!c>!np2RF&i4K6l!G_du6xUmy-cdn>KD0 z0E!69EiR6pRQ@V#Yil@u=-sQHdvGi_(!Q(Se9XZFXZA@P_WRnEwCIZg6=fAUDD)O- z15GjjWC1?1CkCme)i8#DcU3KYD5I|0%$U!2KdBaamaaab86bSSsg7fI`#fsZNgaG8 zAv$&6hR?^SK(xM+MQDIa(2vn?;@Ou`VONgD`waM4VA*E{!;^ybtD1|_^dq!|lSjV% zx&}w@&|>!_N-9`1e_=g&EHt3fm=?0-aQ`|d3q%%|?I7sw$Afqps8g&Lz_kF*#O=Ob zMogVrbOTX?HI$Q8ak=tg3BQG^U&7;h>uUn8UOcxUT^GAyx#{A3Q$VP7+Op&%S338W zy#T72@fm-bnXgN{QETc)uo6W=Sv=WPd6`op;6=OrE=Cu&u(Sk#4gTIk5_L=_vYrkD z*(|HtDAddIgX$LZbjNuBYj1x0BqxhCGbJtC9kE#CHTY^q*XyE#TxRKiJGfZyc3`Lw zW;_@q|Bc{?u)H6i2oT1))^Y=Ok0@O<_Nh=E#r-N_hvnxVc#0h(yS#um>v$?32Gm-k zq==LF3YUxTh^vlS2k>o{Y$B}VvK1*v9UxAgNq*wILF@-fy7S-#X<7{77in2xMZi9} z@S(sD?la|Z0!g&D78Yrkk-vidbWba-cNUSt}WzhZ<6+OF5o#=~K1mj&@nK*qp`z?7y zsH@)(78hh0&MA?Rwh2k7>^Ea|tZ=MM)cK3jrzac9GT6swo;qp(ky#LPPDClG7teL8 zeTu5zW8oA&wh8cEabt>{j?bbd@ld!>&F zqbMx~##qWgeV|9{4L*w)vwOF`5;V{RE7oo5k)R`bx-C12ZhR3^^57qf3kgi)Hd4z~ zeZ~TX9ux{-9o0gtB~pG3U5hNP$T@_3aNVd1yG)u%eJsrlz>`e2`S*?()6Sq{WZ2Ep ztVcmfME@~O)E?oucLay%r9j5R49RxH=1BX1{GRm3`Z)At{|FXpCaEF%HAc3jPbl&P z1_fVNXWL17G*T_MnLG95GlRsGLxUomodxBVs}OQiixy17gh1)k9-YhH6nulo$PA(g z)hN0`uoBl_-lkhETD|wme0ZLUVL?M_E#`F)L!?|vwmBwpYe#58M z^Y9xxv6~08;?^&lh)DUBPpr;b&8?7l`q$(16+%dj7gk_Yr38LpSLgdOj4Ob4eVl1% z$=ozm>5|}Wz3EyQQQ|3$)Cf|6+HtJq7(*N2Q$0vbV~A~~BAq-|d@9DK) zep&$?wpU`EJ>Lt>JxFWk_5jvuL#hi2r(>hc*dXf@`%aJ^={E-TpMGw6Mwlr$Hr!yE zWADr0h~}X&IY!pH*+j(_RcvMuiTR1rMIkwNKjbCfiOM#sQ;9M|Rk%{#G3lwlVE;Ma zr8f38h7F3|EBnF0wb;Ej!|coxDfQ{*SNaVS6w7qb9C4)fxr0P+A! zTR1CN*};YwO1d1W)=c>3oTIZ0 zO_S%z-3y@{YQ$|$cRX7wL4~#oWj3s?Hq&(9_0nsrlJI-6qWjXJTuayo@TzONx?~3( z9l^)G3hL^8eQ2H0J{7;Rct_UtcW8GW@71DT2hBeKTj}_8h^n^M^x$PJim0CkSESxu z6Otdo=Teq0_r0;-YhS~H=QDnOX`>a__BFXYf4e3(ZS0iS{?_p4@4|1UJ-qO- zShlmnIp)6`BK}P!bZ`>S`|kbOiuj2nB)5g6HE%xHhQJ7j7-H>D9-(vN;VTgt&D;Ky zi?|jpJikTMy+PQ#BeQ+GxGhd{W_Q-PXar2i{kI;XJN}=T#NLv#89((9R}!Tc50rH8 zFGY|9L=W)~k|6%K9-^0@-xpmpw7s}59zhcRt%pFw5I+F!DcT`WA_jp!kY5E!BLT3ub={~{3(H$-3I$)S9tHqrD{+%oZx7-9?& zLlmCsE0qsaG!IK#@09&ho2W&^5N8n*;eNH^Q58~~xG-@Pu|g;&5hcVw7{c4SGySr2 zw-6bG{L-zT7{Y}I4VTB8Ek2dA$+ZTsnic!2mIe##(}&(0|CUF;pd(D&@z zz}PSUm6||Egr0Xzh!0}mUHeV-=^L;910&pe)s2t{Bfnj}^ZB3t#B4X>gBX6;duIai zK@5$&xbfg065+{9ghc4MKRqz^q5mHe;qIdkLr)PH;g84B?Oe-(d*I=;yy)2$Hbze>;+3y?OY2%Y$a#$(7lXII4B%+H z$e!wJx>aUqX3dL{F+{I#VH`Gw!I9h|!!1*V+(7+$xnJT%o1qR4Hw&$yA1H@2(J!bj zabmg39R#6D^HAO>CiLwqnc<-!$c>xzD|5$(h|E*Bo}5qYyqWlFdw!|DuFX8fQYI4> zTh$j|_cX#5e0)S=%|vt#+%fd7vb)fm#u_vC-Wyoohj^W;*eKi3o)c-jlFt%@kL!3_ zFiTnYF^1wzCiy;cA^E1R0X0TO-p`r~wQPBttimph{^Yx`;(T@qGe$WAAT!hvKtHEO zPTeNuJZdl~o*g8a#{}{bEw>ZPJIzaff1WY#wAv8ksQG3vhe?X^g=$Dbh#pMdKeQky zR6T*!+Z`LSz!Wd7f%cvbvEZf4I4I2PV>fd%ECWms>4T<9sdM0~S-$bAF&>@Zri{d| zs*NdGzhjfU)N-Y~t~b|c-&;gWZQ(@Hi9rK#T7ae0THa?kB48XN5Vq{funwww5Yd_7rC)77MX!wbS3++Lijp>MP~ z_p0>hE)dk@87G#E<%j5Yy>nl2iC)v`r>PA~ZGO4F{RSIrCfASH?0#Fp+5YoccWzIq<`HlWOPhXsI4 zz!_F6yKJRYhC9JO|qqwqbHvupW~43_m5- zmwI2%Cd)v0|MJEmBNu;xa(w+V>M+&J!{!q@#?XY!Fs2?9(WR!*xx~x*8X!!)n%I9w zUk&8F)L2(K4T@1WeHhH4k~Walzk9?;i@HGxIz|VLo4Umyi{fh^CkC6j31LAs_wrPJMW&TFQiC0{y4fMyh%>o!Dn~ zZfBtM=cbg`z9H3g za-b-IY@f|kGx`i0`6xOq4E6adtE42?!{s2|V$at)Y_u{|It3cEqi_uTF2DyiyZMfv z8RZ7x7L@pWm0idV@I~tu#G>F0K)|qK)uvZg_h?qBEvN*9gGj8<_F38*vWtx()AXQ* z%OLGEyPPpth!QgTcNale{M<m*QVvz7Kkf%8g_%iX2=bwSgJ*kYQ2bHw+c8{Q6S-fjVRr(~G|>zYC$;?nGC zMZUd?OyIbbSy7FOcKUugy220TsOs^0HiGkEu`)HR`$>bZg|rW%49H%l>j>s~rJvHe z6$|Mk{c-!KZYl1|WEK-ntz(@(0~lF)+w4>cfoP#tjby^Cbp+bF#kyKc7^?SFksIhU z!n8VV1iAxgl@_w9ClPZf!@Nt|S2#;si;aG;+eho7uqn}~WmZvlXReM?mELH5e+KwA z`|WmVT$T}wvrZCPj~cKZBO-C+&=?c)ihq5mvv3z_O~?pqh4ZL|SMq4_>#(4sqRqQ^ z1WLUq)W&@e)0nEUDY>ktl|5sF-_JOIJqaX{JJ9+LdxbRDB&fY8RyR7{v)!;4e;Mle zZf%lh%U!J1YB*>rV1ts9RUjp$*MRuG#Ivh?^LTc@kA+b9+Y>3yZBU4Ih95ls%DKGe zEf?poE!#IDdT;Rn=Zz0DH=AS^ZvP%t<)4YSo%nD>UzoXD2g=4pH)&-nQ2NIe5V%T+ zUL%K$XR9mLs$^|iGksBuqHqh&$D@_Id~;tt8Nl*;4lX8mFJAImtm8EeFSL9}a!<_n ze_XG%I)-Dm`TYu)fKw!j>rW%YRJIJlKaB_G4O}B7$MS8$5n9Gr-c{Nc#|S4rR<1FM zx)^l`$ojLR(?G~K$4UU)#_Bzx9ygX*ZHm@0a249O&A#ErDsg4iLvJR+Y)GoR%(RqB zl;NT9#V318G^GYQ8DGo2Kb!|_)ZT7o>PIsHYmS@Ap&B&7`y|yn8#=)3w-;9nYp^`AY03lpcN&abCY4$H7|=$gRfiyKTK+@k+ad(e3Vnn zQLA+@NSKs%dI@F` zf2MFrSwx4Erc2YKGTTu?z4@;F@Y*p@YpH~dj#gy5+H5DgoUya89F<^g-iAD}TbWAd z*}xK4CgR5Fh!`PcOL|G6mhq@K1={aJmt_gt29+jMi3_J*Og9M69LdC+xvm2@3O{nf zL^+%Gt8_H&#rkooTCD^T91z>D0W0pbF7)a7+eF83u8PWt-V2Zi!9%!FeDIz_%+i@m z?Jbp%CGDnV`o5!B|KFs}eMdIogrHTW32|w6j>l@RK}#y*jj^kk97hX9MFTi@+yM2s zju3x^x54vqt;fY2Hnr|^Hc5|h_{fq$Bhz^}KpNy{;goOrkTpaV)-#){C%R}r&88M$ z#F!&Co|zxLP2W_el^x^k8&aS9r=F5fZ#p}|+#pqar2q=4+@k#nFR1`ns(oK_v1QY_SSEqR+KrNdX_l~L1RCgsR%DTa zU3PDG%?a`isHIwfN?F=PgEnpo1?_)2!+zX_r zvf3F~*-{{EM4$`et)q9TMC-D`D7zV^s5)xR(M!+&sF!8}U zfFVek!~5b`P>v;h^`?(KYcD2|xEr;VCYs0l@dGaVM^DQorC-B8bgnk;h}HTIMJX^f z_24TE>4?m1n+3Irmyw3Tpb~L2<#az)JQCV)$pX5QNFMA0{wqn%?0$`a;wrAx7{q)I z1FQh_Q=e2)FzQtfIQxhqS1iE^+;$;44(Z|}`{C0v%&SDu*Ns%91Y8zW<`A5tTFNx! zP`(OrKrDYiF}d6UY! z0w5bD2KH5daW^9qlv4ssk^}VTSBhMah2zKTKF+{!An_=Wg(FGfiq8Sj;1^c0YrsJC zE>H>GoFQF3U`6L0Lw8_bfuQIKg_&mMCrly;2=Rkasp>Z+WIwF6G%M*xQG zY{SSP!V>_dk&1-2+KPjm`v-IEF0BOJRnA_R zP_tz5$5_&b)RWqT%84JWjv5!H<9e~3KiQ8&= zN_FiqUy@F`wMs9=?Al!0ym5|Xz}k%f5qjguYT!aV7bxKN)JN^QwH;5d)L-6kLYtMq6a~ea!cj7=9V1?& zhfutswnI)Cj>Ej&Pu%fV0dIsYHUKctxNcq_o!VSovGPRTWo{XrtV{;3KO?>oXI430 zMuE8lT(n}t1qsI1$r%=#oeo+7x2lUH_MfBl5XFO6pB>FAZ@lPxly1amM!Y1AJCCCq zYsSvuW}Xr6xB)T3B9{(aS>sVmB>r1j=3oBs2_72a)lRJ^9Z|M@%a_j8{?hfQpD~qO z&GN*vYveqPDGX@JFz-^~rgHir;H+~n@%#>sRVyJ4j;-?ES|`kd80g;)l1eJGw$@0W z>7TEz&DsQ)7=FUnh=2qF{_%RRtx~v|l?Pv;WV4sOcI<_igx^{LmIC*<8sBaP1Oauo zFL!-;a@A$!FR6i>>FkdAg`~KzT-ew&wK@x4+PwH#3nj$``I7gbXE6phf#{X6h<6c^ zTIrYc^Af5<6Poh_j)wjq#i?x!*25)yl=jG4K?2+&!!*@ha%b)yNji_Q$A<|V|3u0g ze9-%xtwH?&c=~MQlUoGc3xO82{kfV?=>AnOy_&v3IIxs?;X)1EISmkD z)FVrHd;?HCLaGs7O?f)h)h5X$%Sk2u-rwp`C4>Yv-GqUOrVzD>wx{DMrwjqiZJ4is zrX%Mu*Dm&9;HvN3dfDl__uX>*7HDh9*VVzk)1%<6P`GZV4f3m+33p-5H^rfr-TMZA-y7a zRjOZ8>(;Vu$a}4)+Y{-$YR!O__jU9LUX#gv%#;T(T?kWZWcSSB@97ywm6UhO0Du0? z-Ote`3eOlm!R1CR`8U{s9$5KK(%}XizxagGGs?7ug(~!PBD(XTvkozTS>n*6i{skC zxD|Z*n+JJgZe(I|s`Q}M`%yCo8Lq*a{CEB}3%moe{wd*Ou2)xh+`sj5{<4==Jt0YE zMjk;K@Xt_qh~>5Uoz(L|nl&kbu5LgQL;DHnPdg5M>!w7?M34~YbsFyU0SRmd zQD(X*k{FO%J@DD)UMXN8MXfzgu2(zY1d3CxZo0J2>3XcRkdo=?^v4f)4;x(-Nq>Hf zTqDDYldX67K<*<+$-Br08F2;HH`b1TC-zo2v!7ZgPGXd}Z|%rO(zW)}q-~A8!(*8sh(7)MYp0DshOHXJ-6944}H0e)U_Z)p0 z@Qh3%{#8M*h_KjLLnpMug!mjXfKJ{?5zHNP_arH;0fz8xaFQRvJ&FwrmrzoI?ogi7 zdu?Smv`J1HEWpGS_g6Yi2A_;8gHyabgQoPI)OgPQou@X+1|^G!qP#3J?N4F_le^s5 zf_LNN!^=B}aZ)4bsk2z;#bVA4!qwNuF+sQ_n@3@+HOrVGYurO39xqG9f|9DypV<)Eoee?0FNl#s zXlN9e-GM}g_7hd;AI~WDs>(l$T;UGl2BE1j5K}3@I$wHu@wl!K-Y#!k`PDD_)cXtQ zV0`Pbxo-#ukZBtP9Dtd)dzlR=d*Z5*Eoe5x)6iwZum3QWE3af32%fg{@mmgLwERtx zbO8wd$zyyY&QIQ3vE-rgo5`a(y4wnY*Y|t8T+S`dQ4b7swrbR`y_fVmaDOFIO2B9#h6vtdujr(#&|jts zFv>wMGGqaLDyFR#*(^rc6zW@QzWTUf^;>@tq@NM(%Htyo9a3w^q=79e^R_%R-yM5O z1XUFWmYfzTm6<%O-zOPc24EQM_AT2ZZlZ2sh>*gDk0AvtvxO`bo%r_~Wb)Ywp-hEY zz%{FP<-eVgopLnRuzB2>_nWHCO`WO5W}|6kQK3|x(wq`GY_?|qJSy;UAJM#Ao2ah}IJNmuqqTcZ(#NcT$!1d&HXUwM+`_jI_~P(; zOIMxu7hZ%$RQ=6slca2srapn^=`|u3L0IR(sUjXPz`qDYV(yyR6Pch0Lc{e1c-%R( z*4Y^ENgbI*O%I6KA>HGv;zb^jVD%YHoU3MlB^eX<2XnEBGC#q==rr$OR;kY{b_R*I(|U5gEQtM z+3UC}G84}oj4W`mOWh}9FEKO9~@0lMttxEN~U*#*|SIZ~}9|zqD}$gy-|I0TG*Dml#^Y>{bY(G1ji0 z9h3=C)7?a5)q)cH>}AS6(*i@T6sgBm3QUXr{jGd8KsL3*%;!wkn3q=Q^eF6P?XTKa zS?L)y9)?}tvc6nY8jV657WPkmu$xcpFIW^OOUa}T8(34q~FU z=q4;yDE*Ck7bEoRWA?ef`%!UHy$=SQH|H!pdoGgwXOVuJOBO=prxf%Go&+4dbvuWj{o& zW+URPYy(tET7D({7i;Jkq9De6@U-derFAVe3f zTQ5bMZFrPp?Je%iJlF=xN3`_`t_`PBSIr%gC$lhMaMhF%Pd+^=SD^L3L~iK=)XM>UPB} zOOTtL1TwJ^>yXUdk2+#p&~ zf0eQ8%i7m*DeQAum#&Ru+u)@*_Zf4-yDpJt47+O4^X*tNK@Z!{*Vrn|GO`xsWkcE2 zqCs%7>&?;=;t-3(e0g7rZ~+)G84l5XEv+XdUg}8ct{87xml|W2AR=yl4C!5zW>?*1 zVKz=o5gGn8E`9)@cY$X3xY9tz{EYz#Ju=*%t zCD1Irx`XZgJrt;{7&%_z<67jX)VRi&n2<9r+K4#CvR|H@^=VwH^9+>;sI4k3`B0Gj zG}j_HThEdKnniFA1UL{F5>@xk*vDy0aP5=}s?ASgUlWx-I>Ffo1bq|v@XBeKjX05+ z&Ca@ecd@PwmD}@WWB(Pb5YRt82yYVR-BLO{oky`4m7$obpss^Yv#Pn|WaL)gLFU^} z6_zi`m^Ay#1h8fA^evm?9@YYc+nH~=zqBhgQ)FU`ecw;I$xjBo(OveZI!9w0=d*Pm zqgMBCVNjD${4K{}2`Y6_)-CdWN#1bae99Mq5+9Z{137 ze{r_~G&nEn7HV5ljn($(SyjX#UZ0ke;sShIh2^ImwKZUgHm3#S*3NO$S%;?9$tMpl za);K0pLhQKZ8VB|W%hJ-k<_aD?bfCDgDnj^+^&3~XhiZpDo!1fuA33LJKP7TQ2$Bi zXp!rip&rT))zjFjXAI>3$f2Witibthkp}-^qV^a+YVV^z87KK_MJIbtuh@hvNO2+j zb@ZlP%-{>0i@#MhIB7&Fj^)RBa^;@(K1Q zsCQ1iklLMRK#Nxcm>mi+xWh)aT(AcW#d-m#Dib&m~;pQ*u(vvoG{yxiIm^awElZP_r zf6yvc7`^gc1Fv@7p7~+n>p!v3)|+s-JIsP^84kq$a3%4GB1L*Jxuknv>G^}@zaS-!L!zFrpQyzRq{PAhPl@BF{UN60=FbvG zS>I3lL(T2vn*Kva?;x~A(toKRD$i$Dpa1E7IC>%fcz3?+YLV=c6p3*(U#)JvUUv)u zE`~%WdL{KpkK=CE$^N3oTLq0{;-)8J`Lo<+B*rmTc>1RRqDB{q;5wf6NDguobEQ z2ib~aD=)N;w?&+bdp>-j?a^8O$s5+|@b_w1A)_lNdtV0{2Q~K&+eQ$BYph)C7;HA5 z{SrjMb6R!EJ{`}7H_6AotSr*i*PVloPlSKw4;?1Sl%H3A8V@bcIM~haf6HVE*#s z5&+0?D9LM}4mjLA9Y|#NXvKPrZujW~9ByDVs`VoH_)UsFBWZPG4*nyZjS_Wn`vWkT z?n@Sg_2p5)mcB9SE#>ZNS=N?QwhB(FD91?yhcl}Yn?G?!_oH&IO7O-q00mNH1}Bc?H;U>orWvXg6DF0$oxPETS8l)oz28WH8( zCciEf>+^!vP3b(#iI8rT9X&R&_aJ3jag=+#{Z`fWb<=afH$Hmu#dk5^nY}jvGyb3* z?U=(&bh;IM!&JNFTh`@_*oRL3GQ$8ilqXpIWsxS8Z>dobZB{T3n|8Z!NuQjZG#2?v zc~1e$7|`A?PRx(dEaKS)Xnq`6uxdqxgkuEh-o8)t^@bw3MVb4JOyt&cE4B&%AK%$ixX^ZYU$2CGF$ zs}ML{u3s`;v{=7bgWqdFe;)PA^_Z0CTTEk?!X7lln;ck?X(m;o@~qtpa9_w}cC5_& z6~3(yvJ>MU!^CUTgaGKO)ZuoJj1Ad`>ntg@?-W&-4{Xy2n&@DV^p}E(2I@(FA0{Nq zWsgN_r6|2gfkHE=8Y%3$uJ=7%X||-%#D88W6&;LF;R>gtVC|Vo)CaX&?t}?RY}u!q zB80SA?87gJLOoF7YvCyk&{P4$40g5yx&c1Xg?Xo6s^K=*uEqI52B|8y!nq#I$G6Hc zYLbSJii5Wl2qA{t_uJ{b)sopTlbXgR@4F;lj;xoybFw>A*b8D^mAJQm5K7kHiq%cc zzVo8bGwX3LWjj8z1wAt0ofKRE%Ek|pky{3q5;T+n`8>pcHa1#vByRd(+Rk`@(4X_W*)QrWWO+0$6mbQ`> zs5J*{qeum7QXnnXJVVK(^HJ2Iz!QP_<+wCyUC8N@1%(lut=-D}7lFMRzn5@GOENL| zu0@1Y4PSb+pf!v;;z_Usb%y(b;7tBDoQlmr7I+=-Al6vL*4p_Npy4?>WelEO|Hy*w zFFUmCU02gGVo2U&MSC}>GjUI|2AA3^QDG5%ixNnsYh0xjM#7V9K_ZdkAMC6lyUSe6 zMzN+N$zoSswB2-#Z6UDq5RdO`Od7l7CJdJ}0@|ZWNmg+qd9_j>9OP+aY1(OpON-{& z8`j!P@WIy4@57@%q3|>Y?vECUjezIje0eA6gh!d~t0psr?A5iQ{+rLh;!O@#VAIq2 z0%Pf~6+s@Akaxr;pNC55x`F@_@mzXo3)x$+7yJD zdF&G%oTF#f2`!sJStT?`sQslG;~NJp;rn+yj$uIqSJabh{|-~vT!2y*2dhzgyg1o<3;@tjf|nYy%%g`FFi2k#bU$~YR5<86hu(E;bn~2r zl+nRLYuTjf>(78g-8A!w)0gs0WXQ_2#~%M|C4s+3taEaOP(m5K@lBy5p{@FnoUt`7 z1%yN2?oKaukuno#))Pem^Yp|f|*)_Y8A=^@S z$A3i)Vbqy}+r@foB&RM=xpGXG_6IJ@5K3o1Z$3SVdAQQNM^E-Ci#Fxi-Zr?XG$pO| zq*sY(4||8B!%EOYB*!vee4xxjd7DjTF|w`0zqbzvCaipPSK&CBrkxThutjZtV!PIf z6K3f6MzTL^3^d*fKdawyM|Tlgp9K*37`=zoR3J8j3&?acupQXG9hmH;Bwh8IRcrS< z`X1KtIh+}8I-g8BH0qHk1j;Jt=k)XFCliOjsCJIBUg!N{fQ8?1W zuN&3h4v2F7IW!mf?Y28utkwNU>fAsBZoMmXC746Mw7)oY|z! z3~=O|b9`pn_PLCN&+M#zGm^q@?v9BNlfC%f|XXYrw zYnBie3taMXB=OvaBZHDcvB>;VP8PBt#>=FAip()tioTx_Fp8_|O38KcOJjulCgO{l zmmgS)@~?tp7+{VA?#dioqsq9mDD2)%QG934UU7CF6>7&bXFogVAx29nloN#;m%|yn zaN2fiA=?ePk@5uCtPw8_=AOoHaAcPx#k}CGZ_c{r9R07x*Sbg#Ag?o3#R1$R?cl9r z_N#q6)(?1N;`ojhDtn^61|q${2vO8Y@EGP0omNmV%WlohHdc}@Gvd(F`Sfl!!CEc- z?QzL_y@d`bly>D>`#hA@7)oaZ6rP0lD=dyXlg=ps)3T*bZ~T=`(sh?|3|yuDA*&7? zAcd!RR4DQx78c2vM@T*Ktc_e|LcnK8?y5n%0eG?wVS_bR9e`fV!MW0<9M}C3PK$%` zsyXlvM6)neFxBH^&YnduxfF0#5MJHTC{ly)G$wrk zNu1*E?|{e*tIWeI0y7H=14!S?fcA6vMM~eOky>oM$M2EQ>R&0X%Gh{c_(+(kSV+W+ zFi|w%lpg7d8eJ?l+c{Hy@NN22$NjB&{-6p?86;)QR{_k%HGDdfGzt6bCZ#ty_?0~R zhc|Y3JFIZ@1G?aLmi;zK&T8|D2UZnXW`Mo)m;s4kudoP1b6`5jBnw!ord(pA5#Wpl znHy#%4KrDS2EINq{>F^SSqT70l1?T~_y6p%<8mIf0z z=D;FF22`SPl#jvz{EQ2ApehO0C$&ls$Ka2p5h|dX(j#P4EkMqf=6Z7RA+7Kcwk?V! zb0_V9WX)(2@y}8Bf60mSZ8X4fghvV1SS_nMFKOzer7Wf&29)T(hDaBAxCk_`&zjVt zf`nkLN3clF*;EyP%4Ip`tHIOd1=Nn%;PpvMr_0X|%EO<8ZsD~Uep=pfu8~AKAuQRo zEHVA1%kg!ls3>RLfb*Qvf-ZLkU1;KVAQzqzn3ZQ%luM*f`q$N73E?%AzAhYcSCzt@tygehGW6-15%S^uAsQ#LD4 zqZox6J@W)-N+$#o4<-U^A<0A9_?5mnzO`dE-@j!kdHjG;^Sk^+xM|T*$_MKm&<^tKkV9j@AQPS(;!qsFM-lQL&A|ie<)N8=b-Gg?|R=)=fmN17GEH{{Opb2e;RYte3P_Ey_*svwM*)x(}8jaCEUO7WQ`XguN;i1@A%A0 zT|VCN+3HNw%i|`Al;~VtbSh}UIY;b{j~<6=#q=|rvqMF&O?C2N2_ez^Bc6gh(6*6xI4v6R&LlJAfSFX#+f4UnW2?xXQgT}?`{zfT;kSkeXZ zj`YK1l&eA!V{Fr5;PXM3#KGy~gRtm|Nj91|4LsXkW#)cj^tVJa>Y)HyTlLsAVonK> zN*1lRbDbnRH(+o70dEel+x`djB0>NhkIv8K`{(4+h6@1Esw5HzU&-lFxF+v)w*z6! zx_)^8uz*RXrLvC87hZLIVR9v(hDM-RaG7YKoWw z1sk;=on6-AXYdEL2OhDSpjB(0Ty;FBGoX z+MfDmXPdc8Fg%EzBe_TcI)WYAvLteIzEd|PS!(xoDfOr%eIxt4v51(2B8GWEo?U>U z5K0knzU<$L{vaW zlnyXlsWnG#>=T|?N8O4Ml;Z88<9{pZXH&@IBrSLPAI4jeV0dI3K$d|QzmIJ|hu`9? z?RjK}BES~lU?$0l!VGzE(*rMH^Rpsn-3m|fw#exltGfGe@Nn*SV%#z)QtG<}h60|g zUOrPB&YMy*BC6iw4}3L@QC^Serer9!7hPHM-VR(YHaQ~zzmx-Mf6-4N_z#KDyz7Hs zqpu3jnZF)n&c$1ri?2c5OSP2TMj7Rv_kFK!Qd%9@1|z+V*^D}<+r+!Wy~8>+UyMYTsRod!?$PY zYJ8)&elv{z10Gp>bwvtUs7j*@|dFN84++)sZ{wp^*|sg~AfxAAZ#c14+Q9 zR5(fnuB(JLk29(S*gRwC%&j}s=e0Ftf`ZID-XQtP5?WKtlx|&r-E?@Ku}-lk zI|E*#tCJa;;sSu_L+`xh#7%IYmICt~)qL<4>kBVgid*y6UGz_!>U9|I2gnU6iymzt zI&B7h-Y_oT!CXBCgeu|)B3w9SH%gRPf!K9kWdPb0`L zS)WN?|Fp+;=3CPHl5rx+5yVoP^J=w-oF~H=h#k%N*dxfAETy55>^W(Uw4DX;R9{?X z2<9s1Z}yZYB%bxP-g{>D)`yw7FkZtOQ0HLQaY$Jle@&DyP9>IN0G=TuAPBJX#kGAi zY;A)3B)jlp=g4_G$`%>6|8n%eO9at;b@T%^WrFTE#dSbFEu(EOWEbM7DP?o_)=?=< zLYzBdpoU;H9PYh%`p1El0Ol!O=eagXXqL|y9vp)KZeS?}YyVi~iFPYI^VAJIe&8Ow zH@0CxJ1(*rf}pokEu)l5!XYpwf?T)C%*OzBN-&iI1fwv9RUuc%E;?GZEOS2Cr4SZt zaBxCS`K;Ek{~{png^DyAR+JVivk8dadJ`p;z4+`|_%@*M2J7Jba-HFU#6ki&uClHy+iT0sokK$wjJtkB5_a;B!6cyx z;H|b z8Oj(i#(>yVF11UMdPv9_8b5o#(8K7>iu@hlO=0^i%dk`JO%BY307D=IHJrt_F$rE< zkg!_+m*a21O9x1nVx@^`P|0gN!!qmIa0i%d&!9Bpl6ioH*e5 zbKozBT(=!@bhZb9+NvomO(o3de6%#Xm3NQNy`&*!y@L&(R<>;{GZ;6)9;)S=wXOHy z=7>2`#3?L0^xgSm&z)jqpij00I*fSC8ewkp4HU!|a?!izRej*>4l25H_1au0YoQqkA5_z_(CU z+>gfxFwgbd)ZZO>Vmi;>yWG~nSBuXF!`<0A-o(YGaj7C-EkX7No)0rHJK!?xe0hZm z^=xgPuqaV#A4)7Gkm*7>Yo+qJ1b$NnPLQGkdCx;e6U|?fPbHA}8P9 z8_V!yiF_>;**x(X$3++GjHa}`Z`}1v;FSf&ozBBCBzeH?o&nvhlULkLjljP`Wvo;j z!`DV?!cN6#`w`KedI8Rt@!X=9osG4*;pzc<8u^OgRnu||rS=w43fsGGU2IR1h=xBq zUk-GRj?_nH3P195$&8*Qq**{CLy6H0MzUQvId8)E6gy5x__(v#%%!AdQSTAkWGi0k zu6ZiSUMa!+?XtRLYPup6ento_3Ep;+GqRzS!)$u54k%NOt}=Z__CO^CVv-4MmQ9Rc zc^Q(y!c~>enBA$v3ptKO-Y=qgxq-q9d>YO->}-9l2@`aOedo~Sk3&R*e9tq05GBL7 z3gf)FYd~^;nJXYHW4?d>Q^K$I|9cHWjS^=)fLZDNgzRxx5UQ~CyVZt*_l*=MZK6e))+ zeaZJ44h-N41;?ReKCy3N70<&`K3KZB(efmCI%jxCq*G!g)$Ixn~hb(*(io!2c?*Dch^!gBhqA7X>c zA!yS5kJ#W}mOv=V63F;B>An<^(at}3BKqH$`yZCTKQZ@7H0Iu3aC&!kZ){=z)_++7 zCH*@}PoGuCiwEeHxU`NGJ5(*Niy_sA+kcOt)4HNt8 zCigYn-rqcRp!$c>Am=|6fy@6<8gyK(`#}*vLv7S&a5J}M2&D)Vw%sU3K>}?LvQd!0 zKcV&^)N0T+@DE5}Ox$(jKURZoG}OLRdHO-wKP-Xj{}vnc{oHg$St^|={UJ7Z(b)f{ z@$_JG_i$_PMC-ZhT^DY2{^K_I7b+n6p*KLG0+0WRwr`_)gVw8WTF_`){^Xx%d+G;Q zVCc?2hJ!~J#~xpizis?@y|WiZ2&#|AQ77 zxg)!AZ}8@$e>?|huKnZ&>N)s_E-*0pV(7o<0zdteYfs$!IEd!jXsG?@(~bYo1<+9Y zU%J4X>8GD2mA~Io{s%DdWai7%^Y2qHe*gv^%zl6J_uqe`H`)JNf6%ad=l{X5d&}u{ zZ3*wY4xewv44qb3an&o@G3^52lJ@7SZpEb|GS#T+qYU8V>?~?Qu`>?W*IUJJm z*qj4MJ_^S{YYdA6a3P9T!zj0E?cx<{_Dy}8=9*yRC=7mfDR=O?hFKu_{@n97bg#A5 zwGk1B3+f5LLZ*lya!D2d68&pRWuB#OjltJ~9XtKVWC~-RZ6WLbH23MX4v%Q`+==O& zqSd@=i-6joMgqJKHl-n1KWPoMWz(D#d^z@Sbyx;Wtq_CS>2d8e%UykJd8!&s24IYa z_}S{t?-hgj4nwdfo@Oc#roW%T`x!KR!x!rZn8F5Wq@=A}b;0ah;bu}M&0jlE(xIQN z;b|Eiz*vQ@4|NvF0F8_CvVsMoFxseb<+pt(e4jTrRIn&QCIcC<;w+7o!FGe#p8^Od z_v|`##@o|6TE6Fn2tQ&Rl=nFwUBvLf!-bMP_dH|MdIAh~XO#J9I_vi#_>siqjgWJy zsK~cNSmupaQ286!&DilWYkPf}5}1cdfLx2V71$dVO;e%ytd+9skJEHajYbw4b{b#r zsKdR(Wp>3lTqi&rmW&w6IZL3bi`owtXKs8 zZaw3}zPc}LER&8EbLlC%kKu*uScEO~mOr--V(ZPNKFN^0XG|}wv%NUzRVK(N(M zY#9b8K%q!mjXRE=SN}Uw;HAGW;zXI@ia&RNjJnoLvGxMz4L*L=Lu_yxZAw|_g^so` zc)Tf+O`CRc|B9^{kQY3|MtjQ7>;gKeEECS`13f#hRV0Q#$d^;hfMV3x4i~1VYjY$ zdnPQa+t<9klEh$zjSRnu-#j3PaB+y)*5)!F7T0w=deG8gfav;|k8P5J%tc&T$y77R z`ZmbocRTRnKo=%3;OhWpV~}|4;di6@J<2Sc4T6cB#&rD3!H^;(gqqb4^m*(?BU4Y4 z`5e9|31SsQqz*A_Q#~m=hCqYQAVX&?hh{Ans`Z20-rVNm9Ht17u~@pU;4V6nBa|f# zXgE!`K;;~KOf**WQ;dv0Ub`qTXAW>oedZ^z^ zsBBWMjA)$WFT{+p;hJfTz9kcbHRHREm4$aI1Aa_j_^RfhRNSG{5kdb0*k9(`c zIiih54MFKXn$|)l#OeIFV+PEt09_96dj27C4X%U$IcJ&(@31}>p z(`5>RZ$?%*BN1mE7l5-6@S!_zthRQ2!}VI_Fq3QLV8=PjI}~m*#;%4FjMcsN=MksAO;Av zk=-}{m}!Z!+44iKH~W6l2fkW%TdqF6h?F!HgwXk`v-@K-R&ahz3{+wQ|MXXX(HWnx z8_Ht}UhTrq{XBm?)~`v82klBOm?o-@Yu9;%;V+pHtF6Q)FCBygK4Qmmm(@|#vMf$3 zy)dqRyoVY?^!q3817tC{VNwY)3m_|b3n|BdO}O)U&}`@D3B1JNTs>b1w%*AC7TU#VZT1ybkX~S>*GR?QJ@>-AU&Fyuq6Tn+7@{8HYQ@~jb!B3h|z@!8x~_Z zN)6_pWVSP3sE#xfNSWrC22OqsKg;>2iM>2lBKB4=LQ)U)(bQ+h(?%aIJj?n9%{v2_ zRTdH)pS6VR%f;e1M3|iJz%o z0FG88^%N2GM;@D0@;;haF&Vt41=9%H$Z$K58s7l~x+PIQr^qqnhV~b_9e-LM;&`rH zp-+_2Oz)lu0g9|3Jo+bS|DwM#i6PGY7!%9f>0F9R+LCf?o@LMKAY?@;lkKi-kBY;3 z#mwx0yn#W6k@pSCmxM znYz;{F?a8A+?u2QHa{b86|R3bs<6L6vB0lI3}a$LC!)ieHzqH2SV`g&MGGHk=blhp z8n~?^XX)P#d=u4T?An*{<|!%j&XKDvU%WxVVo%Z~9P1=rPEL`cLk>cV5c^UDMDTf` zMvH&B3lyJ+-XDk0sqlM^GY*TepTbstA*^d(d(caZs3Th5Ali*01X2X%3)$Phoz-(Uz|e1S902J%8;pWkhH;^W zak!7k)HNuCnV&@zMVd&m&+|zXr8OYH^{izyO7KNB;1PkAP!VVb;K@`9b19%H&7{qd zJ)I8j!)5srGkyF~oQr2*U$KU=n7}2ei6d`0!)ZJZfDOL9z<79FXOkt$hzBbi58>^I z22vecVXlT9B`#tmC;=2RrLC_@J=%cl#8h?%psz}%ib#8zfI1K%1&GB?&^7^F%?GZ1 z+!_!~u+BnHlnAGv?wNSusHak2vnY4hEn&eZWnkwC;AhYDy7$UG< z>4P^CW083=5p6}xCZY&J8*wHxo>D8@%v44b<%jiNLJTg>kZrJH?ZKP(OZTAzBsU85aJnv6zQzE#EH(D4Y^o(+;YK(`;`gbF`0mv!g@`Se{b-Lp!4r;qntsO{^3n+6Jizd2mK?<6@@jz zZHK>V1G;RY?j(Ni$32+Ih7YX}y%u&-0u!MG&pATUoeig4VCnPSSD~UPvxUQP^`=tk9fp(%fCx4~!O( z%ZQ$AgB`MTNQBpx9Ennv)9i@WJnPSE>*rXFHV>2LzqO)|%x&w1rA#}rg-mCGfQV+l zf&jovQAhzPG<2neW0XJF`4S0ptx>&8=Xn@&W?MciZ}%&xG>ly9(bo7^WH~7A&;yCu z1<{R)G|qF_11QoNqgQiuSbZ?RPTy7;(7@f-tfP?`MgZd}qOxI_qEipM>6rJt1GAGBAgB{tQaJGfi9r)%hB=8L1h5A74y zRGuQAi0A^MWNl~efI7ptUNP~2AFxZ(K9qpl_KN5(Cvtf@p2|8(vnyT&Jcu9%TLYG= zR)&aZi=?xsO9LXU6`>tFi1Q~vK{?7pF>?b#E)gng(SN5rbuKCXQpHmF@d@ft^*Qn) z0YDL8GNzp&=_#$~mY>=ygX3$K`IIbL7dj&+*w<4t00RPm-6E(Y3s$R%I`KR}*g(C24mb?Os=Nd}LovLL)J!t*a2xRUI&-`uWQ?zH=cIE*%q>^ffgJt?h zT~Stt{@`0U2c;*;aM^sIpOUT>O40?&{|v0ZA74KmkQ4Ukr~*$r%!gEAmo+Ezr62LG z+v(Nw;^WWy;EUD<&JxV+vML=a#TW?ncWJb|Q4?C&5=2_5_7N05p!O z76wUAFP_9Va3L|7TE)>(RbJC+CfZ2Wv_1%3<sAyaxpPsP!5}Vl9R4o zOg{4j|<{J)3Xvuf)iW#)Wu)D6Wk`N_D)a4&nvgFF<@ z)8PuccPu=JR{#-z7C%2x|LR1Kk;|p8ufYfJsHuuq6KWAHcqX3 z*Trc_KM|Fa5m1}|h{}^CYE>VCsn;@XdK~5C&F;W*ed;MRs+t2#A5!1$tt6TcSCp&_ zeRSb=C`7fU8HqW1`_6054O0f7gFEP=44o|#g9Gls1`4fFid(q7Mu9u*9kFVj*k>vt z%lv?P-OHrO!DZIt?~AZUxI@%Q;)_^GO)*spU`O>&e9E~H5*hlX{h0Y2VF4~PmPkD= zm0vCSX^9-~)it7NM||dD5THh@I|05{Yh)LmGK&Z7rSsSIxfG_~5C3UHH#Ytvd{|ro zNlyR1JyAuzSYTs-;bXCXptlgjV%^od>&nRr0(S+i7zuG!Vn#&JqI+>ao5; z1F=+KrP7Ud>)bwzhh5|Wpst<9SM37XguUpU3MqqUaN08Vf^@o6T%>phpI#dKAr|mo zPpfA1E1E+WuGdjhLMw-8OI5%KNNz&HZ~OrhvjMWO%aJR$+n(nun(9D&dB36l{;j8VeqTs*>k z0w}Q88@Cd?fn%=lx1GT6hnP=nel~H3tCgmLMz|PwY9bzUHlld;D@ilG;WDA-8h|Ky zzAE(4yfg-PoCmk_LA2%>)C32!53b{#UM3>x;S>~Z&)y!KnlpayFHhG|4<3rV56zM3 zMRmkbQkNEz-b8nW!3H@lFdf#jYJWLS_7QA#+sUkxT|SZkZ;5PJBJpcfy*(GqDB&sh z?1J&;29z~$lR&?+nz@c+k??SrLlt}54LI_cXN$#~>)=$5BZ=LMx*6Pk$CfOcXVk(!3B>2l zt5mwia|9}e7y#7&%J?N+MA{9f%An80k56LP+Dk}5T>P?Ga2U;~6nM-}lt7So~3C2#?VDCq~ zgAtDXanDMk3prTgb==&~lIYG@ zCnaN}5~$*isx{|+;~K7xV7{(1S$>mPz)o>GmPVP6?!pLuzPq2%B@9^a{1$2^=rvd! z{7gvwo52U5Bcdq268k0(7c(-qZ2DCoSiLA>R?QCQu*EPyykRxyyVnub@nMb>f2Bs^Ozo~iWy0TS@;6qHfX`$xYiKb9AurwOa| z8C$;$X)?EEA%L>fJ2=oK@)oAcB(=NRo%a0dX7@4`LF7TjbfJDm$9P`$;RxM*Ddg*) z07eUaPZr&4zz<8R9OV+#)U+tEZr?O2XR8dIoe{i_dEZ0}IfFIU?5cP;PQa#lwjC4Y zt?DR!P5Z+V)bB@rsDh5HxCM#!apT`daBM0+OTTpRlmD`64qs&Z+2684*HF1~ zA-0m})x73s#rAHuz`{x+H<-=uc74lh$q_B`5{e8ismhIlqAd9XVb`K!i*Z_U(Ba&$ zXb1yT-$@XXw)SmyvkqiC;5Y|X_-m+bESKc5%-Ltwkjq(^Re3QpUW?tjbL}eKT6>it zc`sx}9U)9k8QHl*kH)o_rCU(XqJ#eejKun30>m4F{LZ*R!(&qY6jq z3#|7P-t8p%3$tu#E-*9X)i=+4U03^vH#mD9q_#5Lg`}x9^vJWlX=y8zed?Wah3T>; z%vvBjdR-}`T|PT-c!l#;a`hV58PihRN(DFY8H8kXfxfC44d2wPm>i>H%l3P@S5IFe z1+QG?Q)+G*Ap~lwwfIR({c5>|R#%13@2=SRdZ=Q0)6*BFYiH0GRWpIO86ule517^Jy*g5llidLs2=H{iz~tb)4+Kkg z29{=_AtKpWX0YwKvDS;R=Ga}oV>WyrTxlc833kY(Cn%BG`C4=P;)qtD=(|7GsN-r# zrl!^Uvxr6qkcVIgEZ21k*VIE~M`;&!qv~nifv**6j1H?V$p9H2BhpRcY6$u~H3ecj zGEWJ-`D0X*5Yvxw*a?0*CRZ!xISi;ck;*vo!XM|L zU`-8)l(g~yj;S;KQ+S7xNxSO3xh5PDW?!C%25n1FcS7bmbB&@0)qAjO3Vs}aJ z91n{Daj>RAjNKjeea|!wkscbjPF6qsBEt`L3f0$L@GE3*7cWj*{iwf%z=(PUtZ3=_ zse|3NE3eB|+L5ih1D?+^9+wezM_?ljvIxC0EaBHb1I<~oE|4)pP0XblPw_?A2zLGY zoj0srAh|!!ZISHm$mY{;7dqO=fR~Y7>lG^SB2$KI$$c-fZpKn<+RIG0j9X-MVWU2_ z5qJXq*6_r;cS7vy&+Qnu33t>6B{FLFU#r+XvRko>p4m1@(1W$05b`WS5+uUSoCGoR_;X?LXQWf;TZS_>eLK+Hfi9~yl4S}jSEZINN5VROQZ0BRFM zl6acCYdsH)4IVY;@4dkow6MPM$QrLErBrcdz4+9PX01v<3pFmg$jMKB=8<~aPGZ&A zA`+WQ$Qk_5z7N6Z+C;=JKo5jZ0_VI|YEq-n9T4k8ZEda)eHM|o&u!19DnFVR6idPx z=s?ZZ`;ZN0kWQ?5cimJ{a(&5z8F;C7w&NxIF8^((R>$4FV$FW=4kd}0PIqqY3E<;* zNF%*HZk1Y|ZUr}w|wn7C3?t4WO6eIu^y%M;UBr5=E@SLL{J z=w^i9usNH|@)pO6$Pf3;jjSiU$r?#!*1}~Po7rY$>?z1T!kBM6&xnvg%ns*ai;zU} znv>6%OBSaoa{oWw23Pl;PI>Zf6Jh`Kut#!F&6D@r{PsV*do?*9i~axERPft#Dri^F z58uH*O@+YJ^FNda|CSX}Plczquit<2U-3a$=6`1Sk*N6KU>90eSS`F7{%=_U9pt0d zgWMC_vwLFmF2@vJ-J0K%Py% zp>w#peXOi&0#zX#IW=A{ooG7!&n91b?}rNE-&ua&lcPWC3(tNm^Upu4yZF5E@@(Vj z0ZGqr>klo$_09_uofjugp1*@G^V=^xX#Sx^xcyIqVWQ{ie;N!w#`*G}Ps?sykfRNT zAItnpqxY_jJh(LW=!*RPj|Rign-jzDPL9r<9{$&iFe^ou`Tv#}6z{K0pmKz{i+8?W z{$WP=-?|GwJsX&OIdtb8YDTy@{pzQC@5Ua!|6xY>XOk~~`1|$$sxM6b*yR709N|ZO z;gA2WFFZ!;3(vmadHMO#>+cW$Z|W|fO@;q6vwYnzYb=&+ZUw%}pZmd9YgO-!_7$CY zlrMF_*_8=p0Eod)-*f{+PjT9*yzfiio|?(ZJnldQkj0{r!x;aci-l;1IJ8e(zpwV4 zmR7P6J+6c;&($#AF$E{i3}oRBd?dTj9aaMO~o)^AGDvCP7+?x~W$?u>-b)n=A^ zA1F~0>LaL6K8_o1n&NXerP)eE%q%$e#=^2csdK?mSvq?8jAYvSRk$g1p z*u*3P{^`Q;HDfilkeD{IYBp|FL+H;s;pm_q_gEd>z>@^OJ%qT|^MHeG@jM*cq-m&7 zgF!?9NL?Jt@;lQ&#o?Y9NhI5=R@4dcTGNVbMpzWpm$j`SahUmbh7YE+toS~lv!b-u zS50ij%S~lJ=*ed?MyH>oxPOzqT2Ll!E4KZr9(&{1Y4L4>j%$RnCQhfXtldw_=n;X3 z%M`i(J$)?%mad?1CS^Wswt37_9P*j08)_qo5@Uny#@h87L0ypYSQ_BpUq!{$>V2$2 zNRj>JRMVI^_RGyA{T_-`EB7JTNlu-6=hq`{+0vZ3fsd(on|QDmTJ2C9YPwPX`!wh# zSU=fxI8lKSF1XmT1xIPUj4{Z9M~W>x;@-C5Go&qLY(K;tq1DV%CT$z10T3i-M34D( z&(7fFnGf>(GI3)c^S7r(!a2RV0dv9~x|S#Hyecz7QIW9Xap;20z4gDUr+CxeaF_j7 zAY^>p$_RwU)s>!Xx5W&KmJzJ9FflCLGosFT;lovrMQ)32qbhlIS@nYIGPdoX1<0*P zlcXE-MoU;c8{<9!qegQBUG;<&y0o>}TwCBG#6|5eEyh=YFwQzn4_m0cuTJXY*R7u) zjR~LacJTf@Uj-P_ws{AT0aze}>*$OdTBcZ~kY%!aXmrfaT!zs;9l;2KX+!!$Z?w|( z7(oZ8Zr!jwGOb#tab&iIYLh>$l5IBrEG4_s^Y@ zR~nm)q^V(c@CweWz0l(I=h{jNs38I|u*o0iyOok~U! z=n>Wo5s>mLKl=&Crp79;FaSOs8N=<6U=W$7k*Qs078~8|i^~n-L}hH}_nM}ER@&Z@ zLeLJG#&My4nx%K^uUMG4`};K;~Ui>0}z7F2Sn zEfQm&9ic@bYFTPrCFp6g_tc1gA*eTvY``K=z&dZbG*Si&hsmBhlz@%pF|HaHpYzqB za&^pR+}l0N9ZQC^@+`5;7`9)iwO<>4T4-StL($hqxPr=Unr`tx{ zc%JYY=T+cVflcMq06kviNpOM#c{C;DMZ|qK^~8}-rAG6&DRu*Ll1XaSDwqWc-X><` zX`xzPYRhl$X&Cc!-r7wO^V!)P*$jc7Eg_hPDmaPg48`XXn9yds+HnIr_4<(k5` zRAlbQ7FuxX1mDe$zCH<}Tsc{h)uK9@UlK#Anj5gLkENV85aP4_y$C1_7dSqc495QM(#C}5NXOQ7f^U2~bqU^!0J<3X<59;lSgZ0nLX@ zJPIrpCg+WTbcfZb+cULVa{J4YCdE^?z9-g6e~5Qi+^EBdUeUP0?s-c>kb%6)f! z=WyNbd2=KB8VhZ2^#w9}y#vqktqhb9M8(xChIJ=)fHI8E00y1rKRYSMwYUHpk2CJ$ za`H4Uz8}Mx!{f6rziT=vKb8IY4v(z;x=VPk$ZAv>H#r3CQ18wme;fdfiMhKV1yW7w zd3mp7Yw#xjC>?vDkaF^_ZBv9Dc>DKyyU(RY=A*4Zm$$gZ8plW0!FqHZ^JJ+B3JHjdL2N`6|C?hXH%ebjm$?#Z{F z?Q#gU95l4{6)ykw)q1p|-1V2iGwN_wHTliZ>IJKbX@m~?whm9jw7UTb>4&gBeNx|7 z!Ws<7pOEDEcSRG}VhcK3}|F*L$Abwe?(>1+;Fm z$?@05*BM7=1M;JyhUjgDPF@LEMTo{4O3{ge5GyB@b%P%F z;T{Re6#y%uGaA=wI~QbMHcs*I!INv(vlL#>&%um47Fq~)_!Hv{4{Xf>a)t1D9`=nl z=2|#BvlK8CXIy)Y8y?DjW0A7SKWQHXmiSS5up5kIk>@sS9NfHl4}QTYqf?5FZ-;$g zp@aA!6fI1i!~N<3usRyDQ!vd5726xlpG7-U! z#8I*0#d!DRrAYwdKSQD*))Yy;MoS@HfRXUvULiKMELW@BC23#*Ej8G=@4zPiJgpg` zQ<9xm0bHVhHm)Wf6W|vqw9U}-fYN}m3#cD#3Q5FzvEzlRkUW5a$W+| z^_FPOkqQYqxWakyzR9Ad`-d7U53G!!-l_obVhmY?XLbVGU&&!gCl}vLFF7A8Dfs(0 z&^!R%$2QYcB{7@12C_AFIw@pCocU2GuqY-600GKE#>}$u=EHdTVXPAHq?2M~2Iu7^ z%jH=;ULv(g+=hxQjGSm8&|ZjC(-X;iB>*u}e7eAtJhqVNlH%n9mJTDH{OmJ6dFG4mWa^eD&$0klWp&4%>tu7nckB5s`lZ1>_86)#UtE{#x zF0K>15OvP(rH1+fFy{c4iy;UX#Ss2B2^WO8jTQmmS;C38qLrm)lv#Os5bFu6=~V1fFW^l$+z9B=Bzc1mN{KMe|02EL56~3)Yjz6` z+Xan%Wx1qNBlwYLIvTO**&D2M!+&SRuQ?jvS{kd$$8d@1e$c23d`#g}#d28=Zb_d3 zZ(V>DUszF6yn8(0Dxp>lAA(#mqOI~aIq%SrwP|!8nTHh6RTsFAO*jltp{fwhlwdRMaI{`JiehN?Ch{M`y$F%;x>c_mw<h<2Kv@@&%{tqBC(y09j}i7(gt`qxQ1*XMbz|jhq*0txLK<4b=h+l~(nV z6zUuJSq`vSaKf3p30z3MB=9+1NG%W)xU-7ef6wIaBY4CG~)ShUA*s?04E74i9!u60yKm;jyLe^#4a;m zKu2}dCHjJfa({L@wp8RZ9!RYQFk@!sIValN$a(Ly0V5tZ?Ge12S4KiGVViqkImzOq zj~n;uC6jZ6Zv0!aPRZ}oQ1ia8m%7y(YQum!y-?CM%cgxuSbfF0NkWLc8#s}*819nt}FO|_t#2e0jh8x5IJ1=j1^gFc?Nt$o(I&?5So1_Gy z1*Z)}VXavw&k(4-`vFH8y&B#CDRGrY;7dG0y4_IA%OJWMwY;-k@~EYYtTS_mw0_6J zT1Mb+=G4H22i@i_G%_&lm*KO&do;4LH1%kWl1l}BXL8q%MgxPUn}^$s28c7^M9zp? zC?$udZ6v!!ZfuAkss1ox`vO>+VdSjc`zup?XXTJqcJ z34kt9g+*{8r)K!o(gdS#``{X&iI~K@PTyV1^3swN;JUnVn zzfigFL7-XqDdqtM3l_xIBQDyK+yFgKqGHIs+j)t!36lz64%eN(N%?))VDmC2YHCX> zgK9r@2%C>@KkGlI&Ja-SuWyCJU@+xQF9!TMIhruCjJXPl2l(+40jMqj{a(R;<^u#| zh6|FqQSl3VIItL4B6xgKjE(SpwAP4XvF+}{dEMB{aEAbU>vN5Fbk!LyW^WLj*bi_r z;e#rZi=_PYsWP}UAJH}0eQtM@VJu4bo=ZPz$@($ zW9BubfTvW61eVnif{W&-lu(%XnrLqI0_t!)pOyB92we_WN5u5_MB{ne{ zRGuG$2quFh3NLn5Ff4*|s_%@hvU}3A_a)T)F!L&=ZV{2|44A8~`!?f$pQ&BXCl~VG zYAKHqnmdRppy&z%$lo$$L8&=_sk<5j$OvYO7(aWOGU1Z85GYX!t6pn6>N8z<9L453 z8qbE}K}qH>otR*xeL+_c*vDK*atU_Z_$D+o=D(Hcj-N7rpEN z_Zi(fPLqwDup~k5z;hjDt3X9!R|Pb|Jwl^DZ!z+fTeNq%E#rd+PUm;?FiTAy<^9E& z2n0@^BHs0YU3r^MoqTW9{*gFG4m=U|eJ$yRpN+Oa84^vh`Hi)hhZpXI(PrjCpx!SL z)IwZRdA~^5SWN^x7y?V+k(9D4;oX$I>`^8MpKuILmS|J{2Y2rk*TlZCZO=?5oiYib zw*=|UAc~-f3C#eCL69bDKt!4vtf;6HdQ(FYDV9(LL<~(4QA1NebOl5NYrwLwEEm`o zmc{Tac>ym%+v?Fpyrl_>ns!T9gf-Q?)`mX~o#;X6g zt*?&FaJbls5-DmSLfWWP@7 zg5Tx>jK(pV<-pG~U&vjKs`Ee;#Ko5`GO_2}Tbn?Vzb6#!8KWThSozmZ!Q%t7uRQH2 zUXs<`X*YG`fYl5kS%BAqfY%-ByfolUH}zrP$}&Sj*3lrXb)SJQpZ_Wk!d>-M0U)zE zmbEbC=wf4;=v6lk0u121C4Mh?SW`jceE=v*wT9N{H;0$MNY+j?(teMP>VZWUedl59 zJW3xXV@+X`e06>0Rk{ohxkUAXWc|fW`lQ$%5z(FGnSVbV6oJaNpS3-Nqci}wNY+x{uZ;X>LDY#v*YEHaP$B8RnhUd8%BMH0rspyOwqANs znYE6Xar|UvYGotR@u+(N7@~aTt~%L%8V9R$&0n@O zwBqPii^}~zH?PL|sx0$RGmIP=?lvEt?t&<((njwk)KEMHCInB?@*^hZD=EsiBJSC# zNvGkWCHU;EnZ&UTT`tMr=cXXs3JiG9hDEQ$IvOMvmGrNlpH5u2O?+YO@xC2R9`W8H zAXtqhzA7?u`SZO`X~=clB(fldArtdiPwsMrOA>{9*4T3NKFlV0O{@ z(3l-a3Krm)m*=)H;2@t5y_LJ#70G%#w|~yC8L{S_Ft5<5%-?TU9kCLgmk!d@zpjyq zE`GhcABAn@918kF_^R+zxxP9v$wCrJ=Rh<6b z&p%nsO0Ru(pI_3h@XItS^%%ihGpA0<{xxbWg2mSeEA_wxWyDR49moJ3jHRC$;9m7cE_r4||y}WNnD2nb20;5>FBJ zhB_bbt9<`FPDI$D1`>4{E`HFXy(e9a%gr|ldjFcAPfb@6<70xn`t%w!7P%`R^Ja0M z#U?IgUE&nOriYmv)s@BKq1Kw>?q^5nIX0;Zj1+JRdeBQ**lGg3x#q1pWQHP=@FgvF z#e^A@(hxsISlPifN6mUHW2P`hs<(|af@0=q8kr`Q2wb}go0v?BOYflh2kCWsaCX*F z9oL<}Od9eEfpVy#7cY%++}?AbWfd|N2Fs&idXjjkq5vpI(OjLeY7q0^;%`1VA_k?gTQf1^8Q)Dq1TG zU2QioMO&itGflFM8A;kh?Fr3Gev4 zFxA&%Pw>}(-+)|up9{SetEWzP8DfnvJ~|3}T2NGLITZCxY3lpi)#Ur$j;w5pATvy; zssK&Xf36(D2cN(vE3#MR^#H)U*B{2IQAeGpr8+?#`ay{r4j=$+JL9L$G49>@4` zUFwbEd0&YUK;+J)+*!0cd%1abM6obVp)w3yaPq`$nZ^Z1aMS4Vw*x(67%Ei=`$4Y} z>8+kD#gZ3C`g#YFl(>LdII`8{E3>E7NLs+LHl zR)$|x1*#sFx#+fP@sxwM z`wzel3a)B{H0`e)-35duJhKz+9NPW|w1VWe!rljt&Io`rG zFVltbUG*^Lnk0tNtscrC>-1;y)+p}M--_*y63#`JprtN9Chm)zJdCQ)l$`iSuEqXm zKQ*W0Y#Tn_zjTW-^g)(FcN`C#f;NsN9>OgOqmSJ*$hC1fNU(a35Y}|10mO zV97tmE~pvF{srWJl3UYVfF=Jm{o?u|j9pOHICxrm_sqr7!e2oC;gWyA1!b*|OWPio zVafmh#{O?kH+Gj_>c^7*>XxC(%eU*V-o5Y($p4_`$~YGL{{t>~d;w$f-~1K(SKfH@ z50n4tMcKW}UB9(s$$#&Y*1pkexBiL!Wv^ppwT)+46GKMc0`P4c3SLZ+Af}YDS!0xf5QL&vJ3uvIQjbN)Vrrs|7I6_#@Ge_SB3w;|M7)Le{A4A9C#0dKQ;mblCYa^C=CG#jD7&`);-F#Q#`o=y0N9ese0U1pTSDB#);dJ7e1CnsBrs!QBs<{-;V8J{&0KjYQ z9;NY^sm@Dz#~hP~dzBYBV;Xbv=RQDbr(84EvjnSq8D0^;Br}(?>$I!v-}52d4|UWv zQR!~QpvfMgUk|=d=R%k6IqNt-V~?sdjr}1S<0eC{R|Ux z@duDi`j~x9jXcQ(AY(9xm%pT=ByP8LcNn*Mnhl1tQtkY#!nN{tfEvIsr56bqnI;$> zjr3GC-ciFL`$v8}&#jd;ahj+vMOE(RE#gMNb{gF6mS@ZjE@hsagan73kTmTj_K_Y0 z;}o8sm2WUGj!SmFE>=$>%lrEDzYOhyb*W?}A`&GUkJTL= zBp8o8p&1v@I=VCm*DaO+P^!?5~FE4SJ4xeuJu&YL3OMEWx_&AidyS5+z@ zyYkd%pFOzh6{@M3lzMgUfM;?5XFoQC^E=>4|M3bk(zu?Saj)p}aVkTv)`8~{F*rhD zE#*jK=nMCKrl^(em49(>*Yr#_s@Of!1rmFuF8vLy`DE78V7>N$E0mrJ4ajo| z%*;K~kb zE~TYfDustlpBk<81a$=>b%@5zu(sWn!mMyNO@M~B3RKtH<4E5>rt^>pWNkps4oiRS zm*HMECdJ^X)M|ST5=dF05UIqn>nMveBOvp8)SKfX{h#Tq*g4r&9 zZ$&oDh1)Mg{5?EJPc62+qj4&Fl)4N!cT?Joa~>CI4RT0p(Q0NXvkEW*;Oxv~M3C9N z$9eYN)?{3v@M2t2D1dcnKb^h zNUoO4W%5%k1-S6VS*eOpgbY-uZXT!Rh+hyrpDbjVF!KOJelP#Ch^i~tcxGJ>sE-(F z1Txoy&4@f(aSxyX9)||$>rFS-+k5d~cfBTP=nEdPXgZ<3PG+>6#Uuoqb2l?3BUy{P zVVrQo29{f<)3nSPuiy}c^7hpncQqyR(*O^!En;_5>y@yLD*imNy~3!DKM#ekW0L#( zT`@#t!_!U7v_)7OhbRHv$2iQJ@yxn~S!v9q!M--%K%*j3HD1T6XboCUw9kRGo%6C( zn34=t8vOUNg8QZBnfTKo@ko_+-g*)hT-ol!yum(0oKa9pYJD82oVN5-5htBy>l^8p zVeE|QyS+JTpJmT7eqIK28B{B4znWr8dj^ycwRxRs z=z$a+YD7BoPt=^v;l$nF3+gIWQ9y3M6F$Z5kAFA zl5izk)F0H4!;3mKSR+<}RE3%P>LJ01>P+`XrTj6R;|FGQ@#gRfes-mxBDm`o-n^8Z z9APKeIKj^tY&b z=fvxvt?MjwKc1D7(w_kBkVC)nyb&_+(X@IXZPwKW?#^_G76eliTrKf(@g5yP2fxW< zmd?NFv-o8-X|9E)CeLkqONwF zge19hCI+U6Z>KY^7Q>#JqRtDY8LVbuAUy3MuGmLK4&BN$xAh~~erBGucv%Fsf4Qw9 ziz?A6>B`!;LA+MR#WB!#YNt)b>%*{GwBn4vLwF}FlRc+Sx<@ZyCW&M@Y{ehE`q#2F z-S~HTcRilryyuxPcl4D}qzrh?AvRywQV-hq_m~SO=diZ^H=hF@Z-NQ`N@KJwsa;_5 zI-kGexbyl-mIRnBx3_6^4Kno%!qd)kVC;>0JP>IVke3O;wYP9vq!ft+BncgThe_r@ zT=OlY1PL`@6Dsd>`#){hwX@-i*@SjOh?GL=^-vMRX+qk4f50LQ*)PZIAl^D0;{KUK zdgF|Ozk*iXM@})(zxR@4_Mv5!w2K^q-wa?C88xv#%BB@uERSQbs5131aueAV4OuF{ zf7${@U12=i3Jf#s&qi57vl~)p307B<6WH7!cl2q6UC@}Tjv8PsOu29Dg6Aa6LtXw0 z_W}#0AVuP|MnwJrg0X)gMN-2Z8Po*1X2kT-D1MriamwN1H0uhxg=i8@6mzD08+n)# zB-s$TY9r6?sDXe)oAvs+o|Fba#Vt@#I&E-$_=F}vn9d08_W;GP7v>A#3sUDTBF6zX@fOIHkiE)rh%i7c;pnYhID;lq zsKn6SE7v|T*Sn^O<5?2>g>#xe zXoi%!{G;jzF^uz37UIFlPmKoNbGSpTLt(ry=;aD3a<4D0UV z)`FsAi?B0teANWf%vt$95viJIgf%cJYlNkj)RudMJEv&Us%3Dh-%3N)O16pC1&fsW zZyAj-g*XK?WkJ)&eiY;&nMF++z=8{GQp4>K>15FZ5Ve zVe~+8nH^v(2~rEk)8(2+S0Sg^E6*=Lnr4XigTa;PNq6p9CnnA0>UxJ6+EFC*ZuRND z=)z@hT@7dUA$}x7)akGgG3zk2;)gaPFiRY2@8+No4?U-_VXSOX&xTE?`!> znB2cjXjKY`1nk34;?yL7oj8t=fPdWtBq*x533zRB#I6TODSM@B5ut>z)nGVp z&?zO-sl2K*%|cO0o8xe#RMU=~T0518P#??9RijTpz}P(8?3YMLj_uEPo}r19~s z4-U|twVi)+vU+x~A&k+YffW)sx&7*tjY9Y214t)k#mz*3$jJf4S7AFl><5575eOyg+;!FZ@e^mOM0#|8+ zQ9rkmGK4-m<2p|}#0;4+D&+Vd!;48QJ5UbxTEd2d!2U-avIR{^(~WdXSy(_|DtePP z97AA(!NOEk4(Z$>~6fc-*`D+tO$!^;smfj&@7!Y-^P8@&|HJ z;H)%*3tNp_a|lVQ>vS8Y%wx;zv5q_=olrgIEohQtCe~?~qq%l!XV|5{&et*~Tr=?N zbSF1v(wbRO=qD*y&9pPOtNc9rysKfMgGPotDLG{h8Z5lcyK%ZLI zsYB85P_)g>4kKaB309QDX)-e~Z`_2o&u{ia7vTn!@5zHX-G_(}KQcL$ZSw z?=>tCl06z|{(`Nl7Pz5nNH}u5c1|sF3)r-axU~>l3`ZOg=A~WUk zZY`s}GJK?vyu5^_DYoA(xTho{OwP$ymQ&UUhSk}`B>q+e*-RcLd71({qv-e7>5lCO zH6@_Wnh8w>?5h~vw}PI+;St0{sTeUXn%*EG?`7`~ z6X2V=@V?uLDH6*5i?jmvzQq&d%45i619<4Y+9l3bA_rWosMVftMt)n~aj=YjK|)z% zwBQ2r#O7&R-^ehXg(I>@J%=fQ9LOTj+Cuo0h)vE@0bhaUn}BC!tVi_OLqv9^S3+p< zh^F~W4smuD&q1SHI`rq5=9Dt+f-r)_#``3YJDmZ?E6C3Ez>95fyV8O&1KI5u+ln{;!N%aidVcw?2IgG?ycq$c7Fy+ zymlJNcalZ+-@(`3T~SAAU_=kmjCm$;<~1+p%+Kr7Z~q4NB18u?*7DW}+(h*KIwd*F z(3HtH$^(<+QDpWjm05~v*yL&v;n)#!Er)1n-;u8I;*vDl+dy3im{BE9a0%~lV&M6E zWUsFlkJIBtBk2AOxM+%&%?KCmUn#(}iu~)|G=estztbHtKLx~gA_dvb_{WSb0*7Y? zjwbsAO8zeiO#!qqM(IpSZ*vT;oG@7mL|;cPi;1jj&+lwxL~nTykr-jvT-A0QI*EDUmLWOLDw$1pEDy zx2Hr}*&^p;gyVyNgWyf5OWx>>ZH*|ID{#Q`!8e-R7S2i{zs_qCp0Wr2ID(u{2jq>& z`WX>k2DMEvl9)XSvWM+*aw7ZP4+6|lhBs2Ly5(WdbA|xAlN2{ec32{{{eb+l4@mBL zOjzzjO_Jh?gdo>yqQD<;SA22>31*EcXRVQD@xxaKkQOFk+N3!^_-IXe^oTaTV}2)6 z4-hN>vlmZrOQgXYpR0WewBD}r)?t4Skw!^m##p@m)4%Io8ZC|xM_wWLiy{I0BA#)| zKR|4N2uxB~_Dfg2E@k7F@U4M_t}M$iyt0A&|M2<4w9a!t`XS~N{p2=68bmSmP1^l# z3M&FAQ@q83h*Lo-v)J7oE&Qylj*78du{F=@?25yST3^~hI{D&9<3EF$-6iMN9LR5C zOR!Ca>gJ{rUhim^-vKm?Cz0IZoZouaHSCK5yN)ycbJTeTLq51{`@?jopjn36)*0lx zuH(px*5NmAgnClA5J7W_)1e!(OBp6d&7AK0-D@3AwRChoFKHho9mLgcdfDQNf=)I; zcPA>w0G!#Dz_eT2$GlRdlB5q~%M(DV^~GJElD>Fyyl+TtYX%U9wY5$g9W;1sqkhTb z+t>dZEeMa$%j<8_;Vqj@KJH_4b7d!3zBrj_oH8>eS(ST?`gVKoftM>lAEPwv0Ej)s zI2Yw-RZR&fB>{xR(FHYL2FV<75@p(LPS(5UXx-v&41OSaXx@|vQTAi^8AKECf2b{ zP27s;Tk|df6!Z9(*V&5@0VV;Tjx^>IO6HSSzo!&Sv)G)FJnxm7^^>Of;BR#&sZ*g$ z->^`yCk^fxolVxOq1rf+@X@X{=}|G&$DIz!!w0eo<0F*#9Y5^Xr$#d*m(F#oDW!R- zM7%UVo=+Dzi9Ya08>r^uLG+H+RH1lzV{}C-{eBCY?Y}-vgN5m;)_b1Yl(5AJ-oYoS zS*_#0k-AD&xB2N(8=zXz6%gpZXf;YEQOlEE3-2XE=?5?;kNuLQ_O|C$$8K?Nff+rcZ5~%$uGX+^oaZSt0vK;*JyJLql2X{WX zpVk%PQ|fWjsaIZ3P}Z<#qG9-PG9>Zv%TumnjgcHAq@oXZPdKD zs+Geg%F5Qxhk_~X3`}0r;$!|y4&286T^&i!g21Ni5NUA9v`W2F-hSH+U+|Nx;nyMY>);Q;yobNYjw&XMy_Z2EIdTQdLMozV9FTP@zNnEbe zp1L-EvhQwRd6vo>Z$^nfKpmQ~z0C0f5sbILX4)M@75hZ)l+q$z82|nEU?OJf9k{ zX|2WzDd!bKmcm}0ZyZ-j!XJ^FrRv=yFOf{t+OqL{gO4Wu2fD0s-n0Y-yW*}q%2T%; zUX#)3ig=&qsg0!OtVc0$a=Q#WY&n~Sou5VuYa&Mgs4G#R{DM)@-|bKjXUYf>wK!7} zKF>}IS+3g7Rofw6OA@WcZBV#zOj@!iGxjRI?zKo<+qEjTB5aug()u9HtXOZTJm|J4)kCvnUBEs_<>#B}n{v}+?NJHAL~)8F{|XS2>^6mW zm7bk5mIUrm09O}5CdHwv{ertG&Wh-Dk32guCEwnN@qsiwaK7hw0H-SM%oZyGhKs)| z*`2**Xiec~lo-Z=mriq4JrO-B(6#E%;nYz0#ZnnmlypYwZtzyIgk7ki6rts&_nJ-e ztc|EhV!L)y*vXcB`=vp}XuHA8!+T!?Qv;b>Kqcww#hIV1&yD8_U^!&>ee9~V)m?c< zH9#mFyu7t897?o6t6d&mGacx6N~uS614L@KY`m0HdVMxMn>_J6ZJ}Fib;zU+hk0Pm zeXa8>L3wV+LP*&4d}_HMA3L~JN5)ra0k{=3SB7fS!z%_~Xu#qenWpW)f=5Dq{q=$s zE{@yv-4A6rwKu>s4X3ZNv%)pp+#`%KV?mN^ZQ_tR0BohB$0CO#3<@GO$|PzWekm=WWX#PTbpnYxmhNo!eagn)vM~VUGmABHC5+kvzk*^)yz8V||1F z2^+0{Jw5?$02!DgAm-nWfaazDr0s6POaEEk|BBjMeEt))cl_585VpVRSI&O8CG_ak ze+Kt;5$KH|QR}ae9X%fE(A*EBbP(2mguM zAN`Le;Md4Lr>^hhdCU=jiSMzT{Z3ia5atLdxHR!gd@p_Y%MsA>;B@Qbvi9d^F+o7f zRKb<0Qfy)W%Ms9B-qc%#QDUUZLO@%p=e`|j_Jy&b@O_rJFFpKm?4F6Yl|Lo(x zhxM53{@K*KCojI=fA#SRCIxu&f4dampZEX&K45`6wx#AtC0!{bHOsJmDW;c47GU47 zP1u`7%Rcr=e^ce{6HK>kJ+J1ffdX^?`mllK>N}^{TLw>iwba}#bKL#*$w15b-_CJT zDEi*5wZoOX0?Unqt#$X$^DA9e>?I>-oP-K_IgVFg5xB0W$QoalO~;DDh?Z<02JlzX zkxBAARI1iReA-b}VB!`E#NyOA7_cl9CTsP#m!B+rcAMt4cc2`Vh63A(3y%D_EDePj z5ghGG^1_$*i57n0ejyjb@yhY;C0lrEX6s6AxfQsKRVoyQwOXbk!t2zv+JZ8u#T|lr zgxmSUd+H}G-1eP*DVA_-5?=Hd%)hJNotB*Z(6(8tA~7~!&)P0oO{|D$HI+_PZfdqq zNe;!^N}CKkYvf&hN(P-vx|BA{!@ZBJtxNCTKnaufp}Oj%3?*$Q0a9({_A?G>2HXPF zwgvp$HwL=9VW zHdh(y9#Au0Ih{DAZ=3Luq;6?0L*w^TvI|)8?E)FR)cq0Ns$QGgle^M=ikVh;k@n>xK_iWc0>G}WS1pIaSzOREz-}P8lr*qC4u`$O5nahS zDAE3 z+lNC-Vc$cnj*en?K}$##SGWzQcX?Y>6;>RwZr5v=h zh(Jg(?b54lKg&1T5hg$>fzDbjhKKiv`c$0yfu2h;FW|`_yPw(99};~B>Q3PvOVK|Q zROMy36pO1Ok&2AM3YBz!>Tg3eD@2)GA~9G-uUEhtVH{|wRnWabb+kLlI=fsnFM;3s&+d7(#2?xvLt1mtfnhaa&u2;N(=h|X@U%C zgOb)Ne+|1{jU!8v%{fK~X$jrL{4c2Pkk6soX*VS{+PiZ}f}M{5(&&(;Eo^V1hM*8* zw2*t|4VA55$cn;<{k+K-qjUGWhzw@R(uNDH+FBf8f33l-H(ewu8*S=8Y0`mRVHM9& z+-?}BkYQ7wrD!)jQh{;nnLyvJyQ-7)$`SWo#+G2HjPFikpXP{G^3PUT(o)ra^7qCj zaFo8I4D&b!^!Xq#5Dz!|}BT$ak%m6&|My1obpPmA#(9@hF_VD~kt zYC9$Ol?-O@{sg*k>Ra!Cwo;<6BtrF>S{Ea9TI>@q0#mhtKNb)BX8~D$D;T-W#dU~# zfH%0<+`_{$&lg%OpuQgZP0L-p3JhZslINnW>E&s#mV|r|?YA<>6XB%QSjnX458FkZ zqe1nJh?*Z`yiR`5*{o)N@8BxAmnYm}Kiwabz+g(g1DIvix9a0gay~@;h z?|f4`AoE{YTrM#p)2jB^c6HV}=0-NL>rEO(w_izfSpu@|vjU_}cNxE|7YB{AM7X&> zTs+n}{k)hKDw0K5yhl<ykzMDWV1&POn%ku? z41Mh>sHnkg1ME;owe&+dHyq_153BFDTy!B>@vTR7=OQnSQdzj*WpHl`oG%Ry9{ zDf-QQxUEcY(^jV5YtvvO+=qmofZLs)Kc`e^3v1Yi3nPDzqb}H%Y4~ytU{lpS z{pZj_iqUn3Z-ZzDB;^b~_&f9w+2~J?7!*`Qtj>7C#p^%mdA@~9qD{X8w1tCKbMlAx z;3#Zb%~R(qCRQr#Ge5*00#Rljdk=GL_<}p6BCuY7+^{IjT!fyk)WG%1SR129*_#a+ zek75NesHQg%DF}5M>JX>v4rXQcZKFjfOHG$DgcDZu54JTAxorhe5i1FG;{NjQ~mB_ zMe=%S#ief%;DRbw;;IFxas`|4=A<ge@BW%?K1d8a0?fOkTE=UvuoGZ?n3VjG{GEHQ@+s}CE z38?aS)9lE3uscox=G>w;NGUb)tl-^N6+|4A2%?Uz;ctk;L{7mzcf&?L$;DIRfg#H2y@(YcAB#McQIu3lu z96rvb9Tos&WOZu>y#^rdmgD&XoC6zT%5pwd;{3$;h#6wBf)*(YBufs!vy?cFJ1i%< znInUElM@n(XE|wu88E9!lS+xviEvpEy+%P4&fpvrF3!Df%Tu*5VSxdHQ*+PNOCY(* zxuJqkya>l~z&?=aHHyQnJ^r3~Bz>924q-Mm58EX!B*>vBOX<3BUycA<+M>CaU_GIC6%iIUf=VJ6QuX8C(? zlFsEheXF$AuW}c$Ks&y#HjSM38KCY*C<9_`j)u=SP=6mIntw8gOsf#U-(H_IY9dE4 zEWO>e2D=N+aEo52Lw@pnwI+(rYrtNNT;QyDU4h#s-(n;X9;^fPjmg0SNPr~1(GO16 zrcYmS`!Q7zdB8iCn|JY>AstI|f@sZdM`O(p=&u9ziWR5Q7y)$}huvZ@!7&jB8^xRIss=z2y#jFt#Fi`lfP zF=t;#z>{;dg~nwWZ%P}q-3kNphf4r$LAHj7aOJPuC{Lu?;!LP4%7sf}TNEhy;dLY$ zb^vre=$w8N#iFkGyVsf5W95xmMHd$2GxA6`76V~ud8@{`!EVB*J&bI&5GNEX`;i#} zfFK1@q|i$EICGM66iNP3;{L9`bRc3!q*EDXaSmgaOtk<8uOcTUzyo_AM0_yh%3hrG z7$q;`_m6;|n6lCwSSzW}$s?l!1;bhH^H+VdVv5wAv}^>ZYF@^zUC@s!$Rb%Gj-SHI zi;ee#?_5RZBY}bj$5Z^+8f|U?FY-)xf_LVI#BBnsL^6n6Hi3w>2^-hDnVbJi=f z?zrcpbv8Vj&aE(${y-{1Ocey-v8y*O?!_pu%N+4-ZyH;Q7+C=p;!+(N#g!=~m91}OIa<;)-q%77m!8+7 zRmxJ&H6QTq&}lhPb&ln2D^{FUp2Z;upd>hkQ9HER%N=Lf88Yy7H{`3!fQUyeW3lI> z!SX_$2K%Lt)6!(%lxyDo0pBx|&2itGT|#yYzv=jG`m#zmKK`8_p`5Z4$uX2}xg;T= zv%qps#%?D-AH9OZWFKwR>C2>t0%2FItP^r5Z6Cuw(t)&z^|SH*^)v%W*j}tdpZFZp6{Zr@hm4?M`dF>9{)BJYT}Cd)NG| z!k*?#gJW!W@Yi2pwkl`sJyfzVZ07okrt-mMsU>JLEP*y{Lr!u4q5?=5phexT5#<%n zed{2cZhM?ltZYp?XazW}Mj8tfejO41H4v9@WpsZ%#oln~A%pTO z%Oj;z%VcA5ZQs6?hv)(?mea}w(ERV+)#16#p!gDglCne2Rpm5bG5q-s@Gb$SCV^l& zGP(uej?wtKu5eDw?kI!+6{U+s?0m&F5J{MuLP3INOK+;S0){I_d*o03em8se&cYS(pIHYPXqYlPRw`~3z@rtG)8ju#O$1h(s+ z^p~}{Da+h~h4W=tlBgDY(r~toAJ%;^_rl0T?La5wz@tfp^^tni>1vI5Nl%Ftkhq_5 z0ReB033e(jHL*$fSRy%|wuN(b!O(SPXxsYjRX{XND$m7>RVo()>DaVY#!@DDj&$=gYF3!(3 zrj$OC>H{pHT%Su)+u*q_>A^s}wz7ppbCR-M&eh`M@K~itF+sujPx0Jb>xnu)z=^{ zC8-AZu0)^Cxc&TNDTR9GoG}=Wp3v&bEetrlBsNHuKkmULy2)1AO91sRpuw>;-N#K# z+G5~jbF9v_b*F*#qiu@FIFVgFt^5!{2zZ4tj*<>eY65t6=u17S%M6f|`ceb*@y(aI z-z)ag(TSI@)MAY*HA35m5MP5AtHLP(ObCETwbH_G-PvL7vU&0h(eDgx^E&(0n5mxL zm)8PENH>2>f)DK3LAN8HZ%y+I$3O-=J9)(Uq%H!N6xaCxaU#;|9G+cltC+%EW_Z1; zw36k(^fKDac0gl0WBN1D`pM&hu(C7`$(CP*XW;EOjFMjH-rO~Ly6J|J7+l2WZUpH| zW#Bj6*;SJtcOwad^3{yH z+Bk}Aff9rCid_BRI>j$4V^bsJ7$4G2)jBMgC5Dsq1=gW6zdM&xj>@+z;Nv}f2uteT zxNHYWa%f+pX8$rk8Sx@3rc^;feB4*pgb1RXO%`S52R!cBN3@vHh-Xf$D;F;s6?0~Q zB8Sa%Kb+wyK<~;||8t*6N0AiaKJ`A}Q$8sOGf~=TI56+sT24BAGs|r)azW;PD}zzZ z^i+|vvkj;YZ{2kHgxVPbd>H!sZ^lIlzWyZ8w+E*xNU}YF{H6=!?_ijv&t3g9Wr_|| zg195e&-o%;(sy8~SBCDq&&MO*k|1`+jeil{D$k@HMO<~YY$R(aY@F>w2H95Yu*I0F z;u(fu`mubb`a4N~A%4>{$`1BaQY5jZhGF3)B>jt&p8;n5iNOM~u`N^@q5t2&J+)u_ zpi)=O`6pAI#wu39k?0&T;A3>`mm@&?!pTy=@P};KT)i&@8ObF--DYIDg)0u%obG)A z5)2E%N{sP601t+PpM29^|F%aLft3>3CX+Qw$dJ^0&xl$Uh;vXXEe*7(Ha9dMMSI^G zTP}eKOf8AvmPOm)!|BVW@)UZ-B=zu^Z|=hb^*A^_=2g%xZ~yh~dYQv!i@crm$&`6M zxc6gp#sz1k-q0u(O9Q?dzv$a}lVn2G_PF;IMxq?2l7oTClc?gU)!7}-U0S=hpm4HQ zGL4IhUgxJduVn8ITkhuMp~6$RHk+Mck%m$t1;hvYZi+P+(jSwiJ?6UfFmz8qWok9h zS{1QShC%!>wD(zN?|Gl`Xi43qQah6lR)6evK zgDsCkWGA`4I-$(~vY4Gl#jFL4-|O$#p4Uhq(KS{2fz0)b2Nl3=cVO45KfIe35b&H# z*V~1>ZixNxl4_VJW`|Q>rmKL?~_9yvu@gk zw`n#;Nkb{RoZ_@2QDO}NiE;VPSC@0y@Hq0Se03{N0%*t&X404b@rZeBRhzvDg?9P< zT{E}K0vVtoGxt!_)&o$cXPj`)=(=&oohZ_rl8G!Rz8_(iAsd(3zTTz(#nG;a!x334 z&DIqztE!R_$y*M%OF}i*GYPx^?E<=Xw6OxvbVwyBsZ*jA$Go*4x#ygK5z+mq6ZY;@ zGQ#i5IcJ*CokEI`rW6!I+8--B6a5oi7rKfW)aOP`X51;#q zOUIeEi=GzB_{k2|ANkWX`wbuSKpXm#dx-VWyp>g|qffGXI?h~Ho}b3M%56Wh24W*{!#NvoFI=Ec)>Or?3CL+e=Wb2v=hrfB_zWLr%5*@U&qIoH*-XKof24H>svmRa01aX+EdUkV2KFr!SQrG1BI^J z&!n|0WIW4?W5;s*D{wgk#`sf4=J%5_pA2%QEY0R4veLvU7-NL0R|yg8&xOvsyHhahzs!`Lk#LEb)Cw52~sKM=qlmo z^M%r6RXay)BS&;n>WkY1y8D?vQ`9^K5R*%Z?hH?(*B17ZJd4vaA^-;P(7PE)_hZ{eiTX#&+|6j;&rFSvETW(q^M)XBdebr&SBcnl-AHCfKB|)Q)cfpb;-@C zk4hrdR|cTU4X7tRh7SMU))NGQ@oO%Q3efGDV_ zNeCS=6afJ>6cGU-C;|d%sM2(T6?;HbEaL>*prgz`GvD+5{VvWr7w6*K9PU|Ug|*(b z_xpK1&vP*dBlhG8bv?(t5o*l@Tw3C`AbfDHc81VQ*MY9T1DrlOvI)=kEfqS?uB9hX%YK1eaZd2zeY(2?$;(D65TCW^;J*9+)#y zF6vAtBt|>2P$W|hY;E31%p+`Xcch)iFKkzcHb9M^tsRUpcgDw*-gizNFFuVv<)9)9A=BX=gpbcV;Mma>8SSj^$VbqI* zT&wcX?#Nm`UU;+Tpgyf-696|>KAi9Tlnkk|LDdDpCi-$6jv)fk*VpI_`T|G>X*hB( zG||6Nh!QZL?oW?mSV!**zTz+TPhw^n(FOpqR#dljy&ctDQK3h^6uKJNiw`MdY|b zWqB?c;hbnL6j_gRRh$9}lu^D)o0lJY$%P4>zCJ<8-|I9QzzXYdr1w;z&P$Uc~09 zm9U4_YK!@`sgG`>oJRvT&jwI*{xQ)-sU^G7pEHgN4YD%Xld zS9E?5YM6IwMz-$pT?I3Q*Zbxf?P&pukWkxyt2muJ z3SVHJ?m%|C`+_J-bU3IX{=?AFLNhdjj@nux#!Dsdm=T**jtO~QtDUl}q_d8{>H)O; z5@>bU)yHpicZc38<7%%wb?OYA;IE3KfxHYU@>uV})vv$5vJ`WkqeW|Uz6kC$vw1f) z$>SB5#CAv4=uqlD4yk;^mU<DSK754TXN08fo- z@?$>xuX_WBw`UMEojW1&Ya{rvs`h$}Z&p%b(%zW)|Sczz%`-MG4X%B19B4Lf4l?#Z4msAcc3jq zE*;4HPk`WZ=)c~9|L_p8$6EgrAc){x`LB1NEjjPvUO5kuJrFDBA^r&v{Hq=)XxmqO zQNBCzZ+)OY^+abzN&o(Tc!>VPRo9R4|K%a%FofJY@GlRM^e+#wt894R|K%MR{x1(P z{SOauY9{T>ox^qa<=p|^sqP#(4^jPZci1GVjwHKLnm<=ugc_sagU5B!&kxOBJn z%F~+O=l`S!{#QV-c)DY_u5+}pYr0Y19q69?w>uyg5d2F;$OQ!d3r76g9k}tf{)Y5| z_}Rt(*awFHwGYUth?|f9=?;irHw}F_H~PNyU;9A&*vrckudm!(?3|XX2j2gq9=P@S zid;Q#_s@R0ec->{feFd;f7JueX8wam+@2enc{zGdo*sBP{ZD#8jz|1HEyp7sE)PBa z{y*IT$v@qJ4|kt0JbtnG=()T*@Z&e>@BdK`{L>xyhmiRE|6BEd9D~^R{~ZS5f7;*S zP20w^%YwT3k^JJ0pk{%MXG=@eiPkT(Gr=CiJU9l4M^h_5K80&o&wfwq{=+jQv&Csf zLZ$=#DR0ennY}dbRjhRw>s8OCp`b%&;xcxUKJt(n_Ayng2Jfv3*hO{DUl{;GJI8WL zecVS$fMd@&N`wXly6alEu8KSNU@ZG40_M~toKv~@C}I7pM_DzI0V0$yE<|y?YUW7;1;LBQ^<`)lmfQa4qg^w zQjJE|{bl7)sJkVRO@qN>L4OO~EAHb6bu^g+Y0U=v^L=)l8%AI)1s-ZS;~L6l`x2Sr zj38O=JfntvMGR_u5Tmvk&CPkjijzd6dTWsm;~E$f zE~=(-As`XR*5y9%WI?nQF)G*Q*&IJreU=k{jyhACPcYP>?a;HoHgAepQ9J~iT(ELh z_CcJAh2a9)+T16N&#LN=l^~oLgPOT*m#`MKccPU|BH9Eri1DQ}(f_ibK3_MpcE(F} zqw5k}(OF8+Dg^}@pyJ$~lpNg&{l#5A!Vkn@utW3C2j4DH>3z-3t|bwP3Qj@}c)YIA zFa~bOk#(sq80{g6Z}pdGZq$)-RN@8qIw*%2OZ*hX+9K8-tdkVjrzU+J2|m0qtu<6^ zBy3mXb7E7xx|sD@2>dj|$Dkqa4to5C(Jdc?vw}~PSCnpj%BSeR*&$=0cak3?Ub+zx zYO%E`Ijast(%WEao?I_g*h>bTg&;_)V8p%jx3`I>mUt_$yEz92Ph1@wC7rr@#4&pB zfkm6ic0?y^QZsDf9PpymOr-sA+usMqSOAtfikAAwq2m*JA)#-|&9U7|w|eB=kc{1AqPT$Lg)1!YoJeC<8@f zoX|fdEC%i6DKT=R+F81dC=(FjuKm)gtQe6*Ktc38G*7-EL=Nl%Cg!$*rW}aAFri-poPaDDh}=awmSri1?_yk_v+3YR6%I^S z0@=~r2~Hdu#OCA|+Q%x|NkVR!6Ch%mFfjF?CIARH>UnefR1c~__G~oG0j{7a)B%f_ z=T@1yV|3E+Bxg~UJG(%Y&E&uWIEcdO3x$v{4i+HGqUX7jFN!_oC9i5%7#sPc9<6Rm z0L-&t`fG)p)atkAR(xYI+wdINAptUL(F#zK4jGu%qpX?!>55XidN_B2$8jfgZ!kJq za6dc6dqF8=g|k6%`cJ`T0uNLaY(V;()r5%as+haP8Xuwv8|8X1d>)-*T#qsxKosTj zc$$4L2?pno!0OQ3IG1mN@DJeOO`K>SJHQ)q5~^H!G=fx=T|#l@iV!7U24URoEQCc*QqeEziTy6_#gc|Jnv7R&e#>?uJawna6wRq*;_Ct>e z8zlg!Afh{H*kavk%WSZ_`M!oJH@{^cK!q9kntvm^Ifn4@M1m>3Ar`3=V26Co%Cm$o z0SG=Br!X;sS0t>r-qme*PB;vW-K68t6w0Yy073K6%opn`<_=DUEz7)&(A|{tX+_Ga zoq{O&YJL%Gx+W|(WQn_EqfUa{+nAtXvV;DX7zMrNLhveCdQC~*@Dw{oW#`qwF}h;x zth5w)Vs+(4sR^BSwc7e;gnV0EyuDTya6ZP}HBIDoZ;u#&PcsiAlSYVnE*yN9jq!sT zCaH)0GR7$uH$k`Z+E@ptde532ZN3eVf#*lJ*29n@&Wf5`1-Fit3hZn9Bfxhs+sV;R zNpU*6(26k?po_N;JT;0KU(0bqf2X7!n8t-{CPdr=z*HL=w9IBz|KtYgrHK*mcHU2V z#OY9aI}fw#RNZ7bIP4_I(~Ti;;F)!kFro)~VTh#t8D1`5R5`nkUbre!>f+LnM`|hK zI4@|LZC{iDMQm(-Bp1SD&`dBP1ui{JaLbhmMPr#1h!o(b@6mKKmIdoYVw(_-LvW1E zJ-80do3J#3mrHWB1dbZDG&^~>J-IH92Yb1htbWvYM?sZ4u6P1$D2z>3s&v+`6qi?H zO0)54Y>+QT1pCir!=*&doSB%nViFr-xPvz2^VTC5!G=$Id#bV7MOd90T<98KV6{_6 z@Evi0wu>=jc-ogTa$c`-THE?Y`M5!hw91I_KxI{LiTt~aJr}pUL$$dtxxeabLmZ5S zmcOM>Q)3ZmeT@uYa8zlgeDic&RqG6=)?gk(aA2Z7DPt`+t^@D^8v3!DXm~>wsybDM z!0-0gvn7OB33>WY;>8Goj;dEC%{rQW&@+C93y}fTT2311wq9)`LtNPKM~~+jDu`O_ zHrB>1X{7^Q3eI z!*ojcIA`JS75nl{F?sKhK0AE%M4Ma6c^HSyfv`N_K`tZ1-&1)~mt+90k#kt4%k@~& zj7HD-CQvVzaxnLZrbv4UrFz&zW1AN-)<^?Ig&wX^&^igUo{ESS zpt5Axh1bNRVpysTszVLqEheF8K8TbZW!veVosf7Lcoj(q7R!Hq-);^#Ie5Ty2EAVZ z88fJ5cBK`epaBQk!bDcdPG}P`FlS&ZZ6&XjL1NEE!&8zRKO@_lRS15?_+WII9X~M^ zK?Lkn-V#;aNuFQnv2eTF28ehO<`SS>2k+L7gfKZ6WjUeJWLkpbqRhz} z6cG}(R48{D8`BN4)Sa$^cD=*viAIPd_Fiok))#Q~7Vf#oD8z{TARAmT6YQtwy3@;% zV&H_SXXzp-je&zv^0zNrI?=$Z^qqeXmzTeE3kyRDq(p^>1@37enn^k!vZ!G~DuVrc zP33LAJe;r!LBu{lg0X7|r+p3?ETLA@c4iqk>3zxEpKq99zrjOdQg=uW?fos04-|m_^G2ABjs-C zrZG~q4j0FZg8iOA`170&o(UDpkYz97$23&)0N4qeQ>YY--F`q@!i5cD?7iak=TK{_ zm?_vBqZI1sp<&S8r#ds&aLKQBgYz1<%G%UuJ0-^uZJTp}6~cQ>h)Emgj^Lvn;J%gA zVA#%T+=?gIs{v&ip%`C5i^s%R39IH*&2H7Dp!z4*_DyPyJt`NQ>(a`Ja>yT2%Y0AM_XJ+Szq&m^thX zw704(+n0E_HQ2W|-_S_hf*|6&$ol>SobFsit)|ml$=ag1eK^s|rMGWVPRv}=vlkvZ z*mma%p?C;LPXYaBP?ZrthcVJnq{SpOAz0Wo=77O_;tkWvC9~R*?@UL}_O!QdkXW-Y zuEuey9SdSpB*t2jWGuN*K5+Dwku2h&SQ4a~Olac3^oJ0JPl&35>T8!p{RM_N;e`#@ zwycJuI033WiI^#9`#qX))F^4DTql}y(tGXz+Xi$YyM>%1R0v?Mrah|$F(12IZKp_; zKj61x`~#5yv1?8HcvGhi-0@7{^2inTj`G6PA$n36TN zPpHel4v_pD&&LtL_i8%bxq;-aEJLT>)I>HG!+WsO-T65fk-&uG4$4LVlEB z=ooD*GPj8s;$OR$axK-laTYGp4_INGP^bqW?wS;3dcy1?iU~QFajcPn~ zr;X_0y9aa*4gQI{7WyRbx2ZS;0~YQtpO){Kdff|WG4G7fAWCv- zrD_2nKgopnB{2*@j_s^};MkWssF{vC8__?A`#jtlFCQo_$OdbJ}8by)IjDv~IM zT(=aOxUys!K9sKE0?eG|z{*-vV5{i5W-x9suV?CgUHyi>)fP9nceTuuiH!j7R03f} z72x)-zI&4%BE0FRX?AHe_e* z4gVX|_imodA!XJ<9eWi2Cn{hKu$nLgrQlMfBwgk)uR%|bE3ha@zZSJb{slxcZ;?tc zKXUqx*B-^mZtai0^6m}&L?;4JAe!H#$JOA@(28(mbk=49pGo>{m+Da=;$wKwdTIU^ z;2e~KC7Z7BR?T7csrjqd)*kPbWd0R~{L9wiStCNkQl}ujq5z@PuSJaTg&jqwV9Fry zeUyBvN`WUez`PofbgUOyVx{?M!$Xb;cz@ zPAvgvG~iw~IClZK-S;q`O@U<)E{fAPZMl@59gGX?J9PN$7qcna2a+L=cw;dHO2GgL zfSU9Id=9%YY_C@d#(@f|0PrVS(4{xOg+IealQmY}69v+!!Ilg34=&WucI}wTDav(~ znL9{YPWTvXNCh^NOXyk$dCmo?mxAgwxD%Ww5CLp-lAqZe(P836D(d&wq@tA=JKHC% zKkqh{4X?Kp_2Ib|ctLUpb#HMAYAl-Y**L?~2D^_zawd0Nm2GFw=pb!SO7F+i1~KhP z=WUORPCKtb|J52>?x`_@LA}gw6u{p)UBuBlYy^4EMC?{Jg&_!A&tZOe+J2bvf=ofu zed)TlAM2Sv`15<_R4y?a&>#wtF4BC4a0+F!cl)B$X$iHV8`#2}tds2c`1%PAtD#DM zqD92SkllI>`d+aY924 zD<{Hf28kep^tm>B>mFCVyY+m!9539j&b_0%07S1{+dE%Fx4~_qCfac@`>Y9?&+870 zEO=vpt&Z|VAV|ckJ@e@P7KJyfUn0T-iO1N2izVR4TZ9gd85(%#Zi929J+zZmp@@fN zKN?th6uVwxI)F%5eDXT^S!Bd(4HnX+VnF40LhDIjtCMP*6e=(`$IW23Qk}Nra2tiE zw1BcMswN+ZpGI@n4c@fxzj3j`d1W@r( z77$QtBw+jT3)tU7HVhH}y#G2=c2mJ-aB^t{%>AKKD@&}|av3#uu5TZ(UXXuC@`uhG zb{`MYmz_$@62XN!&2?ai&~()tH1lc?){NL9?r?fDzqS)&CkAScl$*HjEec*=w1m8> zsN4>qnKH;q0;-YiuGU#=&=3iP8qGRvLtvOXaGyxTM8|}$`KdCG04@F|G_jL|EfDsH zlm$$5f(#+mw+@oRHy3Z`%2*x*objM+UH$}Fo+VtSedT%hThehIB22Z! zzLADa{Ec{s2Jc(oKRrTV&E{49rZS%mq$?4(wzR4We-8q&_RfF;g9I^Rm6x!_iH|%> zK2@)aR#}3cR_H9bsVS{=thJLt7cPLkBw`u>fDGBQH`P#!3=87kZw$Mxs3sD_3%zcY zP@x&~ER~e2u8XjM-&8t8@>dsVa)r>r)Z<>R=H_UpazP;2sInP}GDc6FWX!qe;5%ui zRC16Il#L!j}PeaeR8oTeS^QA&#N z3{mK!q$tA8kS#`4Fzk$As=ka%v>XS|i(5CLEjDs$ps;1XWk0_FlcwnByw9q1^|sx) z)xjxtie`1iMNjXE0P}}y&OcpIn0V)Y4@7e;GY{Uq9a53!Hj>7|$l{KlC?4VKA2cyr zt)LvUk}>aG4=U7{p52<4y}$vm<<^<8l)>rKs|e+;{OEL#+ZbdO(6919R{^vvnls4W zIf7Yx06Nh4^TIL`Aa-pb z`hu8~HIJLXE5U)F0gwItBZH7up3KtSRDMfE@!W3;h2zj-1A1~DvE0eL=mMyK9n33V z4U3@!9p6)D&;o-?^(!LMFN55wfxNPF8+SF!ctLv}pTih>LylW(A-aqh}xcT>*6RJf?HL@tGdXRZcI*??%tP6?U9$Q9_k;Z9DtSH)RDy zAvrJF%KViAbOt7d>|%`fBKM-m+);sV{xAsHGL#zD87+SAS8pFnR&&d9%Wu_53o%o+ z7M|>`-wZz}=9K=-)O!ESlA_-f6_s>B@J&a=QYpLj8qHC-aaoKE&`roMca9g5o63^O z4MsL$rX22(uh$zP(v1zALN?-9@kxxL%nItTt2XKe>=QH2+4`E?Sp(@T>L;Gm%J;~s z-+r5d+q!9f1c_6u0##x)OS1`2uB$LP8U*eykJZ}?W=2j**!6}cKN2xSqnt0U;Dnb9 zEHk%AeN}Az`19{gIwS1S_}7dUT-e;fs~k_A6?34W6itSsaW8Vi=YXLv2}VL0Z`PWL zs1xuMC(B|YMmC^L>kOF2dx4NxUn;LmHWiGI!zNH?gLI*cdUP`7y?#p2=HQNCr?6nqsB^A~Ix#k$iVO#c}10>;?LvOtz=F^`@*u)ElgVp;I&!ijELl2DItIYetf`DDZj&&<+&NXT))z`WXVvWaRk6NYX24720F)I~tH?{m*ogD-*W8|KX} zkS+##9`d))7G#+dhGO9-8%VW60KskpR3#jhW*N#&`bq6F?L}aK)U`k|q}ED67$SpF zwyuL1yG0HZo?eDYXF2vgq#I4d1wjR~(@hyt1l7ZP3A2_@!EO}O72I05;nvdLv5Q>GgEGFE zpiVK1Gh+VnJlSo4JE$?s{RMN4&52Z1Jxe;js)++cv;(+9zz7-7#jG$Qzig^$c2`j5 za7-HMHw=-N+0Hz;ad&LaJ`X%S>$aK{5#2Onie2Js>Ih2{X)(2ki-NUJ5$0;+ z!~1W3#@Z*&4LeG*>QU=nZH}o&M(A?Td_w#)``CS1Nn#a=_^n@Ilv0Q!0VV_{-xR@A zf||kK17v)6&#U)(tQ!!;`H6o0Mk?Fc?ws=d$aO!LAEd;`A@;~0#w60za#r?=$WGg& zh^3a~_O0`l4E83PhO$fE(A7`ts<|h|WcsFd%bCuS*PZ(Sb%19ox>fp*xcH^@;{-M} z*Sq=2i@&eJpCYpXg=ucRIdRlTF_U}oNICu(`Rk1n$2*f+*MP<{P|q#ABuW5Ni9a64 z$+Y8YrqwBND>5cEYzvBZU$poT7Ou#a!dpL)QFam<pFnX z-kmcVR7h`njyR_1B1x!2Stp9Y-Cl3~+^aZHW*07AwDaERnUaV_mf}BCngH31<}By+ zh`LwDO}F&EhtEEy-#q;M>-F^Oe?I%;7%EeWSf4SZ@m!YclR2+;BV%mM^Q9BHnG16| zg#WwbA!qmH^=TIa_gtcr#qO&^U`ImR(T#L=WzN6^+&f)=fS>GX!I3jy!OYR`6U?}eR(9YtCM8U|Ol8N0X z#O$(>eO1#3Dn|~U8q54g(J+yDdggFt5AWy7)OftL+8=99b!P^H@D?&f=6#} zKV7>0pAx~-xA&gEdi3J$?DM5N|F8gWllSbIeN~g3z+!FP8W9y7 z5xg~O>$Z0ZyBA*nRlMgdE4beEU@6?MRNpI)Z0{uVE4SP>BAWAA67(E|mk}tR8sw4# zT{ZnAWoi-Wh}xfZ7?q&yKDt!;iq!P(_7Vfd!1{ow-RH!7>UR0IPFcfDwI|yf4Ay7NN^Kk#yt7vPN(q^F3>&=L^s>zP z>G5x7x9=YCq`Q0O9>20XLAT`aEB|%--;MFV>qjz64KnV2T4ZJUmRhn_j19`X8d%z) zxhqukA7`pP_Y7RXEq;2XbZ`Aa0o|aws+t-ks6F%eK-@a}quS?GVno|FX~(>}@^+Qw zai&48Ld2F|BU{}zBu`UK?!3%Bu*$1Cb1v}O!&7%Ww+fF2J6v10aSowj)A91l36rgj zGtaFPBJ22y4g+K;`3$!r#+dO-;BhSHU^n70^jO(j-BT(X%KhrKG@4c~Adb;h>&LQO zJ9an~t`AaOs^c{~)4jHx>!py0yWY~yCa?zPVlDRoY1%l;ffX??;eFkFj^D4FQ@YBPM%4;e2x^GxRk99Zn2T<)(>OQ zk%nSsli!P??bxEBM>2|%cjA(9ZDpL7HRR#}aGbW6uCz0UZv1_8oT)6UqEji0 zwX89h57VC|YT>SNUh3Xb1`qM}&YvS{^Qr@Rn(?G6KG7TQa8hC20%NO>a~0qY;R47* zC$yeThmJyfKY) z#8vPo^j{oCPnyH3A-HxC*_6Zb?cS&!6<|Y9t~&MS+>IL*%#<;gjQF=hNuBvNW8}&` zKd{>NY%v%Tq4rS4E;j|Koika$oX#!5F;Znq}i)=f(^j`VVIf#dY?tpM4t(ZK1^ zhSNZWDF+cp-GgGzgQfsaZ}$Q@#SDE-u~g7CxPUPCUDeqep7mk6&@iG(wbfKv7y5o2 zMPrr|eP3tWG=kf*$XV)#IGyVE#OTZRLZ+} zMuDv3e0J7;|4_KzMe$+71sZztPhOqOl*8UhgPa(!RRGuPS7g5T57ibz6<}QJJk7do zsvi*^x7Xj7r?8jAw|Zcsu+!B;!P^^O4noIhiX|01vC%!qcWI^h=%f} zW(kySd<~mNw-1`n-E7j=D4S2QMftr#=dI~UG8)7wI>2dejm{e;J;*-N`>aWi6@H&* z+|gNyi9(k6euwEG)_D7fMlAsw^F2a=BgnR?<%R?&!jxTONrP%Ea=#7gMG?V=9C@I4oA{0X9T}f25}$MFeM32# zB~i;0UwoBS9CHtxc9&UTNK;8_`vrWnDlRd}7pCa$9r%~7E=r`^-4KvL*!|N435U-97 zc05g|&}CMbwc&J;HiXG$79@0s;_eaB~>PC=NYE#z$Z*lln}lcv^1MsHxkcAc2m73>4zZ8myo zAq^mhV<+|;9($=q_J`Se)tQNAK1CJ4Dl8&fHUGZ+R*9YWAb0IN-fx_{If9c#{&0Z5 zYfqEwy}t@xWNMwVkPP1T)kT_GiYhnG%JkoruWfHTpg$$sx4V52;oHo`(U?+X`6F2D z36b0-mSVN>h<04H80nYO;lGn;$gt&bbrr|>JPPi`j{O%12#`l=`@pP+c30!~NCGty&kBjKDg^ms=)32bgE|v1Nts0){*`Oy@4f6H*LJ)2W zj6U50H~!G4q1|^J!~1%xfwyJaP&7!iY|q=gy2AK87P<|p)OMwLVz$!O>C5BZ3UcQO z5&&Sh!No!ZU+?9yzk&mm*+0?Oxif#Ad~FTuWQp?p<<=_uOnrIV=p(306B(aV+W$@+<;zwZy_GuOXoVTnR#YoVmftq%l0}8^#VIMsozyaSa+Hwi#LXMDhU^~ELlT~>wn@@guFd1NNliePCa+wqWz@L)TY z+Jh8H!0el{!{;~eVja5Sga2cO;=s{OxTI{c1EOSA#lMCVRdTk9PuyoCyvQ(BCP3o2 zTL_a9nT3Z<)S^j+UDN^}vHEGS2;=EuA%g-r#&(YG=A4pOQiKNsrbbQk8B3uNm>b3@ zb!FP|;?tMK+jN!;m`m`S5ofU@T4Q{RH?!=H6yeKGD7xnc<3m@Hh&t|S@R75Zn5j!M z0WBr|*G3>8;8>Of>BofZCg2wc+J{4xwlR)3u84)tUhXmQa>SSTBx+FR(j@HnLFudkkte`DpV8;J@m|0KHSCG>1Wf}atr^(g z`icHNXz09pGZ;&9!6i|*6QDKfW)NC^`_XXb6d#_Vi4CGbI4Y2#)lz@xd}$+WEv>vn zEFA7RBkasN!msov=Z2GYa+cx;Bk|nebe26x5QBB;t!!~zayQIheC!Mr=^?uy2cQ}z z+iq$3;TVwV56m%_HLfDvl_Vj8CffW*JpA2QR5lCJ43C_oZp)no-Zj*~8<0_C==oik zKc}TwfYcEJ4Tn0?-?i1X0NMh0Tos1;uHvhvB7y`T*d*K|K_rH^atu36G!ck+`tvY& z&;fMw)pf1;4X3CGGfszYf7_qQpq&&0Za)3$d`#tMSfYdCil+6|;GGka)L-3TJ_LEC zq1R>v#9gXAEkbAmEqb_1^!_#y2mW_5CPH>*9|VUXQJKTgqfp3GdN^;tHg>3CikAM- zA5@{itk7*dS;j^WW9ClGCQ0WHm#$ETG*P@&_Y0`$^X+01<58b)x3{vN-@}Ks5!JQ0CS7%B#*z@Ez4Quj@?x zV5@c>!Z$<~9C2UAb+5=31+)1@x<9zP26K9o`?0X&=0;mIRf0c! zrmTL_+(q4nzBHhA+3?LNop-91oNU&Oy#=6fdb5R_|5l~iG$FT;;Cz4U zSldRm8vJhR_5d}Qjuf;2An=*q9_H+?rsy zo{Y$oA*?mL>tkVWTk!yRW$3-;`%0UpeB}gcF>s}^l7Y}5_xpY5R3<}}Y@{dkrV)pk zM@AA_VakWY6>9OX#*9xxWSvsTSDCuQ7+wAo7F$1F0lt?OLH2;VRD# zFyL*8=<27Cr2teDIx#$Me} zm`y-dCBts+I?j*;9i6{&p%CvJ0Jjyohd)&vj!f4JF=n+)(uA=4F=G_~^f+edN$rSy z!l}*Zrkp~!NY@#QZu5arDjOV~zY@f38}CPWNhuD@9=XwC#LwJM;t?+n8Qp%XnhC>@ zCCNYA;Jf9>S;$8hm?d>4M=<=w&~gJB3TwW838;GcW#)%8(Mf8Z?2kP9plOgdaf%81 z+j6S@(8v#SKvRIQGr}YS2v%u=b#vIT87%a}70-exu||cX&>ih~xb_^)m)Don<-^j4 z`5wm@{~8C^4WS74Lswx~oZ1%#P!wTh`%2yeRld{TA%()9@L_u6mgIoOdfj01G}{3l zS&6Zb0GBNv{%L+HBoNc`W1S0dxu+N5L%7GdD!v=r;G%%D`$o0BR=On-T7j(!u8%jM z!Ea<@sAMqp^w=Y9U=?*wDH}lt4y9~BZ}%GTz2o40C3{31<;Bs`e6Y&y__1GUSJum- zV%?uq3!%=o?x53m>RSMPq42l_?nJwBy>;?*gw%l zq8ad^qEOYw08hfBzW1;LE6I=k`m0k-a;=Pw^j-zqd+VuxsUbRE$<$qszv;zwhT*$% z?zJ5|mvarLv>o(h4=QB{I-$Q9FA2ErX)gZlgbW!&z0C~Bb(Go2jdL5giU&7)hs{43 zV%Mn5s}&Eij^CP8V*)o9LAro>N-W=I1W~fiN1GpI_ybOoyfSgSEe#fPIe{%i{(NmS z5vaJE+B*M5&+-=T=YF`#9cORBz6_DR3X>88EnZ?+U3nJ)WaK}N zRMC4+OIgx(dwao~{+wT413XQ=zTj~fux7(63CRARX7?MM_xC3#I*5l<@Dct2b+By)1lRs{#rcU9t?H&k1dl&m<4J~sq z2}&z}xQp)->|s`n&4}md{u-ABMS#$CX3B}l5dYEYVZ(o#k;i_p&fQ4W3Lm7b7L(Ew z`~nU6z|_bMuY;b)jE8}EOMH|GK0n2S?v@cikkjC^LWe?HB%D1+MI z?ZLW4xbS7hw}RUCbXPFR9gfp&!0gu$9G|YE)p^db3d*L{e;S&7`})@paP_B!4K;y5c~#`4p_}UV1!q-R zEFOx|ws8N@(=PC~l0&)e1Eh+jM9kUv^lpKRcOJA!)ljqf2`S1j*fW&kLLc2*g@lRndu{xSvbrDR{3`EqPm%m~st?A#t%y ziPv^}VKO7Cs(ejcn%M=rb45gN6|d$C75MI@d*_3q_-J7?^=JJ_ym>j3ccyoD{a6{< z;Ur(JAsidwL&koClmjy<-Uho8XR>g{RkC4~{12aFF%3CXux7OdjvdAktix2*PY^B&I2Gt42s!d;Xk`;y`I=_6cA?U*VPbu^`1 z0#gc5HLKS8OO@-L{%%*| z$PvqXp)vZCea^gb?_Z^9n?^l}v&EDQ+7Q<9%R9um1WyWtoBTx{&8#7lMzeh#FDFYB z&w{h|Sz!8zN^tEURVUJE35K&Ap|T7xkEuf<{pQFj&GL9djqSLjR=m`+=PHq#BFG>a zW9yVMx@oicQw=lpabo%&54+d*LOYF@e&3jz7P8###R%@CBxUxVerYkl8BvXGd>^RY zuD_&Y3rk+{Q0=*Tf0U?swjP?4WRzq-6>rf$_&%@+EDjHx(A}x>&GW#{$o>`PX@g&* zpI%1-YG?OlC&UEnDaj<-Fg051-cR%jmm&QX-jvQ9et#-F{ESddK$zRMwYg?lG1S>4 ztX|7eN)L^@;{ zi*#YNl;3rb1DSUQ{-H`lT9GJd+rBP8A=To z!C*&hjyujhZf&Mx4D9DH_FW0*7L*a5If*5J83K-%aPYPDW ziCdA-?s!`&VD3j7{Tz|zICjn9V*wQ0Ks}_CzxJClMJmA}Mb(U7k{FxY`|$Sk8&6+hKV& zC*O|iJF%Lyls(=M6n2&=*PY#wO7gV%6;AfNikh}+du%HSK(pnNV19$`KIvtB@*oD+ zbdvO#92@yWg*s#Qf7pA^peEb)-8Y?tn$SA|LT{lL5fcbVm)-;nRaBISpolGm&{65q z)X9@1V%Ht_pki$!0n6MopWaG=&cEyJoe%fccJO(fpAJn z?6u0Sz+|RywG&K~+EF0Q=w+NKJal1<(=WWbsa57wy$Uw&whpWPnL$^H0h4HO(>^8A z{6|6(EpLK1sihyl?=CwUqg?T8v8K;qS41-z@#)|C5Bb;T%L|n2K|D__!{Jqe*Wg2O zeQFWcqO2+JEY&yITCJ4NwaK!aqGcR9{h^=A7mHu{e7w&~8M~ua{ZQ#>z6Yj!VN^-l z=WVza=|(Z5k8rpg**y5uJx`}-9~8zxNbbm+=lyP(?xdFHRzAA^b2GiT+|FF7SNN{qhF4na&(o5|>QI~Lj|KLXl5l!t zenO4CgUa0QGE5e~q7S}{a6Q@O)pd1pNiF+BN= z;+(!>u(-3FeQ_$v2kw6Hx2_E6Di4TIP`fOz(NsY*{EmF_0DgpF>7C(fmrFT+9Na`9y;4%3lJLTm@cso zTrUEI#shDlafABQliKQ?(EJaZ5t{noB!Fk6HBvI$&SXElnD^*P{dK84YT;Ab&DNBgJ+yy88iNUCJ?Q|X zQ8k;i2WgC7tL(_xBQ!b+|G_ivj_2&L88bJS3poIr(KJ{5V5zWawCv$X_2c2YkDgaN zoGp0_uo=(qw9VapHrn)Ty8hW5vvsMQ_2T~Dct#_DXY|dq^~^u&f7#lxe6R2I!~U&? ze+Z4yx2?kqoul)8W3K>6WAOPR5aBR6vb>kyF!>Lp0pvHV??DC^K!J1_o&oCbhrocYheGiK-JUo5&u8!$AW_bAe@pGiVkL%CblzC@gb?%Ne*&WQ95w0d~F2Az%Dyc zwoBf+P*Us|ETun#uZpgH#;L6SGLNOStoe#{cD7=Kl^$xsCO20z<*7}X<$!e|DScKi zQlP3U!$>BOn{&${U&T6OBd3i8u_K}~wHERwy1SJl2H z^GRq0u5XW%IK>Qeep`y1=t>sU9@6KLichE$z*%K92uZFS#4MVG<|CJ6ySSu+1F{ez zj(Yl&UZE9+{SwXN@FVAUWZk<$O}d=Sxir@e!7$03ZF7N;xT7iVUU4~Y0zNqVwQL7fbX6uY~-hH@l^I@6XU;I7v9JCQPQ=7ctw-oz@oQRDTOC*feR&^)Fz1r9^ zrA@)MvUI^6b__?hCT5du$#E)jHymOo_#K^O;lhlL9&%oaa6p$}C~~JqyxBOoy3}M0 zZE-hXXwy1PM_8NAk9u!%Fs-dEY3As$uzh`^u9AauY@a4iK_Mr@$a1lnH%w#K_1#6A70rf(1LxjOj+2eA_DD=^tyFtkLmZP$}G(s zG>vfpX}{*=X`ed7JfR+m!x&Fpq6<1cF!IM3Y;8l%&V}@z-jIGW1~^v)SuB|R=Qb$s zQ>}q@UJW{1flJT2el>e#Hqe_I=0iFVnIvg4yDsvP+1Np-1A5RDFbj`ZA9d>SaU=S!aq6r(vQj^eYr}XA#@3 zePS38v!PuFW}^Mb;6ep@YMmWKqBbwVHLOxSZ1wWU-~0hmiN} zJ>^hs9cSL#CPLYcu*^@h(RJ_5n!=ZZNS*Mt#|N%*8}( zk?=(}gqOfdEY_wS5m%TJz{85>#t{Kd&OoyaN1?TP`~+l@sbTshp6yvu?7 zY_G<$b@GkejBQ)XjFTF_mOvbij~X*_19{5iCb`bCbu8%ZsNEOWY<)bl6vm@2eBKU- z%mD2oB6tIN#>a`h)=sJ!LK}kTxsUORa!BYB+OItGMmcj%74C3P*1i*!w6^B-jQ2Zw zKoQ?=^{h5k6&Y~#FO^N~EOSr_YwLK%3o6RgnZ%`nD_5%B(?xp}b*Qp-90?$pEdkoz zAjflyaz2gpur=Se?p z_({aqkYg>QjC{*vd{}^sJkhz4t=;P^1ST@u)Bg$`gYc?@Akuw+>qa6~c;h3S$S%M> zr_!<8SjPGf#S6h!!aJ8=^Nb1&P4V{Ldpk=;sI!3(Y%)!L{kX8QkSbs4n8thaH9VZ{hOcn^B+clL(-vqx;zJ|6EFLqucoHlbp+0OLcRQan3Wy}`k z&B?8P<@^r4GT|yhzsozc!0B8!(awv`L8xcga*)DyG&(>DSN|xL>#@N6wRwmnYIoJ? zgpNzIVX9U_#OSTzIDy>lhQr)%4y8pAC5~c`pA-LL#IJH>pV1{L$=yscBHg4zh&Kx% z$7UZGdYO=QXf}=)sLiw5j+UK(H zFqiqoK|7vOZYM^&(^bkxH*ybLgbadF)mBemJu0^tz!CZYSt*APC?GqT=SMmv)JDbK z;Lm4q;dYr{V=S9D`&PN5{y-Fhm&(n7IFDQYxr*PZu-%Vf@x;SQDmHX34US%kF=|hI zAp>qFsw}%3t*6i>BB}}5zA|WMD2oLVV=KY6SlXu68;F2`mx}6 z;3{~kB$wpOA)H50)C5bTJe5h2f2_`t``Wqofxa8vWSlhb)5DRHzZ#Rigaq-ma<*B; zOP_O^Z~*0Ir4D?4VLT3(Vp1*qNfy%=ks{MKf(YSp{#>S?AIj$^@Ener=95fJ(N->j z@?t@t2haXMuvnO$ktwc~0p+i5g_%@~%C!n(WG#0kw*u$x3|*pYn(BOfre?k&AAnFG zFhC0;K#3w)$%%4f?80gTQc!1#k?m}Lgkk^!G|M_{M-&4r>4 zkAdNgOOP1a!Z|R3ii$*EdiKq(?5MlfE(ng%7VyRUy#cwM!oa;s6f_#OfuXJKifyd+tfFYbQX7BCY8!UF4Z zOc`~63v?tid-)-`!)1Yp!M|UJ`vn!X^K0(VNu0!7L_gjzEt#Eg_BTYR>R1d?ZQs~|V;Oaaa{ z^qlG3{1@cQMe>Q3qf=z2+jxbMzUhx zU?d%ZmWL>Ru+X)52D}MK8A_pNi-Px$WgTRbH0XTZ52Ua(zG6k09wlCG9apdm(x66L z?kHra3hvvBJe>hkn7w*jg~~~RWKrSfRH=j8QD>%L9~5vY0fKZ)@*5W7kDjNW4U#*M zB>ZL;Ahsx~Y)9rG-f1fW1hKU zngj?x(_5DTKMg{8Fd$jSvR;aUB-p2~kNG>o;KI;|WF41}r_~%NVYKS>KDQHes#sVj zh_j_I%?2)pPf;kyI$;BpPQXKIkXv8EHw^uH`C-}dM^}XdRx%K+r};ZVk)afdNHf)s zax;|-6U7$2%+G-VMFV4n*O-XX-2C6u;$kb>28=ioJDpYyH#!ZkPd+T(D64>l2C#3X zuwW|aq84S)%Y2X{_4ZXZyhH$M%7Tj*TIw>uQfSD$EKbaufoy~cbgLEYIzyyc-o7Aj z{#06h3T^xc$ca&s&Vn1E4b9l_Mwc7PYXOCxV^kmlCs>cXS2r+Q!w0@S(}c?<+c<3aAKHy1>1Dj9)w#v+ojaPtgV z)zuUdT2Txlw}n5;nT;PPM;;-=3>e;k1H*w_oH_>Il^X+{O3ry%eP^Kxd;pt8MHt2z za|8q5mMa7~?fv|5?7ir7+>KZ6bninmLHt;V83A5fh}6Y{kK5FM$RJ}v^i?L}02Nv# z2sc7<^nMJ_vmhAv^B$_yci+xPW+KKm?F5`E&9D_$sW5$f&AFe694xRit1K17ktS{^ zqbg_UszuZVoA=h)*z%-CM%?V-41j?El9*I*0@z8?f$Wtu1 z#2Jm!b@b;TSs{kJDO*S1jz=bh-&oDby%9n6FhMn2&3ar&ry?}j_ran!>%BoJGSm%( z3TDGj>v}-X=u#7*Moi0|Gm2lPcX=7^njx7;YN&=bGbC2j>0K<+oeJe;-}4j)%j4k= zCy>2MX3P45JSP;5D2is=&@V2z?#J+0kk(>_5P44~KMk>989Uq4>~2Z6QG zb(vUr+$zLsTVUO1UvsCFjk!Sk`A4sr2;MlDJ-zy>y zHivBF@*S&(&Jv*m2-KhEsH1Dzu`!*wV{k`2RD>n#7N!vtQlFxKU36Xi1iQ^(pHbfm zOxq9{3_Kr!Fu5$mZZK2>AI2ky8Y_kK)T_cyqbRH=(jYMUsHsUtv!Hijfh#vd~RwBFicQI27f#B zEZbz~IA<`ZUy%vMf0xK}Q7W@nDY5r66O=b-7x~V@CPgZ;_aU3*A`g~@*Q;|vAz|m6 zjiu)YcWK55xh0Q;Vn@MmMK{fHQp9~GROmN5@HzAc~kcG3n|&MhsLbOz26B3CSMBQlzy9O2F8(l zzaFUTIbgt2;9#06GN5iQ%9eQJ=Mcjm!wn0va91{5PG_*DTKN#6FljgA*2|j~Gl#`S zBi-6=6z1WMElG|%4T7Evg(~8~+zeAmwsyb-L=?CMgG}v23||miW#b7nC%D6Q*;)Cx zk1mVGB|%Yv{@PfGK0W^cRpx$!^c{37p! zdCOC+auoFw0UgvxjLf(8Hzh%)JpzipSs)JfVOW!q^awosRm{6A=&zH@js`~8MfiQN zRh;I*2e(aE&q`}R&_X5RIsvUVL{-p3St%W8N0fsKm-a#SBQwyO1Sf=7o`_)L{F6wx z<-mNqm3Ud~z0uP$t@!DGb(IE%v5hkKC+yBhPg|TE6odZjFUGpMeF9Au=1htfmYlK0VS~ zT1pw`U$fmeCV+F&KvFV9n`t6V*X(}=zq?%vqshX`2P*l3@m7K+p@FaCa!9U>_3Q0W zNdc%aI#tP4{1_YVi-$X9h!mTiosVug7YWS$_iMnQfl8{5@%#&1p+WUupgQMLb1l~ zTjiUX%Lra)L+Y)-4DDYSu(@2$R^VUAOL4)F}Csk@!iVc4LyoJ^%*5T zPhT+}m?PyB&f^ktt-{3A_D$OzK5-!}-(VFM`*~yIk@3$#8@lbvCl$-p#J9h>r8F)b z>**dunTF4&1eYIIZ?;Dm`klIb%?y>)uMq7wFn2yGm{eUqtCv4i)H~ zm~Tzdts1#$dg149lwS2%2`No{f2v;1M1_5k$t6zx+Nm11J3dcS_3u2t=ldk~52wN1 z+4|tY!u@Fm_vV|!Up&6VWmvcHDC+I}J)!>xP2qIi!N~izf4e?O(M|Sye$V?Jm+t$X zYjD2M=yCC>b6oQgKuU;j2ugSol=3Vz?Lh<}C0uW#O52yyIwUgJXy0WYKGi!&l z?{?p;8!4b0ARsfaRf2#(yd#b@S^XbYz zdO=gyo}Ke?@4};jS5G^Z>i%(b_H8i-m!1x7JRVzr*8jYH_*KVVI(H`6TmMRTUj91uA5;oJ|KUG?rU0Y_|7Tb} z|KBx*uiw7^`1$MipWVMeP|knXYkh1;R9i&L<+D)FppcqdH35^-J&=nJG?*7Z^TxJM z&XU3Mb)kn^tNOQ9rz`ZN3gr{ha5Z9$%40bHo~^Cm`ZN(OzaE^sZM9M^gK(oyJ@Sic zj?y8rS$*l5nu;{DD$@eF9ORhNuG?M07w_Oc^h5KjsVm~THvCN2#B2KdRP05Slj|YP zCk*>Cp|k>Pr(U zEC?C!U8d_gN#o7jZfCxRqcG2-VK%j4_M&RX|1=AG`ehtV7WJezce(df9F?%PoMJ*y zQaO0&30+cE{AK-$soNsA&i4p=mWqAvK7{YbWqG)fN^WBP39^7wbgIw7ZwS5=k0w&A z;qw0W7_8H4G38{T0O#F$Y^;;-lB}%f54IPYlsp5^x(e4WyKLuMZ=Lb1J=ii1K{H~+ zK1c{a+F2l%;`uCa0SSfiF+@vr%+8qnbtRSM?xRHSfKnkV(Q(F&B;VX1w683!Jow&p z^2_WbYM(H_jlFZJx3%zb<-jQE*-*Y~LQ9s_AyF$Bp+oE2kjqlZW9B@*=Q9&56Vls{ z^OF|baRGtV(UO75;#qLP{h!$ud=~0Uf__F{(FJ_QT~+N+;V5houeqrQ{g7YAoFC>X zF9u!^8t0W=Qh7=>S=4SwRONcK4FD2+Uu8t_D27qNmo=Iw9Vq>Eq!K2mULVGPc7G;3 zAShhct;BJcyi|vEhJm3dNdeQM6LoKxOMSSv_;{8Qa_a+97xzoCc+je9>mfZF1Gi5w zNa+)@DjsWx&(%`m`xM@8R|cg|Pv@g20`P#uFvaR@82IYcc}Z~ytrTFr+DsCBf7Xr8 zyF+BO-<8*Td(zj_G-UimU=AXX&n$>ae6IB@oQ9Oipmbgitv7MSROiKEgY{V%G>-XG zvnTH*Xz^PK>Wxr3xb@KOCxUeI3Fe$GldY5Pg%aTI>}(4wivc}r5fjICNAvEy#?#T= z9#ap{FS&-U)wp;So=`}3%h*6eqvfkvTPH>AbgX*rPGh^S*Z61B(LXuWzXbiZ!Sy)p zUZ3;uY29CU3JjAPbL#56Ib;^e=fbU%C?tN)-Xer%3tJAd5RIMABjyu1u+%u=ZK_KV zx&LWc?lYbA5~L9$BSBObwn*&a5}Z18eY;7P6F}N$G4SBembFU5rx5aFF}O_>@d;}U z2K1RfjKbnG?;R2hqI5is0>Mq3+mWUesi0VQ`kDQ(`2E&#NK*n-8bw4723#FqHssXi zChF*~6Zv6)=WIRM4KKzSQ$2&$`p)u^XMk^|0yWX;CoL?({FRWFdMv*HV>2`--OBC8 zdyTGieRLdh0-0Ujawzt&UV=z$SK$|hb%)7pTdxjz;jbzy=d((PT;yF=yfkMi@~f)( zmUUcC8Gk1%y0QD+!~zU_f-OHDCqI(h zCgl2V@f==`L~FC?#&Y?GFlZsWQ$lJ&0b?b+Zewx63mRBT${-;IsJL<)7h)}R zPR0phK{xDH;c}aGGLg}yOL!5$Fc8%jSV(eEK%B1oyFP{CX}q&JC3k$&GE(zBFBBuI z&BX>abEh?KZ*tvAtA_BZI#D0_oUP*qwcnSPMO?i}fD@}}vZo9g^}$gxp4%!;7auyi zETt4KK*B4`*wn%Kvvq<_G#u6|UJ>&3>{38l8mvQgxIW>4hnw)#&@w3Cvq!s8z(C#Y z;Z1)7kdVFHXnsGrhHz@gT4H{mHe*G(|#S_|7q~ zp5uXhJ30+yv~^L&;KE4;n^0CW5#EoW~FJ0`H*a zY>3u&yW4pJ7`d+iWRA6vH@OqfYY$2^M~`697TJT0d>M>H*@#YYys$5*{~)>RLd1)} zM-S#6sEwJ+myfmcc7ZbKeM2FfVi^L?JE$OOy6DLIj5tmQ6Ub(PZ*eaz7|y0wI)%$5y4yWuDiMCmfd;i?$7B`aBf8&xaNK(T%PVtmZOlfxFv1QoY``29j zubZlP0^qX2$=+!h5QOm6O^)3IEJS(>1ms#Hqg=ijS~IRgXhXvtJ1gSiSv0g8J|1_a z0NtT@_M*m}%|R>BTw1co)i6|nv_7hZu#ru;EQe!~52G8)GLXS!xUsD)loM+RB5wtA zg5of5xA=dwG?z031y}(;xRbfGpYYiepek5e6W?brLhx6+?ASfIE~bK1G5w-M*8qR% z2A^i|ag7skb!amN7)1p&B<2%gJ%0iX4~QbZx|2j>#_Vo-mD~+E1%_8KKT=_XRgh&! zcabWDvz!&SC=BB>$Af4hMIatDMD!;V&d&?BazvIQ?LkUUGP<$HYrY9G$P+q(UM44Q z+h4;tCrGI8GS<$#`x(!b5ho@h$2B|H&X<8;>NO98+Q3Tc3D-5vZT043A~Mz zi6^Orz=9qL=j@|mW?m2h<)uxVP;y3pIF1i-2CWI~&#B|T(-UpWB$d;4bQx5(%C%G}ZsVF;G;Rjv+H zBXBeuDN#F)u4H9^;8q&Rg&pWuUAeg5gd=9ui)=*#f*qab4&q@PNk=;!k3P#Q2!Et2 zVM-=(EeRahhVmQ2eOd5Ed4p$Ru7Pat2EdLaxL7y= zU>jHx@0@cK?XeBr6-oSArEbPJO=DjP^*oojtz^N7)tB2J*MoG)P=DJaO3{JRav%+c zG~R#Lp}y_Hh0rvCI9x=BmJAl6_&lOB$m(YU^u`)0soitU02Z7!>WBfE;v)x?t9P!G&`ZQw-RE2Gv+uOMamFE;49E)(C67*sUV@CzXG+8;L7CG+WjZ?gfg$>ED3KLlBm~z? zfsuej=F|IcW@ni=>F-CAB(Y#&CRmYj;HRkI(`C|E7d=%x1Wh%=hMWMqEBA!N2sp#7 zZ^$-$vy4hk(#zFX%9b_5>nn8n>NWW4MMC7+U>s%l=wI$a&KY7>EVYQE!cT%lB1(%rXel!G*+$)HEYXsK>fk<+PEMGp_D9x~=36n0i(3Sz3`ju%m_sGP2b!-Kj~UBR zzHt2Qy)lp zFli8g74P~)(wzwE=YUssiZvOE6KP%vxPwP1`yh3ypIKNIpgW8bK7>vi>VpO=D-g$U ziLwGdG$q+wwaOBq8_vphWcq5q+Ielb+-?EV%sn^#3(2R!u~8Ow+B(Y?0)JPMe?&go ziWU(B7jR|5U7L%4C0X8UlvO1_q}gDYtANHw{*-#@3!x_E#wAV+W38hRqT@1$@vzKL z$a2)t5F4q+4rLpvG%29s?YIL`)diy@d<7$7tQ^L`r7Q*3HE}pR=k%s|G4VC+uMS&_0o9(Vm_z&Zx7td#R{1b;pRH$Y^?=odz3#>J%FgWCo*Q>Y za_WW)n8UaB2*HW`hRK@`W^V&6P!A?cTc#`j^?pBn_n*Y3XF%ZCi@Nri#;%2?uIDZP zyx;e*oBNg?4!&y!vYIA$o(;ch-@^c3{@2&~lP>tPg9^@{D#>LC`8HM1xkxdBfF0{kG&KWzHU0k^77NX%ka7A zZS*&wD3FJArw?BzuG;!z|F?5XwPeMGevikV^1-D7C_l)OkLDS*9ry~?7Mz3$| zs9S#2xy5_wp{U|?Wa?*eo*1#YX&!&D>|LBCsOE@6j)`&^+K%3p$9JZJDu+oq{{_lt z*OJ=LZ_Qt<5QJZ6dOnugecJQdSGkE2kG2Xklu! zc=j8)gz=m+7H$YQdKx$75ww$`&TYJvlq_%{Y#VsHLgNV#O!e3oIm_P+D0fwC!iy^e zFF)tpD?e9+I8!$Xcsb2r0tl4j$qUH(E7i%gtw>5ozD(>_*Jq;d5?#HYT(S(VvO2f~ zqm|JVWrGdtz%*!}I?rc>W#sG=&w7v6w1;%tgqOe~U5cGls^8>BB)h({Hl(uf^= z8gh7hWrNN@?`r2Wlz5Vhw^^SWIanYxr+mYz-=)A00wu}tD~}ybF#(;A%+Y6w&^!qc z2xhbo(#l4quD_VjTf6<7@tsPPnVKtr1*_~T zflwLm(MKe5gH}K3v5&2UU-}hS9LBDA@PmaWImJO>=uQqQ0rPbn{3N(bQ95TQTWl%7 zv7tO(e!5?cl@1Z4lEG#!r?SCL)K~mV>i1WU8r_T)m(&k5VdN_s^>B0XQ7JHsF$Rnu zTlR(<6vu~aJdjw(XW$;Mb6pRNyl~#0i-J{>VWnlEd^$Ky@NpbQ1R&p&z%x*Q{Ekym zuP(83B0wG%satv6f5i6;_6TMIU*q_oP7-(^aGzGvL%dQbV))P^Uc@UEVM5>@x)>&S zAyda%m%@(;)60q$O5%_hyk-?2jk>tpYxFqMUhD8Tj1nseVcbWgP{nuS+36|OIY^qP z7xjkOGy@jn&10JbqIZ{*YYiD_e-LMi92=xBKP%2BEi5M7XQwEYKuqveq+74{2X|kf z+p;Q~1xX>=n$=t$hbHJPOpuN`yUNcts`ST2E0j#2xt(hK=x<~{Owy@c`AV7BM-hiu4sPD^nA13&1GKG_VqUVb>ddj}bUI+)D(?SEFly{(%Z zoSGWh(<#X+et?_R7_9pFRfr8*^Ny||@<8AMgJFFX9cP;(q%Dym@}&9er&?ae1I2z` zbuw618BF){y?=lG>x0UAwCnD~epkp`^j{nJ`HS(v!j{6h5mWuypOozpf029*`mU!w zEX!%+Ha0xmChlUZlKcKQN;P5G_9(e{^&^^7dG<$pdQH$#o|Js$W1(H4?mGcn8$Ho+ zj!mT^!|PW2evW5cYbsZA*swkPb0UAFsnT$G!|}q;Nd|9o^+AVCm!h9j)sD@zp2M3S zPkv4_uQlI2>hRX*#n0z0Bh7W^hTr=C`Z>emeZWj|*a}2R{F?1^JZlL7|KF#wgz$#_ zr_Aa+?dDAwxY*ZY8BA>8ElSap=`J)irt zch3&Ki+#ps#@K5XjjlJv4xf6mxZQHm@&1bs-&-$_e)#nlHST}PH1u9mQ|sq9zaM}7 z@Yz<=VJ-?#k*><&nWYI9BI=ytZgSg;W+EE)Ioo78QnIi*0a9EIlO+gXP3h~^4RS1D zTxQGfnZPb2THd@Ii|K&wqSAlv)+c)hD_RLiYr3^i+AVDPRGmeItfQ>0uF7YbyZe;T z61aq0efqX_7tLzj{pc+z0_u)MhxP~eQNYkdE=6%fPS|#>!y`Llev5Gj%;J_4V5dG7 zh_gwjx#p7#+mHEoib_>(x6IMtRXFia_muFKwmH!^g$?*AO3B(+Ogh!j^AkHCi5ZwsP-KQiXHM{_%p>Yo-8MX z)e9rE$7iOKL(&X(BS@};bK1&yV9*7_yHS~#^J&8#nEi?+!H@`Z$~G1B$I_@BMdHr) zL0*$Zj`?Qpeo-VsFjhdCpU_v>3pk%Q>5wJ2^J+WtHwhG&48k(N7)=J%B}6gv>vhz0 z2$O-9nLrXC5^l<3wjpo@seOckJU7>?sMGCGC=6W!67cvw6}bO+pOoXY`y)OCmn4=7 zg5xvHG5cP<0h@m#yLB9n%B2?M3L3Eq7c5JJC2szS$`SDsOCK9UYpVOWSt-ryWfM8C zGMyuh;MQmhYuVUIe}U6C){$bco}#lPYs7+|A`lmm+GBI}Xmr9{4#YvMhI1CKQjOin z{)B9zSw+nS-z~LU#)Y{WXduIxniUik*T?6v<{kqyW{#^?hu5?v@twtSPd{zTx>FV1 zK93od+QzHqD7lMxk(yNxhNKg-vO>;^zTpiCkQdF3aEAoBpRjc(gik$uQ4l;Q)hz4mz0-BWja3+noTIFXj_`Iep+d+%R;b5HyCK5hN8&juEs z4lX|J*}4myDue8&L+ocma~;F;ox}6pqc6KhU-bYEt?|V^;MHtuad2{JU~;8zYNdbr z4e%KRN_JS40<1R9@ccJeHU2#OOC zQ>K%2;yU9&P;wZyeg}y}s3qdoojzHIr$YF}vDN6ZwM+qF^Bnv@Q_Wp&T zw=kDFlLgfLhg#}i_h!i3-Likw@MbVy_rxn-#eahpP=Vhc;Ie@1reCiae8*Q-+%%uo z_^S06U*fWL-fBwa=D>sZT)jK?GheT+{T%tW%g4=`)K&U1*s@L1k?weBX6wN(p6i2apCA9ZHv0D4@3z1AM3s%Kz5b8njensX$Ihn| z)I92++xUSJS2eNqIUbu@So?TjeiMjlRonMB*->=o$>58(zqlmTP3?WdFQymYZ5>+J z+9NymJNTWvboJ)Fr^7Gb{o#?;G;{O^$c|feZ6mMV@AArM9XNC(;>z{g_n(a}e)x+I z&tS#DxWrA9@g*Gz+!7`i0kWejMNrMBHCel?hxe-FzS!SL9RTgXofrByOP3_zdJnHR zJK11%s`0?7`{pN^#0aKERK0!7W4o9~_7|GnFSa=W-(`HuksEE7fI#h(Zt{(xGr1ix zMeVfW9_sC(xQgEEHIvtBhBNPt-T;i3b;E^qlX=Y98_cod2Q#-D=L#QAmbc88JesV2 z{Ji?<%$?ThyH8)#Je|AqY_XQLc$YO(-?6~#dfCu9*9?pa-7g+?FFfdb@uY9@QUBuO zz89@s?1tW@heOM4LyPS|DE7!=$H*(-@6M5zUBJ=>c(_NF+DF(OW3M~Mm%Ark_f9PJ zO)m9MzV4q~9++AhoLU~7dei@Wd1QKJX!_02^EX2?Z-#-#eP(rJ_VwuO$|x{y%&v^> zJ^d@=b8p7yR>$X8$LCfifazm?bz**P@&)i&omzM^y|6mHur~d24fx^t!usUG`V=sp zyj*|&YUBB<^_f>2Gq2WWfn#HFeRgqUZgF#Vaebb>_JY0sg1zx#3HWTzFRd>uZ7eLU zzg*e?mOu-D{}WgREw8_Nz47Y5W3>4n+V=ea|M~B40O%9v_)qN<|Nr{98+z2ZHp;L_ zlXiIAv@u!jddGkGar4_5X3*d*hbIr-y=Xb}_SNu{haVPM@mw;Ftu62OM-64DOjce$ zofOORB?jVB1hh}x(#p}TL|zxwBJYkF>2zQFN)IR;@@fZLB=YGbX7rzVMaHTT9K&N6 z3?fXxFu2|75_}q*z=yTR6F@L^b{wZeIT1^YHZ8H>;00j;#WO6!oG!rIbx`m?GMNZL zNP>t+1E&%o+2(W!iA&xMXzmngp~j1xVJVM^`@x){oVXm8IiG#&$E54=AV`v+9Wt|% zm*f_gh_&Yx>=ipqF6kDbe9sIa#w^rxV1p`aRtv))Y^)YhdQ{emqn;mIyBV`uvv%v^ z*NwH?RD|j}gD!l0y(C$&cD*#+U~|1J!%B6dJjdhsMn!&T?M7ws+0BhAMxyFwb$QmXNa58&T-`;I{uIf(sH$wiQY4QA}^oJR_nqs4b8 z09Sg!URS{Et$+Ff0J}MG2m<)nKd(rG?6$GRUf^6CU+w|UCSY~EclxYP?S=Yp{5MP> zz^^y(?vww&{tz;VfB)gV);50Y$OkQrA1c38|ET`hS(qM#$RA0&q-39uEy*CI@GCho z)@S6{1Xa9$t5c?201AV(j6r{t#aSmSDRZ`dCzWvu@*T|hJysH$#4UE}?Dlp^`7Sa^ z$tA43*Tu%_8lNS#`WQGK&LvQ4dvjZFjRP%*eV^_5Ir)i@lubr(s_Z7Mk#po$G?U#< z=M+9p!(}#f57e1+TIKZTbi_9zAtFY2G9eBUhbfNU2UhA!KKrq!ujP6dvQYT9CfXE4 z1)fSS4u25%R1%-O?dK;KFg=`tf%~I?RfaBYgmGp~7*E!7=TeXrkXqM-4-HBkkIm?{(A-bUCEPH$VjJ*F?OnHis@3hbX z*+9}aI24Iqq~4PCkfz8LGdn2j!LXumQR{8#I6;2KEUb#yRcOqyn=%bX9L1nP34%LT zh4ASbwz&zsV(bV)C|nVnf&-i-zJL6B*+$(3cp8V0bu#Fx9uQ)4SPEC&!L=3~1wrXg zpJk%5ZYgK-XtN#{Q4Hk1!^j*Id$t}EFtgX>IquY$Q4%I2JE`1x_9gcH6!Cu<@GmuQ>U zh`A!saxkp=qn{X&L$(~)XPhkDCSKqYWUAg-@Qe`5VtHON?s;B5>;A4xKI`PexmGF-g$>)jQ8y!A$bx!X zb)9;Gzm##j?#=UGbGdw=qK>v%7F!Yd*TgShRxm&J-A2DU_G^T;9H^cJHNq1qvnj9V zQP(w<@G+3|!g5+VO@Ve>5KCtD^T}^hE7A%#E3XKKTQ#2Hz!P%qjk8_fB4tb%te*aP zFCs#&`q)UHLQF<`t9{a@TJ&MLyTexGP+vj;uG0QChivuRW&?by9t2sSja~2Ozyhw? z>j|xEBT`|j_+A4aR$QrlW!ZSP-XlYU-h);IzrxrPV2&+Hi>H!8n_GyhRa*5d&Q03`Am92qQ^ws4+MNg>RMxnXDUO88(Pp zazbqIA=S!EJCDr<)0a;XzTE?CM1DhiC7GotBWg2+eNE%vtU9l{ZGFW$tDQTqONpPJ z?ib#7E#0kL26Mjepfxtn@O-e^qwFF6<&sRH&j8&~kbHoyBd8J>tRs$+zYOXSl8YTj zhMJa%&-C>eJpOof%ut#1x4vGppC7MNxy!K}Hht#eI~mFL<#HnZ zeO4wrnHlNjI3=5YTc4e*{GoD1!~TB9*qv+!cZKpnn*o=?ot$d>3RTaPbnL$wpZ5xD z{!uIUu7?MEK`1eg_AZIN6qJWvdnqVwo^gO?*$ULt?A;c0)<3N@|H?ec>WcvSX!82@ zt_`4)rm*KyA<#$D8~1m@$=~pK?IhIy4b{)7yfcBZX(Z6qzzm-eo^bO!50g7f? z{;y#sK+()|K(qXN@Ah9Wm7%4!;a9+}4PcM|-nG5%`I|Z(omt-7vMsDnzgh)gft&pFvD zovFw9W8EU@nxtXiKrzbo;B{#;+fsY?a^#@2arkVta}a`CRQsChe(`w3c)lqmvb9AZ zXFz6u)B;mGzK2Uxts~FN83IqmgxXajCBCkwi|;xebh%f%QTzO%jc2h_9Iz7PqZ)^c zE|fsYEbKt3SNpP>uO!xCqPywi!69+IYqiQ4NLLb%m|k!nA+CcyS*esGeJ`LhsVm5v z6~i^xyU>4K`R9~vywxn`iecCo*@p&2^odD&Q5ZiWSNL&vPw~ig`IPG)=hLSB8t;)d zdQ5xwix`DK_3?>{Vi`|?nd8+H5muWq6gi>m8*^0-J|U5T8kdq64@nU7y3BL19olzq zM*1S!N;!c3PGgM7NM%YE83xII=g5BNZVjzCH=cI6O5F*yAAQh{!m6{n2;;YIk916 za6Ev-m1l<;sDQ4DI;KFlv=_DmuD=8?b$Z~7w`an*)ybiSR1vOrke_iaL1` zV_X=|jTbBc7u-cil!4$RJh)1&1w=+it=ew#s8i3cq#orwagWYHU@RsYe`Tp#T^~RL z%v>-ToHp%$M-x=1Ls3V1K$6ugNZXW7F7^My-FpT#9kAQJ|MU=ALhpo*NC`!{n$VjF zh)R`E#U6?@QIpV%8jucZKtw>q(2IzngCHHGsX>ZJQNV@`Pk7(`?!E85=X^MG@9eqz zAX1~QXLp7pF}{T7+o#{LI3-!uaqr^)rgspcKr1Slx&jy{tH<`8!oR(kYz7yjD^ zfC(h8bLoE>UN@PqcQ8Q+>9C%3DMM%*#C;X$u?9|2$4}hq6~hELM%f|g1;B6A1`}_s zi)rWN0CjR}8B1(|vbIy%kbEmTs72xmmlm%k1Gf!jH(`H#U}U7`4Vt+)T+OX7u%$`R zw!9JoMMSIVGU56TAf(DLv4iIvr;ZAbwdwgbkoS<}=2h`T+$_&wtlvW}Et-4vs}SK< z^_1#LTnG0F@kI!))?z<JzAKg4bm0Kw%dXm@7dpd}NO-hMoJ?&0@!0476sxcqh( z02y-1dk`t0toN<#RyaJJuvX8v@qNTPdkt86aX;zlZKx`(4Y8ZYt}e$DzF=c|CFu=U zzpZL%_`66#o*!*gO(cH?t*0CzzxMUl(>NR+MR}<;Ty#!h$ZbtL3!+H8v!41%`kN1h zBWtqu_tt=?vHIB-7i;{-eFJ%!SEg z0M(3wTFkJBs;Gkh7{x>Q90t#M+tGaIJ&b;gbc!+YUVPY6%tqNk2%B=P(FnT#d&EH` zl?7SdUuy8A5wu_JY>Is`0cnM&XeE6~e6#-pSLkr#brDd!juipvY&K-;IPL=-7TO6I zj>-FJDyJ!*g7p94WQQSxj^!WWh1TwxKc+2N#rjSheP2)JIFE(m7;U^iU2n;LVZnJ~ z6ttCUCw@Ou$&`rk#D8f7AJW45Uw9yL2*F{~1YSfK;a&)Tni+UGBW0!M?n?&!C1hXtoV{&ZfWv9=4O2^B2IxB|ru%KMA8R3Js!J=GiE}TwK z+e++R^$Q!ZP{woWV=`QyW=8cIo;*G@h@dqxJxg$4jfeHMN&Tu=qTRkQ+`VKq@@joCW&bVFikxP|ZKScg`-4F?c zzX=c9q3)=4D(RB~QQeQ^ch?8iXhMk_To$9~ns-b+tbQfr;z?H_S0d!+z)h0qsDqf* zDyS-y^x~AiGMdSP8LW83#n4#BaY=*>?vh_x#5-=(I;JS-bq>VIV19QV7A#ozL!N$Vmqrm(6%=NAiUOc7)TgJCpz{dFQ8VDe7Og9=s zekpQIDT`uw+U5M^FbQ^l-l^rym;w-DBxO0z4K-;Z-u>s+jM#h;t=UIKPE`Djsw}zv zsj#i8(rNHh@s}Cjo>3X#UfN3c5ehYf__l%wmD?O3UGuMm<^9%CZXmx1=MJvdhvCok zMSw^45%#w-zxO-*%I6cw^&=YfxH1NT<-XY8th01*Txz{ zu}=(Z-G#D5Llunli5}>z!B8s)d2gfANNSSSqG&C1EidKQ>{G3bo?^)b{~>62_s7Q- z6<6Gq-DQ#;3S^5fCrC2hXGOjdF3gveU;hyP+?rSRZ$#a`Yg=ioo95s_)&9TYpXt2M zRxFSH9L?YTQhM~+>dB#>lTUZQGHyLvKYjGq%( z@xMF0M_aeEhkh>`{rxd~tM$vnqkmTK%l}W@ntzPJ|6bZyXTwGUvUz|}^-j@G|1}0b zV~@dZ{~CkO#xgw;nCx;!e_GeYf6l;}y`lf?WMr>S{?h;)|A0LJ58iw@oKiY`^WgxE z9n<@_0r($llz$GubyN51#|zofyymHY()|AO09?~EyJtN2uo~EY^IrarU8?xc8TcK$ zOL6Z?@84(Ox65og-!$vL+YHPey4Yi|#eek}TxGuf#{9e454@S-A^cxM^3Lb9TfGOP zzUBzZzw1c2DWw-Ymt(bMaU;nR#QO!@RcVq5hC+brcX9vM5N zx0bY)?H??es%~phO&8>GLI!)^Bkw@RrnM_O3aYvdCPvE9j}$Z{|K4dEd;g+PA?q4; zYd$8SM#_-1Nv!XfuHN;vreRUXmOG_RR<--A$o2F+QE9)a{7Ba{o>N!_Yi~T?7RQl- z5g#P!nmILVuCHRj(84#)vQ1IkjnS?m}IC>AeJ)g_Qm0WrunCniy0L znFz+)vs_pl83dLJe3t}=qnQ8#%fdtXtY~fUm0V^!CvKh5aaizdwIJ_-@rHTV!LD91 zcs6r4@m;zdj|dq+-~d9Zb`*)qvA=~qof)r>`6`$r+aNsJfjRB2i6bTCM1}IH#e6$B zkqkyTSi2$>S%Dqw-onrR@;<9{KF)oii3Av*J{bUmOH1VoXm?iv0X3)GSq_sQv9Ipk zI)B-TbAJKOB#lp*M$S(wK|M@HjPGMllm#TP9UB30M%MH<1H$w50j?cBbPz3DUM}=& z`8JZN-v$>i{_cLVLBRR z11Xf*+dLr)W;T1vPz*9;F%mFAX(Ej!qD>_R+Bu|747)v(e_x;iQ9ez&XCv}`mZj0Ex!wdd9OYquam7D=B4pk z_qNinHBkRa-!2F*u90yW#wEY`?d`?;jR0gf9{;@rd*u89 z|1&P$liExo6)9#+V}ihT7n_qD`R@{(axa{?m80J|y9MQ;U2AS-m7lHlUHS8kw!F5O z=W$HjgGC0X=k0vi_@RZSc$<0pp^c3*r@djkiON5=2O#LLkX;dx-TdZH%v~zSwBpQ# z@9T2$CP2cTUs%-y_3GiDP! zN|WYg5PTUT!Wsgrco2mpT>xb_qPkAO8~yt927Y6EFa(S55bI@k8#6(|I{+$x2r)?Z zwW}T@L+p!C6F>nIPM`K^GjD^l8<7+%{G134?V&W_TmD~de8Qwlawgs?yGzF>OEb$W_ zAP$~P;9%=m93)~1zFiBEW{tVERx=@7bc;JzKi>gmVoCyW{TBn{;Pqed>e4d@Z>HPX z^I=aS!-+2gk@E=u_M(;OA45VYqOKHps)A?*J!!T=j!?>b|F( z=R+QPeGU|c(aFd_EL4pF;*DM1&KTOjK(^NwvSCoYoE0c2De1;Sls(jXZv9*IFH2Me z0Mk*uprxMY#*m7;J&BxLo}LXpOb3*Xin z^P3w->vZq&+-riMT}1J#xV4E~K!o*%@DbZO)tkxvWf}Apq~3n8fB`imfiZmRVkn-? zg~ktzo9ZJ>1@+=+&9m$ewEa^k+~W%DjL(*o>3;G01&A1VLE`y^b^)}X#F9JY*##ol zOnv(;-ni-GHGH$4{?>uud^g@XmltXmWOH&e?o6MG?8`LYc;9;7Z~2T;aouAAPyH6; zz-?^y)z=TwwiL)dKWE7W!_K)C_X3z{570c zSGOF6Lya)Z$*|~2Dm7T{wy3}f)1!K4EQQvRL|4ct3-^;3HlZ<+?C%%Sq=&;36ex(h z4HYo_Aa8dYdrHb}F(!Lz^@P8gjINT!wO=TIzstqap-H_ zv*Y~6r^#J-Kc$o*%{n^Nov@GH!qw^r{O4dS;yy=&u9!&u(<#%2>1ZoGL( zk4$cW9J&d59j)K#E&r09wTaLnfquHomh8La5e_5QwEhymiQB-#m7@n#F27+U_Grzs z7+9XG$O-a#PA4VacvHXj`NkQQlN0hr zo0JCMYd7=5f_+ETBei}_gQLG27_Qps3?IaUBC~#P&xmw1Sv{dX9W92-lD`dqu3nPF z9W**${&VK_Rljaa$9s|;;XdDgNw^c#Ih^|X>dn25<7xp^mi@6Xm#ydl!%J(9-w*L7 z9zeL9?s>hc%&rwY{|8#lgMBmX52cA|*>98P6!o0~fnhJE?7hkSc!0m>0UG&f)`nv?R zmUeFutg7S=2?U&9(gZ7Qf~%d+VP%YgY=Q`2&~Hj!?be_xxTrZmj9B4O1T_P+fD)ac z+;BP*ZayCZUepQWj4;iQ*Hv)=Y<7IC8&vJBOr4O@%i7up#>BoqxLCd|KR6b1*y?=4 zaT%R(h*^l@QMi`DlnZkBg3vIieG=R`5$|OZ zNzAfTIiQz%L`#y-R8$G)@@pBQ)sqr~71IV(V&)|(+7xZaEwXYzyS`}(=aplJr&4^< zAu5hK?TO0C)pi@clCOnKdHL`<(D?ZrjwjR+->j-ZDY)Z0bo zFbg6=#qC5W|4ann_~av_k}=xiiETn5g?#)~$)Bxm8O`%+;FWb2WNu+3(|aATlcz6q zYI6q*Rmhptfp3a8A-&rLzj#aU6pAO97(Gq{0&*m+m9JjamEbsI7nd8Y)+XGWrxmSH+Y?;VoChz99NI-*xaIpKx; z%j4+XANMAb?mo}G*FxeCHp_$N(NWEGt{FPdPdZwxkk7DCz^zays!$}aP^`I7Vx~~) zXCYRsNY=1O-mOS6sz^DnNTs<*b*4xiy2|;#h>`u9CBruDL;o+X%zu)jd#;RI{Ifk* zCgu6rxII^f_%Dvk#eZVxb9%z}jG4ah>@GHm{z~4z=~Bv`vELu}4_$ie;c)7nz0cOA zY-486-p^;VWA>o)|1xHpCjNsm|NPZnl8ni|hMukM{=bXTe;G4-qIB;9dTM3Q`TtMe z%+#L$|KGuzVQW#F|Myz7$hxzqquaXQ+G=pn+{$EVsK57B{rDgO|N6Dz8^gnI@pE{S zu`#Qu^@l?i1dGFmjSUTTb-(YhfigdS7)C)cD+6v%V{!}HIJI~YJkbXNt)gYB%u|Gg zv;&GqsBm+!17}$^r=R5O_#%%Tnh}ac@FwgSw=$=|<}dm6EmtIDsHcx&lpI)QX+HPO zX!2JIOnn?495b8~zM^^X)WJe+DDsJ~j5GQ-ofN}?K^-P-(%WJU-2xacSl@Xym)VxCz(K*6@IKaQDbg4u0KzV4Wl_9fq7` zJg`;e+s&0~V(NU6`^vXZAP5u?0q8A}0BA5@m?>p^X}Vn|=U`e~h_RTvH%H&{8ZF`=l;X3DQV6GA)7eM8Zu{^c#znd$O4aI% zQex9JK0!2Z7mbRNj$o9Ql}Vj@(AYP)j|t*7BT;JPJYsoy@ldzNikmy+7%q)cd^zHh z6#8NlP~!$P^RKv4pXzrSX(&GZNQ~i9qy41h-`p*?xyTe5>s|LI!pt!=6Lk*`Jzj4e z6Qr2S@CpFUczCuOm!FS^h`e}VQi}~&sg`S)S;Kferr0w3H7z58M!>&yPax%Y8p~RY zG^o&nyp|GF1cxGvHDVrqaK5^la=@haN9U}^cmi$3flIAmfW6E`Z+x8#o&1J}NyHNQ z58(wUy0XWNxVAVXNjL&TWAt&vos7|zHl%{Xm-ji>_ZQZ4YZPNmkiurJ%y;y$NcEQz zp^OIZt0&bHjg2CT!6$`v$iS7tSJxD3M7}NRj2n44vYMTBKZ!Bb9D{_T8v&_NO2O=>C6Fh?#Fr8VdGmAPAfJ51Y3b zf(2NAj1}-#-l`qRoeCC2Qc%iTJa;xMrSuaioKuS>&Y7F>T1Df~?Es9#BH2w=r5zni zj7f|nLT-r3@MOD4&3WUYe!nR2J2B8-U3j<>JNc+eKBS-(l$6n)kMuytK;lad8!-vX zCwx_`{_vVy`YrniJxt~dWkI()2))Zr(DN^uF_qr<#+yQx2Hoo(;l5&=6kIm559cUA zB7;-|dTnO*c^XHz)fViI-jiT4VahuIBE7NkZ{1Kv$bLL{QM+DxpQ^%DF7$0(fC3d5 zN^gXcZ}3@zg-|jI$LAGBB(Kg)>HF;?qDL;1 z-oS{DXbRjG^0)O1_#6dp%tu&ZA>vk5l4DgA&U!v;gFD*!)$`t5VVid6nP|Bp`7DD^ zkq6&6&>=!C1fCMB)Mge7j#*&B&RY+MpqKzZTSc-d9}-;i$X@ISH$$1qY0Lx~%qH>E zh?-2WU4pbSg)?xN+s`HFu2c>g0%eUR&r|}dKbfckjw4eDPW4x3*8Xzx6J&4Oj+FXernoxT59o$2 zs6QINVz(JU_bh$g<+zl4m@|>lB)CxyQKYv^o0|&H`(5CcN%W$&A1Kl21qEHg5O*&g zCxSk(%eVN^AnsTuOnV1}>79*P%OQL9XW|IlOyG3d2qJYLF4u4BF}hkfRO6eQpBkMa z$Ryuu&be9NA_#hHf$I(yP=o0ZsY1ZMItFu{^91WLjAq#h6?_cUB2opXmBGzJ zfR(ja;)7tP#X9KKk3JH7WPVQ*Z}mUZwa!tC$ZX>E0G_?c61WG!k^8CvE9X0~rp#uF z&xG~N+6^uDSx*W-lL$YQ*r19|0rQfoM*Zx+b3^ceKpyM$A(8L^N1E2f1>q@C--cZ2 zySG&PuOR4l)8_MvM6@C4v+VGU+>6fG^-x`N}seYp~DGy)Qd8WGG3b#YLF z2{b$zx_<3$<$cQ)Gd;tsb0fhHVc6yKdVaZ%7r#hM?NSXjp8x8#UHLY|!(7(OF;a{0 z53hTq^C>CbNZ_^Wx04P%EjKk37Q2kyT9vNN8DWPbo33rup$y7Zt)iDa37cnU0><+j z?v&5{`QgSz$oW#QSC;$8(}#B&s&}(-qwe(@_ZR(dV~3cu3tYv=|FR6*V(M~w;-XJr zSitS7Egq+e_4m)|?uF`qd?8FSm&BEOrXr!d!JE`Y#j4E?N_JE`rxrr= z`qMSh-KohuL#uaNJa+Vtu;HQ;z{dckX+yvwoMxocibN0(@u)oF`YOoddI|B-ca&w9 znfcSyqa_tfON#V`m%$hZ7M+ zUjbnUu=97*%K@Axik&4GEiA@{m9xQA0FvZZzc6c7$R@3YTm z!=T40C(uO7bfc%33;6FcNM zn+GIy5)W&Uk6rP<`E^QVO~li52{L|}Oa5K5Vy3=0hx>Pz>mz5`9@9SZNE1}^Ipy2~o9=J1sYot7>*^5`%Gm=+$?R_nEJzG{EN+6wM4kft zh*A1+fe#P5p5<-ccgviG(>QsAhvemYMgi(@;rKVXU%fnS@;6nSj%q#hWG-hoh=OMj zaT~aFEvCGTl_Tx@$pbx^O6Xk(@G2|R@zmmdm!hyNEfb%6f&ThG1oR$USNw1?=Yv*| zB1j7B{Hi2-A3>QfM~mk}&bpkR*+VdK+djlm*fv{MoN*GLbg<_(z(oR?O|mZ{Z%+}; zwTNH^L0VsDs&a2;-3o;MLqPTbESycr?2Pdf>fXo zT_*LjmgGo>aOGBkk3R6iGE@m~@!R>XJw{St41Ca)@>ewHQXM(mFSKhXQ^SmRqysF= zyjxRKn4LwQ6FJ7WD@F>0@a_zQ_c6pcf&rCsQu!#rN3>MIIinPd%-(Ua0qhEfV7>_v zgVhUbR-lI^V82+%p-rz$enEv}_vfZXY*#`lae6AH`7-5(F=#^L6SS{W2gf-)?+nPlcqy*(UmQ*MoF(P;?{shESkMGwvn+fJ6{j_b0$+hu4&- zz!`u51LWv>hr_f`wr2nLbPcO!kXv(c$@dc&ysvuH1z&}dlwrQ(g!@-edT)}vI5rpsGGM2#!CB*29MJASSdoq`brRgSWSjewfpEx&0 z(^=>x?_wRYV7|5xYFjoVHeoe@ZFyCN6`MGq0>%2PIOeN(=P{}dV7dLGuIYfSwcP5& zarkD2doE}x1iXJ!p%MzUBtF#YM>hXtzw=5g8LRM1mY%Frz9_;^0*yQ{QN>$aqx#^- zYx7uKmaa96F9aWh^b&pRk~^e!WyPr@)%YqCqU-}a{;uCSHNRE#NJse(m0eL3RiA~? z<}nn%)mHbQMo=iW>ac7*^l8I>jG%dP{mC}|M{Sa5X8nbJsk^pv#uLX`LE=o1Xx2Mb z8KQ)c3`B>8UZ6Lm+oEOxXoL)Z;45LzHc4Ip#BC&wBm=uzxOUs-#w~FaSTs^gDDrl* z-U9f=ys2VaZPg==W))rsBg}!V3Z>7&-c{;%Zaa>OwI<0tj-#~XKWg!$2wkaemVBr5 z#MWT!3aTFq-NXq#48jbzgN+I$PqBaA@IrroJ@*}X&UOw03;BnAFfS;)cs}_N?6WOS z)JwD=n|c&@PH-Pdd$muPy$_Q#1`j0*9t_54kFq{F}=}g3GQD z?c~7&mf`sfbU8$4EI9BStKfNitZSs0JFuYJhNK%X*M0GKH%X!=*tjRuqbDr7C!(My zs--7-uIJji#Q$s!l)%2s{byHU$UnOZYxhDNq5rr|2y6OBU16mYn=BMv=^oB-yxMZ? zYPH+7MwjbPh}W6N_aYv(|3D7c_$EFLh_61ARC^(%<=oA>keiLcX)Txc3JhDLb6T&H znJ3vDhKXHX2~3~lPQM$yr*C$iyY=D>t>;48i}QQ8y)Q!dXvA$%`2$hxCc`_USLox{ z@>*iG>^){;(O_&*X9|0xbbmCaWGb$7I-z7Vsciga*-Uat`|Yx>%!lk& z!u&Ok;fRg`*dnZ|yN;2i&hhn* zy)%mUgReGvr#}u%Y_?Br_snkh&n%43t&Y83oPM)8%0?b7ti68sWpe5B|G$t&?9++= zQy<7(0Q0{Nw#lKuo!wm7YPMPO*44f}w{Dw}RU_MDIkWX6!5lBFYD!+_>uZ2te8wPo zgp_T}BFIbt1cu#IITFPzjX_{+=%gySB;f;O@Y38~jyFDHKy`Wq+yS`{jFx*o$^vE^ zY&b*`$wgi1s-&H0c8*u0%Qz^5g~!a3XB!e3p{hIlSp9(IHGNC&NdiW-X2od~z{vj)lYiXVyD-mpkzv`8dFrNqq zr9+XtVWmaUP%PdoQNFu0jt5l{=u5Vd#I*^W?TnBSwRB*r~p~A(mvrs%|uBLKg4qocow?z;<-6b{(cQTiAz$$s_76l zZ}!Ho&lN4c^NwYY3crHf$Lt-tv#NG!Z7)j7R2j9{Xv~_7r!fxbzcLf8{jxC$WmV=? zVEbh>h>v9UlsZYF-UV0AY-ZTq4x{i=w`E{2N?g?nr;0gV-@CG1-FAM-`l%EJ=XNB1aGf>G`JeP zf`}h&zs_m2Wa)9`6c1lx)7eeFybI)B%P^oTGB}kHzRjx1#G?v%dwK-=YizD=pVK=u zCoCPSaoEQUe?)?-{lvlR&m>puJiZrnxIGf7Y5kK64_(f0|2i7LT%9jBHLUI+jgpPy zT~nhti$y`jbj_E*JeZqH2Ect6Ba{Mcq@p`0{PrV30zEv}z)Un+u^p~RhGIUWq)Kql z1)DE|cf&~1UQ7Ti`(xPPLyCB=eok&r=HvM0r-WtP7#NOqyne}`s9dU1i%SQj9m>E1 z>`YeMk0taeBx|&`@i`;|uYYAehWqDbb1l9j>ZuEyFwiR*-O6<@YgIl$Hc&+|ka^Rg z6SVP7Hs<#Sby~*LyvGi#!%uS1ak_4W(ij6VIFqs8`?r)*lU41NtLE|f>BRshx6K>F zgj%lIU`rgxnxm=5Xtily%fA=CyA0zs5m8{XVqs6#H6!!6-U`G<@T=9@=g7)aKi3yQ zd++f0opAH2G7gVoui|h+Ce6^MWw-k7*Q!^7W9a%sptD{mp6WB z&xk+^VGA-QVqEe0ezKLN+Y=5NO6fWvWhA;{*!=Q~0bgeywwNa1R6R~Lv+=awA;#vP z(mp>WPzV|zA`5cXAO5<{DVi6>Z|uNzrJ?wJ50V6Epl>Rkh*KFpUngtqG@FKj7DE?RKelwD*Ee*@3lH*K^>3TN4u$vO>D+ov7nSe*|5<{_H;J1>+<`jBxe5 z+M17eKBkC=R#N$Nf65~KRbl$z<23N&=Wb!~1;x&_Ae-~t9Gm3qYvZVcH+CzEgI!0B z7mLxJ4)@Q_*Uo5Sp=*pbf8Z1US_ z4Ie{te5JBXRQI1xH%u74k8{plN7d(`-wX@l=J4j2ZgoCnU*;h$nP*{=5dRBW{Sc%` z=gU5Zn=%gZM8bq?^6TSdf-1l#|7!n4*OL%?W4A5T$8JwdCp4mE2#1M0YU!cj6+vck z7U`==CW5_chZmLjKlBck5n`VCcx!n#>1bP2-_RWpW)sBiR5G1+b0#W)k|L#sPjy=E ztrCiu@ivW#8`=WTTLL~|vGCj`0<>cC^z+G-)?5Qdfp9l#fK*6L+ON~hh3g#{;Hyg+ zJOUDMaC^y==@xzc7`4FfiS<=PA0PPApiUZkC13cW{96VB^;-<9e?$M!_4a5pY;+9XBb!nB*_Ow3PxOU`8IiH zBBO$?XobJ=DQjq5JtN`CSNDoC@$Zqr5!h#$)mNW0hK<(6Theq$O556fF z9C)R32#%-L!;T}h?SOZZ*ZV=vBqz&1*hSN$PxCK2^f`T?pb%)ooS1sqY?){Flt$24 zM{5>$ZJx(j<8L@uJY1k_ zvQ_c@+(Y*Yw{IQM%X)vuT0Ma;<%f|Xp|oumaTdz`)>XnPBhI65Fm9&jZTC`vr3_9zbNtcQwmJK#l|($50Pokai>p5pjqg4?WgN z)hm>Gdm1m@9#(idMi7I%ya_Qt9tx&F9EW2LC1ME37==LU$1NFs8q6vu_RUvn*NH1S zA;1>`)RjSY&f%xfVJ2u$eH-Nx2E>ntz4;QC*9LROfnw?@@IV*R3fLX%ao$QIk_a~< zLA(;wRStmo84x>?Xk>&G%{vjQjs=PK3jKZH#7Bdi1mL95M2>XCX%^Isk?4}>Jy$5# z>IiisCT6Y3<@B=Y!jM$u#A~5()D>|nCal;c`6f8ljSMrVC97c*F%BXP6oFsDsa^>{ zpfX5}1TkkpPch-Hgp?dhB!!%$9t1l{hFUp5ry3zsiBLNd%!LW_qah-PQwLpcT8sQo zuEqadnpuQY+WmXJKD1`yYR;xKUr4PDzS$H^s}E0W4$EkW&Utp7@(*3c=9RETS!%EU&Cav8`u; zrtWF9vDlKS*gcIll3X@^qhjVpNk@8VSJuNm+M|KYM_u`qFY+1vcPqwjvo%`PY!*A9 z+4$yO?R-|#yZ@xl`q>rqj~gc0yx9l!Q}pK9;-{mJTIb4J+0tzB{&Q9t^K~V2sGcp& z*jRwhv8JBsr+u@}m@6gi3l&}Os(Y8}`&aAP>TGcJ>FCy;G#i@k8-Bf~%O+nB4=uEh zE_RQtbxbVwPpCrpdp4B))x?E3+ zkcu_T!NP%WN&h^2b8Rf~vL05_{Yhx47mu^lS3?v`oFwevtb zOww*(v2VcbJ=WNTMx*1J>oEeE-kP1Yt#e?1B$mHB83WRQBYeFHZ*Gd9$*u%>;Vb;!Lrx@H!fC zTlLRKC&JQj@<9f%a>7KwrKH#b1CJKHpLd~ZpPakIp*D+L`5*Hz4xYxoyLVCTjZz?< z0>Ba*N*(V(i;{nc+)J)+5`hy0R!4Hryjgyq&zWUK2HCKb_gTa-HL14_Yt1N!^A-~= zW$w8xb|QA!Bce(?w3crEh<_;v1{EL7Bc@efv}8j4(aDcYso2%EYN0n_bMQ2&eg{cs z=Vry4hrzw(p`)^2EV(euTo1;p>hKS#fb;YQ;j*&#<0p$Zg`QCJPgM0ZL;h4jGN#%m zF2xH2lqWKm?a~6Cn9YQJEOHv$znF?XKdXi{bzyBj=UzjU)kd$od0!AVO7@_M{N-p9 z>Ap7830LqH*9w-7c2Sm)MGkM@(@O}$a|AJLlti?3eg;>x@4Ci5bosXBH)z+dPv9aG zb1elw>E8J~d`XlAleVk$s7=y+BCH$k`^j?KSG-r1C?S{eSYonHt)jH!B77B*cu}M( zYd4VOe&k7ZG(V&B8CYeu!Tt2FmpX7ixJUvLqP%;5PShw%Uh4Bi;rDqi+ucuYP`|c~ zh!-k3jqlTM5ATGYe|n>N(S?&_B0aX`sP_KJeWM1DNAcW@uw>wr*3$i^O3AJMcXZu= z>kKCT|}{;Cnxn*cX6wq zd)mJi&V2{IX2XL2JkcNH-Q9kr2xGRLzScMU1{qQFy~$r~36je1(#=F&R0<$Rf}X32 z=-FBi0^ra63$nrr2rben1QxVW{|>QVf*C9EC0{r?n_q7nAd|1SaQ*d%e*WM`-8GsU z1pZ{zKW?Fe2%(}i@@SJg!`{#zxq@7#zR!QdRL&agixsxd?vT%VQb`!KSZp_rDAFc!>iHlo5L zw$pBCvKQ3>?` zK)!L-nnmmj_!?rM6+CN@%}+Hb=!`mUR4T(s2K0@;pfH|tH7{H(p#}3I-bOU!}O^U67XFLJ=nG7quyrkF)n zG6c&iL*hYUgZrEVru*fa`~ut*@t{g4CRAgS2|b(FiOlMZSM+(%u8ai>1_ChUVG25) z$qr{TX%@W;uJ2bG(km~4#R5UR5iE#&tdg#LQx50Hv)hyLNZSai z#5xwOz!bej5oyVVE7=yj-~D$2oZ`P-*a4^ zkbm)5u^x>B3Djb1#ON=#1`a%u@|l32^%OGKq=RKP@j&VgjN>`q6X|}L_kI;$@j}#={@{$(uIhCaf znbGMJRt{XoMq%^zS$CY_e66g1xEo$~&^k&pNz*l;XXKhG7-w6AP$4g0N)0%XdVJgZ z)wKTj97mg|3m*byC)y^f9(u#0I{k1dJ-<{6Tk?KQ2vIDmWURdC=ctyapcfC;8kQ?e zdUlXkl~>^`opA3twBguE1~Tmghp2cXF+gt_(0^GZq9xYp>3#t$eOZ=+n8-*MH8M3j zlAh-pY<5ZbiNBCl{fVqImxh8^)BAI43G=zQKg*wxQ~pWPm7DDz?=OOVS2XRH(X;Bw z0YkKmGa8S73v;)Ad>ucaN8DvF)~Vm~T@&B~l%s>S5Y@sC4@#i2`Lt3%QGVpUhy(qX zAluzLQExovzYqTE0x2^BxXp92M6caD2BFwJLs7sJGnPiZOfkxK-5;a&<8! z{%cs2Jsypn(Tgsn)*Zb|)?~IE2qC?{HYv4s-2e+axqF14?}5=!+8>YQ04@ahkGP(* z$f-Zq*l6Ym>&n9xfI{!Dh;JWvq|cBy7lJyRY(?^9;MZ;^-x`*%BCnWOm=he2!R98R%yR%4GlIi`iuWhlbu+oI3Va2{9Xo%AETyaBM|}4(0hH zfc|jE=2gSl`7VOwM%AtY8BMoyd%*v+T|W_I9=68geE-l?a>YHU$NWa)sPKU^{sCOb z`L)O8rhJE_I}XcYIrAsgt}`K@ElEc@uHQ%l5wOt^Q}jv#&^Q)KG`Yf0gKfSd_oagl zKDbtTA7nGM$(ihRfYjzAb|=4A(U8hYAbpIH1LR03|ArC z0)J6&N`rrRpYaa*I*#3Au5jJbuWz2hGxm_oQU-lwAB zAO{0#)e(o0K_10Hx?UZH4TCLC$Fo&l$R?N%?=OOd7$Fk`tK^(}Rdusslu8ps93^EP z0&c|uyRt;s1#F@u2yQ_K{HKvK~nxygxTi{yP)KXL_Q)}%3mn<#ulK+fSw_xs8+!}7+^kTN{S;O3`o6` zN!6E$Gu;H?Cv`&R!KMHLyp-xTf_U%EhLi_YHxip1!AH^Xs{nN-kw1b6x1&R3H-URX zihOwRAtscBGyE{cE{TSj(jhgVn=eM3h4ElxCe)9JIGS^7k%A!6VKyXz8W3nRP+~XO zH)!5DlmH&A6DOfPQAr91(-0&)+!ZYp`W39s6tGGY(7?OcZ9-k~(r^-%Upk4Z?#)jo z-&UvGJTQIx(2v`A(F_xV3^z8VO6CXjA0xQx-t!#L3jBvq41Qw!PoWsH2V(n|P;9af zd+ZohdE#27S9pzMRNb+w?6`4_`}Jm*>y`hq@#;L;_#N^S@7Rhn|2X&dkFN=2n|Y}% z=Tqx~ZZ@+;V_4eLu#Bfya$5F8BfC&!&&*@%#*Tl(x~0Fkz_#(&a`E5e$#=)13MZ~- zH&AlwVsoFy6g*90%f&lgF>I}PuPu?@lTg&YClpHuZ`~h@DH%;J8@o|4oBE(Vy|gpy z-%iC}=2pGDQ!#S;$z0l=jrVF#C9;v(4fFZUi}%PlEo`*M8 z*gW%~W#Z8uICHR;Efk+GlG?p=(brF7!`+crm^Ha$>7v zYP)+6z`fT)%C0S8$D*g+Y>%)$PO|pOOXlW3kF$1$*=F9#kN-}vp#L&~_y5%&Vhcsl z|4pITSN)(r8|V9?!1^B^UdZZP-{%Dx!j*5mX=4^QbMFUivZf)(;ljHP_Z5wyD?B2q zHqo6CRVH!lpmZyh`$}6!vXEvpvaQ{G@a{vWg~?*K09&-wDH&yDJV4%K@%~kF06?*v zD#V?sYPf?;6YZFjV2rsXCkJ8&^=6<+o7|2z?ra3Z(M7$bhu?54EWlzRcYXUmo^OQR z!d-A$tBmNi7n0j2_2tfymPQsrG1|Bg65jARHo6yzDFo`bUUodWqE4cl)3mPK-A$2B zJl)U94Xb_R#p?p$RBh^6JEg7A1sj^4Ui=O6brHg zcVIhYU122`gz64s!mI$KjQxf2)ATT*fSh>{pIuvbg3boUf~43TC=1?qJ`Itg0h3MO zlsKp) z9LMCrvJxuP0UsysM>R{}#2Eir%KIRyS1j?ct7(K^XRfJ)ehzE_aMCy3SSTG);00`XJE()puY8ISsddo z-}%6{S4p^%qL5)!5RGRok1CPe*#yU|pHdAz9jlmQD&~jcGlg{eub=Fd^UW@VsB;DT zVNWQtsvqJmO@4m*N)%@>PA>DCWz1 z4k}{y5D#y8b1R~};WL!b`~4H(ByJb{YW2wDZ$xy)NY!r0xi9$dZ;yUt6onARId<{_ zZ;SXswe^J&dDUn7Dqka<4!Lx!VH`|EUG8V~OrDWGrMv_s-*Mx&Op&TvrNlh~HKk2^ zSM_EMWi_VaLb%Dx^L=q4;JO<1mh;DUWQ4_Zxt{!<>rC4`>*0$Kjcyy`6{m0ojd+9S z`VWf+e?_4jC=!lajf5VxcLZs%TL%jX9Y2d6z0F1PeiJzOr(pW|>SbQ0)X{Ys z)otquQGxRwM^yIh5CztyT~ll$A0sYyTAtUe7rmo=`6*=eA>z_-l8_1G9x{p+snrY! zgz`bT3O3`O=5xOc1}B1d)j&d}WS$Tg$}_a0({3!`f3WwSZA~qDzxA9mJrolXdQ0da zVCY5EfJhfZ?;5H!HFS_-LI)8;?-&pi1Ti2YB5G)gUU~h|cf_vZR+~<1s zyXU;T{RVPTX2u-<@#C%ASbRR~wId)lTB0@$fRAEupfsO}y;cdGN~gm7m1g}1&@%8c zw5MjgKQzv@XcUHGwI-E`vjb2cBND*~2F1g8dDb6E$fSIh$}V9p!5b)K=|Xd{1BHrR zm@EX1iZBEmHxE^;rwCZ`C4ut%k_p2zt4Ass&7BXD070;lDb$9 zeGSg0aM6ykavsM2Dr!>ApozMs% zDfMj<`=^hoBxcMS2fsiY(Exl^fYKubS1Z?_1?~Eul%*4{YQ8vY~jxT6FdvxvB zCDO;N9ep<`<{N13cIp)7_%jDux7F4X^W+xw&>XEv+z!$bxCw`7Ftt4uJ0rIXlT?4{ z4M8l7GNHUo^Di1DW7h9ct+(0c)*zQcOZg=(YDj^E!3vb!;_B|Gys*WddE3snp?aBe z0;qw@1bctA;Utnk|DRNhpTKTQo?3+*Aj=502E<}}r0zKr83ndXh{y>MYX%Iiw7j7$ zQ#*^PWY}Y`TYx)lXI=DPBg{|jsb8dI29;QtAlz1udbJ9R1wl}oS^4*6pvsa8T>PHv zStjlUs_Y~oDD`9bR$QT3^qmv<6_})C7hsayry0(}#eO^LWH4l0={B4z$H+h(che9@ z=~LzO>nrQum?sUqeyi4B4@poh(N_(&Mg_Tr6i%`zMze%AEDdq0PXiY{njjwOeP_Kp zzMQ+gkACX)o#KTy0CWf}VGAN^zPF*NChn_3tl*Jl>y)|D`{<|@I=U3FEB?LS4juII zoW`>vK#FQB7AS=5j%(fs7Q9y0gU|_*u4gUflw2QkLm81>?W|N=@nmj{vVF>N?Kgc&O;aCKm{WPKN0%E&0S*)b>t3454xa-pn z_-@8k1!5*id*}wBz+mA!8lw&CH{SK9z+mc$m!ZL=403UrE1$a0NPQXjvDr?>_hF&2 zC5Z930Bu1@R+wvqZusrh=DI3(!x~be!;I*V><4Di#%Z#c+)Yb)%T*kuxipcd;*0Vf z7UC8&H@JQFi?>X;l!zB1GU0=$w~K=Kl57xWj_Z825d+{Sy9Rjb^s5a$FJ@epaqSB1ky) zy@pCJBHFE^(-3?=aKTT<20$5(p`v}=p<7z5Q3nun`vdUKQ9?P1HdGQj2lm}`1_nbf zO65=xLtz{4+BqjslX9sjKL$Ln5MhzXO5z}#c`ySSX&y3j6teVLXkQw$&H=RM!Eye$ zToN(}$hK#15oe*2mvycLicqMEL#M^1K1SOr(QoCae7nZFD;2XCE zp~>h#2E0ANr;xinh=~|m264Fkm(>E-9o?x<+fA9X(}5e^?1GNAMH^}rM&MuyB&2E- zu0xJl^%+v((`P>chX@3BARtv+{YN1@fU`e^eGta-x1mCR`QeJ#h4Rb!n+4E%1_)m^ z4&JTSS>TuQD*Y`P)EC0^P%4?667-VV1_0*8V)>1&!UI>JuNCt5{dAIK2`BHE&DjBx zOlax0OqvjtU5wj7hdDD2!xGRGdE|CsJ_YA;8*e2#qJL1!bRq#;WYtlkZ^X2{kzAxJ z{xEV*e}6G0Y$?HFRNT$w6(7#4$N2+cSsc>+4%5VFh2My?$6I zarE=6vx~w#rlei_Q=Ai1iAh`{Qm?U$Qb8zT*+n^5!LxUIfa`?yH1&A%1cxWk=HA;b z$)?V=8m)A8Koo`eq8ml};sx(N6h%XZ3i5@RZ216E+ir{bAF?4Sga~R`>i7}5QFOG~ z-nz-7>r;vP$BF9J9R<`1x`1;EmA&a@JHHRFPK?oH@&l2np!ew;X&?(bsL-xsYGll0G9n%+}^8I}Wm$%KIu>2JY1W_BT z$Qx&eTWq}Ku-t7n$H1tiC>6Sl-$Hnp2e?!(|3=SDo5Qh52z;v!JWLQ3Q=F_jwkdS4 zRw&K(?rfIj%Z%)@0E+YUsKN=L}>h`hQy*P61ohOG(b z!1>+Xu3I)oTZ8SJhPvq%{^z}X?X>x&s$r&6uA@jrb!EX>FxSL-Vput1Sbntv^VippHvAZ*P3Wx?K(DT0Z=?Q?hL6r03Mx`GSpTc8um$u9$ z4p!SiHpg}Rhc~rkuBX7k2+9WTJp51^_0F$7Z;T8d4A|pSs(#v#1FA?UfDpM*lS%8e&Z&kpY~Mr?4J;z{Yu9PKN9IwjtQ zPQt+oVPgZo>~K6NNiY(Tg^Pl$Ce(&GzoLl@-2`#GUnOu}%yJdQh6Ql1NP%cO667E* z=V?5ZKZ-jxt2^=WN=v_X)8aItAGMPQ#biy!y}Qtwr7THP4~f4joq*b{c4_}xK#Oyw zqZc1WMQAZ+HcXO~=Vw&fkX{1QU9QIRw`$JB&ys9a8%HAP|+PPYO#a}fK;H#YPuoLo`peyiF0 zLV0-XhUr{dEg9S}QlllSV8jg2h`sr(xjBdfw_?j~2;2mx0~RNsANJQl1HR1)DwCdn z`6uM{Tw4F&HXRP6CxnU$1JbxRq&BIzb))P&$VB>mWEwwgyT?35`IhmfTc#nm%(HJ< zw%oG5aLYzwJ@_96>WZRHnZ=y4-p#d$=34CLTCNqj`?fOr91~Cen;HIlyg^jw{^R|p zobXKV@yj?Kl-U!MHbBc9^3EFZI&eBz6zk4D9=fKO^zT|@hR36Fd!ty#qYJzD<_(7Z zNf$G>~$5G~w{+^or5ssxw(N=d)O2e~tkrMaKYZ{IL9L)S>aX zHSa_eIs9`BP(Lf8i0Nzl5VM(0^Qo=#nYE|$8bUYDYCNa*wu2pk_v@J z`Lj5KCnWXmouoyHDMh2fOHiqn$ z6c1+5Q7#{!YaP;@di!+hDz<2+IqwO6v!TJIk>V?eYf+)AUaB|uTQ7ldg=r^Z?0K5K z8P4C3v@Z z#(-@yyW2Zn*v8UD9Xbl^7~ThZanw6kPcLp&Y+05nmd|;^7eh0@#YV-J=xOIjQp0-e zSX>gbZ=dzZTlyu1bDgL#@l3v^42ilkyZ^?y-l0=>j7kS#e z>x`y^X<*nnUPype18a^v!+k0R=r$+1+>bv8gL6T-p{Ov{=u!>h)r6O5rMBiCGVRLQ z4EK){{jHDBzny%56o4uv<@EPwK3~KR#Y3`Ayn^ z%dzLI`;^|$J6nIYlg+}Kp75XJV?SJ%>r>)MH&J!^=+bFQx;Jzc_tcJ|Va4kkXib`5 zj+~sTHGI$>%XpA@w0=%^G5x?bh1G6@h!#a9WyU+RnZ2*FU!KB!=LVnYo&R=bAfj~7 z_jEBEyGES|eskE}(U(p!OI4CXL#LrZ>eXnbtJRM;N47e?L6&a0Ja#pIE2^od^6>Sa z>CN=4+d8}9?60HyVRf0!JPA_%6F-cx;Y#^#^WQ^JDu2a;ilkB>NpUCDp^7_a_iCX0 zL)v-#r`!MeK6n0^5>x4y%ohwkO|dKIw!PQ&fvBUirFJ*Bu_jQ{FD`tM#wEUz+V$(R z7l55C*D(X`Lys(4gdQko!|0nd!wNvj`AyE}%Bng2VGFBZtPV#90ueO;&Ycl!?F9m? zk45X`x?_50DpMpUCT=*1?_RYQXToQYL=}6cHRoyYM6h2iGMWdsqS{HNb76{QbPy$M zo3Tmbc#ctZq)FsB>WdAM(@bo_a=wq`c!@nd6eWSahFv;FwZ**EPS#;J1f#9uPm1<_ z>zlT!!9)s#YgxK_jdcB40! z2;NlxGa`-%;}w`Et5qppg<&~YXaAat0&}mG{AjEha<*GhhJI2mEAaYk5YpadXppo<*E2Q`jNKZO7CYkv1yL!7Yq;*yjQ5clUn zl5{2}on5$j^s|OJN7?RMDiifMA0_o!E>4G(t58Nl%JG1lu|i# z1#BYka=#&C`g#+9vgU)5(Ue>TQOM7q{>sI83}~E5Vu>*Wwp)(@ogenDyC5 z^*<_`{!S-UBvx4?(|IYkxP_L}Z4&zgkSvE0sM9spb7&f#=#_}M!1tgWjq5uter!|Y zG6=WcLjfX533I`(k$G$<_0Q8NgMwfGm@(;N5(i(Ak@e!E;gEjw4^{p&p6bUB7$b6 z<;2iRUbL+;9b^_>eHVL0AH@(L%qXDb*O0tVm_l$Jhb6&az}M5;BodwA-Ckj6m3+G2 z`@$RG;MOW^^13_W-c*D>k0n>egDVL&IIGshAe~?{u&21Rf5&`@q1+M}(MmGf?YVf# z6D8R4clV`5WRqi#kw0t7M!-1O18Z2@0o3cJE>eOMrXoue!f*$;9QnUb~vb zU1+}8Ff{vIDsV@D*lpvqk%M%2$`nZWs*iF~x}ed*hRG(br@ zF?g;~Td;28#;K(g<=ttFGjJMv4}A_`7s3pDQL;Xw%aO5-NcQcj9G;&c*%V3B9&DV%q!E z(^D>=wqNBg0fxX{vzH;pg)k*Lh!p_pq>Nw&>V1b)9YaJXS+2Bg>KyQ=h01R~-#S5o z0UmbF(-En$soIIrp2CR6AzbL&V&{MjqFZbnDv8R{2rWt?p?nr$27rvjFc9RVDT&*+ zp~5>jnWR91*#HQ}u?$}xj9naq#lcK*h!6%k&tIyJhfd`nqiKPOFS6vQVEr9C?Jq_$ zbb`F5>rEXwcld!bD0Bi3>Bfee;hD_B_vEe2fgkx+(D4_VOjLS7*-j{)?{H0Q_J@VgZ$}% zzoQ^ETnY6BaN%i&P^{@FCsI3uIVDim_Q3NS;6R2cN7(q z)#)%*jLBgJI*x%T{{pSptE!P|vUyVVbd2HZ4|+gAlgVrU(h}I7XjtlQDAfXT^Ha*2 z1L3{|uUi%0niK0F)F$YPgcxtE_1Js_1Go-`)h3GCFsX$v!83UEb zs2_|$cyl;nBOGTYOe;(a;L^-1&>+)kUyKdyGqRkHs}NR33;eSJR2!qpco6aN!|r-1l=e<|OESy{9-6j36nj zZ5V04z1nr~;;NZ!;FCujSwxIP9Q+_76^~IfMc zo{K7G(c~-^XvIJqSWE5XL()tJUmYZ(24*2wm_E3=ETvv|&Rhz9~kJ#bKGCF==l!8=1&Q8Ce(X`!#f! zdQx%@y&DI6=xc@*95kz_xSh1vy+5R z&o+EY)(Y`M){uzxbo6%4Ifrps)fa@LG!(i98ox)Vqj$~66!S&zNBrogt;r?d6K#l8 z*oI6(8V_m1&rr>`@0ulSCV{MjF5|O=dItJf444_G`Y=o;RgIX*410fYOQQ$$vysq# z59zn|_o8CxsC=}Mz1>pa#b2TAVZa8``6%m)u1wg&Cf?NvldWxNtISJRGWr*c5LI-7 z3_4vb`a(&gO(L&r^HSO0V!C=YeMSkGQZDlD^pUK|_3P-w4Ej#1XZ_FWfEZxVpaN4% zYCnc>4MQu}y@or0SbGw)5T*!YfCX=RnsiXd0$@tau1NXIUwe4cvBXkp?E+#fd?9WR zeNx+_CzZ*vqQT7W>g5>$!X)Xw5pNg?YABIfHON3cdEu|bWAPPCWlN-=N=?K(EX`X2 zqS+nl3v z3p4o|?%rstSn0EOISW%ylSW=Yp8XSjh=I-l!sY7WJ`tiPSKy7hIhK9HzruP}YBPrB zlkO8NWm(`(p3glI^8NPV($}k5VdTrFf&pp%^}|M3<1^mZlwdYIA3N<(siDq}7bD(- zN8)W8=;1fNk1AzA&4B{;Za-*BkHNjJ)5Zc+UIU*RA_jgF3u(f$MM$U3;qieap85 zoxRs@YLCk*{njMpx-kAe-~I`Zd#_T?gO+}uy8LQ-Pk{-H4{B8Dw9vqO&wCArOg=Zu zG!^I_yk_0G$I@@~eAfV4g4wI~(2;+1>~zTCexv>KBD0w{9npV3^}>1>1?)30sH1`6 z6Sq$sl~+PM+^?*B{JkNxx`NUd@<=w8`wl${$|k*)=gn`&9elJ%S69Nwl+XX&dM5kc zR;|Ue>u1cO}9+^VZnv*&+XBlPm0WT;A)5oQQk@}5t;Pp$r1$TKfihZ z;@P)1#_J_tDub%xeBGc{wP^C#&c2sw z6`03l%l;`@ajr@e!S$6A3n3HtXk*jeXqNJYcdtkwI)c%AV9dHB?6wQ%c<~3RV=RTh ze4B!&^7z>kRee&a6|gSs5swe&rAe?DzFbQyA(bV&KU6vD?PL~9CAuFd9h2)eB-Zhy zaS}2Q($pn*AVnbK8FlXLW?5%jP6?mrPL^hK9Hv&^@m1c>Z+^e9^ZlKi_lvFX?_YfX z@bUY{tM3J?xc>;Jcb~F|IkoXW!0Fz9!|6Y>!fU&cqO->}GJWFTWLjjiim>#W&3evX zgryIh3}uQYbcRGWYoLfsvw9=fu=G%9;o1ywWMO~I!J)keFUI~0OP8PjgQYM08%v8a zHGjx-Q1O2w)8!L!qRnCvmad*m{?|F=TIP64M5ePuWV&T;Kj(J#A2^-ca=!Tg;?tL! zn%C|kSx0!KBG*-vLT;a0b6q>{<^F-wC0+A}y6+bso2WWIE#lLaJ(G=nvrYXsT13?v zk?Y!jw~qUudQEqI)b#&>)9u_VoHN%uMSS|~^)3;j9=df@G?Bb^9l3Dg;{Bcr*Z%P7 z=SRmx*O52Yt|QkF^_`J_E&T9a92X(#@n`=HQHuoFXCg#>diLr08*3e#3;&x^&wn{D z0@bts0@e4Y*M>14&E9#;|HG=s=brsHR{eHbq{J?)jEPwF!!NT>eqCF`)uL0%KXDt; zUeJFL>pN@2S~TeX`Su@T{osFywdlD(1gHJ}AH(TRr<4;K&J`r*bPb<3-X|93dMvlx z_Bd_tSSBGsB;tZZBh9D7q;(d#wkS!nMC(K2F5fyjtexERl>yEM=4mEOZ1YCuU%LQt zJ3+L1mk3VR3Kjv|#dm`KI+I<7!K4XsGp5SH!sTcThF5FW z6yyXCN6!8=8)jueue|bg*+4hv^y;SiUcrmTe{vXhGv9rjEKLC?Wx4%H*Kaheq9oT1 z{{_h(q6NsliAF*n>Mmr;?og%tfB?xsZg_0=4#y27pyD!38c8~U`2C}(O5JGG zk;8ftnffH@^U4%mPx6Mni^MwdMTG(sgmlNcwD~~_7M?t)__UteHscrkdNpPtW zoWWr!MZMzbW|qYbe^o$MlG1WmJ0{G27eOI|UU5-^JFenZ-hoCSodVQqzIa%vD*YY# z8ZU|Sj&7^lmV2+6Ef-tJ6yMa?Jx8LZTPAv4w?a*n3++88M!ibwfpfVTzv71No(AdD?fZ1OC5PLs+uQ4$0c39n z4fj`ZcB`vu$+t&=Y8SCOcDh-`GjB9#k8JL>Xv2?)gqJc~$ZbQ#+tA z3<1J%POX!3kK|1Hd;WgeTvJTZEr7#+_nuDg`KbS~1T`%n6PHJ~ zj@_T$Z|@$`Cc08O5;Y_veLPt;Wy>@YRWs5^oJ6)>M!hsDZ0q z7zdE1Ofc4JHk3YXy7VO>qS}eG;~g;0%($wLrHRWdGK#vK?4%A2=P8ZQ5DH8IjrLS& z;OX?0F>xL?>_LfcKH#tr;1qM9jViHBDk-XdDjCaRA*ZLu^M2f{Mw*V1v!u}LOc@1{ zZlLT5uZkVXEQHwf^Sc`9lRO)G=q6S!d}r|_0c45#gp))$VV%AVyWxV7>q6E5IP!O8 z5z5#V+xn%#xtiRd8Xv_X0+uaVPiYRT)kn0~Q^zZC?dZE+HAA%%R}(=jYhy-U8P-|_ z7~~MNmnN_`y6wUZ5_ZVmz6KOix|{3O&_7J)fn$7+YWpRKcxc_$TV}Z-FDG$N6!z zD9SUR6xUu{6VScRa%p1S(|{vj{Zf~yGwdB-e*R^I+om0VQ@80RlX;JK9Nnt(+AY7! zveSTxvRQ#EQF*}S@-xP|>8oMe?N;*I^gdYlS_kZSPC;NlzuvuZPpxWvE~amT2qW_!&Qf6xlHb1c2B146?bY4}VmG+$)KFVVNrtz+*|6Q&^`BZg0kljy=tBFtK--UbBiZ#jVzSL_G`V_c~u~fsfF5 zPD1vEP*u9o%|r`2OjOm7h^4VMdGNF-#d<^6Dw#5aOH#@G`D%;&0xg{}qy~K!F08-Y zufr)PPE%LWVN{sHG96>)bSp^)cv2tF?0fR=Iuyo0>EA7oDrMv;4Dj=nmpRwTXj`N) z?TYn@7jvN{gUYu?mvQkVxGC3G^6|rb{RQAA;04&n7=yHRLJL9{sM7vQ&c(D{GEoS% ziCxcCdM<#QIwiN?8;={(utwHjK65OMo2O~oh7DQHRWK&C@#IM0#dZwLyVg@F5Kob2 zOZ2GT!ng=*D`VLy#71tuCNA@qC7*Tj?jcwZ;rzqxmS1HmPa-Wua32fAv!rmC#_BLI zd1Fnc-yS7TDpZ*USRC$W7Z`YxAL9;x8$R4pP#SJ4Ay=2Dq@Y`@2Qcjwno5FKzl3;* z8>PbrR!*n5c$B!L|9ZeJbXBB$K$JaDGGxr9D@&CZIoPyI<))&a;Cwh*O{;k$I0XI&TrEQQ2o{+`FFs1S2dj0&@)Ap&Uo(r}m-!0+QX^j0mF zr#4~QE0Ea_x>K@Y9@rKVCZ2+b1tAj-%!!(-rGq)=mwlX$c+n0>pa~QnFf^rajzb=y z?LNXok$eC#Uf5ole9dKKDGB4%mB|$S2-N_|z62vuWc8VSPB>IGC%1K(!59f8746HKGEjWK+{hl|(?pesn()l^J{0A7WrS9gVNt{4436ZVi$ zrJTgnN^fx)RZlNMI9;^RK>KwWZ~_p~0%Y*+9NKMV%4t9XfQ)ztTV5hlNZI*PXe!-8 zp`hT`HiANaXxB4fe-|QIu> zn6fYtmKqow%#vFo{i@uF3EyY2!!6AfxFYj+di;x5XedVM2+4QaOl~of&`1l?ysIov zf(@CATuK<3v3mG=QWUPx@nai65YcGCVHz!`QdrTB$L{0Om%ITrO7LkP_zoQwmJbRpvw>(jV_~h6FP*Lb>wngXE_~GkXf6z=}SOH^oD>^ zC(j2o>cZ-V!3H@emLTgTbkpK%k*#U zVMIVw>WwiKy|gIYakCAO0buWkkrl#ROBQMm2VH*~R|dc|cC+C)a|;lQVgQ8CTL9m! zFRBdcyBit`;g0+UML}I=ScyCpX2pz8qq59BP*DuT0RUf1LrP~*zM&%9SD$V8W>>y4 zmQ19Bycn1hZr}AZXevNMj4gMn4spt|R%Z^gSA>4~@Re7%1TLf=qi<3r`p((>B>&*4 zGo>=5RwGVKQ+@pNT9_#{Z1jf`h8^{O5m~{rUcZDXWg{E~dC52zi4}|!4P?ow8gK}q z{D@jI=j=AM-UP?{#T*(lA)bR=IR-NqKr*zln7Tto!m?-~ss<=hW#u6YVI+P{6a^!N z$1><3=vOT!@U{fKF4>dM>9XpapjCeaV<{z(gAAe~-XmdFfm^k-RTt4TL5VeD!BqEYi6|TmbFwLdN4#YlN{Teu&Ku z$M`Q=Mq)~2m@zjOkq4-lZ&z`xR7?sVNn^lwwb2nYJqdP)v@Mp#fF5V)!#J*(&Z841 zzD@%&ru>-R2x(V5hQZ8nrJo?t>r%seQmT4?4YkS$p!BYobtN!IW=894hi@zsF+Rk= zVP!n9r6ia*&(cfKWES>=#M(x78Katg%+kA*(%QjqyjMB zDUc^SqbIlO0+9HyE@yl$10l(4Z}dQIT7vMy=HhJ78bI_$;6y6(UJk;C9%nfM4C{vM zm?%5tBjq1(!2BITiG&Wb(1Dnc(m7Y5SRGAPj6AGDNYvpMPQf^rru7!tT0K9z{B##?}uNF;bI_i0r= zlpy6qO@Ob%6%Q|OxR53!vG4f?WtD)E^tfF9D5TFZMu}MX5phSF(MXaZl-EUXl zK_@oR5$3^uTAo>`S&Z!pDvEn4%cLjXnOH*|DD2q=?*yE2=*=G3a!y-lMQEMTxFhJZ zFEhAXZKID2rhFse02^sWaeeI_nGAYa=AGerfu0-!M>yq(lUY4mBhM<8uIy}=81gY1 z-RDb3Ti9ZQLeEU!_tJPFXGkwDobh?nbmr%+eWt87db3{hmu^3g36n%a$xNBwri70f z2ov5Vc<#>fHf#i!c3jN}4#53CO7Y&nb%Dm>hvo$}ZK;|A8A286rqO0-@#>W1s>72eV@Qul9@+E#Ve*F|>v=6Pdc<;{N-_4dj(nS~8ZM^4ve zO_Vfmcn{sHxbFY;-G;ZG*+(c~Ty~GZepqF2WQK*3luN$-^={4kdky+FpFHGlJY~Yj z>z8M?UYmZxBGnLRC(^tPvU5i*2PjLyJHjg>{)u0$XivCi8}fEne0mA zb*&A(XDx~RHkZfvG73zLJ`v}04^gh*bBE-$if^Hx`N#SZTxs%IQ_C(DDMME|sr2UC zCodKxaKAOZB(W4T$m_IQVntV~}FkK;Dg_?X_p&5j1IOwTguQY5i$xN6k zec5iO<^dznh=V*dwroMh9Bzd&`)$pGnnihQ_xpFY8`dsE3d>;Qdd@dRPqeV~r$?=K!^Xyt9 zz2<7tS|fexUuJYx^R2X&xh&4@tTq08rm$`}xA8(=%V^2JDfIdOvZN>ST4z~nX+Du9 z{U^=WbyHMa$p1HpzEyH!p*l`%m!s>b-Z@M56S)&sWy?^XF?K{w#vek4066=l358`GQ{}SNdP%`H=`azx*Rg z|MSm3BJ}z{|Ni$^Kt!Qk{~uH6HoKV0=hGhT)O4k7mDQiSe43lzb$R5fPZpxYq(rfV zp?DAxZ4u9@*eapC{Yc-;rXO9BQu1OlL;#>u!Ansvv6mZpr*d&-58;io>ERugrc@0Q z^&Ax%t2fz=q^9PHnH^L-m@_?%DZ5%TyYtSq#&@x|Sz@x^>FOR2=Y}!ZaZfS`K-{2R zIgdsxUxA{B)48fl(M1qKPn+~%#PV(b9n{TK=)^f62XoWa>0^84O}@UX@2)z$i8*%A z{^+P!h(;bnKmGRB?u)&$*{h!-BHB9S6BgUUuVlzu=tlNF+T93dA{Tqn-{H zi=lsO%H@AYXg@8E1kvsEMUN;dBAs2i_Le@4BFywsx>^aT)juM&Is|a2*7it5>@u&s`=qEh#JN363+o_{ z%V%17s!7W+J96%wJocg@5~MwkyM<>{735}KixTnaa{iU81&f@3lk%>nB1)v21mm)(Q4jxqFT;>-#AV&inZ1hZoS zJ>8Bw9Yh}(-zijR`T#(8@7c}K8X3-ZiUuXHXXL0!$Sn^ zhmE}fu?{?VsAX`emIPY=!&H{!*(0q_0-OJu=3)029enr!zj6|1T-rW!{7z8+Ww<@R zf1nMn-<_}?78`M3<&NS8ZnV2ah}wDI`Mk+Hwg+2o$lP=_+K)ngA5-ex?`nLbZU27t z*67$fUuNRtzEacZsh)+L@VlD^5BVQGnYKE%2UR>yraKtf#zs7=Kbt}Blh}K&QJMYj zaEaxGv*QtO#h)&{IEf0)S&*O?vQRR15ToF@()xSsV;4T{+Pr%)cY0z*b;y!ZZ@pJhV!l78Q<)OMA`D=oxT0^d<+Fd!PPeT`z|$s7 zOQlZ2HlZs~cd@J4<7T|d!lPlLUoBVX+u=p~ALZ z>$tIkqz7}O`cb7lXSQKBadez)sBe;y6UZULL7? zi;92XrGW|&dC^mz<9UaCC%nfNZtJee7Z>OAKlWgD{9EKhViEa7j9 z{d$f-%&E#1L%6}rNiZ$Om_#x+&*?oCWfslC7^A_!6W-Qj!_Q%2ivXI)1MoC&ZTET} z+w!hk-qNQ!T${bxAOnt2Vjf~d-0w2>Vu>OZ$hsA(N;(7~nTZWQT$$JboWj8@HT=f! zRHlp8Z>e1-XELBpz1DtYzW(YR zaX|xZ>uQON3$7(b;$Z8ow(i}FVFiZ6;5s%1w%Z2h*IX>g!7%drJll&jb$Gx(&CORM z>g_Y6bdMPdPRcx_7dhFFOYIi8!6!KcBR9?&w&^V3PPtv@21zK=d0JMp#|LwH2n&%d zJ@gCdXw$y&=&)TVi34j{WI`%>af*l%raV8NP}~Kgb4_d?%(#NmT#@#L3p9uxGe}R* z*Gl)pdcemvp#52*B~;dJ7vq#8=S#GT16f?RZ-+m-QUm??xgr@AjEo@zTfpLKqs1P%cQRN#HMs8=8z8c54r{C30 zm+Mx3ibGX=9h<-MwNC@Wfuqq`w0@E_j(>n-9Jt zl3edapkCFe6@-bWl<+`b7;bob7#G;((-gJbo_1GO4Xd8j1)0Z;O}$#Y2Z<^YaR-Vu zv*=$R-Hu=#9U4M?Wq&Ic&xN-)mXAcMMSp&|8}Ob^U6NNrkr9_glY_tARB(|a;SM*d z_7%%W-A-`iYY>T+db6wbfLPb2T7 zA}7y37yS!d%{zPK*m}GGTN}N_Zk3tKgKgPtjK?-RhOoEEM6nP2+>HyPXPovUtmBhe zC}&iC8sizRIMKKSh^5SJ%8v-CH)4gn3c-P}B$RujHbKeX99s*7FqwA8F=>Fc#2DKA ztg1LC-h`aik!QopMX-UCbULyOz^5^davTX?mXdB&0^Zc^rbTFPzHL z@=CR;0#L^xPRVMD=+~+&kc&%T{RmHUbR-zQN=QkSm*c>yI`uti5S|MojA1mU6>y?A zKx8wQVpV3lO0FGfL@jLih!la0d}Dkvq^9pjaQ0tTcC zXh5nU2Bd=$dKE)20*2lp6zO270wRW{D5#-Iu>?Vys6i3zf>WKg$vk1s|61#L&e`W~ z-|ci2 zNYAWZ4;B}tk~WhDn*m`8)PECpd^=Q&nSdmNRtye)-wk)bqLl)Lia00~E{et=0at7Z zUbhP@GROhO%N2z&Pa@~aaL4v1t7D?J<8j?BWykvfHw>~G!F878&U&qlWB~jm z@W!=J16GX(9kC`PRI^K~QneQ^bn^%>;oLRKBu3Cy6mY^mUw;nmNOiP3*ic2q)YD8R zBZK~~0FbmG?^rJ_5_IdDR|qLA6@wlU6R2Upuex6RB&Y1kJSN$QQrU8sCwc0dTpaaI zL`NX=%8&c>0Ah&=IVn3)2d~mj-@nO~GbR@g!_(vpg{m#`*WH0YLbf z!0seO@{dfhlwKGWFJOm<9B&r49K>1CPb&2RXD~<$XG|>y8At?E2Q#O`1)_44F^cg?f z^K;VsNk~3bflprn{0k8bCF%DxxjG4yBM9Z#)K~O@e9xP;~$zO7hKE z&3u2%JH_!7bFS1D$Wk0Z+ff@fv;b#(y73OcG6naO0!De~>-YT5x7Bw)IGU(G4% z4{uv^xHB=_aQl)Ln<2zZ_;j-T>4qX#jWcKJ@GQ$|KNjW6vI;7zHC;dU)g_sGI*8n8 zK)wc9iGjWmrkib|(1FOaGz7b?*NO<`T7me^0@(cqt(|RiVttluSon6QhNj2L+#wSg zz0n$j%r-0C$;{UR^_|tOr?wG2);{u?7@RNg-GF0V9Nl;D?{PDRv z1z4^e;_yVOPm`tyhiydED@09l{Bszcx z7;y1W!CTe`(?IY@l+b3*Y3U#-Ar?d}Ot6-M)L>TZKoVp_h16oZ{CjjY$ASF}crsD& z45@||ZBl^EE#B}?>Ia0W@cf^+-DWC^z|P)^iffY5s}_=psXTqg4NzZ!MXcdG0oc1Q zBTzQi@!I4{ zyps6s^aMuIn6!&FeuM6;vC}M z?SMWiN_8Yq^^$JatJ#pcBPk;t4`}W~qNwb*| zi!i3c`y|>fj$fpGTE6vpu&C0+WBH#rPPD#Kb0+X$rl2 z$hG}=O&0ahbY!aLu&yVyvw2)l8<32JI=^D}BFc@|DZyfsWnBh9nF zBz@|-`)Sv64R;XOM`ZoH4#lt^tzC+FX1o~On~k=@mlSr&rq5QEyot^l1Ja%KYrC@ZlUWrY6m7tj(x7Kx@4Ag_sVHr-CBeO zM)Q$R-FUjvJ^8x_*+!AMxR00uTI5{VVNhdrLhBMg1^M~sIxpDB!)z^mY8!QE|KBIU zSZ15rM@$|D`fYCN=JAQGCe15>$o&m31?Et?6fh&o`P}{0!DbyOJ+I)*hF~N7cE{?c zq17ZPu^faL(jGa6V^eAHM|rOf)DVoG!uljP_w}G`S&srzmX8;Tr+^S08jAd2Q`%l6 zNFY`$+1`ZDRE(Jl9-tv^w{IQbTsLS?1!C{qx=7ZHLhxS_ueBh$bkUsCGjroY+_~M{ zKO5$rK*AakQS_1O!-9^hf_FDjtF>E~cHc6j-}N4T*MIumwUl>*4exH=emDH=-EF=U z@P8rW$og*+$Ny+J{);h34O(!*&i^_%;=4F>c~8Kx7jqsudA@hgzQIAuDV=2M9cK<* z&gnkOF>d@T+9>KyDCmvi5arT=e^~NAdz=6IH8?5efBhOIGofW;(R(17BkG+=9$OV7y6 z%FfBn%P%M_DyEf`mX%+qsI024sjaJTxJYkoYHn$5yVTy%dAaLK_f`9Tc+kk_NXSbF8_kWwtLQqp z#>Ot}TnckHRC)Fi1UFuwU#{=Ylt`fLj&iGoZm6umEc3b0$S;M4#2(3seBp`U;i;0B zOtf5EhMU#rxdv?`3myyx@HH<+Lw^3MuxH*YV23$NR(VfU8!4mof&Fb`j@rvU4 zg6;Blbyw?@wVf7{2teHLlPt7kWob1*i$RmPi1aZkKYn%f1F9X-W*uzOE>=-;t_1&xT{p58{Br2H+#ra zC@!p(b$=#>?=N8IW&g)I0<&`4Z1Uk<_pWK@OAk`Q)@v^wKNuA}D2UCVK&73FkwMmQ zp|k$xOOloi@Ss}9p&J{L0pGC!Y1)5v^qO=1szTC;i^c=eN!sv*lAHriVYrwlDgii8 zM|(jg%*ZjGONunENOD8(>fk*JoRsJZJLnu|+pwofo*pk3cA1$4&2&wZlS`UeWQ+8# zC#x=;&qUz@Kb}FgMp5Qm7VVHEZ^^Q{eikudGb!HR1FALntWH+Eea`XhZKRja@CWVr z<1YmXkj$Wf(FyKz*l(}05#5$eStJ$l;37WV_`nvI)cNuT^(-6}<|&kj7I#Q&_rCbq zUZ?&{QA)g9opniqs^$I_QKd>j>xi~?+7}j)Di$leugJ+g_RZzSkw35jPyTY@DCugf97yUvg@(esVfz z%USHz4erg!1L>C6ZZ;n2GvCe{&MN?qQn_}^#I9%WVy!yP)pY79Hi$-ude{c%&VOJi z*umCdCkRP7;us7=Jy7I1l}!)$DCur(-L2d9fK6*Qh1q8AfSH@-vyZ z6mSo+7DmI5ZuMMbzX-t5Se*(*!Z~Gfj>__f748O?{MK7HHt_%)RxeeOol?qc@Evp1*y{CEz+qo(F7tsNA)@mc(S zn{3tX`c~;6yE*CQPgSE=mt%c`ok}t+`9!BoER4QiNUqSU--2ZuPWOq}ZVUE&0SGCx zv(h>GPD6qbm*p1To)FiN75%wW?D0wBqQ{g|r=Hl=jK7b{+z3?`uIOD`Fn zGUB~;#rJaOye%WhSp4S$ll*yG2^?$UDBUFaE)C)}jy&2%EIxmRyScW;$GlinGl@-W zdRlbJY!gjHL=iHi*65iTlD^!61h?!hG?jN8Rrl@sSTW~U)nua^Q$d})ATI))P_78He+Eq{^H zc;$Mu@_ldQ3sbHVahC^$zdxkk?57jqKl}Agj{}CU)1|Hv;1cCjP>f)K;9-cJZRiW# z9ecPG>v;V}NkmSbE&rEt9Twn5iuWBc70sYS1#Ia6PT4{@O?m7dyR^2~g!>pyRkC2G zOVJGX(&i6^KBc#tikPGaZ?(5~p;E7j1}HM1nUdq6s`~Z(QW@{WuGxs%#I(ol9ky`mbX*^>%Uk_V4DD{{C||EM>u|V$?mDpG!c-QwEK(2Becqvc>Mb zPrYIkfDm~%{i9^sa(dn>TxRMa41K~6K)MhHtmH3@7ce_ zkC706m_45l7Yy~at?$V5Ey7_X-W&vlP>o!{ua8Pd$5I1#U%+_Vg#w4(x!tbNJa6q5 z9F|lw^`6Tmv?D4wSPX#dO1uWR&tS|XJV|`NzK!zwfDd>Qst?GQZZmw$*LD_5jo43Z z`hE-fJ2`i>dcVm6Rf0^g3>t!KVgxQ|GIn73t|Gt2Jhg`*iq9}_0us??0O(_D}SFwMwYLpzf$Vjl9Th+RKEG;s7an><+6JU!rnxb zWC6y|)fW>TpUN4Z%9ql{pBmY?9R3VtyzlBCY9U8YMRcO$}i?>2dD;*RlyInn~E&c zv&|M_B`em<&v-zL2KbilcyraTOl?h5HD?N+n(W_aka1_f{hKH2i)j*Xn{teZCi?=} z&;z5S)Cl~86y;}nRkk;AT|Dw?adJyqN5YO>C+@HB`^LvCqi5=}*B`)yTF6itXV%PFTmuwfR4k55nn7UNiq`yrjxT*+eO5x!^dGS?cDu!w!xbMf9b zJ2e8EHmBC@gvsDmhzU;|-chD&J?o&O2}*GaIPMrD_C>k2dg3MKtS~JV%b+988KdIM z_-_^)yC4dSUekEbj=g{T+>nj@NmvLiBgpjyZz#)zmq@W0Oy*xX`cU^zT_F_&bpz%+ zkk;10og0ean6;-&_39VB#d@Vvq|&MAejxkAGRSSpDHZBY#PUhRzVpI2?*o#mRGjwi)FlsL1sL#2V3O$j+2YQpQkda{|_#rw(fdb;_0N~BX zrUM^EKmh{e9ocCp3+}azh;KzF5MVD^fJzy+9gFe^tFhH{K<|a$-ChCQE(5xz$IT&f zU*ce9bSNiK%C`tTM1fh7;4Z}TUaZhqQu;+q43Z3})42@+kUK^;vtR!fQs~zl_aYtX zS(TB@%~Y@HrRVf^Cio%x#d4L~M&+`yAFZuiD`t z1pum%uTk@sSkD0NAcFQu8O77{ImuCgEG8|z3Kh-SkHrE;(cF$iCGidA_>+3!3V=Rm zZ0$8F8V~)6!LkCm5qCx8n@O+c^&#wx*6%32HuaZm5b4MrP4t!-i+G&n$w-54JLVTq zd_h1;06<)0Au{CR6k_*zX&L^G1?0#D#dzdxQS7b|C9R)oo!d&%wBMhH!$=bl%db(s zZ15#r{i+|gHRaR?UHsO34rx8~O%=+Mo&SmjoN(p7{eq~_>)Gj;c7#@3L_XCW4=9qk zLwW@uH%zooY6$h@p{7x;B#$=*XWY%(Z~9+ zMD%u%(lp8v0KegICq%ddPz41+!Z~nx2$`rejWQ;H4-rCtE^#?+l}V3<{M0$4=2D)| z4)pQIw*1NUB2GzlT%tD9uM7@xoJOfKBqbwqdKgG9D&Up5PhE!(L)3kPN~4h==PS&D z#JEF$*q?~&2(22$tdu z06}I!YrL`$xq(JR5(#E6XyL&>>e@LLSq0JEZE#3GC!AqFDTcAc^H=v{Gv~>C*398fY0U zXuYojpZhMW(J~6AIt?hjMQN!z3I$bNC08cHiEl2|4m(so-v;`%(frj1aP;PGCgfJG zRc0(UVS4`ynM@?>Vi^PZ_^9|#Z*DZK2gL26sn*$Y68`wMw%LkTK&vK`q~I zQ$OUaoeVPYJG{XtDqt6X&QwwZT;*5KBTkj zU8$39%64>Zj>Ib>2z>?Qjpr$ehR3UcnHH$M;r|q30*1A*{kjfgXqoK>-SEo`o<0nmXdK>h^r*td0gU@_4YH z6cI5*hyU0(zF!64B16K-JvTXq<83g16#J77w!Ga%yJHIdxM4x(xMK+^LywOSmjEPs z|7`}sfdJuQ@F%^-0)TzXc1OlQr2hA0C47i_n&>k)ABlFcg)P54djZ2RA7&u6 z*?CGChh<1fI085?Gwkfdw4lSR=&&K@j4zhw-N_kYl#C!IA_(Bc2O&k0(r1{6Fm|#l z1x_MERWXo|E#sGw!nLVT>~1U<0vTx71BSojKE?E4W564m>AFma*MhnT01=~s;&hN> z0XpPzLWKs=VesiN#`V|6^@lmXWrEX?QX(aZVL&WC)$f;zn&6SJ5s zgb+#kp*NsJ$~d-+JV!?u0gUr9PTD6^8h#JmaR~`s*H?E4uG!==o9p`6Bj78?b7fiI zM<~aLiP+V-Sv>gN`}!Y}HIm2bgziNpk;F-OtHBStyVND)@hK8SF^WH1FzcX3#T2Epna!xWh^?C&;k2(M4PlUl!u5fbJ zbRJfm@nCctfp+5KXZ3MBM~*-fvl+kupvd+jr5?nC0uz;~6D~=n_o5Vt5Earc#C{m6 zM~9j+Z{b!8sFt=ObHihF$Q_3WG#TQWjKXC?$1)Fpa)BJqfx;y-Oq5~A=r9+|DsNcE zv)K{Rq?==y%=KO=bqRiNCb(4M4-8{2pbvSb z5g-6)gXec--o=$bEJ^3X2_vT%aC183gzV8`+sE&y(77wY;4O?b6|}OKZ_>XqPm0mk z1eMq;Co!w$_yh@|>t9OdxB!8ar;tN*m{;ZFyOaf_jdKR}*$C#8D3VW(4$);n4arb> z(&!92;&nFOb$Id+1^!$@@JN31SksO1Q*vovr^MnxG5Q2_*EvK-gbW2hEQLceVXl~! z1ww7yA=!6WKnqyh0U*J0aidB7s<6lIm4w|Ss8|ZmVdA3`jz(zG@;uer&$D~U$ZTJe z*GS`WGzFB!!0f22%x#1{4M?0)4O?F~ooj!^l^^2mKJ#)~QxjAt!Y>tY#}dU-P*eyB z`udcB0HJ%(G05$uHRaXp6&vwtLr{eQUFhPrrh`^OXI?P?*kRtQg~C6}EiSw@*&MT; zdATTZc0~HCrbUXA}3c?V;Do8{I#=2yVBKV<> zqdKDRbUtkcK73imubcYXhz|E;zba%PPP3rWGyq1J_Z>A&mdR;~L>i0v-$9?uk)M0Y zXLLuB2*u*?1c(wPj_ArXCPP)|AP=+K*M^?Dn24k?g0%FDpB-pvGafDTQNLnytnhQ_ zUDbz)5dskrm@+}jjl}6&YdmFxFt)0qQ-}G2SFP>)^DPT^)~8oroIPjtHn{*7`phvm z_{e3|1Kz}Eo=1Xqq|aui?0(5B`STUhIN+1SlC7bX)?E_^4eK_qtjWIgb_5Tho9$#8 zzU8D9_g=mJe#qB%5HpSQ-uk#3J{wVn#2JD&@p7cVJo>~zJKk@b*S9+tKS&?Y2>k*^26^j9WHe zGrHbv6Ez3={4 zBg9V#MbwBsNje|KdyCW6H<46Rc*V< zhWxJ6^c4mWRb^)R;$QnGjsjqR%N4^djTdI#uS0le2YTI%eRnig%E}+k$$|nYlE(QJ z8%1ba54#YqS(lrGV_82U^@LnptZP0Cy_^ww)N9UTyKJ4WA8{SW%Q6sJdi}|zV!U7_ z(t!BvgkRC(u2ATc1+g?txM1z!TQj_9=(^F>cePG343B~)yU+POS1hImfuw#qd|-RM zZ7qjD#hpI*;HTP5NOno@N3v)W&qujN$O%vQ&_tOceB z_kQge<$O~T8A6Qv|0y=B!8PfR>~}!Rp6>(W~B%mi#OwC4O(K;me)~L9bB)i42Q~uFJKXTyf?omCyWsqp z{n$~lX0C5e!S*-{B604wl|o*4&|DfUYjALd%*8iYlD|$RjtY7^<_27FS*1bpMQ(Q# zoU`-iV){b_`pM=JC)=h2YtAi?z=d@e2%|6_zj&hlfF{8Nq4b^t7e4!bC9t(3uQXet z=30-%rEsPDp7`{u`)(5tt1xx!RZ zf&axOBd1FccvYVxwF&CcJJWagKd$wEk34riI zXFBb<*8BFl1beRaEBI7MB^SPIwst5&C)K9 z?MZDI(-*HSlwW;H<6MXKq&AQ023BhapEq1(7wD!a8f7_F;&;B#)_;6)<&t=1@6YRNc79Oxi z=Qbu5K8*fzO?t35@Az?M@yp2axAE1V6Kh{)pZ)yDzRqbBaBfN*m(6ERqu>Gi!@u_R zwe_zHFMlp@L^l6@U;6Jz{r|B)aJmF1{TDhFQ&xao2aayliOkyJX3QL?d9!q1Uc@fiT2tUd{(i8b*H& zRXQ6l_f%XKg<`+E-s?Y`jt--ZD3V@2#E7ZO$QW$Dnr}bw$5X1@31t?8n`_2&1n{2q zwcpYmdO``g1ryh9#7RU~3bvm7_2IrpoY$rwI&@p6bI{3BUmFH={SJ$J#rkXaqd(ra zrxT+@8ca5T>4Qhv=cAd>d5=QH*Q$vEC~D4JO$A5QJOUa7FjNd z3u92wLD{QBj_0T3+2IuEvqskSwku4LCBJQ0JR(YY$qy3y{X_)OhVvAk|#%X$`-r z6b&`QXB}PJ)kBF=`Tly5gT43wf;BR_Es2Hx;h+prQb za0HKqHQACFBRZ2dR|h}a1?@y_%9MBW%eGTcVI{!&hv5tM5-%qImLXQmrsk3nrip&w z7)16rD1l-%)qOs{laR27feeXn?D!%e zi*wAC(x(!IVJDNm!C;Apb0QYEA#VoU^aZ|53K7DHi@Tt)b`}Z}#s48-&6RuCkL};H z(=K~r85rf|!{e2F)1%)-O+J1wr1~QHfBIEU+XD>2*`Tlf zr{x-$I0HujBAjfCP4#XVZ?(uzJ+YtClNmbvYLb^kgz&}3kE*+sdMaeYmAr})-knXK zO7KFFXyYP9b&uWS5J@j0pSd$WKLu{TyV$rXp%4Q{YQX=kqQ4} z8x))mNX=rneN|EP=bW?YG9h^Z& zd(mL^f|2PQbtKZXIvs91uLHaJSxsB}g`&atTQGe*(qRg!Ala)6y+>5mB0rIVqWhg^ zN?q9rULnJ=RpV-#G9Ebqr`98=B+L$iRe6Lj3)+;Q;YpF8r+SF5(B26#L81y=!T#vI ziU`(;j4mEHnG**r`Ye;O`<)4hV~j5Hynwd!w)E2%9&C)9IgO*H;)a!_HHEb|t9 z-QMuW*7PQ#?`!}r>1xaKCS^vdLeL0b`Jj^JBBOGD7fGo!@&PH`T@ZrN`T8fIrqt{HH}*m^7iN)+ca!qJXE-XoQ@%pAz5!P z2VXn70@o))Wu`_1*0!^(!@kPr;q$rFdT@BzgZbHA7*G^Qe~{!SSVl9$e_7-cg;(l(kVEBvt)_&zPu5ae0MvNW z+)#~_eKDq4&(Ba?F^4Wm$bvqZR>a8mduYDpP5Fvx4c_XY9n){FK*(kb{Ns=$qOe~}6-PM!K-3R=t9VBZNM!5S7?l9y z!6#{ke`!ezFsNq?Td>^Q;#slJqR;<*7kK?Ua^i#=)?A(r5V)C({*jZ#OU3UUVl$vz z7~QSZquno@zgW;I`a&40|jxglnDE8ou)<>VKC+;6~kAuNfM ziAp2$v7rTmqkjG-RPfthr6Md>Ur|zGwPX(nef^3p`eqF6x|<86EW(yOzRZG2Yx~2| zlNIkOawHF7@C=;c+Nb{4&tjQf9bO0BLhnrp9wKoXR8xxAu7z}&0y~TQPizCbHsZ^5Se_19;nw)F%PB=J+T%M1^(E{gPlKruO3o%+uhD&Wb zqBS-|TNCxVStlhh?O5-5eUUK!L2N!N%5Nu*nw5le0K41dFHm3sGNOZzv729YrX#(z z8|`%3Yy+^MWtD6JUBRD2ahI@V3kJr~xa>GJUJI&z)xN+{_dl?(l1o^Hc>_~snsy^9 zsM4S{HWe+4R3gL&*aKd#u}Sn30Wv^QByP8fYJuwolFRnl`p6&ujwMk-Yb$XQzX9W5-8P1LI#oooI~?O2KZ@$S}1`Sni4lLR1dVz+z_c#5~(La`#y`HDG|~oXmbocO(sJx z^`yA46(A^5Pk|~1$SV8994F&)56HR4G7Uq11N}Qbd*0%7T9j%EHO}F0!z0BWT+l4#g5m zNEd0fcl{ivtwu$DpA(Q?J})OM_*T2LI$lhk02j!@IIg1`@aR$^I+5mimIu#cGeAMAh(>d5h`())B^XZgJz#H;nOR~M5nOK2*r5sPuwcJ)_af?lqoH^bC`5JO zWpPfYqKH+8y53xM43dWnr^5(J8G(qH<#axZIiI7=%K&^peG~KI=bWboV|>sa3H=Uy zb{1?U!gH$6t;=Ew+1p#m7sbIL_-hm5S5yw1@Hq=mLL)&Itvh> z37Cd92I7{|KAv(wkOeWI!oo4AbvIlq9Z{(Xm=S4~Chc?fpgp4wmRj3z(-y@5!oEUo zy@j9MMhyuH9%h0o^S}dlK_L+u3=eV3!RXR175&NaMj1(LLv$(7<9K-3HX;{OZEV6d zo+yT-v=qn??I6luuVE4{m>3gL5{&w;_^m8 zc}w}6MmXdU&=<0x(cQfVe~hYr9VHd1jb=dztjq39_*yG6jnd0lhqnLp0Ew`r0IAFA zK(2Uo8Uvw*k^b-&5Zt~dh-u;spz6|~$La9!?S_$`xM(`0;To`h%-|_RA4-QoZ7|zT zwRe`AQI{D$KQAkD3#JlbVL4*r3^jDAe?UHfqd+N-(G5&=DIFR3vtuXq?EETFI|ozX z?m3`&V>(qWuT0i~awxL|(A$RjxqF>50a;kncM0O(7lGQxUY-&-G6V9*oD_mpY}kYj z+z!()<=Eh%+Pg%E1QYnsf2%HXNRSNGXCmAclJ{Y`5@=FobGLls70NCo`Dm&^21+Jo z+^?BIjY(H)8P^4|T!k$7ezrxRvpgTu^_Z3eZBb%p|D7vePF{YT{ORZ5*sGhc5p)6N zq8F(9reMFl37VO#wBdk8EQ#Y3h$>(BHHp3nU)pE-iK(=h|VCS8xvXB5yHJ!hT^0GoNU z$n}9z$>9pgD;I*Tc>Hc|l-7(FVDi`+cYn`*>~C94607P(Oo`uz+M~sT!cYbGm((Ur z1f>&uAldKkqh*lFj9HH|W|Qp!asPG``G@cr`Ksv$yge{+(*5b-5zZ^D;LQw>2^fq% z#K>^OnljvNcPA1736>_86qdVJy7a9BDa{&M3MMcsg`}`~%zcj~kK!ScVq_NbspKPJ zbtn(%hF9EpmI8oafH6d-S~7Nd=b?gB3UVN$^AOaaZeD5*uFM$bSJyBf4O%c+kSjsD z(ZE0E=8=85$C*gGLV-epcxmcgx+Dcg2d|{gyK&k96sS01UwOoIGUy6rh=mar{QnZ5 z(UHye{UN;bRamL?5$W-KXe_BSs-Ck*j|^u)_hTU9>5cNIk(}|9|}`dq6XAZ$EO6 zX`a1owKpO8U)gmI){O4|AFLVMc{2X8bK)gW&VJ+`*1YME!bz~-+!J-Dbb3>-dvKU0 zN72mznmOI!=>y)GH+^!419JL9@`v{n-NoGr9H3b=MEQ3-vb66UhiOtrod4UBk~i*K zIPL#m;r25eOLqn9Y}r^;#Y{9O-(EeQT*twhk2qL!Z$h$pC56K@D+g0+hBNA}r_MZ0|O!rqYN zY|WL&W!A;h4SSt^dkV_9i4BH4QGd-dt-L zdep_yqWs6t%|V%4ts@TyM;{N2ul3zs8Jb?bHS)f7bmQ_K!Q8$){kePMMIR>yKf5us z=R|qE=S1N^OpcR#Pssgb?BUAP-2Xt#$Nzzt@5c8a=BtN`Z>Lv2+dGnSY(!Pv3DSB>&0Ae`T?MKlm>*%G!&6I3`DqviW1>|Dw$QFS_M0&HvpKk{7K` z^|rKk%v)AyN!8aJoUhZii5?zglTFfKFcc5Qh8+q)iV)YfQxSHKos<)*k$q-}bSM;o znv%E{_WTZcZ1X;+WA7%WzxXA0HvXlYp1xX=l;q%9f2Q}HfWw7dEx;(rA-N$rCX^dyr0i1}1yFjibxr<*RCF~hGT4>dXS>T8S= zIr52vMu6kb4PnGI4?r;+jHz z)n6lWwEZ2RFokPv#4Pfu*cXuTh(L0Za)2%sR2PKE+1i-_&ywJ})s30r-zHwho*Y%& z`x+4Ecg(wL`(okrU!tu=j;1RwvyhvwtKp}@5(MO32ya^IqGxi~@)F)Kvuove9ZbL& zcVTj-gHKRu}{ytUd&W%q)>)a5FeyWtjN;xF;8I7kbSbF{d8jtLfS zqsPEjgqlRPN~F?(dLfOsR0ZA+lW~{eg2;`1s_oefW@UE{{+h_2Isn2)E!x`8$G)U1 zrP2|gj6A-!>BRJtHVSK88K_m15!eUIl{g^E5aCLr=5XFoJ|>3Kb3*p3O&)}*v_G=v zBaeunMn*CMAg-9ugv$3Gs#o8fK2$rrI(@IRxK%^k6A~?2J}t0Ml4vwy`x|jK( ze)m~N&5GW<2tq^GHNl+tl~~jtkqXKg%~3(bHmN~Lb*V#-VKo%X7`k;cNq0Ell@d$h zm?WDM5841m(&o$|W^>)A_&kLcet^ANo0!qchkHUn|b-zI%w!TF> z5$DGOzLi}UnHrUFes4G`2-ztyIo+gpZCW(zgYk!t8$qz4R**tyGs3M`r_k67_M3I_qkz_~xNbx!@8L&p$(vbU4~zD4$JrU# zaW67a8DEqlDG8iETuv)Jp~N*{e2w?XR=rkl&>5vF)6Xa^I82lZr?`1CM=Q(>O{a?& zjtcPv3%9@|+3?`_4AW<{)T=yN%2@3JZ@Yyljiyfyw(@dpOdC{HqlI4{WhWPDA!t|h zS?iH%E8t{yl-HssQL?~9Drpe&`;|X$zhs^)dT>Vk+JRt|&U*03QawzKiVmSzDI-bn zU9gq+z=mAev6b0FF^JT8v)Y(ZpHu}&i0qju8;qifps>4I>D=z9;MEkNTbN0f?eDr4 zI)XwKZf`8aaGp*r4613H4!)45J`0z>;&dt~3S!*6Rh2Mlc$LgKikYT$SvBFz(sEKcCn=fgE!aZ^8Or6y@n9_K(JPzz4o%5d5tQv}CeJ3(HjmAu zm2z`QY7s4yxSY%-j$g8$)jpYVr4ZgUGKG^RQH4?F2rMgPGw-KC;ak3J4FN?E@1aWy_8xTtMuysh3GP5v%#J{)N6{=-kuiY@E;rsc8{WU&P66lgov z3n+w{^az1w=(OgXi`$Kvk};2tO^6vQ2lUr$-rFsJ#%`|^JNlp!B93as^ukbGZFN

    k)ha`P{Bw6BPV0J;N);O)RM*dL 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 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/black-and-white.gif b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/black-and-white.gif deleted file mode 100644 index 745fd253848183ad3254283f69fb57fe23c5eebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 pcmZ?wbhEHbWMp7rXkY+=|Ns9h{$v3&bwDIYhJlHhMTnKb8UV%q2Gsxn diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/colors.gif b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/colors.gif deleted file mode 100644 index d6e00226bfbbc3263be88290c29607022974faeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZ?wbhEHb6kuRv*v!BX8u}jyRxzv!{SRU?tXdTs8p^-` - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/consumer.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/consumer.xml deleted file mode 100644 index cf74f72245c0..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/consumer.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/producer.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/producer.xml deleted file mode 100644 index f1f3de4abb6a..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/diagnostics/analyzer/nounique/producer.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml deleted file mode 100644 index 302131220c7e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/anchors.yml +++ /dev/null @@ -1,6 +0,0 @@ -some: - path: &anchor - config: - key: value - anotherpath: - <<: *anchor diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/existing-non-multi-document.properties b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/existing-non-multi-document.properties deleted file mode 100644 index faab368e3723..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/existing-non-multi-document.properties +++ /dev/null @@ -1,32 +0,0 @@ -#--- -# Test -#--- - -spring=boot - -#--- -# Test - -boot=bar - - -# Test -#--- - -bar=ok - -!--- -! Test -!--- - -ok=well - -!--- -! Test - -well=hello - -! Test -!--- - -hello=world diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-2.properties b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-2.properties deleted file mode 100644 index 5f49e461d1c5..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-2.properties +++ /dev/null @@ -1,10 +0,0 @@ -#--- -#test -blah=hello world -bar=baz -hello=world -#--- -foo=bar -bling=biz -#comment1 -#comment2 \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-empty.properties b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-empty.properties deleted file mode 100644 index 4605cdfbe6c0..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties-empty.properties +++ /dev/null @@ -1,12 +0,0 @@ - -#--- -#test -blah=hello world -bar=baz -hello=world -#--- -#--- -foo=bar -bling=biz -#comment1 -#comment2 \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties.properties b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties.properties deleted file mode 100644 index 9f2d4f84ee0f..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/multi-document-properties.properties +++ /dev/null @@ -1,10 +0,0 @@ -#test -blah=hello world -bar=baz -hello=world -#--- -foo=bar -bling=biz -#comment1 -#comment2 -#--- \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/recursive.yml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/recursive.yml deleted file mode 100644 index 3d4ca7d18268..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/recursive.yml +++ /dev/null @@ -1,7 +0,0 @@ -&def1 -*def1: a -test: - a: - spring: 'a' - b: - boot: 'b' diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-empty-yaml.yml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-empty-yaml.yml deleted file mode 100644 index 783019e76188..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-empty-yaml.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- ---- - ---- ---- \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-properties-malformed-unicode.properties b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-properties-malformed-unicode.properties deleted file mode 100644 index 8a9e59229936..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-properties-malformed-unicode.properties +++ /dev/null @@ -1 +0,0 @@ -test-malformed-unicode=properties\u(026test diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-xml.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-xml.xml deleted file mode 100644 index 5d3350e81fbe..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-xml.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - xml - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml deleted file mode 100644 index 61c902e2becb..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml +++ /dev/null @@ -1,38 +0,0 @@ -# https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html - -name: Martin D'vloper -job: Developer -skill: Elite -employed: True -foods: - - Apple - - Orange - - Strawberry - - Mango -languages: - perl: Elite - python: Elite - pascal: Lame -education: | - 4 GCSEs - 3 A-Levels - BSc in the Internet of Things -example: - foo: - - name: springboot - url: https://springboot.example.com/ - bar: - - bar1: baz - - bar2: bling -empty: "" -null-value: null -emptylist: [] -emptymap: {} ---- - -spring: - profiles: development -name: Test Name - ---- - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/foobar.txt b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/foobar.txt deleted file mode 100644 index 67d8e4dbe09d..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/foobar.txt +++ /dev/null @@ -1 +0,0 @@ -Foo Bar \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/gradient.gif b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/gradient.gif deleted file mode 100644 index 607269f21f9bf8b6a183eaf414956c60594e0e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3+MNk%w1VF~~N0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= v{r&#_{{R2~A^8LV00000EC2ui015yB000OM00GQsVg^vAS) rx%s+}KiTxN$8YuZH`{*m_Md+KW!K-n^RK`E+4rAcLZc##fx#L8a|1|T diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/multi-profile-names.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/multi-profile-names.xml deleted file mode 100644 index 535f4a7ae24b..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/multi-profile-names.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/production-profile.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/production-profile.xml deleted file mode 100644 index f0c3309f875c..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/production-profile.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/profile-expression.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/profile-expression.xml deleted file mode 100644 index 25d07059818d..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/log4j2/profile-expression.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-profile.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-profile.xml deleted file mode 100644 index 231de8f580ae..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-profile.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-property.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-property.xml deleted file mode 100644 index 74f08edcb49e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/include-with-property.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/multi-profile-names.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/multi-profile-names.xml deleted file mode 100644 index 4f785c163a02..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/multi-profile-names.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/nested.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/nested.xml deleted file mode 100644 index 247229cc0055..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/nested.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/production-profile.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/production-profile.xml deleted file mode 100644 index bb3c8aae3cba..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/production-profile.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-expression.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-expression.xml deleted file mode 100644 index c11d7f9f6599..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-expression.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-in-include.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-in-include.xml deleted file mode 100644 index a03c5d926883..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/profile-in-include.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-default-value.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-default-value.xml deleted file mode 100644 index 5fcf44025c48..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-default-value.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-if.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-if.xml deleted file mode 100644 index 92bb19cd9e7b..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-if.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-include.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-include.xml deleted file mode 100644 index f367385c99e3..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property-in-include.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml deleted file mode 100644 index a574d13df7b2..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/logging/logback/property.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/test-cert.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/rsocket/netty/test-cert.pem similarity index 100% rename from spring-boot-project/spring-boot/src/test/resources/test-cert.pem rename to spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/rsocket/netty/test-cert.pem diff --git a/spring-boot-project/spring-boot/src/test/resources/test-key.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/rsocket/netty/test-key.pem similarity index 100% rename from spring-boot-project/spring-boot/src/test/resources/test-key.pem rename to spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/rsocket/netty/test-key.pem diff --git a/spring-boot-project/spring-boot/src/test/resources/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/rsocket/netty/test.jks similarity index 100% rename from spring-boot-project/spring-boot/src/test/resources/test.jks rename to spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/rsocket/netty/test.jks diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy deleted file mode 100644 index c867cc14b307..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy +++ /dev/null @@ -1,5 +0,0 @@ -import org.springframework.boot.sampleconfig.MyComponent; - -beans { - myGroovyComponent(MyComponent) {} -} \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.xml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.xml deleted file mode 100644 index f66853848fe0..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-beans.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-namespace.groovy b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-namespace.groovy deleted file mode 100644 index 5404d2f80ca7..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/sample-namespace.groovy +++ /dev/null @@ -1,7 +0,0 @@ -import org.springframework.boot.sampleconfig.MyComponent; - -beans { - xmlns([ctx:'http://www.springframework.org/schema/context']) - ctx.'component-scan'('base-package':'nonexistent') - myGroovyComponent(MyComponent) {} -} \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/jks/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/jks/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 zcmeI0c`(~++sBhg1SKS>wY8N}TkN5SB3f&Rs-^bOG?ZFmS7NK3T3aeDe?O zAP7VcpyJpH%awavkxaDo=c06?wwZvy6A%E>Rptbeo|eWGOv?%~HIZRO!hidqV`V_& zT%E7G6WyF~G6*EgZ$T(4Jr?Kc&adI>?JmQ7ywGusftA(_S{~0*JN^A0acK`f~ zhLzsc-4W;N0YU&Y z;Xq~pG91VN3I_rK^%hFNu#-#uchOu0C81Yb1T$PF^G9e`u9?bJUu$OJQlq5tPF`o{ zC3MUU2pEf8zgeJuRSUD9YS`S)+l=JqiT0y?MvJPeTH!L9x9PNINX*lr6)fObjirmd zd20m0)h4Qz*qk{G=v32|qDC&WOEAyiaRA;`y6=M~8k3eqA7)Or`i(wOJzbF}=bgRI zSou~_x|~%4tmb~b?MY3tZSY9NMb%(tRMQYE?kk5?vW<2$j~?2>GqVDJCf+{Bu3AvA z=3V?q32>@J$gZc%y73(BD^q|rBX?(;j2_V~hd7hrHM^@0KOGoHpWLBoEQt8({;~@j z4UA8Gg$@@<0?_~gz&s-)26^guw@<;qC&6rH87)h$y*5_LS%c_Xn}OJSYu1mE62DEu z!NN$P@ISXZn&r4%|2lxt;E>~9{cFjOd+@mAKmdcblT_+MejJ`A$v0+V|&vU(Knyb-_UPUUok+VWdi<6$iGN~_!v|7168uQZBsX`dnWFp zDj6`y6FoFx6I>ToAswf;V_Y~?Nq6bB3`_6XfGjljNyaHeIK8`YGhG83nLX}{Hb2Yd zz#djXZKPex6<#SGMt^6f?v4>hF`wzw^Y+-Gk*|jex{Y$m*)Qh1_5JF#AbIPF+*luV zF>x~Ol6MD>RPur6^;*ajzgCec+%b+ayO<2mYN-0sv-6DHI`;0dT!{+@CeSiZVZ`7( zGP5=W52Sw`!}$5L%#=z}woIm>NHA0>)2rF{Z?`YYSPsvr6k4f4fQCT&8K-G#$sG3%A< zxpZ^Yx|?;wAs(V;g8f$U@@KBSnH6bmF_*Tu?6=#l^O?Z1?15TkytxuZeyi2nY8n5w zcK|K*kU!CUj)PZ-&~XhnPuS!sJqsSkExz4~5pcG3W9p`12!IH88KK5M7R zF_|OSdqiqM&A+{6K5$-t6?x?KAsQR)$WXZ$IcvxJnW&0=#9A;N*A(#wf z`aCKNX^n1;2%8WdTH{SiQ2+d`6kINwK<`kjAAPX6EukBSw;q@`iH1A*49{4ZY@UB{ znLS`>`G>$>K@Hl3)G5#cU7U=mHLPl#8`L}3A#g{rb}%?4p&aujNXtvt^F_5Y=i+T2 zRg&wtg_!|amO4}fi+Ad(@n&#Jw*R(FDP3z;(%iBaV3r8uW;`ObW;^+E3w{<_fK8;f za9AoE&u~~a&MRm=y(zM4%5pf-T+yr7@Bs1pMuC*xOp)k1HaR2lG)+5|tG6@&ubI0= z=IDHHS5kuIyAXfv&`y%C*dKQfNtCBOD|@fvJI%tAJ-kD0i=PIp=jLWi=Ld@QRFmXQ zd=k*Dhc!B=n>}o^gEi(deUV*Jr=}8h{LEb?%BYxAl$%u58C6dyover7MTgJugn4qO zreCn}PMMxNm6vG<$a=lgAqG#%=Xow)46?7qZ(6-rkTYl}+{XOf* zPMOGrjG6*Pu*yC$H%)x7+6E?8*#8RQMT+rBn&UCAT;wqW0HJCbZhGS%zuKnr3bZiL zo-fq&0&P?0-h6ne{7i(R)4J`{E)xn24~JjyKXA(T$nA$&VaaM`J>;y!qL-OZHL~V} zI`h-c5Tjxr_+%?Gan{@u?Xtoq)n(GJE$9Wm+_s79qJO7x>t^iPV)q&v^GU7d6rFX< z0>-Jf?Xt@QZtZ=FjA_{^g1X_F*uJs+hbrVZ=j99O0!w<_UecBBZ|X0;3eWYhq8S>3 z^BHZQLkf6Mo*;$-qY4Cx%Hu8w2r;6aK|7^J4n1UZ0)g4T$I@<+v~?f;ia$%WE4gc1 z;xeN)U-a8}S;>y0p`eO^Mv{Dcs%diRw;Rv5`za|?yQ!ZW@iH!$Y{w3}AvE(d=#l2w zNs_W=jq8AGK&xH!pb5))IX0AVdtU_(!dNa|+tF!_CD*WEr`zV5vO;gO*-JFfpZEOQhQ_B)J5b;G_cLN~qJ~W{ zVQfCGbc`&bpJ~nh;Ol|TvsB8L6}I0G$DeHTe`BqmZ1aM2yxXONbAWjG6@b!2Y9M=ic3T z(e|(f{lgSy2xToEQGKSp(Ro`XnicT+MtEonb_rDG#v#th?#DKyWu?mFj$&aLtI&qilAXJh4 zuiN!PTt~1+vr?EaHvaHWMpzVn5TuH?ea07uYZB62Yd}+|)Ga0Zxr%TizZMLs>N4s?`SRLbcj$qZ$azx?@TyaOz{m6YG+$W(m3nbt-UO` zv2FJ(#p2Mw-xImTIoFE{Olp2w;K%XE|GdN4w=U1a&$a4zcK1HK-wXMu!UNBbD7=UB%q=V}k|yh_hPdd>h}8UtEb`*lZ>e_0e{53g**(170 z;~+?qu(tCd`<5DBT$`j_h7dl?QYe__Elw+5c}LZ2UE}1VGQ32s=lD&xe6n7R_NmS8 z>b+sZKN>Na`quY=9$}cyWM-N8&}Tfj?Md%G4)lWu+7`5v%>Fj4gyGFBQLgijIrO_9 zRQeJV#Oc~>al9Ag>EL`$2cIm64vMAtlnz7|uIkg9(z|UO>0KLzg(_!b1Mg-|vi6_X zW)J;>Z?~70qJs)dNm(UepaSgj0gt3u1n3;K5og6O%JuSoExD0FdjX&q%s8)q5E z!;e>9jpt10hO}Iz491smj>PPoT{%@IRgmVLM7C^pEhMgFJ*xC@3liCzVy=Kgui=6z z6*XhwACVbnLfI=V7RMqh;;KT6<+2CA&^ZanLTljZ*(f{TVT_~S^M2A``^4Zyr7gPW zax~2LY7 z5fib}DfM!gQGex}df8B98E$Z*Sa?5?V`b^ju_-0tpT zXEQU0vilJoai-~%hXTa0wr1Q@W4zDY=6gUgKU?GY8H+Rlz*_hKH0lj5Bc=+nj0~{5 z9M|mNUGFZceZku6iutV7vcH~^zClzzC1LS!kFn*JhWW{~J;f_F1~S+nQM{YR-Ecf) zPlZv_N`5$sdcC9d!^2YkyDbWl1`YmvS9KvNr6Sdjrj{d09Y1my(;nf;*>^%BRav@y zIFf@@7`$HRfg-x675REhw%yJ+8yAGv?DD04FiJ|iaAIM?GW7mZmIuEk{i}*{sOG3?Da^m|K!^=>u_NREfN72C40WWtZhP%jCV8EHjTccLtlv6d)6!) zMC#HmKQH$f7_)?_1O}blaH0qYhCWh#D!Bjp;l3YJifDBDNrfS}O`iy_Z?n+d%m#wU zdvtb=4&36Cv}lrb*^OI=WN&x5Zu=4Hg@oZW&1y>+_kG9wz=U7K$S{2Z@i2O#Z-CG} zmic1y!AnDvN9RL9K_nZaSoL*Pgz(6_9^p?<>4;^WVohv~>pd8l&ZVFaNxo7k4~{Nv zNltt@cxk&M#l_#yX`|dSPv;`pJibX2!m<(;Be*+CYAZC+uNK>sJXS9V!2BoM{KbzI uQvcJB{VD4|{Nn%F9{wropR)e%kaZfqSV?_q|IPq@Qf~@?+SM7H@c9QQ6MxeH literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/test.p12 b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/jks/test.p12 similarity index 100% rename from spring-boot-project/spring-boot/src/test/resources/test.p12 rename to spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/jks/test.p12 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/dsa.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/dsa.key new file mode 100644 index 000000000000..93a9ee56e4f2 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/dsa.key @@ -0,0 +1,21 @@ +-----BEGIN PRIVATE KEY----- +MIIDXQIBADCCAzYGByqGSM44BAEwggMpAoIBgQC1d6MOqEDLxjfjz1v7Vg44bBBX +VOoNdWhvJPl9NL2Js57UmYGrTqFit2VCLxbS5FVLyOZ25S0myQRsEtKyi4V9+ELI +0q3oQplm+l3tZqKjtO69ZlbzYSl9IG1254/FCwBnBTuN7Vl6A2vryIhY7cL4E053 +Yy0xqfP7swPgMYNBqjc9c53hNHKiseQJ8Q2wFKZqm13xgqnBqmWbm7yNmzKJbjMW +Zt3/WpJdjqfRnjSljFOkYPPBkGRUIKHcZ9fw4odVov2vblGzXwR+sFeE3lcF50WN +uppjszMXlqR4y937CUSFbCabatRHEcPTq/FxioERCrCdx3AKOfwAquahtvWb9V7A +47FlibDDeybh5jCH0j9HSjhjSiDZdadSgGKFynPNlVAlOETZKGqkeqAZZ+dsPkVO +n8tx+VXZJF00YSe1HLKJUWXaT1tEGF6vw/dXhhQVir4j63fN2tZdhTOW1ao/J/iT +VYEQQjYeMKKuZQveBKRBlpAjhmjOztbE8VL4O/cCHQCxPXlCpORbfOMEEGU0hbEE +HsxFHMXHCnURCJxVAoIBgQCBqsk+z57UndC1Ut6u19wILXs7UBgLo0ivId2QHtm5 +kY77P9/lNOyCIQkBnULbJ36lHm6yxLZ8imyC5Lc7wlFJpJ6PpiTJ3nPi3fzhbftB +2KCJVSwB3XfkjvyyS8bfwwqyrmce9el+AIFJuWPrFSkjNthq7U5vU5a+uNT9XZrs +EaDbjkjVJXRX1oDS3IfWXWpb9i/LOE9HU+NfDKfydasWASvwNX1F5BKXD0AH9adj +9Q7b0p4DVTh+UPWLBk9/e6gsA5HaRI1urAMNxs5Xnmd8UYF1I+AmjQ9Mi63Pa0YW +QjpdH2hoOQGLemQ/72woFVzLaHWBcTuSwjREilaAA5M8CWq4rpuA79MrcHgzSp2C +W1gtZa2/3SymcJ7Py2PHbncod8gR9dxHWVO07ccOXUG0iL9m4MzQ27uVvTh8Nrma +M+JET778E2FaAkAIT34eNMC6Yk2IDrxU9L66FFx3+3n0cOeWaJxIWrIQ6uWk+uIH +VzPsZAQU/V0/QBABlHuSj1cEHgIcYTbB5VrbIgust0jVvQCnlF4b1V0qz2iDJt6o +sA== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/file.txt b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/file.txt new file mode 100644 index 000000000000..cd13893fe1e5 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/file.txt @@ -0,0 +1 @@ +Text file to test parsing failures with invalid input diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/dsa.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/dsa.key new file mode 100644 index 000000000000..a30fec06f820 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/dsa.key @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQCDX+Ux7y7dkfCnQgRIXzAlFrG8uPxwFdC8J4FJNrAurnjL//PV +8LEHBDVbyPjHaoNbH8Pfc2pJnOzndWZVf0nqBd4Q/Tz9w/pJ9g6E8HOh+rzU3eK5 +mF0rezcMbJsot2Vdx6XrTztDKi2GY0etKNV399DYtepIYA6v5ovuYAOjLwIVAPyb +9zR+UjyCkBwESDm9dpzKsGp1AoGAS2vtTiO7/MT8cJwo4mxYtiJnV5R2mk1JJOTe +4AFPgmnce/YbBzU2JwL9J9HGewDkmxudW0zoxZVeNw4dRua6oB5STV8XciW8vSo6 +mdDBJFoBW9/DUscRP4j2aRfkXGlYuiEF6ZT8g6pPHZG7pLviihMAWNRVLmBt38wa +8FA9aZECgYADbfwh7OhSE1J0WRaEk/4Usos5Oi6fhUyqr2u34Ereug9Gt4tkhePa +b3y31i2PQfsatpR+4VpBC6zpPgHQYpuqlqDRWJCd+Cxo9751nOiA3xYVxNoiwIn/ +WxoUkC8Jv8kYFAJRceXkF/auVh77MUoruAmoT2lGE6zP6ngP2q6jFwIVAJMF5kZ+ +AUZbUBUpZaPuZ15RL8GF +-----END DSA PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa-aes-256-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa-aes-256-cbc.key new file mode 100644 index 000000000000..4053ed5f6e98 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa-aes-256-cbc.key @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-256-CBC,2036BA8802B364C6BE415A48E1AC9966 + +0euP/daGIbl798XGc2Tc6u6NmnCl8C6hE0a2grO+wbvFEa13IT4hNVNTzqahfLb8 +STF9LXdvPbz9HybyWnG8KNm5sqsSY1omsHQI38khhwuhpHuWfjb62TqWobwrAmAU +qh2+kjc7upzW48axJLRQ69vfE4zKczZ4Sqv8qImPz9SiXPeaXinHf/wKfgXZZOvr +6A8nCykLglVrFbrZWydqKrTM9w/LTXsn0gNpDmrfZERDgWnabKnjYidHkXdgAoFy +ulsBjKvj2hJFtnJHTkCPXj6XAj18cwUWsN7inFJR5wqjIWXuLqfv/fNbK9lPzjAk +vMTEVWwynekvXFsSvnHAyEJfmRCNF6DOE+5VwjEROCFq8xceK4fz4T3BHC7XSgis +2ofBZwjCAJ0pP6SdRpbbZ0wlXH09wqDDTZ2vWD6bEG7hO9VuP/aO76MIWydLa78z +bDb2R6MnYKmYEInPzwfU4H66Z3/cz8orfYLlnF55DRd4rO+fJm6Y/XY14ac3x0S+ +P67s5e0WbdImagUsOxGNBjgOr84lwmtk/LoVd5nKho8JyQw3V7tiyrsKsM1lAXdS +TaJXKRnN6LbgC8d+Tgfjc/qMUdVqLlN8zATIa6E4sc861DDiJsneXuFm43pHc/ja +0sxSifBKgLGenj8xY5ANEfrYnXKrzaQemUnMzd+zan6OS02I+e8WTQevESt1j0D8 +7mgLJ9W2SfNNfiEd5OKar21lLNOc3POaFn7M73zL/gyhTROipPR3fpV+08k27UKl +nzGhFtRwQieXl34QjM0JrHokKKfv8FsAJsbrGnz2/wcm6jJGmrj5VVsogMKc90v4 +ZTM44NAKymM0UTuIp/rKb/UUVYDpl9VWDegWh2+XKX8io31ENrDMcvQTJ/mzNCuZ +SINrAeMbVD6W5L0i7THEt32YsDmbFsBaEJBlNXlUNBa/NCK0pjwAn5AYOFUvEqBC +oZUEleUMU6Q3TKI287o37euw3No6jo5VdPULlrwHsZAjmq9EUvRCgMoIEPdxv5XG +a4PljE7DQLlk6G9d+gjRzClLFfkadSTbtH9o2011RtWUKP4dcRuSOcBm64xVIO6J +rhe38sE3yzHvLUM/mvLsEM8B0AHl85nrEstlbBzftXMo2CAJ2Gs9c61PYfft+xiT +pRdHx4HB1P+kfHa96ayvAytOexHih2iVKVG5CchOr5tbWmkhXVE5cZAKzvczDYFd +YvniHNiqt6LO8EbJOzz+Yxessmd0zBXj/rjxTMdGwaRjiFI0BIguYpvmGoMS8+bp +spRj2DMtqjNZz68BEEfgKQwDHPCTblYSR+3Uw4sja608sflqQ8rTmOwbfta3SNS8 +Kq/zzWfYzarQ8hAk5n/H1Jm6AQdvcptyMjuF8FAiMnvt8xDCBRMD3xY2BHb/tcs9 +dBWBxhb76CKIrV3pzm9gGhhZ32Ndq9KmmE+bWCYyvrLxvPJxODfM7X5XamPmG5SH +wEKSbp0wPF0b6vyxt5M72OYnU8UnxYWu6PlbVvczfWEu9fIw/oIN/kDT/QUojTyt +wBgzVSTSNFaDtVXJw10IWQgsgWdNY5XueHKH060P5g+14woxU8i3TboNd+tC3hRl +-----END RSA PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa.key new file mode 100644 index 000000000000..cf847bcbac64 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs1/rsa.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256r1.key new file mode 100644 index 000000000000..d17b664d739e --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256r1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGIAgEAMBQGByqGSM49AgEGCSskAwMCCAEBBwRtMGsCAQEEIBfCkWEWyc2tHIvS +Ao6hhcj09dnh8NOmtZeqGmcXHnIqoUQDQgAElux3elmSzb/WqEZXb1vdXx/tcIpC +Yq2vewG8H1SikMoACeFVRcjuy31gJ4Q8M7UQmrR4+WXSptV/UQ6Gkt3XuQ== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256t1.key new file mode 100644 index 000000000000..25bca43c321f --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP256t1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGIAgEAMBQGByqGSM49AgEGCSskAwMCCAEBCARtMGsCAQEEIILhgc3joEZDWMDm +9TYgrENN7gbqtMpMw1e2MTLwlJhCoUQDQgAEiDN20JP8O9zSK46tP6MkXJPNAfyN +IQ0hOgcQ//Fw5V0yiSU+BPGeDoIDsW8LnElS1hIZWq0JVQNZge5ei2bshQ== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320r1.key new file mode 100644 index 000000000000..e1bd06c2793b --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320r1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGiAgEAMBQGByqGSM49AgEGCSskAwMCCAEBCQSBhjCBgwIBAQQoNifTnb4a5dOR +yr8QFVM7Zkw/f/AMm5T5PQ6iVTCzrnw/kZ8glwl+JKFUA1IABHSnWUC/tKXpNHGE +P89QVKEgvetwCQWFoOENAgXORniLiaLdAdsR80ouTsZiFgHG9su0l5ESEnFWQr5x +UMj/vPwwhSYm+YP5ucx5NezuBM4d +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320t1.key new file mode 100644 index 000000000000..5d89229f12f2 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP320t1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGiAgEAMBQGByqGSM49AgEGCSskAwMCCAEBCgSBhjCBgwIBAQQotGnirBX69ezE +7a9yIBQcqeCMm7hc5YAG8D4396ytBa/2/O/lonDlOqFUA1IABDQHDepa3l/S8Gt9 +WrNCNpCPZNBXvmkGPnVXZchZI5BtUySwYxHX1tpatGs3jY7drVYm+NyxZE81pecY +TvXR8bu7e3BIp2SwZmXEDxdYp1fw +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384r1.key new file mode 100644 index 000000000000..c248a0f0d448 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384r1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIG6AgEAMBQGByqGSM49AgEGCSskAwMCCAEBCwSBnjCBmwIBAQQwK6y6NydLMTNm +LhDNPyTDKEemTWTUuMGfBQxEz+lQKAqz/So4uA+fQzor/t8to+uioWQDYgAEaK8X +3KCyRDMpbACw2xG4UUe9OxyuGWFaGKPxhKJDyW5Z56gT5P1Q2y4CblL/X9VcDIMX +dcQqRNBkPQfy1+fJXwKO0ClfD6MIE3bv6PTZ55J6H2H1dpg38a2soRchz0FN +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384t1.key new file mode 100644 index 000000000000..13a4e0c7b032 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP384t1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIG6AgEAMBQGByqGSM49AgEGCSskAwMCCAEBDASBnjCBmwIBAQQwBGUaEvTtnxm8 +fOWj2c2cX4991rvGmfGviuWWQRblSii/v9FG4nQ4Q2IrgBy+hgK9oWQDYgAEQL0d +QoOTArIx70V/XxipoxxBeKT7zmIe7id5pQiw4O4nA2S2BFxQF9eW9ipnm6DaN6ja +X/+2k+cC4qIfqzeLcLUFXxz0qdec8lNNtr9QmwoQlv11beeHmQu9C1GwHmvG +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512r1.key new file mode 100644 index 000000000000..790b619c365c --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512r1.key @@ -0,0 +1,7 @@ +-----BEGIN PRIVATE KEY----- +MIHsAgEAMBQGByqGSM49AgEGCSskAwMCCAEBDQSB0DCBzQIBAQRAmEQNFMGIDLoj +Ktdg8V71WdSs7FiBkE6Bft25+yY8ohugk/u8aKeIKNVtSirMgQhGFJy/BIBkvM6V +1JfnrglkjqGBhQOBggAEYbjTnA0x42NdM7jVv7jAoZq0iOYopbwejlOEsx8/MqRa +Yt4Ef83holIsgOHWSeW+kw1oMDmieoCrhnkM/3KgGzV+BxCeieAWGxABsj9YhAmb +ATorRJ4q/pMxRq8gIUv05/dGuUttl1gdbKKnGQjxDBM4v5H+/4z00nzzj4Gbfx8= +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512t1.key new file mode 100644 index 000000000000..e4343646b3fc --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/brainpoolP512t1.key @@ -0,0 +1,7 @@ +-----BEGIN PRIVATE KEY----- +MIHsAgEAMBQGByqGSM49AgEGCSskAwMCCAEBDgSB0DCBzQIBAQRATamyZ088BsIP +Scslwa0I1xfC0/6udycncr+i/QIFOXNr4OQiVb4KC/CS/2FPotVMFSHZfCS2bgi6 +Yvg3Mta5SKGBhQOBggAEm/uIqsytMZypsqCuL0jwZh8xCRVEkUd02YPXcOBhMzS9 +bhAao4CLAuXhWzplr5qk/7ttvczl7qFDOvBzNAIieZHwbFrouZ6Pew8pQXRcMDB+ +FnXwNgpljTNmz/f1ePjVKU1ZgbQ+xVf8Qt8OI9S0Pla8siTgbVweGMLtq0A8Wuo= +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa-aes-128-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa-aes-128-cbc.key new file mode 100644 index 000000000000..5ab8a9217ef0 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa-aes-128-cbc.key @@ -0,0 +1,23 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIDzTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIJ2oQD0S0aMcCAggA +MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAECBBCNXluHkzV+EEdxlhmcIAWBBIID +cAWJ20CCQlOCxxCddujc5gPPotUyKTbXA7xI3J9DdjrqBaHrNY/Yii4Zxk9lpzPL +3x3M3O4C8nJjk4OEA0fiyBYOV1d+KZfa7UZojIe/e+7BuTH9WAvgVzORYYEFX6x7 +DTTmYH6VSej/RBdNTV1KeWA4+20Zn+vqCwcBG6R78cQDP3xGOmT6jOAQR/0kkqEv +GN22UGpuMlHb7SDiYeDRqQPdRMkpu1RZS37MWEZ//yuwqEyaowK0JgTVGKyibf3E +qXYV7TqEumdfrpZxPXkmJwswUSoFwE1wM0XU5WMg+lnNiroaVQjzqLEEqENpJ03c +Y27l0m83GRVvISvwLGOKY0Sbcb2d6NnqBjbVjbJopjBrww3iiTUqGiQZTFjiJ3CD +VNKdG3HPWEdjZG5xoF9BLF3ZVz/jrfLkK2RcZBs0U6SyENd3H1gOk3yv4Uw2VjXi +h/PA27oFJ2I5DN9bcHhbKVMFykc9JZbisDO0TNx6gbVxZUdNEER0nsP4/sZCwXp+ +K7rGvrUk17vBesp0K/tTfdBM2xVkV6oCMKPeQpsdekwCSAdNamSpxZn5LqUaX+Gw +bMf1FxTlIL0ujLiN6/U3VWxLuJuoJauFyM5wYlpqgBOQIszVREQqMOs/Zp1WT5uS +VUA7tdcIpSE7aA3q2rg1BkaiLMSEBMY/XWAI6SCj7iQyRD6GDse/ayJrQ4rUPvD4 +iRLQN9B1BYwAplGX3Cmi++Yos7tOq8D2HfTDsI0bHAi+oSDTRUAsiezx5QRLgrp1 +pO2dyBlJ5HOlK4SA8h5CMlk2fVgCLGCZ61VcqF1DHu5NKuCnCR73QrwuZAPlo19L +Jt1YAgcXBfFoSbjAvE+AXcxu2uw+t2kj6cjGRSRpBNSHCn3bJ2zu0qrPL3lOMhtt +DYp0QNWJkW/6/fpmXXAYQQv6bFY0Bia8Ima9LATcCwpYcRox1pL2rvU1EWLDVy6N +PdFdlzLM7UcrY9Vy40gEj1qz9epAXqzfPkmbyP3i41BjKlZfmmzpJEI6hIJMtT6T +xWU1Kgg+mAED6STAJ6nem2bIEzMfsNM00VrHXoLU4IWPCe8NMYOaVox1xBWs1mer +lu9dgGBAy4/gn6v55XzjQ4R16wyiiJn3ZQGrUD0AE6N2E/tfWiphVG1tYDjjWCLv +bXG/U6P6DjClkBocb4DgKBc= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa.key new file mode 100644 index 000000000000..93a9ee56e4f2 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/dsa.key @@ -0,0 +1,21 @@ +-----BEGIN PRIVATE KEY----- +MIIDXQIBADCCAzYGByqGSM44BAEwggMpAoIBgQC1d6MOqEDLxjfjz1v7Vg44bBBX +VOoNdWhvJPl9NL2Js57UmYGrTqFit2VCLxbS5FVLyOZ25S0myQRsEtKyi4V9+ELI +0q3oQplm+l3tZqKjtO69ZlbzYSl9IG1254/FCwBnBTuN7Vl6A2vryIhY7cL4E053 +Yy0xqfP7swPgMYNBqjc9c53hNHKiseQJ8Q2wFKZqm13xgqnBqmWbm7yNmzKJbjMW +Zt3/WpJdjqfRnjSljFOkYPPBkGRUIKHcZ9fw4odVov2vblGzXwR+sFeE3lcF50WN +uppjszMXlqR4y937CUSFbCabatRHEcPTq/FxioERCrCdx3AKOfwAquahtvWb9V7A +47FlibDDeybh5jCH0j9HSjhjSiDZdadSgGKFynPNlVAlOETZKGqkeqAZZ+dsPkVO +n8tx+VXZJF00YSe1HLKJUWXaT1tEGF6vw/dXhhQVir4j63fN2tZdhTOW1ao/J/iT +VYEQQjYeMKKuZQveBKRBlpAjhmjOztbE8VL4O/cCHQCxPXlCpORbfOMEEGU0hbEE +HsxFHMXHCnURCJxVAoIBgQCBqsk+z57UndC1Ut6u19wILXs7UBgLo0ivId2QHtm5 +kY77P9/lNOyCIQkBnULbJ36lHm6yxLZ8imyC5Lc7wlFJpJ6PpiTJ3nPi3fzhbftB +2KCJVSwB3XfkjvyyS8bfwwqyrmce9el+AIFJuWPrFSkjNthq7U5vU5a+uNT9XZrs +EaDbjkjVJXRX1oDS3IfWXWpb9i/LOE9HU+NfDKfydasWASvwNX1F5BKXD0AH9adj +9Q7b0p4DVTh+UPWLBk9/e6gsA5HaRI1urAMNxs5Xnmd8UYF1I+AmjQ9Mi63Pa0YW +QjpdH2hoOQGLemQ/72woFVzLaHWBcTuSwjREilaAA5M8CWq4rpuA79MrcHgzSp2C +W1gtZa2/3SymcJ7Py2PHbncod8gR9dxHWVO07ccOXUG0iL9m4MzQ27uVvTh8Nrma +M+JET778E2FaAkAIT34eNMC6Yk2IDrxU9L66FFx3+3n0cOeWaJxIWrIQ6uWk+uIH +VzPsZAQU/V0/QBABlHuSj1cEHgIcYTbB5VrbIgust0jVvQCnlF4b1V0qz2iDJt6o +sA== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519-aes-256-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519-aes-256-cbc.key new file mode 100644 index 000000000000..138b58e56f64 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519-aes-256-cbc.key @@ -0,0 +1,6 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIGbMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAi1t9NlcmE8TwICCAAw +DAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEJacGnDl5HIWWbv604Vp0CUEQDEx +jZKBJnhmLTPMJbE1TgVe+9N8ZG1CVpSFz0xo9xCk15G4E9jgxXw/a8Sqy7NiDqRb +FLJrSStMU+ygP7wXIFo= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519.key new file mode 100644 index 000000000000..a9bf1bfb8f98 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed25519.key @@ -0,0 +1,3 @@ +-----BEGIN PRIVATE KEY----- +MC4CAQAwBQYDK2VwBCIEIJ55hBE+FwS4M3k/c45ZJKPHtsklKrb6qJlER0cMJ2rn +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed448.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed448.key new file mode 100644 index 000000000000..934617d4c1cd --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/ed448.key @@ -0,0 +1,4 @@ +-----BEGIN PRIVATE KEY----- +MEcCAQAwBQYDK2VxBDsEOSSF8O0uKk5pRrjUNV+QgonwO+WeDRb/i1U7vM+TLzh7 +jAV58E6oglA53konKxGv+GC38dCb72gSeQ== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/ssl/pkcs8/key-rsa-encrypted.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/key-rsa-encrypted.pem similarity index 100% rename from spring-boot-project/spring-boot/src/test/resources/ssl/pkcs8/key-rsa-encrypted.pem rename to spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/key-rsa-encrypted.pem diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1-aes-256-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1-aes-256-cbc.key new file mode 100644 index 000000000000..ec364223094d --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1-aes-256-cbc.key @@ -0,0 +1,7 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIHsMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAjZ2eXtLFXLdgICCAAw +DAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEIlOTfeoLwq9Bs9TFtw7VSMEgZAU +RO9W+K3vvzRG4sACrcFaB7PMhv3+HUOcPFf09QHa7aSJMWsb8EXGFBK4xlFhkK0/ +N0C8sRtH2N1JdYj9hiwS7I8WyybaR2W0ZALNR57iLz3WsOGQ7nVECFprElboqnSW +BtjkKTD9pz3xX/6cMkDV/2WqbS6Y/dzWJTH8yTTqjzTjbs4vguEK1Io6dlIRVqA= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1.key new file mode 100644 index 000000000000..775a7a0fcacf --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/prime256v1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguc9upTMQn8b+loAx +6c8q20dHYBf3V9374I3kJIDmC1ShRANCAARnLuOxL7n7Gq12zd9vq2neAv6PYc1h +W6M2gJKSbfFYGhte382jOJ2TgwaTQL/J5IPSfuJKkmAPBIl8CdJKWlwA +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-aes-256-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-aes-256-cbc.key new file mode 100644 index 000000000000..638f6fd3fd43 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-aes-256-cbc.key @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +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 +-----END ENCRYPTED PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-des-ede3-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-des-ede3-cbc.key new file mode 100644 index 000000000000..a2144172fdda --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-des-ede3-cbc.key @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIJnDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQInDrn6GvZlw8CAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECNwtOc3eKItmBIIJSNZzJs9X5vLX +1PNFSOjg2bDJFXWJ4X8vtnA8g0JsK0+kGmRxg+FlWXTqAGJbm0imoE4YSQ0NXkfj +6eFtgebm2zdRRfbABJX/drZMSIDYl5Le7B/zqIeI9cO16GDEbyDam+MXD+mRt3Bk +J4JyJPCin22nAtKb+D0zHs2F/9Iwi+3IYL1awvHspfOQVwARoj9Jc0K98qtGSa9M +KikC+0LGr4zw0fOSMzrhijg5mqi8wTsYn/9u5+TkQ8cwg6cBKCGCjNOi7ml6uyC5 +LE4dYAcSkFbbRRNOuM/RYiKxFpGAFrfxUVfHI3dLjDe6DUAN18ZmLitij2WI5TcU +azfFRYMnkmI12Tu6JeKrFrhQOt4gUq1W2h5KwvKvZAikRvc1pE+X8h08S/kAwsUb +PuxgAN54myeHIGoaxG/C1ImaRoSPquKVoayJoIwDQ2kKJJ5EdXFJ56SyA1kYk4y4 +Ohv+kvk47ZAwFZnNz+Lt+22uFOnrMZobv/jKsTRfJsz0QhwmTIaB9C5QehkAeZJD +6M/JVjRWoLALcNu/S7imzbzNBS4r1ctYLv2dkakzBhR4o5Yfn4sg48p1x5EBTTre +6X3/qWH9z1vtpJsjC7vA4ACkLaz0Vb9Tb9No+Sjjp2xi6arJphMwjuZ0LPf0EuVd +wzbkRHXzpYMACuaypNaTQrNCgpR19eV98SThrf8QkyyKD0qwtzwoTmGX45FnGFWy +H8HL+lZzfpA9zzRCjqLGeTkgQJLIMP0orD9kkVYCHtUorUQPr8MIu/o45PKCZtNd +++kaTm8x+wjXYNK+cyOnyda5rj3XsMYqPnMtdg42cHu4oODEV1JH2fl8sXpuGB4A +7qsSBORrZJiPEdayT9Gsve0A6Vi7gGK+9a5WRxqS2Hlbgr6lgqUr8zX1YYi6Ace3 +d2GhEqNvyAX+6Cp9FYH7JauKtrMf40LxCNTpTmhhrhwS61nd+ka/5e8v6G05eSTA +ESbBKo+QiE2Ek1xfrfKlsc8IcBXxmPF5QQ7Gb9eGI69myPRNTv/XN4mnvA8bZF8k +KqLp3lO6Y5jGKHToooViTDX0WRApJF94oaefuUbDJpW9foaOfZpBz4yhLnY7syTd +n8LNRYbMHbFbbe5eoGhb6goHD1R24/SeKumDpzyj1HewcoYGP00toDFxijY/AA96 ++4HlKJX7JJEDvORgVEZ+tOGo1xplagrndpKnX+WsFzvuPJ3RNFifbkp7iRP1W6HJ +Gq+oZ0ewj3z4MKi0s58BgTwQENRmLEdp0G1nyYY1nuRmaq+t1IlvR0bMYhTARqcY +GAdHdwJN6MXQWFyqTQ8L9N0OuCpENposKBvdUcrSFAIALafX+vJrB0aS0ZVM5w37 +yiskAa1KMqo20XTiH9z3awnKAVZqjY0oE2BTehdK/NWgaLH82AsxFIMFmN7GCyY9 +QOIlzceqRlltJ7PsTmvDN+pRaO6KdcbtO/7hsvUgZWOs6x21JRQHUShDNB765dlE +usuEl3T72TBlTdxQ1tj4fA0RUCAF1T6B/9aW/rBsPTQIBLyJEr/78m7lBKmgQ+2i +REjuQC8NYkzLLa+fOiIO9LTjPqdSpzMCqMIbjiR1eYMJHFoP+8E2gAqKZBDOaNoI +V5tfZk+/Uz5AIYQocd1aUEQCgyf2WJLp2B5boO2lS1qXBb4YML/D2L7Udz4JU3Qk +fkSlDC4zx01XdmmbGedBCGG3npf/pCerrHcaPJUWOjMk+M1tR3Mpmmm+/yJm4Xyu +bPcvV4pEqlfBsIjLCt6xyF18vuF458yB7djtZJ3wkx9lLbpLAh/z7ywoCF7B35nQ ++kUjFBsboV+1J+9sK4bULrtYOhjxAU1P7Mpq4BbWbRWBWK9/Kz8maeCrLEW/tpnk +EureG7aZtwQz6vHyeDDQTpFVdeSFO4qFy7Pouf/VVzX/eph/6y3ZDsjYfxFiUD6z +TV9aPs8WDDcWhd+voSQlBlBB4ttspQgZhefCScu6hhW5PNVFyNm/TSHleOEBXiEf +0Ab4FeFkQ+c1GwhtvsmGLBP/2VzkkDSunO2QDbpNYGzR2Lsn56JQjeKwiTHblzRy +AwSJ4DU/V7S2K4wu9QmP2SefrBJTlbLd8VFbwAGAHDeM5Xi/TnleaQvUPGz56F5l +moaYsXbDQGlyA+PYs+CCa9rSfvppX4EwDIftDqxAzEAIbQJir4VEiPpE/CrJtUc0 +JMI6ug1Cpp1p2U38y+POyv42Awk8M3KOPUvXxQkfU7leSClLh2zCAkC1CeUGLrZU +G/Fuob5ZjjJ6I6/+3jF91Y6bDvh9e71jys6eTnYNfXs23f7uwqv7G0VqhY3AjXKs +9YS81sdBNbZIObMeXA9w2kG+RLWB5C4hpkqgoRJHDyE06Vzy7zzWLBS6AY6/f2lX +lNVUETpf7j3PU2bGry865V5eGS43lTUnsMUDVQL1OuiWLg30JUH2AP8cqQqgN+O/ +mK44RfZIrGz7o3currsobXBMNaqFqVlCRtdqEVsiRprWiGlHtLEnAh/UNVp3h4ca +s9nGo0wA9bpHqAYzyJoDKRgjj4V7vk6rDNdJeRow9v4byVOpEXBY2WX+oRWYruyR ++ArU/zAeK/6oUb4yegc25SGTZxEHlZvZs9U8Ft3SmzGDtuiS8tgMgfLe23fN8mUv +pRwRqkRmPYRZpH23MTWVBGSAos9nlP5MxA7IgclRywpINOJpNsbPbihhcjd5oBhK +ZK6eqdpYUdSWHpUdSUi3DhirYXWQA3bGjhJ/IuvGpqdXm2P9rpUArEjwuG7De7QS +t65n15oECLzVg/3vZviKSC0RkW5p+pQEbVifxu3Azs8SrUlXsilcHMTnTVGK2wG2 +Fi4ReqftHwy1JIAsMEeAQAvuR86TFaHKasw2p+/IenHo/cTAyqEJjgGeTJWjUtCK +dUavMKA5ZYIP1E5/F0/QBNVToghoDgMVV870p7QWjgLVtPVCDPx3I7JKh9GBmNR5 +0dd3JMpO9Gkk8cBGwurrr/Ak8ynRLv0MRdB/8HDp66XiHR6tBl8ZoZ4ZsnME56Bc +F2+OmOuxVThpOxPlECU8XtI37ZlSxbG0X/s5eBy2mmrVDzGQDYXC3VuEp3lrk8QV +k1KU6zxzFLXnKEhZraP78TIKhvV7tiggyTBmx1emLigMqmd7AnVseY1LRlFQgUB1 +wloOOrNW1gpIoUUMVuRjFA== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-pss.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-pss.key new file mode 100644 index 000000000000..a0ecda8b2c11 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-pss.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEApfv1BYcLTl09aBmW +OnwUEKxByqBZeCXLp6Ck6/plp3GgC9gtFMfSk7mImkIt8BAFWK27A0/vOFDf7SDX +tFYtlL6ZukxSgaltyEjMVMX/oqB3vMsqzDX96So4UauDlQexWORT0LcUp3IcjA8L +JrrZS6j278y3ah/Xkex56IRpfFbdqPj/p4rJMw0WFtqvINV6C2xGxeoC1/LcHM/H +WQLpeRD5PgnIwUw/dqMYtV7nfUDU5wCJLe6I0ogdgmCGrAeogldFilakPs47yU03 +/b6qWFHaj7OwGZRV51R/GChS1HdVN42nsXHiIz26KPIf8BS6O/iAZlUaS8xhw5XB +je0uIQIDAQABAoIBAAh8WZn3Pfo7JRUJ3dbOmh4CGHj5+qj8Ua2XtmbEDediFTsV +ybQ6xQa9YQD16jBQOV2/wARa1VGNPO18FNsI3tqwZd6S4VL0rQKkyiF5X+jaCFUU +E/ONvRXrDScLvDXlx0jSn4BXo8wttszoRfssaUiHclxvHF9mEljI/LCI+HWdTAys ++3l/Yn1ewwA2iFFU+ZcwgvZHXjLjRLfImTfr7oQLeolpP9sxfwb2RdQ24ifgIh9N +Yv9KzFfFJNl+2o3q6XBKqvjXYWmTam/hwXhGnFNb3LgrOwkSUIVpUJl52F/fu+BD +AdJu0ELPUNIu2Ll0fBp3Efj80vcSZqtDSJ3Bl/sCgYEA6DZQm1L1Y2tPMcX+JLtV +BKC19YRTJLI+CQsU5YnD4DN6O3a8PITfRf+SHWI9slGGs4QU0rv6NLMj4c0Vxsbk +74LQArprdw768+hLH8z3r/fAZ0QrTJZSKMuGvs4To4dHvNSdc2lYDtadDysPxkKZ +23aL3ApmCqZpHvIUndOGKV8CgYEAtvzWJd6faGWUEbQI2qI4/H2w/t4oxIgVDOeu +qCjIfw3jj9QUQrzC/ckHEJrb9ILYuzxfe92qPf9qmqHyE3aKMCN4MFIz+PdfwM7F +P3/QSriS+PdCnS0ysmHrUdJRXOsl6SYDVnCfyhU6HtL4GFO5expMesogpw2xXkYk +gYOaWH8CgYAP0SNMcSoly3lpeoMFHX19AzVhs9G1/i4bj5WszOV6sAbzZfMMbECJ +FA9v0PFC5Cq4r5Z7hDJWxJz9FGsXTxTo+5APn4MSaQLO+lOjpuJ4KfgBELOiU9rk +zHgxJvhPezd3tUPESLimyheIoPZCGuc/+6MrKcopj4w5f2PIHFBXIQKBgQCN7qTn +8LpyTj/AT4WCl8tdxNxRg93ZOrghL18gnamOKyaz+8rPTPxtvsyVC5jKGeejqxtg +xzlyJzf3wt8yS4K5/fkOeeRIGxARTBBgxXG5U1rkc10e7tzg0eSlrV1glh/srIhw +NqEqLLbNC9RVgjNfEbH6l+clzBAkUIGmV36TXwKBgQCI9r8ZYR7xGYYDTpMSbGdL +XpWuNWwgZQsvBAH+pXaE3A/36tXdggA5nZH3SA+yIoJHGiXHeM8K9LOMAbAzHhsJ +ia/yFcH7lat92/28mrxoAkHHk5oUdIcP6pcPny3cE874sh/UPG7BNKrS+h2ll21e +OFsE0r+qLh68/S0HZM1/eA== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-scrypt.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-scrypt.key new file mode 100644 index 000000000000..775fc9dc662c --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa-scrypt.key @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +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 +oDEneepILtLCVoJewFPvdkpnL1xcdjveuw== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa.key new file mode 100644 index 000000000000..fc4a4c7b8393 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/rsa.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +JSRSgO3qryi1B/PjFld2fmtKpkffCw== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp224r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp224r1.key new file mode 100644 index 000000000000..8c74cd9783d8 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp224r1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MHgCAQAwEAYHKoZIzj0CAQYFK4EEACEEYTBfAgEBBByDAgBh6UOQqYJSPoiNWrK0 +rA0rTMLw8JdCEveBoTwDOgAEABwjlgBV9PPpMfo8fo6yWRdT+sb1cUdEhobd+V/D +/i58cWpDqd4CApevJWtkGbwhU4J9mN0aYrk= +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256k1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256k1.key new file mode 100644 index 000000000000..05ab7d4dd065 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256k1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgAjoYh3zy6gJciB7F/pHi +fU+IfPBeEhgQBFT3zNvox5ihRANCAATTIv3AIcnOXMvnURBseRspHsowmPAxPgsx +LH5+aU2mW06f2PsIe9F8gG/Nf2UOOuO+aqwEStIkfSBR+Fwpl2UR +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256r1.key new file mode 100644 index 000000000000..2ff386caba17 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp256r1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgSFp08cP6os9Fxmky +o5VFi6woYEqvbhVNYTp9NvwzBCChRANCAAQo6UQaiHkZr7lxrKDZyL9Qinr4Vy0Q +W3K2EPFYbVIupvzW0RH8vBy+0/yoaNyUsw/IsmBO+A60mhBB4rTjmq6R +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp384r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp384r1.key new file mode 100644 index 000000000000..f662e85f76c6 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp384r1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCqdZTmuPvhbOVI/Vkk +yjowWmBb1+81m+ay2QF15TZns1iX4HQlaOZ1GzaqhJRS0R2hZANiAASYw9dep7R9 +IoC8Dzt6T0NYOOJE/TPdOXOH+M6uJvKAtmXGalFeLQX6HKlUDNPnBDTKp9p6Nu/o +2k/p2C9m0DaX70sNuyfOmh738Bw2Hlz3If+903Jj+hKSR4kWDkKYb/s= +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp521r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp521r1.key new file mode 100644 index 000000000000..e987b65b0e03 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/secp521r1.key @@ -0,0 +1,8 @@ +-----BEGIN PRIVATE KEY----- +MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAdO/4HyMRu7/QcjYn +f8vynFJRVOKHVVmRFrAzZwkdusoqf9gkicCxcxhOpOGLezzTH4XBynbcmmMn4PNS +ZriTYO6hgYkDgYYABAAp8YOO/QeQoVEdzsOwZt1ta0/b5r0ESM/QNkBVgrRdCsJ+ +y3p/xis4wFlhv7lsrtuDoeuMimnvl+fAfptCzMKHugGBvSE0SjLgydEmUjh/y/a4 +O3cGqwUXnnxiLKJ98NFaooGYY+AwH4h77oCbQR1lf8jhe1qsJkR9mXpYuGnkaJ7l +qg== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x25519.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x25519.key new file mode 100644 index 000000000000..affde0dce116 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x25519.key @@ -0,0 +1,3 @@ +-----BEGIN PRIVATE KEY----- +MC4CAQAwBQYDK2VuBCIEINAdGSXck38nDXMgbRKqKiBPVuxDirhOs9VDE+NaokZz +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448-aes-256-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448-aes-256-cbc.key new file mode 100644 index 000000000000..bb6e86a68f58 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448-aes-256-cbc.key @@ -0,0 +1,6 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIGrMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAjrmjUn6y1PFwICCAAw +DAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEJuU2Lvx741TqKFa9X8bRGkEUPYI +SNtLGe+fIcgz7rF8YaTnA0oeMsRp4RxBw/fsaEGrHUTM1ddjuyRzdKKNnghZIs0w +zy/O8QNXDzrss5bnxZyHZA2XEvftHTH1Mw9jCtwA +-----END ENCRYPTED PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448.key new file mode 100644 index 000000000000..04b53654134e --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/pkcs8/x448.key @@ -0,0 +1,4 @@ +-----BEGIN PRIVATE KEY----- +MEYCAQAwBQYDK2VvBDoEOFRfvQhj134qZjH0wDbmPc90BADiqrpGZSae/sd8GG84 +au0ISBY6I7BJJZdiLLED+0abd0hLYAyl +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256r1.key new file mode 100644 index 000000000000..d17b664d739e --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256r1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGIAgEAMBQGByqGSM49AgEGCSskAwMCCAEBBwRtMGsCAQEEIBfCkWEWyc2tHIvS +Ao6hhcj09dnh8NOmtZeqGmcXHnIqoUQDQgAElux3elmSzb/WqEZXb1vdXx/tcIpC +Yq2vewG8H1SikMoACeFVRcjuy31gJ4Q8M7UQmrR4+WXSptV/UQ6Gkt3XuQ== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256t1.key new file mode 100644 index 000000000000..2ef7cc4194e7 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP256t1.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHgCAQEEIILhgc3joEZDWMDm9TYgrENN7gbqtMpMw1e2MTLwlJhCoAsGCSskAwMC +CAEBCKFEA0IABIgzdtCT/Dvc0iuOrT+jJFyTzQH8jSENIToHEP/xcOVdMoklPgTx +ng6CA7FvC5xJUtYSGVqtCVUDWYHuXotm7IU= +-----END EC PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320r1.key new file mode 100644 index 000000000000..e1bd06c2793b --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320r1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGiAgEAMBQGByqGSM49AgEGCSskAwMCCAEBCQSBhjCBgwIBAQQoNifTnb4a5dOR +yr8QFVM7Zkw/f/AMm5T5PQ6iVTCzrnw/kZ8glwl+JKFUA1IABHSnWUC/tKXpNHGE +P89QVKEgvetwCQWFoOENAgXORniLiaLdAdsR80ouTsZiFgHG9su0l5ESEnFWQr5x +UMj/vPwwhSYm+YP5ucx5NezuBM4d +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320t1.key new file mode 100644 index 000000000000..17e60c9549cd --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP320t1.key @@ -0,0 +1,6 @@ +-----BEGIN EC PRIVATE KEY----- +MIGQAgEBBCi0aeKsFfr17MTtr3IgFByp4IybuFzlgAbwPjf3rK0Fr/b87+WicOU6 +oAsGCSskAwMCCAEBCqFUA1IABDQHDepa3l/S8Gt9WrNCNpCPZNBXvmkGPnVXZchZ +I5BtUySwYxHX1tpatGs3jY7drVYm+NyxZE81pecYTvXR8bu7e3BIp2SwZmXEDxdY +p1fw +-----END EC PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384r1.key new file mode 100644 index 000000000000..c248a0f0d448 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384r1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIG6AgEAMBQGByqGSM49AgEGCSskAwMCCAEBCwSBnjCBmwIBAQQwK6y6NydLMTNm +LhDNPyTDKEemTWTUuMGfBQxEz+lQKAqz/So4uA+fQzor/t8to+uioWQDYgAEaK8X +3KCyRDMpbACw2xG4UUe9OxyuGWFaGKPxhKJDyW5Z56gT5P1Q2y4CblL/X9VcDIMX +dcQqRNBkPQfy1+fJXwKO0ClfD6MIE3bv6PTZ55J6H2H1dpg38a2soRchz0FN +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384t1.key new file mode 100644 index 000000000000..39a94e293b32 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP384t1.key @@ -0,0 +1,6 @@ +-----BEGIN EC PRIVATE KEY----- +MIGoAgEBBDAEZRoS9O2fGbx85aPZzZxfj33Wu8aZ8a+K5ZZBFuVKKL+/0UbidDhD +YiuAHL6GAr2gCwYJKyQDAwIIAQEMoWQDYgAEQL0dQoOTArIx70V/XxipoxxBeKT7 +zmIe7id5pQiw4O4nA2S2BFxQF9eW9ipnm6DaN6jaX/+2k+cC4qIfqzeLcLUFXxz0 +qdec8lNNtr9QmwoQlv11beeHmQu9C1GwHmvG +-----END EC PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512r1.key new file mode 100644 index 000000000000..790b619c365c --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512r1.key @@ -0,0 +1,7 @@ +-----BEGIN PRIVATE KEY----- +MIHsAgEAMBQGByqGSM49AgEGCSskAwMCCAEBDQSB0DCBzQIBAQRAmEQNFMGIDLoj +Ktdg8V71WdSs7FiBkE6Bft25+yY8ohugk/u8aKeIKNVtSirMgQhGFJy/BIBkvM6V +1JfnrglkjqGBhQOBggAEYbjTnA0x42NdM7jVv7jAoZq0iOYopbwejlOEsx8/MqRa +Yt4Ef83holIsgOHWSeW+kw1oMDmieoCrhnkM/3KgGzV+BxCeieAWGxABsj9YhAmb +ATorRJ4q/pMxRq8gIUv05/dGuUttl1gdbKKnGQjxDBM4v5H+/4z00nzzj4Gbfx8= +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512t1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512t1.key new file mode 100644 index 000000000000..eedbcdb4b81c --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/brainpoolP512t1.key @@ -0,0 +1,7 @@ +-----BEGIN EC PRIVATE KEY----- +MIHaAgEBBEBNqbJnTzwGwg9JyyXBrQjXF8LT/q53Jydyv6L9AgU5c2vg5CJVvgoL +8JL/YU+i1UwVIdl8JLZuCLpi+Dcy1rlIoAsGCSskAwMCCAEBDqGBhQOBggAEm/uI +qsytMZypsqCuL0jwZh8xCRVEkUd02YPXcOBhMzS9bhAao4CLAuXhWzplr5qk/7tt +vczl7qFDOvBzNAIieZHwbFrouZ6Pew8pQXRcMDB+FnXwNgpljTNmz/f1ePjVKU1Z +gbQ+xVf8Qt8OI9S0Pla8siTgbVweGMLtq0A8Wuo= +-----END EC PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1-aes-128-cbc.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1-aes-128-cbc.key new file mode 100644 index 000000000000..ccecc24707e1 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1-aes-128-cbc.key @@ -0,0 +1,8 @@ +-----BEGIN EC PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,3F26BBC4C7A6F3B5B3A5C03C7CC59B33 + +rp4qC+n+qIG+WKJp4BHQHk5z0oraaaLZvoVK5glESGx5IcR3mCsN7tdg2aZ7yEk+ +HnT4nQuM3R5pv248cmK0xDUje8N7FLe8lixVnEyQx3JdZfGdauowt9yaxL3AJypX +idWxNrxz1xff5RSMI6+PFv2SQpG0l794EpOjZxOUABM= +-----END EC PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1.key new file mode 100644 index 000000000000..775a7a0fcacf --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/prime256v1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguc9upTMQn8b+loAx +6c8q20dHYBf3V9374I3kJIDmC1ShRANCAARnLuOxL7n7Gq12zd9vq2neAv6PYc1h +W6M2gJKSbfFYGhte382jOJ2TgwaTQL/J5IPSfuJKkmAPBIl8CdJKWlwA +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp224r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp224r1.key new file mode 100644 index 000000000000..8c74cd9783d8 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp224r1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MHgCAQAwEAYHKoZIzj0CAQYFK4EEACEEYTBfAgEBBByDAgBh6UOQqYJSPoiNWrK0 +rA0rTMLw8JdCEveBoTwDOgAEABwjlgBV9PPpMfo8fo6yWRdT+sb1cUdEhobd+V/D +/i58cWpDqd4CApevJWtkGbwhU4J9mN0aYrk= +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256k1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256k1.key new file mode 100644 index 000000000000..05ab7d4dd065 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256k1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgAjoYh3zy6gJciB7F/pHi +fU+IfPBeEhgQBFT3zNvox5ihRANCAATTIv3AIcnOXMvnURBseRspHsowmPAxPgsx +LH5+aU2mW06f2PsIe9F8gG/Nf2UOOuO+aqwEStIkfSBR+Fwpl2UR +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256r1.key new file mode 100644 index 000000000000..2ff386caba17 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp256r1.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgSFp08cP6os9Fxmky +o5VFi6woYEqvbhVNYTp9NvwzBCChRANCAAQo6UQaiHkZr7lxrKDZyL9Qinr4Vy0Q +W3K2EPFYbVIupvzW0RH8vBy+0/yoaNyUsw/IsmBO+A60mhBB4rTjmq6R +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp384r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp384r1.key new file mode 100644 index 000000000000..f662e85f76c6 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp384r1.key @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCqdZTmuPvhbOVI/Vkk +yjowWmBb1+81m+ay2QF15TZns1iX4HQlaOZ1GzaqhJRS0R2hZANiAASYw9dep7R9 +IoC8Dzt6T0NYOOJE/TPdOXOH+M6uJvKAtmXGalFeLQX6HKlUDNPnBDTKp9p6Nu/o +2k/p2C9m0DaX70sNuyfOmh738Bw2Hlz3If+903Jj+hKSR4kWDkKYb/s= +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp521r1.key b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp521r1.key new file mode 100644 index 000000000000..e987b65b0e03 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/sec1/secp521r1.key @@ -0,0 +1,8 @@ +-----BEGIN PRIVATE KEY----- +MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAdO/4HyMRu7/QcjYn +f8vynFJRVOKHVVmRFrAzZwkdusoqf9gkicCxcxhOpOGLezzTH4XBynbcmmMn4PNS +ZriTYO6hgYkDgYYABAAp8YOO/QeQoVEdzsOwZt1ta0/b5r0ESM/QNkBVgrRdCsJ+ +y3p/xis4wFlhv7lsrtuDoeuMimnvl+fAfptCzMKHugGBvSE0SjLgydEmUjh/y/a4 +O3cGqwUXnnxiLKJ98NFaooGYY+AwH4h77oCbQR1lf8jhe1qsJkR9mXpYuGnkaJ7l +qg== +-----END PRIVATE KEY----- diff --git a/spring-boot-project/spring-boot/src/test/resources/test-cert-chain.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-cert-chain.pem similarity index 100% rename from spring-boot-project/spring-boot/src/test/resources/test-cert-chain.pem rename to spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-cert-chain.pem diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-cert.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-cert.pem new file mode 100644 index 000000000000..245cf8f8f86a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-key.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-key.pem new file mode 100644 index 000000000000..ebdcf202f31a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/ssl/pem/test-key.pem @@ -0,0 +1,59 @@ +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +Key Attributes: +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD8B1saBN8Y0ZjX +Q/pvnv2hZa+cBBkFHVkgw+tdzgdcO5Kjv2rnRKd3Oh8Qwdxj3BC9GpicF4GOgkDG +LrMrYbmV/xGUnNh3YpUwbv+U/pm3VnuSZCk4aYgNEWHrnEHyrge87+MqYqGuMIke +A5z7GV44PeThfKQs2BLLL/ME+Pb/jN6IVlIHxdBT5TBQkqNGFU7swdZoQ5Viqv44 +UNdVqU5pP3UF/perbOm2CHCbeLiLRvmuvGuBbrbko2XUwBNH+UjmEQaRh/epoy8B +D31vGY87ym/YOEdpIrqD8bwg7NWP/Fdsryqi8p+U8fcfw4xZjotA0Sv04BC7zXHg +m1AyZoVzAgMBAAECggEAfEqiZqANaF+BqXQIb4Dw42ZTJzWsIyYYnPySOGZRoe5t +QJ03uwtULYv34xtANe1DQgd6SMyc46ugBzzjtprQ3ET5Jhn99U6kdcjf+dpf85dO +hOEppP0CkDNI39nleinSfh6uIOqYgt/D143/nqQhn8oCdSOzkbwT9KnWh1bC9T7I +vFjGfElvt1/xl88qYgrWgYLgXaencNGgiv/4/M0FNhiHEGsVC7SCu6kapC/WIQpE +5IdV+HR+tiLoGZhXlhqorY7QC4xKC4wwafVSiFxqDOQAuK+SMD4TCEv0Aop+c+SE +YBigVTmgVeJkjK7IkTEhKkAEFmRF5/5w+bZD9FhTNQKBgQD+4fNG1ChSU8RdizZT +5dPlDyAxpETSCEXFFVGtPPh2j93HDWn7XugNyjn5FylTH507QlabC+5wZqltdIjK +GRB5MIinQ9/nR2fuwGc9s+0BiSEwNOUB1MWm7wWL/JUIiKq6sTi6sJIfsYg79zco +qxl5WE94aoINx9Utq1cdWhwJTQKBgQD9IjPksd4Jprz8zMrGLzR8k1gqHyhv24qY +EJ7jiHKKAP6xllTUYwh1IBSL6w2j5lfZPpIkb4Jlk2KUoX6fN81pWkBC/fTBUSIB +EHM9bL51+yKEYUbGIy/gANuRbHXsWg3sjUsFTNPN4hGTFk3w2xChCyl/f5us8Lo8 +Z633SNdpvwKBgQCGyDU9XzNzVZihXtx7wS0sE7OSjKtX5cf/UCbA1V0OVUWR3SYO +J0HPCQFfF0BjFHSwwYPKuaR9C8zMdLNhK5/qdh/NU7czNi9fsZ7moh7SkRFbzJzN +OxbKD9t/CzJEMQEXeF/nWTfsSpUgILqqZtAxuuFLbAcaAnJYlCKdAumQgQKBgQCK +mqjJh68pn7gJwGUjoYNe1xtGbSsqHI9F9ovZ0MPO1v6e5M7sQJHH+Fnnxzv/y8e8 +d6tz8e73iX1IHymDKv35uuZHCGF1XOR+qrA/KQUc+vcKf21OXsP/JtkTRs1HLoRD +S5aRf2DWcfvniyYARSNU2xTM8GWgi2ueWbMDHUp+ZwKBgA/swC+K+Jg5DEWm6Sau +e6y+eC6S+SoXEKkI3wf7m9aKoZo0y+jh8Gas6gratlc181pSM8O3vZG0n19b493I +apCFomMLE56zEzvyzfpsNhFhk5MBMCn0LPyzX6MiynRlGyWIj0c99fbHI3pOMufP +WgmVLTZ8uDcSW1MbdUCwFSk5 +-----END PRIVATE KEY----- +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +subject=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +issuer=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/client/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/client/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/jetty/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/jetty/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/netty/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/netty/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/tomcat/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/tomcat/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/restricted.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/undertow/restricted.jks similarity index 100% rename from spring-boot-project/spring-boot/src/test/resources/restricted.jks rename to spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/embedded/undertow/restricted.jks diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/result/view/template.html b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/result/view/template.html deleted file mode 100644 index fa22264e2356..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/result/view/template.html +++ /dev/null @@ -1 +0,0 @@ -Hello {{World}} diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-cert.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-cert.pem new file mode 100644 index 000000000000..245cf8f8f86a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-key.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-key.pem new file mode 100644 index 000000000000..ebdcf202f31a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test-key.pem @@ -0,0 +1,59 @@ +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +Key Attributes: +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD8B1saBN8Y0ZjX +Q/pvnv2hZa+cBBkFHVkgw+tdzgdcO5Kjv2rnRKd3Oh8Qwdxj3BC9GpicF4GOgkDG +LrMrYbmV/xGUnNh3YpUwbv+U/pm3VnuSZCk4aYgNEWHrnEHyrge87+MqYqGuMIke +A5z7GV44PeThfKQs2BLLL/ME+Pb/jN6IVlIHxdBT5TBQkqNGFU7swdZoQ5Viqv44 +UNdVqU5pP3UF/perbOm2CHCbeLiLRvmuvGuBbrbko2XUwBNH+UjmEQaRh/epoy8B +D31vGY87ym/YOEdpIrqD8bwg7NWP/Fdsryqi8p+U8fcfw4xZjotA0Sv04BC7zXHg +m1AyZoVzAgMBAAECggEAfEqiZqANaF+BqXQIb4Dw42ZTJzWsIyYYnPySOGZRoe5t +QJ03uwtULYv34xtANe1DQgd6SMyc46ugBzzjtprQ3ET5Jhn99U6kdcjf+dpf85dO +hOEppP0CkDNI39nleinSfh6uIOqYgt/D143/nqQhn8oCdSOzkbwT9KnWh1bC9T7I +vFjGfElvt1/xl88qYgrWgYLgXaencNGgiv/4/M0FNhiHEGsVC7SCu6kapC/WIQpE +5IdV+HR+tiLoGZhXlhqorY7QC4xKC4wwafVSiFxqDOQAuK+SMD4TCEv0Aop+c+SE +YBigVTmgVeJkjK7IkTEhKkAEFmRF5/5w+bZD9FhTNQKBgQD+4fNG1ChSU8RdizZT +5dPlDyAxpETSCEXFFVGtPPh2j93HDWn7XugNyjn5FylTH507QlabC+5wZqltdIjK +GRB5MIinQ9/nR2fuwGc9s+0BiSEwNOUB1MWm7wWL/JUIiKq6sTi6sJIfsYg79zco +qxl5WE94aoINx9Utq1cdWhwJTQKBgQD9IjPksd4Jprz8zMrGLzR8k1gqHyhv24qY +EJ7jiHKKAP6xllTUYwh1IBSL6w2j5lfZPpIkb4Jlk2KUoX6fN81pWkBC/fTBUSIB +EHM9bL51+yKEYUbGIy/gANuRbHXsWg3sjUsFTNPN4hGTFk3w2xChCyl/f5us8Lo8 +Z633SNdpvwKBgQCGyDU9XzNzVZihXtx7wS0sE7OSjKtX5cf/UCbA1V0OVUWR3SYO +J0HPCQFfF0BjFHSwwYPKuaR9C8zMdLNhK5/qdh/NU7czNi9fsZ7moh7SkRFbzJzN +OxbKD9t/CzJEMQEXeF/nWTfsSpUgILqqZtAxuuFLbAcaAnJYlCKdAumQgQKBgQCK +mqjJh68pn7gJwGUjoYNe1xtGbSsqHI9F9ovZ0MPO1v6e5M7sQJHH+Fnnxzv/y8e8 +d6tz8e73iX1IHymDKv35uuZHCGF1XOR+qrA/KQUc+vcKf21OXsP/JtkTRs1HLoRD +S5aRf2DWcfvniyYARSNU2xTM8GWgi2ueWbMDHUp+ZwKBgA/swC+K+Jg5DEWm6Sau +e6y+eC6S+SoXEKkI3wf7m9aKoZo0y+jh8Gas6gratlc181pSM8O3vZG0n19b493I +apCFomMLE56zEzvyzfpsNhFhk5MBMCn0LPyzX6MiynRlGyWIj0c99fbHI3pOMufP +WgmVLTZ8uDcSW1MbdUCwFSk5 +-----END PRIVATE KEY----- +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +subject=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +issuer=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test.p12 b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/reactive/server/test.p12 new file mode 100644 index 0000000000000000000000000000000000000000..e1255f26f6659a9694a412c77aea76ebeb571985 GIT binary patch literal 7441 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 Z4NE5WCo01)iigeN*5<0D^8Z*S{{=9b#?k-) literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert-chain.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert-chain.pem new file mode 100644 index 000000000000..df103772cfe2 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert-chain.pem @@ -0,0 +1,32 @@ +-----BEGIN TRUSTED CERTIFICATE----- +MIIClzCCAgACCQCPbjkRoMVEQDANBgkqhkiG9w0BAQUFADCBjzELMAkGA1UEBhMC +VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x +DTALBgNVBAoMBFRlc3QxDTALBgNVBAsMBFRlc3QxFDASBgNVBAMMC2V4YW1wbGUu +Y29tMR8wHQYJKoZIhvcNAQkBFhB0ZXN0QGV4YW1wbGUuY29tMB4XDTIwMDMyNzIx +NTgwNFoXDTIxMDMyNzIxNTgwNFowgY8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApD +YWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKDARUZXN0 +MQ0wCwYDVQQLDARUZXN0MRQwEgYDVQQDDAtleGFtcGxlLmNvbTEfMB0GCSqGSIb3 +DQEJARYQdGVzdEBleGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC +gYEA1YzixWEoyzrd20C2R1gjyPCoPfFLlG6UYTyT0tueNy6yjv6qbJ8lcZg7616O +3I9LuOHhZh9U+fCDCgPfiDdyJfDEW/P+dsOMFyMUXPrJPze2yPpOnvV8iJ5DM93u +fEVhCCyzLdYu0P2P3hU2W+T3/Im9DA7FOPA2vF1SrIJ2qtUCAwEAATANBgkqhkiG +9w0BAQUFAAOBgQBdShkwUv78vkn1jAdtfbB+7mpV9tufVdo29j7pmotTCz3ny5fc +zLEfeu6JPugAR71JYbc2CqGrMneSk1zT91EH6ohIz8OR5VNvzB7N7q65Ci7OFMPl +ly6k3rHpMCBtHoyNFhNVfPLxGJ9VlWFKLgIAbCmL4OIQm1l6Fr1MSM38Zw== +-----END TRUSTED CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICjzCCAfgCAQEwDQYJKoZIhvcNAQEFBQAwgY8xCzAJBgNVBAYTAlVTMRMwEQYD +VQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQK +DARUZXN0MQ0wCwYDVQQLDARUZXN0MRQwEgYDVQQDDAtleGFtcGxlLmNvbTEfMB0G +CSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbTAeFw0yMDAzMjcyMjAxNDZaFw0y +MTAzMjcyMjAxNDZaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5p +YTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwEVGVzdDENMAsGA1UE +CwwEVGVzdDEUMBIGA1UEAwwLZXhhbXBsZS5jb20xHzAdBgkqhkiG9w0BCQEWEHRl +c3RAZXhhbXBsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM7kd2cj +F49wm1+OQ7Q5GE96cXueWNPr/Nwei71tf6G4BmE0B+suXHEvnLpHTj9pdX/ZzBIK +8jIZ/x8RnSduK/Ky+zm1QMYUWZtWCAgCW8WzgB69Cn/hQG8KSX3S9bqODuQAvP54 +GQJD7+4kVuNBGjFb4DaD4nvMmPtALSZf8ZCZAgMBAAEwDQYJKoZIhvcNAQEFBQAD +gYEAOn6X8+0VVlDjF+TvTgI0KIasA6nDm+KXe7LVtfvqWqQZH4qyd2uiwcDM3Aux +a/OsPdOw0j+NqFDBd3mSMhSVgfvXdK6j9WaxY1VGXyaidLARgvn63wfzgr857sQW +c8eSxbwEQxwlMvVxW6Os4VhCfUQr8VrBrvPa2zs+6IlK+Ug= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert.pem new file mode 100644 index 000000000000..245cf8f8f86a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-key.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-key.pem new file mode 100644 index 000000000000..ebdcf202f31a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test-key.pem @@ -0,0 +1,59 @@ +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +Key Attributes: +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD8B1saBN8Y0ZjX +Q/pvnv2hZa+cBBkFHVkgw+tdzgdcO5Kjv2rnRKd3Oh8Qwdxj3BC9GpicF4GOgkDG +LrMrYbmV/xGUnNh3YpUwbv+U/pm3VnuSZCk4aYgNEWHrnEHyrge87+MqYqGuMIke +A5z7GV44PeThfKQs2BLLL/ME+Pb/jN6IVlIHxdBT5TBQkqNGFU7swdZoQ5Viqv44 +UNdVqU5pP3UF/perbOm2CHCbeLiLRvmuvGuBbrbko2XUwBNH+UjmEQaRh/epoy8B +D31vGY87ym/YOEdpIrqD8bwg7NWP/Fdsryqi8p+U8fcfw4xZjotA0Sv04BC7zXHg +m1AyZoVzAgMBAAECggEAfEqiZqANaF+BqXQIb4Dw42ZTJzWsIyYYnPySOGZRoe5t +QJ03uwtULYv34xtANe1DQgd6SMyc46ugBzzjtprQ3ET5Jhn99U6kdcjf+dpf85dO +hOEppP0CkDNI39nleinSfh6uIOqYgt/D143/nqQhn8oCdSOzkbwT9KnWh1bC9T7I +vFjGfElvt1/xl88qYgrWgYLgXaencNGgiv/4/M0FNhiHEGsVC7SCu6kapC/WIQpE +5IdV+HR+tiLoGZhXlhqorY7QC4xKC4wwafVSiFxqDOQAuK+SMD4TCEv0Aop+c+SE +YBigVTmgVeJkjK7IkTEhKkAEFmRF5/5w+bZD9FhTNQKBgQD+4fNG1ChSU8RdizZT +5dPlDyAxpETSCEXFFVGtPPh2j93HDWn7XugNyjn5FylTH507QlabC+5wZqltdIjK +GRB5MIinQ9/nR2fuwGc9s+0BiSEwNOUB1MWm7wWL/JUIiKq6sTi6sJIfsYg79zco +qxl5WE94aoINx9Utq1cdWhwJTQKBgQD9IjPksd4Jprz8zMrGLzR8k1gqHyhv24qY +EJ7jiHKKAP6xllTUYwh1IBSL6w2j5lfZPpIkb4Jlk2KUoX6fN81pWkBC/fTBUSIB +EHM9bL51+yKEYUbGIy/gANuRbHXsWg3sjUsFTNPN4hGTFk3w2xChCyl/f5us8Lo8 +Z633SNdpvwKBgQCGyDU9XzNzVZihXtx7wS0sE7OSjKtX5cf/UCbA1V0OVUWR3SYO +J0HPCQFfF0BjFHSwwYPKuaR9C8zMdLNhK5/qdh/NU7czNi9fsZ7moh7SkRFbzJzN +OxbKD9t/CzJEMQEXeF/nWTfsSpUgILqqZtAxuuFLbAcaAnJYlCKdAumQgQKBgQCK +mqjJh68pn7gJwGUjoYNe1xtGbSsqHI9F9ovZ0MPO1v6e5M7sQJHH+Fnnxzv/y8e8 +d6tz8e73iX1IHymDKv35uuZHCGF1XOR+qrA/KQUc+vcKf21OXsP/JtkTRs1HLoRD +S5aRf2DWcfvniyYARSNU2xTM8GWgi2ueWbMDHUp+ZwKBgA/swC+K+Jg5DEWm6Sau +e6y+eC6S+SoXEKkI3wf7m9aKoZo0y+jh8Gas6gratlc181pSM8O3vZG0n19b493I +apCFomMLE56zEzvyzfpsNhFhk5MBMCn0LPyzX6MiynRlGyWIj0c99fbHI3pOMufP +WgmVLTZ8uDcSW1MbdUCwFSk5 +-----END PRIVATE KEY----- +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +subject=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +issuer=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test.p12 b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/server/test.p12 new file mode 100644 index 0000000000000000000000000000000000000000..e1255f26f6659a9694a412c77aea76ebeb571985 GIT binary patch literal 7441 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 Z4NE5WCo01)iigeN*5<0D^8Z*S{{=9b#?k-) literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/context/conf.properties b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/context/conf.properties deleted file mode 100644 index 0eb014d0ff22..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/context/conf.properties +++ /dev/null @@ -1 +0,0 @@ -context=/example diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-cert.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-cert.pem new file mode 100644 index 000000000000..245cf8f8f86a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-key.pem b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-key.pem new file mode 100644 index 000000000000..ebdcf202f31a --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test-key.pem @@ -0,0 +1,59 @@ +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +Key Attributes: +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD8B1saBN8Y0ZjX +Q/pvnv2hZa+cBBkFHVkgw+tdzgdcO5Kjv2rnRKd3Oh8Qwdxj3BC9GpicF4GOgkDG +LrMrYbmV/xGUnNh3YpUwbv+U/pm3VnuSZCk4aYgNEWHrnEHyrge87+MqYqGuMIke +A5z7GV44PeThfKQs2BLLL/ME+Pb/jN6IVlIHxdBT5TBQkqNGFU7swdZoQ5Viqv44 +UNdVqU5pP3UF/perbOm2CHCbeLiLRvmuvGuBbrbko2XUwBNH+UjmEQaRh/epoy8B +D31vGY87ym/YOEdpIrqD8bwg7NWP/Fdsryqi8p+U8fcfw4xZjotA0Sv04BC7zXHg +m1AyZoVzAgMBAAECggEAfEqiZqANaF+BqXQIb4Dw42ZTJzWsIyYYnPySOGZRoe5t +QJ03uwtULYv34xtANe1DQgd6SMyc46ugBzzjtprQ3ET5Jhn99U6kdcjf+dpf85dO +hOEppP0CkDNI39nleinSfh6uIOqYgt/D143/nqQhn8oCdSOzkbwT9KnWh1bC9T7I +vFjGfElvt1/xl88qYgrWgYLgXaencNGgiv/4/M0FNhiHEGsVC7SCu6kapC/WIQpE +5IdV+HR+tiLoGZhXlhqorY7QC4xKC4wwafVSiFxqDOQAuK+SMD4TCEv0Aop+c+SE +YBigVTmgVeJkjK7IkTEhKkAEFmRF5/5w+bZD9FhTNQKBgQD+4fNG1ChSU8RdizZT +5dPlDyAxpETSCEXFFVGtPPh2j93HDWn7XugNyjn5FylTH507QlabC+5wZqltdIjK +GRB5MIinQ9/nR2fuwGc9s+0BiSEwNOUB1MWm7wWL/JUIiKq6sTi6sJIfsYg79zco +qxl5WE94aoINx9Utq1cdWhwJTQKBgQD9IjPksd4Jprz8zMrGLzR8k1gqHyhv24qY +EJ7jiHKKAP6xllTUYwh1IBSL6w2j5lfZPpIkb4Jlk2KUoX6fN81pWkBC/fTBUSIB +EHM9bL51+yKEYUbGIy/gANuRbHXsWg3sjUsFTNPN4hGTFk3w2xChCyl/f5us8Lo8 +Z633SNdpvwKBgQCGyDU9XzNzVZihXtx7wS0sE7OSjKtX5cf/UCbA1V0OVUWR3SYO +J0HPCQFfF0BjFHSwwYPKuaR9C8zMdLNhK5/qdh/NU7czNi9fsZ7moh7SkRFbzJzN +OxbKD9t/CzJEMQEXeF/nWTfsSpUgILqqZtAxuuFLbAcaAnJYlCKdAumQgQKBgQCK +mqjJh68pn7gJwGUjoYNe1xtGbSsqHI9F9ovZ0MPO1v6e5M7sQJHH+Fnnxzv/y8e8 +d6tz8e73iX1IHymDKv35uuZHCGF1XOR+qrA/KQUc+vcKf21OXsP/JtkTRs1HLoRD +S5aRf2DWcfvniyYARSNU2xTM8GWgi2ueWbMDHUp+ZwKBgA/swC+K+Jg5DEWm6Sau +e6y+eC6S+SoXEKkI3wf7m9aKoZo0y+jh8Gas6gratlc181pSM8O3vZG0n19b493I +apCFomMLE56zEzvyzfpsNhFhk5MBMCn0LPyzX6MiynRlGyWIj0c99fbHI3pOMufP +WgmVLTZ8uDcSW1MbdUCwFSk5 +-----END PRIVATE KEY----- +Bag Attributes + friendlyName: test-alias + localKeyID: 54 69 6D 65 20 31 36 38 33 32 38 36 31 31 34 30 37 31 +subject=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +issuer=C = US, ST = California, L = Palo Alto, O = VMware, OU = Spring, CN = localhost +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIIFMqbpqvipw0wDQYJKoZIhvcNAQELBQAwbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAgFw0yMzA1MDUxMTI2NThaGA8yMTIzMDQxMTExMjY1OFowbDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEP +MA0GA1UEChMGVk13YXJlMQ8wDQYDVQQLEwZTcHJpbmcxEjAQBgNVBAMTCWxvY2Fs +aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPwHWxoE3xjRmNdD ++m+e/aFlr5wEGQUdWSDD613OB1w7kqO/audEp3c6HxDB3GPcEL0amJwXgY6CQMYu +sythuZX/EZSc2HdilTBu/5T+mbdWe5JkKThpiA0RYeucQfKuB7zv4ypioa4wiR4D +nPsZXjg95OF8pCzYEssv8wT49v+M3ohWUgfF0FPlMFCSo0YVTuzB1mhDlWKq/jhQ +11WpTmk/dQX+l6ts6bYIcJt4uItG+a68a4FutuSjZdTAE0f5SOYRBpGH96mjLwEP +fW8ZjzvKb9g4R2kiuoPxvCDs1Y/8V2yvKqLyn5Tx9x/DjFmOi0DRK/TgELvNceCb +UDJmhXMCAwEAAaNPME0wHQYDVR0OBBYEFMBIGU1nwix5RS3O5hGLLoMdR1+NMCwG +A1UdEQQlMCOCCWxvY2FsaG9zdIcQAAAAAAAAAAAAAAAAAAAAAYcEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAhepfJgTFvqSccsT97XdAZfvB0noQx5NSynRV8NWmeOld +hHP6Fzj6xCxHSYvlUfmX8fVP9EOAuChgcbbuTIVJBu60rnDT21oOOnp8FvNonCV6 +gJ89sCL7wZ77dw2RKIeUFjXXEV3QJhx2wCOVmLxnJspDoKFIEVjfLyiPXKxqe/6b +dG8zzWDZ6z+M2JNCtVoOGpljpHqMPCmbDktncv6H3dDTZ83bmLj1nbpOU587gAJ8 +fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z +ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== +-----END CERTIFICATE----- diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test.jks b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..74279d80fbac881c51e7a0fadebd9832e904240d GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test.p12 b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/server/test.p12 new file mode 100644 index 0000000000000000000000000000000000000000..e1255f26f6659a9694a412c77aea76ebeb571985 GIT binary patch literal 7441 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 Z4NE5WCo01)iigeN*5<0D^8Z*S{{=9b#?k-) literal 0 HcmV?d00001 diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/view/template.html b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/view/template.html deleted file mode 100644 index fa22264e2356..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/web/servlet/view/template.html +++ /dev/null @@ -1 +0,0 @@ -Hello {{World}} diff --git a/spring-boot-project/spring-boot/src/test/resources/other.yml b/spring-boot-project/spring-boot/src/test/resources/other.yml deleted file mode 100644 index b5bbd790764e..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/other.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -name: other diff --git a/spring-boot-project/spring-boot/src/test/resources/override.properties b/spring-boot-project/spring-boot/src/test/resources/override.properties deleted file mode 100644 index 6e30e3fc4dbb..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/override.properties +++ /dev/null @@ -1,4 +0,0 @@ -foo=bar -bar=override -SPAM=BUCKET -THE_NAME=NAME diff --git a/spring-boot-project/spring-boot/src/test/resources/schema.sql b/spring-boot-project/spring-boot/src/test/resources/schema.sql deleted file mode 100644 index 556b5e372a9f..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/schema.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE EXAMPLE ( - id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - name VARCHAR(30) -); \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/some.properties b/spring-boot-project/spring-boot/src/test/resources/some.properties deleted file mode 100644 index a1e02b448092..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/some.properties +++ /dev/null @@ -1,4 +0,0 @@ -foo=spam -bar=some -spam=bucket -the-name=name diff --git a/spring-boot-project/spring-boot/src/test/resources/specific.properties b/spring-boot-project/spring-boot/src/test/resources/specific.properties deleted file mode 100644 index 81ea94880041..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/specific.properties +++ /dev/null @@ -1 +0,0 @@ -my.property=root diff --git a/spring-boot-project/spring-boot/src/test/resources/specificlocation.properties b/spring-boot-project/spring-boot/src/test/resources/specificlocation.properties deleted file mode 100644 index 25638d8453c6..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/specificlocation.properties +++ /dev/null @@ -1,2 +0,0 @@ -my.property=fromspecificlocation -the.property=fromspecificlocation diff --git a/spring-boot-project/spring-boot/src/test/resources/spring-application-config-property-source.properties b/spring-boot-project/spring-boot/src/test/resources/spring-application-config-property-source.properties deleted file mode 100644 index c1b09576e254..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/spring-application-config-property-source.properties +++ /dev/null @@ -1 +0,0 @@ -test.name=spring-application-config-property-source \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/test-banner-with-placeholder.txt b/spring-boot-project/spring-boot/src/test/resources/test-banner-with-placeholder.txt deleted file mode 100644 index 96a027ca9fc2..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/test-banner-with-placeholder.txt +++ /dev/null @@ -1,3 +0,0 @@ -Running a Test! - -${test.property} \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/test-banner.txt b/spring-boot-project/spring-boot/src/test/resources/test-banner.txt deleted file mode 100644 index d60fc28bdea9..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/test-banner.txt +++ /dev/null @@ -1 +0,0 @@ -Running a Test! \ No newline at end of file diff --git a/spring-boot-project/spring-boot/src/test/resources/testactiveprofiles.properties b/spring-boot-project/spring-boot/src/test/resources/testactiveprofiles.properties deleted file mode 100644 index 11cdae3b77e6..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testactiveprofiles.properties +++ /dev/null @@ -1 +0,0 @@ -spring.profiles.active=${activeProfile:propertiesfile} diff --git a/spring-boot-project/spring-boot/src/test/resources/testprofiles-default.properties b/spring-boot-project/spring-boot/src/test/resources/testprofiles-default.properties deleted file mode 100644 index 841423aee6c2..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testprofiles-default.properties +++ /dev/null @@ -1 +0,0 @@ -my.property=fromdefaultpropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/testprofiles-thedefault.properties b/spring-boot-project/spring-boot/src/test/resources/testprofiles-thedefault.properties deleted file mode 100644 index bc81eb60a66c..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testprofiles-thedefault.properties +++ /dev/null @@ -1,2 +0,0 @@ -my.property=fromdefaultpropertiesfile -the.property=fromdefaultpropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/testprofiles.yml b/spring-boot-project/spring-boot/src/test/resources/testprofiles.yml deleted file mode 100644 index dbe7c5f27205..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testprofiles.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -my: - property: fromyamlfile - other: notempty ---- -spring.config.activate.on-profile: dev -my: - property: fromdevprofile ---- -spring.config.activate.on-profile: other -my: - property: fromotherprofile diff --git a/spring-boot-project/spring-boot/src/test/resources/testproperties.properties b/spring-boot-project/spring-boot/src/test/resources/testproperties.properties deleted file mode 100644 index c523d5905871..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testproperties.properties +++ /dev/null @@ -1,2 +0,0 @@ -my.property=frompropertiesfile -the.property=frompropertiesfile diff --git a/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofiles.yml b/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofiles.yml deleted file mode 100644 index 348c27211cd9..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofiles.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -spring: - profiles: - active: dev,healthcheck diff --git a/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileslist.yml b/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileslist.yml deleted file mode 100644 index f53736316044..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileslist.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -spring: - profiles: - active: - - dev - - healthcheck diff --git a/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileswhitespace.yml b/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileswhitespace.yml deleted file mode 100644 index cbce97c51042..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testsetmultiprofileswhitespace.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -spring: - profiles: - active: dev, healthcheck diff --git a/spring-boot-project/spring-boot/src/test/resources/testyaml.yml b/spring-boot-project/spring-boot/src/test/resources/testyaml.yml deleted file mode 100644 index ffce1bd30924..000000000000 --- a/spring-boot-project/spring-boot/src/test/resources/testyaml.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -my: - property: fromyamlfile - array: [1,2,3] From a0ff9f6e3357ae6f239dcb8a508f1942a5ed4197 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 26 Feb 2025 19:26:45 +0000 Subject: [PATCH 027/179] Upgrade to Gradle 8.13 --- gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43705 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34744 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 delta 34727 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�{ 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 a%EQ2*fnt2> Date: Thu, 27 Feb 2025 08:40:59 +0100 Subject: [PATCH 028/179] Reapply "Start building against Spring Framework 6.2.4 snapshots" This reverts commit 4d99e4a69fc07fe8d65cb45629c5c1db12778ff9. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f80f7541c4d2..933406a5f987 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ mavenVersion=3.9.4 mockitoVersion=5.14.2 nativeBuildToolsVersion=0.10.5 snakeYamlVersion=2.3 -springFrameworkVersion=6.2.3 +springFrameworkVersion=6.2.4-SNAPSHOT springFramework60xVersion=6.0.23 tomcatVersion=10.1.36 From facda3dca93638bc03249a09ca9f5a61d76cab49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 27 Feb 2025 09:38:26 +0100 Subject: [PATCH 029/179] Adapt to change in exception hierarchy See gh-44442 --- .../org/springframework/boot/SpringApplicationTests.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index b3de570c4adb..fb6e689192ba 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -46,6 +46,7 @@ import org.springframework.aot.AotDetector; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCurrentlyInCreationException; +import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.UnsatisfiedDependencyException; import org.springframework.beans.factory.annotation.Autowired; @@ -220,8 +221,10 @@ void sourcesMustNotBeEmpty() { @Test void sourcesMustBeAccessible() { - assertThatIllegalArgumentException() + assertThatExceptionOfType(BeanDefinitionStoreException.class) .isThrownBy(() -> new SpringApplication(InaccessibleConfiguration.class).run()) + .havingRootCause() + .isInstanceOf(IllegalArgumentException.class) .withMessageContaining("No visible constructors"); } From 21a531936236dee4dfcd220cde44d54d57796980 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 27 Feb 2025 10:47:45 +0000 Subject: [PATCH 030/179] Revert "Use Framework's default class loader as default in ImportCandidates" This reverts commit 56c955158d76461e3c1434c4a3dc6c7cdde04191. See gh-44401 --- .../boot/context/annotation/ImportCandidates.java | 8 +++----- .../boot/context/annotation/ImportCandidatesTests.java | 3 ++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java index 24450a9aaab1..59fe569e94fb 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/annotation/ImportCandidates.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2025 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,6 @@ import org.springframework.core.io.UrlResource; import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; /** * Contains {@code @Configuration} import candidates, usually auto-configurations. @@ -75,8 +74,7 @@ public List getCandidates() { * Every line contains the full qualified name of the candidate class. Comments are * supported using the # character. * @param annotation annotation to load - * @param classLoader class loader to use for loading, or {@code null} to use the - * {@link ClassUtils#getDefaultClassLoader() default class loader} + * @param classLoader class loader to use for loading * @return list of names of annotated classes */ public static ImportCandidates load(Class annotation, ClassLoader classLoader) { @@ -94,7 +92,7 @@ public static ImportCandidates load(Class annotation, ClassLoader classLoader private static ClassLoader decideClassloader(ClassLoader classLoader) { if (classLoader == null) { - return ClassUtils.getDefaultClassLoader(); + return ImportCandidates.class.getClassLoader(); } return classLoader; } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java index 8af49ee43a1e..b1056a860097 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/annotation/ImportCandidatesTests.java @@ -47,7 +47,8 @@ class ImportCandidatesTests { """) void loadReadsFromClasspathFile() { - ImportCandidates candidates = ImportCandidates.load(TestAnnotation.class, null); + ImportCandidates candidates = ImportCandidates.load(TestAnnotation.class, + Thread.currentThread().getContextClassLoader()); assertThat(candidates).containsExactly("class1", "class2", "class3"); } From be7e952e91ce18d7c6a6384cb04d9ca3fb46be52 Mon Sep 17 00:00:00 2001 From: Dmytro Nosan Date: Thu, 27 Feb 2025 20:40:47 +0200 Subject: [PATCH 031/179] Close InputStream when loading Log4j2 Configuration from a Resource See gh-44467 Signed-off-by: Dmytro Nosan --- .../logging/log4j2/Log4J2LoggingSystem.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java index 21d4d47a3971..e58235620e4d 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.logging.log4j2; import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; @@ -278,13 +279,11 @@ protected void loadConfiguration(String location, LogFile logFile, List private Configuration load(String location, LoggerContext context) throws IOException { Resource resource = new ApplicationResourceLoader().getResource(location); - ConfigurationSource source = getConfigurationSource(resource); - return ConfigurationFactory.getInstance().getConfiguration(context, source); - } - - private ConfigurationSource getConfigurationSource(Resource resource) throws IOException { + ConfigurationFactory factory = ConfigurationFactory.getInstance(); if (resource.isFile()) { - return new ConfigurationSource(resource.getInputStream(), resource.getFile()); + try (InputStream inputStream = resource.getInputStream()) { + return factory.getConfiguration(context, new ConfigurationSource(inputStream, resource.getFile())); + } } URL url = resource.getURL(); AuthorizationProvider authorizationProvider = ConfigurationFactory @@ -293,7 +292,10 @@ private ConfigurationSource getConfigurationSource(Resource resource) throws IOE ? SslConfigurationFactory.getSslConfiguration() : null; URLConnection connection = UrlConnectionFactory.createConnection(url, 0, sslConfiguration, authorizationProvider); - return new ConfigurationSource(connection.getInputStream(), url, connection.getLastModified()); + try (InputStream inputStream = connection.getInputStream()) { + return factory.getConfiguration(context, + new ConfigurationSource(inputStream, url, connection.getLastModified())); + } } private CompositeConfiguration createComposite(List configurations) { From c98f9ac126f2047a6854b66f7f4b492a674a1ba9 Mon Sep 17 00:00:00 2001 From: Dmitry Sulman Date: Thu, 27 Feb 2025 10:36:01 +0200 Subject: [PATCH 032/179] Update version of Elasticsearch test container image See gh-44459 Signed-off-by: Dmitry Sulman --- .../springframework/boot/testsupport/container/TestImage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java index e5fe57629bee..08d388c50bba 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java @@ -85,7 +85,7 @@ public enum TestImage { /** * A Docker image suitable for Elasticsearch 7. */ - ELASTICSEARCH("docker.elastic.co/elasticsearch/elasticsearch", "7.17.5", () -> ElasticsearchContainer.class, + ELASTICSEARCH("docker.elastic.co/elasticsearch/elasticsearch", "7.17.28", () -> ElasticsearchContainer.class, (container) -> ((ElasticsearchContainer) container).withEnv("ES_JAVA_OPTS", "-Xms32m -Xmx512m") .withStartupAttempts(5) .withStartupTimeout(Duration.ofMinutes(10))), From 7276be825a13fd9dd331c91155144f447af0236f Mon Sep 17 00:00:00 2001 From: Dmitry Sulman Date: Thu, 27 Feb 2025 12:34:30 +0200 Subject: [PATCH 033/179] Update version of Neo4j test container image See gh-44463 Signed-off-by: Dmitry Sulman --- .../springframework/boot/testsupport/container/TestImage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java index 08d388c50bba..5dbd06d14f3b 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java @@ -125,7 +125,7 @@ public enum TestImage { /** * A container image suitable for testing Neo4j. */ - NEO4J("neo4j", "4.4.11", () -> Neo4jContainer.class, + NEO4J("neo4j", "4.4.41", () -> Neo4jContainer.class, (container) -> ((Neo4jContainer) container).withStartupAttempts(5) .withStartupTimeout(Duration.ofMinutes(10))), From c91c8e202af518b0415892f561b51ae6cd1e9f20 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 28 Feb 2025 10:53:54 +0100 Subject: [PATCH 034/179] Fix tests --- ...horizationServerWebSecurityConfigurationTests.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerWebSecurityConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerWebSecurityConfigurationTests.java index 37ceafca1adb..48a40f8ceb54 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerWebSecurityConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerWebSecurityConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,6 @@ import org.springframework.context.annotation.Import; import org.springframework.core.annotation.Order; import org.springframework.security.config.BeanIds; -import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.oauth2.core.AuthorizationGrantType; @@ -36,7 +35,7 @@ import org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository; import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; -import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration; import org.springframework.security.oauth2.server.authorization.oidc.web.OidcClientRegistrationEndpointFilter; import org.springframework.security.oauth2.server.authorization.oidc.web.OidcProviderConfigurationEndpointFilter; import org.springframework.security.oauth2.server.authorization.oidc.web.OidcUserInfoEndpointFilter; @@ -164,11 +163,7 @@ static class TestSecurityFilterChainConfiguration { @Bean @Order(1) SecurityFilterChain authServerSecurityFilterChain(HttpSecurity http) throws Exception { - OAuth2AuthorizationServerConfigurer authorizationServer = OAuth2AuthorizationServerConfigurer - .authorizationServer(); - http.securityMatcher(authorizationServer.getEndpointsMatcher()) - .with(authorizationServer, Customizer.withDefaults()); - http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()); + OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); return http.build(); } From e1f45c50ee99de5c536f09dcc3b68276be13cdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 28 Feb 2025 10:41:55 +0100 Subject: [PATCH 035/179] Generate reflection hints for main methods This commit makes sure to register the necessary hints to invoke the main method of any bean available in the context. This is necessary for tests that use the UseMainMethod feature. This generates more hints than strictly necessary as there isn't a way to contribute hints based on a ContextLoader, see https://github.com/spring-projects/spring-framework/issues/34513 for more details. Closes gh-44461 --- .../test/context/SpringBootContextLoader.java | 60 ++++++++++++++++--- .../resources/META-INF/spring/aot.factories | 2 + .../context/SpringBootContextLoaderTests.java | 37 +++++++++++- 3 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 spring-boot-project/spring-boot-test/src/main/resources/META-INF/spring/aot.factories diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java index c58f1bc4da2e..6fe35dc2b9d3 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,11 +19,19 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.function.Consumer; +import org.springframework.aot.generate.GenerationContext; +import org.springframework.aot.hint.ExecutableMode; +import org.springframework.aot.hint.ReflectionHints; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution; +import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor; +import org.springframework.beans.factory.aot.BeanFactoryInitializationCode; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.ApplicationContextFactory; import org.springframework.boot.Banner; import org.springframework.boot.ConfigurableBootstrapContext; @@ -158,20 +166,23 @@ private Method getMainMethod(MergedContextConfiguration mergedConfig, UseMainMet .orElse(null); Assert.state(springBootConfiguration != null || useMainMethod == UseMainMethod.WHEN_AVAILABLE, "Cannot use main method as no @SpringBootConfiguration-annotated class is available"); - Method mainMethod = (springBootConfiguration != null) - ? ReflectionUtils.findMethod(springBootConfiguration, "main", String[].class) : null; + Method mainMethod = findMainMethod(springBootConfiguration); + Assert.state(mainMethod != null || useMainMethod == UseMainMethod.WHEN_AVAILABLE, + () -> "Main method not found on '%s'".formatted(springBootConfiguration.getName())); + return mainMethod; + } + + private static Method findMainMethod(Class type) { + Method mainMethod = (type != null) ? ReflectionUtils.findMethod(type, "main", String[].class) : null; if (mainMethod == null && KotlinDetector.isKotlinPresent()) { try { - Class kotlinClass = ClassUtils.forName(springBootConfiguration.getName() + "Kt", - springBootConfiguration.getClassLoader()); + Class kotlinClass = ClassUtils.forName(type.getName() + "Kt", type.getClassLoader()); mainMethod = ReflectionUtils.findMethod(kotlinClass, "main", String[].class); } catch (ClassNotFoundException ex) { // Ignore } } - Assert.state(mainMethod != null || useMainMethod == UseMainMethod.WHEN_AVAILABLE, - () -> "Main method not found on '%s'".formatted(springBootConfiguration.getName())); return mainMethod; } @@ -574,4 +585,39 @@ private ApplicationContext run(ThrowingSupplier } + static class MainMethodBeanFactoryInitializationAotProcessor implements BeanFactoryInitializationAotProcessor { + + @Override + public BeanFactoryInitializationAotContribution processAheadOfTime( + ConfigurableListableBeanFactory beanFactory) { + List mainMethods = new ArrayList<>(); + for (String beanName : beanFactory.getBeanDefinitionNames()) { + Class beanType = beanFactory.getType(beanName); + Method mainMethod = findMainMethod(beanType); + if (mainMethod != null) { + mainMethods.add(mainMethod); + } + } + return !mainMethods.isEmpty() ? new AotContribution(mainMethods) : null; + } + + static class AotContribution implements BeanFactoryInitializationAotContribution { + + private final Collection mainMethods; + + AotContribution(Collection mainMethods) { + this.mainMethods = mainMethods; + } + + @Override + public void applyTo(GenerationContext generationContext, + BeanFactoryInitializationCode beanFactoryInitializationCode) { + ReflectionHints reflectionHints = generationContext.getRuntimeHints().reflection(); + this.mainMethods.forEach((method) -> reflectionHints.registerMethod(method, ExecutableMode.INVOKE)); + } + + } + + } + } diff --git a/spring-boot-project/spring-boot-test/src/main/resources/META-INF/spring/aot.factories b/spring-boot-project/spring-boot-test/src/main/resources/META-INF/spring/aot.factories new file mode 100644 index 000000000000..ba72dcee9a7d --- /dev/null +++ b/spring-boot-project/spring-boot-test/src/main/resources/META-INF/spring/aot.factories @@ -0,0 +1,2 @@ +org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=\ +org.springframework.boot.test.context.SpringBootContextLoader.MainMethodBeanFactoryInitializationAotProcessor diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java index f9cc7f6e69ca..fdd33697eec3 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,10 +25,16 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; +import org.springframework.aot.test.generate.TestGenerationContext; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.ApplicationContextFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.test.context.SpringBootContextLoader.MainMethodBeanFactoryInitializationAotProcessor; import org.springframework.boot.test.context.SpringBootTest.UseMainMethod; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.boot.web.reactive.context.GenericReactiveWebApplicationContext; @@ -248,6 +254,35 @@ void whenUseMainMethodWithContextHierarchyThrowsException() { .withMessage("UseMainMethod.ALWAYS cannot be used with @ContextHierarchy tests"); } + @Test + void whenMainMethodPresentRegisterReflectionHints() { + TestContext testContext = new ExposedTestContextManager(UseMainMethodWhenAvailableAndNoMainMethod.class) + .getExposedTestContext(); + ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) testContext + .getApplicationContext() + .getAutowireCapableBeanFactory(); + BeanFactoryInitializationAotContribution aotContribution = new MainMethodBeanFactoryInitializationAotProcessor() + .processAheadOfTime(beanFactory); + assertThat(aotContribution).isNull(); + } + + @Test + void whenMainMethodNotAvailableReturnsNoAotContribution() { + TestContext testContext = new ExposedTestContextManager(UseMainMethodWhenAvailableAndMainMethod.class) + .getExposedTestContext(); + ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) testContext + .getApplicationContext() + .getAutowireCapableBeanFactory(); + BeanFactoryInitializationAotContribution aotContribution = new MainMethodBeanFactoryInitializationAotProcessor() + .processAheadOfTime(beanFactory); + assertThat(aotContribution).isNotNull(); + TestGenerationContext generationContext = new TestGenerationContext(); + aotContribution.applyTo(generationContext, null); + RuntimeHints runtimeHints = generationContext.getRuntimeHints(); + assertThat(RuntimeHintsPredicates.reflection().onMethod(ConfigWithMain.class, "main").invoke()) + .accepts(runtimeHints); + } + @Test void whenSubclassProvidesCustomApplicationContextFactory() { TestContext testContext = new ExposedTestContextManager(CustomApplicationContextTest.class) From 23fd79f42579f508696a24df9905cb413ded45b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20K=C3=B6nig?= Date: Thu, 27 Feb 2025 10:26:19 +0100 Subject: [PATCH 036/179] Remove obsolete hints for Flyway Teams features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See gh-44460 Signed-off-by: Benjamin König --- .../flyway/FlywayAutoConfiguration.java | 1 - .../autoconfigure/flyway/FlywayProperties.java | 16 +++++++--------- .../flyway/FlywayAutoConfigurationTests.java | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java index 0dff5cd44e87..85ecd4d5e39f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java @@ -302,7 +302,6 @@ private void configureProperties(FluentConfiguration configuration, FlywayProper .to((suffix) -> configuration.scriptPlaceholderSuffix(suffix)); configureExecuteInTransaction(configuration, properties, map); map.from(properties::getLoggers).to((loggers) -> configuration.loggers(loggers)); - // Flyway Teams properties map.from(properties.getBatch()).to((batch) -> configuration.batch(batch)); map.from(properties.getDryRunOutput()).to((dryRunOutput) -> configuration.dryRunOutput(dryRunOutput)); map.from(properties.getErrorOverrides()) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java index b64f6c6dfb94..e76ed189921d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java @@ -275,7 +275,7 @@ public class FlywayProperties { private String[] loggers = { "slf4j" }; /** - * Whether to batch SQL statements when executing them. Requires Flyway Teams. + * Whether to batch SQL statements when executing them. */ private Boolean batch; @@ -292,12 +292,12 @@ public class FlywayProperties { private String[] errorOverrides; /** - * Whether to stream SQL migrations when executing them. Requires Flyway Teams. + * Whether to stream SQL migrations when executing them. */ private Boolean stream; /** - * Properties to pass to the JDBC driver. Requires Flyway Teams. + * Properties to pass to the JDBC driver. */ private Map jdbcProperties = new HashMap<>(); @@ -308,25 +308,23 @@ public class FlywayProperties { /** * Whether Flyway should output a table with the results of queries when executing - * migrations. Requires Flyway Teams. + * migrations. */ private Boolean outputQueryResults; /** * Whether Flyway should skip executing the contents of the migrations and only update - * the schema history table. Requires Flyway teams. + * the schema history table. */ private Boolean skipExecutingMigrations; /** - * Ignore migrations that match this comma-separated list of patterns when validating - * migrations. Requires Flyway Teams. + * List of patterns that identify migrations to ignore when performing validation. */ private List ignoreMigrationPatterns; /** - * Whether to attempt to automatically detect SQL migration file encoding. Requires - * Flyway Teams. + * Whether to attempt to automatically detect SQL migration file encoding. */ private Boolean detectEncoding; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java index 8522befc2596..ba1d009cd3aa 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java @@ -33,6 +33,7 @@ import org.flywaydb.core.api.callback.Event; import org.flywaydb.core.api.configuration.FluentConfiguration; import org.flywaydb.core.api.migration.JavaMigration; +import org.flywaydb.core.api.pattern.ValidatePattern; import org.flywaydb.core.internal.license.FlywayEditionUpgradeRequiredException; import org.flywaydb.database.oracle.OracleConfigurationExtension; import org.flywaydb.database.postgresql.PostgreSQLConfigurationExtension; @@ -915,6 +916,22 @@ void shouldRegisterResourceHints() { assertThat(RuntimeHintsPredicates.resource().forResource("db/migration/V1__init.sql")).accepts(runtimeHints); } + @Test + void detectEncodingCorrectlyMapped() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.detect-encoding=true") + .run((context) -> assertThat(context.getBean(Flyway.class).getConfiguration().isDetectEncoding()) + .isEqualTo(true)); + } + + @Test + void ignoreMigrationPatternsCorrectlyMapped() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.ignore-migration-patterns=*:missing") + .run((context) -> assertThat(context.getBean(Flyway.class).getConfiguration().getIgnoreMigrationPatterns()) + .containsExactly(ValidatePattern.fromPattern("*:missing"))); + } + private ContextConsumer validateFlywayTeamsPropertyOnly(String propertyName) { return (context) -> { assertThat(context).hasFailed(); From 0f4e361a95f4d2f252cc5cde7e716942561bec69 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Fri, 28 Feb 2025 03:11:32 +0700 Subject: [PATCH 037/179] Fix typo in javadoc See gh-44469 Signed-off-by: Tran Ngoc Nhan --- .../boot/logging/structured/CommonStructuredLogFormat.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/structured/CommonStructuredLogFormat.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/structured/CommonStructuredLogFormat.java index acba34b7cd68..16be28491d6e 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/structured/CommonStructuredLogFormat.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/structured/CommonStructuredLogFormat.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ public enum CommonStructuredLogFormat { /** - * Elasic Common + * Elastic Common * Schema (ECS) log format. */ ELASTIC_COMMON_SCHEMA("ecs"), From c641b3fd300d6c8a54c49acd42624614be86c344 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:59:49 +0000 Subject: [PATCH 038/179] Bump solid-js from 1.8.17 to 1.9.5 in /antora Bumps [solid-js](https://github.com/solidjs/solid) from 1.8.17 to 1.9.5. - [Release notes](https://github.com/solidjs/solid/releases) - [Changelog](https://github.com/solidjs/solid/blob/main/CHANGELOG.md) - [Commits](https://github.com/solidjs/solid/compare/v1.8.17...v1.9.5) --- updated-dependencies: - dependency-name: solid-js dependency-type: indirect ... See gh-44432 Signed-off-by: dependabot[bot] --- antora/package-lock.json | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/antora/package-lock.json b/antora/package-lock.json index 6a4ad14dc9fc..422a3e880087 100644 --- a/antora/package-lock.json +++ b/antora/package-lock.json @@ -2668,17 +2668,19 @@ } }, "node_modules/seroval": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.0.7.tgz", - "integrity": "sha512-n6ZMQX5q0Vn19Zq7CIKNIo7E75gPkGCFUEqDpa8jgwpYr/vScjqnQ6H09t1uIiZ0ZSK0ypEGvrYK2bhBGWsGdw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.2.1.tgz", + "integrity": "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.0.7.tgz", - "integrity": "sha512-GO7TkWvodGp6buMEX9p7tNyIkbwlyuAWbI6G9Ec5bhcm7mQdu3JOK1IXbEUwb3FVzSc363GraG/wLW23NSavIw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.2.1.tgz", + "integrity": "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -2790,13 +2792,14 @@ } }, "node_modules/solid-js": { - "version": "1.8.17", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.17.tgz", - "integrity": "sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.5.tgz", + "integrity": "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==", + "license": "MIT", "dependencies": { "csstype": "^3.1.0", - "seroval": "^1.0.4", - "seroval-plugins": "^1.0.3" + "seroval": "^1.1.0", + "seroval-plugins": "^1.1.0" } }, "node_modules/sonic-boom": { From 7d01c941b93d1a4eaa1882646089927641520986 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 28 Feb 2025 12:23:08 +0000 Subject: [PATCH 039/179] Use WithPackageResources on shouldUpdateSslWhenReloadingSslBundles See gh-44397 --- .../tomcat/TomcatServletWebServerFactoryTests.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java index 3bad808a85f0..9f1f91d0de56 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java @@ -660,12 +660,12 @@ void whenServerIsShuttingDownARequestOnAnIdleConnectionResultsInConnectionReset( } @Test + @WithPackageResources({ "1.crt", "1.key", "2.crt", "2.key" }) void shouldUpdateSslWhenReloadingSslBundles() throws Exception { TomcatServletWebServerFactory factory = getFactory(); addTestTxtFile(factory); DefaultSslBundleRegistry bundles = new DefaultSslBundleRegistry("test", - createPemSslBundle("classpath:org/springframework/boot/web/embedded/tomcat/1.crt", - "classpath:org/springframework/boot/web/embedded/tomcat/1.key")); + createPemSslBundle("classpath:1.crt", "classpath:1.key")); factory.setSslBundles(bundles); factory.setSsl(Ssl.forBundle("test")); this.webServer = factory.getWebServer(); @@ -677,8 +677,7 @@ void shouldUpdateSslWhenReloadingSslBundles() throws Exception { assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); assertThat(verifier.getLastPrincipal()).isEqualTo("CN=1"); requestFactory = createHttpComponentsRequestFactory(socketFactory); - bundles.updateBundle("test", createPemSslBundle("classpath:org/springframework/boot/web/embedded/tomcat/2.crt", - "classpath:org/springframework/boot/web/embedded/tomcat/2.key")); + bundles.updateBundle("test", createPemSslBundle("classpath:2.crt", "classpath:2.key")); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); assertThat(verifier.getLastPrincipal()).isEqualTo("CN=2"); } From e69683769e893a727b2921787057641fbba271cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 28 Feb 2025 14:24:32 +0100 Subject: [PATCH 040/179] Start building against Spring Framework 6.1.18 snapshots See gh-44491 --- gradle.properties | 2 +- .../springframework/boot/SpringApplicationTests.java | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index c4724186ec70..70d658e33d08 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ mavenVersion=3.9.4 mockitoVersion=5.11.0 nativeBuildToolsVersion=0.10.5 snakeYamlVersion=2.2 -springFrameworkVersion=6.1.17 +springFrameworkVersion=6.1.18-SNAPSHOT springFramework60xVersion=6.0.23 tomcatVersion=10.1.36 diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index 57a473052645..aaa1fdf0dda7 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -48,6 +48,7 @@ import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCurrentlyInCreationException; +import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.UnsatisfiedDependencyException; import org.springframework.beans.factory.annotation.Autowired; @@ -221,8 +222,10 @@ void sourcesMustNotBeEmpty() { @Test void sourcesMustBeAccessible() { - assertThatIllegalArgumentException() + assertThatExceptionOfType(BeanDefinitionStoreException.class) .isThrownBy(() -> new SpringApplication(InaccessibleConfiguration.class).run()) + .havingRootCause() + .isInstanceOf(IllegalArgumentException.class) .withMessageContaining("No visible constructors"); } @@ -1602,6 +1605,11 @@ static class InaccessibleConfiguration { private InaccessibleConfiguration() { } + @Bean + String testMessage() { + return "test"; + } + } static class SpyApplicationContext extends AnnotationConfigApplicationContext { From 05082cef4cdb7350973709e4b1dc1b172bf53e6f Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 3 Mar 2025 11:45:48 +0100 Subject: [PATCH 041/179] Update IntelliJ IDEA code style --- .idea/codeStyles/Project.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 8c8b10622eb7..cdd2a9295b1d 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -51,6 +51,8 @@