From ffe1062830af0ad07d625edbc9a2073ef0da3ff7 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 29 Nov 2018 20:00:01 -0500 Subject: [PATCH 001/104] fix: remove unnecessary `branch` parameter from `push` function --- index.js | 2 +- lib/git.js | 3 +-- test/git.test.js | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 0bbfa087..8a77527a 100644 --- a/index.js +++ b/index.js @@ -107,7 +107,7 @@ async function run(context, plugins) { } else { // Create the tag before calling the publish plugins as some require the tag to exists await tag(nextRelease.gitTag, {cwd, env}); - await push(options.repositoryUrl, options.branch, {cwd, env}); + await push(options.repositoryUrl, {cwd, env}); logger.success(`Created tag ${nextRelease.gitTag}`); } diff --git a/lib/git.js b/lib/git.js index be0cdaa1..9aa65885 100644 --- a/lib/git.js +++ b/lib/git.js @@ -143,12 +143,11 @@ async function tag(tagName, execaOpts) { * Push to the remote repository. * * @param {String} repositoryUrl The remote repository URL. - * @param {String} branch The branch to push. * @param {Object} [execaOpts] Options to pass to `execa`. * * @throws {Error} if the push failed. */ -async function push(repositoryUrl, branch, execaOpts) { +async function push(repositoryUrl, execaOpts) { await execa('git', ['push', '--tags', repositoryUrl], execaOpts); } diff --git a/test/git.test.js b/test/git.test.js index 82d4b0b1..661e4ef4 100644 --- a/test/git.test.js +++ b/test/git.test.js @@ -157,7 +157,7 @@ test('Push tag to remote repository', async t => { const commits = await gitCommits(['Test commit'], {cwd}); await tag('tag_name', {cwd}); - await push(repositoryUrl, 'master', {cwd}); + await push(repositoryUrl, {cwd}); t.is(await gitRemoteTagHead(repositoryUrl, 'tag_name', {cwd}), commits[0].hash); }); @@ -171,7 +171,7 @@ test('Push tag to remote repository with remote branch ahaed', async t => { await gitPush('origin', 'master', {cwd: tmpRepo}); await tag('tag_name', {cwd}); - await push(repositoryUrl, 'master', {cwd}); + await push(repositoryUrl, {cwd}); t.is(await gitRemoteTagHead(repositoryUrl, 'tag_name', {cwd}), commits[0].hash); }); From cd695837468818a747276617316d0b299d1dc455 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 30 Nov 2018 01:11:00 -0500 Subject: [PATCH 002/104] test: delete unused test helper file --- test/helpers/mock-github.js | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 test/helpers/mock-github.js diff --git a/test/helpers/mock-github.js b/test/helpers/mock-github.js deleted file mode 100644 index e0a62040..00000000 --- a/test/helpers/mock-github.js +++ /dev/null @@ -1,16 +0,0 @@ -import nock from 'nock'; - -/** - * Retun a `nock` object setup to respond to a github authentication request. Other expectation and responses can be chained. - * - * @param {String} [githubToken='GH_TOKEN'] The github token to return in the authentication response. - * @param {String} [githubUrl='https://api.github.com'] The url on which to intercept http requests. - * @return {Object} A `nock` object ready to respond to a github authentication request. - */ -export default function authenticate({ - githubToken = 'GH_TOKEN', - githubUrl = 'https://api.github.com', - githubApiPathPrefix = '', -} = {}) { - return nock(`${githubUrl}/${githubApiPathPrefix}`, {reqheaders: {Authorization: `token ${githubToken}`}}); -} From d1091133b94fc08d06a5ff1ef9074ba448fe8fb4 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 30 Nov 2018 01:44:10 -0500 Subject: [PATCH 003/104] chore(package): update nyc and sinon --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b7eb7bd3..9172fd81 100644 --- a/package.json +++ b/package.json @@ -60,10 +60,10 @@ "js-yaml": "^3.10.0", "mockserver-client": "^5.1.1", "nock": "^10.0.0", - "nyc": "^12.0.1", + "nyc": "^13.1.0", "p-retry": "^2.0.0", "proxyquire": "^2.0.0", - "sinon": "^6.0.0", + "sinon": "^7.1.1", "stream-buffers": "^3.0.2", "tempy": "^0.2.1", "xo": "^0.23.0" From a45273e9215b81afbd3e1b0caf1c7920eabfc7b0 Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Fri, 23 Nov 2018 13:46:06 -0800 Subject: [PATCH 004/104] docs: add maven-semantic-release to list of community plugins --- docs/extending/plugins-list.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index 3d1bcfff..3320f1ad 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -62,3 +62,8 @@ - [semantic-release-expo](https://github.com/bycedric/semantic-release-expo) - `verifyConditions`: Verify Expo manifest(s) are readable and valid. - `prepare`: Update version, ios build number and android version code in the Expo manifest(s). +- [maven-semantic-release](https://github.com/conveyal/maven-semantic-release) + - `verifyConditions`: Verifies that the pom.xml file and other files exist and are setup to allow releases + - `verifyRelease`: Checks and warns (does not error by default) if the version numbers found on maven central and within the Git project differ by quite a bit + - `prepare`: Changes the version number in the pom.xml (or all pom.xml files in maven projects with multiple pom.xml files). Optionally creates a commit with this version number and pushes it to master + - `publish`: Runs `mvn deploy` to deploy to maven central. Optionally will update to next snapshot version and merge changes to development branch From 6220641aba44720834669176e452228988dd0f74 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 30 Nov 2018 03:11:45 -0500 Subject: [PATCH 005/104] docs: add `@semantic-release/apm` to plugins list --- docs/extending/plugins-list.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index 3320f1ad..dcda4217 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -32,6 +32,10 @@ - `publish`: Execute a shell command to publish the release - `success`: Execute a shell command to notify of a new release - `fail`: Execute a shell command to notify of a failed release +- [@semantic-release/apm](https://github.com/semantic-release/apm) + - `verifyConditions`: Verify the presence of the ATOM_ACCESS_TOKEN environment variable and the apm CLI + - `prepare`: Update the package.json version with npm version + - `publish`: Publish the Atom package ## Community plugins From e4c66497142261e6f6af218800fee314d1753c57 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 30 Nov 2018 03:18:09 -0500 Subject: [PATCH 006/104] docs: syntax fixes in plugins list --- docs/extending/plugins-list.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index dcda4217..838f12f9 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -26,16 +26,16 @@ - [@semantic-release/exec](https://github.com/semantic-release/exec) - `verifyConditions`: Execute a shell command to verify if the release should happen - `analyzeCommits`: Execute a shell command to determine the type of release - - `verifyRelease`: Execute a shell command to verifying a release that was determined before and is about to be published. + - `verifyRelease`: Execute a shell command to verifying a release that was determined before and is about to be published - `generateNotes`: Execute a shell command to generate the release note - `prepare`: Execute a shell command to prepare the release - `publish`: Execute a shell command to publish the release - `success`: Execute a shell command to notify of a new release - `fail`: Execute a shell command to notify of a failed release - [@semantic-release/apm](https://github.com/semantic-release/apm) - - `verifyConditions`: Verify the presence of the ATOM_ACCESS_TOKEN environment variable and the apm CLI - - `prepare`: Update the package.json version with npm version - - `publish`: Publish the Atom package + - `verifyConditions`: Verify the presence of the `ATOM_ACCESS_TOKEN` environment variable and the [`apm`](https://github.com/atom/apm) CLI + - `prepare`: Update the `package.json` version with [`npm version`](https://docs.npmjs.com/cli/version) + - `publish`: Publish the [Atom package](https://flight-manual.atom.io/hacking-atom/sections/publishing) ## Community plugins @@ -43,10 +43,10 @@ - [semantic-release-docker](https://github.com/felixfbecker/semantic-release-docker) - `verifyConditions`: Verify that all needed configuration is present and login to the Docker registry. - - `publish`: Tag the image specified by `name` with the new version, push it to Docker Hub and update the latest tag. + - `publish`: Tag the image specified by `name` with the new version, push it to Docker Hub and update the latest tag - [semantic-release-gcr](https://github.com/carlos-cubas/semantic-release-gcr) - - `verifyConditions`: Verify that all needed configuration is present and login to the Docker registry. - - `publish`: Tag the image specified by `name` with the new version, push it to Docker Hub and update the latest tag. + - `verifyConditions`: Verify that all needed configuration is present and login to the Docker registry + - `publish`: Tag the image specified by `name` with the new version, push it to Docker Hub and update the latest tag - [semantic-release-vsce](https://github.com/raix/semantic-release-vsce) - `verifyConditions`: Verify the presence and the validity of the vsce authentication and release configuration - `prepare`: Create a `.vsix` for distribution @@ -55,11 +55,11 @@ - `verifyConditions`: Check the dependencies format against a regexp before a release - [semantic-release-chrome](https://github.com/GabrielDuarteM/semantic-release-chrome) - `verifyConditions`: Verify the presence of the authentication (set via environment variables) - - `prepare`: Write the correct version to the manifest.json and creates a zip file of the whole dist folder + - `prepare`: Write the correct version to the `manifest.json` and creates a zip file of the whole dist folder - `publish`: Uploads the generated zip file to the webstore, and publish the item - [semantic-release-firefox](https://github.com/felixfbecker/semantic-release-firefox) - `verifyConditions`: Verify the presence of the authentication (set via environment variables) - - `prepare`: Write the correct version to the manifest.json, creates a xpi file of the dist folder and a zip of the sources + - `prepare`: Write the correct version to the `manifest.json`, creates a `xpi` file of the dist folder and a zip of the sources - `publish`: Submit the generated archives to the webstore for review, and publish the item including release notes - [semantic-release-gerrit](https://github.com/pascalMN/semantic-release-gerrit) - `generateNotes`: Generate release notes with Gerrit reviews URL @@ -67,7 +67,7 @@ - `verifyConditions`: Verify Expo manifest(s) are readable and valid. - `prepare`: Update version, ios build number and android version code in the Expo manifest(s). - [maven-semantic-release](https://github.com/conveyal/maven-semantic-release) - - `verifyConditions`: Verifies that the pom.xml file and other files exist and are setup to allow releases + - `verifyConditions`: Verifies that the `pom.xml` file and other files exist and are setup to allow releases - `verifyRelease`: Checks and warns (does not error by default) if the version numbers found on maven central and within the Git project differ by quite a bit - - `prepare`: Changes the version number in the pom.xml (or all pom.xml files in maven projects with multiple pom.xml files). Optionally creates a commit with this version number and pushes it to master - - `publish`: Runs `mvn deploy` to deploy to maven central. Optionally will update to next snapshot version and merge changes to development branch + - `prepare`: Changes the version number in the `pom.xml` (or all `pom.xml` files in maven projects with multiple `pom.xml` files) and optionally creates a commit with this version number and pushes it to `master` + - `publish`: Runs `mvn deploy` to deploy to maven central and optionally will update to next snapshot version and merge changes to development branch From 6b110b6e9eea801be87fe18e6860754f8f744ae0 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 23 Nov 2018 22:59:55 -0500 Subject: [PATCH 007/104] docs: switch to spectrum.chat --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c402a4e8..ee9f35bd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@

📦🚀 semantic-release

Fully automated version management and package publishing

- - Gitter + + Join the community on Spectrum Travis @@ -124,7 +124,7 @@ After running the tests, the command `semantic-release` will execute the followi ## Get help - [Stack Overflow](https://stackoverflow.com/questions/tagged/semantic-release) -- [Gitter chat](https://gitter.im/semantic-release/semantic-release) +- [Spectrum community](https://spectrum.chat/semantic-release) - [Twitter](https://twitter.com/SemanticRelease) ## Badge From 862ec4c087b34c089ad62c6ed876992ae8fc89bd Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Tue, 11 Dec 2018 13:25:12 -0500 Subject: [PATCH 008/104] fix: allow to set `ci` option via API and config file --- cli.js | 5 ----- lib/get-config.js | 3 +++ test/cli.test.js | 12 ------------ test/get-config.test.js | 12 ++++++++++++ 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/cli.js b/cli.js index 1ef5f5ba..9d7e03a3 100755 --- a/cli.js +++ b/cli.js @@ -47,11 +47,6 @@ Usage: return 0; } - // Set the `noCi` options as yargs sets the `ci` options instead (because arg starts with `--no`) - if (opts.ci === false) { - opts.noCi = true; - } - if (opts.debug) { // Debug must be enabled before other requires in order to work require('debug').enable('semantic-release:*'); diff --git a/lib/get-config.js b/lib/get-config.js index aaa76b7a..9cf34e0d 100644 --- a/lib/get-config.js +++ b/lib/get-config.js @@ -27,6 +27,9 @@ module.exports = async (context, opts) => { // Merge config file options and CLI/API options let options = {...config, ...opts}; + if (options.ci === false) { + options.noCi = true; + } const pluginsPath = {}; let extendPaths; ({extends: extendPaths, ...options} = options); diff --git a/test/cli.test.js b/test/cli.test.js index bad7efaf..edc72440 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -163,18 +163,6 @@ test.serial('Do not set properties in option for which arg is not in command lin t.false('e' in run.args[0][0]); }); -test.serial('Set "noCi" options to "true" with "--no-ci"', async t => { - const run = stub().resolves(true); - const argv = ['', '', '--no-ci']; - const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - - const exitCode = await cli(); - - t.is(run.args[0][0].noCi, true); - - t.is(exitCode, 0); -}); - test.serial('Display help', async t => { const run = stub().resolves(true); const argv = ['', '', '--help']; diff --git a/test/get-config.test.js b/test/get-config.test.js index 2fb13a7a..568b5870 100644 --- a/test/get-config.test.js +++ b/test/get-config.test.js @@ -67,6 +67,18 @@ test('Default values, reading repositoryUrl (http url) from package.json if not t.is(result.tagFormat, `v\${version}`); }); +test('Convert "ci" option to "noCi"', async t => { + const pkg = {repository: 'https://host.null/owner/module.git', release: {ci: false}}; + // Create a git repository, set the current working directory at the root of the repo + const {cwd} = await gitRepo(); + // Create package.json in repository root + await outputJson(path.resolve(cwd, 'package.json'), pkg); + + const {options: result} = await t.context.getConfig({cwd}); + + t.is(result.noCi, true); +}); + test('Read options from package.json', async t => { // Create a git repository, set the current working directory at the root of the repo const {cwd} = await gitRepo(); From 649b53087a090c245b77a340d813c2a84316d58e Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Tue, 11 Dec 2018 13:25:36 -0500 Subject: [PATCH 009/104] docs: mention that `debug` option is CLI only --- docs/usage/configuration.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/usage/configuration.md b/docs/usage/configuration.md index 12e4d0ec..8a6da186 100644 --- a/docs/usage/configuration.md +++ b/docs/usage/configuration.md @@ -133,6 +133,8 @@ CLI argument: `--debug` Output debugging information. This can also be enabled by setting the `DEBUG` environment variable to `semantic-release:*`. +**Note**: The `debug` is used only supported via CLI argument. To enable debug mode from the [JS API](../developer-guide/js-api.md#javascript-api) use `require('debug').enable('semantic-release:*')`. + ## Git environment variables | Variable | Description | Default | From 89ad3a0b61d2edeeeaf53e3885407304eca7504e Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 12 Dec 2018 15:15:35 +0000 Subject: [PATCH 010/104] chore(package): update p-retry to version 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9172fd81..f3a64505 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "mockserver-client": "^5.1.1", "nock": "^10.0.0", "nyc": "^13.1.0", - "p-retry": "^2.0.0", + "p-retry": "^3.0.0", "proxyquire": "^2.0.0", "sinon": "^7.1.1", "stream-buffers": "^3.0.2", From 0f642ffe4d5e2dc725cdf681c4eca5530b1079a3 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 14 Dec 2018 12:27:37 -0500 Subject: [PATCH 011/104] docs: remove mentions of `travis-deploy-once` --- docs/recipes/README.md | 1 - docs/recipes/travis-build-stages.md | 95 ------------------------ docs/recipes/travis.md | 110 ++++++++++------------------ docs/usage/ci-configuration.md | 2 +- 4 files changed, 39 insertions(+), 169 deletions(-) delete mode 100644 docs/recipes/travis-build-stages.md diff --git a/docs/recipes/README.md b/docs/recipes/README.md index c22cd943..d839f0d5 100644 --- a/docs/recipes/README.md +++ b/docs/recipes/README.md @@ -3,7 +3,6 @@ ## CI configurations - [CircleCI 2.0 workflows](circleci-workflows.md) - [Travis CI](travis.md) -- [Travis CI with build stages](travis-build-stages.md) - [GitLab CI](gitlab-ci.md) ## Git hosted services diff --git a/docs/recipes/travis-build-stages.md b/docs/recipes/travis-build-stages.md deleted file mode 100644 index b23d0b7d..00000000 --- a/docs/recipes/travis-build-stages.md +++ /dev/null @@ -1,95 +0,0 @@ -# Using semantic-release with [Travis CI build stages](https://docs.travis-ci.com/user/build-stages) - -## Environment variables - -The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). - -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/ci-configuration.md#automatic-setup-with-semantic-release-cli). - -## Multiple Node jobs configuration - -### `.travis.yml` configuration for multiple Node jobs - -This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. - -This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). - -It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. - -**Note**: It's not recommended to run the `semantic-release` command in the Travis `script` step as each script in this step will be executed regardless of the outcome of the previous one. See [travis-ci/travis-ci#1066](https://github.com/travis-ci/travis-ci/issues/1066). - -**Advanced configuration**: Running the tests in the `script` step of the `release` stage is not necessary as the previous stage(s) already ran them. To increase speed, the `script` step of the `release` stage can be overwritten to skip the tests. Note that other commands such as build or compilation might still be required. - -```yaml -language: node_js - -node_js: - - 8 - - 6 - -jobs: - include: - # Define the release stage that runs semantic-release - - stage: release - node_js: lts/* - # Advanced: optionally overwrite your default `script` step to skip the tests - # script: skip - deploy: - provider: script - skip_cleanup: true - script: - - npx semantic-release -``` - -### `package.json` configuration for multiple Node jobs - -A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. - -```json -{ - "devDependencies": { - "semantic-release": "^15.0.0" - } -} -``` - -## Non-JavaScript projects configuration - -For projects that require to be tested with one or multiple version of a Non-JavaScript [language](https://docs.travis-ci.com/user/languages), optionally on multiple [Operating Systems](https://docs.travis-ci.com/user/multi-os). - -This recipe cover the Travis specifics only. See [Non JavaScript projects recipe](../support/FAQ.md#can-i-use-semantic-release-to-publish-non-javascript-packages) for more information on the **semantic-release** configuration. - -### `.travis.yml` configuration for non-JavaScript projects - -This example is a minimal configuration for **semantic-release** with a build running [Go 1.6 and 1.7](https://docs.travis-ci.com/user/languages/go). See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. - -This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). - -It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. - -**Note**: It's not recommended to run the `semantic-release` command in the Travis `script` step as each script in this step will be executed regardless of the outcome of the previous one. See [travis-ci/travis-ci#1066](https://github.com/travis-ci/travis-ci/issues/1066). - -**Advanced configuration**: Running the tests in the `script` step of the `release` stage is not necessary as the previous stage(s) already ran them. To increase speed, the `script` step of the `release` stage can be overwritten to skip the tests. Note that other commands such as build or compilation might still be required. - -```yaml -language: go - -go: - - 1.6 - - 1.7 - -jobs: - include: - # Define the release stage that runs semantic-release - - stage: release - # Advanced: optionally overwrite your default `script` step to skip the tests - # script: - # - make - deploy: - provider: script - skip_cleanup: true - script: - # Use nvm to install and use the Node LTS version (nvm is installed on all Travis images) - - nvm install lts/* - - npx semantic-release -``` diff --git a/docs/recipes/travis.md b/docs/recipes/travis.md index 1b60fee4..02ac8356 100644 --- a/docs/recipes/travis.md +++ b/docs/recipes/travis.md @@ -4,62 +4,22 @@ The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/ci-configuration.md#automatic-setup-with-semantic-release-cli). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/getting-started.md#getting-started). -## Single Node job configuration +## Node.js projects configuration -For projects that require to be tested only with a single [Node version](https://docs.travis-ci.com/user/getting-started/#Selecting-a-different-programming-language) on [one Operating System](https://docs.travis-ci.com/user/getting-started/#Selecting-infrastructure-(optional)). - -**Note**: [Node 8 is the minimal version required](../support/FAQ.md#why-does-semantic-release-require-node-version--83). - -### `.travis.yml` configuration for single Node job - -This example is a minimal configuration for semantic-release with a build running Node 8 on Linux. See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. - -It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. - -**Note**: It's not recommended to run the `semantic-release` command in the Travis `script` step as each script in this step will be executed regardless of the outcome of the previous one. See [travis-ci/travis-ci#1066](https://github.com/travis-ci/travis-ci/issues/1066). - -```yaml -language: node_js - -node_js: 8 - -deploy: - provider: script - skip_cleanup: true - script: - - npx semantic-release -``` - -### `package.json` configuration for single Node job - -A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. - -```json -{ - "devDependencies": { - "semantic-release": "^11.0.0" - } -} -``` - -## Multiple Node jobs configuration - -For projects that require to be tested with multiple [Node versions](https://docs.travis-ci.com/user/languages/javascript-with-nodejs/#Specifying-Node.js-versions) and/or on multiple [Operating Systems](https://docs.travis-ci.com/user/multi-os). - -**Note**: At least one job must run a [Node >= 8 version](../support/FAQ.md#why-does-semantic-release-require-node-version--83). - -### `.travis.yml` configuration for multiple Node jobs +### `.travis.yml` configuration for multiple Node.js jobs This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. -This example uses [`travis-deploy-once`](https://github.com/semantic-release/travis-deploy-once) in order to [Run `semantic-release` only after all tests succeeded](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). Alternatively you can use [Travis CI Build Stages recipe](travis-build-stages.md). +This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. **Note**: It's not recommended to run the `semantic-release` command in the Travis `script` step as each script in this step will be executed regardless of the outcome of the previous one. See [travis-ci/travis-ci#1066](https://github.com/travis-ci/travis-ci/issues/1066). +**Advanced configuration**: Running the tests in the `script` step of the `release` stage is not necessary as the previous stage(s) already ran them. To increase speed, the `script` step of the `release` stage can be overwritten to skip the tests. Note that other commands such as build or compilation might still be required. + ```yaml language: node_js @@ -67,15 +27,20 @@ node_js: - 8 - 6 -deploy: - provider: script - skip_cleanup: true - script: - - npx travis-deploy-once "npx semantic-release" +jobs: + include: + # Define the release stage that runs semantic-release + - stage: release + node_js: lts/* + # Advanced: optionally overwrite your default `script` step to skip the tests + # script: skip + deploy: + provider: script + skip_cleanup: true + script: + - npx semantic-release ``` -**Note**: See the `travis-deploy-once` [`pro`](https://github.com/semantic-release/travis-deploy-once#-p---pro) and [`travis-url`](https://github.com/semantic-release/travis-deploy-once#-u---travis-url) options for using with [Travis Pro](https://docs.travis-ci.com/user/travis-pro) and [Travis Enterprise](https://enterprise.travis-ci.com). - ### `package.json` configuration for multiple Node jobs A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. @@ -83,13 +48,12 @@ A `package.json` is required only for [local](../usage/installation.md#local-ins ```json { "devDependencies": { - "semantic-release": "^15.0.0", - "travis-deploy-once": "^5.0.0" + "semantic-release": "^15.0.0" } } ``` -## Non-JavaScript projects configuration +## Non-Node.js projects configuration For projects that require to be tested with one or multiple version of a Non-JavaScript [language](https://docs.travis-ci.com/user/languages), optionally on multiple [Operating Systems](https://docs.travis-ci.com/user/multi-os). @@ -97,14 +61,16 @@ This recipe cover the Travis specifics only. See [Non JavaScript projects recipe ### `.travis.yml` configuration for non-JavaScript projects -This example is a minimal configuration for **semantic-release** with a build running [Go 1.6 and 1.7](https://docs.travis-ci.com/user/languages/go) on Linux and OSX. See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. +This example is a minimal configuration for **semantic-release** with a build running [Go 1.6 and 1.7](https://docs.travis-ci.com/user/languages/go). See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. -This example uses [`travis-deploy-once`](https://github.com/semantic-release/travis-deploy-once) in order to [run `semantic-release` only after all tests succeeded](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). Alternatively you can use [Travis CI Build Stages recipe](travis-build-stages.md). +This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. **Note**: It's not recommended to run the `semantic-release` command in the Travis `script` step as each script in this step will be executed regardless of the outcome of the previous one. See [travis-ci/travis-ci#1066](https://github.com/travis-ci/travis-ci/issues/1066). +**Advanced configuration**: Running the tests in the `script` step of the `release` stage is not necessary as the previous stage(s) already ran them. To increase speed, the `script` step of the `release` stage can be overwritten to skip the tests. Note that other commands such as build or compilation might still be required. + ```yaml language: go @@ -112,18 +78,18 @@ go: - 1.6 - 1.7 -os: - - linux - - osx - -deploy: - provider: script - skip_cleanup: true - script: - # Use nvm to install and use the Node LTS version (nvm is installed on all Travis images) - - nvm install lts/* - # Run semantic-release only on one job, after all other are successful - - npx travis-deploy-once "npx semantic-release" +jobs: + include: + # Define the release stage that runs semantic-release + - stage: release + # Advanced: optionally overwrite your default `script` step to skip the tests + # script: + # - make + deploy: + provider: script + skip_cleanup: true + script: + # Use nvm to install and use the Node LTS version (nvm is installed on all Travis images) + - nvm install lts/* + - npx semantic-release ``` - -**Note**: See the `travis-deploy-once` [`pro`](https://github.com/semantic-release/travis-deploy-once#-p---pro) and [`travis-url`](https://github.com/semantic-release/travis-deploy-once#-u---travis-url) options for using with [Travis Pro](https://docs.travis-ci.com/user/travis-pro) and [Travis Enterprise](https://enterprise.travis-ci.com). diff --git a/docs/usage/ci-configuration.md b/docs/usage/ci-configuration.md index 0d0d4e35..940d8f6d 100644 --- a/docs/usage/ci-configuration.md +++ b/docs/usage/ci-configuration.md @@ -2,7 +2,7 @@ ## Run `semantic-release` only after all tests succeeded -The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. This can be achieved with [Travis Build Stages](https://docs.travis-ci.com/user/build-stages), [CircleCI Workflows](https://circleci.com/docs/2.0/workflows), [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines), [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs), [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines), [Wercker Workflows](http://devcenter.wercker.com/docs/workflows), [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline) or specific tools like [`travis-deploy-once`](https://github.com/semantic-release/travis-deploy-once). +The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. This can be achieved with [Travis Build Stages](https://docs.travis-ci.com/user/build-stages), [CircleCI Workflows](https://circleci.com/docs/2.0/workflows), [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines), [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs), [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines), [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) or [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). See [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. From 048292baa5376672463c8192cb6fb871fc6455f5 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 14 Dec 2018 12:28:01 -0500 Subject: [PATCH 012/104] docs: fix broken link in CircleCI recipe --- docs/recipes/circleci-workflows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/recipes/circleci-workflows.md b/docs/recipes/circleci-workflows.md index 73bd5156..a83a2a31 100644 --- a/docs/recipes/circleci-workflows.md +++ b/docs/recipes/circleci-workflows.md @@ -4,7 +4,7 @@ The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured in [CircleCi Project Settings](https://circleci.com/docs/2.0/env-vars/#adding-environment-variables-in-the-app).. -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/ci-configuration.md#automatic-setup-with-semantic-release-cli). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/getting-started.md#getting-started). ## Multiple Node jobs configuration From 70c68ef3ed846d29dba48a3d2674aea1c6a2005f Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 14 Dec 2018 15:58:58 -0500 Subject: [PATCH 013/104] feat: allow `publish` plugins to return `false` in order to signify no release was done --- lib/definitions/plugins.js | 2 +- test/definitions/plugins.test.js | 3 ++- test/index.test.js | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/definitions/plugins.js b/lib/definitions/plugins.js index adb07ee7..5b4ab626 100644 --- a/lib/definitions/plugins.js +++ b/lib/definitions/plugins.js @@ -73,7 +73,7 @@ module.exports = { transform: (release, step, {nextRelease}) => ({ ...(isPlainObject(release) ? release : {}), ...nextRelease, - ...step, + ...(release === false ? {} : step), }), }), }, diff --git a/test/definitions/plugins.test.js b/test/definitions/plugins.test.js index 9f869d9a..ac4f75a9 100644 --- a/test/definitions/plugins.test.js +++ b/test/definitions/plugins.test.js @@ -22,7 +22,7 @@ test('The "generateNotes" plugin output, if defined, must be a string', t => { t.true(plugins.generateNotes.outputValidator('string')); }); -test('The "publish" plugin output, if defined, must be an object', t => { +test('The "publish" plugin output, if defined, must be an object or "false"', t => { t.false(plugins.publish.outputValidator(1)); t.false(plugins.publish.outputValidator('string')); @@ -30,6 +30,7 @@ test('The "publish" plugin output, if defined, must be an object', t => { t.true(plugins.publish.outputValidator()); t.true(plugins.publish.outputValidator(null)); t.true(plugins.publish.outputValidator('')); + t.true(plugins.publish.outputValidator(false)); }); test('The "generateNotes" plugins output are concatenated with separator and sensitive data is hidden', t => { diff --git a/test/index.test.js b/test/index.test.js index 046d316e..e019491b 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -693,7 +693,7 @@ test('Allow local releases with "noCi" option', async t => { t.is(success.callCount, 1); }); -test('Accept "undefined" value returned by the "generateNotes" plugins', async t => { +test('Accept "undefined" value returned by "generateNotes" and "false" by "publish"', async t => { // Create a git repository, set the current working directory at the root of the repo const {cwd, repositoryUrl} = await gitRepo(true); // Add commits to the master branch @@ -711,7 +711,7 @@ test('Accept "undefined" value returned by the "generateNotes" plugins', async t const generateNotes1 = stub().resolves(); const notes2 = 'Release notes 2'; const generateNotes2 = stub().resolves(notes2); - const publish = stub().resolves(); + const publish = stub().resolves(false); const options = { branch: 'master', From 1243f79064c479470ce169f626f593d2f5214f84 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Sun, 16 Dec 2018 16:17:04 -0500 Subject: [PATCH 014/104] fix: correctly handle skipped releases --- lib/definitions/plugins.js | 6 +++--- test/index.test.js | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/definitions/plugins.js b/lib/definitions/plugins.js index 5b4ab626..e8e01a31 100644 --- a/lib/definitions/plugins.js +++ b/lib/definitions/plugins.js @@ -71,9 +71,9 @@ module.exports = { pipelineConfig: () => ({ // Add `nextRelease` and plugin properties to published release transform: (release, step, {nextRelease}) => ({ - ...(isPlainObject(release) ? release : {}), - ...nextRelease, - ...(release === false ? {} : step), + ...(release === false ? {} : nextRelease), + ...release, + ...step, }), }), }, diff --git a/test/index.test.js b/test/index.test.js index e019491b..1242ceb4 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -712,6 +712,7 @@ test('Accept "undefined" value returned by "generateNotes" and "false" by "publi const notes2 = 'Release notes 2'; const generateNotes2 = stub().resolves(notes2); const publish = stub().resolves(false); + const success = stub().resolves(); const options = { branch: 'master', @@ -722,7 +723,7 @@ test('Accept "undefined" value returned by "generateNotes" and "false" by "publi generateNotes: [generateNotes1, generateNotes2], prepare: stub().resolves(), publish, - success: stub().resolves(), + success, fail: stub().resolves(), }; @@ -754,6 +755,9 @@ test('Accept "undefined" value returned by "generateNotes" and "false" by "publi t.is(publish.callCount, 1); t.deepEqual(publish.args[0][1].lastRelease, lastRelease); t.is(publish.args[0][1].nextRelease.notes, notes2); + + t.is(success.callCount, 1); + t.deepEqual(success.args[0][1].releases, [{pluginName: '[Function: proxy]'}]); }); test('Returns false if triggered by a PR', async t => { From 1aefd98d310befa720a067cb0cc6ab37ee7dea6d Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 26 Dec 2018 17:02:31 +0000 Subject: [PATCH 015/104] fix(package): update aggregate-error to version 2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f3a64505..91ae20e9 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@semantic-release/github": "^5.1.0", "@semantic-release/npm": "^5.0.5", "@semantic-release/release-notes-generator": "^7.1.2", - "aggregate-error": "^1.0.0", + "aggregate-error": "^2.0.0", "cosmiconfig": "^5.0.1", "debug": "^4.0.0", "env-ci": "^3.0.0", From 3819ca56a9b002381a8f2854650e325d4f70e9cb Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 15 Dec 2018 13:36:43 +0000 Subject: [PATCH 016/104] chore(package): update ava to version 1.0.1 --- package.json | 2 +- test/get-config.test.js | 2 +- test/git.test.js | 8 ++++---- test/index.test.js | 18 +++++++++--------- test/integration.test.js | 6 +++--- test/plugins/normalize.test.js | 10 +++++----- test/plugins/pipeline.test.js | 10 +++++----- test/verify.test.js | 12 ++++++------ 8 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 91ae20e9..71021329 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "yargs": "^12.0.0" }, "devDependencies": { - "ava": "^0.25.0", + "ava": "^1.0.1", "clear-module": "^3.0.0", "codecov": "^3.0.0", "commitizen": "^3.0.0", diff --git a/test/get-config.test.js b/test/get-config.test.js index 568b5870..9ea58ec9 100644 --- a/test/get-config.test.js +++ b/test/get-config.test.js @@ -480,7 +480,7 @@ test('Throw an Error if one of the shareable config cannot be found', async t => await outputJson(path.resolve(cwd, 'package.json'), {release: pkhOptions}); await outputJson(path.resolve(cwd, 'shareable1.json'), options1); - const error = await t.throws(t.context.getConfig({cwd}), Error); + const error = await t.throwsAsync(t.context.getConfig({cwd}), Error); t.is(error.message, "Cannot find module 'non-existing-path'"); t.is(error.code, 'MODULE_NOT_FOUND'); diff --git a/test/git.test.js b/test/git.test.js index 661e4ef4..3ae326a3 100644 --- a/test/git.test.js +++ b/test/git.test.js @@ -42,7 +42,7 @@ test('Throw error if the last commit sha cannot be found', async t => { // Create a git repository, set the current working directory at the root of the repo const {cwd} = await gitRepo(); - await t.throws(getGitHead({cwd}), Error); + await t.throwsAsync(getGitHead({cwd}), Error); }); test('Unshallow and fetch repository', async t => { @@ -67,7 +67,7 @@ test('Do not throw error when unshallow a complete repository', async t => { const {cwd, repositoryUrl} = await gitRepo(); // Add commits to the master branch await gitCommits(['First'], {cwd}); - await t.notThrows(fetch(repositoryUrl, {cwd})); + await t.notThrowsAsync(fetch(repositoryUrl, {cwd})); }); test('Fetch all tags on a detached head repository', async t => { @@ -100,7 +100,7 @@ test('Verify if the commit `sha` is in the direct history of the current branch' t.true(await isRefInHistory(commits[0].hash, {cwd})); t.falsy(await isRefInHistory(otherCommits[0].hash, {cwd})); - await t.throws(isRefInHistory('non-existant-sha', {cwd})); + await t.throwsAsync(isRefInHistory('non-existant-sha', {cwd})); }); test('Get the commit sha for a given tag or falsy if the tag does not exists', async t => { @@ -206,7 +206,7 @@ test('Return falsy for invalid tag names', async t => { test('Throws error if obtaining the tags fails', async t => { const cwd = tempy.directory(); - await t.throws(getTags({cwd})); + await t.throwsAsync(getTags({cwd})); }); test('Return "true" if repository is up to date', async t => { diff --git a/test/index.test.js b/test/index.test.js index 1242ceb4..b66ed916 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -337,7 +337,7 @@ test('Call all "success" plugins even if one errors out', async t => { 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); - await t.throws( + await t.throwsAsync( semanticRelease(options, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}) ); @@ -372,7 +372,7 @@ test('Log all "verifyConditions" errors', async t => { 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); const errors = [ - ...(await t.throws( + ...(await t.throwsAsync( semanticRelease(options, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}) )), ]; @@ -417,7 +417,7 @@ test('Log all "verifyRelease" errors', async t => { 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); const errors = [ - ...(await t.throws( + ...(await t.throwsAsync( semanticRelease(options, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}) )), ]; @@ -519,7 +519,7 @@ test('Dry-run skips fail', async t => { 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); const errors = [ - ...(await t.throws( + ...(await t.throwsAsync( semanticRelease(options, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}) )), ]; @@ -957,7 +957,7 @@ test('Log both plugins errors and errors thrown by "fail" plugin', async t => { 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); - await t.throws( + await t.throwsAsync( semanticRelease(options, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}) ); @@ -982,7 +982,7 @@ test('Call "fail" only if a plugin returns a SemanticReleaseError', async t => { 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); - await t.throws( + await t.throwsAsync( semanticRelease(options, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}) ); @@ -999,7 +999,7 @@ test('Throw SemanticReleaseError if repositoryUrl is not set and cannot be found 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); const errors = [ - ...(await t.throws( + ...(await t.throwsAsync( semanticRelease({}, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}) )), ]; @@ -1036,7 +1036,7 @@ test('Throw an Error if plugin returns an unexpected value', async t => { './lib/get-logger': () => t.context.logger, 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); - const error = await t.throws( + const error = await t.throwsAsync( semanticRelease(options, {cwd, env: {}, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}), Error ); @@ -1066,7 +1066,7 @@ test('Hide sensitive information passed to "fail" plugin', async t => { './lib/get-logger': () => t.context.logger, 'env-ci': () => ({isCi: true, branch: 'master', isPr: false}), }); - await t.throws( + await t.throwsAsync( semanticRelease(options, {cwd, env, stdout: new WritableStreamBuffer(), stderr: new WritableStreamBuffer()}), Error ); diff --git a/test/integration.test.js b/test/integration.test.js index ecbf704f..e0d8f082 100644 --- a/test/integration.test.js +++ b/test/integration.test.js @@ -258,7 +258,7 @@ test('Exit with 1 if a plugin is not found', async t => { release: {analyzeCommits: 'non-existing-path', success: false, fail: false}, }); - const {code, stderr} = await t.throws(execa(cli, [], {env, cwd})); + const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); t.is(code, 1); t.regex(stderr, /Cannot find module/); }); @@ -276,7 +276,7 @@ test('Exit with 1 if a shareable config is not found', async t => { release: {extends: 'non-existing-path', success: false, fail: false}, }); - const {code, stderr} = await t.throws(execa(cli, [], {env, cwd})); + const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); t.is(code, 1); t.regex(stderr, /Cannot find module/); }); @@ -297,7 +297,7 @@ test('Exit with 1 if a shareable config reference a not found plugin', async t = }); await writeJson(path.resolve(cwd, 'shareable.json'), shareable); - const {code, stderr} = await t.throws(execa(cli, [], {env, cwd})); + const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); t.is(code, 1); t.regex(stderr, /Cannot find module/); }); diff --git a/test/plugins/normalize.test.js b/test/plugins/normalize.test.js index d42ae479..64dfec8f 100644 --- a/test/plugins/normalize.test.js +++ b/test/plugins/normalize.test.js @@ -62,7 +62,7 @@ test('Wrap plugin in a function that add the "pluginName" to the error"', async './plugin-error': './test/fixtures', }); - const error = await t.throws(plugin({options: {}})); + const error = await t.throwsAsync(plugin({options: {}})); t.is(error.pluginName, './plugin-error'); }); @@ -72,7 +72,7 @@ test('Wrap plugin in a function that add the "pluginName" to multiple errors"', './plugin-errors': './test/fixtures', }); - const errors = [...(await t.throws(plugin({options: {}})))]; + const errors = [...(await t.throwsAsync(plugin({options: {}})))]; for (const error of errors) { t.is(error.pluginName, './plugin-errors'); } @@ -107,7 +107,7 @@ test('Wrap "analyzeCommits" plugin in a function that validate the output of the {} ); - const error = await t.throws(plugin({options: {}})); + const error = await t.throwsAsync(plugin({options: {}})); t.is(error.code, 'EANALYZECOMMITSOUTPUT'); t.is(error.name, 'SemanticReleaseError'); @@ -125,7 +125,7 @@ test('Wrap "generateNotes" plugin in a function that validate the output of the {} ); - const error = await t.throws(plugin({options: {}})); + const error = await t.throwsAsync(plugin({options: {}})); t.is(error.code, 'EGENERATENOTESOUTPUT'); t.is(error.name, 'SemanticReleaseError'); @@ -143,7 +143,7 @@ test('Wrap "publish" plugin in a function that validate the output of the plugin {} ); - const error = await t.throws(plugin({options: {}})); + const error = await t.throwsAsync(plugin({options: {}})); t.is(error.code, 'EPUBLISHOUTPUT'); t.is(error.name, 'SemanticReleaseError'); diff --git a/test/plugins/pipeline.test.js b/test/plugins/pipeline.test.js index 2a673941..6c58129e 100644 --- a/test/plugins/pipeline.test.js +++ b/test/plugins/pipeline.test.js @@ -83,7 +83,7 @@ test('Stop execution and throw error if a step rejects', async t => { const step2 = stub().rejects(new Error('test error')); const step3 = stub().resolves(3); - const error = await t.throws(pipeline([step1, step2, step3])(0), Error); + const error = await t.throwsAsync(pipeline([step1, step2, step3])(0), Error); t.is(error.message, 'test error'); t.true(step1.calledWith(0)); t.true(step2.calledWith(0)); @@ -98,7 +98,7 @@ test('Throw all errors from the first step throwing an AggregateError', async t const step2 = stub().rejects(new AggregateError([error1, error2])); const step3 = stub().resolves(3); - const errors = await t.throws(pipeline([step1, step2, step3])(0)); + const errors = await t.throwsAsync(pipeline([step1, step2, step3])(0)); t.deepEqual([...errors], [error1, error2]); t.true(step1.calledWith(0)); @@ -113,7 +113,7 @@ test('Execute all even if a Promise rejects', async t => { const step2 = stub().rejects(error1); const step3 = stub().rejects(error2); - const errors = await t.throws(pipeline([step1, step2, step3], {settleAll: true})(0)); + const errors = await t.throwsAsync(pipeline([step1, step2, step3], {settleAll: true})(0)); t.deepEqual([...errors], [error1, error2]); t.true(step1.calledWith(0)); @@ -129,7 +129,7 @@ test('Throw all errors from all steps throwing an AggregateError', async t => { const step1 = stub().rejects(new AggregateError([error1, error2])); const step2 = stub().rejects(new AggregateError([error3, error4])); - const errors = await t.throws(pipeline([step1, step2], {settleAll: true})(0)); + const errors = await t.throwsAsync(pipeline([step1, step2], {settleAll: true})(0)); t.deepEqual([...errors], [error1, error2, error3, error4]); t.true(step1.calledWith(0)); @@ -145,7 +145,7 @@ test('Execute each function in series passing a transformed input even if a step const step4 = stub().resolves(4); const getNextInput = (prevResult, result) => prevResult + result; - const errors = await t.throws(pipeline([step1, step2, step3, step4], {settleAll: true, getNextInput})(0)); + const errors = await t.throwsAsync(pipeline([step1, step2, step3, step4], {settleAll: true, getNextInput})(0)); t.deepEqual([...errors], [error2, error3]); t.true(step1.calledWith(0)); diff --git a/test/verify.test.js b/test/verify.test.js index 3bf1e100..034252d2 100644 --- a/test/verify.test.js +++ b/test/verify.test.js @@ -7,7 +7,7 @@ test('Throw a AggregateError', async t => { const {cwd} = await gitRepo(); const options = {}; - const errors = [...(await t.throws(verify({cwd, options})))]; + const errors = [...(await t.throwsAsync(verify({cwd, options})))]; t.is(errors[0].name, 'SemanticReleaseError'); t.is(errors[0].code, 'ENOREPOURL'); @@ -27,7 +27,7 @@ test('Throw a SemanticReleaseError if does not run on a git repository', async t const cwd = tempy.directory(); const options = {}; - const errors = [...(await t.throws(verify({cwd, options})))]; + const errors = [...(await t.throwsAsync(verify({cwd, options})))]; t.is(errors[0].name, 'SemanticReleaseError'); t.is(errors[0].code, 'ENOGITREPO'); @@ -39,7 +39,7 @@ test('Throw a SemanticReleaseError if the "tagFormat" is not valid', async t => const {cwd, repositoryUrl} = await gitRepo(true); const options = {repositoryUrl, tagFormat: `?\${version}`}; - const errors = [...(await t.throws(verify({cwd, options})))]; + const errors = [...(await t.throwsAsync(verify({cwd, options})))]; t.is(errors[0].name, 'SemanticReleaseError'); t.is(errors[0].code, 'EINVALIDTAGFORMAT'); @@ -51,7 +51,7 @@ test('Throw a SemanticReleaseError if the "tagFormat" does not contains the "ver const {cwd, repositoryUrl} = await gitRepo(true); const options = {repositoryUrl, tagFormat: 'test'}; - const errors = [...(await t.throws(verify({cwd, options})))]; + const errors = [...(await t.throwsAsync(verify({cwd, options})))]; t.is(errors[0].name, 'SemanticReleaseError'); t.is(errors[0].code, 'ETAGNOVERSION'); @@ -63,7 +63,7 @@ test('Throw a SemanticReleaseError if the "tagFormat" contains multiple "version const {cwd, repositoryUrl} = await gitRepo(true); const options = {repositoryUrl, tagFormat: `\${version}v\${version}`}; - const errors = [...(await t.throws(verify({cwd, options})))]; + const errors = [...(await t.throwsAsync(verify({cwd, options})))]; t.is(errors[0].name, 'SemanticReleaseError'); t.is(errors[0].code, 'ETAGNOVERSION'); @@ -75,5 +75,5 @@ test('Return "true" if all verification pass', async t => { const {cwd, repositoryUrl} = await gitRepo(true); const options = {repositoryUrl, tagFormat: `v\${version}`}; - await t.notThrows(verify({cwd, options})); + await t.notThrowsAsync(verify({cwd, options})); }); From b7aeabad93a79a314bdd86267592e8d5fd60ba7d Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 1 Jan 2019 00:51:39 +0000 Subject: [PATCH 017/104] fix(package): update marked to version 0.6.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 71021329..5f34f4ef 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,8 @@ "hook-std": "^1.1.0", "hosted-git-info": "^2.7.1", "lodash": "^4.17.4", - "marked": "^0.5.0", - "marked-terminal": "^3.0.0", + "marked": "^0.6.0", + "marked-terminal": "^3.2.0", "p-locate": "^3.0.0", "p-reduce": "^1.0.0", "read-pkg-up": "^4.0.0", From 4652cef1e6644292ddaff22aba0c9fee3a4ad44b Mon Sep 17 00:00:00 2001 From: David Aghassi <3680126+Aghassi@users.noreply.github.com> Date: Sat, 12 Jan 2019 09:46:20 -0800 Subject: [PATCH 018/104] docs: corrected typos in jsdocs --- lib/get-git-auth-url.js | 2 +- lib/get-last-release.js | 2 +- lib/plugins/pipeline.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/get-git-auth-url.js b/lib/get-git-auth-url.js index eaa4243c..f3210bd5 100644 --- a/lib/get-git-auth-url.js +++ b/lib/get-git-auth-url.js @@ -44,7 +44,7 @@ module.exports = async ({cwd, env, options: {repositoryUrl, branch}}) => { const gitCredentials = `${GIT_TOKENS[envVar] || ''}${env[envVar] || ''}`; if (gitCredentials) { - // If credentials are set via anvironment variables, convert the URL to http/https and add basic auth, otherwise return `repositoryUrl` as is + // If credentials are set via environment variables, convert the URL to http/https and add basic auth, otherwise return `repositoryUrl` as is const [match, auth, host, path] = /^(?!.+:\/\/)(?:(.*)@)?(.*?):(.*)$/.exec(repositoryUrl) || []; return format({ ...parse(match ? `ssh://${auth ? `${auth}@` : ''}${host}/${path}` : repositoryUrl), diff --git a/lib/get-last-release.js b/lib/get-last-release.js index 7ec14174..f30dd5c5 100644 --- a/lib/get-last-release.js +++ b/lib/get-last-release.js @@ -28,7 +28,7 @@ module.exports = async ({cwd, env, options: {tagFormat}, logger}) => { // Generate a regex to parse tags formatted with `tagFormat` // by replacing the `version` variable in the template by `(.+)`. // The `tagFormat` is compiled with space as the `version` as it's an invalid tag character, - // so it's guaranteed to no be present in the `tagFormat`. + // so it's guaranteed to not be present in the `tagFormat`. const tagRegexp = `^${escapeRegExp(template(tagFormat)({version: ' '})).replace(' ', '(.+)')}`; const tags = (await getTags({cwd, env})) .map(tag => ({gitTag: tag, version: (tag.match(tagRegexp) || new Array(2))[1]})) diff --git a/lib/plugins/pipeline.js b/lib/plugins/pipeline.js index 4ed7f0cf..d36c8608 100644 --- a/lib/plugins/pipeline.js +++ b/lib/plugins/pipeline.js @@ -4,7 +4,7 @@ const AggregateError = require('aggregate-error'); const {extractErrors} = require('../utils'); /** - * A Function that execute a list of function sequencially. If at least one Function ins the pipeline throw an Error or rejects, the pipeline function rejects as well. + * A Function that execute a list of function sequencially. If at least one Function ins the pipeline throws an Error or rejects, the pipeline function rejects as well. * * @typedef {Function} Pipeline * @param {Any} input Argument to pass to the first step in the pipeline. From 6a8eede96f9e61f22ddbf885db7947798b1bf55c Mon Sep 17 00:00:00 2001 From: David Aghassi <3680126+Aghassi@users.noreply.github.com> Date: Sat, 12 Jan 2019 09:47:19 -0800 Subject: [PATCH 019/104] docs: cleaned up wording and typos in docs --- docs/support/FAQ.md | 2 +- docs/support/troubleshooting.md | 2 +- docs/usage/ci-configuration.md | 2 +- docs/usage/shareable-configurations.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/support/FAQ.md b/docs/support/FAQ.md index 74ea3135..bb700116 100644 --- a/docs/support/FAQ.md +++ b/docs/support/FAQ.md @@ -145,7 +145,7 @@ If you have introduced a breaking bug in a release you have 2 options: In both cases **semantic-release** will publish a new release, so your package users' will get the fixed/reverted version. -Depending on the package manager you are using, you might be able to un-publish or deprecate a release, in order to prevent users to download it by accident. For example npm allows you to [un-publish](https://docs.npmjs.com/cli/unpublish) in [next 72 hours](https://www.npmjs.com/policies/unpublish) after releasing or to [deprecate](https://docs.npmjs.com/cli/deprecate) a release. +Depending on the package manager you are using, you might be able to un-publish or deprecate a release, in order to prevent users from downloading it by accident. For example npm allows you to [un-publish](https://docs.npmjs.com/cli/unpublish) [within 72 hours](https://www.npmjs.com/policies/unpublish) after releasing. You may also [deprecate](https://docs.npmjs.com/cli/deprecate) a release if you would rather avoid un-publishing. In any case **do not remove the Git tag associated with the buggy version**, otherwise **semantic-release** will later try to republish that version. Publishing a version after un-publishing is not supported by most package managers. diff --git a/docs/support/troubleshooting.md b/docs/support/troubleshooting.md index d6e7a9de..75e7aafa 100644 --- a/docs/support/troubleshooting.md +++ b/docs/support/troubleshooting.md @@ -12,7 +12,7 @@ npm ERR! You do not have permission to publish "". Are you logged This is most likely related to a misconfiguration of the [npm registry authentication](https://github.com/semantic-release/npm#npm-registry-authentication) or to your user [missing permission](https://docs.npmjs.com/cli/team) for publishing. -It might also happen if the package name you are trying to publish already exists (in such case npm consider you are trying to publish a new version of a package that is not yours, hence the permission error). +It might also happen if the package name you are trying to publish already exists (in the case of npm, you may be trying to publish a new version of a package that is not yours, hence the permission error). To verify if your package name is available you can use [npm-name-cli](https://github.com/sindresorhus/npm-name-cli): ```bash diff --git a/docs/usage/ci-configuration.md b/docs/usage/ci-configuration.md index 940d8f6d..ef2c7292 100644 --- a/docs/usage/ci-configuration.md +++ b/docs/usage/ci-configuration.md @@ -26,7 +26,7 @@ Most **semantic-release** [plugins](plugins.md) require setting up authenticatio | `NPM_TOKEN` | npm token created via [npm token create](https://docs.npmjs.com/getting-started/working_with_tokens#how-to-create-new-tokens).
**Note**: Only the `auth-only` [level of npm two-factor authentication](https://docs.npmjs.com/getting-started/using-two-factor-authentication#levels-of-authentication) is supported. | | `GH_TOKEN` | GitHub authentication token.
**Note**: Only the [personal token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line) authentication is supported. | -See each plugin documentation for the environment variables to set up. +See each plugin's documentation for the environment variables required. The authentication token/credentials have to be made available in the CI service via environment variables. diff --git a/docs/usage/shareable-configurations.md b/docs/usage/shareable-configurations.md index 18e7e3e5..bfaf3bab 100644 --- a/docs/usage/shareable-configurations.md +++ b/docs/usage/shareable-configurations.md @@ -1,6 +1,6 @@ # Shareable configurations -A sharable configuration is an [npm](https://www.npmjs.com/) package that exports a **semantic-release** configuration object. It allows for use of the same configuration across several projects. +A shareable configuration is an [npm](https://www.npmjs.com/) package that exports a **semantic-release** configuration object. It allows for use of the same configuration across several projects. The shareable configurations to use can be set with the [extends](configuration.md#extends) option. From 952e3fdf64841f489ac94eb747e22c64ce697f8e Mon Sep 17 00:00:00 2001 From: Austin Cawley-Edwards Date: Tue, 22 Jan 2019 11:32:41 -0500 Subject: [PATCH 020/104] docs: fix typo in CircleCI recipe --- docs/recipes/git-auth-ssh-keys.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/recipes/git-auth-ssh-keys.md b/docs/recipes/git-auth-ssh-keys.md index 15337a07..9bd27d61 100644 --- a/docs/recipes/git-auth-ssh-keys.md +++ b/docs/recipes/git-auth-ssh-keys.md @@ -158,6 +158,6 @@ Commit the encrypted private key and the `.circleci/config.yml` file to your rep ```bash $ git add git_deploy_key.enc .circleci/config.yml -$ git commit -m "ci(cicle): Add the encrypted private ssh key" +$ git commit -m "ci(circle): Add the encrypted private ssh key" $ git push ``` From 1b7d8b2d21e24f2c2d35b2fbd13e25ddc65dc324 Mon Sep 17 00:00:00 2001 From: Kevin Lluch Date: Tue, 29 Jan 2019 22:15:23 +0100 Subject: [PATCH 021/104] docs: add semantic-release-ado to community plugins --- docs/extending/plugins-list.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index 838f12f9..e91ee1bb 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -71,3 +71,5 @@ - `verifyRelease`: Checks and warns (does not error by default) if the version numbers found on maven central and within the Git project differ by quite a bit - `prepare`: Changes the version number in the `pom.xml` (or all `pom.xml` files in maven projects with multiple `pom.xml` files) and optionally creates a commit with this version number and pushes it to `master` - `publish`: Runs `mvn deploy` to deploy to maven central and optionally will update to next snapshot version and merge changes to development branch +- [semantic-release-ado](https://github.com/lluchmk/semantic-release-ado) + - `prepare`: Stores the version number as an Azure DevOps pipeline variable availabe to downstream steps on the job \ No newline at end of file From 448a0ff977fda5ad44c96571367f60e6fcdee73a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 14 Jan 2019 06:16:30 +0000 Subject: [PATCH 022/104] chore(package): update xo to version 0.24.0 --- bin/semantic-release.js | 2 +- cli.js | 4 +++- index.js | 3 +++ lib/definitions/errors.js | 3 +-- lib/definitions/plugins.js | 1 + lib/get-config.js | 1 + lib/get-git-auth-url.js | 2 +- lib/plugins/index.js | 2 ++ lib/plugins/normalize.js | 2 ++ lib/plugins/pipeline.js | 2 ++ lib/plugins/utils.js | 3 +++ package.json | 2 +- 12 files changed, 21 insertions(+), 6 deletions(-) diff --git a/bin/semantic-release.js b/bin/semantic-release.js index cbd697e9..407475da 100755 --- a/bin/semantic-release.js +++ b/bin/semantic-release.js @@ -3,7 +3,7 @@ // Bad news: We have to write plain ES5 in this file // Good news: It's the only file of the entire project -/* eslint-disable no-var, promise/prefer-await-to-then, prefer-destructuring */ +/* eslint-disable no-var */ var semver = require('semver'); var execa = require('execa'); diff --git a/cli.js b/cli.js index 9d7e03a3..d8780d7f 100755 --- a/cli.js +++ b/cli.js @@ -1,4 +1,4 @@ -const {argv, env, stderr} = require('process'); +const {argv, env, stderr} = require('process'); // eslint-disable-line node/prefer-global/process const util = require('util'); const hideSensitive = require('./lib/hide-sensitive'); @@ -51,12 +51,14 @@ Usage: // Debug must be enabled before other requires in order to work require('debug').enable('semantic-release:*'); } + await require('.')(opts); return 0; } catch (error) { if (error.name !== 'YError') { stderr.write(hideSensitive(env)(util.inspect(error, {colors: true}))); } + return 1; } }; diff --git a/index.js b/index.js index 8a77527a..2ccd5d78 100644 --- a/index.js +++ b/index.js @@ -52,6 +52,7 @@ async function run(context, plugins) { ); return false; } + logger[options.dryRun ? 'warn' : 'success']( `Run automated release from branch ${ciBranch}${options.dryRun ? ' in dry-run mode' : ''}` ); @@ -70,6 +71,7 @@ async function run(context, plugins) { ); return false; } + throw error; } } catch (error) { @@ -92,6 +94,7 @@ async function run(context, plugins) { logger.log('There are no relevant changes, so no new version is released.'); return false; } + context.nextRelease = nextRelease; nextRelease.version = getNextVersion(context); nextRelease.gitTag = template(options.tagFormat)({version: nextRelease.version}); diff --git a/lib/definitions/errors.js b/lib/definitions/errors.js index 96945df3..69c2fb22 100644 --- a/lib/definitions/errors.js +++ b/lib/definitions/errors.js @@ -1,10 +1,9 @@ -const url = require('url'); const {inspect} = require('util'); const {toLower, isString} = require('lodash'); const pkg = require('../../package.json'); const {RELEASE_TYPE} = require('./constants'); -const homepage = url.format({...url.parse(pkg.homepage), hash: null}); +const [homepage] = pkg.homepage.split('#'); const stringify = obj => (isString(obj) ? obj : inspect(obj, {breakLength: Infinity, depth: 2, maxArrayLength: 5})); const linkify = file => `${homepage}/blob/master/${file}`; diff --git a/lib/definitions/plugins.js b/lib/definitions/plugins.js index e8e01a31..3d4478a9 100644 --- a/lib/definitions/plugins.js +++ b/lib/definitions/plugins.js @@ -59,6 +59,7 @@ module.exports = { // Regenerate the release notes context.nextRelease.notes = await generateNotes(context); } + // Call the next prepare plugin with the updated `nextRelease` return context; }, diff --git a/lib/get-config.js b/lib/get-config.js index 9cf34e0d..1745eaf1 100644 --- a/lib/get-config.js +++ b/lib/get-config.js @@ -30,6 +30,7 @@ module.exports = async (context, opts) => { if (options.ci === false) { options.noCi = true; } + const pluginsPath = {}; let extendPaths; ({extends: extendPaths, ...options} = options); diff --git a/lib/get-git-auth-url.js b/lib/get-git-auth-url.js index f3210bd5..10bdda1d 100644 --- a/lib/get-git-auth-url.js +++ b/lib/get-git-auth-url.js @@ -1,4 +1,4 @@ -const {parse, format} = require('url'); +const {parse, format} = require('url'); // eslint-disable-line node/no-deprecated-api const {isNil} = require('lodash'); const hostedGitInfo = require('hosted-git-info'); const {verifyAuth} = require('./git'); diff --git a/lib/plugins/index.js b/lib/plugins/index.js index abbc754c..51b080d1 100644 --- a/lib/plugins/index.js +++ b/lib/plugins/index.js @@ -57,10 +57,12 @@ module.exports = (context, pluginsPath) => { plugin ? [plugin[0], Object.assign(plugin[1], options[type])] : plugin ); } + if (!validateStep({required}, options[type])) { errors.push(getError('EPLUGINCONF', {type, required, pluginConf: options[type]})); return pluginsConf; } + pluginOpts = options[type]; } diff --git a/lib/plugins/normalize.js b/lib/plugins/normalize.js index 56af5b68..b35f3370 100644 --- a/lib/plugins/normalize.js +++ b/lib/plugins/normalize.js @@ -40,9 +40,11 @@ module.exports = (context, type, pluginOpt, pluginsPath) => { if (outputValidator && !outputValidator(result)) { throw getError(`E${type.toUpperCase()}OUTPUT`, {result, pluginName}); } + logger.success(`Completed step "${type}" of plugin "${pluginName}"`); return result; } + logger.warn(`Skip step "${type}" of plugin "${pluginName}" in dry-run mode`); } catch (error) { logger.error(`Failed step "${type}" of plugin "${pluginName}"`); diff --git a/lib/plugins/pipeline.js b/lib/plugins/pipeline.js index d36c8608..b12f264e 100644 --- a/lib/plugins/pipeline.js +++ b/lib/plugins/pipeline.js @@ -44,6 +44,7 @@ module.exports = (steps, {settleAll = false, getNextInput = identity, transform throw error; } } + // Prepare input for the next step, passing the input of the last iteration (or initial parameter for the first iteration) and the result of the current one return getNextInput(lastInput, result); }, @@ -52,5 +53,6 @@ module.exports = (steps, {settleAll = false, getNextInput = identity, transform if (errors.length > 0) { throw new AggregateError(errors); } + return results; }; diff --git a/lib/plugins/utils.js b/lib/plugins/utils.js index 2a213400..e0cf759f 100644 --- a/lib/plugins/utils.js +++ b/lib/plugins/utils.js @@ -12,6 +12,7 @@ const validateSteps = conf => { ) { return true; } + conf = castArray(conf); if (conf.length !== 1) { @@ -39,6 +40,7 @@ function validateStep({required}, conf) { if (required) { return conf.length >= 1 && validateSteps(conf); } + return conf.length === 0 || validateSteps(conf); } @@ -59,6 +61,7 @@ function parseConfig(plugin) { } else { path = plugin; } + return [path, config || {}]; } diff --git a/package.json b/package.json index 5f34f4ef..82b10ac5 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "sinon": "^7.1.1", "stream-buffers": "^3.0.2", "tempy": "^0.2.1", - "xo": "^0.23.0" + "xo": "^0.24.0" }, "engines": { "node": ">=8.3" From aed4ea2edc1bf6d4e452a6cea421899aa497016f Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 12 Feb 2019 06:32:23 +0000 Subject: [PATCH 023/104] fix(package): update yargs to version 13.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82b10ac5..e406b800 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "resolve-from": "^4.0.0", "semver": "^5.4.1", "signale": "^1.2.1", - "yargs": "^12.0.0" + "yargs": "^13.1.0" }, "devDependencies": { "ava": "^1.0.1", From e5a5867e8260c4dc6d2bcd9168a26dd08ac2f973 Mon Sep 17 00:00:00 2001 From: Nicolas Delperdange Date: Wed, 27 Feb 2019 15:31:31 +0100 Subject: [PATCH 024/104] docs(circle): fix incorrect script example Little mistake in the example to add a ssh key for circleCi --- docs/recipes/git-auth-ssh-keys.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/recipes/git-auth-ssh-keys.md b/docs/recipes/git-auth-ssh-keys.md index 9bd27d61..f346d802 100644 --- a/docs/recipes/git-auth-ssh-keys.md +++ b/docs/recipes/git-auth-ssh-keys.md @@ -137,7 +137,7 @@ jobs: # Make sure only the current user can read the private key - chmod 600 /tmp/git_deploy_key # Create a script to return the passphrase environment variable to ssh-add - - echo 'echo ${SSH_PASSPHRASE}' > /tmp/askpass && chmod +x /tmp/askpass + - echo 'echo ${SSL_PASSPHRASE}' > /tmp/askpass && chmod +x /tmp/askpass # Start the authentication agent - eval "$(ssh-agent -s)" # Add the key to the authentication agent From 20e5d83456889d502f07037478d63a3ed96c1db4 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 4 Mar 2019 12:54:53 +0000 Subject: [PATCH 025/104] chore(package): update sinon to version 7.2.7 --- package.json | 2 +- test/index.test.js | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e406b800..cf6adb5e 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "nyc": "^13.1.0", "p-retry": "^3.0.0", "proxyquire": "^2.0.0", - "sinon": "^7.1.1", + "sinon": "^7.2.7", "stream-buffers": "^3.0.2", "tempy": "^0.2.1", "xo": "^0.24.0" diff --git a/test/index.test.js b/test/index.test.js index b66ed916..12b35d95 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -169,7 +169,7 @@ test('Plugins are called with expected values', async t => { t.deepEqual(success.args[0][1].commits[0].message, commits[0].message); t.deepEqual(success.args[0][1].nextRelease, {...nextRelease, notes: `${notes1}\n\n${notes2}\n\n${notes3}`}); t.deepEqual(success.args[0][1].releases, [ - {...release1, ...nextRelease, notes: `${notes1}\n\n${notes2}\n\n${notes3}`, pluginName: '[Function: proxy]'}, + {...release1, ...nextRelease, notes: `${notes1}\n\n${notes2}\n\n${notes3}`, pluginName: '[Function: functionStub]'}, {...nextRelease, notes: `${notes1}\n\n${notes2}\n\n${notes3}`, pluginName: pluginNoop}, ]); @@ -178,7 +178,12 @@ test('Plugins are called with expected values', async t => { commits: [commits[0]], nextRelease: {...nextRelease, notes: `${notes1}\n\n${notes2}\n\n${notes3}`}, releases: [ - {...release1, ...nextRelease, notes: `${notes1}\n\n${notes2}\n\n${notes3}`, pluginName: '[Function: proxy]'}, + { + ...release1, + ...nextRelease, + notes: `${notes1}\n\n${notes2}\n\n${notes3}`, + pluginName: '[Function: functionStub]', + }, {...nextRelease, notes: `${notes1}\n\n${notes2}\n\n${notes3}`, pluginName: pluginNoop}, ], }); @@ -342,10 +347,14 @@ test('Call all "success" plugins even if one errors out', async t => { ); t.is(success1.callCount, 1); - t.deepEqual(success1.args[0][1].releases, [{...release, ...nextRelease, notes, pluginName: '[Function: proxy]'}]); + t.deepEqual(success1.args[0][1].releases, [ + {...release, ...nextRelease, notes, pluginName: '[Function: functionStub]'}, + ]); t.is(success2.callCount, 1); - t.deepEqual(success2.args[0][1].releases, [{...release, ...nextRelease, notes, pluginName: '[Function: proxy]'}]); + t.deepEqual(success2.args[0][1].releases, [ + {...release, ...nextRelease, notes, pluginName: '[Function: functionStub]'}, + ]); }); test('Log all "verifyConditions" errors', async t => { @@ -757,7 +766,7 @@ test('Accept "undefined" value returned by "generateNotes" and "false" by "publi t.is(publish.args[0][1].nextRelease.notes, notes2); t.is(success.callCount, 1); - t.deepEqual(success.args[0][1].releases, [{pluginName: '[Function: proxy]'}]); + t.deepEqual(success.args[0][1].releases, [{pluginName: '[Function: functionStub]'}]); }); test('Returns false if triggered by a PR', async t => { From 322c1c69ec78aca68dfbbe2b8020faad65a69846 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 5 Mar 2019 16:55:30 +0000 Subject: [PATCH 026/104] chore(package): update ava to version 1.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cf6adb5e..dbeac168 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "yargs": "^13.1.0" }, "devDependencies": { - "ava": "^1.0.1", + "ava": "^1.3.1", "clear-module": "^3.0.0", "codecov": "^3.0.0", "commitizen": "^3.0.0", From a5babc6157487c35f42e5e51f82b366efceba0fb Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 12 Mar 2019 16:37:54 +0000 Subject: [PATCH 027/104] fix(package): update p-locate to version 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dbeac168..ac715dad 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "lodash": "^4.17.4", "marked": "^0.6.0", "marked-terminal": "^3.2.0", - "p-locate": "^3.0.0", + "p-locate": "^4.0.0", "p-reduce": "^1.0.0", "read-pkg-up": "^4.0.0", "resolve-from": "^4.0.0", From 0a584def20aa0784dbb08ff06c3ca0ef8b49f057 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 11 Mar 2019 05:02:22 +0000 Subject: [PATCH 028/104] fix(package): update get-stream to version 5.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac715dad..8faac046 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "execa": "^1.0.0", "figures": "^2.0.0", "find-versions": "^3.0.0", - "get-stream": "^4.0.0", + "get-stream": "^5.0.0", "git-log-parser": "^1.2.0", "hook-std": "^1.1.0", "hosted-git-info": "^2.7.1", From 840af0d7340bd561cd01ff78675996b563735a51 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 11 Mar 2019 04:53:59 +0000 Subject: [PATCH 029/104] chore(package): update p-retry to version 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8faac046..a8fcf021 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "mockserver-client": "^5.1.1", "nock": "^10.0.0", "nyc": "^13.1.0", - "p-retry": "^3.0.0", + "p-retry": "^4.0.0", "proxyquire": "^2.0.0", "sinon": "^7.2.7", "stream-buffers": "^3.0.2", From 30723c5998a2a363df7d5950435361fae26bdee8 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 12 Mar 2019 16:00:54 +0000 Subject: [PATCH 030/104] fix(package): update p-reduce to version 2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a8fcf021..f1b6ecc6 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "marked": "^0.6.0", "marked-terminal": "^3.2.0", "p-locate": "^4.0.0", - "p-reduce": "^1.0.0", + "p-reduce": "^2.0.0", "read-pkg-up": "^4.0.0", "resolve-from": "^4.0.0", "semver": "^5.4.1", From a90a1038e7acb39eb30558cde18b628078fbd1f3 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 21 Mar 2019 15:03:46 +0000 Subject: [PATCH 031/104] fix(package): update read-pkg-up to version 5.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f1b6ecc6..837170b9 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "marked-terminal": "^3.2.0", "p-locate": "^4.0.0", "p-reduce": "^2.0.0", - "read-pkg-up": "^4.0.0", + "read-pkg-up": "^5.0.0", "resolve-from": "^4.0.0", "semver": "^5.4.1", "signale": "^1.2.1", From db3fc3eaf754415c4da0fa5b2c724952de9ea6bb Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 5 Apr 2019 06:12:04 +0000 Subject: [PATCH 032/104] fix(package): update hook-std to version 2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 837170b9..9a9fc5e7 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "find-versions": "^3.0.0", "get-stream": "^5.0.0", "git-log-parser": "^1.2.0", - "hook-std": "^1.1.0", + "hook-std": "^2.0.0", "hosted-git-info": "^2.7.1", "lodash": "^4.17.4", "marked": "^0.6.0", From 0cd8a57b4fecf6aa665239659478b718271c4564 Mon Sep 17 00:00:00 2001 From: Julien Viala Date: Tue, 2 Apr 2019 19:09:50 +0200 Subject: [PATCH 033/104] docs: correct way to print release plugin name --- docs/developer-guide/js-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer-guide/js-api.md b/docs/developer-guide/js-api.md index 415bf0ee..33b04175 100644 --- a/docs/developer-guide/js-api.md +++ b/docs/developer-guide/js-api.md @@ -39,7 +39,7 @@ try { } for (const release of releases) { - console.log(`The release was published with plugin "${pluginName}".`); + console.log(`The release was published with plugin "${release.pluginName}".`); } } else { console.log('No release published.'); From d61e3bce2e67fdc0066bbf30149007157a4933ea Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 27 Mar 2019 10:36:21 +0000 Subject: [PATCH 034/104] fix(package): update semver to version 6.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a9fc5e7..5691c880 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "p-reduce": "^2.0.0", "read-pkg-up": "^5.0.0", "resolve-from": "^4.0.0", - "semver": "^5.4.1", + "semver": "^6.0.0", "signale": "^1.2.1", "yargs": "^13.1.0" }, From 5072fef3e4dace598a44d3f1550af201bc66651e Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 15 Apr 2019 03:20:15 +0000 Subject: [PATCH 035/104] chore(package): update file-url to version 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5691c880..537711da 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "cz-conventional-changelog": "^2.0.0", "delay": "^4.0.0", "dockerode": "^2.5.2", - "file-url": "^2.0.2", + "file-url": "^3.0.0", "fs-extra": "^7.0.0", "got": "^9.0.0", "js-yaml": "^3.10.0", From 61762e67a0130ba829d121f297931205138ad363 Mon Sep 17 00:00:00 2001 From: Ben Hutton Date: Mon, 1 Apr 2019 11:46:14 +0100 Subject: [PATCH 036/104] docs: update commitlint URL The current commitlint URL goes to a repo which contains a redirect message and new URL. Replace the outdated URL with the new URL for the commitlint repo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee9f35bd..c8cad592 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ This removes the immediate connection between human emotions and version numbers By default **semantic-release** uses [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). The commit message format can be changed with the [`preset` or `config` options](docs/usage/configuration.md#options) of the [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer#options) and [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator#options) plugins. -Tools such as [commitizen](https://github.com/commitizen/cz-cli), [commitlint](https://github.com/marionebl/commitlint) or [semantic-git-commit-cli](https://github.com/JPeer264/node-semantic-git-commit-cli) can be used to help contributors and enforce valid commit messages. +Tools such as [commitizen](https://github.com/commitizen/cz-cli), [commitlint](https://github.com/conventional-changelog/commitlint) or [semantic-git-commit-cli](https://github.com/JPeer264/node-semantic-git-commit-cli) can be used to help contributors and enforce valid commit messages. Here is an example of the release type that will be done based on a commit messages: From 06fe4352544a0f2ab841aede989fc2015774d949 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 1 Apr 2019 09:38:39 +0000 Subject: [PATCH 037/104] fix(package): update aggregate-error to version 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 537711da..86df11e3 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@semantic-release/github": "^5.1.0", "@semantic-release/npm": "^5.0.5", "@semantic-release/release-notes-generator": "^7.1.2", - "aggregate-error": "^2.0.0", + "aggregate-error": "^3.0.0", "cosmiconfig": "^5.0.1", "debug": "^4.0.0", "env-ci": "^3.0.0", From 6f3c21a10e85e54cf36b69df2efe9e3dabe65403 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 15 Apr 2019 04:07:37 +0000 Subject: [PATCH 038/104] fix(package): update resolve-from to version 5.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 86df11e3..efdf4876 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "p-locate": "^4.0.0", "p-reduce": "^2.0.0", "read-pkg-up": "^5.0.0", - "resolve-from": "^4.0.0", + "resolve-from": "^5.0.0", "semver": "^6.0.0", "signale": "^1.2.1", "yargs": "^13.1.0" From 6b1938fd7e264ede0ef3f7edacf7dd1eea619514 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Mon, 25 Mar 2019 14:15:43 +0800 Subject: [PATCH 039/104] docs: add a plugin for Gradle project --- docs/extending/plugins-list.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index e91ee1bb..2f208043 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -72,4 +72,8 @@ - `prepare`: Changes the version number in the `pom.xml` (or all `pom.xml` files in maven projects with multiple `pom.xml` files) and optionally creates a commit with this version number and pushes it to `master` - `publish`: Runs `mvn deploy` to deploy to maven central and optionally will update to next snapshot version and merge changes to development branch - [semantic-release-ado](https://github.com/lluchmk/semantic-release-ado) - - `prepare`: Stores the version number as an Azure DevOps pipeline variable availabe to downstream steps on the job \ No newline at end of file + - `prepare`: Stores the version number as an Azure DevOps pipeline variable availabe to downstream steps on the job +- [gradle-semantic-release](https://github.com/KengoTODA/gradle-semantic-release-plugin) + - `verifyConditions`: Verify that project has a Gradle wrapper script, and `build.gradle` contains a task to publish artifacts. + - `prepare`: Changes the version number in the `gradle.properties` + - `publish`: Triggers Gradle to publish artifacts. From 1d776db143e7b6a81a3e98c3347a5491acd9ac14 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 16 Apr 2019 10:22:44 +0000 Subject: [PATCH 040/104] chore(package): update nyc to version 14.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index efdf4876..70ff1b57 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "js-yaml": "^3.10.0", "mockserver-client": "^5.1.1", "nock": "^10.0.0", - "nyc": "^13.1.0", + "nyc": "^14.0.0", "p-retry": "^4.0.0", "proxyquire": "^2.0.0", "sinon": "^7.2.7", From c8ec0fd67fa6031a2e744f219c72b058aeee0ede Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Thu, 9 May 2019 02:32:55 +0800 Subject: [PATCH 041/104] docs: fix grammar --- docs/usage/getting-started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage/getting-started.md b/docs/usage/getting-started.md index e715eeca..f8bda3bb 100644 --- a/docs/usage/getting-started.md +++ b/docs/usage/getting-started.md @@ -1,6 +1,6 @@ # Getting started -In order to use **semantic-release** you must follows this steps: +In order to use **semantic-release** you must follow these steps: - [Install](./installation.md#installation) **semantic-release** in your project - Configure your Continuous Integration service to [run **semantic-release**](./ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) - Configure your Git repository and package manager repository [authentication](ci-configuration.md#authentication) in your Continuous Integration service @@ -19,4 +19,4 @@ semantic-release-cli setup See the [semantic-release-cli](https://github.com/semantic-release/cli#what-it-does) documentation for more details. -**Note**: only a limited number of options, CI services and plugins is currently supported by `semantic-release-cli`. +**Note**: only a limited number of options, CI services and plugins are currently supported by `semantic-release-cli`. From f4cf7c8b51a7f982939844ce3f8d2f762b355433 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 17 Apr 2019 04:08:46 +0000 Subject: [PATCH 042/104] fix(package): update figures to version 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 70ff1b57..80e14128 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "debug": "^4.0.0", "env-ci": "^3.0.0", "execa": "^1.0.0", - "figures": "^2.0.0", + "figures": "^3.0.0", "find-versions": "^3.0.0", "get-stream": "^5.0.0", "git-log-parser": "^1.2.0", From 079251c6b84268d29ebe87b78f662cd4a6c66380 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 16 Apr 2019 12:05:39 +0000 Subject: [PATCH 043/104] chore(package): update tempy to version 0.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 80e14128..6934f9f5 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "proxyquire": "^2.0.0", "sinon": "^7.2.7", "stream-buffers": "^3.0.2", - "tempy": "^0.2.1", + "tempy": "^0.3.0", "xo": "^0.24.0" }, "engines": { From 39d15b37f92521cfcad9733f84a81cd8676f648e Mon Sep 17 00:00:00 2001 From: Hannes Rabo Date: Wed, 8 May 2019 21:45:30 +0200 Subject: [PATCH 044/104] docs: add `semantic-release-slack-bot` to community plugins --- docs/extending/plugins-list.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index 2f208043..001177c3 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -41,6 +41,10 @@ [Open a Pull Request](https://github.com/semantic-release/semantic-release/blob/master/CONTRIBUTING.md#submitting-a-pull-request) to add your plugin to the list. +- [semantic-release-slack-bot](https://github.com/juliuscc/semantic-release-slack-bot) + - `verifyConditions`: Verify that the environment variable `SLACK_WEBHOOK` has been defined. + - `success`: Publish a message about the success to a slack channel. + - `fail`: Optionally publish a message about failure to a slack channel. - [semantic-release-docker](https://github.com/felixfbecker/semantic-release-docker) - `verifyConditions`: Verify that all needed configuration is present and login to the Docker registry. - `publish`: Tag the image specified by `name` with the new version, push it to Docker Hub and update the latest tag From edf382f88838ed543c0b76cb6c914cca1fc1ddd1 Mon Sep 17 00:00:00 2001 From: Matt Oakes Date: Wed, 8 May 2019 13:01:01 -0700 Subject: [PATCH 045/104] docs: add `semantic-release-circleci-orb` to the community plugin list --- docs/extending/plugins-list.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index 001177c3..d0c569cb 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -81,3 +81,6 @@ - `verifyConditions`: Verify that project has a Gradle wrapper script, and `build.gradle` contains a task to publish artifacts. - `prepare`: Changes the version number in the `gradle.properties` - `publish`: Triggers Gradle to publish artifacts. +- [semantic-release-circleci-orb](https://github.com/matt-oakes/semantic-release-circleci-orb) + - `verifyConditions`: Verify the presence of the `CIRCLECI_API_TOKEN` environment variable, `orbName` option, and the `circleci` CLI. + - `publish`: Publish the CircleCI orb. From 4e001c34f9abdb6a87e62ad82043713b355a644e Mon Sep 17 00:00:00 2001 From: Anton Golub Date: Thu, 9 May 2019 20:41:04 +0300 Subject: [PATCH 046/104] docs: add `semantic-release-github-pages` to community plugins --- docs/extending/plugins-list.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index d0c569cb..6244b5a1 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -84,3 +84,6 @@ - [semantic-release-circleci-orb](https://github.com/matt-oakes/semantic-release-circleci-orb) - `verifyConditions`: Verify the presence of the `CIRCLECI_API_TOKEN` environment variable, `orbName` option, and the `circleci` CLI. - `publish`: Publish the CircleCI orb. +- [semantic-release-github-pages](https://github.com/qiwi/semantic-release-gh-pages-plugin) + - `verifyConditions`: Verify the presence of the auth token set via environment variables. + - `publish`: Pushes commit to the documentation branch. From 6e64745f6bff1dd273e3aee5c5955513154800a3 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 11 May 2019 14:51:52 +0000 Subject: [PATCH 047/104] chore(package): update fs-extra to version 8.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6934f9f5..35438d15 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "delay": "^4.0.0", "dockerode": "^2.5.2", "file-url": "^3.0.0", - "fs-extra": "^7.0.0", + "fs-extra": "^8.0.0", "got": "^9.0.0", "js-yaml": "^3.10.0", "mockserver-client": "^5.1.1", From 74103abac4c09dde87205a088ba1aca482bf7352 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sun, 12 May 2019 15:50:54 +0000 Subject: [PATCH 048/104] fix(package): update read-pkg-up to version 6.0.0 --- lib/get-config.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/get-config.js b/lib/get-config.js index 1745eaf1..45073bcd 100644 --- a/lib/get-config.js +++ b/lib/get-config.js @@ -85,6 +85,6 @@ module.exports = async (context, opts) => { }; async function pkgRepoUrl(opts) { - const {pkg} = await readPkgUp(opts); + const {package: pkg} = (await readPkgUp(opts)) || {}; return pkg && (isPlainObject(pkg.repository) ? pkg.repository.url : pkg.repository); } diff --git a/package.json b/package.json index 35438d15..2ee85592 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "marked-terminal": "^3.2.0", "p-locate": "^4.0.0", "p-reduce": "^2.0.0", - "read-pkg-up": "^5.0.0", + "read-pkg-up": "^6.0.0", "resolve-from": "^5.0.0", "semver": "^6.0.0", "signale": "^1.2.1", From d034ce52494fbe1c6bdee25eaf58c65ff39ec286 Mon Sep 17 00:00:00 2001 From: Jan Piotrowski Date: Mon, 20 May 2019 17:46:02 +0200 Subject: [PATCH 049/104] =?UTF-8?q?docs:=20Remove=20broken=20waffle.io=20?= =?UTF-8?q?=F0=9F=92=80=20badge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index c8cad592..a2aa1fdc 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,6 @@ semantic-release

-

- - Waffle.io - -

npm latest version From bcf3a853f2ad988a34edca0f484bd7df07d3c7ac Mon Sep 17 00:00:00 2001 From: Niels Hofmans <5222512+hazcod@users.noreply.github.com> Date: Mon, 20 May 2019 23:36:57 +0200 Subject: [PATCH 050/104] docs:optimize images (#1185) *Total -- 258.67kb -> 182.47kb (29.46%) /media/semantic-release-cli.png -- 116.80kb -> 65.42kb (43.99%) /media/bender.png -- 141.88kb -> 117.05kb (17.5%) --- media/bender.png | Bin 145282 -> 119864 bytes media/semantic-release-cli.png | Bin 119601 -> 66988 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/media/bender.png b/media/bender.png index abbccf21780ef13812b44c84f0c43834dc5aaf44..acfbb3069a10929a23a54018da020462722b928a 100644 GIT binary patch literal 119864 zcmV*MKx4m&P)q00EW=0ssI2?frwA00004XF*Lt006O% z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8xfB;EEK~#9!?EQDVtyOg{jz43}Ip4C%Zl@P|Z&nmhup(0I zVoZ!B#&}~inwVz1xhCG+^!&c*n#5dVVoQ`LAXq>_0R=%s=}q7OhttolYpu7;Imh_@ z@vgP^J~V+y)Z9Hk`!hdl@4eQ$-glNUM|s9G=#_7JCjbEhP!Irs0T^Rqj06GT*n|** zuk%)GzO2CP62nZf_C8b$b3MJ2sJa9AfysZ-+NLf1(aBslmP}r$V>A;D{ZB%w4Xe|v?Mlo^g@6- zcp@T0Ff2?;P=bkSs~C%Z5Y4+|Y>mQOlNo2ckIhGEc!80edzfY)K_n58h^i_`nTd^q z_uIdJ>$ZFE*>dmQ{lP*bJw<}55COE0WF5YSTbbOIw$grbg_6=xwOGEdnVE>drukch z3KXI#CjhL=Hte_mhW!p0U$r)MG}oI=(|k#+kpMqHS$SB&6hbh@G1uUFN6@65vYZ@Y2Z_N_-8^Q40gJ;HD#cwN+7pgdHX8uN}GN-#Bc--G@oBGy^} zLGATsFfR^hV%nZZi*0ZrQbG^In*?RZ=+wZ*X#_o7$_1X1(dwSRQt!vh-VP&Bo zXuv&$V0xg+L_|cSs*A5R`j!4CuP2C71PP6d9@e4fNg`AU3K3N$V(XlL7W@hI_7DiMU_;RMriiM5Z#C?duf5wXNR1ZyoqFlo!U?#yg&&6>64pxUu*=l%EI z-|xjv$BcJ7NouRQ7L7?_t>q|QW55brV5P0JpTwrLTr6mVb|e6(D&OvQLl9N1gP)%6 z&CK^&84f?_z&y{5bAw*5)9I*c2w`*)2F#+;q!_6z4<(x(S!0r+SQ~y)pzLf5>YQz{ zx;@*sPVe5+&e9_eUcYJM2FGL_tYvFh5bLriebH`pSLS!6t+bz1ooQ%!v5o*p4Zt$^ znC97FP{tV9n0~*%ZQHhcw(QxnXV=u!>hbYblo(-{tz!%DDEh|xDnRmsd`u4!o0EqM z^RtPm)!ey6%eZUn4nuL%hW(B?^Z<>u#FAsQ4A$tQ&q&&>)Q6xy$Y5M)D{ZCySV|=@ zYJ%zrpUsVnhLBoAQl==yAW3MlJ+``II|<)*+b*X0&e)n5RGFa6WS65fg?P!$L=P*Q z9=*trMwt^Y2_=Nko1ZNP@yJ8g?zeHBK_m`QYKcD75fIhL%u1G3Wo3p}+DiM0Y(mz^+r4Y&-kG_gKL~Y%0LydeR@zEiX+L2a(`fVZl9~gfXk{2{p_66%Z``nX{l+XA zQ>aOtfP;b>ZW0k0;b?Wm>T4v43d?8rC;fPl6oNWqNk}rNDc)_%ca+S z?|au>bG=~a*u)gTj^JGCeT)KQDSFSLG^EUo2pAqg$A>v{j|?KRBXKCQ1j7_4qu~@# zCJ?DMuc2_TQVU3&a{#pFJa-&qEFHUd%g!U8cEGRx=C7S_;`7(7*;p>jX5Eg)a%F;7 z`j!4Cv2Tz809b_}i!e(CtI}O}ZTa>U-+JrM{nnvJlv8p5h7?=mJl3v#9>c8;mMP$ zx_~z}NHxpOC;*CB=~w!d{wJ#^FsRXz2u%Vk2v$jIkq!H8Jn+av)L?F5cFja5XZR47 zK>?H?3}FBbK^rv$Z8D@vX%c$%p=Hw#E$^S1L%`J3)W&riRkaS4OA?|L_tHvRY5xsd zRaNb*y=v7eV^9=@h%j?Qk@UlnCqJwUrD+-h27^HrD(}6BfSKG1OWaCZY5xtIbFKwMXYC|O#QT-`TWKrpzh!GBEh1uOA{b+u5&;eQ$&a02 zN>e0BLPP`_ChyS-MchhTY5yHfxmX!v@;r|bRaF^deu#D)@WabuYqU5b5|J{Lq->b6 zl8&;{R@#5ZR@XHphKOQBjFFj%nSKm?OvaeHhN>>|rPw41Ww|niD{ZCyH#Ft)7JwL| zF+)2kgz)2N$^nQ1W;VuHYl$d&Z9auRs_>ZTWKo|%p8Mn!f*{*QdOfw`VnEIf9Qfq&=4cg zPzzj?x5EPGA_$Bihzu4uh8dDRElFk)QXm2Wh=2kNScZWzl)wT+fgjdzfdL$JG=jr7 z1VI?F@j1W_i_biABLG3*M;|nReQXuZX;>|5SXPg8X&e?g8dw1p2oSOK6wQ4aC~@S` z+W^ubbBzrDC7C-DhBRafG9w z24vaXF)s~{009W{fcsQhdd3F~DeHr-X#vAB;{723q#1Box(~x(prP|22*JocYjtT& z6Ij6t$mqrvh%)?$Ysx0^;w>p)6dYu@%LEAC%+6Nx3(h&7T7`)*VluIYqtU)uECwf} zOwCv;3n0THD3L}tyf{@2&G+&WysXQ3EcFM_p8V$;HDxWOnZkzIfFVj^h*VVxhN+I8 z3@4!S+FSnNeg8Xd+0$J=_1ZuB?a334gEKHxR#o2Wh*Yc!Hkj+*@P9vj+1VEi_Rh99 zuYbqi{TU8eM`P_;t5m7F`OXi%`+Z@0&P zy2{L}{^&OjIOVxbu?L7gV5Ei*!GH+Z&EI&-zrOqZJXZ`_{H{OwKz8C&k?^D5r9dPw zqD5?kh7NZN87ifACSeGo0F2p%>(2iC<^S|=u2*}5$zu-r*}wTitQn)k)(8y41XfrD zqJkg>3SpqS`ObfS$M48YubynZ`S*Tf>eS~5c^eCq?JkNj8jZv*eD}t``1RkJ zD6v5DQ-Ac^`E6(;X-uZ?9^&4wmcp@|s z4T*a&q-b4qS40GS;?2K2bK924c<$?7@w8ui8ztfuA&PM}HE!?MuKdXF{=rxg>(spE zFMhv!;!{PcpqiM3K!_2ds!B-;NEOP=rs&7NI_>p#u8(&5oY%hesqg*;X!HaSrC<=j z%lUusC)3}%wdD~cj&EN7qBp%RJ>e;6wPIar<^*6;CL6^EXhP{+F*lZXBP2kXG^G^N zbFk@spFI1@FI|+g-7~jWCcCHn;+qaQ=^4mcU{0um9^mz^X2iHhf)MV&jOw1XMMc$(gbqWJ!+sxv&1=2X|b1OE+(o zB!`~-jHkc-%}68Vxdczbuo&Wco`f&`E_SL_ib-RT~lI& z-F)3|B^^hKg+59%fA$4ee)-~Sulufuz(-P~HksVK{^@7F=*h1+69;cb<`5&21SZi? zk_J^Z)4&H>HJ5w%i|SB-4_U{FhPsm_ zj!;zI@7i14xou*)?#(RB-gp1xGmeH$!APA00<*!O2X$M&`i*n`>K|HtF~;gxfw2h~ zD-a?=?fbiS$1OXO`9U$$^E;=}FVV4V9Eb!0mH92(%DcAZvtBx;+&PV+h=zrYW%Gc$ zWrYGFQA0Gb9_-rV@7iH!`c+G3@4R>Y2~T}2gEQ>)!3qeOCTnNV?{%yLrBL(bkA5n> zd;6GLsjB&27jtHIqXTUp zu}kEvC5no=mR+-Q?@sNBI*K!M@U^PKFhn6jhKRWl+>haTd%a@&E`QfH%=E)#yWYMV z3j?$m*6Hw|0#QTi#ek4Tlz#7xcj!I4YlB@k-j1SHYZIF(2Lhq;Iz1=%@6p*o$T&+8ZL8ACmMJ8vscYXBJopsbMQ{qryS z#2^0oBqjanX_vV@96z{c>z`fnWrz%`(>8?J!xI9AU4g2_1`@D){(=wv-~RnOR=3)9 ze`d!*@1`$)<(Qv&6|@AiGtPrzsB)VC1PK5$v&L%f?t8B~_lxZvy=_G~v2opb*Io;f zr~m3(wJtbmYwfA5A;R63`WQ{jTW#!K*nY#Uy_@b*NB7-u3ufmq-hnZIwv&wEF{tIH zyZ`<@zZ1T{%@lsDlLV-9DZEO*F7Mg#wSWE0CqMS_7yr^5U;M6Lgb*AdL^1}%3{{QI z={IC)QXZ-Hy4-le$QEKs8JwbA_t46ddgtn664iZtVoT9%KMTT zhyo~T#Vz-J^u2%3E>L@4uI;?+*WQN77A#a^0t2E!QPc|q7g3dE2mwSerdb&Zh3F`( zfTorMn2mMLCJ%38Ta%=)wgJBqkum0RAz5|A+rCT%CIG5+us|!%kvMqY`_^}Met(N; z=hIc+IY)!~tDid`l~|ie@CL9WBd#%#8tuuXsj4=a+)abEsmUJhZlcEK@gP#ybx{;m zRW(z95SZDp0nj`tKi2i2fXT9&Tp3+0)(d-qu}HE;eO5p~kq{Vx5eYB`X*%CqNb@Yq zviXGtq$wHOuo^ZK=Bv6c%CfHNy6*S;2!V(UE!`)Gpb7~JHO9ag#8}t0_rCPC4*^gx zTNrM1QAGe}Q>vx6eUDV0tQlK9H9I?-74d@q`w85BF9lM-CkBZD0iXmN z$^igm+4S@@DGVs~3M474g@}|z3hSn8eDCf*e9OE1{d?Q(c9EOyCTyFqd-fmSbI`=r z3EobX_aTk=)F(d)Ymp`}9D)~-SeFt?>|0lW9zr|$Psx@iTrg3SbR3m}5E#syIFlx2 zRXOLt1Sp&_*1|Y|F|&Y@|KhFhcGH9Lyj`XIQ@`S1t1t>jY*BoT#{Pn zoP)IhVFaiLGcy}zBI0H>Yh$TAEMP2z8Y*aTWvb4(BuT8b|4AFSnIvIE2@M$_a{^+p zIqzRTwRv*Q-m+&_k5w^rZNBw}TXFY&h{%Yn=%RON=vixgCBzNPBu&$%fO}(wJ^XWp z7$X|dY>c%wP17vPno%NSmMXo+`F6@ZE;)RKj9&5S2Wl4L2T4z}5-N+1w{ z*b3_2pqlIDdA@GHO@pdDXw~{}eE!Rro=2}wWLim9OO+-$e2~f~)~WayLXHFge1uJ^ z>u$L1dpFd*vevlY!3R>5oJ^cAu`pO1IicZE)R+zyl(Inxi29|oKR4Cts^MVC<=I4g z{J!gN#hv%TIuLwOSV3xRvo9kfHf7w{B_3MEBuV3`GPYULKbE${0h9exXAxQba-s)>x+QIKSG4lPC%0=(895t!{=|IMp8 z$e#Jxv)=T^K?o4#nf|rseF@eUZnOky2lgf$+b2ngDOp&-G_{Gh-8fd^F6y;Yih z?~9k#S6!FeBtoLpu%zCDIZHA`MHI(Iqm;dY^@1R%>ojkH9rFDC3%+>Awbwi6S{qg$ zdB*e4`s6?0(2b#-M%!Wi6b_g=>K$+Rm2*G##{d1^m%rilFa)L;1F-|NG0z{)789a} zBI4#BFTtdM!~j(g!&r-EkwFR0*dd3DwSf4dKqS=o_FsPZzN>BwrC(70w9{Ys%wK&w zy7_=m1Iz}@&2BZs%2aC{${J>{!Ekp8LTI!D=bW`RF&5T>%_Gnxn@8A zkg0(+K$VPx(DfI7WlU||FE$)`*a1KNs(__C?a$enH>INZIdb8 zXrk6yWSQfK&1o`hhEFjP%FUi{B$_m0T@}nAe$0Z20B2zs*1&LNkh91$B(6~z9=v>s z7(`hsZ$wPm%0UEXfOsT|dD(q7+OCL1iP|irW)ejj6;B||>t?=UY~BWDrsjeY5rT#& zRcvSN+1|qHBMv_L8BZ@4irnMtXMY~*KpZ7zNs3s58OETlLBu9O?SuDlDel>R{UzTl zW*5Nb^w++oO1W2*Moq^isKfG+lV$rh`anz&zW?jrm?9SF7x&$G+mvf1WcDu1z2;Zm4!?kIVpp$G$V@TcvjhW7 zwV(33SN{CFehHm65*MHfDMJ}m{4x$m{s9tzM=`MqnsmW37Hnz943@i(I0pQ z48>~Tj6)G-F8t>C|KEpKYcfbVIcERU{`7xgGL2FjH~=Dzjldvdh{ZAzYZ5m)R2yZV zR23sdsnHI+_Xq*OhleNCj4?nwyl>n$jkfil5KIba6W}+BhJC%RYXC3~1Ap<^=e5-2 zd4A-HPsc?2NzZ>y%?N{H&uw?(=I=KSR3TA9WXLi{Vq>m~NTbj-rfVFAg&*n!TeMz@ zhUzPGLrv3|yvv?ZACG#du|O;deTfUcDiL9zh@Mds0uTs+rTI}(?`!xFeQ0hYgn$^O zsz$c9LX<&%N-se7tL}QqTu;dhDhPBpOX13NEW5CRf@+BHop|W~%_1-;us;V-1 zimCDEzWj70$|B9(vZc7<+aS|ed=flVn#!?26WSN+90b>$|7F^2pjS#n7?Oc_t>>C!X;Vq%Mb<+j9ThRo7yO zAQ2D~5jQz&P^;8v`g1cgA%vOP`TTj$J?!`=b1UN_-14<6zkk8SP-MnM6=C+IP1F*; zjy^Pbxs6E=LMdf#9E{y|%lBn|kh`p^0}ek7c?M$gLl`RUvVlBv@4IMza=|c?^lHp+@!7pbY*K@68*Vd1jRUeNI*OsD_!S#VrBBdOgrvv>Wvjp+9uyrG)XM*_jzEcVWA zzxj4U?7Hn|pZOA)c;xd>l2+E6Uq}PK_w~yG3-47!qil&vtyK&a0k9@A#>U2CjCrRG z#23E%7pJK<#!T7#g1`GHcFqB=s;UYSm|z(MWSOegAt+HD0tm?3mJLKu)~R!yED!y1 zJa1#y9w;G1fH?2MSgA^cn520OHGB=jFr3;fLYf&ViosG)XJ4Q9NG&H_icvR86F=Df z`UtY=hgl^>MjNL&ZJ0T#cmxnf10)WrFs@yrkm7_VAM%1{X`X4nEN{K<&QG3)`LdO_A`roqMp!}!mKaRJ@G5W?zA_+$h&0V7 z#wv~EV<+-mpT7v2AP9`{gB~PsnwzMogCPSpP^o+^5CU22Ms8zn{IIG^%Z7+zRGXL} z(YYi>ZOAR%P$A$SBU5fUo?%g}3c<(Vz+ExW1OxfRZ+~F^p6%@{?^%7_ul`c&$wv+9 z!n%&a^yU@}I~Jk_Uq}E$(0ElJ$$D)NxAb3`>qEnzCNeVw@(3VJoLk^)u)FOW->!Gh zayxsp+AE7IuExS3MN);jM%_-bptVgB@Q)uG1hKDb@nN#v zHBnP#1ceZ4LF01`0U;m;h#(4rB5n0&=2(ztS#zj}uYYIIF^DgXa|j;21yFL;m%hSf#mrAS`B_*!0mr3k zNr=XH(nj%L=Km$8MUP%UjNkd{*D__a(nC*pDiT7=fx`)>zsNhb)+PhryX;%&Ef`u- zD2$G(Lo&QU8S3%zapxS$K9cy;zwyppzTat&b^89RAN@Bhln^S)UVvC*A@Kp4`;uLutqNaj$7v6%up2X}n% z6Zd}O+WFr6-c(Ncm7iPp(`RC$on;vi45XE2O_*Ps@D>9MX>dKVZ>Um#u-tg!H>wQN z2p;H!ZoIIH+wQvi+8Yz_z~SUqoB?Yp@8QgGXTGFLIVOffxbU;*z~ule8v-0`tUZCf zh957fqyUf!k}~GXwyaxGm(o6#k~RQ0Obo(cfJoy>p0kZUEG#U*T6WoRyy)S=&yW9{ zXao}(CTol_K8SC!Jf8iu$-@r_MpMBzKl=p?JYuM!iA@YKvxRf20_SkYJvUtPO^Ko4 zc=D^y#Og6Hf=Yk}LzPA}G5*nQ4`m7f0T0S>+gBU>Kk6Sdtufu4BTA#&A&R){BpWq}MMhxd zArztqFKg1rn+f(f_UR~3@BtP$k>#im^VQFO-g=ps7&lX0_taxx2-ZOb`)$~C+!1|> ztvvtUH?P8cfw}pNZGuEYow)=c|6^DYE5^iF3+SL4BUkU7!5#Nu%TC<016y`r%P!o# z19$DhT|02s4s6+hxdOM`-Zn|BeQuL(w+q8X*^B#fY_LAgQ)Hjqt7X>|0iv|BR`A|A z2M9Pm?{%-331yZgb9Zl@``Q&u7Vs99*uYp+B^e8sU-qf9O|Oh3;|FeB_3Y!3TZk9| znI<$WU}_9@EX!?deCI^TC1;;I=CVNA+OV3Q@gx`wLJdbaWdHSt9pp)Kwl`dPHRk&$ z>Ia^mqtweJN&5YMk1V0JJF5zNnfLe@=6if<;N{9$CXP1Iu44fSC@|T3a_}j7{ zI?-MH$>hmvLOSHiHoR_`?4pmiWt&VCSl~Z5y@=yH1U#@Mncg`=|@rAD( z_PUqCHCI@44+F}qOsYwe^oSZv7V-@1+?j8C!DlMv_In|YL?K~l6ay?HM@qv{;XRnpN?~=wi=X#<|N8f9 zpZ%oSHqXZ@EDX}U{cP*(zr6Pk|L8d{x$iRje>O}R8V_oJWO ze*Q%eQx|2aRnlq$5k%y&hO>fnG3~5L3f*@d>wo=&J%qZ{EPzH<_zKvm|{Z_|8-X2)pnIPIFG9g{TEHS$^1|b z7abAKEG|54cnuVm*eF?ni?CkcBLGl*@ma6nPA(#GVesAazJzEDSPjE4@)q{YU4HHt zbFzb~Jnp0uaLE1;59gq4t7rr_=RF%LECS=6L)VNJ%ub?Zy46(sty8es41%60M23E#OvSlOWXRhA5E`1}6o6L0$!?4CiEQS(4B<)DB>+iF3TL>GfgF~+hi=jZ30b7alJ!ovJ~Z)Rqu zK{!7S*o}SgW|n<-n%VapYfygxk(l8O5QeES04uXHD~JTj3L(N`QmY{WC=Z$kkdGyV zR*${q|M&ZU{Q9@$BKxgc`;p)O^Z#|+arsjYtwh8~sH@awAR1Eh?Bg^b0Hn--HUtJV z+_pjtP$bCcJ6D$W|2cPk{Yn{BDY+ZY|MGDMzZrRk zI+#`~l%>rwsBh8&Ji{9aJUSRvnj3CZhKAV(!vLl#ft0BkjUmW_mrSMR%bARh@F%pFZeB0`udO2c+#kIKT)owhp?670*Gp~Dlm|jqVh`^W- zD;T$^{6=1$i7ul#Vgy*c@vZ#XXTBJj1u2XHhZv)Y>VncR zyN$pgQUhujmu!p(dh4~{wQ~z;yY-CcoCwQMK!Onf5qX9|amuS+ddn48`(n_tbn^ul z9ewCqsL7C6%&Lx1AOR;(FhL_?=uEDvt3hJT+E=_}0OOJfn={wH*%2)pBQ@va7W?>U`Jksr7 zyYg>-`8VJFmw(C!ZmvV+9N9btTlfm>1T0`xAfoov8-zUz<<_0M_b!CFxw)vQD@4V3 zW%lmbwr=AA1|&=AnB44X89DnO5H4CY$A@e_G>W$Bh)*XrnQo)WjvOKh)Uw*e)PTU` zn~O*5;1VcFwCt2zlgQa@cNxhQ7tv8;qlT8jQx7}iciz5ZOhdn1+mnyH=Y6_m{L=tHt zZcW%*1S(1hfNucq1X4Iy9eAQt4Wag^YX_sg1mYbRUy}G}LfpGBciihP!dcd=f&oi5lP*HyEOJ8g>DIo>e+5}|{6@~=X%4%t~Y7SE!-4aP8sYwC^5LOxb zSBB@OF+uH%DS||jK+?cOF{DXr^7TN?c>usi)IpU(;$|Jf#wl!? zz+vlg&^jEn4hL<(fg5n(1{|~j2X4fH>#=DZNA16Zt9~M$)EEOF6EY62sEP&vtrj%} zYk8PoVl9*%97T-_B{+o|z{0C-&KGCksE(CkXf5rmg+T!(5NlCdi6E_=4l*5Z@Ej#X zc(Jeu0hu}Btd|W)a^n_my{C84*TGt&ic&%4q7VPe8l<&Gw{B|lsV{;tfI(CwrcRCZ z(u%A;fC;%R>H?xrLREt;!(Dg5m%Oh$#UlD6UV0|#h+3d*q1HH=n?om=c=7XtV+5HH zzWR$_h6q&!kpsKBsACjlX-(w3bYNk$vOs1lgv2HQW1{`CUw#|4TRNyFN__qwKZ?C` zfB|t)S1!$?3ONg{p`O4#RtdY@wfg>yyBTBJcCKTamkmiy!^{$Z%;~rB}z~QrFmBP8c>EXgjGjBV1>o<(^ZF1 z`sLty+DC_Kj#LauwE&PT_YRO+C>vc2j_~j@3IYOw8IdRwR0+&`d%cZ_PkzhmZ@K>F zE&uZ6gS%t*+Ymhrg9_2Ms61-g&88jhKl4+&mAF>hUr5zf-U2rEaj2ILTFKo z9ge?e6qb-M(h>2;@Y)0*Fc{nrR2Ej)j+9M>QB?4Wbzln(RSd!;A_*H(psXY{CNacp z#>XIpSi)N5X@nPv5^636t0pGv9kaHT#h{p&YSdL?0vl)icoHZ++pbr@ZXhNt=yv`2M|jefLHw>wbzi|NNU_&0@ac5Evx{8S!3`j3fcVNg(p1cyBB>eQ*+;U zZHvqv8U5t&~|CME$O)~ad+PGl5zTpIgO4mO>3%5g9H!fju=+}3`_EqC7c<%{<_ z>t!I$vP=m@sLSY)CU6K+WyZu9gVDS_2AHbsJLh~1X=ehEdhhP_FMrW*zV!4DzvlJf zzMX^ncCB&k`@VHuedEpMNe39t6k@G|K*eNPdwTD^-lHt*3opJDt^5~$`JFF#(TgW1 zC&#;O=UiPDTefVu=9+8oxZ{osFZ$}Yue|KIryjp*^}4K;RbIC3*uH7ghO)mfeIhnQl3n)q=WKXV$Ks>TTOSnYDYf z{Vc}so^#PjPkIVXq|nfdWhY562x;InkoA-WN&_P@Tr-P9qOu{Ci4c@QLXD-P+C0|~ zcM5@uf+FAyfizl)0NdgDw8R9p2w7|%d^8A)Y*UNoB#m(O0SE!j~e;MiH%OqVL ztZ@J#M9va1L@`>h6cxxAwg3n97P5fK=7~Z@E2EmTLk#FuzN`{vvFsrr(h!JKSkuT{ zD{wMAbOSH3)1oY}dEZ@cp!e)Ii(pa``FZnxWIT@h(i zaT3P^cOyHA8&*wT_Sp-bf81{&Mlm!@Sg%9NxMm7$L=u63Wc2N})xyA^`73Yx?$y_{ z_e3iF=lOAQ$jE|$l-M8O)$Bj21bL@c*s?fwa1kd0Y>m;={!QET#1)HCK-A}#xth2_( zCYpQ+RZY|Mu)_{pvu54##~(knYR$i&{U4WK`t=vR__QwDqO8`gUe#ad8HP0U#!H9X zqAz7JqDqTtE)R=<;$`L@|3Jth$&%ioizXpMxhnlwcaqql@({)PwQv1{-z~;-vbN=M z!C!v_mwy{V&{#_4;5Y(No21I--kSKA5`-H}qYT$blcC<2zs=vFjg8X~90x)m)Pz79 z8bLdR%?OsDC&sPP(swO2^1G;pBoI9i)b%`_q=XDE*@LJTt!Oftf| z(l8SHfDqe~3zmlJn=Hlhk+Nk4stSbF8`swonb}00-nt#uBKiO?OaZZup<%@I5=?W& zS}?QFo13?Zi-xAwuSHQnn#>gnp$5_Lpi(sMxy6-;EPBLh&9~XzU!9rE<#VR zw}1Hs7q+ro5_9ayCty_ z4MIqhB%>q|*gAGil0@#h%#sPve7rlTtNzT~)favZWkfNs-A*aRpe|roB}5h>fYc0E zv<#JFQuq?b9Q?Fbo?2zb5iQ)k?cRSs7qGc;Wm%Fn&N;-05DARI08z(U6J6IXwd%*R zKqVoDq5=SyAO?(g!1A;I{ zYr8wvz$}|w&KP5oB%3#HKI*8We(ue0e#blB0SRCE%7xQ2dpfNQ8e;Gdrw!RhgOeUE z&0*TGjNFe8nGPb$AgdCIi2z0f@yMN#2IPU0I%+gp1O!35t941IJnPI~dE5Da`nN3) zvk*S|zyJI#ANyOZAD`%UYhNH(V06kwC^hR$B2%-@0w4@G)DlEl9xPl1U`QPOy^*e- zU7cDnfBCXa-Bk;7 z{nkP2Hk^FixC74>?W{dWZHzG=)DnG~P||H##+~2#E^qG@GjrvRUG?=hx$$HBW9c~O zu`UduHXMm9l$5FQVH1zQ3bcegRtAYO0to=e2rRXc5GgW^q;Nx1PSHpJ`$Z!Ek*ev1Dx>W}}?a6bo;yeoqYZGQJecej4L4U!Dtk1jm zTzh?+Ky@{{ZBO})tFz}m1whT@5(BuRECVAfM%_pBfdZJi!bA%qFZ{Wmy79uVyXiqb zD8BmfPyhTYUN)7tw#VAnVU0vE!vLblI#}odh7&VJIgIgA=C+NFg!y^NZIYxYOQ@_} zzbSE1(VJO-+5|yE0C^BBQ)bOz(CZaA;-F10KK+a&YxV20ljfE7H68K;L3{_5}k?uu_*`odFAO_DTq%^Kk)Q8HZ5L&3xk){h<$7SdW=*IAZr-#gt(TS!|)D6=F--9P&0Uw_Ya*MIN4i}Kk8bKmYyyzl?K z;bR{}^a-0G@hQooOJuP^MstQ3EPBUe$&^{Ft|4%O5rz+L86>!Qe3p@=K@v$lH+05} z;i#c&su5XD^pBT@jzOZtk;D)ohy@W@SV4?139i5K_G_-2Lefk1nXftZ$-ntljJ41g zs6q7Tbl?Ti!zmI*uea@@OaJwke|J2|yq62lIrn8}JS(Lb!@ybx4S^91Qh*?4c#k5) zk)X}_JuFr@OxU62it%V75&Eb3w62b=!2)8^>jE!Q6fu}1Z1F~hDCERNQlTuqJSVUShj4v z|AyOIUdx-IT_h{Mu*8PsY(J#RgxgC7FUWZ#FgS|7!UZNsT2$XW2jCnDhetPvQS1^PJ3~gxe_t#n!V-I=U~TPQg$MtDiJ*_ zsRcANS;2e0eDRhWZw+-V);;5e&&7Bf8XHYepacWhB#;%R5$kr>{+0|{>==epidnMY5B18y`6I$jnTQqe61P^9~8d0eG)&*a21D~)d zQoG+t$76L1NhQ=r5|IZw7>?zx8MH&1)y7CR@T6eEic3TXz~_=UfVg7sLq1-U=LJW*#Ot zNe5MQ>|h;2fCK`@(vHn@`1tiNT$sD0vfQ`yq~o8~5KqH07|%nxNlj7Ff8X1nrvzEu9Fx29>^e8>&Mpg2eZfwjydFY zzwwR*D`}eM3-yKn_=)Y`yw*{&qzH}FAG5qrobC&TShPC`ENFS40!mN;E`>@#0Stfv zP>$r04!!gZbG{N>^T86X5|jb8pb97jWuP)pCGY}`fWSmG;!O;s!f4c$5Qd!iDB^c6 zx!eUUqql1(y3c-kukO_lWCp7ypb>^(39XFUEwyPCJzDPAlb*HUE2l*B#r0qQ8miiK z#?bG>h&LJxl+*~)D5wRcP!(JqGB24IR|T#E`G6qHVfTx{QzOWl;&cU203}esR>&)4 zC6WrZ1_zJ~fvj=lRC)lKX)&g@4+>wFom(T7YO$8o(AB6+3f2)1D+7rG6PO?od2-U} zr|9bO!Wqlvynp%B{TE(_9Sf*kE-5O77*i{h5ePTj@h^Y;S7{|hlsYqK{LD|G(`tgW zNtSsHAqGTQ)b3?yqOuV%5D=qfSm4kDS0B88Nivm>-*??DZQL5R+D!uHyFIj;ao;qkVo^~u!9XR6lm?lZ3Ri$;MRUtLfv=)zUjm- zUv|X}mwwYllon+>S@+zNVXRgq*dk4!F$@V%MFjirzkiI;mvvoMF~$Z?8G?B4>$(<^ zJV`s9&VBc8NnLWxQAa%Yr49)MV&+?^QMUDzSzbE=lsd zt;9j3s(osawb~#9GIbD_!n(AoeO-qbW8;~D0VFgGSQ2WGxXcxy42VjSI}7ho2SD>Y zgCX_B<}*)y?$5lkXLZb^cH8W~zWcc>OR6CB_ynfo&;pn z8HBoqsO1>rRMzg@ejl#73D?|?Ywp1H_uyMMo> zXq0xa^Ecg%Z{LEeZoxIT;F?=-?Jc-=_#%AoR=w*!3F>jPKlm+wOt23y8H< zWM&>d=57#bL)6>08{fDFH{Fe^Z^qTP;yd5R6*u9UJ8;$Q^39uY=S~y~IQXbhqKX1> zBlazOL*KhM$^s5*%y4{OIre@z>t>r})nIF;AGTPyjK(b$8wKk^lIk*Zh2S^L@`|r5R{EW?HycbD*aJB^DVFUW9iC~jGhLiM! z(_Vz}9Keu671~e|gNT_UG!E-uMF}-P7K~c^mt9rtnhwyurIXHl2?jmDDj8Kzb)6zh zy-g{1gNPUtmuiUUExh6luV09sjnP4M*?C_=jU3iM5X5CErEXAHFg8elp7V`; z_wPpGG24SD)DBzrT=~I|eehR)r#n|Am7fXaTYvjKD0@f@S(bV48?U(?YEa5Tk##BV-|O`{W8GG(m8Gs8^kS$QX4t(ma}(W8-fhoJ&lLf) z^Zf~HM5*0bRaEE=iZpGBLNx;HB^rf@x7Gs2vO#Z9RAts_#X;;>eeXS(;cFz77_LK^ zr8#AKxBmohTS=cju!6!bgpFMX_cwri7-D+pPU$nEl@L^lEV2;@DL!bY2WNWe% zWCvAQ*1pr}m|peu&t0(nGoK!~p$@g^R`UjZ61!pQ|2zL|ggV&RHtjuO?<%_rfHfA% z2tKz7z}H@UdCLQJC^$Up)EA+Z0WfTRg5ayvCZtR(LlmR1ApkOV!qe^KxE+8Q_kHgc z+_e?Q9D*!?uP91c7p>Oh-o1PO;Ip3schSjWRi?I8!_x>N zt0SzqB{+eq+VS?@qA(LJBo=8J>ynpM%Hm}P-OvY^XR`})fz-4!Fa(+=t%wM=es0z< z@!D0-e*LTOy7T*Ye(maR(xzH3|McfCKl}W(2W+0$xUMw1dv0cK_ulTnw`=W;Pt8=- z5hp$KCBN~mQ8nXzb$$Z1(#oK&Yvk!*Fj!?B76zuFl( z&@dhA=f3JpbTb$#{lFP(*rmq8*HDU4$S@Jtbq$wrCsFlW1R%fUbLUT{Ep@#zp{G9o zWK2y31SJqGND&0Jhp2Tam}6C%EWyO2U0<#`U_XD??pD^m=f>M`>lPfkA?dbJ7tB02 z=&kE?$ilYT4H`Cq(NHBeD||0^8N{OwXs2&{@2~vMn|{&mnO)l%HxVvL=Ia89Q4;=!p z>T#%_UziUnQ)8J)+6xQ4Zl~qzSXbDyXV1jM#Pr;Jx7)4C5$2bP#pqpPQ)}`( zcWD|FwdkOZU@Y`2PO`D7)xEN8wN09JKt_~6rXc}{&T5(#B0koJ9XefW?OeYf4QXPN zEQK*}u7R#a6%+-CG3H+XXa7qN+c;<^e!jTpnwzfw#OF{FY>q4e3EHiSXrU^iWikdz zD1#}ZGpXeSeILDuh%mKVU0aFlUFh`VYH!8|vdWvzf?!u~Ewv6BU)S5U7gaE67eP_f z?WC0?S-&VqslRK_WPx>kSu>DT1DPshbs=j8SkuRA#<%=rm5al6J0QD_5je3Sdm2gvbt3vH#0N}>QIZNSd ztetwppM2n%uYK8e)Vs@t&6_v3O|o#;{qr~8wfmdbx3^UdE*9bAUS;DzSg%=b84?`SctfCAHZ+oGEP_S62zH`atphZi2PWqWwrU$IAT1lx=8t|$K7?5$bDoi~1j2E8t%F|+I zXZB8y!>kV`y?4*tH*dW6{LA^)Z3j_%%w>E0U}jVIslV{r=fCUcuxT}7?KS3|Zr<)F zOzA_rGvR}FIuihHyY-IQ*;&g&S{|1s#&Hl|2OlJg5*x?H4T@m~pRdXd>(;*T`Oll2 znApC3yZ4o~oFqvIp$Ty5Qli&GL6B6Vsy5affPTL}KR1_ky7%wgeba4s+_!yaA-Lg| z+b+8J($9SEylcOAgO55rH@|cD9%B;2NjVs#X`7TCvfOnDuJ!>@d!()XHtgaMr@9NQ zLvBN23)gZjWI2q&uzT83KlA?gY&DfzKee+r`;BX^YKmv+LJz5{$I^vWt=(;2$V_Pn zEI z(8|#tASm+ohC>gUI_8jjOucQ4>;2cvc6dIwz1$8mJIHL2+Cj=yYTS6Yvw9V*Z2~i- zVuGZwWif~`f(_bj5Y6u0)3aKyZtrU8lg@YnIHKKxYOh?VVv!?nR&`A%8Nn_hr5RG4 z`Hr`2>tcJG%%(M$U;iDnQm{edI&0Q$I_{{Mmf2=}eu)Y`4|#*d5jv-K1_O7<#vtFjLE^me^Rd+k2}V|%4UD|6OKjEPB9f|OO0a)#7k_1NjZ_ufCh;4`QH{Oh;+h50t?>h5&ar_}A4 zo0;6azSng}p7Fd7eD&OC|G{q~XRtI*&Lw#4$cLq4dFz1n{f_lxxi<_5vK%462dSbl z8H@$R7r*g!VZ+q?xZ9QD>1VtcnNb5+t3CuoYZ5?_7^Ix6Up+UT%#PX4A)A{r7RWQ? zX>s2@JxljXX%E@(oY%h+PBl~jawHMa#{dGHV{1VO2qtj={Gf--o%E_RdaLqnF6@rg z_r8BSd_a~WPh_mUovWQ`O!r?K4PXuBt%goIR-V`bB1!-wbXZl^aed=Q%9*ps)C3bOXVE&OJFmL>>hbaM+E+f-O%0xg zq^YSLo9Fq6vDz48>bedg9DVfB&wTpvd-v>~pP6NaH6-2}W>Nu!&Uo{$@vsPLWNpA> zEClaElBQ6FcxO1ZbpJhfU3tZ&Dm`mx?bQAUZa!eYO>3a_^z7byw%)&G%Ql-P$2{qX z-}udUJ^%U7oalD8-@j+W`c0uKRHMstFx6TnWDyA4cB3poip?9~42lv=p2W8D3Xx!T zYi||h`Fy}2qBoCrijE5j+av?oUVpBWw=o~FeLL2!LGFMUNNwH*s6u5x7F_Mwk&ds1 zD5Ahe1fbJFwSZ6~8^@qR5i!<*jYt~;?BF%JEJv?ELytc_i!5DAVUfjHErSW9NCTJG)NVi# zwMW*9yZ6jb@0}c<#CQh@l@wCzNEy3($l8b=hEY{bS*IcXy~z}90w~r249iulwJfu2 z40AoyidGxGK;~c>Du{pxBEcAlB6aX35=LrD@s3-C?`JNt!@_pUv}@8(4lEfgL{uJ@ z&`B}biM}9bW#nids)Ysu!l1I8Vs3yz0rA+p7QT?ga@sC^nV1AXT@_j02Bezale!jy z!UIt-Gkx!!clq7Z<4K-p?e^gZ;ed5;H1wLYz#7B`x@AT=-a@Jr1^pU(rV#{F6X>RJ zMyp8eHln~#DW&&SH*KR3?CxP^787GwKNYKaZ;-Vopi!WK0HlSVA9pRx%wV>MEcGe5 zsmTcT8jTu92KVnq?W5Lazx6O&5eyp(8`Mkf6PrL3hM`hQa4s?6-t0`L-Gu;q_9AiU z^{{zkGzw0tShQdtIx^U@!nHW~Xny=|-Iy#D&3{?!<=Uj>YO#$SuY?h^4S{>Yyy5RUK^7 zawZQd<-qUVGkfi|-}}Qq_>=3ezwyPVyyQLa`Spz(Hx^Y19#Va$Y3jWXUeYub5n@eU z;=K>GC!!=tzH-T>@A>urdE{|VKJw_J$hgYaHpz^$Ap|<(&A$eSQGlY6CBZ~&M5L*? zpfL;R15ownB{u_#YB)t6WiSyO z*rDu;2JUtX)D{M+mTdI3Z8GO2z&Kb28^A_iR~*=I1IJFl{i<)%mPJz6g&`!)_3QZ@ zjyZ)`6a%ypuhAI?V?#AiBGSl-16duqdY45D7W;-bBgUh^gb&9;g8`B=3~S`8Ms)fNyCO$e4V zC_>#gSwh4^GCGxtw8^t+=oAyMY4Qn;tF%nXL4lchv~w7Rr5fT9olwFKAgO9jGt^a3 z5vIiD11Th;J?24DZotK?AI-%DzjJMljhX^_L(P0C5et6btic zB?vVP&{PdzTNVRO(!`{I^apbZlgo0bf(+^iiO3RY#7qxa8!#Bm>*{U|_9(4@Jrb8d zBM5~C3@*EHd)x{ub zw`+)p6@(Vp0J1O#N1Ao|s9Q)C8bAq5Tv$ljEieUmzzQ^JI1@Dvi%QkLDaJSOl`$se zRO^zA0VycPvQj16>daLARyq+-q_C(;R^cpz#FCpVR~89vw(tQ=(O>{kgfXNjD+B=( z%7{*mgaD4^z@({&0LoQpN*n_rNU+v|ER?ZO!dPS(dx{Wdoq>KJ3Y-4>BzP&IYB#>U1Z z`m!tyagroNbjz*Z|Bd&(KM0-poRi3K<)d*nDn%7@*i%j%G9!?(0;DpmV#MD2BymjG zxozt$H{Gyj_pXUmE7KAD1j37*wiDHcGI2vV_2qDzoL}HgXkQ4=?I937@HXyRF z&Nw3op~})Wfr@_55hHWnCBYaMBP!3<8JDt2NTsSvHN)Ir9&N}-s2H9h){#x>YG8~t zSqscfad$f`fNc;1MS;Rt*E2pfY2{06Y}8OQ)UqLq5Mjtdl1Ql_0}=&A0?134?JuNh zp0R_dCF?aPLxVW7WE>zqae=HyEEX10;~)}9naB#9R~H&;30DsWNDUJ+jMf8EMV`T^ z*C?chDK$v51+7z)*2O^TkmNZy2~`b6VwhtjQZn!WnZ$^=ip)TqO_^CWuuFhAw=kck zIR$VK_@I`R3^bCVAd!r%S(wO@As7g}1XvbJE@=Uj+bouY91g*oG?!3w5GY%+&Ie26 z)KCy42||cQJzP(Vq^NC{!wAx}XFL+q^JQu*H%#=#GN+MAByyU=m>8l-^5`pe2}tX@ zGFgf=i6Anrl2T%A*-*fiJMKCA?9YAh@BZQQ=UtH4eAVhT-~awy8#Zpf`PN(dz2c^u zZm`z2JMBDAolCs;(v-DVWoslvV@y@ms(_L)wyr%Jd)w{bzw_=bhaPsQf`|<<)jlZH zE+X8hi3%w*NT_jKM@X2P*>meHH}2iJ?UWb2@PGV|pFiN>&CaGXd*?I=A=)%EmYp?a zA?39R-O3V zlV1I^KXu}XC+1mNg-R?%cne9D$wx?pbF^j^ssa+adAHI!B9=wb&JEbsvB=X5;0m6> zE=ds;#Q;o6s||?w5{AJxls#o}Nejf57^*NPAD@H>m=|P_asrniRInEP0SqHcvXp8O zVj3279p>c?m4*tn0d>+gVhtb$FKozQ$R0&pmHo8S$-vX~e43=w<-$~JTth`nj#96c z22Y6{W=BWtgP0~b>sEJH6{xEqX;5St`#>NvmdS;(3`U9bxwtT4T4UWQNNC{i3^qjI zQJEvvBufF)uLtcUk03kNMP0(MK&(j(anvf7r7;eM9VY`RQg+N7YY(YS*2!~ zf)Zz)Hhh4DPHU`2th7p7Iig3BDw=wqzLc1=gB_JKfXWgth6(|RRX8;@n`{tD=h9m1 zq@AJ=7|to3N73etAhnG|91+r_HK_ZoECV@&T78iwNfa?K8odPJG`H&ezTb6SSVC2S zG*+d}GEraG;k$V8|E{LV%BI;F7eIBIB$-=(SsI#F$zO zVm8*-h09WuHEfEif(Y3}d`-?m0+_w83g^dZjO_rb9s-C@On`P=Cur>whY;$z=2VTb zr7ts3Q+Q>Zqd*Jn(=#&1U!P-LYfG<(FT6&wX3S(z8x{#y@=M zuO_F)d)2&i#t}jE0VxzXC;Nh$ThRb zBft1TB2o~MHU%L786~EW5<^Kzhv_g6_~ub%7YG_Y23>j{1>Hn#U0tWpXdxcAy8c!aTr=eW0vSvBU%t6`{uW zrW$3jPzR*Z#7EQvN=k^VGRnX+!i&kg%USoD2We0m%^R9*VG<<;6DiP8bTuQelx)1n z*rUrAfQSeI%&Zs|_%*~$j#J=9#RzJ$)YSUgU3IcFv}ITvPejzi-{Z$Vl<}3 z#4=T7<=N?l|M^?*|IDY){h6Qrxfh-Ck|T~dsws#9W*@`!^z8TVyz|yuZ{50e>)D_A z_hXJZ=3Vc4*OQ*~Bx`M}(_WaHPt!EUxE!XGrfI9yy7%6DKYRA){`P|(deNz;uiyW` zf!BWN)4Zi*%yG{=StLpj=bSaBu4|2ApuVo0r7wTsJnxJ5{nl^1;uUAKa;G9tD^b0# zowMC;7eHNmW9-=2*v!mK2(c{cty{NWa>=DvT=A`9P`&-_?|SvCUi0c#z4n>UIAPO< zjceAdJ@k+xp8B-opYxpOu3fXP7!+4sdF8I%JD&2?<0i+tkiei(+R3m+<4~a+RskQ) z1`U7ZB_5A`%DO$|PxHaW&yMDdOmlf!#$exoDbTRHj7szli`g}KHe^OrzmNQ56h@c7 znTBhTXbHqS`qE{$M@!GOJVWh)S02)dJj9dkTPtMov&*=p=mDkobaXSU!yJ_5J(}d6 zWjz5D8|qICiB_As8LCXn=8Kl*3yXy4!+Z{UzymHm^|E=O{AX=UwNDT>D^M>KU#>?;gK{K^{ z#ONU^BRO_~Rk3<0W>Z`x=$xoeq@S#V)`qe*m)RD&}NxCrK zixLz_oa=PE>(;J4=-@+-JMP$n4?6Ioi!S=gSH3beHFeNI2gMLYq}%N_C7@faR*W%( zFc=JGXJ*mc=fvVt?sz8g-MJ{t2)>;&FAOmEgNgC_g*z7sWs3&yLVsp zt#5`D_MQfsaEv0oGuQ>$Ni%Be>kb;LjXV>tKo7o7gm(_Z+Z=cYD+ z#3nn0Xy4=*eZUKPl*uy>g0$~L%>2+vIJBIAPWJhA@q_dj>9?EjYKn1V-|tc#eoIpf zX0ZhJkD}>}h-2!K zvaDQ^4F&@dX=uiqZ|e1WV`F3Y-+%wL*IxU_fBeUrHf{R--~auSPC9ALnl)uvt7?os z#)zf@k+nqB>-DlMJLK>qPCf06>u>(<6<1t&^2yIhZ3>AXe#C|H5DdYOjj*2fF-0DU z@rCH27brchO^=760nug5DMUlgDf-bB-POm^FVR#!U|#sYaK0XLXVX3}bY!tSpeOT$ z%rDUc54Od>sQwt%lz5njB4%3+ii)zty{Nl z_3G8X_j|whv5$T1KmOxCcJ12r>%ac%8#it=#w1B1B59gdRpq^(n3yPv!Z;TsD#5xW zDEr`DszhX?m&CdxNe0D&v6Q5I-H=<$|y26 zHda&xGaEy0lzT*Eh{*dY#(3a?2mb1>{^}uz9P&4R^EWr$bkiUI@gE;`)KTl!t=qM0 zSEtiS({yfbZuRQbWmys#iI50pCZWbDZkVkxhDeFkGOVG6x#{oUam(z^ZSQ#ZFQ0ze zDVBwqtxbEqUY50(tcbK)t;U}g7g|Z^5Fi2#`9LP#d zZf1kG5~YSN@=^7G1Z8g6g}JHY5*tD_fI*R9hTOvqo(rNwI!YEqQU>Xx{H`C^LrFj4-8)~j=&G>m55mgMp&TCEGi@{O#Fn-*8^ti2lbK2 zD4IKI)|Eh6Sq1dNonJv*oI60mFpOcE?_C-YQ`VdH1{D{iZj)>1}U& zTLZalw5_J{l}#L56GHIbQ<|D64Hbkn#&}711(NLV6oV@@3`_DP&oO8}OXMTSEw}1P$&ph+YBuT8bGcz;H z+-|ph6`ZxkkgC>oh_Pa}X_`tzjM0Zs7WIY=n>w9tS=7uNA%uvg(mF99YDgCmh{W1d z8X6MKi)ohWqns45z`y<5zqQ-#m%sewV`F2zUJpP~6yxLLWmzh*vQZ^#EZ}2|%&@9j*EPdfD}&zr zz4zSJ%F{Rg?CYi`$D;QjEsAntVj@Yh?b~;DyW>OlycnHxyLa#Y{O3P^&N=7o-MjZA zANk0J4I7wQRU1y0x~`pb&bbgmU3(%T(>Rz6Gbb($!5h<>o88-67?l0u-Yr`WIcWa| z)5yF;tuG<~o2GKks7@9QLt2I!4nKe%UEgptHPwt%7a6G<)5$#G?*t|`i}+IjB%^wC zs`OaC7eoZJ>{HD(O^m^kC1zF=B&d=yGd-3oKd$~E@1J!z0u9aIqv;vaq%D)WrD&-T z(Gxsh%!~82yl*t3rFv@0&8HMlF#vQ}J=8ShK0mDajWGgd6lz;6jAlqhqzNwC=D!bK zZ;SmSjL+j)Z$E@}Vo9{@4-P-%@P5B<*%7m&(=^TV zyw~eJ%ac%_rCYNANtUTj4>~L=}SAE&cwvTu3fu`%=FBh2pVq>5lM(agUeD& z8dGPWF-ekZuD)tvde1Na&-Wg%-+s|oq=-H^Yh#Q>QKV_wph1!(F~)=tZoc{EzyJHc zKj@%?{?GsUKgS$%%(6h10BF*M4OwPpcE%Wih7c5R%tcX%#CEF%pf^9?X|*r<@`YbK z?|f&nM_(vfM+`xa*8bl&I{rhy{{L(3i5}0#di}@YSbsw2_a}e7Xb7+iwsz4Pavch1{>@tw0X(^;N3?nRIoW0hKa~P zh%CU&To%RL+}!k@9iKn%oatSApZT;S4%~mEhGH^vtl=?5k(NV*e_;PuLmrRy`akLY zV{K3Lcs|h~swaAWf1=l0V7m}>`<~e}?|$dn8!o!=OV4}W3l2H#s3umfB7inTx}vJu zpz0sGwOXwgyx;|Q-+lK7Kls5$=nF+h0_ z!$~D(2J6UmuS5`mb4jqcaB|@x@R7XV1n+8W`4x}p%HLD zyzBor=pU=u^n{M*>d-_+fkZ%0(gRg92 zLKrf&8PmA`n%u32UO^&ajCua^pTB+k_H)lY_kxGNJ#}(&RSar4g)&3-k@qA3#>dC+xZ{qCF1l!9V&a4oPMDgS8XFs% zo14q?{9ypGDk3q45CT}OwNS+9_wL?v<>i;1{qO&_Vg0&84?M7)oB5f&-IgV?j|oX5 zj}eFXSREGfqr*A=NZMnv=J<&pPkMrp&`FDKTOY1lEI=- z{bLcvTKU~uww`J5qe|S?Tguu*so?B~Q_`(-{^{ZdK_10VO-m=vgGc`43jEQBf zWOS6CiyN=|USecWqLU!jP)1K4Xr$7^WE?!? ze;<9q!lPBi|DVJGERQQavfcMYkLMGe)B41_uztk%^Pkx-4T;LeHQ2WMjtI0fL=WNc zg$vF*@uU-z%(dDXfEZ%~PHgbp4_Z46NRunq?=Jv2`skw%KKS5oed}9!Yb?oIo$fe{ z6&Zp~Rh39B0`9u~t{0sA+_jUdNTnF`($qleAyG3e0o9r>nVz2BwQE<5ar5TQ-g_dd z>-yoO5`ZY;lB5{abzOhqg3n)d#Wyd#^c(wcTC--=lu;olBd`i10uXS|i*YFtL4s;D z3=)YkcDk+k`FRm>X|)$l|lZYM-?9&CoRh|&+`x^@3iOV z=j%FTS=Mg1ed(9Ey_V+1rOC|9OrGZ<)I>%#cDv)fg*iu>=jqgjs6ye5E>2$f512w~m2HOC%%>#;#Jbu3T-s_|%YIa+Y?wy|2r(cNh(dIrh+oIN~}>t zf}v;)GelLbzp#!T4IcoO0{*iW&4lBMN(O>V;~SEXj^rWXmmaes=OC zPGaZ#lGurze2L@F{-rxk?8HfID^{^3QKG~m5+v9OkRW;=Ou_WI_nx-P`u^DW9t=PX zL{fl6kaM2<+-C@Ycg{WM?6uc=*Sp@gz&S_3Rc5p`j0wLO@VAss#M>e?nWjZEW0vQ) zb#ZY%Cpnh7bxV!^G%B+07fQm#~o1o;4pl)jX_TrO*}Xel$g6c&obFim35^SIH7 zh+Htn3RYLD?9kx@v$NCPJ$-HrmUA9wigON_Em6E-d6LFCx7IjS6R^W;< zV7>5ti-3r(QAS`Ga-l7RVR-D=u_Q@crDm;F%Dm;E~Kabt`S;*uAx zQZ5=}YPH&qG}Z0Xd{u#+ZDk7F$=R?m&y^MkEk`q0R599a^(CP2)65r|0H%s>!177sAk=7(W-5 z0wSukwKL*Msl{3?3`0P_^~~4{y5{F)QdW+uSSrrUE&9G+ELD>vv6ejFFO|Jg5t*fY zyI=qoEhA>ps>~R`I8(}KFsQ8o%8UWwmzWTY=_X$ZNchE4TgR*WkDWSoX5+|KV+;{+ z&a+eng+S|!F2y?GoF_>Nz&y`0Kx@~pn_pO{bo6v}b-8*guLP~NLI|O?ZR_ZI^~IO6 zEK5}u28F0zLvn#;X$IbWnmRfue=w zx^mCCQ+{Q{S{kv8$N=EneBBtuIWLu~qTMsv8U>c9Qte=p&CSgbD6JCT_kl|pl#(O? zY84AeK+T7Vtqk~Fc{~s)=yX=0WCzd@lWw9h#g2xP$p z2xSeEo@U%w1mup0==p{A&fXKJrq7O!XPIIsj4@3Zz%I)+aq@5O?~O6t-Q8rNzrVj+ zE+e9gBrY&D!EeUJ;NZ}!FTON0GpAN-1S^C9WMJu%JDZg9w%cxVN=$CtBn-nij+Z+j zH$Jofm3?Q=j`jEVO-)V3aonia!Z37xcCAVAX81P*#N1RXYnkLB=a?uR1PxCHahjZ) ziwxN)ird@U$(WUA^NQ96wv~h<3L%8>tOb?mRApX41c66{g@RU@ zky529Yb4~9=Ub@9%GPo9u=}Np)NSwt09lp+SdJ{qGGi5E%v#FB+B#o#N>3;NZQ&uv`&yfaGt~s&u6bWMVB&T zlWPqu$@F490)$Fiha2+GGbZ-~00_ny7gCnW-+AKkk&z9RQn9UCZqyb9TW(9Gj*gDU zAAfvua&mBRFplFWikv*tCI7t;VtRV|nP;8>fcg3PC`u~DAdVAjn>E-)zsCS@=E5%k z0As)e0zhYX&(TxI5V*F4TuR?d>+$LF>GMkdE60_HN<;>L0Wn1095f(9WRQ`Nzz7^I zgd+&S5HUGt`~oA3Nn#3xAWO9}nsdoeEUge%F6~u;16^=AA7iK$2rOfa$f!*BcD1Kj zlEw)Ug`r=orLP5~06=hbJR^f^>Cy}l-AKy5ef!p|S(7A56h);{Y1u>*sa{(c8yoxKAO6&Bx82s(*4Ee8 zXN<|Rj5%#@xY*G|aOuoi02q@Z&2$t+fB9Em+qeJKQn^y9RuFi(TFEl4l=7wb#)nT= zj>}*c27x;+FSyZ6qXEtH&+WPMu3O)A-~Fpr4Kl_^TWcXR+V|zT>8Wo$^zb*n@z9Mo z-2%YEVx_&keRgi)l7)s{2~t zJTGLz(co7C(-j4o2oae>z%3CGk|vwY)uK|leci^9HLHixL>a9;8A#tV#&}^#cz!)m z8#ir@6TP@tk25N_cehGHSo$EXWKUN%Fxm5LfHQ{ z9~R5qJ&!#0_^r3zx^2_OG>IhV#sHu-##m}fs z6bf2v2XZ?c%SAqyxgl67Wq*I~?Ch)qz>o>)F(EyzwaWk*aI(r8V4V4Z)LL6Zgb)@> zGxG~5<(K~QYp)zUa>t!__Vllst2Kyu20WuIW5}o_NValZky5TH7q1YJ6IWR(1!Kau z#O4+neFLkEg;eQcSV)otxzO4S53Q*!#t3Y&7Hf;u&hA=0(!iJCtLT=EMIc(aSyuyQ zVgO(rnga-ci;Z~Gw(W-xAARAammhfGBaHiL8cWGNFEG|7Nn(ugJdX(u#5m{H0y05} z-MxJyn>W95@Nj8zs&8<$V3K+MT$CuI5m9hFeQI=c^z4l{-neVmE-7V}Wl55Fp65$B zKR?en2S%>R&JctU1jZOE7_T)Jr5_f{#YZ3e`nl;@1h1>7dv>9b7jbz5jfmLn!a`6e zm8)%)_O`R*6Hh(;^g^x9IM1ipY;~6-rK@&@2D1-+LGiBm9ZZsOjatV;v z<3vdBk;isF^zBFc2L=nJDlkqckx69E_={WM7IEeM%De+N$Xo7YoES&OfeTAuwPl=Z zZM6l?ITIYwZ8J zD1@h!;+$8@<&&pRz5MF_S|hpn*4t*L=ax+cjRh$^&+~?d)@WsR?|$m!$&)VG;Zj&@ zvn=x@Z>yH2l#NDXVPPQ%g7>`VJ-xlX4?p~Hu54MYR^8dSo?mY2qLeC?O84A*|EbfX zU;WyH^9wZxbTt|cS9V%!<0MN`r48lr($$P)VPT>6^>2K0ac+L~+V#b9#SmI@<}i z)~0FW%KMdi2hik(#5n;&ArZM!3al*_OYXM1O@%RL4KPHlb)irI16itwC^H(lGp2P* z#i?^M=OhfYa-FZ-J2Gdi(t5GnXGKVvY1`4&efrGk)YOy%ZkXW3ViABjIK|}+Qc6VZ z>+4&!YE@f%6&b8qGrWEKwj_!6?%g{zHPv2i^QD-dosObt-@bj5lamiT@WAHHn*kt- zBF31I3>g_PE>6|!^~J@-Byp`e6pRbjltqpj$?;<+zx}O83SqIkt2a@4IUXYOeLqu1 z8S3pHXzOS{c<|s0FTDs{xZKAjHO@SfF;*^@J89vB&rB-Me=4rjD*|CWO*%as{omPFZ>h!n*SQy}vh+CD-vGB49{FQ4#}UcXzkT zy3Z3&7!i@+*x%a=);1aqWWrhtoKe#ssa4Olprs{U>Xr8^bH6UcSewWZ_q-^I+B({S z==jMKnbATr&bh;Jnhi2z^917T*)vg8Pa4tWRfGM{^lF6|LLFp+`vE|l5zE*V<%);W{KK6I$X6RgvjlbYPFgx(?-X~o_J#S zf<4o_p@OuCA_*j*e2P z;5jUy0{RVqu8M5~O5;y6Vv4jerAAO7(yoX0-8x;M~;oLk~UFGcZtX zZztr)xpi$Kv`v8u%mF91a-FZ>3yBad5+FEr@$+)CNfLR2jg5_RhP!s|Xs=d{QArd# z19xLhmStqE6g&ugMDRnuR4N&z1ZVxdy=~P>dq?}ZiF1bz9g>nojoR+V9@a_pu6N&G zt(F?K#nI8zje6bpJ?VK)CQch;tWLG!Tzb+&K&2ES1%aQbtPwRHdGxVA{Nq0!8eX?) zWSh1CjGJXTSHdD#1A+@{?ZB#4wZ*wtUw!p=fA@F);jjL^k&Wv+J3DK&nv}A=yQRksFy4~O zbBwGN3ey#4#yHVb03u{yi7~X+CQ%GXE@LuQyFyzqNkl|OFdXRX1AsV=Ip<1Qfe6qd zs(}ThCA&JVjHFyS+}pZQRRCizs2)IT6$Ak%(b?I#ckkW<2M(-RHMqDKIrnU9tuMXy z_I9nc!;HGRx=x%p7DdVA)Wj>VygEL9Hjd*g(^|#Ms(sHs0~{G=mh_+guRreEj@-PYMTFfib74Ip5E zh+v%?F_2anuFT3^NfOg}jL%6DGA771F{~|?LSvLMia8z!fzg^FXswIIA|M%~5Xl;a z7`!IlS=U8&?sY4d`pN|-v!sZ_rPtQ?rO|d^RsY`SpL^z+J@?#ktMhmcJkdzvC{8n# zoH})C@7}#LGc&WZvrj*}=h)Fx(nGRXsg_1YM!GtCcJ0{y-gm$2%$YO3FYmwq{{Dg9 z+3BhFjw)kpe0==$>C@xmw*p}_v!!Trw3E_F3m#Ac!j7eqA>Of^?E~>XxDmUMHN2yfWv*&5w_h)8iwr<(P zIe+=(mtWbxKTXx)!-tO_KaPk}%5B@Wec%Hhn3$L-7Kjr%s(Zas24Q!a}3bn46nhSXdYzAD^F}CxF$f zSMS=jE6LJ>hmRgPaAe2LHs ztvQpfBOwGM0*h9g%=0{@3}XzCBXXBa1?OjWS7OlBzFUqrlSwYg4UGoH+5~i!YuyapI+yUOIa8sPFsh)~(yQeaFW?_Cq6^HuU!N zcXYOOb#*N+)ZK81V^E(yeX_s5zg#X(O-~w4TefVG!cVi<8gS^9@B33T(=#(O^?F3c z&dkic`1}h`KmF7rk33?5kh7prifZ-Kr;c~`^jFL6v*#xKf=^9tC2R_L6C<=jFarQe zDL^KJVw72ia`U#GS*D+P?!}3TiLF~UJ+tTO@$vD#f&OB#I5IMF(@i(6U%!6+`t|+& z{iRaL6rE*2R9h5x#oxZg`k|&lk!4}FC&uif^A&!L z!S`F3~{byk>XwUhlI5dB7FgmlePBFFnETTm%}1925|`~ zIjMf7MleMiDvvt)`yd{4V*B0SSm+33DhFgL++YOrPRVQ;UePOYuRL8ApfeuMf`8$k za58Gf@Dp~-6}==b=CeS? z3&sspOQ17+YeRt=Krpz&HjqH~l`LAu0>&DRpF%6Ek|;dJnkg6;fumIhXI6A5(RdTZ z>NUw_;7OQcCG;5=H3e9~dQSsE*H0T}aDOw|+OpZlc+pZTT(B3I);!Fs$q z%~z%n_IB{Iu=o40_^0Nge%b#U;klWTw%?_q`WVPytjyrl+x zO~~%vDa3MbXidk66QH((jtZ!)U~?rP6&9Lr^*#0?=1)&68I?0-IMBlo$UhRv`Pj+6 z3v7Zq?Y`i7Dl2vpe_?HAZZ4w({l7i&%;H{`N3&nS7SPt$3|tRlLqNrGsu0TI@R1*$ z4Y!b`WF5P79bEy>wJFxpS5x=nW2LV|9B#(@^d=XF`RkICf7u`KYK+48??o_L2m%Y~ z%#i6Vx`$I#soEv{IEke+us4`1wZ-GRpS;Giq6C7e5 z1l!`4(}frqYKe~WCbh`^isr^a+w{J@*w4PniM5}tn1EF|k_)5YA%r-vO1ID zatFo#Uix5Q;j0jbg2M)UBI&hu_4{z)EUyRHw~ z#r%s^puFkWH(!_kb$`r$Jngo)5IH}1?sjd|=d(X2*Q1w`l#kz%-on_zP$)TSMcy49 zUWFmeqCm7^!SMI5@7il|UFH-)Dw4=>Rm>rL#0=D@owQe-r^0Hr5aXGXvPM3FIF$T7 z6_WNqoFkm%M~(Se>6YIDqVLJ;9Yc>fxx3yqSu<`cnvGPo9I{(kzE<|(400y0pE7-oJ+QA z5JR*Kt&$q`cj0Z=b&LYV;uev^=DvhY3Jns3$0({?8fru5K!?KrR81%2c_7tM=lL$; z;{4o9WmWt>R;wE{Mb)N!aZkJps+7j+7A(1X0;$+Sku1M$%6iD{m2}JVxif$9Vs^4R zjfz+=5Y}oh*H6z*&m=Tq4#r>WjQGV-IGMsH9 zgliDvgrXR^IVs7-VQ z02t9Hf_yJK78A^SyK}=A7y)uUxelQvQ&=ySv+X zT63#es^9FoyOC~RSFXw-zf4NePpozn6ynLw6pWZTj&KImrfr(P^|*L@x?ar!-g4A& zDpfdHq*vK8GeWJa7Km4Z>1z;j<*dSe@XQ1!CE?c6)jEpWwvr9JLkOl6Tikdxw55zj zRF=~DlaD71FJdyPomDCqM*ivL4}{P`xMWC*VP`Ny?H6+Ge5q^-SltzM-!0 zBK4h{58Vb2lK^fV zV^lt9Sk4Ow$gzeszsiqtW)?+JD((>3^uzzy)_<%wMn4LritFZ8;3rNvQNp^})60RR(ae10wJpf@G|}U2wC5;?511mIPVGfAb4k$<`e@V*GaI4K-%yE93|l4y~OXNTbA_pDU668Mi=k8|91}> z+`}JlN1cb3qO}Ut``3*L@6`>wm>+n=&1FUHW`CI&R{Lm7YMnm zO?7k_Tex5L(_Zzk^2@a8%Ipg;WNn5ReeW5Gm%^~G^PSxE-C-2FXbS@)8f;Sm6lSgD zo|3LNX;BPjX`Hr9pM=H`#H#(jL~((5&_C_KS~crVI!1q6J8?2Q+w*}dGHKcaML4cA7AmYK8c$|B<8AXn^i zxNcjE%N4P|2{;X^U_13*gr+mUZsdCGi1d1gtINAx;neidIj<3mT>-U-P|;3iIKQ6u zI%rxAC9`89K*^WiSxJ$i;c$IV1*TdZm-ipBT2qk%o{DTgxd^yyJ(Lx{)yD4zBiu8<Z86fx+n&w7cWVWz<&x4f z$g2r@8^PowZE`egnWcxbD8b`r8)y(J^sXxEp5XEyeacEhVvnN=6!Y^ic~>-LpRw5j z6DvA7Fce4w_!sgB7|db?WYd>VU_n*{l*h(LK2#z4r(m4Le2`l7XzER2iJm{akz^{i zj<5Q999MhDN-@gvKV-YDBK;du>35BEF0)#X(T%>{RVN#hrsjgL2cTfA3b^SYSI;ac zxQA1=c{n9^O{c!Lm~Cu8`d&>18&Ao>rZO(q%J}~M_k?vfmxE93z=s|E?j4i>=PWBT z|Du3gMrFmA%=rdqMkjR7b?Ti!XdqH1OK zwj`8dbF{|aENhAl1Wy74E+Kr-3ezec|0xY-PyiwEBVT(R4v@-WTcha*4@KmQXvW4k zX$MKq%vHOMkHMn{_l5~;539`^4B_KfS0UF>J(!$@ERlt(4r{Ptb%U-UOUeKT*SVX! z&mvFWqKG*U@ZNk}=ltxVZJnEs;mt=Y3nf_#Sqtq@0`8s#BUMKiF($S?UARFNeUI&+3K}LRd(g)GJ1$6D+fTmp z?)u;QYTBN5-k*K#@|tt^FZ~YP-S_HBYHKgsF(^e`wmz!a6fm24kCX|bKnzEb> z%{g6Q!|f>AD&IjX{89U$=kD3BB-(&?hT}B9sHp;|ch~MldCv!6ympCyD1yD+?A|i3 zBdaOH-A<;9z0$o{lE@RjMP+=g;jMtSqXb zVA%cnGZ^H8?fu+8l=7fMaHt`xy(A{mzoV$7P1vNC zRO3dVHa#P!!72!CSl07V_Us_{aoPa(Cnk{!7c5m#A04vH%MCDd1(x-hXL`lY?$g#-DucEh3x*06c`KEn+U$AeVLB~;bc zQi^!5brW4`u-LxML8Xgp%{3Y`SGUf4_Pc5$3LJFkzg`2&xuM~Y+WbN=Fv-u)*J6|BwCqoZ)CCSG@o{K6)Hm~6>FQ2RqOrPESw4SAOn!zc*bO7E2CB*HaN=7BQ4!4o4H3sF&!Wp|dl>K(v=n z;-R*-6*w7AK_{W&7gG4t5s&uPun$;O>M=@{C^TbEheC7iIvh4a2jp!tO)MDUndt|6 zpC_Tt0SN29PQtFP~5uw}{gRh77=WkDL;^Up_KNq`>x45g%JS!$g zI?)$K^8dtw9q3OxF#5eJ`4uOjx3s;l+s@V2wpzY2J6sXPq*E&Ba^XHcQ@Ey-g!Ev4 z|6q6j!pER+{HcmfakLV7D>IRudnF=7ayfw!c>k1H9lQAX-7^P7*0A1m8*^hK7oX=T zku9EQxlit%gZth8=lZSwg1C_9#Z-h^K0E^_P!a^}wY3@67k`~o_@;=$!-2Zlau$WK zO5o~2=H%_EQ7;Kd?#fSkvK+~E1k-shEBm)VjSL_NMUO|T@=OfNrDxO1Tc0uam)Q28T-q~ z(DNZnz`S~Ad#B+x;Q74kq#jTa2qWLojA@iOz%#!+4RjqFmnLAG9(|LVPS`Ko$$7oS z$(QbY;|I563#*;SXh>zF2?{6tt;=CI-C#A443gld{wAnr3ckJ>fBixHZeKQ*LiEes zRD4TI3z))}94wS+l^Yf#Fm-ttg3II?st$C<`{GM=ubx~R zrCaMW5bJvpc6qq?*xMN^dOkSD*?fhQ;R)6Z^$WtYjhv^%6{r)Cl zy0#xYKqqQJzXEYv+ZvG}=Y|_aKqO9)M<<{k6___-<_3rds)U@@FmaO#U)tE>|CL=K zPr+7Hv|$&tx3_oiM5WmOBrO9)(LcWsQK@WiBQ^m8uKxIDx72U){<2!L-;V1An-g_WH8wW3 z(UPFSD6GN{g8P@dYGX24^)Q(=m132db8hZ&<>&W-B&Ya{4ePf9#95Os)KVFSW#pE> z@l6;n!)NUq?RJyBF6WQ;?Zr@}kVkdh=~-UCX+rG^jMH{d870N4c?? z0l_)v?j&O}#!)8|FVdLdN z{5e?#FQFtCorFYaxM`8md%1))YT8LV_W-e2QU$^30kk~W=ROg3<0!#0XJ%teqWf%Emii94=Dy|>8bNgRyy^gZI{-gxC)3O?W2zvbAgdz3zn=A zHvzdEu$0)C}c)32I`OTn#F8sX} z*>v|^jQgMHH5BU)Vp=Q&R4>7jz`nz~9>~~v`pMBkt{m`A2pPeem?|L6y`}7%3 ze(F1O5`TKc3PzPkpC*^*a%ehfD-_b#T#{ zh@Ayog7sK;jN46rKLo;^3U+` z18lR1r!jj*Epnwyt3UAxb_*`@leoQ!&h5E*dtOowvyusGFi-@>3UaCv?Mit0Fy099 z>|8C!{cj_DD%`9tuHSq+5&dyK;!gM$vt)$wQRPg^k=-ZXys{n;ov~+UPZQ-|t|bJ} zuR#E0dll31eON}N8Op&5s}NvG!eUV}@I0PCxizR?-`EvD@1yh_y1#tVw_#y{6@pAO z^?PF8`3N!Ht8YC2)R!9#rjHofh_$4)(D_l7yo#@?2 zO3N8c^J1S2+MK6e!uILN!@`MG$^cpzrHsN%Xr7lnU%A-@ru@E-UcLtw;(m+s?m)ew z4&dvtd`cK{1o_^*QF!jc(=hHMTlVE#lkWu$H(h8j`#HM{@(YDP%?D(ddd^4OC?d&6 z+UMR!wZ6OjVmBktm7=nJ_eSjhDSyCv7VY`87>y3XYfjJNlOpw{qA>q*yzlj@34Y0T zyWnJMKi)ziMo-W;b+!HggWTL)07>od?8MVREX5$0 z32o3V1$hQuijYRjfDs|fQr4#E@%XpcL*I(##@hTw%`XAeT*0XCr3rh7g%951Ad5$k zb$_&edFZhdQKx^~cDs1*?z^6H*u1OU?zp!{@;?yseynQ5QowAT{$eEMncU)|kck{r zdSHF;;A0PslZj%k$|;HmNRD{`0ro4Je&_ZUa{D8HU#SWmeCA}$#Oe{Hj)sn;U6p){ zpdg2SDxG}xO3V}!m_hti`zHw<2}|j8Cf4y|gf@5XLFLa9a{bfTs41WAj~9RznxQS( zgd;pcyy_7!GLArS3yKNy@zDogiT%dbvdP@YI=scl$N%5Iu_Dl7_xIuluB5_b|9&Cn zVO;=$41uhxfpG$Fmfvz}$aX~bT?8etQ{Fw=*cXly67^~Ip-D+DW#JH~Smiw-UcR2x z$<5L_k(~AZYwjF9%;E7C7qwo&m{j%~ey(0-(vbHCe)jD)W$C2(#l8mEiK^ z_a~bBHYfT)15z$Z!hgkLX~&pt%|RN7ZvmY((Vy1kwU|7uR3E$kQeMSV-k%lFVzeCp zD;4~Z=~-Muvva10PXssnh$-A4bV(`Ta<-+yk2yMXSZaJwPVzD+0D}m<@?P-c7b#RCD0~4Jg}- zW{torzw0C>D0LWJ6+H93z0|QryM|?F@%u>y82ExsVd@-2k?$EIUfV#3CzFfN+Bw_4 zv+?`|J&*4r6^*(=`q_$R7JdC=)s#20SrnN2Y(AkThRDIccK?{sxEmSry#ZlhnG}?> zk0)Zqs$7Vjmsa_Quc&aZb|wlfEG#GiBgyntSNQzrgkO?jo;So9sQ**tCIAeFe^=wA zri0o95Tmr|UYkB4eWL0qm**o+Fv^-FkMWE=d>1(1r(O@99x z;%nfqR_2~kRzXLw*r>J2&XmcdmvHnw52hCmVkqz9hn_uu_M452d@pvjE}l1$5B@N8 zOc%{PmB?J7{Jrm8F6Ecc&0OyS*E2@urU@gd1C_?6Ub;yCh#G;08BHxLJOF2~^W~i1 zAs`?0zNhbOA3zGh`?r4b3Dq`=L71zqA6fLVLjk)wl!sKX(vpILEv3r5ix}V*_z(e= zB(||{n|XhG^08n%T=D!Bzt_7_EkkUh-!{0k3esXllJ9n=1OM#*Bg zxS_6*+4inkzjVU-+VJLh_3v{^F_G7=QP}x#Aa%gQtpH0%S8}h@RE~~UP5z%b-|}?G zIHkgbv}sM<_UD9A&Q_YQHI%gT5u)_aZxdj$X+LWd#IV63@!d~xEHztDvspBZ!qcKL z97mKmR7~JNu8{%qr@=b~3d^h6g0h9pyysg-e=4@g?QeS&x&|OvpV| zPsSTu5P(GI;3kH;boI$U4)*290IQ;gQ(at=8u!3dJg7sLs+)(bRRH1aDl7P30(g$f)v%iyT|1k}lBOR2WhB|Btw z?%=j>rd19*&{mCdU*+(6zP|OR#g0cO#Gh(MY240qvHkWu;TykjR%Q$4-XfCpbr#PGL@4| zMz_h_x*1V*rcZpB-%MY4L~iY6*?W3bde5IrqepSa3_|xk9>(j-$MS)p^>F@j!C6z* zi*KMJ<7cyXl5IS^)d0Vo6sqzh88b&u-I!~^`*+Rf1((BSck%ySdt>;v6#G$6Y>Wz? z?g^K#wJMI97N5aT#YCFS-EQVgfI*;vJ)QrvmL?9e0>c;y35_IGPrYe|yPF$>+>5{E z3KY5;?ZnPm4cBL?@L#T(g^KYAQnX8-SnY3l+*XwW{Dsx*i7ddbmk*B$wcSVO6b*`o ztT52e?weQVX_A3$+0R2MAP~YZ`XbHVMebqolAfcWQP_QJMI+G(cf;nYep0gq)qg>i{Bbjf?`qGu)^ka~_+S|6};Y z4HV<&Gl5iF+uQPE<1a2no(m`>1Z&fxUP@7;N>S$u_^kBhXZblE9s$15>wWc0V86ee`Rx2b@Wt9 zc5B@}pCG_DJJag-m?IU|a+-NKz7ub@P?O33zk!IpU(nAYIQLXG+02NT=3`nLaM@L_CPtTpX!K>+rjU3 zkUsHgRV@I|xkoE^#FCfv|6^Zd$T?UprM|Yh`V&i%*I~2pKn0lRQV6@bxVW2XBlJ0* zK7IOzkT4>cvl*~~qQF3#aSHe-R+zvydp53jD(cDf1WoEJ?26fH^0pu~YBkhVQYaI3 z`@sFxck+S0eUoSJo%UMT26WNC$L2KdbI2ud;pm|fNEU&V7em7(Aa_{W*xZhZ-*((6 zrF(jM2IJ;c%lkaI!G33CujFCBMyBDB32U*BiXa>5TV)K@c=~z1VdC;0%;?w%BYK~% z3wyM=Lk*Gr0}uH~t5xf-Mq))Aj@k+V+_j}w&B3P0j`zb=%3I0jrB=blT*xYf;Rsus z^wQ-r`t#h~3ieQzknd-6V;(lt%zX;L%>YIcWaVrFG;7OpcWVbnYLQ+xYm;7Xg(U}C zyz#3J(nkE6pP&EDn>V7OqWt`T-r~#_5d0d>REKLkcH;`9GWSJ2ccMt6!?vaNAdGB) zvewkpTwGj~=>iCu3|kTWn#$<+tgMYe0oE?3dXO`2QLu7D8f$nke~2+H#RJWBqUzuyZ5*zpK=l z|2lemo>i%A`&`a7np;lk@yq^1gDhUQ+AGG?!sGL2M^>z^Y?RnmTM*H44{=qu4LOTZt0 zL-cruote2mx#;4YHwdC5V#w@j5Iv5cQ*yEZjbdF*%JoN`1^P}^p4to-6`*7)84WWm zlLxv&Z?lNpKld$nSjQ}HQfap!&(Aq$Wf!v1N-LN~8L86z#O0yftY@13;)S%d>B`va zx=uU>WmEz8v2V0wlZ(!i00XgQQ6L`}v_;7{W%_!ud;LtX*BU;&zG|w(jk$1n09x_$ zw&_X>jbi=SaKos?EVTJO8P4r?_I1UkG2V{TJO9@OiOlL9s`a*$@cqKD$>jbJNnBEs zL=cVDF35!$=znU?uv|uZDG0{J%9gl560>V4bkyfaVNLpqR)s*u2T#x4*3JzS-?b6i z|G`6kL7%fOIZ4F)>?T@>Oa>Y zGLiQ&09T>=j9hx9#)oLzY1>l5rCboxn*K^k^lRgR$*Eg+Powux&>h-1gvqXtj)f z(c%2KA+r31UfT&<{|nSca$#fykB`v0S|))G5H)Qf1TDC)RQd&l-bkdGLoKdn1~r9D z*f5c6*HU&8o#2`D1k|s4EDK3Yl4`6$L$#qqmdhmMyD~mWdAG6ERi$$)@wr~OvxOCP z7J*34E716(#U?~7{9H(|nmWY|ewwFiH=**%$%@$WNkVn9x@f!ujoY|7c`pG%YN8@FYW7^ZkK93~O4;lspv--w5|&Z1NWY<;73 zT9`#DHi!~qI*J9qTif`X|X|A z7e|PT_E=KgsY6QM@=JGT_BPdN1*_$7Xy~7ERP@1|@BGo9x6B%6#Y6ea!!O>surlIw zp4%XhN4loIq)A&5kQF0g2DFYr>IPDrh!R~Tg5%6*NS%0*14T~D&dj50ITJomqqd8N z(hQuwS8gp^;%xkT+-_64-d|L8L;W}vctAO3%CwUT+ zn;XwJwhL3gC+RGrP)y3yBko4CPnB6VF#UVAs3a7MrUf0H4dJXXH1f?L2KzIQN=S-v z$%{$}LMFMf`ucj~`f=VG-4>(%g$koB3cG?GQsio=Ef6aw&xLP28>8jR3+f(YpbC2l zP|QHuxVL3XG7Noj6Wx+V6KzW!gNnr(YF08c5(<$k`@s4#qRMgjMBw^$*_#*>S!HQy zNv>ZcVf3pA%_WB?X&QM@+e=dkrPfiK*2LUNgz%UBQsKI@&%tE;Adanob8z0fGa4qz zeRP-XIns|5{#{rJ$-ffY90%AFQDi1}T`dEu>nS%w$|Dw1i7Mr`-&SalRm50fLI73~ z{@!!$Uz9daxC0uqVR3pl(pFRcv*B54u4dX7s7;0z!u*2E811e)wRprsL~dqPE0RTB zIr;VLiQMM@hPmXo)9MAIpW!V=P}C_H@S+g)*Sy3+x-xb-i=qu#uaY*jEY)pD9O?^P zmC~-PYW4evmZ#A-L%`xkW@o6ZGfIP7cB&E~fth92x3~8hC@4#Re3O2~5Y<*xCEGo4 zaMi1zLWXB<0_aQ#ZLsYw+5#AWyUTFcI_skXsWMv=1<4|^taRx6Ud*-x1{3yFNoI0U*CH`-ug7`H6A{itB$Ft| zth|EFuk3=dYd3qN|ew%=~+CGnxeSn%>P~8;S&_zK>Bw|*1xK9dHL8PZgj!RMawKXqR;i$)fG|PG(j0icqW6V z$ltV}3lkf~FTZc`{UP{bWE~b9+=V$f%j82NY0K_UPa`?tPb}%xuSw-W6D5s3O2cRay?t;@f!*^=TuW$!Nmqv`qpM$ zseeX_F)h2kZfb@hl1N38bj)UnzoHa|@OAqIZ%+NyLR|Md93>^eB3yj?;u$#DMgl}TR0p;(=O z-j^7n#nXdS68QQV$o8u#E$``xj21}uv(`-Ww0{tT()}748M#~FX4pHiI+r)}R4}BE z;=7DCH>J+40Nx7RpMa!Op%YY-f2UIM(T2)`L&0f1X;oA>{c|l?iRe8tys|5paTlbJ z=0u+Vk%^7}szSG|K@~RVME{HI1xPA=qAJUv(N8YwNze<;G?OC_^)1&`QvF7f$!r^i zWC4i49~0VniCA|u%V@Vxd}^aQOM>(H3BP^+_5;aqb@dw+%*$N25_$1=17NZ8j=RnN z94MqNzHpf2tU#2bA>nA*^a065>ej-)*Ypp#Tr0d&exv-YrA5rlrG$9Z!GK?K`^;kJ z{07(zz!uA&y%7|xBQ93JWjUN91>hp>WZ=Go0b2-=LDuDq2OLNjd3&nP!hik->NImF z*Z+Q0kOrlPD(-S*X#as9C5>F1H4rptDhV&;*W0k8mwrXlE4^9GNQtDjNSaXa2YF5Uz{{?cn63pzXfj_}*t+a%ThBYP+xmMMkWvbZ(al0n=^eqP=$%ETEV zg(Pb&ri-V~Amv;*k=;Lsf)T08wBM*LUj66|8kUE-og3rhav1)mK<1h{J$V<<&EuRe00 zVTVZ4Di6iPW{P^f`AWlV=H+#Jbab?|L`5UdjDdmSelRyZHdYBjj=^9+9(E#AjgfI` zn?N^V?P_Tm9uCqiM)6K3Q%Uq}59JtFGU)p5?z~I(bPFfEw5hDuBJ#?950 zFQE<$vF(360uL!M2?@!oS9UfwpbLemGS|M)wGLh%S6LX2(6;I1QXCsU_9xf-p~cqY zco&L1JaN!3_~|L5bSCy5u?Zbf%OT)38&nIZ@GammO8*A4gq$~y|GI;CmA$qA6qCQt z!X|e91OxzKmE*o8ry9~0u8kUeD0Wnd%;m!w5aE0GI|=4TrlugBZPML@Ha z=!l9`IIjK)cu*}M`0^^nss1Z%cBT8Y(t^^^ysJ}t(Im^Yo_fFFMnK|d=AT5KuRr-o zElbd2x2w4e`?6i^oHGF6`6=yJ9+VyB2lt=S)>^+G_M7ni!-hjK3rM5aoW_n`%b_X|L?bImkMjWpTf6LCQm1&B-5|7yYGqrh4&JR8qd<~$q%`0 zrR}w!Gig!MBkG)wC&q% zz?jIuz~I^MC)95Hb1fige4^7Pi0XX;lad;R^xX$!D=FF98E>>mvG_%rh(E%C88zA1CdqF~jq==cb*I&1?`ymnTzE0dJ@Neh5 zVU{f-?FH+A?U$7kZC;ue+L~jF<-(ls#FEGbES52x8tA0(bTlmR6&=m-jQ5cz!z}HDUZ2;GJkcv3IL+; zty^DQfFcW5d?<1BCSj;m!*_QHu626vB%447!U{w@PJY?+arYn_#6(4XUZ~>3>69VA zZfOOT>3nz6ex?fckqMJo&(iG$rD}hy&sis^!n>2t9_J12!(zowiqq}ueH<)p$-7lO z2?MBCGn^;qezEohd=kcn9zB=WY+z6Pv_atZp*s`(DzUllXPivaB}j^$lXO z)putq$5yBIVP)~^TKKSm6-TO!AzBSy|E6KY@|WD%obwQcpwrs4MYg#2l><2}YZK2X zfv!M4xifSwQTKrTYdFVc{f`V?)m^<4=M%qdFseA!VHa7yQw_Upj3#j>FRzyJXp`r*{y4T(biPoCe0eKjiv5vC<<>b zXmsQMhGs1kZAJ*x$yCt+6R%FBU)gM6>+z_xKmmQ z43DCQO*pwz4>^**TC=P!nR2{VdG_MAg)3?jb16w*k%vw=KI; z!rD`FPVmcM>`#%A=NOdU4#4pFe`pwRr1RU)S6GeZMU%ZbzdYy4CXGg?S#TesFu02p zf2_~Gg#o*W>uqLJzWvM1K`=|uojfcKtS1s!DFgX`+%mF)Y8K;5B|`4nu`k6ub7Z zL!_i-FeTngn?g?Y&a79v*xzR-m!Qs)S4(#!578qv@wu9xjs?+s!#r)Q$yB|6 z8KB8QGQVf@dJvoP3B)qfcDKJ~DJyRWl?NVAO(9@_v%!g5d->hHBnk z9*VneoDn_T`Q48_-clY+mFG5BHWn7{u0`Ne*d{$***`vt-)#>mM`xSgqhy)lVD{qX zRR69fv_Ea?(?4iwT5j~#zd$9Xq0wdywkXz+x5{#Yr_3H|`L42O`5{52d03tXQ<=n4 z3O0bcV9c#pF-2U>TmKIwXSRTR^uUelFRP>9iVz~kZ1po~4qx{6aKKy$Rsf1a#gx-T zQ%?e)LN6@kSAVJ(`ddTwj^X#pL!yncPGAGW`4G5b<|az^RPp&8VfbAQJx;gYji$7W zT6XnPjWP78=e^a&eZ_^;CUMj897VD>F}?zG3(29!43{u5K&d6E^kqMR0(7ghO$Tk{8(Lo%C1^h_Z+mUZb5a&~lC={YLG_Gg85L{e; zqtg(Gs{dgCfj>mDZV?_QNAotBYye4wW~~E%l+n;CubNuoS-3nuyP$3k2IRbZrhJvr zcLnTxO=`WlF=m%fC<5VVOs@AA?2lKJ_d7Y7`r(9m!#&dFhFv5LEZ1qWFViB&>ykWG zgfh%XOn$iRNcuU;)gW9C+){(S+r2+UuADvn>6Kh|?c_)A^StOCoF`Xd9r?#b0(-t4 z+lkV{9X>+U{4KH#d%{aef=DCcP)ROkk)I4Vaku1DKb^UUq>>_~m5auFMBQJG^12#u z4)75D(w%bp0Wkrq18|GcmK0=#!sGF4y$3Aa@gOvek-AvYyij@>jI1Gv z*zEL-?96Mhs9|p7AMJ!SUkn*V(uve_@e`0t3l5cpZ~+UbjwuzrR8A228VD8Yw=8>hZNr{8Rp!;7A>vfHBq;1jJPoF*=9mxnes|9!tFJcw z9yY%*u@hoRYy>>_Tbj7PZMmPyMIUS%=Gvrz^DrYD;$SYI%P-e+Jwr}_&84x0R_9`;4~)Y%}Z8a{!ymcerLE@emw zqR(182kL}WG&ds6sha0CpYPq(G4P@O9~um_a!Jg^%jXnAXNwQBlr3kY*r7$69vS>z zqY`tZg)bf9f;`B^RBTX4V#_!KH5tjfk~0_B%%*tppN#_ z7#4i|`YmmAvv3TdX)6~vGWxIBgN*|b0d5R}wHjnL5P#=0(I|X0Oyz5*vAhWo$Eo1% zZUIw;R=RyLH8qiyB?~A=5Mlv32;HQUit6X@_;J#auB&6!>rCX{Q>IF^rvmK5ne91r49(*kwfl2-1>t|m z&0>+*t`JG=r9E;pNVDW)&#Xz-_vl6BIMa;uy z+$67(-soB{-{^6AN}LVHpQRG!oqBqz&_Uu5%!J(P8{qgD+sqSt921|O7>P(;5qQ&c zcbt7U6h`SgMMI5DqrK~E*z=P&3FS5MV9D)5-!KrS$%8 z=;7(*uXifEA|l?G^X`w+*^k-X-R}~Os*5YM6jHz3LKHoE5{W>9!6q3L$nOyZ|>n7J@Bvp37kaAIz+}@@+~ft z*~#}6Eo=DT%!ujS4~ZDcdc(CqqKrvV%+rnd!rQstZq;R`6nZ_|y8HexdYdN!{#A&8 zL&sksAt7V=AI>k_{LXTpySTYJz*l)eaQUTX>&>TPx%VHjMiseHAr?hJII!7(#C`~| z1+Zsu%cRSQ{ycb9ciodNc2kbA0CLT7N=eHQ#JN#cTs;A==^{-dqRQh)J~3StlkH2a zN;BssKI@E&qPBr8`7%YW!?O-_?3%V4fCjiae^|fC*>W^d>bKuVr+);K^>=)sN5hh% zkaqIB>qGzMoRD2H9<|P z+P%?9bI6C)%DrzWV{&x-+f5{mEI}Q7hRRI`i&jwxL7D&aKiD#bZ!&o4lcH$W&-V8v zP`{Cv0u0)c`%1Y7F4nuu;91Ua+>hbpDw3gKLL>?D#L(VKNP}KTse)I@rg{d%!(Ux} zDb{c<$gFk){tPWPkk|s$az{AD&e{VVCB3V*7IA3S=D&ZF%aU+z8srYXk-T>h1=Mh9 z^j<7hwgL?HcHGgn^%+ZbvW zZeUyOud$*4OqOsh5m6~s|LN+7-$ z(Mz+!{{A}LWpn-+h!YK0r9o~pmIIBT)u}7lVZ&}oG%dI|J#M%1?`V7JIJ${>&{B|~ z8x~iiBHqDx#}FMG>^_vYTNr*97GjOozbC)FO?x-ti~f*9TjQYd5$H zTz%hRqK0}?088*6fPoiHn8eT?Teb8hbRh3PVMTFnQbsZa8jx$=0fr@jg8(wZV@aQ1 zKm!Iko51d?r7BYJ1`u2p7md^oc1>=8CDr?0l*H#5dmtYJFK=&be}8{Em%;h@ITT=7 zM#jd9I2>1wx}h0H+5Ocjb#~Lc_ctxBP*VS(__jLxFB-=t?hQl*#OcL{KahZmA8#o*smw+2Ps%U$%Ny zFLI0g4H}j~2klJM%&OP9MPNfsDr*|b$$-o2;F#L;yZ?OVX0GaHIqdOeXYk*YGI#f4 z^KZ62862D0ySW(R6)ZD`qF0lAaYZ^9Q@JaB3a&tV2>~D1@ZPGIi)WF%3U4F48c)K- zXL2Hn?!aYeem{IaodKGt>L43S#2xrjj!YKsmpaSoLd9X!uI|07NuI!KP!3?*FN3eU zkH^~FF8_QIg5KiSNUKlBX{5qd=fIE+l!RftdU|?3-wUIHewGH=cSm}r_T;mf7lR~2 zYOPHea``=%%*SgAI-)_9Ei#4dssjBdhm@csbXc*q)1 z%Y#Y+pp60niw8)8h$Ff{PZcCQ1Rb#j^Mm(D@|ONd#*p*J$p^Ne^$~AK+xHu&h`@Y( z_w*bHiLS3MZa^Xp(5U)@CXmRIYj=OYvaYT!6HOE`3n`p>N=UoK0G+vIt3CT45F_yH zE!22+x76nuJ=C$%PnQCMs+gD~oi-VG5w`J4N5Ou#t^q&P&f(R|)e_3(aMqzAq;-j?0Bm{Tv zLS`)ozuT8d1|9ggV1LP6U~ZafYmXmazg>+Vjp0M-NOST0-b-#T7JS|N5kI`a>&!yt zI;-F&Vhm|eEB;z2655vpdUJ0%0oi#}fkJ4>vH&U#p)RTumLnYF_|8e0AJvh?Tj@9b zH2!0jdCeZ(Z66lU(4#hZ;xp&8c;XU#<9*%Reu)CtksCGCEqslN5cf)?@zI0Pf_5k! zeAELhDj+~NeEE{fVwmSv%;`d&_mVI#uPZ1gXB=irsWTgio88I|G*&{yflbZ((e)Vs zE3lSgAT_9>^76*gBCUsyWiCK7M?rH-SS)H0w5L1(fz8VcK-YkJ$Z4Uj416cPYY}2r z(EmI%Kb-0D;C^W_V;IE-vn&xQFe{^%bCz1f5JMDJd#~cZcYXYiz?_9R?p1 zXZWAr#?zElN@(#i)PAQ9qx`6t7yC4_v)Mf*PI3Q!!5?|(`O|j;3!8oM0lNmPZkn_q zA%@zx5bFvd9Wk0j{?BkyDoTezSy+e5&1{v_uOuw?o=3_^zo_F^q8>L(Rrayt5JE^X z)z;_p$>R>KnChQhN-=MHe0G~XUL`rR>QF+ob!}!Adf?~1?Z5vP7S720-fT}~f0Fh- zre3j3+fI;1Uhz&@>IUv73YCwc9mjg)r*d zM?CAyOJEBG$}-Ld?g9eHD86^4s%5wbKTpYnoBki&LQM2lbRX9I4<4(%^zcjzK0UlT zO4pzb{^4?cC0f{lf!}xEieWWK;a*VIE+ONz05mv25_9=_v5eJy`XDOBdFAV0kX0J6 zHL(o0$znwJ)=Q7%3qX&p+h+%{SIezHahMmy5%KGM*E`6%Z}gN_u}iM3wJJj&fc5ip zas<$X3>%`-V5|dH;`i_W)t~je0|M~-D#<|Q2Y5Vy=p1|zZv=J+qrCmLL)s!b|A_~I zvA;Q|AbL+y?GYpp@WV8eS!|ghx56ong)m{*z`#IN;JyR!u{lp~CMAvh%X0$AL;z+>LX9+r<4z>M;iK+mCo}L62D#j~S*|E$9XxT<_j|KfE~^yVQe7ksf_^rxH$YkQ&*K|VEjj#?im+1clwY* zq&i_q{iE;uIeFQ}xh7B2#R;=mT1pf+b7sbp`_d|e&=tn0b6}(U*5n1!R~%x}o^JBL z;4h|N13)w9juDmD;G1C>`T{J1fX*N$=DX4J4ivNi{RM900IzyF{dU#oJ19e1H_r^f z`g#v=opQhzF$^OP16<5>9Jd7bEasZ6J<{V$0F$S9_pvlp9CUK)z8O7DlRh1I3G|@O zwzmE3p4;?TT9j<1EDPi9a4;V7oB90a-$sA=yAMO<5LELqbuiY`ZIn>{eBr+X0?aHt zzMp_rNf~f zH?Qj9)rp+5HXIScvbUmRsjF>`BD%_&J>D7Fm$k?9HKvOc&ZG-Gm)GL2vs9m6T)mpR zUa;|&`F)acb413?tDyzK{C0p@%<4I17dO;*z!C}6UU7D?N&ilIe7)88++>=vM9oU( zJrzgs&m%gGhT+ExCA&x7%YVjk^_;XuU5|H23vTAeK(>$M<-QF+K`z3=1TU%n{i`2D zMVw?R>l*6nO&Tk3j$*-CWAA0p54FvI=iQ3CHx@@EBcdz#;JYg;E5LeL)mZ!1T|E`R z4~_%YhOGzJm&8WK*ZaYND?bf>V`j$lV!yG}PFz}AT3Gn(JLubieGq$p6?i321F_5Q z$0H)Z3Ny3oiC|SQX9%ropwq6 zS>UQ&b=yQ4nG%(2-CJIgi}Uk?W=uZ#>JMT}&dW2f?JclkRrW5{htjXJEa%YDy)Zob zB7T`)qxn+Amd!zjXV+zMetKL7>Qicw*RJ;i&nSF zKMCN`9^{op!&L7Y@{g)GM}ubf7g&5>BZ9Q#yB8G|VB037uoOvfJQtku??!^q$o#nP6Or7eYUdj6G=0Q-5TM z_#sQ@FQthyA^%&hW<2OvqxF%`+S{mm4`qDK7mgL^%87#ywK7%okZ$Jy0V@BgJ~>}$ z!4Xunt|K&a9W{h5G6G=%OP}CKxWklSeSa*0%vza_GN^p(>CzV@F!HW89|a^OB?0Hr zdjI_Q@894S-F|sAWO6>40pclY!02dm$H2wnJMc>qGj#E8G3FXM>gA}gBUMapgb932 zUa9_|5CGem*Uc5S%A|co<%IfJ;m2)1ajlg=ZAme28wg0Y8} zsKP?ed=fF@I#&Fb=L82A9hswodZZniO+WbcuB~`Z{q|)nAhG@mThffT`621VjQyW( zANpZY;1O+gx@#$TMT{gE4WJM0H+U@{Lb9;16}58H*4ZZg#jfntFh5Gq;Fo-7{aL!$ z;|uZ86r3+s?bhzDFVzwzE6}1}u~LUEztOwYZ#iEWWMIja=-ALONctxt#zzuv%mt;j zvu9@>U=)X%u(eG=IWdwMit4Oyy(~_RS2g;FEq2!q`I>d`Yh!jvuXbVw-)2$}Iky{6 zq>a>Z0feftptD+;-}hzK`O91YV{i2WwdxOQ*cSzlJPlHrU`!iUbspcW0CTivUA`y+ z8jn0&aB3b8AM)ewUi+$Uy$*vOv^0Gl$6o!zfO-~9^b=)OlDTS35LC1pAn07?>za#- zo|jEqsQ|=aR)L8tB&GgLj`=h!?S9|czx2!1ixn(zMKPhiOpq|FamLz{L6i=d%(I`; zFYa}6E%r7JLDVx0i-)amQ4s#XbEW5C_QRD-KpIQ^IlwNh&du$7K1(NqKoF3-J?3O>C%qhA9jS#(=PZ&j%& zEq(N2LB`N?KWg^;DV`ZGv=7;nD}+WC((Z#=E9RrEnVFfT<(6*Hw(j*0nXA&nAZ%-j zsQ>R?D$it+yLZLehvW)hA$52x{F)ruF&Ax`(UuXiR3R1hW_oocVv&sSDB7g^E`w5x zE~HJE4m-`(-&7e9c1SWYs4+)NXe?i`*4Q!SPDw5E&mTVqi-hgm_rCFE+#p7g{ITv1 zGY;Yk5J-173cD1zYLOrf#%T#uG3!f9Bue9~^P*pNfJLC?Ix?^8IF@e~#;P|e?X>>o z%(Lf%TAn1IMZaERK0f3NH9zhbRknPRgRjR80Hk)RW^$>xYmI|jn~p=+*CA&ruU|h2 z=7Wvk#ly)tIyUl2zetZns^D!+dE_}{`l#mUBPuE6SH1G__7wz7nk;1RC5d*o9=08? zE9Hy2S$Z_9F@*EBhy}-optC_lCCp;lLw0Jmx2OC=iHLyWX_j=D zuxE*|%i?+0N=Dn&NL1U^uluuMsUHNOSZd*XYaV~6}( z3JJ0PG{hprfYH1kCyT!S3;LYY!KKCQ0>mMbvN!X62Z^{s5Lbo@rcbaZy5$Cq2Y-}q zur6(XCf$|p#kJh^FIg+0)d@ToDEPD3e&k-A`rmiKbnd?^dxwj21S^g4a)t2n5!GkU z^xl6w|LOVGVU`5vHm_{P`G0~VAszKhgg8W5P|alJ1f~#-Z|aXHpIb**kxKO6gh&PS z`|fyXv+{$$gge>`%X75&q4nab_aTw}WLXK5#LYPm+|3p=GJ)>i9%ZQAp+G0EJ?Nu_ ztH-9O$DI)t*m|0?&&VBi317 ze^QxL1ogeRnsbg1!)1NmrCf5~ODDbji19@$nmsAO?cbd^Sq^Lj*GOZ++4G+`xvo^Wrio24544e*07l3a_xtTB;Ef? z8NmdJadmdP6HTY5zIE$h+KRWe(b&|yqP^Y3CaZhPjc49ryNyldBXXn;{vTHh+WhYQ zr^UIq-|^iVPm_y&k)H(NOk}`^lHi%>4E8d=|Ag;APv~2-_27==FW!+4hPTjMdU+*$ zAGWpX9(~}*fiLK=%v^TD7w6_0?WR~)UBcj&$Qer^#GDLkHO*|L{_=lg4A!xBqko1)P<<+_Q%L&tOrl}(oC(*m|P4hQ&%~IEZN4TvmC^;+(r)b z@|;v=UHxY#s0#Gk-I1igSi>zz@N9gVLeX)&_Si@2!-aTr;^Igjkp`RNxi$gP3Z-$ff@!ih*c|b(A-5Lz6h3gEl0HM`|4c42uW15_RZ%ZQSsq&q@9lA7zcxmx4Qeqg8}99YBxv%8Jy5+`X>JySGCm1! z9=uc6Q@;xPbA^YWFtqLVXyUl6-GN0EF&bCMIYdcC9mCoA*Lz*4M?QwATOlK-X zkgo9Z*=@P;ATwaqR6so}xye?^7&64ciYmP{_ zGE`M6@g8)K_MtZ2;iAfPqmvR*b(n40%l2hV)tY?;QhyLLsyHGv|EZ8nWE0gbY$@Oi z31x`keX&Fm6wh3C?d>Gh-wXI7br`%V6?*7U1Z|$NcDDXp+PL^%_6aPD^R>#8q1h5$ z!Kym7pH0VD1yvah5JAnC7*nF6ow0l{Nyk!HK?{kn#JE%9%iT?`dirA5l)CdYiq=r27<)5ch^x;m<>u_?HF_6yqi24#Lup!0Fc^A!+u-j8 zvbp;B;oirkBV;fyd(wDDuX(e$fQUnAIEL?*T?vjJl!E3|q0^@%?tc4o%x6=a&_vKt z#;tqxD{yR6K8r&5wGa?$vf#~5tvYxnGsp3gOmQLzkBVjG&!psw=K?4S`Irf&-~|%i zqsJj33``EO$9xRW^AlyoHEQuLuuh9DtiRsc+eN!$LlBUpp14mn&~Tq;apQHQP3A4a z$Ow-hBQDO_7X{MpWf7BI)(?@x3&4N2=+eF%Hz6^^8p){U8CWCzwauQB@TK0Bmn);I z1gd^E<%>=^uyRq|Az)|Gx8dnpllxI962)PZifHvl_ru;I^+g)g@0_QXCuX}_=3R*W7 z?ifDqOi@mxF~Xbfb;EhZl>8W9AKuEleZ5kZ7U<;O>lsZOhkmzNnvB1p*Ia2xA9!n+ zUB-r5h{p9#|Fh!zX$ts6vJ|BPD&n^j@uiOg%j$1^QDd*y;Jj2tilZ~35J}w<5Y(0@ ziZK66{s88{pHn{b8836`RDFs9Rss*TfZOj+=dV6ee!a5%a;nadyR`$K>g-9ocgc%K zrHLYVDbTJf1~;#)@V6)eo~#^eFG+5;ByUnHbwi(LHPBMKmnMhbzkLJRzC6ontaVl=}?pd-K3BW;T5o0`! zqxuJEM>FZ!==6y%&K|O71kzVGi2ZQtqzvntq{)pA_Ye%5z7O+>bxdU;Vc%7J4fU)x)%Ky?_|Qv2tnV{yZ#B}&}A&vwz0uPNuLw~)p@D-)tm47;c-G``K(RAkI=Q|0e@~!z#Vu=YQRmhP! z#s{j@>=E^|L^Y9Spld04FZ4by+A6ywWE{}20|Zwdg|dri`MYN;WCUNkTMqU%4SyHa z7|j*KBhe=waBIKfZ$C$7@-?%4Fs_Qxsa@0H9SROvGtail#{i53H9k;5TfyBd)z90eY~u);$C_@xoYEK18l~LLu{{_t{oG>@4R+=P?y8 zJ!_K-7pmpv1N6T)_l0Lw$@Fox;1d1_v}wR)u2wb#$pV>59;|yZuID*Z@Hj?YP$`1? zzG^98A$Wue4yF3ng+tB0M-}$L!V8%{YL$7+8F?E8U!CTW6tq>~_{i7VPz!h9mNbGiMd2S@-q z!c>uo3Jj7E9*r6P?;A6%30!Q>CyGjaj{;BlrYPE+wKO^H(AkW_B+Wvum*0MD_Pt0U zuux{l>lpWCga$qqhHcS>*g3@&Yn8eE8J|#k{5L-3iUk)LJFDYB+h><;Ee}UTL^wCX!Zj_DHET5$Rv9k6$S zcuf5xmJ^r3Vr3JcV@@Ux>BEFNnz!V3G7JcfpZE~R#8p-{VB2r5cIT?R!(ABNa+;y$ zU`zr)28V}_wFe2g_ZQ{bz}O&`4?%}#4#Kk1&VR8E^<|ON?f8pfI+_J`y-t_Cx!$h0 zg{nA!M(*dC&+dAm91}Euu2(%9SApr6TlnY8gO$zn;^!mI?N?_Ydxz#ZaZLTO79Uk2 zGDpDBAKT`3KCQ=40pTr5B0-P^th#)Bn+1cQ0J_gcY3x}_;frP)L36daUVezM#Os^c z=LsN4f|w*cv7tBS8M+7iOqX~9{_7H&l#nl0>yHK0KTh6Ta04oJ9Qt3xW-#k4JHaoi z&A*<@oIHR0w_j-~=m5Vc?`*xNc>q}WU$6`DirU7Sg_#runNvAk{#{a;S_e(Wg$Tp4 zF%$Tp*eYq%LjiQf+hk;O?4v0IJ`1-R!?KcvvWs<^EEeYd?97Ag^{^T z%fRl>*Rl;|bNfUO!$mT8_@9;|Yr-MJdOl}aRQbWqE~!0Xe-CC6+&H~hyf5CK`0qii z!oQKnm<*Otu(zL@@o5@PVLe43JCx+!y~{41%Pt$~<1EkJS+NM)3~sRpso+%jXG;M~ z4-8g5T3wtAD`%Jzsf;HDEm!nD5L@bBp9}-ecu;I&)gGd^)C0L+Ry#`jjubx&nZBHF z5GCY_YdCyO=&s$UUM$Zn=9hb)%;hH&ube2)Oa$es-{h|a%Vc6S7);5n%*nXgJDzm9 zNNwSBQBhHmt=Rz4!OdatNrFq$b>z8R(Ss;cJ17H$70hwngHLB}+t^UrU>tJ)s^e2F zw9FqKxiub}lMT%sulNZ^|sjYd8Nx+9*s&B(^@8DRi<}`j zQbJkFcZ6Kj#c_PN^J(yPLwf!%vtdFciP2v~^)st*F#QBr0Ln>bHsp;bvD23lO1CJZ zQeJ`LnPxQ@7mi04Rci~Pd0An|cSd*=MnY>Tf0r4yeSiQ|kVp_AnR~NKga0N15#XL;C%-Y~w{`nd5 zzb{s;j^z3@a<+{8# zn-NlsLne@Bn+JiyN-XSG$iK`!Nwb3d!UUgzanr-s)XJIzf)-17uO@A(Zq!HnX4Tq7 zO=}B@2t$-j(}cfXe~^0RKWh&g4l?>M|LfMk@1B*j6 z$p?oRJ;)9@%MSYcia94+JjwXeVlKO}V^yd9h-N#}y@czFf=iS3vt7_Y>y;}+q5kFA z?Jv}~pBmhl&yg+`1RZ3t<$sgnxf?TX8t0>M6e{PJeNWsXKa zyJ=q9J7>I%iC(q;jn6o)U|+?8EH3a^xAJBb&w=FCVrh}9*O`c#$B0$?Q+dt z*mF}f44E@5%X(*$hnKMZD8uCDBKSt+Duk^D2ZH}Y@=r@^Yh`;7=C;hqH8{N*QAl@Z z=R(6u#W?&di%Od`)iO$<7YX@)ufQlFjc+;d?IaI<3Z1fpgOgX>g;5xvBH`V1k8~e1 zUKxqSnVC0FAN;yAFed8jKN=DZ)2Gm){XDn(L~<+Hov8oal17ao{dn=3oFD*MFu zuk5oYJH=M7dyerM)!u(IoRPRO$l%_NYbYM|n1%Os*bg?)bc-pCF8A-&*D!=Wqu3%G zpX8u;pZ5?IBUSGbuYQ4(cI>6mWe^FnQ5GTVW4=wo1exot z$5)Lq*AXU{^9T9%^^<8NcUzpvZR^>SiJANYMkCnP;yq*Oa6YCpt8A17YAP(+>F(>7Ob@F zMi#y)f2V9keZQ@HywXz!S9g{d9m}744Dx-EIU;Y$XEpwO{dJ4~i2a3z0VsfPoVR;PFCfcufZr;4q#a>}oQhMJLS7Vn~yK1=WE{m19nIT0N(T-NTA9D2$xAkin8`U8@hmlyF9l#H8FAa zJ0XyQdK1*{<8%VG;n4F(Zj`qGW{^AMPDl8Je#x7)wB;uYyS}%p`#HN`aZJN`xaEU? z_f`e069-Rdy%ZnY9jV93h9^~aJi}j8rX2SP6Z&~3a~UNAJd-zDrP3?QQ+F+);cKxW zsL^A)wju>{DwG;K7kfDo0smUoi`|$wzoOrlF+4ZR?bv%Ir4IUc6yH)Skmj8WUBS4q|?6BP3VnGQE&*Oxb!RX5i%t-8qh7ALk8 zew8;RPT%>s*PUdkTshQSU!YlXTC|`3ZL6B%5OAuka|_cMVQv~0yYu3D@Z+x5+O}%* zHlsr_b8ZD&78Hbhng<2789p^+)#8p*`s+Ws>}J-lsc;kzA#0B1jtzqB39?ASG;!fS|0~}2k5`Y0jE6eU#(9+|7VEwkr`rFuCo@suX*5 zsJ+j2M~vS3F7uDJKnJCsp? z8YUZxtMGXWZC*5MD|vC*#+xd0JXLUPY3FJ>Qj+8pAy-&lUT(;Kr!$!uI0Aq*uvbn@ z1wcpMq+bT_U3q6(&c9)Ke;7Dizs^6I^O^IorTlYwVB=ROA|e$gqA^K6(e-fZOp)P^ zUy;6emzkY0x8G9Vx-||<1Veus6|Q>C#h-vcHMMP|b57#FFJ^OdElQ@DWd+YGruYwF z+5T({4ZbIF-(2!MGxk5Mchq>QlC0W%{=LZLyw~K?>fnL5V|(v$mm-JTQV4HjX!|Vn z{SC$2C4w4sa|pV=c>FGYWTB8x&<`lJ1Y_xh@#a^y1iMy6m_>S^h=)cg(Qoqpj55PJ z@yhuaje_>f67~(DZFWEQMXQ!vov8MytLEXrjvWVKtJ*7yhV1VxT2OU$bx6{~)fsdL z>E?>OT(soNcjE}UgJ{XI<6#(Hk;Q$9vz4HuUZ$H3|2E9ao2`VwV%Z;#&WO?V_)VWs zlUJ5?C6Z$iu0St|-Mb6Yow#5rcSTrJ?iOTa8D|>k!9QbdTdjVxKZxlCRPRSXiwO|o z#4#fg#mcTxzh^4NX6!kAD=pQbyvXJKMQ7B_8y98joIf3zCW}_tx1h;^R^ovf$3_{Nlx33oD{vd z_!pmuNJ-;|$9RAtzPOl0esMEu+3pP)erU2`*%Ab{cIvlz^A~$_c)7PBRRwS;{qng# z1z%6v^!p?;$79;$OOHrX2lcrX+^qX-op#eL1LB0Ob9y{0y^B4ww@18&&Yzyr3BD7B zz)0ubXZ5Jja|jG0=+cy)LAQLbC->)2iG9YrQg{z?dgiPDTeSDI`w)42Hygf+Lu*50 z0o*GssrPlo_`H}#a6N<|MAUe!{ZGTQ5(r%y zb0AR40QSGby=9=6AsR0=rpB*P&ZTaG{P;D%zxILgXfu?q18C`-=D+;i%PQl_@m7C1 z_Kn&v26Qh}1^~InecHG3A-kwI&*<={tiN%qm&@Hebj?;{4>v7RCP^m^#o`M}>>ADT z!q+_B?(*rop>b12OwTVa=3I4NIE=u~#yf1m`EN6tOVo{<@gjG}P+)?^E0!;}ir@U_ z8!R%*Dgo>J?z3Ul$!t+v-7Fv?`{tM0EjS7T4KLv6@1C~g(bmySf<5Z-qenoYg1w?A zlpLGD2a7*r*AAJq%q#ImcLt|k7;crT#%>4!i~%pR-zyg;Ld|9y>tomZ-hqeMtG@+T zHClryFG?PSlI0qFr~1NlP^$e%Vc))9^;1qVihB4gF69tsoU%I9WhgJ6oSzsDFVN=h(!!0hY* zP62?uWJpdzUOi1yR8j&#qII)sYHI)Z3#HPh>@gd{9)6p&ChZ_Fp(s@BE+eZ-R|H#l z|8$&o5{sn{b_7BO++kMu8O>VHnTq@m+OQq36ToV?{uO+_ZL;vitcZ0+cfXuVD7@PM z*?)}7{_y!zUAr3SmOd^-OO-x)69$7qA$ZLA*0=XaU=ZA&pY@qS9+a|vRj*qcQc&;6 zB8J3cSoPU%uvg~do6mo$~-a5&A%?XIkRcM zxCmZ*Fx0rW^7={IrZy1+NeD=uS`v+4Pcy$;nMxiOWd>{9jZ^Hll@b=7b#9dUQMWka zXTctCQ7l1l5?_}N)l%(4yazpf!v?g>+53i*nAFMZ*A7m#<%03Pg^5=05q7t?!MZU( z>J+|uAyAz5Oi_0F{$C>k-cxdJ+PW0JhIq=}-)<@@#lS063UcJVfO{5{dVnd!Iiy-V z3DoZAr@MeU(G21;c}W2Lv-cr8pq=S(R{;&Kz0eRh7Z=w zlTMS5sbAceV;~7LH8Xpr>b+h2CCzulDh{aOcAAn!74gdL2$@YohN_;OxqZ*)QIp{G zzYfN?=y29j8EV~PAp9Cb#ZzG*6SRJ*z`iV3h~EQ8sEJQVXGv6Tj--*{euRd`9B$JRn=Iss$F(Vr9&By zM25o;$k;Kk9W)zK%IUQ(gLw#Q*%??B)-I=e=d*mFecZ-hzlrdsVzP;SyTb>EQa`n} z^O>^w!1@_=nhc5qf445c~(i@AT{+m@7;HoB|^?fsbm zJW|1tq9;cvIcU1{^}x&PGnboZ$d#{{H&wK>1+OBD_3y^=+}t%`pU{f>h@ev{?Ly=V zl)mg8*?E3XisF2iH_vlf6X6CmR&t2fSf#Szm({|`REtzq~`r|N0Ip6jyoxty;>=!RazQLI~s#IR= zwK+Y2S=7V#fu&;%l$-)%l124xr?UqC-hJOg?>}uOPbeG(Eq#SJI%mpTxtQ2{H#RCydo3O<&Dfuky7+YOU3Se2V8&i(@NjYIKi0+_K8=e|&#+=tbl}3@99Egkg?_#& z^2ZLewO#iWtlaRlU0mE?ZY~R6Zc$+?ZDjY<@1u^Ik6IjkVh(RnC{48b$! zA-c1-ZGNXFDDgqKBe;m0bs_ZXgJ*j0z;o3Wa=E~kf$jOO|M>bwmCFL=VgwR#`s zd9O6vjOB-h;utJ6uH-imnm;cTjn8=CA>lVR9oNqJXx?Y=XbGvqLDH>}BMdZ)?XG|1 z6Es_&X*Cb={?z(h9Jj+IWwFR^r!-+9f0;jE#*+ zOgacJ!fQHs0v5dkFl82{2Z7zRpJzh-YDdBymEJuL&+h-?K4ek+!tI6YbBh#=uW!Bp z#2~XJaE$98=%MFZ^;pp-Mi|)ch!+__5B_X*G%9l8xUz~l>6z*vDvnWlXE$wTn>g^WyIO? z+=k8%9{+mKR2fWc_E?a8%G1o3UuXRs%2w&}5ma%Of@-_@9KU zVjbngm+w{hyEq3#Q50)umk^A3(jADt0E_$$wXz8-jShT3;>k@)90PGNiGfAaffz{YCk`Ft?sW>ZNnDH9SZo3W4I z6a^1i;R6LgJ5wPiRv+JoH3Vcr&F$?!_nj?@*pmvtk?H(Buk?0SJ&jnGXxY;HR zo-z97p^#daY^D!ls3dvKbPF5DM=y=f98I>3=hZq;U-?ZxL8E=HFC)wgm+V>ouQB}< zL1l89E#mmC#lj1LF#V52j@b@=C#-IUIWoGx-|(}IUUs7F>e>cwJ_cM(;c(Dr0pjh3 zkwhH(Jj~NMINnh{b0ybsCx6mX{(146YQPR|SY8H-M3BqkwTi0p+k4k1b1D*y0-w_1 z<>=v8%*q9@-;qU{DMio2@GMD*_6YyfyNR_09-_vDe9%^o3~s~6xd@6_l~AR-kB3vX z{`{trIVpUM0`hGzy%9Y) zQ`Mn}zy>XAQe36SSzmN^^Y@#{{!+ce(9Xy*(RI8%ktaE=guTbi;sdcqHEO}<55~oP z(t^!y*KnKY)-hsw(%gOW+70)y3Ui*<{yg@b5#dm(QX9bB!X5@+qgF4uY)12gM;ump z`Ni|MTE5NcItb#t694kBe*c$L_h@6|B?T>hM{s!8hVE}$B{GYCF(%}WP3c8>U{wp& zc@#=*kxRrHzWMD{cO>x{#+V_W$GAe#ny7Fb@Q&#)e0Kx-wI>t9?dH^-xdyK`F!~Dky{;5avDk1(*bPnU zRpIHrHUyvf=aLyHA5Vf$46;{McoJp%$_jaMF5h1tqeCF>=jk?*66|fv~ zY1;6zBd?W6Q1SX!Q=0d_|C2{_2uazJrJc2)D=W+mf0j1=Q>B0(##1-m7pvOhHQ>q( z+dPxvMT=2AwCWxWGjEt#@vxbBOV6t)LgUGRpV0-I&JL6NJ0^WZwR-bbhMev1K6Xi@ zAxO$S&^(hCq=Vd&?V(nZjoh2W;C&Y*V1lfCo2SE3o&#j2Ut5=Z!@n(*yjH(h%*F4U z!FGI|3I8i+P?9ISMMlz@MrC)%QOg3h1>4wXiV=Rx4bi?%--Q8(?Y%V3;a zZsK`kT0aKmV@7|1el#{Q-}^c5on0bK|C4R@69f_hQIUV9U0fN%%m@XPf`;X4uas)T zN04ujhN(}pRuC?=rqB0mrFJTm<3|S5w16`?zPovgj`Nw_d>rRc7w;ZQ$0baQ-AVv! zOxnZkw@X^ys&t5}cOd)?PZSMf^roAzug@MSxr(ja#oa_u80F>xh5OCh8xU`UOR;=| z7I~pwId^M=d41@jw-TvjX-st8`cN@KZ9?;O{BKWB=B}u!)sVSSxwkbe^oOlj#m0{m zW(*zPs!3zeCDJ9(p+5K*m}me{6oaMIzCJUA*(cPw3Yb$qeJsYc!@8gT6I(GyMzjvnVm3p;*;vQcBcYL!)-`S#S$`)`WgC5PoLqK06JT5ucm zHcgs?L%N!L<)&p;R%T}P=N+%(>7QxMulDrrSs1e4x3Poz@KHp9Gv&006s~>iT;_ zfy36KW>cK=(s6X=f+L1sF50No3rsi6Yiu9WhZBZ%9DfCeW(RJ1+-QY>ZQ&~bl4?8j z&$roU^Ly8RrD%_W4dPbvp^tO@P>&*ec}Z$HC47FZVIH4vm|V}?G`j}b zFIF0O9j+KuoYcb+bfpnmns-E0r*iIOIw}+6I-Dw?efbC_uH+ru3B1o5IERiTU7oiZ zS2-X7))88(Gs06#bF5YCRtXI3B52;uxAY)F^%P#KO~NxIrmOrM+1n{Lc03*V8*o`7&%aKUZ-Kg79|C9wI z291WNzI&dcGBUwu|H|MopcANrb1k9)W*%I2z=sDgdZ})%uGIj>U&#>;qoHZpPB%dJ zfgX+`Q1u21l>6OisphaP(6!Gy8aKI`SzGUbOE5YUjN0@6bb?p{P|5}W<+&;DQxc6A z06_r0fccP=1bkR7rvF|Ysv0l=(WJv+h0JF!}ym*XAk6>H~> z;c&k{>%gj3_7ceCN=mp>FV2C3namfd(-_8P$vfcQ^yBVxw9kt~`QQEHzuewj3yFc1 z9mlL%tX1?VPbN4&_T9(-w2e}t-zD}#s<{e0|+1bJ;C3tQ~|@ zu2pjL&z}P~V^L8(PD+P*8cYB{>U%FC`nI;VN;Gl+p2z07Lu2`Xe0X4eYxH*Q z!@l2=V=#-UZmqKEq27uqv;U`!G?0mm9s8lA1q49#mIa>K!`1d1rpJGktFXvYCfnF~ zFd}I-JUBdT?98w#ay0+8358jxmVt<0=K1#Ec9u-Y2l&HpKuuw=a^B!hRdRh^CG#j! zLAE4~JpTEu4bIwb5)sWNd{gm-U!PJJzM7#nMe{BXj&P|3Y}0enzAhz}6)6;vHEG#f zTceKyZCH}94;0i<2(!+IX!XKZqCwXroUcm_AN{Q|YqAU-cu@{SKSDVg7V4FxVF3!2 z57M^Ng@r$*Y8eu?L+`}fkux3nq1rIB25lI;$1s{lw$tf=-q)wZN_DL!inyqV40$IfeO6)TC8loNY4eI}ow$9EVXiHVo5!UVV}_XrDr{yv^$Z{I`+$@ zbYQP~$};bfHrPOlwaXt69e}*v%z6mx-hMbd2_q4f!u2H5EQ!zT!Zu@0-gKUDD4XJL zS2gJBf&TT~M`G5onhVOm2k}|wJdX{DLrEeuOe0(uG##qjWk!;l=OgSrO@|ts6m70R z3WYnD>CgEwJ*|NQjuGoxk#may(;-HK_3TH%OH)>ds?NwtJu?&3+(vXYCYiD>%-P?yGty&u0gh0m$Y5_|THNZnqpVhZHm|AIMJ%a#0RN zXO@(u@(Wd0@XUEsjEc)tu$ph=(tZHj`zNF(lN%dQWxF4L>$$2}{FI|`_XpWQy{p&Z2Sn{?*B1!^Ki({H z;Y{OYuUNS}|FoTti&9oi{+dcH4q$Ceq2f0 zrb0@P8aBMu-Cp1a+hNG8;T^nGmUqI+9ZeK)j86)~eWl1xQ%}MS_nWtM`Vcg60Jx(v zr~Iqp)f0KmROWYiwL@Pj0C86(>_tWxUJ-1kgzMo z=0V%pYRqI`-_u7L@XCg_Tp%QDsQoEk6(>=AaO~8(jDy0d!l78FP}HX-*ZX<*EGYB{ zSfZi|U1EPKz#QC|Rm_>TCC30;AF&}{m9%ePeXP}CSxEpzO+!KrR(qyO$4*E#{l0E4 z>>#92uE_es3)Z0x(I6IqR9o(4$LSCb?#~YvZ)I0mjAV%A<%v-{BwwFSd0O>^6SCTi zl&7_|sYb*iBEE9Ix>C(#W%Mv=pKFzokZ|BYmdE#0onBPZdfI&HIm_YX3J4O?NDByvNarGr(k0y>2n#OV z%{~5~XWxK}d(B)k=X=iQoHLMu!ITtAr_77bSP#2mB;on6N9#6~kHeUs>9yxthhJ)Y-+58rQ%h||(F zI@8O_$^y|tDQTk>y{ecIVNzwIqS)Qtoo3^YrJx!cb;^d91HXAJ^y0!x(I5~Le^Z&I zq%uzdVuO%NHUeq39)1PZb-UDU@!E;4a>@~X&WbjPeempKVlMzSSlp2v7{^-^1K(R?#G4r`Rn9or`1fyCy2 zZ02^pw%~kKU}$Le7j8JMwWO}nGCt9$@)fUjAGO)yKD`+m*2$i{QfVmyNsKpq)>nIq zVscV>r|-D#K{Y&U)Jrrl_g~_aIG$&O4HOLx1O06XW-QN^Ubp?9E#(!iC(*FsN$bZe z&lMifO^U2X#glzXRen|6ulEb3yJ=z0WvLZyyxX}s|G|n~_SuR9NQnD4`-pz|zJCQm)Ip$~&Uc?j>)%2MidqFMR(Rl#rnFV$1tH7OTyKXBhv%GWc4VA?%@>-=Eo-3e;DZ$~c;lp&6G=MJnzdOzBTYDamuyfvCAh zT<&AppUSd2ng>rFih5wYo6hkFQc5j859Dcn=%{0m^a*V;gp!+Cqc7I2$rB4rg|Fy= zNX4iyet)=GgLx(oT1Ood1YEHNA|OhUoZT=r4fZ}>tRK|9wUlPrg}a2)B7*Wf*bVnk@^} zw?n7YS-0AT#D(FR;qq5Rk?Y}1nr1vx*IiJb9l*7IL1+=Hg|D6M#u-?-6sT<=o$A9;HWN{&nc@ZyV z<(>+GS;po|{b}2`^-C&-XMZ05E%V9qBg!8>`K0TCaXL@_^U_7|CnSri+U0B@q~&EE z+9ri|YvA@9aba4Ndv|LXaGWKcq3VluAq7SN&lf>fp{49NZa}3K^~K9YGunfbx>V#Z z!MAriif1^}&$H+QXn48h1Px!0{IPe@)+s;H&!H~Ii-HIlHWUnv;!?0%)xi79E89H1kUUR?-)hDr64b@lZ;I-aZsfZAnXgV%q-sO ztE~L0(lW&8^5xhtHJK;ULz9y{j%U}~sH~BcHF{yg{nxpy)Z-VLt!?~Xhl@XB$U&M= z+--GE2%Ng-7k9MCI^6@{p&c|3jKxqI!*pQ5|Wg=ZDpFYdyh{OrFr$x&eanuXFU(=zLcPuT-q5xkch025E6{uwFS_^UaH~J>GUFae9=yG>yX-O8 ze28c5&VU;uU0*qR{8lUmL8h4C_!EMsH|a9-ch~gd!@UwN$kQJd(idU`nPt#F`=~gs ziu;aFfz{Hv>01RvRzZ2rjz6A8^6F3WhdgnQ!?jBU&i&r2Vedy2Bxp!(?!F%R8Rz+` zfZNFO1s|6zFc_ksIHZ0@Zv}Fh&P5ME8wn(d0k6HSxI$UjtIS?TNCsNOTkc_HK-KIE|GSg%>Vx>rPhdX->V23LKrP%E z?+0B|t(?q@?#~MfY0HOeRWHU<#wvA+JJ;~P3)o+3wCtUhsZJ_ZqXXd*F`&Uj0IU|N z-N?61qDwS-_u9Im6zc!BxyX#eQlx01=#13p%BlT${luNb7%D0h7|PpiL4bAhVC5iQ zP|o>QF!=Pcx9ue2{;an>Xs~<%jOFP+yg6JuL2x|BAfJ{fNR14Gh$8;fH51^#8AF;8XXDr21c^QlIKg3J249 zuyyAByuGKbGN!Ug7B!VC8M&W5ov3%f{ye$1ws!Q<**UcISQ}G(!mUjG_Vo4Ct;Nv$ z=};GjY(|RpKH>EwQ0XLby~vk$yYqHb;=FF4;P6)>2odBEiyfqW-)nX>tNH-P_*5&# zn?mJ4zge-)-P0?NBTjxb5K2b*A-eSgz;x*^>Im0~CW+cA0-Hw*5bCuMB2d^mQ%_20jt z_QEoADZ^Z@1w&_37RE;}WMv+3`tuXI9!tsqb`M<< zM+KEO-J`&a4Q_5dHZo&KvW=RIrxiEC-0AjDbHM(Jq3e{X(7{cK#IaBCxexK(rNUjW z?cLdgsL#&T-u~U4!-`b>JXa9`EGjDh4`KUAa4?0LLnFvm?_W23R+sawr@cYh*rsU7 zG-Cpl4FY2cSB>KDPY_M_o^bTRd*f&JmqJ_5l!hImQ?9cF`wvbrn*oQH;kZNW@v?xW%r>04w;eu#y*@$6#&hBn0Vk;WCkXE+RW}Gs zYD1YW*_U&M4cRrL44}M@F1N_=;aMVeYe&L$q{xxj!ANazm75S9nq&EF(hho80a#tEZL! z2Du2NtmIK(?}wbb8{~g?gY6e6;=rwcQh)Fk)$(1O0WfWuy-$340SQsH)!##yRJ~{R`?DMwylKmpKxzcJ_6Z6V)RU{Pk^n2BR&0I7l9hjU_zCYIwR36oew3 zqf)7S7G#b`JC(rW;)Gxt}jS;D=C86aaTh!T&y;;%Vw6#KJaX5#49gzD@ zTckN3tS6YBJ@%ZTsvzZNEdm0n03V;_ly*QK0#H5;wEf#Q_0v)Ztqq0hq{`|W9%AVP z)-z+FuG_p$t4EdO_3M)@s%JsKXY+=ijyG}|E0)Jb+%|!B(Mm;~m7aP#q0meHbE>kt zrNo&o_~CE&KWMWR?O&3wAcEX?O72hZTkY3HRvz^chM*5|xl-(h3>?L)p>>2-;PU?_;0y;JAjmuj93ZcO#f`I&6HyJ6A=;eVg z`gn9RaL=kWZ^3K!Yi(ZI8Rz_Yupk?&`>Wx=P(*JsP_zq>Ar7!}9+j>SXB>@GXR4ZRQ7 z@%a(dk^aO%+uVP76LYw5^b`jzE>ruwQWKliRo_L$zWv2E=&^~1?#>|3^Jet??zr{Z z<$nMEmcIScu-$)jsq$(SC)mx+PLX1aDWW3WuX1jKDfXj(YrMFbgFu$ndw#WJF&}EM z6dm8P6)}v-;P&`&eN--F8TC+Tn${VQ=RfURam32c_V@$b*Anq`R4HyL*wAm|O?&=Y zh>TJ`1IN+h0+t#=GGvP$$NY-~hW_#Kap20z1w3BM-uN6bzwsoE4R=4FNo%vseK^TI zZ?UzqvhwuQ#^n(d^Z}wNXki499?;h;DtbL?uU=?**Q3ch)_e6%U}W0$e#$O121iq`>dU(rs< zp)yBOg(K)6@gJ^{KQ8U8XIY6#jQCs?N*Fb$B~WG;^Gy^Mrb`Hs@d+PTZc={L6AB-} zN|)!6qt#HPril1eouB7B?C7#kdwqVl`XSf%D8|)yz3k?|TatxTGuJx)&lnF=S85HF z;2`$&TV|Ci5>2uf*Jrzr!s3XC!E+Mx3VAH{AsjpygU5@|WQJ(qlDqjtGT*{+@>VE* zVYi`3{~OJ3_h)B=@nSR7ZvOt1b)4zfbxgnABJEC!Ql+@w+8aFQhL0@lo*_JtU@qZ2 z)#SWNU!*#5a&vk7Qta@DHC;b4?ydA@5UqKn?-AW3edClgXq%NcD2_hoAg5)x%gfOE~VV}LBr}zC& zC2og0O)q}lU&p!n8>da-9SONS&r0}A$_wg4Ar3Dzl!{~2bZxW-gKa{l6E>_#{Ol^u z7<7B2#Z`@hWFg_p91D+M4t_Ml6&U94fu=Hp^V``XHEfWEeC0IPRZ4n4_#P(+fLMFl z@3!-n8UjBc{l@HF=;+4fP2cVG#0AYtgec$6uhu7QeLXd{$w0@1)wQZgiSI!Ib}o)?6G>??Y(frI&W#Tl zFeA-EDA1R?xi`Jv!8P41x>7^3>Cx>{=_cSU7jgS0CyEv{AmmN5$^q@uh+a=4$fyGkN#IQTS1&K;i zBQ0e(Dip_MnW9P>#>`lquX9cSD|`m3dh#xZYztV}(g$6GuNU^e?@KIDy2RY3iJ|c3?90m~ zTt7&>v!-{CUxz@QhZb+%79(Fx{8plT~d4{ z68w7-DS7VG)*HNM8|?3Cr?D-BOJhB5WZMUePUSVgt>y?s9Vz5M!qH6RU(~9k{3&va z_SvtD&}o%fI6`iF71gSoejmhO_lScHdioRWtpBpe-4o}d7|X0f$Na6x)%#`n9ghO*G&=V5BPQg0#{J+GNGGCWL5x{eNI?ukWK>YyT#D zbiYuXk*#*;(Qof(jd+4iFNA;P?CA&}TQ?nr2IAGZphr&`6c z!tL1@enCX{k`dCVO4T}+2b)^svmaH5(6}@NoeoyS3#n0Sz?2Kuw-IYhV0^~9WUViN zrdK=w&7pYvIU1VYHN}MCLI}aPgyGOR^Y+IHM4SC*AF*nskIms_6m55yh%nK_ReXs3 znIr{?PdoJT?ho<5aa{15KOY2L=XGY=6gIM>5;FMJ-daFDk$BEnC!#^wt6~OIs$BZ| zzC8Ny5W9 z(!!IEjBIqC!-wqO_4xdMmm(-TdUMpz4BUpUG1}AcASCYU>>qojfvOsqgfWjX9 zh~%FU4qb18mu)n2CP^Dqya{s)tYOxjqazJpPaC+6E4uV=y^I*W>n@SFJdFO|<+Igi z8NS~!W@hRY6166zV*roHOuX&jx__LuU`q*OSj*OBD-w&Q8fIi=Oq3@{!c)uU!3Y;j zwPLdri(lW~<^!c-Ma~P@CinB#O56M@gFm&{oe>pOjPNuWYU`+$IU|n8@5(=>jJzxS5WKl^cQqLSC?1R5V?UI7KAL6s z!WXc8Vx=&+Eix&#d_!Bt-G!>CNVwnj*o_&80ymP&101i-Hkz_=2pldt~mL*TvI>NryYOa}mbTlmkr_!bsbI1QSQz3dq= zC2@^soO|s*2wGusAwQeqTt355kT2%UzTQDf-0viR0NmwP6xGUQTBG=wOHn-1z-4H< zR+#n^PgxGz6K{u>SL6!ZGEu*NX%?P>YD!b(>P{0Md zkBuR%$Ia9*P!J&#$^#;LFOxn)BZsHOEIXRy<+C55^SvMEAb5}U3DA3Tk&z4veBvHY zNR3K5c=+EZ$}@@g?2gD6S`~iRkXU$oR{*HI3-vZS4<_ud zrdq>@f+B85tt#H0QZEj~*`Q(}y{Fa>pUuN_FG({p_TU$3c0eG6NUGu()WFl~r@hs} zPYB2zdQ8F^Lam`x0{Mi$7%)|~&-$bl&;|Z_RR+c&BV{~4|8VItF_Nnzk(%dbEoAxn zj5Gej2gCT;q|_%LO|Jfc0hZoF8#_BYH@5@uQvhxyF!%xt!$0RKv*cwzxrwhiDE0DL z_CtcJQ!U4OHV^`P;qvnGBs|fN*wdSN`)ZAtzRPn48+U;DAF8?M79lz;!^IUs`c=fzjv%yh5NXlXa4t8;7?q|7%yhpBv`)I3^U?CPApWqh z>s>Zga|{ZUFF~n~Qqs+|>#cWY4|&NbPAGH2hTjO{ds5urFZH~8Hl^5RU>Y{n`FB&T zF0nb@m30_d7il&*1a^QGmTm>FrHG(~%0i4-lQR?@ zci$D|h`J)Y&MSalzh%zJeG@9%)1me{$#N1gwu_m*D{DiYIV=LLwRe|wmFd>eRPrBP9kH)C%9^?7u-iYh2Va{Al{+SsdX@J6;5@fCb%) zFZ~JTWz?@MLd-~_g=&Ua=q$3qYYv#YCs8U5YGP_0{PI*JG9+7B&dl1%0J!|Bagnzg zTq9WChkbGgq29B4KhE%!k{Ub2zg*wY=-WxUE$8(7u8_LJu+HsCbTU_qoA2MQY@I(i zE}1=C)Z%ViV{fS6u8v7+s99e8BEG%pfHC0J8Ne7l8CFS+$g#1z;;01APEUo$>FIbI zvc56v59(AcO=VCxk#rwtypsDIE*h1$iDN&brbn*Wj!)lw5uuv!jhNX+9%{)Ef+A>ogeF&jcyS z0auwJ=&0RoT)8{wCJtVElqcl%chVUOrja=%6Yk`EhPK_*Ki{P>j& zfD*X!>=|RZ03^grgRLuVmvaL-@@J*Zt<&$>I0C<-o!CCC~+}NSU+ZHDfH-9&oT4 zdU)uS|MZ_%Cxc|9NYKM$tKgIM$LHMG`f1?q-%0}7MC2Fawt4o|6 z6lyMdi>)|RS+TX_`E-G6bWu@J6OHp?6VLmC(qr=6H*0|KA#}19-TguQZtEtgVkU&@ zqR8}$aa0W(M+NBdjsIFOSE}s?(;i?5H`Uw*Zx3w{7L#L-Kszwf#8Fc|njY45HDxt#(abbl8@ zMtycaeXm2_CB6N$$!msHzC14yzK zjvoQ8$%5cZ+}_^i-QOVdeE;_QgJ-efH^V5QOmRP4tQX!kPx=V|H!dykg9!%y-nqH4 zKrEJMr!hpQR5-6P0XAY(m5UbY)U{Cp>u)0?XVF}-6*_TtRHE;K2wHkJpJZvg+%doufSm7?)~ zF&%K%9KG3H3EnO(FB#$`tv>c=@zKFl zX}L&3h|>gRV*fF<^09PWWca(@RIZ%o zZhaF@-u~Dmd+qlPKm-_W+-yCerpI9`qj~0* zWETohX27X!JO|;rUrA?!;zvj-4+9lYDIOHz6;=`JyRZ6SgIaRyIPtWFUL4_$DKLE!M%bl`EyPieoq)Le|Osk{U#5#gu_D> zaYFNol?q$`2+bHED;cgUAGZ=~xr_3oA?Lt(y5nLqE^8J4>-8Xh*NFj9z+9|&7kBJ> z6Z2(?H6SfGSuDahCLPYp^G>=f=pC-5`=G9k3pFVDsvF}rxd7B@9kVhkMX2dsR%WI{ zLxC0#zo~UA6?U-^Cy~xI$Vn%C{|A9qo8?>;s?jkeLk~K57qkinSrim|qgsDt?2>u# zI+{|9a1+AtXcO8`#)u4Ggh}bfKlChh*?E9LC580`t+db~WRNhly0O=1ieQU(9H+7e zO@A(pkQ-;HxeF5^@JS6lfu|zeQ)LLpE#^I%FL*y@WI5ZHuQNPLRd(U__2|$2RER$~zAUetu7IBbb}hA3@Z=%CAodQ?O7Zw7-091}vN9>Z-9bC>8rm+*nK-c`KFALG6n%{W^UJ3=aa?`E85L z9#zFeWe#s%61)o1lcG&QGyGYL&M?!NUCvoDWd-T5`)3sP4RQdHB0fgnpPAM2+olNf z#}6UUnN;BG+O?^jaxy?z7+$noKFQ9_&6sbsRe@eHsca&-c%}6x<>dve`Q+^%^sw;a zEAnZWxqeA|!T&@^oBa9EdvlRh$n1+aYh?&S2qwvQ&+nUJy}YGEsaZos$k2`RsvX9I zB>%mJq_PiwS%7-4nmN-%apylHu#rSUPj{QLS)AT zo4wZIgaib~Keg(a{R3;!9@%#b;g4k1i{SF`h}fKBOgnJ9=@(B&=YG?0eZn|(C%v%J zkI*nMHa+O5z+jDrkYcoxqz#sgGm4#`79qa<9R(BE%5rit2f%DW{+?T0oaRO1I_{`P z5(A=bDhLDPQKIv0ZeAYX73`r<^y5sXe2uhJ@v~>}g@6p}IYcP|%(|#uIUM^7fE0=4 z7g#$@sQe&XYnG@=jKyP$eE05Uj>vOK$$dXdBO%k>N8&*0<>m%8sdXb1k3x1f9W8kQ z9*3k?Gp*+d<&juwTZz{=ZF-;HlDX{rN1pDCR*(@AL;P?85-{jA zh|Drv=W?*rDR8VP%q>{ZVQLhRnI7&f!r(a*wtx-0^7Kx+04#p|7HV`wl$fA{i_2cT z_;AE`Bq)CLJ$>wX)-b?@JbwQZBo|`Qwq{}Qk=Ml+Z1%;d?ID34$Rjxoj`L?D z&p4(WG6n)v8q$AIF1%^}`>}^(!Dg45PSzsZGT0PgZJ9N*JZB#M-K1}iAo*#*LrB2V zgd(p~PNd=EgVL`{^YI078fGt(IzCFoW zKi83U$z>9oePuU}MmAr3C7rF(u2~p!9b#asU$79DpN}?r+_dgKqPue8QqcjQR>}3x z(E!FU$~XdY&MWhN4_Qlp{N|3s@oa8142xpJ)t}G*nXHo;GzXf3gt+hl zkS38*3oF#@S!SEM=8Wjc(YK^b@N_iI&DI6wXwGRl^Tb=eP1u|p##YrNy9~NGD114@ zHHk}xXE6>@D5MA*?0fO22SO@rG8^v!!1>BIem7z!fI< z2@MZ31ZIUz(#K?g8_SL*N1b4sp`0`Xg)k*xJR&P`X2L~F;&?I?GcnthEX{3~w$zc3 zWlcA%U;Ob;geu=}%#IGoOD%M_lqZ9Mi&SO&P8aLgQ13Z{s> z%@kJ1L0pf_tk22TVVi`6Fv7*&o|Ke^;!8_Rmtx402&8I5r$=zBGg^q0-t0$gT)cBA zdK5usn=iK1QjMc6G!mZjaNspI{$N{A?hOwQgsDh12{&<^ADbKC(ly0I`5J@VC)Tu* zRc7EusYq&C6-xzW2zS)kbf^Ze;-*37ix~{+_;uJi_845eQo}&c$iQJziOQ0Y0&8hL zAFVFQtBl|`rgV)FQg5qiGPym|-4(y#2{8q5&D10d163aQg# z6SN`;p?8C*Q+|1bi`RQ9E@`zmC65tuVl={t{_@z!@%?xMeW0@xl?^{1Wh}O32b7y~ zhn@nNeLVR`PDF{W2hdJ9HK<-p9x?GZ!W+;ztE73)-m zNp(epJWLY|VAruB{6?-=HbvCEraUEr{>FMzHBHlprlxYD{_ST9E$T*VD2PS#tI_m+ zmkG71uk>b}tZxO4vFm2Wgy3EAu?XQNMuz^WJEnc|^us1&%B0Q%Rli)rpIu_3#xnq7 z2viX;(D+8fKhv`{0%5)$7`RMtw?{SGmREo@PEm?|(qee6d)rf&xteG3YNdK!R^VXZ zfpt#3&9`l@)<#~JnZV>=U;WF4Ia@dukB*)eS21q#$angyQT6d=^Fz#$rgMQ z{>1Hx8==s#aJr_EE!~Dzkv@HYT6o`j-KMXG>j;y5PPMAC?8nbaYTIdUQYfL}zxK;A z#n8VTuDwdnh7D9y<~2BJiapUk-AXCri1+p%fBR*ZG8h<(M{AX@Q6>9Wa5U6-01E=( zC_tnGvD(K76OZ`P5`mKX+}s>ivKVQS6Qf*zvB^`7CuO%7MJY&O`-&8;T$B#Z)dw00 z-mk2$F*kw1wDA{=cG{TMsle0^4HLOo<;QG_4LB}DZg%Sp!tbeFXUOKm_x zG(`u!v=3+${Pn-7QZg!SUel5`xj-)%XVT@V%0ojwufv)ku%^>=9s@@O|Axnw=Jt1! z{T`vjwl7BsPl+SUp_rlc7?wjfi>lw38qynSB)H}E_osgvP{oM`!nbSh5BeIMvtH&2 z2d!S(7JRwwz#!IUpGp-q?d={fzAXPjgPCjU8Jimbu0jjXe2=1mU@}(~WMNk|>O;^q z@mU;Jk(xAa{%tIyg?>+@K<|t1e-|cbo&CJ2KM1Dj)DqVg)3pqeZMVU9EZWi8SWQ(3 zFdb&<)9XJI8{M=;njHVV#*cuMzWRl9lq=)uiIpzP?8=~e(Z4hFrrw|)e=UuuQOGS& zpl{|^Z+L?Uu33{O4t8Wbr4aDhPtU`#_?SlPNv1^>Ny>At+pLCtg}2L|rw(?4T>j6w zZjqNoWHQ{%{b9ux`C<|cBVK;3)BjO_yO0U{?N@>2lR@A5=_F!Qk_hvI_?2&3qj5U@ zTK}tFARY{D^D$@E%jeq5^=EMRkg)tVCwn2M^}b6>?S=D2>ivl+(~KH_mKt4+^aL1S zfzN1;p*wZL!#c2jK_B2>HI{Ib+8k=}BR=?e)FU_QKHiI*l{UuCsAYO;H*InzoTH{(sHt`9_?1lHU^; z5B@yD=`Mg$(AW%#bbe%bJz32+(XavVE~(0o>6(?DGY?XK-@ce>QqLMLj$U`pYIGZ6 zT=&bZR0~k+)rp}k;Q2v}<`UH*cv&`Mi4M}^wDY&MdTfuC zi#(8A9Fu>$F>Ymqrtu>^h$y3`2O_!}UQw2xZjBuz&v^j&Wl@`X(`CFtc|%oILh+S~ zsXq{ZPB*lK#06`)O@nWKG5;5I0p{|*OLE^#AFq}K{Wa~yQ^biylU>E(=0$&GX<1|u z!RNxwOoyJ@%ck_OmlQH&haMsnA61vK2&HEPbVPc3S*@dgYQ=QVQqcbRZv)NNsXOBP zyY$4`rx%_3t*E_)H!B%ASu#IBI?bh_VpD}^SYC_m^|%-T`b))Zk@kZKF6xU^)606( z`_tgj2$A5k#ht|$g+QAQ$Zybgm3w+U%e+SY5i*Jq*+Bxx9@#xon8BCi!M7L5dEbvK z3|${VqVAeG599rtYd$-u?| zAa1<;KWh;;!p|6Dqmn4NL}N) z9S@#uu(U!x%NqFkkX+ua+^gcDV0@yb8~n_IJ@d7QXt4L*b_o#&C+C0S?wKKKrrE)3 zrK5MhpWbmnU}4HwOoC4SgIVprBgjplTTjWle#ryAQtz+Vyh8pFb(@qeVr~}3>St>| zWBwl)?1>CaE6v&*%9dQ2X}oU}n-hlSRiOY`3!}HFIE~oOFnZ+xRG|+x{QPHfexA3Tx9)o1oClv@f@xBq z30{~vTK zDk5pbk>EJM$Avu-YunARjZEf?lUK)N&RzSWkQA;>Dp&oqX3Fr;hy$;AJ~%9opIW=k z5UWmq#^N}#(^8Hw|3!fRj)-RdyKUpMso~LKFiGcYuFerr>!)W^PY zv}fo|^XBkkZTyX?7fb)-@Sle+;j2>)ruig9gmE`x#J8&>#)jI(G}~~wBHrJtSN)nj z`3BD-@>LS3a^UJl+)`MWeNZ}#WUPFQ6!Q1Es|l=(MJq0XspzSXC?aDMX)Qwt03ZS> z72XjVLTg)4>mf2O?MBVo|EU{;Geps`oB_Zcmyt=J;Lr;d9w zA}=3qDEA(>@T)zbP@ypx=!a7q%GH`+Kstnx*@oZgS%r~{2?KnEDM^cPkb^1KPD81R zv`odn{Y26`Y?~M8;^bMN$KgPiwdPg$mB{XmS7<5UYsbC>X}MKGsE>GiW$@}n|HP?0 z-_xm2YS2jg%(HB$j@qWN%+?<2;p`K_&X4Ot=Fpy9miGn9D{ACC@R4_s*wnqken(bh zFQT@ZD|Cu6#5-`^Aux@G;2P1DN{HwAHN6yuTuAGj2xirX(A0;yDJk-C$90@H!I#^OwU&Gf8@gbpDJWjw7OYFSoUeU3|T z10;NVSncIku~VNv%#K(YCL%CkqlA#)C5HBwlyDLffAEcuk;_FPDzX^WARwxb-p9tt zQuGb8h{lh;fMc+VFKm#e7o?tJdF1wlh%hSZM~=0#7Snzfr68s~j*o}EjcA~S^%Kdh zxwOl^s1kR-*jhLBe;8$5niP+r7zOzP@j%~F?Up&e8-G)|7cyCtvCO_1@Lf09M;%Ky zcH6`y%7Ub3&v7HC%|V-x3^mm0QI1i;d)nHU?fdgob`y2S~FC zAs)n9c8R^iTWnTF%c1w6QF8-^`)0+5`ke=7QJvb$IC)v2B)nycvj*rp`-MpzFqyLNLZu;M-fKTlCdUq2AF&+eE+0SFJCk?+*7i|= zkc718U$8Nxcv(+|J9cbQ^&v*vJ^*uxA9O6-Z2|~z7x{m;p-*oly!x4YAog?%%Z?CL zTa50Fx2`+$%r}EZ=v?)!np_g&>Gy4q?lV<>RlX*IV2;R;{*mO#JA{G3bF_O z6pJoOajZ}p|MgM|N zy0nM==6TW`9-7zbYmqIR(~r0v+bo7j{FG3CTq4LrcxPbet--VT_It!BYKEAQ5DfK- zSs}F%KXrNcahK-BD0(_rURTbf{&V{-l0UtA#~(jmem1*xF?#^TZ)*|?zSv6qSFqV& zDf&Mq7>M4SrWv|W(9i(B1wmMciJf0Am8E+QT8P<0&gkxKvC+^_wcGjKi<43S5eeCU z2h9HWavhTsGJmtl9z>!c-K~62b~2I`OvL=}ThB@IQ^wyfl#dJd8i}s(Kgq5C1;$dz z$;k>Yvt!p42iAteRh;1P(s@C*!>*eppOy27cM`Xv?Z?;WE7zIs2x5PtZ-es+eGmgG z#!2?S95l=1I>k;)m5|3UR6Or*-nmB}cv&LnZ!)yTt@-R4x}2I}eh*p?a_N+rWp^Hb z;i?4>5^oknE+=k4;AucEP6((jk@Va;C^J2_p$$i3d0#F4Htzm8xV*p)`yeYNB`39v zvI+-{Tu9{C)Nx?gDD&A_sIj*!)dT3e|8}V2$F0oGIn^H(rA+&Kd!GS+#XkdQ@=J++ zDAm)aD}W^fhzG!90P@Lyg^1`P&HJDjZ_|hr7}(7$#$X}S{NSkA)YRnF`%D#A%4Pb? zM>p};!mNz4p;0Xh56mQ|`qvfmg08kjT~}-wpNH}rey?2lOOixe!Q>NqjVEi zIIuAPP}HbqL6wyDI5^ZLFNpJiD|kuJf)f^iBd>>^<0+V|jqqZl60>(E;!#;71Mw1XutC-1=1rkg>vmR6_qj zjF+Fk4!BSMWstzgW7xY;o6RqtxFfcoaepftCYx%Dy9xZ2Y@>r4ylV!VoHH1z@gST; zg7%FVjV_b|N(oSHF}*M4m5feq#bShcx7}Ks8R3X1-Co+k$Rk|ukx#3BvTrd&Uasp< zUAb}|eb-nL{Qa;ItJ}kPH&{U&3 z9hds;@7cgTH!ih~9UCb(Ca)c|`tf-VZkg_C;p4=8_n4IbT=p zXmtB$+L@E?_j2^vDkDd6$#yG%G_eCEasK`~j^dy*h=-@xV?!vO$L2P&A2GMBmW*or zX6mzf@oQJqH7moE?MY0-17k;L?P-+e7DuObEZ6ddWp)L7)~}@f>&C_A^Q^YZ`>SKg z`{VPQ+TcU56|jTp@j11`RSP+xW0(bk7*SY{tt>o&`z1~@lBB#skO6MMl2YKkaQqo{ z0Z}hQY&DU*=v*CqEILok2yV zOD>=hD%B>ILd)19j86(eCuK#a8_C10!#t4D9U^YiW+B_BOu+t4yEU0y|xaj9N< zA3G(=yyI?C$HCB2eHcwhLNNoMXxhd5FT8Ul@TR&vi|KsXUu7{q+)S%!9y)p+7s_IP zuFV*b`W%8A1|fY5`^Vk<@#BZ1$#Eu7ovDS~R{Ij^K|4$E^vcS8L!-n&^GxfA$D+|& zq+ik(8tagnhDotEC!e1_nJ&*V()*gu{<>aXUEj1+Q520X0d33*FhNH0MEN8o^N@aD zC&rFbfr!Pr1n1xOW7A`Xj~;(c@ymUwrbZ+2=Hg^~0$6$HZ1dvQh16cD*qqw!i;WUQ zbgizgRv3Q=CVhYm21&t!WF$cLtqY|^H`-pZI|<)XN*;+d5`6;4&DYo~x4Ew9o)Tx( z?Kk~-R~ZJaf#>3llGlq9G94w7$E)W-`#vh$&{UO8wwxIU&9b=$MAkqY%D=ogzA(k( zbr~>f>-patmh^SRaOJA;Wj=MmqYWo%F#b7WrOX--n?Kz==OjS2Tlntf`T4oz-E1fz zQxOvC952>om5Yt;d?rC|`Q`3^k7wU)98D;S#z*hJ5uOt#v6bo;7%AP^6h6>&AB?sMqhsIer({DN|O#r^!b*U_JT*>^+$M6{fn2#A&*Ah6=@UQ=25A!?l8I(9Co%b*-2tULf07X&K6 zfdaTmN(snqY)ce+1fiA*iJBQH55N6Iujs@1oytqI;b)S`3fxr1b90w4+?CtC;D*5K z5y^k`89w)WD@bA5w~2{sZ-ej07I)S%CYZ%~S)asclF^8OH*h|=<8$u8SDfghvX(GF zx+1Q{Y&-vcpK}tzGe-G;9GzuY({CTei2*}UN68RST1vWGy1N_c?gkO0MWkE&1JW?M zL%JKu5hC3vE%n?!T)g4cxVGQ!INx(V2M*>^k0LwZKgrjW(iZXwjzJXs&Kl>FxtM(%a!~Ni^Uh>Q(ktn8{TbZ|mA)XTNoWKDxebt5m`c z&sNGBcD7gC$M9lpG4Z*Nb0rDELb<2tZR~W=5P)$4 zU+4uBk-GyNU`U}R*hhW5ZD`H!VIXEwY|fZ9$n}YYAe$6C>CudvK(tu7UwgV*74$G| zJ^sbeFiS9SYh!Av%Ubj%OgbV){(i_#tb=^lg_RDrs zSsy`xIDM$=thT_%ToAi5usP;R^)_O6NUa3m&viD!1a}H;XXXXxSHsmpD&#Ws`32T2 z*#e$>x7RfhCVbYYAvljDSd|yWV%V!HD;r(At)^CZ+fVNR*!pMicI^F}=oP1-zwgqoWAkgsY| zyM9rxwc-g|m8F-!e9R&N!T#64z2ABLDofS&GGrj6i$2uXK*^R9FT?L9y=bauW$k)5tp zFJ>MY{ie3j%tG}XA~_)zjoUqZP?*Y}x!e(hW?x6OibGP(HA>b`B)-u!RxRXM(6Hi$ z1d3Mv#;CS1uJBF1>=7qneO78gF?$DpYFF`GCWLee;)lex4fLcO zBzYA??B@w0<#laGe}q_*6-KS5<2j%q;yXdpynz}f`48p~+ZFGQpS}xnTQ2|(P-Mf= zz$saz!npmbhqI0z#E2(Jv>PqBmkGZ+=!qhD<+M;oJ(@&b6qUPET$ug0=aq;n*vG(! z(7JDQyjX3i01vNcXpf-w@|cj{L?(6qsfe7nt8-8(p)En7h+PMZxajTGeSX;WcWyW`BI#;Msw$Zt6eptSIkOItR*XYiRzed zU{dj~j~Wq3yShFZX%f{Rb`+Z#6Z(?#ZZF!X4E7Fiu@csy=9+nWHEL1nP5T02;*GVn zgpf`U$?XuU(=PSRmiaba>v$=~Ub*|Fk=2;3Xs`eAlGe(<} zoSF=c4U2%8e|G=esz#6b*&%o0HbZ=+NyDaK#wd^Zh-csp%9wAqEy{rUW)rIQ6rA8H zcD5Px1t9i)U#!P%7sJrt4Ef1>gyJq?yhBVh1=5nMp4^|WxxPd7LX_nfz)l5z`RcL-2W>`>sr#dEeiLi7df~Wwu?=X9`Rcy| zO-QWZpA%yuXYH=6mEK38rg^mp&#&rK%!P+bM{l-wM?9TdJ@M;zjTw6xcsBVo=&E~v zw)|!iIMsjucAfJCrs zAhAI{;-5L|13M$`9bYV98%`^DYu5q~4^Z5Vsvy5wcF@SzeA)4?i&zP7XDlfB)A!%rYrLe@{2*Y5Qm z8$}luDwklBO974E{IlS`ZM{W|Hs|a0Fdg)_FsK;>L5{CtkLT;`Q@4E&y#!;|XQb!a z81`0#x5;3bST}jnZN>&M_K z`(7>BxcrH+)c$K^ zw=oOh1_sSuUtILk!#qU@-&>OMZ;Nv<&<68lG+X&L5i!e1j+GrmvHO<>&N_&)X=~-Il>q zoK0+Eckba8T7i@G1TC%?*{e@flw_&hKYyOMs|4;=^}j$b7y14B`w9@c{;2ivv5cZ?{YT(Jl=S9ivo2{G|}(-N1* z%cFoMO-f3dn$r#aQ7l&OADS6(tECi>P!?+&a(%XMfAH0w^o<8$5vv)kaiC1H`lB(} zvauZfIJd-5&Bh~BG?cgy+j5R%O8o5vcS6JeV2l#|c(Whb!N@g@`IACEeyX}a2u`}4 zdFdxtGR{u^m6NkXc4@czM!u(}UPp_Rv?>ISo2J@AxT#Hph-Yaql3XRrGWadnqC)rm zg2(fJ46rVYlut(J*M!qE^>6Y$Q56vqItc5PdFhKw;;`I&_fN!oMMqcmy5!Ibpm^)> z`P<_B7m66se)cJm);q2E9F6RPSf9^3O6&iUtOlG3pL9OkdhHSS`lH7eG%)#IvFmkJ zlr)2fOf?OX_oF9U6%Tnn>1h-jKb3s*ZBXk*CXL;c)zds?c1SljIA{OwFd9?6AB}ro%}QX1ahvnH+uCuy=fn#U_{X z+}z6Ax?BKM%CKPTKq-Y^!rT*Y5UDi$OY;$LEI`M`q5k2$|8c!Uo_!jxhkVuneppD1 z5x5Wf`T4ncbh!#=^5Ef_FTs8XF$x#h|Hh6zs|9U;)4qMe4M8sR9XbCl5Mb~@0TP3N z$>*C5jx8%bL!O~YZIQ*(|CvRiA1yY0k>ls)p3x!4H#Yr`NiFb$rdCQ26+=FuArw&ExP^wFWPYO2F=aKgX26b1N;wC&wG9!CE@2NGV~ZXjTS)?Pw9 z+i~wHF1l|~QNV0`y3I0DB=j{SgQ~l=@+XCrFGwANRQ)q1UM^<#zN8^m!^WSX_bY8J zQIWOMJ#~zNi;u-TGQ0AV;M_#b;-Bvt63I|Y?E#aZB2 z_WD{~!1^uM9(JS8SC0aJ{=h@mb)q%6;^tdhd2J>PY*w}*chy^>)-{JjDh>{pQ5 zSzkmRJD*2)FC2fg~jgOCuOOqLlF;bmuOn+tZ8l1atkAeO-OR)9(X8VWOf2q(q z?7!e)r}HNSp&8cptK2URn_1g^6FQwp;6tQCM}gu(rekP^`JArW1@tZ;XUxdrMHg z@fZE_fHM^1N<$KE_(yTpam!+nadatOx^3Qug-ar%wr> zA2}k^K-5*8VTs}_fob`rK$N;uuc#odPec8b@K*=g{vTSc`KjJd-&Z=g_YEs{rcTea z8SiiQEwx^zU0+L$0TA+jc`wk;Sg3OycUzzH%4nZ}PGZ4Yif`4S3TY!H4oN4ZOWiCqoV~BSIh77V4Vk9X%Ssn^zxdI$RHnTU zc)4`mtn>XZNIjqb{f#}I9O7E;nLsmj?!bwM=MrqlhmuzCTT2(CR==TZOvV=7FD!1| zQnux08Th927p-nq?Gj3~duOQZRCNI;Ec zSyq}M%emPog2F|5=($gaYU<|pr``WZ=rR^ZMdW(JTt(;|SZ;9o0SzwAsm=1TZxs0` zOuTJ!$c>tO+)t3;50_FHwS(4=l5k5sx^gxF7C+_h2mBBO zZPc3`E@2p6JYi9d&EEq#hTpMmEhHr2gi`Te3XH2@2wrE|+$44c5rd^+1x#k}H$kEG zR*KirN=@SrdYzIioMcklVdx@Cf6#N&=4Vl+#r~2bpD6pjB~3k66&M!|a@npQl}mtj zhQahwpq(|$5}9_BI%#$!RBoYUFAjkACg^RpX!E#_qNVKd1PTfz>TTZC+7E;OARTdW zFjc4(mu-0*s*IIb{Oq~a{%unYm`lE4t7t!N=LO|8mn(sD^8>ObO>f)0-TDrEe$I>~ z`$qX(l*C-k6cz2aM5Nx0u>KAoCAze)ktvI;)Z7wyi<|{x9>vycr3yihoe5Cxb#}%% zp3U!j0QehV)17bhWxBkjmyel^!Rbp|_ldNLJTOe6%d1NXq4q?RYJB_WsI;L`Kt9^4 zX^-EwoFZ!5s&KY~^d-p)i+NiPeTjZX!Tb=zN5PV?-d!N9)+{9{X!V~5<8VR5zCEVk zXtxrNvF~HIEq81wzw7i|X2bp1`|BTo2I1XG1jinPvCBH7u38mhthF08*`wss7p>_Yo8hcwCH-g4|Y3@OtQqn8OTC@Io>ENM{?1Tlh&umupkH=_>v|s$Lc#ecOHlOu@~i(2 z>;2w?(A^0!>8HN%!O=H48#nD!NtXOYc}7GHBGT`a{endBYYGF4xmSk zZH!Hm&zl0B&+0G~Qz^q{hTtS5g4bP~z%H7vLv#V9Ww5I=>VRL6^XJF^*@2AXJ=cSWD zm3M#A@5aA~_*z|Nw}BVu%^0v5iyL6;1bv}XTypB+Uu28>neOs9l7}%@VQOxe@}nao zP)g9pu-@#{X8g2!!cP~W*FzJE;Xz4;5(pw>y9?K#Rl+M!g>+)bW;XA=ZTUA0l=sf7 z{^R;#8BA}L%cBO|H-0Q|`lcMUn15Yw9zcnsq%hACph+I>Zm}zD)PE9rV8gxMbshp_ z?iYeyZ(U5;=n10)xS+DxdHz!4 zIJ}X6!3eHv zLf~O{z!Roy>-E3h{wO52J74y9J`FJO)~2E2Xc;0gZ$FZpgC890wtA8h<4*dF`Z zz##}K#9@|t@?zp1;a%Enif!k$xJodD(bFsW`c|jQ6!tz>h;1F8sQ+0QdPVcY3g|hX zlXub!B+Z;CA1!@e`l>UDN5(|x{^zy`(1Pb2=b;02+;t$T(eNqNhX}nh$j-F-!@xzv z3vvFCel`EUzch>07pvS~#Zgi@6*|AC)H|TqI}on?TSBs6hU4!A{{v`1BO{|gmT5FL zHH+1DFg7_?6WEssdG@*aOE#45lR@&^B2B-a3)b1I4<1d1S6i3gk7eGSd~o(zwr5PH zA{m8|QO2nGrl{)_>qBkR1qFl5m3rD^Ip&Bb4IHIgB+H!$sqB*F#s=xxtWFC)0cXQ~ zd;8D=uoh+UPup>0Y|q%uTn3tJX3)6eEA+PoBzryjJiq+bzewuKd1c9^?)meA%!O^_t=WQ(+D*4Hs}TP4vrzfx$x9_wPu!Qs!{7 zNcE(k`E1a_RwGmX#dn_fgW>V@O?`bMAS6HOt8bt$pLhk{Uum{Jn{m%il!nF%?G}-Z zcBXD*uZ9WoqqxF)yMA?bb$(zydy1PhY}ulEGNsTeH0Ab~sz9O75{elNhp&33JR{Eb zxvk>tk3DJ$Tphp93_2xWy+6#OmXKRY3c(pm8miN-KeHl=Zyv6Cg>A|(U-4n&9E5G= z-;g2O9mXq%G$z71p{*2hiGJnA<=W0|o3kLw&cZzMlHcuYK0Z&e@@>w0T)uubsA5D& z<6m(jY{f6oK&>~^b-CqZY_H!__QFre^eX0nQOL)l@^5`Zd+%i+smi$@#%#3J+sF=B zq)Ar#b*9QYb%w?2z=(Z}XcUq>1W$PH8>Y%ru);no^jAVBx21e9U(ENNO;l8rmy55_ zbJ&W(x4eGi=1r>kU-@7;&`vDBMrXU_2ejM7ewEj+XZoaNK<5VGtC+lPELTEODuzuR z1J6`SxcLN3f+i0ISH|3K6abrI|P5-{YYSl8L&ue*f+aE;(X-@lya)QMN67^C%b_ zocPi3A4~Qb~Y1#KXcR{W>3h&NTEo) zwRuNUmE)luEcZ2M0I_w&zm*r!WcQJKeteH zYnJbCiQD-E8!DZ;`{eUY@K89Whs9i)KHPpnRkTSuD%CdT^I=oS6K-)nHzdIn0h}+- zLsry8%M6$EjRwlcp)szM-(H3)D4c^^K`v-xJ3GhTwU9^6DJMUxUHI-7@ye30!H|I@ zt!M!%)KJBBS^W8-Zv7{}i)FB& z6I`)lEX>7SjwSA97z39km~cuWTfxcAoq?AIRD`_mgdpFSS{S5Qo{La_+B+*KF8o@9 z)Zf4C=dG#Zo{AA3l1=Fe0F&t$Y3mCH|8noZ&ASy=d?tirk&ed)_fGa_|4r|+2CVXR zgc_!Xb?5y4J=vKP{5L!!qeNay`}Od*wA_#HvAN{89xEoPQ}XpmCKMgA8O@L*1w5`Q z_xUD$)F|LCMsu6E1kvnGe_upYmIVks^K|^kUymq$^||3Cf53l@^cTSY9_B54X39rM z_VVQ`NN^(?B?LyIGDB^Km-tas+&TMPeC0~&ls^YfIl{^~g_Fu37GSJpA(z5iZqQ)1 z-gk5~HvLK&7x(FpxmjtdHAR7PdPYU{M53@$oHD{cUs32dKKA#dmzFTP8;+5MO`UE> zvhc?xY5{asAigFo|MT zeOEVkalE`*?V;yt%THG=*qff#h1j+Ky&H+Oiqav;wibhdChe_LNTpD!!!pgSq&OaU ziaJfGW14*|2NQ2Jh2!a^ocboJ%B3X7PgaeMvFNGg#TS*8#NY&kSGx3C1cD@8l>K6N@O&2&GI{g7iU^0wZ|Jc59Y!oF_wChCXg} zMy9b~Q-}6y;zt=+QQ|*piOt*3pi)RCO3vhQ=pZ}}4BXz>fb`NokD>^LuS@2}9=7_`_U9v4a+*+^kFVzC$KN>XvuL6dwbbcgs&m}Y$0LBp0{ z$^CV_e|>T?eywN2M?u5fR<5d`IP3TBa(G||*XrfQW*XE6-z-K;E0J~=xChfgtm2VW zbZ!ha3!k_JYAI$7YL%Hyx+WDnzc26X>8czU^#Z^?LgjKxfU5znGw5 zISND~>z4vAm;W{10?^ddj~|fc29Tq$b9O#HIs&3OaDSko_PeSV6T0}_YWU_Ta~lwi zyJpqbUyuuWr)X(vYtKLx+3CnM*7Bsyzpi?iqY#Kk;_nH>G82SI1(`G;7!>p~w6yT1 z6}f|Ze$=;8nc|DXqA_H$-1W5C=tA;L>ABd`cXsz*X)?wVbB05tL*?gC(*C4NQhq(= zTM_Ylx3hLBbh{0FXQbeQC>$h0hPzd5%P7~3*v7%=OEZJ8(-}fz*-m;Xry)Z0CTB;e ziH$b9EQ@H@XT;Vnh3^4bT$UzFR*~aKx*KoKlfE-4!LnQ-mDOZcbRuYDr%H?h9wq7C z)LKINHrgPP6(zC5Mqlpy(R(>X^u)A9TJc;6Hl@bWg0EG8!`Yhmcl+sr^YDV;i4aS@ zq$yy;GH`0z1V^Lt^77G5w;O;e1jQ6U6jU$Pq$eyXDfzSEdTV>kUl8#sVRt**-|6aB zcE6fv%_W9<1pCWaaM$n|A(s=q>03ite0KM18|JBH-&w9v;Dl1p%*8)h9;td%;SjjO zY$19F`nfxg1Dnfg`O>p~aKF|WkpB1vD1G=te&gdy5iB& zB+5xlK5nI);Bd6F)339e`3E@D)}Ec7t^tnR`}=pp)g`5+l=phVgi{?nKO*z98ww^BXES;BWa2begxZNUM{?u-bHQd@c2nkf2)&g6^ zFotvj4NfdW&NO#maDaKn&vo=z%n&DCxsY(h;p&i1m^m4aViXNTLUtgDs>i%)r)OT* zz~6vNUsGLu1kcNmP7V8%q4}EjuLN;p{j|P>OA7=~BP<{o+66I-VYA9Ajh2Vjj|$O> zt6{$#n-DwBCa;i93;LV*`EI39G~eEiE-_k?3JqJFw%;uW`f|FwUsc zN`{z6$J;JS_5S`H_3axe267Uuli@z;#IWXLdjU4pN%s#id3q%rRi@W zM4~dSvR7?|UfZu=|6?=6C-wx(g^I|hHLu*73~BI-5eO#-2g7C$TUS?C@U1@`7yX(> zR#8#B*#X8Kl_OgXU%Klf2 zpfCBUfj>)p0~&SB-;HNOx~i$%S@_&Bwh0KSlz+&e6{+(OwX;XLi% zb=ib5@zKqQF^^rw(1XQpsVFKJRTDmrsNRL-|LOr{u$PCiQsNJ15AC;r zH`n07ILQA|lB&Q~AeK{R{ak81D)iWX5`n>EbTr*plLbjrjb?w&FZ%qW^or}aa5c^0 za?SQxaqR4@CChrJSY>HNLveAFDZd|m)~E%|UKGsKq!F`8oc*x)jml48L(pLpleW{I!Y@Aaa&bvgug#eR-2szMj%rbLH6wl$v=e+4IF05C*5Py2 zkD^NeG0*#Ti%V@H=BpB5zF!&)u%;O25# z_)(hPD$d~7+M9Tt>UmUA2Fvgxf~C|Kei{ptyGbv8tE1|=$Vb_yM=L&767exTo)8O? zvRv@~e)`4JUVGbJuTPhc%*%+FQ0SN)z!ttX0RmB8T%W})J8`~ zi&4bM=l|ymN$jLxOOk2(}I-X|r~YqK(qmVj44F!x z0Vq5bMMV#9&-%K$!_@}wIfM}sv`qb-st3`-`)gv8gZ*P~qZB!7`@OxlQc}J(@1tm} za;L(62FZU!G0|n3*1~k7TqHm<8zUQ@&@xK?OeW%UaW=SFuF!rl{;)K)1d7*9X~?i4 zXepM#D7`;Ir=(1q8Ahrdkj;8+B`}94X*@?iUA9z%Xmo?kV>XMn+8u zE1Xw&u8hO?#tzdYROTmd=iAIb$py6UDP{)J%5A4|(6Q3Y+aBU&?CeYU%wtS?zWyQQ z+hr5boaX9gLn((+&CGBsDUCK6Iw2KUpWvSHa&t>lfqJe#*M{`?)eedBT=<_37Fw(? zvjhFunmrcWC@W!+uF4FXxOj?pRMv2#pYls=9p8%VM83{(KgP4jwCb2}Kpq?&MfHDt z{(O%*CvtrrLO{{$|4HaxjsApG9J+z`#@;F*pfxXV9R!F(?{*M)um}8wl!Q$;yvQwCqL)Vo=xboZMQOr$TtnGrx=3 zv6eg)Pft2OD1ACV_S^nY!i*PM3Dcl*O!e~;e~$(6BVtn}J}a`&LzI-*+1NlK=q+A{ zivYL^$|Jxu8=F$PW59yrKmJP~ntPmI%>3Z(|ES=Iqzp9$z_bu*%FwUA-oKwT8|Qnn z77wv^5YKsvf1tL;XQa@o$h}WTUG+ozW@>#r&MC!}pk%NPS2n3?O zz8+XRffsg~D>E~-w!WUl)`^jc2|e4Mo={zDruK_0P3~?mPz|#M+%G!rKXm@*y6@;s z!-=t0#b%W`Km`?#q!^=o994*kP$b%g^+)2+2?!{AcxL$^$(?Whq_*p7la148Ov*yL z8pJ42s8`IIrCCy^xg5b#0FjO=vrn+ih--8udzGma(ftPLb=-6lTT(LgS@dEMyr|Ra zMb{Va@6^s2p^RklyO^=X3;fe!y{u=Qe^YWBA9B3MIQcBUTFvR0R3xypu zhsG^%q=E%tnoDV#Z~Ho6#g%LzRF&}+KDJgeQ)%hS_0JFRoK)k*zsamYzkz{qRR>|H zN527m^Te9GP{s4YV>sja=YAuW9?ho_G zRkiq&mA$>aD|Fji%Ua0@#2LKENzD+pjN4hTJuJGoNn3k+B={hK*}TRPS--Nf^5@SV zpzvPC%e(*}Q1A9bM`weo06p*l(crV=qNhQEO9ygwz&v}73m&;siUo3_D(^S^B0zIA0+B2(d}cV*_oYrUJVipyE{A77qHPDVBIWKLA2vWo8t{s8Mc ze8cnX2kYzMSg;-F9Sy*nlk(air(|z_euMShwS$O> zZnc9ig>EP;>{bxoLSweKj?OYK@O`KwH0C( zTPfZFS0njiW+rhLMveslEz)3;lYFBYg-;D1$e$u7Cy)23vVudX`O0v>?^XA4c_Fy4!Rq*9i_xL-j!;)m`yzcOV!Rjn| z+K^6)?T>H|cO>mKAu~+8q-5)qUu)*kb%2^sdzt6%&xxP+Z8yx}hOzSU(Vo#vJFU-IE(wy8Oa>WlIxA5LS`m9 zYPY8Y4PO^@G{HQBTSnTnFJl-^4VO#!Rw7RUi2?KKqb;kVV6dj<8&%SD?p|D z1(k81JWfqbl@Wh42B!?gS!+ZT6dSsTLun-w-e13=5vP^Q4W*!j;z6*Pm$Hw>>hol@ zEA+0LM6dIdNN45oN3Fre1`{{zqxEICXjw3mQ?wm5-g(xAM!CVKOoKmYF{Meh=F(VS zUr^Az_hZ4GoV;*|sT7>j+^&VzStz+uhX?U7T;-1%n+)kPl?|*=sdE^kY2@(p5#|Od zw1(2KM>~rfJ-YtL$;FI4pn|wCSWyknIrcPHbs-l&YAhd-M9h zecCK{DaT04$r%G2hySJG!&uYLuCN36fSCK%+c%MtnHj0Lk3Su( zv^e`%l;xH*Hy5mUVNh24Fr}OUDU-e2hg&I`CX_;wVMfyv^p>ZN{+OFdPED3gdPGT| zyof}8zga#Ws=h5&3EV?}c_qe?4k0n8V0n{AW@zs?JCjm8cQ zRb##Mp)e-QOPWt%VB(;g_cV&x*1;jrg;K_eg(^mQ5ECP&73DsgOtl;#?H|(l{haaGutWJT&gE40_Xv>H)Hz~Q?Cfk4FR?K)Ni(~0;w;ne z?$Avh{>~ZA{fjaAT`qeUsxu5%i|53d!4dmgZv4a5C>|4B#B0?mxEs=Qp6t&uNTOT^AsIi6>6tt9f1^nyd#xE|;&Mq&qcKKXyPjX_ZWdKcWG~fw#PSJB2ICWF+p)awoR*nQaqMH+1E5cbGh7N?cWg~*N-@ywK# zEXG{x>U3Q-wRTk(vKLIz*44gxDa@SS{f^G=4yEOHx&p}udwT-@w~~yB&v*B+!#?b5 zmoGKC25LwM_r5LqeyQ1y9lH@V2wzelB~O*Y0@TI%Qb5i26X59{woh3LOnSc|a@-`CsyQ<-ghljx(v z8Fu&fu*1ZElA-e3_-#GM6xp}@$_s;9)aXfRkoB{Z8%z_*TZ+q4#rs@JJf+2t0{HXP zXheAwVmrp1MzJMse0zG=gD0_?nZUekNHg9-Vj5&G1je)cHYP9s3517>biWMMZ3Mo= zO6S$@Z&YIhW8;Ui7uY^`KkQxhCm@xzzzepD@e2LG`E@)(JV#N0mxBX8N|Jdx37gyf zdiDCt=g_V-(d$G}EziU0pp#;o+9J)F_1ojoJdFgtNH6;PS%IL@rXy3IJ9NB7UIYxIofh@=uNF<&IYLfF+b zHEXROI@_==`W58u?d%f=E$E+l!#{X^w0G7aO=H7@Q1;+Szb$dipbidm;nR35oGkZ) zhbQLKQ{k5Lu$25!tfwzGBg+ii>T{|V)?zJNG~?0V^wxun81V!zm+*i*+ZIRA>*-_j zE*EHDSP2PyJwSwsZ;CdIFU)knXVw4Z3lb7Q8!?r#9Ra2H-PF4dbnHCOA|>65X>yZb zUF0&eT!p47$*DRiy$@HM-(TWHjEF0%6CruDM(NXd#AT;(eVnN9wiZ`3$xNDEA4yxw zNxR9WO*8fCm**Cur)|&?yn!Q=D{>3FI4ZSJ7%qpJ#h$>k{Q0_gMcSU; zywCTk9s)OEtO3FNV}0lLA39CJwSQ;8M#BlaL!!a7UM-kn$`IgH1u zK+3y7DYK;1-crf3;3phAl{yrbyp^e0&x`|~uXj{=yh;NNfB5wIGgZ&(eZ4`y^!UrA z7Mw@)p2_*gt(OSk{nOUbDJ{tuwZf)6JUj$FC;u9Op1!+X|K&5nyz%EcfCBcDY_y)D zRq4p{nsT)^OF>DE(6qrna*KiYIy0S>C|HkPGo&Q{GP7xQE)y$b;hkv2&YeRCs_B}i ztN%mR;{mH8y>4q9+U4O5j)GT}{u=sgDz|Zm4^O_%WIol6j$U70UIr<>;P-zK-fjPi ziAo=izv3zdZN$rjV`6r%Rno`}ZqT?CD=2(CZn;E&8)W{dCqR85+x&UATXO?!Ev57X zlH)9+VCwWB%h_ql_C;Buf3Vd_po|w;&yZ}9uAkByPa!Tay)eT&VWMeRvfJE|=BiB7 z#ozy{d{9Yt=QRhMOuo3x-cCYd`f7d$@ug+9Os~y%yJ3CiHI_+=aedtexOp*2Le3ctwkV&=}aHzH%PSMiQ zsnD(ZwOjc0-T92pT$!GRy1F=Y(5i+_8%1Po7u)o7;Ux4?pAk|G9bb$sIVnH{bg|v9 zO~&V!GksEpRYtz>ig)Lw#hUVSo^cagN*XDf3m1L)^6Ky0 zy7Mtf(Tyq3Np1;VtUn0rQJm@*5lRJDO~$bA2=tw@dsGqj=)1`ocpm>}m2_ykLAE$r! zD*(dh)PA-M3|=m@BbkT8#3{dy6Noz?!8Y*kM(FE%4XSzoJJMKNTU$#@3aX|>LVq#$d{~;SO7@FZ?f`=FoQUBHJ0kIzxve?to z(pED^bgvB#%FTIpuepeP{feYc3zj!tyjRyC#IXAqyRMsJiR6Lcz*c>QM@~3fW$R&> zG!^1GC_~@xg_|h&3;4yG_}PxsL7cvtdB6Ed4QUwcL`9|UZTNNk@>9DS)LKhD*<92WiD$MpPDK9?+NGV$z8#o-!hKnwwtuzhX z5HKpTC)OP4-~k3nuY;u~chFZhGcz+fI_gp#G7Y(37Ydex_0UR*qZ!nbKaruM1DK_A z4;}C0=o$O2__S{}Dc$S^)95CU_9$UGc8xX+_c0iL0<(Dx8(l_;B}aNTVr({L>rXYl z>HsZ-isH?GSf(OhVJ_`CdXSJe^0p#hAMP)K4QjQ0G?Vw?UmDV}VHwkqFNQs42`vVN zJ>&o7DS)B_nlnJmqBA!)*MWyA6h&*5|4L)!B0GLJZFC_WzqEfIr@(XxL(=_cUNG^x zuc8MfZZ>m|NfvF)5ii??>(ZMk}RK3D3v}ck&a5`{#|*T z^W1t#C`>fS1uLQ_K;o5H9C#^17Le6>TLm{S13%5pe*t=h{P}Y*oYj((i@Ka8>kod0 zrZk-}_{|XsM%`fDW&M8p=l6QQfxbQ%+n5P=@24LJ=ctbG7gqN)DnuS|RCzxHTW9;X z7d3j!?A77ov9J-qHGa8Cvb`&Pzx#TCeQkG>O74-lVmx;Y%=@5VE1$Z1+xvJyL&K=u zVh}%u{VgIio+8bi*gX1wb$xd@)$jj5$HB3Wz4yp=$R6P!WReG2X>Us|de8QC8)zwkxE|?4Bi=2&?9m0`mtJ@yM zULa{@XWr)_N0Xr0{g236Uem;?k69WE-hEHfFM^3umzEvN4Csq6R4dMsCdQT)W=8EH zOJPE}Qa`4r$&ql5ln4;`=$@p?uJD&fk^kYZs6iNwdO*PCKld)k$imEqT+gZ$!Qrx4 zvEkkC;2fDKWr~%N?7Ki&A96q&LLT48kqoo@0EV1U@495BFF8{lyzB5 zEB4FAw6<1*cfA=6;+qT_h@gP$1BC7V2Kdmw3L+4G17ca9;}{!#si~={s?s)^j*TU7 zs|234C6Hvg;nA`ev=;zK+RhtHC#i0p4c*ZOy=cFk8U@{56Smb?US18%PFAfRMgVIP z%bj}j4kh?zm?^5@fd7#e?r~IYYjdh@f6Z} z%*cqT&rT5D&MD0*Eq^$CaQtqnT!50}jL8eT-&9jmQ!HB*=I!l$4c=u>e0ej~bv=?}S;LX?F`}IX2 zcl4Ey&%hdRU2`Ub@FsOq7Wt1A{Oc0z9HG6GSAIaEQdI@=a*a#N9-bZLfGfPxq~;|k zFR7|B|Hxw#vJZL9;$>lC^rfwh$-?28nK8H}p4Gb{x-4=zi$S~D(Rp%mGMKEAlgZEK zWe~XiOgl@Ripd(GJ+MSBCbDFW;(v#+f}e^|xq%u6&B@6zuCcVRv?P^c-mh$I1hBW4 zEHhywn=6*ccc-037se|w_6Qp~x;3((EtSHn^*jHLIhZvmknj2_;`^NEqc|s2QXleq z-Cm!vO1oKu-ovH^57glXYNh+=8bPh*Zk|gZ%y+oLxg+8lVx-@Y!L3D9Duk+7YtDJr zTrB|q5x-bBdGGs^ubZV~3hZzWI#1=|y13!kBV62x(je_kOKq+))F`_fx3dtJBAe-v+6vw(`%26o;Bn{mjmnr^D zA|g%s0-8EO7P@M$`785wHX)W6YXf)Q~vz5Y|<1(#G z;UK^dP?JVGeCzF(=*=ElpyAfy#J2%=BqWMx5;*W2GAx7RtPe%9;Ql!B_W-juPup5qFcLv|pn zn-+)8Mn&VCI&gQ?@5sebtI0dC?kwo)Y2?T~2PMYr+ylg~{|W?mg7=QdUx8*n#riwxe^Me7uTlPKkccG59HI?TzqV2Ot9%S$)|I^P zUca*6aot-JqiI`f|D}~p%aenBKmT5cNDs;Dxlr`Rd3w^91XYfQ=C5;My`ZCUXX#{D zLi+_~Z!h|w5kz?^C@83?sDO6ox%lR3jj}U zw@YW$ova}{<7#ujT9O50o-F-p@pN!<5?H6%r0(Wq|5%*xMz5o8?TadZ%lV9)7w7Y@ z#1{%dk*aM zv@s`QoCcAP6~GHq3$BQN2_*LR_JdMi`i^oZ#P8;c0%4o2*$nIL0c%r3gSfaj6)i3L z$PY$hKI_ed-*2lF_EUvYgp-IK-^i$YBaEryJqSfsdd939jKvTF`Q~YP^#eOZok(78 z#L8^{`7b^9=EXc7Ma;J~1rAo*%Q~Y+A%0ZvTp9;@6b?a!#e=Um96*x7g$oG-D?*i7JznAn zvIqhC%YZ2j=sE!a43rZ=&dya}@@qW8d8`kP1&jYyQ9(fg*x`lD>g*)RFo(3=gDX`v zA#Rw)Omc3NNp(2Ad&KYvW>SgChIEM9OJd%uhSK_5=BH5|5^}5{x`bpUVoI||0u_~7 z0u`jpGBZGaG0xl+8ID)zo??4Xij2v$5o8Q&^Q7*D++KpFIBE3qV@_6*@0ZGts5BgW zrz!W{A3S)V{g1L=JL@jIEO~d;W&>|{O(r(~?fsO1gP;(Sq9b_0*$jXMzv(yivk04LiK@eP<(JzrQA`J4BY@>^VMm3?2@E z?9JgwhXyP|ee?S*KlMC8#=Qsce-IUz;0^|G(5k)*#w(CS8~v4#7W(R+rn3&L{NUFL z<^4QR8A3-F@&f}rO&~f{gX?i-4IysNdAN$bV^jyb62*OUZR+l&aBk(rxW3JeIe5R@ z5ex~vG%i>>OcyXIy+bMD5@OGhE#~5cN4O&O2X37JrX!FO*<4z>2@J{6F(XIQKN}_z z6zj3Pu(zfW#Grl}XbqQ{!ZS&?^`u$a7g`hzdSs+@C`pYz4s_RtiX(Dpt|CWq!it*y zdnT@=qy>!#UVJC3ktY;$?vvRmvFCr3^-TKS;zwma8XRKCANngH->UjA#a*1&$_@DU z7d_7nmfhBUnQ`~&q%D@$_bK)lr>)`iZO?eK2J4*Z?#t#!b)-&Lny7qx9vB!%8cKu2 z;s!&NGYEyQ#(??J{31+ex>Dq;GL)V^KhSTW+EmlbMa5In>Y*(wZ|HWLkehoQ@FC&T!Uz4t=UI%(;8EvIV zU&4&=&Ra%fx{`+W_8`y`9fr?h+Ums@<9j||dgW(jdLJwiWn}}N%h=3qz4a!$%Czxk zBXr9fU*2MQGfH-zMzj1T$jFIKzrmWS`MPeRdSI7J!=HF^`owqs%pa$eUWYwcp%le% zD2ms1)zqne`hAA}Ht6_k*P`fVpF2F|(urzO?U@}xd*|QdMtSt?6RpoM2_2N3nCn(` zcs(&6%3Rpza;Hh;N#lQDCLQt`e#M-C%RbmhI08fq_rqn3mETL#O$gl`x1gDLV_uEO z9=Tc`(Br=^Z~T}sfd>DZTE-5HgYM~6S1r!uEr;s2XxCt zN~wehFNduY;a~5CoJYI&Je951!M^GI_B7AlZHu_)V`U|ne?c7ivJMFG)+tJB&CrAr zMncZDWedkuggJ7@w_9(njzmsQ3PozFDyv-(F2Nsb=K{x!9$EDnyMmU zwyG|uH)?BdNJe9aet?|>5Ci5s^4=`2tGVh0CsVkQaP)ZL9tIPz9ELwrZGqV+LT_n> z#skGkT1Ey~4CfnZ5mRl?<6rS1{A9By%qa*XW##11W1@ZqV6p`GmlDkT)hlF9f~T-1 zA^Z0q*$;S=spmahP}2#a@UtI7cjqmGHDQlTOz<1@^r|mp1^vx^x>RAc&OqR$nS6AP z^s_f|QBfI)P0Y0POZO}oeO45>IjMK$NB?$10|sLHi|x%SjX&vAap&s>Jf^QV#^%y| zl%~q@2tZc)`Vb4w_^yWMCK3<+>OZPAt!ilSa&~r3{7X7m2HFN1z`U1vcUkPr}l5{R@UX3(KC4*3ejI zKAqZSJHOG|27hpgf(->EM5k(S$x~AyVeeA} z;0`bXq&*NguTjQ+66yT@s_Iiwx&2TIH;f%Fr#i(!Icqb#dI8}HgRN;yCm_2$=%m82 zO<<$2D$B3I9vrnh8#|P#nr0cEE#c^~kuK6^7q`zKt+#=!Bvv&= zlqRv)^5?;yyW{sv%pX}ku~OeCf8`~TOIp&eX6;XTBXmEDV%EmcSTtF1{!>M{i}OpM zKw0bv3UCc!MQUUiX+zf%t%UJ+YhC7B%y&UR_B+<)zXHnJK>(^~+yM?TkL7nRzRVfp zv^%BPJT(^Ny;`0v3rqz>P%AeUoH)^b<0{i4z89`OWX1isNMYNEVFjc zPCiOF0Clg1335Khvr^6r4cQMWc06vso_w#HwE@mcRFPYR z2t;clhFxQL^Sd|68z+M%rp3#Pli62*-VvxMuKZQvxgd=mvZJ68omjcrVe^bgx+{Bw zW~pla99^b9cFgN{W5&4{2aUkp6wN7MSUr&G-osg%n2%0M2>neO=hMYj_}*OmZhE`; zKuPpTI9dHsj%(XhTXUZal5=hsCd<$4l$X~N?QC<`wW)8n|n7ZxR!W4KDOiRYH zH@SiB)0KUA4_gtEI+yymLpaYFAC3P)e3xDPPx9V|yV_n^_2c0q3<{@LrL|~9{ zezV93mj+v6OVxA0cBG_@K3S9$6T6DHx@TbUYr zGss8B0b!}8rSLC{R}@*>-tiOr!ZJ0Gi$P1|hlT)|mc7}E+Z>AG%$|-0UZhn1jq=TM zUQg;6O7i7G4E#ZfK9DSz(!+46%~<3W>jK6XXDyd3j0~C@yt6kD+T5yK>{X1BSf0PJ zr@V6S-jC56RqcimiDi!%&i)`dKE?AoFY-~mIv&4S!z^9QIE37unluVelTho*>uGW2 z>(0*1-2d=s+$6+Su+3C@^m1c5xHHNoRDD^ZD(nIM*3OHZe!8RkoyvDVcTN*EGO^n| zf6kjb3c;Rc{Y@7IWEgv zfe`G>&MR*A;*t`zsfHh_`qSKhc0K~#d-&ysXQsUK9SG+G``lV<-jwl@xOk4rnQAA+ z=39`xY<8w{`>CXbT!Y>+1OOQfZ^Gvld!({=)(f$?!dgE0KKN z9vjlvmH-=2()RH=9UO$6kw*RtX68yAa+b^;vSSNb&y+fP`Z48yKfteRQfwJ@b9!5V zQWuMM|1YJE{{(0vxjh9Uh|!a?v9U1#0t0|idc7SXL=)c)$4;66pFe!_tVcny&iPlv z5YhFO9{#6901AVx0Ab8%&CHZ)ji7sT-?lcZ8Ur`{h7e|3Lf#w8)s^Se+vDb-m3(*P z^?;o;e~;RlOC&I%=;5Gy9!~UIg}=w+ce5Ar_nM_F%~J$Sqip8#Ji}hTTO7xX*>X%_ zNvIU@!wE@A3PePNN}(ig6D1`?9vPi4cPIcbBK)}82h2X-82&;s0`HN1AsA#Zm&HHO zw>~UH2A}U#UIf1ey{0{(E(H7HfGGe=_w20C?m`Oyo|Uo<`O~#|zzEp2f&JzWSg9r^ zuzJIkzk^3(+2GywrrkeGuCF;eU=(5X{_|N<_^HH zWjhpTCcbr@Yb&X)9;-83d_^_7EX=iCtY-Z<>GN**UiLWJ+oDjL8z+YbcAr|OqSAF2 z!#D?2IzmE1D;k0{Z-&MGQmKJX0Pv_(JqywLohv_Zg+o;RC&0@>DqB0JR7P5Q4p?o$ zE&!gWG&%SHCiLK%B%b$18={+E+SrB_gc557_18fWCVD| zT;s48bOzk-tE*pLUV_hKc>=;e1mcI3Bn6mA0W(fZO|85-gdpA*tpq~*;b8!!A?SX1 zw-*=N6@?BRrLDZ_3G>G-Vj`|8s}oPw*je~ev$Iu8jgb_zsP(t=LXt(mIa$>Gf>}R0x+DQAcX|3Q0rmJ^`Ij>J?sdAgaeR4&%PoZtsYX& z7!QA1EdT}blp(KIm_`%JUmdpR7o$R`j1A_Zs5ogP9eX6lW^>wd)5D%ip8c$S`>sFV zt!yIT+;pEF*PqN4T`yfWh1~wfdKE0qWNa752M{l2#@zi)&aj0~T$OZ0{pbpg?$r~f z|C}ZS)cJO{xBUj>7HeNjS9oJ)x?4zu-!^Go`{zENr1`;y0u-`X=MgT|l9z10Zds9; z9ax`%j|_Z|Ru|tht<@yN#oK`3Gx+v$iL4Ss=;0R3(`0W3_)yPg(DMDa%gf>pG&kd@ zzEI)sw?>m;ekUzdrE~@^PXQh`RodcXlD%C1w1B(D22XNzbwTi7;L-fjMgH4hyQvHB z)@oo*Ay7`!H!Cu4Hq>W|CcnaiYSj#r@?ssPn*_YjV1v`Kuq@WuqvEIqfJEJxmr4*7 zE=D=BvhQJOGM#*${zaQ-ZD`w{waz3m=KcqzJ-YtQF^nd^wzkH_$CD$&<>+iT=R61LRJzEt zC`;q47^zI_>@=mBEL%M6&CIeLbJ)H^TGv?2k*hOn0z&VHAURSmCahkoz?5xBpX;=k zlLi}rKQ?4Hj6#w0Z0+pCS*VSRsB1z z;x{mCQd6hPps26(hhE-_Coy)tJeyFm9>y)NsJ8G#ZLSm@-5!3a0dJ(I9ObRGw_WTg zFW%%9H*X!~g?!rxZ0O602>|r1OT?J(%#v}1E-qSrqyb_MgW`7uB(9n5-Q| z-^Kb^7OK8q8$fMoEvbyBKocL?v!cW{@$)BvGtTY9SU+sacf{g2-`;J?Y}Q--y2fvG zy;WBISWQ2w^%%pz;Q0)j_wm%%TsGAtw)#y?ny~E`bORdtKUDb*%#CLz=GrzA<;L@5 zk9tF{5(T4C5wZ64S0^>kh`_$8p1Ldnt!Ses=XwkC^*K5adxxNJ*)Gm~@j4 z#PytSe=2%RG5Trf?i!gwV?GM1LdV`#>}_UX5WmxWo~QYl3pG6QN$BP0{NN9TU2`75 z<>+m02j#TiICJr7w>_;C0TlVA!+Yd(-d%j#AW2smUVeZum6q~kYa{<&GbEG<2?$hH zRUJQLRcf>}G7>r8`TNe-Hil->&PGKhB>LT~06yn8YPGO!ZKZpmd{}NzTdEn~4s@^N zJZXMPYF+2@#Aq7O#Az`y9!8dBq=$N1v~%_`FS>m-Bi}PH*&w-$jPi-_`KxFW;j0~m zv|-zSI4S!f2D7iE(OJXP=|*4PjE;9Ur+?KAa?x?{(bF-q2QKvg0u#_FGm*mZ3CGSV z`ORs>M;8@?T=ZNIn}_Sosy(JRzL9OS@E+u4j5^<8>E(F<1}h54A26*eZgh!B0{eDF zC-}RjV%dP1dGOzkj-6!t>o|9hwlza8hD>US?6C+AQGULL zXf&UAO0l)J6NbU|pw3*Bvtc3^sB zCL}E6^wNw%q((KR%@#f8#Z&e?$1w-0mDsasns41&eJ6DYNVy*F`^nr*1=DU@myPA3|? zquL9eeG=^quJBqo%n*d>BpbCCR|Rf=x2N7PssR#jd5=Xzcq58it-u!BPlxfqH_*#V zJa^Pm%ldHr-W4@Q?JJ9d*MKsNJ9P*w8Q?kY)7L2oq(j1TYQejC6OU*4;I&3UMFjxs z0)T;2^?lew)kof8_jHv}SjqPsU3vkFys2XBjdgfiJ7#X)Iw3 z3K2`)M{PD=YwO_P(*#~vQ!;kk^40(@hF1R$N6C*L{J0@FjrVTC{8GuZ*9hym9^UXU znbFziyQkvBqBPFb1CzgHX2=3OEEp*HwjZ0RwQvb!*xv1qRh0p*=LZDH)o-&TTMEDT z1G*^J3ujFFy7u5%!xj3EEIh00FT093wP9-0phn9aUzf4w_9zECB3iw`_~+Ar$B+|if7MGANkFfA56jM4b9=f1?Wd-A66>b?e# zDi73?bdhqwL+ufw^bLtlMaAx1?T4~5&<B#zwb?fs->U%n7W)qUSSUSH?h`d}%Fut^Xa;8A@V{x%_jAOR9K z!8992!Ge}g9c7jFZEn9-)o}^prSNpVPhOh#o~WmT4XyTa>vvEO4rMZT^j(xUJuS>2 z>T^$IPs?_zT8aI3VA1=!isCkBAW8w6m4q)FGe(~QffHzs&U;Y8G%)EMl!!yjnJB{Zgh&<2VQy_i z2IoiX$R%r=7|-IV{8L)x5$N)jQh9E&b@M7~Am}V>7`uO8p4@K5-opA|>z4sarK7!4PskuY+0P?-}~I-nJY6V|m|k0xc3wSz(^*9ac) zxlOmF)o1cx%`zar_5GQ9Z}9@rh39WzP28Jq5zRg#LjlG3v$YnnA}&zN_YrX)aHm=*<%Hx>`2*o3b~)1G~>|EZDmkXQea zQ9gvSQq<9Z4uY>%4vF*i>Skw2Z`8h528~EDV8kY8=^O%4&v2_CZ z=7{&*pFgsv%4{b;hlXK~6s3V&9r(Rya%o}8L`?8b?vj7d>@L_9#3h@kw6!FN6QKj~ zU0$47(K-nPiBKb|DUZ)pLQh&+o7)cm+rAre)OoY(<Iwk*^}(sH89 z&qn$;_n$m@Vz4bZP;4y+5&F(dyA$r1lQCq+z{t3EAf2;&Q4n%UfgUM}7$npw(}xwc zw#t6&50y#m0U$plheaCP=AEGOtLEmYGa_Eg1k9t&){x59FqrrGXp(Mg)$hEx7~fXD z1)DtUA?lYM*3ldXB`D$n_mf?PBouYs&;Jg&wT89gIEs{>ddS<+F>xZ*?CtGFb0kU~ z!$DL;{B=Y8<~$<0SxHnS)-quaiytCfXYOHd_eZmda;Clh z#WeB&5J`1{PEjkS#=@?mo01}q63kz(_mgY16Ru}m1D8Q?2;1)c50lzFfcBnH_GtO` z)6-(jma>oAy}>l|iFlzma8JK_)!5L0g&B3vQ({9D{`n*o_F}k(m7bLnsjU--)-bZ4 zw`nxkVx|k+%yzK!b$1fW7Ot#r-$|5n8R#>dk!ZJ;Nf4c?I~bjB_ww}Bh7$bO(!i#K z<4v)J^k`uN#@P3UkL+E3|03a5J5aeiy;`H~%o}}n@9ajMa!6bp3&{V6r~zXF{^ln< zseEw*ThkrbDG{Z(Win{Q0lg4^p?M8hQoyzS3hbSs_nImylALos=zbGrp9+>LsNnR> z6zxH98Oiw_dU;M!s7<>>^Hm7L8T7Qf!etfT$cJ+! zkueVmem{&$>wMhRdmwJH{08CzvILFqIZ(tg=4Mh+Q!_6#p(}5Xr$PHz$XVy@Ov+}4 zdG~q@vNHboOS7LVfLZb4wqiAVx42yogDxw?Ko-7wDA zb7u4;KDsmcV`Os3P#@+DMfxlTnRGYY{drYh@1pR#y{5gxbEyNzFk|**TS;w;T1tAG zqk&oWOn+Y|q3)H=vZxJNaj7nu`*|u9*`_4DZW`Ia5lmw3b5Z7Tle9fvLJT!cxf)9%0vzDnPzKjZKp-=+S9HpqFVvmTvANsfH zrgT#Bh|!_7<;=xCb75N2Xc;|+qsZ0ohhO(XwtVL&4bcAcdIj^I%ljA8mzX~CC) zwflHI6-(E+uQhBg%wLJA01~1XFKSh%%AFSl;hK|PF0I!)t9Q*7s?=I?yKE^`m*cNE z6WTc{_HQkL|Q5JP_dC37KIsVHLJdKS^ zDF%`fAdMJ(rtHZelnCiebb0<<<58M50wzn7M4yL#^Z<^mhbdd9Ztlk12(onT7jC`xbZb=qvuIDj zO5FMW>MlA|MI!8(Iii<FtZ!l zYfw4w%2uPa!%AAC06*N{JJ?lDx%2uuDChkzlb?=H69A^%U00fh6#Kh5k=kjdB11<` z`m;;QGXm~TKMow0^EP+%^6$q)e0x;En@7pP$Da;*g|peHY{Tej={!03%s*@WLN1yA zb|BAMe4JZiEP9uR!}Po1&u1gzI-2^t$b9`QCH_Clj7h9LNhtNcjR zNk9EJf;Qd&kKYU>RQh2_fe|O<4+rz*LUY4-nFs`j1`?T5Rlp7%8f%v;sZP_U3QH*M zhv{n~6GR92H4K%rKA;+^tnTQhvO%n_9`uTjPF&veaeICBwzD=2Bn1W%lZ)Ry%(1Ssy{H`X@|Ws$I~NW zqVBf94tGss6R)?;wAF^PePcY+S@4k`m+~7DNhY|H`Dw&Dk-UYDTZSBJli0S`VG@iz z2CPc~S8r<06*6zAI~G>ip32@Eh@tE)hr@_^BT+!GoI{>O-3N=hW1uY<2OYzOpbbG%UH)G3`6Za$}6D#>8kKmaQ8%-iV;- zEL^N&JAWz+)+)iyqnX{5Dzlf+i$xvk!p0$`wvROrAp#oMUf$lot_X_K7j?66Drk0o z;iQ&P!ItQ4%MD-n`ZiZp5r+~`gu{vimeb}M^L6dPYQa}RVbo>S5&lAOAj@_{xz74Q zbLhxf&I)$>xyZg%Z`x;g%Nczw`pn$73%4nT?X2t;)iX!b*)mcYS)*osh~%e3tx+KV zr#9u}w2efrJXS?#T2H-i|I3%UUB$XUwX6@ATrXJ*AW69M(~w|;Bu)3+KA&te&X6B~ zZd@oaG!sWLW=Dyl-nhL+@NGn#;=iB=l zFN;t3`&RPD>=9X|psdWui25T2;yc<;oi$I~!%Ib2-J^wCoA|+jI;1vyD#D36ih6js z8Sof-KiHYV4sZET=B3hZ@Vu%Bs+1K3N0Gp=_pKgS~h`jvfuP!g{OO z#y)7yL(&A(rp-@^dq0;!gl6|SA4-Oc6TyYFazSZyw5iePUPQTQ1wiM%BX%xGv<(tu-I#lY6N zQ-tmE;n;n&OC{GbRYaYZ&{Dpo*+v)k2*GkB%z_Na!G{ik*-PRwhGwl9AktT)VCFx0SDNA^dRU`r(=Pifpfsa$v3Azi-+Nd%^pi6{?OOil^-B zy2U8}%x2!7Tl2fP&g@^Hq@#~okxsNXs~>tU_)Fq$jg-bCs(!kJD+XrfPc=1UPzdOx zvs*o_*tE|n%`T;mrLoZ_#6_VTMnis!sU@2a=-b6wcV}bfc)B&*Bt<1#F<)kb4|-Uc z7CKFmW6TE2Q&dI!!#}3P;dV1=sTy-j6be05&F+yf^Aw~NH5M~h!I67jRn05bN6{biRRsrt+~T%v-BOVCqVQNcq&uoZpy zz0k75v&b?U(>nQFoaOD44BQ2$aAAx}0*c3ytBFy8Wq*T7AiPYkTakwKfm)kCmJFdk^uF=fQlE0a8Vj6kR>3N(W`TU4eg>$aoNQ-u?(O>~9LyTH@%vaOT zq1C^h-D4pAX*?!Ll$dW~@A$6f^eE)ogtDbK+hD*x&SHRJYj0XS{i!lH7!aLaR5A@P zFfs#scPj_Fp06?~9ai@#+=UwYG&WXLlP9XQx%x-|rk%NT41>%o3og}@Wya>I(UvO5&9 z?ulNbp#^dYn;1T#f!g;g@3ci}5@cRU(|sPPvPCCbkJK_?oCJx;6U+xBy-JdFem>JJ zIYm8cPH`LR`r<6TXs?Gr4EzaKDZcrgYxQ!I+wUPVs%D*)~|K9j?lrxiO+| zmxn5Tuqqnf4B{^(gE~4-+sPD*`C-|S&!r7Nd{q?MEGH|^M2N@FKYW-i z?&-pn_dO-6;-L}GJ~i?43hgW>@?P3)2<_8go16#@IwBCu`hd9SpHWTcE=~LyzTbz) znRXH=1TdzVs3I-cK>P{dK}4!EzA1KVK`cvra;u%6)?+-L%_EY=ye;~B(~abLY3N$c z&5e;T_e?fqe_?ajh#4eq>EysW zjm#!f;6ZIvEhM2^AcY0;=g`y>3iOjl*H49gy`B}*S>~BxE=PEBST*vB(`m^q%QqS?F#nr z5Thf0?|8t}Y;U5kOI=)FPnnXQq|!x)W9wN^lM+q5_G9Qoed*F^XeicM_RHTE2c6mf zq=N-Bb#KR)&SOwj1@&c8pRAg$OK4|5J-#_k)eHJtY32Ofajpq7T_Qxn`C0+@PT?5O z(`2Q&q>#fivYSJ_TQ|Gr+p|d=Asz3_SM3+TYf@5BefK)ZqVsa{ZE-4PV!ot!`So0K z>YZPeDAdhHr4>C3U98&i*WKpdjfW%>(^(%9PZ~iQagMfjA~6}beY~8f9!`g6PkEJK z7P46tZ$5BFla^9Yipbw;jSArkQ;P_CmJEiEix-^RX^P2T)v|>1J;GfMU_>6OBU><{ENMw;=B94G4+b-=Y#6>J! zPsp+QE`x^6w|L&4yoV?rz`IxHZ!dIse7Pvhzr0AdHv^PxvUQS-u2}Y5o1dqi3A(bT zmTv2e){WmL|j*=?u4MY2fT=k~?T>T7McB>`}c}xVlQhnYnp+f}rKVJLo>i zI^k!&>@hd?xYa&kbqME}MdnYhn}iO3+0##Z~);P|1x3zWe&Z{mqRgOL~akqE#|M@EcxEvQ9J+=|%fRpYaoHdbxO z-Cnq$_?>^BK)Rp4>-4#f`T{G`3tR;Bo#vxx3?CHEgzy$j_oknWV<- zr}-0$izl}`O)S6&B@%pqB9r%JUHy+%PeEp4>2mJQJzco}K_4x~2@^~$)zuJ8a{qa& z3WKL$vudP0I&wK2Ht&tBrQ`5=%0W(yXT#1P$Dv74Oh+?g8%~3twN0p6q4wO@X|zrd z^pt8s*s&8tq3%F|(ddGzBgU3qFL=hvug;~34Yy4c=$1EP2XYB2oj3jQM2YdR`)ROV z*h+#~{ow01Wf~A1Ys%(jeOnZAc6nQWp7EsfxTHp#%OLsrf1nB`ewADA>e!+1{6E%g zn#+GK`9k>vU)l6#aB*2KwXE&0yv{I!MW}p8U8}3UT2@!Aswls_4L-GHz1h0;b)VN# z4EVD>!e}U`pUo5MlrP(7%|KPKY%%(?i zz~v}|F0r@Y^BWHs%a^;8VCYEkSX%kr#9-Ell z*4$qFcH`wIZ*{@UES>MG=j8s;K>@8nYjvuXreV%K>I1bES$0#9znlnnK(d9`a=iXZ z`h^Z8Hwp#vZ{jf{PYj z{pOyx#$1L-21Bc@uWTG{dw8-t6fH(?G)=E!bzWA}C~QST8VwM@Cz-k zgRHI&P3|2(x&8gh6qPdb=g*4=>u9UFU*GGzranE%XsVWf)nJkQ1qYu@APy9*UZ6|+ z?p;kTefn4dL|=Bu<|xhn?*&E9u1yUmH~?M9|#)x>DCyX+4P}0 zV)KwO8EMt__Vx*GG&xK@cdh^YNnpESD5mu{dJLq(+|qRmq#9<}QKR@dD2lewoq>%F zZTe(Ti$wm43hKxL`JmE@*8bJT4b$;^w_3_uQXMxn+}zWRoR4!dZMbfiFW-J8zTU99 z-l>>oBxQZE)Q(nCQ|r4s-u`jW-%(SI$AKe!@pAA|@j|Zi=y%BFiom=NL)bF<=2+yE zS(*cWu?=dTXMeWXObOi{*%nrnJ5j)>1y5!}E+ZuvCD|)}2kprf`W`w?ZQP!GV7*;r z4b~-7ClYpmeaV-8V=v@-7bFBrKzSasokezDUM}7ogv{HC|?C?pz z1iyzoA{OKEpd2He_TBH3kRU>tiBc9J-5fMfU3(DQUs^h3$4^J7czH!s=gcGs1{4prRiYD}O+&O6>j=_q z556y*b%nIAReyCE&~Z3au($>_Lg$-JotM{px0g;ed#mABSDE8X3NtfPQgie3A^ZEa z(Tjfz40-0KrpoZYgTo*NJ$6^|?8XO3S@4KzAM%>lLdTi9j(?5^)7V~}kB3-JHK>JefW>;_$gcTtNC;MkVEw8 z!s$DfIE}b|nbNe!=i$|u>g6M|5eVlj|2n8N)t)l1eH!_mx74x!=_F`fteu<$X65-t zP&^J|7pEGiQ5goRpnNIy0T=7#k2}Pef$2L41#=QHV)|!f28tOaeWN0TF3^uYVRAKxdxdZ)Q6RTpP=%O2{ zRIRlul2{yB2M0NBr2-)H;8zCj-++lE+XQf;2eu*o?rtX+n*H&w6e3P6HA!vFd8xjw zxFP6{#a3PKClK(mfqd!|ZvLMm!c>G{G>U+u>V9+?4yWk<87WjA6HS4q8wG9r`Ldrv zn88dOt^d>6%*>AsP7H;BAYYXtH|eT!kP!1+o(Y)6$Lz$GZg0r+v$eso2BAX#ia}&7 z4c{|%ZwMGW=B%^|qdD@&KRx;C==QO*t!=@biT^{uUP!3t%lVVxX{Y{y0qhSJv!Fep za;9nniYC;3)YeeQwwk|A9xeR<)d)!MXL9m>tpN=dM%f4ebTgc(OE3{wmzB#(jh)~FN2)wd0QbgB!T zmJ3xdL4fP1AeRrYSlAAh(K%r-Y8{0M5vYWutXRxR zikn7VXmFoD8#Gr8hdivNST%a{PZ^>{kXTi#)k%P3j@?$yJ!)iUrsj1bqmpUBIqEzN zuamN`D7sx-Q$k}19Bg$9Jl1UTURy1~~yd+$j$tjOJF zT?C>$QA_^(KLOyNx@G`K463RCENAlopD2qsbOo zjb>f3x3spBD^ewet;yNUE0js6BblZH8ikAWY&|8w37itG{vMT2QhJnd#3=@hq3swQ z-y29Rg;FSKR(Eh{v9T$jB}XGl3vUX`H*mfx;_8ZF#vw#f#s0sA=mE-?Lr&#G;m!z; z9FZ_}gRnNG2SE$yW;&}57 zU7oDv8uR2-tT$b{O+x|iz@R)~tbV+dGS1K2(8Sw(an8GL& zo(F8V!-V4xF8kU~Y7$TFgy8YwnwdsrIi><-R;`{seb4z4&Tej8MGj<7q?i$AcZ@&M zhJY+J0%a(i8^3b3NhO~y>#-Rj6~xS77@OkhhxxtUVFTd5 z`sWYLxx)c6`0YpxoSeB$-o7woE?q9o#x^=~bt$7`Gy$dx6haX~C-oI2qqh*p?gm-! zOc4UsC+EdlhJc3@;XTtgsckxi+T@yXg?<8@D&_r9(+TIuNirMI6tkI3m(?{k`8hDM z*W%9bs)_?!3ur9*itf=la8OKuIsYCVCh&ZJJZUIzm`vRzv?xE>A5q{_C)TW%)>b&H ziPGv85}OSeU=L=4b8Dv8hg5tR)!tpnhvZ@Rq8zjmqOHdqXvQ&9Um5 zl8wX)_Ss~@lj2B{B!}LxPZfv!etrGCB&zwhfBz?V!9so=3*jGu6D*XD>_>;(DHO;z zT1)*^f}CdsETX(@?&dWG>}RtWWP1#4<4`9}@CRl5`VVz>bZqP@*(<~g&$)p1#?GH! zA+r&8X&E5WDFp%2Dw?t*rrX0N6T{gYWZyU@JJ7b&em``l3MH;O51q4EoI*(;qfBN) znL^qPJsOfx9uHILVzgQ-NX*3!?fw_DID`7Zml6vT14p@9T+VkO!3T}wLg`skU-$CK z13SO^s?_RQO{BbP+S%=)U8 zdu8MZs9GT$#oAZ~onq+*|DA&Wzs0&~@$rWwmLu2g>H8kpvKOc=FG=0a9U>#_5-fKV zQ`;yd`57@9Vy&xOSjK8NFj_{UywcOTt!HZfyynt%nn{9Gl~j@tNo1`YUlz$6QD6U^*~UoNN#PA?&!gl51L5AxMD61 z@vqUQvuCZU%DD|+kV!0-%(Q#fk!vxdNdZAvSR3dsEHdMw37$15=H9#ibE*viAO(*i zPKYHS*6qkct@zuupx|L1dXAO+oQP6l7^0xL0qg7t$98h+zzEXOr$FcgK9dl>1ecUu z-nBp{^FhU%fGssVn;eO5L0G|z6|CZDm->sORV7N57V|vPF$c+p{JiEc;qA%cb4~6N z%8hmRggYw!z|Cawy)J$o=;ccK-BAvII}kWncJpkOyFEG#`0N(}dMn27a6wP;vfn!^ z3*?S{2dh!69O3p=Pw5DE&?#vJBy#o3*mpBw<`}qGVA5kD+&A|T9>qzv^G5JXm`jx*El#^nDB&q>&QF<~XdnMC3+~xIUn@ZK1)?6pA=~qmX zY0{t($dlSxwQ}YEOFwo1$h1xQuFJw#VRxt*NZ00DyOotVeNu=e~xV zFIy9IG=An@R3ZajVR&Bv9RpE>m&Kr--fuk5=ODD!+OFM_skIqIkBMIvt4pgK5XRil zyP>@hGr%o3yl6sWhn;P2zCUP`{Y|P2L|%CYC#f78aAU8y6}pm?sUCCCAcog6hO0TO zby?lglk^&a8-h&cUb>xrq@!)4PHiJ6uS6o-N6r# z7nX&>US5FYh03TOw$AB=Ffr%DWr$5

?0o!K+HFw72FGTnshx;8F67lK^p0c*7vHX=&~F;J1d*TVN;rw z8(EE)D2|AE2^YTWl@J4i^+w${gc{|~=m0^XW}{ik0FvqVxU61i)vpjMM! z&o@$Gw@zRLVFX~8a1jr@4?-oH!zf>|D*o>XbAJ6PfVm_qhfsVgK4)cwJ*S{&=P{ih zpWF{V3^2)HMj(5h7pcATr=jBW+wQKM5@yH$xY|zxK&}iu3uwm2V{Dx`A_l(?qo;#P zL{gC6g03D|w)-Nchp+&64Avj9M+_j4t=9ij4Pkq*`M;?76HTyJT0(ruAiy_*U(C_Y zN)RK+?2J`rqZ^10dcx!;TV-H~*oihat*jdS|G*0t(i#<52E%kBVHh1h3n>*{Ltj{` z&1LfhW)SO?*PFcbZ7M(eh|Oag$VPV?f+t)UnGDWH84e0WUu8eSFwineJm(N z@)x;^N1+TnC>==TQ0#wk{WHYBnv^qe!ZP@5PYN=XV6hWrYe)D=Q)@{dP=^v2bNj!| zrQydP?R1tzX@#aqQ(s5E7LXRS7;4S;eJ6W2%MxSwmT2u%sQ4e9zytlUNk;vE9!4j{ zD@XD3$Lww;#DqC$8K}E=`M=ZFt3VDPJn#gMVoFPGPK&uAue?LpGkY1-J;((KbW8TL z@LK(k>Y;%Rff?yS2r3@L&T^Y0p`!^O$app0;K%WS!=mYoqD)aJ)sjG3215*s9v;&6 z+cg_i|CWkzkg*?L-owAUKe%a5uBJ_(7_Huva9)Bj*tG61xoIxTzf)1^@#|3eoZ+Yl zzYiV_<>a()-ql{@b3f-iB+&ycHzVItN$ltzmpBe}E7LwJ{nNF1a82q+gu2(Fr(cgo8z=Y*6^+6T1C-2poUwOm~8-c_Df-AYswUr9_Mb9tvL-IsZ3t2hI0PTczjzYg5a;lIA^lT+~yi96Fjf z`(f%>(jw>I#?sH1Qe&sV;7KS`>*dZg%upA$^K4SWu}0+d#S@0-2MU2A*o!2x=0|>8 zFMW)1Bo;a-f!CLG!NtJ`i~3WAYoOCzqif%j{Smp`i(maA@=kFdvnKJ37)z!1bJjXU z-k#m>H8A)HxEkc{?t2oLZ!^GJrmjh@q=EbT2M9BOYZwrqf{AaA#VVLSlceN#iSU#r?|G$<_S9C%(; zbzGs^iWMkd^Zv`jLUkssB8#G^)RJ7odVorX5^n@l9o{3Wb4rQW2}RSxP@ADjT7`xPKEY zhzAq9Zlw0Ri0b|7N0VU0#^1lza4P$4&9^Ya<>Yn?KXt)bQQ zJ;UcW-5JN54lX%(SUjW!j4hlZjaf}3-NXM>2I(i>0bpC z5Yg~$8(BZv%XQOq`#W`7lTzarWj*6Hu=ev$v;WV&0|vM3qMT+dcs{$Wg|~3xW@FoA zp^dd_-L;n()k_T0Tnqb~?M5=r$BUB9FZ^%JT3d0X!g=yV)nr-TA&@pl}rkqjir zW>tHPgTr*!T*Gqr_j+UX1m#Hg%Hn2D^vi<6f;cwwK!s#gQbICp47`R_X-H~gP%-`h z7sUU$iYvbBVu5vkyPaaNL#g}TpK5&;ay!m!&19CJxlWNd_q@Gp2OiV*wU*jw zVl@;SFg0aOVrNO-)1d_dum9Y$c)r$&o@nAtjPQ75_nU8kejsukqp!VIDNMO$!A0$H zp4(1B7JgauY=Fg=UK!;qb}gZ-y=!sr9rl=&eG0OOq11ZIf|s-*8uYj@%KMrOrWbV0 zPzTzyKB+t(HWk(7-FGBy1;A8HT!ilmy`C=n4uJ%OcA>8v{wps8wk`7Jnt5V5u! zrnq1?hY=Oq^Bpsc0O%P)8Ngj>45;kBW4;ftb{k3+W>!rNB`(=NpIbnjSy>M9(ni2{ zi+C;#xUFb7xJ?fMEsLGL;5f(?95>=*)k~j-_Cr!?TD}vOQ!s_3tU=zMX(Vn`iL2yX zwGV6(mRX##--;$c%lgcTsH2{qHOA}y!J!4Y|8q0LBMMJNzV||0zt>w zvM6D~w>xpEdg><)zl&5aEL#sUdG|7!prcmBF!*zoIra)`bG7Fnu`-7-t`Hb-!F5{9 z<}0VxG-x1V@pV+d@dXXx5P^xGBMF%HhTps^0yu-Rn?v~ZS1EfEm8+>@f^I}WPl~rz)uhGQ>m+9ErC=NKBxZXfts>bHz<#a*7a@B zeh#YD5G6J%xW-8HUwLjgz8&nOyrgW|J@q2)!zIpQstu&bGTa3v{$c4*o$&jvpZR@x zwRT?7ytFK&6NRw87N5=S-bdYfteZX3+LZH!N(U*%d4vrt6oXzc^^vRj7Ys6l;px!9 zV}A{ss*}~Ua_C`|$1zju^=7as-vaWxFUZP@)kY3e1}+nRWI(^C(p&;%5G-NS01Zq& zZT=lzlf=~dv$knRL)9q{|zsM-YSgq zk1m0}CL#BqG};wORe7m|cFSI4ciw&uA2NPqj$B=XG~b8E)DSY{jFOzZO=~-mNG4)U z6N)i;#c~-8BfuLWDE`1YZT+@by*<9a+Sqb}#z#Q70=f%6KpfFtaD?mND#8=NER|)A#_iY6 z=HH_fP3nxgp8>PFC^~50^XVE0ayW9Z%wkHYKXVumMu&Va_66L(xCX?c%>q{_-u;4? zQbTbQx&%tXddWbpU8`%18jm`W2|?_=F!&Gk9E>pgC4i?)#0Qp(bW?&Sp`y`k~_%OaqB{fdJrv0MighzUr9d;2Wuuwg0`CShB z-&+(>1Lr3{v_M4^!StZ|wzfyC>%)_(I@ryLHjCb**ovcQ@fwq9arLG2WprhnCT$WD z7(x>%tGI*tWnjp99O&G4+eWCE28b|`>%t=0#H>xn5%i^@sHSZ-r) z%4Ky;&Cn(0AJUE=0WJDpQp!?p3N#6=;UpHBOLr*g1MLBA7C1z67K9JRwof@ogm4g)i_+}B^CK~Nqe2VI`#(x#Wd+F)b;mOucoEgh5*2|nNTdJ+1R?=K&mg|r&YRX8zdz^hQC3A2^VNW% z6t|8F*f|Tu2#gv0NtF`qOfEc$dxD`ckobL232zH^)OjuSy6%RY7t>n^u8|cLyvD|8 z8?R@1H!>u_A_g+z`KN%QoQl!A&xH|F;05Vyggq`ef+UA$lP*RJLcmzqmF4iddCkvT zJ2}z1yWjhc8N-WS-$;$=Ddm)oS-Kuxa|8uxgA-1)1KQaK^!Y`K@C&3FVXiKHokM1B z&RToDXAN~~RQ3DYhM8IsEhcoe2g0IZH?h%@K(CPAA37dTgMg}Y^EOG|%x~cl7?eTFR*ihA&bW)RQ7nWh_<k1f0iT(m)D>nL;Ee7gG&=^ z8ZC}gE-@P4(fsn<6zSE^>5Pe&THw+RG1p0z1@!Y92)%7(&9;M2UJ*W&cOCZ1W9Fo# zixP*O-$Z97CKK&UBH%sjwq#LwU`&ZFmh9(*3LYXGd-cD!P8gC4vN3K@vd_g8Tk2 zNGI1ZDd^Xj5ez}CHG0gz3{piYi+8DXPbVtwQef^mgabn9_d4!G=_7_bN_;w%7B9hr zg85JV>zZ}zm@>jEB-+LO=?H&iH{Ph!L*9<)k$l}R`_*zI-atTmAO&DnX_d5kdKTOL zqx6aV1SQ&u4+aY^A&)D)g7apj&4-X7YbWIl5Iv_V$QT>f`Eb4bxV*;r9;k?&ByKSE zj&x8Ilyxe+l)s^*iQ7%^+iC5DNXl@ow=hDA|N()N!!WX54p5F-uNm&r^>;a#)s65)$pW^Bs4Vo@R z({5cK6#4ZUg8HVfMJvne(vpM zVCL@Sf+xUZo|Xe}iy_KLcb?#H*}4^3M_;=K+m0&! z6ajM(k4#vQR+t5jUwVA=Adr)Z;+IXX`ll_|IVlPYKkwDrzIfZ7R$Ze8Y__IAk?!(YAhb%{5nW+1%Pl$EIBeT-q4`$2f*dg7NzFe_Yc?ha% zdCDy+J-?UgePaEZC9aj%i}b9h-`cvbwk7kRi3nt$tp=pSAdT)~coifnt9z9b`uzVt zEx=#&h%Y^r4+Sh2SVQp3O&77P!+a1LK1N#%^Zgu9%5gt3_sXy4X|l*#g?B>$K(Iwb zk;aucoCa?qx7Rv`rt=#Yi)>xMXur5E?>N&7?ok8gSG8%nF1@vz_L=n(nKANC6)dzk z9M>UM#cjt(VYDH>+GLb@>%H(*W6YH)emQD2#k}>?wjIUlkH-OB_&A@uoMlm<7NYq$ z;?-m!1tKWHokn;&bJ^;REZ5Ib61O^kf+)sxxtc_j|6ZFBF=c^4xl<)3VPFm=E&G4k zffo-{2vUk_xWJU5U}LdXd8qYfeTuUS(yB_>Xm~9+ zQesE_9F48pY^JLoybmw$yk@W&0(xR_Ey8haQUXWE!sWCS{jwk3abw+8F)jD=}y8V?fqT!{zTS$*PLfCc0_K zQSR18gx-(Y7aT4C zm(^kX)&7m^JrJm_sZCxn981V#Ra~sLoe{cBo@eena;EV_X=i`YVI>glFtQs9ppa|m z7Q(cXr}CYqfvK!ttsLu8kQd3osPG&(Gr+dfftue9-TN7=Z_h;^B^*IOJP4sS`Y9k3 z0a8Tw*%WZ7;m|!Kvj3&1z-D5oGE_twBbmr1EE`N)-Bj!~AQJ1xV2Y{0XLV-iq_!pO zO<-y8DHzDNfa+5wsl zWtN5Guqp9GCJl??bar0C>U$f+dlLLf==;Fap`rYZ^AeXO!2mUZE#-vU^&=Yf6wALx zAHh5Xh~t|Sb&wQUlCTOTuhZ%Q7X?m2fveCY);x449weF2!_4S)lYvNDu2K6LG!)qz zW#7G=XXDVt^?ra_Pe7FY8=6|%SO8(q=q0KwXkXGBOGmhgOuQf~>+64LnDAkR zTS2zcZ(Eh`yITdyb7KA^5d9F#6)G48D)~*u3Ut7kSTlTmGEjwuiqf|gDwMS*>a<@g z3>4Y_avE+|U2yu$gg9S*jU6;7En}PaYw@->5L=J4N$oLokj}(znZJZA5QI2_=$V*( zlWB$*0LuMrENz(w`D-+{(FPf|O}liyC|}Yv@^hZ}%bX=Zo_&`Xn@~AH{~&NiMc!!x z{RoDmEjS4nTa^}-z$e@jcn=Up4U(|Hj}(yR%`OiTZVU;nVzRCIXWLqi)G8C<4}bOF zl?OTxO2Jrl@$K%1q?l3X*l0`m1t z4X#haUZoxol73BtpsyiZ;Fs`0E}4EM<1%Va%9nJO(7`EN+k+W!X?KyGu)a{~VIBuV z2taZOi8|+P!Hp15$087|thgxnmh4D{u3O}Q{+aAj}%UO*g`s!J_?O8GLAf2 zTTUt_vsu?`ZDZrYZbn=pHbMe4|+wlbH5Fc_$;$ z4{voShJ--~g1k5M=C)7%>$pQYo0RksRttxS_JN~oH&6KVJSyRSd2T`oay_Dl-Fd< zH_LDpxX@bdb8%3YdCdw@7#6ZJ!@0g=0)LzZ3PNq~2#f(6INv} zl8G@J4wM&6m&o1Y@n;Z&OeU+QGz>pQ#1mgz<}v>}7MS2ZViIYo7(5RR&YgxHa|z{^7Nnju=ip20+;Y zb1-CnnQF>k>Pb+OQ{0JUIP_r|sai3>^zkmG`*=omD44v0_jelFYv1ufIB4O7oA4Bx znkIY|vTwlXRSy{6;*?}SnN*xvrmjn0j$b5n!tR3YJuHJ^Im8S3o}&DS+fRDHuiP(x->) z3lb5EI^Zt zP>+bw0aK40YtF%e6CW%! zDSHi~vseVT(Ju0)<9OPmoD{>TC&X03eP@69fN= z$eu?dy!zZl^3q>bD_ok5nzWxf2$S-@v51SJmG)wN;C_9_La(6yIEiD##cTOC_hv{J4NCS<`Fa3awxEdD0{4GTg;{@ZeD-W+7O??Ayf5_it&N^&~( zfy+Cj>Jck2zHj@FaV434~@~pxJyEqnGWGw2g;dZt3m!`sb2L*DJ9dqoo~>$Sta% zdU19p{6&~)&Liw}+=Zf5M{&gY{zT^TM^THV%NSf+Zw3rGR^JDRZs-w>$Zc&O?`Y@+ zkvmkn1~fe1L6QcBe$TgaG7!*aCW-KLh!@cswQzf|2x4f0?sH6OcH6y6u9ucHfFH+su*#G8RFC) zPvJ*=d{c#uy&>6(JU@tC-`#j64s2bQ*+w&}K}l&n(4gEC(l`6@Kdbkl*EP{S(FVq^ z+K*JPauM$gBk-@-1*!CMGlvLGRUJn#i`;F~xMLhNCk(R5`}=lAR|upv4kZ%4i$Rm} zwrTw$#wnx&3MU+72c32IY@^)7caAFuXvDA|SMNo0ydbBw;YFOJmJmJ9##liD%k%>( z4z;@uGtd2K>x3(Idyrqs9Nq^JVv(&&CB=4YtIvVyv%X&I_oq2S*zE#e<8RDi53X~5 zK4^WWBc)|rKzW;gh*W-_i36*LWa2wzR427IGk^_CbG(C5%vv}6Nz)Z&|5hP=je+6S zr|`8SUc)pYZc0Y`n%|t=bsI5?G5AuNYqkusf3X3kGY@3))nUMpV~TQzu?4{i2I&gu zxSjQ;wNKJ=?9 zw$6_;m_SBmjuY+X-7h!@`t9EofT06{7mK7GamSS&!P0N&HRr~UGIK3Gss_E2PB26gdUEI#qz(T7ugaL?JW~E5^{PQbGsT+Vi@Vtsp0Q!YA+u9#<#4=kNymH&nH)=$j=cs4ds@OQqO> z5r|8P%#?av;jRz}fs{d!0cuHufiV-X@tvCaNMQdvU0uZ}vMEspNzYyX z5hlR96VW>*f>9r!3|BBJ^cxVhiN%=2?v9?xumU58l+Dq7zi75{5SN;r4;8Qib+HT- zhy4IX0O@R%Es7FmUyZ2YG$U8nn4?(J>gqgR%0E8)c14!{0M~HPqfR{nvx1EjwusOC zB6sCeV8dvgZx)Bc&+2I=o!sLv7H0SJo*jZLsTn46S1oy=Bov?rq|_ivEANFj=t^zM z6-;r{Zxlz;4Yy7Z;9rUu^7WcvmTmp}I8K;_YSX|tW!~*RG{gFOmE=zW0s~QeA}PG+ z_`Oy#RX<05JV(p1LqH|Cv6#MHNL_}ALAO5F`{;x9GXejfY?lwt31vTOFvLjQ)`6Ut z7~lcE#adKG7GVKxb}G%Ry^%ZhhM(TuT_+uLp0Cn_925?TZL8O>1LyHJ zZ%@;T;}6lAKRw?=#aXa<=xfHs90Gx#g^|Mo_Mn$r!42LhvB!j2Z~t*ROVi+xv^QLd znc7y|@4a5lxz%oK)2?5DODL`wH`2TUup~$xKSaa)YTC)B%YntUJmQ#$@+rTh60d`w zzB|)gS>6w1Zs(MA^h^54XTjaHBNa3k8nKa(Tm&^k@HCD0&(&Zd=jQPfvSf%sGt`8m z*P>J*- z##t7R=txjg)AMtPYnc;7K2F9A0xXBWiyao+>}KJONKWMg%A0pW!^6V*^RyiT>VMxX zm&IZaF7j>SlYdhc&`#*CAp;ftH`@029!dy}vrO+L<8+5yd0_|=LEa?Zv**(j%@t76 zgCVf+8%DG18#za2+BVRq)RqDLmNOPxVdHFK>9g6fYEZ`}pn1Nq#$rbo`@7S5@ z_6j!1uH>c&x^kx2A1^D!2?>0@z`c=%h(fM=AZe<}Kq8D0dloBGOmv+C$Aqt*`{P5_#MpVyKLhKUC5vjf)wRo1dEOgZm&;cG8x==?hI?OFA?iFjK3wA8 zU$`A)l*3IFmmaaH6&Fbc9-=xJ*_CK?_VMXP71RL)*MZ;P+ZVjk-Z@76$7~9v>(AdG zmCw_j*VbuYE~EsgvJ$i@ar8(s)TBGj#SB%&`pQme<%*h{}$^NB(U_$csvrrZtuP4-M&xV&3vKC9+*Q zLHc>E9a+t34Hq@VtB_v!3%q*lFeiV0?gwpFW{KU3OmX=|dLi|{-k!+5qjG+t3IiZH zDHkq~v~N+@tTB;vE8fTx?axx3yvb>^!bc45~wND&q z(26QM9vAY%+nK|`tkKPv3?Js8CZyS;_bJA3eCvh(a8xytnox-!x-x`2e!)%=o(jy- zLkbl6XcEIB+|CC@R%7S#ho$d@WI5mlM}1hN=?OQ*gQXPop+;@%uj*6w@2mgbJ#}PiJtHs>MH(0IL;cdHPIs?Tg?yK8Y*C zTvr)juUmUD|7o){n&qSm;hcQ$lrZeXHyim01;9kPVw>|OTDR1F$6H#5uPR!xNbCRY zcqZ2L+@N+Hcd4nzzKbcKr|K_*BXUm(_t^Q~9lq?>`E3+(O_QREUCs_nA5;CILy@HV zQpDioce7JVcqi*jKc|k+FM*K;B8wL?1WN2I zQo8D$U7HYhDJ#oG&-8*xx~&}9rLg+B@%sd0#vylzZNFVnX^rlHk!V2bUpdSapf;%u zL5u7$)5#t}k2`8uOtuc)r|I94mWcv6&SUj<`A1mPmz8_}EII~S1jb*GI#Vsx15>)@ z76HO-n_U#KF0QE@Q@O=t2b^wU#q>zFHZ%*>L|cAA?i?m!yj!jU?R~Ky1J;DT$J^-)H=~3gMdbg%;D-^nm%FuG zd4vSurOPe*B0ziN=~`XfL`^d60uR#d_ku6YQDQ49mW4NfB79KKq9YZeG`Pf-aG;lw zU@zUo;ct%od%z?M?w&Qm9YUvH!VXL@OVzkJ;hKoDTgazOM_CzT(|ZuQG)=b16%6!% zZi?e0)rYwtx~N`}FFBVIvM{V)HpW%(VP*r)OFPWuR3McL&(r)||I#zMA!t?tMYS zyf;y&$64g}1kDuSBc@;*V#F$X6V0+evYLR$tA{?(f0%ZDiFaS4;cId8y>w#bZX5c@ zS`RYz9xnAiJ?!(?wtXkmj2a~yX?Ww-$#v8NZFMoV5)0t4H}Q={uCR>wIQ;6oy*F_k z8=A7-eBs(+Aj35y%kxdmaXr~^{m>}e$~wUTJ*#@j+VZn`rD;!KDfUEoN)P%Yt86e? zZ?~EtIkapJq4wuc3MYQXe)7HzWg>YFoXzlKEIa$D!}+jczh!ZKemI)ct` z@Z`BqPgRqmFj3GcVf~-AMIBD^@qbfGRhqN>s?pFnRrhrPRaidNTYN~B^>lyld3w$$ zv_6KgY{pVmwO*zXyB-g2Hx=~0VR*^IiTt19xr;$&qG6PEQi%EG-FrGMiyrc_mGwTx zcQedU(`4(M{TvnlwYzd2@?F3Wal6EIS~;Pd1`5*pUNm6m3LIen9ErX;Ic^NJaUW_e z_?c9_8nfQLB5#5#0IvW0&K3;`X@f>}pF(C(?56igWi?>Hn!^5?u{C!u;}OYo%{ncu zf>6%7hi;>L=GT$Yj`@t@L;b$Rmn2BE^ldXQXu=~Ir*f!)TA(i-Zj)>Z9k6lV$K!;4M9I6le z9)up@4)r_LYgucGCpC4KVwA#$)KLjoLl;&JKxtqd6jd33UY48&iAbza^e*}nTL%i| zDd`o4vIb`u+F#e7-{zX0$r+T_+nRvR=|!fDK0hl~vXO8+?5@%w`S!ZwxQgMrMxxfh z%#H~j{Q0Bz&vLBy8PE)OLHIlLIAsHc#i4=#DT-h_=Xd-5C$>Wz%b4h`3NNQaDTe>! zG-LBT>1tk_e(W8QsIdVFswLi0)CuD*rAui7|F>8a?`2W)a=s2!+sOmP%j;cPX zvq|fZe8*|rN0d>w!Y}gv@NOu1H)eMt1yINcoBHiKrc;y);%z%`>6rgwd}hJ>_U|}O zJFE(vSz{$3iCjj$Ev3@xSi)$_b=JGm~+v~B+X08c=$zk~PPZF}$kMw`+#4aYxA zfj~1>uU%uaX3Zc#0l`psBbY$9o!)R2CSSIMw!e&|OoV-UH6V8SC8SA<;5MUN#p zYM@Ji&{sjyukhd}m2o0bf58Wua9RVO4-1G#1qQ0-vksSYsKeOyGHv29bv;$hRN{A<0y$hmMz77e-DzqBB-5c-ZE$BzkmU&~hxU z_T7*D8_{7n2$6zHz*tBirXbBjc}->Q{M_pG)&XMXm_(Ik06g-Go9(cD_OnPkc>?1c z#H(3LNucVcpq449PaM@Z%~{t@DHWpV)pux6R|pP&{gyfbfk6!ulMT#{NZ)n%s80fX z;s$*vsYlIEh)YuU3Z1HJ(Otdg*>SC;(!%fkh6+@{Vd6Thk$y}ziMd9p_jpHr?0pq} zr?bPJ>^LjiFsYmTn7F|Yy^D6Da7KR{4NhwnX$Eivm`aYW;^3AkBc_IMU8YZD+>!qy zjyX{BUKRhE%xQ{3@=1C**bYo32{X|$A?kYpQJQl^eeME+ibT`nk#N}YjXHW;1&i>2 zpxEr0w!?nAS^vX}Em^49gSXvj$M${{SVQnAV3}Okl=^DX9jL+drJ(D=|eY2qz>+QvRAF)nF>ma#n9>jM({#nC{?}WHUMYX4b zoYFE+NqSGfAlta#0vFcr8B;oZ$&aJ|&*_j`$H7vsPd#I=n-5TNVFt0J4t?+TZ)&DR&-C%)U;Ns4dh@{{sj?;Q;hS3O zy90w?8i%BIxoTqIP0ezJe%we>jN6nP@&IXd+k<#J#s2gGae4}p#%MiyMet^V@rXJVZ;NS9{SCRXw&!#Cv6Tk1z1MO!bZP7?zflIO*K8ZIn)oLosq| zdhF@zZbr(dETV6;Sx*xayQ&cSy@+}Ww*G{G$w958u_65SGQdRgc9{8?qYW~90u1f% z;y6RQm*L}Tg3)P%Aw||@*!ovXd#4aO()c;B)*;PTtVP5XoN6KHBn~5$b34=4!m0_F z^q9TA@TNN;vf!bd*9eh$cE;0+3Zi^9;8vkiy-%o|a5U&t{h+cwJ~_)2yXTH}z!}H; zw!#VEHuBPO%g|Fo)FMrD!L<~pGrT_L-yWq#z^QO01I~==6I45zk zUfP7jMBfT|MZ{usK!pJr4jK^|A-4oy5fZJfUlY~PegC`hAKjCQL}W62PXGB`glQMD z$R?0jxOS$*4VCYp(5w6w)Sy#5&>!C89euBSg@lZERBA55Lbw*p0>TwYO_DqkR9fp# zNf*^#!iq6pbmQGNt7VFfu!C3=_VgKt?`;HC_`cX$0(uO|L`aokH@PZAD#a29NoKLi zSNOvHk60Av(`pQ4R@gewe0)vd^2RA0(w>}E#iXwruU23YDFZ?uSy07Y`sqn-l*p|{|s9@bflJ-BSu*yIC;w3!>-7(VFuV?WM;R!V-ZO$=LyVJi zW}~&C@iC|sAn*dFn|(3=X}i!dOn2JbSeiw^K8_UVWj~1 z1BM{JZ`gM)Zqo*tvUp#EN_Kcj&7tHRXs8fN0f{yX=V==K%wJY3n0DBktei!=!IU$j zsl)EN>}uQn?6+I(z6Y%b33q0d@L!~@6VH1)V^9c01`y3Ej6+!}Gxc+syd|v2v=tNp zRzQrT<7VJNDNby#sYN5sh^m?_WD*Ac&h&p`l*{^ z4{niYw5^Yq)7n8*NEtrY$Pn|vsEg=nWV%9ZUfVNeZgUUB3m2Zgs z+yy`NPa1sD%xYvh+jZ_NJMN^DG27wufDS4wTajwP7RFWnc=tPcj&HU5`I3U&@?>*O+J+{am zMcT<=I*FmSUiRt#&(8bt#ZVH6q(;AIO{qSJHsB&!Dmtcm4f{I z%(o)G(qdvFyf98VF*R%2IiDmP#aAzS!k&HTG3x~Fa;ciV>8#^z-;ZC2BN|w;Z@1=0 z_#~%hkQ}?D|JDQ^+28T`tiJg!`_Tvgg}I0zGS6@N#kC;Yn=#EZwI36f+esPxJ_yMQ z^rsfoX`*TBU)57BQ=2$bU*{ESe;rYD-`l9>PfCKdBuQ~fF?8XrK<*&rBYorF)z6#5 zJ7qbUIe1yzRNg^-g5DAna1DrZLWZDk{TRaH-a^P!nT|y=&oXs%^gjY-kXoxW)vMrDe zo^g>!dM!efl5@AC44@AHib$nN2%4;aTA@{V8g6bR0J=CwmI3ot2q=p$sw}kegHJrh zp1ky0n}scX=`%~s?p$a$|MW`VJ7k3SrtGn!b-wvPGNh533j@P*JVvq?>iWvE6svLK z1jhk^S&hmF906OW4og?ss>c^2*b&q~V8p2x{!3=|O7@$NY@_-0Sl2$z=a0Mx-g?>x;kl|7l zSEQESN$=(fv@+*6+=Zc^C##-&H3fl(*uW7#u392$RDPJvcs4!qT z#)p{LMjyn`WNNZ@h`Mq+-r5XZhW55Uvly=%_C);V4on50z^GyP?mK^2Us7jiI8XTv8q*0_XH)*ScR{RrZopq*- z^3Elf{=go%Z-E_l*b!u(RTWgldZG|;B&3bHNfRfa7rwQbv!fM=udJv9gM0D-2?yK6 z0Cf&jFD&?Cqe6oM03=ztB(F}QaYA25I7XUgw@Q-CD^vUop6G-O6O+~ruZJ_UoB^B4 zpY-XAEV<8IOS61&fmL4D-Mh%1&=S7bHA~8eg=Wf(9oG_+iK@?`Ymr_J9+{{x;0MlD zuGLI$AMf!$Kr%Il!-ya-l0~SUFto@JK-cGUmaHjSt=0ewi|v8;^CCyIyWtA zJDzk{ux<|fU=Y$oSs-aUgU*ezLP+em5za*9Xz{+8#~x)#Hnf*bJ4J;T5dvt0)oK6Y z2y5tgqA2x~M_>VOX=Rf1B$27E0nWfE_($%}AglCgjc6xPRB35(suHck$W04;s;y2_ zv|B{PL*Zah3Bf>c=FFO_eh4#kgjlRT68ia}-yA}rkobF9lqUg=F$)~^WkBF%`ies- zT-xUTWWj}(JWU=vx)Bmu;YEV)#T!sif1s-NRG?bufDU*os*arzG!9e-y>@eV-w;2K`0l`Cfne%Wzv#}G{{UyMSqruKOjO9AI zAdpE6h7oX5_E6@ZST}-8C-=2^b29@c%{hV8eBz-t#{1EZW=n$~&)@S~vlVNpCGQBP z>R3!FZpT+0NI|%D@EhQGqMDe6^*3g{Ip!m9|3H{kh7i^E&JM<3)aIi_jIc+x=E}&t zHW;pEt64t#CzSThL-ZB(qRgPL0-#LBZ$U=Y@Z=pG zUQC?z%F9d)sL;+FStpb}pnxki^VJv`$qCjr8P~q8l2qW9 z(_6dYhJzps*L&_{=dl0u2puH{O=biy|NmTOYwmd%Q<20d`iH}7q2_QQsmhU955uHq zVROSOb5`{nuBmZ!t8uGZx%M&>##TbCOW>wBkM9P zy73O`NN6kw>QbH81(HEm_!1^$Ey>Q?BG^cZMKw>;1|12mqg+QMElCm+%qcoV6Ye;C zI61LR^O~5q!&fjCY&pm2gA7NSYv>C0YCz1pQcN`F1!GBt0S?x)5Brxa!tzvpNZ6cK z=#k!2KAa{99lw?5g<>FBlogZ2D?+R!c%fxHUTR4G1#J16iLUdw%xjG8qI@1qVl;4hpW~0Te#}*x|Da_uR$yilH%$S5 zg?>w0lf>**Qx(FbKAE^ia!2#hsA(tKsE8j!g3;Sqr)eD#ed_P=e&!btJvH3N#zXiM znxv_T@H1}Y4@sca-S_ir?Zc;?Z4ZC@`z&b#LJp7*j$k+~gPXb_OvTZ_Tv%d_rs2Eq zwa4$e$AwcZ*OCXe(~dYCM8q5?;XoRl{52{AIQb+-`cg92cH3>|CgBp%Ohw9&c{rR9 zSLS6cv7sgB^^KOUZ^k;XV);^M9((S-s~vIpp|;0vZ?IJ>mfD(CD?_OKPQTT=^LOq~ zd=UPS9Z&>F1xtk~(mc4t^@N>Y@<(F$-a1Oh^-kZ45AIf|0_9HtN*o);kw zYLq`$A-pCI8_Xhv;JI^+Z;-HLP7(r3t5B$$Z0m|n0CJRz`UPRD;b)kA%JFu@U!CDg zf48zGQ+)NH{php*VYa%T2p#IGHAy6AVrSP#kkhq|wc0COk5a;z!Wl8E5G#T0pI)He z9<4xKL`-W8Al123Q9aMDFni!hvxlDLcn&kpGPC=iGQ0ONvnQAEdl6^uBWXK9&}1S> z%OJldsX2q7v$Oa{hM#8*}ICt1>* z+5r)4(ZGbh(Pr}nLK_v8G>YU`UfyRJ2#l8KmfcdD(>EvC5Qx5#pyHHJlC7L)@_^CC z2!zOIZptJ=KOf8<#@5#4$k;?)kKK4Dj6r=sB1%jqfRg4vV0MybAjyAh)jHq;3>E^X zg|y>-4z=-tXM*#6!0Wd>UkvP!s7HW%Q80qw4b!3uYPJ??lle^1RQ8*PfGMzA$af3L zo$DtP&Tjra6Bj3hZ9cFGChHo_loXtmZF4%!F=E`^?&BIZAZO+SGzO}Hsy?wfnD z?D*;DoogcqJ_?&v6qJ~b1PLti)Q|dz?hs8B!TKPFwurCq@dC}zYO|`hma(Vjs2zFG zM@dQdjMLet9dEPtWBUMLDq1!!{~eQWm9x*WkXArHGZg6~BL7ydx8$mRyWtz(wXYv{ zsy+GLADOKJZ^ywV_StraB8=ab_S$_H|JW}6$Y-o&2s(-xN{c04_^FS=C3uhV9l^&^ z6}|uq)lB=?q;Y;LK@u5mL?MAM+8S2lL%{=@c`f>^+0!m0Qa|mKDW|&DW9shi<~(XW zJ!|cN{r0ivXJ+>^Pd|xoa>z9dO%2er0GTe8m-i(w_cl86GjggRh#YOs>AXrZ zMdz%U%%tKdq_jw9YS*T48_PZ%nC;lyGT6BW;I{H5538s1p$llN60S8`}02g zkM;~U_x^jI_L;GRblRo=^jW*$lCQzY7?>M~03HAqu+2?jr>y~0Rxt^U>4+R- zJS&l}q)3Ip$&M-H*NTZFz5O=-vMa52&9%%+3L;L%kaC)srCNf(XnzXLs9asZAF}Hl z`}QxdM2ZEi6bD{kq9D(p6jzTC!Exu$=i8dAuJlC-L(L+TVkL=5gBpclX}y^Ld;QfQ zeGvwM(=wK|-g2K!iBIuf^0n(l`7mK4v%?`X3){7E!t#iJ1VB`aNXlMPz4J+;I{9*1=k&dt8Q zKKtP}FSf{KKl1wfdNN*WAYsQCxK6adkHPk&eR08cmgr{r6rm#8jW)HBy}ON&X051s z$v3`bnW>#bD&f09b7{fEsMTrZpo?lifKY>!-7>;F6r`RFqzRi}r@Vvcn$3oUfVnt7g=YlJLX$!8t-llFp z+uCPNvpj=iJquM1t?#oIOfp&CX>RMZ0S5A}IF(QM*oT}Sg3SnC6ZhZHzi~;JVm|b#Hg_`SI>e{r6JbtIX~}xfI%~_=6WX3x ziWW43APWd8I3Xf81ihNZcysrh1Xr?Ecd(c_%tpelCXBIB6lNKZ%8~$@O|dfTN9;52 z{yU5J4*KGRDC{l}50kG5c}+LyUkS?7r*>H@bRxl~L(#s7U4tg^KmYyT)-`*EZ8v?o zo6>rS3|z5nIlmJ=8(pTYGJy%FU-)j@L`Vk6`gI1Qt@Xxa46Rt&k|#Rv}Y7U*CJ zQxk`O(-PrcNduyeoi&sN)Irj4Ppl`w}ad+149blK10&XfsZ zae^id0pe2t2qVnElzQ#E&8c3PbYg_eC8ULDHY5{=DwstiZ7BRO+eE!k@2h5JS zIE=fM4@W2di!P3C2y*u*5rsU9F(C@oz%?M*T!|mDX+%gU{#w!!tq)*=M3NE*X8XoF zes!a-ITNFg=Ir_gX8Z2uQkXBX!58CVSV&76FB&y6Rf)%hDJqVogHXEN4%nXv7W$Zn zz1VtJvgCs1KVYwN>1bvvZg2=-o_4jf0%serYo#r114Wxk8>S;1O{E=br=JO*oX+nK z-boUp8j%LW;Egc1-M1U5 zOB1eKRb@bl185_aQ5@-$6Swt9^g$wlA9)5*4XJ*RyTfQi%f|++hCN=RQ9HD4Iy~fv z)gid~A<3IuOPJ&OfzSZVxF9D#A4;o0lmf3+8r382Jt|>A1Qn)t-k1K>-t_jj+8W+j z&rEiOCT7uQMwYCy;U|{Z`g;~x)5;->EbGNQhn<;do)yg2J%kBd@A~dHnZ?~jrj*71 zz!4kNR)0lfRfk~&n3XL5Fosq(1hZ^rsdsmVg8$OS#T?{7Rk)>d%;_C=@Y_zdW%)r{ zjnj7+?RtlU_O;eS=LPk~tC@kQCW&IJN!6116MU8GB|E+LM<@UjpA4!o#q$XL9Fgif zQgE|pnXu{+gu>3bb1bsQ?tDlD7fer>Ec2*COWYfCg!@NimH-zdJTMygO@q6q*t}zp zMz}-H=KC@sK1=R-5O}}@a27MLvBnYs1TD!Uhz>9Z$U6+YkGUC_?-WB$Kc^Y*G(ONA zr9}uAkDO9pm{$d@$@6+tW?5AM4Xh|S1f$sTDXLT%X@9;o+oVi^$RTe%xaq($@;S9y)f8;SuM8z-@M(9`p|oVepHkcf^&xYX3%6s zuJZ^;SxjFg=tnbWrNz%YXM=-GkOUTz^p&(WT?{-Z1JfcxqHp#D?4>2@7z;yfdA9_U zodNSd`lutV14grE%^LDy&JA=>!myZ#0}47Riwcl_iKG{)xTLJm%%m?yA>PBNC+dJz zm{Xoy{G6>ImRGp)_|uE+=G*SFtA2hnRs^j803ZNKL_t)YJ^bk73=rbI;dtxT_o5=v z7zl_WFj6TbC#X^abuzvDrwCmsNT^e9J7#6wyTD)h*dCR@);(GkoVc?c3* zk7q~`8aRqTP&pv!6gC%`e&C+g(;T(M7z9L%K)qJl%L&_HB9$tf(9xEemUhS0rmL;THBDXieHcGl)x@ z+1AV3;oJ#LFF{QI?0xpIVL~ZaMf27ZFIg{6%h48`x}6#BL(J*7aq=lq&N_(L5QDUJ z&UETSpP`LZS!YM4o-~AvX89qTyX@X>?c<(E0-}bcVL;jiY_vIUYbi_l77;LfWY9h^ zD+D{gg1nSxn4*%Pfx8POEdEyNCfbD%M`>#b7)({B5pZ56jH>L?^p8wjh~6GBaMI^K zXAKu zgcfp3tFE4OLrKqCS$Gg4r}mZjU1FR#0noS+F<`t^wa8vfT7(EO3;4b394n)>4igXE z1E3B(`8WV2shLl~LoK5r)2}9gsbopiGB+ltci9lj?+>=dt$C-}6vH?Y5tBI>?PYug z%Xl!RRso;*PBZM#bI+g?FoPkYrQM0KD_l-Wedx9`N>a@d(CTW(6m zRwv4~9^d4n&p+$!!K^@LgpaglZ4Chz>u_?XwnHQG`pb;NIFO*}S_v8^!i`|!!mEG= z+=->PlRolyHVvB6M`S}UN2RmXc0cr>K+vSF1%$pLc^Gg#`lBDP|MSxy+G+1U->NM1 zI0Q|SsZ`6iWN>(=iGmt}32K)93BdRNTzat`0j<*ZuT`R>a%egUe18eT)2lGH0^_?1 zz~fvG5CW@v?a;yJm%LyPEL`Zj9>-57@sYIRyUy+vaLlgP>E|05)tAG{#BO)t8qPj~5<63Cz# zgd!~J@WlUP?>)fuy3Rt~HGM`i>b*Bha_=?ng(Oa#-XXL=APIyU5+J}mJaFOA4)>uR zIGn@fp8F&a2nn&{Bu?VE#zk_sWy`8o@4d}vG)?z?zx}V7Ut>ulX>66`U(%kv|6Nx7 z*4Nj!0I&uJdCkf+|H(%Id{#M=@widb(u^t7(^L?Mox5}QjKL|5V{a}7t>2xo>aRO4{Mtu0)l zm^4Mdp|-M(PD-7bOKL0k0S;h}KBrid}D{O_B zkI!{C#CnArF~PW=)KFt*e*i zT2Z40Qp5|!diNmtR>K6fQ#Xl(sRMX#3>ZV_yOS6>GC4|^;L(7sT|3j-*H)%ZHnE9a z>gdyEq6DPrj588nz=JRmb_Xf}JjNK>29je@%x6f3unM=HP>qJlMvt_i)Kz8)qEID6 z;XBOVc96E52g4ycEMN^e$BLV3&o(eloQ97J{-pkq=+Ce1I(7A)4 zJCQuk>PKU_3I5FrYF(?#;%=6||ADMf0H=rxjr61a5F=fv<#k z(_e0aRYe{e_l;CLTy2N_BCI(sJHRFGtcVsRO~G4|u{DHx4K_a`R#mAviG?M!Pg|i# zbob8m>Y`WDAq>_=$sJ4Rnu!-(NF8AIWQ@cSEU43NR~-b2Q3IBZJX?#Vp$^GdRZ}~v z#T}@*o`3$u^vD18&(gw$ucV*2<8A5JfBg$-(xgeDinqM5fl((_Niy>8F6VU+2cGNU z6!+;{iHFj{4<33n{rVSvH=TRYCFxuwIi(`Q-is@hz$GL>Ana-TRqnw_P);D+Rmwty z$(W;v%WZ7cw`%#4wDi@NQUmU1*I)ORbn6X2kuJID(llw@NRSY~L*sXV05@;hlU{h~ z#q{N`{4>kGo72z#{72I75GsT1#UT!eHgN6TbSia@Fa)jWKWPaodjUZxw4n)t17T3L z@JASLs(7%~#V0Hvq0V|kIN;srQ%7_GEUKx9hoX2|jh^lRgNR@WprOx%NOao?)F1#% zgAg4PjguqhiO&xrxl{|Byrkf3R7h&eDM{Qo%!4x>h6zlx;91OgJ5Qd z8brao;mnMl8EXIl%4z|cdg%Hm-)AY290ODNSz=_uc+`z?PIZ_u;5(>eeG{T6+?Vt- z{xGTZF=?ltVxkMI+Fy9r@A;UyMt-OXVr4pG*#q%Zdax9S-a}m8M4rOA#6)D^bN#J{ zAdVkw+n1_A-hm)_QUf5>s>kO2F4m{0CpJD54d>t{fUXU}_r2?tS=*NL4sJ%WH6iC4tbf#_xe5rjr+%BK#q7YLCc5BeD0v11<0LV!_GNBd7H zPeX5gs4{vGD)*qG0fEXeNGwI1A{i?!yaOX?SBc=-hwMJ4RAGD~MmGqaZo&0Ry}nC* zx*S{1y0jLf$ZenHcJ2gu!^Jw%-Sl-0+-eXF87`!_gH<*J)iLk4?%Ec%!&vJe!IUb> zz%d4PhTcB)5SL<1gb%`6IF`PF9Y#WS2qfFe8$-xZI0w}*-q`>45idzemiB8@w@jfy zSg@`=&X1@w<$}y4AaJ0m4dNvS+`t@*g|b`+%rpPHk<1MBQ;T|Y7jtw-!wB-m<|!mI z7j$v07XInqc91AofU-o$sBn}X)LKv*Ss6apnQ>mf5kn|i>L@cUc}E7V7LMw07>`*?i8GwECR z-j|+!n(!Y(+*7+gJwtq@Nt33erAwEl-}}AaCzQtJY4X%5d@Fra{f~W;aS>l1fLYZh zA(9`)xVs3})!?cDB@Pma#Y!`x7nRDrNe-I6{ z6ee*@CMUBP+goHP<*5g$(T8cv#`S6OqLRq? zF~HDNkY^q5H$mmcj+>OuJO2U#MU8~P*q)wwW7H-ho1T3J6$TV=;>5{m2OO0^qF0eRzgj1h2nT9ak6Owt2y6K*EsxkkH0%(1z$&B* zIV7Vdia44;U}`YkQn8x01;s^gC&y7u=Zgf~7eR#OZ?(@o=+xyT>gW`EBNpEAt(;Ds zlMLAD0zo&bD&wE7xW++}T_~rto5ZTR{Cdm*|y|@-< z9weJst09LD;x|089t<@`?quNYlP>g)E|Bwk0ZtWMaE<&{f4(1ekDe$80Z0wmhV|~? zQ@yfk1YB3iK;@jG^%Uyf#DH%si-<_6KqO0&!L$wLg zhy|6jORu!pCz-;1rxR(R3V;{k8M8-%TL%)Mmtp83=n(L5ccrd!{ei_e8_-SxtCR7Q z!4S43NUca6M$SA)f9uiV!bZE-$1ykPvbaHhj(L^bKNIQz7`q4L(S_C9ysJel0u?Z& zRBFiW{mhF-#!_#bZV{evM`rD)YwJWT0KZ+i>kN(fb-~oJ`wF#0q1(l)gd0#V1rP7BEr&J z(fK8z+5=G)t`J0v{sK`8n|d=@*D7FBeY&B;JD4B=KRi=o;9L;wa7dYzBuBG}5rh`_+oUy-qke*}Dcbc<$ z`I_{#uYDu^{eS<*bniF6jU?3s?i`y|tXP>QLL6RQvN*M(g;)d*mH;(F+>0;6qa3 zzfCT5q~IoeyAs&IVw9BjfZ&%bekJYLvN7Fp`)%o$e(4iw`m8B2_`5KSiY!!9DHYT( zaCKC$9ixO)?e^R5U>vH`-~R1?OONBWc*SKmg$L4?zw|HZp@$wy3!Zp9ZQTx{VA6*4 zOlQg5O`bkFU3b$B>HR#KX!gYuuw+4}goHhfbZm|jj77D_s^H2Ng)E?hcwf`B;rMYkBP3TMSFz#z$G>!f_Lz)gW*3XTAa9)2_%;|G;%s6 zS`_^OB$F{zdK^fa!mKP_q#km-4XC}``f(>xO#_H-C-#O>a3CRRP?kE*PNcMm`J%TD zr2xCm*CLhbk?W%#eGH*Gl)}`DHi!^GoYeqO)Z7UI!g7BIBU)Bryxh~hk5CaqSiw1p z>={TJV^!_rSotl`39S-3&f$Q-8?6wAW+xRn*Wx)BoIU-;2teR;>w}8~qb+ zAO6R0&9}&mK7=s3@J$&hq#*h$#)kV~i69Kd+-bvbUPnEZ{s0W-E3TAG^5A0WtCk_d z_!2`e?QGD7rD}w6EMz#_0VfEYN8mn(uhbU#VrO4;Hh-<1^H+~7gL)jo?j?8HhKF7q z1ge8MQLhSCqapp+1YGQ8l$%S8R0rO2MU-IUBMrd;1`E={yjTOBiLYoUg`S($LEIB)F=`!A>QI3WDVpZvFU z{&^RrapT6pNcW^oTQ;Y=@3}Y4pFck>e)ZM#m9Kmy?ZPwe&O6_hF1X;LP$|)!R9hwv z+ystjM1xWop5cGM!v|pslrTKTj~^fE{=GZ5fjdyA@_sEU%|qZh;jMaYBA`q)Q56a|L&187>#T!Y*} z5VM2afL=|?bpQ*xoiGHW-O5!f(qH}6U&ixWZn-r*_~3&ju?Z>T+_@24YQ~J|fw*_0 zTim>Pb9(Ht$I_a0s~OO$bnSIlrGNZ~zfL1rHN795XdP08fwkmnoyxT8@B}7^Ns{m8 z_xQ$FA*P2t*Yl#_42lo>0v6^Bif{a7-|%^F%0+w6>rRlM?|`<78zRKs39SJod9#+TO>BYhT(f}h8C zMLyP11ep8Kck+AQ^T@w*y)r^J8|Xz*F4xw{WLc%l;s$@Y70+{i`5o^IORj^FGcx%% z+7iE*qhuEEm427!?R`@|7r*-c`mX-pPA2==?N_4?lp=(uv%c%I>*Jnk$b9;TNrpx476z|J5`@Q$0Xs+$o$Rpq2o|pDib+PQC$H<@O<$YlvC|9mH(i*oZf_OVL~c4I5~-QW7X^dDcnCw=Uv zelFd9$J^4pdFK`VBO@gNLqo6=wf&0MUQ0`sEJ^FvuTNk5kAH_aT#!Ed+0UknFTS|I zwJ;p}a0=1}p{At&+6M2tY+>!%wdp^RR{rkq{~_J});rULX){pe;X;mka|4EaCApf5 zuDo~Xq>(B*Ip7N*40r^AoWJ*-Z$e=Yq~H0i-$?Iy&pU9?fh!TvkkfnM zy4~m1xFGuGniOHAs_MVo2CoZIrya3v{rXKv43DNKpIi`nvQK^Lv+4cs`vAv>P*Yu# zCQqEi!j5t2oZ0izWtU%>uD|{!?8xJJ_W&_O=BKUOHm6H3yC{v6!-Vn+T%|chZHoaC zsgxj{Qvvi2OEENF^xbo!J6x zW3HF=5eQYs$TbB*u&5I_{3hza+5RcMEr>-R7wbjJ&-yaYbjpi6pu8>- z0LLZ}o|D(>QaPTBAAR@y?S0G5ZI{uAcYU9fpZku7zk3h!FO7xo=69@9zVEv^Z_oaY z;9|sgKf|o-EcZ%J53W`OP+Sel4545NBdW?Z@`MWniU-U-lRQ{~@yVAq>T`Dg=IP4D(0$=oL-!uV49Ensv_k>HY8jFbwlWXk75N zWE)WzT3Q|Loh{(k@kkUiXPuKS!stC~=8Saz{r3~8^#?2`8I@+voEhpZnE-LI(t|`o zg5cTTu7%N6R=4WyXoFgqXsKdixt`5+>O%+Gv^b1#3toyiHN+7mx z+m@bM@B|rmq|g4^XVM3WL0*N+WEbL;y3~Uh*NhF~ce=h7-!sSzw)uHacPsC|idghC zE?Tbc`{|$l=`?rl+;r8I*P-S_EyVlYcY~dx9=JC0djxAKZoA{HNEh?cKmO0IbkDut zPIt1p_qN+_LX<>(V-G7=k%X@zl}6VePN1B6uX|rCU?e|3nKK;rVX3!_(%rJ+<4#{C zix(ua{qN-r&Fg5-@;d{abA8MwUzdNA@8^01(%=Q(eIv>*FY67yw&y)!2&nFfp5tR- z$1#e-KO_i+DO~+Zx8g=`|CNn-`SW<`1pf>KKLceK<5YU799HsmJTK-)w9!{f^Cf=g zaX(TyZ^ZcLKFjraT{(1Me%8M)ne%-gW zJk6LfBXF+1SWcJkz@5NZd2`e4;buAiew%kflz^587=Ed5F0jZ zz)kD<^rwINr&MTi`oll`L!t@Z5KF+Vm|~U-@QMmjM>@bftf+Y?BF&yVFTM5c???+@ zeF5oXe!B6->md;66eSRFNk>et1Mmz@0|4C-Gds#n+1B#xyv~#2h@X_bO#6B#$C2JG zd-X_cBM(0Ka5&{$b?-D8 z>q=p_L^P8&Jbr3WC)MM>zi#!~wD6_pAQ=17uYBe+5iZu%c7|!F$7r>0?`|m3P~NW( zYGmPxG`dpdhIwAKYE}C4KmT*Qm!1Ks-Y#X}wA$);W} zA~T3G`{m@l!|HZ;VR~2%ru=@To$yclP5!b7!(9NK_xv64`wy%831|PNe{h)U;bcm4 zqN!N1otaPu(Ntksde)ooX@H;JvX6F=>*Vt?*z$Iao$!~5T^P|!P(>T z6T*>WU*oxZ;}F0t%=F{*bOfVceuLTH?H4 zI#)?i`0XCGdXZ>e6iJ-unQje=>jvTG7nG`0e*E@+ARoP3aJ$IwmCl-8MZ&pUeWGL0 z88hZ&>XY+1p0l&d{;)i~vOL=#@!NXXAC7q_8c(i&j;9_2wezrg=K7V+_J7ou-@X0q zIGn(5kz}>)r=790Am962xbwFNEa!JR;O9tilj}3^S+5`!#YO-0&5z=@Zm_mIkJFnC zf978fPceU-A&w{gpX*oNF2|w#clkIU&-^_W{PeZPeik=piNw4@|*Xq-?XJpGs$8kY|e zL~J=!Y-hUWrt7ddyf;)%N)HkebywOHMq(RSvt~_516ify*$uQ+DOo`e?Hj-S+rORO z`ObHSl;S(;#3VL0s*|`Vy8lTbZEz9o)kPjG+M%*iwjew-KqI$nBU+5F;vzcoa80KU zuOpBr`{m)m=mFj#Ky**f;s&-c`E zyQac=S?*yIH0mY6qqfHY;DPF!0lYk)T#o&PCNVq=ea}To{?+>CLAGBX7RJS#4Ar4DTO-q9e%wDD@FR@o@{e>D zndJLXzg$nw-Vefu+h}f==ZJ5_*)I!AWr6NnzTIo8=(d8GOe1h>ca97r?r?S6ud&LBYJULpvD+6R|zaiQuU@w4Nq zx1A9uG+DWXpn&rNH~Oy9fCygP{ENT%i{a5EbN+At_HTh_-~H})heRS%Zn7L1_0agx z*Ty4@#fCT*;e#1C*RE&XnMfIA3%JzcHq%CkinVK2;-y4H!=L&{8pU3*#)D^ul4*PB zt_(Q0Y15W4PRF1JE}YZ=03ZNKL_t)MWu{2mFlyg>@4Z1BjO_W(|NPHE*+k}+<$E^T zGNoW1QZK!p6hSq@6!wQg z3@eh2XUoz*BT^s{nnF1y+Z^I;kqOtudna<1*vJJJ$xarb3f_9 zTc9#2=EYf3Mt&z!pZKo40J1<$za92zsocJNO6BmLQ6F7Aq(_UPom~MM+=;&f`8f0^ z-Y>7K2RBY8pJTP(`WC5l&c9FKECK*SMK)DzW>Z|)XT>-a2rK7bdhb-iPXKnmc9y}D z5>EEs%W&j5!c-LKbg_=qGgDNLsdneJj z?SJvGxYE2`T-OCt;rfwUjnVE+D(k2n;@PL4O8bZr^Q*u6#Wa2D)L0295;bhIoW27t z^|3N0EADq@E~3{{>35u;CkHT&cFP8ok4aH@PZ+zbsy*9dCc{e!B0Q-(m$Si+5B;o<#C9aq&rh4&VU796@AGL-{9B zWaX2x9ys0OH`wyansQQ?gN6T-DzxmQ!M6W&*T1YOCwU2TPG}Hqw=XYzF^!)vE!HNe zB^fqsB%!|dhWbZgDiAlsM1mK1GL{w?;i5ipq-uC^t5S!^-ZX30tn?Ru@fYcLe&=^s zfA&{t&YU^1*jPy;GxSTBE(-)Wgb1>R*D(B%M5c@U-Fu_9m6%2%dxN(vXYqx51l;ix zZ%x-+eI;?u#|?=5R1@voxifTIQYFP2jUvDDE58yI8mQ+a5(UvvgbJlcR9>#gPHAGn zhQ8?gk!+rO`kC~^V?Rt=Ht$LQkzlHwZ?DdobmnY`gP!gN6UW!q;Hif4b{G*!KIq(L6wb5pZEA zK>@$@&AZblfB9F^ZbA$-f~d8>XeaY5VTgs3;7R@me#~QewDSb^qtFJS6!FJ@{Kp|x zXb6`mDXHus9F9=~qyaMOU1nU8^TfX_A|=!TUQ2uT93U>o;?PUI^{sCOxz8ig0Y+ks z73CbVpPTYoaYnntx^?T)m%sew5M4g?sZXUVuDBxHSocwZfl`P~sFtjdGDL`)plt6O z9z(19P9mz_OXuy}x+7hE`Mfk^+9W94fi#je6xHfjPcnsynQv{Q9Lb5EOWL55EWMCG z{P;x6t-N21*GYGL>BG}KeuFK4ur4SU`LwbJubrq_c#v_Y`6a{HDov31>@x8Iu1nKc`v zOO#JsP<4UrOY&SEeMwt_?o%%PzUQ8MSOxh0^!B&EJ*0wc5b1mS^;b61LtTxMgh%KN zsU4SyOKikVOq#FU_uVxAhmWIMJC~@w&hk0OVY z_%n#|bJ0J}=Yb~3KqDe^HmEd+@w41Pmp`b=^YI|+pS$j4&u>WkPhRn zgijwfcTR-#o;Gzdky=-$2k!qqF_M;6HO9{;#!-H7SQ5;JUqf5@u}b3 za?35@St^dc=9+6FRJizgHMU$;O4+-q*N#PAmcyzCE#R$b{f4z^^yraE>0#u^(Ja@7 zViBd#4>T#gj?yFYn6!j1U%ot+du#l#aE&JV@XGmH__30eun`(dRX0f}G*a7c7tih3 z#y+m7mA>}x|Hl3iF5+vIiYH>T0!Ct_b_nS%L|G+rBZH&jfql_=2$cM!h&+H0;#=bn3R1iApth z#twW|zzdHfzdsG-7lSfzJuB}Wd3yC|8&-W zufT5{pCNWPx4xYR?$ExwYuMvgF> zqo#O=_q92wR#M&c=%bIa@c9E#j#9*|xg!Jjx(1`bgS4z9v4jm`7uutB)mL7QEfiMY3h-Avu_;~I%>`_P$+BhIS5EfKi z7^vM^kRJw#LLkAS&88Xcdy9=hQ2q2zu0GC5BZy+lop;`uF1h5A@WC}>3pHY(Zdk`k zu}aXzS-9EiGTp(>OUsrlC7i}L(|zCiPJF6q<`s6Ot7nIvHnwJHAxpPLfTpDVz<~T= z|8%6jJKp#D=XI>#N6Pb9@ArRpq|6wP$!a;3JEw28G8hWl_+qe?n^d%)Gsg?29# z7Qkabx+t%JtdP1KA6ze~q)v)s@D=Ko{PeMpjk3Ar4WE9+4o}J0UdGy%`)1 zAMO*cHYM_K@9W^uiwM~J*`BqIkKGY&)I`Grp-#g2rWSm*Yu|ph1YMu*{?C6;zx3(P zP^PP@(UyRRLEqtVq=#oMamZa!UO=b#xxmqdRz>{EB4;)%t7`z&BTbASKQ;t`mtTIF zt=|u(u@fe-ahZEzvo#WV*VnO7*(eksQI|f{)`KjEqn~PGujNA5RmT>Sd)UpY8AR$X zOId;ltlL`wLrhpz7qW?njRPXJvO~?sl*N?zag;xPFHvd1Uh(9UkEd^Z?d$Agy&+A* zQz^Wa*nO=!bZwFYU2Y3v5&6?KjZF54r^En8Xashps->Fn)+!;yPmJ4D2$ zi9;p?eriMI?)J4!?x#%>Zy9KG_|TSK0?}uN6i+LJ>k~vRmGn}K+eO4SI5$Woh)1)J8lAaw(v+2mmL71drs~pUXH>tJeKP3 zJ1#Uf?|2{3by>pZ&0E<4kHvJ8X0y>AA&q$7cf^@8(}wquiK=BMyP$5bz4lrlcN?Eq zXL5sHtO%NZxUIIJ7UyE;ef~2#HcjEdi+x67#8xJ+K?GVbE?Urm>uK;Vt!~ z8CKF+)dLYDhv6$^K*tg3f#7F-sV7aHF*78Bg9Jp|jw-baIFM6ofFY7|+srnPO)ZTv zF@}v839K2LtTXKe9z%LyE6!di8u&9YkNQ%8W`#)fb;#LuRgPPaRP!CXiiO0@Ek)d- z9uRyz2(@KsJxnbeKfiMlI)nrn2pI>@GNhpAKCq@ zQ;sbc*;6LHBatvkDBL2jr~6kjyi}-P$VYZ0>=K$?}MnwFTH} zYGI#wQV)#70T@hiOdZ$aEqBqZM}v{m;h<3D*Qh3@iwLQ}AC5@iqr#3L0`63k;T{Ya zrn`fMm)i$-f#>RBU`CD}pH{8eo;I)xr?Kjco-Oh&k~r=Nb)=EWPUYy1ZHs zwLY<;8lvDkSVIZ4ArxirV%x!?$$$wFzMm=>e#s6XRYl8JeRk-aEUIzQ@K8S zdmz}(e$_AVOTm~L-C8e9G$Y^_uhr>`XT))?H#Q1&iAO0o`F^;v8wAx>!i@!|uFAWm zSOP%K+t^yc70fwb@u#?}(9D1vu?275vOTr68Yp!X__aOCb8F~!wnH!q#*tFSljdc8 zJ;dYf*iZHnJ(jAcVdNJ!I?6Qpj_>Dd&$ZsHVYPG}ORazS_+$9Wo|A@Qj2Xc?gI3&2 zjVybthfom>$9r|WZDC(lvw`)jmUP2b3`TuS1lZMf>_6o8HsATJskuu31g}# z_w7@Cb9gG3BsBPnbmi2$QJHVqv^jFF$CWh#;_1f(0yD%#&=!#x6%ltH1c#b-@7_x} ztt=ZD5loI{i#Js-9Xs^|QOg8E&54<>TD67~tGM-EB8j7|qtZrBnNZZqfvXc6Gj42p z;Gsv-?YG{RuDM z;)-m8Oj&WMww_BSJ(>C^2cwpWY^N!W*a5DOaKmlu@U3s(mliI174^cf)G~Zn5Q?Fk z^+fP}w@wuhD(UR(0gY)Aenngpi_fwPf!Hy3Z-7W838IQn0f%tY-o=XimZ2ll ztT}Vplw~SjBZN8zW>q;VNjib*n_6Of+x> zMWTq_IZOYjye^1DCj42OkR^yF_C(meV^3;jmGkfsW74F_)6-ZdF5W8(2i*^B&`uLnNDsYrcaJ9aZFc4|`X?vSfLB%k|f% zaTBM2EQn5PXbxhZ6e|+dS&LZuM62kT%Ad2N2Y^WJ0W+KLC%#qS1W^kf^KDaP~gmhprYy6Eg+C z>P^M9h(u2DP{2>`!^*{3*8`5H$hAPQV5n#TD3fzl+RNr-^VsHi*|HVsd7?Yqb=SMV zJE(uKZRx)1=4r0w5}tzD05`gYrwm1b%g6;>X2|Zb<0quKgfe<%$+Fb4Wm}p6u`!%c zHB!MY)at4=g<;iFYuBtNgwckGitXk<;z${0%Mt%J@LOiw71bcIASzZ|Es{h*$y$dU zjLd0Y>t2|lrqqnb=p&DQ7l|3W2RKlz(N5-u^~}j{a}wuP@5J4yaYze3-$WH0IU;R9 zM>hYdr-&1dcMl(`x3}R|T*)9420fIls1uwnx}7lao11 z7(O>?kU8g^bHWaxJ;FRCB$nkNF)?u~dY~3Vqdj5lkT7Pqw$gaiS?HkmqaT#0JpAYr z=?4!!k|s`?j88kdHahB1mAf^0&>_5wAO$#Z(6-9?EbIryuDdjjOpzE*w@!@lg)0Me z!=o+W7|x0R1w1iPp$G(N8K@!hL7A4-4a|5B*r~wJ z**Sk={sSivhyI6w^u!NcMgs(IAq)`+@kV6~r!n90CqCaA`vm9+SY7 zuqBREy|j7rX1?1=Fx1iM+PB;g47B%DtD8jhO0(ioaiP1zxgbv!xx2v0aEq+XPa=_- z<-os49Dd`XJ%4NL&csSQDUKC~y4G#=+BNCrR~JDr+S66nTuTJmT~YqA{#46V8B*KK z<)pfpEKfW!Kg5vC<=3Fox4~Af9;&GUTO{5JVm4x{2>*^d?uZ6H^w2|rw6ki+PRo^- z$k>@4=4V4~fVPU8h=IOl?fUec`@V;dE-tpbYr`zV_j9K!cD2JTIzTy@k0~S#+Ovo6 zzx)0BBZSEGnX@4tY@4cXkk`yNkO9A4Z5R{3az11j@7oN0FR3V`PPSH070x1*`aSf*yx@I`V3LKrK^C*bE z<6C~%mg2YL>*BZ$IEzuJht{rJA0C#%kT9a8AZ`PS0yl~uGt(=66xV1=HNwP*k;7p| zQkpSiTDs_>3qay+>7|!miu^{xoHu}Db?cWXXv>wsmN*zZ)#QC)wicIc9WPv6VI3qI zs+=S!5(d@gN+3!O9tCc!4lk&cudPlGKJYNxNjImlW5$PvCm1pEKiZ#a5xJarCkS`^ z#7SWgac_s`Uwi>}t2PStV=HHJqB)`bt*t=9B9U+{ghaxPgWQukhzZXEY15EQ9Bhyc zvEqs|QdK9X8w|~!Jv&KYq^Q=*PVqa-@^D}*&u3Ci&mJw**f6q@ryObmg}_aJKYAF(83l&u$FO@8?0q!#QPgItmFIrvG24E}Q3 zbLl7EdI!?SzVsM&-$gIK6ao7H+q9FY+WYqGPFG!VS^9-v_yl&@2_XG~sTTK{#H}8} z{YY%TStBDp6_<(=t%K4_RvE3|v@t#Y_!AJGZRxxV*lPlAd1%Y9$nRKxYUW*b!yk0A zYN(3B8dw(I!K7NhVSVZZkx!X2DfXo<{K*SZ%8n4px3!_qhjSYWcP_%WQU-!@MYi$A z=gpf}EXW|=+=)(3D=c-jbIohR#!W~B9r*Z;hz33T?6a}DPouYzg`Mp85*p9){V1NH z)P+8-i?i<>IB+m@%8Max|M*Y;PZ-&+yy_}CZ-`%n^k7E>N#K3Y?y>DMbTX_QXJsES zY|do{lOdHZkR<&4z<6kgg7xdyrT4w}U1{FjIlPLUN|D*|2jkZOf88(+4M@OSw{4G* z_2Y1q81DKQB#vx&3-< zS{pYK{S+X(^pcB-)ioS^ggS@yRKk;zXg9b-#I0S-7;lXjxVeqm2__a?){VBrFhDXR zBk-gg3DMa~$cv>*mx2@J^7o}D9({<24{hnT+iyi>)e=h$)~{d7nlR(zq0)y)SVM7X z7x=InIM)EJOLje)AZ;f~G0p+Y?*Koxf~y~Xday;ToCG3Rc9(!kCkfW zy2O#S>TGG)B*dY8dv~Q*Uwt+G^9!c5wPqB$2!Bf1M!gEZ$_jnc|iP zl^0)pF~Z5(DT-K%Kz?h*B@EFxzPB?MEm{=$>A@t0R1%TESdP(Q%_HmB{5Dfhspgn5 zqhfH#5HExFv=h%IC6JZNm!^v^znTb$ihojcx|GiFdx?oDILH8o_*waLR`!6vU2<#n zEVmD5RLvw7mSgfV#;zQ7?43*|nGKDD!h-IKwY)zGI5lb0^4(56K5CuaPM}_D;I;5m zKB;_|IbJR+>8$AimCZ47ffGQLG2T|cZ#>=2OJ}>CL2+;6gbih!LZPrx64+oiTM*sQ4Q&pj)4Dh%nV_S-5(y16aOA^ndx6 zf0=&nXMZ}~ddp3Lz!kTgL{`pk_EUN987f2R!Oer5c!mJCGd(0EBKD8~N`v5aPL}UC zo+Sq6Cy{WXHsYslr`tJpwuD1MqCv+FI3MG<`%diKy(cZC^Pj@NJ_5Cs&m1)KkmS-z z=}6Sua^x12J_>JzT$9TAZ0do6)XO6jS0On#=}TTCy*3B}@5$|X$muCP=!K-aEAuWU zbm)>n{=Q>AJ#j8VEFaz{5(f!|XP^oj#NhE-dk^SEG78m3_uaQ(eNyj zrc6vPJ@+imGz-#AZ@DJmL}sLswGgdnUfR%NbP%d#&6+iV_cS&e?fR)_7Npl!tbzLn z>%fr@Lo#slo-w1xrAsfqDE-9kw}oonH92nRGm${0JGXB`!WbSncGIR!Y3t zws7r=fAQEWue^fmK5n>p;fYi0aKsT`o_F57(BceX(ew75I|4VKchN&T)8qT zEArNx$vvsH(mUzgWlqE{!nWdBk7lK8pajYHlrYTO=Mofu+tI65t_T~4#%kl`Xz#GY zv{Q%{6C&8I001BWNkli1TTZ-i)#GL350T(NUEsUS8pq8Gvz^$trrwiasFD56A zo^7!jo9^)aM)K=Rha-)?`<1J+x(6iiLF^&-0T*JGP&RQ=Dut2Yk5R34Q>{hK^YY7! zkOsDl0C~R1)*s_fUI+k*sX_^^>s(8AT$`kKGUCUd0zmbg^Xo7V%#p^>@b z{;^ViulyY+uj8iskz?hxTvR9V?_Izo!@^)kIO8s&XgU)*fq{CR85q|V7$Kv(b~71N zDOrU&IIECAsF!o1x*B2w&={*p8o~@ApMv2CSUHS{l-I6ueKz!f?(Gr;iG!+!d=7^P z?g&>0u#q+qxUr|RCUp4g)~!n4|G^KCBCf+Ou{misRdXQ|t=Fb5`|rH#-EqDMu3fm% zMqu2gSh)q4anZ)*+8qKM~;cTOM(e5 z!Q#y~--s6GlVKZv{`u#@ldEB#m!@@VH>4#CpHGWnqNYrqnx@T|nQEI*(<5R_f6gfz`MXATpmD{b1a4y$)dY<#V4V9K=Vv3lBg zBzB^Qlr1M4?!Cb#35*@)VNxHcokFR^&L4`n<}-C|dQdH45sGeNFR`d);d9TVMq*64 z8HSM&Crz1}h7KE^X3n0IYB3V+X0L!IR*^>pSO&p57YL`QwfUC+F78(To(Vk=1S2MO zK_KM#YXo$D3Nvn`qVt4EKcoTR#>v)0NCWp_*FK?CI(pcch^><)Th*HqhU^*A$@`Fl zXfi@*%obt7;E?KpJ1Y#tnE(zaU5D(YR%GBv!yxiQLLpCK7@sf(W5;w+oQunrFMBn8 z_q*Rs3!Z#Dz4St{-Et5Gv?T^ERca8PRI3Yn!b^ci3I;SJlz`p%bBwxY{MrB9_en4* zio~TP&XqAzGvoQa?|pCJN3}0{r_P^0KRx%{b7*H?W9QCAY4rGsY1{yhH{EvIZ5Uw;aJ7$xA&Zl-N2K(-(bXww z7%g@hVK*jCnHFIcVzE<+KuF|@!GuPZb^LKxxbor&_5c|CxKe(vm@HZ1=!E#IyVaN= zSJlqG4+mj`3|X*u-|jSoH9I2wkdToSdQb;wkJ4_Xh<=b=wK{-dH*Xn+ue!n5Li(s} zWZPYK>_P=u7^@);!U#ri6RZTk`zGdbHKFp-S=R%ZGZ%j9aOBb9K|84&y;9|8KJ%G0 zbLPy@p6GcgOo^ENPTZ9>DE)Ct#x42&$#zW6r~G?yqXf!&CwlZKw8;JSn;*t1v+`^OtPxtTks%+Vn6~R!c?Vn{WVvmcfIRfh%>`Nl+us3u++2S znhJUNuIKVbmtU7R;&`te81wMRd1qqe*_DeD4&U>)1LE3>abpXwl&i14HjFqcmcN!> zfml2-|EcuqlEvuaR;NoZyPW0jGg%dXxb&0joX^Kw*UEdRx(9l~iNP2)ootF?1m8M{ zL^D!t9jYZAjwTVpg_#Os*K-Mb1L`4RMf*bswyx$OEc%3KphW;~49>TM`|W86+@i+E zE?^44gQx)4oDG=}iM)lkuyUX3W>?BPWj&xh)K$)hU^+zjM)wuZslE8%``?=`IPd&k zX;bGNr3O>RiJnavk>|7b-U$3+e&*xhb-<*Vle{Ov^1d+dS>mQGSYmeW`RAo;uYXH= z_PH0+zkKCCSg5xnLegjeSAFZZ0}==e(g#;+WMkE{*+HYnjt*mTW8TNibIBT*||bJdj*FX|cy-J_2^k^b{P z@5Y`oKiz)k7>GCv%BE_Uhs#zzh>jJ4PS` zz2FLBqb|4_X*C!j@-qr@MTQt~=+4p?fH($Mr-hILfE#uk3tY5^5Eb6L{PN2~RVh)( z_(Iso_{w|zQ@)qa;>y9KjB9iG8Gq&bN)Y014;g8_pnO-nYLL~L*o~{fk@wvD?X(A# zdktKbF16N5DSbc!VF7YZHr&D$T`WNTt<+Vo5L2$8XA!t(liv&`+0fi*^YwR@7R)y` z+mJYMKlFVusD-<%onk%rxi2vt(uh%L_N7MRkoZq5u%ER1gc>Dy|dPn8cUDl??ZF42}C9cQcRI7hWH>1`jBg% za2dJCR03iJJxo?GS3GW<GvqP+iE#_=Vig8gCliPI^hPXBQ z;(myQ-!~G*ycyLLdWPOQ=Z?0TxgEA4x923QU-|3=d!RtOev}Dx!C(|nB|`3dBRCuY zazD0)T|2koNU=V=?b?A!?N5h@r!*8>lT5-;h{b5cYT*>{0GN?P8*} zYuCr5_~C>1W4jm$(@`B^3EX*W7*c3$jV{qh6Yy77L-?pL5{}i6c5Ij*{H)I$>_ zD?V~#sUfIrBnl#7@skKxM66U{;89gNIf+ZeGdY!C=X)o5?hk+d&UiQDH0zr2v&2i{ z;CoS5>?*U*nTa%U4t9uj1@6OqVEqkpd0YgdhfFQZPC9_$E>j|rw=S)@1AT6?Bdmax z%J)vR;rV?H(dKXRY{hc}t%v!0ICyqMUCD(}&eHd#;Og9p!2n_4_UeY++Ew&_HV^A+ zoqgYP?#$wwT$9TA^!Gq%a_MDf!k*9oTeo`S28hE3Cgj$T4zIuV)>t2N{`u#ot1iC+ z6;pF~Fgdoxf;kq1LLm0+--myAQ;hp2LLLN6Acfrj{RdcFv@5Myw;?_M{BvpQ^ciX9 zjM-^81V+y#^HFqg!CfVt?LAO}C76aIC2>m)IHINj{D9ig-)=Z19ul{RXT&=)&*BU3 zdlrX?TTB5joW1Y0=X~U6@#0DR$pj(i=kM}l-Nb9+OyBXjguxVZf%|oYSkl9<0}0y@ zAxh19`VGOub3g(SMj9Hg0Y(bhg?=|9W;?|W$*H_@R>sa8Y_ehH$qvmOZ^K0yx*Vbf za0EiU^Zh(^B`|W3daZ27exlcvDyQe4e>Qe>^1dOXb6w5fd@JeH^gxyfjuhs=8aNb& z!>DJniI=;uCM!7v5$FDbCl|!xqUlqorH_5|Bk2Pl_&}P<8XYHw&I+oOlo;}uy3v$y zDkmlUx)8~jOYTSF;dhr^c3F6OY$I;|-QW0D`rpK`S-T3ShRd&H!RORiKeL}zvvOE2 zwA2z2uvnV-!cd<0x!hCJo0U@D=pKl11qZoYlM zXs%4r5$1Pz<;p91rd&H%HeNy_v9KL(F==GQQR60^Db=jh<0w7g_#H%)ml1KQNgN`y z0Yrb}hPAjYuSmDva$|b;yWfiw!i8zhtl2TfO1DmC7bmf-i0=xPL7PF5lmrk2$kdgl z1)LX>asyn{n31DGJ@DCI{Y?0_|KET4H|fP^pH5X*6fUwukxC4$5MgJ?CliG{3C%BG z=MpRDv#$qS*rpr3YDJj`8BEW+VK$AcG?@qyri=?6bFa^q@t5g$3x#@AO`%evZPq>J z8=ioN%Ogh^KN~E?$y6~DiZi7Hoc6`kFDkEVqepp)fkiAd{)l@?EXCz@&z`+_VwJX& zEPuIjeMa zw2;uu>Xx-}I4_(J!k35F)-@A`K2Gh7=+a6hPO=B`c&eK5deWpRRV7m)-#hgpJHZ!H>Mo9hT2;aw`Uvy_B$? zfwj@@d$AMmmgir1Db=E0I8u0zK^0c{_zmxY40Ccgu4U*#H`-17FxM*VXMxX6_;KrQ zIHb8TM0z=TC#`VnS$IAAfsQy-PTH;-(9Jf**+#^~4`~IW1hIJg+uoXf@}nP3-K@Zl z?Iw{-YS25lIM1^3Q9dWiuix;FsbqM{dLVE|sL~7RAi@a|QbR3-nhBW$lQ3fvW=+Dx znVwwmr&?*{>NTmQd04aoehETR*k%W8fk3XVHixhEw?|AM&Sy$82%kr9V&Xgbq|?>|=;(BJ zsav;dRaw4Ey)ECvlnFyV=lk)n^5-n;fkHB5P(!sT5DI59E8;|>O&0IH8u=MyNUAZ`iIe@#>9LudO$7Spe`RcE&}0#k4zxOj~&z78D|3U_qR9X0m+hq z2*Xgl>ejXsgK5En1*w{aAd@Fe4c)UGWF?)sJ&?IE8Io!UiIZ~&HUNWrmq^)c;-wlw zQ8W|iZeL735pQ$?FKI?Bv~8!a3#`wPh=liiW(QbbeVI3H-5U0XG2_OkapNbaeR#UW z0G74?^tI${Ex8Z%9tKD>M+iA=Z1VbrQd0|$B2|Nq730MH!g1N03dn*FgPZS8``P8N zjdcr#(b!4|jorjd8i|YH-~H`hhxd{jNPX{n-;3=Vd-r#+4g!Ja_*?#`G;!H00wCc5 zXrk_kj65}t#p=_L>aboW&&OBW?L?0axZ zuVi#q6ArwlzF1)`KD6B?!{W2$=;0vgL@847Ry#%vh3{H2*o7$KTrv~vc8Dbhm?&)B z*guO>4yWQI=O(4jgusazDg)Y8qZOV;?%B(Jt{{Tv*wviN7i#^x~WTW*Wp2m5bM zmFw7dE+%Go5C^KkxlkLSK1Jf(!OCo<6StTA?)UDG`p=j?H8yY2#<6_msAfTABuKg>#ofqr&zq?`3Lu&A<)t&MBY zKs2!7PB+r$<3vNf>&~|p#G_G{?7U?y>tq~f#yqm>WyFi|H19|;S^CDdxcSEYRpNI3 znXHe5%X`j81Dy_QZb_Tin8-ktlP6D%`J{TO27-8i$jFDOnCzNjaz}naD%?P22$^(3 zC^j(>4hQ)?d8#ARnR#GonwwxWGUJ8!S-IXE$ z8$sEe+m-aj^+3^`1y>xvBtSyI<*MbdB@k}tbKn3#>OveC_&T0J9b(h=RU0?5@zd(G z7vdlRnZb^M=gpo=46PZV+8NJYyLyr6fu+=1F3p4=jZz#{tmkp za2_E#P_LS|NZY)%Yxtf!8mfQR17riMxR>EN?UuW%AZRO>5n}$;S0XgWBo^?EU`@ri zaT9Qg7#akjix4joiYCIqbTbj*vT(u0_>OJGiK$bF_77pVF2Z~CjZYc+>bqIFdeeG9 z9Z6v+D;0s=GE|C;QOk(Yti{>Pre)g$!3raKwne!38dvD&YLycJuX`Wl7v8jUX3lZ} z8BgZ9VR#xP2qh)qyr&0`zLKic#i@r8h@46J*^K0foWS~j3%nNUidLV=6`jsh)PXq$ zA~NNP&cbr(0~5R0ZS3i%pCtzR%V{<{;AvCwySzZ^bk_guE}K3t<7^p(-sTiyszBEf zFeBpYfV(=xByz8YX0|%4s;Vc%@V2ya{n{}2?PX^`*qk(N>g06ujqggAuwU;C5bXHz zW77nVFgmkPsQ~06d_Z?kdvHdob}|e|6dYdY6A&^aFf5wL_?!^z)6Yu$mI(E z5+~<^NMRmPU~jwQ_8=B(*tE(8R105T#Qy9X(rc^M5VB)6?+!^5AZ(K+O-@4zELa8N zKga?l_X*QJCYS1__r^GLEr#4)Bb=(zMKQ-p@SPh|>gtO0kUQkfJv$!dNf(q_d?j}u~7WaCP zn0)43Q0+S)fpFqTAe@}**RL-oVM$C5_0(x>e6-d<2*gxyfQO)jc~U#KL>z8U`p6@X zM5En}t_g|AKwDrpzCC>4bDov+@%BJ55&96-;r$s=Q?VNyL>kZosfmSWMpa$Eb|psT zO=vVA?Mx!Q>|Y#9Zbv0o(? zm2@h5z;QR_bA}J^sm5Hh=y~>^UYTyZ@y37+*VFX$6pJW*H^Y|ipN?d`h1r~}lkgh# z;=E<^HbR!S!Gw(u6{k?>^G;$+`R#xN!i*ZwjcVauw&Jz$<`^@2IHItekD_s3;kgp0 z^sFwAx-dVZBdXwNYtUnd3o8}Ti|L_99!)PUd@0SCbxx?5By4s<#Be^PmHp8xEC_>A zLyme|M=S)1X2!A0>g>MxuJs-iCv9Y3O-#(}fqE$0EBArA3Pt5q|v9AQ&&c@N_s% zoX@`RW5-V_c4uUxmV?+dYDzlbT5V`02@P#{l+pVq>#%!oR4(3(9>`;E-sOna`w|GH zyX7lZ#1@_6LsLe|z7xr@Dwnj2yQk!@Fln+*Cg+Ga-QT+Z%RJLCwr++|iFdUjN?k{|k_OQOM*{p3@{0W$FhDo4UqkD@J!#3}SJBfikF_*!x%!F- zig(+sx3Hnp&`<>#988OAjT|(=i|>49{^sqyoWJMrzJj3TZ$0;*R+De)f(w(QJcJk4@a7@u`s=Pu z7qW}j%?sa>9(?fO^!$r2q*q?Tb#~|~w!oc{CQq4)eXltrrRtgnf&vbU5D0>{)4M06 z-D1KYr8$+`Z*UJd?v8(kt33YxHqhr#@ZyRUuSFza)lA|OnH#^+Mti!^ONQ%Q?+nMD z_wLyrUVklUh{AmrdS<({>-yZIHoMIAsR(ipOZ|#XcshYjjeXvcJL(0c2lrc@F>7`j%F1au(OSaW`c3v=Ii2-CtILKsex=;ZXM8sEA zaaz|}zO8595mj8~Q|xqjFw|_95>#*oo>=eO{T_Dm`WDjdqO|Dc7t^jCJJY%IE&xt( zq3o$nZToP;cBQv49mN)PD6Xvxecbya*Q#=UqkA9|h@7u5C5&jqoj7rFT92W3?Ya$V z%CyM=uS$Ge~7vcVo1F?hCqa+dp8ZTrOh z1!*6Fs4ly54p;@wG_h1338M$&bx23Y7{pWFm>-D(;lu+fREl(^b$Io>@Z7TiXi6Xb z@CVZeKk(i(0Z%0RzN_;98?F?qo%P}=#t^Ag_(U>Q#bnAzI}-)(Jbe9>^!oB|>pXf=W6S z2qp^pG5zDX=9I_XF&55hfzOen$D|d@7e{z_gWDbG*q@qkz|dZ%x)f;P=*t6EqLf{X zX1`~pM{n>+_{^}J=Y{p#zH4XN#QZ$(vddE^44L6(lw1#i?+@8-=TXss*Q5D-$BE-) z9!`vK+omUwdS4e<$RVBX)P;V!9#KvYli)HX0u10NmW|*4{U4;KpME-BeCZ|OVkkG4 zRTaMDMj4efxE|0u$#nyD*nR3Dwh{;9%MWR+#VETxEqLPbbne_)>9@Y{x%A1O|JgK~ zg=g+5V!*xnhFUmmJ)1Cy$$9f_2H;rFLU2CEN#M>Bguml}a~6E_eJ8KU-yxBdP3(bM z=(pyXiA(u}@}9q~S4I%!zpL@YLXLprhqyr4!Uh&mFcF12XoH(r z+hAuHqraJ*ke*!dRC?f{hts$TlOSlrU`X+5fx@}^QNBy#wePzzeI=b_4*>LTIXk?x zR-l6r+%0VF*$E+j@r75@;zh5dtFO8Ysp0+Uj$3aDBlYf`J3`+n!fR#WWd_=ltifsi zEOUnP@xm3@AahpMte3sd?`7`MheaCB%G{mogg10pbNZ!U{Dm}q%JlS4$b7j>001BW zNkl&(1TYOO9I8pJZTn!Hicl}*RV&o8j$4L{@~3a?wamRq#wp`+uhj$@jkckL z8#SWCdhsTV7i!*|2CSjPK|qumx_&@c*K8Q#1~e&pr2~R~9ae z?IK$c>3z?4Ou3^@cin#!%6G9>560zg7QZ#(?Y4)t49^hnYSpr3>78%8BmMF(eKOs0 z;|*yHZme=s5@db-<*wbI!%3p?H6OW8lny+Omb7npobIFzKxv>jgs-xL`-gk4*q-u( zXavBn2Etk-Fx74Ey6evLr+@lKY=HC*JiXSYM<00r02zvs!cyahcHchM0Twk5A1LMJFei zIyDJ|oYmv=pG=QE@njl_pZPeB+OVUb%MP^!6p~KUdgAKAN*Y`b82X}}*fh;es8X;g zESUdzIshVj``d0$U-#&5>g z!cjRa6_fI4B`KNbWC(JlSrJQX>%MT0y#^1jU--n&q%VH)^MoXQF^>L`>H^j3Ca;mQ7nCMos9~N*wu{-N<9* zFSQoY*ci`R=D+^+uZNU#AuDm+l-^`J`jW%fw}ooo{mRve^nh-x2T(CJ)K#GyZ%xlV z|8&~3eRKNRpZUr3`Op0yL_!_LehPcTgQu>h@Kmzj>+9UPinuj+lm%cSK`3_T<3#Fk z`rnlp^g9A6aL;oIK}ZyIi9P&CVaSxTlWEC2-6o!lUzXz`DnayetA9&Mr#ij%czB1dD+X@#^$8pHK=c z;EUKNELLjA`1$a|52vS|eg>DbX+a$or&LBL>Q}>gSzqrtc#%{CRMJWJKu2dAs*y%? z=Fg=KudPV$$KLSa4}Jirh8BoMTWsW`ok7<>5ut}b>Y*!gsF4nn9z?f}$=NV2B?6EM z0sBZ41R)cKVq(gdc@)IKuJ+n9(+Lh#f+;*IS-BQu=&&Z@pBai{e|q10?@Ay0$q%PB zc*=bL{`=4_6?+ow$L{8wtfbS~1BDZUOz5aFqtl|rOM^2HoWlV3F{K#}PJLa4kxU@G z7S6QUN+1j@seM-BAPrG^P;wAgBG?9e4LA#Jtbpr;)*xJu2h(%UJr~{-K06bV1EE-F zz3#j3zTm`W&n`Bvm%y2FUF|IUz~A}Vnb3x_vJN1|Mv(uSHLs-&>(-`Aue=SMiz;DRF%U7!6S+aVOa9kq}y0NR3JoS8kOhe~*< zl!$=Sto$gK81nrd`Yj(4$#5@38Zdfmu_~LOfr$Cd#Pu0IqM23LA5K?YdrjI&nDa$1 z6G0ZwJ!i14+Ld&AdqAYCR6L!ak~??qOpiVGSlB?tNk_&nrygfokIYP1uT7gaMPSLX z?5ZhV_nw;sm8T#oGS$!tfVGbk@v8i&BY>D8zum95mTO&H4T0Q--uX}f=;0Zc7xLy` zSEv1W&M0c{+uxQRe{w;3ksxU^X3b3_Mvudh0P(8CiP}MSR5zJdL5iRRySa(k1cJpZ?`^)2%nB zm!5kj?b)>r+uA6K>NA2Ko_pojsptV285fnQW|}m43L}3AHS3FM&pu$DMP{MP4`#sH zWJaQ>nITki7?n4(u9+~XR5!U$cni^IH*VUNhQPqZ+Ax{s5+m(7uKi8jYYPNg0CO=h zc~HvCXD7-X6+x*+ua00I3)7g% zGa!0}p8F6+J=szBB~ZcSce1kGaJ3@0ANQ1zaesrEP+)QlL)sGj0U80#dyYeW-J!IC z@EIN0AwKxCKb@|<>dIId?Mi4RIwwdCG4oC34gq{xN)l>d)X7tJrqukx8Gjx~x_Q0# zN^oUJ9R=`pcC>TNoG8U}vfqoj3Y^j@9S4!p*cS5YtFKL)2(0!z2x!^jmrK@zupNTH%2V$+m&&g&NaekA64$`EE-zJh@J%H0@XB?o(&JA( zl|Bx$)P4Xw2oqgT46<5WN7e5uMHkS{@G?&AZ1pKl%J|b7IF^o^^UY_yNSkMVQ=VLN zCQ>P9HLal2c#bTJtmB*g83Fj}ipFfP6^ z@fBfIOPOrA#6pDcq7u0w5srk!=ZkvJo%kskkK#amO^#=y?X+jbIv(w z=FFM+8@Hz)vT?_L7OD&%I~B?}oHe|329ZANFt`*$l2M-Y!t293y1dNFbzcwU@xxwK zj1w2yeCk0;+qP~@YuBufuo*YsbVD*mS9owRJ{iazt79joOAJll`PlED%}GTCy9NrB@FVcBjsDUcYHly-`kI!te}=5y7SIE)00m=nbxgam&Q(_-_>EwIB`Cxy_=ZF9< zIPd(3g8LL|jE(Czpi&(T-oayrB78UG;}Vj|bL!+vuY5UB4~S#jl&l+uwGJdaWy+Ma zosjlVESS%yaP6pS_U>i(K^WX^TX&>Q>_E4Pr2_l0nYx!q5qY|h1Z1dXdYxl3SRT6U zJMQ8>nc^&=yC%)|l_T&DVtr2?2 zI%`xnznbbIPT0}fIUs>>(hsd`i2!$2eh(s)8J~at`DqR!l#x+I#v*bXAyAeR2=8U2 z?|WW*Pvl{;aaK6LR{(iYT{}u@D1tIctbA|QtXZ-BRtT?0NGd;;hdz zQ8e!c^lp`OtRBb+T;w8pIXpQAj;GsyHZf+7?}1h}I$yaeO`S3+;J~pIm}L-r*KzVY zVZt$}q?7M~JRgP_GM$BVEo@5k?swf4q0`;XZ2Xj2Y{E1=qz0u2`#;Y!zva%!7hd^t z;2sDSc6Zo`+%a+7*a>OwoO9C)&p(satYrV3&07cq)EI#ojV3T*!UT38JTF}EM`0V# zJ=RUNln^{52I9P|VbPu&3<9{*&w^lFm~Oe@ zM&@Nx8b4`rTC!wG#9xxQsOoQmNjK{3vC@Fp(=gv{c%oRDnrii08htfb4~>S5Mz1Bo z5HLjsHYO7R0X4)OkcIaOj=m7bY^aAwBu|0>XuipL^dYAL<@>(nX9Ofdy79&v(>Lz^ zW^7b%$EeGz4r1kwV@wd{M;5b>)e)6vNA3Xuwwqvj-MCh|r?UOKcKzD;ealTZ$CjXu zi>ctIiq*XmjXd^8&be~;czVFO;M@|n+fd1>D!7`>mE;y5e&n&VZOf)K1DhMWRD`Rd zW8irBO(nhgJz!tEc0g~>J$rYh5iL!j3Vi;Vr@)Kd>HqvM{{>_`JdGPO7U_VPaM&Nj zi`tHKX>MzGKa+xS7LR&}2Swnj|mb3=8FL}3UE9b1NuNS9u6QJOw& zW&~IqLgZ_4Q>T%OnM>|GDCa63b?3H>FU`jzr`@}E2SE_;ngXep=A`f-qb_cS#6&%G zTa{_v2cd9X#%dxe8&YHImhEZ9s@34hYIZQ3K=`B~?1D#RV4`FkD-B2>tXL;TYAdsM zPg_w5aWuMT$bz{3*n|h9FD7tkNJ{t?mTEeSU8ACC>#?VLFU}|eOxMEz|g3d zVBt>e`_2jHi7CVUF$<|YJn0^=-^EKtiI(GUYu$sJe`|34BiZi*4;pL}hW?hZJqX?^ z@SFJVAY)p%srKQsj3XU$4+)6pJf=SPcgBHwDtRs9mjHFaQ22bwa;?Ha-)4O zH`M1|`^;}74kmx+vw4eT@;By}iHP5OAl=0*h-VUYdI8+ z(T;^k8k361P1U|kJDsPqd0H~clEs(qSGhDkrhLW0k z?q+n_5``J;t2WkC-D$5?Pvv0-X(&84+Fa|FicV z0Cr!+z5i@)>b+~#Wl6T&yN$aYFopzUJAn`$#TW=Yc=;!g=j5f+l8}THAaO`Y0*^ls zumKwz8zcALojiehQN45C;@Z?@--{!p)e z($LW82Qa;EgP0&OjC!}Gt()K2U`tP2Vl$>q%`EQ95wl*O4*fg~5P%Snf-nRzK^Hxz zeijmy`b6uF6!)rC>wr9zx(L7I)GVPn4AmIQq8|v*FZs!dx8M&`CKzRx);`dMKFiQ7 zJoi3YlW?cW&*9*%_g|2i1Ovj^u-F-G3VVvc%wQbU!-a?<#T~N@qQ72B}ySbJ~1Q~2W=n$*_ zrvIE+PWeag3bWagmaQkdgwEmv{u}S6I>j%WCja(5iZrE>)`%;l6T#^ zjG^BL4}nDJb4;0>7&Gpmp)>YSY;>q|c$a?Y?3N)J^}iGLLuC@h>mIY34tZFO)WT-M z%cF!$v&+KYA2ST1P&0eaq++ndxzM-A_OlFR`jbG^c#s`wh>$1yq+UAX)YG(*x=z8o zSm-F^F7WNK4ZB}X>mVvfdz^z9L2!@)nJv`U*Smq5xMn2Y;aQSadvb*wzSHkRedho> z#6PKDusJY8kguQAH}n^MMB2K2n@j2ym3WuwJ!Tv*e09x0B=|$DULNkiky2y|>I{DP z%%?~J#|48Z0)wH)y&#YyB#GegcgCfKy zF^8lks82+yAYcW(1*E~R@$pka7@C9V(sHhAc>vFbM1qKG;<(5jxqakHCoyd-wR@ zXW;W329e*F^erjWu>LzUKCnX!*&-Y~2lR)b0-VFz%T}HA74D-owZp8YT5jQ5xlHJF z?#qS16+3hczfust11hrU%lUl?3v%_6>eKBHv|dbOHkbx$#EPZjZxqYn2tQ9opQNKz z_Xze{T@BZie!Ns%8YbP73pyoKt>bQnp&a3M9BlD1@V%kRB{zC$aIHcIY#TUHQy&!7XQyLYAY!eu-E7?pc;|mV*g`^bH zF7@z%qcWUu(LW5Bj6_wao}!PPfIDGvfHph;T}3TcEyY?JAxQ^9GU;{W(eL5P0x z$tNc_xvn;A+_g{3^yShgA8UvY3x;Aw0ii|*%K`BwL9F87H|0Q_dlN{W<)>l^$%cMs;8Iu=Tl51eQt#3p`oj~GC{(Uu4gf)Z_M z((H}}S!`cghU%$F;ZGz%LcGfK4n(0ti|i0z84KlNKD|@SGJ4-1`n^8{Trd|LQ!heT zAlXnI7`hlXKmE$-v;JhBDZ;9(6%x-#g>k@N>GKbH>D$aqkXI6u;38vT&>8W0=g#fA znJNSBlxgL)C%(7|{;6uByS^5@|8xj;UYek|vdtGaDq|M9_5dl*$s-=po!f`tlR|a3_4pzdLmO zW`jVtxIKa~d+Lw^pM0aKBDlx{uE;% z`StDN^FzMna4(Px^#`snI}FjZk+xAU0>crxli5I*b}S?82BD+t6#l!VRlAre{6<@Q z+M7ckNYIpu3ca%!e}`sXv@<4tpwnHePfE%iMp zgh*L|3A_t|tx%nZ7(^lH90kvMOLkG^+yKu^CF4QfndvBM2cLSnl$!CdV0x_I*dRtI z#P`YB&d{~`tQQNFoOvJZmgLaUO#2LZ^VuFM)3J4m64OdL!I^nYq zqv1WC9ZG`0BOS4M6d~zRIk9S#ym`jCPzt8f-#f*g_xIgE?-yf`z=;@GFbUejUMTFv z!rlQqTd5fT6DN#!mEe|58?9W1QJ8X*w%cV>`szwW5yeO;y|~+!q#mSChAVDUS?LJd z+j~C%5td*WsSPos7-)-z-aE1oV7y14;qEK}O8w86tI%vdHY8$fc4vgELiIhg(OD?x zp=WP?2%tg&mt391R8-Qb5C?CJQiU!qk$BkN+N2k{Y^g#QL#QAw5MqV0cY6fuBO3PY zRk(-UzEYEY$=9x3>l>Otz#wWcjaX>MYEFna3F62M;7}3_hCEoSv2fu+JMqL5oiX8c z1(U)aax^F4O;~*x-P2D$ZQuCDH=F@*pFz&Hk-(lf{}ol$Hf+>b?b|U@UNm(!Y3dX) z_OyopeOD!W1JOe})Tf?RT#AD>+5|l8R5*>=4`kz}H?%LoMwe)jblL1=#*7)h zi4#nKdsC-Q6_Z)&yZ#{sPoF;BXCuWV{Jbjnc?n}652R+KYVrm7VMs6s21TJ%Y=%%w z!Y`Ef;dln~gAvd^7yGJx^v_pz<2?Z{>FIIlB=LNDJ(4%4uigqwdLbV4xd7nBl=xHmy z>^K4t&Y5>`iCw?(4coS3r@g*@y*=>2L$-SLYJ2(Rm+g(!uUL(k=(H(QoQanyEcK-6 zv%H?AnrUE5z(YSLWE5}0ko}=JjE?jh;0ohT-nE`O+LKdCiG&0_Dwv8g2r}moRyr2~ zVM%_kVAewqj|>EQ&K!{boe0UEK%dcnog&N-@CGq~>hcoXE8D=fEn98Nw#^=puUYry zy5xlZ$}6w5QCD4Vv$Z+U{CV?4TqZlAszy53%zzZLl)l;-MZam|fgXcl` zxE}}i3MGgq(lv>h3g3|z*QmIPeP1YVo{`^Rrh(Lt{-YjoralaKpGj!5CJfRe3MGk8sc|P>e1NO6@{mhm>`<$(M=|xQrw8_ns)i!bJbX&A= zG0te#tawh~#@@aAybMGL;EAe=Iv`9qu@SYwQ>x?;ZAgO&+v6|qH1_k`?doFT3bSm+ z1ok;8haGpC<(XJycpaD*69_Wc117(5L)V860f-74%`oUIg(zFLZn8-eCTdr>?KXDg z2-~>fbxD^miZN`rX_Edgzw~0MX{Jh-zr@Zy>kOA(D?~^tg(D9y>Hq*B07*naR9sFN zqp}1sgyb;!L>`R#8}|y7PBYOpX_i~C>5PS;RHD{Jx|L$w;@+&X5 zQ?wYay1LStK&33v5G3~Xh6u4mA}S439cc^2Zb_UNvHMRD69^ahf`J+XH+i8JK{d2) z-8v^&>!l9ax^=4)wqPWjeIZ!?+1ow$+~eL+ct}we41%%(S2-UG3AG#^WBK+Q7%BT6 zPn$N)_de#G7B&tNe1Z8W*&dqlg3?-vk{YDQ6e4AYjMtOp`E>5N=h_J;oM3BTUvFRj z;+M2t<~|!WVwjBFqpW$KHi}{m1-fbgsHp?Q#rJ&|Otn(R8F_o?Esg~sAC+zBn=z!O zF#FREn;N%_j}XYZyK~{kiwRHzVh{|tH0aV)S3izQP#%w!hG4cy!X|9=FnKWS*uKR! ztbfgxKmC;K2xIJ%pZtWKcmBC zz2*lnqF*_xt18^~vv9#8XSj{cO%7KW$(%WJY{7yPoXM7pVFcrac>rV1@3`h|&ba5y znqj~Dng4CeesPbTappNTRkjK2QG|xT&VUmG<(8@6yide;BfqHQ(D}^*fi!!dHjE2Y ztvEQ)=PZ!J-b7*y7E1$W5M&gCkL!VC&U-`Y$U*=D-6Sc0>ck0hYwWgre)>~;ef3IP zEMNMMef%adhx47VV8Ln?6MzVGXk7!kO180l^2sM{)v8tY#1l`srwpMRP<0TV1ESU1 zp7j6ywGyNRS0E-q#QDvERKt;<@hOI9`QOL8F>By=T<4c@G+jf)VFV=L2XW>c zu!K22@#NEf@D4*>%@&hLdggP^J>Ok_&pGEDF^dH@a`Y&NeP@TP3(~%|HSM+GHI??x zxBrUv`Iu-Q`tVKm#G{W24=QZRv>Cz$IDynl5*9pvG8cjAP`s`b@2s~3>#q&{d6Pf@ zJVE$sP{^Fo<0qzBAkhz$=wo4(U-$Rt02oBha7bn`82ih3=>Cz10G>(M9V#_**tKK3 zEr0H554^YZq?7E+fBi*wMJ?4Lnri8rNe%K|TDy9!J^aXnw(Q> z#RSpq6ya!>J)#&M1R>)a-VNzD?lXgc89?|r2SI0c0dq-4wH{UI@dM%+-{dm{%Hewm z=+T^DmXT-^aG}k>ii2xl2MlO$m1cn?+TGBw&+feQP8p{k@-yp17A`u$8O6N03v9A> zq${oJb{GS@i!MCZe)xm$*+)L|348p}N9>&Q%51`QEXW4i6uCgv68l2G+Fe)PB9_Cvc{UM{Ovt<(a!Bw4r(OF|^NOb7$v z8<=72Zxrhr2H*=w$+r*~kd?%5h#RvI64%s~#5cSLapb*XDR45*yiZyDCf}nu0lOf~ zan5gNz?L?m3T)Rw0&G=MKLJB#g7h!0uBEr#X7l8YcJquJt{{r6;K{1_a@7g2!Yp*t%NzRh=7a$F zK>~LW#z-zuD8M73SBfQP5EwLF&!}^*yCE>i;8*H?jFJF_48B1|#sbRVJ(Bp5ssRDW z5P^(tE!SvCS@ASuY@>aE#m~9M<~}(JukzbO^@BOE&S9VS3FzuTf4xRtO4IGn{`^mD z`V4JT*|1BCtg5X|g!o}ei{JUqcVzJWnci;{VPRI0hzl@Qq+*3CW(I)4lH4V&N7Ush0HH`&8WtV`8DF*6O(%E%)== zne9U^JSB-JqRVzlGI9czVU+RK;XP;YuFp(+!Xf)gw!Z0(w>R^UVdm|O#_4`)1205b z>H)zX_hnYP`(T&4hvyIjW)WJ@;`dt>P_bOLBw{vc&gaiy7%#r~qSi>Pv+sZJ|JtAa z(f_uSG@~3ncD%1`c}=U}$B1Ek{U86q-hJH-@@`sZrIV+~i%m8UdcfVKg##iOlnt{O zN&|sFZ+z(edmwrA_fFsj&-3%ubw;r37Bk1OgwPw{Ku1|pCl`~SSWuTuFp2zwpk5G# zPI*663-JgQyk^y_?nzN6_qvw0W^typfqMSbGoNdPgoE_KI~-hdKk2g5eUOa@0Q5E#I)u{l%B;)?0rhRf9G*5w5iS;CF__iX5oE5-7wACq zq^SU34gGgzMYmQ}E4~mLZ|Tq{t`nDolooLj#u}+d9@|VR)Scid6O0-$FY@6x=Q6F= zNcbk4C{yeu)w!a4nA)oh95;AbmmIpxUi%MjWbVZ|-pxA;RLPx}d-|?S0I5(+eXh$D z)4!&Agsu}FvPlek{_+ewCZX$>X3h_;fid+UJKzxqzZH;GYNB-JHw2!%I7$@$q+4O4 zySp^2(1AZYwjk(uAbzc2^F z<-`&1xGTEKE75>K12Am3#zu)2t%~VG;|nE*y{Bv;scavVJODKrjLrZA02&2zz(o<{ ztq^j8EJ2h5IDAXP5@1r}(m+m#3Nzpt_X1Fq!T0FP0#LjY41?!<$FumxYY4Ss0I59p z@y#@vp+U%MKp;BVBb8{j0U$BB6$4U_58p&TXcB`I=2#}mLi;;q7ibX@uxGSbfNk2k zMQa{**o`0hfMONR_iz-=&5brjLHO>LodF&7Yx0f(rs$fH>LFkiLLOk}n=YvwW)NT^ z%!3uz2{Vw=C5eb~Bh@0Ev`T0|S|PQH$)MsysGT`|v?SFfVoy>P7<<9PLzDBo9j>Aqg)Zh(81XLQqz&Ju=!w z6m+k)uFT=t+`{@1le_9LJN49)-BEy99#Z%&d6}%#x`bC=dDV9AXb^)|9?HK{{Xz1v zrbZ(Kv0I1RfF!t;!g-YFKgOZ{IAeuaKuoy5U&@08Ht4T@{cBON-Pr;J8g=#H)SK7W{t^;axp;~O7@xYwqH5N(G75sgQP2sfh4GM z4_d_|`mjqvHZx|Yb%JA;aFzQ(2YH`91DC-w`p{{w?nfCs=h~mS)+FIb0(b5jbifep zg0}JreBcenHQh&D3Z*QA=18cRML zkuPP?@OTbTIk=YqoB$GyL&U|NA%W*=L{jjn?TWW*;D?4|@4ZgUlV;o($wgr6H6T zX;NfXCkTqMBpr80r}lm5Qt&t5#tfiC5KXJD=h%`Z3vGg2X~&Emsp~~{`st^-rwso1 z5V&e>ms#c#GB}p{zLeRB%3_r+uC?W5m0Bl}+-hHX@nyNn68CA7vC!+~6^dS}Sp~BO zXBf(ZgnuFr?>qthF;JM1_m5pf~c=Zz^kfKe&!G>|+zSo}qVaAV;kHM9 zyhn=0^Nc+B7KXx1f_#}p@Gg1qj+dP&!!yX_!FAMu>!>r=$8KVtB*HC%fx3?_K%E5A zz5e>^wtee1`|t;U%f^ivD|(`ZZE|^|Pygdv-?n@2y;sB@X#}{@A8}1yv zm+jHVpR)Vze^4vJ6+%ENkm18dY6jAzd^;RhU>@0&M;NpBdRzptjWf8cx{7&%e=s&u zWmS^Q+r<={rP`Y}f4rT2=IN5Kr>VWeZQjBKc8V6Tjh{4L3_ukS&1Me`&gC##NpET3 zrSSrciLzQ*RbrEdjn+!`X?FSNkxr~l#QZcug0bb+)&CvAZQN)N?Zs1gl5qftS#bR2dY3cGX8E-NAV8y4qOY` z2(68K&@&F`BZ++6Q0Kq;?q^m|6X{nUIz#b1{MF<%;-41yQ60mj6f|vv_sg?qpJs#M1VcojdZQ{i7cFi?cOBx*GjI~)CsN?o{`|Y>ueWV!? zehI*+gHYW-`dwuxNu#s`oj1s?eU7CrNz5WGaHFp}IvW*9wA;o{FgxS4)9spfT&TeAW5l99H2aXO*ZQJy`wpO|#PoQF^)4Ez5r`ko`!2wiSNIexI zNL4iz+7M@~O&EWsop$;XXBwAYcA@>?`?uRq?|9f+n)i5wQ!t@f-aFaU8y_4|REg|; zaFQcOwD}f&J2sO}FpRHNj;KuxNspwGsw29~>X_UGqm1Bfepe=ndi#AE1WzxUy(<uc#f1x!;nCj1#rE2^JeX8w8^h|hkOCZ z6h)R~HSB~56Wogez`#g2$NhMpa`}dDAsm#sYj>JH@lG7P$2&gOGxg=(v6diZgg#JX z)pk)VBoYy^E+NI%&2PA#{HiN1^Vmxx>V`?h*W{~azx&*!>~d8^|ve&^_y(dWBSPyhq3#VUP}(yH-d z+?|>|bal(Apj37}>B_`{QYOr!Qn1g${yvXl(OabFK1A|}=(Fe?+S-dD&!*}^Zcp*&5*pZ_& zR@868ao#0CTcLBDp>gyLW0T)bcXiEk1m#K}L;hKxfB247)Fl$w!AGx;?v=`RiSD6T zD#{?DfgP$`g&IJC95kp*zb9(-B~lVh0VY5w1r}HlVwku)Fa-z$To0m7NMiO2pyA~4 zQ?2Yp4Ml?~D-L4&qdVt7cRqjqe3xv9M??8A9dEdG+u$bk*L^k3+g>SSHhl*JZg1VI3ylG1p7NA3 z8FK`C^^k~4i_}d!1=|{%GjqCq;u9aX%P+swzVw%0v!|YTLE~08x#t|O#!i?l zn9u={i(eksfAZ-LVYJ<8K{yS5L#Oub-lbVYo9&dt!+T@L+o;^AV3PR(HLD0WG zdj9}3hAD`H?E%8tsI?CbyZ2~O+#;JhdzP!0x^y1|d*FcwT$kLt#p+%qF$Ae5Dr5t| zn+cl(E3uLOm9q?MiNI;YGQ0M=x7kNO@_uL&cEWq9`KFVatv-Wed3Sdf)N zyVP5d(+VLf6dozrXAwU8iH=fxln=rO8yR(V$o1CSsIF8Wv(5qI9;r(NnT1;;wUBGm z)-^V9{0#ex&;79r761G9zaXNXn1jEZC6qxV)7|U<@#1+F1eI&ehNOC{le;eOjT&8Q z@BPi|?WT`@z-CLG)YiV&iF>n{2Lllz+onN}`V5s%llIe~?g&TNRmcwp+M!un8nD{k zOI}~)f(MMbv>awhf65Nm-mLF;sO;fRC@STpRyHCNxm5*VH(0WGf&Js(f7!nHrLWl6 zzy7acAe4~w)5^rZ>yTYXfv|l4y+8K_s9Uxxl)j#g9y89yNq`%p!L&(R#R79Q zE+H^M%)uKN2LdvJGD0(f83~!fJ<3qA1yWiLkkngAutzXMXh=3e;hM%+p;_R77=&k* z*JzNND4e@?@37nDL%nI!7WYtsDZJ$^Z*k&{>Im+a548N2AmId;dF`25XUiF>8?92l>Br2=9$z}JF%B)pz{3M@oVSS+t6*Uyu)lFD^P z;d<;0Q3lyLvZX6e>=&7&@sN<&7l!dnOvLGZyN#2lRF`ZQ7}`Jf@ej+;JJa6xn;#Vs zH+kLF$*9_>^9UD2fEg>usUK>Y3K8EH8QLkkQmQR<`4k0FZjY%=EcV{!G?Pj{l0gwc zDkXi}Ew!tD)Jjd^i8e^OA2)8eedhN*WhX3{XP@}(&#JC4X+o$cl|_PfQfXxhO5bPx zGEUmPy-CPu6jQtFuDk5gOD}do4uS=o3Da@<>8IH*mObQ>aGQ)M?qchm(j&{`>IZZT z7(&b9n&0fm2!V%QJ#hcMHbUWSPB~?%U4PP2n=^O5>`U6^Z_-3fg1e=r-|nhkV9nS> zNJcB6WtQ_wyIp8E2f~dP+DQ2o=(N zoC{T=&@)_W;g~Rli!Z*|2n)S@`Eq;anP==<-};sYaFTl9u5i`%E=g{Zlo<^C%aEf& zMI6=7fG;kgm7;VA18vf6?iN!$O~`n{g890i)PnfyBgueZ5Jvil6cP)}Asv2Oe;{Z` z?5L*p$}nu2t(pDpSN_1>cJ&on%P`W7;i7hWPX((UATq=kV;sx^H&}5G&nFRmT}E>M zZGL2!gWpd?G+ycR%y)Tu@6-+r0uf-%dAvQ<)g$e~3(nT6@z2`d{PjQCrY#MMPOFe3 z8G8mEQ`8j@XiTcUIVl@8KqOXx!=HwaD6>EK!_V3WKlEPVzn-dmDTKrrAnwY<34DCj z`<&mt-p?}ar9Hjc)%(r;f5VjdzD?@B;dbtMXW6g+hK$L#-D%r*stu}BM+Zjw!b2QK z01|kV#%i}*h?n~;bNFyAdK9C_j)D|AW#S~;xox}8PV0t^5x%Jg^!u?s$Q(j_|A9Vo zyz6eckT0=w&pFF!Bx}@2%xK9A`pg)CZZktE6>5~obsRfiiv&ma zuJbSY{!g&@U!%T~EgD@FV`Yv|hcSHXM z(8FjA(3xtX)&`4R8hD9E*PD2l(O$wZv!-B!)(C9d zu-<;-+IMPk+BBDJ(Dipot-(%WzzD=;VVx5M26vWNN82GhpghK8N&X^|Xe!?K-plQ} zcmJBEy0s!rEmA$~lw>qY7zfctQW3Rv|N9KVb=w2aG6XQP_j5ks%)jpOQr|yfG%DXN z^>3NVr7aZ|Vuq5)IwjdpoIKv%^PU^*p$8wc+kX5DZ%3LcSI>UzXXq?3(-fT3nYNUAUd zhmQaPv0-KjA(Bo^nuDEUnqv}U@cj3$-tl|~IHHyXhS+E?y67UCI2JELML-rq#&O5h zt`e?TCd3Se#ttF^QxZs=V-Dm)3SyE*eyNB&L}u}l z8TMy?_Gd1Y0M|;XM(}dN#TnB!^(cXp2mzTrbgR!gBqg~TsRsj!a#CsOFJ<+0KmVQl zYu?p2$`_jilN6t*Xu^V>tXXQ3GKKOOKD^T2e$ADdaXxSB)^8VH=sPtp@YsnvhGgLi z)9`=`vxY=i&6b?FSRt@KApQGPxq@zYwOPS46951p07*naR4Fy7uGZouofCE)K;3~w zFia=%L&Waz4~VdE^y&bB&sW1mNHHwzp{pQ}4h8kWn^(JRVZ4mIc8C8lV2x zYkInP@ggCIroVte)RV17H*8$z2nJjT&yiye+<|DsfsB!e2n)NWPZ?*w`#ZlUz5Z-5 z1|eB#wfYgQ%?2lvyiN zr8Y`jLNkhTl#4JYvr8_0i(FvO@!5dquXZKeko2Y^%Su&u#WzX|^+LE%Rh0dxQ5E*q zE3dGr5=gogQe>Exh@;DGkP|?qY+d0Y)px!7Yfta{z1ydPDZCiWg6IIOKvTa2JH>IKO)JrJeX7fTQnRA{Cg!NI)!O1?Y4xgAKBi+FF%BonaJ^La zK~x^7--c3xK)?w4!$IO6Fohm*06&N{S`gQ6=sli8&*DIMg?|s=B#$9*aZD0AySKKRY-MS4~!3IH*a;YbI6-&8V^z$YeQ5nuu z2u45y&}mW8@JIpx0Vv+#n}l@zWIVvz0EK)w0_fz;H9%wPMR_1?low|@;&@0Rby?&A z0Zv%3&<$7k(#Cj2< z;WBD7XQ&o&t+6Jp^c9)S5NVJut!sdI`|Key>hqjm9@l-P{_gWGQ*=!qR3zaGs0X^C zaz%@k)~*#MB#vmppY?*MX!bLbu^qt#zAFh zB)<w+o1pbjw4`85% zz>$De7pfu7@>ueed6s_U{?3>&Q3l_O?7n3W+QW}LARO!ztt8&2w=h?l#cu+#YhP*8L zt{Y>Ag?iu-c%c!drgi!{BkloX#u?98GeQ3%7=mvpYHVH+$KfUP2tpnQAOQcNeGqzw zuYT8vxMS?^)-pbBISDj8={psr-abo^n_#OXl^r|wxO#`# z1H_n06C4fcgMtHCoT)Tt8gi%!U;!BN;vB%Ep|~{)WYR9A@EfJ2;>;N)!n>}g&JN)G znq&q{Ru7#2?C7}$DNwl$8zq10y$a?gIN<7vx}{F;ua1Z!maH|YR3Fi2^qos6{WViW z3;F~NTPRi4)6YF?KUa8%pWpkS;Ejib+bUh(j}iAHH{Bq~a@ma=0( zRewbd>^^WQPecjG-;4F%B^sgoqpJ+)KDWx2Q3$lI`KpUs>-)#~e~t5Nz|ZDD-$ z2ftPpGzd=MgO4vjAUKo?9!+8it?rV2>`{adQ3j|4ZFPm z1xC@E5{*07jA6UcLLYZ!gN!gIO@U9X5QVU2xG`?2#v)@^Bj?wf3S`5fygrRcXnbf+d!q_Bl$IDWEOrwuo09>Brr6$?6gZR zJ5QlGQp~Apy$?f3%z?EKn$~w}9Z9KlvUp;ty;G;nkeX$+{MetdS66M3^em<#TLrUy zQ0t`?o9w^->xZ^w+fFedm<+;-x74qZ3LS6&mh0Z<%=4ab$ZH!}4J4_})m2Ha&8qSm z#j3(+ebFUniMT5Risr~NuuNwQ_AUje&M-~Ja*Q+f4``ALB(rnZAV}z7mVwZL&j+ik z_w3zm*zStNXQNIIc_YN04T~HH^ zgRXG|y#uZ=f}mqOqbw5d#CyD6?vWcIY+gs5Ysc=}Yp0cGqZa6n&_g zcz%WcfGtOL!iCefOq2vfoF1lRFb{+{24%K^K1h%1ruI?!gjltbP-+w-sT?k;PKROC z%A*PC4|rgg*rTx3#6SWeAsD{6E#aFGFJ&#f%ORx3KAQubbn=NJx=1P#h(tSUhp{n@ z_H2;!i25Hy*Wz0-3x(JoIa+#85m_NA$QgSk^ilE5t!(e~|4Pv(Ai0j13HIn`IalD; z)ZH%UiE2qyxIV+wnv$fZL04X>JF*90?C;XRD$!aWjV(J--b>>qOtd$&2$ZO;a?#Sv z0mo@=m?Ze_YwVQw+y*g>B)kAb1~Cc7$pCha>vy7^`Dd=bhDck}NnfeVi*Zear1&3{e4y8E)k57^0;D>C}`d2owYdA_LB_ioHJ-S>$!h zpP3DKzbC>E9w?#Q#uWl<3_4IWR`)o2^??Bv*uH67JoU z%YwRr*pLntL%q-=`3JLo{#w9m9ih7idS4Z;SI)O+Q+SuHo&5n3$O;xi5*oIb7Al(=q~7*MUE zLyEXEo6w9_1WF%k_R>l?4Gj|3S>y(Qp8Zmi%879AeD__!DD@JdtS2#Bhm)RjS`PX5*h9 zw|@dgL3e-~GcOWnr2N1M-pzmia04wX5M(lTw|8B`*rAmn#6Sn)x=G<%ikA;b3}zUNZq5?JwZG< z0)}(v&61jFp;qcHbvMdgJGIwBlj1#zX|RfY%G4^m{)VgNHH9}tg9Ze8sHBH=!D;~0 z*n@{P#4&U9Q;r(~)i}I8@bd8Jswyy6OhaE$2PK1@s?KjcpE7lV+gOH=kp5V|#Y$Wv zXU5dt#-dHLrAwy?zG;z@e+A%_9Ik%#%l!lXhspxu`n-Ab`l&!_5fAC3=zH*ly5r46 zXpJOkb~=%ZYoa%oNg4%*h7!1wX7K?FU>HJb+>0}?&Bu-W>v-pIp9xhY1=e4sFE5Q8tlxIFK}Xrgit2W9zrDq zBKp}?F*!*$(X@C+syW~xItT1nd^b#pb>;4Q`-^ZEAuz(muSnw6atx0z#9!Gz@*$ zAr-AQJ(^`xCXcb_o_$Ok^*pUrt1JT5V||Wc{*;p!*{{6y63wRYqT_zDyCH?sYRdD> z^mi~5amTz;QdhaoS}>=d33-E??wxl&nJb>Yr&@W5YR0V)u23%#?+0Tvc*X8_`=qAC zV+MC=7zppWo#n`Pab9bF`Io?fnRt#-Bu5(Td>{tn(BUfESQ>{JRg|h4gnBS*P5-ea zFv23LL)1!)3F^{&w$WETj(P^+Dw9mh;yMjZq(Kb`^e4x7LTW^R4l=}4lK4zUlvNFX zBpQ$cn*jC%3|gd6EdVbDJKhx-*}6mp0bRS)R=fA?w1py;SHJBtyYh+)Jz6Vqop_gg zcJ0_^6SOH&ry`rOhXWz6VH`CTxZR~40S6!asw{GTR=t!f5uB*d8j03c^sY>+Wn0l; zZBv9NsHe<$Q6)V-9)KBaM z9(X6<_yEk+Vz92%W~qCypWt=m5}{^;B$x#Zu~>pZsJisJ<42tqx)Oz%@4*{(94wW( zuw$>haAdeqWldJtxxK z8017b;6|&)tFYGvBkl#x7b^a!XAm^b)h9YTrv}@V0076ap3nv3mRMC$r+|7RZO5*i z8niN{N(}%pWP=-|<7!15ZQR!&+d|qT2*@~b(78lJ1<4o_EV1l)hKCUXXRUOoY%Iju zfC}whK!|H3OC%Cp047YHC`QpD!)2p0r&et+M7fZh{*7RXi1F5;r~XKk$`D+bT~)}t z1Y);!>sGaenn{9E13lCT*E+Dh5YSICCB#hH?By4i+u}v_Vu;lWCq7*RJ%$RZ6@{W` zZnT!hJyJX6@GaXG0oDnCLvnBl0Oh3AljsnAcip=6*(&XK5kn*MIfRVygDQ@AKM)U? z1cnxb2SS>(wRUKc+&-HzXQZT2K|!7{#KJn>6LbdHA&hdy?G$w{YCf1WW2GCltM^sH zeXetTckmEY*Az@HH0TY^Z1GFK65fN~)D`S6ln&=eEmY2+Jp-|w6T-#S@L&ww58w=1 z;ctSBnKiKQEL%*1h-=oYmGmNyB_Tqqb_(M@1D%TxN zuDzbu$$gkmDpDIk8)dYulnSO&tCbbtK~kqSA&?hPom~4k!xXAy_h{4RH}pZzG+5}S z!RfPyo~7}Nwlfe|X}@;O>tbYbhgN(d>W248wPqJEI--&Shc?+4^s2qGYK1SfYu7Gu z-3m;o^~KtMdWS+$NT;jc)!LUDdkc&Q?h4)ozEK`|sZu%yH_--W51KA!>p)$Iz)Qr> zVo9HSe*-7#k8wNf57B?VNJ}_D>>vTtVMn`N#q>*PW3e{88J_zXQlHcJzzvw8`VIy` z9dme*YRvD!Ncl{o#QkX#gP@P&8TY}HVrj5OY_W0=+jBaGsXv_p(&E(vqC+?b0)WF- zkt38*nFxNhl;X`o$O(!szd;cm*~AHk09=?|;pIheFOBHzYzxWS4a%xFDy2vmb$KTK z;)IeN=+LLS2d(BNtYxTB?4wpiGp&%i3PuBwLDJ;xdFndc>LOpEXzuc`DkgGu&nqBv zNtv1*XjCv3moHzXL5mxc(>Z4zFj5TAwVGkMppp5KYjBIO9mx$=>n+sYYSd_2Z$Mae zm|?l>8zgYe@lD@=e@|LvQZ5shE;NBE~H0?8Qw*}?ketny*46>V*5BIY}Rz=m6gVj;cs@=76!R&(N)s>C3VO_)Fu zC+NEGag+Rw{{L)L_;6Pzpf+&TZCOxae-HQPZ#e(A*(!VR|aOgX|EFys>!1m#*gDib}@ z*wG*}g-G5ifg>@EWXy-LhRRIDKzXqs>PRORD3&UOb4qyBs9!Xjc=_cOBIxOEn-;po z7-4*{lD4KM*{E1~O@9)F`TX8$p$W--Dfcm%(oi>ccE%llF~ZywmR_?sFjY_5QZ6y7o14`+Dz9dymE< z@gUVOZKBZ(2F^hw-?WuK#EL=CknXT6&|bE_Wbm?YFo*$ccnA0p5}3iyy+*~ysFEj- zBX^&5$e@Kje(}Y%QdO*WdfqNipmG_*lO2Ppvj}7;H4Ej_=d;1QN&VANq9AtcnZ9h< zeZmW%LCX1pcWG9nG3{^x9uPeyUTapb^MgqO-yv!99kT})JTiibXLkhuxSOl$g*R5G zh&J1*zOwRFTlS0lK@JHH5HOe_`>GI4lnAh`>N_GLYvH42AGB@Z`~}V+BFZNO1?B^h zVO9=vc>aYKw32?9a6q$1CFjRSu*!KF=u@84U%cOzVP3hgH2v3*QFK%%m;gkPaJDp_17LvQ$HNpDBw*EYi^7a>9y@-V z?=Zzqdjf^)9$^qHnqreDR~Jb#1bKZQW^g-C(1C=)bPympv{it;@Zw4tXXV|az>IkC z__6`LQ=|P6f)E!!>(xO?i4pWHUj@0lCk-pJ7oLAfI}bjjeY+VTYJs*~#49HS=#$Dw z6N7HKY@tR$ZHDyxstnr8?tet~8Aa9<1MYN22y{{)HSjLNTMSCG2AruFfZ`;j{XLLi zE4{7Q3!qytJL2-N0y@8=%OxPx)+z$9Hjf!MZj@bl<(0m_3#uh2CTd?unT#d&gI~RR zjqF)douQOtivS&llEVv_aljxDQ~^Gr(FZ%Zu%beoS*yRP12iE^|D;+%yTE(g=Q%Vo zzAIM0qn<&4&`givl1%IPO#%qVLkh$UNe`rKXxwKHKlG@>0zwwH8Qd3HJcUGz8)RnI znZV===<;EfPy-VC+;cD3y4T;Z+L{si#d-=!Bg&(!oDG`$OGgs5GEBpn1bZyMByX&( zUQvO=XO;|*z!7$3i`4Dmze{cBj(v8|-OCgOS3&7YFzkvT>LtE+A%sDwfp^4{4|vTK z6ulD3B3nf|wHe0hCYzK1qJ~J#v<3wWCcTZd>ibPUp{38 zJpe};_rh4O55MV8a2V!+>M&>}-}RS{_)mRUNq@&3 zcc{+K`1jN|q{enUjwEJcPeH|m`f0|DDfZEie$=kN{(40no$bsZ2o8*aF~qn6eh)wV zu;UQ;1%ctcp(HfW_#!b5;~K&X+#|xnV8SWlXHkC8LdwG#!NY81>PDZD=u>w-$k0r` zS>R80G-YXo`W?Gt{ALXJ?Ap)qdYlX7{7ZTS@dG$*TD%2-D&%%qse4@GnwiG1rs28{ zFBPwv2!e*oFR7M;R}5P}R>;E$gd_w;x1`8Plc(70Z)~tT@44HJi%fYT9`xyrH{NJ} z^oM_Jr=D`E?b{=rON?_r_k;(xaE^KP)vflE+wYWA-C#R+Ykh-=WvR~|0uSOl&I3Fg z$tWS-*JZXp^79+WecmCdK2ZB^5pW$c#o7J$J!+3V{)`4j!f8q@lMi@y9f*M9dsXwf zxPmMUt~$aqXv2nG_ViQBtzi%AAY`2HB8&#>N|-q?Gs6mesP&KU59X}WHIwU7n_&jq zw(hpOezr{Nu^rf#-5}3>hywL2S6FYnvA90>+;i*;U-*LE^zq-e6HZucjS3gfIBJpO z0S7a3jPQ8EJn_^s_R`7~HhS!M5f>ItDn1pfa)oopdvXRWAh@#w%vub%Q_c-AR<`RU z4JMSz2gbvK@Y0RiE4W7PmmLZTQ00Rm)h!J@4I+&Vj$ zhx$ef==e<()UIwZa_twbTq#8Vg>;UoyqjSd2XOYFd%~4gjIdG z&;R_dw1>33l~kI>t>Y4*Kv?((k+)76c$;+&#E@0GOQA&CnQ|z7@4G*;7nZNqZ$fm8 z&{)9b69ysoQZ1IF-3L?e?03=re$N_X0#kUJaji!9?{*P{Rv1K?V*N`EcKe<8*$;pC zu;9-t5{mp)&8|i0OVk$~+LCm{$ZGq*2i|Wt-+Z&3d(QdtfW!8ZA^Q3d^%MI;Y}>ib zs&xItGf&(1et4@*nl{bmC>pLvf$h^av+O%iAvmxK|F}-Vd1hN>^q=~JG1RE2%9>+Y zh5DdOx4moWi$MUChwWEc?D)x=xNeQTPT3=ekEpZPUwchA%CwjG6py2Y9c{Gsap}+u zvWoRfdbe2ec?V2_hLEBW7%E8+X#%e~v36oFm4yfqL^~1p!Uz(C9700sedc*Egm{-T z?@?wv_m4AwAWWphIK+Td>2CQi;$h;O;Ak+UrR@+WjB|Ppv2t?CSy!3*_>NG1=ji-{ zBmg1CB@>SvrjNr$X^FqK9~JQIoB#PO`#(4Tf$u0+Cni67^jK@ywcBRRnq{B={1@$H z?X>pTlaJej4?bj@H*XiJg{Y0Yp5Ui$L!$y>Jo@-kcK1EYv<2xoHgeQ(4>dvjr4rmf z+1pt-;U7RWUGl)=C-q^8)*|?0Wr(!ZAqkZ59pI94AqRh8-@wo1lJu342B{W_Davez z;4pI3B)7r*>7RVT_Dav*+9IMK`0bT|z$VpXNd`X{#HkA4homwZtan~~;dT4lzxhX- zJ!_WDo?EXKeTvpPG{bzU4KAz*SlwDIHBMe^OBG=7N_SQmJ!-5}5PPHs z87bqv_IHqENWRz}MvNF{du7pIw_&~g{XczG`#yAPXSAta7X8S|2y7c&Z0{Of)o0z0 z{hRa&27eH&Lt$nrwVUH^MZ6`V@-PK*%;DAGz=ByU^w60Dc%iXXB6}H|gW>jHf`_99 za8ipR&;@RYu50$8uFT3tebvwzL|+f$9z@u^8RWW>wT$bbBdMOLP6bmCdtQRz$2n#N z+~b;qJma}DBmqB|0rz>%d--x9*zEuSAOJ~3K~(vmDu{cOMThYX?tc-K&NDqm|DX~n zku(S7XnVH^X05!7#*UG(dct12>qmFk#TQ;=@4ev$YnFTK&X(`x8O+^#)X|pErji;YpF89fYY~g}MBEsXff?KwpHZ9U~ z*s>6Z{z?7B1yV2HvpTz5D|;C&37N}M-XdX1O>>Z)qx^8+M5jJtc(oP^)<_-HZ0lZI zXaDidZ)-o^$EbmXg_J*dLh?b9#zqn-{B8(3yo~xWCDfD;Jn*o6^WXo&KKij6ZTy6h z+OK+?2x*I}5YnF3nU@FQgg)D022M*o1V5x5sV!yN#+K>ATX9`P}EYd#OQ+&3Kc3}MYv5L)Ap?!=Sq&^y@@EkT>BiX?yN3b8j{DlhGw!yyerN6QXa7k4dHrT?FO^&K7hiBdw;r8za zes)5x9pKpRv_reSK};L=G^vh1vhRQY2cD6t;|bj22pr1XbbABWSyhSN(VWSr?5M{o z#UvZ|b=lXxc8eST-*xRf#Uw^6Z^K3}#}ild|+RgYewP6*=(UX{+P5`c24+ z0O9wFRIVt4pkU`j62mH`YJw1L-n`klq!0EY1pqKoRHpYie=$ig0tPzo#k>5b9+d6e z5Mrd~X~vMkEc+Ihl5Ut*jg%3Mun<8Uid6BaevHx4nWf;t{tw+!-Lz>zTZN>&v14oO z?6c0Zhwi=GKJ%I1x7&Ywo7K;pW=;F{+OCFO*~NuyV2)}5H_173<|tU(33hqw6%NZ+ zUR@;@$H(lAjq62#F>smkZ?>P``>>3->+SP@@pb5_q-lXsXKYyXIA{y~kUHP@vK}|O z)~3#wZZoG%wc(?*a0hQ1Q8b(icrV^Rkh7PdejYACg++T!jp$y-*i$m9?%pMpoAM;ODus3yAALnvOer+P^02Kzo?^ZF0Mlp!JBJ@wlh|X&04}I_h8lS^#>XdrzWwF>9 zKWYwi(aZ!H!+ZAZaVAh#EA^oI9AT!AO5FU?zp+~JUB>ICwia9sng#4u=yvHHdfl&6#@~{N_6Vz;74^!QskP1vWX+!wjLrFsI>% ze*TzFiD{yyK_UP_%M^myjrlS@0)oj?rrE-!r`noVR@nde;0NtLzxfTRNNQb@#1L62 zLnB@(s1!OJ(bBpJJaw>FoOEKH$8jnb?AhZQy))-6TQ=K{Z980#9eqb%MZW@e@CD+t zcI_IiMR>tic<g;qML2q#Avn3>MIpRj?N1 zVDT)Kktwpz6S&SG2iIdfq_I(>eyp)i{m)O@yWf4C><%58;Y{;=E+&khq#4Byh3+2d zu8uH%aHCVy1BVX!2zVi!bx76Fq47;kq?HyEX|O-~<3F?QTX))7=fA}!PMRi9CKUiRFpx`*iw0i&|thEKq?3j_Xm;!spA{~rBNK@Ljz)V zz`gKP;(jFF3yuijX)yOV^NlkIy&QRVXgf@I=_|~?BKxEIoZtij6k~<@K`iB=01O%> z?Voe*`R-ZqqU;Mdef(qg4`2DRVlzp)luDsZA;H;{es7ap;zZ~mCiGE@W(&X;HAIb= z$3787)(CV87pmm-GG^=qd29@m8f&=JD>?Nb-(q*5P8HX-GYk+Hl<;mD~gbw_{RF8%nJG2=uuWwaK71@};Qfg6A)a1QSt0{NvBL_VEE zwcgkWT(pbau;ksdMVkjr)*cwN3t_263(jCnhm-`b{t_^Zu|xe+I|Xs!z8gmcgKgWk zX{*^ezL;_DoQ0aSOPh4^rOe@47_zk>Sca+BE;6f+$We!Kc z71aLB7TMgXu5Orw7|m=n!!DBw3{_avi@M_ST__bDon*qGr(g&-1DfAKoQp|Mf!v%) ze9J+@ICkvV;rSxjVB26*7gSg@kn(5@2OF6XZIYG3xZ-iZtk@G6I|KSt5}gzIyLXM> zJ$C;9!_+582_hiU?c=e4iirea*t%nNSH{?ERsT+-YfM6vxu?dCdlwDcTrJOb*T<;g|Cybx>T-lRU#~S z$dDKP0%J%xz>3Zkd6zE^E_K=VoqK$}OPdD32uak{wVG8*$+~-2g9eA}8{!PK2`@Hq z88ieJG48V(oO^wxU=YlrfB`l)LTJyJKFigs47@%28l_s0y{oSb4(MLrbs&pwF?}2c zfGzcgm~*Dytu11H>aM!F5#A^D^|Ni`#y8vu&2z@ngo)!^CDyDBjv!?8Lyc^7%pkbO zu7SFxtz)OyUw`>4_U&(d+h)vOXtQR|Ro=2U?o;@DF_Ci3GGW9cN9$Xu1(~7a4(zkD z18VEB^)k2&T-)S92d>dKFlN+y+(+d*m#-b`k-LXd$N<|q&5Fp4KwoRttdY)o zgEIs+K1b@o+7CmBhEWy?djhM00W$Yk5lAc;R*6zJb%@!-C6`=e^|R;rbg5Lc9P)CT ziHHw%$!HMB_Lxn;2oD7{-c=_;14mXG%#L3etB6)QVbWwf>CCfj`I8UZO&|TZed&vz zx4HGR#9%vY^qA33RLe#9_etN(4sb4i-p4Kp^gn2M7x7*Jn;lYP5CgCJAKU__zPEum1DDShd_<7oT{N z4I431QfKm9q?UXGjJ?l;dmea$kGU@pNSR47({9!dgTR}e3JJ3TktP@-v(PUqzsLK2%hh?j-aQ5nGAN> zVZ%ncny^#2fxyOiaKWiaj}&DPe4iLWZffpGsYcPrCMu?iQ0YiCZ0*{$zQH*mAGUAb zE}iujXCM%NHqu}=aKZ^E_!;1GKZrg+py3=`!$>&Dmoi}(Y>Kmf{d&9So_lP>sHdcl z9qo||$&1+r1KFq83SM^XCWsjbC)lGy@s#Ta|LIf6wA#G3rq*W8nr%B|dwA)U)%O2= z_GbIrFMiQOZy<3)NI>dgS_}#7nccCzphxl|^UBDoM}pYJnXh#1)#4uC^g8oxFXJ#@ z4K%rGNBQ@pS9x{wj41PPrJi{M`7GEER}lxCPt-~0EG%4y0<8!HT9?F(4o|TB1XF;%BF)1n*rpUM z2}}aIdd3-NSbcqcHm(!GZzN|h>LX}k&|l8bOay^&;q;k;-XSGnTw)x^E80a09R${e7txzG!3Qy)sN*P|Z8l zXJQb{@M>xmb4h9|Qe+=QAzQ8!{am>{uY#!bcjj#fPCW1V^?-gM!T0rImT~od7z8!S zjNkEI=Dr3VDVuke_@?{0zmZSw&H-QbTh{~5DenW-T=}A|U7!`vt6p6xyVE3%H`IlS zh)_MuYNeX`@$I+UKm5bL$mqV;&N}ZcHf8EG#}ka45=A|~EDZE3`aiFr1WoE} zO|SV z==)Dm2H}}0BhNfjkaBin%`=z>4O+Eol@?Mx?FS8CvSf)PCX2AJ7tny15dc(}0C{qs zJhZoKR|-3SrI?wkXqI?e!;~^>tPq$)jK5+bgSLKO?Vfy$XHMn=ur6 zSI;6(>Uu!s6v#L7Ebz*KKgy7E&%4W=5uSbSX&;Ns60uK>9W!1t@U^aX{L8=kJ6o%< zbN2Zc*}@Z+xI3$4S#^nsh{h#jtw&P6DLxP7=sAdS94BZNJMuxFpgS<+nRDj&nxmyB zF0x^owc}}tlLIuVM7AHsWC+5cUSh041JQaw+dJAK_Kdjg(-Fn0v*lTJEG zYnK+-oZ0hi#;h4`tJ*3K5>I+t#|8=b2}oae}^d=~6rW^wYfoG=v6IDGq??Y9D17vjOySWeS0j_Rgq)-kPO$~HB7kt5pNlAcq(Y-I{u=hIHX ztZ|>be8h0;>c-ft*;@Rh*i5giTw%Zdp7+_!pZ%=XO`M_rD0f{bNQw(-q#n{^53w@d z$U7ep(eFis^0Fy<*@HkSAOAhj{PLMZ?{9kl&eSCG&zyS{U$nBlUdY0*pR#(r-v7@` zJNjTa%`J^SE>QDU$|ZNNB+gF7lftd}*WdGATf1tloh=~?udh9NRw}`uv8l!P`sftC zbZ0ufN8hU=(QZ@~$1{_FK0)m10q7BG*;7wi>>7?~Q{+&i;D*E|V}T;H4u=C0bdDoz zyAW|`A_v+M1ZPz72-?tEgm5+iL$!`Q78TY{@4C|#iK)+?H`}hd>~g8>7kGXRa-Kl2 zRsqhGa9Dw!MuK)`8NUR9La8W&pb=z70RRAiaBubM)k3&3Mfv=x1BJ$1cG+dl9B3Tx z!VHl9sZh)gxKCaHgmW-}s5H+>@f)2UswxMrI)d*w;yJ*?tr3GGzy+89-J^}la9g9|)wq&F&kwG(oSTNI8l_xA(Dp;1-tE<=8hd=T$`|Xe2WdHM% zAD0B9z=zDjT!KVuOz_Aj2H9CeL1sYxs7ro5Q(lMXZ*St-`*(k(97uhl{`q<5U-wtW zK<*!od?Jr%Q~Z{BUSkgqVCW1C=C$g8fp${EG0YgT)BoS*#U4tXrSq5D@@ zeSN)bvZGVK>zfMp2~qz?Pe$J4%TdhJvnYcgLkLW1rm{%u++)VjBDc4!)&Q0E2^fgFyh0;A$`+Bwh$U9#EY5O&-xe-XVWx5NUs0ZGxfB z;y%D6Ud(Z!VghjcrEp&p6L4K*f;mJWXLObXBf|tvK&PK^whfa@=$h59+TVQn?`?{_ zovyg_BA>1*C%qShM+72st-Je`+V_okFV4N+3S!p#{=j}G4cq>C^p<#Y3@THPXj4|| zj`~GjaaKL_P8wi&_cGP%y})i@wLXk*QU7R*Gvdfw_w}qoV}~)bVZ%mwqK(veX|WG| z=tJ5i@D)4nf{U$w-a^|dX>*)nOlhD=4XL zyY!Tk?VPjEvqu!^;Eo^N<}~@e?|rYGb@sU~!1Eq7k_2r9i_0?kcE{PD_W!3BgNWYu zEcGYpnW(2f00`v;6TzSjaA;rvGJaD_@~V!%y5 z{p+VqwOen!)xP`P@5*CpkJN~AiqMff;S21h$9QkpN(0X7kztft4KWwdl~XR zH}g`dADAVyt3TO9#&3hi1FBW_@+l z3OjM}LXYN(1n>9@4goXG#IiUdu?sv@H~Kw2&ZfYpd>jIANcs5XV?vT3Zt0VxequE} zTjM_Y)YBTn>um1)McSi&g1lY9A^KN%qypIrL6|{q`j_yFy!%R-8AMLvK&tfoB$npHlAJpw2GUPRgRG|>F=~vRC_U$zS6;Ed|HrS|tXZ?{{PWJW@mfgN zMSlvGr5StAo;|yC-D?ust2l@tI1qTjbt0PJN^+BCw#g9!1J8M%#B4P8O{T8Gtq>-_ z%R@=jkHlciS7VYdGv1^s#iJ{&N)LSIIdz5zfa_5oo^x=IcR2VRgPr$iALEAdNZgBq zcIOiat|J8uxtH=p=Uwh<4SeiLp_xMtB=j>O(u3Z0OPw@r+7vCKRA?eaHAq+tDJH>i zp|z-OVXk5lPG|k$LHyAUfMWOv?zOU0u-4^@E3S~BH{QPSAK!KrKI>Q#6G+)Z3Na!D zNlf+Vzv#lFTi=0{f$+FSam~O0$?;Mu7b21Zkpob1=KaA;3@ip4<<-~MTX)8`QK7+I zUR^VoMIRG+vtEQQN>g1Suc*WP`SYc=E3+pad(>{a>0_EHe$akRVZGI{Mk?mTUixQFgNS{HU*=<=#q~Sa|(752b^LK+s3} z5_Nfp@S3#>^ri21D5fx&2^?(IY@YE%UFt;xo3+dzyu!ifP*YI`f!^AU!*D!t$B=w9 zMw0}@97&1F<(~tI{pKM4po{(&37e&veG?W!xUl>6NTA%oyvt$04foG6e$Tm}o}kb>B8k3OPo z&I~Xd5?D{OV#Nx3?X}lj7mn8r#y?#ABFsDtgYU?T^Pwcl4#pMv1aYU%ixw?%I~w(f zce&5Ngt=TPcmxBXE)agkOSmc$dI16+HaFlwTch5QC-?X^m|wswW;oH_fFJMkF0sh4 z84!1hdcf%LmtS_@1NMDw6}oZ58#aH@VnyU#sxa%L#blesWaV|E=(M;$Hf3f|(e|P9 zfkA-&px=mhzkAP4P29?CxHjy{t}{T28nl!XlIVAEOZpSX2k--&l^Vr`K4vcn69<}# zG6)J{Z(1ULI`T?i%izE}iA}NDG$@cg3I}K*+4X)F?;OrEgAA841{DeKC}(PtzBCjM zXHmyoUcd?D0%q6=2=nbT1WjAVX{vhJWmnisTCM)f)6d$A%b&L&|L8|nU$3Bv(rw~N zF=yV~f-ni9g=fdQb?f{f>_?Gi_$u;3;MC9_@l@P#)un!3?a(pXVg5xyNq~-sPaKFb)V4(QDZej`a;N z(gz=W*khLM*tuKq+^FDsV--qert-q0aF4!E%#96$T0~HW(xE~?s&w^Db!DxuDVj84 zVz!SCHRpkR53Yh&;4Th9Y?wvNJL-gSTic@?QYy?KG*!j00{00dB{&(<3KAWICN>QU z35VLmK;jHC4`!ka1`6DhK~teY$3U5_frQR{C>4eP1Ph|mA%cO)qC$j=zD9oyY-@)N zw^?)M`8%!6P3|hWdGl8L`Q7)}Ew|j_dxaD#A@BkurW}YOo@p=uh$4ap&!$hG?pvQi z%vkiu@0cQokij6}Akp8{oo^2%@jduMTOsb$kM@U3E4=W)W8UQ*u94cQJ9Xe&>cc&l z3a;O;X$FKV__x3PZGX&g=ZYJ8%Dx=TmwJvD?Njub5KUu zAIO&lZ>R__zv3!eFW>mvZu_y1S1i!j>B?1qhIF&)4J@NRd^?m53OueUvV~JPD9F{p>i`Z`OQ^5x!@hK&1r=rx%8d#z zAUKE`S*k4_S={mJhS$BUKrqe#u+0TKj3kOX^^s7A@MWEESs z6Wem06qoL{w2=S+AOJ~3K~yMmBDp4ZEZfiWv*VYa!youS zq>w&#B&PxZb)EA23t|cw*f&V9~%ZNJFd`jj-RQ~k8xV4HoXl9GLT z-+lK*pIeVomiLr4S)b4PyKKJOdmJa*@~(HiCp-yFd}%w3b&$|>BIW$|Pkkz$3nBw1 z@_t>v8*qP&eueRK-H_>W_C4Urf{kcZ$`}h1!gz*Z`&Jwzk(e4=M2s!)(9fby!jo`e zHfC|PQtK;MDxKIDryvlSv=t7^T=@Fi){}SK4iKP~B(fJv=5R{Y0&1Bw0`^oFCrn%0 zj6gctA)b8pxjcy=5DmC}O_zy#KmgNFU5^gcIG3WTQ`OW-is%J!w!NhJ-oNi)aHki- zoeq&UVBQ>M*BpE^aqXGG5EdLG_rjBtM`R@-7ZF>$?zzH|OSEiTk#Gtec~7awy8Jzv zQl7U>r7hO)dnH~Ti>STsv72piZ<}qW#bb-}!t4IFeZr&9x>>wdo_8|8?|tu!Z}9%H z*SzjI>#+?M@AKW(=Xvc$7OzWmTu#(uC572|q`4BDD#I4e>!H>|3UAl{FmA~4oBG)q z&HI-A<2W23wxsjekr)>Mmq2L0)6?MHecBjA;MrbRvRhLa=yS!Xj3@P>cf-@ zanc?UB*Rg!KK7pR%P9y%e!!2HON<7P*JY4}+~p`0Q=Q-o7r3BGUKUZH6{syfCm>IC z@tr0Wb7IPsTI@8rs6LiYoGz#CfsDv9!t>5r2m|I%7COmNnPc3>ngOmHCc<=F6=g@p z8oR}*iuGHnkzYZ|0(Lp}9_w_o2s;JYdR$(}4slK<06~n&#njf;66ZwLg;}1;ukyX(Jl`j?A%QSYp3<=APA=n}JNd41 zhP(4bFDJ(CMZg95x|e%2l2j4pB^JXFDOV$D8&w)s&X2A0T>dU?vmFu!T?&UP>Va3| z{pa#qUX!{smQ`<+MpOqwjUbx1R>eq!q3tzk_4G?CJs^S3MA~^=8O!P3dDVI#avRa_ z=B1m98}S^Z20e(HV5Y~D8YR-_vKaHyL`1wqLWbCP%D5M=xyiokG_B2gPLZ$;DM(lm zRzGju{Hm#B5D*ATAu6v1f|e*0B4KA}JXEaKXf$2UvIi=NznVy#SW^WVop^Hk*FT#c zaC{`>5)5`l%o~TGpGf@w*?hn^O+#dc#f#d1bZVG6b4L6&!rlHaU0?k{(dXw#ax3q* z4cdc4tppBM^~5PkMf4xz6JPwn2q3M02=q@!YFb zY?B=&6*VQUMN#Y3AW*N?H%`@iY8fZDQe01B^jA5{-t&QA0_v(ROdr0cJ>Zy(jEiG) z^7vFp#cSHkZ`GHJcf^4b2ptk+o-?vOEowbyUE=$7G*QL$67JRJ@e0#G#U4DF7oGMi zGV;$}6pAo~7}ya8WQd6E5KAEn{+6?UH4wA|5^X+MIosJyF4H?5z@MF(0~d)RB{-9VxMrgKTeB5MY;vi+8Noc4y24r zSCv8{0WC0?)VK2UauiuJc!pnD#aEp4?5QS3d9LhzT|sKq=O$`K<(_KY zX&^uA@Y<=~eVRH)+A;RN>ULEhm;1)Pv(lE~m|7L&TzyYDu3R5^?|60lj#GaZQ!vlj z%C|d=u0%yHng_0f}nZQSc^hDuGCoC5RfpQaipq=<*>?& z9Z=yT%N93KX&;fa&5f>TgfW;NaovDkC_{ZKF$cW-+2^)|D5J4jwUgqO9c0`@wU2js z;kn+MwpfDX`v%CzRLA7Fc>TJx{rN5UTj2vv=QxnLbL^VRL~&Y8OBhw-Z4VU?;z%H_ zlspkeewDNAOJA0288IbdW%5RpF-gR0h`z7K1+bxs#DF{_Q=vb8BiHM?6U*4M7BAzHbHES5bm26!3v>1z%WY;0_f$>M~u-t2;?y3;&j zrrpi~WmzK5u+U4oSd`Y{#YaYg8n`pw zS=ws5U8KtI6=@6(@Ex?#XAC~fDo`MDh}7o&*zJb+-a5Qbm|Jyxzv$Xc{N2auW3FA? z!1w4iXg~WNR|E7tmXcXH(m8|hgRzV8$cSKc{QORlhI?aJsEuKYO+qqVPSXRz-~=1^ zu@#)R{iPRKH)UOFX=cqF;)weCfrBB&t-{DS7831|jgdZAML2J&tQ+4#ywa{cdsFMo zStJfTmg<{w%8y_ce7~>>A%TNttIXB-wuxI)*q90LFvm!|fW6C24uWxOoWyht;hC%r z!TQe?HII`(04~yl`>9qlmHJ($z!cPjguSC6Zk>&#-N#@W@f- z>W%FSzbA+ilDjETgmVd{Lm}plTR!$YTOcb=#@;hZ`TVS!6H)o} zpI6WWrnrFlVBH5@TxF1jEypc77lLd*SC^cFsrt-hj)~THqEKYUJAn5?BxH0EqdMlx zU@!oc0cMU_#xljHQy-s}Kv-!(_=OO-7m%HNChb%8RIW)N{4Ez(khgVAWwCv3w!!yj z7q3@W%{7(Z_f1uI5MqH*!b^G<7IPO7iSYVJ^Uy_3qK5i`fS(2P=aQ=3^+kF@3J~#H z>J^jWa(a6@SOls)^s40OO?$}px_9r()MHMg))?#FzN2`Nuto$(RJhx}-(-0&h9oNz zec^={0-0K`*F}xOW`@_AG;i+0@IZ0#w(g!|+#}-8_A3#!lYIydL))7K#au@kBiFBA zADLzSuIxoZ>X{iVEWdbuS}=cUYUUkgOs%Q!%6eglMr&Jhtf$f6M+%R@x-@fED@pTm zHqIKPF4fk9^nns_FPJO!z`D^2zDHuSE~&y<~;~y*i6@XFJ4w z!dMLI6gI5jK4HduUnY=Tuq3ZXA^a%uj#ti$i9NdeCq(>w&UaS znX_iK$8n^nKH3=wuLrKj^DQlK*@(Xy*<7h^_nsXvAG=sjd3$>N@ke743jF)`9p)Y? zF7J>*VuR^V2o)hYyT5qd%5?daSELOWuMSbW0oOls5UFHwo$^6ow3Brao_yljK=3!* zcrBd1DY(}((ci#06>2qKBEHK9VC@rLuQZ+R&fQpFU z%a$%7<-!|CL$fHgwb!JTs}_fT+QpV;%xH$_Ey9kcG=yZp1I``ii%HhH$baRr=h{i7 zf0VVN#WNPQM0q~Km(r(weR>K`!*}kT*XFO8qs27_riH~5rU1;xSY`ZIz;vowSMZ;( zDzhT)HRX_S67#N1%?TS&kuWB>entes7g+>c8zeHeK?3ovt$AS=kG)n1gU7E{$&)5a z5w^=bBzBg_rmYbfe!5I?4`lcleaR?TsoD{IRLN*WlY4JzF}YaQkJindnGPR3ke+1K zv-=;oFFpM5!|A1$wz3#}r>SiSd`xM>CF{~HZ@D25`O+mTNeg~W+OqkD^s$fq-|0X9 z`Y)!-F5j3|EL%>>a&ilaaNAqcTpnyj1uD00-XYKTLm-^IKxs%aM<7za_N)Ijn4O>e z$&aSROXj0BEw%&_7#etlDog^Q-9afrE={;{A_lzI5V99IT-d88czr65l)8>C;EAK@S{1ek`Qq`Q)S%9tOaTjW7bb0r-3D%sAIg6c&7s zdnFn1USyL1Ug}I#I!QD_z>X zZn)t}(p|4hGulav*4q&<0QiBxP2JrA$Ihx+vD!9F4d*ihGYlbc0+TJa_c(1MerEAJ z>OdWqP%mj%7oOPHH!{Pp8;FdJAyCk1X={yov@tLhcz!U=nb(rmBdxsiJKhZO8BBlo zg*(!{-?%gV&p-WS+IZZ{TC!|uT7S`oSP$dc zYp;)mhWeq7PI%S0Lr5>7>Z0HByvoQ&UUj;>c0C}|A&xQjN}SV(l-$#YWNZ{Q*Bq;< zMSnUkXlKpLu_-o8GgPt?oAO)OoJ=`m0wJQWM)q=o5(u+?x^R#sD5jJPYW8Xoh!G;h zfP_fJyOkhB1ge;(%M|xO7{96zRS<_!rl1caYAtMW9oV@J&guX_{ODs3r`vD8jr~Ju zpsy<}Te3KP&-c8GJRBkx7}ZxH<8+jGHixNkXAWh**RP{vjr&ydjK|&8Es7v1=q;N z>4JLH_YcOz<0*(zgGP#xwM9^ALZAi*d*K#Q59KPk-W|`+m@yao!~)b(1Ng=-PHR># zO>=!Fzd{0$IWQ-Dj^6XS z;uSO3z5yl54$EFs~w}HW)^vp9) zrq6x;uhZA=yglp=H^1)M^uZ7O0PA0`2{nswqoh$=%ed*+jf$nYr5>cKvVQvg0arw3`EZa}!iK>|O{;UT@2@>HzDyUj8LyvUskA1;X0jg&DsZ2EFx zHA}_~)aSneB!@Z>v5JC0h|chEUra=~Hs^sJB*Pfb#Q~At0NX`p*I{fDGeeEWT1*hT znIV~2cP|F%Vcy#a;aUaJSh;FNy5Xix>FDvJv7GDw{_YoQP(9O1vHcuO>9o5&asB+XPMzxNx?$`v=N|S`K@yfX( z4%RJ>s|PNuQ#@>GWwEbX+R_ViRuhJ~IGqVaFmz|$g7If{r9O8eV2Odn#yBzTfRb~( z31sXNcm6KkLj^JG_NA`Yjw;W2%{u*E5WC0TBZ804<=DNy%e81g<&Wpe<~tPgoa_DMAH5A5Q!Xh7LXI)v142M(wD!; zc58Zh&-V0z557PB;1B*lnm2!DTD^KPJdcDNA^-x;c--;A(+QVRk$f`-;6ZE{b@i-` zj>znyI4zAW*^QHThpQh5ycJG6m;~DbA;IY=Y!C5;=h{hNRD zW9gmmcsK7*iih~wV?5VFKU-AW^+AoAac|VlqK!nZvCP}JY5LDu^?)#4m|bB@oF%T4 zAaoLIAc2r^(L=2V>C?Cw6ZY+Yd0+Iu_lk=ei2({6$GDj7Rh*x3j>PIBpo}*5w((5+=JNeXU3B<{doOnj}E)lYw zSUR$FYIqUx(SE3%>v_4vk|V@(eoS@8Si8R+h;rV0;-jgjT=!YuSMKwYgrWtXbJzEE zbD{)+F&M(m=fA(5^gcgb&Or~@uK;LIPZvPi7OM{G@88^VT9Q_;UY#zu z;DYqwfBSRkw}1PS>6xcDr|e|T))_Uf(-?sE-w@k!ZSW>%*i34?gc^Vu^F#7%ReE~G!tD|tF@`8c~^ zi_*XO_RztUg- zug{PdW@h@~fBl1~RF;oKbS{zC$bmFY&2C)KaxzWTEY%`nX=NTg&O@ z_jtWFeQu-&>`(jJG1BEv7?^>Z=~r+6$MhF}`6uCt^dJ7iPp2z4ZA`m%?F5jK^bp0H z4IY34&WPCR3KDffl;iOLe4Gh$0`m8naqjUICzZ7~16Hr&dOduTK>2eNw0K}@Vbq^C{5W}+L(?%fJ=FQKf&wS?3Ic`ip^%Fmq-uBiv zr)~_(wYB}JofKXgm6iAo9o|nQb1Mz0ngnv}5c7;g-75hUgzEmp5}F|&;dG$f%FsqN zak7G-E9Xyq`j!5w)Kv&ryqr3syWpK zqo{J@VaxpVZVyJJ?F9b=gKRuWUOk_l0|uaoISgD2IB8xF37k_1bjx^Cyo?1 zX+*Y2SlWoyQTou9;dSSbOccjH^q~)hTdD-W z-%12_j>Qgh5d3XD)@x@=fV}1)x!rTmJ>)@uAw;{qdtSyregNsClVGc^AQVk)GcZ0j z#j_HtAXt^>Gis^y+Vt)f_kd$zacr6})@hLb(?9#8^w7gkreFKd|1rJgmNz2#9R)D^ znFz;8fsrK$^A?$sI8;mpYNICp1a~e_pG*+)Eo0C7oBKt+QP=P%}QQ-E(vlIQAG=Y%Yw?p(~vPk{x7%Aq_qetWXgAYEK z?z`{42&l7jlnO4r^wQ`kk-yS|17W8qwppL``0>^+fss(ydEQq2GUNf$ z==@<1!jHQS1eSxA zAx)jI&vn=W>yij~kNy(!`JNBbQHzlwXVr@dU5`s}EzFF*N_yM*s=)zL#^9;c-F+y% z`(5uypZd*TNk9JMzm)#!|NC>?U_X*Byzrv%;4|&CW8u8$Ck;nIXjCy>&awvz6DrHLkVAMMO=WKewRM{PPE%o*er=7cA#69yX7@+IYFa5&Lr6mg&;Jwj}3n1Pc=*jzu z6Hpt|(~Vae1R^9wG4qH@snP;%0%Ar{X&gK5)fn1qo?|%UJ`PTh9tsN1DwnwNq(6mt zum>K-uRp&d8^SBc)?-t~l{&1`Qug`R=wILE!|p5h`0k)gnIKlkMhH==3NTC16);f^ zxUklcr|Q_=^g|!~f%M@0_oV;%XJ5u1@dgmmBHU|d^9(Ru*A(}fsyq`2-&1*4*jn4#=H;8^n$_gamQp>u*Z0BafHv(FW))hXEdu8Xy42 z6H%%F03ZNKL_t*AO~qUN;6<6)E;0sdTUDdtcIO>mOOHJANczGTz7RH58D|+@J=j!H zov!qdZP+?hy$7zu9-+=s1{jnGu5-Mx3tLf4A(-UTRa$j@QUn6josM*n>xP`gTV8l6 zy|`^hT81v}>v!G}gkd+?H&?D&ldix1`gGm(HwNMsDU@9HZE%kROaeP}Y$*hzocH6$ z; z4|I`9HG8TZPhY#^A5itZls^9PA5Yg_a|Otaz_IQQuD2rgq9(!L--$Ljq`DApjKMIj zAqt*Ms-4uQ3edxY8tY^Z^Z>y@fnd3sCekazsbzS9F{nU#ziGEYjQzZ$4t;Q61l!5i zLm&ur>+SEPPBOp}#_S^+fcmlsZd=5cS)trCvYZT%Lv9dE6lkjjz#?D*w)oERxmN*mu3c}7CX`N z&pw_mzU0F6FTVSG2xOcUb3mLWY=)%4^RDSpi@T}C_y}PMg-BYwa8bJG!gX=}z3+Zc zsNA1?^2y}(zylA&xE3dztFOL#Bv+S&rr<#LdJT$0)!xXEFIv7DSVu+0H#Fk@=1O-m z+<6@eURPmCa?0=gjWP#x@dlS(;IFApOLP+uQ$!Y zDt(*?X8~1W!YRBhK=vTQj*dg*SX#sj95viy3GQJQLJ)L;WxP<6^pJ72l{6S_xDz^! zMa&{sef`Cyx`mpn$jLkm(Z}k=hG@^Z0pOsE{7veB8;CQItM0-r$dm}KN#T2Evbc(B zBDuP`^R$U*+u}V)IIcM%yyTJ*Yo27zs=U>kcOODi!{i$zEx7rhYKGB0bBt=4y%MYS zfGkjpfo>oO#~}_7EpkB_v}X`iQ8O{^d7d^M+UCc>iyGYay<|niYvT<)SrL;d7`A> z7XZx=fY@h%yt@NfMRo!<^C+AVR3Em3K|78gh;y}dAVwg#&IPHQl&r+o3uo=piAGrW z8C!uacZe0`v_b5BdAqcNps^YJZsUHX4xU66V``5)yN4smpYEfs>}K@xY`ol@_=nL2 z>sV2T4M14gw{L%LADn-qQUmH3p(BVzbdkT<0&ZnO{4KJ_dyC|O4McWZ28Seub5d{j zKGdBc`926pKhdsmokOT#>s!nNg~w8}>I2oI#6R?ts%C%{z>suJ&k=+H>er0T#=yd1 zqzCUaZlWQw6VsQx^L4Mk9?rFy47d-bH@@L*NEfCi&xlGSHJ)TnMbqUK^gtl|3S!mH zPz&zT9(n{XN$sh{25Xf?dUz#$FK!b4oJSH1y*MQn+BbCmQT=rH-FK(I|NFlW!XdG^ z=9+6l1*POEQSe?>?PdhFy*(_>rF!z@Qszal43*2LW{xLKAe`uaoSk#m*S}8UszvEP z{LD|KRm+!+P){ee4%;@~&TwhR8a_ZtBG|x_zvK+hR19*=BGnOgme~s(Am6im>9W+^ z+QeWIb$TJLUl6lcw-s?wdr46IOjghEebcv%?E#IU$1zSn{`lkQK?l<7Zn_yXisuJ# zH_W&=#;RCc{_yBwkRW)~s9|jvU7ZJ6fJey^uMN24h^Pkf%Kg_O*6Z=n({+UFaOWUL z1w|3^i!W?W58{L%f%qDBCiSnG_+(p^6WB?kmx-Qp#|S8MvblLqI8k5h;y=$n|6 ze(Se>2kyU{Y^ysX3cMZ|5pL^HU7c8*Q0j5>#H!_bUvKc{!3oY?Fc+22#6TKZOUPt_!xJc!cmz}Og4NN`cY zHful(WoM0+wwV|OK3yM%ANFPu9}N$xz5S&|8xE@#&RqJ%uUfF$+?;ZE&?_yQh- zzCJ27NNZQE4xHwB@t<3f9(=RMrz=Vi!kNfkTqAS!CyF>M)igw$Moxl?5KgcrNCyc1FgvoLV(ji55zUFMv+@uMFfanKFNeA$~eb>9* zl{RkNn2sDgkPaR>oE9%y9>`dIoSc!JI1D!@fsmup|9dhe_&ju7p;ls2_ra;g@rKa#*I#5wlLsU z?Q<2Qe=Cy1=n0SVvvT@fIBDpV@zkwb5@4TZ&X^|-A(zsBLUjfI&pbVj#z$|atFK;= z-twk*2O*qGAFNqRdX43?gK1Qt_l4L5uB5(;F1jcjd#<|bs&v;~ccoizy)|OVKKQ{8q9s`r z3{ndOMMm8^WR_Ino{RCHG=cDgG*U_^+FR!EF&Bpqa1ETyoH_IGa5)|wppMv%umb}- zOV!SR!k(^=t2?38@4g15VLM5)R;*Z-9(d?6kPNzPjg*zaD2uQ3LxHEu+4q3nW$Huk zx#!;W?ca7|YD2f*3g-g0OG9{9bdV0Yg@8Fl<$Laah%rxaybofh+6+=ZPIlL?;ELQ6 z$kSGs*bYB~bm0YS(zA?O&xc(lXKOR7W*~9y&nN567HKa0cq%G^<3U!f8>2sg`J0zQ}>DucqOB*k~ zED%6~2$-J3^ytIGzlVYIaa0~F!mnOVv*|E9*y?iO#95R{6NnDP_BIxm*RZ%}-)@$Q z+=KW&GtFi~su%0UAZJJUkwFmXY34E9Q$@vd`aV46XNeRnWso###6UsmC0ec@eD7WN z;D_89QH)-5Q2GXPgyShIpT2n79?-Yj==ko=uHe!I=-oSar3dbRG(GXu(`n1|&!l_r zyC)quJc#5F&OPbZfBn}%@;&HVXR^S~w}tL>{l#nX=U<)Xqx#VksG+_!5V~;F+=9m$ zb_hM6dixk(jKF$Ck-Rirbn%LG$%a*Nubi7ipiEA^pG-gCIny7j#~p-|}h4sv6Z%NnRNQ86C zy!1=I^vmh0Yc>+hwmQvVf~!Ki<(4afPxCF!O?!78O2<1OqQ{RQG2o7k^toh&eBH(C(^F4B0rIGi{X5_Jo`7xDA_J)R z3i6?W(`CXQka$ikX^HU7b7f3H18~!gw5#3V4L4j9wj}XMFuj%f{as4+aXB}3UxMih zVJUm@nwwgXJ>XQ2l?)6fzU7u%Vt>aSccl9te1Lg%JY90dB7!UNsN?kp$~87JN5H?6 zEt4b=B7Rp4s}B)q@2>4g4~HV$TkcIxM%OMs+Q}0Wm%*^(>Os;z*N0oyWQuiLtg{S= zYA5~dYZ%x?cu+}B``~8nWXyvYCh5gWn}U0rOaspIXBRA-7c0HFp7MYDFTa)k`)~Xf z#6PQ4X3vEiUNJA+oG;yUDe)1r)5m||6A?ZC{onU(>EaD*@$1)12_rA6A=iu;c8u^~ zs>M@@0cFD*2V2E3Mr?^jcTWd~<`!I-7vk2c$3}f@wMZ-mEXn;#1Y(}@YzrPx1N}W| zh)skU3;m#?m3f#me^%HhT%TbkX}bHFV0A1$lsS6t#STzwAX^}iGVwEU2pa^(<6+Ww z3+Fj~LNf{U4u=}Exdl5H{h*DZwash-B;q6UYFn#oULY2bhsss#7B8lL+B{66J_*j1 zS6>J5XpMj>C5(IT{^9f!Kl$&{TiPG(QEgY`71r_*-fWwjh> zqT?7HR^K1gSfgcRSv>7qrf-<22l_FN?b}NfJ;Qp_O;->l|5nsN8<7N-f!k}-{6+IH zP;-&-c>1a5aVH&&NcuHv7RBUg2ic2&T{X_M)n(xx{r;V=!^94>5NOx03oH`A401iy z;4XUL;9j2RNuKjJR*0x)5O^~`l%7i&(lC&d(ehk97@XWAvn%aPcfsjs2Php1H z#ztUg@HpVi4NiLPl045k2~J$!(~ek+yce7=%WIq6=&bYjA6G z8^jo2Z`v0ovz}YFTTidr`n*D29hqE*xqtTDhO}Z86c+Wy8{d3Q+ISf%w~Obc?|A2% zLp>%j>%y+{%ro0aY4R!59uQIHoNICP_V%P>J%A_1r_5_?@(Jzofi_|@l@F2@E!lMiCY zxN+qwh(miiM&O)ouDYL#-;{bv8T)l%Rx1}L*q_+C32r*wX}K}2f9&6~tma0H ztn<*H!x3>(jvav@CY6)T`x-Db1gC^MYA|l6?S)YwpZHeqsUYv_o5nRRdxQ5^>J6ly zk$u#GDhMx%OaMv)PY^XF4%ShSNogPZLP*Nq+bX1Lq#H?D4zsCsLD*p`HBIkcX%7e!l`+g7 zOb~Y%&tu1qkUVh-jEX8yv$alb39Snfg~Xw3;xNyveK~yiXsBdeAHCcweiM#EqKW3A zmaS^0L?wS)XjWjf9f#)+GzDH~)Mxav>6=dK0T%~);)zG-&x9)J+O&8Xo;CoW ztE<()!RnW9bTa}(K!P*M373(%111Q{r?3sX=eK(Ul}0wt%jrUCSa%}g2Qbpc?2J9< zJYP2B3(9fqy?4CLdM&_;lcXXMaC1Hv=PQIFh>tK;?yCTsZH#tNzx!yX=WIW_cyHx< z%6G;!@A2FH-pc-jY0RanqV$m`J~cDf4A4_TU%p~#1o-XUyBmhgSPNo4j4VgJFb(5X z9e6f}z(ln)pql#N{sZaa_3L4P+oO-qrrKBfOtpkk+T-55bvt+MM#9Ex3C;`QIf#OA zqSRCU+$()&xnIaU>mvLcPhc_9Fbpa?F;pW(NbUTH$~205M*l$F;sWZY@oyNt^(>Ea zy+c9ewf=X~naA1WTy2+~Xd9=?Bzhnw&>%r;yVGTtUx@EEOMapYKX70VDib&y#9f2m zM5?NSG{QhZ755VJ$uAPQ&_zz7rE<08%sF^)KZ~p^8KJB}#3mqN zRxw>p-ve1k+ZzeXX3i$KXYfemhe2$hXEneT5EIEtl-U878dNiPpjrhYpo+z@Z~*<| zxqxB`jOTN}PsW&V>i*_7L0kz^NwJ&bD} zP<&C8a=-U^uJYTuEakTRtLm??=|+inD|zr+Dxky@5{bvCFygf7L-523!s&9NIN>ty zOx-a6qR^EangDzsz_oiW*RqjwtbW_qO_x{J0}(xqeM+aAjw1xf!C)?5vNVu%wxJeS zd1dvU>D>~8GM?ob35JBi0MS0;Z|2U!5r;AN-a6);!Ku!(b5SageD+lZl4T;eZ*7^u z;ykm`i`%ymw3My$XJ7M~K3OL5=%jBs0J&NzY zDkQ~7x!9H&=*Y=?q`_HN(Hx8jrV9zc_jxS#lrU7z$M5Q6E?Gv9asGMo-|~$6QlE8? zvxP*$eN}sN6O9sua$LQ)s%kjlTKuj)=ex`MD)pc6t)44Vk!@rP$;fAXwz7?UtG{y* zM1|L~jm-RD%E%6YDsRIj>v6A5;qjtZOwKixy4x)eq`BpKj9NkLf9P`zXKE_jKCG#kd;lrYE^am_Y)Pqe$Lfd!05_Epy=IxOtn zMAuJyK6fDAAvCBS-#ReSEP<8$XCyx23+q3aa|R6s%%usbgl{P>dGT!Qc=r<5!eY=LC!35nknuf9nqhh@JftDK_(fwSWzjqeU$i=v(x*Ddq6}h&ge%aD#w2H z<(Fi)Q#kd4yeEEo@>j%Pg_$i#-|^M{AfBCpEyRVlJSS`xrdL8@@MfKpa}s58PxIoK z>^2Uh>s)Tflj+d@gXu8H*kH6MF*$_!QQ!jRf0RaV)J}xdMFE2jMytMm#&J7r*A|GPxd5 zrP0E;-*wOZ#3qnf4~}{m19fc!W5Sr5?mG16q_z%w6{qEj8k^flM+^f2@){!YQ=so7 zm1%Hg!Chzd)R5i}aO1`j^dpU!sa3%4?l~3=3EttnQvw2m;-v5@^Cb2jGsCsznhIQw z-DH2Jp~wsuMqo~BQ12#?&AoM-D9@DQ-Kfh7p~(A8P$K;^?TK@IS6`oNP9XNw;i3HneaL_0vWPowvuvISGu%$lIERTl`sIb?nJN%{*?REreD$OgjoJ`uf}NLlgO1$RXD4Rx(izf(YI!z=|(o=BGs zaVaj$E_n#oEkf%=!ZBSK}sTXZO1;4 zIrm^kXh5pcme5P)+5sZ9HP0DY-P?B*!bHxpT2yivulra5&+NA5F*{5SD_w*ei0(EO z2~Q9y%X-F*Bn5{M7~QM7VHT=g`>~!Va$Q|Z3J1S?y1eopD43}rT^(FpZ$ZW+6NpzQ z&ZO8N%3k%NIBoB~m&5*$nTeda*S41XGTwdV-#zvTNzbH;Zlul4B;~`RAIA`gx%20x z=bm|z^v5rxt2SK$vM9NjvY)PvFY7T(>g7Bf3?us!M7^NEnVQ-r`Yk+}r2dC-1r(`x z-UNeHk?50c%6a*`1b5!N`5;_BzlJp)(0>nhr5U83Ftv6c>rW4{EUaoBiHTft6G*?c zg=pUvQ)0*&%gcd~l|)gqSn5$FNi1S52yU=084btnAgdR?_`(kANNM{^FQXpk$cRq(C zfHP8kGxF6S--FsqV%9*=TP^81fMzyO6X%-Fb!Ou`WD;n@59 zeJ;wR2}CrSM)@HExVo_U^B1Pg^zBP8y%f~WB^7JwObuuCh)O{qKny|cCjAu!@W&r0 zxk?eutXZwW0qoiL3@doyVMD(BSbd9jO_#Ip0o6;(maYKlv$7Qkcfo?$sRb@Ju@q>G zH>#Xk(s4Am&P;dSabHZhd+)g~xMZIZ7G8Lfbrha{807pszUIf0ixAbI->rjy3-sDG z>YE`xhzzcE&`>`EThai;D5c-{um2;hTCqG-hr&~lB3uw&Pr4mD%t;j9fI)~HZjr9@ zhZSW2C{^7^xCoXpJ5 z?FVB$hzIU}GPSkWr^V#{k0gdcNKiHOqPBu~Dm}Ro~-6PzLNdY%i0kV%v`G zxbEkS*);&5%t7E&?(zPzd2TXg(gZ>iq@88sEl%ima>2}C+p%*OiKLFEMMxB8ef2&Y zEX6}o&L1=Z{hrK6jXs-+MqV#?FfC!R@CW)Hi|E6da~6%>Hhpx~Js>ht{O-lZ@QrWW zkEHgdG;3yC+6xDN@W9b@AI9suNVo37CJ#RFXdvgG`I(;u8H2Pz+#+mXAGHaKxi3c2 zBkAMJb{5akriFW`@FIceM-q`E&I#zW2V}t4y;d&XfIVT)y~uU(;)QX1%PqGcxwM3Y z;YY?jENtZxq({-y|H?1_7t~O->EC|%M_6y+ib%Y-Z-34NU{0e>){Qt>6FbUObR6pm zWURx35`>8Xckeuy?!5Ey^c%kb%|J50@!!)YKl#h(j|V{ZJJP=WduVrF+0MnZjvnhu zpa1-=Nn1U%F#1NboZI^K7sP@{&hO9u&EKZ`9{6gy=GseHYI0rJA?CAk-J-?IS%-u5 zCCH%cGN~Fb`&sMVwTNfU&IZb}9@z8o!3t8&pN_Yqoeym7e|b-8BDdU{wX4FI-2}%W zEXs^bNPy2t|7FdKFe{-Dhni8=OcjS&v}nz|#eqwO#%khlPF`K9WYPq}dO|0MU$8|n zUgPh=g^SY;I6|YUXR>h5EFyVodet?nHqZo=2}(S4PXA;{rc^0qbs&4uS?lE?0@+P~ z$t=_ord>Ac;dD9s9xxZsAr^3-HLETC#b5jdYZ=@_3hn*r8}~dI3FPn$WR2?O^gYqO zq)C<_{QS@VOuFT*H{+5y3#mZeJGt)Ln}~9s3vrl5W8j$Zz=_PPN~cI5MrCW;7=ndT zCG@qgJ(BLa^MUlAe&NIE^{=}!>|Qb+!k^ghhlm?MpFY|&XF9Nnm=qq8@y zx&XBo^?utsu7lH`i3dn+TCxJ<3Sy96FyQ=`&pI7I{^aauyCw6|#RhI0=CI_|ye zE?N$PZfD(#Utzt9#c9LFwP{v6b(4;~o(!(~)erPEVYk5mi9KV_zCEa@_F-e_gOKb` z4?XyJEK0Na*_UWrE#G^9y#KeSKl-D;_7j*tiSJEm)#|nBZEt;NtW`XpXj&17hWDHS z)R>7;LKY8}KOsGoALsYJsHmeC=+{!ph&!&X$6#u09RV_I;YkLZ+0O$wB}}G_42ACo zC64$HRN5l`V#I-+EN%DGo?T>5?uS8|yI^6wT6}65D>e9gvSrc)B9L!4dGz7REW^m; zP3S?x4zc+e#G(DHzO**g%`(Todb_ME^WOY>0wDH=vo2+LaK16X>YHMz8NiL7Lbjk8`{WUkRz|CbW3p$V0;I2;J z{XHK|H{5t#x@6-9?!&8y`OG!oeR+ZKzz1;GS%}1(pib zSo6{qS8n3HDP4Hc3S6rtDi*v;P#@Lc&S}c`VQeAI*g0JDS{KEf3ko$SF&T1V4UMX4 zIzrX6kUG11U78l6fau|O?!IZ``(BBq&xlN zSMFe)_a99^{u4izuDs>~2=6|KN-rs=_hKh`lpI(GW9{v5cU-ZCYc5JjO+KKgP0ME(MOE|=R12CSGD%wk9 zY({Zbb$y`*hl+^neP>r!U#OV0;kLna%P>h;EMo~oK0CR;lO_;0TH_!Xn2w_{Om3;3 zE_Tf{{MqG*-L7(1C9Vhnz*^rbww?cGJs8IESI>ccd-d*MH zvW=IdC%0_Hclbb>Gj}0gCsOF?NpnJ{o$(JiVmO<*bLU{ZGX`dH`mrDTFsUCdWa4DQ zavhK@vaZMLX5}jKV8KVY;$R!=CgA*v%Egu9wj0J<}8XY2VGXJr@0-Qfcdqz9z z8=mb0wi@t^at&sgs{veSjS=vf;b1t-&sgsq?kZefskaswP?Zyf-;L3PCb0Ixf9DRg3)vhp)7H?SgpyvK6z_y7fyT zF4`4H99Mr$`j_ATF5*r)(xVS=O~3z#e-U;F|J~qADs>>hz_1H}4bosm<`W9(VnHS)C-z#R`bPhV!PM`5{p{4#VJ5zTMr7`J;~o z^CiPH$a{+l%HgWUsp96zmNH$=svajmfR_`KjtY?meXdxb2`+LD-Yr{ScnMuAT-p*E z3ri*7M#s{5)gN|N4X8Zi0xM49u|;uB1GS~z$;iNk_|4jl8a!vunS2M1edqc1TL90? zbvC9KUU(t;RX7mH^Wr^>i-@1`ksw&KDU{&1kf|N0xQFo=0V>Ziu8Pm*Eeb@(Z&@j! zF7EeGjPAyJViOja-EqvlA;Wu)67|_0>y`KCzJQwoJJvznCzPsdaXvpAb)0bD*dOIN z&*x)_Os?Jcc&>bh{eo58lpL{V=V$U;d%wYfLo9AIjD%E+Td>Cx5f@w1PSS>dzK#O@ zmE1rg38k0mI3N1(G({~2|3jNmR5C{TX9lG|?L{5EXwhO^iV5@tHk#2!2-|(EY-mw^ zDRJ;w@r%X&moSK+t=~D~J*uU=&tuOSOL6@8vC6ysjW-)G>2pexM$mg-CMHPQoZpY* zMF+%U?tBsk%0x|Zne-d{;39I_Ry)KZ=dR!Ip6xr);k~SYL4+yP7s}gB=e=6Rw%JCT z)k;9ry!mruP&zQKPM68|KxbD+xRb71w=O;V%;t38Hy#M&*N2CVZmSXix}Uv70i(08 zjAN0$=PG->7Dk8w$Aw^&bMd5414yxDRLc)ayr60?40^75&v78-sy%mD7f}_X?GQ;v z`!W%OkE51+Tzx*;9_NAO$Sf;z$FqfVZn^#JD!)h1`JH;el=t{O6BqEq2#1=HSx(dj z>jNj-gqPNiKs;;KtO-Qoyt9amrpxJjKxFNfffQ)aMkVL~7xtn3yMFyecxDpggX^)} ze=i;uCh8M;%j_10S7PB9iO}8aETMMAF%kKDzxQ}75iowm6*+5_c)8!r;`1~l?k~T~ zGh4Sl4{_>4`!O%KJD!-jKa-LmY*wL&B4X1SC<2oKAPj`_=97k&De~O&&!;!u{QCF` zJH|~nMxQ-*#fg?X*g9oOEs=YPHux?FM?;g`pBYHiG1k)F6AV@PvFX2O*aHIp;lqcC z8Tj_}cVGNG-aGf;5%i+~xrne7#s;;Gs+&A48Oe_@Kyvg^%6@blOAROP%Y7%F9sgG~ zAsPRUfSVv5UiaPAZLgg3dbHE)Rqqc#lc4#G@a(>_1$c{m{B0?O!wX6;70D;wNxe!t z(J4+#-hpJqv_iFJl(+e;IL*G#R3Md^`;B|==e}BusH*~@H4!u6{Bk}9qVbXGGGPxC z2GSc`wm>N%x)~9yTR&>XVIIM8yC4)hUVMSLn;oIDK6>aVszGrc4i+=pBM^7>>eWFE ztW(LZsG-C?j)?>(OAbcQIQrdVu4z9)Op2_6y-@t2MZCT5&FcRsk) zb*F(kL1qfeqzQx#x1rU*82M`A!x~thcuCs6?S=I0md)v=8?NU=Gbe9^tR3XXpM7yM zPE=?>lD&Y&tdDTq1tUiX?LxQC;PH9NT_N+2>!m zecTZ5sA?;hr5OdOh^(Av*|tzarh=_Ffjol&^{qh=nz3wqUHy3@^C~kyzRs7I;_=w` zmuu(OJ_NRaOL_$HEcc!JtfD(~U_X)cGl@O9AkDq{%5>q{HL=vFT8IV2QFRd^uNPl8 zd&fp8!R3}8fBbQX$`de455(BH+`yVOYlzgpC|!K<#X&Gs8TmemiQ}spqZqHXfs{1e zCWdshw51yVaOlvXwC>`KXlOv)NDvaYsVtKw5OzxF-okYde-Wu#aON4X?VK03ZcYz9 z^iaCysw;ya#C1fgsf&de?K0mLUIvg_)gD^@SFc{39((HP&;icF1#!BZeGiz7Pyc%Z zwKiU|DZT#nZ%lXJb9?%mzxiDHzVG`NATyENC=fgOPADU470(vLI_9PkV!?Iqcgn;$ zpAn%Jq*{*4-uI5a+q+LF+5u|ixFImLhC=r+X;m@c5=(j*W^TSc-dTAvnl`phB@oZa z^-FZzXO3{>Ts-G=^SbwYO#MN~v|qqU+Ma47wQb|MnmUY|csUIYb%X1(ch$i|d(&Tzl2#T(2Sm~`tB?gcy5fS*-uN6N@n3(_b?HrS zyeTc1Hz&}I<}0tfGF^M^wLvgC2owr+6iFC`han8p4G^m!8l0)Y-Fkrfl}Kd>%+{)HBj>c6 z;G@prX`ysdMFJr;%u)nZ!MW5)AnbTPYW~6nsTu#_EnD$$LA}(D+NmEMssTy5Z|QAu z_QeT&as`ZU;rqCX5sI-FN!ivJ2JxY0GTlZu;$oV2_HUnll2jEWhBJ~{6-QThQ+oS5 z-kt8h|GxA~zx1m(1T0G5@y@p)2J6y_w?|D&jEjiZ2m%+l$$E9iPz+i@$Rm4u*z*pc zpgIb!^fg)vpG#`o8b^?vO54tyl>&WftF@A5P-a)87*kh6JLnsW$D}xrg@RA&Mu} zt5rs4+*!WSblQ<26IfIqrtU6tiA(_|Ry}~a5Rq)(p55ub`|eBcc-t+wip?Nz&jA9G zW&rR`8V0ITikKG$8!ED+91!=O3u#3JQ$hF#4jhhaQgy|GYl7^{-Jk{YLuGhkh76?GyO+FEUIf7L}^O z-`jppxNO!DNi7FwwqH|N3qSBs(UU#+r_UgLd>50mnV>q;U8|=*-a&c^^7@&$?BK!U zX(0{~IS>w50q$yRn)t15SHmCbMc}0mroi8I_>T4=O?IKvHE7MT-@AwP$_bVmpn=9% zDEganTo{PVu)I~+H1a-6z91G`&GY?8QM#Y@kak-*^L?}CnC4sbpN)`4a(9x-wh84S(f}_oj8E*4T9E#?*~lyu{X&?80a>Os-?oMP>kD!Xj=e>T>awMFQb< z_u3M+U*pd1bJ1Jvg(U~HCkKLrEPEe7ygu!Rk!#(rNGwCG~0qQ39=%bHD1gTWoXRDFA z$37#MyI{eB5dXA6NZnl@qKk~6$B!Qm0^+l7WpE3j^4xTpxCiWC1HK$D$6(Iv1?j!t z`Mm&jBYB2Cn|}IdK9-KKPQ-QBUzHwx>>H?`h{OSRL85}?mX3D};!y%2sT<&)o$1iQ!!R2UhD~|PmhB)=)(c)l`fMr>4vfj_ zIJ!B0!cLjIeu;$1;K`0-ooVwkFU17C@7~8rTYe!C-*bVPp~%5x7EkCw6oaOO!aWcu>fR)VJpR2$U$1)}!A{SWc}ly+?2g%`|%v~2kjuD1i9z&H{^9Vy67 zQyxSMq_0{b4QVh(s)_(TJX|0obZ;at92{tX5G)R<_g6pu|E53qgFi~wlRN6NORo$A zXtX89AsaVQG*#w8?#tY#!g7J zaISQd)l!i5WC(}=C){lJ3{hx+}G|M-t_ICv!e;QPNnmPppt z&_0V87cw9B07!>e|KZS~Bc!8Q1ndBR%n$3X<#;N~ln@9TT#?>lGOj>;y6+qJ#2Ttj zOj9|xvjk`-Vw_yNA1g9Q*3e z&%6!f?B4qs$~f<_6Wx16-UzR0c6$Ty8;8=PkNgDOn*Qtgn)e9?W>SD*WKy@oxvgOG zl1va6Mi~fmC&}%*I8a`k2e(AxKW5LKgDT-k2v1}B&ENb((t=!$Uix~t$O|J!lh2q* zK*^v9q%?Q#?0CMmmXsVM_S3E-%x>TDGBBM;sd0$y08G~I^rbKTL;9WH`Q1P=KmAib zo0hFy4Ur<#Egnqjt0hp*9T8GBvvj_~=jp!NakQ^YnK8_hqaJ}Eu#;o8qbLnEw!Wzn(8ujZwL%(=hcSlLF6s6Hu2SkQ09K9whOLw z6Z9d1uqY8&LcFIVH4^#E!w)~49(?e@xNe$`>#x5)U4HrHf$071L~sx+4n(LfICk(Q z2A&hCD0N6^EM9x)(Whbop~cHraw1Qv!AfowulwA2E`dj1o$5~=?s+0RRW*_7ffO5N zN}WB6d`X+GO27TvSHl@S1hRVp4ro6qy-F=;bs3kB?9GMKq&Ml(3r5cn17lm<< zd2p@l2H^%ffpIYfPMpX_vKknr6tb6Wo-Po-bLaN-%u_q!KH<%!DBDOEZW2Q4un!I% zJe1a~z5qd>IlcQ`-;-{;?Y8vzW1G_-|KVSvoWJ3_d@Wp98&dYFm1}~y z_-%sTmMvS5oKpJO&wrd}>aaV!Oh2`z>#n^iec%HhNS9uIW$HNI7w)ZodrPZoHRpm- ziUC_7l3^;UDn@e~r^Ns1LJtU24UF?}O&@U9lUi`g77rQZtAmYjWN!^u`ca}_DKHj4 zPVpz;q=K7-Jz-3k@_FkLfBE}IfAmMw)mLAgKK02@q|bfsbHM*x$kH(B=x3vWtPT4` z131ifb<$4j6^30nYbwhW5D1CFC{WrF9R!>#2MIs=;C*TH*5~ndxtPJ|j7hH1#SSWy z+exi4NEfkt@4Yvy|E^GX>7|zjQP{L;Qw*G)B2tjTd%v4SLLjoS^PT8Ya78hT;+?7{ zi&BR59waSwFZK9d+p4WWm@uTvKp0gBQAWIG^3NhkoYymrJ`rIX3lXZ8-addfuk7Yp z5CU&+M{l}x;}s?Z*?Pb5<2m8ey4(zAD$n{35xn&U zSBd9Q4+|pMHdRUc_a6YR=3)crj&}ag5C6N+Is4t(NP3W(wM$r^wvHo54~Feb#%24C z1LMEJe(>T3g8$$V0c*jCIGYuo%+IL$mC zN9Sbq_n+^_jxFdX#<{<*3+9Fesn9ZPx@_Z!Mj{i30ymDk-kKE>3!{6gB0LL2j!D@& zz6B0tn6;N4CmqohS6l%@_1o#QpZ#q5vp@T@bmv`PPw)SM52RKk)|X&z#a}WA-Pl!4 zh$%s{uBj|jKp<>xCK3t}>gYOg<&si9#RSxTaP&=Y1Sx2Y%M)60T571|pyB3=U;JXE zFt$TgAt^2B8s;RCm^kU}aGw$RO9Y(c7AKYW6eLmhPI^1jI^85JW)!{q0a7cIxNphg z%q>{2gJ)D_8N{e~`p>vMU>}K8?Q_>bw*N%*_Vt`O^FX={G2t{e8|bqTueM_yM*^Wn zf;`5e8&43&$?}T)g%oiH*fERE1;RB4i`Dn_0O|M6IKP>waXyWFDMs zPm-&*WJd@mv*Rm*mV?WQCWS*c;mUVdBy_@~!BQD+a^%0y*wz8t#Cw%8B8Uw{F*FEb zXQ7~Byp7OQU|7U>zHkZfmKhcaqzGJ9ro>2sp*yM)lJ75s&puU3%EkEuA;3?|^Gf2j zvlq!rTSp__EqVh=1gzV(3E%dK?XE5rls3ZCl;73&oR7!a!RWLY@BJhb?S)xbzH}Mt z$C&{m_KAJ(7+GRpff=1_PF2bn2(Q)=uv5WL67ZSW8Dvf*@Xn(dZ7u10zxR8w<;_c< z|Np;0BE~;RtJbUySifrB#hK{iO5FgH)LFr4r+WWnuN5eqY&|?*;k3upWM|4D&YImu znu{fA>vPYi=bz6~gt}`Hi-SB-S*t+$3QTB7it_q-%K=~8PX*r}eeMB~S{Df3 ze$}AtI2lRrc&M9y`DMHD?t!RO8E5@JS>W4001BWNklBpHZ50>}`+j5VnqYlQO$Wq<|+2m5GUpJEcZZhL&|2hr~e%_zD`WTObdmLknbvQO|dewCzX`2kt>k9Q)wr^+kxb``?jgvK4+yv9@y$$BJuhQ07_qi_TkU)&nG`O@OI-`j^`F4ge5s$vK zHNCifN30jngBV|mfpnkw%x40zs9!BBfk`|ZJST#aMFiv|5+S)2iNJaa!YOr@fsjB* zfE-vm)_Noy%NCP4Kw^Tj7w+8}gW&@s_w1`;gKxAK! zxhdlR22HD*ue5-W+|p@T>Gwgn+|IMKDOMVok^HjQE8Aqq^|eZp4< zUR&;)K=$Qc-|w=k79}QaJKB2uu2zVq-zNM9(S$%t@T}i{FfX|Qp-OR?-;GcA^Q+1U zKdR23e}|4o3;5swX}yPlyS=;jgtkMc7hyyMZYg6^j!i9Z$u7@vIPM?E%<*-zICj?M z7`r(S)QqV45N2dl#CiQJy}SP6OVam$|M#a)gBLw7Ob%dU8lp|wZmoyrPidJ#0%3>X zE(l^b3h^id;3{+N7#~B;^yW83M@XR!98veCm&ivy`q8j42>fm$jR1UWqq8Lz76-PR z_nuP9K$HRX9*ILa?{iKr2S+!yYYCx$^vP$a8x;qWO|^$U^7K9LK$S6O0LnyTnBtZB zZ+ZJS=iWXk#eS;>JP~#uTriy-st^IW0R(BEw#>+qfWF}pYdvUu)dF~AxU7KSdKF=#BG@Hb@)ZtTTw(!c^ioiZyt--MK6>4*3jeJ3X#g=>+n1;jg2 zI9Jd2@x|!~-`EBRdhGa-cy|*E74;1mnT>J?msU}U^TEE7uzFs8q@Mounz0n643PEM zdoA{X_YTr`o_CQeVcGNcT?A3lP~qA8dgxmvi`k@zaPH{_>HQ)mk0r3J?IiT09R+#C zi_X(OHNdL)LoLPj?c1VHGz6>fuOpg%2$%*!N5Cd{Ncy>EM6)nDZsT>KeQ!UzSsWva zJ$@|~`{)knOvlO_)dnG2&*>`~*T?VCk?}QQ| z7#!7g>?nbIhwyLD<5j*P0qxL?}uoAkLXg9CBYdcZ5~9dI*gO zMPlii+%ik5MYTOxpEeHrQqN24ww@s*3&*Jj3O&p{Va%paV-Y7LvO(OB&))*<0e`N7 zX&g!){b`@BT)rYTDFL(ilEh&ui!dR)yD#&=-_9d{@7=#o9au0_O0O1$7vVOOEoGRg zYvVa15M`o{E@F`z9V#NYO(Q^I)Ii9K(qj*PBRrIF8A!K&@o&@W)vMD-KJt;+7w*0w zn#m5%SOQ_Em%*rICS7#lIykYs5cu4AcsOz0d(O8~`oy5OD5zybY8pi)5E{k2N5nG- zXFLqoGtA_Y=*y)G)FQ6IiuBM&kXfiX3Sdmop%P>3jSaTnS_*-19QwK|62OF$pwiw6 z>OXg<%X>JHAHs%jUsx#Ph+}{8vO=yM6rJ7OxfqN4I**oNgwe! z+3;-8AJVhlOCXVfJ|r*HdqG5yDDt}B5FcERjn^=!N;giU$9v(1omUbJnJ?ENs3S`E zd@n&<86z{ZItCl?vXt2B2%y8ncty}eCb4`0~J<@hFHay32 z&^f~W&W+elx&^1M;G7YNiC&XAnF=R}DnPNR85h2L?!H%B3&BI{BdMFw){0OPloAgi z$67jUqWVvF-T^4Z4lN}Ufts{t?P_wZtVuhzy%bVRa|`JXctky}OH_idzNJfWmjGKJ zXn~clb;8JP7C=;*>qjjoQt_Np1o{rtFpd|7GK{Y3%KJ6wA$qH$ckJqCpdupu#KcAM zn~7FIoW56NsEW#>@mbycXsJe^qvJYyeG*5i4790?x1Xrmu)#neV((41TZA&Y*Rv~2 zR@xA>x8#U_5p}>fZo8Q%unXc)z1J9@Z4VM_``#_j2_=$xT#Q>$nI4Ovy8w0i%<(x) zDw_iP&MWnF{phV39K?&f`uc7$9><7f9wy5Wk$|Q09juO zo?$FlQ(2vAf=A0kyst&#%$r^M&VaUybo`q(kDVD8!%hFTF*0sK+qcVaKi zoH;wvXq0Gq;{iO@#v$=?8!2NE_{fEGao|{wBK8vzeRcg+7$FFQkY9oRvF+n`TdNDp zyXG*4V{9vW^vT)FC@Gy?cG;%t%1=6Wd>k7$$H_S&0no6i;nIE*#!Vq(JIwLqz2+tJ zUZ0V`&%}5mQEI?{o|8e`TkyCtf7JP1?AO|Gp6JA2eA5lr1?~~f?YpTij;{n?wP1Ol zdnI{eB=+vzn-(ltj$H}+s2nxLXY|0+6@Rh>>U7^XX##Po7f9e5$%8P6;m{5rMD0-L zvY)7#SQ{yV-&U<&9TZX^H~)x8MUM~>%ehc96@pVbw(MgtKys#XyJW-qFyM)t=FDA~ z>fy?q^0q&S^r=4boBW#nAi!DN`&-0f%7JjpL{ivG=1>WRsf$1V`OlNX=up~+x5qK! zTOt#t`fZ-|9ubr2OFXvkgL@sfk20`VUy@4_>4`iw6bc8El_0C@ANP2~*f{Rh6Hf*~ zIPuizudysrz9Iq-#5_Bza{O%{J@UvC6?o517o+u@c;vh&<6=E-5(tU4L}G}jb&dVT zgBa1S`|Wac=r5D-^6cS43b(97cqan-W<4?SS|@uHg=;6j4-EXWJ2WzNJhu_tsyEhCd@2 zH*DCDc0#d@c%8vuX)`GUlJ70gjE@LPecx>RY62lLGI^POBx3GCC2?CInrow!VP`etvGGPb^F%=nH=6v{n3SJrhHX=1sSPYA>Ijf7Ho()J)?)}>L- zUS0P|?;NR1uF~K--Bt}mJRW(-)Jw}*YQT0bsbXp()2(3Lj)&4b5X!dgBsGNLqGQ8r zaL4xDY37`{Y5A(vIAbgbFCE)vHstfU2%pY*({Y=u(X6YEm04W_0iPQDCf#)z6{%v% z2_Q>_j;*OyoDbnqMLYW$%VC(YSF=n3fyfgCt#%OKNL9=ineJF5(1?iJHi(2k{+&l3 ze*y%vA3yJgYz)O9=Oi$gO8@u1FyK{B-dEl=g+TbE$gq0zociIJwCm#a>qrB#H8|gv zwgKE7Nx6Wo){y!l+Ko))P$l^EKkp*)34YZRIQZ3{}R)E}c}$c%5`1 zpUBUZ=TF{G@Yrj9TJNP^QUP_5Cv5E-Ze&rQx$(P^yjGo^rlQY%Gq$0A@3|<#gYO7f zKpHfU8F8khqVIud?Zi0U2Gcy7A!43^7i&k1=GjJgF4}OaIwnmZ1gcyzkdOQf?39Dj zR5uI&gh1bYKWut^k~3aMUgt2%LsoqQ7~V>@M%2y*_veclExo`Cm20*?U5cgTx- z-@T`w-OfJy>{G~sns$)ZOX`|BeRf#8Vwt9P2SfSTQIgm-qtLEaTo06JV-<^gNRe^F z5Q7v4D&lVnp+pc^>&O)7`1Ih!hxgUzWX36xc=qhs;mrk$!m%TV1thY8mK9GA&3LRC ziQRIpa*FM?uj$!e)8F0HuQ6yHfu;(Py^h?GKw$#38RCIS97Gs0Ch{v2KQRg2>Hqpm z7s83dM1yb$o8<8{S?;NHI4z6lf&e zaZH$bA%%k*2LCB_s4-o^YQ6j~9okc=_7sF$rC#bLT*tbMSswH!U4zjmKlqqlMV%8# zF362NeGOy4>aVa!&MCF~fBTMI;qXx%Sai#DxdJ+EXFo8`xWMn}#swfu1H(vU+K!KH zW)LmbB_*{Y>9|xFr$|x9)>FGf3*<9l&ARnr>ZA!qYdhC6<|uG|`))e*_G4y@W=9v7a6O$LX6fPO4}#AeaCf z3uQ4OhJd9I>s|QCl4A)miTZF#`yKY}-J@d-H!J3)aF32neCXi^!rVJ<4Ko^;Xzjxy{s8Wo2bz6ce>ZSS;cw_auUe zZX!tFE|zKtS}ck(?l1`3G^jYNRT&P50PDYn=I%{#sIh*zexm*+9HnN-US1TKB&y4K z;?W}q!q_pR!th~3j5*Lo+MCWCJZ*d4ZN#88+T+ke3=1LaynJloE*@sxzu%z9_%#-6 z>Vq0xhB2sq@NjT7mmzlyB2{a+HULG3`!iEz^vq1P@xS!$C*Emd2kQaEyP%!BxOwL8 zi#NII1j-{|Q8IbbBsmM*X3|5ktWP`;qoV-a>(KJu(XnX^e~X=coW}B9stO?trs_t(Q+cik!PqyxeLom578R2d))h(({VX~!f=sgv@d z^Y#Et93c(d!>qQvyxasKHm2^~cObkxZ+>|CXU~L{3*I!V!Lo4^LT`D_Wo?6lyv&`n zEr>>83W0$DHQ7CbUYh7RDims`~#%26KBpWA5J^9didjOmRml!V=##!To zX<(Q!e8i|QwtT#xUqFOR4*d7FqsR234}K` zclopdf(#5gVeU*l0=#U8(v6VhjzyIVdy<@4X1G^cVe>>(EVQgGVrM3}aAP zZripk9Fi5<&2sIIA3IaMO8r!yst)lH_Q362hwhVS%=sU=EF{^Ae-GJE1FbJm8tdVd)(Y9?n!Vo!K z>)i)uYbnNHxX=h_ju_OlBLk`=6i5+MV{ICKNzI3|yjraRaZ+B1c4PLIPP|GB&|5Zd z3LDq0)gHI%aL?Uy!+-mO-wz-B;BQEGJ=zxO>NH!xZxZUaxF;gId!VQ~ArET>^ah*R z@}cwg0EEs6qL=~<-X&t25!PG?{p8Ym%9Keu|6qD3mD%jc6UR*jbwq@-NU(#WMRf5D zcD3~KI6h>ZkjwB>2x96?0R|_s0f)e2!zCO=u<{EA5@W@Cn}sfDfYE`bV?bTFs1mdW z+Cx7;Tm{u}tXaKG>g7_MfcR_1IO#7K1+!)Dq|If3$x;HFLpg%?j2QSYpMN17 zKY1$LGGnHle{H7(5=pqmdSdLr$oLC#T)&(%2=815hl>t(pe+%1tU7uq?BBO1%n%13 zI&7#7C@wHKxFd!XIB`?Y#O_QDT01ZZ>IB2;scBrX5TQyQIaj^4R)bY&_QzDn|1|+- zt52*^s-hiqOI0LUI_p2`8y2u@SV-2|Lthd5dNJZ{+qQ=FYuAJtnOKgJIqGLW{i*Ol zxfY&t$F0I7EriOVqqm&!mFVDh7NIX`y@K&_M|{rQ@zx3gW%GxhtXBT{+V=ni5uD?S zk|&GW(YFtTpYh{BoWU}Iz4f-+bjI~GBaW5ZcSr@b&t@FN8=wuPtU=TYhF}SdKf%=E zP%H;S?uno2#M`4;V*P1?Q~t7D?~zu}X72-Bli+{p#IYk`%Z9b#?z`rOxpU_l9k5xl z;sWz964K-{;1xE~M$PgxRoJ4P)33~X-8K}DDJxfBYQ4ugR8$BiC!yKm^K4biZT)i2 zAdL7*dLi&kh#i9WPPwfWK{|9$Hrnz&IYoOBAW{qpreEA8r>G+uNOS}!dd47)&PfM3 zE25Qu;tT@B@y^G+#?IZlWkGP%HX|{sh$DeSk}8gS>PK5jZ)GJjMl-2RmB5WP^^Efg zpHs;DtN z1nL(M3+W4jz_X7X{m!!=#h9^@`Hvme199x)Vl$Nh2O)mo7URbvHpi}-S5S@jgz@F! zp1ban?t6f|o9+s`g$rlTa*lj=+nC4N1gb{_k7_OOB3KC-bfsYeKkZd~h=N^XEdL#6 z9g2IEA=`{3TJT9l3aocK~gK>-f2=3*!b`mCXtzrTg>2!dRX)Skj zpxkk#i(dSsHpSHl*yd`RI|GPRQ)JR9gf0SD187-~&{2eD05g7Q3a}uD z$!Cc+8l8}=zxw=vsb5V06Nx1Sz8_A(8Ry3EG{R}sDT3tb)hjQ#F#li{6i812tQm32Bf z6cDcCJ0Mk`{H?hj0KQ=gTri8|xLy?Qq2SigOZBK3qf}0(q}pJI_OzR)*)g%lj~~+- z;g+yX7fvnvYK_h;;Iyt)Vlxm*1qd?ZqB8^sm&Uuk_>blqkmX%^()7G&a}+e0?ZkBj zRNEXsuyxBOt-TEjkG}IAwkS_gFovXwE9r9?Y#j&5OsB*hlv?jutp#0_$!o>rDW>w) zqY1Bq{G#9a(CK<0 zIcukKzzP=uxQ`pbQ2WYn7VB^lC|F}+mQbnHGj=AiuSp&DsycSl=?53~RPOgf|BT{=;>EL-`<^D|&n8pNWQXJdKbC@1>a+2Rs_ z5S-9j?3B9o-aF@LfqI&48iZESU&MFD>gx~)y7U`D6W@r#+NBG-$?7I)g5gT?W7@N+ z(^V$>y;i^VmSzyIhY30ZV&s@Hws*|ddDKUj)Ja-(U^0;k5#PPt{ zkJd$onPn5Rnu{zX$-EOAaIb+?CsQMH{LKiq>I-nQBORh&tD`3(4+5=H_i=Y;vnY%6Q z+V4orndOhr{-6i$yI<5lgoO(h2sd`x5t)Ou6Z?XU9C~V_DU7C0OosTlYXOI0G&sH_ zIGi+=<(;B8{?T7u!M!nQe2QXcqCm9;hJ~ZhLYa5VTEm#(f&KeLY%hmjd-5@DCLC*S zPq1JjzyQq5SM`Sp@Y@*$S`ZiojKRF|DvmP*?k+$v^T@^=C@V5+oh+y|!Pnn-GaQlY z8rB{L=uB#64@}phg<`6uMhl(#kV9h+@T){p83|64vGVcWI={-Yjo|!+TLDObxLZPWpYa(ubG^QAPa+9 z0fQAR$;(wPtpS4e9<*eBMFLdLgf7$_$>_XHR(s1K;_0fR;d!04(Mw42#XtW-_=7+A zeOau?O}BtMo^LEBX8;|WggX&q4z?i?q*cG7OR)Z>kCQ;j+o;Bh-;*`UKX;WLFcfOQ zpZKehSQ~ZHPWhguYUS+gDN=h37|=g#-n20skaN4E+HF5oo|w;wu=Ws6^pP__7O~ko zfkh(1h(Ig`z)4TJU=ZZ%a2TmY!%y+4cxoFPJbOtqLHXz9Jz=Xi*c{!$17}--RcnTI#2@m1D;^ zBS6P$3VCTu)UQTn8|6jN4CX+&v3-p-;H6`GR8hol9oqwq^~*n9aSx=1F5-|_zTs3d z7pb14ro_CpPc~Epc4>t@P<2#gLf_<`aRhIm`1i>I4IgP?~OOYvL(yH z#K}`bsg7nYkn=v=6E)C1%Lt*&12{Ogk`Es_suP{$r$s*9*SloNR4pTb8r#F&~o;B;6)mh5gX^$>HFr* zo6TnxznMMYT#-1AKQIT@Cf)FcHYS+_xJBILyJSE3Gv80jFyPteo(m_>oC}jC-;_GD zLk!6xQA4S#^w-*wN*G7Y-{cMlJCs2%knA^rTMr&QARIY-&^B>RoG@Ms)}&c$bB${dEC9vx3mCLQtwpe~wO*<(^n-oyz$sN2)nT&`gcKmi zwG~082GMrZMQ2V`soze7RV$W zS8E$S3o(9?#pK#GtEI}mIlSYMhr>JH@rb#VdGNsp&E3WwcidqInju8tR(+-1+ruz+ z?%Zk2fb&Y&X$@mw%>tp4Ks#ew?Wf@y_!ejB@m+I&$!G1_bz%OSZ-!xFydy`A5rbxC zBKo4c3&u?uMB_|CEu{43vTm1m9m*hR0gG5jCq3nd2``F!--sF$3JRftH-T0lTX z0Em&@)pPbc60Ej%jdElVCH_G3A^6N3Y<)q$VG74jRLN!XUYk{v4lb2+B(PHzm}PVZ z266sOm8k$WO09I{(1GyOyPpbw@#lXYZk0Lf5xETMCj>ut_Ov{#>Uc_7pPbih0!s~i zT^SIn{c$xR$|SxPVMK$zrn~LNIK;7t48orqC;4$;@_)Nd4=}ilA9rp(#;LK@Z`8b~ zkE*Iph~VqYkA58D6y4xsvBVn0O*c)|rn z7NilL%F42u8F*Z=Z_{;C9cBbAY^KGx^4rdTZ z8F(4JAb=V$uz%Po-5{Ng`)v+p@2;t;!IE{4nwQvBk{PT!4g)aoXmjjXu@k zwU=JdeulH*lOO+h_{^t18HNol)wK15sp-zKQBG?S1pM%@@Wy3M*z}IxH)?a_)3j<1A|~}HOBhQnnJa30fNZskgP{Q1kuYQ z{W60cHD*+pGHG%+F0=3j+68>_)EOhJ;AV8i67$Du%E=t%`f~$(r^9^{7^9vM{v7(~ zX@^3dfM0vlaF-dom>KHpi*j0dS?$kM;;#WS?9w zo%-F{(OF%6K4nfOot_3BD(zb#MAR0i_MRGEs*ZV2A~1R#PaT0nspD?XJkZdImv))Lf^=Z3!Gjp}6RDg=yZoBFNv@i!{92%LIQ@J4XY zhpyWL4x<`dBfgBYhd8#t3f={9+$T`9H3iYF2t$I&nv}QTDOy~er3Gw+ki`q%42N~h z=~x+?pn?@Wme5xl25CRVF}bqoA;GI!i`X22+OSW<5CdYDgssMB#}B^8=LnCcAS12* ztENgHafkH=Qe(x0CEq16iqle+ZQ8g_ZhdYJ?|S4R+eHrS!xW$m1cg9Q1#q!nR);V|DtX`Z#<;T4$Fz2`zDdM43(EiY}*jAo$89JOn&~y&K01&Y_ zphMWb2@%KrHj)cI=OJ>ugF)Ed2&IE)IxY21VsHsQ&=5iZ0LB0?a(EHa0(wMF)H;5= zO8LlBX-aaa)uJ38Oqo7oYFksoagi6pAuU$z(>ctTy)uOcY4B>vz^g_rDi)reXpu0-Vg<8{^pnZ_B2NM7kp7Y>TpK^PAo zIuZuT1oq*F9OdAxvN^<(PBAgo;pIqXlm*e4mw>s8HJkq?mIf z1V#c#-5`XKk@*b54hK?HV)HfPR8(FyG7{3VpGt@9$ilB!{+G6G-4ssBYU$p4?$nH@ zLUaLKOO{DyO#^E%tVh83z$MN~N9_ddV8{8ZufAdqK4BtUY_^5YK+iZg90mjZ0T=O* z%tAQ%6>1j0bz5b4>9zUc#Obr4Vv-DV#9RoJ!$w>YLu+}gVf<^SThigF3jr>dp~D#j z0|e2JdQBayE@lDX9Mulsp^`Y@&g?;8odRNSrz%N$CLIhTPGMswC7DCA(-<7H+|f%+ z*BAg8MU@t;C>w^s0vzu#6Gc}~Uc|u{Q(q1IIZdrM$}KsJr9}SnnFiV{MjVRLS=@ur zH(pWF0bnE0GQd9Dh=WZXlTWb~2J(6zkpfAhPv2rq?a!$VvMAB{3~#*tdN_UZWEeGi zWcbRLz7+19JBO^SzA#h*3?e#XOG<_IDgP(m1MSuWJw$cl&mx*<0 zc=?rAbO2SQ7G6i0s%rSi5n)GVrOsF$qIEHtgYZ`~c9vot-s4@rg$$-f)%`LC5yUaI zDjyV_ePE!WsHJZ0OcdFVg1#p2|;sFEiFK=Fn{4fnYS+1;&hyy zAjH;65RT@-(F!WALr}$3J7ElokZN_}P5VA}EQ65Fu|N_y%)vIaNSug=23-yZ_U^a$ zlQgC4t33#)lbE`}AYc^C92kJ864Fy@=D^zq^$GEG0l08(*Du=QvX~3MS(N5GzycGw zAe9!XC(`xMAhKa@r<`YT?bumqmKm7y;gW;2tV!758DLWSl?5N}2=Y-{a$sPGIWw7y zS}0_b53agb2*?lY+pFEJ!@|FQ_q%phG#h`AS}?<-kGN@s2-YLEPU>SHo0EdVW@cGd=hB#YU!8F~XAa&cNF{e^Hk zZ~hx$&;G+<`ixnY7x8M?Kcc*$XT)!4S3~<6>r0p9nnAdJB&}Pn-A_8>^yzAwIRIpJ z>Y$-RhMT^Biw;@eBX<`=c{;`r%s=;$$9JYucl(EbCmRh}Y%=@rhhV5h~UDB*Zb{2pfl z{>$OrrpJ2e!`uh}$@r{^5J?+zREOTh+I*yi{FN(~h8^3shMT8O4*&E|UzO+0GSzv% zq@uwF!~iaBrBCSx?+dR({+{oF_U-}J7LcgfLCq7>m%`|Y6J>(^SQspC!tyaNaEk!phyH+P&;7!=CO%Vcle zUmUzv5=XQafY>ugK67w_=y!ilC;LJe1Iv4M6mQ(P(GGEc`sp8QC*{2GnskZFmoJwt z^`Lb*Kwnf`5=M?5EsLsI;a%^1m+Dcj1@!GH^-Zx&IlD5@fZn-1f6NhDPk*TjUl9SB(OeXF|-lKy6G#rnz;ZDXUhjFoEic#~!uy zJV-Bx?O>7EG;_}<-oYQA0YEI$E-1iCJPo{E6RN zmQ>6>hzo8$r;Txy^7l5TtU|6#hKk+l%_ z#M_BF9S4_CpKI1IOw+D`((P>&fZc8jLe_!mFgCu>d2naqlHR}hfHHtwaD3iz?rddc zr8cFkHRiBizGRp_R#Z%~DdMDx3C7KtHX=2kPh@I&K?BD-n8oI;+w5AtY=sb@cbI$6 zecJt4Er2#~OAQXsEr$X#<+E0%oNx&kH1?>I2oVgh#{kGBNl3ETDAT-3U3cAgSNO`8 zzZ8aPZRU)2Uvh{Gea1yQnHez~;tn7p;efRHkne$9^+0#IgeWfRVYmd`A)p|zoYmf& zep)Z9)o$vC9=uNkbY%GBkA2+mXWq*%hWj6UIGh*$b?Yv79D?>}fkZ6@^&mkCPk18| zox&9-l1*{UXBotGJTl2!vx*)fw%d2exu7KX>CDOAyOStGKzId*xS%Ke zrhPC$-Z5)JUBm+P$kC(1V~;*+IQ+^hFNLpu#ka$q6b%0u)Q?m+s0%pKP=W?;Z zWtViI?1tpdxAO9G+ck;V+6bM?3q#;^J5LA0;Tb@{ih&u&g_?t5xb&yL^V|O=?Ay0b z`!%*}kyz$!I+`?2Yoqjo^b&tln-&7o;bs`W>l2MRh+%NYiQ%TztHL9XJ`(=sum49F zp*qxPv6{_NFc%sE7zT`B10?`QwS~mMqI9vQiU8S;9oxb_Eu@!Em>>YA4Khtr zy=zQ@X91keXtj#VLF6!;lvM%;2r9n$hEZFsDE;Zp8VhNeKC3PTI^1Mu<@T^{`OvNU*QW265Ea-Besn>rDOxZ-@QJ|H=124tl_>07WQ)ah@U0 zz#Re{)E6tBUO3*A`8azCP&c98T_JTYyZeXAy#zb1&&bqMh#{48QK%8Val#|ykj3Vh@#j^}}dkfgf2^R(I#AXkLz(|A1;KxA+X>d@8X)QWje$ys)cw%wEF^GHj z>|NncKKI!$^Ok9H9(d4P12AJarARHwx ztPvUhz^I@noWw|-paU=n+yp_7aPqlwn3f(R%Bf>e*x zazg%+P_Lj)f-x*ww8+*Ko_gx3@XmL>GnAK?Ye%%sbkM*NoJ%9|1ALU(5DaLD6fdOu zsKOB-3$TbkL~11fVZGJ`_G|MTn`ioKCnZGR)MaW1jK!P{Dn9R+88OR%F`1Mhz@k2O zq8C6di3^}+=CEt$4xJw@hhj6Pg)jWs=jAzbrlsW^UD`~39B|J5kl1Gpwa-7~d*GV( zKs48Juvv@N8#ita!-dnBzp~c|e@_ry z+hB$Y2->NxwIqqXZq!AVjT==tjV5B-9KtfC9&7_lDwpcS zxd|2Hji_P{s~#1jxNP><%o@J)o$uI80v#Z_PJE~^XwDd52$3noX)xay%uE4dOnMj) z@l8q)cVG$$6I;1-xlNG=O83Z)a05~`1AAzjJ?I%=WS2O=&#VDcT_hMg0uctHDgf}9 z2yWf7QSQ2z%3XJP`2YX@e}+5f+^*f;N6oqmsftZWw1M>nkS|;PGqo-ME#Cue?E%fj zQ&~9frtT>Q!AI80U=j#hr(^<)3W%A&%o(%8b1yuvvl(_6{0|v2ShHwhJ`6!H&WyXK z1VFqha~?&J1R@T|V&Pc|T}9KPvG!enp9ozATI|InoS8U#EH-NW?yUAAuygv(Id^Eb zu0>*-1AK|jm8I_Mg3U1FQh#4F>a9F0TOLgw_(J*4v z=rDRrnbukn47KMW3k_;h1>2ao6EFxyNSD#+NUTl57ZAWCkhqI9P2InDujvlU#*GWZ zhYc~Q0fNoOIToP*^hi(;uGP6AN-){>XEh~=;Q$qaY69OpF0>#Mb7xNp zcSO{sBC3-W&}HqN=%I27H4{Ph7a|z`qt@koY+U5nT7Xoxr^OhyNZ1;w4W*okGFT2P zVIs9s{UXS*j)~Cc+Ka30A@iUB4bgw<3a%5NUXkt;iYDOu?NZpfy;5}Pta)u6G-#Oi zR%w03l9C46m$(}GliV5ueVvGfjGWWZ!3=`dA}P>D{Yl-8LGV(YT`P&Xzt$hBs*Y=F zw%1fS72_vpYkyzU^Y7ieFMQ)0->|`E)_`Akb}%BzV_kuy4InUO<((6JN`!f2lfX#} zagM;m;Ue<3XsW5pszd)!R#t8*t$kVu8!iUHCYX!*PGi(MAxG3rqMCxRW9`8L9_l2d zjb6%|srOkq*n8!rU+H^&_{%T;MR?DzJt>Jxu7sHiYZo>CrzjT(UIhYl)=sRStQ1<4 z5BVOr_B|lCU-4l+4Sz)T*24;3{yjeyyffLja`*rXL8Kh(?wW)zsf)(LOB zi8-=3y=Lut(TCD-^DQ&&ylK`|>ZAc_HZ=5S)2~J%6R)mw2BDT(M?g>s8fX@c>@iBm z^^)9+)R8#sJAC+%+=8DAP*Tb?>`k@^W_?y4^o8ito@3g^UN;_%NB<+&M zT}QNc#y*=F1%t^u0vw*-$zUDMD5NeH%puI8$+mdjL-p$^g3gho#2r3-gk}o0;eh

j_U;aw#Wb{hZD+PHgJ2PxUDBuI&~nS>&8C*(K%jADW2N^& zoum1Va2IRETCG_`2c01L)d#GtqM!zfOLZ;$M#?8ZT27xit2Wn%S6+QRY}m9}vxi%3 zW8C@kwYE;l46FH&B0#Br^qE6?+*~t=wz1Fj+Fr%)*nUx8XAIW4kxB4~MFX2l*o3lc zcWKx!v)A4G_J-0SgTmhZ`@-7w>%zkVf=QF6m}K2c(>5gR%1Qy2Bp070a5qj5fmUEp znN2|aGX*3bJ4ZoM4O8U{0xaBYARUmNO)^hD{!z=;oCd%e?t6n1by(LLud9`Ef=J4M4y+Yv6AYlHStcwe1Y%l{K&zwGI$9l3RfeIFhpR-_o@Ap0; zM$j+(*`NJ)t?3noPk!bT=5A+-4kH522lgKn21zKSko^bthIMP!Y6IM^@XU*^gtO-^ zXszK`7%gXjy|s>aUJK%QADB6FhEz;C-&xF|myBJQxfIHu8FHOcB;@iVj` z3ZM9Ti`I!`0?1onWI8$Q|Ho~(j#QnUcz7j%0 zaSvG()m6&`w|98YuRmoofMo)P5km(W03JGcIGmRBR3!#bB7`_6b6r&^GA03NPZqLu z7|SqOL5&{qFVicD7WO$8YI-w)ff6dp)w{)6#eP4F2~*YE#eh_dujGh z;1DjHPI6t;VsUpZCL`bUM9m}odf)qg!>oM%?(hCiYjbtsw%IdnF?-CIG1|{?Olx#! zL~u)u=$Dob3bSuJBRAOI8 zLhnIf z4PqdHfJB$A!h&g}e0@81?1;*_qyvuThNDLgg%wK{n$&}(#<-C~!()#;py}~#wowRX zgVX_1vba8f{`|0M)28r$w4o0xEtmt+7Bd%R-+;WaL2v)-2f_2u&M1U@qbFM~X|JiX`PdAD@;@c<>RCUA(*&Ye5WVO>c{p>1NtY39HD(?8qn znvJaoWabX;(-uxjq>rf2P@SCk4&fF~?<6$IH zFR=i{z_S>YpqEXmr{QbzyQLqF7>+pn2C(=|82|=*ERM@-B^SgW1fM&1uBNy%?Ove` zI@Ep?xK7gx6a@w6>fE!+1bqiiXUOz*SxKW$+QB8*2LT26Gb zrKMcbr?-J|;v)Fnel+vP$DdC={ydW>t*T*zp8S9l=ZRD#?6l zdt2*|*IIUQUzFK>VM)Xl8%t>yz+v`g9n@Osi(X*--j zI0H?|{ArDiyQOj2%V8lGWj8!{@DMwdYR$0|=Fo4*P}xq~qVWYy>tu1%U3z(`ngqp$ z97$kK%e+-T-T9a!s}o6nJJ3R;I5dQ5E&%>VfAmM;vBw@W0*|hhxU4e(q%5GrP>^Nyjbo{2?d~;$!Ui|hr z{7#n7@AeLk#MF(l3G@r^>3`nmGWfW+R7SS;d!1WKPhZjo${{b>w`02k%&#d~$kt3$d=NY~I-~R32%2?x%!$17P zKbZFeGzA349R^CDVVTIRz-Q&)633oSm@vW8f9-2uvo_s*_uUQs0bG;L@jAUeSNhxb zG$|22rwG)?)$KS3ySR_s2FW^07FTGs@hv6lBxGX7)@m)2<$taJbg-E# zos*J!5qKIF0C=Yk*KhnYVc*Qm;DU6RoEd@L^ZtWJH0T9p-7rx52BI0MfK7|qHfYjm znoTq_i#Dj407QTigyDjqI#O^)>iOn3zZqV9@kIkn9CN+n9q+K?2AKg6$I~;lg*hCS z`Q2ar)n6Gfef{fSHz|i12D1me&Jv$zm;?abnn2wMj@Vw`B+@$(N!~#=%HSPsgV{l( zoUl-Tp8d|V|Ms@|yIkDq7wQG#!CZOv`gWsnL?Y~>PGv1Wp?c`2c;*+n#J7b-Ulc`Nt@{M)^=gi6}4|v2a zHi8zjf}j2DXXeZ3jyvwKnF5Y75u|7<7wJe(-M|^rmTN|V-?ca2eAC=+;{%FWJZ+&} z+zCEYyOR2*$K@b1l;b_LzQObWUu^yQ^_OMU$?(&kJrgQ-?hZFkpCR*Bd2)~eO^vL$ zut0=A7>%R9(=+WvzdHegh`rIco6x(9J1P>SXfX-_5;PDq*dlRa0AW|9U3 zNeHF^Fq4L7o6~ugv8XHh3$X_H049Koya8%}8NmGafB$zoO=`}ZIpOo4|9rsT6LCO% z5RE+<9-n;34`1-i9=`B}FPJM3%yE&Lm|+kHiHQ82IAp3Y@sk9^+>deJ=-to+x{D{ll^Y-Ul+`WF3&lq!259&Zab9q~vyVJJj-naH0eU$9q^k?$V z6ta~=pV0=GvI`QF0pSLAfV)hA{-KQYkgZ(*?qllhBp<$!FZJ=hrcVCN`<*zXYfErq z4g4e7b0I{LH;3s!+;O^z`W4RzsEm9J=p)j@Fu21kun?jzr%ah*s;gIDebv;sEMB9^ zqVB*FcgpZ~U2PkBX`!9GFz1bKLUi7Pte2K7TOOX%X?mSL5vwz0&~J9@6JAn0R*N{Uw>2PNrI*99wXgp^Mjx0$)ci<;2 z1SnI008uWN$A>5o_ze;ghkPIyFfovr_mq?CKpp6B>O>vsQ%)IVVUlP1G*d|SOLOta zKU2uo#%$@mFIy_Z^M~<`962&fo;*2>A3xr7?c~k6R;Iw15NIc5K_nrVTt2p$(vyyU zB_D`AeGR-4D4%gA5Rc0l3C{$tzx}w1Ka@uq%$%t^^#Io?n|gs);2N7@QQ?04;~%#= z5RY^)17;533%JKw(FE2uZo28F@P~i+hv8e_`j)LrfS2?!{X#o{V{hwKR9#6T{9}zp zpfA`IhtbKrdGn?1=ouzXnko+p!XIfvs^uD-&2b#F%y|^-8Hp(^d8ho-X&Hp~7C_Hn zo<4OZTxJ@sE?NI`sNC6whr%=;?|ltCK5Af}lDNQTwO_U+qkV3|Hu=MG%L4$&)lZlMm0HCj=Mi3Z$Yw&Lp@K*8}}9efo4; zZy|p2o5yL-yVsRG=~v35eh?Mfg|51*2gVp826J`+fw7^zv_D%Q9_d)yVrIqN^J@(e z2QDa^88M9CXJx=7gqT1+z!d(+xPTYN!ihQy!@vdOLEX8Wslaf6Nnn+9v6C4 zPI(y7)Qgt%(Eh7ctJj5B=e=(04HG9#wmnQebsh#Tci6{7KcK~+Z_{br)z%@G={lT2 zw6<{|fd#um;KYYDRU0P%N5>EE59>EU$cR|5#)2RQ-gUQ) zdMz^wmz0>k0&GYtxDGIzfR|^8E7nV>jR;6FOqW^6W?BrRK}tgE zfw;RA&u_}(?lS=LbR=r%3+3qqfEg6X1cF02SrNkA+@4*nz=6y?{^3=Ftu0CGP#_A5Z8%0v&yHRe!2-WAw6S-sW)o} z%nZN<$^zzLD43zLEH z+sbcC-CL8k(=mufS=BoZJzcaz61-WsY>r7}Wuf(jaT6*8c!$IM1q)3w7&CgLofO6C zQy`suUbLnkT8smd!T>-V0Cv@?RW^lW-2usjZ@dQ?9I5;_X+bcM0>navz^s70zVxLp z8ACwAC#{#`3v)H6CvibO>Ig!39ce7z zs2BNir+l8tlXiGp_?E069p01WgcDadf>AMv7`P*(rh=GD!?VBZWcNZC4r=8{&!%(Q&X2E`woK(5h>)(4_!nzY z9Ke0|yWbrd5V@xaDt7?d>k9($&Jha4;2n&Dc&M5HdH@)pg*kwzFg8yMfO~rS0D?iD zd5{q(JU2fzb{Sjr5ewmF!#6@}2ZflqiEZ$ugaZcpI6i!fXUJ7vvaFhGk?g3dSDdt=%bH@Z-4vSX8wwm6W`h<;E3RBjJnH+=IF5#;kEg1 z=)|~_Vb0w9Y|Vk0MLbVi@tSagI7UrgHB>0iFy03KR84h?fH(&y|0@e18PXGoxMs~7Q~7-4BOfthPEH_& z)kk##;2g>M#(UBe2Lyls|LLFpsR4Rz zjj~A3GjTv>E|8Es_zp5Uf#)58^7!Vzllk+Gy7@ce^X&EH4#HonK-pZ>*Du=Nl>_bY z;B8~1L+}A^ z`OQq4u>#(JDJ->IMa0?#akyCL+bmD4EcCLL0^Z$AIfwKOx zK<#f`mF2&i-a#M$+Gh_;!PyAs2tsV?=LqeH;_m@$^s2-MIY0)O19fEo1L=6r9bg8L zcy{7%ZBHSfm&rRW0{MG-zEfA;k)AuhJ@7qQKYkM^&-3GVGJlvAzllR24Hw8v-sG3d zK)GITFWc*vtaC2wkjuOoqhv_7E!pqMILYTEgJdkck33Ft{QX_>4ngOl1L{=+fFLRLJR1qmfRgk~;2NBlYOGI;2YWj&#bMPI%&b0FVy0 zjdgm(A`rI4BcxgyDpk|U)oY9ZKXl(c@(ptNWZ?plAQ&E(d_Yw09{kzMK!rpa zE{_YM@g1b(og=uXA%Du|0txxe<$3d-z&q;Cd(Y4FAYU%h=Q4QNULWe@!Rz9`yW*Wb zBqZC#Z*O-x1L0dTFxDQ(!!O>E2V`kK<*KXA%df8;pio194F?VYGpI2`87?+D7?a7C1=2iiueSd9Ysr zl~r59F&zYi+Z@zjQ*OFNG)Eo~s_SgyoVBkJb*&g@4D7#(S`l!q5vJQxmt3Tclpq&5 zw>eL*niDGrD1J+dN#qaUadH!S#?vRN!YlJ$3&&5M(pe1BsVCz3BYPrR8vsIP4=lE^ zPQbL*)j|&703q=lU_l1H`FC`#06WYCf(lVbDq>O4H+z9F%pQnCdM=*Hn|%Bo&$O3| zZ!i|_1Q3(oUJuIjXV1?G3iTka2lDWXyb0E?ipP7(r9PzRnS4QJo^yFoHuazk+CV=! zLE(2-58giSbMJTF)5r9Ari*mMV?4Qgemq0S9d25>dpa-Q``P=N_gr2d;yVMOUOY1< zz#3`1eD1_0KfZGjh|jlVIlvM4;OzyD9bdo|7PnDHA*e9}_w@sCCtILg>JM&F4zmbm zDAWTrR`bDyQ`IvQt&j@o@R1YY)%gp`M+RgZEAc)aUfs_*$-t1}=93yVd-$A)QIxY{F=(Py81 z#()kWE!2^QoMwfaT>!{K)2rvo06CC;Y?Fi*a#XF|W zyEH8Z0eDY*?$iTBa3FT%@$#t?aS5I;&*bSBX?f<3ltg~SJC-(M2 ze@K&Fp8qB zdm8_42~&T(f4z?6%d?jSyz)#uhb!{)ym(ILPqw5_=0~0$&-3y0jt_h%4eBYF1c5l7 zkG*K&4{#2i5g*)O=8lkupC|SSojiTY4&y2iCr~l+`zAV}eGNs0(hNvFU8mnYv{Sl| z4kD`2`S6@2Q6dI#?p$>^aq^7Z^#3&U>OD9N96C1i8BiKZ`VEplCY7hDf<#8uD#0YA zxj?0KNo~RGl`GP>7AoHfUPtQF2`bWj6(V71>_q?F7#kpA-~oa&I+}Bg4ni-Ll(1pb z#_*O*;)*zIND@4YZ2&XUi0k&!0{bo+!_lA>P23d z0m3M_kYqfc#+Kxt@;#96f%F~#*T7A1$ng?9X7<9KqHG~K%OxN1j#&x&hFF)tivai! zu5*v4Mar#=PJTok)VHr(@9Ts*1VUE_pB0^fhP?2?ufp!Vhr;lYbPu2< z4}d-&@;#96ftGs!e1oVvu7NWUc+|5ycI;?5Vd@L><+ays;E@&pGAxQ*_nwqY7(-_YE@^OQA&c1pyFmdYW*|r} zNDu%)wg4j_9gA4#KaoO6=VfP0pZ}ikfg8OC5U?QL+`${P0T5(_zia{gBMrC@esd=u ztfa6c#5Wqh!BGf2arn)hbkGepqJr~BjvX}t@3{6e{piO}8(m;e6ehIJ5Gaq}j450F zI{Wu7&mb5`0%t~dm(P<6VirAR-a1)c6ifOJ)GXo^5&10|Kz3{P)u3ZpaY5=uEv{+8 zKzhFzR04p3)WIE{C5vKgz=Kf$V8jEUylhLDAZdjBjlypD@u(WvM+vCwUO4E6=T=50;=4|LM{ULLei?AnP4D!K$v7Z+QLa-KRtY zd)cOf(`U{OCp4fhzdFwj@L2-AiWd+WZLv+ z;t?Oq4D^@)C;5=KGm7*y`QP~-$oD|(0R%NC+TbNbmv`V!Yw^#S3u#EpOaZ)PO_8-h ztQ3hu{(d=*vSxU^>ZH|yLx0#1_uMa^52Yi9hp}bj%$yZmrY_{|3*yik-gouTr5OaB zZ^T@JxE;b#C%b>mB3PF|?KDbOP2(#jO3%2{HrDLkyT`^0?}`Oj8R%$I(lfXY7~BCC zfQZ?{TW`H(zzC2s;QpPvOAMKSfV{~Iohd$PxOfNC;GPfp9?17V%RKEprs5*B zCT+I7^WXD5aJ~0{6LxTu0M0TC$J~|YY{7}PrzJnE56Q2rtjttZsF=Wa0=VxC314rR z#~1hMYaUx)eCcI5*sKf_r{1KK;)aM0$ho47W5|>AFdY{f5elJAT|IPp2H_Gy91v`m z@lnsoO=1`txRSp8!i-tBhYK~e;b+hO!e#{cPq8CR^_>7v07xFl6NbR_6F|Zfq^pNu z66wI;>6*J!F8~Pdk@%KDR|xq-Si31e({bt+<8YjkRTa1 zJr3WA>v>TQ&wlY8q~h{?iBI6}cAIwFxSJ&>mZSu%f~9bnVbT=T zX(E!td*A!(;i60wdP@D|2;smE!T^Bmo(2IyGDjBf{tVD&3&aKB4CwUiX_EP5%OjWH zX(#Qb4+zwYXD-?eu_6!$1a(5jdx#nBA})l++r*uA^3KhHDTg%Pe)^dFyga`9H;)U0 zz?mAq$%~7!yd0kSmLAB*^P-$w24;fP!|UR8^fJ+v`}ljCz1_s|nI!GtqMzwA;_^&> z$@Y3#q~$$hKs+vwNB*83bqs0vmfkO(hH~j^z7vo4o}T>uJ!N`XJYS1IeZ0-oiQmp3 z5cJv_CQh7SXT+l|z%r^%M+7ilm$l`YV*^g<5FqwbRaWi_x6GKSQx`{t8m)B}=$O%Z zF%#-@J%=vMAQ}h8`M5I*-9@`EX$K=Fuju{R05j*#yQJnh7@qybb771QkJ2r~dF z`A)rQKm9`6dGESh|IVF2Tqk(s$1~rY=y*KxgMdQNDAW6fG%zRDm3%RhcZ>sfh#r1; z&>cf8d@QW+)E_USxo^pM*`BFarT_uO!i_yHm|xOH+DqGL4>tSsnKMV~!{z-$J-ywO z#bWzl)c^n>07*naR7G6c$elhWPcGt;FKG$nLw_U#c@c-We5W5h@SFEu4tKAo=S6*;sT%k$6GoqEz{`hfaTK9|?6E#;#6B|szS3sk@*efxx7g30}d4u?gH zmxMPKERw;?xG;Ij)W{qpRO&Dq^$AWm+fsVxPumo_I)8oNRzrb&>K!8`;+vXHuwaev zCj6z0*5K~jyIVd~dWOfJd@4NilOKm~=-`mgefra3+LXyU+(Y`rlmrFf5deOs|D5cG z6bk|YKmh5L1o8vG9XZL@gO}yMJK}DO`>GQNNPYayGsKrWi~>T%HxS5)9mI!sv?+Pf zR=&}07Wvt1!|i1kn}gqgFEGrhC2(Ctmkk56W=`Wo#1z` zlYh^}o%*r)5+(th&>r4-9h`yj4uXdLJuc&6D6Df)e~6yL6?Nt}{p}3c^CJ$=d?$Y{ z#s=8+F`>^%M?A*BeHSJBg))iH9i~ef|IT=mub1z5;orSn>Owm5$z`BFyd3IA+qnq9 zLR$lQ_w0$K6pU54s)cF#txm=+D_5=zzxc&3tb9Dl(kG{mpOkMmjh716)~hDEi?-IK zGp6t23<6@CoINDjx%8#_*lL9YF*LfJsv#AP@w-vMvV$Vo$5m>953edt5_j&d1So*|0l%NX(A84PzH zD=(Wm6R4xt$zJ5}4`n$FI6eV`Z4JOE?e{SQ?w|w9SFH&@d*JAP%%k_r)OBP zbg><8*yD-Eq+1+mhy=icAPhc;1!4n;yazD3ClMywz@{U==fQg}Cj{B@$<=oV2SmXM zgiE}%AL0+;!xz=|?c41)b*B9gIfy^*4nQ)92FQhUj4l_#0x~(VM`9i|YLrRZAf&e& zWb{6QaIroF5hFeCQ89VnI}($Y?_3Z<0`ELezx#WOaFu_u5dr*j(SNjqa$#unC4qjT zZ>T?kw$Nt~W#SWPvlCp}Lmqrby@_6&19Aw|!!P1^y%-x9RMJ$Fe&ajwD4S>UMg<0Q zg;97NeN1p=k4~TQ@>vD-r=FxIAMk-Zllc=Tmw~dqe9ED(yuWzg*5J&+^P+8>d;Q#V z&xMmxW8OOFPGh_^a>RFDvx;8Yl#54K+8r0F+ggLpoxaO6i1hBouE5nye1qVDgeP^Vfx4}$$>%~rkf7*AO%Dc>DQ4L0`CZtUUqAK zgJ9$VK#~u?J2HT55G@ETDjs~~Bk|L2tUFK`M*ZT@sNbe`w2La>GMI3_n5qVHHYB?A=Qs1h;nJ}7tu^81S+|DCH&54@5645X-1H!h;)$WSM6(E)(v$Xj4_%x=zz$M_ zlt5(O`qBjcmO@Vvs8DDwI0{fXamr#r&v5sB4~JJ@d@g+L8{ZBe*N)1Ww@eR1N(TwS zB;89&C>u8>yz#~xDL?T2#Y?QftsZj^s9I$}EAfij?03wJCa&dP_ zuDP_=;@uB^@B=$752=azK!hL!4?g%{c<7;rLV0<)Nu3aXm;(eG@!MxOMt~B1lB_TBJ&m`W zw7hF6Uyny0La@26CNT4WaiA(g1qQPLUKtO@nrGfEUAokS2FgQN@R`U14?JKnQdU-G z%#hh1fppYA9S*Lvj$Q}wh(NvYZa{FRY(HA~LqCzm;mhwHyej|M5YmLJU)nbPO_8}-?x!;Bt&_+j%{%R%lgNrGI|GfCVa5L^UrTdwPv&p&rP z;0xv)pu@O2<6&$erZ6Z}UR($esL7aVZrHHF7|NHw{N)C`K$v*)$tUetUdNLpBfOec zklu+put>eA2e{dq*^8(3eA4TKpw>-<09P76`N_}1i((MNMve_bhmR7SkN~J7jcqYA zRe3jx@uNeVQ)^#MJ3DKd>wrPDt!puNJ$>@HsaC%Aoo|QV`{+l)?Xzc@gg>}+sDLM) zzSdKs!==k2mNJ*ElO1$7F^6k zq(6`lsSODkqT!M(ZE+^&ZMqiq%$Jdy9zcD{nEJRT$CmL$y~I0aC`j{Mz^t#O04t~= znQ5c0VkY|d=_K`;_Fu3iaHY2aE)!0=zhJwggxC#~B3W^9=lfL#*wzCQt{``kgdhFYcQ+Z`PY`;f;lh zhIUNpUdvKdYa!35mfy1rohpUZ~Qs7^0@~)rmvV5;x5~CP3dTf|+ z$DDBRz@hN9uYV)#+_~Gl!WQcM*=5UDY8|3ZdPiB-XckdiBr6rIJ!Cx4Jk>R>N{Un2 zxGw;}1kfG$JF*u+dXRkgZnanS;x`D+A|!}Kz4`6Bb{Gb2BIKDvM~+Em;6O;E@m90LyAWw$xM`W4C1<#mao6GrKaQuTv9&u0&kejQU{;aX3C#* z9>^#CTDok7_(ON$bnj3xX^Oe!Id>si<$1rrKpHO5ipJoKqVdi3_LOYx_13nm?LmLo zLyOZ@r_R_p*5%_X!kzcsAGU7ZsuQDrB47_;_N}+u6ciIqq%CxhTt@iSd)b%-01h%i zaM77E9S3MT3xfdZK>S@=hkzLnoC$z{NQ|fvXfO5V0?DYqFC1p==zN4u+XIX}@JV2d z8GFW^I~U^(4D*f43AT?v%mAx57!9hQii!%GMZh#5;%yDU8ug=G;FDPn@2&>+oH;lg zUzFNFxv7c;VbYYTIzVV*sMP}W`Exptx`6#Ym@79!BAYOYwzjZyr@ygPOacu2s`TwY zAP6pW*iip4Yw$;EqSs#yWo2azKnb#dOk6x)s>kjfg4!sdG&j@$B|wdYg(VQv zV*nJO=Y2;9)JmudAPOKob%PMVIADl8^PY>gIKiOqd~@Q`(e22We|0^;7(;xMu*jG) z-rO+(g%|@5!~^zW2EYPwP%Uxi8}NWBw9iV&^J)lrvL%#5J%CT@iq#cmae<4#W2V4& z^57yk{8}DTAIVrTbT8@?1`in_6_fTjh$gVVfwJmUMq_YB5#KdfPnvyGW321#=>}&I zQ6Gt#>7q8l05q7vj^Ipd%_d&>)l1SO)rGRLW5Ny{Dl%r&$S_o9uue>|V#*c(Zt?}- zu)H8GzX=Ys+49KccQ=s)xtT41Kt7d6MUX^(ud~6u4s|0x@P=}zo7bEATuC54`B3NjOWnfy zjhjRN0fV(zT_`ixGZGdDnjuP0&3;bG{I{q$dgHy4GOnk%&K9qyHeFF$>LfzcYc;As zK3F0`uo0_!7&~r!7&v%XI45t88|3cygnY2z@UKc6X+Ro6YX~F&P5{8U*!4;|PI&EO z2me9p!;*>i&^8bV1at)FJ@w^sgymgp+TX!V%NO5@9!L^R#-87dGvl2M{*L#IJ@I@k zfHf>&hu^$U&PbAZTloKzcb}Ydt7x2OuI^zw!FD$p$UE?Mvb)34~8n-vjgj zLJu&+Is|KMtkpq;3GE?3K*)hZh_;tQnOIKoE?XcDGh^@#<^}Hhj0dw^4i4+pyTn{* zV6X)KQ*SRfTmIMk_Zyx;^b`Q$?prV(nS`VafQe&EhYTC8gUzRg5!y7fV9}y*@bDq& zT;;n+jHE}eMvtADfCQi>0B}g^xIF-wIvazaKGfAEL+b2x=Q$tpJMeR*$f5~l*w-Y)-nhf0{IXh=7I{08S~=Bi)Ai5K<>T!YyF{EX6sTlOIp0F zjdKlnz=qr8)gF!NLV2{$D0ZO+r&kps=#nz7GXNy48*u$wFOg!Xn8dj86T+b*N5kqh zYeV$~bh8pQw2-AJS@%M?Gy-q})L42T#W*oeuTMw)b_U@H$vw{?I%+h!R=E&w2sbJj zh%fLBytjv%3H-5HeoA=Z8GOYmur+}?pep5ZwJET@Zr!?YaPNKzfg^08-FHMg+;=wo zY)xBp5$A?y5J(gb$N*6f0l2M4sJ8(Uw%QLIG*}0S6ovWo-;~aBXUfe+<8hjq1}4cM zuoj{$2R7!MAJ}OR7zZxF$%vQH z`JuyTYZyc_F3b$|?!0;P%#AwdXRu}hQ%IjdQ*J&qy9?yT>J~_RPZ3700s*4WC>$`6 zgkS{Ybyzvl%l!HC!!B(q17Kks*#h~HC(~Pyhv2~H_iTCO`a4KOUAPl`MwRPw^Z9rE z9sstn_`y9qdm>;G;EC^*Xln~$GUUY_oWrv$aLP=eHNlw{FwM1Q&6@D5U;WA$Ls?mw ztv7H`Oo8&RPcfp%*f52~Y6`;*E)R*>M3y~Jo}w$?Z}=Gmk^=x|#2Y|KJ$Dyl=m7%| zb6`=rbm)-KU#ceDZmeCuKAe(!ifja)r3%4Z1A}lWh;&^3yCVUpxi)ycn)}v~bh>wYCNN#$F%04&2KxSu(DJ}h6cO6w0B zbS8b7?RluvK|nIvjrgC!OY*hy#89FPedChJ8@J^t$m*s;Lh7V%tYIyJa|Fc@*nVH9 zXLeFv(EC9$c|Co;+BVP)89pq${PN3o${LbJ?_%vlm88K1azIpTW&Vn}9J?*Ka~M%K zZNLM-0oKcxby8RDh3L~M8-(ZhJIFwt{mx7WL`O1g4Fcx4dim_TKo6j{!8&iwoH=HM zfzSmExuB7$37p+x=eMLqlEPE+xn>QLvI@0X4g5JT1Cgqer^873P2&h*zJXI*-F5H_ z7kC(iUvc@M-k25YuVPsrE?T-Q{NEq_IP@7fI1C+KCUf?pP$;z%XTMyQI=P3K5R(O- z3$*sgam6ACS+2B-UuQpWcm|O^o=E)!!HEL8c`*wCe6J!MhdHFwEH$=l+pe{Um7%w+ zHjW>wGR6Qx5I_nT2UnCtVi)t9Z?3}PcV0rbF3bPv!acxj0l|n16%#61V7t8n!kW;= zR6)gJ6z6L$XurjhR5PeOv1dy~3>9 z=jwcEseEO%sEiv}z}xGbeTMS(G}qUg_8ZAA+An_aM|$!subeK6ahVwem9N+{nOL`aC%%Z0HT&TZT8>-Kr4HxU=zlI5l@?%Ff z2M(P(AJ0=xFFXG`-veEx2O!YQIw8<73m1G4s#>#_SBfd7;Hj zJs&dnzzxqJ=pOgbYLiKz%Y&E#Dxvy|sfA`i)W{K|!o(?4!;Z>b;UB;B)v$Hj4pU1( z@Uj0Uz$kd`rFpJ2ST@})lqnq&57G@fTbF*ksQf+O16{EPfc0a?jx{g{;2WmF1&p^f zn3_}Oq#O-;=Ip7kb;}l=9pBH6`i%?EQMJn+4E9D)K6^6E1F=*^bxQYj%^Vi!ya&#h z9$zt0dzorNp=LW~&YGVjWE`SAgJ`CEkV-so+7y7qqBX}77D#V7b=ve$Di<8vwrmZ5 z{XhRcY?1kEp|#ofnGHq@;%U% zdw@L;JGD0m!W?JY@vtd~H?V%SpuT4!O>HlPOYoeqBQ#;rc9XZJ8cWv|A6s_@Qx#YPs$Yv%!uNmhpW$Er z_t!!{9UW|^M#}I6?+6?M#vwsb#pIaYwwhkAsk3{#x?Wq}igp1y=u`nl&Zfmd-$k7$ zcU}uzeftj%lc)AJBv`U!xk)ZqbKImOJckb%6#Dlq2~{VKg}zK>l~K3umv!z!|1e|5 z3{yWb1qZmzQ(!CVl8=(_fzH?is9;g2a%3&8WWX2J157omSp;hnnL@gNgs?_vxC=#; zrS>S*hogrMN_ExU9Q9F7oTWs|z>>cGw9a?Qtf}5wH$Oc8%NN4D*XHT0hu&fCUH68P zKJwIxrIKbF)zSpuf2q1!PB+OsA6o2z8=OJF0uuV9R5vk;aBC)}uS}gG{t)#d5&SwK zz`64^0?>7{M z7i4(C=D2*w+ygf_gYeD~puiE}7pdUB-)*mq-eI9ZxTtArH%U!|?%j3jn${#{&Ac@X z(I&c;%NA?l`YU24XTooN;C*JZjf8^B4$_|ybC@t;f&lnso0bn6tiwqxr;huBq(|Tm zGeqKJfzNlUW|IIruIBlYJ3|iuE9_2w=%I(qnu$6A>%Ja=P?as9Ze^{`185kn3uP8A z1hgI6g+*c0rY)gj!X$HZ15+>$tcrWA>UdbNU_p51=g)=>+5}gkeMd8In-j{)$J-{? z?%ME5?(Cx=bn6bxJ9B6(*FNU|H0gmGnn9TA$0ra8=Fp^vn)!hPKW89zeyvu}##c-V zg9Z%>E0!(}|MJiO61K?N;=}*-cfurDO`OwImQ8bg`t=W!r`%)`45oRAKn1M6bzp!2 zph9C|9n}EH?F){1=Fouy(?yC#y@U|NX^G4lfFaf&knn+{Ou=U9DRXj*Cu=41e`hEW z2{(eviBlZYTcCYMeZ&0^K42b|*%iHc+uE>e=kD;vf;Yp`rOUPPt*02n9cHP713nl+ zciq9g7_=!gQ-$*1-qr&*G=p%U@m`58e^U}g1K>6E*|TSdKGKm6l>K%8{_;PMw9c+ilV-dI*Z$6Q8x`2T zef!M(wzRag0kQd(*U?`4G3iPr!Vq8v4mZGy!;IhC(jE*y`Upo5#F*8xX7PVyl>`G= zwsJ){dgQq6q#iM5tPc2^to4Zz#t<%OceH%v=ozNqLYOm(w$$jxN_)dI2=@b@dDvkR z%>x%^ejJi=>C)+NR_-`ThYk-9zVq?0e(hUf^Y-0g-KOnfu`HctPhTeMi!q^ZN$+q{ z=6Jhy?g*17jW=m4bJ@B73e&=tokL%E2H^>Q&wUN@C3MvuU~LXKfp{|uCAiv>_o$k# zHh`Pp7kiA3oj4vAE?N?f96u3GRh^QN_Uu-co=eBU49Lv! zjVz{v?5LHTF|>yS*l{h(mwYXH;J|?cHXCM>8pIgb@wKeBl+U^ZffFBDOlG}-Md+fE ze&MEBx9N! z5;#Brd{XKsR8#nd$y|r#Yt~+G(Gzo2Bzj|4DMhJ^Mfm9BroGC_=X3q_z@9yOZ2tqt z>9T&sqBTMW7s5xTbu6on6 zur44j1wsVO#-0#?KnPiHmYdvpp7+m}+s2t?c4tEzTdll?}x=iwTJdg z>9^aY3NdBEpkHk}!%_tMPvg3o$RrBJ$jAw1o(~AL*_E7gBS5K>5-2^5j8Xb@84F#Y z+Q-PyK1PqFlF~BdKs+?8kY-ea&Q91mz+8pGeU+}Y^b`z$!-oSCngoIx0KV_UN^C<6 zyqoCF@Oi(t?>GYIHG%L20V9U`KDX{I!r=Rki|4}Viw#6ebrS>e1!CnjMdTppWgP%k zH;`^4TwDV?v33H_DP6?G4Oioumv60aE`2eH9Ek!CUfanYffJ1YiGi_O zk+EQ+ipfZ%rw&7&OqkUoQ8>fgIG{$ND{U|q!_ia9f%(-252a3Nh1%ANxC~&`LJZIc z!9}HEO6WmwMOW7-Ll3N~yZ@7TeE*~f5JM2c-u>oBavXfm-Jg4$3*Uk9E`MGV2n8u0 z|LdL+v;fY!Cvot+@5$u?Vuj*Wk!dI<3uDo9KU?rJn#m23mnk$NT$<{f5Q8J61@Bz| zY4~D^IKIOW3=#;VYB~emvYR|hMt}&O#%DTW5H?KW`UWyY+$e}J zM54g=JabVS4|4yf3q!u>iuH8BcIQO6ns!8WWsp7ANkY+1PbDPw(Rhoyu|Sn|aK;88 zSf<(zF~@ypZzsxFk_C}1vh~WrXT4L8%dGY8_-teEa(zAN?6P(GzGoPqJ`>8I_u6l7 zB7xq~`;v8fo;@n!clRXvg!vF=&vKN)dNQA%R~#;L^gRNegX*1&L#zPV^?Ncz00%vg zKQKiSNDwX(1aMbj8qhC9A|j*Jx4Q*Ef2I?SipD7I+n2tc`{uLn&)pFq^5x+P3%n*g zo1NqoSp$*txlu`;x`Ts3LFU{umQ?>zx+MXkDk~hsfkX$oBPBq6wPEJ7b?!|ZObgz~ z)jS=#vkz)MrG|-LEKLVWdl8qe+RQWG^KolG4qo#q*ZWsFZbkOP{*Hi=5DaI|dI;pZ zckkBdll`rCpvrkpd?Esq_}ufId2XN2uMr?j80nHw-49XN16y@}NSfwuqv z7JW%XK~%`;^BoC?$-`@Z6Xy+GSNHAPr-XtkBi7I7eG!P$X_Fkaby%t<5)D0+%_FPl zefZW*3824+;q)yglZ<8$I_~M0)j!j&S6*`a-HF#Y_{{g{W`Xf>p6^h?_xpVBJzMB* z%Dx!55#Y9k1mt!Yta;|7p-Uk5)}_bC*^tbHW?wvs#M#g{yANk}1PB|133ISFgkv6r zUrG^-uF6Da$mHXDPq@+y$NgvcXmj??#JyNZi0DpBwU#BJu$pU=M$ zAUqHb%$Xx#qyw(JXNro7QaCpTX`VgvYo>nw zJe%wT{w=3K9D3R`WWbzzzv+2mUk&I87!FLmJX&4doK`0m)0LEz3}{>Zsf?4~AOKEk z_LpZSn?UquM9-}0~s6|k-0#Q`OJITBRt{ApAlg@41C!MPdj>2 zafe4TS_WqQsr%H*@|$}OH4@|AI(OBeSRTmrbk80(hu(cLZT5a+Jy8V}yp|vX=mEm5 zkJt}SM9=GBo}gowMQrbfAXs(}=yAth7wL*&iFlr?po{@L0Sp02bI z!L=>cNqZh?mC`FOWO({5c$XkjX7V{hg=A^vEu;(#tVo$T9ojylJM->z&n(Y!mSjwA%x^^L!5$8(zQ_gAvueYJ4Z0$h93Z(g_Sa75_XrrZ z5n+K+FzwR-07RTbR1NM_J>>JY#4FbX}NH9IIV0=ezZI1+i zOE!jKtyF7Ev$h+A2QF+x7RoqN&2aI>*au^=M-bZMW@O*(uaK{?|IAzHQ!yelusXC#D3l!B?Xs(^RGxVJQE773N>q4=9IZYe5n-5{ zco&TF4iK68x>^f?1F3epu&W*j%*f;<5Evp|#Eb%xj|c;j2cm8R5zy!hI6Lr7tfST0 zC>Qqxo`<)z!TZ4$ZtmHY6U zSbYx+vUb8u&q#&T)r!#QhY+eH62vALK}74cO>_r!JM~}$t6J=e85A6#eRW}BqD>(D zg|HKfbXM2_!%Y#O>A4gF34*Go{rjsloG~XH6FD=@1E68zq#NwSzL7XEGA0)z@t*yl zs$i(3n8E%=yZ-)rzCXoY=0HJUK$+oqSs02tf z!uWRrp#mp^`)*YvT#4YE+)JC!b;mqhH)8XnNO1YVs3-zNiAbI8CdLofqrDZ93nU6> z6Cx{jP^xiAQ$roz#o>9UN&?M|^>Pq|VD2?ngIHn&KsZQ5NX!xvh9mMVcZWpyAG*&D{U?>u~GkT&h_C6E);MtF% z=!4zH**OA)113Wp42<#_;gbg$3G>{*E(wIWX5RiL7o0gdV8#d^2a65YfwS~;&g#1taxP^hyzqcP!~WvkkPJuE$FHc5~9xaL3&mJ^QS{hsMQnTgDHXah0r z8BVaTa`yA{V+0JhPC`JqBz*87tWrHn#7(&2d%`i_@mk^CuOYIeXR2WXL!cM$s-Fy1 z2lf02ipl+|$3WL{FW>$vI(LcWMoMd7@ z`F2PLNr}T{1GYJxl0OMSI6EW`-20ULJXyc~V|aEQ5*O4-z~+)OVH~9LW+^C`D%-bj zg;75q_2)=QF#-=li!cH2i#BgWq~}ca)Y`XakK%|_Y=BfyP=Id?kgvY_N@mTPCB@q| zL5<~hGR!18mi@yX{oXkD!k0m*^-u)h863TvS-&W88I?drca-audvgg zjsPbTU|SO>4-?PUE_9u8`0!x`ej;j40v>$N`=LP6Y{$4I8e+jdvTgq-Icu`h_jv>e zi@pb8lmYzcT|}Dz6XAvMV_=BH#4tMj{(cyJcL7B>k zZ8C4}kFZBejWpKR$(r|9A&_Q^6mS1Vny^y*7q{ICV$>>oca%v1wh#W~qt$Z3qzUrY zn=9p+XP%U-+${Ne!>2&LS#qdquQ=PArM|Hiocb_{jtG|5mM@bB@B57$I#4Owi#AGb z_9)H&KTj{hW@6=1S+QGgpMR^=AFBZYs#p8Qwr{pb35?Ha$s^={pIIyi_8&rh;WFdW zzlFV^S+dg8G*U&QsG~(9VB>T`(g}kqZ1>J`d3E_KvISeT z*45U?habEPJmZwLtKXNMJ4&VcV3pi-{XEz&_CTZ72CYV|{QbPSvU69NEkX1fcu%pQ z0b))n>J}M}nChm8@JNWEfl^sn3Ek!e-JT#OKPLps3`H`8$k-i>L}R$eq3DC%#@RUn zghvCDh5(T1VTg@`2M@|+mtCgn2~Wm`2;7wM_pA1Rt7hE{Db9MCw0=ktoJ(N2^;v)a z(QAlC+Nl@h1F1UXh3EcHE}1q}s;Ul3Mp}x@xndUV4;gCUr7HO9tLCW3&&@ykseHC> zog{iq>n0i_H<_fuP?p#^?)Dv>$6;}XxSEG#v*b@X>4VTGlEB*|# zL7m)q<4+}ZWQyE%#~m{NmRn`p_HB|mDocvC6iOs^s2mmF=r3e-mE&MqU~4^~ z^BNbb0DfUKvJB637o$5J59P4%E&%)Ia$U_Kcxjl0KdgZh%Wz1{JJ`ugWD)}s2*aVV z4@1%ZV1J)ozkee@b$K<+j3>;Pa{lz-SUt88#he%(pMa>y zm>-xkov;(Q!0E!2=XY{)^pfP}f4o_)x#k*q^2w)U&XuzyF`68_ z(d!OG|4vp1Cp_EdnQik-f?;eTCo6BiKX*rf%nR2%5H6^SGz^SUEoDP5Pgo^$VN{hQ zB7_}2J8_~D2X}{KE~r#tEDZwOp%HC|3-LnWvKb5F;KVyMIDjh99Wx++@Cvsg%rSox z`T?cz&h(W1ptbF2<)FyiF%FTMhiN|Y6^zahWA=ijBJwL>0$ z_z_40%hknoHW2;i>pugBze$n#FxVxkvHl2Pq?Lmb1JA0-lO_UpcgTuYm&-_aAXOhcAb{Vs12hn{bs z0*SXaXt^Uh^3z*G#NK`Jea!e%)?q!UDn;crMMGH&1_~!p)o27C{wSIM!b3c;QkCI1{2?T!mNSa zQ-LK@&V0GKH-u>q)F*W4;5`$G5$BR&qD;B|o`c{`n8+wZPI)Yy>{J}gpI zS}7nBAyCnjl$A?r8rDK|wn;12F06u~*NpR1T!r=*(A`L*s#K3c}yI$tscALEPrsuTv0p5|xZ`d~AC;}ooseQ4dgM{bpIQL%AWSZwb(O4m z^DP+IJLONWyej|ln|mc3dw4tPDvSZz`fVA$HB6d8@B-i&7Kq&~-5`2lXz$VAJtq4q z56XS_-jAL7M5wy@wxm=7$L3FasK0}2m$Q^gp5vhLx;!2b;3+|n*--`vY9=Nw>#wS+ zRB@2{NlpR+J|`f7|5PTIM>GAtwE7nyYuBz-f;4mH%J;U_lufBg_}ZF01mYs9 z*486`BP6$Cl~5el-uz2{#<=g_{yceeG8Gd=Xs&8>gQajFGi?$i09;1@%OP}e2YVco=Czr0(^E?@DQRAWOhdJb{= zHozN*;X*3*SITH`|7jWN8hDV-D@8?x8uy4cos5hO9Yd~t$jQmkg?U`_zz7E%%jD!_ zNyi!q;)qR~Hc2WB>nZ6OaswT4O=f_@4bC;bxzyDk|T(OYh@i<7Ieag2uOE zSdn&w_}GR%(B3dSAs%_+;Z3z&f48X@V=cys2GD-z{|IohAUv0aY$;82O&Crb<;GwH zBqCOB2xsQ!!HH?OH~)Ka;u_c&!}+l}G zkT-cs_cu7f@kheQTnEHFVni~CVx$sAI*>$Sfh)f|EHqT@1o61e&d!kr*fEwaT?P)n zK~+fw(DOGpBZ2}Xhxp-%SY;h46DCdqVTtInGrFZ7E1oZyQUFP*QjtH$5ZPtc6?2pz z5V_|~&KKHy7z&3(g5yPmKPi8Tbkcs}Y**uXJMu9xs!p z#Awt88r*4s=BjHqB#r>M3SW3pf#xGVaw0I|^yxoGQkiym$Y({eAQ76F45^_!gg$VPgeoKiDx`f|3FNLXB|i?K*{*oKMYS(#h$JxB)8}g zCdA(g%vce*x)$obgD|(Ih92Fzs7(_5@TUE3{bB!Qe_ek(!|B|2e|&WmKxj9D0>z{N z0bqLK?1u7XFxBw_kH3W^{DeFB2}Z%Fx)vg9Yl~=;V5C(WfV@$e9`5v3yWvY0hHJ}) z10cn9M4?E}gnq&VG;wJYj)MK1ggEoKar$iN1FNYC1pzKV8qO&?jBO|vSCijMLEVj0 zg9tFD4kwcV6OhZuP92f+bKm_OL-&M>PjGEJXnU%H4(W)vOO={>LpY*LghSz-OtH7& zNG`i;T&+Z|v5X-}^m17PfmId+Jg|Sgh)X5H_6?>ln^iFo2yB|LUoDwAfC$I36xVu` z%rS^bB-Gz^AbmINNT!Af!M`CeHuLOZ`~(M3=rVZvEF5eU$|Q0$m1Sf-h9YH{!;d{Y z0v&<9L%P)#QvGU9&%VO$n4#S4M`XmQe#0y@&`g|qfB}Uy&T^}vXQ@)ALb04R5)K_i z3)xJ=&CBFA3RKi9aXoB`RzM}1FGGB?shMODIu0l{HI06Nt^Hn0imgKAx%)>9Lc*w; z!`4M-u!#*}VL-hEY{&j-$|#MIqqU8=-w+l8Ys=_e1A@JWUx;gbaqDz-@M_VD)81cl z0L(L^9|k7*cwimcu{-b2vOR7fz;5$XiojF3T#aN=qpMb&`W``fE@UDM_H|IX7 zS*;?wVn-VdNAo8hO5YNFL3#@z|H`$f@Z(FFP}ht6N~1)#vJm?g;}&_&FMEv7J!uhkqO|H^Lz?; z&aQU=?zunimH%ZHg$Ctr{-6DCyjvKlBXGO5bOqna>B>(5NWL5S+0pE9L#{XmI`5_< zmJnUVP}s^HOBx=43^y3S+ZucNx>Zvf8^FFMoDOAQ%BJa2=qC{C+TNrHjP5sNgh6(h zAFn+aeiz1Pzi&to+kbI6j*AJumSiEK2cZ2%LJffb4!elp;@AEg8y8$$fW#cktjpaV z!r3o#coLaa1cy;z6v?U=*+JMV7Ks!*R2(H1H846Prf*Q{ z4yayi?yUN?4LI z$I(zl^b+sIz(}r0KuQ)$E=aunK{VE^VOvT&6_+Et8G71Px(2(Zx@Ns*z7C1-kMN7A zl}UjUH_aLKNcCnKV^TMHHW8x?LnR5LAq$HW(-fr2n^hcF#8+4!93DO%<{BE0*&Cuy zrimALs$HtA@7V$NDuTPI$J=;+J| z+bqBtwaV1&*!-p0%8_BuWEXyyckf{EU?_Q*AhDC0zlbpJd(mcjmy$+_LWRB1Rzr6c zvF?-}7S-|(*l?!;dz2`bjAhAQYq38fh-M+V>FgvAI+0;;nd0v*DyEaLV_CnQ%Tt;pwO zTiA};kBwCkRVyrGE!&S}=j1JASoQ0j>mw~AEfMD&ekk8z9pB8+%uW;|%Bf|YGNtl1 zn_tHcJ+LUiD@Q^_ieh`Ra0bP1mtmWlm#H7Fe}f+|;pK zWzWCI7kA$pn|>QfIU6OygUm3gAM>#B5Pn{M zp1H#~SvcNcj$yQCkzif4wEw%=o)c?Owng0|)^i|MBIYONE>PtWS4F%S`*Ax!$N$15-2HXxZRlV`DkiK;PJ5AY6M@t7$r8 zd^0>hnq;MI;5iUw%f4otsGGiq;R)%PSO$u`V4&N`xBo!^vR zE#HD)&t5T}8owZc`+s8lvWhSZXAC+283BUxGaa-gV!;>jFLsDNxQ5uoa28ona)@ai z7S90+0SZ3mMwn2ra4V?y-&QGkXkHt!da<^chs}5*tHLyJ9f;!aIoYoTc3UYci|!O3 z@*?v@r)(In8EXwK4c7;rdy{(adu1cFQC!LNc(X7z5(K0|Bp0*4@yxjHC#AmCo|>YK zx3I35-}^5m?-xxBr8qfOyz0!a=7k3KF7|#3&DJz1lbW|z`aT`?hp2(wlja3tAfPst zx$DPXl6^K=D|s?0zr2I&QUX)Vah6sZ*Wk^*%|W{qti(#AQHCMkRwfq{CqL7_*Zv*Zuf8R82{fqa>w0@NmJ60%tad*Ru+v#r z=Dp~)QFZAXXzA(R+mhPvuP4;_lizq+=-qV>JYMe5a6)h%acpgzH#Br}HR9B#8!es- zg2zV3MAJ8HQ(O0xifxW6$`i_S%Xv+ROk`JX8*LWv-93-*)A#iD?zmZ8%9gHtD9jG( zVWPuYbkkbHT)mgaR=mxkfmy*)J;T%Oz3t7O+2`R)u3H!b`j+>l7Yysb{4o7FWjw_- zy&VN*CxM-=XRSIl6>fX``M(vye819;M^El&nUBK}1A20MeBaX^Ps&ODiZ4fT;g@rp z+FK7eJYVI0`D0+vqhMrdB(LnH{1E#4tIZhw*nn^CV|j^aVgBo%;i0=i%0d{q$gFX0 z-c@RIJf3*Rf=V0PmA6_4GrPJ8^9vpfuk&s9&KolZH$4vTsXN0FvIA)fdTu@2HbdY1 zoSurE#|xKEf{VHf>!xG-`r?t|(q>PshhnSqg>jvSW}kPl%}5${VLO+Nu#O)G_hl=* zt{kpe8)Ho`$9m`Ou`eS8NcgC{DsCFj5<7}}1mwQ64~q{Or*}tZZn#g6J_M~7eetIh z*)OnJ(^*M;Gd^lJtIzHuKQ{yxvYCOWzC><}Od5~L+xpyk*quE0jRPBa!Vbc3m4TIF z`jy^!_XWr0XDba`ms{c&OdFAH49~ysbDr~d24J%d`FU|tfvLC6r{P1%`;~w72_j6R zqF^+Hl8kA7{tY9i_;lF<1JL4GRVg)LCf-Rky&w+E(xlOD>YRugYimfu`-i7Nc~jq6$LD?o`EpdXl*N5U;G-gz2e zcmY0{M#lRP3X6PxwSp5q7s%(V|s14--Ap}Ar2_;zoz=IqB_!$TQJcF`+ z9s&SAz5xKo-vI!w6aWCjKBGnPqwE($X>kz%@Z18py%=>!0vlYM-^B$Y@n z0RRLT4;2k(B?DJNdq+D{3u_ZXXLoxO!hi5XBd9#pB5tQ8DhOzWW(Q3S4ZiEhA$I%D ze#s|MLz9{MBhOBpJDe+Id9GR=s&zd#vnB#lMkiOFjyJBY2_cW$X5ARPsIEMI-`Dd; zxB>?roqcpAsz%rH94{2c{gC}d>rZ^zqmbm4cN@iXP2_#K5Op(Jj#~)o76SS%yA3A- z@3hRn|1N$x+BhJwp#AkOOZ?LM=Q;e(z+IOQ-(%HywmkB#Yo~Hj-SffUP8Q$>KM)9; z({1qdq6k&ss}H-jjOhKnk5c-cc`FN3>~GDrS%5mw+B#;5 zkRY48Y>SBY$f1e(kS+yBE+FK#5V+1^SXjnu20d^PfVu|XdFo~NGh$KdkLlCtLdcBm zs&OZJ3x)VAdY<(7k+|;^?HvR&gQT<|+9%bBof|>j5-rias~AWFLkwY@rb8O?tgmne z;c2S#(o3#zz3$tAyoHVQS@8SUL8L>^)e3bPJK9TEoHyvIqh)r?8?gBb&dV4JZc!Pz z1IG5MZBZ^g;wUlw(S&24`l9*6|cHWM_-sj?Ig1!!#!p> z=Y6&4a!w=APFc6EPG_ewsai&|aVFeMu-!fHcQ7nOZ8DnM6*d`#mXA?l&GdYnPvm&W zo*epq>}u@bXm?Z|`^bb)u9yEPV{IvS;BTc^a}vP|NIlqz3}VrD0pi~7wK8nJ-(=OD zUsQ-2)v~rV5Yx(;yWsAp8Sv$<$n_j>>^rzj`?NNn&E@d36_xM&glvdEid*lK?;5L92G1w; z!@=I?k=hD|#cbJY8=LUx8r{$hy5y;$IR0rbz6ous(Dzfd9*6h2T_!uW_S|66PFXbhu&MnFy~OdyQ}m7{7%k=MhJbb z*KpR(f#t9>ougL1ZHBFz5yPpkyZn+jE2NFT4>&qIS2t&(eQ+5Q!4dMA;qxH0_IxH! zvD2Rm7){+ac-9ep1bSC~onjD#`#KlCkxfM}N|^~KsLnL|_T*gjLowjxGaUHlzTJ|> zlrM5`NKeB{sWDjv$zOd|_bjTT$Q1tVEu|Go5~r&mDSYf@9<1NSQIT+z1QdchqZ zc)Z%5>=iDCL6TguGBXAulyg8B?-C0rNchyg6HO=2O z0w#X_86U6ljC0M;6xS7(bZb#(p-+siY0T-1+8UO*@U| z)9W;gOraKTOX`f|%D2Wny(I72CL$|EUm|2Fs*^R zFI|2kjb}~b1$|5{D1aDwMAM#DI<8v(RN^GCuX=}A+}e9sVQd0ptQLVJ4%3batG^QEAm@kx3#Nly6;>=ILlQTGOY4f7s%R}@ z!8>e?ugl2HMiV)j32C#UOJK&G+le(PryVmZ5RW|;!h~MMIcUp_&Sd&GNJ=<{>YLLd zXL#xNFoy{&5Ve(P<+w^QUaLfH;SePB?zJK9a@B~+`7Yz`$^S#=jbm5>)motrffFz zVciE+P+4&~^AtshR%5fz=;fs8ON+4| zw}uc*I(ZYuwF1@g%fvnDlPF+C=*yy@$8X|n$fm9_{}gin@enJ8H7qJq(&~nY?wZbk zn3`%wieahoenH47@G|ODRc&6TGWNVk>p&C>9t@qT#Zi-69kA3Aw6>cFvu4I}*5&c$ zym~#0aMmeB{NIZyX%yRXH11Jpg5)KWvFh1agA@V3WWXm&%SPSMOJm`?^s`vLqw-9L zNEzY5$O_eSD6`7`NheZ5y{S%~5<6+>g8TfW^>iZ5kMbEG+ft)*Es zU+|-~5H+e}3#uS9({rbV-4UC|TUZzN68^`bf=?I0`o<6VRj^3AlDg;G6)$mzZ1XIGz77uXk)1`JwhIC8}dB~(Wh zXe0cegV3{nUD{orX+)@=oX~aJ2ZTGK3~9v84AC=~%mG{lR4x|Bn; zsuR&mC=J{sG(metNChC>v2^Hc{!3SY3t`5tVVtGY0@@P z<@~SGUlc+}IaMgGZPEkXn<8~g!*!T|63Uw*%3O4;dgsqQ#ot})&;7n8ER)N@&p$NK zSX3bdN7($>HZabSS}!f7Ycs*ms9R{?a)W8l{G-aKR0@7kSCYWMk{3%AR75-s-8JoK z#83nSWBxemmtG#MQXV5Q9P_1%>5q`9m=&ovlhjF|rhZ}s-||mrIlu6j5sYG^dVug` z9#L$kd{FkME0b&c18?Gxrn0#Z}JyjVcSx??>$GuQ?bE|`|4 zl(%{o@vO!gUi_{NI#r1BSROHGo2aq8M(4IyCj-`stR<3XmyyJVGr>BCjH{QBndqvl zV#T7!JduJoUpbS3A)obVaepR2!5@B#3ObQLg)VABV%PbS7}(;gd}*!7N% z)xj6dxO{iNPu8xk;0tWi7r_HUXf|{D_eUNYfIuZcQbbV2ZTa+V&1&U14H)eU{Nj#G zUR%RN);hbB*&w$vYf)%H-3ZBh_}g3I5OIqB5h>dZ0TmNPkb-tf^EXpj*wB};U-K3@ zxhy$<>3YkeKCxz6x*~a5!kB*hgnfzo*agXV>4$g=`HEo8E8TGSeZXR4|3}q>rSV$J zIi$Xw?t=Fka6>k(O)?JJ9|T?hU6***Ktc46owAS1n8=vuzfu5!|IYkL`}se408Oa> zovK0l->Lt80x&4V?#jo?oheuNlnsP|{g2SD2TEA}|B(i&Vk`6~y40PAtWA*#Bcv4| zLhqj_q;OiDlaX$DAULcXueC5UpDf>-H!q)hNqrjpK;cqZs57?F4ynd_D}MXG@-sBB zz;}Z8BcRkT;LN!*SLQwNweYqQc#Zfl|9#*nh`LU8pruyYTR)mXjZWU~X%>d1zaP5l z^?}y|>_b3-BKrFq|M|Om?b_9I-TOo7?F0~V9+yViA}-g7R+s^zHKwG_xwEBwawB!> z(XoBT7AxDO(Jr(EO4E&)7HAW-Ugd=KA!xJ7WGm8_>lE(g^#Zs8^jvi2QShI3jcT3S z9B1r<_9wJQtqWWAr{%Fo0?v!s)iuL?JY}Czb4dUkQSm(kx;|b2XI`>_Hy6Nb-xuio zb|7%Vs_H03cc=mU2L`sFA8p_sWAZLJ8 z@C-`wPKKJr#U&+d*zomwRAF^yV8U_8B8t0C(8P48d+RnOiS0UR5=fs(P)qODF$UYz zb6}|l&d(E#^R*T(RFsE_xx4nrI0aEfWAiiQ7tD*KG>6?;n8q&sDWUwkE|OH+&x5I< z+kX3sC>pm*b1P*KhWVe7gb_Mj>ir$)|I_cq6NrTaMn~XqE4N|!)qtM4jW8^Ckomm1N`x_&(nG7j z6-^i!+W$9Z2dVnWo0yt3akxI;M>~kb2c1;{1(2Y(#|y89yX!QHt$ecO@+cphtVj!4 zxb+t5q0oOR!b@OBZ(_=z&lm0CUh(rHP9y^W1n$#G?csb6)hriq4qjs2Jn?MtWchvHCK zBF}#%h~F*{foX)}z!zYYBD$kVI`xSQcV<*i{&5IC0;P5%P<7$m*W~Xpr(#&Uk5A#* z^(B|sok+Rnej91N4@sf6M$Q*&${M{zix>9{B|)k+UKM9F$65owU#dkvremerU^6eZ=ENh)E%x(S z3H~i%(7Nw&NguKtCJ9YT^itdtSWQ(vhd*^$2`A3ZC|S5l`{aVRv+)d?Dl;E-OGIbF zj_Z@os_dK(JqTf;i3O2>oxZP~ z*&SL@)GYV7@18m@aAT9H1s3Hk#L%bTBu&p(ilwtUGP9^nxg>+dP4;cDI}(nJuxcio zPbMOAjj6bjNA?^!({dlI&bDf*@VeU5|IpTnU}EdUa3!_z7%!+uql;N+7t;5wjpX!6 z!aZPnfAsIKi^@qOqh*sVV>(~Bnn@Z$i#Iv!&VS1y6b0N+Zl z=95@w?MM%I`OB-^(P`K*t$Y>g75@C1YUDxZa_|wMfpQDAgiKZ$I_=6YqOgT3=+i-# zO+2dA%lNd+TmdDs8Y^r~j;0}c2y}A9Ycz)+4THF$pEJ-uJJKDh_0EwSgx@&mh-UQd zTay zY~GMe2-=3K8RjmmC@QjCd&rxYHl#-= ze)L035U68L9PST*M;q|Ek4O6Fy+;*$O>Z^1Y?*o*wZwtWv&)QwLU~M)1r}?j<&=&r zqNb8e>Ew~mffS19*J6qZq30af0kqcg3h2uhXtw_JA|8W2~Z?fh4e$rmelJF-ecMi*HX*`+2T-4PGH5TU3>PtdU(lX9j$?m~RmWXBw z+Ad~LFJ{I&Qai3zMqrEj;y-Vc1sd)kQ+jEAPirP$7i{rqe-(|d_v$EJhupVTR|(3Nrx&pC1n70`nZ_b#_dN87ujA|)fA zpknI=L1D&FH>39ZqV)K;{lB3_A|FSKehSoFzVg2x_yQNs`7<7pf`HNWR<~L{jyvBY{3B7e{$Td_wcI-$Ik6kNvv*zI|7~r3khs0z1gJryLw(|&N zC|qsOoc^02C<5VJY+{YC34`5NntYQwY!J;a(K8uSQG`=MHMxj0Q&C1Ao)uthknKtE z-stP~<|_sC$|8)A`ZFdE%piQ<;vY+62Hr(at%!um%34u-o(~_L>WxwED;Q7T`?5}$ zpR?^{+;DR?Pn9j|J&8x7b7l6?svkdQf5lToCzoJGsn4$c#Tv|AV6pRpW}u+2ZKX0F z7G;RDYnwk`mb`<&pt0PK7^ww$X0ic^tAWdU`k%Iv5W&R}q$O~?mAm>_iDMMi~-U|L^jt@%{9fdRB zh>BGM)jVvN(MwYCjO-l8kRGp)mNdm<;mWyF5KOoPI<^tSr@d;7g+e;OoIBadEhiCx@Qup#d|rrBvNH!)Pf zjhv}lMs*i|GS2y!GVP?$xD*LiNqo4@yP$ohkH+9_zL@|%b!Ps}2EHSWINT@vVF{l1 zW^h=CN2fmCgbkhiRCE8CXHGe~D zCU4ljuJV6GqCf4#&{0JE3E!{u!}WoUd+34Xz&GkQ<%~qrnuwwzI(d0%RjJdiuwxc| z>$+C@hhp9M2SZ80@|B^ z=@v@c3GWTtRz>=%P(@uytB4-6cnvP~GLNQ_Gcnoi?WI*wXve_@h!c~ELL+K?G3#f} zE5VEZT7?H{cIdkoF_*4m#V%MX*kbn`{UyTbp_gsvMYzUJ=Xhsy=ooU2`;_LUdTmRG zcXU1`Dj+Z^h|*x5rQ_QD}kd z`MAQ-RzSG1+w_5IxWtC~jIW=Qq@s^HRHF7gANDjntX(BzP)A_b5jpTgj`qmXw%q*= z#M{{p+l8VciwSO~2E-IbVynZ&zOzQyUe@%E;*$O2QqF99Ofr>&XZen8ddwwVu zB8W~7)%`;NG@E}GyBnb#@!))93!n>qV6FecQG~GKu|dEkY2r8Em>|&2e~9bng(5l% z@XVY1I_+F0KI=QKxWVe{x>)r6k7Zb;`_e~7Z5PdQK?** z4c0<;s`}CuBINr|n;N7P<7UIWxpU`w7g?=mQ-XLK^Zvr2LV0K3M6FCY^%<_aZImzH z#83tPm5&KRHI0$j_;Ix-yydbGfVJ*l-1b2>N@qSk7Pr%wY2N_ryP-2N~hw^9&Ce zwgT@K8iy9eL3Kt#$D#ds2d5s{o6hR$$LAZ%XmR!RYiYH=c-NWUK{U17&}{-`3>zAQ z8X`m!ot}rM^*$LC&a2R8zPOV&u*C{V<2{r+5lbrJ%uJf%O=Y$&cRM6=#$ zm>JyLpO_xs{CIvs*Nph&HSz>GqRs9Be7+jv5&PKEel*@fJkZnYI4XvIF;3c63RcN+ z5;D#y#ub|+q7X6t0}7jn8tl|l1r3D5zJ3NjTSnu)MWI%O>|8uW-BAo)N+eN6Uyq9(=Kv2LSuwuIj?$X|9e@MbE{#r}otpMd zTT99=BTYa3>FQqo;Jqz@)hPJDHzHrwLM!3Vhc{I~>hmvixm_r`uAsbsZzT`F?AY!U}ud`W4tNAIJX5sx6 za)AG>$z4u8A{p4k)~~8vT~~Hywq|qKG5KzMDQdL!*6RXXcmx7=_Z{scn6IJ}~ zDQnVaSg&>wy<5|SIt6Q}JqIcqpQ1 zasn;4Q$h|&R1j20B|N7d(yvA*6`?!FLkG;d&Z4dPLtxN?R+^FPgH(-D`3Xr!L4s%! z{>ma$%Y6aX#4(eF(TW#0nqF^9R0RPpJ^y;}Pf!>< z*bSwP=kuPIC7#CVIa>3LPVM*|hYMSj2;D(Ky|w3oFGEt(&zBv8BM+1?JKdO+&D~seN(U7g$A={&i()>k9~C^L zfga7nD-oKN#H&aaj_&#Wmbi!3)6MrwL!*pHt1R||H<%)=H6Ar08Lv;KJA${k=%<2B z#1Yr`82X-mKYXrm_nXOcwPE`U*@T!l` zirvE+q1fQ4U?FWOuj!0-mh>|l+VSP3qsTgE%W^E;UxP=m&SrZLje6>W@2Cf4ERt5K zTr?XN9TvNN5)U}w*l8$ObA|ZSi{1?*)nV`2R{=yIdJ@M7#yLh0ffpg*A=v_6{^-yS zemX}WGptfIXB!8{p`zV6$6~1-?_|AO>Uk?X-CI#zk`6IBs20(sMvdxmi}`6QTouT0bNX9Yo?<$Cw&%`|Wkj!`$^L24Am18UY`7btsMy4zshOC7kmHuce4#|@v zSz`Ion5u$tl?u*GSQ(w#|5s2locgppx`)V$SAIcWXWE=$)aeDDl2%@CrGE_h+5E{e zED)6=Dp_jJJ1dHh4R>OWDLXutPB4e*pvrz+i7`)iTG)$4y$-X76`|+fhycxpf=-dV z+B7m(rmCsLOiLo!*$Jw>;UwgX z#8V_&>)wX@X`!Xu^j1-}%n)UCA1S&G&8JCq=hEnfUqjuk>SG*R2jMcE3S+O&_3o$I&CrYrE@7=zd@7T1S zO337r^<*n#zyucmfO9}$)7PbudGg_E|iTBa7(7k8#in^Zc+IMgkc z`VdLv##vvjQHhbf^`*B_I1+xviIY@w+4&I94wBa4k6dgucYQN&9@Y;k_FzrU4rH|Z zW}&+U6m>S5C=Or*qnJt%$xdQW-h<{7G^2ahr~*`fSH7y7I9pjbfw z-NP|VyCy^3!Ip@#|2`-ts76A*-^EW#U+dj%5`p~}iOIf81NC`ZM~2Etr*9Os94&km zr$Dn*-kQYEftlYhTggNTWDVhv{Y>9g5>GT0RqUafVzm}?UYg_Hkc531dj-o*}jf$@(NjySkbFb>H%WO(Ya>0}*=dDxF zNoB?reVJ)vaH`-kw0+BO&Dv#PGVx>>-pI1mtEL@0(^s?DZy>h27FUnKS9jd()x=mc@XB1^TkRD3%v z@$a3_jAq#Qo@294RKcM)ux%!$63$S=Gqt4{dc>iybkQV7bn5OdtC5!FBw5e<5E(Ip z-7r*~V;&R`5W@aqG)ltPWpix=u>quxajkknjdMlG51%bdj12$|hWjpTR*6c**1&|} z{`ur0in}LK*y0*|I_vu784}nz;$$+aLZNQqHIJ&-6}TUL`k8n+V!nsmO_YKq_0l7 zVCO~@vp_bcTC~hNy+)`*<8@M!jfFY3Z>h(!kZWT0EVmjb;oJ15DR0ujn&I;>yTE1X z-oyqCz5d`WYU*}V!Ob)weUqjhGI5gt`7%w87y|YgBRXDeEl`y2ZwSkJVYqGM9?czE z^G(N#mZNSO>s;l^Lm#)5Rz<{evOh<1P^dcp$r>_qa(vXGSFYS~LFsL96yk0urCw(* z2`koYZ&6I8?f_=0;jA0MH%Fk6)9%UjS}8Tt;ry%6!RIc z4v@j-RkrVs&$&rOBg6)QsO~U)Xq~SMUwhGyl7g&O{#c`yTs> z*xaouPg-4Sgkj|D!VjqbyDv2=%;9rOV@2D<^nm-nm1{9~CdZ|b4N2|?%^ndo8j z1P^Yd0Wt#UX@WeWfBG%Wra}xKv$df#56NKPw&`|~f`|q{qlF1ruiZGyH-z;AgI5^_ zt~T8bd2exAGqT%SD}7c(S7+mmlQ>9O@DQD8EZiglc`f5D z6=X?tE_OHbPtxXcIkYSrnT^HK3` z(%w7t38qIYul3xO(P5-}sJtB%O!#xWTsw7Mj{cfpZ$$UZg#}SALCk~Sgs9r+Cmd^&hjMXNhMKkPf~50m#h{8UL+m5B_7g#C0%7Y zrfLMY@Vm#Hd01w)FFY9PEYTzmBA25zlxYP?XX=S?7tJRb`d9xNplSlGrgQa^67xF! z>2$A#u|bSp)U(dk^N14Syg3uMF+~1Un|IJ=vw+(IIdfP-B~(TDGaqcOU#nmFkI$Zg_`9F;hxhz)qiGj zbb(H=sX~%TG|%D|E@Mu|!|g!w5m82rrCk2mFrf9_;=k1<=aw$ZNu>fWhcgCD{f`cc==+n)3M_Pxej09*I-v9_eA$dyqV0m zVxymrP~k~~P38(Ht3+){hgtFi@`;`;s|1WlwwI+fwYX2~O*3j@QhIaC5(+! zpwxM%hH*pOQ~BPTylKSMce5}58Ere2J9>qlF4& zlN>YX?za^GiKNUhzj6#`>xfGox{E>8wBm+W2FG8@#G@Yw#C`&;xYJ|zPuh=HtO4c- zN%W}2k(_KALto8tMO;U>Jk1rS!7;CgrY|@+vGaP%)Uez+?1B-5u$g4SbiclO3<(j( zw)yrUE7mzu<}89ZKmqiqUIKlcc@qQEqXS0LSS`6goXwdgX#`^|MMYkQvm&X`{C*R` zuoY$9{L$7kvF0uhZcF?Xt!YtS{+SCTo-_t*Kjjk}%WFOQ^GF&m#jCQhb&KLe-oNeg z{rb+D`bpujHlWbXwoh8xxY==GqdRw`-HP3cICEZlms=St^4*duPNA$>&bSiVIYO=t zx6i|`KX~s>q+O%LC38Y`4{{7uDQ->Au~Coe5u&ww>^~^1x)TLN^3x$(S7th1ozcNf zel&ukZz`EVeFIaIC32tCd6v!ma0FSRv%NX}<|0(*eVEipF8)BW$g{=N4{(FyVyx%Z zAG>iMdj(7f*&VJH-3$x8;AK=8^dEb{Waalt{2(nz5!eb;SWH~t*gPWcv57|#S*coyF?LNu|qn~A#)mr8Z(F@XW%7kfv+ zrq4a0PN>e3${B=JB%|lQOJ$qtlTA4VH&d(Mh(*ZU4`h63`mFO)%2j;4>7kSV0ffTG zpD=)~l+T|a0&rJWXlgSgO>l?K4oyJj{p0-zF$*x_SY4U>b*;a&|2vlOL0f$8nH8!L z%286KTbbojLiq0+T@FLtY@d6Kb3{Db$6Z1TCr3Wye6WTxI_TKHkeo|c;FuJPO5A_z z2a!$v_f1?#X;d00o{?QjCU`5E6kG}@9`X49(cweJe@XeT)c^I6$$yId|3GG5w#Sa@ zb3c3S4c+TFzN&)(Iu3q(`k-U8Q2(F&Bp`)q({uASK2Q640rXC<#E*O_u`tR)t~~41 z^?rDt-q(!?v`cpv)8Tz}-no3sAA70lcPPgJ)Ld%E1Zh?*n%8sdmg~kRbu6tL;-pZ%TE-?L^{EOPGs(t`7)$`g49=?YTh+eg0s zC%PwPN31WLNgo=1i4S5fWRFXJKU>{1JD}(1c0C%}DDcS&FQt-Ji2{+BLnh*nJMSCE zzA~Xw8_=gJM|Sm%MM5jiF5IoC!3-dS0*EvPsnvJa3w4&iE~fMpI;B^>WUc;Uzrpl0 z`o4Ab(h=mFyx;FNH(Pxl!jkXr=mNj9wbD1gkUh09P-6=~68JyaO-p5o9JH>;yppwb z0#~vy&~Xtm%o>Fpa`TRS7Rf2jq#O#A+&|PUk#!A1Mvvh3tIQ@fGy>mJ{4Kt$6wbsf zE;5PiV+x~pARKs&k}^9rUSxH+nwh?;X9}F_zbrl^s)M&(Bf8F^#_7K6Cc}tV4m_`K zwPGnAo?Q6ZnL+@RsbPIN9O z(TYeq_!C0m235m$IZPz%Xn={4(y6wS?lVA$Yj&X@G-L*G}I-mbFg-@-RzuYkH5K7S@pwB z05QiRm2Z11OC)fB)nyIKXP`ybmVGbdYM?HQbpAZN3$#ON1HlFV^CGfX7tC#GHgL_< zMt{>h?2ow^^+HR*w}`^A>Y;AJb7_z!+cdz^XBr?)x+|zhT*q9QbGuxTse54n{kU{G z@987?iRr%0j%O3T_MqS`{lK};?J0W7@vm#Cce(n8kxptpXah}j_$acz)NmWL0Xx5q zYRZ@bNcn6Wg*F^kVv#mV;8b3AqzfjYX6wQ#t32YbJRDZjk=r0bt>(*>K$}tDv{P%; zalG4p4cxN{@lM~W;6h+3#JASI%coA(%Yxd}9AH9V7*5`b)%cI#lYEFQ}^8u&CtI?!A^GD{;EG zR+7@pwfq;^X(gp;Y|(j23t~0}kv{u0mL0RJ{x?S&RT)nSq9gy_BZJN$i8TfFA(Vig z(k)I9q3=)oN=gxuOBlwp^S};bDj}Bwck>-(ZCJ2*R~BeQ9e!4sxqTd6GF#PdPNEb; z6=fLVfTIipUun%i3!l?!w@U@_qRE0HptDW)1Uv|y6MeUA!%SY174t6v)mkW;m02br z?)6E>UjkON`2lWjSnuKmD@UXJVU+4-mg9@Tcbw@A4K>SWxKi~nV%{#gfI3=jSZ|i(N ze;Y>d9nSMGwj}DT9|ZaO$Xad>-9W^P31%EB)6#+M{rjVpVvY)8l+V>M8(OQYdKx4s zpBY{4cD85O7ZBDfJGfhXF88k_d$OFY18NB&_V9&yMx9}vVR!<^$r?nh!_2? zs`qfU?M2$Oebx+2C+%y_h3u{sZCt1PJL3%-=&et8XVMe@i?y?WigN$=HMRnZMM+9X z4c)DzbjN^zbaxM>;sDYh9fNc;Fmx+O&J5it-Q9g(-21=xf8TS?y7%0BT(XvH0RuC> z^S;0L`+T0yZ@TF4pbBW0hs#DC_)pDh*4eC8EL&8ePj8uu%9pH7k1R)^{>vEEq88eoD+}m6fUo> zk84aMSI%wgEB8IhzqbVsXgp}}`8ZmQxVk*8O&|24TRFt}Iy%4T(m93n;;Q_LgHT~- zVDHd_=?L=FTy_!fIr{FtZ|;WwVy7;0zV+cdqQ^hwDrYIeghD-(Ekh@piMItNSgqQ# zCznsLaE^>YFwp6Q)pJ+_ALjBK$F>dT?VuGK8l4RbQDI{)E^zxY|(_1UcWVcu#V@dZQOSoq`U2tN0-JxSA)~%(V z)74d1=4NnSo7m^|%+;rMb`tM;E-`u2L`HfDK3C3n2Tj2u-JiEbw{waFk59VQB%dFk z3nNU71L7llgMNC}9Cit@JkrwxM3Tn3NQWfelEdY!#?gzgu^=7>UslJhUgxbhyDLo) zuAviLldPZRz-8wvsP3=%xRTCl;0!@;5eeIMK0x<*1n8(m%v9JkHp=BHZ`{VUhRX+; zN&VKJW@Z0K3pX}V1_-@*HM!|FA3e^W>KsJe>c3TF)qi)=CcEEW;GHB@I(OJ$Gqsi% zGq)mlUcp?-NSfgO+%lsa-ZHs%wZKuXFQhSgmJjZP z2o~4~43n>vg{*~qgB&km+KQ$}MX^3F|50xh|Er$addQM<5CYFaT~o!<6~lPCml_`w zxv+&B>r$~y#>X9!Jg_!k{pj@W(J(HJRv0p>+KFd?#MPsFrU-Fg!xBq)q`pkFmvOvn zedK%$_@646qX&ccg>}$8GBs_hbFXQfrop{>CwgZKHo+QbYe-e$u#N%qnZg;2>>ks_e=%9g9MX2;u&^W1Etp(e>4koNS6}6M_hc~Yw&PmkBnxMxzZMMK z&~KTMncQro-+qb7`ABrsu9xLk>asjJ2P)C)g!U5bPM+NRFp{IsSf`ZjShm9?6g1Oz zVD*W-tC6h*wc4friQHt5*)v*~&C+TAe1m__GQR&bZYKsBVQTyhw3(k3cVTer8R7Q+dX12{lHd{8UjGVn(FqY!Z- zO_H^ke$liL+E1vk7*p|Z+(~V#j&s^OG_TZ_TJ_E~Q^lIs09JAqp~+Qrm)YL9^b?f* zyqzE-4O8+|O#aF*P_G15AkR3;)9>H;0HIz|NK1v!ftdl!SwW8Q_IGPfiO zNKxfnt~{UgJ2{=8Ah^51N0cOQvX>@HqfK0NgAa)I8%K~jennNKh_*1=L)44C>oVf~ zvTHAOoVzcQO`=9%OL+MpD;cNrq5IsA?&%uG7$5`=zI~`RSZ8GqJ+e|q7)C%vt=eN= zNU&AZ-jGl&9xu*QXBSqtw~gsv^7f(Q*^Gbca_2tBBT*Eyo{D9{kaedlUl*$_9q(Kb zgnJ?tN28siN9~sO+YFe`?j?QDt%L_^^ON@@_bIGmC0ve7<5^BV|9~T)kgjRc{WcSk z^(|(T3kI?&Pt$`lG`48it@2^gmBm7;SYVm|@|3~q%_Ig_nM4Y)mVwCyw1muR=Geq| zJKn%En$9VNnU&wmy_Rg3&y$tk0qNh_gmMehZGYF7IfnL~p762r*24)Tm2y;SlMrC1 zo&e6LPT=D|xsawdx>+xgkM)$B66^E4z1h<9KjRjDTd9X`>&7wG8#DcKd z9^E7JG4-+-J5eLeu87mKX%`98DQ6A-uFu7B^lOm1o3!^CkF~)_6qK~YOQq%EWCQ<~ z_@_E}p=^(QyO}i6lQtVE47agZOa5fK`+HM^C2%Lw4bE9DpixfHexUM3}0>Ik5kS@L*1?@d$ zr~wh1hyw9pDZxmWwPePy0mXNl?|Z3C|9D+TzqF>rU;o0xHm%1d_b#Fm zvFYvIWkbrC_@_3L7~}|0601xYQ+AA@O~}l$s<^`!4W}&@Ybr}R0V!My8}TRNEIkFZ z{A;{gTo*}i!EfiOT)l#9@|Bpk9_(;O)2;3V$7C*NK3Q0fA+C)BeTfLvIQa>{r@rDl zP=hF_#KZ9taV*ge5%|X_&QBsHEA8JA;V+Q)GbFGsE&mP?TXqczsL0lEA1q{?ekfj@ zHrak);L<+Y0MdJw?OJw>8>>TKyr z1JfScyF|Ic5r^_FVwKJtgF!(GFrBdy3SG87V{1IFmJE;D;at5(l0sV6Vqk*Y#x!J; zJ{J`*L941vAJ#iDvQG)7osA8`QEmfPU)@pP5q3;@prnC2;+tMw-;9>KFvOE+NE~KI3Am=1!3+D{mVC z!}B+aR;i0#EU&ev<_xTHt?z$GfGt)0jPVq7V_)pwJyem}Gvl;;c%fqt`S0CnN*u0Q3Ugm;CRHV$ON|JnwsMB+)O-cME@M> z+P=W`2N6?e?}WZAhOfG3u;ct3!675_2kj@&wUJ}da4?_=CTX^g{aaoLnU>xmAc`=R zuENFmz+*IHWmCe8bww#i=4x5c*6_vaBpYE~`qo?~Ch$TTw*rK)+pK!ei;+HFfGZxF z)ee#}>CaG_-J0)g@}_j0@CGX-%H!07pBPxhDJ@Ko(3s>LnLvrcF=-d-8dyxD=s$wW z@ND8M%=BduJ@I@p;ILgwZi{GTsUmP#gxP}uRaBHzN7IKrB%w9aS<2x9uo+|4?9$W| zM^&NvJ;=d!Y4by!XO**@i>O=a^c_lUyi@tD6j;d*oWX1M*7LQMNQIv$hP4~FQj{%A zWZ*0poOEC_82tTuGY6Z@@J~;J1mn~;Szb~w&lj+{)TF@HiKFO49qyYUA#blQUl^}t zsZC96yOU4*CvwMqaD9B8PKK>>oh=WPKCKwbIwzKUtM%C=%Sk%6p~-`Xiln_)3TSlj zv|zD#f$Ea=xTX^EbUKhP77_;e6O+P3Dv?I2$KG+S~2BQey$YO|xL82#BpBdIY3PsPAFP z1)Z+1aac%~7v<%RDXwuE>lwvnnP_Iqb$jSnfNRH{l`r zq6~)n4m7kabMcUiOQbvMJ_7~@a3=HNyVz3@4y9I|e1>g;304v2>Jb>=h|l z@E|96c}?v?qK0$%EA7I!@v!;TvFxQOMeCg`p6V&z%W3$0aUWA-MsjbyMqX}r0a6616OCWm@T3OMb3KSmY5ygtIp;d_X^;qQ*@{9v&??U^HDW++tgM2n67H?D+irE z`5NaEw(WRHLCFl2jAv*saBYbFEEDxn>kL9C^B2p5lq7@dY^dZ15?F$!ozFX(o|rBy zbCr?4VO_Hg0lp^m`bZE114n`=-m5FmUY?fAi4^aE`Zs6J+8g&MJ9)ZFAW6(@`37mi)@qF@1)s#bs8o)x~McsF8uPEX2~3^v}&f&+dq@0Qan$OC!l3S!v+7okhSmO3+4{PN~IAzI;&%Y8x(( z?Z(?9GTkNWAYEI_9%B1A-eGjt>Tb}0-b|}L3(*TXPWiMmNdHKRi^noF>p7u|fvypl zXH_=73KY!8aBHOJDfFzS#;~&W*&JgB{*}iaLZVbt=?vhs3tV{gjOjIkOV@4djz!lW zvNbtfB(v9unm8v6wHz+9FZ-}L z5PK2!K_(W&*7!GiyqSTQOz3OgVD66a`e>|a)2IxHEKUJM)PPUGXr`rb?GwOuu6+VQ zgkpc0O{s3=?a*hP@*bXppN;g*h_r6{wGv;$)y&Vb&CV?KmgKylVP^T_A7P>K zPv74O5O{P8%`9^%-ZpllX`n-7kMjgz5lhiDo(^7yJNP@DKbEw2@vkP;ZxkW;YAfgA z+&DPQmk4JQueCmgAS*|cPlbBy%u4Ed4Lpt2&L)B>kSfQ6f2ZX<&Rd@NM{^E>j~uUb#nPDbn~{TdiYyz(U-N=rmzr zd-T5lR=jygr60*H0${nwr7{}}-NTtaMm8|G zS?}|6iF8HTt=+|7?QCkS=oHyqSQ#M_!!KwHC`ak|m^e#^9Ub{j+PAcka9i#_ygb&} zP7emL9c8P9F5Gr686%wfp1_$I6B*Uo!+t~h-T4e6NwrjhebuA-qZCB8d|~>vt6eVs zY0fd7Ur`E(18YCbsGhY`#FzuT%p13EpDKlHqUCxH$Qh}cMmnMqPyI-U(+7jrIZ#o( z8XuPDSVqnra4&l~3g=Ru3cmtZv5CAGOp0h+T6EQOb>Gh??kd7hc~_FKezGLlT%^oY zgoAmL$LJ;RuMCIP%G5!{xf%Ott!H1h?h(y5-HLrPR8jOW-vF{v!tUd+ zlgU=Lnp>aDy07u!3GNR+2>qP4W!d%^+*NX!KkV(WRl)U*_7^?8tbIloT?7k+`ChU9 zC-SEqXByr|jj{Yzq{ddCuST5RIqA*xU+aYiRKw@eDpqh}&s`@$jg+8l{}X-oqhq2)>gXHgw?jTLjmCyaRC-qBFA|s+ zukrG%v!qN{d+)cn54Lq{q+Ggm3fn;}yw=W{>pI~4hqGs$C*z^# zi!W$496h{-(B|%C94*BclF!^=9lbJ!4V39ielCNv?I9Vwy30OpE*VV(ROkb=pxjU> zWosODfLMZoyY4UdH_v(eE=^1bqYXX0PJvQJ>rX{7#vWiN=_Eaus5 zSo~=`n`9wPe4&x|9P0G+T#LRazaZi(z;38Yv-gN{&m}Az*HHCOIzLmDV&Ux4UB7eR zE^y=J@Uy22tL}EipR3cSq!1MgqXkO7=Z4;WvYB@bp}!{9Ax1)tcKk%U9yY>kMvm=T zY$Zn;pX~{vpfr*a6b2N>0SRQH=*Ap&YBq_-2QlXhv%UjWrp6dVhfMkv$|!aEMj`H* z(i^~4yQB!f_K!a(d0LkKd<$*<7D#=te`Y{OQ|=F4c0E967}C=Oog9QbIb8qvAfoTt ztJ1UcDtH1F`*VdyNSI*0KmRQ7Ge2d3f$mE|-}p%K0F^}M;Ny9;Imuu@yGoYN9e_Fi zI`cC^*MCC09jb}odD|MD1i~okJZzWIQifmf47}gqkv=Ous?eD7dIU*uugZUQ`tAh( zv{j&^Ht$|b7_}D91qhzVKO{lVwHMMIRqZj(uvJhi71l-7n0|+TLN@*q7Xb60ww^`e zVn*kUmD`+l{r~}~@LL9pht(BYbkaAwOF+$tBu!d+=e5l@t`AgD%yzp*Gu*_F*(h-))*}EtGIGZWn;d-7`r3l+e!DS}>Q@Kc9w1AfP$t5tJBsi$=iZXK1_oBQIbFfk) zDIUgWU#N|z175nMceK5_S0y^LbaB)fAS<6EM30Nz!Z$?n!j@5-zIV&=I_Voc`RB+T zn_I^YbSW21*ocbca>3)JAeF;kUz6w@6K!>%K|+jIk!`X+WN!ekmYAp-`qnHx=z;I; zSZHhS9g^vE#RdjVDI4b+?`*uGc?wZ|?~lDCJ={Y6&pwqnp5m{x`ZG`2Y+k?HHbI_} zsj2I@dl;?w*|CjV@eYaHX<6J;_4UQ^DL?-F0Yv0&4{mn%+G#c;#7aJWFO?0Y=r8tb z0dXMh>oLpIXfbbg&(orqA4kQPA3QI$Kb@MaUU*($FRNp>v=3>}Xt%d_ zG6wNp`&fM@_E5|^mZB|E>|vagSOT>FnEjgT2E42)@l zwc!PL<*909$JW|Tw}89H9Kh@Ni7fqX@olqNxG*r@j~UINRzl`8efV8ZMt@sXklo7M zl%-jV&Zp6a1b+GsqfaiYt}0K-RMPrl0jKJs@DNYUED=#$Dx-gV6XUKZ;*)Aod%Z$+ z8BOt9jyRhk(ugdOYF80Z!_j!WyT`btuEPOtWsp-n#1z)!MUqR*?gD&;c|b-^jSFBSymO|!L?G?Px0T+ z3t((h|0^k==r?B+>OL9kLN8GmU^ zp7GS3r-5TnON8C6P+CSaAncphPi0#1DP07)x8`;M)7Nv~h8dP;N_d#kGVmAu_#O|k zMoKaS)sDUSi9|$^01}HL5i!~;``&|6v zhE7*ti$&p7r7ZYeAd(z-T=_E`QvdoT0|=2Z;qR)DADWC`3N*UeKG6nxGQ9z$^a&3? z3uE}vMX+MQkjG-wN!+_D#h5U@N9OV%22L;CAqMdX`7jo>3tYF!fb_;sn!axz z|IP0K|8H97{9rWtqIvK)!q&ifq#V8*1dD| zZ$2(LJYC;-dOkYqd&7Xz(Qj0DVnV2X(X(c4YYM);oh|SpUaQ@fkxiSx(@M43@&bG5e4#`~NIv&yfHyyThk{ z$Lxz4{|(HJTK?ZLJ3QT2Q>c%JiZ^qGmsgt_wyP!BwC_-LiP>Nywh8|*L~vWXkFhTl zo?vgGB(M)6cLyfd*U-GRO-c7R2-onciRv`NVHLOcmdIQ3X0AWMmiq}OSq!<|TG5?_9-GMVT|0xZ}DgI5v z!+I8aBOjp`p3@Zu%Fu@|EGnuIELpk%s@O*@m-mqG(bf$nmE$W;#5luGI+oFf2Oo0P zr;!f_Lg?3yX@>AHhxkIL`iwq4Ld5qw+FCGMc8RiZypwmye$`q%Ibd<#6>h)m7+v3( zkXbO?yxQvcFj9WJYU+Mom?=>qe1S4pG#w+_K9$SJ>htP?-36}aWWb2t$HEyb9Tp9E z1+hlMMLbC&eeH=-hj(%Q9e{1y!H40a;sbJLS7;V>>Tn%iMD4mH)AVWcQsU{A?s$iX zl=Ou}D3*^8EBAZHZwE~{DWzoA^zFLxuN+tGazN*G%LkWEJDJ(41Wf+&7rR5=9r$hi zlb#2(cfnOFFR|dY^KyrSE@ir*v{<4O45;fWhI<$vzEWZ>apOsqK3(bT>lPN9!lA5i zo@SJM47Ad$y38m}mrBxT`H8OBZSg&f&-TEHUX(ewVG)AIV4)Lp8yN9sdfO0a6eY?h zp=v`!|Af_45$b=yYU<0sU^Pf~&u?$|T6C+Vkz?~r9Ww(MRKYfD?odUlcFg%vkW1d3 zGvNhLIrA8`pplrPcu?bpYUC}~@B~(dY~#L+Nr-w%4I@4lahpu$u8=|-6Bd6SYNd54 zB+77@$LZZ*9-gC-@SbAD?b=S_6>m*B%Oi?>Wpom#p2WD-1J4l42D=*(B7Tk_)GxBfXkuk@^_J#e$T!btBVO3+U_|)#gkpWz%h^yQa)^*M4>**-|UJ^*`WbBjqvACq3%7k9-OAsFza@ zDp)TM;``KsWZEdOnnOgj*zSIqMM)cDv#K%7ryc!ymRg4A4D~qn$_%Ma4S5G=s}xuh zwZZkOHgLNj#X{VQ-32^*R9ku%?=uvqoRLkzFw59J1!i)+)f*)Xg}QtTXy4=~@>nR) z+K+l71@61;O+?)!H!2U*Mn~grP@8_zpx`8P`9>_Q!^1KUHtsb(C$yNey0n>Se53Al zc`)Q(X&NJ`T$p~~a2rf;q6@GgsStMz44wyw?dO$7yztox5i9M?5Y_w&vBXrrYx28= z{G0p|!Vp!3zK22&71_Y;-PnNk>B^~>Urhk2lcvtW{{Q3Q_l$27oL&B`Pi~ORK zgckE(BN9z%D{&=;O_1XkIxhaq61i9L9MFXdIOzPBkegkVRp~n+E^vZhfk)r`Wn{uKCg#Y&Wm-5$b1v+FH_fvxb5O8X%?sbny5lRS+u+C`H#l8UnHY^ zxeUG>P6aFBy)X^|j78tz<{$UoYo#Q(ct^M8GA_mvu{9gIP5@$3oW0rRWT6b~B8Mgm zBDMUjULe<*(#c1>@@@oq+_k%BsF{oE8D%_K3%M9xia*egL{0d*Zs04xwG{f;spC^6 zP<3*mkobfj;m|H%%=X#ZWuuF3brbk|K9;7aboB512=u7vRLo6#uut18}sw6_;wx- zJpt4rL4X$zY&K9#qFu%k1=@e{7EHNp5fh3HV$Ye2fWB-^1t({M^P{AV&$3myxW-O| zR6pp#25O$vG^T0$YO=|MwJLrc;`f=ycNL8M6RaX7pTr*+4(Zlc9nX(uk}%9t8)C)e z=KgMcS|YPDJq$w#iI}}Fvy(QSIdA5k*;U0ylh_F1^4wF)Evc}!TR>g67U4Y=+WoaDrA&y&TczHwbU+i;n-XY( ztI}CTU0cf-{g|DuC4_Y4srIg1H@hR2_LMihIccFuVJcZZC_^C-RHh{=V2)rp<|*64 zCf+8L!t0xJFZ#A7;RYrceG%hTw-Zfzp!f!dROf)H_KJ7U(!2e#?8Z+@tWx|V|NE(5 zX|eE|F~9VO>A^{fb;plper?Y#PPU(sHXk?uk8r4~-wJf_0UII6)`ODJjE6vpQ-+~} zb1^C9tHXtq&MY)VCL@^s5D6OTyyfS(bsKqu;2(8St3EUuc!xysbBD;lF(*hYI`FY! zbFkz6U_p65h^;!$RbiMl-O>S+Hyw4?D7AdKy(0+kE}1_iR_Y;;h5ohHdTgBPGnikX z^gK^Hv#stmTIpoJYi&?8JEi`W4b&+j3<&E;7$;n3^!;s_trmeRODQsb)TlKF+x@Ar zzH$Mve>j0JNFd=GsBD^H;?GO|v*OC|xOzd?RRzavn=7^RhkXlrm6=0@gOU%jVk1VZ zhfdX`YMr@A(Dm%TELyenCz+)%C$O2jt`@CUGD8Mt0nv@f4|wSlmj3y4zB7-~3yss*EKgRtYG3^Xkz z81ojXGwyvwiovq5n-k=Cg1NBYEj)phjpytmY5004BI zN~ku>Q!<#GZqGS&YiZo~zC#Y>y?j4>)x#tIav(ER0 zKeDqG@ch8sO-C9=miuW?Y$Tg1WLB7^gOSqBp~YKq{FD7yt!I=hfO}tDwKyQ4EeB*8 zPgksTUz}A#k=l!?tKF4AFWB9!g&PPKqN_j3u7K-W90VM9z9&BS{LInk^yT5*jbZCS zx?n0%!=r=->Mvnig^m5JXot+uHp1BkI(Wj6ONKO42=bN;QFq$?%X*1FtGNorfNHKI z;*)^oB`GZplca#)4?5XsM!gCEZdI<2CzZqwOL27E4oZBent$7$QGLu%>D$Gm%^s z>y7JvZ7dSJLe~$T@561Kg*B_~n2oQ7&z&6=Vx2lql21^zoe0Jez<6JF>Ng#3DWJ=* zn2m;hF=l@nT_G85>L>FlYUhGM*5tdMmSv!>*E+3ZBrijQ&bSYrt9Ndu^$Dt2_|X`$ z0f(oU$71BKBa&qUvHiD-2)tZ`@bNSLey7;pRleGz45&k!qjZ~cJDj%Xd9>kiWZD>V zg z>{b)fqW6>GUW#ppUSHAv9Ms=naV5yOq;0J{Y%$&~7IL+d>-0m1d;r0}33wSE$A?YK z<3Wk%nc22d(_=KLyC1g%I|ZVNt!tf+7yG(`jCaI=?=QtcGy}<=eZ*HF_>HDuVopi+ zI$mCHo@RrGwm0KDvQAu|Do3vGj?81BKGxCDd1QYHcL0+n4xeRwtt)CZiu8%!kIm%S zxzI$;)4M+B497|mq`7DP^lc8G>NGd7ZQr94lx3u(4b244p5psdfoKK`dYevlZNBxr z&tts0TXT!DzDF{1#q^di*bHx(tOH^g1?@CL^fVgR?1@nvqG@1^Uv;6?|nP3dPw9eZy>@kxy+kRk>y7o%@+$%V&4 zpOAsDG$cmPOy?tNPA*0Z*g;v?)-!VOfKim7xApeuKJ&>kiD2c)t3PVgYBhx1^xRh7 z(Er(_c6|akrRo!Is474st_$wMmbiitKQo%Q-}S&xUKf(>QtR_9tX-l zJ<42`yHbu`jtXDP=K@$w9#BMNX~OW`bRXXdO$DaoGaxd3VrAY6ZZ}ht$WvF%wYLaQz2-Ka1=)7qS>V9EfmW z!TPg$8=w=@52DQAQDaOy&rwg6@hV>a+3sfalE+<9ZI8AEQ>KahhjFTXl}OtW?ejk# z4)`Jak#n~{E}7kLDh4SPkZ*&&rnhqx0Hb-}&;Lw8-2W#Anc;rO7`1wkFs6t!cr=88 z!G7nq@xN=Azgz8&hm7=N7`U`HyC;l25dkmmHYEvo{O2A#TOplUFA)On}%-a^(nXKf?Qdq;#MEg#U9?q`_Zvtvhl>cQ)FR%?C9V)h*@}= zjcj^;wV8kV==)prG&1GF*%TbbrjUtJS?T*ajW@j2eR_UDyjNpegJZkMnhgx+vqA6N z+*~%8HEe2f-|-#o$qr~la#4S>-;vzB-kVL-c=S^EP|n_X&m$VzQM=Rv z#5vx1g1s8ph2P>ez?zM2V|e-?w*4KMnWy&$K6|mrC`G^2-l{cDreFts33`6^2wd6v zxa}1dI?;s&FD-)y@cKfVM(&Ug#Wx`fBY?huJcx{l=nK45?6xl}u|C*OiaKBb@s%Zg zaDT`oAQA3pnxCsYT%Msz^whcM}X&0QSlqAJd;1=ZBGH(Y=UgvvyRu46+j zg{PKB;=fptO%*qj?|%Oxp(qgz_4_cuQ8-?(fkiAA@f`hjL2LNApXRey6j))uV*P0j z&TFHgu1uTbyXK|-{>ZSC`O^!P%B`fDO7F`KOBuw@aN@lR!OuY1;)gAMt*UeGSQ!TH zD~E-#l&fFI*<{?^D}g(^Wa%6IBZHNv14jfJCb?PW))5Y?B`#{R#3>+vzUbrmKKQT& zB+dR(GWXOXXxG-%WPWZ=m#|t!KucNf8|lB_Gzoq;J3Y-bg>;i{!-5MDcCvi!cIy;b zX9Qk+f2jV4(pq`QtElm*S&G+sY6kS_S0%V^Z&%bv`T8h1`-MXxq_KT z@PDabCi2Gq4=b4VLC+GNA*JO~7!IVBG6c!!wXkk=b+)rphlAD&Zvnl0eXWTFE+~ZE zzloN50GEN-RZ#>6tu=>f#_3Hr0Dj8qkF!Bn$zhyFv1GR09x>DJ8dAn4bWziCk8=kM zSH^(P`W|WgoR+8la{CR4gtgjl@l-Y_i8^4^g9tyR0esD+iX1L} zZM68Gq&Cx?AWQS_0fZ@@F)3(t_vNC-a(+X{;H$fq!F3gq2#F{llt=qF_fdEL7x$Ue zdA9G_pZAvc3X!=kEj?^lsW1+FB&hITj{Ck~lc^b((x@HlQHT$b!`l^tGWre5$Oc89 zelTUgWDRHrF zOu8<;k)n(RRS?Xk($pbBHWDe6H?}i~DbE<_e@T=Q%ETfRy6fP*ptw`B+TY?i)OK;< zw2^!f**uJ&LORL}&xk3sy}OrB=6PgnJS~+STi@j6o_ll;7<|$Ac+EL)EMegg*Q|9# zhc&x?(t-R+-H)8j?!o0zuokMFafB0{b>qbtc6@Qx{^e+~vAH{g@1f_B2?8dS?Fbg2 zT{h&pj=FcY@AP#&HCeJ$jnT}OEwhlLG(bS0`AziYz7Y0`thr=}Pdg4|7A)M(Fd z=pB5Oz9^Mfkh6B* zWQ`)Ly}H`#CPKHWPy%1A_x}ev1n(Bb<9fH7rSfcU!p4Hr+q9i$zq)fu53M}3rtdsg zeOIb2r@;K~AmyR+Bx~dP)$o*_k`{r1x?c(%&{S0OzUZMfZ;{m@J3m+VuSH4fvmZrx zM#jC(gj$UzM?$t^SGIm7^dHwdBPM_FIh+uZ2~7`N9gWFPv8VMlM$9!$>!BWw5S!I+ zH!rPACSoE?myMZ79z{b_@aw1KnHu(;68(^=Dvfo{QCUs`lW2|W!BHY9V!H-8h-?@O z9YQ`a)(`N25?&8iC>^fyE~$|aQgfeuZzoy8vl+5Rna%UQ(R=*hvm}a*?uGuQ@7=f- z-q5;LA|2~AO-juyU?cfpbJVT&CdGfMkD8xHh6MMC-%#Bb$s31?dUccHTM#z2&S<*6 zU{g3ErANoE-Wqtps6J2wdH`H{WG>b@i{5eTXvMn{`Dd5~QuJH(zNIKcP)Wt7@B}?( ziYVLZP=06l+>{$lv}vwgSX?#*HjC1gridNnFIMxnj~oZ2TcNL`*8k=k*3wk zP`H*p;uiWjU_y(mpEOwJsaD{^nwF~FJCQ_|r#J%c+fB0XWKHmP!;0$8JY_CxUfEPJ z3s}Mwj}|)TLPoD)H;{`Omc^gHFb}efV$Sp+Pr zJ(^`72TN?Oxs=!wBiIXje@*dWHO6?d%z0GC>cnvn8AFtrTaWmdWg{7~b?_H;k=4+M zogWz?WrOO>+m!pTHG#+p*o^LQ<~v{$1nqpF%;`UZsd>nM>NyfPk5e%cCa3W@vJr}I z4q{f@SJ-8M39YhzQeiP}!GN^&Mw=U7%UFfdlbt4OxZRNNLG?$7Ny|#&RO9InJMFC+ zov*<#*QmdN6p=2J(CcgZ{;#Q!Y@%Dl<^OsBN(-E*DO zohcNW9o8nBf`Lh;%CFzKM*8y}Awt*ttN>SHRMA$r5DlKL)-dM>O?$WbpXbVLjJ+o9`PBFs-Wh2fU&TJHrpWhN$IZ|My(cJJvvTqeGa7EE;gz2+_mh+UI10xqWW;&qZC6Ll()iN}neK+j>+J z%k`c?WB>?Mb~_6=q6TrL-nY4a_N%^ArjMlLJYSEYIF9w-8HsocczqtWt+ZGn2#L8! z=$qD=U$J^#AY`^QpDCQj-7h6_ca?-B)ai z$;`-jBEB9&d{%JnEB;cmS7pH*Qg7K( zb-L)zLxo%`EB^feQ$H*HWiYQkxC&^<41v$)?`6VkNjqYRwjMEG)Npba`285m$Hz|* zs4X)TuQRfeWaU(QKm5~v?d0A#p-e{0kMBoEKx5AmS;K?a>>3~z_#PZbqMF${R)`UD0zC+zdf=I&tj#GMqezKLE7zYkXKy%HV$(hj_N z*N2;;hF9tJ;b!3pn2Qa6h$4R)if)5{8j3xcfT74|02qoRQC3RN_3zwL%d7N%jw=|C z08-o6d#jMq^u!!hX=;lTAyTuJBA803r+>a>Z!2HekovkfV>?8DRnjSPn$a$j&-v3Z z66&B$wDK$r6wJXu1HwYp$lVuV0cbQ^z6l6t4jl=?VANcMq)WUn`t{+0d{snVfRJ_?v@PKVAk*j z8ak}T!9kN#WBvU8{Kep# zG~v)82j(_BMq)L*3d3+HAVz&Q)*qs+p0|%NnV1dl%y!jdq zANdxjfWOGgnB+?gT?|cpLr|y_eeU`5D-#xDw+xnezQ=SR`w}{esa};Y{WRabBBM}R z&Qy^t8_3J2OE;K;%`Pn~yB-5c3v=-;X5)eR@nXhc0R|d9hgUL3M?&&8GrA35As{e4 zE#E8-0Owvf0dQ`o=2c7$XkKPY!8r-Ivwn3zBA5LSFh{u8`WTZ6Yst4mWNqb+Ye;7} zY~@GHmZt~31G9qSec*6K1Ka-)sAFKvMnDaJjyMl(q%=(B;?~XK{z>olup6)G9Z(eU zo8H|Af&+ihJCo#UjlzG>J2i(^gOCxI%{%ZrgT2kiO>V~e^I%?gu-iM7z+>A4Q@rts zn{y-i9|z@T?c_kLkB?4tfL(C9tY1)@3Z>KwLJ=&$UO_R?)JDkWg*JP^bFWPvm#Wyh? zYm{wg_X}U`8v>^kN%QeX#I~#VqT<`KJV?Sw>9uldGf3}kKKaBZpo4zvo?PRIb?<@g zk7C2}$Ju9=IkEC`vofm~gR#YAZ)WHtq+ei`s(clwgh2=d(79vWgp3@8`n(gieTbf@ zEG=J!FcmxrShRh6(|foKf}Km=&ICR8{twf0qrr0W^g0QEMw~X|;E`O6N!aZ+9Pr%b!Kz+48)U~BX%`t6A%4vpu zv%^(KgRX2;sbUp01?zPw2YtQ1Z5gq56Yi7>tJiedflj^Mlh&5t#8=d#lj3@&hX|wy7 zNp+uW-rW?#WaU!w;gwZeq5=wN%_07JA<(mhei#gG6j@UIYC!Of=X5&oc>jKHC7`)#cgep)6?XvdXf z9WjtCK#HhNpZbhH#OlEqN{Db&J(oGH9BN|Ab^jK zXWz&ZQ4gZq#YC*}=B*kveoHg_amy!Ygi>&NbN+&DDEIxpr}>_?yPh^eBC$HPtvZub z6Zblg-8SZ}VpPRekXDx03OY6QJYjSokV`FFLnN;QUa%Y&%I zdNOyjq%U0v^{14FO17ojqw{f6-0%<}5C!bz>v(~*5I6{vT_LPz^RKLRb3B<(ExCiA z#3 zfybMlTt+pB-Cx2!^;wok(xBlWK*0LYDtXi)#R^| zb?t)z?nx*f-MhO2sDCGy=fkZ+dOyXHVA)j&!76m4mGxmxTfdkQT{-lVSE+E-Z;#^ z+21kE-*nC?%*9CKt1j7yvRea)h9xqstWn^e-;|xFP{j--*0>t-0>hU)N85{3kf@T9 z+{lQ01e#Q!5zqHX2yy%h|k2Bubam4mX9SzOL{$_MF#(W6yCgwxx9Jcjz%-oZvr5Pj!-YP1>7Zq=7Cgo4k%_*AYmI)N@wCipe#HLDMFlpiG(>O5szn;bRf zvB;SOxfVTXLUSE2b^Ae`)i1SJNjX?* zI+f2hf9%gg=^!oK!`C>xZ%cDA#VkpC_62X7OGqMi-k20v?U+Cv@tN9yOvfNP45-aQ zO8Ln&q=pgJRa`f_;1Yy0)rdS`WWW(=?6dkfk??r^4?E?M{$H}w*zW%mc6!6)xiP;P z=O`2H;!IK8Hh1(?pkXh<0_N1q2t*u6TFn!x-cH7OEhVs==c5DS&T@tG;{o3x{gnfo zz~*&r3$MZ{r{1Lsh4U-71H57$fE|6X$1uet&$h-^Do#rTcq=xZ*=Zl&G?zO=lJ0@e zPjTM-fN=D?hL(HIB716fg&$ZF-6QV$w8;C`eftWw8#-%wG~ACDx^a;oz@@k!I7n&G zfv7ojK96Mi1Lj{rF3{8ZS3teqM1g?|a1>IhL(fRjQFMxafA;fnw-rs-Y|Ds0s?g2ZRtZ>1UBb#hx$&s!2d7reN z{QiGH`+@eo|0 zthm-igh*l^rDyIf6B)I;ShZq$!^mt3qJ<)( zy(1O!oC!rc;$^z6NTdO%AY7{EfmnKQT~z1naI!?9Cm9uxW3`Lg>##jE2X zyxxoS`?9Tx+y}iEp?yq+z?=>I$K9C)*yDt?8NI6~Xytf)w9DIkx{l|7gH#Ga z3sw2S`z2m&Bo60u2zLSKnQSjB6GF}QkcqgtIVUY9=nV405UzCxWLkv1b+v9oimy&O zX+@NM%by);RtJOwM}Zynbs zq56$Lc2Nxy{aSH_y~J7Wpy||4$1SLJED^1qN_ zowmD^{q-+vU_+czzWt9lmLOWShr->;=66hO=JL5_ea+cs3C*Q1T=d%D+5l}%l5BHU z-UAYJau${hE4$=hl{Sj)w}A%%1eFU`b-UUh91FG@03)ukgSI5({GQ$L#e{Zi_u-x8 zmH=PV^Ymup(8wQU2buA#7(ONPZs{TQpCU0l8BAPReLw&^BUwX2vv!`L{N47(Kx!f) zykN|cJ~)B;&i`s*(vc^o$;sn|z7T z%VU{L&Ec<3&*be>!K5w{glo?oEMuSX%SO!yEoZ0k&HF0JA&=d)eWna!w^Re_E5>{G zOsOS=1(dqO^mdl57a7xNk&)wAQvOm;5uYoCkO%bFl_St#{1w+~w_m zpw2)5b@Jq&0ttM!OIfZuY3aMfamyPdtE4K+Ejk{qQ$3~jf(3ETk{y0PgOPuf@>Rcz zft>4-v*w}cX<_xYW2V_*g~ko>`d(W?qGRqtC?dSh3@><<%n1cZq0PBe9~(k-CssNg zY7%7I_pM(u`6!8wTAyqJhK_1^gV(n$lY))l_5t-++I|7{fpbhnrd%^HSJu3(4mTT9 z3Y%JLmr-Uco-2bdo-dJsjyTM##^JyaXFz#G-jPo5Z7`5uoMA`~dpo?CoV z$5mWtp7HI-()M|W?9>?=i3~|8n_DuH46JvW;}mmpMDt{=M26*xzUolQ2ymO`dmi3Z zm>uUJFX9{kEV5w?$fr4I8z8D~DiiV<FY41`>cJ zTw}vX%VxQHo!G_OUHnh?`BL3o_c@W?R`Orv=fpsv+B~>y1W{@e*uO;9&SIa8&0wQ( zlg?4DP%bH5YS1oKq#M7bGRmeMpkKd_6H5cG1!acfS046g@4>lX^+_lr&<&EV;F6S? z8bb^;pCws{L<2iTIKCMX=#6^e^f=73a+ptwYxPvvbAe*?In|6((O_4E*>-Fo=@(Dc z_H(q##6Uhx_gJAv!^4&PUf^4& zwv3&<(Y=Ri|=5l^y3faM`c~vxrM7`sZ|7{2-7{Qw%dYh-oPX!#_=wK+$ft zjka8^%l1chK#Tcz!;u0ur>xrtHA7jW5Hft%7fJHIZ40-cgv?0APyM2#q6BOS-||=k zKll{7brA@W4H69`@`W3p>HQ0v^R<4Wj7{S69$<4F-+r?>+);qd6*N@r=9(nnVi~Pt zvCJ-5$F`5ablQ^7dwNXM)o3U9T6L=?@xy4%!(Hai6jCegHK2^s(#d3cU#VqfVA#4j zDjgz(zU2`zRA;RlB!%XNVF86`NBV)~#VH$RR;p$8ASJUkmtit9YAZ8O{8h{@?ZRF2 zv$meu?QXTgNmew}2&7Ym6P?32RFT>fn5OHK=T=ukeu_qLkQeg9=^E_3cupdQq$=|` zBG3c)*apT!&vJ%`V8V@m9KJRa~vNeZ0Y~fy)Yn!@V;r$zU!R ztC*q1+@luX*tM4`mb`{N@n)7Jhy{-2GS}F<_rhDL@JmaK(J8of`m|sFS|AiVANmP> zkGanDwlm<8Q)wDabzrMqD)w0jq$n$Qr>bEn0Bx$ILpQ?P;v0eb*m(S+M*6@`sYQ}3 zu#Kz)9GMP|QlwA;-?mn2Bwjm8c}fpu1{Oe*p$FmopJy(`-1wP%uEti9xo9wiuQ(p=@Fp&ERSI7 z6im$JT~^R`WHmZ%qj zlqs24<7$VY^bgfJyj~(&D}Tkr)iyBvfLp=dFdgDue|f4pmb*K1Lgsoq-8S>(tpzO`e}A+soUo6j5OD^N#lCn-#f z8?R2izTY;Vrcw^5J^gxcTS7sQQmT-BhB%?1lCcuP{DC52X3v?9QvF&}U*=GGR~D0- z7qKItf60_7Ce@JvheXoN{3utjl(C4`p4ITC(b4dha#Jzb9*CDs1H-TPUdmwJRK^75 z9%cEWkZyc`2l{p4%{obJl0h;`*7j8fG_=>mB?mOYkwR<*4FK^IW%>I8YPiAmD15uVg zunNTUcSGb*6cp7E>Rou2Zw^2zeKR#j+;$}h>kr!L`uSPs@^Tr7ek8(P|7KS~_2x&ww$`5Co+F5zJVM9(;dV zWDZ49Ou=ovFz-gy@_m@#EkqoYYOY)%Ntj8iG}vaU*VWXw%F7Z@^*3$u6TrlcFtG$K z`UvXbni*|aH@%Tz7)~lKHGJASeyz^CWox@i(KD9Y;j(bSDun*Fny$<;pHGspE}+G- zWVBFnGQVWqxHk+ZbZ}A`u!8WfL;DYEOW&7PTjz5emUWwcsbggXAXH|163fOb2>AdA zd5S-0Nw`CB;A_mqpQbuJj#U;waO;v0t)oMxPkj(=pc5TIS4taT`5aK*f~p%%nQY>r z{SZi_W-9q=M9N!{k3GhJ?4=t@9mwMWX_8g zpQNpz#PU{pT{i#MwJaBe2~DcIYdgZ@Gqk@dPz+BEnZ>#}V6h~ZIO50gjL$4cXT>8; z^qYexo*w7dU_MT02y=z7qm(o*)Y`fe2S!BJu4YT#EzR_IVvI%|2!PGt>KVcRSOC4e zGN~A0_ae;U)QO(QV;6Kf$kD&sHk1!E_7Q=xfm$)*f}NoU@R9Xjao;d+>@QZ6Jfwp} zPADy=1o~vIt?3TO?F$zNgz6Nr5R_{Fo1ob8zXZkhNd7q}mT3xHrREzs*yE*drNP}} zz=QfguRhd)hvldO4a7i8#i$=Lq6_ItpCl#nfv^n?kQk6i)KjtO^wlDh2Z8s5)<6>y zf;LZZY!QLLJeLhoNgkp0clTCTn8-P0OuQ%vyVg57)q9Gd%uO2fl~e)9K%f6R4076X zxT0#`VRLUrA)MoO$efB=mVC`ZO@;gy38Lc7cp()>CiLi5E43vfgDrwLxOw5^-$)Q# z5;@}0&#B5>+x?pam7k$?g0*qaY9;{?r1vc(&ZyD^TvNWP-~%tPvrYLaUWadp?-TAl zPiw{Nr%5*fi76hwRq~h4Yi8&ef6A%Ytx!Fau_cY2!BI7khm6>YfbAOwo@jzKb=<|s zmem#Lc|}2#o|^8u+&u2{QEylHdF!pNGh+}^&gHnvb9;H1!bh-HB~HJ9nvPbI?Yjn| z%iLBp4JMQ)?V*B{#z?7RNDW#p#%9f1)yC-LWJy*6z;@NoXA$0>5!o6{z0ijJ1(f2q z9nLW`b1@m*`YKpMbrf_;h#=W@wXP+M$FV84$l3}@uEiHVYn$1O#|31$Wu*J~43gfj3_-vpVEWSl)d>SV>5O!`RzBAJp*)qY zR$h|^HHD490#B09KqUY7iB+rD>xio?@eA9BhI&+$hZ;}r#^oy}FxVLRGDgQvmU64J z%m;_7L~NreuvsGCTwY%X+YG2b;u`h$20o49Sf%FeYRpwr-Ie#MSmf=^P3d9NaH~_K zSIi{?CS1Q}<}#-sy8P3Tx{d}PemUl{{47bMFO%RV(#1jFXFW1l@#$k=KqHjJDbPKj zLf>F{fAk7`GF%tv-#0g9I_1U#PE&yITw0?U%xkL~5S<^`Z#_>z8r5q7ugqeXaHY3j zUN-iIEi59&VeA2MuFXYx(VN8oh;y-5Ox1whzWMWOM24A;8tVYX8U4XVcX_Vn7j-`c z;dw4?8)B8uY79>d)QX?|{Juq48`T`xtOI?2lpv-i3cV&Apn7rvNm`U-5*_y;HH!1dT8r`t8N?n>b~Sv=a*B%+xMf4 zdifn_vhFJF9$Inz1|8|1eA@08Q`u<^*2k27Vb#_@ID(Y}tbtWKE_5$U9kT#?J;R6A zKE7`Mqqf8AZ^b7Y6JBHy!{5aqwD98?@>JE<@McvpJJ8#^jIbVurXQK&>4Uz*_|z?d z*o8-*(tTX1m4cRC=YAHmMkGdxNhu;vd9r?5jlr*DUEyYiSQ@L+1x<^`E_&bi8i`SJ z3k+(^O%Lf?M6LA{*HR+V!uEOEnK`L>PvU~y@kNVyBb2RmG%*#J6N!F!YSvE+l*+NhRMonz!h5>d6}m@bTvJ7gW7 zHn&#C{29XO4L==oj^1v*z?@t`kuZvC+DmY>%`4KTR@DbZE=yLG(pW29jJw8c$-Is| zx=;<(#U^iOl&1GdQkFb>VYvK-1Ubcg;PZ)`dT*2P+^e&ZX1n`H;e+dVrPPD_H^xw} z;aj4pI|R^v_QLX}vF%*jiT<0yO1Awvlc!HtknPBH-PL(}-`}w;g-s`;Hb-TzH!C|9 zX-P*68XnLvh_#cODp}+h120D3bnk}{xrF~Rr}Yy}Liw^+{y(_Ek^!Bv2@d^_2mG$F zI*7}L?L#iR|HKV0xHrI`PHb6oAuM{FV{B)Y#eF9@3rXK0Nrx4djRN!?9}6AE4WZt5^8 zBuCRT&-YdFJaA5w{m#Jgn7V}X6yY}{> z0_|^>7un1Fke03;ywLSg-_zBxOR%L!0wDBRE0AQyfhh}nRhHQ5Q+GyaACySwlE-MO zd6wGl#Z2G!Fg(KDpyu7RKP)3?I zKb;v1Uwmv6A|tLvJvJ_e~dgD3MP% zC#kcp)w4z4I3U2hDNtWlkWIJKITBlMJG>OyGPs02+Wd|^eq7^)Rr4pCx$xNt5+j6S_o1*$0U#U}_H11OngiX|l%?G=(N4aP%2^hSQl^16>Yc*s-n(1~{tA@7|{B-m}MKTGrNAs)vK-or2 z$$)uHhjT^i#oHG^yLVCKTSJ3<(p-XNr`iWO$xqFn7mp^L z=Ogl)YYw){rD7W#`DkOC#AcZI0kbZ*9%a1rQZTshAt5#k=NzJr5gr50T#T- zrp=u_%SG(SY>I-Dj7x=Dw}C{N&RDIc5oZEsR=-1PgLO^8fkh1v0kPdQ_mBO37#9`H z;+`U8(aR)xDS{K5V`(F{mwxhXS8v8cXEz*amGz%9IUfEb$v(KMPeDK<45Z&v=;QYe z@%B*dnSSNqeR6Zu(TA}^Jw#i0Vc5BI_}+{{7;~1-Zf0EF*?y-z3pW*xWmX&k$(#yA zUKl#9Ee>FrOO!Ns_x19r(V@Cp<_Yn3>TQi5KvABn08o_Yi8`t4cAU|gb6Pn1i}hK- zbP=y=#n3tjK>RqhW{m9|+pmJ|nJ4<2ZhK!?i57EL;BmZF}N`!ERv2p<9UFvtvkUT?+)d28!I zr6#B$M50zpZy9cq3|**vB4kdt(_))vHn_~zF?B&G&3X62VqwV^*rpj@N_EDyd7Bh| z_0$9-mG?3kq=Vn|LA^)41LN+r8>0Yua7M;-sda#*Tb%WraL4|CG1-3PLECp4!biOli+ zKV%XeUe|iFYUiM+Wt;qi<*bHT11zTs@(-5tDD;lyd^;qYMl*Tx7>YiIz3fZcg9lSl z&yS|UHwm3b8WEkEUldi$ug;H6C%e5)Nyu5GATpXLo1tG%mI6SIM{0tk?Jq4{&&DwF z?a|FisU~2YF-mgToiBwjiGID1cgm0Po7M}K7cw+dUhR~c%)(!jXpwbY+Vjj+{5hcw zMnWc!{qF@Vv>-r5RYEiyHq)ldogLEbzNjm_Z4Q_XNfs>T8h*G9$^P-42Jib1GFa?X z0r~}1EPBrl?Dz)8VU)gRy{SWqCu>aaTcOjzMjifK=yn4K28B1|@x|@by+WmvTWL5s zQ6x8zy#>wp^aoyQ5qZ)G<@?Ty?h3nqeBXz$UBRs8=}i`}ER=sQ+&KH;(73_H!$efc z{7=l>Ezzf1uf9N+C2Cro51ODcBy+Fb*@>KvAiWd~N23Gt3lA43w^|>zR(vtZ%I&RJ zI1(O}UN~tx$W6_oe`Dow=C-}wyKc~DtsR{U!CqCE<_d)b#w3^1^Pw{Ep(>*HGRE`$ z2jn>>&DPSWzqKs;LwWd1MPK8>b_*O(&EXlW+T<`X8H_hHG9=NB!O$5u1@0TM+%l1G zZD7^3I<2i@bB*U(3tcO-W=3bA)8mk-Y3W~UJ7dj}Z| zDSzUAjD06kW}YRP_Meo;sUlD}pnW>f^!Xz4JCf44l|0lFThA6;xv}qS;;C;L-(Wf-dCv&ysD?grJVMTDq*0&jP#h`ESOarK+FsEo`5W*Cm^T;q zF7L4iREiojD-%CI$~D^mg|Ui?3w5knJoS{r?c?`E znhh(1tQ*7&N!BmR&Ad@$pSzVez3EG@^mVeBcE3N=fLeB&Y_~^xn+YSqG14Ao} zgU_MYd*?vh4_KT5is)q3#wOdWLYH5 z`}%=oLOB`4TvP9IzEc@@TXyPX-JTozt`%6%{fSKA=M^USba2VN8(i?)lDC7ks@9fJ}j50%sCVh|rDUXTO)?E$2u`mH1@ zwRu^_>XbV#G9Lg=2Q%WECeh1$d<)(Hc1UnD0`_uM%B@Ppl^hHqR6B zPNK!vhYz9pH8L^ZiVgb?$`k3%U2I~+X|2LAN9;X%ZV(F42!QPnx1dKn@r3V}$j6oI zoHOW2T-9Hp%oXyuyC2UO!OC{~NK>^(6hDe)KYTfkl@rdVo2d=9K}BgZ}gG2;zC(xQodZV7O6 zq?jqXtU0Huwb{CNyy}k1NXc73@goXK-M4>kfaL#pR{Ed^7@JjH=hV}a;Hf!z2yPyK zGfY>k@AYQQi%zp7>BL;WJZ@H^W58@CW9`(W^YdUZU4-~UPP^0s^T?+{pQT>(M2P%y z=dnjP?fr_;&iC`FD(bTmkM-4(3OZETj;8f+Z+^>+MQYxS2+=~Z2L_)utyV1k(_(_u zqOeKW4P=^;YMv^jU%V9C{_xgUGv%wOP3t=q|iZ{qXHhLt}FK!5f6 z^2?Sg&Vq3~Nc%j{pzl$$1=J15iI930?lW1~JTrXW9B0xg=p}y2j8=UdI;^dO%OjwF zj3Ge>MHRCG)+#9}ISzBdV1{p1(ST+%LI%H)*Ut!Fv}j&<#nu^5wt+TYzy2pFkn0+7 z4FH}}pM!ZrL~>VepyikMeFm7hr}UAp4x>+JpW&R2-t%<>YxR*n)jgSYTsilb;_d^6 z<|onkw#keJFSP@1J-SZ3vxmck6c_8JV!lB}LQ*)MN%DW#Yu>ENQjPI8g%+AmLFCpk zK&sf`@iF8ejyUx#SktX|U;7O1rVh9694CO>V!B2`({(*R7g=aNt$2zU`H-=?2Q0s2 z?AINt&n|=OkSkk2E4?N%a%X2O@c(URw7nH|tWTbe!|1)GNT!1~(@{9cCeo5R_N1i> zvciuWaDdvwiw-xtfv(~ zMsB6W0BAe{8qR%6<^d=_MInvpgICwS@$gZo_p6(HWT-#s-FHdVwJQ&_pMNrjO>)yA z_Xucy>UwvsFWhNPX5^DFSF{IHXIZMm-=>cHdFVGBqirT*_uL^O-MhkrznjOs?%?XU z>u`)l4v<+MKc;ipBR{-4j)-EAT@1LSqT*z6b=?_GT9KW($vwkMgEd%6<*Vlgqe(N6 z6i?+H=K`IQ=3JA+#uF4XKy@9#xI~n9yJ%x59$du=y_6(Dk6i&Ty*BXUA0 zD3F?gPcI?vHd-XTqIrPvso}}i(Xxi&hQH~o7-B#ImRWiy_eEU_7BBLV57_y;t5G+q ze6I9ccvcdEB~G0Zf*K21mWN_1=Wjj(+Xg$v^X6L2FIae%uglIitLwp|C`8Ckz|ItA zk|%)#@b)StP$yiWPTktDMjw-vvX+Kg2Vmo@&fKhTUKrwyT_&#WGSltmPD^#eTkWV0 zCV%Qie*z}Y5H;>e{ zy{DVCd+ICTfc$>S7d>1Vb6t$Co?d_`GZChsJ0tb0m1l+GTNP|)ZzAAOTM=vSI92~G zZOQ;ge&hE~>)GsquUzSLcn<_c5)W{fxIHhA!C8WT)#6ZCpUl!}`QgsqS76XBgq%Rg?! z99-?^P$BvQl)ZXgzF`VekYE_|cW|1@*E+@#107nYI(ZE=716|@@&SP`;-Ha(?-m?8 z#yaA7q8h0WCK%&4t+=LvpqrdHCVVY${L$}c>S?q)eBHHVwfx9Hr_zCB*e-@iG+2-B zYE`w8Y1a>vnHKhby|~hm70Opf;%|EhB0^incpye(k@WP|+!*~hz)=V-eM07~$ zQeai1Q?0S47c;iPcw#|{)Xd%F*R7&aF#&(%(<&Ff(2O!O*8*+s>a-+rzO%gW?-0&z z4rD5%X3#7o4GM-HGwWrC=VHbLOl{B&M07kk7HQnjtv(zOqVs}x*$F748~b%Jxk<=xw{x)y&nf@p*Z>ce zmMi=t%J#N^8do|Q7_`4mWvy8;`LaCg8Md5~|1tUaM{N)|Up(cfP5gVxQCyX&9F6Wt zHciL)u2I@c!pP`yuBB~=2>PQ$ENTa-`}am1%FSb~z=`JCA8;b43WvEK20zl!MYNss z$~Z1HEYsM*DTKn>qNSzOC9wfl1Smh;-*wQVIBnQMq4}JP#Tq_&sbio+3FBTd&y_EET37d3IkR&ezVlFp;N~dBGZZm$o%zYt6ryY8U8Q8T)u0CIX2d} zRH6E!r(2=|6MQzJz;UEUc6c@rgK&yPV4mhQt50_xsp?sUcMa?xck{dHtymM(gESgE z{lNST;QH-TtdfFNL?;aW`Dda3aAJ0NWZA>I&)(7~x(HW4VeszlZ8b0l)LV{9^=<&|{ zUKQiEK$s|-{dh-N{jTpQGlw*$U;QCv!16Y$GHW+ten=r7wkTw8FQzrZ;NV6NuX!$KgC}#K>%}j1nM9;Nxu2IM)AhJ zY4%K(1pe!=W#9yDf}fxd``{<&b?%twLm0fX?vkC&h2iZR9kyY(z(9Oc=jQ;o1mT+| zyT=JsKylw*7yNiK=2EssfrGwJSx6$Aq(!SNU>~ycT4iK8`k6!A2+m`)wZjNsH?1E6 z7s&Uc0GrsDhw8MSKM#-e>Ta8>vX^)|L4!@%9_%=3q3MSy$$Y^e=7L4FWN-Ja z8+BQ6QPD~BTfN7z^N$36xg^?|Q^_jEzbP8tQ~uah?6!-?5t%VKbYN`ar*j!hzQ+@m z8r9||CfbLzp40jrPr|OY|8{RnT)kQ%b~Da3HgEf)5%#};vvNO>$eCz_0%pUY(C_Fl zq}ix;vvaFKpYLN?omT*|Rq5xB!I9d()&mwY91uAl6vi1Ava4#;l`3(cSHc3n9)DW3 zm0Bb`WQ74`UeZl-aQz|0*cf2o?Bl8AX3-spUFOalJM6p?Wo`gS?RC{M69A?Z4u`8< zlx_1=KZOCKW_zINp1>KvqY1>c;I|IJJxu}V3g0I~P9#9&cy|NRS195tlu9`{WI7G- zSk~{m0l9$F1F}i8+%hSi$0h&xUBav!moo)#GM$(I_&w1epbRgS=;?1wCIEE*{QCd( zz?I-%4-6L#T4DYZtliIN?)y4+GFJe!0Gk}r-x)pMVamqRs+yNhCKQYoNJy=z-phDV zo{W=3p5!A?FELsO)3!R!CJnoT(tAB!{~J7Z*BZ`ar*%wXUjb389rv#El#Y_{DBpy1 zI{@6e@uyDWe02T+WU??F9kWf$h&mBRW6CIsn0#1SGIwUQf9xdUe!E0E-RVv2*V1wo zj)lJGtYMD`l%C}*>C{F8wt&BNVDmit)fXoQ9{z)pbGH3~_~YQH3QIQ_ z?_=P9^98s{jdyi9&&VX-3IqA&AWuNF*B$(%A<;hQmzElT%P!mTQZ%|GnhmrndeeJ4 zq!FMmrIVPK;K40Zzu54|oX@K&nb?{*1r`Wl-h^}A3BR;@@4S~DlLR_G3%;=0U|*xq zPc1y~fy9ry(*IL#YlWE_5(-jI3%phPH|wSNAM51_hgIxKzI>Bx3H3g$j67??VykZc z1lC77k3$}LR96t$3%AcCt9Cz0aQIWmc~;szwQxjkt1vzmXxmkvEtST2qf zyV@_cY1J!B54SevqY_Ii&oAfG6O2YZH9eq#!!4DIU+^Mjg0)M0t$J6-R>z=+6}#kb zoeBu3>ux<3&&%1y?Dw&5wwlF^2>HO%ZsDA3w=yRQ_KtQnr*nO`P~PC{FyKhn7yh>} zGvH*_zG89=0_4SLaG?KMd4@m7SLZ%r|323>PYf|$t$@aL0@ZDb_ z5muQMI@s$!+;W1GjZ%IzQ&S3GNQ3wMNKwu(q_3i1V3FK?ueJY+s)y$3IC1g$*5u)w z;ea;$bVL$68zRKy$%T>L{;=Zc1_s={1_yK7);=+07|ZzNt=-@QXcCK+*3J?H6mb3r znq(IJPc)f+4eiASq{RX+&t{-Gb4n49wEFo08fniJxdU400;aB)h;c{X59}kzex4|b zlB4wVYBhW?HI>u}uRH^~#dAg@plcN-VRxCYU6n%g#pfQO@o)UR05mx_x8y84yT@yq)$5MHD7<5~2WCG$fS0jOi7pV51f>L>%l;_de058%5Y#FSO^xN~lWcAS6qJ#jlrni^=gp@s zNSlX*tO;Zms=ScxyzsL&@A>yfD>g{VjV?oE8U1?%r1`{R&#M#K$(1EX!*b0YbM=ZL zxfPZI5OZxkjBi*|D_$)6Uh@-vMX4~lU zPdV5LA%AW8_OjH9D*xHeS6F?RECaU{Yn*5PZ6ig}XR_{QiUM;(pkib{Y&8%lUu5Zj znk};5?=&^*n~EgOv#@uS>v6N14>%KpG~3`QSHLP<>%LMAOpvTi2g|=6^_#C4C`jN3 zHgqqiRy%Cx)_1m6w?YSZ{GFz@Wye-tR9}405>>`#Z%R zgJsHsvNF1vki$|-QiUVdy*Oc02OI~3ViCW^j`di*N{~W)?NBBfuM*infKs%|_Z#fr&dr|Imgieo+@c&1 zP1jOTXm>o{UyV!TvapLkk=f{2fAjg{&X4ymdtzE%$%RW0QzjFm4-3$AJa+Hrdae{s z9{=l+E-rr7I$qs<6jMY3=Y>xc1kS%cArPFQoINQ&nT3+7N0z^;F^Vy=m3?hywq16r z)u+{fdF6j`KKOQtS_9=CAoPWwyj*ng)3JIsWP`2e{GR*VxGMQL=5J;XA~1TMIPQ0B z4P_Ctls1RwMLEP+)hVgTV$~F}Y4t?QK7Z!LzhTYmjWwh8c0HJa4&D<&Ai}ZqXt%io^wkJc%*Rag zY4DBiAb#sK*3Wyb80&297I?!G`t=dlM8bZd(dB5!Fn3Zx!V{kIqFG#0re3X5#!3vf z`nE*;-aL{1OIeB&pp%q;z*BgH4lzYbC?CD>Iz;*hFf9w*z{bJ9rd)-c{P>%0E-{&< z-_YWYD1+tIE#^e(;u)0i#zRCLjGxv-vXbQ{L~;f5U{+7P5n?w}YgE>Bw6}UuiAI&V zl7(JZ`Dt3PkC`-Ed{gw@hTun+=M$S%vZvV}7c7t@5Cc2D<@M%xhv_j`s_4G1{SnDW zvroc$mV!yh1n$T-j#Q}C%t)uKR(nt|+gciFCqcnb;6kStqdn9G3B;&Ofjj$4MQ|3Sv%(#uH znPHDA%Te;>+br>$#CFMz|BQhkwA522DTONR{?SAor9OW$e#*yqAuu(FYTI z%BRN1W-@wgoo;@xISfVJHZSdIu?cv>X%Ze}&Mfl%bP7L;16=z4lrMnKM2FA}$G2gH zHapR{-Pr0)FA1q;P@o^sJp9?8AMEVz)U#-3BO(*G%I9vZPs#^5ALjEq+SCp!XkQP- z6fGY^pjds@_`^FYi30o2tJt6B-EjSO<%?Z|!s|elcV+tH_r@HbFDq-AUOq5Ipk=XI zmmOfy>q^jh9c1IiLlE4)$kR@UM{*xLj&c!6#L1mC91?bkYT$s$Hs!+l;I+lt7Y6VY zZQO$RcOJSRDyY8HH2oyI6?ZbpJEUiCHA^P)FzsTA+n&fEU8=#NF(-u|eUP2vU00>l zm5s)+Pr~CbWpt!HJ@)ICZC5Xhv$+>3)w(CX+qTndg$DhvB>%M9TG3BpNBi1+sL*=p(A4m=a3>nVB%wGhLAYUO;b)2xbAD9 zz1S!Sd$o7sEDxJJq?g6^o<@`$ zA{083KM_E3z2yA#+hbv@!(X~Lw#}G7n5qd~H?1ZvL#iHD!t~w7V7q^AZQpcoV!CC! zuA46=KQNW*UCEl;fOh^c!@FL89A%ryi0ESXT|XWVamr(oAbTxoZd>Fnph^1>5woI+ zgubb(uH)@6o0VJGf22l1*9Ox)bA#uShB|(qVl-t2WI$p^L%#(oX zfEkJ$*pUEI3^uh+_0fij(WC6#Cn)X#cDj1I1639nLz^ABk1#lcDP9a%%>r-iyAKM= z!KVE)jX2C3IpgQabZnK@G0n zCCP~1&Mf^1^)&DMJ|uBk@F7vIe5{TPT;=plV!vc!q32uz9Tnn8Lc7)^jU$Icu2b;O zMK>a5f`I9B=b7uOp~3(yuhm_3o3yOmxxw7k(si0wAEKYpqt4#ey3Ka#rEa`?F7mHCePwi8MEuS&+uIP@bwZH0>KlYad(2dd*klz?jg7bcX*vo z=J)2!ntx{Q>b1JB)Rnr`=bYMm*Qxk0wlK&o+azvoz#xcs)QIr!&NL0N||8+n5n z<#(>)084yS8EV<)x5Ly^!iLvwAH|ffEGrgoPDN|C&Ujzn9 zw7+pyBOPxdI$RrZ13^A=BzQXKg0R3N*+JIcFYA0j6(p~cL_niwl?rYAP@W;FYiYh=xl?FY6jYp(gipQ<% z*Z(;9;`-n9$$~x)>|CgHeCn+1oE5mhQ+p4GW{zL!Env&pDrUl*EqAz2*-`VbS3ow8 zl2ZPaplJJ*$K$Vnr=dzlT3-v*8u~yxb8u$h9N8!p8%G${uS?o$j~bCWQHxf$tXtwfUjE6lq0-xZFd))v#Fy z(e&!*_geoo7tSgRTRVgabwvodJCM=*vRorpX*De##Uo-D#K!Rs@)uO{39$Mi^jq*o z3Fl$`FONb-K4pd|!8al5ofzPO~9`7l3aJ{MwP zMOE)-UA1VPkd`Cs@X|qGLzUw5fyIE0m%Fim=$CRvcnHxcL0E1gohI1j4atdnU^$&7 zTuaU&qMRCyk+Kp^IG1`(%{0Ha=xm(mP{@`EJQis0OfwZ^!9mwZZZ(zm)!+STmUq2m zSeuUC1SHwRs($`KHR0ppt)yYrRhB6d4moD&{IfC&wp5@f8ZDM~;*dd2K1;hS8wh$7j=GEh&0 zbEM2(9ep3Ta>OM|mXSUWqGnJ|pmD{4H=`x&Rb?3iK6F|9 zy3bY{DGnhUmadb;+@Z}9J2K`*>5rTr|Pvfpjt;YpD8P*IN#N$98zLw@z*5+jR z)&(DDae*7d1d!~I`xao((Mg6F`Lxv?!@G>ZyNSf(E8l{s3J12gYt!Zac%dB*RHiE-D z_$1$WtTV2s7OvSRl@7y^I%4L&$kcGAhip$YUhIK6p+*?j!~cL`iR-q=_TY0s!-sFv z^MDAn8tJ;3r&eXMZS6&9c-#u^&H1Xn_HnCZET@Kt8z``WETxza)=lrVXmnKgA}zyV zsD9DPUS(9?TDA?-{e~+~y(G?*`6G``TNI>Hpb|ObX-XJ#eBXaofkP>JGv&1TCB74p zQ0p$-jwt5%&8eO9#nPzP$dzY;TWVD^F@wjG)XB4{fAL6$#8~?c?$+W48(H>btA^c& zoktbUKj0UPKEzM*<;!iL5POql-rV>5Pi$z?OYB7F`{Y}WEsuQrJfhQ2T>Tlx&@8%(j%C{@ z2P67>bCAmR%ie&VzBcU@pQ`<+?8Ue0PJjEJ-}QM=2c7)rLB)vd>SHs6*S54I zxK&x<%0pioC>aN(AIL+?5t1ugX4G;zEu(MDz}!OC3J~bDXQ>&)!R%vHB@C(MEz~q2 z^!6JWre-Og3GnZEJA3Ai`YztHkg(#WV7ZuPXDt&OGjX&|5*brhv5%HTB0Xmr0S;MH zg7pncfXQIgq`z~EA!Zcpu!E5{>Z-2GUHp~K%`ILtR_0Ox~W zNj8R6syKr4R#8ND3=gfX$qUb3yJSj!@?WSN+N*fH)EE1hJer7S3<44Ku;iX-XNStr zq)cIIqKgS(eq>J`!h(YR2Vl$pc4k33u37E1f`kNa)ZqzVbHHNRp2a&#v_Fjxx|ox~ z{KV5H;#?dK`Duvf9`r-Ej5DCm)QTy8!|5Ik-f8p$ZHvIqZ$^`!tkNkapbJBr-FALr9rvm@8Kp*Kp%m2CS zH)6tO7YQ89-am(Bg1?c%ROE*C3KwY)6*@%q$$g*x)6GU;fjfT7{|3g}P!{1}>TLgf zvDfdofCLFftQ92C4&rYATKPnf3v2bk+`uPDs>rcc&5q6Lt<7^m(|%%TtveLcn{#UE zCq^5VyDS>uJm7>U#yK1{&C#teHMR}P9SYvpE?Vnww3xBlHk6MoN**&T_V;d48w!B} zKI8?h^(Zttg=#~D8Pa)~=No8~-3F`BcWSxd3GKd5iF4q#JduvJ@#}E6dwQA*Up_k9 z0^eMi2vK{cdSv@VdbPSo1tG=j0*zXm5EwdSp9tsAC83@nx$LLk%gqDvsn5&i(<#c@ z^ZG;v1|)!GycY_T`hOkiO_z^S=9uq_2%@F68DqYsae29VB^9o*mfT@ES%O zuC&lRxpeK`cuFFKi>bhsiG%KFbzLy5Wt!|10`|HZb1|F>2NJCsRna6jW3+lTj(W9t z`v&@-?e*R>$=MnoEM8cg>|fUGVz^x2+%7>AZ;ux=3Vp6!_%&bWNo0!>>nZF0g&)!V z>cZ%D?!0okYahoo`{luYHsr`}{e|G-82fXv7p{+Xo6Qm@Tf}=N!~zn~Uc7)?PPIY8 z=4N&W%8=M#v13b?kf?!|7yU2lKn<9?Hke3H@6P@&ca>GZ}IUczYf2>_3HFYG^d zb&W|M>a{qqyIC5lJ^0u?Hr-@zo`2myTVo;Ha~>QXDi2U_$@sj-*E75G2;ug2tw z3+da2WB&@|c(;?C`w5T?(=8Q}O^xol$?;VA0bCuyKpYaoof(1Szo74*Nw6R94vk@U zVjl|+Hp*DKwWiiKjDiEM-9d7%=S85M7ikX_jbZhaRe>u^c2is}u6ine3Zgb?=a*5 z+pYCEcCt!u-uvN6@Phe>wdJ8?+@2i&weN6TaV@A8R5nZNPT-ZS;Nq{g#sVxwI?8f3 z-zfWV*=>qR+gQg1SVD@Vq7OQ|o17KtV6v!)oMrpO{{{q~SuL?K+-zE-L_g}uqi1<)zwP4Vp_25W&uigOZ9B57u^}YPhI`vRsTUSk3dUxxU9_)->v#|lF>BGnvMMO z8-)uDa!Jvp5T-sRSdMZclk;A~A{E+1nZ__|*K&h_-d?{PNcu32OrCNPbPjcd#xUCR zi238{Y+9(3h5L{*q}Q5DQ*G#}qKc)Hh;S(a*mYAQGDX(qAG?){q9(Usy0ec^m&8fwtdgO&m7(6WG)b;#Wjz$zeXbk1 zS5Z~Wx-n9eJ)RNs&kd-In9R7f)8$=}sKyhra%>*kY4q<4c}&K1x-WYtT7%-L)r$2! z+7n9)3D3>mim9q{6X|zJOWPqaWbj*-(FjRxhXTdsOl(ywvgQdpHbF#3o_DxeBy>gv?T25qiH^-w&VUR8_TxSNcKME|K7pT^Cyi`a2@FO;-W1`IzWa6ga)yCu1SE1+p_DuTf@68=;!>*EunQJ8o7RX892Qi8@gRH+)uR&sBoq7gIHwI zDBnChg)2hwEOgJi=gGnCO;*0H^f!*yKnI1V7H7vQPsc`2$NQh#YTtr0ovRtnKUA`T z>YV8tTJc$|RPdLZJHyNKT;X*<0*x91+Cw~DPg$BJ4W&dwqG^2DA_Jo z*>h6YBLQGTZ6WeaBA=Qcyc3Qtd6ZThi|__TDz5T+)Q2utD|enbix;tIa0-A;ykzfa zRavU0qp0%ryZ{4PTfH8&FRB7VoH|35?BvNYSIgm+vplYtr3$2)bs4^v($!QR1mhQc z<5ix;Gta|a(U?|G>(^#m8rc&3TbPFA_0ZXSUU6pZ>F*Ok z>P@7J7Y!4Y@-Y#%P=Od`-Em(T^R9G*2vtK(Y6$2WA-WtWknBomCXLo(7^1oJ@R7tD zv|s&;6q6fKOTO)w^0U;WDx*WK@~TFyiJt}J`Rxk2VaBAHZ61w}zfl4opY?OvcaVgx ziq|bOHs6=&^zE$L{+`uy@$vSu>z>=J_kOu8HhYze;dhXN%|L-Y?&K2L(4{_hV!@lpuN>_-gU;twh|#ZTRc!5YA`qO@l8^TQS!{+4xFL?A-T^;BZMn z4IB@++t|9#&n4>@yrHtnYcWQjFei*ykNujw2{=DXUy#le&JL_OyOg~wAV1VxV3wEy z>$|M;r!I1H9HJM~u+OCoe_lamxcw~Gp0`d76fTSl`33A+2S^i)A1R#u4b7&MYAFI3j+eJ7!ckeL6Qlo<=hV{@C%V3bua8S(^h-Tl zyjAxU*HkBOq5-8{{fzqLq}852FRLyAr! z)e#@GXKH)8rSa5%P_I2gA5P_N8zDR{vLZT}Ku_9rA=;jF2J8;D!3W(g2-6#7xD-it zcZ06;19e@$O=f{(wVde7MVq)@b{U^(6h|wiHW4xOam&mF;zA{Mc;{(Z&Uui_+%*&L z=48Oz&Q-(jdrB6SmF6*ncNgwloWtX249Vpa%eoA>(>E8GY_W94L+OV%P+HFy>mX5l zgvVS^h;~Qw2tL$7xzPut!MLxi6%ZDt1B?B^kyeQ~(~|_!%Rs$fY~{Dc{!4W9J7~%N z`L}Y&SG58gGYNnCYdIhQ9l^F)U0zf3Mkvda z-G<-Fj)Y!)pzS!|;9XZK3Dw2+k42X2w~xB9lk!9?<}a zO*!tD!;U~ygzsUX-Az8Wb|X?h_8isx5^f|V(TxJYh-&Eww9Jay6H$7|?KCqxGyHkk zw-6)6PA%-E{qlgj44TKqe!Tk>MbECbaHpqc^&`QBMeW1WL|4f~7taAf!=rl*4$$)+ zetBa425EPEYv(!Sgb&K+JkQ%Dx~A9m5dFZOi7#jSnVKp+pPy;9IE_dZ0&eE1}3`xCox9qU3MFFy=wUvF?O2?CB}lB68Rv-X$8EIo+wR6 zEKI?pcpRpxiL1Gj>)Iccb&m(%zfK=Pi$!#jD!{)%{(w%TBZCCfl_%93^$|WjFI4Ig z{sWR2a4q`WInx4eFt?cU3#NeT2({%oNiv@#B?_AyngrMELCzKeWJzU4c)aF z+R<{Ct+Csf?v)8O+j;cds0|w(@@CoAp6Y^vqw;G>K{TbvW^H8}KOW>-d3=6lGsqA_ z?B&Ffqk82FCN3oOqTBaq_(5O!ag6hI@j1@ab7Zn!11TOQ8$HHH-lTi@y=ylvw+aC{ z^G#Op*qqe1Vo~AQJ5AZUNPXZjQUEw$UPgMj3|4){Pk|s@huO49upk1t?$LSus-A`> zQvL3)oLxHQWE+Sr8nlMfFDIsvnaCja(m$x~RUZZ9fHLU43o~p)dN1l%xpQsjr33T= zX!s_cS26^Bt1LV##CQ&#rz?(?cznD^=}RsN3^~>cpa8a*`~57^M1&7>0r4?IKkv+bG7 zJkbS8FxsxhkzWu5Ix~t`hjJcy3OF|>M8Czi_JrqaT6JxUBI-nc;S>TWMN_%%8Rbb1 zz#2rX^D+rj(`g2WT*okkn$~Cnci6-Tw40HS$mmkm05lr2J<$_%3(kw3jAARWXF1ue zQ0s+Y(`{gWTqNHtd#kD zdDrT?%gpQ8Pv zzpEf#cN<~Ho)|aiPdD# ztW2NtMmEw_xf;9wCfYO$1&&Q)B~K~{0S0#dLuvIBwTKQzgT*?`C{V&9C}xO8yWTS; zK^+Qq5Q8>o1LlUMJLM5sx=@w4IIC=IYpKh(Z7dBELX*kC&*zxRNGZ1(Tk)2;as)+o zpn>p^YxiYX^U`ghu|FmO6L@q~J6%4eLzk$P7i!5PVO#>5qI}RD7FZv?(By`)p*(7P zc_9-seRKR*aqQ~7K_^s&?toQ%@Iqx>zL;DqpU*Gf#ZgGbCFPc1Vt^TFK(-a4W_H)+ z=<@t?7WqkOQWY8(SqK@NWgG|W1f56WNH+(Ji65=j~pgw#ozOIM_s`M{y ze*(0QMeN3RWmN|jB2z?=l$k=4KMw{E3ir;orr}H@e|HfC0xuh0 zPyG9jW(EbV_^Il=XWE#fwZfbRJ$TX&BVw?QO)E=ZHYV7GV*f%^;MwT$`rW;lh&RbZ zf{(a{0Hn}nb3cLAT(-BtSu)k5`KpN!rF0EIcH|jz8>GI z@QSs=YKGB<&tai9DUcl4B4qKk;1347u;5|5{=C6+PAl{Unz?TOA5K>;snF-cwOoRy zOm{B^|Nh3fETDhW$p&;QxFK~f{?0Zcw=S|i2Dh)1NmWOtwtHMwEvQ~Z=6^D{+xr1v zY_%HSxW4DEfD-NK?;e0E#yv_41G&&;FVgba@7Txz*!P+=T}o9s0C?Ii3*%2pxfQbC z3>q4oQwQT|)9UO#mMCKKTB1)d9h7F{)5#bgjUWE8hX1YZxELXke(pkIWjH08+-ni} z76cbz#;)K48{j%NFf7YaC_G(iz>jHYvaCJ&!etY})X_8GVso^(-=)QV9!%fkgLMFE ziV^^}5WE2z=PSKUvn%*KP+3<1o_DpWe~XO8MLObew26lZY-xcCcb+K|;ZJ>Z1=>$= zbyZfgxQO^9pmZ@Onrk?`a}4v0888J_aBJ#!e|DtoWAbE?$d81tCl(D!P4+7Q%M!$2)+4!7 z^sU?4zk);|ubww5!++%diJR^5bvA8!IS{+5C5G&nsQt(sEPyi}|GBo)ezz z>c9C7W)QA^d`Ps*82%PtMI~(2ar-EpLk{m-A??=k?d5D}V+cMwUg=++u-6V~D=Fhp z1P#1NdULpE+St&2wO6?D1IoqIhc5e-gUv+%gYRC4R$LP=4;;`G>sa6`OG@54BQ)D8 zx`wowZ^%jey@Iw+)x)fLJef5-#gS_=e>bWjRGlN6j9+>IZG+0|Q}!343huW~(_OHy zOq|)4(h3j3#{Hclz{!jTlsY^%5lMiSYo1{U^{me9-EtmS^sYZO{7kfQ3lZTpU4a;W z1?D7PD6t6$7b8xECr!R!i;EW%GI1*XzF-K696mK8@si;!5zTbh*d;~ma!>u1gQvCb z_N$iYR#S}Q>x(JjNM0Cl?UBK22Y$UZiLXu&)bPr5L36X&xya31%i3(>TCK%cF*Rt# zK&1rr2-;p}*cPOg<+!}OI*(u5JfVGem#WKsr>`EDay@c9H@L;`>j6A_d1u?wMahH=;)zkJ>6vt@%Y;YMF3H|}?Nr`;) zT);`1mxQWuA4e_2TW*ViC}hn83A}RYv9FUN(vXP)ailS=+vSmr_9r}oo^K!tLga)} zT%EAfi7O#C0o{Pi&Cf zR*})%v1x0BtZ=$(!=h&20q%Eu0)NMqryDV;bY#6|804ng&t+r6vTA0GDy|Fh0AadN zRcqEv_Ct&Ae6<2-Z?`n;%$FKL`zr|o-^2aywx8zy;TsUh$!O0zX+Q>JEq}tgNcviI zCYXN@mc#67SpPS+`Njfk{J`#Gm1Q)R=KXriV1Nf-pTJ;U8zKHRx-32KCGe6lJOY6l z&EToe+<>IPZ{T+~4qK~2p~?Ee;znzvx(;o{L=@>qVi56^{S~yWNq)z^pD+9ljm&*c zau}}LUmkD{Uh^>gpcN;14Q~>FyGX(!rl1~Jg&R9{WtwQJokm(QYFb8)Xd%G&34}|+ zb_y#)_>|B{if;i@WSQyCi0uKr(gcs@u?CBrl<^Plhz3=ly9S^27X!QrVc}p z`GGw=uz5~)MESAG5@-2tFBoCW)FgnN8!cF5PxLH=Y1B|B}Ph(%+rd(V<3L(P0u!#zyCV$|hbP z|5#^=q1B1a!C8>q%Ky$O0Kjlc0pDUPq%Y$1qF;hgint zW_yiKhkNAHVPjmEleTu$bYo0okC)~bzHr5wpV0VjIFDU3MirRGIQwI?&%yH>q;m79 zVuy#(6>JQeuj!*wxA^I8n>_b2eHDjSVE-ES1gq7{A-pz%We#{tz#F2TBfcTZ5edlxQ zONQTvQXXPtkS5(BGj`Qz3Mr|41e5bd9Rzl_SWm9c`_xvk!OVWyU{Ca$tMV;YxWO%< zb4kWHtN0_EcROw?u#e>?cKAWfcjwGqmD;3iXBud4m3YRmd4@KX7kw%L<%B{xpwJ>@z#&EB9Mz;1oTtqRB6tHGGT^mfn0j5~ZE$8u|R z!*{7`caL)gcr0}2(>8r#BbaA^8K4-6pjE1?yK;EImgMPh?@yB8s(ZBRc1C%=AHy%0 zy0^1-cP84d>q!U4iIIh47evOH*a_~O6gEBIwwT9@&w4Ps)mz-`<~E>8TF~Tb>w3jq zbtxWs5{Q7S;6BrP0Q%;M`` zAsZ(!H&e+k^FLyO)i(nWFT zbae#@S>^TQ(%-d07LI?l`y6jWv>WI3W~R|)bj}^hKDlQoVnhf{2xAhPKNq0a-VOe zVANQ4zsz$@?&*Kfa$#uD9v9SR_ti|R{lz2*-EwDcVMk<`@(XDyZS6R=&dH^}eYRTlrF}6b%PTaM>8F^O*oe~hiNbhR zsc2KA^kN-JEe#6WEPM-JTHX}OTxV5UXuTs+6_kV{qp7fc7lSp`Og7}eEZP59g7tZX z(qri?2;0=eh1!A?1LLzl$E7sH*p0jU-1DAtWT3(412*p>>DiZdMBo#9>h zZp*q01IZ%=B{@kUnrN3Nf9YUs3< zZMU~7np3VRK~X_6&aWN}=GUkpH2uU)t}%z{JzTYoPB(dBXO`r*tdWzv;Z} z^DEa3F~y*LU%xGW86!`ljNi(-Hwp#JNcKZPP#UTEt6@oNBUEA`>#UfUq}a3*E2EBF z(q=5l5#Uf$?J4~?Fe%^)gNMgn8N(XuBM+|2FUV;}EHF6k6{Gn_W|3PL$StKLT7F~E z(<|0^1&A4Nf+{OmysFrRlvTu{vBVO7UHExxCnXx^Jw^AzVo@{@LUiR4ZlComC*1dZ z@(^|1Q%UOJiUz7tcX#3F-8zHVt>ctAFCs2lNQOh`hpXw|^KqW@c8r#rFkWmM_*=^) z8oOyI_%DNopH7ti(qJHh0y+n_YUJYTI4_R&zuIFWheAP|RU5g8s@mPo9(krJELn>D zdG`W%dHWPnC@IKn9P)~wo0-HXSMaWR7lNm>#Roh&QqXMulXZv^v~3Ve+WT`bi@ZLsGP2@`a% zQ!fR>4C!X5DRFWC;7Kd^TXY8$n(Sp|Sw42;fH#EwODOTpAUqK}-k3v=EN1@zD)V@C z@fKzR30LMP<%dKZK*hEq8FS5 zFkerYzZ4Vt=AA`5zL~X z@sCFKpVfb~^M9}XKkfQ9+4}<5I<=FavBi`OJKitP^O#SBy7Dh%qMt1gY zjuvL-&M+eX{vr{wx3@MSk+L;npeKP|nO*70?GaiA=if5MCQe3<7WU2-cD6907Eboo W25va`@eR;JV5G$4MazZteg6wddzsk) literal 119601 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

YD{Q*n-%lI~ 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%0Aqk+|w`RM}(+5u%lS{_uYY+Obf^6K5p4Yj)Srtc_ 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�v#oAsO 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 Date: Tue, 4 Jun 2019 22:44:08 +0200 Subject: [PATCH 051/104] doc: add info about default plugins --- docs/usage/plugins.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/usage/plugins.md b/docs/usage/plugins.md index a1f792ab..43875f3a 100644 --- a/docs/usage/plugins.md +++ b/docs/usage/plugins.md @@ -17,15 +17,26 @@ A plugin is a npm module that can implement one or more of the following steps: **Note:** If no plugin with a `analyzeCommits` step is defined `@semantic-release/commit-analyzer` will be used. -See [available plugins](../extending/plugins-list.md). +## Plugins installation + +These five plugins are already part of **semantic-release** and don't have to be installed separately: +``` +"@semantic-release/commit-analyzer" +"@semantic-release/error" +"@semantic-release/github" +"@semantic-release/npm" +"@semantic-release/release-notes-generator" +``` + +[Additional plugins](../extending/plugins-list.md) have to be installed via npm: + +```bash +$ npm install @semantic-release/git @semantic-release/changelog -D +``` ## Plugins configuration -Each plugin must be installed and configured with the [`plugins` options](./configuration.md#plugins) by specifying the list of plugins by npm module name. - -```bash -$ npm install @semantic-release/commit-analyzer @semantic-release/release-notes-generator @semantic-release/npm -D -``` +Each plugin must be configured with the [`plugins` options](./configuration.md#plugins) by specifying the list of plugins by npm module name. ```json { From 7e824b2c1831d3e0226cdaa5caf4533d99e34693 Mon Sep 17 00:00:00 2001 From: Johannes Klein Date: Tue, 4 Jun 2019 22:53:27 +0200 Subject: [PATCH 052/104] doc: add note to default plugins --- docs/extending/plugins-list.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/extending/plugins-list.md b/docs/extending/plugins-list.md index 6244b5a1..f81efd4c 100644 --- a/docs/extending/plugins-list.md +++ b/docs/extending/plugins-list.md @@ -2,15 +2,19 @@ ## Official plugins - [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer) + - **Note**: this is already part of semantic-release and does not have to be installed separately - `analyzeCommits`: Determine the type of release by analyzing commits with [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) - [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator) + - **Note**: this is already part of semantic-release and does not have to be installed separately - `generateNotes`: Generate release notes for the commits added since the last release with [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) - [@semantic-release/github](https://github.com/semantic-release/github) + - **Note**: this is already part of semantic-release and does not have to be installed separately - `verifyConditions`: Verify the presence and the validity of the GitHub authentication and release configuration - `publish`: Publish a [GitHub release](https://help.github.com/articles/about-releases) - `success`: Add a comment to GitHub issues and pull requests resolved in the release - `fail`: Open a GitHub issue when a release fails - [@semantic-release/npm](https://github.com/semantic-release/npm) + - **Note**: this is already part of semantic-release and does not have to be installed separately - `verifyConditions`: Verify the presence and the validity of the npm authentication and release configuration - `prepare`: Update the package.json version and create the npm package tarball - `publish`: Publish the package on the npm registry From f3f9d1ef58389e9c3dc5c65b6228eb945b97d18d Mon Sep 17 00:00:00 2001 From: Gregor Date: Tue, 4 Jun 2019 15:32:00 -0700 Subject: [PATCH 053/104] test: prefix git auth with "x-access-token:" when run in a GitHub Action --- test/get-git-auth-url.test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/get-git-auth-url.test.js b/test/get-git-auth-url.test.js index 16b58159..8312d2a0 100644 --- a/test/get-git-auth-url.test.js +++ b/test/get-git-auth-url.test.js @@ -244,6 +244,19 @@ test('Return the "https" formatted URL if "gitCredentials" is defined with "BITB ); }); +test('Return the "https" formatted URL if "GITHUB_ACTION" is set', async t => { + const {cwd} = await gitRepo(); + + t.is( + await getAuthUrl({ + cwd, + env: {...env, GITHUB_ACTION: 'foo', GITHUB_TOKEN: 'token'}, + options: {branch: 'master', repositoryUrl: 'git@host.null:owner/repo.git'}, + }), + 'https://x-access-token:token@host.null/owner/repo.git' + ); +}); + test('Handle "https" URL with group and subgroup, with "GIT_CREDENTIALS"', async t => { const {cwd} = await gitRepo(); From 038e640d5e4231b3062c60565676bb2cdfbebd98 Mon Sep 17 00:00:00 2001 From: Gregor Date: Tue, 4 Jun 2019 15:35:11 -0700 Subject: [PATCH 054/104] fix: prefix git auth with "x-access-token:" when run in a GitHub Action --- lib/get-git-auth-url.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/get-git-auth-url.js b/lib/get-git-auth-url.js index 10bdda1d..4495d95d 100644 --- a/lib/get-git-auth-url.js +++ b/lib/get-git-auth-url.js @@ -3,16 +3,6 @@ const {isNil} = require('lodash'); const hostedGitInfo = require('hosted-git-info'); const {verifyAuth} = require('./git'); -const GIT_TOKENS = { - GIT_CREDENTIALS: undefined, - GH_TOKEN: undefined, - GITHUB_TOKEN: undefined, - GL_TOKEN: 'gitlab-ci-token:', - GITLAB_TOKEN: 'gitlab-ci-token:', - BB_TOKEN: 'x-token-auth:', - BITBUCKET_TOKEN: 'x-token-auth:', -}; - /** * Determine the the git repository URL to use to push, either: * - The `repositoryUrl` as is if allowed to push @@ -25,6 +15,18 @@ const GIT_TOKENS = { * @return {String} The formatted Git repository URL. */ module.exports = async ({cwd, env, options: {repositoryUrl, branch}}) => { + const GIT_TOKENS = { + GIT_CREDENTIALS: undefined, + GH_TOKEN: undefined, + // GitHub Actions require the "x-access-token:" prefix for git access + // https://developer.github.com/apps/building-github-apps/authenticating-with-github-apps/#http-based-git-access-by-an-installation + GITHUB_TOKEN: isNil(env.GITHUB_ACTION) ? undefined : 'x-access-token:', + GL_TOKEN: 'gitlab-ci-token:', + GITLAB_TOKEN: 'gitlab-ci-token:', + BB_TOKEN: 'x-token-auth:', + BITBUCKET_TOKEN: 'x-token-auth:', + }; + const info = hostedGitInfo.fromUrl(repositoryUrl, {noGitPlus: true}); const {protocol, ...parsed} = parse(repositoryUrl); From 95a0456a850d522e85ad4179b4eba76e1da71ed5 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 1 Jun 2019 12:14:00 +0000 Subject: [PATCH 055/104] chore(package): update ava to version 2.0.0 --- package.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2ee85592..ec669439 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,14 @@ "description": "Automated semver compliant package publishing", "version": "0.0.0-development", "author": "Stephan Bönnemann (http://boennemann.me)", + "ava": { + "files": [ + "test/**/*.test.js" + ], + "helpers": [ + "test/helpers/**/*" + ] + }, "bin": { "semantic-release": "bin/semantic-release.js" }, @@ -47,7 +55,7 @@ "yargs": "^13.1.0" }, "devDependencies": { - "ava": "^1.3.1", + "ava": "^2.0.0", "clear-module": "^3.0.0", "codecov": "^3.0.0", "commitizen": "^3.0.0", From 8051294ffd1ab2a77c2abfbbcbfbd6d0ebba8d5a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 6 Jun 2019 17:32:10 +0000 Subject: [PATCH 056/104] fix(package): update env-ci to version 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ec669439..dbd38d7f 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "aggregate-error": "^3.0.0", "cosmiconfig": "^5.0.1", "debug": "^4.0.0", - "env-ci": "^3.0.0", + "env-ci": "^4.0.0", "execa": "^1.0.0", "figures": "^3.0.0", "find-versions": "^3.0.0", From 4ed62139778bebc705cce549c7534fd1ad1c17d3 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 7 Jun 2019 11:28:49 -0400 Subject: [PATCH 057/104] style: fix prettier style --- index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/index.js b/index.js index 2ccd5d78..8e37936f 100644 --- a/index.js +++ b/index.js @@ -46,9 +46,7 @@ async function run(context, plugins) { if (ciBranch !== options.branch) { logger.log( - `This test run was triggered on the branch ${ciBranch}, while semantic-release is configured to only publish from ${ - options.branch - }, therefore a new version won’t be published.` + `This test run was triggered on the branch ${ciBranch}, while semantic-release is configured to only publish from ${options.branch}, therefore a new version won’t be published.` ); return false; } From 52c48be17b0a4eb9e47897a6977544816aef7d9c Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2019 11:36:06 +0000 Subject: [PATCH 058/104] fix(package): update execa to version 2.0.0 --- bin/semantic-release.js | 5 ++-- lib/git.js | 18 ++++++------- package.json | 2 +- test/helpers/git-utils.js | 20 +++++++------- test/integration.test.js | 56 +++++++++++++++++++-------------------- 5 files changed, 51 insertions(+), 50 deletions(-) diff --git a/bin/semantic-release.js b/bin/semantic-release.js index 407475da..12dd2b56 100755 --- a/bin/semantic-release.js +++ b/bin/semantic-release.js @@ -21,9 +21,8 @@ See https://github.com/semantic-release/semantic-release/blob/master/docs/suppor process.exit(1); } -execa - .stdout('git', ['--version']) - .then(stdout => { +execa('git', ['--version']) + .then(({stdout}) => { var gitVersion = findVersions(stdout)[0]; if (semver.lt(gitVersion, MIN_GIT_VERSION)) { console.error(`[semantic-release]: Git version ${MIN_GIT_VERSION} is required. Found ${gitVersion}.`); diff --git a/lib/git.js b/lib/git.js index 9aa65885..28ee556e 100644 --- a/lib/git.js +++ b/lib/git.js @@ -11,7 +11,7 @@ const debug = require('debug')('semantic-release:git'); */ async function getTagHead(tagName, execaOpts) { try { - return await execa.stdout('git', ['rev-list', '-1', tagName], execaOpts); + return (await execa('git', ['rev-list', '-1', tagName], execaOpts)).stdout; } catch (error) { debug(error); } @@ -26,7 +26,7 @@ async function getTagHead(tagName, execaOpts) { * @throws {Error} If the `git` command fails. */ async function getTags(execaOpts) { - return (await execa.stdout('git', ['tag'], execaOpts)) + return (await execa('git', ['tag'], execaOpts)).stdout .split('\n') .map(tag => tag.trim()) .filter(Boolean); @@ -45,7 +45,7 @@ async function isRefInHistory(ref, execaOpts) { await execa('git', ['merge-base', '--is-ancestor', ref, 'HEAD'], execaOpts); return true; } catch (error) { - if (error.code === 1) { + if (error.exitCode === 1) { return false; } @@ -75,8 +75,8 @@ async function fetch(repositoryUrl, execaOpts) { * * @return {String} the sha of the HEAD commit. */ -function getGitHead(execaOpts) { - return execa.stdout('git', ['rev-parse', 'HEAD'], execaOpts); +async function getGitHead(execaOpts) { + return (await execa('git', ['rev-parse', 'HEAD'], execaOpts)).stdout; } /** @@ -88,7 +88,7 @@ function getGitHead(execaOpts) { */ async function repoUrl(execaOpts) { try { - return await execa.stdout('git', ['config', '--get', 'remote.origin.url'], execaOpts); + return (await execa('git', ['config', '--get', 'remote.origin.url'], execaOpts)).stdout; } catch (error) { debug(error); } @@ -103,7 +103,7 @@ async function repoUrl(execaOpts) { */ async function isGitRepo(execaOpts) { try { - return (await execa('git', ['rev-parse', '--git-dir'], execaOpts)).code === 0; + return (await execa('git', ['rev-parse', '--git-dir'], execaOpts)).exitCode === 0; } catch (error) { debug(error); } @@ -161,7 +161,7 @@ async function push(repositoryUrl, execaOpts) { */ async function verifyTagName(tagName, execaOpts) { try { - return (await execa('git', ['check-ref-format', `refs/tags/${tagName}`], execaOpts)).code === 0; + return (await execa('git', ['check-ref-format', `refs/tags/${tagName}`], execaOpts)).exitCode === 0; } catch (error) { debug(error); } @@ -176,7 +176,7 @@ async function verifyTagName(tagName, execaOpts) { * @return {Boolean} `true` is the HEAD of the current local branch is the same as the HEAD of the remote branch, falsy otherwise. */ async function isBranchUpToDate(branch, execaOpts) { - const remoteHead = await execa.stdout('git', ['ls-remote', '--heads', 'origin', branch], execaOpts); + const {stdout: remoteHead} = await execa('git', ['ls-remote', '--heads', 'origin', branch], execaOpts); try { return await isRefInHistory(remoteHead.match(/^(\w+)?/)[1], execaOpts); } catch (error) { diff --git a/package.json b/package.json index dbd38d7f..95ce9420 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "cosmiconfig": "^5.0.1", "debug": "^4.0.0", "env-ci": "^4.0.0", - "execa": "^1.0.0", + "execa": "^2.0.0", "figures": "^3.0.0", "find-versions": "^3.0.0", "get-stream": "^5.0.0", diff --git a/test/helpers/git-utils.js b/test/helpers/git-utils.js index 38b464bc..8d39c161 100644 --- a/test/helpers/git-utils.js +++ b/test/helpers/git-utils.js @@ -69,8 +69,10 @@ export async function initBareRepo(repositoryUrl, branch = 'master') { * @returns {Array} The created commits, in reverse order (to match `git log` order). */ export async function gitCommits(messages, execaOpts) { - await pReduce(messages, (_, message) => - execa.stdout('git', ['commit', '-m', message, '--allow-empty', '--no-gpg-sign'], execaOpts) + await pReduce( + messages, + async (_, message) => + (await execa('git', ['commit', '-m', message, '--allow-empty', '--no-gpg-sign'], execaOpts)).stdout ); return (await gitGetCommits(undefined, execaOpts)).slice(0, messages.length); } @@ -112,8 +114,8 @@ export async function gitCheckout(branch, create = true, execaOpts) { * * @return {String} The sha of the head commit in the current git repository. */ -export function gitHead(execaOpts) { - return execa.stdout('git', ['rev-parse', 'HEAD'], execaOpts); +export async function gitHead(execaOpts) { + return (await execa('git', ['rev-parse', 'HEAD'], execaOpts)).stdout; } /** @@ -181,8 +183,8 @@ export async function gitAddConfig(name, value, execaOpts) { * * @return {String} The sha of the commit associated with `tagName` on the local repository. */ -export function gitTagHead(tagName, execaOpts) { - return execa.stdout('git', ['rev-list', '-1', tagName], execaOpts); +export async function gitTagHead(tagName, execaOpts) { + return (await execa('git', ['rev-list', '-1', tagName], execaOpts)).stdout; } /** @@ -195,7 +197,7 @@ export function gitTagHead(tagName, execaOpts) { * @return {String} The sha of the commit associated with `tagName` on the remote repository. */ export async function gitRemoteTagHead(repositoryUrl, tagName, execaOpts) { - return (await execa.stdout('git', ['ls-remote', '--tags', repositoryUrl, tagName], execaOpts)) + return (await execa('git', ['ls-remote', '--tags', repositoryUrl, tagName], execaOpts)).stdout .split('\n') .filter(tag => Boolean(tag)) .map(tag => tag.match(/^(\S+)/)[1])[0]; @@ -209,8 +211,8 @@ export async function gitRemoteTagHead(repositoryUrl, tagName, execaOpts) { * * @return {String} The tag associatedwith the sha in parameter or `null`. */ -export function gitCommitTag(gitHead, execaOpts) { - return execa.stdout('git', ['describe', '--tags', '--exact-match', gitHead], execaOpts); +export async function gitCommitTag(gitHead, execaOpts) { + return (await execa('git', ['describe', '--tags', '--exact-match', gitHead], execaOpts)).stdout; } /** diff --git a/test/integration.test.js b/test/integration.test.js index e0d8f082..2a0daab8 100644 --- a/test/integration.test.js +++ b/test/integration.test.js @@ -72,9 +72,9 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a chore'); await gitCommits(['chore: Init repository'], {cwd}); t.log('$ semantic-release'); - let {stdout, code} = await execa(cli, [], {env, cwd}); + let {stdout, exitCode} = await execa(cli, [], {env, cwd}); t.regex(stdout, /There are no relevant changes, so no new version is released/); - t.is(code, 0); + t.is(exitCode, 0); /* Initial release */ let version = '1.0.0'; @@ -95,10 +95,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - ({stdout, code} = await execa(cli, [], {env, cwd})); + ({stdout, exitCode} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(code, 0); + t.is(exitCode, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -137,10 +137,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a fix'); await gitCommits(['fix: bar'], {cwd}); t.log('$ semantic-release'); - ({stdout, code} = await execa(cli, [], {env, cwd})); + ({stdout, exitCode} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(code, 0); + t.is(exitCode, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -179,10 +179,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a feature'); await gitCommits(['feat: baz'], {cwd}); t.log('$ semantic-release'); - ({stdout, code} = await execa(cli, [], {env, cwd})); + ({stdout, exitCode} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(code, 0); + t.is(exitCode, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -221,10 +221,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a breaking change'); await gitCommits(['feat: foo\n\n BREAKING CHANGE: bar'], {cwd}); t.log('$ semantic-release'); - ({stdout, code} = await execa(cli, [], {env, cwd})); + ({stdout, exitCode} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(code, 0); + t.is(exitCode, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -258,8 +258,8 @@ test('Exit with 1 if a plugin is not found', async t => { release: {analyzeCommits: 'non-existing-path', success: false, fail: false}, }); - const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); - t.is(code, 1); + const {exitCode, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); + t.is(exitCode, 1); t.regex(stderr, /Cannot find module/); }); @@ -276,8 +276,8 @@ test('Exit with 1 if a shareable config is not found', async t => { release: {extends: 'non-existing-path', success: false, fail: false}, }); - const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); - t.is(code, 1); + const {exitCode, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); + t.is(exitCode, 1); t.regex(stderr, /Cannot find module/); }); @@ -297,8 +297,8 @@ test('Exit with 1 if a shareable config reference a not found plugin', async t = }); await writeJson(path.resolve(cwd, 'shareable.json'), shareable); - const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); - t.is(code, 1); + const {exitCode, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); + t.is(exitCode, 1); t.regex(stderr, /Cannot find module/); }); @@ -327,11 +327,11 @@ test('Dry-run', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release -d'); - const {stdout, code} = await execa(cli, ['-d'], {env, cwd}); + const {stdout, exitCode} = await execa(cli, ['-d'], {env, cwd}); t.regex(stdout, new RegExp(`There is no previous release, the next release version is ${version}`)); t.regex(stdout, new RegExp(`Release note for version ${version}`)); t.regex(stdout, /Initial commit/); - t.is(code, 0); + t.is(exitCode, 0); // Verify package.json and has not been modified t.is((await readJson(path.resolve(cwd, 'package.json'))).version, '0.0.0-dev'); @@ -375,10 +375,10 @@ test('Allow local releases with "noCi" option', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release --no-ci'); - const {stdout, code} = await execa(cli, ['--no-ci'], {env: envNoCi, cwd}); + const {stdout, exitCode} = await execa(cli, ['--no-ci'], {env: envNoCi, cwd}); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(code, 0); + t.is(exitCode, 0); // Verify package.json and has been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -417,7 +417,7 @@ test('Pass options via CLI arguments', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - const {stdout, code} = await execa( + const {stdout, exitCode} = await execa( cli, [ '--verify-conditions', @@ -433,7 +433,7 @@ test('Pass options via CLI arguments', async t => { {env, cwd} ); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(code, 0); + t.is(exitCode, 0); // Verify package.json and has been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -528,14 +528,14 @@ test('Log unexpected errors from plugins and exit with 1', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - const {stderr, code} = await execa(cli, [], {env, cwd, reject: false}); + const {stderr, exitCode} = await execa(cli, [], {env, cwd, reject: false}); // Verify the type and message are logged t.regex(stderr, /Error: a/); // Verify the the stacktrace is logged t.regex(stderr, new RegExp(pluginError)); // Verify the Error properties are logged t.regex(stderr, /errorProperty: 'errorProperty'/); - t.is(code, 1); + t.is(exitCode, 1); }); test('Log errors inheriting SemanticReleaseError and exit with 1', async t => { @@ -555,10 +555,10 @@ test('Log errors inheriting SemanticReleaseError and exit with 1', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - const {stderr, code} = await execa(cli, [], {env, cwd, reject: false}); + const {stderr, exitCode} = await execa(cli, [], {env, cwd, reject: false}); // Verify the type and message are logged t.regex(stderr, /EINHERITED Inherited error/); - t.is(code, 1); + t.is(exitCode, 1); }); test('Exit with 1 if missing permission to push to the remote repository', async t => { @@ -573,14 +573,14 @@ test('Exit with 1 if missing permission to push to the remote repository', async await gitCommits(['feat: Initial commit'], {cwd}); await gitPush('origin', 'master', {cwd}); t.log('$ semantic-release'); - const {stderr, code} = await execa( + const {stderr, exitCode} = await execa( cli, ['--repository-url', 'http://user:wrong_pass@localhost:2080/git/unauthorized.git'], {env: {...env, GH_TOKEN: 'user:wrong_pass'}, cwd, reject: false} ); // Verify the type and message are logged t.regex(stderr, /EGITNOPERMISSION/); - t.is(code, 1); + t.is(exitCode, 1); }); test('Hide sensitive environment variable values from the logs', async t => { From 01a0b2d08a2c93eba3de8c60e9ba1cabcca55b3e Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Tue, 25 Jun 2019 11:17:27 -0400 Subject: [PATCH 059/104] test: use regexp to check missing module message --- test/get-config.test.js | 2 +- test/plugins/normalize.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/get-config.test.js b/test/get-config.test.js index 9ea58ec9..28efa0b6 100644 --- a/test/get-config.test.js +++ b/test/get-config.test.js @@ -482,6 +482,6 @@ test('Throw an Error if one of the shareable config cannot be found', async t => const error = await t.throwsAsync(t.context.getConfig({cwd}), Error); - t.is(error.message, "Cannot find module 'non-existing-path'"); + t.regex(error.message, /Cannot find module 'non-existing-path'/); t.is(error.code, 'MODULE_NOT_FOUND'); }); diff --git a/test/plugins/normalize.test.js b/test/plugins/normalize.test.js index 64dfec8f..97ebbcdd 100644 --- a/test/plugins/normalize.test.js +++ b/test/plugins/normalize.test.js @@ -255,6 +255,6 @@ test('Throws an error if the plugin is not found', t => { Error ); - t.is(error.message, "Cannot find module 'non-existing-path'"); + t.regex(error.message, /Cannot find module 'non-existing-path'/); t.is(error.code, 'MODULE_NOT_FOUND'); }); From 228fed7a0b7cfd19f762eb6f033ed165509db342 Mon Sep 17 00:00:00 2001 From: Rob Cresswell Date: Tue, 25 Jun 2019 23:01:55 +0300 Subject: [PATCH 060/104] docs: document that plugins config is an override (#1216) This patch documents that the `plugin` config option is an override, not a merge with the default. This is significant, for example, if you customise the github plugin as it will then prevent npm publishing by default unless the npm plugin is also defined manually. --- docs/usage/plugins.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/usage/plugins.md b/docs/usage/plugins.md index 43875f3a..f7b82f2a 100644 --- a/docs/usage/plugins.md +++ b/docs/usage/plugins.md @@ -44,6 +44,8 @@ Each plugin must be configured with the [`plugins` options](./configuration.md#p } ``` +**Note:** If the `plugins` option is defined, it overrides the default plugin list, rather than merging with it. + ## Plugin ordering For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed in the order in which the are defined. From 6b3adf6bbe72d5c32335118e91ca32ec043bbc9e Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Wed, 26 Jun 2019 12:11:47 -0400 Subject: [PATCH 061/104] fix: revert to execa `^1.0.0` --- lib/git.js | 6 ++--- package.json | 2 +- test/cli.test.js | 36 +++++++++++++------------- test/integration.test.js | 56 ++++++++++++++++++++-------------------- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/lib/git.js b/lib/git.js index 28ee556e..95a0f7a2 100644 --- a/lib/git.js +++ b/lib/git.js @@ -45,7 +45,7 @@ async function isRefInHistory(ref, execaOpts) { await execa('git', ['merge-base', '--is-ancestor', ref, 'HEAD'], execaOpts); return true; } catch (error) { - if (error.exitCode === 1) { + if (error.code === 1) { return false; } @@ -103,7 +103,7 @@ async function repoUrl(execaOpts) { */ async function isGitRepo(execaOpts) { try { - return (await execa('git', ['rev-parse', '--git-dir'], execaOpts)).exitCode === 0; + return (await execa('git', ['rev-parse', '--git-dir'], execaOpts)).code === 0; } catch (error) { debug(error); } @@ -161,7 +161,7 @@ async function push(repositoryUrl, execaOpts) { */ async function verifyTagName(tagName, execaOpts) { try { - return (await execa('git', ['check-ref-format', `refs/tags/${tagName}`], execaOpts)).exitCode === 0; + return (await execa('git', ['check-ref-format', `refs/tags/${tagName}`], execaOpts)).code === 0; } catch (error) { debug(error); } diff --git a/package.json b/package.json index 95ce9420..dbd38d7f 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "cosmiconfig": "^5.0.1", "debug": "^4.0.0", "env-ci": "^4.0.0", - "execa": "^2.0.0", + "execa": "^1.0.0", "figures": "^3.0.0", "find-versions": "^3.0.0", "get-stream": "^5.0.0", diff --git a/test/cli.test.js b/test/cli.test.js index edc72440..2ef1b128 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -66,7 +66,7 @@ test.serial('Pass options to semantic-release API', async t => { ]; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.is(run.args[0][0].branch, 'master'); t.is(run.args[0][0].repositoryUrl, 'https://github/com/owner/repo.git'); @@ -84,7 +84,7 @@ test.serial('Pass options to semantic-release API', async t => { t.is(run.args[0][0].debug, true); t.is(run.args[0][0].dryRun, true); - t.is(exitCode, 0); + t.is(code, 0); }); test.serial('Pass options to semantic-release API with alias arguments', async t => { @@ -108,7 +108,7 @@ test.serial('Pass options to semantic-release API with alias arguments', async t ]; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.is(run.args[0][0].branch, 'master'); t.is(run.args[0][0].repositoryUrl, 'https://github/com/owner/repo.git'); @@ -117,7 +117,7 @@ test.serial('Pass options to semantic-release API with alias arguments', async t t.deepEqual(run.args[0][0].extends, ['config1', 'config2']); t.is(run.args[0][0].dryRun, true); - t.is(exitCode, 0); + t.is(code, 0); }); test.serial('Pass unknown options to semantic-release API', async t => { @@ -125,13 +125,13 @@ test.serial('Pass unknown options to semantic-release API', async t => { const argv = ['', '', '--bool', '--first-option', 'value1', '--second-option', 'value2', '--second-option', 'value3']; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.is(run.args[0][0].bool, true); t.is(run.args[0][0].firstOption, 'value1'); t.deepEqual(run.args[0][0].secondOption, ['value2', 'value3']); - t.is(exitCode, 0); + t.is(code, 0); }); test.serial('Pass empty Array to semantic-release API for list option set to "false"', async t => { @@ -139,11 +139,11 @@ test.serial('Pass empty Array to semantic-release API for list option set to "fa const argv = ['', '', '--publish', 'false']; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.deepEqual(run.args[0][0].publish, []); - t.is(exitCode, 0); + t.is(code, 0); }); test.serial('Do not set properties in option for which arg is not in command line', async t => { @@ -168,10 +168,10 @@ test.serial('Display help', async t => { const argv = ['', '', '--help']; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.regex(t.context.logs, /Run automated package publishing/); - t.is(exitCode, 0); + t.is(code, 0); }); test.serial('Return error code and prints help if called with a command', async t => { @@ -179,11 +179,11 @@ test.serial('Return error code and prints help if called with a command', async const argv = ['', '', 'pre']; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.regex(t.context.errors, /Run automated package publishing/); t.regex(t.context.errors, /Too many non-option arguments/); - t.is(exitCode, 1); + t.is(code, 1); }); test.serial('Return error code if multiple plugin are set for single plugin', async t => { @@ -191,11 +191,11 @@ test.serial('Return error code if multiple plugin are set for single plugin', as const argv = ['', '', '--analyze-commits', 'analyze1', 'analyze2']; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.regex(t.context.errors, /Run automated package publishing/); t.regex(t.context.errors, /Too many non-option arguments/); - t.is(exitCode, 1); + t.is(code, 1); }); test.serial('Return error code if semantic-release throw error', async t => { @@ -203,10 +203,10 @@ test.serial('Return error code if semantic-release throw error', async t => { const argv = ['', '']; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv}}); - const exitCode = await cli(); + const code = await cli(); t.regex(t.context.errors, /semantic-release error/); - t.is(exitCode, 1); + t.is(code, 1); }); test.serial('Hide sensitive environment variable values from the logs', async t => { @@ -215,8 +215,8 @@ test.serial('Hide sensitive environment variable values from the logs', async t const argv = ['', '']; const cli = requireNoCache('../cli', {'.': run, process: {...process, argv, env: {...process.env, ...env}}}); - const exitCode = await cli(); + const code = await cli(); t.regex(t.context.errors, new RegExp(`Throw error: Exposing token ${escapeRegExp(SECRET_REPLACEMENT)}`)); - t.is(exitCode, 1); + t.is(code, 1); }); diff --git a/test/integration.test.js b/test/integration.test.js index 2a0daab8..e0d8f082 100644 --- a/test/integration.test.js +++ b/test/integration.test.js @@ -72,9 +72,9 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a chore'); await gitCommits(['chore: Init repository'], {cwd}); t.log('$ semantic-release'); - let {stdout, exitCode} = await execa(cli, [], {env, cwd}); + let {stdout, code} = await execa(cli, [], {env, cwd}); t.regex(stdout, /There are no relevant changes, so no new version is released/); - t.is(exitCode, 0); + t.is(code, 0); /* Initial release */ let version = '1.0.0'; @@ -95,10 +95,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - ({stdout, exitCode} = await execa(cli, [], {env, cwd})); + ({stdout, code} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(exitCode, 0); + t.is(code, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -137,10 +137,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a fix'); await gitCommits(['fix: bar'], {cwd}); t.log('$ semantic-release'); - ({stdout, exitCode} = await execa(cli, [], {env, cwd})); + ({stdout, code} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(exitCode, 0); + t.is(code, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -179,10 +179,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a feature'); await gitCommits(['feat: baz'], {cwd}); t.log('$ semantic-release'); - ({stdout, exitCode} = await execa(cli, [], {env, cwd})); + ({stdout, code} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(exitCode, 0); + t.is(code, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -221,10 +221,10 @@ test('Release patch, minor and major versions', async t => { t.log('Commit a breaking change'); await gitCommits(['feat: foo\n\n BREAKING CHANGE: bar'], {cwd}); t.log('$ semantic-release'); - ({stdout, exitCode} = await execa(cli, [], {env, cwd})); + ({stdout, code} = await execa(cli, [], {env, cwd})); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(exitCode, 0); + t.is(code, 0); // Verify package.json and npm-shrinkwrap.json have been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -258,8 +258,8 @@ test('Exit with 1 if a plugin is not found', async t => { release: {analyzeCommits: 'non-existing-path', success: false, fail: false}, }); - const {exitCode, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); - t.is(exitCode, 1); + const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); + t.is(code, 1); t.regex(stderr, /Cannot find module/); }); @@ -276,8 +276,8 @@ test('Exit with 1 if a shareable config is not found', async t => { release: {extends: 'non-existing-path', success: false, fail: false}, }); - const {exitCode, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); - t.is(exitCode, 1); + const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); + t.is(code, 1); t.regex(stderr, /Cannot find module/); }); @@ -297,8 +297,8 @@ test('Exit with 1 if a shareable config reference a not found plugin', async t = }); await writeJson(path.resolve(cwd, 'shareable.json'), shareable); - const {exitCode, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); - t.is(exitCode, 1); + const {code, stderr} = await t.throwsAsync(execa(cli, [], {env, cwd})); + t.is(code, 1); t.regex(stderr, /Cannot find module/); }); @@ -327,11 +327,11 @@ test('Dry-run', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release -d'); - const {stdout, exitCode} = await execa(cli, ['-d'], {env, cwd}); + const {stdout, code} = await execa(cli, ['-d'], {env, cwd}); t.regex(stdout, new RegExp(`There is no previous release, the next release version is ${version}`)); t.regex(stdout, new RegExp(`Release note for version ${version}`)); t.regex(stdout, /Initial commit/); - t.is(exitCode, 0); + t.is(code, 0); // Verify package.json and has not been modified t.is((await readJson(path.resolve(cwd, 'package.json'))).version, '0.0.0-dev'); @@ -375,10 +375,10 @@ test('Allow local releases with "noCi" option', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release --no-ci'); - const {stdout, exitCode} = await execa(cli, ['--no-ci'], {env: envNoCi, cwd}); + const {stdout, code} = await execa(cli, ['--no-ci'], {env: envNoCi, cwd}); t.regex(stdout, new RegExp(`Published GitHub release: release-url/${version}`)); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(exitCode, 0); + t.is(code, 0); // Verify package.json and has been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -417,7 +417,7 @@ test('Pass options via CLI arguments', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - const {stdout, exitCode} = await execa( + const {stdout, code} = await execa( cli, [ '--verify-conditions', @@ -433,7 +433,7 @@ test('Pass options via CLI arguments', async t => { {env, cwd} ); t.regex(stdout, new RegExp(`Publishing version ${version} to npm registry`)); - t.is(exitCode, 0); + t.is(code, 0); // Verify package.json and has been updated t.is((await readJson(path.resolve(cwd, 'package.json'))).version, version); @@ -528,14 +528,14 @@ test('Log unexpected errors from plugins and exit with 1', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - const {stderr, exitCode} = await execa(cli, [], {env, cwd, reject: false}); + const {stderr, code} = await execa(cli, [], {env, cwd, reject: false}); // Verify the type and message are logged t.regex(stderr, /Error: a/); // Verify the the stacktrace is logged t.regex(stderr, new RegExp(pluginError)); // Verify the Error properties are logged t.regex(stderr, /errorProperty: 'errorProperty'/); - t.is(exitCode, 1); + t.is(code, 1); }); test('Log errors inheriting SemanticReleaseError and exit with 1', async t => { @@ -555,10 +555,10 @@ test('Log errors inheriting SemanticReleaseError and exit with 1', async t => { t.log('Commit a feature'); await gitCommits(['feat: Initial commit'], {cwd}); t.log('$ semantic-release'); - const {stderr, exitCode} = await execa(cli, [], {env, cwd, reject: false}); + const {stderr, code} = await execa(cli, [], {env, cwd, reject: false}); // Verify the type and message are logged t.regex(stderr, /EINHERITED Inherited error/); - t.is(exitCode, 1); + t.is(code, 1); }); test('Exit with 1 if missing permission to push to the remote repository', async t => { @@ -573,14 +573,14 @@ test('Exit with 1 if missing permission to push to the remote repository', async await gitCommits(['feat: Initial commit'], {cwd}); await gitPush('origin', 'master', {cwd}); t.log('$ semantic-release'); - const {stderr, exitCode} = await execa( + const {stderr, code} = await execa( cli, ['--repository-url', 'http://user:wrong_pass@localhost:2080/git/unauthorized.git'], {env: {...env, GH_TOKEN: 'user:wrong_pass'}, cwd, reject: false} ); // Verify the type and message are logged t.regex(stderr, /EGITNOPERMISSION/); - t.is(exitCode, 1); + t.is(code, 1); }); test('Hide sensitive environment variable values from the logs', async t => { From 3b8cae91fa8ec0d2d97f7bf02dc0c27b7ac61ab0 Mon Sep 17 00:00:00 2001 From: Debjeet Biswas Date: Wed, 3 Jul 2019 03:37:07 +0530 Subject: [PATCH 062/104] docs: fix typo fix misspelled `they` --- docs/usage/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage/plugins.md b/docs/usage/plugins.md index f7b82f2a..9ef56de5 100644 --- a/docs/usage/plugins.md +++ b/docs/usage/plugins.md @@ -48,7 +48,7 @@ Each plugin must be configured with the [`plugins` options](./configuration.md#p ## Plugin ordering -For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed in the order in which the are defined. +For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed in the order in which they are defined. ```json { From 4b2b2fb780b4623524a42467b0b98ceaa92f303e Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2019 20:35:22 +0000 Subject: [PATCH 063/104] chore(package): update clear-module to version 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dbd38d7f..19742482 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ }, "devDependencies": { "ava": "^2.0.0", - "clear-module": "^3.0.0", + "clear-module": "^4.0.0", "codecov": "^3.0.0", "commitizen": "^3.0.0", "cz-conventional-changelog": "^2.0.0", From 75f08302a934131b6c997fcc7b176203939ce309 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2019 04:14:37 +0000 Subject: [PATCH 064/104] fix(package): update marked to version 0.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19742482..ca3576e5 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "hook-std": "^2.0.0", "hosted-git-info": "^2.7.1", "lodash": "^4.17.4", - "marked": "^0.6.0", + "marked": "^0.7.0", "marked-terminal": "^3.2.0", "p-locate": "^4.0.0", "p-reduce": "^2.0.0", From 6e60c58873658fa383f2e9ba7ae74b34615cdeda Mon Sep 17 00:00:00 2001 From: mehrad-rafigh Date: Mon, 15 Jul 2019 17:23:35 +0200 Subject: [PATCH 065/104] ci(node): set node 8 to node 8.3 and add node 12 --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c3c0da4d..06f50217 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,9 @@ services: - docker node_js: + - 12 - 10 - - 8 + - 8.3 # Trigger a push build on master and greenkeeper branches + PRs build on every branches # Avoid double build on PRs (See https://github.com/travis-ci/travis-ci/issues/1147) From 9e28fd9da90c439d6ac1682f617112e0e275130d Mon Sep 17 00:00:00 2001 From: David Aghassi <3680126+Aghassi@users.noreply.github.com> Date: Tue, 7 May 2019 10:12:39 -0400 Subject: [PATCH 066/104] docs: added plugin developer guide docs --- docs/developer-guide/plugin.md | 107 ++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/docs/developer-guide/plugin.md b/docs/developer-guide/plugin.md index 1fd31e5e..dd9bde40 100644 --- a/docs/developer-guide/plugin.md +++ b/docs/developer-guide/plugin.md @@ -1 +1,106 @@ -# Plugin developer guide +# Plugin Developer Guide + +To create a plugin for `semantic-release`, you need to decide which parts of the release lifecycle are important to that plugin. For example, it is best to always have a `verify` step because you may be receiving inputs from a user and want to make sure they exist. A plugin can abide by any of the following lifecycles: + +- `verify` +- `prepare` +- `publish` +- `success` +- `fail` + +`semantic-release` will require the plugin via `node` and look through the required object for methods named like the lifecyles stated above. For example, if your plugin only had a `verify` and `success` step, the `main` file for your object would need to `export` an object with `verify` and `success` functions. + +In addition to the lifecycle methods, each lifecyle is passed two objects: + +1. `pluginConfig` - an object containing the options that a user may pass in via their `release.config.js` file (or similar) +2. `context` - provided by `semantic-release` for access to things like `env` variables set on the running process. + +For each lifecycle you create, you will want to ensure it can accept `pluginConfig` and `context` as parameters. + +## Creating a Plugin Project + +It is recommended that you generate a new project with `yarn init`. This will provide you with a basic node project to get started with. From there, create an `index.js` file, and make sure it is specified as the `main` in the `package.json`. We will use this file to orchestrate the lifecycle methods later on. + +Next, create a `src` or `lib` folder in the root of the project. This is where we will store our logic and code for how our lifecycle methods work. Finally, create a `test` folder so you can write tests related to your logic. + +We recommend you setup a linting system to ensure good javascript practices are enforced. ESLint is usually the system of choice, and the configuration can be whatever you or your team fancies. + +## Exposing Lifecycle Methods + +In your `index.js` file, you can start by writing the following code + +```javascript +const verifyConditions = require('./src/verify'); + +let verified; + +/** + * Called by semantic-release during the verification step + * @param {*} pluginConfig The semantic-release plugin config + * @param {*} context The context provided by semantic-release + */ +async function verify(pluginConfig, context) { + await verifyConditions(pluginConfig, context); + verified = true; +} + +module.exports = { verify }; +``` + +Then, in your `src` folder, create a file called `verify.js` and add the following + +```javascript +const AggregateError = require('aggregate-error'); + +/** + * A method to verify that the user has given us a slack webhook url to post to + */ +module.exports = async (pluginConfig, context) => { + const { logger } = context; + const errors = []; + + // Throw any errors we accumulated during the validation + if (errors.length > 0) { + throw new AggregateError(errors); + } +}; +``` + +As of right now, this code won't do anything. However, if you were to run this plugin via `semantic-release`, it would run when the `verify` step occurred. + +Following this structure, you can create different steps and checks to run through out the release process. + +## Supporting Options + +Let's say we want to verify that an `option` is passed. An `option` is a configuration object that is specific to your plugin. For example, the user may set an `option` in their release config like: + +```js +{ + prepare: { + path: "@semantic-release/my-special-plugin" + message: "My cool release message" + } +} +``` + +This `message` option will be passed to the `pluginConfig` object mentioned earlier. We can use the validation method we created to verify this option exists so we can perform logic based on that knowledge. In our `verify` file, we can add the following: + +```js +const { message } = pluginConfig; + +if (message.length) { + //... +} +``` + +## Supporting Environment Variables + +Similar to `options`, environment variables exist to allow users to pass tokens and set special URLs. These are set on the `context` object instead of the `pluginConfig` object. Let's say we wanted to check for `GITHUB_TOKEN` in the environment because we want to post to GitHub on the user's behalf. To do this, we can add the following to our `verify` command: + +```js +const { env } = context; + +if (env.GITHUB_TOKEN) { + //... +} +``` \ No newline at end of file From 665a5829303fffbdc989d8d4fb4097ed4484be68 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2019 20:03:49 +0000 Subject: [PATCH 067/104] chore(package): update commitizen to version 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca3576e5..1416d422 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ava": "^2.0.0", "clear-module": "^4.0.0", "codecov": "^3.0.0", - "commitizen": "^3.0.0", + "commitizen": "^4.0.0", "cz-conventional-changelog": "^2.0.0", "delay": "^4.0.0", "dockerode": "^2.5.2", From 490d86d0d522b9e808bccc407e6d1ba1a961977e Mon Sep 17 00:00:00 2001 From: scott willeke Date: Sat, 20 Jul 2019 12:46:53 -0700 Subject: [PATCH 068/104] docs: note publishing on distribution channels in beta Since the readme hints at doing this, note that features to automate this are in beta. Also discussed at https://spectrum.chat/semantic-release/general/im-trying-to-configure-a-next-release~5bb8e692-a0cd-49be-8379-9fb6b25261fe --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2aa1fdc..5f4a9497 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Here is an example of the release type that will be done based on a commit messa For each new commits added to the release branch (i.e. `master`) with `git push` or by merging a pull request or merging from another branch, a CI build is triggered and runs the `semantic-release` command to make a release if there are codebase changes since the last release that affect the package functionalities. If you need more control over the timing of releases you have a couple of options: -- Publish releases on a distribution channel (for example npm’s [dist-tags](https://docs.npmjs.com/cli/dist-tag)). This way you can keep control over what your users end up using by default, and you can decide when to make an automatically released version available to the stable channel, and promote it. +- Publish releases on a distribution channel (for example npm’s [dist-tags](https://docs.npmjs.com/cli/dist-tag)). This way you can keep control over what your users end up using by default, and you can decide when to make an automatically released version available to the stable channel, and promote it. **NOTE**: `16.0.0-beta` of semantic-release, includes new features to automate the release of different branches to different npm distribution tags. The corresponding documentation can be found [on the beta branch of this repo](https://github.com/semantic-release/semantic-release/blob/beta/docs/recipes/distribution-channels.md#publishing-on-distribution-channels). - Develop on a `dev` branch and merge it to the release branch (i.e. `master`) once you are ready to publish. **semantic-release** will run only on pushes to the release branch. ### Release steps From a8f8bffa3747b78bbac1c30f3faaf011750b592f Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 00:06:19 +0200 Subject: [PATCH 069/104] docs(recipes): cleaned doc and navigation Corrected inconsistancies between the sidebar and the actual pages. Remove non existing pages. Clarified status of "Package managers and languages" to "to be completed". --- .gitignore | 2 ++ SUMMARY.md | 7 +++---- docs/recipes/README.md | 10 +--------- docs/recipes/ci-configurations.md | 4 ++++ docs/recipes/git-hosted-services.md | 12 ++++++++++++ docs/recipes/package-managers-and-languages.md | 2 ++ 6 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 docs/recipes/ci-configurations.md create mode 100644 docs/recipes/git-hosted-services.md create mode 100644 docs/recipes/package-managers-and-languages.md diff --git a/.gitignore b/.gitignore index 058ab690..45ad3560 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# Jetbrains IDEs +.idea # Created by https://www.gitignore.io/api/macos,windows,linux,node diff --git a/SUMMARY.md b/SUMMARY.md index a9cfa57d..e7946823 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -12,14 +12,13 @@ - [Shareable configuration](docs/extending/shareable-configurations-list.md) ## Recipes -- [CI configurations](docs/recipes/README.md) +- [CI configurations](docs/recipes/ci-configurations.md) - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) - [Travis CI](docs/recipes/travis.md) - - [Travis CI with build stages](docs/recipes/travis-build-stages.md) - [GitLab CI](docs/recipes/gitlab-ci.md) -- [Git hosted services](docs/recipes/README.md) +- [Git hosted services](docs/recipes/git-hosted-services.md) - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) -- [Package managers and languages](docs/recipes/README.md) +- [Package managers and languages](docs/recipes/package-managers-and-languages.md) ## Developer guide - [JavaScript API](docs/developer-guide/js-api.md) diff --git a/docs/recipes/README.md b/docs/recipes/README.md index d839f0d5..c3b0d84b 100644 --- a/docs/recipes/README.md +++ b/docs/recipes/README.md @@ -1,11 +1,3 @@ -# Recipes - -## CI configurations -- [CircleCI 2.0 workflows](circleci-workflows.md) -- [Travis CI](travis.md) -- [GitLab CI](gitlab-ci.md) - -## Git hosted services +# Git hosted services - [Git authentication with SSH keys](git-auth-ssh-keys.md) -## Package managers and languages diff --git a/docs/recipes/ci-configurations.md b/docs/recipes/ci-configurations.md new file mode 100644 index 00000000..5126288f --- /dev/null +++ b/docs/recipes/ci-configurations.md @@ -0,0 +1,4 @@ +# CI configurations +- [CircleCI 2.0 workflows](circleci-workflows.md) +- [Travis CI](travis.md) +- [GitLab CI](gitlab-ci.md) diff --git a/docs/recipes/git-hosted-services.md b/docs/recipes/git-hosted-services.md new file mode 100644 index 00000000..fd2ad886 --- /dev/null +++ b/docs/recipes/git-hosted-services.md @@ -0,0 +1,12 @@ +# Recipes + +## CI configurations +- [CircleCI 2.0 workflows](circleci-workflows.md) +- [Travis CI](travis.md) +- [GitLab CI](gitlab-ci.md) + +## Git hosted services +- [Git authentication with SSH keys](git-auth-ssh-keys.md) + +## Package managers and languages (to be completed) + diff --git a/docs/recipes/package-managers-and-languages.md b/docs/recipes/package-managers-and-languages.md new file mode 100644 index 00000000..6c0669e8 --- /dev/null +++ b/docs/recipes/package-managers-and-languages.md @@ -0,0 +1,2 @@ +# Package managers and languages (to be completed) + From 3f229786233e87a4e5e8d1d812a23cc7edc98bb2 Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 00:08:06 +0200 Subject: [PATCH 070/104] docs: repared broken links to "CI configuration recipes" --- docs/support/FAQ.md | 6 +++--- docs/support/node-version.md | 2 +- docs/usage/ci-configuration.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/support/FAQ.md b/docs/support/FAQ.md index bb700116..f323443e 100644 --- a/docs/support/FAQ.md +++ b/docs/support/FAQ.md @@ -56,7 +56,7 @@ If your CI environment provides [nvm](https://github.com/creationix/nvm) you can $ nvm install 8 && yarn global add semantic-release && semantic-release ``` -See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. As `semantic-release` is recommended to be executed with [`npx`](https://www.npmjs.com/package/npx) an alternative is required for usage with Yarn. Even though it is possible to install npx with Yarn, it's not recommended. Yarn and npx would be using different cache locations. @@ -75,7 +75,7 @@ To publish a non-Node package (without a `package.json`) you would need to: - Set **semantic-release** [options](../usage/configuration.md#options) via [CLI arguments or rc file](../usage/configuration.md#configuration) - Make sure your CI job executing the `semantic-release` command has access to [Node >= 8](#why-does-semantic-release-require-node-version--83) to execute the `semantic-release` command -See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. In addition you will need to configure the **semantic-release** [plugins](../usage/plugins.md#plugins) to disable the [`@semantic-release/npm`](https://github.com/semantic-release/npm) plugin which is used by default and use a plugin for your project type. @@ -107,7 +107,7 @@ Yes, **semantic-release** can be used with any CI service, as long as it provide - A way to set [authentication](../usage/ci-configuration.md#authentication) via environment variables - A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) -See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. ## Can I run semantic-release on my local machine rather than on a CI server? diff --git a/docs/support/node-version.md b/docs/support/node-version.md index 542af90b..e387685b 100644 --- a/docs/support/node-version.md +++ b/docs/support/node-version.md @@ -12,7 +12,7 @@ See our [Node Support Policy](node-support-policy.md) for our long-term promise The recommended approach is to run the `semantic-release` command from a CI job running on Node 8.3 or higher. This can either be a job used by your project to test on Node >= 8.3 or a dedicated job for the release steps. -See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. +See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/ci-configurations.md) for more details. ## Alternative solutions diff --git a/docs/usage/ci-configuration.md b/docs/usage/ci-configuration.md index ef2c7292..036d287b 100644 --- a/docs/usage/ci-configuration.md +++ b/docs/usage/ci-configuration.md @@ -4,7 +4,7 @@ The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. This can be achieved with [Travis Build Stages](https://docs.travis-ci.com/user/build-stages), [CircleCI Workflows](https://circleci.com/docs/2.0/workflows), [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines), [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs), [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines), [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) or [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). -See [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. +See [CI configuration recipes](../recipes/ci-configurations.md) for more details. ## Authentication @@ -30,4 +30,4 @@ See each plugin's documentation for the environment variables required. The authentication token/credentials have to be made available in the CI service via environment variables. -See [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on how to configure environment variables in your CI service. +See [CI configuration recipes](../recipes/ci-configurations.md) for more details on how to configure environment variables in your CI service. From b08486327d038e7ee285489bd8cb4f073ed72baa Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 00:42:49 +0200 Subject: [PATCH 071/104] docs: cleaned "Developer guide" section navigation --- SUMMARY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index e7946823..684c9e7b 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -22,8 +22,8 @@ ## Developer guide - [JavaScript API](docs/developer-guide/js-api.md) -- [Plugin](docs/developer-guide/plugin.md) -- [Shareable configuration](docs/developer-guide/shareable-configuration.md) +- [Plugin development](docs/developer-guide/plugin.md) +- [Shareable configuration development](docs/developer-guide/shareable-configuration.md) ## Support - [Resources](docs/support/resources.md) From 813e5f65edb1d0b4658c58f029da1116f133028a Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 00:44:20 +0200 Subject: [PATCH 072/104] docs: synched README.md and SUMMARY.md --- README.md | 15 ++++++++++----- SUMMARY.md | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5f4a9497..de9807ec 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ After running the tests, the command `semantic-release` will execute the followi ## Documentation - Usage - - [Getting started](docs/usage/getting-started.md#getting-started) + - [Getting started](docs/usage/getting-started.md) - [Installation](docs/usage/installation.md#installation) - [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) - [Configuration](docs/usage/configuration.md#configuration) @@ -103,12 +103,17 @@ After running the tests, the command `semantic-release` will execute the followi - [Plugins](docs/extending/plugins-list.md) - [Shareable configuration](docs/extending/shareable-configurations-list.md) - Recipes - - [CI configurations](docs/recipes/README.md) - - [Package managers and languages](docs/recipes/README.md) + - [CI configurations](docs/recipes/ci-configurations.md) + - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) + - [Travis CI](docs/recipes/travis.md) + - [GitLab CI](docs/recipes/gitlab-ci.md) + - [Git hosted services](docs/recipes/git-hosted-services.md) + - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) + - [Package managers and languages](docs/recipes/package-managers-and-languages.md) - Developer guide - [JavaScript API](docs/developer-guide/js-api.md) - - [Plugins](docs/developer-guide/plugin.md) - - [Shareable configuration](docs/developer-guide/shareable-configuration.md) + - [Plugin development](docs/developer-guide/plugin.md) + - [Shareable configuration development](docs/developer-guide/shareable-configuration.md) - Support - [Resources](docs/support/resources.md) - [Frequently Asked Questions](docs/support/FAQ.md) diff --git a/SUMMARY.md b/SUMMARY.md index 684c9e7b..c6597ab5 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,6 +1,7 @@ # Summary ## Usage +- [Getting started](docs/usage/getting-started.md) - [Installation](docs/usage/installation.md#installation) - [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) - [Configuration](docs/usage/configuration.md#configuration) From a3da21a54477f8f6c007144e0dd38b800f3caf93 Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 01:34:51 +0200 Subject: [PATCH 073/104] docs(contributing): added instructions on how to run gitbook locally --- CONTRIBUTING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5b560f37..e6cd5de0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,6 +9,7 @@ As a contributor, here are the guidelines we would like you to follow: - [Submitting a Pull Request](#submitting-a-pull-request) - [Coding rules](#coding-rules) - [Working with the code](#working-with-the-code) +- [Working with the doc](#working-with-the-doc) We also recommend that you read [How to Contribute to Open Source](https://opensource.guide/how-to-contribute). @@ -249,3 +250,10 @@ $ npm run test All the [semantic-release](https://github.com/semantic-release) repositories use [Commitizen](https://github.com/commitizen/cz-cli) to help you create [valid commit messages](#commit-message-guidelines). After staging your changes with `git add`, run `npm run cm` to start the interactive commit message CLI. + +## Working with the doc + +Working with the doc is like [working with the code](#working-with-the-code), with the difference that you might find useful to see your changes locally before submitting. + +You can do that by following the instructions on [how to use gitbook locally](https://til.secretgeek.net/gitbook/use_gitbook_locally.html). + From cd00c2dc864e49c066d334fc2971efb024de713a Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 01:58:49 +0200 Subject: [PATCH 074/104] docs(contributing): copy/pasted "Use gitbook locally" instruction from original url --- CONTRIBUTING.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6cd5de0..7c9367a3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -255,5 +255,36 @@ After staging your changes with `git add`, run `npm run cm` to start the interac Working with the doc is like [working with the code](#working-with-the-code), with the difference that you might find useful to see your changes locally before submitting. -You can do that by following the instructions on [how to use gitbook locally](https://til.secretgeek.net/gitbook/use_gitbook_locally.html). +You can do that by following the instructions below (copy/paste-ish from "[Use gitbook locally](https://til.secretgeek.net/gitbook/use_gitbook_locally.html)"): + + +Install `gitbook-cli` globally: +``` +$ npm install --global gitbook-cli +``` + +> **WARNING**: `gitbook-cli` will install the `gitbook` package when it is building the doc. If you have `gitbook` already installed, uninstall it first with a `npm uninstall -g gitbook` before installing `gitbook-cli`. + +Once `gitbook-cli` is installed, from the root of the repo you're working on, you run... +``` +$ gitbook build . +Installing GitBook 3.2.3 # it installs the gitbook package automatically +[..] +``` + +And it will generate a subfolder called `_book` which contains `index.html` and all the other html of the finished book. (You may want to add `_book` to your `.gitignore`) + +You can view that `_book\index.html` file directly in a browser, or serve the content locally from a mini webserver by running: +``` +gitbook serve . +``` + +And then browse the result on the `port` 4000: +``` +http://localhost:4000/ +``` + +You can use a different `port` by using the `--port` argument, e.g. `gitbook serve . --port 4003`. + +You can output as `html`, `pdf`, `epub` or `mobi`. To find out how, use `gitbook help`. From 2d2bb38e61b9853b478c4f96c36b26c551efa2e4 Mon Sep 17 00:00:00 2001 From: Jed Mao Date: Wed, 31 Jul 2019 10:57:19 -0500 Subject: [PATCH 075/104] docs(shareable-configurations-list): add `@jedmao/semantic-release-npm-github-config` (#1222) --- docs/extending/shareable-configurations-list.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/extending/shareable-configurations-list.md b/docs/extending/shareable-configurations-list.md index d115a5d8..8396910a 100644 --- a/docs/extending/shareable-configurations-list.md +++ b/docs/extending/shareable-configurations-list.md @@ -5,3 +5,9 @@ - [@semantic-release/gitlab-config](https://github.com/semantic-release/gitlab-config) - semantic-release shareable configuration for GitLab ## Community configurations +- [@jedmao/semantic-release-npm-github-config](https://github.com/jedmao/semantic-release-npm-github-config) + - Provides an informative [git](https://github.com/semantic-release/git) commit message for the release commit that does not trigger continuous integration and conforms to the [conventional commits specification](https://www.conventionalcommits.org/) (e.g., "chore(release): 1.2.3 [skip ci]\n\nnotes"). + - Creates a tarball that gets uploaded with each [GitHub release](https://github.com/semantic-release/github). + - Publishes the same tarball to [npm](https://github.com/semantic-release/npm). + - Commits the version change in `package.json`. + - Creates or updates a [changelog](https://github.com/semantic-release/changelog) file. From 5a5eaec3da5e3be4a505f6c5e7fa9eb81d202cea Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 18:22:52 +0200 Subject: [PATCH 076/104] docs: made doc file org clearer and augmented content This is a first step to improving the doc: - renamed directories; - augmented a fair bit of content. To be continued --- CONTRIBUTING.md | 6 +- README.md | 76 ++++---- SUMMARY.md | 48 ++--- docs/{usage => 01-usage}/README.md | 0 docs/{usage => 01-usage}/ci-configuration.md | 40 +++- docs/{usage => 01-usage}/configuration.md | 183 ++++++++++++------ docs/01-usage/getting-started.md | 30 +++ docs/01-usage/installation.md | 29 +++ docs/{usage => 01-usage}/plugins.md | 47 ++--- .../shareable-configurations.md | 2 +- docs/{extending => 02-extending}/README.md | 0 .../plugins-list.md | 0 .../shareable-configurations-list.md | 0 docs/{recipes => 03-recipes}/README.md | 0 .../ci-configurations-recipes.md} | 0 .../circleci-workflows.md | 8 +- .../git-auth-ssh-keys.md | 2 +- .../git-hosted-services.md | 0 docs/{recipes => 03-recipes}/gitlab-ci.md | 8 +- .../package-managers-and-languages.md | 0 docs/{recipes => 03-recipes}/travis.md | 12 +- .../README.md | 0 .../js-api.md | 6 +- .../plugin.md | 0 .../shareable-configuration.md | 0 docs/{support => 05-support}/FAQ.md | 38 ++-- docs/{support => 05-support}/README.md | 0 .../node-support-policy.md | 0 docs/{support => 05-support}/node-version.md | 2 +- docs/{support => 05-support}/resources.md | 0 .../troubleshooting.md | 0 docs/README.md | 10 +- docs/usage/getting-started.md | 22 --- docs/usage/installation.md | 29 --- 34 files changed, 348 insertions(+), 250 deletions(-) rename docs/{usage => 01-usage}/README.md (100%) rename docs/{usage => 01-usage}/ci-configuration.md (52%) rename docs/{usage => 01-usage}/configuration.md (51%) create mode 100644 docs/01-usage/getting-started.md create mode 100644 docs/01-usage/installation.md rename docs/{usage => 01-usage}/plugins.md (70%) rename docs/{usage => 01-usage}/shareable-configurations.md (78%) rename docs/{extending => 02-extending}/README.md (100%) rename docs/{extending => 02-extending}/plugins-list.md (100%) rename docs/{extending => 02-extending}/shareable-configurations-list.md (100%) rename docs/{recipes => 03-recipes}/README.md (100%) rename docs/{recipes/ci-configurations.md => 03-recipes/ci-configurations-recipes.md} (100%) rename docs/{recipes => 03-recipes}/circleci-workflows.md (75%) rename docs/{recipes => 03-recipes}/git-auth-ssh-keys.md (93%) rename docs/{recipes => 03-recipes}/git-hosted-services.md (100%) rename docs/{recipes => 03-recipes}/gitlab-ci.md (68%) rename docs/{recipes => 03-recipes}/package-managers-and-languages.md (100%) rename docs/{recipes => 03-recipes}/travis.md (81%) rename docs/{developer-guide => 04-developer-guide}/README.md (100%) rename docs/{developer-guide => 04-developer-guide}/js-api.md (96%) rename docs/{developer-guide => 04-developer-guide}/plugin.md (100%) rename docs/{developer-guide => 04-developer-guide}/shareable-configuration.md (100%) rename docs/{support => 05-support}/FAQ.md (84%) rename docs/{support => 05-support}/README.md (100%) rename docs/{support => 05-support}/node-support-policy.md (100%) rename docs/{support => 05-support}/node-version.md (91%) rename docs/{support => 05-support}/resources.md (100%) rename docs/{support => 05-support}/troubleshooting.md (100%) delete mode 100644 docs/usage/getting-started.md delete mode 100644 docs/usage/installation.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7c9367a3..e075f621 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ Help us keep **semantic-release** open and inclusive. Please read and follow our ### Improve documentation -As a **semantic-release** user, you are the perfect candidate to help us improve our documentation: typo corrections, clarifications, more examples, new [recipes](docs/recipes/README.md), etc. Take a look at the [documentation issues that need help](https://github.com/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+user%3Asemantic-release+archived%3Afalse+label%3A%22help+wanted%22+label%3Adocs+). +As a **semantic-release** user, you are the perfect candidate to help us improve our documentation: typo corrections, clarifications, more examples, new [recipes](docs/03-recipes/README.md), etc. Take a look at the [documentation issues that need help](https://github.com/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+user%3Asemantic-release+archived%3Afalse+label%3A%22help+wanted%22+label%3Adocs+). Please follow the [Documentation guidelines](#documentation). @@ -37,7 +37,7 @@ Confirmed bugs and ready-to-implement features are marked with the [help wanted ## Using the issue tracker -The issue tracker is the channel for [bug reports](#bug-report), [features requests](#feature-request) and [submitting pull requests](#submitting-a-pull-request) only. Please use the [Support](docs/support/README.md) and [Get help](README.md#get-help) sections for support, troubleshooting and questions. +The issue tracker is the channel for [bug reports](#bug-report), [features requests](#feature-request) and [submitting pull requests](#submitting-a-pull-request) only. Please use the [Support](docs/05-support/README.md) and [Get help](README.md#get-help) sections for support, troubleshooting and questions. Before opening an issue or a Pull Request, please use the [GitHub issue search](https://github.com/issues?utf8=%E2%9C%93&q=user%3Asemantic-release) to make sure the bug or feature request hasn't been already reported or fixed. @@ -51,7 +51,7 @@ Feature requests are welcome, but take a moment to find out whether your idea fi ### New plugin request -[Plugins](docs/usage/plugins.md) are a great way to extend **semantic-release** capabilities, integrate with other systems and support new project type. Please provide as much detail and context as possible and fill the information requested in the [New plugin request template](https://github.com/semantic-release/semantic-release/issues/new?template=plugin-request.md). +[Plugins](docs/01-usage/plugins.md) are a great way to extend **semantic-release** capabilities, integrate with other systems and support new project type. Please provide as much detail and context as possible and fill the information requested in the [New plugin request template](https://github.com/semantic-release/semantic-release/issues/new?template=plugin-request.md). ## Submitting a Pull Request diff --git a/README.md b/README.md index de9807ec..aeccdf91 100644 --- a/README.md +++ b/README.md @@ -39,10 +39,10 @@ This removes the immediate connection between human emotions and version numbers - New features and fixes are immediately available to users - Notify maintainers and users of new releases - Use formalized commit message convention to document changes in the codebase -- Integrate with your [continuous integration workflow](docs/recipes/README.md#ci-configurations) +- Integrate with your [continuous integration workflow](docs/03-recipes/README.md#ci-configurations) - Avoid potential errors associated with manual releases -- Support any [package managers and languages](docs/recipes/README.md#package-managers-and-languages) via [plugins](docs/usage/plugins.md) -- Simple and reusable configuration via [shareable configurations](docs/usage/shareable-configurations.md) +- Support any [package managers and languages](docs/03-recipes/README.md#package-managers-and-languages) via [plugins](docs/01-usage/plugins.md) +- Simple and reusable configuration via [shareable configurations](docs/01-usage/shareable-configurations.md) ## How does it work? @@ -50,7 +50,7 @@ This removes the immediate connection between human emotions and version numbers **semantic-release** uses the commit messages to determine the type of changes in the codebase. Following formalized conventions for commit messages, **semantic-release** automatically determines the next [semantic version](https://semver.org) number, generates a changelog and publishes the release. -By default **semantic-release** uses [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). The commit message format can be changed with the [`preset` or `config` options](docs/usage/configuration.md#options) of the [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer#options) and [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator#options) plugins. +By default **semantic-release** uses [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). The commit message format can be changed with the [`preset` or `config` options](docs/01-usage/configuration.md#options) of the [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer#options) and [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator#options) plugins. Tools such as [commitizen](https://github.com/commitizen/cz-cli), [commitlint](https://github.com/conventional-changelog/commitlint) or [semantic-git-commit-cli](https://github.com/JPeer264/node-semantic-git-commit-cli) can be used to help contributors and enforce valid commit messages. @@ -78,48 +78,48 @@ If you need more control over the timing of releases you have a couple of option After running the tests, the command `semantic-release` will execute the following steps: -| Step | Description | -|-------------------|---------------------------------------------------------------------------------------------------------------------------------| -| Verify Conditions | Verify all the conditions to proceed with the release. | -| Get last release | Obtain the commit corresponding to the last release by analyzing [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging). | -| Analyze commits | Determine the type of release based on the commits added since the last release. | -| Verify release | Verify the release conformity. | -| Generate notes | Generate release notes for the commits added since the last release. | -| Create Git tag | Create a Git tag corresponding to the new release version. | -| Prepare | Prepare the release. | -| Publish | Publish the release. | -| Notify | Notify of new releases or errors. | +| Step | Step Hook | Description | +|-------------------|----------------------|---------------------------------------------------------------------------------------------------------------------------------| +| Verify Conditions | `verifyConditions` | Verify all the conditions to proceed with the release. | +| Get last release | N/A | Obtain the commit corresponding to the last release by analyzing [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging). | +| Analyze commits | N/A | Determine the type of release based on the commits added since the last release. | +| Verify release | `verifyRelease` | Verify the release conformity. | +| Generate notes | `generateNotes` | Generate release notes for the commits added since the last release. | +| Create Git tag | N/A | Create a Git tag corresponding to the new release version. | +| Prepare | `prepare` | Prepare the release. | +| Publish | `publish` | Publish the release. | +| Notify | `success`, `failure` | Notify of new releases or errors. | ## Documentation - Usage - - [Getting started](docs/usage/getting-started.md) - - [Installation](docs/usage/installation.md#installation) - - [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) - - [Configuration](docs/usage/configuration.md#configuration) - - [Plugins](docs/usage/plugins.md) - - [Shareable configurations](docs/usage/shareable-configurations.md) + - [Getting started](docs/01-usage/01-getting-started.md) + - [Installation](docs/01-usage/installation.md#installation) + - [CI Configuration](docs/01-usage/ci-configuration.md#ci-configuration) + - [Configuration](docs/01-usage/configuration.md#configuration) + - [Plugins](docs/01-usage/plugins.md) + - [Shareable configurations](docs/01-usage/shareable-configurations.md) - Extending - - [Plugins](docs/extending/plugins-list.md) - - [Shareable configuration](docs/extending/shareable-configurations-list.md) + - [Plugins](docs/02-extending/plugins-list.md) + - [Shareable configuration](docs/02-extending/shareable-configurations-list.md) - Recipes - - [CI configurations](docs/recipes/ci-configurations.md) - - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) - - [Travis CI](docs/recipes/travis.md) - - [GitLab CI](docs/recipes/gitlab-ci.md) - - [Git hosted services](docs/recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) - - [Package managers and languages](docs/recipes/package-managers-and-languages.md) + - [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) + - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) + - [Travis CI](docs/03-recipes/travis.md) + - [GitLab CI](docs/03-recipes/gitlab-ci.md) + - [Git hosted services](docs/03-recipes/git-hosted-services.md) + - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) + - [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) - Developer guide - - [JavaScript API](docs/developer-guide/js-api.md) - - [Plugin development](docs/developer-guide/plugin.md) - - [Shareable configuration development](docs/developer-guide/shareable-configuration.md) + - [JavaScript API](docs/04-developer-guide/js-api.md) + - [Plugin development](docs/04-developer-guide/plugin.md) + - [Shareable configuration development](docs/04-developer-guide/shareable-configuration.md) - Support - - [Resources](docs/support/resources.md) - - [Frequently Asked Questions](docs/support/FAQ.md) - - [Troubleshooting](docs/support/troubleshooting.md) - - [Node version requirement](docs/support/node-version.md) - - [Node Support Policy](docs/support/node-support-policy.md) + - [Resources](docs/05-support/resources.md) + - [Frequently Asked Questions](docs/05-support/FAQ.md) + - [Troubleshooting](docs/05-support/troubleshooting.md) + - [Node version requirement](docs/05-support/node-version.md) + - [Node Support Policy](docs/05-support/node-support-policy.md) ## Get help diff --git a/SUMMARY.md b/SUMMARY.md index c6597ab5..74e4089e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,34 +1,34 @@ # Summary ## Usage -- [Getting started](docs/usage/getting-started.md) -- [Installation](docs/usage/installation.md#installation) -- [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) -- [Configuration](docs/usage/configuration.md#configuration) -- [Plugins](docs/usage/plugins.md) -- [Shareable configurations](docs/usage/shareable-configurations.md) +- [Getting started](docs/01-usage/getting-started.md) +- [Installation](docs/01-usage/installation.md#installation) +- [CI Configuration](docs/01-usage/ci-configuration.md#ci-configuration) +- [Configuration](docs/01-usage/configuration.md#configuration) +- [Plugins](docs/01-usage/plugins.md) +- [Shareable configurations](docs/01-usage/shareable-configurations.md) -## Extending -- [Plugins](docs/extending/plugins-list.md) -- [Shareable configuration](docs/extending/shareable-configurations-list.md) +## Extensions +- [Plugins](docs/02-extending/plugins-list.md) +- [Shareable configuration](docs/02-extending/shareable-configurations-list.md) ## Recipes -- [CI configurations](docs/recipes/ci-configurations.md) - - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) - - [Travis CI](docs/recipes/travis.md) - - [GitLab CI](docs/recipes/gitlab-ci.md) -- [Git hosted services](docs/recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) -- [Package managers and languages](docs/recipes/package-managers-and-languages.md) +- [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) + - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) + - [Travis CI](docs/03-recipes/travis.md) + - [GitLab CI](docs/03-recipes/gitlab-ci.md) +- [Git hosted services](docs/03-recipes/git-hosted-services.md) + - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) +- [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) ## Developer guide -- [JavaScript API](docs/developer-guide/js-api.md) -- [Plugin development](docs/developer-guide/plugin.md) -- [Shareable configuration development](docs/developer-guide/shareable-configuration.md) +- [JavaScript API](docs/04-developer-guide/js-api.md) +- [Plugin development](docs/04-developer-guide/plugin.md) +- [Shareable configuration development](docs/04-developer-guide/shareable-configuration.md) ## Support -- [Resources](docs/support/resources.md) -- [Frequently Asked Questions](docs/support/FAQ.md) -- [Troubleshooting](docs/support/troubleshooting.md) -- [Node version requirement](docs/support/node-version.md) -- [Node Support Policy](docs/support/node-support-policy.md) +- [Resources](docs/05-support/resources.md) +- [Frequently Asked Questions](docs/05-support/FAQ.md) +- [Troubleshooting](docs/05-support/troubleshooting.md) +- [Node version requirement](docs/05-support/node-version.md) +- [Node Support Policy](docs/05-support/node-support-policy.md) diff --git a/docs/usage/README.md b/docs/01-usage/README.md similarity index 100% rename from docs/usage/README.md rename to docs/01-usage/README.md diff --git a/docs/usage/ci-configuration.md b/docs/01-usage/ci-configuration.md similarity index 52% rename from docs/usage/ci-configuration.md rename to docs/01-usage/ci-configuration.md index 036d287b..da872f5f 100644 --- a/docs/usage/ci-configuration.md +++ b/docs/01-usage/ci-configuration.md @@ -1,14 +1,29 @@ # CI configuration -## Run `semantic-release` only after all tests succeeded +## Running `semantic-release` -The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. This can be achieved with [Travis Build Stages](https://docs.travis-ci.com/user/build-stages), [CircleCI Workflows](https://circleci.com/docs/2.0/workflows), [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines), [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs), [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines), [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) or [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). +The `semantic-release` command will only run fully in a CI environment. If it does not detect that it is in a CI environment, it will automatically run in `dry-run` mode. + +Within a CI environment, the `semantic-release` command must be executed only after all the tests in the CI build pass, otherwise it will release potentially faulty code. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. -See [CI configuration recipes](../recipes/ci-configurations.md) for more details. +Follow the CI system's documentation to find out how to do this: +- [Travis Build Stages](https://docs.travis-ci.com/user/build-stages) +- [CircleCI Workflows](https://circleci.com/docs/2.0/workflows) +- [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines) +- [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs) +- [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines) +- [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) +- [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). + +This documentation provides a few [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details. ## Authentication -**semantic-release** requires push access to the project Git repository in order to create [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging). The Git authentication can be set with one of the following environment variables: +### Push access to remote repos + +**semantic-release** requires push access to remote Git repositories in order to push the [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) it created. + +The Git authentication can be set with one of the following environment variables: | Variable | Description | |---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -17,17 +32,22 @@ See [CI configuration recipes](../recipes/ci-configurations.md) for more details | `BB_TOKEN` or `BITBUCKET_TOKEN` | A Bitbucket [personal access token](https://confluence.atlassian.com/bitbucketserver/personal-access-tokens-939515499.html). | | `GIT_CREDENTIALS` | [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding) Git username and password in the format `:`. The username and password must each be individually URL encoded, not the `:` separating them. | -Alternatively the Git authentication can be set up via [SSH keys](../recipes/git-auth-ssh-keys.md). +Alternatively the Git authentication **can be set up via [SSH keys](../03-recipes/git-auth-ssh-keys.md)**. -Most **semantic-release** [plugins](plugins.md) require setting up authentication in order to publish to a package manager registry. The default [@semantic-release/npm](https://github.com/semantic-release/npm#environment-variables) and [@semantic-release/github](https://github.com/semantic-release/github#environment-variables) plugins require the following environment variables: +### Authentication needs for plugins + +Most **semantic-release** [plugins](plugins.md) require setting up authentication in order to publish to a package manager registry. See each plugin's documentation for the environment variables required. + +It is to note, however, that: +- The default [@semantic-release/github](https://github.com/semantic-release/github#environment-variables) plugin requires the same `GH_TOKEN` environment variable as above +- The default [@semantic-release/npm](https://github.com/semantic-release/npm#environment-variables) plugin requires the following environment variables: | Variable | Description | |-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `NPM_TOKEN` | npm token created via [npm token create](https://docs.npmjs.com/getting-started/working_with_tokens#how-to-create-new-tokens).
**Note**: Only the `auth-only` [level of npm two-factor authentication](https://docs.npmjs.com/getting-started/using-two-factor-authentication#levels-of-authentication) is supported. | -| `GH_TOKEN` | GitHub authentication token.
**Note**: Only the [personal token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line) authentication is supported. | See each plugin's documentation for the environment variables required. -The authentication token/credentials have to be made available in the CI service via environment variables. - -See [CI configuration recipes](../recipes/ci-configurations.md) for more details on how to configure environment variables in your CI service. +> **Note**: The authentication token/credentials have to be made available in the CI service via environment variables. +> +> See [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on how to configure environment variables in your CI service. diff --git a/docs/usage/configuration.md b/docs/01-usage/configuration.md similarity index 51% rename from docs/usage/configuration.md rename to docs/01-usage/configuration.md index 8a6da186..23c380d0 100644 --- a/docs/usage/configuration.md +++ b/docs/01-usage/configuration.md @@ -1,73 +1,93 @@ # Configuration **semantic-release** configuration consists of: -- Git repository options ([URL](#repositoryurl), [release branch](#branch) and [tag format](#tagformat)) -- [plugins](#plugins) definition -- run mode ([debug](#debug), [dry run](#dryrun) and [local (no CI)](#ci)) +- Git repository [url](#repositoryurl) and options ([release branch](#branch) and [tag format](#tagformat)). ([Access credentials](ci-configuration.md) are setup through environment variables) +- Plugins [declaration](#plugins) and [options](plugins.md). +- Run mode ([`--dry-run`](#dryrun), [`--no-ci`](#ci) (local), [`--debug`](#debug)). -All of these options can be configured directly or by extending a [shareable configuration](shareable-configurations.md). +All of these options can be configured: +- In a config file. +- Through the cli. +- By extending a [shareable configuration](shareable-configurations.md). Additionally, metadata of Git tags generated by **semantic-release** can be customized via standard [Git environment variables](#git-environment-variables). -## Configuration file +## Configuring/passing options to `semantic-release` -**semantic-release**’s [options](#options), mode and [plugins](plugins.md) can be set via: -- A `.releaserc` file, written in YAML or JSON, with optional extensions: .`yaml`/`.yml`/`.json`/`.js` -- A `release.config.js` file that exports an object -- A `release` key in the project's `package.json` file +### Configuration file -Alternatively, some options can be set via CLI arguments. +> **Note**: CLI arguments take precedence over options configured in the configuration file and shareable configuration. -The following three examples are the same. +**semantic-release**’s options, mode and plugins can be set via a config file in different ways: +- A `.releaserc` file, written in YAML or JSON, with optional extensions `.yaml`, `.yml`, `.json` or `.js`. +- A `release.config.js` file that exports an object. +- A `release` key in the project's `package.json` file. -Via `release` key in the project's `package.json` file: +The following two examples are the same: +- Via `.releaserc` or `release.config.js` file: + ```json + { + "branch": "next" + } + ``` +- Via `release` key in the project's `package.json` file (the configuration must be under the `release` property): + ```json + { + "release": { + "branch": "next" + } + } + ``` -```json -{ - "release": { - "branch": "next" - } -} -``` -```bash -$ semantic-release -``` +### Using CLI arguments -Via `.releaserc` file: +> **Note**: CLI arguments take precedence over options configured in the configuration file and shareable configuration. -```json -{ - "branch": "next" -} -``` -```bash -$ semantic-release -``` +Plugin options cannot be defined via CLI arguments and must be defined in the configuration file. -Via CLI argument: +The following configuration example via CLI argument is equivalent to the configuration file's example: ```bash $ semantic-release --branch next ``` -**Note**: CLI arguments take precedence over options configured in the configuration file. +### Extending a shareable configuration -**Note**: Plugin options cannot be defined via CLI arguments and must be defined in the configuration file. +> **Note**: CLI arguments take precedence over options configured in the configuration file and shareable configuration. -**Note**: When configuring via `package.json`, the configuration must be under the `release` property. However, when using a `.releaserc` or a `release.config.js` file, the configuration must be set without a `release` property. +Please see [shareable configuration](shareable-configurations.md) for more details. ## Options -### extends +### `extends` Type: `Array`, `String`
CLI arguments: `-e`, `--extends` -List of modules or file paths containing a [shareable configuration](shareable-configurations.md). If multiple shareable configurations are set, they will be imported in the order defined with each configuration option taking precedence over the options defined in a previous shareable configuration. +Contains a list of: +- Modules. +- File paths containing a [shareable configuration](shareable-configurations.md). -**Note**: Options defined via CLI arguments or in the configuration file will take precedence over the ones defined in any shareable configuration. +> **Note**: If multiple shareable configurations are set, they will be imported **in the order defined with each configuration option** taking precedence over the options defined in a previous shareable configuration. -### branch +Examples (`.releaserc` file content): +- `Array`: + ```json + { + "extends": [ + "./my_config_dir/my.config", + "@semantic-release/gitlab-config", + ] + } + ``` +- `String`: + ```json + { + "extends": "@semantic-release/gitlab-config" + } + ``` + +### `branch` Type: `String`
Default: `master`
@@ -75,7 +95,14 @@ CLI arguments: `-b`, `--branch` The branch on which releases should happen. -### repositoryUrl +Example (`.releaserc` file content): +```json +{ + "branch": "next" +} +``` + +### `repositoryUrl` Type: `String`
Default: `repository` property in `package.json` or [git origin url](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
@@ -85,7 +112,14 @@ The git repository URL. Any valid git url format is supported (See [Git protocols](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols)). -### tagFormat +Example (`.releaserc` file content): +```json +{ + "repositoryUrl": "https://github.com/username/project.git" +} +``` + +### `tagFormat` Type: `String`
Default: `v${version}`
@@ -93,21 +127,41 @@ CLI arguments: `-t`, `--tag-format` The [Git tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging) format used by **semantic-release** to identify releases. The tag name is generated with [Lodash template](https://lodash.com/docs#template) and will be compiled with the `version` variable. -**Note**: The `tagFormat` must contain the `version` variable exactly once and compile to a [valid Git reference](https://git-scm.com/docs/git-check-ref-format#_description). +> **Note**: The `tagFormat` must contain the `version` variable exactly once and compile to a [valid Git reference](https://git-scm.com/docs/git-check-ref-format#_description). -### plugins +Example (`.releaserc` file content): +```json +{ + "tagFormat": "version-${version}" +} +``` + +### `plugins` Type: `Array`
Default: `['@semantic-release/commit-analyzer', '@semantic-release/release-notes-generator', '@semantic-release/npm', '@semantic-release/github']`
CLI arguments: `-p`, `--plugins` -Define the list of plugins to use. Plugins will run in series, in the order defined, for each [steps](../../README.md#release-steps) if they implement it. +Define the list of plugins to use. Plugins will run in series, **in the order defined**, for **each [steps](../../README.md#release-steps)** if they implement it. -Plugins configuration can defined by wrapping the name and an options object in an array. +Plugin specific configuration can defined by wrapping the name and an options object in an array. See [Plugins configuration options](plugins.md#plugins-configuration-options) for more details. -See [Plugins configuration](plugins.md#plugins) for more details. - -### dryRun +Example (`.releaserc` file content): +```json +{ + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release-docker", + ["@semantic-release/exec", { + "verifyConditionsCmd": "./verify.sh" # plugin configuration + }], + "@semantic-release/git", + "@semantic-release/gitlab", + ] +} +``` +### `dryRun` Type: `Boolean`
Default: `false` if running in a CI environment, `true` otherwise
@@ -115,7 +169,14 @@ CLI arguments: `-d`, `--dry-run` Dry-run mode, skip publishing, print next version and release notes. -### ci +Example (`.releaserc` file content): +```json +{ + "dryRun": "true" +} +``` + +### `ci` Type: `Boolean`
Default: `true`
@@ -123,9 +184,16 @@ CLI arguments: `--ci` / `--no-ci` Set to `false` to skip Continuous Integration environment verifications. This allows for making releases from a local machine. -**Note**: The CLI arguments `--no-ci` is equivalent to `--ci false`. +> **Note**: The CLI arguments `--no-ci` is equivalent to `--ci false`. -### debug +Example (`.releaserc` file content): +```json +{ + "ci": "false" +} +``` + +### `debug` (only through CLI) Type: `Boolean`
Default: `false`
@@ -133,7 +201,12 @@ CLI argument: `--debug` Output debugging information. This can also be enabled by setting the `DEBUG` environment variable to `semantic-release:*`. -**Note**: The `debug` is used only supported via CLI argument. To enable debug mode from the [JS API](../developer-guide/js-api.md#javascript-api) use `require('debug').enable('semantic-release:*')`. +> **Note**: The `debug` is used only supported via CLI argument. To enable debug mode from the [JS API](../04-developer-guide/js-api.md#javascript-api) use `require('debug').enable('semantic-release:*')`. + +Example: +```bash +$ semantic-release --debug +``` ## Git environment variables @@ -144,9 +217,11 @@ Output debugging information. This can also be enabled by setting the `DEBUG` en | `GIT_COMMITTER_NAME` | The committer name associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot. | | `GIT_COMMITTER_EMAIL` | The committer email associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot email address. | -## Existing version tags +## Existing version tags, and how semantic-release deals with them -**semantic-release** uses [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) to determine the commits added since the last release. If a release has been published before setting up **semantic-release** you must make sure the most recent commit included in the last published release is in the [release branch](#branch) history and is tagged with the version released, formatted according to the [tag format](#tagformat) configured (defaults to `vx.y.z`). +**semantic-release** uses [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) to determine the commits added since the last release. + +If a release has been published before setting up **semantic-release** you must make sure the most recent commit included in the last published release is in the [release branch](#branch) history and is tagged with the version released, formatted according to the [tag format](#tagformat) configured (defaults to `vx.y.z`). If the previous releases were published with [`npm publish`](https://docs.npmjs.com/cli/publish) this should already be the case. diff --git a/docs/01-usage/getting-started.md b/docs/01-usage/getting-started.md new file mode 100644 index 00000000..ddea6bde --- /dev/null +++ b/docs/01-usage/getting-started.md @@ -0,0 +1,30 @@ +# Getting started + +## Manual setup + +You can use **semantic-release** with the following manual setup steps: +1. [Install **semantic-release**](installation.md) either locally for your project or globally +1. Configure: + 1. Your Continuous Integration service to [run **semantic-release**](ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) + 1. Your Git repository and package manager repository [authentication](ci-configuration.md#authentication) in your Continuous Integration service + 1. **semantic-release**'s [options and plugins](configuration.md) + +## Guided setup through `semantic-release-cli` +Alternatively you can be guided through those setup steps thanks to the [interactive CLI `semantic-release-cli`](https://github.com/semantic-release/cli). + +First install `semantic-release-cli`: +```bash +$ npm install -g semantic-release-cli +``` + +Then go to your project's directory and run the command: +```bash +$ cd your-module +$ semantic-release-cli setup +``` +The output looks something like this: +![dialogue](../../media/semantic-release-cli.png) + +Available options and other information can be found on [`semantic-release-cli`'s doc](https://github.com/semantic-release/cli#semantic-release-cli). + +> **Note**: only a limited number of options, CI services and plugins are currently supported by `semantic-release-cli`. diff --git a/docs/01-usage/installation.md b/docs/01-usage/installation.md new file mode 100644 index 00000000..64c27260 --- /dev/null +++ b/docs/01-usage/installation.md @@ -0,0 +1,29 @@ +# Installation + +## Local installation + +For [Node modules projects](https://docs.npmjs.com/getting-started/creating-node-modules) we recommend installing **semantic-release** locally and running the `semantic-release` command with [npx](https://www.npmjs.com/package/npx): + +```bash +$ npm install --save-dev semantic-release +``` + +Then in the CI environment: + +```bash +$ npx semantic-release +``` + +> **Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently find the semantic-release binary and to execute it. See [What is npx](../05-support/FAQ.md#what-is-npx) for more details. + +## Global installation + +For other type of projects we recommend installing **semantic-release** directly in the CI environment, also with [npx](https://www.npmjs.com/package/npx): + +```bash +$ npx semantic-release +``` + +> **Note:** For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`, or `npm install -g semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. + +> **Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../05-support/FAQ.md#what-is-npx) for more details. diff --git a/docs/usage/plugins.md b/docs/01-usage/plugins.md similarity index 70% rename from docs/usage/plugins.md rename to docs/01-usage/plugins.md index 9ef56de5..8f329e46 100644 --- a/docs/usage/plugins.md +++ b/docs/01-usage/plugins.md @@ -1,13 +1,15 @@ # Plugins -Each [release step](../../README.md#release-steps) is implemented by configurable plugins. This allows for support of different [commit message formats](../../README.md#commit-message-format), release note generators and publishing platforms. +## Plugins implement actions for release steps -A plugin is a npm module that can implement one or more of the following steps: +Actions that should be performed for each [release step](../../README.md#release-steps) are implemented through configurable plugins, and [a number of them are installed by default](#plugins-installed-by-default). This allows for support of different [commit message formats](../../README.md#commit-message-format), release note generators and publishing platforms. -| Step | Required | Description | +A plugin is a npm module (for instance `@semantic-release/github` or `semantic-release-docker`) that can implement one or more of the following steps through their step hooks: + +| Step hook | Required | Description | |--------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `verifyConditions` | No | Responsible for verifying conditions necessary to proceed with the release: configuration is correct, authentication token are valid, etc... | -| `analyzeCommits` | Yes | Responsible for determining the type of the next release (`major`, `minor` or `patch`). If multiple plugins with a `analyzeCommits` step are defined, the release type will be the highest one among plugins output. | +| `analyzeCommits` | Yes | Responsible for determining the type of the next release (`major`, `minor` or `patch`). If multiple plugins with a `analyzeCommits` step are defined, the release type will be the highest one among plugins output.
**Note**: If no plugin with an `analyzeCommits` step is defined, then `@semantic-release/commit-analyzer` will be used.| | `verifyRelease` | No | Responsible for verifying the parameters (version, type, dist-tag etc...) of the release that is about to be published. | | `generateNotes` | No | Responsible for generating the content of the release note. If multiple plugins with a `generateNotes` step are defined, the release notes will be the result of the concatenation of each plugin output. | | `prepare` | No | Responsible for preparing the release, for example creating or updating files such as `package.json`, `CHANGELOG.md`, documentation or compiled assets and pushing a commit. | @@ -15,10 +17,10 @@ A plugin is a npm module that can implement one or more of the following steps: | `success` | No | Responsible for notifying of a new release. | | `fail` | No | Responsible for notifying of a failed release. | -**Note:** If no plugin with a `analyzeCommits` step is defined `@semantic-release/commit-analyzer` will be used. - ## Plugins installation +### Plugins installed by default + These five plugins are already part of **semantic-release** and don't have to be installed separately: ``` "@semantic-release/commit-analyzer" @@ -28,28 +30,19 @@ These five plugins are already part of **semantic-release** and don't have to be "@semantic-release/release-notes-generator" ``` -[Additional plugins](../extending/plugins-list.md) have to be installed via npm: +### Installing additional plugins + +[Additional plugins](../02-extending/plugins-list.md) have to be installed via npm: ```bash $ npm install @semantic-release/git @semantic-release/changelog -D ``` -## Plugins configuration +## Plugins declaration and execution order -Each plugin must be configured with the [`plugins` options](./configuration.md#plugins) by specifying the list of plugins by npm module name. - -```json -{ - "plugins": ["@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/npm"] -} -``` - -**Note:** If the `plugins` option is defined, it overrides the default plugin list, rather than merging with it. - -## Plugin ordering - -For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed in the order in which they are defined. +Each plugin (which is an npm module) must be declared using the [`plugins` option](./configuration.md#plugins). If the `plugins` option is defined, then the default is overriden (rather than merge with the option's default). +For example: ```json { "plugins": [ @@ -61,16 +54,18 @@ For each [release step](../../README.md#release-steps) the plugins that implemen } ``` -With this configuration **semantic-release** will: +For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed **in the order in which they are declared**. + +Hence, with this configuration above, **semantic-release** will: - execute the `verifyConditions` implementation of `@semantic-release/npm` then `@semantic-release/git` - execute the `analyzeCommits` implementation of `@semantic-release/commit-analyzer` - execute the `prepare` implementation of `@semantic-release/npm` then `@semantic-release/git` - execute the `generateNotes` implementation of `@semantic-release/release-notes-generator` - execute the `publish` implementation of `@semantic-release/npm` -## Plugin options +## Plugins configuration options -A plugin options can specified by wrapping the name and an options object in an array. Options configured this way will be passed only to that specific plugin. +A plugin configuration options can specified by wrapping the name and an options object in an array. Options configured this way will be passed only to that specific plugin. Global plugin options can defined at the root of the **semantic-release** configuration object. Options configured this way will be passed to all plugins. @@ -80,11 +75,11 @@ Global plugin options can defined at the root of the **semantic-release** config "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", ["@semantic-release/github", { - "assets": ["dist/**"] + "assets": ["dist/**"] # plugin configuration }], "@semantic-release/git" ], - "preset": "angular" + "preset": "angular" # option passed to all plugins } ``` diff --git a/docs/usage/shareable-configurations.md b/docs/01-usage/shareable-configurations.md similarity index 78% rename from docs/usage/shareable-configurations.md rename to docs/01-usage/shareable-configurations.md index bfaf3bab..3e1a3ccf 100644 --- a/docs/usage/shareable-configurations.md +++ b/docs/01-usage/shareable-configurations.md @@ -4,4 +4,4 @@ A shareable configuration is an [npm](https://www.npmjs.com/) package that expor The shareable configurations to use can be set with the [extends](configuration.md#extends) option. -See [shareable configurations list](../extending/shareable-configurations-list.md). +See [shareable configurations list](../02-extending/shareable-configurations-list.md). diff --git a/docs/extending/README.md b/docs/02-extending/README.md similarity index 100% rename from docs/extending/README.md rename to docs/02-extending/README.md diff --git a/docs/extending/plugins-list.md b/docs/02-extending/plugins-list.md similarity index 100% rename from docs/extending/plugins-list.md rename to docs/02-extending/plugins-list.md diff --git a/docs/extending/shareable-configurations-list.md b/docs/02-extending/shareable-configurations-list.md similarity index 100% rename from docs/extending/shareable-configurations-list.md rename to docs/02-extending/shareable-configurations-list.md diff --git a/docs/recipes/README.md b/docs/03-recipes/README.md similarity index 100% rename from docs/recipes/README.md rename to docs/03-recipes/README.md diff --git a/docs/recipes/ci-configurations.md b/docs/03-recipes/ci-configurations-recipes.md similarity index 100% rename from docs/recipes/ci-configurations.md rename to docs/03-recipes/ci-configurations-recipes.md diff --git a/docs/recipes/circleci-workflows.md b/docs/03-recipes/circleci-workflows.md similarity index 75% rename from docs/recipes/circleci-workflows.md rename to docs/03-recipes/circleci-workflows.md index a83a2a31..8c2aefc7 100644 --- a/docs/recipes/circleci-workflows.md +++ b/docs/03-recipes/circleci-workflows.md @@ -2,9 +2,9 @@ ## Environment variables -The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured in [CircleCi Project Settings](https://circleci.com/docs/2.0/env-vars/#adding-environment-variables-in-the-app).. +The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [CircleCi Project Settings](https://circleci.com/docs/2.0/env-vars/#adding-environment-variables-in-the-app).. -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/getting-started.md#getting-started). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). ## Multiple Node jobs configuration @@ -12,7 +12,7 @@ Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [CircleCI documentation](https://circleci.com/docs/2.0) for additional configuration options. -This example create the workflows `test_node_4`, `test_node_6`, `test_node_8` and `release`. The release workflows will [run `semantic-release` only after the all the `test_node_*` are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +This example create the workflows `test_node_4`, `test_node_6`, `test_node_8` and `release`. The release workflows will [run `semantic-release` only after the all the `test_node_*` are successful](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). ```yaml version: 2 @@ -54,7 +54,7 @@ workflows: ### `package.json` configuration for multiple Node jobs -A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. +A `package.json` is required only for [local](../01-usage/installation.md#local-installation) **semantic-release** installation. ```json { diff --git a/docs/recipes/git-auth-ssh-keys.md b/docs/03-recipes/git-auth-ssh-keys.md similarity index 93% rename from docs/recipes/git-auth-ssh-keys.md rename to docs/03-recipes/git-auth-ssh-keys.md index f346d802..1365f2b4 100644 --- a/docs/recipes/git-auth-ssh-keys.md +++ b/docs/03-recipes/git-auth-ssh-keys.md @@ -1,6 +1,6 @@ # Git authentication with SSH keys -When using [environment variables](../usage/ci-configuration.md#authentication) to set up the Git authentication, the remote Git repository will automatically be accessed via [https](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols#_the_http_protocols), independently of the [`repositoryUrl`](../usage/configuration.md#repositoryurl) format configured in the **semantic-release** [Configuration](../usage/configuration.md#configuration) (the format will be automatically converted as needed). +When using [environment variables](../01-usage/ci-configuration.md#authentication) to set up the Git authentication, the remote Git repository will automatically be accessed via [https](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols#_the_http_protocols), independently of the [`repositoryUrl`](../01-usage/configuration.md#repositoryurl) format configured in the **semantic-release** [Configuration](../01-usage/configuration.md#configuration) (the format will be automatically converted as needed). Alternatively the Git repository can be accessed via [SSH](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols#_the_ssh_protocol) by creating SSH keys, adding the public one to your Git hosted account and making the private one available on the CI environment. diff --git a/docs/recipes/git-hosted-services.md b/docs/03-recipes/git-hosted-services.md similarity index 100% rename from docs/recipes/git-hosted-services.md rename to docs/03-recipes/git-hosted-services.md diff --git a/docs/recipes/gitlab-ci.md b/docs/03-recipes/gitlab-ci.md similarity index 68% rename from docs/recipes/gitlab-ci.md rename to docs/03-recipes/gitlab-ci.md index 6671ecef..349937f0 100644 --- a/docs/recipes/gitlab-ci.md +++ b/docs/03-recipes/gitlab-ci.md @@ -2,19 +2,19 @@ ## Environment variables -The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured with [Secret variables](https://docs.gitlab.com/ce/ci/variables/README.html#secret-variables). +The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured with [Secret variables](https://docs.gitlab.com/ce/ci/variables/README.html#secret-variables). ## Node project configuration GitLab CI supports [Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html) allowing to test on multiple Node versions and publishing a release only when all test pass. -**Note**: The publish pipeline must run a [Node >= 8 version](../support/FAQ.md#why-does-semantic-release-require-node-version--83). +**Note**: The publish pipeline must run a [Node >= 8 version](../05-support/FAQ.md#why-does-semantic-release-require-node-version--83). ### `.gitlab-ci.yml` configuration for Node projects This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [GitLab CI - Configuration of your jobs with .gitlab-ci.yml](https://docs.gitlab.com/ee/ci/yaml/README.html) for additional configuration options. -**Note**: The`semantic-release` execution command varies depending if you are using a [local](../usage/installation.md#local-installation) or [global](../usage/installation.md#global-installation) **semantic-release** installation. +**Note**: The`semantic-release` execution command varies depending if you are using a [local](../01-usage/installation.md#local-installation) or [global](../01-usage/installation.md#global-installation) **semantic-release** installation. ```yaml # The release pipeline will run only if all jobs in the test pipeline are successful @@ -46,7 +46,7 @@ publish: ### `package.json` configuration -A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. +A `package.json` is required only for [local](../01-usage/installation.md#local-installation) **semantic-release** installation. ```json { diff --git a/docs/recipes/package-managers-and-languages.md b/docs/03-recipes/package-managers-and-languages.md similarity index 100% rename from docs/recipes/package-managers-and-languages.md rename to docs/03-recipes/package-managers-and-languages.md diff --git a/docs/recipes/travis.md b/docs/03-recipes/travis.md similarity index 81% rename from docs/recipes/travis.md rename to docs/03-recipes/travis.md index 02ac8356..adbe8280 100644 --- a/docs/recipes/travis.md +++ b/docs/03-recipes/travis.md @@ -2,9 +2,9 @@ ## Environment variables -The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). +The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/getting-started.md#getting-started). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). ## Node.js projects configuration @@ -12,7 +12,7 @@ Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. -This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. @@ -43,7 +43,7 @@ jobs: ### `package.json` configuration for multiple Node jobs -A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. +A `package.json` is required only for [local](../01-usage/installation.md#local-installation) **semantic-release** installation. ```json { @@ -57,13 +57,13 @@ A `package.json` is required only for [local](../usage/installation.md#local-ins For projects that require to be tested with one or multiple version of a Non-JavaScript [language](https://docs.travis-ci.com/user/languages), optionally on multiple [Operating Systems](https://docs.travis-ci.com/user/multi-os). -This recipe cover the Travis specifics only. See [Non JavaScript projects recipe](../support/FAQ.md#can-i-use-semantic-release-to-publish-non-javascript-packages) for more information on the **semantic-release** configuration. +This recipe cover the Travis specifics only. See [Non JavaScript projects recipe](../05-support/FAQ.md#can-i-use-semantic-release-to-publish-non-javascript-packages) for more information on the **semantic-release** configuration. ### `.travis.yml` configuration for non-JavaScript projects This example is a minimal configuration for **semantic-release** with a build running [Go 1.6 and 1.7](https://docs.travis-ci.com/user/languages/go). See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. -This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. diff --git a/docs/developer-guide/README.md b/docs/04-developer-guide/README.md similarity index 100% rename from docs/developer-guide/README.md rename to docs/04-developer-guide/README.md diff --git a/docs/developer-guide/js-api.md b/docs/04-developer-guide/js-api.md similarity index 96% rename from docs/developer-guide/js-api.md rename to docs/04-developer-guide/js-api.md index 33b04175..cf362ab9 100644 --- a/docs/developer-guide/js-api.md +++ b/docs/04-developer-guide/js-api.md @@ -65,9 +65,9 @@ Type: `Object` **semantic-release** options. -Can be used to set any [core option](../usage/configuration.md#configuration) or [plugin options](../usage/plugins.md#configuration). +Can be used to set any [core option](../01-usage/configuration.md#configuration) or [plugin options](../01-usage/plugins.md#configuration). -Each option, will take precedence over options configured in the [configuration file](../usage/configuration.md#configuration) and [shareable configurations](../usage/configuration.md#extends). +Each option, will take precedence over options configured in the [configuration file](../01-usage/configuration.md#configuration) and [shareable configurations](../01-usage/configuration.md#extends). #### config @@ -229,7 +229,7 @@ Example: Type: `Array` -The list of releases published, one release per [publish plugin](../usage/plugins.md#publish-plugin).
+The list of releases published, one release per [publish plugin](../01-usage/plugins.md#publish-plugin).
Each release object has the following properties: | Name | Type | Description | diff --git a/docs/developer-guide/plugin.md b/docs/04-developer-guide/plugin.md similarity index 100% rename from docs/developer-guide/plugin.md rename to docs/04-developer-guide/plugin.md diff --git a/docs/developer-guide/shareable-configuration.md b/docs/04-developer-guide/shareable-configuration.md similarity index 100% rename from docs/developer-guide/shareable-configuration.md rename to docs/04-developer-guide/shareable-configuration.md diff --git a/docs/support/FAQ.md b/docs/05-support/FAQ.md similarity index 84% rename from docs/support/FAQ.md rename to docs/05-support/FAQ.md index f323443e..4b2faed8 100644 --- a/docs/support/FAQ.md +++ b/docs/05-support/FAQ.md @@ -34,11 +34,11 @@ If using npm hook scripts is not possible, and alternative solution is to [`@sem ## Is there a way to preview which version would currently get published? -Yes with the [dry-run options](../usage/configuration.md#dryrun) which prints to the console the next version to be published and the release notes. +Yes with the [dry-run options](../01-usage/configuration.md#dryrun) which prints to the console the next version to be published and the release notes. ## Can I use semantic-release with Yarn? -If you are using a [local](../usage/installation.md#local-installation) **semantic-release** installation and run multiple CI jobs with different versions, the `yarn install` command will fail on jobs running with Node < 8 as **semantic-release** requires [Node >= 8.3](#why-does-semantic-release-require-node-version--83) and specifies it in its `package.json`s [`engines`](https://docs.npmjs.com/files/package.json#engines) key. +If you are using a [local](../01-usage/installation.md#local-installation) **semantic-release** installation and run multiple CI jobs with different versions, the `yarn install` command will fail on jobs running with Node < 8 as **semantic-release** requires [Node >= 8.3](#why-does-semantic-release-require-node-version--83) and specifies it in its `package.json`s [`engines`](https://docs.npmjs.com/files/package.json#engines) key. The recommended solution is to use the [Yarn](https://yarnpkg.com) [--ignore-engines](https://yarnpkg.com/en/docs/cli/install#toc-yarn-install-ignore-engines) option to install the project dependencies on the CI environment, so Yarn will ignore the **semantic-release**'s `engines` key: @@ -48,7 +48,7 @@ $ yarn install --ignore-engines **Note**: Several CI services use Yarn by default if your repository contains a `yarn.lock` file. So you should override the install step to specify `yarn install --ignore-engines`. -Alternatively you can use a [global](../usage/installation.md#global-installation) **semantic-release** installation and make sure to install and run the `semantic-release` command only in a CI jobs running with Node >= 8.3. +Alternatively you can use a [global](../01-usage/installation.md#global-installation) **semantic-release** installation and make sure to install and run the `semantic-release` command only in a CI jobs running with Node >= 8.3. If your CI environment provides [nvm](https://github.com/creationix/nvm) you can switch to Node 8 before installing and running the `semantic-release` command: @@ -56,14 +56,14 @@ If your CI environment provides [nvm](https://github.com/creationix/nvm) you can $ nvm install 8 && yarn global add semantic-release && semantic-release ``` -See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. +See the [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on specific CI environments. As `semantic-release` is recommended to be executed with [`npx`](https://www.npmjs.com/package/npx) an alternative is required for usage with Yarn. Even though it is possible to install npx with Yarn, it's not recommended. Yarn and npx would be using different cache locations. -For [local installation](../usage/installation.md#local-installation) replace +For [local installation](../01-usage/installation.md#local-installation) replace `npx semantic-release` with `yarn run semantic-release`. -For [global installation](../usage/installation.md#global-installation) replace +For [global installation](../01-usage/installation.md#global-installation) replace `npx semantic-release` with `yarn global add semantic-release && semantic-release`. ## Can I use semantic-release to publish non-JavaScript packages? @@ -71,13 +71,13 @@ For [global installation](../usage/installation.md#global-installation) replace Yes, **semantic-release** is a Node CLI application but it can be used to publish any type of packages. To publish a non-Node package (without a `package.json`) you would need to: -- Use a [global](../usage/installation.md#global-installation) **semantic-release** installation -- Set **semantic-release** [options](../usage/configuration.md#options) via [CLI arguments or rc file](../usage/configuration.md#configuration) +- Use a [global](../01-usage/installation.md#global-installation) **semantic-release** installation +- Set **semantic-release** [options](../01-usage/configuration.md#options) via [CLI arguments or rc file](../01-usage/configuration.md#configuration) - Make sure your CI job executing the `semantic-release` command has access to [Node >= 8](#why-does-semantic-release-require-node-version--83) to execute the `semantic-release` command -See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. +See the [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on specific CI environments. -In addition you will need to configure the **semantic-release** [plugins](../usage/plugins.md#plugins) to disable the [`@semantic-release/npm`](https://github.com/semantic-release/npm) plugin which is used by default and use a plugin for your project type. +In addition you will need to configure the **semantic-release** [plugins](../01-usage/plugins.md#plugins) to disable the [`@semantic-release/npm`](https://github.com/semantic-release/npm) plugin which is used by default and use a plugin for your project type. If there is no specific plugin for your project type you can use the [`@semantic-release/exec`](https://github.com/semantic-release/exec) plugin to publish the release with a shell command. @@ -99,19 +99,19 @@ Here is a basic example to create [GitHub releases](https://help.github.com/arti **Note**: This is a theoretical example where the command `set-version` update the project version with the value passed as its first argument and `publish-package` publishes the package to a registry. -See the [package managers and languages recipes](../recipes/README.md#package-managers-and-languages) for more details on specific project types. +See the [package managers and languages recipes](../03-recipes/README.md#package-managers-and-languages) for more details on specific project types. ## Can I use semantic-release with any CI service? Yes, **semantic-release** can be used with any CI service, as long as it provides: -- A way to set [authentication](../usage/ci-configuration.md#authentication) via environment variables -- A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) +- A way to set [authentication](../01-usage/ci-configuration.md#authentication) via environment variables +- A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) -See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. +See the [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on specific CI environments. ## Can I run semantic-release on my local machine rather than on a CI server? -Yes, you can by explicitly setting the [`--no-ci` CLI option](../usage/configuration.md#ci) option. You will also have to set the required [authentication](../usage/ci-configuration.md#authentication) via environment variables on your local machine, for example: +Yes, you can by explicitly setting the [`--no-ci` CLI option](../01-usage/configuration.md#ci) option. You will also have to set the required [authentication](../01-usage/ci-configuration.md#authentication) via environment variables on your local machine, for example: ```bash $ NPM_TOKEN= GH_TOKEN= npx semantic-release --no-ci @@ -123,11 +123,11 @@ However this is not the recommended approach, as running unit and integration te Yes, with the [`@semantic-release/gitlab-config`](https://github.com/semantic-release/gitlab-config) shareable configuration. -See the [GitLab CI recipes](../recipes/gitlab-ci.md#using-semantic-release-with-gitlab-ci) for the CI configuration. +See the [GitLab CI recipes](../03-recipes/gitlab-ci.md#using-semantic-release-with-gitlab-ci) for the CI configuration. ## Can I use semantic-release with any Git hosted environment? -By default **semantic-release** uses the [`@semantic-release/github`](https://github.com/semantic-release/github) plugin to publish a [GitHub release](https://help.github.com/articles/about-releases). For other Git hosted environment the [`@semantic-release/git`](https://github.com/semantic-release/git) and [`@semantic-release/changelog`](https://github.com/semantic-release/changelog) plugins can be used via [plugins configuration](../usage/plugins.md). +By default **semantic-release** uses the [`@semantic-release/github`](https://github.com/semantic-release/github) plugin to publish a [GitHub release](https://help.github.com/articles/about-releases). For other Git hosted environment the [`@semantic-release/git`](https://github.com/semantic-release/git) and [`@semantic-release/changelog`](https://github.com/semantic-release/changelog) plugins can be used via [plugins configuration](../01-usage/plugins.md). See the [`@semantic-release/git`](https://github.com/semantic-release/git#semantic-releasegit) [`@semantic-release/changelog`](https://github.com/semantic-release/changelog#semantic-releasechangelog) plugins documentation for more details. @@ -230,13 +230,13 @@ See [“Introduction to SemVer” - Irina Gebauer](https://blog.greenkeeper.io/i **semantic-release** has a full unit and integration test suite that tests `npm` publishes against the [npm-registry-couchapp](https://github.com/npm/npm-registry-couchapp). -In addition the [verify conditions step](../../README.md#release-steps) verifies that all necessary conditions for proceeding with a release are met, and a new release will be performed [only if all your tests pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +In addition the [verify conditions step](../../README.md#release-steps) verifies that all necessary conditions for proceeding with a release are met, and a new release will be performed [only if all your tests pass](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). ## Why does semantic-release require Node version >= 8.3? **semantic-release** is written using the latest [ECMAScript 2017](https://www.ecma-international.org/publications/standards/Ecma-262.htm) features, without transpilation which **requires Node version 8.3 or higher**. -See [Node version requirement](../support/node-version.md#node-version-requirement) for more details and solutions. +See [Node version requirement](/node-version.md#node-version-requirement) for more details and solutions. ## What is npx? diff --git a/docs/support/README.md b/docs/05-support/README.md similarity index 100% rename from docs/support/README.md rename to docs/05-support/README.md diff --git a/docs/support/node-support-policy.md b/docs/05-support/node-support-policy.md similarity index 100% rename from docs/support/node-support-policy.md rename to docs/05-support/node-support-policy.md diff --git a/docs/support/node-version.md b/docs/05-support/node-version.md similarity index 91% rename from docs/support/node-version.md rename to docs/05-support/node-version.md index e387685b..31f84770 100644 --- a/docs/support/node-version.md +++ b/docs/05-support/node-version.md @@ -12,7 +12,7 @@ See our [Node Support Policy](node-support-policy.md) for our long-term promise The recommended approach is to run the `semantic-release` command from a CI job running on Node 8.3 or higher. This can either be a job used by your project to test on Node >= 8.3 or a dedicated job for the release steps. -See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/ci-configurations.md) for more details. +See [CI configuration](../01-usage/ci-configuration.md) and [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details. ## Alternative solutions diff --git a/docs/support/resources.md b/docs/05-support/resources.md similarity index 100% rename from docs/support/resources.md rename to docs/05-support/resources.md diff --git a/docs/support/troubleshooting.md b/docs/05-support/troubleshooting.md similarity index 100% rename from docs/support/troubleshooting.md rename to docs/05-support/troubleshooting.md diff --git a/docs/README.md b/docs/README.md index a5b4380e..abc9b8ee 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ # semantic-release documentation -- [Usage](usage/README.md) - **semantic-release** installation and configuration -- [Extending](extending/README.md)- Extending **semantic-release** with plugins and shareable configurations -- [Recipes](recipes/README.md) - Community written recipes for common **semantic-release** use-cases -- [Developer Guide](developer-guide/README.md) - The essentials of writing a **semantic-release** plugin or shareable configurations -- [Support](support/README.md) - FAQ and troubleshooting +- [Usage](01-usage/README.md) - **semantic-release** installation and configuration +- [Extending](02-extending/README.md)- Extending **semantic-release** with plugins and shareable configurations +- [Recipes](03-recipes/README.md) - Community written recipes for common **semantic-release** use-cases +- [Developer Guide](04-developer-guide/README.md) - The essentials of writing a **semantic-release** plugin or shareable configurations +- [Support](05-support/README.md) - FAQ and troubleshooting diff --git a/docs/usage/getting-started.md b/docs/usage/getting-started.md deleted file mode 100644 index f8bda3bb..00000000 --- a/docs/usage/getting-started.md +++ /dev/null @@ -1,22 +0,0 @@ -# Getting started - -In order to use **semantic-release** you must follow these steps: -- [Install](./installation.md#installation) **semantic-release** in your project -- Configure your Continuous Integration service to [run **semantic-release**](./ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) -- Configure your Git repository and package manager repository [authentication](ci-configuration.md#authentication) in your Continuous Integration service -- Configure **semantic-release** [options and plugins](./configuration.md#configuration) - -Alternatively those steps can be easily done with the [**semantic-release** interactive CLI](https://github.com/semantic-release/cli): - -```bash -npm install -g semantic-release-cli - -cd your-module -semantic-release-cli setup -``` - -![dialogue](../../media/semantic-release-cli.png) - -See the [semantic-release-cli](https://github.com/semantic-release/cli#what-it-does) documentation for more details. - -**Note**: only a limited number of options, CI services and plugins are currently supported by `semantic-release-cli`. diff --git a/docs/usage/installation.md b/docs/usage/installation.md deleted file mode 100644 index e51002e7..00000000 --- a/docs/usage/installation.md +++ /dev/null @@ -1,29 +0,0 @@ -# Installation - -## Local installation - -For [Node modules projects](https://docs.npmjs.com/getting-started/creating-node-modules) we recommend installing **semantic-release** locally and running the `semantic-release` command with [npx](https://www.npmjs.com/package/npx): - -```bash -$ npm install --save-dev semantic-release -``` - -Then in the CI environment: - -```bash -$ npx semantic-release -``` - -**Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently find the semantic-release binary and to execute it. See [What is npx](../support/FAQ.md#what-is-npx) for more details. - -## Global installation - -For other type of projects we recommend installing **semantic-release** directly in the CI environment, also with [npx](https://www.npmjs.com/package/npx): - -```bash -$ npx semantic-release -``` - -**Note:** For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`, or `npm install -g semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. - -**Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../support/FAQ.md#what-is-npx) for more details. From 7cb5446bb597b2a457ae4390a0658da5779ffb70 Mon Sep 17 00:00:00 2001 From: Emmanuel Sciara Date: Wed, 31 Jul 2019 23:04:20 +0200 Subject: [PATCH 077/104] docs: corrections and further clarifications - (correction) removed comments from code samples. -(correction) remove recommendation for global install on CI environemnts. - Synched README.md and SUMMARY.md --- README.md | 14 +++++++------- SUMMARY.md | 12 ++++++------ docs/01-usage/configuration.md | 2 +- docs/01-usage/installation.md | 9 +-------- docs/01-usage/plugins.md | 4 ++-- docs/01-usage/shareable-configurations.md | 6 +++--- ...urations-recipes.md => ci-pipelines-recipes.md} | 2 +- docs/03-recipes/git-hosted-services.md | 12 +----------- 8 files changed, 22 insertions(+), 39 deletions(-) rename docs/03-recipes/{ci-configurations-recipes.md => ci-pipelines-recipes.md} (81%) diff --git a/README.md b/README.md index aeccdf91..5d294c7f 100644 --- a/README.md +++ b/README.md @@ -93,22 +93,22 @@ After running the tests, the command `semantic-release` will execute the followi ## Documentation - Usage - - [Getting started](docs/01-usage/01-getting-started.md) + - [Getting started](docs/01-usage/getting-started.md) - [Installation](docs/01-usage/installation.md#installation) - [CI Configuration](docs/01-usage/ci-configuration.md#ci-configuration) - [Configuration](docs/01-usage/configuration.md#configuration) - [Plugins](docs/01-usage/plugins.md) - [Shareable configurations](docs/01-usage/shareable-configurations.md) - Extending - - [Plugins](docs/02-extending/plugins-list.md) - - [Shareable configuration](docs/02-extending/shareable-configurations-list.md) + - [Available plugins](docs/02-extending/plugins-list.md) + - [Available shareable configuration](docs/02-extending/shareable-configurations-list.md) - Recipes - [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) - - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) - - [Travis CI](docs/03-recipes/travis.md) - - [GitLab CI](docs/03-recipes/gitlab-ci.md) + - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) + - [Travis CI](docs/03-recipes/travis.md) + - [GitLab CI](docs/03-recipes/gitlab-ci.md) - [Git hosted services](docs/03-recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) + - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) - [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) - Developer guide - [JavaScript API](docs/04-developer-guide/js-api.md) diff --git a/SUMMARY.md b/SUMMARY.md index 74e4089e..e088aa11 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -9,16 +9,16 @@ - [Shareable configurations](docs/01-usage/shareable-configurations.md) ## Extensions -- [Plugins](docs/02-extending/plugins-list.md) -- [Shareable configuration](docs/02-extending/shareable-configurations-list.md) +- [Available plugins](docs/02-extending/plugins-list.md) +- [Available shareable configuration](docs/02-extending/shareable-configurations-list.md) ## Recipes - [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) - - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) - - [Travis CI](docs/03-recipes/travis.md) - - [GitLab CI](docs/03-recipes/gitlab-ci.md) + - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) + - [Travis CI](docs/03-recipes/travis.md) + - [GitLab CI](docs/03-recipes/gitlab-ci.md) - [Git hosted services](docs/03-recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) + - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) - [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) ## Developer guide diff --git a/docs/01-usage/configuration.md b/docs/01-usage/configuration.md index 23c380d0..2cd5d882 100644 --- a/docs/01-usage/configuration.md +++ b/docs/01-usage/configuration.md @@ -154,7 +154,7 @@ Example (`.releaserc` file content): "@semantic-release/release-notes-generator", "@semantic-release-docker", ["@semantic-release/exec", { - "verifyConditionsCmd": "./verify.sh" # plugin configuration + "verifyConditionsCmd": "./verify.sh" }], "@semantic-release/git", "@semantic-release/gitlab", diff --git a/docs/01-usage/installation.md b/docs/01-usage/installation.md index 64c27260..f100883b 100644 --- a/docs/01-usage/installation.md +++ b/docs/01-usage/installation.md @@ -18,12 +18,5 @@ $ npx semantic-release ## Global installation -For other type of projects we recommend installing **semantic-release** directly in the CI environment, also with [npx](https://www.npmjs.com/package/npx): +> **Note:** For a global installation is no longer recommended. Please use local installation and `npx` instead. -```bash -$ npx semantic-release -``` - -> **Note:** For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`, or `npm install -g semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. - -> **Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../05-support/FAQ.md#what-is-npx) for more details. diff --git a/docs/01-usage/plugins.md b/docs/01-usage/plugins.md index 8f329e46..69a64299 100644 --- a/docs/01-usage/plugins.md +++ b/docs/01-usage/plugins.md @@ -75,11 +75,11 @@ Global plugin options can defined at the root of the **semantic-release** config "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", ["@semantic-release/github", { - "assets": ["dist/**"] # plugin configuration + "assets": ["dist/**"] }], "@semantic-release/git" ], - "preset": "angular" # option passed to all plugins + "preset": "angular" } ``` diff --git a/docs/01-usage/shareable-configurations.md b/docs/01-usage/shareable-configurations.md index 3e1a3ccf..7058267d 100644 --- a/docs/01-usage/shareable-configurations.md +++ b/docs/01-usage/shareable-configurations.md @@ -1,7 +1,7 @@ # Shareable configurations -A shareable configuration is an [npm](https://www.npmjs.com/) package that exports a **semantic-release** configuration object. It allows for use of the same configuration across several projects. +A shareable configuration is an npm package that exports a **semantic-release** configuration object. It allows for use of the same configuration across several projects. -The shareable configurations to use can be set with the [extends](configuration.md#extends) option. +Shareable configurations to be use can be declared with the [`extends` option](configuration.md#extends). -See [shareable configurations list](../02-extending/shareable-configurations-list.md). +See [shareable configurations list](../02-extending/shareable-configurations-list.md) for examples. diff --git a/docs/03-recipes/ci-configurations-recipes.md b/docs/03-recipes/ci-pipelines-recipes.md similarity index 81% rename from docs/03-recipes/ci-configurations-recipes.md rename to docs/03-recipes/ci-pipelines-recipes.md index 5126288f..ed6f92d7 100644 --- a/docs/03-recipes/ci-configurations-recipes.md +++ b/docs/03-recipes/ci-pipelines-recipes.md @@ -1,4 +1,4 @@ -# CI configurations +# CI pipelines recipes - [CircleCI 2.0 workflows](circleci-workflows.md) - [Travis CI](travis.md) - [GitLab CI](gitlab-ci.md) diff --git a/docs/03-recipes/git-hosted-services.md b/docs/03-recipes/git-hosted-services.md index fd2ad886..0df19570 100644 --- a/docs/03-recipes/git-hosted-services.md +++ b/docs/03-recipes/git-hosted-services.md @@ -1,12 +1,2 @@ -# Recipes - -## CI configurations -- [CircleCI 2.0 workflows](circleci-workflows.md) -- [Travis CI](travis.md) -- [GitLab CI](gitlab-ci.md) - -## Git hosted services +# Git hosted services - [Git authentication with SSH keys](git-auth-ssh-keys.md) - -## Package managers and languages (to be completed) - From 9a8a36ce45b493cc96fa7c000661c9c64cee809f Mon Sep 17 00:00:00 2001 From: Philipp Rudloff Date: Tue, 6 Aug 2019 06:17:22 +0200 Subject: [PATCH 078/104] fix(package): update dependency lodash to address security warnings (#1253) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1416d422..4f2fbf14 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "git-log-parser": "^1.2.0", "hook-std": "^2.0.0", "hosted-git-info": "^2.7.1", - "lodash": "^4.17.4", + "lodash": "^4.17.15", "marked": "^0.7.0", "marked-terminal": "^3.2.0", "p-locate": "^4.0.0", From 3bd63eb6a8ca8931709754cc3ca7182cc0948f53 Mon Sep 17 00:00:00 2001 From: "Alvaro Pinot @alvaropinot" Date: Fri, 2 Aug 2019 12:37:08 -0400 Subject: [PATCH 079/104] docs: update semantic-release-cli broken link * Remove extra `01-` --- docs/03-recipes/circleci-workflows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/03-recipes/circleci-workflows.md b/docs/03-recipes/circleci-workflows.md index 8c2aefc7..abc94335 100644 --- a/docs/03-recipes/circleci-workflows.md +++ b/docs/03-recipes/circleci-workflows.md @@ -4,7 +4,7 @@ The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [CircleCi Project Settings](https://circleci.com/docs/2.0/env-vars/#adding-environment-variables-in-the-app).. -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/getting-started.md#guided-setup-through-semantic-release-cli). ## Multiple Node jobs configuration From e1688023797774ec6540801fa95b8aec257faf82 Mon Sep 17 00:00:00 2001 From: Em Date: Fri, 2 Aug 2019 09:28:28 +0200 Subject: [PATCH 080/104] docs: tried to fix #1250 --- docs/01-usage/getting-started.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/01-usage/getting-started.md b/docs/01-usage/getting-started.md index ddea6bde..26e5a8ad 100644 --- a/docs/01-usage/getting-started.md +++ b/docs/01-usage/getting-started.md @@ -3,6 +3,7 @@ ## Manual setup You can use **semantic-release** with the following manual setup steps: + 1. [Install **semantic-release**](installation.md) either locally for your project or globally 1. Configure: 1. Your Continuous Integration service to [run **semantic-release**](ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) @@ -23,6 +24,7 @@ $ cd your-module $ semantic-release-cli setup ``` The output looks something like this: + ![dialogue](../../media/semantic-release-cli.png) Available options and other information can be found on [`semantic-release-cli`'s doc](https://github.com/semantic-release/cli#semantic-release-cli). From 519df0d5c122c16a6fd9ca0e90c008caeac3d10f Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Fri, 9 Aug 2019 13:58:46 -0400 Subject: [PATCH 081/104] chore: remove commitizen from our dependencies --- package.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/package.json b/package.json index 4f2fbf14..827b04ae 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,6 @@ "bugs": { "url": "https://github.com/semantic-release/semantic-release/issues" }, - "config": { - "commitizen": { - "path": "cz-conventional-changelog" - } - }, "contributors": [ "Gregor Martynus (https://twitter.com/gr2m)", "Pierre Vanduynslager (https://twitter.com/@pvdlg_)" @@ -58,8 +53,6 @@ "ava": "^2.0.0", "clear-module": "^4.0.0", "codecov": "^3.0.0", - "commitizen": "^4.0.0", - "cz-conventional-changelog": "^2.0.0", "delay": "^4.0.0", "dockerode": "^2.5.2", "file-url": "^3.0.0", @@ -125,7 +118,6 @@ "url": "git+https://github.com/semantic-release/semantic-release.git" }, "scripts": { - "cm": "git-cz", "codecov": "codecov -f coverage/coverage-final.json", "lint": "xo", "pretest": "npm run lint", From d45d8b61707840113ea2aa11672f4bfc0079c019 Mon Sep 17 00:00:00 2001 From: Crhistian Ramirez <16483662+crhistianramirez@users.noreply.github.com> Date: Sat, 10 Aug 2019 17:55:18 -0500 Subject: [PATCH 082/104] docs: fix typo --- docs/01-usage/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/01-usage/installation.md b/docs/01-usage/installation.md index f100883b..0cf89de2 100644 --- a/docs/01-usage/installation.md +++ b/docs/01-usage/installation.md @@ -18,5 +18,5 @@ $ npx semantic-release ## Global installation -> **Note:** For a global installation is no longer recommended. Please use local installation and `npx` instead. +> **Note:** Global installation is no longer recommended. Please use local installation and `npx` instead. From 391af986be825744601e2fac02975b1cde2358b2 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2019 16:20:26 +0000 Subject: [PATCH 083/104] fix(package): update hosted-git-info to version 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 827b04ae..bb0215a6 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "get-stream": "^5.0.0", "git-log-parser": "^1.2.0", "hook-std": "^2.0.0", - "hosted-git-info": "^2.7.1", + "hosted-git-info": "^3.0.0", "lodash": "^4.17.15", "marked": "^0.7.0", "marked-terminal": "^3.2.0", From d2230fab7e3a34a6cbb4577ad6eb20109af4f69b Mon Sep 17 00:00:00 2001 From: Gois Date: Tue, 13 Aug 2019 12:04:51 -0300 Subject: [PATCH 084/104] docs: broken link docs/03-recipes/travis.md Fixed the link for `setup with semantic-release-cli.` in 'Environment Variables' section, refering a old file of this repo, --- docs/03-recipes/travis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/03-recipes/travis.md b/docs/03-recipes/travis.md index adbe8280..c4e4053e 100644 --- a/docs/03-recipes/travis.md +++ b/docs/03-recipes/travis.md @@ -4,7 +4,7 @@ The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/getting-started.md). ## Node.js projects configuration From 1eb302545e3ed16044cb0533430d39ce0eeed9e2 Mon Sep 17 00:00:00 2001 From: Florian Keller Date: Fri, 16 Aug 2019 10:06:18 +0200 Subject: [PATCH 085/104] fix(definitions): Repository documentation links --- bin/semantic-release.js | 2 +- lib/definitions/errors.js | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/bin/semantic-release.js b/bin/semantic-release.js index 12dd2b56..d2999f18 100755 --- a/bin/semantic-release.js +++ b/bin/semantic-release.js @@ -16,7 +16,7 @@ if (!semver.satisfies(process.version, pkg.engines.node)) { console.error( `[semantic-release]: node version ${pkg.engines.node} is required. Found ${process.version}. -See https://github.com/semantic-release/semantic-release/blob/master/docs/support/node-version.md for more details and solutions.` +See https://github.com/semantic-release/semantic-release/blob/master/docs/05-support/node-version.md for more details and solutions.` ); process.exit(1); } diff --git a/lib/definitions/errors.js b/lib/definitions/errors.js index 69c2fb22..3c005b80 100644 --- a/lib/definitions/errors.js +++ b/lib/definitions/errors.js @@ -19,11 +19,11 @@ Please verify your CI configuration to make sure the \`semantic-release\` comman ENOREPOURL: () => ({ message: 'The `repositoryUrl` option is required.', details: `The [repositoryUrl option](${linkify( - 'docs/usage/configuration.md#repositoryurl' + 'docs/01-usage/configuration.md#repositoryurl' )}) cannot be determined from the semantic-release configuration, the \`package.json\` nor the [git origin url](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes). Please make sure to add the \`repositoryUrl\` to the [semantic-release configuration] (${linkify( - 'docs/usage/configuration.md' + 'docs/01-usage/configuration.md' )}).`, }), EGITNOPERMISSION: ({options}) => ({ @@ -33,15 +33,15 @@ Please make sure to add the \`repositoryUrl\` to the [semantic-release configura }\` on remote Git repository with URL \`${options.repositoryUrl}\`. Please refer to the [authentication configuration documentation](${linkify( - 'docs/usage/ci-configuration.md#authentication' + 'docs/01-usage/ci-configuration.md#authentication' )}) to configure the Git credentials on your CI environment and make sure the [repositoryUrl](${linkify( - 'docs/usage/configuration.md#repositoryurl' + 'docs/01-usage/configuration.md#repositoryurl' )}) is configured with a [valid Git URL](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols).`, }), EINVALIDTAGFORMAT: ({tagFormat}) => ({ message: 'Invalid `tagFormat` option.', details: `The [tagFormat](${linkify( - 'docs/usage/configuration.md#tagformat' + 'docs/01-usage/configuration.md#tagformat' )}) must compile to a [valid Git reference](https://git-scm.com/docs/git-check-ref-format#_description). Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.`, @@ -49,14 +49,14 @@ Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.` ETAGNOVERSION: ({tagFormat}) => ({ message: 'Invalid `tagFormat` option.', details: `The [tagFormat](${linkify( - 'docs/usage/configuration.md#tagformat' + 'docs/01-usage/configuration.md#tagformat' )}) option must contain the variable \`version\` exactly once. Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.`, }), EPLUGINCONF: ({type, required, pluginConf}) => ({ message: `The \`${type}\` plugin configuration is invalid.`, - details: `The [${type} plugin configuration](${linkify(`docs/usage/plugins.md#${toLower(type)}-plugin`)}) ${ + details: `The [${type} plugin configuration](${linkify(`docs/01-usage/plugins.md#${toLower(type)}-plugin`)}) ${ required ? 'is required and ' : '' } must be a single or an array of plugins definition. A plugin definition is an npm module name, optionnaly wrapped in an array with an object. @@ -65,7 +65,7 @@ Your configuration for the \`${type}\` plugin is \`${stringify(pluginConf)}\`.`, EPLUGINSCONF: ({plugin}) => ({ message: 'The `plugins` configuration is invalid.', details: `The [plugins](${linkify( - 'docs/usage/configuration.md#plugins' + 'docs/01-usage/configuration.md#plugins' )}) option must be an array of plugin definions. A plugin definition is an npm module name, optionnaly wrapped in an array with an object. The invalid configuration is \`${stringify(plugin)}\`.`, @@ -77,7 +77,7 @@ The invalid configuration is \`${stringify(plugin)}\`.`, The plugin \`${pluginName}\` doesn't have the property \`${type}\` and cannot be used for the \`${type}\` step. Please refer to the \`${pluginName}\` and [semantic-release plugins configuration](${linkify( - 'docs/usage/plugins.md' + 'docs/01-usage/plugins.md' )}) documentation for more details.`, }), EANALYZECOMMITSOUTPUT: ({result, pluginName}) => ({ @@ -92,9 +92,9 @@ We recommend to report the issue to the \`${pluginName}\` authors, providing the - The **semantic-release** version: \`${pkg.version}\` - The **semantic-release** logs from your CI job - The value returned by the plugin: \`${stringify(result)}\` -- A link to the **semantic-release** plugin developer guide: [${linkify('docs/developer-guide/plugin.md')}](${linkify( - 'docs/developer-guide/plugin.md' - )})`, +- A link to the **semantic-release** plugin developer guide: [${linkify( + 'docs/04-developer-guide/plugin.md' + )}](${linkify('docs/04-developer-guide/plugin.md')})`, }), EGENERATENOTESOUTPUT: ({result, pluginName}) => ({ message: 'The `generateNotes` plugin returned an invalid value. It must return a `String`.', @@ -106,9 +106,9 @@ We recommend to report the issue to the \`${pluginName}\` authors, providing the - The **semantic-release** version: \`${pkg.version}\` - The **semantic-release** logs from your CI job - The value returned by the plugin: \`${stringify(result)}\` -- A link to the **semantic-release** plugin developer guide: [${linkify('docs/developer-guide/plugin.md')}](${linkify( - 'docs/developer-guide/plugin.md' - )})`, +- A link to the **semantic-release** plugin developer guide: [${linkify( + 'docs/04-developer-guide/plugin.md' + )}](${linkify('docs/04-developer-guide/plugin.md')})`, }), EPUBLISHOUTPUT: ({result, pluginName}) => ({ message: 'A `publish` plugin returned an invalid value. It must return an `Object`.', @@ -120,8 +120,8 @@ We recommend to report the issue to the \`${pluginName}\` authors, providing the - The **semantic-release** version: \`${pkg.version}\` - The **semantic-release** logs from your CI job - The value returned by the plugin: \`${stringify(result)}\` -- A link to the **semantic-release** plugin developer guide: [${linkify('docs/developer-guide/plugin.md')}](${linkify( - 'docs/developer-guide/plugin.md' - )})`, +- A link to the **semantic-release** plugin developer guide: [${linkify( + 'docs/04-developer-guide/plugin.md' + )}](${linkify('docs/04-developer-guide/plugin.md')})`, }), }; From 3c2fe35deda20e518d4250dba5a7baf428c595b4 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2019 23:16:26 +0000 Subject: [PATCH 086/104] fix(package): update yargs to version 14.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb0215a6..1a756d54 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "resolve-from": "^5.0.0", "semver": "^6.0.0", "signale": "^1.2.1", - "yargs": "^13.1.0" + "yargs": "^14.0.0" }, "devDependencies": { "ava": "^2.0.0", From eea5de28630ff1600989653e6b17020ae1f34c3d Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:05:35 -0400 Subject: [PATCH 087/104] revert: docs: broken link docs/03-recipes/travis.md This reverts commit d2230fab7e3a34a6cbb4577ad6eb20109af4f69b. --- docs/03-recipes/travis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/03-recipes/travis.md b/docs/03-recipes/travis.md index c4e4053e..adbe8280 100644 --- a/docs/03-recipes/travis.md +++ b/docs/03-recipes/travis.md @@ -4,7 +4,7 @@ The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/getting-started.md). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). ## Node.js projects configuration From 58aaf057f6988b3737aea73763fe4b96d5228e5c Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:06:04 -0400 Subject: [PATCH 088/104] revert: docs: update semantic-release-cli broken link This reverts commit 3bd63eb6a8ca8931709754cc3ca7182cc0948f53. --- docs/03-recipes/circleci-workflows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/03-recipes/circleci-workflows.md b/docs/03-recipes/circleci-workflows.md index abc94335..8c2aefc7 100644 --- a/docs/03-recipes/circleci-workflows.md +++ b/docs/03-recipes/circleci-workflows.md @@ -4,7 +4,7 @@ The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [CircleCi Project Settings](https://circleci.com/docs/2.0/env-vars/#adding-environment-variables-in-the-app).. -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/getting-started.md#guided-setup-through-semantic-release-cli). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). ## Multiple Node jobs configuration From ce3d1bc7151244064ff3b546046884e3cdc3eb02 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:09:15 -0400 Subject: [PATCH 089/104] revert: docs: corrections and further clarifications This reverts commit 7cb5446bb597b2a457ae4390a0658da5779ffb70. --- README.md | 14 +++++++------- SUMMARY.md | 12 ++++++------ docs/01-usage/configuration.md | 2 +- docs/01-usage/installation.md | 9 ++++++++- docs/01-usage/plugins.md | 4 ++-- docs/01-usage/shareable-configurations.md | 6 +++--- ...nes-recipes.md => ci-configurations-recipes.md} | 2 +- docs/03-recipes/git-hosted-services.md | 12 +++++++++++- 8 files changed, 39 insertions(+), 22 deletions(-) rename docs/03-recipes/{ci-pipelines-recipes.md => ci-configurations-recipes.md} (81%) diff --git a/README.md b/README.md index 5d294c7f..aeccdf91 100644 --- a/README.md +++ b/README.md @@ -93,22 +93,22 @@ After running the tests, the command `semantic-release` will execute the followi ## Documentation - Usage - - [Getting started](docs/01-usage/getting-started.md) + - [Getting started](docs/01-usage/01-getting-started.md) - [Installation](docs/01-usage/installation.md#installation) - [CI Configuration](docs/01-usage/ci-configuration.md#ci-configuration) - [Configuration](docs/01-usage/configuration.md#configuration) - [Plugins](docs/01-usage/plugins.md) - [Shareable configurations](docs/01-usage/shareable-configurations.md) - Extending - - [Available plugins](docs/02-extending/plugins-list.md) - - [Available shareable configuration](docs/02-extending/shareable-configurations-list.md) + - [Plugins](docs/02-extending/plugins-list.md) + - [Shareable configuration](docs/02-extending/shareable-configurations-list.md) - Recipes - [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) - - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) - - [Travis CI](docs/03-recipes/travis.md) - - [GitLab CI](docs/03-recipes/gitlab-ci.md) + - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) + - [Travis CI](docs/03-recipes/travis.md) + - [GitLab CI](docs/03-recipes/gitlab-ci.md) - [Git hosted services](docs/03-recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) + - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) - [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) - Developer guide - [JavaScript API](docs/04-developer-guide/js-api.md) diff --git a/SUMMARY.md b/SUMMARY.md index e088aa11..74e4089e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -9,16 +9,16 @@ - [Shareable configurations](docs/01-usage/shareable-configurations.md) ## Extensions -- [Available plugins](docs/02-extending/plugins-list.md) -- [Available shareable configuration](docs/02-extending/shareable-configurations-list.md) +- [Plugins](docs/02-extending/plugins-list.md) +- [Shareable configuration](docs/02-extending/shareable-configurations-list.md) ## Recipes - [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) - - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) - - [Travis CI](docs/03-recipes/travis.md) - - [GitLab CI](docs/03-recipes/gitlab-ci.md) + - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) + - [Travis CI](docs/03-recipes/travis.md) + - [GitLab CI](docs/03-recipes/gitlab-ci.md) - [Git hosted services](docs/03-recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) + - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) - [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) ## Developer guide diff --git a/docs/01-usage/configuration.md b/docs/01-usage/configuration.md index 2cd5d882..23c380d0 100644 --- a/docs/01-usage/configuration.md +++ b/docs/01-usage/configuration.md @@ -154,7 +154,7 @@ Example (`.releaserc` file content): "@semantic-release/release-notes-generator", "@semantic-release-docker", ["@semantic-release/exec", { - "verifyConditionsCmd": "./verify.sh" + "verifyConditionsCmd": "./verify.sh" # plugin configuration }], "@semantic-release/git", "@semantic-release/gitlab", diff --git a/docs/01-usage/installation.md b/docs/01-usage/installation.md index 0cf89de2..64c27260 100644 --- a/docs/01-usage/installation.md +++ b/docs/01-usage/installation.md @@ -18,5 +18,12 @@ $ npx semantic-release ## Global installation -> **Note:** Global installation is no longer recommended. Please use local installation and `npx` instead. +For other type of projects we recommend installing **semantic-release** directly in the CI environment, also with [npx](https://www.npmjs.com/package/npx): +```bash +$ npx semantic-release +``` + +> **Note:** For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`, or `npm install -g semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. + +> **Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../05-support/FAQ.md#what-is-npx) for more details. diff --git a/docs/01-usage/plugins.md b/docs/01-usage/plugins.md index 69a64299..8f329e46 100644 --- a/docs/01-usage/plugins.md +++ b/docs/01-usage/plugins.md @@ -75,11 +75,11 @@ Global plugin options can defined at the root of the **semantic-release** config "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", ["@semantic-release/github", { - "assets": ["dist/**"] + "assets": ["dist/**"] # plugin configuration }], "@semantic-release/git" ], - "preset": "angular" + "preset": "angular" # option passed to all plugins } ``` diff --git a/docs/01-usage/shareable-configurations.md b/docs/01-usage/shareable-configurations.md index 7058267d..3e1a3ccf 100644 --- a/docs/01-usage/shareable-configurations.md +++ b/docs/01-usage/shareable-configurations.md @@ -1,7 +1,7 @@ # Shareable configurations -A shareable configuration is an npm package that exports a **semantic-release** configuration object. It allows for use of the same configuration across several projects. +A shareable configuration is an [npm](https://www.npmjs.com/) package that exports a **semantic-release** configuration object. It allows for use of the same configuration across several projects. -Shareable configurations to be use can be declared with the [`extends` option](configuration.md#extends). +The shareable configurations to use can be set with the [extends](configuration.md#extends) option. -See [shareable configurations list](../02-extending/shareable-configurations-list.md) for examples. +See [shareable configurations list](../02-extending/shareable-configurations-list.md). diff --git a/docs/03-recipes/ci-pipelines-recipes.md b/docs/03-recipes/ci-configurations-recipes.md similarity index 81% rename from docs/03-recipes/ci-pipelines-recipes.md rename to docs/03-recipes/ci-configurations-recipes.md index ed6f92d7..5126288f 100644 --- a/docs/03-recipes/ci-pipelines-recipes.md +++ b/docs/03-recipes/ci-configurations-recipes.md @@ -1,4 +1,4 @@ -# CI pipelines recipes +# CI configurations - [CircleCI 2.0 workflows](circleci-workflows.md) - [Travis CI](travis.md) - [GitLab CI](gitlab-ci.md) diff --git a/docs/03-recipes/git-hosted-services.md b/docs/03-recipes/git-hosted-services.md index 0df19570..fd2ad886 100644 --- a/docs/03-recipes/git-hosted-services.md +++ b/docs/03-recipes/git-hosted-services.md @@ -1,2 +1,12 @@ -# Git hosted services +# Recipes + +## CI configurations +- [CircleCI 2.0 workflows](circleci-workflows.md) +- [Travis CI](travis.md) +- [GitLab CI](gitlab-ci.md) + +## Git hosted services - [Git authentication with SSH keys](git-auth-ssh-keys.md) + +## Package managers and languages (to be completed) + From 5e41dc89bdce046bbdea6d3d60929d16ff8ad855 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:10:37 -0400 Subject: [PATCH 090/104] revert: docs: made doc file org clearer and augmented content This reverts commit 5a5eaec3da5e3be4a505f6c5e7fa9eb81d202cea. --- CONTRIBUTING.md | 6 +- README.md | 76 ++++---- SUMMARY.md | 48 ++--- docs/01-usage/getting-started.md | 32 --- docs/01-usage/installation.md | 29 --- docs/README.md | 10 +- .../README.md | 0 .../js-api.md | 6 +- .../plugin.md | 0 .../shareable-configuration.md | 0 docs/{02-extending => extending}/README.md | 0 .../plugins-list.md | 0 .../shareable-configurations-list.md | 0 docs/{03-recipes => recipes}/README.md | 0 .../ci-configurations.md} | 0 .../circleci-workflows.md | 8 +- .../git-auth-ssh-keys.md | 2 +- .../git-hosted-services.md | 0 docs/{03-recipes => recipes}/gitlab-ci.md | 8 +- .../package-managers-and-languages.md | 0 docs/{03-recipes => recipes}/travis.md | 12 +- docs/{05-support => support}/FAQ.md | 38 ++-- docs/{05-support => support}/README.md | 0 .../node-support-policy.md | 0 docs/{05-support => support}/node-version.md | 2 +- docs/{05-support => support}/resources.md | 0 .../troubleshooting.md | 0 docs/{01-usage => usage}/README.md | 0 docs/{01-usage => usage}/ci-configuration.md | 40 +--- docs/{01-usage => usage}/configuration.md | 183 ++++++------------ docs/usage/getting-started.md | 22 +++ docs/usage/installation.md | 29 +++ docs/{01-usage => usage}/plugins.md | 47 +++-- .../shareable-configurations.md | 2 +- 34 files changed, 250 insertions(+), 350 deletions(-) delete mode 100644 docs/01-usage/getting-started.md delete mode 100644 docs/01-usage/installation.md rename docs/{04-developer-guide => developer-guide}/README.md (100%) rename docs/{04-developer-guide => developer-guide}/js-api.md (96%) rename docs/{04-developer-guide => developer-guide}/plugin.md (100%) rename docs/{04-developer-guide => developer-guide}/shareable-configuration.md (100%) rename docs/{02-extending => extending}/README.md (100%) rename docs/{02-extending => extending}/plugins-list.md (100%) rename docs/{02-extending => extending}/shareable-configurations-list.md (100%) rename docs/{03-recipes => recipes}/README.md (100%) rename docs/{03-recipes/ci-configurations-recipes.md => recipes/ci-configurations.md} (100%) rename docs/{03-recipes => recipes}/circleci-workflows.md (75%) rename docs/{03-recipes => recipes}/git-auth-ssh-keys.md (93%) rename docs/{03-recipes => recipes}/git-hosted-services.md (100%) rename docs/{03-recipes => recipes}/gitlab-ci.md (68%) rename docs/{03-recipes => recipes}/package-managers-and-languages.md (100%) rename docs/{03-recipes => recipes}/travis.md (81%) rename docs/{05-support => support}/FAQ.md (84%) rename docs/{05-support => support}/README.md (100%) rename docs/{05-support => support}/node-support-policy.md (100%) rename docs/{05-support => support}/node-version.md (91%) rename docs/{05-support => support}/resources.md (100%) rename docs/{05-support => support}/troubleshooting.md (100%) rename docs/{01-usage => usage}/README.md (100%) rename docs/{01-usage => usage}/ci-configuration.md (52%) rename docs/{01-usage => usage}/configuration.md (51%) create mode 100644 docs/usage/getting-started.md create mode 100644 docs/usage/installation.md rename docs/{01-usage => usage}/plugins.md (70%) rename docs/{01-usage => usage}/shareable-configurations.md (78%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e075f621..7c9367a3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ Help us keep **semantic-release** open and inclusive. Please read and follow our ### Improve documentation -As a **semantic-release** user, you are the perfect candidate to help us improve our documentation: typo corrections, clarifications, more examples, new [recipes](docs/03-recipes/README.md), etc. Take a look at the [documentation issues that need help](https://github.com/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+user%3Asemantic-release+archived%3Afalse+label%3A%22help+wanted%22+label%3Adocs+). +As a **semantic-release** user, you are the perfect candidate to help us improve our documentation: typo corrections, clarifications, more examples, new [recipes](docs/recipes/README.md), etc. Take a look at the [documentation issues that need help](https://github.com/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+user%3Asemantic-release+archived%3Afalse+label%3A%22help+wanted%22+label%3Adocs+). Please follow the [Documentation guidelines](#documentation). @@ -37,7 +37,7 @@ Confirmed bugs and ready-to-implement features are marked with the [help wanted ## Using the issue tracker -The issue tracker is the channel for [bug reports](#bug-report), [features requests](#feature-request) and [submitting pull requests](#submitting-a-pull-request) only. Please use the [Support](docs/05-support/README.md) and [Get help](README.md#get-help) sections for support, troubleshooting and questions. +The issue tracker is the channel for [bug reports](#bug-report), [features requests](#feature-request) and [submitting pull requests](#submitting-a-pull-request) only. Please use the [Support](docs/support/README.md) and [Get help](README.md#get-help) sections for support, troubleshooting and questions. Before opening an issue or a Pull Request, please use the [GitHub issue search](https://github.com/issues?utf8=%E2%9C%93&q=user%3Asemantic-release) to make sure the bug or feature request hasn't been already reported or fixed. @@ -51,7 +51,7 @@ Feature requests are welcome, but take a moment to find out whether your idea fi ### New plugin request -[Plugins](docs/01-usage/plugins.md) are a great way to extend **semantic-release** capabilities, integrate with other systems and support new project type. Please provide as much detail and context as possible and fill the information requested in the [New plugin request template](https://github.com/semantic-release/semantic-release/issues/new?template=plugin-request.md). +[Plugins](docs/usage/plugins.md) are a great way to extend **semantic-release** capabilities, integrate with other systems and support new project type. Please provide as much detail and context as possible and fill the information requested in the [New plugin request template](https://github.com/semantic-release/semantic-release/issues/new?template=plugin-request.md). ## Submitting a Pull Request diff --git a/README.md b/README.md index aeccdf91..de9807ec 100644 --- a/README.md +++ b/README.md @@ -39,10 +39,10 @@ This removes the immediate connection between human emotions and version numbers - New features and fixes are immediately available to users - Notify maintainers and users of new releases - Use formalized commit message convention to document changes in the codebase -- Integrate with your [continuous integration workflow](docs/03-recipes/README.md#ci-configurations) +- Integrate with your [continuous integration workflow](docs/recipes/README.md#ci-configurations) - Avoid potential errors associated with manual releases -- Support any [package managers and languages](docs/03-recipes/README.md#package-managers-and-languages) via [plugins](docs/01-usage/plugins.md) -- Simple and reusable configuration via [shareable configurations](docs/01-usage/shareable-configurations.md) +- Support any [package managers and languages](docs/recipes/README.md#package-managers-and-languages) via [plugins](docs/usage/plugins.md) +- Simple and reusable configuration via [shareable configurations](docs/usage/shareable-configurations.md) ## How does it work? @@ -50,7 +50,7 @@ This removes the immediate connection between human emotions and version numbers **semantic-release** uses the commit messages to determine the type of changes in the codebase. Following formalized conventions for commit messages, **semantic-release** automatically determines the next [semantic version](https://semver.org) number, generates a changelog and publishes the release. -By default **semantic-release** uses [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). The commit message format can be changed with the [`preset` or `config` options](docs/01-usage/configuration.md#options) of the [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer#options) and [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator#options) plugins. +By default **semantic-release** uses [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). The commit message format can be changed with the [`preset` or `config` options](docs/usage/configuration.md#options) of the [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer#options) and [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator#options) plugins. Tools such as [commitizen](https://github.com/commitizen/cz-cli), [commitlint](https://github.com/conventional-changelog/commitlint) or [semantic-git-commit-cli](https://github.com/JPeer264/node-semantic-git-commit-cli) can be used to help contributors and enforce valid commit messages. @@ -78,48 +78,48 @@ If you need more control over the timing of releases you have a couple of option After running the tests, the command `semantic-release` will execute the following steps: -| Step | Step Hook | Description | -|-------------------|----------------------|---------------------------------------------------------------------------------------------------------------------------------| -| Verify Conditions | `verifyConditions` | Verify all the conditions to proceed with the release. | -| Get last release | N/A | Obtain the commit corresponding to the last release by analyzing [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging). | -| Analyze commits | N/A | Determine the type of release based on the commits added since the last release. | -| Verify release | `verifyRelease` | Verify the release conformity. | -| Generate notes | `generateNotes` | Generate release notes for the commits added since the last release. | -| Create Git tag | N/A | Create a Git tag corresponding to the new release version. | -| Prepare | `prepare` | Prepare the release. | -| Publish | `publish` | Publish the release. | -| Notify | `success`, `failure` | Notify of new releases or errors. | +| Step | Description | +|-------------------|---------------------------------------------------------------------------------------------------------------------------------| +| Verify Conditions | Verify all the conditions to proceed with the release. | +| Get last release | Obtain the commit corresponding to the last release by analyzing [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging). | +| Analyze commits | Determine the type of release based on the commits added since the last release. | +| Verify release | Verify the release conformity. | +| Generate notes | Generate release notes for the commits added since the last release. | +| Create Git tag | Create a Git tag corresponding to the new release version. | +| Prepare | Prepare the release. | +| Publish | Publish the release. | +| Notify | Notify of new releases or errors. | ## Documentation - Usage - - [Getting started](docs/01-usage/01-getting-started.md) - - [Installation](docs/01-usage/installation.md#installation) - - [CI Configuration](docs/01-usage/ci-configuration.md#ci-configuration) - - [Configuration](docs/01-usage/configuration.md#configuration) - - [Plugins](docs/01-usage/plugins.md) - - [Shareable configurations](docs/01-usage/shareable-configurations.md) + - [Getting started](docs/usage/getting-started.md) + - [Installation](docs/usage/installation.md#installation) + - [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) + - [Configuration](docs/usage/configuration.md#configuration) + - [Plugins](docs/usage/plugins.md) + - [Shareable configurations](docs/usage/shareable-configurations.md) - Extending - - [Plugins](docs/02-extending/plugins-list.md) - - [Shareable configuration](docs/02-extending/shareable-configurations-list.md) + - [Plugins](docs/extending/plugins-list.md) + - [Shareable configuration](docs/extending/shareable-configurations-list.md) - Recipes - - [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) - - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) - - [Travis CI](docs/03-recipes/travis.md) - - [GitLab CI](docs/03-recipes/gitlab-ci.md) - - [Git hosted services](docs/03-recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) - - [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) + - [CI configurations](docs/recipes/ci-configurations.md) + - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) + - [Travis CI](docs/recipes/travis.md) + - [GitLab CI](docs/recipes/gitlab-ci.md) + - [Git hosted services](docs/recipes/git-hosted-services.md) + - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) + - [Package managers and languages](docs/recipes/package-managers-and-languages.md) - Developer guide - - [JavaScript API](docs/04-developer-guide/js-api.md) - - [Plugin development](docs/04-developer-guide/plugin.md) - - [Shareable configuration development](docs/04-developer-guide/shareable-configuration.md) + - [JavaScript API](docs/developer-guide/js-api.md) + - [Plugin development](docs/developer-guide/plugin.md) + - [Shareable configuration development](docs/developer-guide/shareable-configuration.md) - Support - - [Resources](docs/05-support/resources.md) - - [Frequently Asked Questions](docs/05-support/FAQ.md) - - [Troubleshooting](docs/05-support/troubleshooting.md) - - [Node version requirement](docs/05-support/node-version.md) - - [Node Support Policy](docs/05-support/node-support-policy.md) + - [Resources](docs/support/resources.md) + - [Frequently Asked Questions](docs/support/FAQ.md) + - [Troubleshooting](docs/support/troubleshooting.md) + - [Node version requirement](docs/support/node-version.md) + - [Node Support Policy](docs/support/node-support-policy.md) ## Get help diff --git a/SUMMARY.md b/SUMMARY.md index 74e4089e..c6597ab5 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,34 +1,34 @@ # Summary ## Usage -- [Getting started](docs/01-usage/getting-started.md) -- [Installation](docs/01-usage/installation.md#installation) -- [CI Configuration](docs/01-usage/ci-configuration.md#ci-configuration) -- [Configuration](docs/01-usage/configuration.md#configuration) -- [Plugins](docs/01-usage/plugins.md) -- [Shareable configurations](docs/01-usage/shareable-configurations.md) +- [Getting started](docs/usage/getting-started.md) +- [Installation](docs/usage/installation.md#installation) +- [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) +- [Configuration](docs/usage/configuration.md#configuration) +- [Plugins](docs/usage/plugins.md) +- [Shareable configurations](docs/usage/shareable-configurations.md) -## Extensions -- [Plugins](docs/02-extending/plugins-list.md) -- [Shareable configuration](docs/02-extending/shareable-configurations-list.md) +## Extending +- [Plugins](docs/extending/plugins-list.md) +- [Shareable configuration](docs/extending/shareable-configurations-list.md) ## Recipes -- [CI pipelines recipes](docs/03-recipes/ci-pipelines-recipes.md) - - [CircleCI 2.0 workflows](docs/03-recipes/circleci-workflows.md) - - [Travis CI](docs/03-recipes/travis.md) - - [GitLab CI](docs/03-recipes/gitlab-ci.md) -- [Git hosted services](docs/03-recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/03-recipes/git-auth-ssh-keys.md) -- [Package managers and languages](docs/03-recipes/package-managers-and-languages.md) +- [CI configurations](docs/recipes/ci-configurations.md) + - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) + - [Travis CI](docs/recipes/travis.md) + - [GitLab CI](docs/recipes/gitlab-ci.md) +- [Git hosted services](docs/recipes/git-hosted-services.md) + - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) +- [Package managers and languages](docs/recipes/package-managers-and-languages.md) ## Developer guide -- [JavaScript API](docs/04-developer-guide/js-api.md) -- [Plugin development](docs/04-developer-guide/plugin.md) -- [Shareable configuration development](docs/04-developer-guide/shareable-configuration.md) +- [JavaScript API](docs/developer-guide/js-api.md) +- [Plugin development](docs/developer-guide/plugin.md) +- [Shareable configuration development](docs/developer-guide/shareable-configuration.md) ## Support -- [Resources](docs/05-support/resources.md) -- [Frequently Asked Questions](docs/05-support/FAQ.md) -- [Troubleshooting](docs/05-support/troubleshooting.md) -- [Node version requirement](docs/05-support/node-version.md) -- [Node Support Policy](docs/05-support/node-support-policy.md) +- [Resources](docs/support/resources.md) +- [Frequently Asked Questions](docs/support/FAQ.md) +- [Troubleshooting](docs/support/troubleshooting.md) +- [Node version requirement](docs/support/node-version.md) +- [Node Support Policy](docs/support/node-support-policy.md) diff --git a/docs/01-usage/getting-started.md b/docs/01-usage/getting-started.md deleted file mode 100644 index 26e5a8ad..00000000 --- a/docs/01-usage/getting-started.md +++ /dev/null @@ -1,32 +0,0 @@ -# Getting started - -## Manual setup - -You can use **semantic-release** with the following manual setup steps: - -1. [Install **semantic-release**](installation.md) either locally for your project or globally -1. Configure: - 1. Your Continuous Integration service to [run **semantic-release**](ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) - 1. Your Git repository and package manager repository [authentication](ci-configuration.md#authentication) in your Continuous Integration service - 1. **semantic-release**'s [options and plugins](configuration.md) - -## Guided setup through `semantic-release-cli` -Alternatively you can be guided through those setup steps thanks to the [interactive CLI `semantic-release-cli`](https://github.com/semantic-release/cli). - -First install `semantic-release-cli`: -```bash -$ npm install -g semantic-release-cli -``` - -Then go to your project's directory and run the command: -```bash -$ cd your-module -$ semantic-release-cli setup -``` -The output looks something like this: - -![dialogue](../../media/semantic-release-cli.png) - -Available options and other information can be found on [`semantic-release-cli`'s doc](https://github.com/semantic-release/cli#semantic-release-cli). - -> **Note**: only a limited number of options, CI services and plugins are currently supported by `semantic-release-cli`. diff --git a/docs/01-usage/installation.md b/docs/01-usage/installation.md deleted file mode 100644 index 64c27260..00000000 --- a/docs/01-usage/installation.md +++ /dev/null @@ -1,29 +0,0 @@ -# Installation - -## Local installation - -For [Node modules projects](https://docs.npmjs.com/getting-started/creating-node-modules) we recommend installing **semantic-release** locally and running the `semantic-release` command with [npx](https://www.npmjs.com/package/npx): - -```bash -$ npm install --save-dev semantic-release -``` - -Then in the CI environment: - -```bash -$ npx semantic-release -``` - -> **Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently find the semantic-release binary and to execute it. See [What is npx](../05-support/FAQ.md#what-is-npx) for more details. - -## Global installation - -For other type of projects we recommend installing **semantic-release** directly in the CI environment, also with [npx](https://www.npmjs.com/package/npx): - -```bash -$ npx semantic-release -``` - -> **Note:** For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`, or `npm install -g semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. - -> **Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../05-support/FAQ.md#what-is-npx) for more details. diff --git a/docs/README.md b/docs/README.md index abc9b8ee..a5b4380e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ # semantic-release documentation -- [Usage](01-usage/README.md) - **semantic-release** installation and configuration -- [Extending](02-extending/README.md)- Extending **semantic-release** with plugins and shareable configurations -- [Recipes](03-recipes/README.md) - Community written recipes for common **semantic-release** use-cases -- [Developer Guide](04-developer-guide/README.md) - The essentials of writing a **semantic-release** plugin or shareable configurations -- [Support](05-support/README.md) - FAQ and troubleshooting +- [Usage](usage/README.md) - **semantic-release** installation and configuration +- [Extending](extending/README.md)- Extending **semantic-release** with plugins and shareable configurations +- [Recipes](recipes/README.md) - Community written recipes for common **semantic-release** use-cases +- [Developer Guide](developer-guide/README.md) - The essentials of writing a **semantic-release** plugin or shareable configurations +- [Support](support/README.md) - FAQ and troubleshooting diff --git a/docs/04-developer-guide/README.md b/docs/developer-guide/README.md similarity index 100% rename from docs/04-developer-guide/README.md rename to docs/developer-guide/README.md diff --git a/docs/04-developer-guide/js-api.md b/docs/developer-guide/js-api.md similarity index 96% rename from docs/04-developer-guide/js-api.md rename to docs/developer-guide/js-api.md index cf362ab9..33b04175 100644 --- a/docs/04-developer-guide/js-api.md +++ b/docs/developer-guide/js-api.md @@ -65,9 +65,9 @@ Type: `Object` **semantic-release** options. -Can be used to set any [core option](../01-usage/configuration.md#configuration) or [plugin options](../01-usage/plugins.md#configuration). +Can be used to set any [core option](../usage/configuration.md#configuration) or [plugin options](../usage/plugins.md#configuration). -Each option, will take precedence over options configured in the [configuration file](../01-usage/configuration.md#configuration) and [shareable configurations](../01-usage/configuration.md#extends). +Each option, will take precedence over options configured in the [configuration file](../usage/configuration.md#configuration) and [shareable configurations](../usage/configuration.md#extends). #### config @@ -229,7 +229,7 @@ Example: Type: `Array` -The list of releases published, one release per [publish plugin](../01-usage/plugins.md#publish-plugin).
+The list of releases published, one release per [publish plugin](../usage/plugins.md#publish-plugin).
Each release object has the following properties: | Name | Type | Description | diff --git a/docs/04-developer-guide/plugin.md b/docs/developer-guide/plugin.md similarity index 100% rename from docs/04-developer-guide/plugin.md rename to docs/developer-guide/plugin.md diff --git a/docs/04-developer-guide/shareable-configuration.md b/docs/developer-guide/shareable-configuration.md similarity index 100% rename from docs/04-developer-guide/shareable-configuration.md rename to docs/developer-guide/shareable-configuration.md diff --git a/docs/02-extending/README.md b/docs/extending/README.md similarity index 100% rename from docs/02-extending/README.md rename to docs/extending/README.md diff --git a/docs/02-extending/plugins-list.md b/docs/extending/plugins-list.md similarity index 100% rename from docs/02-extending/plugins-list.md rename to docs/extending/plugins-list.md diff --git a/docs/02-extending/shareable-configurations-list.md b/docs/extending/shareable-configurations-list.md similarity index 100% rename from docs/02-extending/shareable-configurations-list.md rename to docs/extending/shareable-configurations-list.md diff --git a/docs/03-recipes/README.md b/docs/recipes/README.md similarity index 100% rename from docs/03-recipes/README.md rename to docs/recipes/README.md diff --git a/docs/03-recipes/ci-configurations-recipes.md b/docs/recipes/ci-configurations.md similarity index 100% rename from docs/03-recipes/ci-configurations-recipes.md rename to docs/recipes/ci-configurations.md diff --git a/docs/03-recipes/circleci-workflows.md b/docs/recipes/circleci-workflows.md similarity index 75% rename from docs/03-recipes/circleci-workflows.md rename to docs/recipes/circleci-workflows.md index 8c2aefc7..a83a2a31 100644 --- a/docs/03-recipes/circleci-workflows.md +++ b/docs/recipes/circleci-workflows.md @@ -2,9 +2,9 @@ ## Environment variables -The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [CircleCi Project Settings](https://circleci.com/docs/2.0/env-vars/#adding-environment-variables-in-the-app).. +The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured in [CircleCi Project Settings](https://circleci.com/docs/2.0/env-vars/#adding-environment-variables-in-the-app).. -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/getting-started.md#getting-started). ## Multiple Node jobs configuration @@ -12,7 +12,7 @@ Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [CircleCI documentation](https://circleci.com/docs/2.0) for additional configuration options. -This example create the workflows `test_node_4`, `test_node_6`, `test_node_8` and `release`. The release workflows will [run `semantic-release` only after the all the `test_node_*` are successful](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +This example create the workflows `test_node_4`, `test_node_6`, `test_node_8` and `release`. The release workflows will [run `semantic-release` only after the all the `test_node_*` are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). ```yaml version: 2 @@ -54,7 +54,7 @@ workflows: ### `package.json` configuration for multiple Node jobs -A `package.json` is required only for [local](../01-usage/installation.md#local-installation) **semantic-release** installation. +A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. ```json { diff --git a/docs/03-recipes/git-auth-ssh-keys.md b/docs/recipes/git-auth-ssh-keys.md similarity index 93% rename from docs/03-recipes/git-auth-ssh-keys.md rename to docs/recipes/git-auth-ssh-keys.md index 1365f2b4..f346d802 100644 --- a/docs/03-recipes/git-auth-ssh-keys.md +++ b/docs/recipes/git-auth-ssh-keys.md @@ -1,6 +1,6 @@ # Git authentication with SSH keys -When using [environment variables](../01-usage/ci-configuration.md#authentication) to set up the Git authentication, the remote Git repository will automatically be accessed via [https](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols#_the_http_protocols), independently of the [`repositoryUrl`](../01-usage/configuration.md#repositoryurl) format configured in the **semantic-release** [Configuration](../01-usage/configuration.md#configuration) (the format will be automatically converted as needed). +When using [environment variables](../usage/ci-configuration.md#authentication) to set up the Git authentication, the remote Git repository will automatically be accessed via [https](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols#_the_http_protocols), independently of the [`repositoryUrl`](../usage/configuration.md#repositoryurl) format configured in the **semantic-release** [Configuration](../usage/configuration.md#configuration) (the format will be automatically converted as needed). Alternatively the Git repository can be accessed via [SSH](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols#_the_ssh_protocol) by creating SSH keys, adding the public one to your Git hosted account and making the private one available on the CI environment. diff --git a/docs/03-recipes/git-hosted-services.md b/docs/recipes/git-hosted-services.md similarity index 100% rename from docs/03-recipes/git-hosted-services.md rename to docs/recipes/git-hosted-services.md diff --git a/docs/03-recipes/gitlab-ci.md b/docs/recipes/gitlab-ci.md similarity index 68% rename from docs/03-recipes/gitlab-ci.md rename to docs/recipes/gitlab-ci.md index 349937f0..6671ecef 100644 --- a/docs/03-recipes/gitlab-ci.md +++ b/docs/recipes/gitlab-ci.md @@ -2,19 +2,19 @@ ## Environment variables -The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured with [Secret variables](https://docs.gitlab.com/ce/ci/variables/README.html#secret-variables). +The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured with [Secret variables](https://docs.gitlab.com/ce/ci/variables/README.html#secret-variables). ## Node project configuration GitLab CI supports [Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html) allowing to test on multiple Node versions and publishing a release only when all test pass. -**Note**: The publish pipeline must run a [Node >= 8 version](../05-support/FAQ.md#why-does-semantic-release-require-node-version--83). +**Note**: The publish pipeline must run a [Node >= 8 version](../support/FAQ.md#why-does-semantic-release-require-node-version--83). ### `.gitlab-ci.yml` configuration for Node projects This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [GitLab CI - Configuration of your jobs with .gitlab-ci.yml](https://docs.gitlab.com/ee/ci/yaml/README.html) for additional configuration options. -**Note**: The`semantic-release` execution command varies depending if you are using a [local](../01-usage/installation.md#local-installation) or [global](../01-usage/installation.md#global-installation) **semantic-release** installation. +**Note**: The`semantic-release` execution command varies depending if you are using a [local](../usage/installation.md#local-installation) or [global](../usage/installation.md#global-installation) **semantic-release** installation. ```yaml # The release pipeline will run only if all jobs in the test pipeline are successful @@ -46,7 +46,7 @@ publish: ### `package.json` configuration -A `package.json` is required only for [local](../01-usage/installation.md#local-installation) **semantic-release** installation. +A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. ```json { diff --git a/docs/03-recipes/package-managers-and-languages.md b/docs/recipes/package-managers-and-languages.md similarity index 100% rename from docs/03-recipes/package-managers-and-languages.md rename to docs/recipes/package-managers-and-languages.md diff --git a/docs/03-recipes/travis.md b/docs/recipes/travis.md similarity index 81% rename from docs/03-recipes/travis.md rename to docs/recipes/travis.md index adbe8280..02ac8356 100644 --- a/docs/03-recipes/travis.md +++ b/docs/recipes/travis.md @@ -2,9 +2,9 @@ ## Environment variables -The [Authentication](../01-usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). +The [Authentication](../usage/ci-configuration.md#authentication) environment variables can be configured in [Travis Repository Settings](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-Settings) or with the [travis env set CLI](https://github.com/travis-ci/travis.rb#env). -Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../01-usage/01-getting-started.md#getting-started). +Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with semantic-release-cli](../usage/getting-started.md#getting-started). ## Node.js projects configuration @@ -12,7 +12,7 @@ Alternatively, the default `NPM_TOKEN` and `GH_TOKEN` can be easily [setup with This example is a minimal configuration for **semantic-release** with a build running Node 6 and 8. See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. -This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. @@ -43,7 +43,7 @@ jobs: ### `package.json` configuration for multiple Node jobs -A `package.json` is required only for [local](../01-usage/installation.md#local-installation) **semantic-release** installation. +A `package.json` is required only for [local](../usage/installation.md#local-installation) **semantic-release** installation. ```json { @@ -57,13 +57,13 @@ A `package.json` is required only for [local](../01-usage/installation.md#local- For projects that require to be tested with one or multiple version of a Non-JavaScript [language](https://docs.travis-ci.com/user/languages), optionally on multiple [Operating Systems](https://docs.travis-ci.com/user/multi-os). -This recipe cover the Travis specifics only. See [Non JavaScript projects recipe](../05-support/FAQ.md#can-i-use-semantic-release-to-publish-non-javascript-packages) for more information on the **semantic-release** configuration. +This recipe cover the Travis specifics only. See [Non JavaScript projects recipe](../support/FAQ.md#can-i-use-semantic-release-to-publish-non-javascript-packages) for more information on the **semantic-release** configuration. ### `.travis.yml` configuration for non-JavaScript projects This example is a minimal configuration for **semantic-release** with a build running [Go 1.6 and 1.7](https://docs.travis-ci.com/user/languages/go). See [Travis - Customizing the Build](https://docs.travis-ci.com/user/customizing-the-build) for additional configuration options. -This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +This example creates a `release` [build stage](https://docs.travis-ci.com/user/build-stages) that [runs `semantic-release` only after all test jobs are successful](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). It's recommended to run the `semantic-release` command in the [Travis `deploy` step](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle) so if an error occurs the build will fail and Travis will send a notification. diff --git a/docs/05-support/FAQ.md b/docs/support/FAQ.md similarity index 84% rename from docs/05-support/FAQ.md rename to docs/support/FAQ.md index 4b2faed8..f323443e 100644 --- a/docs/05-support/FAQ.md +++ b/docs/support/FAQ.md @@ -34,11 +34,11 @@ If using npm hook scripts is not possible, and alternative solution is to [`@sem ## Is there a way to preview which version would currently get published? -Yes with the [dry-run options](../01-usage/configuration.md#dryrun) which prints to the console the next version to be published and the release notes. +Yes with the [dry-run options](../usage/configuration.md#dryrun) which prints to the console the next version to be published and the release notes. ## Can I use semantic-release with Yarn? -If you are using a [local](../01-usage/installation.md#local-installation) **semantic-release** installation and run multiple CI jobs with different versions, the `yarn install` command will fail on jobs running with Node < 8 as **semantic-release** requires [Node >= 8.3](#why-does-semantic-release-require-node-version--83) and specifies it in its `package.json`s [`engines`](https://docs.npmjs.com/files/package.json#engines) key. +If you are using a [local](../usage/installation.md#local-installation) **semantic-release** installation and run multiple CI jobs with different versions, the `yarn install` command will fail on jobs running with Node < 8 as **semantic-release** requires [Node >= 8.3](#why-does-semantic-release-require-node-version--83) and specifies it in its `package.json`s [`engines`](https://docs.npmjs.com/files/package.json#engines) key. The recommended solution is to use the [Yarn](https://yarnpkg.com) [--ignore-engines](https://yarnpkg.com/en/docs/cli/install#toc-yarn-install-ignore-engines) option to install the project dependencies on the CI environment, so Yarn will ignore the **semantic-release**'s `engines` key: @@ -48,7 +48,7 @@ $ yarn install --ignore-engines **Note**: Several CI services use Yarn by default if your repository contains a `yarn.lock` file. So you should override the install step to specify `yarn install --ignore-engines`. -Alternatively you can use a [global](../01-usage/installation.md#global-installation) **semantic-release** installation and make sure to install and run the `semantic-release` command only in a CI jobs running with Node >= 8.3. +Alternatively you can use a [global](../usage/installation.md#global-installation) **semantic-release** installation and make sure to install and run the `semantic-release` command only in a CI jobs running with Node >= 8.3. If your CI environment provides [nvm](https://github.com/creationix/nvm) you can switch to Node 8 before installing and running the `semantic-release` command: @@ -56,14 +56,14 @@ If your CI environment provides [nvm](https://github.com/creationix/nvm) you can $ nvm install 8 && yarn global add semantic-release && semantic-release ``` -See the [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. As `semantic-release` is recommended to be executed with [`npx`](https://www.npmjs.com/package/npx) an alternative is required for usage with Yarn. Even though it is possible to install npx with Yarn, it's not recommended. Yarn and npx would be using different cache locations. -For [local installation](../01-usage/installation.md#local-installation) replace +For [local installation](../usage/installation.md#local-installation) replace `npx semantic-release` with `yarn run semantic-release`. -For [global installation](../01-usage/installation.md#global-installation) replace +For [global installation](../usage/installation.md#global-installation) replace `npx semantic-release` with `yarn global add semantic-release && semantic-release`. ## Can I use semantic-release to publish non-JavaScript packages? @@ -71,13 +71,13 @@ For [global installation](../01-usage/installation.md#global-installation) repla Yes, **semantic-release** is a Node CLI application but it can be used to publish any type of packages. To publish a non-Node package (without a `package.json`) you would need to: -- Use a [global](../01-usage/installation.md#global-installation) **semantic-release** installation -- Set **semantic-release** [options](../01-usage/configuration.md#options) via [CLI arguments or rc file](../01-usage/configuration.md#configuration) +- Use a [global](../usage/installation.md#global-installation) **semantic-release** installation +- Set **semantic-release** [options](../usage/configuration.md#options) via [CLI arguments or rc file](../usage/configuration.md#configuration) - Make sure your CI job executing the `semantic-release` command has access to [Node >= 8](#why-does-semantic-release-require-node-version--83) to execute the `semantic-release` command -See the [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. -In addition you will need to configure the **semantic-release** [plugins](../01-usage/plugins.md#plugins) to disable the [`@semantic-release/npm`](https://github.com/semantic-release/npm) plugin which is used by default and use a plugin for your project type. +In addition you will need to configure the **semantic-release** [plugins](../usage/plugins.md#plugins) to disable the [`@semantic-release/npm`](https://github.com/semantic-release/npm) plugin which is used by default and use a plugin for your project type. If there is no specific plugin for your project type you can use the [`@semantic-release/exec`](https://github.com/semantic-release/exec) plugin to publish the release with a shell command. @@ -99,19 +99,19 @@ Here is a basic example to create [GitHub releases](https://help.github.com/arti **Note**: This is a theoretical example where the command `set-version` update the project version with the value passed as its first argument and `publish-package` publishes the package to a registry. -See the [package managers and languages recipes](../03-recipes/README.md#package-managers-and-languages) for more details on specific project types. +See the [package managers and languages recipes](../recipes/README.md#package-managers-and-languages) for more details on specific project types. ## Can I use semantic-release with any CI service? Yes, **semantic-release** can be used with any CI service, as long as it provides: -- A way to set [authentication](../01-usage/ci-configuration.md#authentication) via environment variables -- A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) +- A way to set [authentication](../usage/ci-configuration.md#authentication) via environment variables +- A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) -See the [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. ## Can I run semantic-release on my local machine rather than on a CI server? -Yes, you can by explicitly setting the [`--no-ci` CLI option](../01-usage/configuration.md#ci) option. You will also have to set the required [authentication](../01-usage/ci-configuration.md#authentication) via environment variables on your local machine, for example: +Yes, you can by explicitly setting the [`--no-ci` CLI option](../usage/configuration.md#ci) option. You will also have to set the required [authentication](../usage/ci-configuration.md#authentication) via environment variables on your local machine, for example: ```bash $ NPM_TOKEN= GH_TOKEN= npx semantic-release --no-ci @@ -123,11 +123,11 @@ However this is not the recommended approach, as running unit and integration te Yes, with the [`@semantic-release/gitlab-config`](https://github.com/semantic-release/gitlab-config) shareable configuration. -See the [GitLab CI recipes](../03-recipes/gitlab-ci.md#using-semantic-release-with-gitlab-ci) for the CI configuration. +See the [GitLab CI recipes](../recipes/gitlab-ci.md#using-semantic-release-with-gitlab-ci) for the CI configuration. ## Can I use semantic-release with any Git hosted environment? -By default **semantic-release** uses the [`@semantic-release/github`](https://github.com/semantic-release/github) plugin to publish a [GitHub release](https://help.github.com/articles/about-releases). For other Git hosted environment the [`@semantic-release/git`](https://github.com/semantic-release/git) and [`@semantic-release/changelog`](https://github.com/semantic-release/changelog) plugins can be used via [plugins configuration](../01-usage/plugins.md). +By default **semantic-release** uses the [`@semantic-release/github`](https://github.com/semantic-release/github) plugin to publish a [GitHub release](https://help.github.com/articles/about-releases). For other Git hosted environment the [`@semantic-release/git`](https://github.com/semantic-release/git) and [`@semantic-release/changelog`](https://github.com/semantic-release/changelog) plugins can be used via [plugins configuration](../usage/plugins.md). See the [`@semantic-release/git`](https://github.com/semantic-release/git#semantic-releasegit) [`@semantic-release/changelog`](https://github.com/semantic-release/changelog#semantic-releasechangelog) plugins documentation for more details. @@ -230,13 +230,13 @@ See [“Introduction to SemVer” - Irina Gebauer](https://blog.greenkeeper.io/i **semantic-release** has a full unit and integration test suite that tests `npm` publishes against the [npm-registry-couchapp](https://github.com/npm/npm-registry-couchapp). -In addition the [verify conditions step](../../README.md#release-steps) verifies that all necessary conditions for proceeding with a release are met, and a new release will be performed [only if all your tests pass](../01-usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). +In addition the [verify conditions step](../../README.md#release-steps) verifies that all necessary conditions for proceeding with a release are met, and a new release will be performed [only if all your tests pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). ## Why does semantic-release require Node version >= 8.3? **semantic-release** is written using the latest [ECMAScript 2017](https://www.ecma-international.org/publications/standards/Ecma-262.htm) features, without transpilation which **requires Node version 8.3 or higher**. -See [Node version requirement](/node-version.md#node-version-requirement) for more details and solutions. +See [Node version requirement](../support/node-version.md#node-version-requirement) for more details and solutions. ## What is npx? diff --git a/docs/05-support/README.md b/docs/support/README.md similarity index 100% rename from docs/05-support/README.md rename to docs/support/README.md diff --git a/docs/05-support/node-support-policy.md b/docs/support/node-support-policy.md similarity index 100% rename from docs/05-support/node-support-policy.md rename to docs/support/node-support-policy.md diff --git a/docs/05-support/node-version.md b/docs/support/node-version.md similarity index 91% rename from docs/05-support/node-version.md rename to docs/support/node-version.md index 31f84770..e387685b 100644 --- a/docs/05-support/node-version.md +++ b/docs/support/node-version.md @@ -12,7 +12,7 @@ See our [Node Support Policy](node-support-policy.md) for our long-term promise The recommended approach is to run the `semantic-release` command from a CI job running on Node 8.3 or higher. This can either be a job used by your project to test on Node >= 8.3 or a dedicated job for the release steps. -See [CI configuration](../01-usage/ci-configuration.md) and [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details. +See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/ci-configurations.md) for more details. ## Alternative solutions diff --git a/docs/05-support/resources.md b/docs/support/resources.md similarity index 100% rename from docs/05-support/resources.md rename to docs/support/resources.md diff --git a/docs/05-support/troubleshooting.md b/docs/support/troubleshooting.md similarity index 100% rename from docs/05-support/troubleshooting.md rename to docs/support/troubleshooting.md diff --git a/docs/01-usage/README.md b/docs/usage/README.md similarity index 100% rename from docs/01-usage/README.md rename to docs/usage/README.md diff --git a/docs/01-usage/ci-configuration.md b/docs/usage/ci-configuration.md similarity index 52% rename from docs/01-usage/ci-configuration.md rename to docs/usage/ci-configuration.md index da872f5f..036d287b 100644 --- a/docs/01-usage/ci-configuration.md +++ b/docs/usage/ci-configuration.md @@ -1,29 +1,14 @@ # CI configuration -## Running `semantic-release` +## Run `semantic-release` only after all tests succeeded -The `semantic-release` command will only run fully in a CI environment. If it does not detect that it is in a CI environment, it will automatically run in `dry-run` mode. - -Within a CI environment, the `semantic-release` command must be executed only after all the tests in the CI build pass, otherwise it will release potentially faulty code. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. +The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. This can be achieved with [Travis Build Stages](https://docs.travis-ci.com/user/build-stages), [CircleCI Workflows](https://circleci.com/docs/2.0/workflows), [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines), [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs), [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines), [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) or [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). -Follow the CI system's documentation to find out how to do this: -- [Travis Build Stages](https://docs.travis-ci.com/user/build-stages) -- [CircleCI Workflows](https://circleci.com/docs/2.0/workflows) -- [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines) -- [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs) -- [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines) -- [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) -- [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). - -This documentation provides a few [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details. +See [CI configuration recipes](../recipes/ci-configurations.md) for more details. ## Authentication -### Push access to remote repos - -**semantic-release** requires push access to remote Git repositories in order to push the [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) it created. - -The Git authentication can be set with one of the following environment variables: +**semantic-release** requires push access to the project Git repository in order to create [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging). The Git authentication can be set with one of the following environment variables: | Variable | Description | |---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -32,22 +17,17 @@ The Git authentication can be set with one of the following environment variable | `BB_TOKEN` or `BITBUCKET_TOKEN` | A Bitbucket [personal access token](https://confluence.atlassian.com/bitbucketserver/personal-access-tokens-939515499.html). | | `GIT_CREDENTIALS` | [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding) Git username and password in the format `:`. The username and password must each be individually URL encoded, not the `:` separating them. | -Alternatively the Git authentication **can be set up via [SSH keys](../03-recipes/git-auth-ssh-keys.md)**. +Alternatively the Git authentication can be set up via [SSH keys](../recipes/git-auth-ssh-keys.md). -### Authentication needs for plugins - -Most **semantic-release** [plugins](plugins.md) require setting up authentication in order to publish to a package manager registry. See each plugin's documentation for the environment variables required. - -It is to note, however, that: -- The default [@semantic-release/github](https://github.com/semantic-release/github#environment-variables) plugin requires the same `GH_TOKEN` environment variable as above -- The default [@semantic-release/npm](https://github.com/semantic-release/npm#environment-variables) plugin requires the following environment variables: +Most **semantic-release** [plugins](plugins.md) require setting up authentication in order to publish to a package manager registry. The default [@semantic-release/npm](https://github.com/semantic-release/npm#environment-variables) and [@semantic-release/github](https://github.com/semantic-release/github#environment-variables) plugins require the following environment variables: | Variable | Description | |-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `NPM_TOKEN` | npm token created via [npm token create](https://docs.npmjs.com/getting-started/working_with_tokens#how-to-create-new-tokens).
**Note**: Only the `auth-only` [level of npm two-factor authentication](https://docs.npmjs.com/getting-started/using-two-factor-authentication#levels-of-authentication) is supported. | +| `GH_TOKEN` | GitHub authentication token.
**Note**: Only the [personal token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line) authentication is supported. | See each plugin's documentation for the environment variables required. -> **Note**: The authentication token/credentials have to be made available in the CI service via environment variables. -> -> See [CI pipelines recipes](../03-recipes/ci-pipelines-recipes.md) for more details on how to configure environment variables in your CI service. +The authentication token/credentials have to be made available in the CI service via environment variables. + +See [CI configuration recipes](../recipes/ci-configurations.md) for more details on how to configure environment variables in your CI service. diff --git a/docs/01-usage/configuration.md b/docs/usage/configuration.md similarity index 51% rename from docs/01-usage/configuration.md rename to docs/usage/configuration.md index 23c380d0..8a6da186 100644 --- a/docs/01-usage/configuration.md +++ b/docs/usage/configuration.md @@ -1,93 +1,73 @@ # Configuration **semantic-release** configuration consists of: -- Git repository [url](#repositoryurl) and options ([release branch](#branch) and [tag format](#tagformat)). ([Access credentials](ci-configuration.md) are setup through environment variables) -- Plugins [declaration](#plugins) and [options](plugins.md). -- Run mode ([`--dry-run`](#dryrun), [`--no-ci`](#ci) (local), [`--debug`](#debug)). +- Git repository options ([URL](#repositoryurl), [release branch](#branch) and [tag format](#tagformat)) +- [plugins](#plugins) definition +- run mode ([debug](#debug), [dry run](#dryrun) and [local (no CI)](#ci)) -All of these options can be configured: -- In a config file. -- Through the cli. -- By extending a [shareable configuration](shareable-configurations.md). +All of these options can be configured directly or by extending a [shareable configuration](shareable-configurations.md). Additionally, metadata of Git tags generated by **semantic-release** can be customized via standard [Git environment variables](#git-environment-variables). -## Configuring/passing options to `semantic-release` +## Configuration file -### Configuration file +**semantic-release**’s [options](#options), mode and [plugins](plugins.md) can be set via: +- A `.releaserc` file, written in YAML or JSON, with optional extensions: .`yaml`/`.yml`/`.json`/`.js` +- A `release.config.js` file that exports an object +- A `release` key in the project's `package.json` file -> **Note**: CLI arguments take precedence over options configured in the configuration file and shareable configuration. +Alternatively, some options can be set via CLI arguments. -**semantic-release**’s options, mode and plugins can be set via a config file in different ways: -- A `.releaserc` file, written in YAML or JSON, with optional extensions `.yaml`, `.yml`, `.json` or `.js`. -- A `release.config.js` file that exports an object. -- A `release` key in the project's `package.json` file. +The following three examples are the same. -The following two examples are the same: -- Via `.releaserc` or `release.config.js` file: - ```json - { - "branch": "next" - } - ``` -- Via `release` key in the project's `package.json` file (the configuration must be under the `release` property): - ```json - { - "release": { - "branch": "next" - } - } - ``` +Via `release` key in the project's `package.json` file: -### Using CLI arguments +```json +{ + "release": { + "branch": "next" + } +} +``` +```bash +$ semantic-release +``` -> **Note**: CLI arguments take precedence over options configured in the configuration file and shareable configuration. +Via `.releaserc` file: -Plugin options cannot be defined via CLI arguments and must be defined in the configuration file. +```json +{ + "branch": "next" +} +``` +```bash +$ semantic-release +``` -The following configuration example via CLI argument is equivalent to the configuration file's example: +Via CLI argument: ```bash $ semantic-release --branch next ``` -### Extending a shareable configuration +**Note**: CLI arguments take precedence over options configured in the configuration file. -> **Note**: CLI arguments take precedence over options configured in the configuration file and shareable configuration. +**Note**: Plugin options cannot be defined via CLI arguments and must be defined in the configuration file. -Please see [shareable configuration](shareable-configurations.md) for more details. +**Note**: When configuring via `package.json`, the configuration must be under the `release` property. However, when using a `.releaserc` or a `release.config.js` file, the configuration must be set without a `release` property. ## Options -### `extends` +### extends Type: `Array`, `String`
CLI arguments: `-e`, `--extends` -Contains a list of: -- Modules. -- File paths containing a [shareable configuration](shareable-configurations.md). +List of modules or file paths containing a [shareable configuration](shareable-configurations.md). If multiple shareable configurations are set, they will be imported in the order defined with each configuration option taking precedence over the options defined in a previous shareable configuration. -> **Note**: If multiple shareable configurations are set, they will be imported **in the order defined with each configuration option** taking precedence over the options defined in a previous shareable configuration. +**Note**: Options defined via CLI arguments or in the configuration file will take precedence over the ones defined in any shareable configuration. -Examples (`.releaserc` file content): -- `Array`: - ```json - { - "extends": [ - "./my_config_dir/my.config", - "@semantic-release/gitlab-config", - ] - } - ``` -- `String`: - ```json - { - "extends": "@semantic-release/gitlab-config" - } - ``` - -### `branch` +### branch Type: `String`
Default: `master`
@@ -95,14 +75,7 @@ CLI arguments: `-b`, `--branch` The branch on which releases should happen. -Example (`.releaserc` file content): -```json -{ - "branch": "next" -} -``` - -### `repositoryUrl` +### repositoryUrl Type: `String`
Default: `repository` property in `package.json` or [git origin url](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
@@ -112,14 +85,7 @@ The git repository URL. Any valid git url format is supported (See [Git protocols](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols)). -Example (`.releaserc` file content): -```json -{ - "repositoryUrl": "https://github.com/username/project.git" -} -``` - -### `tagFormat` +### tagFormat Type: `String`
Default: `v${version}`
@@ -127,41 +93,21 @@ CLI arguments: `-t`, `--tag-format` The [Git tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging) format used by **semantic-release** to identify releases. The tag name is generated with [Lodash template](https://lodash.com/docs#template) and will be compiled with the `version` variable. -> **Note**: The `tagFormat` must contain the `version` variable exactly once and compile to a [valid Git reference](https://git-scm.com/docs/git-check-ref-format#_description). +**Note**: The `tagFormat` must contain the `version` variable exactly once and compile to a [valid Git reference](https://git-scm.com/docs/git-check-ref-format#_description). -Example (`.releaserc` file content): -```json -{ - "tagFormat": "version-${version}" -} -``` - -### `plugins` +### plugins Type: `Array`
Default: `['@semantic-release/commit-analyzer', '@semantic-release/release-notes-generator', '@semantic-release/npm', '@semantic-release/github']`
CLI arguments: `-p`, `--plugins` -Define the list of plugins to use. Plugins will run in series, **in the order defined**, for **each [steps](../../README.md#release-steps)** if they implement it. +Define the list of plugins to use. Plugins will run in series, in the order defined, for each [steps](../../README.md#release-steps) if they implement it. -Plugin specific configuration can defined by wrapping the name and an options object in an array. See [Plugins configuration options](plugins.md#plugins-configuration-options) for more details. +Plugins configuration can defined by wrapping the name and an options object in an array. -Example (`.releaserc` file content): -```json -{ - "plugins": [ - "@semantic-release/commit-analyzer", - "@semantic-release/release-notes-generator", - "@semantic-release-docker", - ["@semantic-release/exec", { - "verifyConditionsCmd": "./verify.sh" # plugin configuration - }], - "@semantic-release/git", - "@semantic-release/gitlab", - ] -} -``` -### `dryRun` +See [Plugins configuration](plugins.md#plugins) for more details. + +### dryRun Type: `Boolean`
Default: `false` if running in a CI environment, `true` otherwise
@@ -169,14 +115,7 @@ CLI arguments: `-d`, `--dry-run` Dry-run mode, skip publishing, print next version and release notes. -Example (`.releaserc` file content): -```json -{ - "dryRun": "true" -} -``` - -### `ci` +### ci Type: `Boolean`
Default: `true`
@@ -184,16 +123,9 @@ CLI arguments: `--ci` / `--no-ci` Set to `false` to skip Continuous Integration environment verifications. This allows for making releases from a local machine. -> **Note**: The CLI arguments `--no-ci` is equivalent to `--ci false`. +**Note**: The CLI arguments `--no-ci` is equivalent to `--ci false`. -Example (`.releaserc` file content): -```json -{ - "ci": "false" -} -``` - -### `debug` (only through CLI) +### debug Type: `Boolean`
Default: `false`
@@ -201,12 +133,7 @@ CLI argument: `--debug` Output debugging information. This can also be enabled by setting the `DEBUG` environment variable to `semantic-release:*`. -> **Note**: The `debug` is used only supported via CLI argument. To enable debug mode from the [JS API](../04-developer-guide/js-api.md#javascript-api) use `require('debug').enable('semantic-release:*')`. - -Example: -```bash -$ semantic-release --debug -``` +**Note**: The `debug` is used only supported via CLI argument. To enable debug mode from the [JS API](../developer-guide/js-api.md#javascript-api) use `require('debug').enable('semantic-release:*')`. ## Git environment variables @@ -217,11 +144,9 @@ $ semantic-release --debug | `GIT_COMMITTER_NAME` | The committer name associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot. | | `GIT_COMMITTER_EMAIL` | The committer email associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot email address. | -## Existing version tags, and how semantic-release deals with them +## Existing version tags -**semantic-release** uses [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) to determine the commits added since the last release. - -If a release has been published before setting up **semantic-release** you must make sure the most recent commit included in the last published release is in the [release branch](#branch) history and is tagged with the version released, formatted according to the [tag format](#tagformat) configured (defaults to `vx.y.z`). +**semantic-release** uses [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) to determine the commits added since the last release. If a release has been published before setting up **semantic-release** you must make sure the most recent commit included in the last published release is in the [release branch](#branch) history and is tagged with the version released, formatted according to the [tag format](#tagformat) configured (defaults to `vx.y.z`). If the previous releases were published with [`npm publish`](https://docs.npmjs.com/cli/publish) this should already be the case. diff --git a/docs/usage/getting-started.md b/docs/usage/getting-started.md new file mode 100644 index 00000000..f8bda3bb --- /dev/null +++ b/docs/usage/getting-started.md @@ -0,0 +1,22 @@ +# Getting started + +In order to use **semantic-release** you must follow these steps: +- [Install](./installation.md#installation) **semantic-release** in your project +- Configure your Continuous Integration service to [run **semantic-release**](./ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) +- Configure your Git repository and package manager repository [authentication](ci-configuration.md#authentication) in your Continuous Integration service +- Configure **semantic-release** [options and plugins](./configuration.md#configuration) + +Alternatively those steps can be easily done with the [**semantic-release** interactive CLI](https://github.com/semantic-release/cli): + +```bash +npm install -g semantic-release-cli + +cd your-module +semantic-release-cli setup +``` + +![dialogue](../../media/semantic-release-cli.png) + +See the [semantic-release-cli](https://github.com/semantic-release/cli#what-it-does) documentation for more details. + +**Note**: only a limited number of options, CI services and plugins are currently supported by `semantic-release-cli`. diff --git a/docs/usage/installation.md b/docs/usage/installation.md new file mode 100644 index 00000000..e51002e7 --- /dev/null +++ b/docs/usage/installation.md @@ -0,0 +1,29 @@ +# Installation + +## Local installation + +For [Node modules projects](https://docs.npmjs.com/getting-started/creating-node-modules) we recommend installing **semantic-release** locally and running the `semantic-release` command with [npx](https://www.npmjs.com/package/npx): + +```bash +$ npm install --save-dev semantic-release +``` + +Then in the CI environment: + +```bash +$ npx semantic-release +``` + +**Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently find the semantic-release binary and to execute it. See [What is npx](../support/FAQ.md#what-is-npx) for more details. + +## Global installation + +For other type of projects we recommend installing **semantic-release** directly in the CI environment, also with [npx](https://www.npmjs.com/package/npx): + +```bash +$ npx semantic-release +``` + +**Note:** For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`, or `npm install -g semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. + +**Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../support/FAQ.md#what-is-npx) for more details. diff --git a/docs/01-usage/plugins.md b/docs/usage/plugins.md similarity index 70% rename from docs/01-usage/plugins.md rename to docs/usage/plugins.md index 8f329e46..9ef56de5 100644 --- a/docs/01-usage/plugins.md +++ b/docs/usage/plugins.md @@ -1,15 +1,13 @@ # Plugins -## Plugins implement actions for release steps +Each [release step](../../README.md#release-steps) is implemented by configurable plugins. This allows for support of different [commit message formats](../../README.md#commit-message-format), release note generators and publishing platforms. -Actions that should be performed for each [release step](../../README.md#release-steps) are implemented through configurable plugins, and [a number of them are installed by default](#plugins-installed-by-default). This allows for support of different [commit message formats](../../README.md#commit-message-format), release note generators and publishing platforms. +A plugin is a npm module that can implement one or more of the following steps: -A plugin is a npm module (for instance `@semantic-release/github` or `semantic-release-docker`) that can implement one or more of the following steps through their step hooks: - -| Step hook | Required | Description | +| Step | Required | Description | |--------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `verifyConditions` | No | Responsible for verifying conditions necessary to proceed with the release: configuration is correct, authentication token are valid, etc... | -| `analyzeCommits` | Yes | Responsible for determining the type of the next release (`major`, `minor` or `patch`). If multiple plugins with a `analyzeCommits` step are defined, the release type will be the highest one among plugins output.
**Note**: If no plugin with an `analyzeCommits` step is defined, then `@semantic-release/commit-analyzer` will be used.| +| `analyzeCommits` | Yes | Responsible for determining the type of the next release (`major`, `minor` or `patch`). If multiple plugins with a `analyzeCommits` step are defined, the release type will be the highest one among plugins output. | | `verifyRelease` | No | Responsible for verifying the parameters (version, type, dist-tag etc...) of the release that is about to be published. | | `generateNotes` | No | Responsible for generating the content of the release note. If multiple plugins with a `generateNotes` step are defined, the release notes will be the result of the concatenation of each plugin output. | | `prepare` | No | Responsible for preparing the release, for example creating or updating files such as `package.json`, `CHANGELOG.md`, documentation or compiled assets and pushing a commit. | @@ -17,9 +15,9 @@ A plugin is a npm module (for instance `@semantic-release/github` or `semantic-r | `success` | No | Responsible for notifying of a new release. | | `fail` | No | Responsible for notifying of a failed release. | -## Plugins installation +**Note:** If no plugin with a `analyzeCommits` step is defined `@semantic-release/commit-analyzer` will be used. -### Plugins installed by default +## Plugins installation These five plugins are already part of **semantic-release** and don't have to be installed separately: ``` @@ -30,19 +28,28 @@ These five plugins are already part of **semantic-release** and don't have to be "@semantic-release/release-notes-generator" ``` -### Installing additional plugins - -[Additional plugins](../02-extending/plugins-list.md) have to be installed via npm: +[Additional plugins](../extending/plugins-list.md) have to be installed via npm: ```bash $ npm install @semantic-release/git @semantic-release/changelog -D ``` -## Plugins declaration and execution order +## Plugins configuration -Each plugin (which is an npm module) must be declared using the [`plugins` option](./configuration.md#plugins). If the `plugins` option is defined, then the default is overriden (rather than merge with the option's default). +Each plugin must be configured with the [`plugins` options](./configuration.md#plugins) by specifying the list of plugins by npm module name. + +```json +{ + "plugins": ["@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/npm"] +} +``` + +**Note:** If the `plugins` option is defined, it overrides the default plugin list, rather than merging with it. + +## Plugin ordering + +For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed in the order in which they are defined. -For example: ```json { "plugins": [ @@ -54,18 +61,16 @@ For example: } ``` -For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed **in the order in which they are declared**. - -Hence, with this configuration above, **semantic-release** will: +With this configuration **semantic-release** will: - execute the `verifyConditions` implementation of `@semantic-release/npm` then `@semantic-release/git` - execute the `analyzeCommits` implementation of `@semantic-release/commit-analyzer` - execute the `prepare` implementation of `@semantic-release/npm` then `@semantic-release/git` - execute the `generateNotes` implementation of `@semantic-release/release-notes-generator` - execute the `publish` implementation of `@semantic-release/npm` -## Plugins configuration options +## Plugin options -A plugin configuration options can specified by wrapping the name and an options object in an array. Options configured this way will be passed only to that specific plugin. +A plugin options can specified by wrapping the name and an options object in an array. Options configured this way will be passed only to that specific plugin. Global plugin options can defined at the root of the **semantic-release** configuration object. Options configured this way will be passed to all plugins. @@ -75,11 +80,11 @@ Global plugin options can defined at the root of the **semantic-release** config "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", ["@semantic-release/github", { - "assets": ["dist/**"] # plugin configuration + "assets": ["dist/**"] }], "@semantic-release/git" ], - "preset": "angular" # option passed to all plugins + "preset": "angular" } ``` diff --git a/docs/01-usage/shareable-configurations.md b/docs/usage/shareable-configurations.md similarity index 78% rename from docs/01-usage/shareable-configurations.md rename to docs/usage/shareable-configurations.md index 3e1a3ccf..bfaf3bab 100644 --- a/docs/01-usage/shareable-configurations.md +++ b/docs/usage/shareable-configurations.md @@ -4,4 +4,4 @@ A shareable configuration is an [npm](https://www.npmjs.com/) package that expor The shareable configurations to use can be set with the [extends](configuration.md#extends) option. -See [shareable configurations list](../02-extending/shareable-configurations-list.md). +See [shareable configurations list](../extending/shareable-configurations-list.md). From e770c50f010520462ea6049c8835ad2f8057bc79 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:10:55 -0400 Subject: [PATCH 091/104] revert: docs: synched README.md and SUMMARY.md This reverts commit 813e5f65edb1d0b4658c58f029da1116f133028a. --- README.md | 15 +++++---------- SUMMARY.md | 1 - 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index de9807ec..5f4a9497 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ After running the tests, the command `semantic-release` will execute the followi ## Documentation - Usage - - [Getting started](docs/usage/getting-started.md) + - [Getting started](docs/usage/getting-started.md#getting-started) - [Installation](docs/usage/installation.md#installation) - [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) - [Configuration](docs/usage/configuration.md#configuration) @@ -103,17 +103,12 @@ After running the tests, the command `semantic-release` will execute the followi - [Plugins](docs/extending/plugins-list.md) - [Shareable configuration](docs/extending/shareable-configurations-list.md) - Recipes - - [CI configurations](docs/recipes/ci-configurations.md) - - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) - - [Travis CI](docs/recipes/travis.md) - - [GitLab CI](docs/recipes/gitlab-ci.md) - - [Git hosted services](docs/recipes/git-hosted-services.md) - - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) - - [Package managers and languages](docs/recipes/package-managers-and-languages.md) + - [CI configurations](docs/recipes/README.md) + - [Package managers and languages](docs/recipes/README.md) - Developer guide - [JavaScript API](docs/developer-guide/js-api.md) - - [Plugin development](docs/developer-guide/plugin.md) - - [Shareable configuration development](docs/developer-guide/shareable-configuration.md) + - [Plugins](docs/developer-guide/plugin.md) + - [Shareable configuration](docs/developer-guide/shareable-configuration.md) - Support - [Resources](docs/support/resources.md) - [Frequently Asked Questions](docs/support/FAQ.md) diff --git a/SUMMARY.md b/SUMMARY.md index c6597ab5..684c9e7b 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,7 +1,6 @@ # Summary ## Usage -- [Getting started](docs/usage/getting-started.md) - [Installation](docs/usage/installation.md#installation) - [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) - [Configuration](docs/usage/configuration.md#configuration) From 3c4a0fb7731302029ae1161cbd0fa98300d9aafa Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:11:03 -0400 Subject: [PATCH 092/104] revert: docs: cleaned "Developer guide" section navigation This reverts commit b08486327d038e7ee285489bd8cb4f073ed72baa. --- SUMMARY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 684c9e7b..e7946823 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -22,8 +22,8 @@ ## Developer guide - [JavaScript API](docs/developer-guide/js-api.md) -- [Plugin development](docs/developer-guide/plugin.md) -- [Shareable configuration development](docs/developer-guide/shareable-configuration.md) +- [Plugin](docs/developer-guide/plugin.md) +- [Shareable configuration](docs/developer-guide/shareable-configuration.md) ## Support - [Resources](docs/support/resources.md) From e00b6c84df7c4c77dd95681c6fb2093e38de1088 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:11:14 -0400 Subject: [PATCH 093/104] revert: docs: repared broken links to "CI configuration recipes" This reverts commit 3f229786233e87a4e5e8d1d812a23cc7edc98bb2. --- docs/support/FAQ.md | 6 +++--- docs/support/node-version.md | 2 +- docs/usage/ci-configuration.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/support/FAQ.md b/docs/support/FAQ.md index f323443e..bb700116 100644 --- a/docs/support/FAQ.md +++ b/docs/support/FAQ.md @@ -56,7 +56,7 @@ If your CI environment provides [nvm](https://github.com/creationix/nvm) you can $ nvm install 8 && yarn global add semantic-release && semantic-release ``` -See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. As `semantic-release` is recommended to be executed with [`npx`](https://www.npmjs.com/package/npx) an alternative is required for usage with Yarn. Even though it is possible to install npx with Yarn, it's not recommended. Yarn and npx would be using different cache locations. @@ -75,7 +75,7 @@ To publish a non-Node package (without a `package.json`) you would need to: - Set **semantic-release** [options](../usage/configuration.md#options) via [CLI arguments or rc file](../usage/configuration.md#configuration) - Make sure your CI job executing the `semantic-release` command has access to [Node >= 8](#why-does-semantic-release-require-node-version--83) to execute the `semantic-release` command -See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. In addition you will need to configure the **semantic-release** [plugins](../usage/plugins.md#plugins) to disable the [`@semantic-release/npm`](https://github.com/semantic-release/npm) plugin which is used by default and use a plugin for your project type. @@ -107,7 +107,7 @@ Yes, **semantic-release** can be used with any CI service, as long as it provide - A way to set [authentication](../usage/ci-configuration.md#authentication) via environment variables - A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) -See the [CI configuration recipes](../recipes/ci-configurations.md) for more details on specific CI environments. +See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. ## Can I run semantic-release on my local machine rather than on a CI server? diff --git a/docs/support/node-version.md b/docs/support/node-version.md index e387685b..542af90b 100644 --- a/docs/support/node-version.md +++ b/docs/support/node-version.md @@ -12,7 +12,7 @@ See our [Node Support Policy](node-support-policy.md) for our long-term promise The recommended approach is to run the `semantic-release` command from a CI job running on Node 8.3 or higher. This can either be a job used by your project to test on Node >= 8.3 or a dedicated job for the release steps. -See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/ci-configurations.md) for more details. +See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. ## Alternative solutions diff --git a/docs/usage/ci-configuration.md b/docs/usage/ci-configuration.md index 036d287b..ef2c7292 100644 --- a/docs/usage/ci-configuration.md +++ b/docs/usage/ci-configuration.md @@ -4,7 +4,7 @@ The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. This can be achieved with [Travis Build Stages](https://docs.travis-ci.com/user/build-stages), [CircleCI Workflows](https://circleci.com/docs/2.0/workflows), [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines), [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs), [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines), [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) or [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). -See [CI configuration recipes](../recipes/ci-configurations.md) for more details. +See [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. ## Authentication @@ -30,4 +30,4 @@ See each plugin's documentation for the environment variables required. The authentication token/credentials have to be made available in the CI service via environment variables. -See [CI configuration recipes](../recipes/ci-configurations.md) for more details on how to configure environment variables in your CI service. +See [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on how to configure environment variables in your CI service. From a6188d39020ab80b6a38f1c7db30660f8519f672 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:11:25 -0400 Subject: [PATCH 094/104] revert: docs(recipes): cleaned doc and navigation This reverts commit a8f8bffa3747b78bbac1c30f3faaf011750b592f. --- .gitignore | 2 -- SUMMARY.md | 7 ++++--- docs/recipes/README.md | 10 +++++++++- docs/recipes/ci-configurations.md | 4 ---- docs/recipes/git-hosted-services.md | 12 ------------ docs/recipes/package-managers-and-languages.md | 2 -- 6 files changed, 13 insertions(+), 24 deletions(-) delete mode 100644 docs/recipes/ci-configurations.md delete mode 100644 docs/recipes/git-hosted-services.md delete mode 100644 docs/recipes/package-managers-and-languages.md diff --git a/.gitignore b/.gitignore index 45ad3560..058ab690 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -# Jetbrains IDEs -.idea # Created by https://www.gitignore.io/api/macos,windows,linux,node diff --git a/SUMMARY.md b/SUMMARY.md index e7946823..a9cfa57d 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -12,13 +12,14 @@ - [Shareable configuration](docs/extending/shareable-configurations-list.md) ## Recipes -- [CI configurations](docs/recipes/ci-configurations.md) +- [CI configurations](docs/recipes/README.md) - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) - [Travis CI](docs/recipes/travis.md) + - [Travis CI with build stages](docs/recipes/travis-build-stages.md) - [GitLab CI](docs/recipes/gitlab-ci.md) -- [Git hosted services](docs/recipes/git-hosted-services.md) +- [Git hosted services](docs/recipes/README.md) - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) -- [Package managers and languages](docs/recipes/package-managers-and-languages.md) +- [Package managers and languages](docs/recipes/README.md) ## Developer guide - [JavaScript API](docs/developer-guide/js-api.md) diff --git a/docs/recipes/README.md b/docs/recipes/README.md index c3b0d84b..d839f0d5 100644 --- a/docs/recipes/README.md +++ b/docs/recipes/README.md @@ -1,3 +1,11 @@ -# Git hosted services +# Recipes + +## CI configurations +- [CircleCI 2.0 workflows](circleci-workflows.md) +- [Travis CI](travis.md) +- [GitLab CI](gitlab-ci.md) + +## Git hosted services - [Git authentication with SSH keys](git-auth-ssh-keys.md) +## Package managers and languages diff --git a/docs/recipes/ci-configurations.md b/docs/recipes/ci-configurations.md deleted file mode 100644 index 5126288f..00000000 --- a/docs/recipes/ci-configurations.md +++ /dev/null @@ -1,4 +0,0 @@ -# CI configurations -- [CircleCI 2.0 workflows](circleci-workflows.md) -- [Travis CI](travis.md) -- [GitLab CI](gitlab-ci.md) diff --git a/docs/recipes/git-hosted-services.md b/docs/recipes/git-hosted-services.md deleted file mode 100644 index fd2ad886..00000000 --- a/docs/recipes/git-hosted-services.md +++ /dev/null @@ -1,12 +0,0 @@ -# Recipes - -## CI configurations -- [CircleCI 2.0 workflows](circleci-workflows.md) -- [Travis CI](travis.md) -- [GitLab CI](gitlab-ci.md) - -## Git hosted services -- [Git authentication with SSH keys](git-auth-ssh-keys.md) - -## Package managers and languages (to be completed) - diff --git a/docs/recipes/package-managers-and-languages.md b/docs/recipes/package-managers-and-languages.md deleted file mode 100644 index 6c0669e8..00000000 --- a/docs/recipes/package-managers-and-languages.md +++ /dev/null @@ -1,2 +0,0 @@ -# Package managers and languages (to be completed) - From 54d8e3fe99ec568f56e69a9e3fad4a43f67dcbc9 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:11:40 -0400 Subject: [PATCH 095/104] revert: docs: note publishing on distribution channels in beta This reverts commit 490d86d0d522b9e808bccc407e6d1ba1a961977e. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f4a9497..a2aa1fdc 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Here is an example of the release type that will be done based on a commit messa For each new commits added to the release branch (i.e. `master`) with `git push` or by merging a pull request or merging from another branch, a CI build is triggered and runs the `semantic-release` command to make a release if there are codebase changes since the last release that affect the package functionalities. If you need more control over the timing of releases you have a couple of options: -- Publish releases on a distribution channel (for example npm’s [dist-tags](https://docs.npmjs.com/cli/dist-tag)). This way you can keep control over what your users end up using by default, and you can decide when to make an automatically released version available to the stable channel, and promote it. **NOTE**: `16.0.0-beta` of semantic-release, includes new features to automate the release of different branches to different npm distribution tags. The corresponding documentation can be found [on the beta branch of this repo](https://github.com/semantic-release/semantic-release/blob/beta/docs/recipes/distribution-channels.md#publishing-on-distribution-channels). +- Publish releases on a distribution channel (for example npm’s [dist-tags](https://docs.npmjs.com/cli/dist-tag)). This way you can keep control over what your users end up using by default, and you can decide when to make an automatically released version available to the stable channel, and promote it. - Develop on a `dev` branch and merge it to the release branch (i.e. `master`) once you are ready to publish. **semantic-release** will run only on pushes to the release branch. ### Release steps From 95a9e89141216e25c4dec9f3fbc3962790298c43 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:12:12 -0400 Subject: [PATCH 096/104] revert: fix(definitions): Repository documentation links This reverts commit 1eb302545e3ed16044cb0533430d39ce0eeed9e2. --- bin/semantic-release.js | 2 +- lib/definitions/errors.js | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/bin/semantic-release.js b/bin/semantic-release.js index d2999f18..12dd2b56 100755 --- a/bin/semantic-release.js +++ b/bin/semantic-release.js @@ -16,7 +16,7 @@ if (!semver.satisfies(process.version, pkg.engines.node)) { console.error( `[semantic-release]: node version ${pkg.engines.node} is required. Found ${process.version}. -See https://github.com/semantic-release/semantic-release/blob/master/docs/05-support/node-version.md for more details and solutions.` +See https://github.com/semantic-release/semantic-release/blob/master/docs/support/node-version.md for more details and solutions.` ); process.exit(1); } diff --git a/lib/definitions/errors.js b/lib/definitions/errors.js index 3c005b80..69c2fb22 100644 --- a/lib/definitions/errors.js +++ b/lib/definitions/errors.js @@ -19,11 +19,11 @@ Please verify your CI configuration to make sure the \`semantic-release\` comman ENOREPOURL: () => ({ message: 'The `repositoryUrl` option is required.', details: `The [repositoryUrl option](${linkify( - 'docs/01-usage/configuration.md#repositoryurl' + 'docs/usage/configuration.md#repositoryurl' )}) cannot be determined from the semantic-release configuration, the \`package.json\` nor the [git origin url](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes). Please make sure to add the \`repositoryUrl\` to the [semantic-release configuration] (${linkify( - 'docs/01-usage/configuration.md' + 'docs/usage/configuration.md' )}).`, }), EGITNOPERMISSION: ({options}) => ({ @@ -33,15 +33,15 @@ Please make sure to add the \`repositoryUrl\` to the [semantic-release configura }\` on remote Git repository with URL \`${options.repositoryUrl}\`. Please refer to the [authentication configuration documentation](${linkify( - 'docs/01-usage/ci-configuration.md#authentication' + 'docs/usage/ci-configuration.md#authentication' )}) to configure the Git credentials on your CI environment and make sure the [repositoryUrl](${linkify( - 'docs/01-usage/configuration.md#repositoryurl' + 'docs/usage/configuration.md#repositoryurl' )}) is configured with a [valid Git URL](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols).`, }), EINVALIDTAGFORMAT: ({tagFormat}) => ({ message: 'Invalid `tagFormat` option.', details: `The [tagFormat](${linkify( - 'docs/01-usage/configuration.md#tagformat' + 'docs/usage/configuration.md#tagformat' )}) must compile to a [valid Git reference](https://git-scm.com/docs/git-check-ref-format#_description). Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.`, @@ -49,14 +49,14 @@ Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.` ETAGNOVERSION: ({tagFormat}) => ({ message: 'Invalid `tagFormat` option.', details: `The [tagFormat](${linkify( - 'docs/01-usage/configuration.md#tagformat' + 'docs/usage/configuration.md#tagformat' )}) option must contain the variable \`version\` exactly once. Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.`, }), EPLUGINCONF: ({type, required, pluginConf}) => ({ message: `The \`${type}\` plugin configuration is invalid.`, - details: `The [${type} plugin configuration](${linkify(`docs/01-usage/plugins.md#${toLower(type)}-plugin`)}) ${ + details: `The [${type} plugin configuration](${linkify(`docs/usage/plugins.md#${toLower(type)}-plugin`)}) ${ required ? 'is required and ' : '' } must be a single or an array of plugins definition. A plugin definition is an npm module name, optionnaly wrapped in an array with an object. @@ -65,7 +65,7 @@ Your configuration for the \`${type}\` plugin is \`${stringify(pluginConf)}\`.`, EPLUGINSCONF: ({plugin}) => ({ message: 'The `plugins` configuration is invalid.', details: `The [plugins](${linkify( - 'docs/01-usage/configuration.md#plugins' + 'docs/usage/configuration.md#plugins' )}) option must be an array of plugin definions. A plugin definition is an npm module name, optionnaly wrapped in an array with an object. The invalid configuration is \`${stringify(plugin)}\`.`, @@ -77,7 +77,7 @@ The invalid configuration is \`${stringify(plugin)}\`.`, The plugin \`${pluginName}\` doesn't have the property \`${type}\` and cannot be used for the \`${type}\` step. Please refer to the \`${pluginName}\` and [semantic-release plugins configuration](${linkify( - 'docs/01-usage/plugins.md' + 'docs/usage/plugins.md' )}) documentation for more details.`, }), EANALYZECOMMITSOUTPUT: ({result, pluginName}) => ({ @@ -92,9 +92,9 @@ We recommend to report the issue to the \`${pluginName}\` authors, providing the - The **semantic-release** version: \`${pkg.version}\` - The **semantic-release** logs from your CI job - The value returned by the plugin: \`${stringify(result)}\` -- A link to the **semantic-release** plugin developer guide: [${linkify( - 'docs/04-developer-guide/plugin.md' - )}](${linkify('docs/04-developer-guide/plugin.md')})`, +- A link to the **semantic-release** plugin developer guide: [${linkify('docs/developer-guide/plugin.md')}](${linkify( + 'docs/developer-guide/plugin.md' + )})`, }), EGENERATENOTESOUTPUT: ({result, pluginName}) => ({ message: 'The `generateNotes` plugin returned an invalid value. It must return a `String`.', @@ -106,9 +106,9 @@ We recommend to report the issue to the \`${pluginName}\` authors, providing the - The **semantic-release** version: \`${pkg.version}\` - The **semantic-release** logs from your CI job - The value returned by the plugin: \`${stringify(result)}\` -- A link to the **semantic-release** plugin developer guide: [${linkify( - 'docs/04-developer-guide/plugin.md' - )}](${linkify('docs/04-developer-guide/plugin.md')})`, +- A link to the **semantic-release** plugin developer guide: [${linkify('docs/developer-guide/plugin.md')}](${linkify( + 'docs/developer-guide/plugin.md' + )})`, }), EPUBLISHOUTPUT: ({result, pluginName}) => ({ message: 'A `publish` plugin returned an invalid value. It must return an `Object`.', @@ -120,8 +120,8 @@ We recommend to report the issue to the \`${pluginName}\` authors, providing the - The **semantic-release** version: \`${pkg.version}\` - The **semantic-release** logs from your CI job - The value returned by the plugin: \`${stringify(result)}\` -- A link to the **semantic-release** plugin developer guide: [${linkify( - 'docs/04-developer-guide/plugin.md' - )}](${linkify('docs/04-developer-guide/plugin.md')})`, +- A link to the **semantic-release** plugin developer guide: [${linkify('docs/developer-guide/plugin.md')}](${linkify( + 'docs/developer-guide/plugin.md' + )})`, }), }; From 4b132807133fe471e9c385c92122d98b1983b247 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:16:17 -0400 Subject: [PATCH 097/104] docs: correct list of default plugins --- docs/usage/plugins.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/usage/plugins.md b/docs/usage/plugins.md index 9ef56de5..902adac3 100644 --- a/docs/usage/plugins.md +++ b/docs/usage/plugins.md @@ -19,12 +19,11 @@ A plugin is a npm module that can implement one or more of the following steps: ## Plugins installation -These five plugins are already part of **semantic-release** and don't have to be installed separately: +These four plugins are already part of **semantic-release** and don't have to be installed separately: ``` -"@semantic-release/commit-analyzer" -"@semantic-release/error" -"@semantic-release/github" -"@semantic-release/npm" +"@semantic-release/commit-analyzer" +"@semantic-release/github" +"@semantic-release/npm" "@semantic-release/release-notes-generator" ``` From c517c7048eb4a66ed43357bc75d9427b6bcce1df Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:24:24 -0400 Subject: [PATCH 098/104] revert: docs(contributing): copy/pasted "Use gitbook locally" instruction from original url This reverts commit cd00c2dc864e49c066d334fc2971efb024de713a. --- CONTRIBUTING.md | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7c9367a3..e6cd5de0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -255,36 +255,5 @@ After staging your changes with `git add`, run `npm run cm` to start the interac Working with the doc is like [working with the code](#working-with-the-code), with the difference that you might find useful to see your changes locally before submitting. -You can do that by following the instructions below (copy/paste-ish from "[Use gitbook locally](https://til.secretgeek.net/gitbook/use_gitbook_locally.html)"): - - -Install `gitbook-cli` globally: -``` -$ npm install --global gitbook-cli -``` - -> **WARNING**: `gitbook-cli` will install the `gitbook` package when it is building the doc. If you have `gitbook` already installed, uninstall it first with a `npm uninstall -g gitbook` before installing `gitbook-cli`. - -Once `gitbook-cli` is installed, from the root of the repo you're working on, you run... -``` -$ gitbook build . -Installing GitBook 3.2.3 # it installs the gitbook package automatically -[..] -``` - -And it will generate a subfolder called `_book` which contains `index.html` and all the other html of the finished book. (You may want to add `_book` to your `.gitignore`) - -You can view that `_book\index.html` file directly in a browser, or serve the content locally from a mini webserver by running: -``` -gitbook serve . -``` - -And then browse the result on the `port` 4000: -``` -http://localhost:4000/ -``` - -You can use a different `port` by using the `--port` argument, e.g. `gitbook serve . --port 4003`. - -You can output as `html`, `pdf`, `epub` or `mobi`. To find out how, use `gitbook help`. +You can do that by following the instructions on [how to use gitbook locally](https://til.secretgeek.net/gitbook/use_gitbook_locally.html). From 55c3616e3f6bc88bd810f8953efdc76860fbed9a Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 12:24:32 -0400 Subject: [PATCH 099/104] revert: docs(contributing): added instructions on how to run gitbook locally This reverts commit a3da21a54477f8f6c007144e0dd38b800f3caf93. --- CONTRIBUTING.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6cd5de0..5b560f37 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,6 @@ As a contributor, here are the guidelines we would like you to follow: - [Submitting a Pull Request](#submitting-a-pull-request) - [Coding rules](#coding-rules) - [Working with the code](#working-with-the-code) -- [Working with the doc](#working-with-the-doc) We also recommend that you read [How to Contribute to Open Source](https://opensource.guide/how-to-contribute). @@ -250,10 +249,3 @@ $ npm run test All the [semantic-release](https://github.com/semantic-release) repositories use [Commitizen](https://github.com/commitizen/cz-cli) to help you create [valid commit messages](#commit-message-guidelines). After staging your changes with `git add`, run `npm run cm` to start the interactive commit message CLI. - -## Working with the doc - -Working with the doc is like [working with the code](#working-with-the-code), with the difference that you might find useful to see your changes locally before submitting. - -You can do that by following the instructions on [how to use gitbook locally](https://til.secretgeek.net/gitbook/use_gitbook_locally.html). - From 7ddc2cfcbc03e81e34e7c132b1bb8924516d07aa Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 14:19:03 -0400 Subject: [PATCH 100/104] docs: update table of content in `README.md` and in Gitbook `SUMMARY.md` --- README.md | 9 +++++---- SUMMARY.md | 14 +++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a2aa1fdc..9220f12f 100644 --- a/README.md +++ b/README.md @@ -103,12 +103,13 @@ After running the tests, the command `semantic-release` will execute the followi - [Plugins](docs/extending/plugins-list.md) - [Shareable configuration](docs/extending/shareable-configurations-list.md) - Recipes - - [CI configurations](docs/recipes/README.md) - - [Package managers and languages](docs/recipes/README.md) + - [CI configurations](docs/recipes/README.md#ci-configurations) + - [Git hosted services](docs/recipes/README.md#git-hosted-services) + - [Package managers and languages](docs/recipes/README.md#package-managers-and-languages) - Developer guide - [JavaScript API](docs/developer-guide/js-api.md) - - [Plugins](docs/developer-guide/plugin.md) - - [Shareable configuration](docs/developer-guide/shareable-configuration.md) + - [Plugins development](docs/developer-guide/plugin.md) + - [Shareable configuration development](docs/developer-guide/shareable-configuration.md) - Support - [Resources](docs/support/resources.md) - [Frequently Asked Questions](docs/support/FAQ.md) diff --git a/SUMMARY.md b/SUMMARY.md index a9cfa57d..e6ce15b0 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,6 +1,7 @@ # Summary ## Usage +- [Getting started](docs/usage/getting-started.md#getting-started) - [Installation](docs/usage/installation.md#installation) - [CI Configuration](docs/usage/ci-configuration.md#ci-configuration) - [Configuration](docs/usage/configuration.md#configuration) @@ -12,19 +13,18 @@ - [Shareable configuration](docs/extending/shareable-configurations-list.md) ## Recipes -- [CI configurations](docs/recipes/README.md) - - [CircleCI 2.0 workflows](docs/recipes/circleci-workflows.md) +- [CI configurations](docs/recipes/README.md#ci-configurations) + - [CircleCI 2.0](docs/recipes/circleci-workflows.md) - [Travis CI](docs/recipes/travis.md) - - [Travis CI with build stages](docs/recipes/travis-build-stages.md) - [GitLab CI](docs/recipes/gitlab-ci.md) -- [Git hosted services](docs/recipes/README.md) +- [Git hosted services](docs/recipes/README.md#git-hosted-services) - [Git authentication with SSH keys](docs/recipes/git-auth-ssh-keys.md) -- [Package managers and languages](docs/recipes/README.md) +- [Package managers and languages](docs/recipes/README.md#package-managers-and-languages) ## Developer guide - [JavaScript API](docs/developer-guide/js-api.md) -- [Plugin](docs/developer-guide/plugin.md) -- [Shareable configuration](docs/developer-guide/shareable-configuration.md) +- [Plugin development](docs/developer-guide/plugin.md) +- [Shareable configuration development](docs/developer-guide/shareable-configuration.md) ## Support - [Resources](docs/support/resources.md) From 9fd93ac37a1aa363f75a66250e46d65069bd3c9e Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 14:19:34 -0400 Subject: [PATCH 101/104] docs: fix node version requirement link is FAQ --- docs/support/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/support/FAQ.md b/docs/support/FAQ.md index bb700116..df5c34c9 100644 --- a/docs/support/FAQ.md +++ b/docs/support/FAQ.md @@ -236,7 +236,7 @@ In addition the [verify conditions step](../../README.md#release-steps) verifies **semantic-release** is written using the latest [ECMAScript 2017](https://www.ecma-international.org/publications/standards/Ecma-262.htm) features, without transpilation which **requires Node version 8.3 or higher**. -See [Node version requirement](../support/node-version.md#node-version-requirement) for more details and solutions. +See [Node version requirement](./node-version.md#node-version-requirement) for more details and solutions. ## What is npx? From 6f33c76fde9639c8098e95aba205edddce9441f0 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Thu, 22 Aug 2019 14:20:34 -0400 Subject: [PATCH 102/104] docs: various clarifications and language improvvements --- docs/usage/ci-configuration.md | 16 +++++++++++++++- docs/usage/configuration.md | 28 ++++++++++------------------ docs/usage/getting-started.md | 8 ++++---- docs/usage/installation.md | 4 ++-- docs/usage/plugins.md | 14 ++++++++------ 5 files changed, 39 insertions(+), 31 deletions(-) diff --git a/docs/usage/ci-configuration.md b/docs/usage/ci-configuration.md index ef2c7292..486fc027 100644 --- a/docs/usage/ci-configuration.md +++ b/docs/usage/ci-configuration.md @@ -2,12 +2,22 @@ ## Run `semantic-release` only after all tests succeeded -The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. This can be achieved with [Travis Build Stages](https://docs.travis-ci.com/user/build-stages), [CircleCI Workflows](https://circleci.com/docs/2.0/workflows), [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines), [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs), [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines), [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) or [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). +The `semantic-release` command must be executed only after all the tests in the CI build pass. If the build runs multiple jobs (for example to test on multiple Operating Systems or Node versions) the CI has to be configured to guarantee that the `semantic-release` command is executed only after all jobs are successful. +Here is a few example of the CI services that can be used to achieve this: +- [Travis Build Stages](https://docs.travis-ci.com/user/build-stages) +- [CircleCI Workflows](https://circleci.com/docs/2.0/workflows) +- [Codeship Deployment Pipelines](https://documentation.codeship.com/basic/builds-and-configuration/deployment-pipelines) +- [GitLab Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html#introduction-to-pipelines-and-jobs) +- [Codefresh Pipelines](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines) +- [Wercker Workflows](http://devcenter.wercker.com/docs/workflows) +- [GoCD Pipelines](https://docs.gocd.org/current/introduction/concepts_in_go.html#pipeline). See [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. ## Authentication +### Push access to the remote repository + **semantic-release** requires push access to the project Git repository in order to create [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging). The Git authentication can be set with one of the following environment variables: | Variable | Description | @@ -19,6 +29,8 @@ See [CI configuration recipes](../recipes/README.md#ci-configurations) for more Alternatively the Git authentication can be set up via [SSH keys](../recipes/git-auth-ssh-keys.md). +### Authentication for plugins + Most **semantic-release** [plugins](plugins.md) require setting up authentication in order to publish to a package manager registry. The default [@semantic-release/npm](https://github.com/semantic-release/npm#environment-variables) and [@semantic-release/github](https://github.com/semantic-release/github#environment-variables) plugins require the following environment variables: | Variable | Description | @@ -31,3 +43,5 @@ See each plugin's documentation for the environment variables required. The authentication token/credentials have to be made available in the CI service via environment variables. See [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on how to configure environment variables in your CI service. + +**Note**: The environment variables `GH_TOKEN`, `GITHUB_TOKEN`, `GL_TOKEN` and `GITLAB_TOKEN` can be used for both the Git authentication and the API authentication required by [@semantic-release/github](https://github.com/semantic-release/github) and [@semantic-release/gitlab](https://github.com/semantic-release/gitlab). diff --git a/docs/usage/configuration.md b/docs/usage/configuration.md index 8a6da186..dc9f8c65 100644 --- a/docs/usage/configuration.md +++ b/docs/usage/configuration.md @@ -1,17 +1,17 @@ # Configuration **semantic-release** configuration consists of: -- Git repository options ([URL](#repositoryurl), [release branch](#branch) and [tag format](#tagformat)) -- [plugins](#plugins) definition -- run mode ([debug](#debug), [dry run](#dryrun) and [local (no CI)](#ci)) +- Git repository ([URL](#repositoryurl) and options [release branch](#branch) and [tag format](#tagformat)) +- Plugins [declaration](#plugins) and options +- Run mode ([debug](#debug), [dry run](#dryrun) and [local (no CI)](#ci)) -All of these options can be configured directly or by extending a [shareable configuration](shareable-configurations.md). +All of these options can be configured through config file, CLI arguments or by extending a [shareable configuration](shareable-configurations.md). Additionally, metadata of Git tags generated by **semantic-release** can be customized via standard [Git environment variables](#git-environment-variables). ## Configuration file -**semantic-release**’s [options](#options), mode and [plugins](plugins.md) can be set via: +**semantic-release**’s [options](#options), mode and [plugins](plugins.md) can be set via either: - A `.releaserc` file, written in YAML or JSON, with optional extensions: .`yaml`/`.yml`/`.json`/`.js` - A `release.config.js` file that exports an object - A `release` key in the project's `package.json` file @@ -20,8 +20,7 @@ Alternatively, some options can be set via CLI arguments. The following three examples are the same. -Via `release` key in the project's `package.json` file: - +- Via `release` key in the project's `package.json` file: ```json { "release": { @@ -29,23 +28,15 @@ Via `release` key in the project's `package.json` file: } } ``` -```bash -$ semantic-release -``` - -Via `.releaserc` file: +- Via `.releaserc` file: ```json { "branch": "next" } ``` -```bash -$ semantic-release -``` - -Via CLI argument: +- Via CLI argument: ```bash $ semantic-release --branch next ``` @@ -146,7 +137,8 @@ Output debugging information. This can also be enabled by setting the `DEBUG` en ## Existing version tags -**semantic-release** uses [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) to determine the commits added since the last release. If a release has been published before setting up **semantic-release** you must make sure the most recent commit included in the last published release is in the [release branch](#branch) history and is tagged with the version released, formatted according to the [tag format](#tagformat) configured (defaults to `vx.y.z`). +**semantic-release** uses [Git tags](https://git-scm.com/book/en/v2/Git-Basics-Tagging) to determine the commits added since the last release. +If a release has been published before setting up **semantic-release** you must make sure the most recent commit included in the last published release is in the [release branch](#branch) history and is tagged with the version released, formatted according to the [tag format](#tagformat) configured (defaults to `vx.y.z`). If the previous releases were published with [`npm publish`](https://docs.npmjs.com/cli/publish) this should already be the case. diff --git a/docs/usage/getting-started.md b/docs/usage/getting-started.md index f8bda3bb..800ef747 100644 --- a/docs/usage/getting-started.md +++ b/docs/usage/getting-started.md @@ -1,10 +1,10 @@ # Getting started In order to use **semantic-release** you must follow these steps: -- [Install](./installation.md#installation) **semantic-release** in your project -- Configure your Continuous Integration service to [run **semantic-release**](./ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) -- Configure your Git repository and package manager repository [authentication](ci-configuration.md#authentication) in your Continuous Integration service -- Configure **semantic-release** [options and plugins](./configuration.md#configuration) +1. [Install](./installation.md#installation) **semantic-release** in your project +2. Configure your Continuous Integration service to [run **semantic-release**](./ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded) +3. Configure your Git repository and package manager repository [authentication](ci-configuration.md#authentication) in your Continuous Integration service +4. Configure **semantic-release** [options and plugins](./configuration.md#configuration) Alternatively those steps can be easily done with the [**semantic-release** interactive CLI](https://github.com/semantic-release/cli): diff --git a/docs/usage/installation.md b/docs/usage/installation.md index e51002e7..13e6212a 100644 --- a/docs/usage/installation.md +++ b/docs/usage/installation.md @@ -24,6 +24,6 @@ For other type of projects we recommend installing **semantic-release** directly $ npx semantic-release ``` -**Note:** For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`, or `npm install -g semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. +**Note**: For a global installation, it's recommended to specify the major **semantic-release** version to install (for example with with `npx semantic-release@15`). This way your build will not automatically use the next major **semantic-release** release that could possibly break your build. You will have to upgrade manually when a new major version is released. -**Note:** `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../support/FAQ.md#what-is-npx) for more details. +**Note**: `npx` is a tool bundled with `npm@>=5.2.0`. It is used to conveniently install the semantic-release binary and to execute it. See [What is npx](../support/FAQ.md#what-is-npx) for more details. diff --git a/docs/usage/plugins.md b/docs/usage/plugins.md index 902adac3..0ae83210 100644 --- a/docs/usage/plugins.md +++ b/docs/usage/plugins.md @@ -19,6 +19,8 @@ A plugin is a npm module that can implement one or more of the following steps: ## Plugins installation +### Default plugins + These four plugins are already part of **semantic-release** and don't have to be installed separately: ``` "@semantic-release/commit-analyzer" @@ -27,13 +29,15 @@ These four plugins are already part of **semantic-release** and don't have to be "@semantic-release/release-notes-generator" ``` +### Additional plugins + [Additional plugins](../extending/plugins-list.md) have to be installed via npm: ```bash $ npm install @semantic-release/git @semantic-release/changelog -D ``` -## Plugins configuration +## Plugins declaration and execution order Each plugin must be configured with the [`plugins` options](./configuration.md#plugins) by specifying the list of plugins by npm module name. @@ -45,8 +49,6 @@ Each plugin must be configured with the [`plugins` options](./configuration.md#p **Note:** If the `plugins` option is defined, it overrides the default plugin list, rather than merging with it. -## Plugin ordering - For each [release step](../../README.md#release-steps) the plugins that implement that step will be executed in the order in which they are defined. ```json @@ -67,11 +69,11 @@ With this configuration **semantic-release** will: - execute the `generateNotes` implementation of `@semantic-release/release-notes-generator` - execute the `publish` implementation of `@semantic-release/npm` -## Plugin options +## Plugin options configuration -A plugin options can specified by wrapping the name and an options object in an array. Options configured this way will be passed only to that specific plugin. +A plugin configuration can be specified by wrapping the name and an options object in an array. Options configured this way will be passed only to that specific plugin. -Global plugin options can defined at the root of the **semantic-release** configuration object. Options configured this way will be passed to all plugins. +Global plugin configuration can be defined at the root of the **semantic-release** configuration object. Options configured this way will be passed to all plugins. ```json { From 8e4fa663fac8f272ecf99a14ab54dff87870e00f Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 03:31:20 +0000 Subject: [PATCH 103/104] chore(package): update nock to version 11.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1a756d54..dcc36921 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "got": "^9.0.0", "js-yaml": "^3.10.0", "mockserver-client": "^5.1.1", - "nock": "^10.0.0", + "nock": "^11.1.0", "nyc": "^14.0.0", "p-retry": "^4.0.0", "proxyquire": "^2.0.0", From 9b78ab7c0d7ff9f42375d1b7cd095356a800be25 Mon Sep 17 00:00:00 2001 From: Josh Biddick Date: Fri, 6 Sep 2019 10:01:13 +1200 Subject: [PATCH 104/104] docs: spelling (#1284) --- docs/support/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/support/FAQ.md b/docs/support/FAQ.md index df5c34c9..444d1528 100644 --- a/docs/support/FAQ.md +++ b/docs/support/FAQ.md @@ -4,7 +4,7 @@ **semantic-release** takes care of updating the `package.json`’s version before publishing to [npm](https://www.npmjs.com). -By default, only the published package will contains the version, which is the only place where it is *really* required, but the updated `package.json` will not be pushed to the Git repository +By default, only the published package will contain the version, which is the only place where it is *really* required, but the updated `package.json` will not be pushed to the Git repository However, the [`@semantic-release/git`](https://github.com/semantic-release/git) plugin can be used to push the updated `package.json` as well as other files to the Git repository.