From add0ca737855c01299a2d445715c675688dea69a Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Fri, 17 Nov 2017 12:55:55 +0530 Subject: [PATCH 001/187] Set password to empty string when login form is rendered (#321) --- backend/controllers/SiteController.php | 2 ++ frontend/controllers/SiteController.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/backend/controllers/SiteController.php b/backend/controllers/SiteController.php index 9624dcc949..0d72d55a87 100644 --- a/backend/controllers/SiteController.php +++ b/backend/controllers/SiteController.php @@ -78,6 +78,8 @@ public function actionLogin() if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { + + $model->password = ''; return $this->render('login', [ 'model' => $model, ]); diff --git a/frontend/controllers/SiteController.php b/frontend/controllers/SiteController.php index 519d575030..390516b6e9 100644 --- a/frontend/controllers/SiteController.php +++ b/frontend/controllers/SiteController.php @@ -90,6 +90,8 @@ public function actionLogin() if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { + + $model->password = ''; return $this->render('login', [ 'model' => $model, ]); From f052cac5d58481e09ff58a6f4fdd78281a82f95b Mon Sep 17 00:00:00 2001 From: bscheshirwork Date: Tue, 28 Nov 2017 23:51:16 +0300 Subject: [PATCH 002/187] Fixed codestyle (#323) --- backend/controllers/SiteController.php | 2 +- frontend/controllers/SiteController.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/controllers/SiteController.php b/backend/controllers/SiteController.php index 0d72d55a87..a870ad87e3 100644 --- a/backend/controllers/SiteController.php +++ b/backend/controllers/SiteController.php @@ -78,8 +78,8 @@ public function actionLogin() if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { - $model->password = ''; + return $this->render('login', [ 'model' => $model, ]); diff --git a/frontend/controllers/SiteController.php b/frontend/controllers/SiteController.php index 390516b6e9..d838569d75 100644 --- a/frontend/controllers/SiteController.php +++ b/frontend/controllers/SiteController.php @@ -90,8 +90,8 @@ public function actionLogin() if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { - $model->password = ''; + return $this->render('login', [ 'model' => $model, ]); From 275080a1f39928514f0c16e00c313e8f31a6b48a Mon Sep 17 00:00:00 2001 From: David Newcomb Date: Fri, 8 Dec 2017 21:09:18 +0000 Subject: [PATCH 003/187] Instructions don't work with latest code versions (#327) [skip ci] There are no versions of what components to use so if you follow the instructions it will use the latest ones. Currently the latest ones don't work together and the acceptance tests fail. I spent 2 days trawling through forums and github bug reports to figure it all out! --- docs/guide/start-testing.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/guide/start-testing.md b/docs/guide/start-testing.md index 1cf57250f7..664ebc7411 100644 --- a/docs/guide/start-testing.md +++ b/docs/guide/start-testing.md @@ -4,10 +4,12 @@ Testing Yii2 Advanced Application uses Codeception as its primary test framework. There are already some sample tests prepared in `tests` directory of `frontend`, `backend`, and `common`. In order for the following procedure to work, it is assumed that the application has been initialized using -the `dev` environment. In case tests need to be executed within a `Production` environment, `yii_test` and +the `dev` environment. In the case where tests need to be executed in a `Production` environment, `yii_test` and `yii_test.bat` must be manually copied from the `environments/dev` folder into the project root directory. + Tests require an **additional database**, which will be cleaned up between tests. -Create database `yii2advanced_test` in mysql (according to config in `common/config/test.php`) and execute: +Create database `yii2advanced_test` in mysql (according to config in `common/config/test-local.php`) and execute: + ``` ./yii_test migrate @@ -68,6 +70,8 @@ By default acceptance tests are disabled, to run them use: #### Running Acceptance Tests +The acceptance tests use [geckodriver](https://github.com/mozilla/geckodriver) for firefox by default, so make sure [geckodriver](https://github.com/mozilla/geckodriver) is in the `PATH`. + To execute acceptance tests do the following: 1. Rename `frontend/tests/acceptance.suite.yml.example` to `frontend/tests/acceptance.suite.yml` to enable suite configuration @@ -91,7 +95,10 @@ To execute acceptance tests do the following: ``` java -jar ~/selenium-server-standalone-x.xx.x.jar - ``` + ``` + > There are currently [issues](https://github.com/facebook/php-webdriver/issues/492) with geckodriver's + > interactions with selenium that require you to enable the protocol translating in Selenium. + > `java -jar ~/selenium-server-standalone-x.xx.x.jar -enablePassThrough false` 1. Start web server: From f017935e414cda69a4d5e0f827a20af7dee03011 Mon Sep 17 00:00:00 2001 From: bscheshirwork Date: Tue, 19 Dec 2017 13:07:38 +0300 Subject: [PATCH 004/187] Codeception: add suite namespace to configs, use actor instead class_name (#329) --- backend/codeception.yml | 6 +++--- backend/tests/functional.suite.yml | 3 ++- backend/tests/unit.suite.yml | 3 ++- common/codeception.yml | 6 +++--- common/tests/unit.suite.yml | 3 ++- frontend/codeception.yml | 6 +++--- frontend/tests/acceptance.suite.yml.example | 3 ++- frontend/tests/functional.suite.yml | 3 ++- frontend/tests/unit.suite.yml | 3 ++- 9 files changed, 21 insertions(+), 15 deletions(-) diff --git a/backend/codeception.yml b/backend/codeception.yml index 703b518c11..f598102ebb 100644 --- a/backend/codeception.yml +++ b/backend/codeception.yml @@ -1,10 +1,10 @@ namespace: backend\tests -actor: Tester +actor_suffix: Tester paths: tests: tests - log: tests/_output + output: tests/_output data: tests/_data - helpers: tests/_support + support: tests/_support settings: bootstrap: _bootstrap.php colors: true diff --git a/backend/tests/functional.suite.yml b/backend/tests/functional.suite.yml index acd31d8c61..042e7044c7 100644 --- a/backend/tests/functional.suite.yml +++ b/backend/tests/functional.suite.yml @@ -1,4 +1,5 @@ -class_name: FunctionalTester +suite_namespace: backend\tests\functional +actor: FunctionalTester modules: enabled: - Yii2 diff --git a/backend/tests/unit.suite.yml b/backend/tests/unit.suite.yml index 1ba1eb4a82..f90030f7ee 100644 --- a/backend/tests/unit.suite.yml +++ b/backend/tests/unit.suite.yml @@ -1 +1,2 @@ -class_name: UnitTester +suite_namespace: backend\tests\unit +actor: UnitTester diff --git a/common/codeception.yml b/common/codeception.yml index de5d76a19e..d21394f165 100644 --- a/common/codeception.yml +++ b/common/codeception.yml @@ -1,10 +1,10 @@ namespace: common\tests -actor: Tester +actor_suffix: Tester paths: tests: tests - log: tests/_output + output: tests/_output data: tests/_data - helpers: tests/_support + support: tests/_support settings: bootstrap: _bootstrap.php colors: true diff --git a/common/tests/unit.suite.yml b/common/tests/unit.suite.yml index 19f0b42e1e..7617b7170f 100644 --- a/common/tests/unit.suite.yml +++ b/common/tests/unit.suite.yml @@ -1,4 +1,5 @@ -class_name: UnitTester +suite_namespace: common\tests\unit +actor: UnitTester bootstrap: false modules: enabled: diff --git a/frontend/codeception.yml b/frontend/codeception.yml index 1203f3902a..73035b1015 100644 --- a/frontend/codeception.yml +++ b/frontend/codeception.yml @@ -1,10 +1,10 @@ namespace: frontend\tests -actor: Tester +actor_suffix: Tester paths: tests: tests - log: tests/_output + output: tests/_output data: tests/_data - helpers: tests/_support + support: tests/_support settings: bootstrap: _bootstrap.php colors: true diff --git a/frontend/tests/acceptance.suite.yml.example b/frontend/tests/acceptance.suite.yml.example index 9406c49ec4..d2aecf5f33 100644 --- a/frontend/tests/acceptance.suite.yml.example +++ b/frontend/tests/acceptance.suite.yml.example @@ -1,4 +1,5 @@ -class_name: AcceptanceTester +suite_namespace: frontend\tests\acceptance +actor: AcceptanceTester modules: enabled: - WebDriver: diff --git a/frontend/tests/functional.suite.yml b/frontend/tests/functional.suite.yml index 3f851d1150..8f9c4cbb75 100644 --- a/frontend/tests/functional.suite.yml +++ b/frontend/tests/functional.suite.yml @@ -1,4 +1,5 @@ -class_name: FunctionalTester +suite_namespace: frontend\tests\functional +actor: FunctionalTester modules: enabled: - Filesystem diff --git a/frontend/tests/unit.suite.yml b/frontend/tests/unit.suite.yml index 27f2907edc..23ea63b3db 100644 --- a/frontend/tests/unit.suite.yml +++ b/frontend/tests/unit.suite.yml @@ -1,4 +1,5 @@ -class_name: UnitTester +suite_namespace: frontend\tests\unit +actor: UnitTester modules: enabled: - Yii2: From b4a32666394d107524bfa6037226157f1d093bf1 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 21 Dec 2017 02:38:23 +0300 Subject: [PATCH 005/187] Replaced .dev and .local with .test [skip ci] - .dev was bought by Google and Chrome started redirecting it to HTTPS - .local is used by Apple in mDNS and may cause routing issues --- Vagrantfile | 4 ++-- docs/guide-es/start-installation.md | 16 +++++++------- docs/guide-fr/start-installation.md | 28 ++++++++++++------------ docs/guide-fr/topic-shared-hosting.md | 2 +- docs/guide-ja/start-installation.md | 24 ++++++++++---------- docs/guide-ja/topic-shared-hosting.md | 4 ++-- docs/guide-pl/start-installation.md | 28 ++++++++++++------------ docs/guide-pl/topic-shared-hosting.md | 2 +- docs/guide-pt-BR/start-installation.md | 28 ++++++++++++------------ docs/guide-zh-CN/start-installation.md | 28 ++++++++++++------------ docs/guide-zh-CN/topic-shared-hosting.md | 2 +- docs/guide/start-installation.md | 24 ++++++++++---------- docs/guide/topic-shared-hosting.md | 2 +- vagrant/nginx/app.conf | 4 ++-- 14 files changed, 98 insertions(+), 98 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 5b89ee38bf..4376f11c80 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -7,8 +7,8 @@ required_plugins.each do |plugin| end domains = { - frontend: 'y2aa-frontend.dev', - backend: 'y2aa-backend.dev' + frontend: 'y2aa-frontend.test', + backend: 'y2aa-backend.test' } config = { diff --git a/docs/guide-es/start-installation.md b/docs/guide-es/start-installation.md index ab0c22a7a3..064835766a 100644 --- a/docs/guide-es/start-installation.md +++ b/docs/guide-es/start-installation.md @@ -45,14 +45,14 @@ Después de instalar la aplicación, tienes que realizar los siguientes pasos pa 4. Establece los documentos raíces(document-root) de tu servidor web: - - para frontend `/path/to/yii-application/frontend/web/` y usando la URL `http://frontend.dev/` - - para backend `/path/to/yii-application/backend/web/` y usando la URL `http://backend.dev/` + - para frontend `/path/to/yii-application/frontend/web/` y usando la URL `http://frontend.test/` + - para backend `/path/to/yii-application/backend/web/` y usando la URL `http://backend.test/` Para Apache podría ser lo siguiente: ```apache - ServerName frontend.dev + ServerName frontend.test DocumentRoot "/path/to/yii-application/frontend/web/" @@ -72,7 +72,7 @@ Después de instalar la aplicación, tienes que realizar los siguientes pasos pa - ServerName backend.dev + ServerName backend.test DocumentRoot "/path/to/yii-application/backend/web/" @@ -102,7 +102,7 @@ Después de instalar la aplicación, tienes que realizar los siguientes pasos pa listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name frontend.dev; + server_name frontend.test; root /path/to/yii-application/frontend/web/; index index.php; @@ -140,7 +140,7 @@ Después de instalar la aplicación, tienes que realizar los siguientes pasos pa listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name backend.dev; + server_name backend.test; root /path/to/yii-application/backend/web/; index index.php; @@ -180,8 +180,8 @@ Después de instalar la aplicación, tienes que realizar los siguientes pasos pa Añade las siguientes lineas: ``` - 127.0.0.1 frontend.dev - 127.0.0.1 backend.dev + 127.0.0.1 frontend.test + 127.0.0.1 backend.test ``` Para loguearte dentro de la aplicación, necesitas primero registrarte, con cualquiera de sus correos electrónicos, nombre de usuario y contraseña. diff --git a/docs/guide-fr/start-installation.md b/docs/guide-fr/start-installation.md index 8329593216..2b57cc88e7 100644 --- a/docs/guide-fr/start-installation.md +++ b/docs/guide-fr/start-installation.md @@ -46,14 +46,14 @@ Après que vous avez installé l'application, vous devez accomplir les étapes s 4. Définissez la racine du document de votre serveur Web : - - pour l'interface utilisateur (frontend) `/path/to/yii-application/frontend/web/`, en utilisant l'URL `http://frontend.dev/` - - pour l'interface d'administration (backend) `/path/to/yii-application/backend/web/`, en utilisant URL `http://backend.dev/` + - pour l'interface utilisateur (frontend) `/path/to/yii-application/frontend/web/`, en utilisant l'URL `http://frontend.test/` + - pour l'interface d'administration (backend) `/path/to/yii-application/backend/web/`, en utilisant URL `http://backend.test/` Avec le serveur Apache ça pourrait ressembler à ceci : ```apache - ServerName frontend.dev + ServerName frontend.test DocumentRoot "/path/to/yii-application/frontend/web/" @@ -79,7 +79,7 @@ Après que vous avez installé l'application, vous devez accomplir les étapes s - ServerName backend.dev + ServerName backend.test DocumentRoot "/path/to/yii-application/backend/web/" @@ -115,7 +115,7 @@ Après que vous avez installé l'application, vous devez accomplir les étapes s listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name frontend.dev; + server_name frontend.test; root /path/to/yii-application/frontend/web/; index index.php; @@ -158,7 +158,7 @@ Après que vous avez installé l'application, vous devez accomplir les étapes s listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name backend.dev; + server_name backend.test; root /path/to/yii-application/backend/web/; index index.php; @@ -203,8 +203,8 @@ Après que vous avez installé l'application, vous devez accomplir les étapes s Ajoutez les lignes suivantes : ``` - 127.0.0.1 frontend.dev - 127.0.0.1 backend.dev + 127.0.0.1 frontend.test + 127.0.0.1 backend.test ``` Pour vous connecter à l'application, vous devez d'abord vous enregistrer avec votre adresse électronique, votre nom d'utilisateur et votre mot de passe. @@ -249,8 +249,8 @@ C'est la manière la plus facile mais elle prend du temps (~20 min). ``` C'est tout. Il ne vous reste plus qu'à attendre la fin de l'exécution ! Après cela, vous pouvez accéder au projet localement par les URL : -* pour l'interface utilisateur : http://y2aa-frontend.dev -* pour l'interface d'administration : http://y2aa-backend.dev +* pour l'interface utilisateur : http://y2aa-frontend.test +* pour l'interface d'administration : http://y2aa-backend.test #### Manuel pour les utilisateurs de Windows @@ -268,8 +268,8 @@ C'est tout. Il ne vous reste plus qu'à attendre la fin de l'exécution ! Aprè 7. Ajoutez les lignes suivantes dans le [fichier hosts](https://en.wikipedia.org/wiki/Hosts_(file)): ``` - 192.168.83.137 y2aa-frontend.dev - 192.168.83.137 y2aa-backend.dev + 192.168.83.137 y2aa-frontend.test + 192.168.83.137 y2aa-backend.test ``` 8. Ouvrez un terminal (`cmd.exe`), **placez-vous à la racine du projet** et exécutez les commandes : @@ -282,6 +282,6 @@ C'est tout. Il ne vous reste plus qu'à attendre la fin de l'exécution ! Aprè (Vous pouvez apprendre comment changer de dossier dans l'interpréteur de commande en lisant [ceci](http://www.wikihow.com/Change-Directories-in-Command-Prompt)) C'est tout. Il ne vous reste qu'à attendre la fin de l'exécution ! Après cela, vous pouvez accéder au projet localement par les URL : -* pour l'interface utilisateur : http://y2aa-frontend.dev -* pour l'interface d'administration : http://y2aa-backend.dev +* pour l'interface utilisateur : http://y2aa-frontend.test +* pour l'interface d'administration : http://y2aa-backend.test diff --git a/docs/guide-fr/topic-shared-hosting.md b/docs/guide-fr/topic-shared-hosting.md index c54fd460e0..c7a180d635 100644 --- a/docs/guide-fr/topic-shared-hosting.md +++ b/docs/guide-fr/topic-shared-hosting.md @@ -1,7 +1,7 @@ Utilisation du modèle de projet avancé sur un hébergement partagé ================================================================= -Le déploiement d'un modèle de projet avancé sur un hébergement partagé est un peu plus délicat que le déploiement du projet *basic* parce qu'il a deux racines Web que les serveurs Web des hébergements partagés ne prennent pas en charge. Il faut adapter la structure des dossiers de manière à ce que l'URL de l'interface utilisateur soit `http://site.local` et celle de l'interface d'administration `http://site.local/admin`. +Le déploiement d'un modèle de projet avancé sur un hébergement partagé est un peu plus délicat que le déploiement du projet *basic* parce qu'il a deux racines Web que les serveurs Web des hébergements partagés ne prennent pas en charge. Il faut adapter la structure des dossiers de manière à ce que l'URL de l'interface utilisateur soit `http://site.test` et celle de l'interface d'administration `http://site.test/admin`. ### Déplacement des scripts d'entrée dans une racine Web unique diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 37cb519a3e..ad0f35efb1 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -54,7 +54,7 @@ Composer がインストールされていれば、次のコマンドを使っ ```apache - ServerName frontend.dev + ServerName frontend.test DocumentRoot "/path/to/yii-application/frontend/web/" @@ -80,7 +80,7 @@ Composer がインストールされていれば、次のコマンドを使っ - ServerName backend.dev + ServerName backend.test DocumentRoot "/path/to/yii-application/backend/web/" @@ -116,7 +116,7 @@ Composer がインストールされていれば、次のコマンドを使っ listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name frontend.dev; + server_name frontend.test; root /path/to/yii-application/frontend/web/; index index.php; @@ -159,7 +159,7 @@ Composer がインストールされていれば、次のコマンドを使っ listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name backend.dev; + server_name backend.test; root /path/to/yii-application/backend/web/; index index.php; @@ -204,8 +204,8 @@ Composer がインストールされていれば、次のコマンドを使っ 次の行を追加します。 ``` - 127.0.0.1 frontend.dev - 127.0.0.1 backend.dev + 127.0.0.1 frontend.test + 127.0.0.1 backend.test ``` @@ -253,8 +253,8 @@ Composer がインストールされていれば、次のコマンドを使っ これで全部です。後はただ完了するのを待つだけです。 完了後には、次の URL でローカルのプロジェクトにアクセスすることが出来ます。 -* フロントエンド: http://y2aa-frontend.dev -* バックエンド: http://y2aa-backend.dev +* フロントエンド: http://y2aa-frontend.test +* バックエンド: http://y2aa-backend.test #### Windows ユーザ用マニュアル @@ -272,8 +272,8 @@ Composer がインストールされていれば、次のコマンドを使っ 7. 次の2行を [hosts file](https://en.wikipedia.org/wiki/Hosts_(file)) に追加する ``` - 192.168.83.137 y2aa-frontend.dev - 192.168.83.137 y2aa-backend.dev + 192.168.83.137 y2aa-frontend.test + 192.168.83.137 y2aa-backend.test ``` 8. ターミナル (`cmd.exe`) を開き、 **プロジェクトのルートディレクトリに移動して** 次のコマンドを実行する @@ -287,6 +287,6 @@ Composer がインストールされていれば、次のコマンドを使っ これで全部です。後はただ完了するのを待つだけです。 完了後には、次の URL でローカルのプロジェクトにアクセスすることが出来ます。 -* フロントエンド: http://y2aa-frontend.dev -* バックエンド: http://y2aa-backend.dev +* フロントエンド: http://y2aa-frontend.test +* バックエンド: http://y2aa-backend.test diff --git a/docs/guide-ja/topic-shared-hosting.md b/docs/guide-ja/topic-shared-hosting.md index 448729a5ed..2775bf05e4 100644 --- a/docs/guide-ja/topic-shared-hosting.md +++ b/docs/guide-ja/topic-shared-hosting.md @@ -3,8 +3,8 @@ アドバンストプロジェクトテンプレートを共有ホストに配備するのは、ベーシックプロジェクトテンプレートを配備するのに比べると、少しトリッキーになります。 なぜなら、アドバンストアプリケーションは、共有ホストがサポートしていない二つのウェブルートを持っているからです。 -ディレクトリ構造を修正して、フロントエンドの URL が `http://site.local` となり、 -バックエンドの URL が `http://site.local/admin` となるようにしなければなりません。 +ディレクトリ構造を修正して、フロントエンドの URL が `http://site.test` となり、 +バックエンドの URL が `http://site.test/admin` となるようにしなければなりません。 ### エントリスクリプトを単一のウェブルートに移動する diff --git a/docs/guide-pl/start-installation.md b/docs/guide-pl/start-installation.md index 3b62e228f4..9773b5ca10 100644 --- a/docs/guide-pl/start-installation.md +++ b/docs/guide-pl/start-installation.md @@ -48,14 +48,14 @@ zrobić raz na każdym nowym środowisku. 4. Ustaw docelowe foldery serwera Web: - - dla front-endu `/path/to/yii-application/frontend/web/` z użyciem adresu URL `http://frontend.dev/` - - dla back-endu `/path/to/yii-application/backend/web/` z użyciem adresu URL `http://backend.dev/` + - dla front-endu `/path/to/yii-application/frontend/web/` z użyciem adresu URL `http://frontend.test/` + - dla back-endu `/path/to/yii-application/backend/web/` z użyciem adresu URL `http://backend.test/` W przypadku serwera Apache konfiguracja może wyglądać następująco: ```apache - ServerName frontend.dev + ServerName frontend.test DocumentRoot "/path/to/yii-application/frontend/web/" @@ -81,7 +81,7 @@ zrobić raz na każdym nowym środowisku. - ServerName backend.dev + ServerName backend.test DocumentRoot "/path/to/yii-application/backend/web/" @@ -117,7 +117,7 @@ zrobić raz na każdym nowym środowisku. listen 80; ## nasluchuj dla ipv4 #listen [::]:80 default_server ipv6only=on; ## nasluchuj dla ipv6 - server_name frontend.dev; + server_name frontend.test; root /path/to/yii-application/frontend/web/; index index.php; @@ -160,7 +160,7 @@ zrobić raz na każdym nowym środowisku. listen 80; ## nasluchuj dla ipv4 #listen [::]:80 default_server ipv6only=on; ## nasluchuj dla ipv6 - server_name backend.dev; + server_name backend.test; root /path/to/yii-application/backend/web/; index index.php; @@ -205,8 +205,8 @@ zrobić raz na każdym nowym środowisku. Dodaj poniżesz linie: ``` - 127.0.0.1 frontend.dev - 127.0.0.1 backend.dev + 127.0.0.1 frontend.test + 127.0.0.1 backend.test ``` Aby zalogować się do aplikacji, najpierw musisz się zarejestrować używając dowolnego adresu email, nazwy użytkwnika @@ -253,8 +253,8 @@ wykonuj kolejne kroki! To wszystko. Teraz tylko musisz poczekać na zakończenie procesu! Po wszystkim możesz przejść do lokalnego projektu za pomocą adresów URL: -* front-end: http://y2aa-frontend.dev -* back-end: http://y2aa-backend.dev +* front-end: http://y2aa-frontend.test +* back-end: http://y2aa-backend.test #### Instrukcje dla użytkowników Windows @@ -272,8 +272,8 @@ pomocą adresów URL: 7. Dodaj poniższe linie do [pliku hostów](https://en.wikipedia.org/wiki/Hosts_(file)): ``` - 192.168.83.137 y2aa-frontend.dev - 192.168.83.137 y2aa-backend.dev + 192.168.83.137 y2aa-frontend.test + 192.168.83.137 y2aa-backend.test ``` 8. Otwórz terminal (`cmd.exe`), **zmień folder na folder główny projektu** i uruchom komendy: @@ -287,5 +287,5 @@ pomocą adresów URL: To wszystko. Teraz tylko musisz poczekać na zakończenie procesu! Po wszystkim możesz przejść do lokalnego projektu za pomocą adresów URL: -* front-end: http://y2aa-frontend.dev -* back-end: http://y2aa-backend.dev +* front-end: http://y2aa-frontend.test +* back-end: http://y2aa-backend.test diff --git a/docs/guide-pl/topic-shared-hosting.md b/docs/guide-pl/topic-shared-hosting.md index 8c795e7450..f8d0ef6763 100644 --- a/docs/guide-pl/topic-shared-hosting.md +++ b/docs/guide-pl/topic-shared-hosting.md @@ -4,7 +4,7 @@ Korzystanie z zaawansowanego szablonu projektu w środowisku współdzielonym Wdrożenie zaawansowanego szablonu projektu w środowisku współdzielonym jest nieco bardziej skomplikowane niż w przypadku podstawowego szablonu, ponieważ zawiera on dwa foldery web (foldery, na które wskazuje adres serwisu), co nie jest wspierane przez serwery takich środowisk. Konieczna jest modyfikacja struktury folderów tak, aby adresem URL front-endu -stał się `http://site.local`, a back-endu `http://site.local/admin`. +stał się `http://site.test`, a back-endu `http://site.test/admin`. ### Przenieś skrypty wejściowe do jednego folderu web diff --git a/docs/guide-pt-BR/start-installation.md b/docs/guide-pt-BR/start-installation.md index 75b14679f8..27eab42cc6 100644 --- a/docs/guide-pt-BR/start-installation.md +++ b/docs/guide-pt-BR/start-installation.md @@ -48,15 +48,15 @@ para inicializar a aplicação, sendo necessário realizá-los apenas uma vez no 4. Configure a raiz dos documentos do seu servidor Web: - - para o frontend `/caminho/para/aplicacao-yii/frontend/web/` usando URL `http://frontend.dev/` - - para o backend `/caminho/para/aplicacao-yii/backend/web/` usando URL `http://backend.dev/` + - para o frontend `/caminho/para/aplicacao-yii/frontend/web/` usando URL `http://frontend.test/` + - para o backend `/caminho/para/aplicacao-yii/backend/web/` usando URL `http://backend.test/` Exemplo de configuração para servidores Apache ```apache - ServerName frontend.dev + ServerName frontend.test DocumentRoot "/caminho/para/aplicacao-yii/frontend/web/" @@ -76,7 +76,7 @@ para inicializar a aplicação, sendo necessário realizá-los apenas uma vez no - ServerName backend.dev + ServerName backend.test DocumentRoot "/caminho/para/aplicacao-yii/backend/web/" @@ -106,7 +106,7 @@ para inicializar a aplicação, sendo necessário realizá-los apenas uma vez no listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name frontend.dev; + server_name frontend.test; root /caminho/para/aplicacao-yii/frontend/web/; index index.php; @@ -144,7 +144,7 @@ para inicializar a aplicação, sendo necessário realizá-los apenas uma vez no listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name backend.dev; + server_name backend.test; root /caminho/para/aplicacao-yii/backend/web/; index index.php; @@ -184,8 +184,8 @@ para inicializar a aplicação, sendo necessário realizá-los apenas uma vez no Adicione as seguintes linhas: ``` - 127.0.0.1 frontend.dev - 127.0.0.1 backend.dev + 127.0.0.1 frontend.test + 127.0.0.1 backend.test ``` Para se autenticar na aplicação é necessário que primeiro, você se registre com qualquer um dos seus endereços de e-mail, usuário e senha. @@ -228,8 +228,8 @@ Esta é a forma mais simples porém, mais demorada (~20 min). ``` Isso é tudo. Basta aguardar a conclusão! Após isso você pode acessar o projeto localmente pelas URLs: -* frontend: http://y2aa-frontend.dev -* backend: http://y2aa-backend.dev +* frontend: http://y2aa-frontend.test +* backend: http://y2aa-backend.test #### Manual para usuários Windows @@ -247,8 +247,8 @@ Isso é tudo. Basta aguardar a conclusão! Após isso você pode acessar o proje 7. Adicione as seguintes linhas no [arquivo de hosts](https://pt.wikipedia.org/wiki/Hosts_(arquivo)): ``` - 192.168.83.137 y2aa-frontend.dev - 192.168.83.137 y2aa-backend.dev + 192.168.83.137 y2aa-frontend.test + 192.168.83.137 y2aa-backend.test ``` 8. Abra o terminal (`cmd.exe`), **entre no diretório raiz do projeto** e execute os comandos: @@ -261,6 +261,6 @@ Isso é tudo. Basta aguardar a conclusão! Após isso você pode acessar o proje (Você pode ler [aqui](http://pt.wikihow.com/Alterar-Diret%C3%B3rios-no-Prompt-de-Comandos) como alterar diretórios no prompt de comando) Isso é tudo. Basta aguardar a conclusão! Após isso você pode acessar o projeto localmente pelas URLs: -* frontend: http://y2aa-frontend.dev -* backend: http://y2aa-backend.dev +* frontend: http://y2aa-frontend.test +* backend: http://y2aa-backend.test diff --git a/docs/guide-zh-CN/start-installation.md b/docs/guide-zh-CN/start-installation.md index 7424b3c49f..5ae251e1d9 100644 --- a/docs/guide-zh-CN/start-installation.md +++ b/docs/guide-zh-CN/start-installation.md @@ -45,14 +45,14 @@ 4. 设置Web服务器的文档根目录: - - 对于前端 `/path/to/yii-application/frontend/web/` 并且使用URL `http://frontend.dev/` - - 对于后端 `/path/to/yii-application/backend/web/` 并且使用URL `http://backend.dev/` + - 对于前端 `/path/to/yii-application/frontend/web/` 并且使用URL `http://frontend.test/` + - 对于后端 `/path/to/yii-application/backend/web/` 并且使用URL `http://backend.test/` 对于Apache,使用如下配置: ```apache - ServerName frontend.dev + ServerName frontend.test DocumentRoot "/path/to/yii-application/frontend/web/" @@ -72,7 +72,7 @@ - ServerName backend.dev + ServerName backend.test DocumentRoot "/path/to/yii-application/backend/web/" @@ -102,7 +102,7 @@ listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name frontend.dev; + server_name frontend.test; root /path/to/yii-application/frontend/web/; index index.php; @@ -145,7 +145,7 @@ listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name backend.dev; + server_name backend.test; root /path/to/yii-application/backend/web/; index index.php; @@ -190,8 +190,8 @@ 添加以下行: ``` - 127.0.0.1 frontend.dev - 127.0.0.1 backend.dev + 127.0.0.1 frontend.test + 127.0.0.1 backend.test ``` 要登录应用程序,您需要先注册您的电子邮件地址,用户名和密码。 @@ -235,8 +235,8 @@ 等待完成后,在浏览器中访问如下URL即可 -* frontend: http://y2aa-frontend.dev -* backend: http://y2aa-backend.dev +* frontend: http://y2aa-frontend.test +* backend: http://y2aa-backend.test #### Windows 用户手册 @@ -254,8 +254,8 @@ 7. 添加如下代码到 [hosts 文件](https://en.wikipedia.org/wiki/Hosts_(file)): ``` - 192.168.83.137 y2aa-frontend.dev - 192.168.83.137 y2aa-backend.dev + 192.168.83.137 y2aa-frontend.test + 192.168.83.137 y2aa-backend.test ``` 8. 打开终端 (`cmd.exe`), **切换路径至项目根目录** 并且执行如下命令: @@ -269,6 +269,6 @@ 等待完成后,在浏览器中访问如下URL即可 -* frontend: http://y2aa-frontend.dev -* backend: http://y2aa-backend.dev +* frontend: http://y2aa-frontend.test +* backend: http://y2aa-backend.test diff --git a/docs/guide-zh-CN/topic-shared-hosting.md b/docs/guide-zh-CN/topic-shared-hosting.md index 664a6873d5..5c78ac997b 100644 --- a/docs/guide-zh-CN/topic-shared-hosting.md +++ b/docs/guide-zh-CN/topic-shared-hosting.md @@ -1,7 +1,7 @@ 在虚拟主机上使用高级项目模板 ================================== -将高级项目模板部署到虚拟主机,相比基本项目模版来说有点棘手,因为它有两个webroots,共享托管网络服务器不支持。 我们需要调整目录结构,然后前端的 URL 是 `http://site.local` 而后端的 URL 是 `http://site.local/admin` . +将高级项目模板部署到虚拟主机,相比基本项目模版来说有点棘手,因为它有两个webroots,共享托管网络服务器不支持。 我们需要调整目录结构,然后前端的 URL 是 `http://site.test` 而后端的 URL 是 `http://site.test/admin` . ### 将入口文件移动到单个webroot diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 62a1947a78..d4d128033e 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -50,14 +50,14 @@ the installed application. You only need to do these once for all. 4. Set document roots of your web server: - - for frontend `/path/to/yii-application/frontend/web/` and using the URL `http://frontend.dev/` - - for backend `/path/to/yii-application/backend/web/` and using the URL `http://backend.dev/` + - for frontend `/path/to/yii-application/frontend/web/` and using the URL `http://frontend.test/` + - for backend `/path/to/yii-application/backend/web/` and using the URL `http://backend.test/` For Apache it could be the following: ```apache - ServerName frontend.dev + ServerName frontend.test DocumentRoot "/path/to/yii-application/frontend/web/" @@ -83,7 +83,7 @@ the installed application. You only need to do these once for all. - ServerName backend.dev + ServerName backend.test DocumentRoot "/path/to/yii-application/backend/web/" @@ -119,7 +119,7 @@ the installed application. You only need to do these once for all. listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name frontend.dev; + server_name frontend.test; root /path/to/yii-application/frontend/web/; index index.php; @@ -162,7 +162,7 @@ the installed application. You only need to do these once for all. listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name backend.dev; + server_name backend.test; root /path/to/yii-application/backend/web/; index index.php; @@ -207,8 +207,8 @@ the installed application. You only need to do these once for all. Add the following lines: ``` - 127.0.0.1 frontend.dev - 127.0.0.1 backend.dev + 127.0.0.1 frontend.test + 127.0.0.1 backend.test ``` To login into the application, you need to first sign up, with any of your email address, username and password. @@ -251,8 +251,8 @@ This way is the easiest but long (~20 min). ``` That's all. You just need to wait for completion! After that you can access project locally by URLs: -* frontend: http://y2aa-frontend.dev -* backend: http://y2aa-backend.dev +* frontend: http://y2aa-frontend.test +* backend: http://y2aa-backend.test #### Manual for Windows users @@ -277,6 +277,6 @@ That's all. You just need to wait for completion! After that you can access proj (You can read [here](http://www.wikihow.com/Change-Directories-in-Command-Prompt) how to change directories in command prompt) That's all. You just need to wait for completion! After that you can access project locally by URLs: -* frontend: http://y2aa-frontend.dev -* backend: http://y2aa-backend.dev +* frontend: http://y2aa-frontend.test +* backend: http://y2aa-backend.test diff --git a/docs/guide/topic-shared-hosting.md b/docs/guide/topic-shared-hosting.md index e85347daae..de234ef944 100644 --- a/docs/guide/topic-shared-hosting.md +++ b/docs/guide/topic-shared-hosting.md @@ -3,7 +3,7 @@ Using advanced project template at shared hosting Deploying an advanced project template to shared hosting is a bit trickier than a basic one because it has two webroots, which shared hosting webservers don't support. We will need to adjust the directory structure so frontend URL will be -`http://site.local` and backend URL will be `http://site.local/admin`. +`http://site.test` and backend URL will be `http://site.test/admin`. ### Move entry scripts into single webroot diff --git a/vagrant/nginx/app.conf b/vagrant/nginx/app.conf index 46e8a8900d..711ca7cdbd 100644 --- a/vagrant/nginx/app.conf +++ b/vagrant/nginx/app.conf @@ -6,7 +6,7 @@ server { listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name y2aa-frontend.dev; + server_name y2aa-frontend.test; root /app/frontend/web/; index index.php; @@ -45,7 +45,7 @@ server { listen 80; ## listen for ipv4 #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 - server_name y2aa-backend.dev; + server_name y2aa-backend.test; root /app/backend/web/; index index.php; From 319c0d5dfac5d19b575412e6e62894dc781e3930 Mon Sep 17 00:00:00 2001 From: PowerGamer1 Date: Sun, 7 Jan 2018 22:54:59 +0200 Subject: [PATCH 006/187] Removed unnecessary copyright comments. [skip ci] (#333) --- environments/dev/yii | 4 ---- environments/dev/yii_test | 4 ---- environments/dev/yii_test.bat | 5 ----- environments/prod/yii | 4 ---- init | 6 ------ init.bat | 5 ----- yii.bat | 5 ----- 7 files changed, 33 deletions(-) diff --git a/environments/dev/yii b/environments/dev/yii index 1dd899f15c..b93b5cf50c 100644 --- a/environments/dev/yii +++ b/environments/dev/yii @@ -2,10 +2,6 @@ -rem @link http://www.yiiframework.com/ -rem @copyright Copyright (c) 2008 Yii Software LLC -rem @license http://www.yiiframework.com/license/ rem ------------------------------------------------------------- @setlocal diff --git a/environments/prod/yii b/environments/prod/yii index da522cc16f..5b0d8900d8 100644 --- a/environments/prod/yii +++ b/environments/prod/yii @@ -2,10 +2,6 @@ - * - * @link http://www.yiiframework.com/ - * @copyright Copyright (c) 2008 Yii Software LLC - * @license http://www.yiiframework.com/license/ */ if (!extension_loaded('openssl')) { diff --git a/init.bat b/init.bat index e50c242c69..1b92c19754 100644 --- a/init.bat +++ b/init.bat @@ -2,11 +2,6 @@ rem ------------------------------------------------------------- rem Yii command line init script for Windows. -rem -rem @author Qiang Xue -rem @link http://www.yiiframework.com/ -rem @copyright Copyright (c) 2008 Yii Software LLC -rem @license http://www.yiiframework.com/license/ rem ------------------------------------------------------------- @setlocal diff --git a/yii.bat b/yii.bat index d516b3a192..3a6894246c 100644 --- a/yii.bat +++ b/yii.bat @@ -2,11 +2,6 @@ rem ------------------------------------------------------------- rem Yii command line bootstrap script for Windows. -rem -rem @author Qiang Xue -rem @link http://www.yiiframework.com/ -rem @copyright Copyright (c) 2008 Yii Software LLC -rem @license http://www.yiiframework.com/license/ rem ------------------------------------------------------------- @setlocal From 382aa48de286c4b5cf4a7e5461d26996119510a2 Mon Sep 17 00:00:00 2001 From: Pavel Ivanov Date: Wed, 7 Feb 2018 00:10:43 +0300 Subject: [PATCH 007/187] Moving shared vagrant provision code to common.sh (#322) --- vagrant/provision/always-as-root.sh | 8 +------- vagrant/provision/common.sh | 9 +++++++++ vagrant/provision/once-as-root.sh | 10 ++-------- vagrant/provision/once-as-vagrant.sh | 10 ++-------- 4 files changed, 14 insertions(+), 23 deletions(-) create mode 100644 vagrant/provision/common.sh diff --git a/vagrant/provision/always-as-root.sh b/vagrant/provision/always-as-root.sh index e5d8e33e12..6dcbf4ffb8 100644 --- a/vagrant/provision/always-as-root.sh +++ b/vagrant/provision/always-as-root.sh @@ -1,12 +1,6 @@ #!/usr/bin/env bash -#== Bash helpers == - -function info { - echo " " - echo "--> $1" - echo " " -} +source /app/vagrant/provision/common.sh #== Provision script == diff --git a/vagrant/provision/common.sh b/vagrant/provision/common.sh new file mode 100644 index 0000000000..ab5e1e0c1f --- /dev/null +++ b/vagrant/provision/common.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +#== Bash helpers == + +function info { + echo " " + echo "--> $1" + echo " " +} diff --git a/vagrant/provision/once-as-root.sh b/vagrant/provision/once-as-root.sh index 4d07c0dafc..a9ae46a44f 100644 --- a/vagrant/provision/once-as-root.sh +++ b/vagrant/provision/once-as-root.sh @@ -1,17 +1,11 @@ #!/usr/bin/env bash +source /app/vagrant/provision/common.sh + #== Import script args == timezone=$(echo "$1") -#== Bash helpers == - -function info { - echo " " - echo "--> $1" - echo " " -} - #== Provision script == info "Provision-script user: `whoami`" diff --git a/vagrant/provision/once-as-vagrant.sh b/vagrant/provision/once-as-vagrant.sh index 33a3051eca..ffaa898da7 100644 --- a/vagrant/provision/once-as-vagrant.sh +++ b/vagrant/provision/once-as-vagrant.sh @@ -1,17 +1,11 @@ #!/usr/bin/env bash +source /app/vagrant/provision/common.sh + #== Import script args == github_token=$(echo "$1") -#== Bash helpers == - -function info { - echo " " - echo "--> $1" - echo " " -} - #== Provision script == info "Provision-script user: `whoami`" From fe3d2d767eb15b332b093c12fb6fadc70829ccc4 Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Sat, 17 Feb 2018 20:23:42 +0100 Subject: [PATCH 008/187] Disable composer-asset-plugin if it's installed (#318) See https://github.com/yiisoft/yii2-app-basic/issues/149 --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index cec9a8e27c..d8188f1e0e 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,10 @@ "codeception/verify": "~0.3.1" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, "repositories": [ { From f1e5ae1636224536db02240c2499407a4ec33dbe Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 18 Feb 2018 23:49:21 +0300 Subject: [PATCH 009/187] Updated badges --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6acca0f433..66fc082341 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,8 @@ deploying the application in different environments. Documentation is at [docs/guide/README.md](docs/guide/README.md). -[![Latest Stable Version](https://poser.pugx.org/yiisoft/yii2-app-advanced/v/stable.png)](https://packagist.org/packages/yiisoft/yii2-app-advanced) -[![Total Downloads](https://poser.pugx.org/yiisoft/yii2-app-advanced/downloads.png)](https://packagist.org/packages/yiisoft/yii2-app-advanced) +[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced) +[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced) [![Build Status](https://travis-ci.org/yiisoft/yii2-app-advanced.svg?branch=master)](https://travis-ci.org/yiisoft/yii2-app-advanced) DIRECTORY STRUCTURE From 11c04d4727c0e81267fd83ee5b14806ec5d02d8c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 18 Feb 2018 23:55:03 +0300 Subject: [PATCH 010/187] Added cookie validation key to tests config --- common/config/test.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/config/test.php b/common/config/test.php index c952c415a5..cbc18c2305 100644 --- a/common/config/test.php +++ b/common/config/test.php @@ -7,5 +7,8 @@ 'class' => 'yii\web\User', 'identityClass' => 'common\models\User', ], + 'request' => [ + 'cookieValidationKey' => 'test', + ], ], ]; From 1b23fda310c611b72ca59a812e524ba1c9155d0a Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Mon, 19 Feb 2018 00:29:55 +0200 Subject: [PATCH 011/187] minor --- backend/controllers/SiteController.php | 4 ++-- common/models/LoginForm.php | 2 +- common/models/User.php | 16 ++++++++-------- frontend/controllers/SiteController.php | 4 ++-- frontend/models/ContactForm.php | 4 ++-- frontend/models/PasswordResetRequestForm.php | 2 +- frontend/models/ResetPasswordForm.php | 2 +- frontend/models/SignupForm.php | 2 +- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/backend/controllers/SiteController.php b/backend/controllers/SiteController.php index a870ad87e3..6d0a16592a 100644 --- a/backend/controllers/SiteController.php +++ b/backend/controllers/SiteController.php @@ -13,7 +13,7 @@ class SiteController extends Controller { /** - * @inheritdoc + * {@inheritdoc} */ public function behaviors() { @@ -42,7 +42,7 @@ public function behaviors() } /** - * @inheritdoc + * {@inheritdoc} */ public function actions() { diff --git a/common/models/LoginForm.php b/common/models/LoginForm.php index f1f5073eb9..5a4dff5a4f 100644 --- a/common/models/LoginForm.php +++ b/common/models/LoginForm.php @@ -17,7 +17,7 @@ class LoginForm extends Model /** - * @inheritdoc + * {@inheritdoc} */ public function rules() { diff --git a/common/models/User.php b/common/models/User.php index 2f4508f607..e1f39cb6f3 100644 --- a/common/models/User.php +++ b/common/models/User.php @@ -28,7 +28,7 @@ class User extends ActiveRecord implements IdentityInterface /** - * @inheritdoc + * {@inheritdoc} */ public static function tableName() { @@ -36,7 +36,7 @@ public static function tableName() } /** - * @inheritdoc + * {@inheritdoc} */ public function behaviors() { @@ -46,7 +46,7 @@ public function behaviors() } /** - * @inheritdoc + * {@inheritdoc} */ public function rules() { @@ -57,7 +57,7 @@ public function rules() } /** - * @inheritdoc + * {@inheritdoc} */ public static function findIdentity($id) { @@ -65,7 +65,7 @@ public static function findIdentity($id) } /** - * @inheritdoc + * {@inheritdoc} */ public static function findIdentityByAccessToken($token, $type = null) { @@ -119,7 +119,7 @@ public static function isPasswordResetTokenValid($token) } /** - * @inheritdoc + * {@inheritdoc} */ public function getId() { @@ -127,7 +127,7 @@ public function getId() } /** - * @inheritdoc + * {@inheritdoc} */ public function getAuthKey() { @@ -135,7 +135,7 @@ public function getAuthKey() } /** - * @inheritdoc + * {@inheritdoc} */ public function validateAuthKey($authKey) { diff --git a/frontend/controllers/SiteController.php b/frontend/controllers/SiteController.php index d838569d75..d24e10742a 100644 --- a/frontend/controllers/SiteController.php +++ b/frontend/controllers/SiteController.php @@ -19,7 +19,7 @@ class SiteController extends Controller { /** - * @inheritdoc + * {@inheritdoc} */ public function behaviors() { @@ -50,7 +50,7 @@ public function behaviors() } /** - * @inheritdoc + * {@inheritdoc} */ public function actions() { diff --git a/frontend/models/ContactForm.php b/frontend/models/ContactForm.php index d0cc9cb681..8c00d47011 100644 --- a/frontend/models/ContactForm.php +++ b/frontend/models/ContactForm.php @@ -18,7 +18,7 @@ class ContactForm extends Model /** - * @inheritdoc + * {@inheritdoc} */ public function rules() { @@ -33,7 +33,7 @@ public function rules() } /** - * @inheritdoc + * {@inheritdoc} */ public function attributeLabels() { diff --git a/frontend/models/PasswordResetRequestForm.php b/frontend/models/PasswordResetRequestForm.php index c11aeecc02..56c2bc8abe 100644 --- a/frontend/models/PasswordResetRequestForm.php +++ b/frontend/models/PasswordResetRequestForm.php @@ -14,7 +14,7 @@ class PasswordResetRequestForm extends Model /** - * @inheritdoc + * {@inheritdoc} */ public function rules() { diff --git a/frontend/models/ResetPasswordForm.php b/frontend/models/ResetPasswordForm.php index fb36dd0668..f5809867a8 100644 --- a/frontend/models/ResetPasswordForm.php +++ b/frontend/models/ResetPasswordForm.php @@ -38,7 +38,7 @@ public function __construct($token, $config = []) } /** - * @inheritdoc + * {@inheritdoc} */ public function rules() { diff --git a/frontend/models/SignupForm.php b/frontend/models/SignupForm.php index 57a51d849f..a66a87570e 100644 --- a/frontend/models/SignupForm.php +++ b/frontend/models/SignupForm.php @@ -15,7 +15,7 @@ class SignupForm extends Model /** - * @inheritdoc + * {@inheritdoc} */ public function rules() { From 6f61903b26a6ac58737cee700beadf38e36719a1 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Mon, 19 Feb 2018 00:38:11 +0200 Subject: [PATCH 012/187] PHPdocs fixed [skip ci] --- backend/tests/functional/LoginCest.php | 1 - common/tests/unit/models/LoginFormTest.php | 1 + common/widgets/Alert.php | 1 + frontend/tests/functional/LoginCest.php | 12 ++++++------ 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/backend/tests/functional/LoginCest.php b/backend/tests/functional/LoginCest.php index 7346999622..128978eb6e 100644 --- a/backend/tests/functional/LoginCest.php +++ b/backend/tests/functional/LoginCest.php @@ -10,7 +10,6 @@ */ class LoginCest { - /** * Load fixtures before db transaction begin * Called in _before() diff --git a/common/tests/unit/models/LoginFormTest.php b/common/tests/unit/models/LoginFormTest.php index 1411e7f434..27c521be53 100644 --- a/common/tests/unit/models/LoginFormTest.php +++ b/common/tests/unit/models/LoginFormTest.php @@ -16,6 +16,7 @@ class LoginFormTest extends \Codeception\Test\Unit */ protected $tester; + /** * @return array */ diff --git a/common/widgets/Alert.php b/common/widgets/Alert.php index 2893182573..7281fa85f0 100644 --- a/common/widgets/Alert.php +++ b/common/widgets/Alert.php @@ -43,6 +43,7 @@ class Alert extends \yii\bootstrap\Widget */ public $closeButton = []; + /** * {@inheritdoc} */ diff --git a/frontend/tests/functional/LoginCest.php b/frontend/tests/functional/LoginCest.php index 02cbb6c44f..ed358d0ecb 100644 --- a/frontend/tests/functional/LoginCest.php +++ b/frontend/tests/functional/LoginCest.php @@ -8,12 +8,12 @@ class LoginCest { /** - * Load fixtures before db transaction begin - * Called in _before() - * @see \Codeception\Module\Yii2::_before() - * @see \Codeception\Module\Yii2::loadFixtures() - * @return array - */ + * Load fixtures before db transaction begin + * Called in _before() + * @see \Codeception\Module\Yii2::_before() + * @see \Codeception\Module\Yii2::loadFixtures() + * @return array + */ public function _fixtures() { return [ From 397860dedb94cde688dd3a358f204d319e683927 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Mon, 19 Feb 2018 00:42:58 +0200 Subject: [PATCH 013/187] release version 2.0.14 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d8188f1e0e..5e2608d70d 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.6", From 4e9d6fe4dce54f053cfa7373567dca1163fe0c56 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Mon, 19 Feb 2018 00:43:14 +0200 Subject: [PATCH 014/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5e2608d70d..d8188f1e0e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.6", From 41990b20d0ba7087bc587eee4578973185155bda Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 19 Feb 2018 09:24:58 +0100 Subject: [PATCH 015/187] Update composer.json updated yii2 version requirement to require a version without known security issues. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d8188f1e0e..6c666ada04 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "minimum-stability": "dev", "require": { "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, From 79616d1db270433d74eb9974c6649c293f034a99 Mon Sep 17 00:00:00 2001 From: bscheshirwork Date: Mon, 19 Feb 2018 18:43:46 +0300 Subject: [PATCH 016/187] PHPDocs and style [skip ci] (#343) --- frontend/tests/functional/LoginCest.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/tests/functional/LoginCest.php b/frontend/tests/functional/LoginCest.php index ed358d0ecb..df91a8ef35 100644 --- a/frontend/tests/functional/LoginCest.php +++ b/frontend/tests/functional/LoginCest.php @@ -7,20 +7,20 @@ class LoginCest { - /** - * Load fixtures before db transaction begin - * Called in _before() - * @see \Codeception\Module\Yii2::_before() - * @see \Codeception\Module\Yii2::loadFixtures() - * @return array - */ + /** + * Load fixtures before db transaction begin + * Called in _before() + * @see \Codeception\Module\Yii2::_before() + * @see \Codeception\Module\Yii2::loadFixtures() + * @return array + */ public function _fixtures() { return [ 'user' => [ 'class' => UserFixture::className(), - 'dataFile' => codecept_data_dir() . 'login_data.php' - ] + 'dataFile' => codecept_data_dir() . 'login_data.php', + ], ]; } @@ -49,7 +49,7 @@ public function checkWrongPassword(FunctionalTester $I) $I->submitForm('#login-form', $this->formParams('admin', 'wrong')); $I->seeValidationError('Incorrect username or password.'); } - + public function checkValidLogin(FunctionalTester $I) { $I->submitForm('#login-form', $this->formParams('erau', 'password_0')); From f9100a0f15e0c4c53db77bac1559d6e29304b0eb Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 15 Mar 2018 01:17:51 +0300 Subject: [PATCH 017/187] Register meta tags with a method that works well with page cache --- backend/views/layouts/main.php | 2 +- frontend/views/layouts/main.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/views/layouts/main.php b/backend/views/layouts/main.php index 8585fffc3d..4329c6d6fa 100644 --- a/backend/views/layouts/main.php +++ b/backend/views/layouts/main.php @@ -19,7 +19,7 @@ - + registerCsrfMetaTags() ?> <?= Html::encode($this->title) ?> head() ?> diff --git a/frontend/views/layouts/main.php b/frontend/views/layouts/main.php index f4beaf5696..ce26e56ad0 100644 --- a/frontend/views/layouts/main.php +++ b/frontend/views/layouts/main.php @@ -19,7 +19,7 @@ - + registerCsrfMetaTags() ?> <?= Html::encode($this->title) ?> head() ?> From febabd590d4e42f1ee85dce92e102d012f398d59 Mon Sep 17 00:00:00 2001 From: Christopher Date: Thu, 29 Mar 2018 15:14:33 -0600 Subject: [PATCH 018/187] Translation of "Testing" documentation to Spanish (#352) [skip ci] --- docs/guide-es/images/tests.png | Bin 0 -> 355296 bytes docs/guide-es/start-testing.md | 125 +++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 docs/guide-es/images/tests.png create mode 100644 docs/guide-es/start-testing.md diff --git a/docs/guide-es/images/tests.png b/docs/guide-es/images/tests.png new file mode 100644 index 0000000000000000000000000000000000000000..a5373362b9a76c64047c5a67fa62d071e1f7e5ee GIT binary patch literal 355296 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

`2Lx#dsTyp>5|P~voHM55j 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�LKP|pP_617sY9LZMPkU!Z|ij z!ELy!2D&%F+4Lk%T;GrM!iLg|Fd5{=DXiOemvEz)2mrNz(1PuBfdZvw(&!N;n>1so_it6x1d|TzYNohk#V$Ome187TjNx#Cr8``e^D+IZs2y#q^@ARC$>UmLi*z z4gZFqs2+{~m=NgjN$1h4ZCgIsU1)e1FhSF^^3C%|9&?FIsOyft-+aPU;uA&+qMHWYErpyu}NS&yBW{X_JbCXe9C>SeIs2ytru?Ltxqbw zdhO?*X5Cn2S04Y@C_ab52F|^+XInN0bvK$26|^%u2fDQtBdKG>0Z0%u1^V!y5#@IL7r zHJNF`a-fn-fBVd~)2lm$oHky2IDI@_OYuUT9%E@TO_a1qXHO{?)50UNOM`==~aLybr3I z66%6mcCk9Bo+IFbEIZ^~G#?(gK+kwJ%f#M$uGv!g%g}kZ_Z9lJgw1=HK&6Mt>uM2S zUNT}-<8YfS|EsyIHj>9&pVw6YoDAi@@41ky`yZ=^=egbpb5?(*lD61Cu}#Y@lE;2* zOxMe`!Y2P0IC%_$qr81KXPWG3H}E@emH=DG5-}lbz%DRHn~HfUKR8mf?OKED*ch~C zo|E=(eQ2TjN@lN)o$6P85Kb5=S8la%N!SRc(P_P`Wrpi-djxIT)6p`*eIE1kwR$-J z8J)pL3E7EF{l$RGdTpj`w?FXB{+{Qzp6kE6ER1q0T}R-x$-Bqh!T~8%s|}aS`|g%w zWegy&lNloX(m*9rdmKjohKT9!s>Q4O8S7&vGal>(?Yp(-V@aNr*S4pn>gOG4md?s} zf!!U}0NZ4FYW;_&PHlsm?!|HC(60Nm$;W_jr}p*tX#ln2-fy2v@5LvJQaJEgoblgY zUd)#R^UNFGn7V?LUDLLMYR`^~SC!R|`>IZG@tt3xFo#qTx!>{gh7JJ$bi}_-`ndwY zpIb!?p&f|(nWONvow49%a+VV1a?<{b+o`I*&vtYqAciC2vx2EA@L+bV%{F2(t;y?u zeK5Ly!2kC_G>^kVNASA48xrus(zLktI4~P0YF})#dpo)AzaTH_OGBM`XdOnrKw|-sN2URDPFO@oEftIT}veVB-aVwuyILZhMiZF2a7J z&2eo9#&??mUI!$aqx)yC*WG6uK4;>*3zs{cDuR$XDi89b@VgYZp(4Db} zJtZ}!f!p}?trjjuX5G2A$E@jeb)4YYqUxxF%F}H?fJ=A*rXD1S(TLSEqIVX$^Lo`} zcKb$eebfD*C;5Kmr=#?vqJra06~R zZFKxgXtOa1??}#L_jwBJ}wF@5>Ka{5xgHQC`)(?Dpo*sg-doOrWeg z{e!XJ%YAG0T&0a5>1FaYL^lr>Y*)_uax%dwdVPs5d|-TYL^5h#P4cDVxmk#ZSNN*w>?EH`HF%VqfGP@>12+wS5sb$F9xkKf+?r7TCj&yBn| zW?SL$T^FnEN|b#V9LA~N7h->$9^M#(H$4A_$|~rZr`(p-@%MN6ts7o(r%(i&9%w5>h5WU z5R%tnNTAE)Y>GE24gbd?3nH{DKHCM}Wa%V)F}K+|r5uUeCWb0>8>mnjw-VI#B)evc z<5FFPdVBDA@%#a zO#UuPTinl6@fmpvfpytA61DkG@7N8YX|KM_H3ou`|B3jaLCHFSKrlINp7ZebI{@f8 zZuWZ(+vkJ>6GL)Du0{Gthdr7^?=$N~>zB{;mjk?VPVXxV7Gb=$_hwZedd+U7f~C@7 zV2htnH`aX?Al(hM>7KXr8y%itL@12(vQr6T)N-Ol%Jw;;Jd>* zYSOpCW5ohHbA|TJFQ&P~qy9`#xq8RinGg**u0{FtrZxk4IX7E9>KoZhXh! zEwf73QPLVDz4fxyQ-s^)_z<`lV(s=H^H!C`W?v1>PJby76}eSE-%i_b`N>0eid3bG z)0}|n6Y??@OI>qb6(c-MZy69ZRYL@S`c9=!38ziFB9Tf_i>F)MsktIgXHtZ z_^#`9C;QgtVoNCX@!{Y{u?Wkdim3Nf{;2?D?HSYP^RN0@2+OehVX3jt94j1PV%xUP z7x|&36prTm#sv&p>1XQ&?Pl2Y$BlZG*2fP*yJj1$55b0ae4omr&vb;mSO4jF?1soo z%&HbH*vP?}$WXgVbshW0#ncKnuz5cZ}j;L!+f9-x;KNLF?ww*?Nz8 zkPDgpDE!SPvMx$*E$wID#CK(|A>!Gj%UB?PE?aGq2e4Kf&C`nvI3uMpHRq+mHQ5>s zqU93cC-Q?V+XpV%2*CrcEHrX)NOsa-Q_Iz=V?six>egJ9U0A6FQF=kP4nA{|O8YSf zGT4;}AtaxsDAfTQnXN7dujUaL$CZ#!8tor(v5%W=VW%5%9zQ*5Vh#&@=U=%lH)Bvt zOlx_*bEYLIUQi<20qQ}b6-cy+LmTbWB@8m<%CqB(%b*@qe%V1axOCrBZ~cO>(^ zG;zD&FEJm{WEUG~h> z;N$bB1!l~ya+gXV!LAT+W0u{C4qf^71l*9hS4gkZfakkt4LRge+K4Ah8vu%%uG{a;==Jei^NbDar7LZDD%5n?q%xOXtEOM zw_cv9cqa>DaFC3+LviOzNP=Be;v?24AD_10b)u#lNiV<4_f6Jg*?7^-sbt}VU!+H7MJSb1i>0|Zi)F0n>(KVaq?{ebOO-Tk%JvGt1tPS&TZ z36h#S?xOM_5x-(0IFpxH?dMMNG#VeVktVOe=I0ruz{TpPAtxgYYS?d``VQ;xfPVJV z>Z*#PA_>l7tzaHA!rnNhsbYJ%zSSBDgfg&;|5dL~7N7OkhW`O8YM1lUL;Fc*EBou) zpM0+`%I&}Q9sRH7d7JZ4N$fdlA+6fy-gJCk8;9?HUtGYbJ|D(yZ1`-yLAC8DeMvBl zRMM$GoDmhlCapWaVO{@wAzpcWs*omZz(12+m86 zLpyKg&PzQe0AkNpIaR#&5m?P{`*1iTK*C!ty!U5!?$FU_{Z3ok(=$E{I2br>K7kD! z@AiLw_3K<~T>t4ffA+ZD-%IhRBD!^icxNBWC^1)dr?X^xC=jOY;0@QU^>BJoes=%& zq}{RO*3U0XCfBdy`H6gfl~sJ*@~W3-OICpxEpOk?z{;;U%7fhV(qP7zOUuZhX>O^`9aW{}OsD zk#rl^zS{(?#ME|%YJx6h39h_8o$nW71L%#$EstHzW5a|YxYk#R-L}j7#x2KPyxqTG z3Xz_3`yHPR+jBDN&vbs#n8f^SFmrk^w0hlO;6~+mUdqykcI~8NgISRu0E-=yUXJ$O zi8h^&v%2Quek0O^v~TfltQF4Zscr}X3A6@2$LrAHpCkT1tA_R+_v%ZPIF!sP zsP`J(Y~(qB;Pku|_@+w7yrO>DhWGUj{5bw9yz^%mv+Hbyisx5u=WUc=uC>zRq-OkD zzxP@DW8Tf9`((h*m0`y{!Rh6FyYcx+c>N=HfPfY6)g2D%!hQU0v{iMw`%d*nL{MeG zZ}b3>THb)8D5v$QDz%B@YfI7PrQIXZocgTK7b$*|KHvUMc{;vcQmnfYkl)01zxB92 z$ABPI3Hof5<69)hx83dGG##{GhW1xKSp`G2f|cXj&&raEm|C|7s3!fs-+KLy>GAnv zhuBP6vjlb3?y7Knc4xJ-y=Svd_YtnGCcPQc3fq>A@`OKk3yU_cQImn&USlLDyzSZF zHs*YS9cuCCGM}`ndU>W_4Tq4npTkcQwx@B|bhV!!dPb{0?Nptg(!PBf^0#{adhR^r zK=5`;*mG0dxE<>926nAZz7=*d^V%uYLa(SDY9uYJe^fntSa-ZQXue~#GpR%oJ-IAB zUC^z13mk+}RlRmsD}BC|eSGWVIkjLAyXODUeBD&?d^GZ0?a%ne;pme0x3~RnE2qfw zefUa{z{v0Gearx-0*gh`+6~r?iDCV2pL0u29ybsmR`chO;PF>O4fov3#R>eF2S@_D zVSU_Ei6YWQx8vM6UPRlfDGWv`b(O@SeOD?O9B9%z>$-8~G%({#x<+bW%>G&%(1E47 z%7a9_+e(QZ{QfAp>9}&tU~Az-3bR#(6_(`z6LEc>s&I1+>(*SIvSq^w zrT#VEgTqduh zR^APrOl0u9ds~qcyP07Mj|Tm=bakg8YberVpUijF*AZC}E|?J9>AqG>kxpuO0D0hS zWlOYa+4{h%-@>$Ds`&KprZRV~qIp7dZr=4!)_0S*IEjO0+ttb?lJS6(io!Y5| z4cl#&PQC9XcQbyN-9(D^2MOl(S3GZ595bsnpt4tA(yEjz>R%PBus3};h!^L5cSV}#@x-BfkOtKETzEg8I{#NzAXZ_FSLO-2S4`I#>g;f?fz zZ9Dh_)JL*lc+MJv_ zwc~0l%clOb$c!&2t!N%WO|42YbtI%gpP|CA?8j-{v)Q>-M0a0XV#*w zL+i%g=IpCasEfw8jr5a#p0CM{5}Zyg+dG&AU%G{FNB2ec2*%y`6Mh83$NTRdAc|f` zzdodN9)wks2i#>3{JzhZWnG)Tdwnvl_jgDcxXS}o+$r3 z*7iU9OJaN=;FBH*|E>CQH_J(MrhLO~OyqSn4k$aj>TZ6WZ2EkLiShJ14>kxroc8{X zV9oOqqv>`3y34uuG#UkY?vQ<^3p{+*a2xZom?{H1U5aRMbFAqxnmw-6 zK5-lP?%Z=>(0Ca~`0qxsvGcKhT}lGWeLqA*eE;?D6i$`hNmDQ^{_15CqW=?x**d1^ z^%q|Ph4BGzgOTaS9DUQu4^MOQhgz;*m@q)$$QIk?T!S)?)(;>07EtiMZW5}c0IejDRIHvt zQKU(CRRPlBbTGSl5TT6kZvlrnpjUno)vH(Y;QuFKPeDMiT=&BUrjTR04k?1qNQ063 z;~EY+S;*Kd%_s*tm^=u|_?AnJp7Im2j!uMU9N_shC!Ay{$m-Rfg?iBzy zVhJDw*w%~Gvpqo4VwzMUpylGj{2p#vBk#@pJGbqj8NRPeXN|%<3mls+mH0T-qZUZN zDD7kWDzubS77$@=JU_%P*p7q*$y8~V-A$FIc(YCY(b6950bk1mNb1a&$wP?-(*5(+ zdmg?O7f@0{g%W$(eBc?eM+mUT@s0!}arV_2(^PbgN|g zO0tugN0yfRk}S+DkDVU@e1!p<`GG6K=6B6;eBO@7=dV8?xwrkD9{0T%ve~{{ezHb) ze?t4PeZ0NaZRL$v_i92|)#81f7>A4z|CvAgQ#VQel9u;szm8Gt zShtwLdv^DOH|_E$CGy2dBw&Yo^5Ct=EfhVPc*O6jWnwFGs(Ld=z!XId5I5%ZlN0az zoP7Q}^}NUpBjSFeqW#<7H|NbauQOrQ{&ylBmo|$VSIZWAH+X^um0sJm`@7*H9Y33$ zT5r?+XMK+!!?Q2scx(gWTHfiDqRs4-LV7U^lE>SfJZhh1J=d)CAM1wu78X3F-&SW_ zw?cQpb=6*LTck`EnukeueSVAYe)2YU{BCs(mVG~$V5affg4_kgRPnJNNi3>q^hW~F z^5MqtiU|ehC(|&g({KzMMLI}9{I7iKv67@vtj16KQ7{sh^5ix+4rec&YC^}ZOuNV- zc4}CLM{q(nUOMHUoI}?@wI>pyDTBM~fusc|BR;#O`vFMDPKy->-YJSD+lo{s+k$R1 zUn?D4WXGg*#YF%N%($TuA^g#h1L*toun7XW#v9pw)%j4%{53+M&-bysIS?>P)Yrnb z<=DIK7%3pM!VY9huKKl06D2_@@IXwVRUV@`oaDQBtcwd9(ezQ7qKt$(F4;gM8!w5l zK%sWPjVy-?ufu2Qz6&aL=Qn9`PCW;6Wu#d(KS zp-^x=0fLGH(0_poEw!1}OEH(C4sI3L)ph+ZtrIs20-ym29sCe(QFzxY1nBF#_2ab- zQl{B`d%alr`TCA?qSN>8BfCp^j%e5Df@adoV&3y&pHlG6tIP5wqOsc~6)Nm+VTTa+ z#X}YZ*oD^dKYkEnpO;xcm@|OSPLk2@uq;{SVd8X>1*rj9vsj6P7}e9S` z?Wa?o5x(y%Pp0j)$z=!s^`oE!+uvZ{^V2svR_CwT>;9H^L$Uj>ZXU)cd!eP8KG9#Q z31W&^4I#JHIlja7)$n?gDfBq8Lw(wx;{r!4;-3%i7q4<{NSvDPxpb~h4AWk^^Mr{C zYFDO*+Ku2|JGQ$-0$;)%v(~H~3JFA=*ZH+4bu(*_XWt3_4zOGAcU>Pzt@loL+Hjxv z0-3xOKhDuBeYJDcNW~-nA!<&uPuTg^pD-jy*8g%Jw~VvfeWXF$|5o2sdNEITqR?EFA27seGv{P@upp~bNd=loSL9Ii#aOS@Plbn6bMi{` zu;1aE`6;7$B3_{NJq@jQCh}NnyY0$RlA}fjjc%@G z@BuNASwllXbk3CllwoT;VHd~--I_y!yWbp)BI4F)HePk-=J}y~zN(5Pt;y*ll#?6A zSAsho3Kt6M%lz?k0K#dWj!VVWgkSkzfLzPJzT>&7y*U6WxW|1hkpP(juFtf#>;=1- zzE8s>M*A;@+4gLJ=WNhkogK!;Yg#lXcWn7J%JK6~Yxm1tapzzF|Kq6Di#ynOVz=R; z*6I1^sk2BH^XZT4{_igH)2sPUnn*C_$uzNa6Kbev z6F-N&em|wEYot8U&=IX3rTFZRZvgNa+-O*Zlg)|&KT=Ri zpf!YAQ6;wPv#=ua^ERFy28kn>j>kAGCD^uE9{RFs~gkl9c9A-g(Ns_Sw0O) z$u!Tc(892C9A%tlUyN@=$v$CE*FA*vp>R@1i@`C3P5+{zrcl&t94f^p=a2NsK+!`h zj{#PwUI7QJkmFo_@KNe_b+lktlQ0!fAk&tN@YY<75-p`D!e}FuUnDPHVY`g2deoS} zIm-j3LSql{*OuYoL<^yZut`?h_w5#eQrE8#pGbp9J1Ql4N1tC1oQf4ve@2DShenFE zL5)8b)0)e{sl~SpTxnwX$f?c=qzWhxNyezf7e|`h8jWzJt zfT*_aZJNyF?mu142(P*H57)G>^7H0(FW#6>%oo2LKol1~7RM4b1*O{%DOtMU4)U`V z(7cm3LJFje?Bh}YB`ZZ0NvR0UIpy;)gX|V-``RoHr3%#v!%UNq%k&p6(8TCbFs3?+ z1HC<}fLUy)&v(k{r>$U^Coh zLEsEueYU&}f#u^yJU2fOjg>03Pa%`6>Wt|kNS)f|2w z|Hgd#x=U33viH#4HNGgp`t|4&k^j8U+i+=1sXayo?XT|i(L?+?6 z5B;!w6q)auxj!>dJUag##_c~u)vY(ff}&q)p8JWZP3Upo3Js}H%-JjUBdtebUz|%S z=#o3>(81WbXCy(4d-RscuY%u1Frj?3(PAjlwl`*z8{#-z%gZ& z8DM<*_;pr=f+>Kq=s3e}i!EZ)CoFSf-d>B1g3*$+9=>vBw*J>cICpista9>yuO|G0 zhh4)qBs8gQ$gUR(vQ$zIlYptr7caZ3|L^Hyi zT=YRfidnWZ{#Vt>|9`xQ*LG{e;zLnjyhVRcDgf}h&(9d%xF&X5fjk~M{d0$BznXKu z17*Km`cR#J-Q!gY3N2gZUdZnL|7am(?B8f10Q`dtuz#U0vJn3l^fXf!#q}?+;Cl!l z_D^iCUHZJajGBH50DUr(Mf$1dROgS21(QrFG{6GcVphvgj9s)1H8Zu`>wK|MTzZ)H zw5zm3Z}Q~bAR*JUu=Pefcob&!p^Z~3GGGgBhLn1Kam{l6q1!5%=$JS{aq1d=vcg$V zD8$XAH{07U6UMso^IKn@wNII;X?Lxtu(zFsC+9OP-l>))zOzImOGqS5868DW*D%eK zhQx(7P(sEOvi@1ktpI}7i~4`kC{C+_5!-T$v6s6HF}3H9aoaJV8mRAq1iR=i+o>4= zVc4@9%Psw^GN?CElg9baX)n@HgL4FeR}lxes{ zd4`Wjb|>OSu*o1(gxa>r%;i6Tsl2hd`jkw55&j^=QC=*4IM(_X6MMRu{9LX_?|Wq| z2-a*YS|XJMDh>0=H$=vs^4s?89VU|bF-vG+3IG;|1p|=)mcpoPiSB#4m2$^@1rAp#?>l*W!t(k^^jAgCzQ^uTT4nBNN>noM&%sGy0A6q28*00BsvMI;C$ zF9N?P6=#|DC16dIGE6aigP~Oyqo@-!GY+!DKh}B5kighFLI7ZLD<*yX7yme14@JyW zf>kY$8U{Im7VPjB;`kT^JV^dwCVGoCh2~6VVt1N`PkbfH5n}PIHge|!Ule2$QrgLi z^X{7yyE)*&>Sf=sAhm60mQpApFm8IPd3m8zKt1o-$Ynk{w zB>Z1?u5@Oh`tM6PU24;8n0YQk&Wlfj z*6LiZ?`#8SQ49HbE@q3!DPBZixU5e0JUxZDZ(a*A4t_%y9F zx=B`o&S-@>ao6A5vEam~UXpK7(v%{cP2g#cFYISOW${ zlwv5-V9>4l`)l3Y#+{P-)Cf}X9<0P^JqBc0EO9X;@i;N+(3%BgaeIWYWnKt{9wgAf zv#^hi4R#8fr~GJPF&CFs!DIiof}4Y>AYy@7)30kSIF}Q7IUJ^7uEs*1ask;cY-hv$ z&`7@mxNpJV98m3$6l{>zR)WA(gAJ ztDf$gAcIOcchFPB*s{y1Eut!<_5qlHz*sMT;;ijKQot>66R8U>&@xP(pCGqTTu7`= zhtQgFOyfNn*aQ|WoNtPe?1CcaJ57b1i-KkSR*k5(Ol9W3O0r$ANcBFn5Xd5Ev%V< z15nnsG!Yp~CjeV0&LLqBfZHP)LdgFZz}mWOVw19U5pTZWAD|dy1_xTdDfqEuWD$s< zCk_jn@OVz~>}?SKF|0u*%WTi=q`H;T@nZ9c>1i3eEgC5fk;m6UOFVPjMhMSc={>JB^3&ZY$8drBe!=L-F3U>8Yh#IrTLe9 z@6AV<%2y_^0E$L}q04pq1#W4h_pvlcyYT8Ag$^gr$P)1KF`u1R@0lte8N}o)p8RN-kBrMUhrSVfb70SS|17Jm>dAq|Bb&?T7D(<$ zEu)sES`;fvEUO26V_D5;>fI`^8x>;B@(#34xq;Wra-6j9V8@`IB1p84`Hb9R+m;;N zyEi4MbMq2!eoV<&HUXpY=v!$!`m<1sk6hYTTXFK;til+oz9WG?fwyk6$2yw;AzFbS zRciUH&3el{YU}fYzEe9lzKh{D*nof4Mo{+Aw)1?(o<9TEwuPS!b`CGu#zKZfexs?0 z{yP7t-=ULDrSDBO^};HaokQ&$Sea+sw%xatHsS#rdd+)FuDD0NhI==yNG~&7Iql-) zitF(0B_!L~oQ!B*nXbaBY-L5Mf}k-Ej;Nt+wNrOo?j_O_&*JBG5yC+PLy-(Ej&;IQ zz1U3qca^s$t_R4Z7j0{b)>f;W%{AQ1ZDXTljc{^g6XS{wO`Q4)ZS3dJ%Gpu@L@_$n zh;3_Wp~~`NLEYx=EW{MmqQ-RxtACnBAKIScCJS|}m!H=2ESWE5q@Dd#s(swMH-dAl zPg3=BHovy%tx5`klzK}uf_v}Sql&Esh zd*@cNx5U?qj)a1YB(PQ<>C7JT=1ZP(S0 zZRqY8U2t&O@DEcI;YB@71FbNB)KZpmVEKb_qs>*LIdzXFoAsByb?ccA%J*j0FHy{5 zPw9~^WC_oVGpeX!&|`wYF~gwst}XoBNb@&$uqfeWf!7p^2I>a|6;r9sSk&JuV0xm# zL6%{a9iFOu;SAEUeC0D85nhyUAzcKDzZeqBy*_SDhLsiRCokcN9kwR&rk9Io>+a5qVd7)RLr1~RgT^Y6w zeB;U5!^OZcMnR%4VYIAIQc6dQaaPW-(hR@+6R7^vT_vo400+GI!8_N|$Mx@qU}!2~ek;xLe9ak|@yUVaF^{rRpXYeG(EfMHGo-j;Np^i^oQ%T!fz7^PyU1O==ZTWNi0(pW@Ha zFl&=pHa)eGTyWLk{9=O3aQHd4M;hr~3SDqe(eL1dUd#jr$tKdY0k z)Kq0nP38^22oIV3Wb(HKtde?$sQz`;Uv6O*E_ewqCLo3u+AO?sQoq(l@ut%XwB#kZ zmL`^8Znnu?-PLbVpyIo>qDrvz;)XfxX2_=gqv z)6P{!Wb9L9)*%8}U!Qu0q4u_;4R+xvQVfK&GoW#Ri>15YR&^~*^#xZ06ciCL!oTWn zIP0N+Qh*nVD*-Ddb*;uy6FkT^Ivdrfh~#Tw>!e3p_q|vqpNY?y9c4OYQ=Y z{ppb1UMy*t4EJ!8ECMbR3N`T#n8@9Kb(!2e8UAYZMg5zG zBjD$gEAGRFrFcvqdc-(uF^&Iz72G1=;)nNRT2quK;mh}#lwvn>gW7V#p!5=BG)0XIg2L%2lrt&yG& zBkC=drk1PzX*@`T;{AkS5vu$=Ke{e(NqCV;4%a4UbOLUI+k;SSo5j|0&#SlL|Q8bbpqr#9y4OA%yb(`;Nwvj$;+I12w6X4sqQUvT!L1SvQ<@b#u-p5cpdLi=!pwPb+JkHqe_ zobRo3nI_(`1(WJ;pq}sQV3qAa+``FmuqJkK;IKxNbfs>XvJ)UCma_2H&4K*m5?!vD z-G(ZJR@_%b?->ho&VSC~@JCuJ;5%`k8j?xH(&Nr3ElQ!v}D+8km2%()nu1VAizN%F8Sh*k3!OiKbm>HV?$zd7S;AOpm3 zdnm%$4CaS{Xw!*-i5k3z`+7SXbZs;jkD*r&$7}%#8t6j2w1gL@8cU(h8KU?hKf8Yc z71|j~%-9)*XWi&#V}?^l^d`hBO$oU8)Mt31hQV3$gu;yZNJ7(Sj>vqirL}D{z6T{M zSI)d|-Z{tRH%GWf=6|gf>&+GXlgyDR{O$IdW=XBc7L0W{vnmKa5O!Ll6|z$2%@1@! zKDDtpWl;VTBN;T9{fdeTWyU4Ps8xFFIyZaPPE{^#HqM1D=tl@JPeCfQKF3H28p!27?@G$xiWh~dGdN>p_{&AEpS20eFEELp>m8)UX zE5-cYww#-G(g8+!&5R2Ku!~v12?c&mPLkOhS(HZ*?kp~zAQmZd*#4-*35*dbx@f03 zO3RuC0*q})*7Y+!yUY7%@9WNBOnIuS`%wGHy8tE%Tt8?}7RWY?mwdwUIbKJ(#xL&c z`Z5LZLEAgT=|MTbpU$DKYhNZJi)WOkcYU3a#_F0!IE6Z7t(*JS8I4ltt@~$Ybwf11 zWoBeq?=~XNeSqt{1guvR`eB8H+Zht0@PaUB6@VWRO=-Mm_JU>G(zDPsbw+i{Ct^w1^qBx83H1i9!O?gkY z*I0|Ci3M&_VNWbBQyKr#>f#>FBi1|kfNAdpG8jo%lYL7&KL4L#i;8-mVV8!B{HevM zNF(hQt>PEB-i29T$bxhGa$VFe4^JSG*n8HYPZCNn?_*q7eu~4R6E-F7z^9Cl;#?dv zQ!DlXTqsIwC#6<<;q`>y9B`c^-~Y+6jyV~RUZ3rd2&RXdku531c<~jUOg4nCrlmLhHbTdjUF^1s?#`j8)(HF*HMV2J*RI& zCm!RCUuUN7()74q9alVtsl?4QP^>t(KwVq znHa)%+b;80x`+v(aQ!~Z@o6%(rB9f(+;aJ`d|E8$fO%9Lyk}Z(@1$g5khNJLU-$Mi z`3L+mPNwF9k>QqOvTGOA$lUs0D`WKajjdRAou@`0yGSE$C#@<@nSJs1sUfaC@BWH3 z@;kkS3cT;<_8KTSWVpDJl#3M~HBjX%bw&&2zgI8Iqp;+&6_{$2a}LCQp%@eudBO_P z#~R6>Lsb(FyKgnGew>b8QEoC!qpBPb8H{Z%3Q&?_%;(h7;4HV{*FVg8hbQj)`i#Gm zrM9N*>ud7NCNu^DnEHN8;*!}L4bSnajPU&ehl89sg9^y=JJ+|b^MVwibcj&Hg%bp4 zS(3N4%KlRRu?+;0btTiAct}4zKuZC?CZ~teX}cjU4Oh(fDrw)l#3v z8w2bRDHAE~cFKx0E6t7A*lY0ju_Cf3!|_0)#(Xo3gVx0zt9tkrpAB2thbQY6iSJnl zsf48*AG?EPDQw<988+FlB?ljR2E0{W+|=`@+w#Q~sVKc*mP7v-wd-L%f|Te>*Yfc5 zLQzTfjc!Bz$4t}IHp{E;rJ@H&yyGRaZY@?BSF&}6aUm!QjG(KbGRr#V@~Bs0j?V(t zjXazBKOd&`c9<1Od+;LKw|S9w-nKcK*Ql>T*vMU_V#;gEv^hhZ-lBTlIWs!054TiU z6=_ZVx}sD;J{?zEtTL@wDbq~r?5Mv5ksgumM%fk+7>jaBOJ8i!%%V+i*KXc@HvB>S z2c(8?R?^qw->1|kKV|5~DdiXcTQSz^Sm8AyOc;aQB-1xVLuRFziW4WLNb)08#8Aga zXxV6cUsR#Pa0u}53SCn}qmA$Ir6hCfO(J$#P)LlSwNEXgUxm$3=U8-lS}PpnFX=YD zRrI^L`A4xNE@|15fX=!f(er5rn&Zh?5)ri;f0)KNT%OJvxFq5S8dkS4MLlX$J;al_ z|2WxWWC=6QLTgX~9ZV^i(R}E}@vsR%dWZptqu^l#6Jz1@ha1^>T_07)=j2NR9unyr zM799J>LWAnS=LkTv&=ovC`?%ZuBe+h8?l!r*?TsW7vHV1c*ks?<8YVC2>g_MMu`EC z1J8wBvuYOOrTs0GZsN@WCiV~bLY!#m62D(M4((qL;`C4kq2>^al_lZ0?;S60Db>G< zw;Boaj|+o!L@!b0C;MT!gqx5gOrN`++RhD{tH&CWfTN6DzAdb8P!aQ8H0HwSua`kK zQ;|Uqgmr)~t|JO~RiTONNjFVajupWrY*t=>?ngguyHWyVEOy3i6*Wgvla>Z6N@dzt zl+ime@?ezy}@fcwb&@+%+wQ})Rh@M&>`+B&Zs-}zexE%9z4tNpvdD$3Nb3;A$Q%SYMDX%p>x8!bbSt=;ZlEFfq)8ab{|_)mM)3IZ^$2qD48lq`apneq`S1Q|WS6Rq0v966 z=mIf_33RBaRguh2&)@Nr^~mkh*yxLT(*lBUCJL*2`}6gI)F=y zbX&1dD}@3Dbh(VwXV36kT55#H=e{)+m`fsyojB1`CgKmb;iI}sWunhm?zze)BPzDw#+^Q4a#4_gYB{fsKW}%jP&rGl#K#IqZIxSZaRaq zF7Obs3@64Jc7y|Yeh~2smBqRYG{m6#0O7UTtG%f#fpBvhleEO4V<(t~=YU>BrL9Rf z6u6w;1{e5Dv6-BV@95kP+*F0Vy_b)_?{zZHU%S%22|vE{=!`^;@i~BQS2^f^n?(&; z?09qi>HQnBTA9*r;BV*9cfH{Zh(c&4<8QC+SJ5fW<^9oFZ%8mzmGyk|DK630|IG#P zR}c5}TW6L{cYPCo`GYx`Q;34r?l%Fd|GeHTyiXY6LNVdoj4^lC=;iNQKDr9a>aL&W z6JO82qfuFE1?nkh43i8Inyv?*B^xLPobk)Gv1^9Sm(T|mA~`vI<0YZVL|hm5=3$z| zh^^E=q&m$5oe=`gt-!dz;wQP6m zr(k8eeNv@{dnPU}pUQ)m2MrCce5f$gB&-^rKt!!hs3e>mU?G7bm1@{NMv}0Zrk(=AK3+qG74b8W zi@wXrDV9Lx)u1_&x0A)~wdrtk>a%0Um zSQgowDrXX6BXh{q*2(usgx6;TYN_rdD*C2ynXcVtIOWj>8-DofNsjWF8Rw@2-faE| zbch-t*@A<|*|wxW#iAsf!ms9&Ozl^}VW4~~fr7$dyB#_0%+RcI2=gi;0fMUXJ+=H_Ncv!qNNNq$3W znXcaP)a>J=mPefFD;1kug@|J6Ha$tRq3;l47S-?tK}hJJ87Egb9q)%x(UN!K$B4`< z#y7cXKP|BQKV2EPECw%4?v3zLwwX2@TFyt}3oUr9OXIJnj?jC(cRuawHb`vZ&Ohp!vEVJEm_@a9%I+CFDp0-{iK1 z%zlsCSUyvWg_HW3+rGII;`y#%(tdO ze+554xG68iKJI~JLj~V3HsuG*Lq$I4cZy&eGzHe?e6{eCe@8~Mp;Z>I!~bTWt*E9B zF@PiXre1?#N2Div;F3KJH-O_adl*)s(rbnAf*&$rtN8CEUd8g*tw+z+WKuBa-E7fJ z!qcHs;J+isG}2LW(}2U7L|k0cZZjHQFtm|b&++!ix&HQ^6hka$V3@rW)kn#DJ9qqB z`$T6R*F34%!+x0;{Aa}kmHr;;d^O5Mk$9O@H|Za?^K_qe|1nTs`M-*&Y@0>ie;#h} zPL{jP(`kIl9yBJl#)yEKp`C6fU;PmC6+gQYKfbPVN}4&_+*l;yW76=L`#PPdz5~d9 zcEul`Ylo2!)Ei?WR}T++b_^*=9KWqj{B^+%C~h}xYVd=ZS(H|@6v9>RSqt9qa^tCP z_#)$Y^MiHIR9G&*tvq258-_!e_;D-9cI_mXdH9t-!MV&B4}($4C}E>>oWczswp8(A z1*Smldh3yW z*B{)B^pP55#(ZFP`kj8VZQt~PZByz5`JU#u`y7_3NLEb-o&S<{;LP|ct!GEs>#r|< zD|*kZTZ?mr;o6jpqSYKqtMWT3Ub48tR##0+nllC8y)JhDnSEnyM3h+%wwbi)GYog% z`saeF^OrNIZ_|y5U>t|GV{o>!H(8j}4e6 z`Yrf2ekKUMLsp?smDSE#R+E>BDs#9*dXbVoP+wYnFQCw4f9**3rOh)fuj0p7rso#d zPgSsZNtvs71uR}-xUr7r`2->s65bBE@uR3rF9r6eMXi^6`G z1+F;3X?j5gC#5$Ig(3e#YDl_+2={v?3?3@f&|a!nd+E~#_K6OW39>>=MlBUdlVF2N zTBSdF2cp1wH;o#wZfKdB@IHjUloGZql|P6Q4G)=Z9*}}9m4ftt#PgfF4XTARePqCK zGU6?Ln}_wPM?!ZnCz8$oocLn>dsm0q8B|&tcUuEbJMSJ zOEIvU=OHK@_MI^arlFz~5_wM2*BJ61$IGsx>8A1)LDA>WCF3y}Y<7b;pkmM~PrQ@~ zkRW%vjANuRq2x@eh4t^8wB-c)$fD5ZJ2xn?s(0nQ&&pTc1Hgh!c4Q<6kONsUj}KoP z(!Zj?q9?9Ou=o)XM!$!q(vm$p13g*f9=6rAvYXCqhJVarbliaIro2!S%e(jz=zMSp zCM?hdaO$#sKGn0*cC`>iN1=}CFFH;E-)X~5~1#h4)V{L zB#%$Jcf?1>4BdSr8zm|!uK)p>%xmIV7leDaKCohYh|~tUznE;bSjXmjE4>FQvq3X_gx7Q?+{6(9l zvgf!UN5YHGI#r8Wsi-u?p7*Dv3BE+hn-0N*DX{=0>l^ zoStujpTQzD0l1UYIlajlF+(e%PmhtxhJe!~{l1RzMVsD*v>AtWUiA~#)F z_cppeSIq(2T^YC;=mN9s|9#c=GvJ3b)T&v!vam(hO=^?~8t2J5e=%&WIBd~LQiw}9 z4@j^D+5`8@4$3lu4NyN@p`$?OYkFG}gW7Qn0@?acdNI@F8ZN)=9mg7XpeO#4jPo8HiSoIKYFPZK#@*L16)>Nl-o!*W#_IXFgn`xY4xs(6|4)VXB}ZRP4?E5QUuTS6V?Lv-h!@10=u9I3zP(s6OY)Q1DCtjoMiFU3M(C6$hr=|9!#{(pbd-pw!JD1(7i`s|PYQVOY>R{Wv!* zKuLkI9Cl+Ul!3<@`S>AZJOFrM#tkwO0~FhnAG84u`)4$|xTt#)nf$5&7_UM*A029x zQ(62Pib^lqAX5|Q6Z~v4_rC8hTAVsyz0hK>1dssRD7+CynFKQ2SC;BLc(hb031xNI8GJt>&g(mhV-c+37@{)h~UjsN*I-1S34fC(J>^mIlu3Ugf)?llZT){USnw$hI zG3B_T9dMF~B`~w@3*|3)F=YA7DBE&h(hVW_clj`Sm>p8t$f@?ybG=J{32qJ@kJUcn ztBvu*;0fb|Rvf3cyn{tq$b=NaL?I0DKkH|uinoM|0yxIhQKl%E@_}iwEP-sov?5VL z@UjvHOAFEp=$3P_XWbKA8Wy?93VG73S0bu2R*ISjqj)K-30ynDeTinPC2SMISE0vn z5-^vy__J^;kB4gWW4#LU=8wFrh@fmpn7YRGL0tel+Vm%9uD2dbjxl1PirSfhS3O-H zHO#z#_R=uQ$^i9oS-^bQaM)5&JG`(Wvp-xh5Kj9X7V_YDGl}jcI*BeYGmO># zlg^RY+9D{mt%cFTqdVk{e$ED4jFljh1_Ts5q->@#Yqg~0mRjE}^2-d7CcDnB zbhzYz)du{^6?RsGb)tD6_DX@Nx#0!ojvUq42qZ_=YY&^yQKJ0cvaxkB#5avA)>;?{ zH5~K8KV+Z=?$2#qKjI8ECmFB^jXAYn7-i(%lf!B*oimit6i^PM78KMRW2ynsgl3;^B(CWQ^{zq8fEnfG~Y~+P36A+qCj(G3`td(Ix-|FM9m< zB?TI@y%Q<{mN?b;U(AZ5@W^;3*P>pbyN%8&|$7xLvVdd5#u11MVZMS7>epgJM*; z$D)#@1)@vG;im7XZ@nPY7umYdZUojQJWp`%xkf$I?9gFANA<+(m*0OSc zNTAKvk$xNg!_GV5XU0U2mdmD$e&`k0RRgvC{5;z83NoC%qEmeXPJG_xeu~tznOn-@ z)8!Uw7u)G5XzBUj+@=L_TYLyvFY*2KJwc-D?QMI6P3QBf9IRPZy>H!2z77A~9QbNG zkCLs@uf1aZ5&qweK=s`)JfW6ivROU!x$dlz{Bh@U?P1ttj7xQS=G)7@A|L4fMsqb! z*EOe=*?ikFLtRL;veE6@;)w2HF|7jI7)J7#$0gRR>MkIsm38uT>U9zgl^V%Bje@R{ zuALWa`kjKFc0j}D1zc;F)gFTUOE0ACeCz1gj2C9CQBK~t>fH%ga|=aC%v*jJiGq{{A5Zq;G0wI6Oq zbM5Iw6?%4F9tPaf1mCo~bXXbSNXvh`zj5ijc#PIAGd+09m3wiqc?GcaI_QLM;_;x` z-0f1dKAw1t_x2IW37)%jUcxv+mlrPqRLu`#S)Gq>8|hk@3eAAF9i8y0ZFj!|TUYIF z)j)Q|ns(ZBOhhrcTSG>AZVfP!=~!T#uxrlFgTA^#P%i={6yUtPA3RG zT;tdMGk9e0HVq}X!1L;96}*vd%#aqjK5`gWP2+0s9j9A1OK*~z=8!t1f$`~If%HIn1OEje^) z&Fd_MLG-lwbngY>eg=BL+QCH&pz1gghn7-&f}VT?Uo_IrF4!4)l+-)(TM4M@oPIm5 zt?8`1Y~(zCH@1AU)p=2Ip$k3F0?p$9$CqDV?;DQ6_t0l2=Oww9{9kbK6oazW-|3T!xRb?!yoWdilp=^)~l3!yCr@XxfV4Dryn6_K z^qk?{L7pi?FmxPdUAefiDW06t5T+ZkH&945KkMgX7BkVICt zUlyJ`NYumpx!__xM{n-5M8t!&vrCGXu1KQJ7n_$0;kRo~p{?L;kTo6j>DSxpU4C}A zC04Jqia+SO&~lrv+kK-HUi|}_T7FEK&&D^Iw`*1U@3k%Gbml(nXh0vbyw>={W|1i_JY8^b+@mP5JVB2y12yU{H z(>yV-ck*zy7}7oswtjeW@jg`$u=u?Xad{eP6}+mAUwe);8KTQv>C52KwjodZgt&ib z&0lDY?b%6nu+~(tJafEIUQI2lKF;|PUui{A+tN8@_fp#_$kBc_($MyNOntrHi`DHh zHS?wMvivd$athwa5~zG~IE9M4yr+;^D(yrTvgQ&V2scoYBUp(QFw56w+_73^pN;n3 z8t;q?tDWmO>_5G)&VKfXJ|28uxjjkPBVt<0ntkZOz1HF(7q;@;{*v`DzdpIff3-6% z8!p@L?>t*ZL9zUB?vM{{!#Y9#7qGRhA~KuTUgD){)QleW9*n_}_+FTF!bloDzLCf5 zS-a0^9)v!GTZP`aTf*$7boN!Zf~Dd_kwH6PL z`36sWKigZ5QcjaxIu0MIn_Y{QdzSh)pS~nZQK^pWl;MgXkI1b+PLrjHpU*r_-ss*f z+E}wbw8eDH!YUFE7v0}GmN%dSX*wMjw4l}Kwwpi#R2)b<@iQZaUN=pN`YDxcwj?KLuD*2-nk=*JI} zd*hX3PFoF`9_Ek7Tx&dceGdJWarF&as)Elc;?^*Vlluec!)#&4&9ivt#dJ8HM?#+c z;@Wt$`FrncJ|bO}$IgOl@PhZn*(8k`0N@ME<391UcieOOvz=1NTFz0)^nUtktSi3o z{Vg|$U+u&lgbz8ohE;Aa*);Q<8)>>^{(Q>-NCsVA9|%x1ACy76FS#9-G_Pl~1e1C8 z@$R96JZ1uN6Q@{pUbmOIAL&^@UA@xfREgwB+|9bE}qIym*~;Q%wdV=OE2fqD;}7D^D6XmxD<<3g*@OsKZxTXL$*16_{3|s)P?XdDKB_DX%!^6Dn%(EOT zovztjO^$Ws-6eGL`?Gs?$8wtW#q5ak^3@V6zDY%=onlA2eQ~P5W1@}M`JCWmb0;nr z_~J&U_J&^^>ivu{&iB~i(yy^R zpa3=eHRcD0JJh!z=fTf!IpvDS<)j=gwJACzy*odoeSYYQPkt|OK8n2dkPSWSq2PZU zh#yZp+w$$W819ut4Lgb7Z-m*;-BT*pmMgXI^w_lawzDybdPXi>%Bc!G z<`W&Uu6VIR#G$>t-r{^NQczus{xDhPai^Wk7J=xCMyDJ51FlY&4TIY@sA5s)OZo9m zos^Zgoo3r!M`L?_hiS0!O_$W&0uMW%k#7aHsR&Qqvd$pyocXOe22anZ8vB zs%Z7z&g4Rdw{kjvd8Byk zdq8bt%6dBPWXtj%&&cwIE^$oE@?pzDc61x3PC?77HzyWbtof~Ivt~nyQrN2(c#X?D za8>tHbdlXHypa!PF3kk{74m6{3G# z7tJ|1F5vZ!PVk98&aZOl_LK{ZFJ}#!n=!Y8*U^044!X_4qPUv@fnC$y`$LLqLFa>V zt7jQ&&)0P5-|0L_PCRxSD4>NdUteZSIR{`wP-6WxFD8CxZNR_hrpgHdXMWZaQ=GwWL1)srobNNC~q z;qm6uUZ#5o`HH>f-J43P*daMTQ=EtNA3KRZbj5Aj?X}F_PnxCvR>j($GOFVo`e5&)$HO7OQVR|o+5*9bO5!Tk2B*S*x?b4y~u?eyzG4? zpc<^}k>h$?@zr|yAyl{7VHxZiv~p_HVC=fGV(@t9pA7lWk#=snfBEhv`l;v8pVtc_ z2ZfYIbCAUiy!?B3#&G!2`&#&4_s~C+?N-j?jrxDO*)V#vtgC$fDf{|&9<*lvKYhUz zkkxso`utDO^w$Oj&t7_rn|P%H?ROR$9tL$8gVl*Vvs9W;9KR64=MU9JNtz%@epLCi zLRvqXn}?1~2y>|scSywioPHXA=`M&`bH|Oz&(#hC0L$)3He%}LW`F&&K|=aaRPtx< z6UtjU-`5ok7eguZCs29g=F6=K35FXqE$w1c9J3G5>8zvmB85aEXI_QX1(^@+YK`*# z4&QPfKh6@p=fpDibb|GOZCD~IO$AWWrc(>;pEt89O&9d$k9>AB`K0V!TqY5e_Gez# z8ndL~A|nWhM1~6DZZtET(`r$3!2#$uYRy?|7im($;wSJw5#4 zf35^7to$qME9q2L>7a2Sv1JthXIOPq!)GwNrVO1M@{eD;wl9Smu<3$ZQWjkZ)8mec zgoX7SHR4cnVYO!oZbt2f{AaX!ure^EK{h48LcxF(Q4|*yQjLs3V8YLeu}cjR*!Tk) z$nvTqHDl7RvI%{Za#BtV|BiI7z^4vwelcBsq;pyrtHTuAl4vN^sD##;Uc&;6B0mDe zy6c_3eX48XZ7MhkND!Lab`$+&N@f8!Hw&ZILt22P=&E3U3eHqp!`&x_?TNmAc?8b>2rG^T^1c`YE~F-Qg$-aTZs|>eDC#*}D#W90kd`dqb69;Z&Ws zDXC8z+$q=`ut=v=3Wfp81NGK9x4Z)$HrK1i{@nIcC)E*S0+2 zD3n#dl%xFGnnc{qhSs0v;yT+P>QEe=OAJRmQ&@FJlsfmEUdijRF~-A6A2vNz@(%sk z^~cUX?JQx{c$d*$c4GnG^zhRIZ#Y8!TZ-apEmu;=M}j1|E!kAT5WWa;6wq3wHu(Z=I1Y1}GUP}>uj zqm6mEo<#}fbT;MpY)EfqTHORy=jg=04;9gqG=tbE^h&5-KG`cD0l(d-w0DU zHJWCJfES4XV7ux1F#$HER-y?3Fkuh5qYx38pi-1pFx8O+i#pLYOQ{+q0p612if(gG z_3buCibE#wLsQF&QQL3w26i;>%Z@LG0;@SBW0XW^IW?03eqnyu;B`d9P{96#qNw(q z%z_!K4PO^c<^bfC;bT(L?g(d4NIJDy_3JTdPa$vIwzu0U)qajnAZrU16&kJ zcSG$mTsNs$T6JDYOVdcMd04yDsPdc=dVGv#m zUbIAcDL9dutme`es+H3DQ@3v(yJiA#aPKAehu8X0eTl~u$;=acf-#+B)HvP7 zl-fOGBx4L~e2gko+O#lOGJ7u_7KOv4sqf_Q%^`vZK$!?HBnzNPRB<3^Vf;^d%jtj0 zTc*)XT16RY2PC^Pzw$C0*S_A+YKJcpXmIzy!p^Q&f#=@OVQQbNFUQk)ec!G@)4N#h zEDG|o2%m(wQe)8oa{nCXwHsVfSLL{`5>6-OD{83CVfR!BHms;j=ddI%!5I%SAOUx} zGuzWb1dx?DB*Sa2@u-23jfXzk0#+K*nS!zFbuIoBw{-s)vmbK-iYRK;yNxy&mk5)8 zYc{-y{js)$$`2|g!@nP=TcwqZ_|R~`1MQ;%K8a;J0GH}!i~Qf}?6Z*ofF`X4%%y&Y zug&2O0)3fEs4S9pr#62yTP8Om7I7y4{3J$G#}chR$}@GdzCreZKww9ZTKXkiIN>70 zBh_R`6ksPZ7&7t4){8!2*1xFSA$c59;*7%^s+2g+`W9!pVMa(Tagi#kGc205O=;= zO=;dsPw{eC<=Hdm#v~3`v>sNQ3O!VKV>I2RKLl50je`hG(}-X2heor{vl$Z%r((?H zev(!UG7JRnqdY>+rU!`QBJ2k^M~H2XnoG#_sadx*e#JbIV^yOtv14r|*c0R@P)i;- z77vCYdP|XP%W{*$(%ToU!pdV)M}zEAKVYH2`5hv4vp>g);Pj$ zMCy3(l4ONp?+x}1($?#+ovz&J^vb8e!A3}55)>-*5xaPdd>}n+htH$3732Z5qFgfN zyR&^df&+b& zzeumJ4Jje?fA-^)mRa#R7u=o|<*v7?VGJ${C;POz$5@IO$7}$^%M|UP$WN$Q25|9a zwkIR4-YycMAj10!0q;b3VYDP1GF*@HD|9H7%)`PY@Si)#+%+sva?N3!DDnf`Lj62( zQ#5DP?@5zZ(`rfdh1n?M5Jw{8loAO?pxFZ-6FG&sSjqt z%`}ukYJXTnw;~(@T#p`6lWZ#stC=M}0stE7dn%A+4et@ot8bCbfuzki-6pH)Ce2`wt zapAcZzGE)79+X300su(VqiN5wp2T@dJ1WYpbeWyv;2l_i7A`dL3lk9DMdrUxL;51z zRl|Meg)9-D2(_ZC8HxXWnVX|*(@gq7ATu8$WO+iwqe`djM-s$c)?<1`y)O2U9vqdU zeo87zyz^of5n95OP4wb1%ZW%VJzFfk=FUdUvCee;{; z#CIg?yyEoT#CvAeErfmgQarK@I8zh&7=U!3PX|9-h(ufffaZI_H(D7I)w2R}DBt7} zw|KjBC6QXHd>8NMbYuLg0*kN!0C)ejnKz07JRo4-9skj;ue3ObG)%aMJ&4A@O;9gd z5GQxO?Bfu(aL9vE@C{W_$Mm1W49Ph5FH{+f@7ODx@l1f~k-h%BGYFE~#w5dvn>c?g z6*0-?DqV{VOI>pd`=_{fL~MvTW^=EpzTzO4Eh2q^f72{GZAxL@7KM|90>~$GS?hN_ zK^9Y+N5ZQD~2**Znvj>2(!d3xrnjoVIzm*IHsrXbX7eLPJw2`EZr_|-@W6W z(ob*8Q?{M?EK>9F?>+*PpDcOgB-n-`_fX}|?ZQ-&5TH-&FANN)4$Cut%akO-kjz0+ zt0DCIXPc{|3GQuF*d!p`NK(Yt^z|zMm3~Mr+h@klFww8*rJW|St87jCLnG^I5=LN> z@IkDWLy}!qDc1!`ARQM12Vl738d<~=>Cw|p5l$6Lv3xBIpl7S36+*z6QrKpbRoBqT zO2QpF+~B~TRQ}y9m2L|xm^Jio6+ElWJCb}pZn?74jglQvwq>)xd0o*3!h(}x^ zRzBgPiA9Z-`ZsBFPKcIy&f$^*VgHWL)yGepNn;-QexaIPN!%}Q3L$x)OTMdg5(%X; zY;YR^eDe6qUlThqn!)3I$eAOs+hY!Y3c-~TYc9FOkPstDW`n0OdlL%J3dmCuV3SaA zVz?4uW#c3{r@2z3(R>4^r%vVy*PA-?LcZrBk-{%<0UKJF;K#(kB z_M!flc${*~88fVO_AmgqOgB9jJF`AYF0eZ_fDaOTjWtT&oBoI6E4RdJG5$-YMB=nw zKQU9aVni(_Ld?*9*@awl9Ubqj^eR#*8-&OH(d`a}_^UczqQ9-p$4aiKU>OEmNid2;Pu*odljUU4}<91o~ozPOpPJj!D^kwnK zfn93Q=Wg0B@KOu_`95EVK4Nj^gFo(WgzmVimR~4|eYi@FW|w#s95MM~5B;(k5beZB z6gZIfd?QdOh2o3{V#k%V#k%0&09);Y<*NEjK|xH}TYlMth<1H3WjE;$5`qJ881LG#`Y8AK(1#&_qFH06 z%|*W6wr+8cZKYJ@K~gmY%xgH#sDogZ(zwKH#(pDIjt4MMqr%0P!^jx$VFG9v#FChr zP!s2w#No?{phJ+kT=r@TK&@R%W}s9XeiV`WdV^lmP(1 zpp+sgUv_dP{te(mDu+gB&krL805G7s%(3#qU%5VSsv(9}maOEVZ+Y@Vk^)<*-O+>k z5I3;wjrp%6iM>h!MX42xkP4+k0qQaf?ogrQxJ?m*!q@VEkaT-5`A}UuN-)>kZ zczI6l@FB)TO{c+`r0{x@oahB%aHdCYAL!kNRIzJ6dGL2rB?VXy0IKrTd)rR9frIq; zF|hCU!0D^kh6RQ3Jr&2e?&O&Z)#$KsMhG>^>;`*tW})d9C%ZBR(4zMHDq;a(za>Ue z?41~O8{oPd@0${GU)k%bod_oe#3|L9nj-?L%+;r{g}LN>M4H|>_NcuHmVD7b5HTEO zzveHljimI#!BBQhAiZd+AZ5 zlLRZJ9MQ3tepC~$QD@czg?Mto_G%*;1%il+77sUV*ZPUFSu2|6Lb7XMW5@LL2Q3tU z+N71}32g~m_%r>wPe=~Y*Dt~ViE7IgbgFUGOH|xqYr33lMXbYo)pNAbPY^HP+lCvY z|LmYI9>F^qH$N87{rB7&tkAPj5TOKGbM?%nJ;6I}nO2${SDqyrv+w5a?+v@Yk4w`| zO@>UICi#f%*aHdDT4-#~r>$Im{893nBf%Wn5n)NZ>M+bSDYd>JbKOm53e{jHfrhi* z?2Ec{FeiUeFs%W#B72PSSVoOn?wYF0SJ0Rj8%{I%(`+ zg3#JrWZCh`{(vAAy_=8rKUkqtn)p>o$+b6TU(;4ZIyF@lqMzJ0L$xNt7TGhhT$Cn+ z;ZsFJwcaq9O>G3i_;=8@xxN8^P}X~ohacsMMvhZ?w<+6rhV0$$|9yHv4-}aFI1A;Y za(2mdr%=2TTv*!{l-3d;Fu*0-1VQEkt+ntK}!5wNl* z91>zpbS1a9F!kP4I73sX0#oN(FdL;%gaT*_#Evv*2{Czz4pm-6Ilyh7mLqz1m!*Vm zeI?x2SFUOP*30jgd3Dyq`GC@Y;nUPFF`g=70}QVbtap6@*wVm(gXWOde~jb5Hd6Ex zW#GiPV8xeuhEQ8)-=9*IHkA1Pf#Uy}*4hvh_tz+b>Xy5u8~-5me=fu9>Y6C`-zg@e zf|vf!aR2P5UV!^-|vCR0b-lHj+A-Ut<|6QiPqnr(H zf%dzoc748WiD_yYi!6gXvtAw^*FfhE{xnz!(JgL^=(W)6+IHqu+huR+{>X>@E$d?M zh|u7d?SlT7>+T~n){%#~=Ubh#`_G2x!_B|=2YpzdH#bsPVNEY99+Fge%mg8s3sX8p zFRh+6&lI0FSn`PgFv^F{rfcYX-jl<^lLcm*S)~WB`#c-3<417wC7n3t%G13gX6I%X zkKRlb^RT?2@{6%T1_wM2ZM$IZ*|e3-?dv}EqlQM0;wl76@PGGxU%kumBS2Sq@m$B% zW;(dD>1EK=7zFNVViDsc+K=8%Mj-@{69>6bzB=!w{5Tj#oZl>ySueepitc1o#MqQP@q6@ zcXxLW?oM$@f#R+~lb7$^d*8c%W%8S3=FFa%efHUV?X}p9+P~Xtxv9{FZA- z**og2tV=3xl@@qIm@4sAXExAh`7A@J>37$5y8n1n4rbjtaD`)S{nh0Jsc-$M8U#JM z>hIqO65Ef7Fj$Nog`wRb)f*-`4+EhuWJ}!f0=97)LHCD1<-CW1vocu8i4ob+;edm2 z{rM3L^qS660oEBlMz~z|cI0-;F^8d8#Bjp{{_>#)thkbo-VY`(#};RosHr-6_i)XS zW^0|+x{`B7sxQ0Zlqnn?;%MZWK%+6t?2bg7b*j!|S|_?9Z4Zk-3H-Amq9^H0?mTxo zr%drM!fmDg$NArnC$^)&J?i)V0lmv)X?Q>~n?8=qaohqG$i}AAYea+9?9{A_LTEWx z81(jiWV-9Ayh7EouT@kRaM6sWBIIIy(?G6AD$W_T{WR%v8Jx3ahZWdfLNK{`ypkT}XxOc-@7}_l{pR9amUV*e6Wi8dM5@}adqg&v zUAMUwaXn}M$}pey7EGJ07jF$vd`RD^$>DFse7s*VcyDl1u-Seb=ut%n~jG23-6Af%Ke6sw_afa!U=FU2QI z=Oa3RhzJkUaPLyUbHl#*?}a!viiC(KX0_w;(qXP78qrChl44iRw*xhehgGvF?RW5i zgDK$oW>b)8UgCif@cyl7X4TJw*Nw2p1L{)O3*Em*|MSZR@+?1k&gE9F3@FrUqU=0N zYZGh2bn%=rS`6eu1OVP6Z#|w#0{~asDG?OU-+mIbitcP)=J@nIO4HkAf$KKvIv~AZ z+DetzgAz$G>z4#sM|kX-thc$#z<^WtQ(-`ZxA>cmq}Yj)fr46=2Dl=-b^3AT)&1+5 zbsIt(?}0MbjVvGR&7HBCsfz77q{_>{005{A10Lt0<*I&NbhE;T&2=6mX>fm~{c<61 z8o-C2W}nbEU#@b1CLRxYX;q$YXIm{)+kc33s0(;aWWE~7_i4>9)64iBj8kY{9E2=sYI4uMx-l#%GUWV|xnptuVowCG1TPthI{}A1&xYsEcydx9r&uta zs5AUzdr8i}M~$U8JleFW~N3&W@)Dte^$lrb3rkg7SzqZLva zhv4O|Cf(Q6R}q#^Z#GUvV%CbRB*h|FYE$(nR9f=v?M<;E<>h_+aZq1#${Uqi!d z4KS>${or%o)l%8;{~oV&Cbo~zXlpn+DT4#>F{Kr~$`gX~sZrss`0hfO#&wsDi}jHl zLjBEhJI_@XI=D@1WSjXgyQwFLVHdl_$B%l?5R^MCjXlJ?7hLbSYHxT=x|$-_6Gf!6 zCx(-1IbH8Ta=+>$t-@jj+yEg~biViFYQ;F0YRrm$znftKi_x^?V7&N#_&idx%d5x+~CiN_9X#mGkSn-{g&xzo6h-B#oIo%9`B!*Qt3r zm^M!};>>{XrM8e%_cyJHk_1M>w^60mP>*{*_oRX(MvB)rhkgE0BM2Ks^CHm*I!*O? z=>B|Pf~=Rs^+X=W;|Z3Dp20da5fpf?#4_X{Vapy%tPeeQJ#Usz%W0f0=cEvTbRN4{ zEzQ1E*#O0=JXd2kekbJf1ReNeS>SV;r104N!_hGYH#wb-rVs}1kIptaeMRTN$od~F z!0Z07%@_FIzx4xTvZg;Bu`k-}EcxqbK zOf_+Nk8DY8*evd4b*Hj{KB{WWWm7QvqwBI6O#X)fOpR$^CTb#9Il>7PxlCGKf9&-K47ydcl8=;G?K zZY${!bG;TB5Tj+pDRw)VqFWn)KD&WiHf<$WQH=NZ*G6tzYfB4^VLVZ*hU>Z=mcU#g z_kMCW?#U)QEqUlBJ1N3X8;*c%8LxCgp2%D%xO}!X(0YAu^B!u^n0NbM zU|6xh3*LfYKz?Io&&5?l_8L}iB4s!95Nku<$J)AcoRW0L@5T(4Tc>UjV(d!{qnTmS z`Ict!-i90i_VUpXCBW{XLMw*NZ05vW_Nj&(Ls@V9s@5o72SXn!WY>(i*)b?-5)Ach+#-%}jq zL7AgR-+a%S%;pnHg1yzM83GWB7H6!k;FxAwX4e?$TM$Codf%e>1;;~Tc3cy zhO}C5>^Yc(jQ{itY(GbCl;9$((5?LbrNza77>s&V9ax6CNqySYM}qT93=9c(wmjtu$qo^I#2CXr=xX;Evr7ISzR(A~VHY2@WLPI09nJTiV zPk!IHc;y&#R$kr_!_Iz^PHk%U4>?!wC($m4AKJiB^-J=(K$&$Pu@$h4(L*igkla0`F7*t*8^ zs60KL?!;J{hL@k6GsZB66*(&r2E6H+x3#jnB^vt1yt*3+q(O~Uq25H!Uk$}%J z2&PM|p73nf*?)`9u*fWa_kb`n?XnOX$FK~EQr_!hX|E4Ac8=pA0LsXNKS@{X1hk5w z%DfL|f|hSk90ESKzAp{Cv0G|A+V;l%uK+s)%8Z=Kw_mDr!$cUFE93;6O!M%MdA$nX zi|urAQi{4Sg|7^5c{whNd#CGjI?uTM^a1qT<-O?vDc_sfIET0#c-ugGkD5)oHN}qW zuyO?K%HCR+%6c9r_(1`lebRz&_uff4c0lNShl{49px+l3e4wode|P-mITJ%Vb} zfB3?W3V6;x+pBecC}?ANXMSA_)3^3qh<#CBFh=zfcB_2P1=f)dd^t`*_}UHKadAmv z+2b4T1hAoBPG1g^qKzVH-=(A0=+A{hul@mDqR2L_9(7F-CWB=9+ zTN@<$w796gfGZ1Y-O{U}el?x5KBHLgbg##-W+CTQR!WKsW{@*4AzxKRP^xg})JS}$6 z#fdtk`2o3W665^V?1)qxM4oaZRH|Z6xeqg_$e+;F(2yoKcg_qrBs_Mvlcrx*cr;}4 zk68e7Y@Qb3&k|f$n8?cgtxhUQT=_-44_i)fgofapXk$I2rOEA47r*JICS-7RT4kV( zF?f&4u{@1q1q{y|OJM}i<+ia(V`5(xIBX?54Ca378)+*D^fS4dM0ocDe8LX(m#mVU z3uCpe3we`|%~egdX}vq?A4oJi2|J9S2A#)aCZbmbCs<|Rj}|QMFv%p^5utU40dD44 z03*VH<1ZiZN>eZ#@4dn@)fheX5f((6AOoYYs zX$JToV|3q;@7qw20Vj2D-vY47o_3l=zUIov1#l=JA^@mkteQ+WQe(=KA6?m4qhbJ- zpR^j2VaN8Ap_2sgOIj;7(pP+0U^kFv_T2b!&E~che4=cC!8VaIi$)A*`o(gI&vW3% zxY)1T0M6?k;?r=Ns#2%ZbhladLq=mjU!tC>=cE9Ar2YiSyi%$PKx*k7>90JdaJ%5H zQg))oFp>SdS)lL03K~O~>2Vms*R8P>zQLJ29m`MJ8rlIIk{sUOg+e~sQQDT_2s(yF z@C(ziRfSjVeT4r)pk)p-c0JSQ&t`Lf4>tAih36Is5gXJraT1ibTG=rW=IS?xG0~8g z{wVx2A8-D>?u`t)7w{`E5g3J+6M<5D`dESHwoJ}n7M4n#maDB%?oT@WrKH2S_nTjq z+1PJcjdckqQqh|#Of|DVYNOIOSLN8?7QO%6zL*fsFc@E`sD0w{A?5w_Tav;%H?zLJ z4;cto_(&9|J(FUKQD`VQGAO%-iONN$2H|1lr!ArO`>tyF$$abz4bFNzr)rQNdq^be zXCW2w&Zo5nMo;P3sBqtMarM~o9c5)S6<_IVI_q9F8=_b~ggaHG%LT@(#o_=yG};@8 z?1j8H)^qcHeE{{7>ELW10DI-8s;L&5ty%u zV7yWvHA>DE8eAvFNXrY6rJ~C+CNnDb_o=ORxQvB6C9FJ>becr^HNeyL{@hB|0xOYL51r=U8v^e72Elf$KWfhA{$MG@&rZ*jJ;@_P| z+Y!R?W7>!$g{MVN@^?nJ?uL>x;v}#7#J$Da#OAw-sXyj!tdjyv6?oa2%YEPS@}6&| z7$J}&5LCj+M_4kl(kO&cedKm9Q?F872Ul~w%B0z1Z90c=zqM6hL7T{D@aCblwKX+$ zh0v!=r7<&8GhW``j0aBF4NAeAgI{l-_D5fVR!{xJ13Q8_jeSFvJDAo15pd)3;6vyG z_hr?p5wrf_$%gP_u<2TKo#qUM9=Ui!e6Q~L#{`CdY%}{VrTfcni-#&N(@Qq6#j6c{ zm~&OSWn+v~q9sgDVu6dMvh|vOi9t_W^Hak9Kx`81!gs;WKK0S!W8;OGJ!fwRi*c`e z1urIs%adt$ws>{O)V>M`!TIc)kN%&H9`^>3=NQ`Zpo>JCwStZ1yEXvd3Qpnp z0%Xv)L(UO+m;D6Y;p=pS?3)JA>Y zC!I4`%RIY}ul@=oPV9bsAD=axxu8IPI}r3~Ph>ssyQGEmS=ZVXp39rO4YW+6BU>Q- zP$#Y@$hGK+%4cFvX@DsPAumSkI=oBt;5H>G*VgHK0M;A$PvDRsbbTVB82ita@5e~K zJBOgav&3ty4rTG(AF-}q+fN&mKK#4wxVduKhFV|r4TQ$E@AXDA@{xi^YTs=5N`j}= zBDTJ{L>NDa>~3Q*uW-SbqJE|Y-8Yx5+^n~IOXyR0@9g^pzFk*3grG}4w~7X-B|&!> z#rbBV7h_y`cK-pzje7#eQ(nje!MLFDcFTvXZ~yW-rw-pR_B*a_-g@sfm3CiHxwA$o z-6wmN4)y(q|Il5SWZ8Wji9{EEUS7ZD==DFr0dsJ+g#)C*^IqE+IWknihGgrr1CwQx zo}e2<{4Pt|!Oq_s+J3b~C%LD6MHjxD;BOy8zxqEmM33HAf`)Y{eAbgDnE_?Y=;AxI zj2tAO0&v8HGz>N}PN&j-Taf8rEAqJ7HQ5pv+k2WD{lViL889|C=-hi+*q!$&?J{5h z?|dw-=-tCZuK`Cyb2NFXVaM!_H|J%%d(JDCC}f*3->ie5e(-B=N$G!`%>wO4YSGQ; zrI0mF=q-<`USDzrq?H02GFasL*L&E+GuB7v;@`{yJNj4ggM^9jXCwb%WBE1ghL(CRg~HMn@9{0BMd+R~q*3!_|U4+CBAJ$RJ!A{~nQ zRa5uuNt4;x{fxrfM6=C>ZBpd9qe@9qtH&eb5QlLKlsL+lP!ItrSq#J!zsU6>)Lxe< zPrFU5!W28HefqVy{2pdpeANhJ4dl^-(ZhH-koJcAka%=wAW);y6n{*L-XG6@i&$U zU+WL?m1*e2;LPLUg#Jr`pqTE43n%Dy%r8wX3;^S)9mBwKde2iXx?0%tPs_1^YrFbdXmybJ|ET&$x0 z{5pKSpWj0}y_B$<6&=}p{8OUwIB7%i7=3umk@mKCV)6bGvK!w-OOu|2gkGO7ABi)z+-1?@s$9>8dA)=VozxdxVdc37P1{D1 zfMPM%b@ALX?8eCRZ+nv~%0G@JB_0QC#1XRvsr(LkL1g`)&TAX2>PoH5vh7{HCY`eE z3L{wqs%b?=ue;_!E25=;02)dc}m&;67r zf4LdK_Ov8DDo&wEC!bkrcy*{0M@Bvkom{ioY8g5X#99D%Jb}_;oI37LkwLAcZ749- zG?4ENF&ZqSorH)xWH{;rg6o%E28wCu7cfFwXR;v9p9Bcd`vpp$+=Mblw7)UH^bI9`VuT(*qloF~bBR)deqt?}<#pApu1{<`Uv zOgc)Uc3kOAv}^*JpM9yD*1u3Ftx1r3yZz%W%M`Qzc3~3zQZwyYvl%f^FBW7sBx<(H_t^XkO)jW&(urD4XyJz+yd)} z`ZTaPI`aE!25qP-fL$3K#ffEV^{sFE|1&T)&yAcfR6>De6qS40gx!zp@9hQGcuvw8 zXW?zm6OpPC#gY<-3qH@HtODhx* znM)FiBGyZtCdP~&Z(^(ps`Kg1+!j}jyh&WVC0wwRCkr%fFWQ!d#x2+o#qPDI{VY22 zo+Wq{k+fRFV@c;74Orm3$E%vQU1l-hD?%ABxq9=Q?8Dl6Z+Fi;hgt~?Q*L$15C+CF zpbHMH8C#Z1;zWRG9pLRmx7SEwGOKk3s9s?swgG!?Ot0xGhu~MXyckW3&)wJ$++`^RQX~)LeXt zYT5tH!nYQsPbzHB`t!CjaAjnbDa9j%-fwKI07+}t?xb3`o~OF>J57n*P^5IH^;ia| z)%-dlFjaHi&=O3>WofSSViv;#qkM}c72OnI)9Ak#NV8#!t~n@7oHSebcJ|Y->9JA} zWZ1ZjTx7~x{6P?KCHdWEr_;?(c*wfH@tvc%Pc@PPF@1k0SVt2#lgRc|@cW;3ZUjf! zgZUG06C?8D&amJzGxOLCzS2QwqVK-BmAW?2>hmokn;Mf zmGu~?v11geh||U-tQ5V1{N2a(sWzsOki1R2G0yF0Zgdl{VW1vfhcmCFR+jSg;VMu@ z16SW4v<9uln$jJ*cUhfQEUN|&%YHR#C;zFmlk%D0v|6wY;m#TX9U)P{MVLJqRKJMe|QY->`xY{qjDTSqIJDtWL3v2GF)zOw!`8dUQWP)bpU!?hKJf5oR*g5E$ zOeat(-rBaUg?_1<>w4@Pkey+%U2nmXfCdDzhwVvnia+vjbN0Q)n)?O1K3twugMtF&oc%uwq=OOXj_*iZ^@1%#!@i^xPoYpV&G! zk7@Sh)E!frygpfzWtC-BHlqG1Zu{|;=o08QRG_ovx}98?EwryQE1v3xT4Dw(&6Ou0 z1^gKOR-j#x1$Y!6|wt?-Y%*G<|cz4 z`w6gW4gk2zdv5wVVMGdzY)UBfxUFS?gU6f*7G8t<*CPXy53;FNBvn3sxWn^NdeM(W z-jpx*N!}R`Su2$Uu-4bIgu{6*1c3V$H3m24DpR?t@?GR6iWHep^XG$3!+FZijofZ!LK2JCR7*q@l!0AQr*2377_U2$MhPYI6=@uhdFcy+JEM83YCCYkn z$FT0*j4aN8XHFn26w~s~USU4W3`EANTu)*6WW0QPFK%h4y$$6G`C;HBsOx9$3PRHT zwm5V6cGliMck>rK)9L<*oobC9DT960ZUs4I?WRt;v*%DNf^_}vn((Hp)yvs0 z#F4R^?AA$p;Vv&NNu)eb5cSS8esQV#K0O9b%Bi`2%A(Sy7a4wJ<}6+ zc3H)qm7&^u>lH}CM`}fliT#m1bG;}X&fK;{*D%!suQ9yu-3K{3%dV>L88qZPrDN?j zURQL2)lRfo!eQgK27(UiF_F1wd4AA8EH96gs4@H-nxbIf7lzfE+{@QA7htNH-Zt;5 z-t!c~Dl|zUYUh%MZ_8ED<;H9z^q%l4Ut~470CUSeb)0+J8fwFAu`qB0i*3PPGiQcy z&+u~R3jb-mWHjqJB?C&NnmYH@_pPqFx^jZb5ifUMi~j(xt+r3=n1&OXrB4{L$H|Wo z5iHN6w==aS1t*2dnD=36oqMH0H({Ee9}Hl?QO>qNAr}>;nre}yCN8v#dvqH|deaCDWu&Gv)FTj-E3)CZ`bq+SxRqAAYJ-a@n!2Q>O}hnBE+tAi9G9DkQpox^Q~) zS|w=AY7wJTEn>gyeZILlC>$7Y6aGi+y2ipBIeL27+gqIF)>VyGx20g&WvL^WRUI&& zMRAKx7iAer4WO*clXN$0X%wEVtP78)A7W8Dtf^}DGvy~LPDe0>G3>>+aQfa3V$xV- zNF{%uctMEH@#1V7>3pg_X4;KKg`26`o3T4=SiDgCPhqYSYUOmy|uG> zt@rpR9i`7cBf0D2!3sUr8VYo{aKXSVL&u1!zn7tlCbz!bCoKZE;NRYTU!e^A3vzy59Owz; zG6PoSrmr_v{!9r+uigy&*U-k!?+t7I=Wq%dt=WB4!e2;Klf&f#=I$G?wte_-BFhPQlOD&1wPL ztq%`gL;$6eS3gL%ZQbqY~<+irB1avtXTwKGd)BJt?>X*?!!==k1%pODU zsg=@uw*V}awNJBC6JE~?l*kvR#)5;F?O&*Zo`*qs#p?!m0OGgbCMH3_ZAYAG#yxI_ zcx6n0;I_91f|Y+da!Qv^OIl5Z_Hceqr=ew}eb$n~lH1wkW5(MukpxI#2z^mJBr8C)z*DJjFv;#!`Oan#G=am4p0F7BJ(!lVcvsR8+N~@viJ+TkYQUb(VS`9%d=am@;=?U!V~Ap&*ZT zt+I)5gke(i>O)O%??MrIkf10+pkeI~NqrBG=4qH1v&X*y*9 z#4=Ax0wRL4irhAOUD2&tZMywM?TEzXBY=RpVt-s8>t9E?#pu5;Jb{of!={R zYdp^SWtClyfi6!o8Ev!Zs$U~6Vi5Mn3;luuwx*Ve@1zIA?`E|*W-W0!yN}PBf*@e; zR6j)^jqE%7nF+8_=T4b7CLo?3^}*WEcf!hhT91q{B96-0<|5OlZpNjINqJFmSYaWV z<7EY?5BKiUyYDLYP*Hm`Ci2?jf3N`1EHdksk$fyl?rxJ#H@zVmqd>3^OsG7eEv-Wx z`hU-~@QHwyZor^a@_J;U7+U@-i7}4e0Tg)VE!k~XkO;J4(+gbr6qMe;@h+fmj^?c? zg~~Ef z3H9~-wtoypfR%JOl&VZV+-k+WKJJblcIDqu=~qt~U@OpPdfy(~7~j6Sjl%rRop!g| zBzX39kxbgg$FuKgGTA;#_a2NE^fXl6;@J0(^UGF1SAp6_gbT2TXGE?*myPiJYFMex z$I2DO4N8MhXhmg-h+s+!Yg|ChS7l4h%zWV|VApj6cl^g-7Y|b3Cu7PEIljJNkhR?p znQi^stN>*iTb8t)`sKf+0L92;kH@H}#H%@?)STA?+h#8t_XGq00Lq5FL+_^r4g{{& zaP)WpAd~U@^~vZa$j?7eb(C3w#P`vM@h(GwCgp#nk;iFi3?=_-*S5H z)>U|#Sc(uS5Lx<*pvSJI0zRTNc9?6pHPuyK%p2X#v&8#BhLtN;zz5g(MVs0KEe)Twi7L4v8{PG?MH=!=*^<-aEAk zfrs>P{H6pf1Xk<$Wz^qdFkmHTq+c~>q-B-usSujcsB0+tsn@)wz&S%?Buu77q?Rhw zoDhu^4iN9Lp{aJ#m7-X(i-@mO-1V5?xL!I$yYkhyD)6(1#>V#uQd-{v+sgRx+*6@i zst+v-CjlrVtfe(cY#yO82#GN={qeR(!m(uZpPQnLjGsS{ly;5>SxF?8cYUc7Tw2L+ z!F{UT6N)7({>+bd?>xZvU^IG9`{DFwrc$;1{Jk_C(lr}8ZgB?b@ml|Z&SoUs*Ehuu zLyojb0?wU2^EO;qQq!S4BXlbI`Nm6qG7#9sS$d?#y0Dcm;Ji#KRs z__ANMbMd50tA3=ZlQ{DVq&(uYH0#uh1*dNc?2O1l7_9q%3|QcL`^UlCyqYL_OY&z^ z`NG9vi&uW?Z#7$vv2q6&G0zPO{T%rJ2cg55+^^?F_~{g{79W@Roj@?t_|G|WO1R4VDj(_Hxh2SfEYf)Z4R9XzYgC{==BkbMM0zg~=eg2|uHg0;6pcJ6vD z@3dhcy}q+tw;K~f)HmSGq-fyt(!ly5hs3STEI8$Pg--o=QnL3=@C6gg_;pDk4HB?b zy0ys;T&XI-e%5SZLkeQ?PPczwP!cc#I@oq%N0UHGHL$Du(DdfbIH1wCWoB(Oq6--< z*`)kzB(VCGrpNab2?Ob!jQM|I#UPBU-K4r%K};h{oOlk%-sp&M($qB6C|vLzMMwxT zEu0kdAF!Aw6YWT0l0uc{#HF*-$wWkKc0X%5Rw?LPub9lq3BBw` zEv~PF>65S`wQ> z91kxsC)J*C#vWEkq<6)CHja1uh!VnwzRNe+$hJ|P9+(?0jn8NYdn@unioL&nD^$bg z)zjggtekr_uqZs{Q4HXWT%><6l9Y`qxVw;}j^dyr{SIr=vm^hGGg!$%10WQ2syPpQ z24G1djRSz0wuxi=>K3RCpUN_6rLEz1VWYfN#ZI4L? z$MYfD%(gt1q$!97iye}$MDk=#5T)j?PXg8+Co&yrB7+b@_$`#dq`V^sQocPjkly({$WBo2kMsrN0lCZ_ z6K<2G-+-IoVM)5RkCuJ4FrKLw4Mi&cZe>!hD=R^hpnrg;qM0)245R<$CMQ7&H1~7* zF`-1;f#hMtU`F>Xa%(~W>9qX6$p6)$AvO1w4;t0eM{q!Facbq3x95lx`hM7hnZZ>E zB}6TeskD2zPL%|!O$dBW=8%1DkkbI8Qf)ty@_b5@S(9Qkj6=KuZhD6%<3 zk$ZrwrG0&m)~92{41AOWvnsd(^ZZ>6aSFX{w!Ca6Q*((LM=oA#_M&E9nl9Vx454Tp zTvxY#ak=#^C5rJv`(W!{!99MLMYK=gRcNV9^?985Wpz=nNJk!N4NOu?cI9oSt`5;a z@jas1oYswkn|1u|AGA7ApJ$R$HroO+LC)+1aYD?`(WiN2c$P~BLJB2DsdssE9}srX zB5LyZ>5p65lzS){AE%O%Vz4zkMix z?w2tjNL3)xBH4&JX913stCIHKq4UkP1|P89{dPhZvOK0ew?9-~ZI_(u%Ojv&uh z;VnzsUOx2CeKC^g3Yu+D&+-+Af#e;*`w7cBsaV8fM}tf2WuMKrSliM5S98r(Mp*&^ z+7DNzw}~G(fVso@+pnY~Hd}Av<$ONzQ3GwDj~nMgrmxsH>kF}w#9|L)%y^0{Ga(F| zJuk1kP9z9@Cu5vWx5MJd{CZ6KUCuLmx7)s)@WmI8TRpu(JOM8=c6Dr@_F`Avp$fKZ z&?fM{nLB~jHn6hO4`jT}kEWoDi~FSzQ6|!i2pcdD~58W`Tdth5-uVg2vrwfldKjFpiMogj8B~Qfj z>{2@ZFlG#1m@;7~K4!&rU48kZ-Mr12#O?ZxT> zxQKGPzOQA?xkHn{;=65M(9|&{z|dU3)pdv2mqWj{4**KPM+rbMCcx;jIfB%pzy+A(HA?Wtp0eU-=Lk_TYo)JzndctxM_A32^qa*P4 zoEh}I9rb<6wE88?!TBw&i0W|)8R&Uws^Jwn^E9Rm5(;wdg8$w{1>JA!b=!DDxQ`Z{ z>3vv9BNtHydrRIVo%Z^^++XYfwcpfLi9WR|wddSO%(~!`8e!3%-D=^MG^bc! z*=n;{p}BoY5$8=ph`_P`_TDTCpIN>5a{}$B|Jt~I9wCOGq&He*0Lc!i{cA=ee_wyU zizPYX+uc7J>9d+uJ+$_4M&}4gK%O?Xtyx#6@X>IxDCw=AvznH0;=VM3jFu(Zm2n7z z(M6@znG3i|UfQuX&cX@4Iy>P4qfPy0ReR?IYNE$h*BW@?mY zsC{(3;1t$D%}3pBhj=^S^TeOW9Y`=1)d^NAUk*Ey`m3p=Thswa4jeDZrz!u4DwX~_~|^Gle!jbB{gNkPqT-=7f<&{H(v_kso2U8}s#-Hnp6 z+2>`#JWtA?>EA0eL62P~-F7M7S9WPe_bw|0c|p)~GIRHX62VPKL2NE)^X7@n?#O$bYwK0_2k(3LFqP#%o?J}ahoY$bcSiW{%A;%BpOJr_h)VYO+u-dC z`R!IwJ&v8*82K%BQ~^DfzUHAy7lRC(#;+^PYI$*4H}<&o(KfjGNgqyxJkM#W>jRV} zM0~rf7?;fVobQ$EIMo`f%UCTiAg*TExQQ4sQQR{kA;aQM*ICh}JVhj;4=cZtdldiQ z9sjS5k;0jTF?jI{-$QJQQ{dF^$v5=AcTahBvxH<3Z+|Yb1!1b-eSe+x@sV5Dj~Xv3 zpFK(C9lP)QUsi5o_u{(#T{gPMIs|<~ki5VbE!d_5`8-zCq`RHC66IQPN)+8zQ1LlS zFckfeeDj~nZF)o?+GpJm+!o#}Qe>ZM0SKi;NlItEHZI=$Qun!Pwed{X*H(V- zWPGA&l1g`pY_9|IWCL+LUI<;9CM(N%xyC~deAsbtIo|2(JbY)9_nLk9-%uXAx1GoL#%rth-q$Scm< zHhO9=Rq-c@LgGImCEfb#;oScM7h0E=_abTOaZB%UXEK%HA90GKs(;;){{Uiqru=D! z&uEA;&f{aCOeFB%z94~i_(zl(JldQm>YSkA9vt9sHgI}f+X?p(+kN>DeEq3UM1$j>LV7n@11`+lsvaxeeHSKtqb}o;kQ__ za-PxyAIWnY6V$z%=)TR@6WS@OMmUg79*%6F-4l#QsH~ycab)TU884Lz0W5%;3z2om zd1a+9A!sXl15!Qi_5u2e#OC)L@;wbjTUId-3zmZeIVs&<#ZKbLCPNjCUi5l8o3 zDI`jm2(>LnYGBTU9iEk`i2Rb#$spu~xDx*TU7C#PFh@2DTWIy#9jOaopIDI)=@%Tb zDt8H9kk4%LU)17|1b3@FmUrY*vfhLUq1cG$8u`H9RWh8eCB=B`(#oj9$}a`~->WC= z_I(mpq|@qfO5<_zW&fp!836k3o3+lTu3AcwawrAfQ0aViY8n0ax~X@PT5uhPP=W{` zxya+k9l(^w{wRYYrCxfbq1rDl2w)Sg8bgz^B4Q2Q z=CXhOd>SP>;5>iXQa<%c1#9>aa`vvq4WpG+tdg`v(X=DNSTkr4$$G)p4pdBWVK~2< zA}k2uGQ%I2w7`yHH`Q_e2O*4gkSF^xtG9eeI99-39>}0~Z+%vxxwcwG^aa#=y)3ta zqe%TTz9q$W=)EG1G>Oyvx;@pPR3;O-jM_+rvN=1P4*!qJQ~)g*PdvS~GO|OU_-T&% zYo5U2-1gMwcI!{kTh@b19~#lrYTWl_`Lx1)1Ir2wVK7a3Z_@E1Y7`3&>2!PIaDCAd z^(Z0qLZKbpFx5}I=m878r0y6}1j>RQExi+o^3vGDhJa+dPT`x8^skI+#B$t3xcQoD z7)=r~ybUcmYjZjugSTk`x)fs$MRhN-Oh1D|YE_t|u%+P502xncjED@F;f7acAX@ay zAJrK5o|7o?uF!a#ci~(McCo7Eq*Lf$&iVC(e)JoElq$s&_ACskGlE6NMG;;_)YQRp7tk*4L7B(&G&nGMg&^ z#BKhBRf-S|pli{?`0N@x55@>IKalR9#t=jfZVK!T)LbH`P-71eXlq>8cm+0P@~p15t`h6F@>lxpZ7^qVr+j6XK#B4#75qP`YE?eP)_4(;N+L8`Ld9E$4|yXJ@Em_4zRtvAc0p zdUS_EpU$4)!GiebRIhRdqBVV3E|vV18snb4Oy0o)sSa;V@o2bUqSz;)oUW#T?YYm5 zea5wM&ENN?7ILCnU7C}NTC?`XdHxxR&kslm2S3o;eZrbp1&5@Ums*jqn1j&li+_9x z;euOKp5*aFay@!#a2yg=9p++(eVw2KML*VS3Vx2Xx8@Cf)E#%hQsde)g{kB43xpxP+Y6}{{deRD>24d z67sP)PDYBF7ev8*bTltnopN+gk4CXz&Iw^A6$FK)N`I`sjbNEb3}$az*Q=vTE%;pO zikv$Z#TR8iS5X~d(XyFb7|8DhbXB z%JUpGB2#p=UUxjd7QNUe(AM?`$BF~LUwXTYL$AtMjmfdKNAUwrdxCVyu#jm*gTPO5 zr_0ki{+AO@M8<8UKvYrcoatF~TOt#;YtcuGEQ%8MR`CZTznO+nil&Gek>lMsc5WTW zWS!UNU!bk#n@b?1E)P0{0W^}0?Y_br&18k{r-{<`14b0mjC?zF_iQljHv%qm9CAv-(0<+91D8D?^IQ4xep}iM$ysUC2F$0%2B+({E z^YNa(x?bdqHR?B1>@dttl$gG;B|Ti=`%!sX0K9l~>lY(*?}kw%z_1iY94Qrrmg>#v z5S~`T_yFaF*f4@-B?@k^6o34rS>Av@fl-br0ExnoH`rIKR} z^EB23>Fsu(G*~~n_Vh6vc>kzzQ4rjS4|Amw^9h-m8g9k7obF~GIeA8KCswK~dUtC6 zvaLt9$YA#Ylrfo5T16&qW%Gj=8XU?W%?L-bJsd;;YDy$h{h5dDI@MpF^1aW-WsbJ> zrh0@GmvXv&dF038e?DZ0o@%fcu7%mzOfnI9Y{EyKyGVA>NG3=3+33K;l;~ozktZSVjeO5zJu06&=I`ph5X=y7$bRY8Tk zF+T>r(s~@W`QSLiRs0A^W|35(rM9eeXi!+mN!kRK2CfBL5Lj1wU%9pR44L2X93`6kIg{C<|tEO3EhdA5J$^8(>-(PihVajY}9={aB$CnfXsjx5B+crx8P&H(cIIlfqN#!@30>B6C77p(N z!tp)(Y31&8qocYi@Toe@^-7LQ%s^-rx@WYwnxS-cDGa8Pr{w)IbJDkS{7bW`8OWL) z{?Oq7p)_+-)|3pi^M9W4zvsfy2RXf5h|#XKw*0Dy!7$&ma6JInkA|0(SdxGe$Sp9g z_2+q-q1HkwHavK(|AO^=YrR)ISvoDs2=O1uX^))Lb=A|X@ylE2*?&j0c2$-y?E6H{ zbp?D^>RmfFg5>BRinB#K?+LS#THdexPjwZnIBirh9Y4M#C?DBwIgG@TA!>+_e|t_tvQ!fJR+aIYP?VKMoNta2<|X*vv+$)LgIxGQ+Qe#@g!PX7ZKnJ zjfy zdtUdkdmaaYj6Jo#Aemmb=M5RX_IEW6U)%t% z?^DS3v`c3prUMUxZX?3E9fyWBJve=f9X-#N7fU=0qc|yiYiHTrm0b-$#U7UNuo`}^ zmV1$rdijmK0*l4-Ql6nhdis{C)zRnf`j!()tun%n5e*6Nd!I&2Sk=+hl5cdAqe{I4Edcn5U!o)SFML9TEJ3xnkOTTq$7YlpEXtq zH|S7IBRGoXTM(YHFvalsx{l}r>Xb*+HHsGYPk0nqBqb#wSTUjyn)Z4>zk}HQZ*Xuj zA({M$vO7&Vu7%@^BNYfDN5cXf^Vp;z<8gjDlG8XJ*~a;KBI?2v@K7kW>kb1sa2<%9 z$T>pW!iRbC=BCG&5Q73iP;`Gn0eRYaLTY_^x@#XO;KG>UVixG+2*?N$0BCR&7cKq> z8+nkM4YTFy@4H^_On`28S^`5UW(y% zH)8xe%i`ZGK>V1M+UK&G!VT{cSiT}6EOMQvgP5K@K?9j*Q=4(P5&%CsSjiP`ZXq8G zND`qkDBh6;H8#+p#$WK5`HN_js!)K(5tNwes!{nLv|&n*4Cd6na$vS4TZv7{DHMJ# zEVVkt!RzkGiFLX)(6e%DDsVv*E|s!yD4=OG3^J3_(?v2}ePN6daQMnP6M{)Kn#XRM zM0a)0lwEr`G$ZrrMOt?y!nU5USz2CH5Zekuvg5W#azqsytbC(4E{P14;V%;LLp87O zATCr9>Bu?B7UcQKC<)qlJ|wTwNi$LlW^&D0|BR-|tZG#iYZ#@am3jtfq9=nUdZ%FM zuIJ(;rO$ioolIwEaiOed5OpTp&k^;k}MK$Cp#oIAyxzclNbSVh!B*S5T$u#)jAy0WWG}YQl+8nwtC(1kQJ_*KHD8R+lA+h60G7-U^M%X4}{zL+;N@ zR@dG1YSx-1z)*P&U}o_j-n9=}~jc&uIC(LEr%OsVMCkNmv5T z0?#w*?_;~YH|Rt4Q)Bv#39AEwy|;f1*D@mrJ@_?P?;j;i+yKcqGSHKvH1THv``>2+ ztpd5i0F~$-nD0hi!az+VRS14YOo`&-XF5}_)CB^(-ywC`8=y;(=_Az=VP?ieOQKF*?xQpRK$ z>l{^>?w(m7N0XU=DCI=u2 zh_97oM2Q%KfhuG8T@~F>BNX(bpYDF%8MYHvVcFj)RT>87(xN_Z;7uV}Wt|6w<0=l| zY7M~Yu;S(-Q54G5jgL?PAR*GWU#h6Dr)~a2HZ=@_8y^r;x3AY`_+mLEn za9Ta7?3P2KCPmf|BpPwJRtZ&`B`iqLU?5O^ZrrGM6!C)$$>a=%qj5%628e9Gq)t;R z>k3GtB&d~S%_}XxnFqIN(mgHMRjS%HA>gIhPFVgZIulD&d^aAqFCdbb6sbRJYp>3X zRmenf9xyMfeM}oHkigpijMw7-Aapy{7&5khTS`$M(@GE5q=z{Un;Kr0mPpRG>JJOz zt|v(jL+eZa^N{(N^P3OCy8o8?kaJN9osh{@HrX$_`_mNRToyVdDyx1#T|MYCg42TE zv8wB@7U?r0U$cGmm2dWgl@U*k8S8b5_*-ONFc)6X=4eH4P>x5-BP(KwbxlRiKxh&G zPTrD;)shO`!j8*3G)^IIy$Y)Dcd~7czyd}9i&X%0!7BJ#LCFbU%l68i3{?#i2qBJ7 z^emlbY*Dl=jS*54DkotvHN>%mRvK?c<%%}uM3RYHV=9h?B zgoo3sd@+KdrsO(uXM~0p2a65}t6XL)k=N_A@5;cygxrP;64R1U7uFEP00Xd{xP+Ai zTj8=wkfAOe3P4onj==>=#D{tI6-FsD_9+hI+SW^=fT!oB44GLRb3-Lgu?jzKcF~A{ z3yEfSZRzB5W}?pLp+lniAYl1J%o;I|{>o|IN9rfk7o-3`rXV-UeSoh9v2o(ADu_J=FZco9U*uu1JKCDWB4&(Z zT_RJL+Tpjyk}5VQ!NIG}4rMnf-X-K@qZ3@24xuGf#nQP^x6{60OAWcXMj6N1it3VTs305;hw*~u?8v6PSDol2ADSjx~ z?2Z;7jpn$LG4rLkqn9?_>^ioSGBst%q3K<>_g_bhR zT&Mr;b@`X}Y3Qtts2U+Dh2MU+Ca_Ab!sJ2qY$$x*7fvvUHbW$UVqZnIS9IpCFzAak zZ2V_K3k9(n{5rYK?PO-$O?ya33~C-=TU9s;nrVQ(u8mwUxLSh^Lq!N2`^}yGu|~|? zXtcrpS@D>yG6=VT0=2L-;oGvR3Oty(8Ai`Bj2;{6BOIG8dsT>tj1b2sojbsi4q1ag znDzNy6u+PQ{+W=eL;j;>6@XF85oWJ>ku$U3c4ZBUjG(AEJR@4=>N+Nln-QH_{wgBf zCG_i^yeY0%3WLUDugzZ#zgR&&ERNPB0$drfKuePyzW?XfN?F<>3Ngr-RAvc$-!xXG zVVuMmeDQD&RyFdvsoWrzQ5V!D9ZBt3S~7TtZ|=t%oCyI@4yIr-j1)%Z`Kph} zb7(!QTa&%ZTPqJoeTL#di!QFZ-^i&0cShDP^#w28_kKaT0l9uZMs-L~$2Z@ds+7^C zSM+G%VM#<*L^JQ4xaq+JE9R4`hN5U#p}~pszhnUXa=-{pm^bjy+tAC{KilP|Le}0qL zLWf5B_wdDOy=iiCl`ftPj(@4#50kYhSYhC=Ecu-oRx- z^n5~(uMaBhcicN=wFY@SKn%x8^~qX_3-5zXXqR9826m`1DFItd4pL<57(UhtnT)|p z`WwE&r#VkFCR-v1C!WtCi_6>SU%>~hfAUT(_`;NiMo$Q+JYlHPf-o;ugyDBBtSU`G ze2FHRG^Ey>ra?NS0f|}zI}pUWLmh;6$s9%rYVwXJGh~eKl}y8cUK3&g_{l+=a`{Us zcG{rvt!I zqyWL+oEX7%PW-SSs%2rx)d-XzR>lSijH5uivn=VtVk`()kHS@>S{3ObZR9~JGPFYM z18Q9|{ZJUf)s=P4VB_HPP7tMNJlmM-%w#(GD7ka zLO;$JNUi%^7);IK@nh8BR55}9@QKEU6nf)WiV$kbRyK)yXf&~VYxe)`W zy26z$jur`hEk;10M6H{}oZPR-WrmJOSsX_agfhgeJyuO6R_6jO3|kaepL~J%A(pq` zkv*sJz3Goc=|=)=t5^VS(kKn85}O9Yht#DvX3`^Ln)>X~qdj&%4q#~9!iCPHbg#3~ zMAZYssXzxEwn}3d%=DB8EJ{xpZd?I0509JN=!CHHL$G^&P1Z!g;dKQ6q8!gx99ErS zs#>iw&)gti4B=yEaXmEyk=i3osvzCmmI01j3a;v3xo9*k7)Y(9gh(dttD&{-uFj;+ zf}t$O{n8o%=M8MZw~oH0HC4Y+wJ$e%zEca2O|&>g;hqbOCU3VDEgx=5m1rUrM>2aa zKCscGa1aVf&-wgh@ZZaE=rGAozvM?H)Rm${a79s?H4zUb(rg<^yrrwdPX}*H6NtlM zkQagq^XF7y`wGJXRb)sgV*{lYPk^%`Hf)}i9Bn#r#cRxvMG-pasm9(^cTk*h%G*>9 z(0@>b0&voPFM4T~=lMx7GXs*z{uG)@Qhlj~#QmO!9V9gV$K(R`80#qIDS`biyvO4_^&H{>4jHCukKGE*zWuCR?&$8O90DNK%XxB*7>Nv?1ltHM)*P z<+MpsIj}=zgoK*pzW^2K8HV!TR0~NG;&{Lo`X5Z4yElF<^g7bTFtZ1Xz?T1DsL=G- zeiBm+lM|W2Uiifh|Cuv+Hjw%$LDEW)dQ1Uz&^f$3zS=(KsgbugIgXd8Yu{!kR~?YA z1TJm(n-N9&kejGaV(KVZ28XP^21h4J*rfJfqt z{&ZHMNM<#tuEi=?OV7eYMC|Nu*a^$2t2gK3x}?kIeyA8rm3jE>mJJ-XxBHmB)}#vk zi!69Q`qc5kT10W8ce(E|HY~}Bbh)Gx(^#?6kZbM6^PJ}Ox$+02)!_nHkzGeOB-IRp z>4x?Ze}!4;u)>OLC6dUoSH%Yop@W6>$_@*Ntd+2m&MFkp5D28|v9n6>hwSB_NF*qg z{4keL#fQdFx#U9f=z3I~lQ-dF$SYsoht%NTue`ywB{YHP!M1Ax9UvO5r!@XfK5}O{+<@j7!VQ2T$3FFtzI5k4=*Kixf@=r6a+dsK8{c>!=uMf z(Xr57LY62hQ7vxs<3g+nUa)FOoE56QJ++;$60s9OPz-Hp8KDd>V@Si3 z=nTGs=sS|O>@TaS?u;J?WvyXQ6hbr@wkm;y;FW+LViw6UVNE;x;2_8-qrF8b95qC9 z^JM{GX1rygP7vfNOSrP9@p>n0;HuZq6nFybI*N)PjeNMs6d+poelfv@%+}_(5lyB# z-VnVaZnQF~bG1`_U|NR`tT#%JsOE%Moj5NdXUqbj`J*QV<7+DU=Utd^BA-vuz1zbo zF#qg@%h!Sj9#n3=Si^Zqrl$NuOEW`Bd}cXCPBBvKZc@xs(rL@l#A>;D49};3dcc{#7EkJP z*0veLB{nu;=#$DBf13Jp)%WAxU}AW)6MIkE^4t!HE#N1e4LOEc9W*Rly;{+nOxReV zdzz$H#zO|_63H@#f>=KfbylV~gU;StaFl@YpR%DM!lkicWZwjoe{krZtDBTcw|q>1Y>_-i-E5dB+DI z$iDAIr8=)uAQMstrHrv3M=nirv0iN`S>0tqg4i^aoHlxC(rjvDSaM)DkXuqIenKb) zFi%aI4Nn&I<%mRQRTFDWPI`54Uq{Q691BXb-xQkxh*txTk)Rq%u%+4=PkDESUWSmI+Oq+;IHZeHN;w=golV^L*O(VMM zl1be8bv7S!F=UT@mjd!Oo;qz2T;u1mJ%E6@s1>*Z@&{i6#CBC-Rg1XtI=N`Dy(#&L ztbK)KxCx*+&7eC~Xg_;L>pvzylUkDSO&+O5V#ee8@=<&icRUdl`d+P7fc>n@hs6-iBtE^{8MTA%<~x%Ht-KfoO%* zIiHxcL#|2`H(htz&MJLw?`8y+EGBuZq(kX`7aeH^nI7k)&j&K73Z0=^`8FHLF#5 zrPSyCH&c0>kLoXOlsz%yt_$!J6e4P!kSW5M*g`Ss^SJrsVKuAY|9;#L5s0xkdBOtJ z1RsMq>3Pj$GUWp{yFqROEv_bjSz3GTpW~TpYpWRGgT?txJ>JiCE?^Tg?Y9|ESSS$t zS(G2{h@UR1S1I^zu+ICuo51BH*I5#=pd)T_a6q}7;kSoJ^itP7=^b?r zfp+7+h3br8IH9@B_G1Y#S>k?0jlhu&L63YH^KU8t8=dQ!6F=T}@V@1YtP4Ez`0%<| zgzPmz-hu(lg5{m?a|%B8Rr!xcBCkIO*S@({lY{l9c@K}&biQUmvEBY~IJ58eKJ(pd zON0PSO>rO8fBpEwFf!dpvol^|Xn3QzrOT4yX}m$L=X~Nz@YZV~@K_Cm$#jN|-mCfv z_}{VH{7J4|)g`af#{rAKxTYQxxpptVmwaxLAS`pe-m-HA!@)iQ|A%a3fYwd0o8D6< zTE4S@(>&+2;d%{V^L)hjsk(OE^~2AmLNH_8@*Q&Qzi`}a(EpC(Rw38)#_RI1JOA+5 z6mXnr-HDU~88lOJZW#MTsaNH6Sey9Vc4l{C!m&;D`4=BW`$z~<*@z}9&eEuP0 z+is(Q-PeOLT+7Wqzh>tIsx$us_mYzCq>_PG)%-W{9}a2aZmRm{DsW)L{xd(XhH&HlJ_>v5l_ zyV#y*>^R=4`6}@7zQ#GYKPhY9`X)-q-_!Q@hO>J)by=0Cg6Yu&E766a>w4IpQQPHA zvetgcpzjBLs66l6%~tn*7^dK3f3)?XGPb_s9Wp$~&ByaeAte`hikhwHeN*wVfvd=U z6{x9yWqYvF;(g|^^#34#DFLQi*TlYeb@n z`ncAYv0nn?;%to6q8t}7=+7-9xAeXxy&84a?%io1v zM!pFHFNp(HPUOX5_xIG;^%eu&=kP=<;spVF=(T&Btz5g47Hoz$!3$co=9-VQ8M;D2 zREbYtzAk<>WtZ$JE{`MK*zxI{K90M2k5WP#@F5q)x8vzPJZf>+FoMVV8JIKfNI?hX z?t1Ut>;e9Yg?_y+eyZtZ)Kg5n47oJPF!n%mNx0z!a>mv?lg-SViCn^QLQ}ZB*8L;H zEqzopITNw~F_R~ki6K$zMfVA;gd9m2^11riIG5?10Da^$Sp05X57#G%N>3BMCBcu$ zTn2s5U+o^djn0BTJH0akUS|ya1X>U4+f|8nz_pczbFHnO+iO|#6g%IK(4H1hW@DO4 zw&StI$6whkVYj6^P2F?(@o7iT{ripi>k}^! z(ChtPhpBiw>~1%+-tz9Xl4()Se`4Y`lY(8)4Uo26+sDo!p6`(PUwLNhf`2S(JW%sX zG>F43RS8x_e&VQ7R6%IdwYBwXCsx*kEO{4=l2?%tB2Lzrx z2R7K4$@G~97Gj70vR4#AQjyD){>IO&V4wT6c!Qj~qAqBs56DoUoFZTi6mrSYW5KwI zH|lv>&p4Ex^3sHsaw^sHd>uVaw=Ih}1)7r>uvVXyQ4;fXHX5JBG{xQ}7j|VZYq>3v zpPYl==gVV}_HHUTM};wdV;9d?{ggPYuzJxN^Tel!kP-#(p3 z_Pk?0pUS5iEM;_o_m+H1DI{wApVV+)j-w}5ONygs=#*cHe&PSbj@2?^Usy@BKDlCY zNivb$2ZFA^IIUV!!{%FR^JIlBzPo@vBh{7;%Zd{@)AAn$uw-du_ZQ7_{~g%-7sf$< z48~nPZrhP$Id9!$>vZ@sJinGvTQkjb3qXLX+J zIG8@f;?;Pl+Cpm~WVuLtl9B(En~BLf%pd|LrY&3^O>QZY&;X6Mm$l7p1M87t1dOJg zz&AxZA|9tPVP`C?ePYA3p2iC|&gwPoO+{1i|4_Xv70RvKXhEn8Ize`in-`UGICmcdLQKZd=f`fmHCJN=c6WQdN}O6;w(fG$B(_=!8M0(j>n-1=@GT zOy?i==63dL{n<~LHxHe0gt8iN!KzB}r!xv;FKK6VKTb%wv3n!h6 zhg#Q%zZxS>1|QJB%zo&)UZa^X6$Ku8-@b3$UtMs&=Xvj{`~!8}j-wSbbgzO z=@z=?SG12R$$3plM_dbrJn{WG1k>a3&=~uE(31-klTFST3wNv93|J|hWQPTyoFGz9 z4=s+kH42!h4ErDy#^JKDCu9RBKYN8Uw7g$mA>woLznCgE-L+2bH3Hx!rC|95V^E3| zhGT;SriuY1e;X5s@HeHdG5-8KpT74H9T&Jajro57vn#PcR(>#n{~I9xTZ@wBH`mMS z5x0pRuZ?SVklUD&g&|Vem5< z*{YToT`AQ~uYF7C$&~$!P0GYmz&nk#55}o=IUK2#XJ+iQJpQB#J`6Asdro-I*ha1* z@jC5q&)9cYt`AQ0`Tz&6ztn!LyS;la61v&a45eE(G>u%e0yVX?uQqt^Uw68;x+p&e za%t~Pjcv1sobbNvr0dejU~yxA9ucQ zuhe#rXLwF~!MR+EdQVI}>!foL#i;)aZ>q?hnTtEi*uA&ob~(bqD|282WZLD4{#)ge z!GrSOIMlIt?C9|ly_W(8LNKO*3oSL%lY`cQjrAb?WA_^kbh@>~Gh)k};$az%qNg|% zVfY#ecI9R?2iMzX8(RF7=%8R3U9nvP;*Q>+ug)@7zNNXR7TvT{z5he46d<4JBK4L_ z0CCd)TVo=3p;cdo77lk{YEbkovw2i6HT!}&Dr#JIXlmxxe(PMb`S#Aa66nd1TKvao z3tdpRp`Ds4k5H1(Rf{@g(Qaj(>B|jrwi`;Njl1Ijk^7MUmP1X5qBfS}Ef+JX!(O!G2rI1G2#b_f$>8mL`6kDdUOEk9IL-p1nx)3BNpMuwU zUyEBo3GdWHd5`DRE7MMk&P^tB3Hfvxmx~wZmIM+hO`bVvR|rt?cyadjMq)vzuHLY+ z=cLz_ryDv*sWohxu6_7pMUg8jL{VijUPaq!F|?m!3*?SakkBRWE|tu59_Rh|qi>Px zyvow>wBPhKSL?!sf&b&Q4d3@_zEls)ir}i|fnoFQC0DSX?Y_BMZ?lkzXSeeUqvwn6 zRJL z2VbY-eutpX(cId3C(wC02+5M(LKL*}e2DJNHq(0Reb93f6xa`A-+El>yGj5q<7UE- z4laaHeZdmLchc{c>$_+N}MY|4OsHsb}~4)Zsc+b++ZbI8e64#%+R-p?S*>w|tQmps$v=(J&;UX%Yl}x<4a~Jd zj-&x3;pjNpXG|C40YC#Z=kNR97^+X@{=LlpGepxw*n0T6@xvRj_$P%#jqpm3jNIXo z{Fnf$7J~;kiU zPV;x66qQ{$fl_50=gQtvxH?T5{oR2#XK4bT*JCgDjB9sO=oZ^jwBeT+;R=7pRp*Tb zA{}mWPt1z9;Up9pDYy#V6dB<||3+rH78^t|r>;Fp4KW#_)QNb2>S+(3Kc$CCwFJ1_ zgw=oQMgLd#^7zHr7fq{ZEV7oqH&sLi9)5wAh7?jAUIkJ_ED0Vwn1x+hM8-v=DTM4B z?+69pa@JAQ%FNnBJ&2BpoXAXq!@iSM6pj(_2N*BF5gi$7M*^TL62qhEp%}S2JKnfi z;p0>=An%A5!|d7+#V^%-dz+zU=LwFRjfWKfZz7>_DcjsZW0WDdRFWXN4CBM ze2Rr%Y$j}Q;%M#$a-XC`8@nl5s{w`j1jmR0bplPqPLQ+oZB+IAsz+{ht3iCyv$r9j zViQzOTRZ(dy!V2E3edz;_4)%T`8IT2g(m+{KRYAAuJvElvVVX3laOo88e+2&3<5P= z(qC4!B6KLELViIg66IvAGZ`paYRV_2l*5oD5fw2-E@A%yvV$x`lIw5 z7nDJ0wBpen+y5ZJ2e`kpx<(`~(==)$uwD^zh9#~Bi_J|=x|8KgI75Q!zuxKz+<2Bz z7uhw}^SrD^Q)_p6YP`~orPQN_2BQkXp_QbkkR>u-@}sP&!J484!C`DH(25a2=TloQ zTGii@-LD&YeY*L5B00vBbuD~MW1>ru)O6H|y?5j^870=xwpvJhxa+a6I-hugD>?he zvD#sH5l6@+UHFE!V6WP+a?>K70&Khw@_&;!e@ zvoRg_TC@sj+E7C|SThkZChb4V44Q92>8>2sneY#lW)?Q4jOFI5D^<4TtPbM}-)Lux zBg|LZ^aN5T4#U1NlkYzb_7^v>?fZp~Lz31@Q++|xc z`eZ56dvmsQF}OxKj?@Wrwv4FG2z*(S-BgQv=+#v|GwGI;bcxp}3gR~F*OrOGW1Rp>f^klI8ugQzN|_}j;6wp*4OXl2Cr z;QokBS9@7MjxjI5FAOS*FnUnSWF%}kS}dBugI$6$1&4iEcicL9*|08;Y?SVIeEm-> z*A*V`{d?f_%g7{S$HX)^?J&i|%b%OMjcku;=iGxV-iOzH?gOa^GJt|Yi*Zbjba6um zFOxHZd|^UMlSOudp|XCucc zE}x0%6KPV4u4C<7QumKnvW!W0o!+Y2TuiY1e4L~5sxcc_m#vPEKOa5SzH%<1dtN|a zG29Rxy`t4TLFk`xr1fplhjc+|qyP?N4rus2_k(`pi9Z1CYT`&BQPk)!5u^~KQVdT<8Xc`H4) z=(2!!e;K256x|P*$a5b`H3a)=Vbdg+TLQQDZ;)!Y>B8O^Iq$1!bAE={)wn*P{Zh}P zfhLk?;=8Jq>o6lJLh^qf@5?##CQPauh-^1s@ z?MPEwrey=Yjs%juW#z|pa!dK6KR9a2kw~QC!zkhc?2Q+c+1Et zw9aikB_gS8V7ASKKaKb|paCPl=mA;Vf67W!{qQ_f9h?$onEFOd<)N)i8>kM(FpXGc zz|1QMnJk)1bO6p}Uya&Y|1(}+R9kU^$^8>g3z>cg7WTMTnS#jNzWRX}expO?9{OIn;YFYJpYJVa-~Imjsk)xXX3;p#GKA6s4+XMt zaDk_o*cg?%sa=mEYv<*4#b)XoPBbP#exxn)ShemHTI+ix(r-fK~8 z3iun6i@MeaJwIn4oEMc6SuP8D(M4dF-)#fL-Tg!Bcz;i_u<|4ak_LY;M%F&g?yV7L zYOw8|u5yHWA)meuKui4)DweE+mUQ>?;q6MA?TVc2ls8l!dsJYLrI z_?YWVMKxG3&4ZbrWDI>32!~iJ4R+4jL)=^X>%_t7C>oAy_hb{dS@Vr$6K&X*78kD) z(jIhgtE*zX8k2vdo&4zi9qcJ-&Y$;djLqUZUn6eTHm110J0+VX&q~$q7nh@^!CR|b z1bbc=TTs&C9uSltHp-R}ZLXS<4JscQ3HKSQt;Ai6Y6e5-)Px%c(wCSa_-)6#gP0Li z8=z>dSNslBrG}aNt^<&%u^v!yO_Eq8K?S(SI7o;;=|fCCRp#ZP4G^%$JS^Rr?Eeh> zH9&?L79#kXTnva0*d!w!`Ps#8r@W!W@M&8`)F-v3wqz+p(I%dpMFz`Cl}L!;KJhK%n2m2Nv#^QPJm4gyalGkNuyK`k@CFN&V-hI80SQFPi?K<=u%wn2=2o*3Q*Q{(PZK~vZHG!9qsc^Aa?Nm(BMJ(L>u;ObsL*u{= z<&PqAhCu!3(H54WJbVrHwJ20$(C7|V6EPeXz@Esm|CJ6;gTbeJ^+{JPnE$QFlc!i^ z?BpSW&p0JxdcSaR%>UPq^!6Gv)poikQGc(lFUm;W??WS{&^=z~=Y}?uk1w&fx@5T8 zphZ9!- zN_1YIi{&V=pv(7PRV}z25bm@DdmSxfacjE~up+(IxY`-=xb4EikUgnO4S)%TRm#cw z1US)?PP@+(E(8b>ki|*wMu67d(sJ63$hy|-zkY}2H(JoIO;;Q;1Ws1!{`hm%@#or= zQ^pWrdiO6J$#YUzZK=1i-0o3Hfis3SW|f!m{OUwe)mv zTvi=zzHCA$;sMu#67o|0w8QlgoeftKsFJZaxhB`_K8}II;6hFV&asO;+ZgtHzldWq z-I+PM9##x{4&#PlsmBeJHKI)U3UOmj|AJB7=04w)LuhUSPeHXHU?liX0+XO)W0GwI z2ISuZLEevgzkr3|*qqF}(U(e90zo_RHi_Yvac7iUW;~8Bp<49sUt$Y`K`4w|j|;eLGZSml zwq7SOx%}FRV6WseX&$@kBg9IB-!u2S9Ja`btEQP@lc_hoM${#d%8{;&#%yzY+-CwW zswVxOs0FXz^%LCz7W_A3+5kUHw_J{!Y{);*hF1$0(|EcR0IS^u?w+2DA;mSVd{^xJ zyzGGUR6^&!)tWiH-RsE9E1!NjGo9zv8mhR!m#k1E;QejGrUDPj*OIR5_gI0>Tk4q_ zZ~#Uw>q+$&-r5VG#7y-*FrsvO~c{)RL>0-R+ z{Vz2Pz^~ysMU}C7%)Wkc;tmVPlz#;Akmz8|=Vo;=N0D@LAeF#zs=8$|ZDGlp!#*18 zAW*1%u+8TRKlc4THn*vc=&kc9?Z|$_#c>(r>vO&1I7F7W=*xCcr+wx@3+WgXU)>** zFzh-1{mgM2{XHMf?(b!@4vTfdaNH4L(?m-05C5b2r>g`$n{sPE4jV&1Wo zpJ>|wE91_t$wYZKfCjN9h(mY01#i?vCUXLW-%+Xmewiyf+Y8O!O+&ip znqa1eMUSB_pbyvHV5Nt@G?3mmavH^^Vabp`%s?cQ24j+xV=H(4s!UE`oTSWdNjFqK zc{ZVY|HOETI`r9`E2YAb3c`J^A=P^|&E)UH8XG}uTy1XwLJ&Hi0crj*m7)tBv}qs9 zAC3RdrXLEYMWnKt$}JxhLpqY3{RiN~|8}Sd)&%TAyTXbk5bM=B@Ll-M4Ique8>8=i z6p)O~^eot-a;1xLuv|f%e|=RoWLQ%OfRKqK3o@&BoKVG}#dDhzmVaQVZn-5qDg3ij z5W(7CCFdOo*Q-#LRDNC_viacDm#=ot!)ZWC68X|t zzMTdZTN&+KS-g?#^!}*U{BxCxaTQ~UD`ls(q^F{yp)Zk^ywXN)tr`$D&gCC!Oy;mH z%xZ$em%rZPfDKTR<)odt31VI==t%W)G?SDkEb@7~@mRC{Z6Mu0ArLFtN#I|1%;eTn z$GuMo1l9VyYq?G(ZQ0NLO(^ueTdorA_BpLtiB!cL(RX=yLoQ}&z5RQa!uoUA*|)2E ztHdp*=j7^a3h(NrLHAo;A)olE+j{NCdw2Q< z*YUv2hU4EaOkF#F6D|1JU7q+kyRWOk`WyGZf%WQOy*|C$n@cuSnZ7=?$oXzJH&JhN zwnpEtGa5skVJLkne?Epj^fcc0y99Gv7#Sd6kgCcQSAZv1S#9T2FgXVH$eErSw_97- zf;Sn+c(Rg&^fNsds~&$cE%c{|dd~N^6)!S9<|V(>>c2lvTHa7xw5}25ZhDN+6rAVg zRw=FDhuz3NjLdX;&oP$vqKV{t9tXy5D%~G_whwy4@_4MnHsnz9gHYIpv(~;m*z&pS zcrKeiIGpft847Hv<~`aUvIRcEQLl-;`3OpRj^&=~zW3HNYI!VBw#@vPku~lT`xan^ z)J-4nEr1IsOew)b9r@~L-Y}V~#~ToIq7ghP>gM_8$|?(16KXfYb^TZP&W~{OuRV6K zI}(Y4`}ni~*jDq>OL>Z#o*D2v_g%ya5(!#3c0%RrUXdxYmKhrozy;?I9Kc*RylAR- zj1^%(dIYge?A+5q*e93-toMsg@Sw}*K2EGCbVFHy0caoqh+WGHq%(iN$d_>J`>q^$ z9AZ0+u4frPdhyv<_c@9L_7?+}cJ#PF3~q`7n1jl+rorVHh4HLS1~`hh$oru(XcQ;z z)v2WcCoOsEP$|GzSke4<1;%|iMXe!ff4Bi{rc7y{hX}aj;g<5u!Onk;>o@dYT4}sH z@sj}DlM9z5>u8Fw_s8fs(7mwApk(z;i$C`w+k|NJ* zR^pq9B8|bF9{tkrKDVKFy+MYgn@f4gSF}~4i|W%*Q3s-CyFs=4*vA{ z`lZhck=A$jGHfBLaSTQKJ&(5Dli$q-e4Pw(jZM6qQ+3}e-VnlSwcZwA zs>>UXFA3OfA|^+C?HKT#7owa+%d_z}fsR1E-N1N1Dbt>_Z&Eze%*!qJkaDZD@6 zfHd3VjK6!w0%AiK6HF01ve3yUORw2s2bg?=ZyZ4)~NsH5VpYKv+ z;J`_#l|#;W*=}T`!~Wb}0QH$Y+Kr7X{p}_B)SUuXmsXDRo?q7*Z6j9-1{6-0+szuf zJ7#_@JTqAX0Qk)Uuj32oGlZ%P-Wzmx>x@dX3SbN}NFlJ+<@()LZ?1`Xu2bE&kBc6@ zPZJ|kSXfMo2zVcdZ5Fp5myQ6>`I6P-eVyG1sk0W@h8tIX2LnN-9hvzq0`Hpx?=CPsOjRPF9`oGdl z3D8+OlYs@*xL5)g=)FO^0rM!01x8eA-Sdr*=5y~FU&f`q_rR>zFAzUtX_ok^Jpy=vHm6QZ- z@S4G37%hz67vSr^3Lq6(smKAi+P18WyY(0G^&k>B&c?NWDl4EyV~5$USKeU6G3}Kg zNiI~E>psXxD^9k~C@@1zq0v9?n`U*K!;P6eA7^0kff5CQwyN^<{wWzgBLOGsXf9pR z+U^U(hAu@ge;x$KDoxvyeSG_c;LsZJvQLM$@M`7J3{` zy2UCY^bIvAQ<%I{pUQHU%jt2s0X^=IfZXsn6_w$$D>tfdDCM#puck*i4tB;c-P{bF z0&W>lNB1mxFiDw6!%IIh@)3NC*O7sIMeM+_1$+Q<;JZ0YVsnZrMa-7_2c8t6iq|7rpLf2lq;NJQakw6>7w)-Pl52;PFqO=8S=1ZEtB z>!3amoG)W>NN#qB=?XwDJo-xx6=~KJ2V?;vDPS052`bh0Z<;X8xEb(P=B!yGZl`}J z3b`jjQ0E#JXY%=3k>N>CMYkbZ3$NU^;fX|iNk znBYj%h&t1CXLBBT_6`sa634?KV9Gn_ELmb9`xLC_r|9a$Fcen_H9NKzw>xFrUlKope}2cHVYkKF zor*hY{n~%?S0@rV+ILp=h}~bYq{mq>NI9%qaQ_sunO6p#Cn%N)GWy7MbT5G?pLU!m zkfN1i%USYvQN!i$7J(@$JS1pqIQ19S^+bj8is|?}%gO-Y7$r>PqG4-Qf-XyN5`ge? z^2VRWVZ&3%mykvTuT|d`1RuS+3+)`%Msx>B6dO1+`cU(9bbGIfn*f>Y%A*UQXqXcv zO>Y7Z$8dWpq6q}ULVUC8O0bV9i7BaXD@;_Q+|b$^j1L$3K(>|CYfhek>m?y>IjRt8 z?GW0$@LW-=Z6~nR-JCn=1BRb7tl$ERKzx?BTuHll3vEbT`?DbIbYL)!=-bY&)^+J2 z!^1bGIsfNy2rK0iu!aTBX*E3j5=Qd^8DX*CccyQ~)l>wrEfvj2-`AW&e)WLNofeuV z@aMN4lYU|%zH&9d*^uY#K3|2=f*Euq@2|qONFt}5gE=&^(m3Yj-;U~5o0Ke<_>(9Z zUwoc-D6cnasj|{Uls?X63$1c%6WSpV2S&9j0gY*rrO48`o$Kdf=Ehz21yp52cPkeC%^P`O{u`TSz)r|yLp4c3ShLxeW?_aFJmv7-TP^z-hhNcJi~rb~bIk!98Hr^cJby zy>f4E`ST=roFH4v{$Rd4i|fma3wE{kG{v?**D#p6bsoPHihvj0N&3`dOFLX69pd}> z*>7_)#^1k!THjx=4r$9a{@7pC$((Gi(;1mEC`?+toKCJbf83v&+rE)&+dm4z1|(RF z<+@7LE>uMB;`5nPo_3iZx6pg-ft3(=kEj2Bf}~wU?eO+{dwZvi-OAqU2yq|8Ha?s> zSZCaSR_L+`iVNE9=yp4yQ*RqCR7P|{(P@p8`%(5Q?!bXSmCQ(5;m1Xz+`vxof_U)I zvlq|ZOkyR1O4!qvo#r;i(D^;IHYxJhSd-DQzsI<<{r`@aE2F2tne1sVvv`Y~nd{a> zC-+6_I-1QgLN_<#lUX#A$mMwRVsy8YHrtQ;lw&nrqbaUlpM?oSq%dM^6f0TnN6Eyx z%`xSPCJ{`O+TROB%Sdy0vu9SGH)R7;tv9!oX zuP&wx97l27pV#ZBYW$@#>RsW2bMb0Nm&}S0*{+QzQ4u+=eD}j@nAWxho4XFJmwPd) z2L}))>>V!4jdf3}xY?PldznzG4VWY3RC=aPKo7aa_x(KG4X2HB7qwX7sn$zIxk-kj zg&+6D1oBljh7ru>L!!g;80j^-g*SUoY9>wI>*U&YI}jzDTUL|M-viz~%-QGbvsBVR z@k1H7Ps`zu)>P|%dk86&lOx`e;7YF(IRjI4i)ub^CfTceZu%j+EbOrICitKKkPflh zFDB5pSag&err0k1z?-RXHe{>(8dXmGY$z$bY-rW@^b4E){r}CPc5ihV^m_HUw+h01JCJ_ZI?b=C zWzR-)wYK>*QWW-t4mMl6aO|>px7~Z04xl8A`=cCN)6s0|wtKb zh}(S%U9i~bbCuP4SX!Go34la`ek6qTHAy%*?Hc9hdDx zlJqC>RcuF?K)`Hx2&pfg)LGcqW8mG~eEI0F`T6nS=JFTH z@ksn>*|UW!0C-og=iNU1^4`vGO~RL3A1vxBN0h2dnex1QX?fYcC z?@_<^cYgZJTWw&p^~fiqn>J43gk=F5CYY^62K0 zP3=hu|C1g>M2!2;7)`__aC?s!G5ZPVO=BrYQSH=yHk=g55#bf!LuIzMyt~B9mH@p! zb%yu4k5%>WhJCbflJ~9<4 zw$I=H(XHmQBIiDWg=05}3&*e9bbV(Gchu<`*gzO|T?|%INkcsy`tG8PEDn)SV@1v7 zW;i3ffkg3tpLz-%lbZvTW0dcegbsS?Irn~*J<(ZXi7faH&%19MECdQ2#DrPr?V*jK zTk7JIGiZSS{d#;FuB4g%ZJs8qdygyBXJ$p(2UY4qUmQLe-}xLwION3`#Duz5e>AuT z)0FZpWOeJxt@Cr+(Wd2fLP-pB-2JRr)RyP*SQo4869hjDNu~=}YtH&(s@mFd9{*yWJI@R!-`#k6cin*G$?9#CAC*)k{g&QooKriNJdz5jD{@r2ZFPbBR-99g(hoZB(LOA*{KZl6Rv!Bsjm6Iw z_|HC{&b6lTQpv3#V_f)8t*r6WVaQ3g{j{Kt|Mw4k+nMj{JD70&vNWpn8<3{3rJcY#7)k{$qU+=9)!E{X z^?oS_o)_{5ecX>9o#><k3+Z%{^)(WOexBZpnW%D}Tcx*1S3=llADHskL>7DcIgu0u;6-^NjC zfX-x?1f2y!50x2enSZ!CE~wrth&pq-KL^_8_zn=F#&Qn$UJ zU15>J*vROhK>~5sn0-TUr9+{OP$!VVP3- z!?ozP4>!aO1nwFh&*K0e;JXlfL|9XjT|Q4wpsquP-1BpI*|XMWlsXFpaD%Rf_ZV>M z7vRPGg$UV~D?dEV6{f$qAm)7njF&hP@9i<)AhAJ38G`Qel4q7PHo$m9p?@fb0nr^s zkK)^x9csgO8Q52I1wi(!(y%NKb_SpJY`t<&<>>!N0i4WJB=?XWmxEs3s7oIEafA;@^Re?ve7*!A|7Or^SQ{+sV9 z;%>F=naa_hR@Pn{i*MZY6@+*@uN!xNa%iga9goV&Kwii27#>Ec;rj@nL|CUk^?Aj3 z{^9B;QqFe0!&k%SEaVyp_}=XGvCE6pRnH7|nDajJ<|4BTlKC(}VG06J{p+p7^@&24EF2Pln_K79Y^!s53!gaC>Qazkt|a379o)$q7@wi5oSN1(~hcH7XZDrSCs zwCjtKDY}X;%m5KZX~a`W>*L8K}caZo#+x1LRuIgLCk>^SW~aFlw?K z&mQFH7A2`aXFjM4+QdF^b0Tw+wqic511mOY`Wd1YfCo2ToA!du9Ju;on2-Ii{79@_8+iMlz%~?pm*}8~TwCAqTi0j)OO0U3HqvpY5) zezP(tL50RjBCyZS`P|z*SeN`$UP$>fwR}jXh!PLSWht~+T#e1_bxNjIoooP@EUy-xZ5ktz!BbuVBKL7J_RsmyhoQw{N&NKN4YnoncNI^@wRBrNEi zOcW}HZ!d&6!-B3|y~WmU|0X2fXcFt}JU^~LHXW}{zk%(zV^~d@gc))O_7%oAG%f%! z9;bi%W>A-QN>USIF}a`^QL(%0C890+(Tq(McyP(yR2UwUZGVRl^IbLP{muHDuERcl z%=EXL1GH{8i`uo%7994ESHI^&bB1Nj?D7bcZk|rpdG6`0hv!GkbzPmz&3vb?29sR+ zhkHmdx;$rN;_gZ{x%XBfH5?z+!GO&5!vblnHXDW=^mPH#PIJP)+M0?jAQL46x(pYMQM6VWCb zqtAD?X&*h-mU3-w_P7_V+I_HVRE$CNT<=()jv6l+PamF}Z4Joh+<)@<8ka9>I2|`K zka#*b3D_RmPP)4pyboCkS(2l<)U$oI8t?kpr`ytby*DO%b2i!UieoT!+B=SlOhq>M z`8D!dE>MnAE@N`s-tx6i=eA@sZstbov$NaYvomzG(-fW7Wsfd?NGmyIr10qYtp-<@ z5qW>fH1hd7csh+XGEKcXJv=H7=wJqyo6J@9W)ib+TgLM$f6oO`+`pZ>Jn?mq7ASo` zx8A7a4mPnf9@g}L45?jdX%n2SbzY_eg3;dkh8^3D3DKfU7+=;vVM!1$u!3yEy zHd@F{ki)t=K78eVx;ONpWZQ8QRL6>jGNPWW&jt8Pnn7%n@# zhsy>kFdWvHj@cMs@6W%Ye0nE#6g7t+1lks_*cPccrjyZWQV;6kzA{zs?zSqzE^ z=P1q-k3(b#?2LAZIs|(zt-p>F=mw{Zz2s2c|51UN_YJ=f~k0? z``*L{QZ#*CKTS{I>}uA#rv4`<1@s1^Vkv;TLw@jIK_x@`0u7OpReZTt; zn%m;qNr$UIWsqxsALVk2F=DR0U0MIK7+D#tulBs24Bl+=H|fp3hy^LpW+JY?F80XL zv|^;yO(S4=>NPi2rhgYk0~oRU)SH>t2RX?I%ei{(?kw&WKd3gDuVdDWhGebOI*prn zxge`s08>~2z6e@`-o~e4N6}@;T{cOu&oTbauoHy`dZB-k*A6O{Y}sKfmd~YQY_pzH zx;_6|>EGNA^T4L8YG{qij0~G9 zX)U38dIw!8^!P(`(r!)XsGko+u~ul7$9VXRC6=q@fTb=qc#e)e&_vOU-??#Ctl(O* zMGZapY(R7RhT5J@?Uqr<;wqW@bXtjbn2Z0S+{j}15flhX(d?(Lkn)>@OVRw8O@N3R z8j{#4o;_4NfkRf#S)n-83U=EIgkvyx0yh)oPcQZnfCOMdn&ofe3)%s$3+Q^pSd8v% z5Ofmmm@A%+P{Qo-Q^U)5Z@~9U2CqFAkcB%EeHOkxT#I~#=S!C5jDi6HkB7=50te-g zD9OY9bJw1q#{ufsqZl{V^BW*=om*Pay=GOEnA zgqfJZ8$f^80WhM4TKERu8rb=!iBf|_fa0MO`tx1$LJ}|VjjhE(^yIa`lOTa!8|d_a zB1QL%5hX+3!eo|mCK>fHGg zlA5MGWQPstlh*0hMS<=)x1zRQdAZ`|&`Ip%v-L1FG+|D@G>W(j?9=g+C&ig2l1Gn+ z?!gnDJWM|VU){T-%92CXZ%UW2Xjpgo*()KCtI1WQkq8oqW}L&%KDT2Q76>cn`m{!8 zVu~i2^-Q8))IKo$b+twC0i&INp{rMR^t`IWRlYVZ226c@SYc6MKLMW$*eKaNBq1fN zR4ad)1LZjeG{D4kS5n&ivvv=R6SPz zUB;p?0Y~dP1e95AF>)oY z8&M(H_t4B{4wqVI;XHma$7%@<7S?h~?$aCJ?H+1Jdn7ZXHCV{jfV@Fb~z!XnDL20MY zHI-{|fB!gIWXIo+nVPH0W80p2zFGu_|D=_-K+Hb?4HJONHa<0gV`>emlY5TW$52~u znYtG@T*7y)&KwIu@V9V=cfK4Y43%fcouR&Tz04~N0pTz#!)F&6r**YbkK7a*^#h3Wb!tTPd5imIO(^J>zsTe_T@;)j-mkGD z7v--iTMcASUGS2+cfD$se1J#&N!ZaO>ickvb2Ygwn3a*bRV5>QBTGd>b! z72>zoLs<#|Xx+Fji*DjDtL6#mn?r6?(ClarjDuxEnyU2}0nLm5@ib%2HJgPF;KO2q zx?#h2Dv6tpjQ@}jB~H{Q zWS=jAG>~KzKqM~x-9Af7D}*kH-KURSChd5^i}nGXiCK!?21^}4nu{1q6MXtxlmI6k zQ5x*Q-*5&V5Zkd0_z`4=32+dcng4_H_Ure9`i+n7i_500tua zg}H@Gn9(4UtpIonqq(;Ebw4g%PvjK~F3Z~JX-YAwo}Vf%1DQrcRx)2UfGkg$i(2>C zJ)?fUAyBM8%C1f&(y~c)InFhy%a~VjuVDw6>Q;Zkdah6)n^cS@iiyTB5Z&e?f(yb2 z7X6K#T8Zc1{#v;0122Uq(u#_eAa5YGAIAPULOJkY(2HYPuaz!6&hYRysWnYpUU-x1KJ^icW(+dE9!WpbJ6q-Ge;?oA|04%}X+F@O~+NSg#zp*54D`FDWV1LhIxw z!njVb!vpF0-sR~izO)9sKa)3Mt@b%tT_N6kLmV$%prs%c(zj5$;JW&iwqaki~DIjRN>Ll{l41@ z+>W$*Kbud?{mx*9Tsb+cWTh=3LetsSPc5b!0Tst~I^Nt%(6S+S?WypUfwmybU^|;6 zm%a8c{iCPV7EsW>ACx}weOSwWJIbfa$^CZm&F0g5zA_T&}|f-w0S@P`Jd)4;=}M+v-n2G@f_DI>T2hBT32%lsYA#wH19 z;e$jHvLf(J^Xml=h<=ZSVOA)lGn&7~V0!bt=#Ms!>SkA5>^Q)9!Jjb~b~~?$Q{FN$ zcD?%pgYcM-GKmXHSM`UA1-A~IniH=@A~qF1I@}C08sytbCp5j<@c?#cfGZ?Ggg+c~ z+kxsN_8L4f*}r*q2{z*(>Z&tBGt_toU;sd|ed1tWxu&k}0Do;Rm3mIZ};77U5xX$L1a)yLoZp|I8E8i0WOpiU!7SrNE zq33UiUQ-;Z@nYm>XB9PM4&UCxnX*dGW@4i0J0AVY65QkhOL8<%zh4jqlnyM}imcL) zF3PRQ(MKSRQh=cw&}pZA$+08NZ5}b9ANb^s;EBx01jQB{@gY$4tcyF~)gf9r|GELN zHrZG{kYb=BbSrFN^Zum$*$9kEWItgQQ=IM=m6pu7(RNbHd{ECulSEP)z zttpO$E=2M|w}*))Ln@=g#bx!U{*k0U((2_p<>+vuR&v^65q~I2x46)n?d=<;k%duR za&Bl-*HsM8gyIh_qcrx3Xc~PYo}=UP0~iVL1!aVxJ3Doc0A8_}-}`Y#5MQ)B+Y<}@ z5*MQXtNMcC{OPN`UGJ5;y?Z@)9Xh3EjkGSK;e$2%a`rSb;hJ zC&+oS>r#G0eH=X`{(2!`U+=OtA(RvCt@D)E;lar82rd8fJa=U&J5Rn;8nLUcclC zdY<+THgAtrFFp@+T#o6gwv2B-KLnGSOI%LQK7aQcBTZMe+@5U7;%`<+2c4@wj5q7g zFbQLT0tP&`XN47-3pY2%e>9p1!n|>5e}jR?SJS8W`3T~a{_^IE-HNK4H%gL-52AP7RI&ZfpwWoh?(g`JXkj^W{T++u*Pq?$@jb$t`l2s++ zlf%8Ax`xH1M9t&{LkAs@%1@)AsGT)4=Wj+%*uX2QE7WuD2~oI}(w*_uTN#xgE9%P2 z-MkNyh@;eKUlId3dB4^+uiLThw>flFlc_ zApx=&wZe20CVA-}L@(%F5y?62c_dl6kcyAJA+hI}58m9IIdggbgbuzDJg-r?#E(#~I zy$YO{KV}?-9yv!AMvU-BuTn;`%VNa79@=v{pU0#OC%_eyAWz97(O=CImWg!(1W&u( zEkidxwnq2mY07$jKkzDQ+h`-MWcggGfWCN|rwt z`b6zHJ*kVX)dQZRiHTx5Da2zx&A$m_iVsYCj^Fvq-w^V$M;L@0X^oP0_dzbX?7DG& zGi=T(-IJCZHN47y1Tx1>MLwRKAB%nGtHUqR=}a%N*#7#xm<`4`gLq5pcfL4sCMa=I z{}R~b9){|e?nTIbcV^3r!TZ=T-g9A7cPNX03dU}{bB=E9pk}tXHzu7B={pn+Yw&*S zt{GUn2ppt$PFJ1SVBL-HDhi42^i*!oaT@=8cjz$jKFmyb@0a5;xK>C%mB9g2&>?L6J_ zvhyzHiQxL3;>!w zD%Y`gKQt)EL-@K!6VcSHU~Av{>*+?kqVkaf82ohEruxX|(Vy_cCG)N)T(!iPAL6{S z+UKe)J%{JMqP;o;cnRw;!nurpSoU&|>ArOK4XS+6+Dd_ZvgO#dP3Z0+g2ns&V{Br{ zcD)dezGIu^D5DA|&nVW1;ljkdsh(OX7wpDZT-#|!aNQ!=M$SxXaX?VV$j}^jp!)N+ z;{JiZ>np@#@LuUrL%1YKe1Rf#9%v!2cAtY#i+Wmkznyds26M+~n+Q&7x4V78%Biki zl=ghcnb6K6emgSFquL~}$He-}Rg%pFDU|#5TsJ?n?Pp;gcT-oId0q$q+WsI@vlr!7 z-8!VMn`3=(h17lCE5X&2Xwgk_5tnmI#QOXC%Er3aqoC3=y?vb4aPi>b0qko%@_znU zY8rSK*R^ps)f6Y-6*YF)7@%yslM>$(Tehqv;1%8U6b zWqa~*^<1gYwUQ|`7cKg;Uo`Dg~m_Y4P)s4G0;*05h~bPWv$?pjBtCrFsCS+xJcK&AfGLl4d;U z#Ri!mqBO{AT?%rhJ5GcEbXu5>o`)o%BIda5uY7;%t5=w<(k4rd9el8f;A+Gl8*Vm1 zB7@~B2pkv~Xf&DSJ_qCyi$nw7nr&o|1cwZpSXd%hK~e>D&Vc;ilmY58r~a6n2>?K9 zIi-vcgS=$XB)$E(Mv4}I zNX9yfxw9+G53fej>@`H`{N#3%qI*N4eB1I5c7#fON%O4h*cyK`c zWs;B2-!w<%5dE){pmsG$|9(*)jZA*Sp$U9P?g>!9PRd_8ASxigistkBYM zgW(}caRA@9-Lc!L*D0svQOQ*MZZgI&w2A&TM>h%?vA>z`E=$h)rjEh$F!RjY3~XRy z{Ilt{D}-%`S@Uk4hT*t#x7?8)IP^vN8EV|04_{(v%PUximN(uSYc8CpWwu_Xq>p?K zXC2^RD_%Hi+_bV^r;fTk9bG+&+h;~V;6_D`w$d)NpxXhB_9n`w`@90+B>6kihTSOL z9h>8f*d~e91{nK>(?avq+v!7WrN{Hz9ijVVfOSHBkyps+%eyUq7mfyisL1H6P;KLC z$mi(pDx)dRr% zQl68w*k$U&j6sTCU)kjJc6{=M3kDuJucqoQx{ZY2`1UUs*SHodQ3C+wu+_H7?idkV z`T`X=wg{m)a-%PnRcRp+l#B8P?RpV6tqD57Su$VS+T*kDFoKLtZXX z{g~?CBv?@Wg1)R&(0h;s>OnvxK+HrKvXKFhJRl&GxOXV{x6rSiq0-xmBW3IFoqbBz z((p~ zTq${zU%o;D#R}A6f?DcuXhOA8#F9!nlbVUN`o79s)Y7ClXu0Yp-&G~9{pQXTB?O>} z%W(^j+u;?oNQsckAhu*O@_WnoW@uA ztO}Ksy=vF2Y_k%@>Xh{3qw zw-Ka&GqRGxEF+W{q%W086fsLu{Pt~ch%_c3ZdtPbw)|QRT7OU(Sa$}>c8gA`AQO%! z>A@4msW^cNj!7P<2rdxz(}3ZiPP4AO2nB_t;TC3Mk4&N!Zw*_ou#qWzElmWnS9p^M zx#*;43O~x&rpi&|_wby5-B}8cGL=ut*V+h=!))ZL3wq(Wq5$UOntj9}n_%ljT$pIz z_zUFQAvX&U2EOsb@OZJj9279LO8T{!TC`MKuCoc13f;PY{hSS{vzI=QXubyyXBIvQ z5YaC(V*yACv`h^q4k+iGt4Q3u*PU%2Pdp$Kpa2`&M-l0gxde zz@!BLW*0NnAV_)b&|tY!>Zz*Po3JxQld@-0HL!uG@ z6hDj6;#WkZzO*h{jIvYi2BdPy3h|F}+6F(DFoeC#)2G21w_b@XG@5udc(U&eQBa*} z6N|XSW;p;&VU#CDs>E{hQ}i3Md(!Hapv+*w+dseHITmGvze~V^gtM(oF%&M++X6_a zAKrvm>9l*lT;v~u6ezI^=TvJ@c}O54z!*?9tM&9TUu@3hy4|) zz$ckmN#toFXRG?$kG>=VAl&E7XF2 z8Ino-AlJ6O7x7_rR?!E>2OTK(sFZA%#wNaL7h@;qp@Q=`bSh6`RZ1DQpQa{tc`kez zbj@kHDqH8Q{OmJPwkk*haaE>%{l!G9Eyx`8&iLJg*fthYE3(*#05bwae35nO+Apph znOq>!g328Q<1HZEh=&@}@)KUV2ste%Gul}3(y{2vFHzGB>5k*NL;bXI$rIshiXj{6&mF^H36${{7-BGf5q0vIK$$#Z^<}>LFl%P z(H7+*SkSpdQjq(B029lLV>B`o4j1d-+yAX=6}>-E0X@VITm*fi64NLp69#|+QF*C2 z&vyKX{__toszq@1qFFV|HK`vXv2t_6tZ*CI!g8rNY=aa0L35Fr!_+>PZ_9Rw zyg8cWjYRhjDaM+k{4KF@EC2v1R3QS-q=)BU2W1bNr5^z{XOpgpU7y!=ce zrg-kRD1P%%SF0zw)bi3E13mMkM1_Uq!R!W}1|>T%3C{jSYykunv(D3jG#68J>MK7?f$k9gHQi7|0a}J!mHJB%RNV z$dK&CpnMByPXE4ra_#(`%$**oi_qN$x(c3|?Yq+a+93yFrN$(6BwXo(-*>UD4Qvi6 z6lf}t&@~Z{9>eJf!Nzn&R%jF{q8q83p1MY{uymnR#YESl-EE5BpgqCa7sf-FiG3iAZ_4rQdpR$++|2h-87`v zi_vn)s`GPq6s#ODhLQs=yhwyb`HXl`2cIdLO1KI9Ke0MIPVhEwXivFexqSb0W75zC zz+vIb-!{Ldj-nJE=k!rH;hKgjC=vRj_Adg}cM0OpIBP$zl8zZSBo(o_p!s<#q<2TF zyPq&Pb>CC}v%QV{u|`~5capLEECp&Ib}*&)Qwy57+X8T0dWLI0mPz5RSdRT=vm7_% zY`Cg~N0rxpO=rDnU%xQmW&7knHM6{E|N1gdZu2JDgrW#;JaSw9<#zv@>y+=P_NYzg zk9Htta>lyLoyYPP-VfvMX1oOB407RMF{1n<*r}ONsX~q*|0<(MiGOz5f2O?4q5|%L zh6BW*pob6Mg3it8m_?FBhC>oq3+xbl-K?}n)A};&P@Ei z3#VPp2KR@{GtOM=uztwJn&c+K9?Se)pfKNST!P8zdcLXC>9Eh+c>(`t-_Q5#QBETd zBuGS=mO#r@cX%G3{rzoH=e3EexXGl=7p^xtT zy%l1!sf4u=&nE-u<1t-d^O{mGyICL{(WW-_b~ninobTBF>=7b)Dd=*z`+mp&P;1PK z*NHT=YJ*GGy{9ZJXWGR2Naw?TV5Qv)^fIe)@$sA((We9Zr~Ee!Ukgd!Uq#McGO?GZzTMMRMb|HstJ`{f=LASR-7?$m6{80vNZ zeQiBSI%qq|h%%B1l%?Z6DbaU^65|htW03^aB8rfrKQfPuyJa18q{>hDKov6`N$F7; z{<|^lHA-IzDX%#ThKW?!BVPV}>a<`TG6awPrqT8Oaq-veoNnOK{5sa(oBkTw)pEJ5 zBVWXz@A}9e!W<(cQTgcR#bO^}Y!ZK-hawoB1Js*uJ86Eh7-04JaQz9(D3L+k0pord z6_^Q$_2}euOCfUiUQ&h53fN5VYp71))*6zMBnuN6FL}abot;hDI;tAY-gpqx-(R6d z=eYcfe~#8RB$N3^KOq~3B{~Q23r4fltTwgQBFbZR3H< zD@P8`WdeTT^A^qp=p;P=qQF}-D5?v(pV*@g2DEcsLo9V}LaT zkl9x|-tG*aU;Cvc3kno(hPN_&I_*5md7C#k?d<)X>m23`!RG;c=&n89gmPCz3^n8A zrFuan%j$Tl?2k@ei4&)#Wbm@;?Y~PqD22Y)M%;Sv1>i;_&fAOm>JLklowS^;3vt4Ynk-Q844san;pMFl*BC1*{sz2~qUXJsuHA99OvfH@ zT;CU5otJ~foHuEg{Hv!V4{z6PpUj)tHz~YC$&|kjJt2f`_kTat!Rz^5p6IYjESnmx zSR~=td7s{JyM2!S>Xe<|1nGKSHF$C5Hr$uB_HH^p*1Hn|cT8`C z|7qKfREu4**}p|Dc)zpNqqY~HJcBXxKGVqMaSr_PO=peY*kbP?E$4-}X6Vn^i|f4j z_)WyXRg^3G&b+V?BT;EbN$|Z+O{~`rgnidEl}P>4xLZax=Ec*`%-8_4VZ!Xj?fnhaEKp{W4&M7sf+8PKmY#!qQ_aV+iJ*^$PSf! zH(rF#RG84dF;K5A;2nl>nI}}lYBz}oYc#$S_bq}4@HbOQ0Fz<6x(u4kNJ@%NeKz-< znKgYc`nh(yX=>BAWVQXsMIl&|_9HuFB4}d8<_5(;J1N+n@#4txBApF+bXLzYM8WC5 zSb!c<5WfI17&4(4HgP?sTRHk_XBp-7m%$qWcIOm%$^_nlVVxQb5MJ05hatb97U5BA zEqO86d~X%ABU9uPhX*S&sTTK8h{fwM+fdX)m^3QwbNE~BMj=>_d#rzV6-L+_lTL`; zjmUb#^ggTL8gcs^35~V#{UQ0ZTL><^sjXS}95|nRf8}psgmrzK zDye>&k9o5z%@;3Id&z+%$94w1BTNTyX@cavg zVAr}$O!MvC8#tq>JB>!%%P8-DhCSc(Ez3gB2RGUwZaywo}79Mi%e)QPmb9*VBm7NH`Xm81LzeaW5IT?=mY(H1@ zJYKTret8_JVD?bpeCRo!A3s^b#r#%~WjcRz(X-(_ay zvCGJ{Mh+EFH^}uniQ%p}CGhr9IN2pS{P9`%?3qA_|7vul`>KG_dBIfJcWI)@dwc(W zZU1g6<3?j!--2wvrNpH|dod?(+dT?;glRbebG|E4>Hdqw^6xX^Dlaf>mb#8Al0-^g zFd)1@Tr;-e_xi|JX;!h%g=u%8Yh*I*^^Ah88$Z=X24nwIDS$impDBFmS&jsN!7*Wh>k^HLgk0YD@UrXlJIQ!=~mtO+-o!iapFAY63&*+hs3vPy|aTqL>KX}I#= zMjh;~xr`H+&XuadHz)v?V|!q{l7xfkWg!r8UKp$<`J_i# ztYBP1T|#!xb{6 z1?|kHZHe*c+#dyXT68~ltzZwLV|O1L1)AGOn-94O-y441{Yu5eW?-1$*(^E8Y8w!50T*fX*sIq{8oDZ3 zN$q-1{8$`Dn8-9qgnB#Cyp#7Tr~f(CYx6BLYbF0+d@_sgBb6xv6})Y$?1k7P6sh8o ziu<;uLck_}iP zS~;#XWl_SM98Ek0nAwnsX(AtDVfAxUq|T3pv%rdoPFZibOnB&;ny zabc4Z|9e4)0zsIWBA>R$QDwI^XECpaM8y4cnV66_bp_qX&bxpd7vBzRabf5=g?4HQ!S1yV3hyv_?c%2AF`998ho%5fRy?ops^a$L)?mM6UFqqDOs@S~jqDHbd zlmV?MRQ-AEmwSLWa`U*Cs1Q@+o=tI;|at*8U?KiW4gUF!2hVAq8_i<7=8 z1vR-W z0mI$Cx#^7q6!P_~#R}J-W&7vz z7w2=%5~rF1?)8_88_m$CPSHELsLOQuQPatT*|C#CxzBjbv8*!KFWm>|x-76V3B`m* z%>^c?49MU$(aGISYqcAvaP_YllVx_ibYM9WeIoOj3a|C!ipr=eghV$K61Ar|xm{aV zIkmg&LoA&A;{>cfA^_`{PjFyH4!>vdu{N39EuRdieV^OoCSGQlbB!a9(lM_VAG+A$ z10@qM8DybYiS!z50XPyJWu~y7da;uJlD_Dn03<1Dgw{2B7CX>8g)g^CUWr;xs^HWt z>M6D`N2QKC=E-l}@#VdM*{{?20m;zgIVO?qXxIMj(7p5vC!2WCu+*oB%{e_GkKrJg z?C&#SNrfUXhBP9#CAH9dS9gjL(yv9LI^hhO>dy!%LZh+ z3UVOV%qoor-uL)`1(+;^bV3DSaAsN;fn}_n=+L!Y?JHsZk^xU1u5rD&*hlViXLhr8 zLv!Pw_4wSDmwk=Tf;yBmBmR;QK~x_2BXFkC2ocfxp9hv6ez^wi$`Vr3?uf~l?Abz@ zZ~xz;I`5cN(?^VH!?O^dI>f-=H5Z~S< z2#3UHk&r`ESrhZ9ypZTGs335+tII6q0m+$oNqqS1jy{mMzpKku;$O39bYo)!-=& z>L>R-TwsN$y~Wl1Ap>izLhGUW1U^{8vu~3?Q}C(;%59y;@0~56aTMnFyiV5lcrr;y z5%vJ6>d86p5*;kCrI#F!*%U*;?bZSKV%Y%dpuL=g{PM_r>rh)-k{QdtH*xm$D1sN4 zaO!nL@>*DubBd3KQ|d5LX6)KI}(t9M~YOka=? zS69KDZ7}m-yE-f=5&2b?QUPnWi0yas#L2RAsAG*!k+_U;FYJr$+*KcfYwaWPsVEun z&&N*{^&fGF4>YJfwuIdMz3iu2f63j`bueT;uEpT%QKV;XcDze`PFlP*6bYdPy&==Gi`wK^FuDXLb^xa#?U84Af zvyHUA9gfWz_U*n~_~{O}3`82cOK0IaQ+L~*R22b6O+M6=Mt>S@SJX3ADUY5*Y>Y-A z_&hu2tG|4CvwxeHv11l2Il-w8_!66Gi`3>t|1v*(VAQDii@-WYis0%QTPiYI0+w+@ z#_2&6)k&ZardM5~iD*o>90sCKEqq6ZVA<`gpcRV<#{U?%PC_wFiC(Dop?!~P%_5tX zf{Nq9Mj@tPc@s2gcsJn<|1qdO?VN3fIP4lE^QLMzjf4)CPM1-=tl%|z)BlN)~TQtZIyPWrSX8ORCt>y!aQ6uw5rDe#+!-v zb+?PRrQaXkj!Vylwg+9scdJiH{0kbZhzXAIGf3Ws@Y4%g4EFEiigAYbH}jgTazA}^+N>{sGIovDTJQX*K@c#6564sDUj4XJ zq8cVLeBV2m&w9PHXt$Z)jj5z4kG&cHn78lPDN9*f#T8!Cclg-AuIjq5nDl-wF?_i{ zNai=3M{e8AfQWheaGiV(MUnqBq5`Pi-rc2;0TDsfSbBHl!Y3tJmw&_)kBGX{G5Lxw{prtQBoxNdk%2IYQ+S8(oLQX3@w`%9I%G70@ zmhx+?A7PbjP(C|Woa-z&89jKySF+x@SXjhqWhgeN15x?c*OHDxz<)48s6&tOheP!D zKF<54eA}E=BGcZiQ&3~ec{_1JMqvd#Yajm}cH8-@%F#Ju1)4V5)fkx8nHZ%K&w%S* z7zh<5yJpp}p7wj{MZXix4UH^WH4;oVUpcyEU`8?>mF#;n+<&Ude})?^BuT{=+6CM{ z4`Nyu%|i#CZ8cV{a*F3hjAcL;eR}j+4sFe@1C8nir(d3yi#ap%ub=)Q`L<8mn&F{u1crVN`qPHZJj$+(z?%@8MnCzpYCL%@h)Z$ED82y zD5lR6=C+DDuA`j(6niqEZ$TypJurPGrA1(2={J`_R%eTn& zD(ZPFjha|>S;~FCc`_*88$R6zpA z7;=uQ?J&LL^fGehw2F6->o7AqLR5F*?l~c6ilC$d1@nyl~O93t^suiYF`3byKW$WQpTi27%f%hrKLC#fzS}eb%<80IBUK6dC zP2afS-?)z3B%Cat+1bZ3z3Qj;qzY47v-3@-$*iXBNw*$VNBJDSm(_8Ub6?N}H`j9* zYr|>Pu-)@roi+%0ZigXf>U-`)JkiUo)iA>Iq43{qBM5umTTv4UldoPb|9uc{uGG3T zzV@O&5Ni1i0igQGYaJu)Fg)lnuD?c$3wv)#9%TCsml5+``4f44dVjj>$y^}^v_A-H z?iGagPeCTqCxfPO>B{jJW zUsrb5p5teA(ul#-{#ZcF>n-;>%c$l37I3F33A;5)t@xCZ6HKR*C|6z%2^LQ~ zVhDQfeg#I8T)ZHh+JP)WuD@kpxGU?_VS9wB^^%-A*L4>LUhiP-;WkuVa&O-g+iLSg zFRjz+)als6LTlIW=t8MVfkRP^2Hh%=rLYu&w_wJQ->+{tc3`soa`i?@c0{IM@xa&^%rsjhAS zfyUn~04KoQV~1>@>3%srb3cK*#QqCUz$lniLe~1p;AfAc$3ko6;@``=zt`heidHgE z6RStpCY56Fz$q?g?GAznvc9w|vOoV}xtLh#LxAD+S)XP%?)l_yCsl^NK4dznRF=)& zFj#knJSxVFsXM{Co;JG)iY6-lW#v|wOssl?Jd?|nek4x|*o za5{P*+O}9R1C}Z{cp#RfMgfo9Uu}3W5;#&=(h&z(QWsLH7!3JmG%-kW+8y|8s^CG6 zxNy>Rn0|3w@j>}GT;Am+tg4GA` z^DNXFgLcz9QtQw?m@?$K+_Z_ZZIf7 zWZN95J!J@AH6#VIacRqb=9y-B;O8%vi#Z4^oVP*-c=eNhPD)_{wdGC^A^&i?X-u^uzE2d8@tJ zb|oc-uIN@^(&5`DPoafxdPAVne=;gzOZ^)q`bLyUOBi&B40bD+7Q+Y$iO22>?M&6O zWa3CbuBsZ2F$ss4yNK+YpalA3g0h0Vy|X4ILZ?4{sv0dMbz*N^f-%9s7hNd6HI*W!&16h=rXc;D1Lp-<4T}}8Rl=J|o zvk^oR`2&!^{8Rf|1$-3WlmBqv2)Sa{;V?{Pj1njgO=73DrY%=k>#na|xlZ|;CcT$9 zISZDgeujw^B~(ghLW@x^Drnm9?TkSY-xQ|~+Yr8h*A$GY)%4;x2g+jD9 z5y2ebbX4a?FGfP5NwO<6^y_lwHigT-eIls#i=;piWR}x0r%;#!JCWPRkuNjQJ14u6 zvr~YUAbtsL`h5&{ge_RS2cH^fc6^@}0$NM8X2xxpfj=hkAY)oF#8p>}dV@?@%U@}? zReQpm&gQB{`WLmdy@avLi^Xmgq#EsLh-M3H?*n1Cb^ZjCq;w}P9`xQ!yQUTP@(KX1*b@&z|JBMHY?h1PezxrYLzM- zO=Oe82d4`F6T=NMqNFg9Q0U9MhK#7||65BNK>3#@VQ@-A_do*Ui|8JYNwFepIi^?% z-%xqpj^l2-(J`H<>h}QkFGHXXl~S$F6s>4;3Z@V9%r$f$rZ_GX+B_}v=*Sd*>~S%^ zhwoBKs1z&uk;u~b{0!?&XmhQMjKBm;eIpGmDT*rhU8pRYWYp+FnH>_S!g5GbGh7a2 z{RMWH6cf~}pnPthN;_Wj${)Jg$YbVK$M8~#Na_z_!6e}WBvSaIO~pQV&BVGcq{&%u zBoHBKEJe5`!$r&KzsW;_znU+AiPZDR#M@a(1T$VRf+e7(W@8E{whqeK+Fo;fMgP8= z5(24!sj)D3w%;c^ma|rLkUW$oC5>}lSsc(^}50A}>Z0Z~;J zmXL?+HIX2|dYK9=2eML{|LXt<@$)B_uQyzV34p}NFeZR>Cwvsu`N?;0iW$Dh=%LSg zmK6vxru4=81-u1f(pzX`oA#VWNJT^>G;kscIIg+J<1%=_%`=Sjv&97d)K7itlttqt zWT%BTDBX9)^UPDu&I+~Z!Y?#gj181Pe>RX6>9f)a^tH4P>vd5H!K&bLn^IUQgbkJm zS}InQBoeE7E+cf+m+1rfN*bj%M^Huu_A<*0Wcd*%92aVK8wFz4X(1>4XwcBNn)9!< z)~4$R1dv{*?yNEk$bdd5f7l@Pii`khQHF||q%*plWI(3Q30sowPOiIB>zYO?A;QoV z9E!T)6Io0U{~$)pm!#4--yz2+pDb9EO#~c+LXu$y zHV;0D3e|cvm{Nr-qAZbgJ+}HMMTF`RO>tRkz(s|%!9Zlnq_J?gH#ayCjFoLoXCfL; zB50V09R3wgh4vDIu>>!c@^z|)&jwb_rLmtxyWxfgF>uPsJOn9U!vwCvbsZF1u2)e3 zR24-@Eh#R9{@#2N^tn9DH7@!d2@LWy>2Bgs0|t;QDE@R)aSn_%pLsMu>nbD-y$cpx zCWi(N3^^(sg&FYTr@P*_c6TYm^;nA%$@;gGalw)Uqy%sh2~w;hHdiNKT0%&q_9rDt`WQhD{|K~?%6F^G9QbIy|;GjC7!kJ)aMH<%3(8R9Oebenw zL*JG%QEJGRgU-uW-hA`LbXvnz`;HeCh}o!5=?-1Wm}r8_S~iQzAO;I+YC}Pz#+Xr& z1*0Rf(6Gk!OVDvD(!d9p&?2e|mY9HWy9$v3C+v6#bE9Rg+b+_CCmtnY_%xVTzRcn2 zU%5VzQLRuNt($cCpn(wZ6StjU0_ZIjWw(>O&Xeyd1Ok4{;ELo9GrySzzh}wWBTDAg zYaKdXzWI3via}dkiDViHWUSoay-c&V;x&{{F&r-So6JA7B@{;+6n>-v?MQVq} zGXiXF*3t|#6?Ti8{DbGk%GeW6xVq~mqrWPy+m`T(-ps=p@D5EDPWYkGxKJx3z)$7O zk|K(Isz10OG}?bEx(`Kgc{wHtqNU)U!#JeDt*H9&kl}J9>9b>v2&jQ13}CQQV&GD+ zED5TP6T!)<-+^A(82lEAWJ0C!tf6!o*s{4TI1*G6Jb#Js$oT@xHsmTi`<+HN^(Ld; z6fK>8E` zvF>~yJ~SK-PTYQAwR=5pZMFOKzgU2<%FQwWFYV>H#DB1~FG`imF?G(WHW>mh85d1b z)Hnma%mgwVw;2y72r^kWvUHa=Exi0L3mHmy4?LsUCYfvx=)btAsyGd8O&$Od`%95- zHKL42Ki43gL5)yqFvQy0tUnM0!yhtDUwUWYPH$-*v$E-a`?Qp9x7M6Ij zW0@&r%6@01wyPi{Ne~;v94#VYc)_W}kK_|KW-{?3dSOycgM&S~07~4X-T@PP9|?M# zr3dZ*g8K$O=mIo+yrqLCuh0Q7a9S`@#f1VI^gwx95i*fEYkpW`5l{{f;F3?MDU=qM zJ7mbvQuN}2*Fy6$D40xu_x1N()dki?0>O|I7-Dx1>K>3^(Mz+@5%!Ohg8G9f^oiD?>aeIoT!D5{k@!!oBpe>y-FjC%AW+dq3; zbqpni>mTK23Szc9Thg8=p_=eC2NoJRC@b#b$-RCD3-7MFl?rA7Ck>@|;M|yk&`~G5 zA9IOioOg;fIEWz^u-4%3gG6=Fd+EC3zybh<&mmm6gN;=;nw8$-u2lV1JNnXS8uh(# zbqU0f9$8Kfy?u76eRH_3wL8VVfZNL?&>JiD{bn1ggH z)_Q{j?Pr#_6j2buH1f;)h>WJc+8|d2nB5pKL^HB&7H89eUv6e2&vWQ0Ys%KCwkqIk zS1{;z8KckDgpZuhV?SxukO?&FX~H2jIkJYuR8$fljm1vJ-fQxVkzD=ZDI zikZb|NrPuC>PYjAP@_#%!&KJvM|UI;u?Z@YB>RveH?8PkDE1Q$*sZY~p+5^UZ#U77 zap2MXrJe}})6~@=FqQ*&(gt=V3$Nx2B6J&Sae}7nlZE@?!4jw-Y{E+vkQvTcwOuK& z*r*b$aWlkdHI9G9AKTMtvpOfc+d-D+nTWt5nbt~S)Q}NrIR8~o*!@NWMm3WTMl|1K zuOKC=-AD36cTB>hGPvYoG<~wu&JiGY)}8^97425 zsglKr&f+}{kLoA<6~j%Z)GY&>hqWx1{r$crE~D&W^=6Jb^~K2hGTpDsS^xT3jr+}2 zp02P`pnbGYRVYyv${2K5<)ws%W;x;JeZ>O&6AAn_>-hgH&&|_N>}_A;qzSk55**`z zR#8?XzBg`@#i`p-+tc-N+C^){<7Z6CQ^CpZW5WqPk2qw;V*}ocN$!tZrJF#%G0Gr3 z-fu\+s6JQlX@A1j!J>^cCx!@Aj>C103yTJu$yd5A{DC)0|hjxM`OrQJ?+Ycj% z(4YKt`pAn=O*9H*aYI>4A+-q|Bz3PoU1hg((c zc_VpMk>DY6rP4P;nSy(hf+2=+1Cj+|&~<@-kz$bxa{e3Aml-k}^8m7E!zAX|p1!!hb=@1brUd8z!x5)06I$A)>75NmptY5$c>G<#lI0H6o~F6I0bdtCFlz z#a{e%QsseDiHpw^Rvo7p14O+l8?BW!%)+J;L4<&`jdDbLVfbxjNa?#IOYP_qm^s8n zm1$XoZ!?RV+*1&sEc647WaH%uIWBP$sq+qsWNcNhh+>SAMb+X~SH-_im{ZQ#EfR}0 z+sV)T%tO;nxMYDX5=&4Z7fu~4y*2RWhardyL@mRV#fHi2ZLiusmQj^qv_L)!d}-$T zRK4^YR{Gu7b6XY- zaCb|vFjRrMl+zXvgI&l!V+4xd&U*J|EJ&43){?5_jM7zwk>k|M# z#qztsyaZP}U{HTsEd1EebUXpqmSI)ElXSq95s{d-i4NFR0K#dE?$+yUqZuoeSddAQ zrj(9x(O0Z*TZ=ZW@U>R;6iUAyHpQb$xQvS!6GFiORFTFpr^qHO95SX;F~>`JN2re? zx7M7rk}&8&vqr7saT@#x7vKOZFVDZL8xk_Kn z8j03*z0Ux(y$(d_8K{df_JKp?bV7C){Wn#m+0;(_2E3Br19Ntn4xq{?>x1>&&O0d4 zZaFKK+^+k2KzbPjqOd5UVQPpS;j$v|Rr4&QVy8g}PZOqOv=Lsvi5}g24e?1z*;W-V z(AT|l1uA(xaMNMQGD2pIAXVtMo1+m4Tfa<58Ekg2sxvA#&03}sXpw=8G}Jv_)#uhWmR}Oj zCvrs4NydXw>qTMVqCicRpCs`43=ndtghPk^2oj(+tL1|BvGfq@$pn}@iC{Q z^3+{5_H7T{9U615SDs2e=RdmDYdfsT>3hVC5?AE7Ha&A zcb-weDOIn2M8y%SRHN^5cyI2-gj*YU-3?T1y!J|xq)p~H?gyd`n9$U!bu65f8>AI0 zWV=tK3&8O;+j<;7fnqS3wfYSJw5khvtXA?CL3OP-0aL>hpM-rpMQ23-(fqvop^Xdq zf=K3do^{|7>{jJ(wE;8$l&zsumEPe2hecD50k5Tj4|bQmKU%NbDb1_+I_}$0 z+^goaLG2f0N8Z?HKd1#wknI7u=}7Ye#^finJ? zc|F*W)I=tX5Es~Jp0F_leY~S=!>W%;GhMdfrraaVf zW$`G(?Guyn;ElKs!?_>!ph%Z7XJXC0!>w0rZZ8CJS1+D939a;S^sd0lR=BhirEu2x z?7M}s5u?G+y+aPy-BZM_dhtrpY7PE;or8P)&G;zM-{OgAF$6)2KP7H%Ud*5#GEuxS z4~)GR2LwUo(a}97feBHVdkNnGFFwEOIMLCULbN42Doxgd;iAQI}TPA0|ls%lWEQo`Nt*$eWiIWc6 zcDIh+0hmbqp@1>`s0Ve{Pe)|aVw}#l?s;O0R~Vd01A%3OhbnFxXu7#`yQdA}cPqnk zqluIaT~8&G6P+HOc+!xD)GBSEt*RH_+g?wvM?9_d#~^+_q1My7FWm+nM_q9~O-2{& zC~NK8Moy?qv@#dtx4Mw396O;{Zi zLLVy?CoziU&Y6bZnzO9aqVA*w_4EM}FQ94z( zIvfe^-#1*m_To#7C#_lLjg*6kW_A|FYFf1`h5fIL zwT~~)4_@Ybw|!rV74Lt`T3)ns#UW)_%D_vfiM(Yto%`n&H`f@nb&rM-F=Al984pKq zUB9oHN7ZEheGaQ(^s{7!T5K+;vOXub$W^-=oJhr6@U3IJS~NH8=ouC=L2K1#{pi?u zxoW%{uj#%iYww#mQr`2>`oprY>bwGR@&%cIyF|Lj{lFYYz4FPN9Psb*+j;(@_`c7W ziGjtu{+@zBSAKE8ds+qs)Cw)u-mg&+yK=!gTmGB9b5WjT&QYxVy8A(0=rDMp1@5l#$>g?k#R5lX9Vp&uGgg6 zyxo89yY|q?Z`@KF-6d;tZSQH{#1L@atTgK4t-sCXsx+TqR21|{{(Yw}%kt%W!Id?T z{o@S3LIBF`Z=ZLR@gMF>d0~RlNM=2f1#H(htX1O4LQ;w#fkJKLI`H`Fm8D+)n^aq* zqXx3PZ2<@eXaK#KOOkM$f`!OmKqmq#ISg=Le;q$?(G%^@U_g1z)T$hb6az$W8|5wT zteCI%AN1ai%steK{an78ETk?o5@aN;$BVl)cU|5$;{dVw3fN*SW^1}VZz3>RnuMez zS_%Y`p)p>MO;MggO~>28o3t2>#hmuD$l9-6kBPZ!u`R;ikBEXQv;Y#6Oaa3C58t?? znDFsaoerGTcfAnE7#|K4o0sFY?{A|6g&V!S_ae5$FZ|YtwLeJ|fY+?JuM{NyRxHXY z=*3fM#q(sl6=lDsd9nl)Y>yFYsW;M1aJ+G}`Xn&n6zb~;y?LMWeK{MTqlktMYy)W9zfhArOa^?G24 zzopVeA2Gbv1bY*uQ_^Q0u(Jo8g8pmm%W-{UPlh-|fc(s_&!88SQ>b z{9W<$x%fCQtzI9BR~PW8obeE9nMCu)|C6&ByPJc_;4{<4-t%n8exSGzstm9Fw|#-2 zzkw--^YqZS;B3K803a{MX`CYzXzjVlUH%&OcetvfYsRBQ3t1a-dFknJhW^~M?)2F3 z&Fsn{C}a1ZHxwull$b+_?L6}C{M^r8_JwMX=Xy?NRc>h`{bfG6QTrvnz$?0}PDtz% zmpEQrnYrdc!dG*+xrNj7O1st`ji zg-Q=Lw6pa8obvxU>|s6sl0!mPT*`kchnID+r_tOvB#dS)N@kxwGjMw!)mD;q+w^@| zp4*p1=y$5-vvuT`*g>bf@2F{duJnfx5eXuxsB@M@7k$yQFJu;?cU*0A8p%qnD?=Z@ zSrB}^AJ+By8+C`#t#82Lvb;dWJIb-J%~!GX*fGLauJr?l37)v+aF(^ft4TPR{$Ns@ zB_NZi`7FLu^>^LI`gGZWJCQ8Hw&T{|csDDZxOvdI$8G@h7}%(X8WjP0?-e^j#RfrR zIREwi`_}p~f_=wcOG}LR;T%y|XQv9aMzi44Cc-G;vG`fTLv{D%xt{M+QaQE3V#=ks zc|i(@omIE42*LwK3=8`lb%&Ys_;{c7X@12_F6FH0>?~44-WFYRYB4CmM`7yv2o=X! zuPY1LKmKTgDHr}|xY&5U^U7Td{@i|fLVYr~@#4fd$@F!)f1JtQpd%_)_+okK%2wFt z8Fk0o$SVt_=SzG|v0ie1ovobWuM?*I3!5^*>DN&hc*2Zeg}zIgTjV}MBZHLk| zGT3RvzOj^K5DT60dpXf!6tX(pdMcR2$=^bMQpm#Ft<^q3aro|+Nlx?dM5HR#Tr8`{ zr3gef2+|OO0cqwyFD`xI&RUGpi|N-aT~*zm(g7CBig92-3(AG(w%ZS#8~QLU%R2Dy zY7r2en5Ofu6JAOl(v2fVM3$CxOiZ+}VSoU8o6o>H(uZb2V^V#}u+1i7(d(y~Oh^gCSVtvOOt!|$^3;WJHdEBghM!&Z^k}%ileNN%$ zWkoH0zcWeh4+g}|=2KtS3qyl)w>GEEEgL4Q4$mXWv<=57Vwxb?2bWi2%bdF@84xw!7D9Rj=d`~8(3L?Yr&#{;aMQoF+JsL{f!gAHfR zh*OTvx6M0Yk0&DlfLOWVhSlzst?gPgP|h{fUR|8|vI)DxXiAXm1I7M;3Gvmd0-p=V z_2ly}*2+S{P#G$6q`4djhm<6O0d$z&sf;xJFMG8)MR`xQMSIl`aw?Z)scsVRdH-k2 zLB5Hoef@Lt-pBDrhJuW04>zO&qvw6FE7xQH=HRV)^aIB3hd+aR4_URVfSdl<)8j_$H}JAUu4^_4zeMOGzRP=Hf!x$!UDDOO55)HzuC zUV(9BA&rz?A5UKHJOU{`_V9e1-dlVZ~g6T`VtteTDA-#(g1t$0%}KNo*)5rauw^3mc?0 zzDirLsAB&91@(Ww`nkr=sDF9eCBPfx1;Bs3^Pl*+4cU_f|6IW${zZMz`u$s8Y&;*A z68YJ@3gqu!)7wc0afIALm2#U!=p7qNZ}*-_K9=@)A<`g!mz%oT_lHkD0#^?TByhRz zTQeW8r@R;l>LunE%ff3n!hZTTe(+q-5r1CJ1=BPP+sw4+-(G@w2;+6UB44$~PYO<} zGjy^ZXL`=)2^W|kw!G+c*BKuig+u5yPx~2FR^8mXU1zpD1rOK-$#0IYs&bbMypKTy z?n~3^bN_t0GTcYcA^TG*@Ub27#Nx)O32-W%wWLjf6I5!UheDNMXiO6G(639X@&sy zcXq23;YUy(g?1245eFyv7DYE`xAB22z@069QgdNvcpy-kB&VxB zBZd|N+!6Bs@)aH}hfFfW7AizRLb2)XJ6b=lf6PQ(&pzJNP z&~qJ2yzXZM-|S9N;Qx7OEH2f{Lk8>brAc>YEQqPW^1xo4{dvb-eTet}zhj6LMx-p* ze?u(z0THeI6lPp73n0s3jK?Aw?4iRM_A~7eE_p1j1+4#;amnXQ?v_rP=&aOGkQnO6 z#3vkwv05&Z;lVccD1?G^rwlurjr;!Qsy};a>m1z;mRF;?Z$x@4*_BC=@?RA)xCNP+ znMi?+)5YuKdpFnC@CuAcyd-MTk!D6E!Hr`z&UF=m|6&0|Bx0;VJ@vFP>bOkKl17qH zaQ-H*wd!LRt1&PU0)DU8+ao9y2r$Tq&}AII9_ARjZucE`h+dc}X~hmtJOC(k6>iL* zw*Y=B83@?!N7O#tJs9}#vx6vqMO#rlZSJ$FdpO<)DH#C3)p-ZfBrF90NgUzU~;JDwNHxU%jJI#7v;4y&nS-5ScceCVP zpzHMcW#OJl_j9BLv)7|vadqcYq+#bwsvbE(sh`L8-NXOm>@B0>YQn71)6j&*8wnC5 zxCeI$?oP1aPH>0d5<-CB!Gc3@cXxtYaCe8`?zi8WJ2UV1ty%ZSt>5Q#uR7i5sj9vA zv-hgoN*tW@v2N``ddny6f}`mSz52)6FD*{vBSN?Le`CyE!Ie8c$hGUWZEUA;ou0Nd zXSBOAf&9mw?x)8=AbC^oT7FC1;XF7QvOr`f2dzt!R9JP}oou-HbJvafumj1i*$GNT}$ zgaw=`^9fuC*DO&2ONmCC4fo5H$Mc;dJtGlU6x21+5%GP>vO4V_AW>?0o>TNem@utZ z6v>cxU#=FC8GICUyi282r_G7&{kSOdtM?W9{qWqI0XfAV?@$;d#rNMCIP&JmLhhHs zDHSwr_)Sy|$OTSgto9~^l*2`Wq_N;S!by3Y5-Lhe6%ulk*Qf{^V3F<=E}x6Uc+PPW?<`)&36_r6W`elo`lki#b)>83n!?o<-$sBRd|v$e>nbG z$cmhjiCyou6J@NRo-#REdAEyq9zA2?zxD~F_@W&XDk{AB5g`g97L2T{!2E!|FNg65 zf17?auI*sw-T?S9&xLTuQGzaf_-tj4-6<42N&MRZ@bB+~JHEX1FXpaSp!YVT;bZBT z=4(?Y^;cn!pN&*JNamOJh*lO!VyBEK#C%%yh)NlUqbTeaiPIC_jy=?mDSUd&7;$xb z{yh$nJ}jEmsV*bQx0`@lqkZ{3fagt(TOsc(7?mhR!;};jJ8gdqIj2$7=3vJ4UsT)6krQm!@VJl}ltTS%l&a^9{_SotyMIm3)@D!pD}#*m=&`LOM+V8sfFZ*M&J^IBvi z29uXfV!5Wi=ZT5IySay9vHCKeIiesrQ^iD2Z)uZV zvYQUB5B0zMS>O4czczT$xMZkbb(kEoE?XudnPn+wQUSx z{4ZEi-uQoqCB@W>rEsX}c^A=y8@zKcpOTK^!z%L@6GThmtiGo+n+Oej|@ zk>07uBts4D(7q+cgJ38tmSiFlwPRz-)w?8kTX$SVz`ai2@Q$Kg?OuetIi-S&oh{p(Z}t<$mL z=zXxf19|PXB3WzAP6kX!&Mpz}?>RnT#^iL|@FMo|QM~sS%0!g`!|x_Ri87qEgN&Sy zTFXmqqlYZUo+h&UFWJLZeB#pC_=hW6uh*|qFxJm9QoMG+U|`AGXEPL+l*-`t7^xDZ zEB4$ubkb5MmhL!T_<`ZP7lR_=KM~O)gJbN-5djKZ=|c6W7K0R^^s<3U4!Ji2OQ*F} zkZ;%!AWo@!|70BINQ!Jk;_%65bD-`t$uiLZM~-;q$$RyU){^~d%|JRY(vjZmPNm2X zPwDkNtOCF48RFB)sq1NmS?;@vUuIp|Lc>X{x-0F?HfOHR+ApWI+Zac=z@l4?`iRfg zU+1Fqxp}tD1!fIulIFkGH?wn6jOd9BJAOA_Lg{tBchm0g)w#7~oH%UOo;3mg$p-gX zbNgm5^_8-l)mr`H_AQid)G7j?W2N2kX@}bHB4H#n4A1^$5aIRo&9qho;<2e8y^0mOwvqe z6d(tMJU|Sh#TYmE)~K5ESE@}XBUn1Oe`Yx^LX^e|~R-c3;kUy^> zqz0rNhoYFeB^PB?gtdf=QBmkn$f}t3Rk24h61-&6GUkXIlOZ`OehIhCn^e@7Kb#3@ zu*hRHm=MGKN~%aadHE1-+=2H|g=)yjC(m$pGd2qf7%K9avG+g-*+iD=CucfNR#d_< z3)eqoyzT^_k=FmaT=u^+1QpODcJwhIe&YHcpw=}iIEeG(#>h$i{p8Sjp8U(f-0!k?wK`lJG_7R$zvr*J78mt-=vQ&F zvV4^Pe;~EI4=0#Jd{Ol#abk52AMIWH7ur0zb^Xp+_S@bF%}x<{ZjS_0U5pmpkL-Ne zW>-|zF_@oX`Luvd0RqW?0hwd5er@BZ#U(RPkchM@cjBs|JCNWz5N&C`aWBR~xlUxV zbiT&X@sfR4-7fnTK9o!{$7G+eOGFid8N>2Zj z(`DEX08;^RXt5w8G$?RGW(KE8`sPgm3rQEg3D`fh%xo!KsWG^jvxRg`dfZiA67Yw> zwSQobWi{2!u!L8;=?Y_7wCr=O?AwkOts++GNG_wpf?FekN3Hw@OyuoED9njepPu0a73I@QZQWJ$(paH+DgsAG(4WleB^F5l0w;?knOgmK z{Yxr*SAYJp(1t%7O!w+2OOPulXg+j$N~VS~hzay|*bISKx++7E37Vt$VHr_0E1n0@ z(^Rc2V>#guX#9RJh7U56-y(kEWUw&2HlGo_CucQS`|8{PYu%y1koJvE|08ZMDsXrX5+XEnd;m`H`}D`vjSvbxJ@Uk z1_{3fGMR?jz>p~$6D=5SHcR?Iz%-u&J7} zhvl*w!Lsj;Om?hCM*76$NKv7sNSPm%!81c(DOzX*i(C|yd19jC8G)v~M@OLF++ ziQ4d^rt)ANK!=%I?UE$k;mRJFGk|}#MvJ4IjbD^j_rcPxfK4)$wWJ`{nAV3$HTbnc z@0Z1Y;Us|+L>r3jQRiaiF1Xf`god`YgOPtE@i*ff$1r$KU>P`E+F$^*v7}T}_Zg_H za+C-G(eY*pph7unX?}$6p!)0bZS$lRXio{ZG%E!`Ey^(buNne?=$uSlZTKOVzt*oZ z5uA5=_*+dV30`Hp6?G%{J7n3BEG;@2D#tXm8FJbWimf ztgp{?E-+Zw`_L=Ayc4X5IXQNl*(3I}A=!fQeC}dmvwl}?p6=*vJZ*sS>I((|Z&P2= zn?nj`BlftnByIEc5{(ZD%045<=;@+3QN=@VS69jfpxh;&V7VN>o^ruTXYQKR=^5Ui z>&X;&OKx5dk(w6f{ZcKlxZHoi!c;IqpOuE?_J-C zZoJ6Rzu*HAAy1+Q!`Hq8V(Mgt$7nroXqm%dO^Q&%pehoR&Vk8z`K&+lK6UUlIimL^#&p>{jIS5wiRz2`E(trIM8z_tqn~?q0zsNP$8fvbQz<-;7~@F z9!+7Jj|L($K59L!WJ)Z>)Zbv-Xc&B6eAnJ;yCqhB%(Jx}!B<#yG=OLzjlPsV``+v1 z0OstqohVf3x$#vGNl1-L+haEr?{Il);UWFg<7DEo7wz?8-zGb#&No5@t^aFLdO=P>%Nd+a`tt-xuwzmIm)c_Mq+vZ_edxoCw=BFt|?(;YMW85JVnEqIyXYRI2QHi-} z6P@C$f;W8G*u1LBe-<;f0v2|Wqy)S>zKbpVyF?Me;Wj*;Ix}Jptdlqa;2=Xu-UF9X z6#+l-mP6+!(yp3yn9V>(ej01NfDpQ(*Jd-bt?z@Ozdv`I-cx(%IyTMkX;RYocoP&} zGsvb5QGD~$T^dyeA%By6D8bJ!4_Xe@H zFFx;kO77Bb($9N`d1`ZNgrnfbYEnqxJN_3Eqx!0yOnRoJj?L+Q$@^W&(6Ie{AJQw? zfCu8mIxlvb&UE+1Z?qfe!jr{*4g(_wch~V5t!FdLMh?k!k5`={=mx(=tbH$QQ_32i z7rxs)f5h*woqzhf(%zzW;$DER-A&$ycRb4i3jTEn5l%z`*e-*J>j>I1Nq&g}rDv3{bzPj8DTXKI}>bpxiw1WYHGYmHp@W1@gUvm(a6`Rh2&`Thh1fMT( z3O9>FBr$=?`xxce3BS549`miFdbm~1EBV`n@j>N>*q{Fwy#l?7$);-eIc8VVbL#o< z5J_EygkakF@Y=Cg z^P`}#A(&Bz8K|poB_tJ!)N%(U{I$ivwp{iSQ#1O>^;Ymh-Vi`TPdKIRtHJ=NUsk|EOPq{rS|UaWXv86(aFH$Kzs z{?C8d1cqhu9T^usUfuuLJsrx@s-amAdvN2!mX^YNx^m2tZ#gLAR~oIqDSy7=eraAX zmlCS_U%9GRZ@-tDjlyaDi?D${%AJ#`LJD_<-G^~{VWmS0SG1$L$Ad?fQXw#!oGb`a z5&}5>hDRpo)5IairlhMn`7n!uqaH(rL>7cZjlU~PR`bLGmxB>c_UXZL)I&OS=T?9) zfJ$!3LY5MDG}!1Wvcow2CtG!X9a%R1dIfdX=weftC>d2UUd(vMJ1s*6@2V>E-EDplzM5j+y0U?cY|m2*#t9e!Yg4rf zi%2liKur*5f)eu2?b#k_on~p0;ul?PU>LFtX0&d@MJ8awE$^fW3Q&bm7;FFQ|9EP- zVJ}Da2;D#s#U~4Ak%X~4A@It*dO{U?#|R?57wnNtupTN_STl=%mA~rPZsewzCiJzW zbb^_>y4pv{j(}Y|cNf#|i7%Jo_ww8~bPNUA5pqn6Aq~V!{dwHxmfB@Ci2knpx6<6DesjE-h_d z_S4NNl^P;YF`1xr*>bk~uK6EY?^UQ0{7&AFyl=G*9Jpx3Yua=}yCJk}8@?Lmhg_oZ zP@pS}Bn;d{-}%L{*iFqJ=*pUR2~K#amcWEoDg zzfk$2l)7O`o0t$v?4TIRA+4~845zEAJG^Hv-_cK$=!`lyRux91!$y0lT$F?{(Kx2+ zG&#W(R1$i3L0T%WKPH%dWEVv?_Wk3`NJ9OQ48*S+N+uDNNV^xjgm)6g~NDFnk6wLNPZb-&HjpGZD5>Sd+<;wAAQ)jDhjs7DaluE?toP zxwM4I^GC02K5RLv|KVB#{fPf>VsJi)cNYT7^(pjzZW$X>NzrV5?6j+?#gl>j^7=`uubsUSi( z_A8i@b@i7tx~myBU&8inT-9G;iRZOdWc23Qaag$EYL?7>)yekJ0J@85X1MSh!Hj{O3 zDBc_s2zKEEleFwZalt-<*|zw68M34G+gQ^&5& zMYFkdh=A?izh{&Ac;aZ_B_)oj*4w!@j-nRhc{q4~xV;~{y4)~o>+NrJ!u$i%2FV}!DYBn zbLI5TgGTc!>usT+5_9wObM5j5mZ%oJJ}ejVZBpgI4ukKRto2wbHh~y*W>P;7+tKdW zN=l1WC&rD|Je`WkkM^s}9~94Cy|3-p9e4G;jw}>~EalY$m_QZDedYHD9Fmco!Pdd;}mm_)eV&em~9f$UY^nW*}FvKCnwBP(T-*P)mf{Ui|E|2F`XaS_$f?n!Y@sg%9dRuPQKPe zAT?nsA7+s*H0rxaSZoDzo51{>e#np<4gdjHD-^4D?MLPVKe-=oCcI*G#+sbH0)uu| zyvNS5SDv>^8H!+A+sEEgA=pOxrK->E&T~8W=Kb|_AhA+e!_Nz=j()~DW*sP$7f{X*wzA{L5_R`WG-IrSd zb*SUn-FW%}?Kz%3N`7s*c>`$ixOwi29BVz_{ht54qp`Ui!O*nn`oN^^IcdMKf6?CB z6#2V1&0BYUr`hgNF3o^#H;gcG#l%kNVHAT=6=qrO)yD1E{cGq1X38h!V>e%~M1oCY zPlWu+?SVHmB8`u}={fQ+!^$+?nfayHorI2M%%H9=2F_mpsX4>0p?+lJ>m>8@wdP5K z$3wP#sr~j{{^P8lfy()m?W(t}ly+D`6n(J*0^t9uB{J5vj*Xlgo_u`c@8@o+BE7`( z|L$S%-7Lx%rXOvA^(9kulC%Do7T_w3|9E~eJx_b-)BG-3bkS(D&z)6xk$&i0wNR-~T z2_lb!jDi)PGHFex-t!~JKsEV4H)nkl!*7!9WZgI!xlr2wlN*+LFemgj`;8GolEpme z1w3doTt7iaBP^akC6f?(Ss98cP!UU4)I*M3{lgM>@H?$2&%@StO&IJ|<OY9Q=qbYXr3!@0u!+qCMml^y zS(~ft>phk)AQzj3`zZtT`aCj?SZ2hItg8r`#V(UPJvSA`RZ#Ez{# zw@rH)Y9~9N4piK&K0Qa}m%enGy*%Bvp>6{HEHT?9FG01^sPh`sCUvt%RuDz{s5L?L zRiDS%^^>&L%Z>`;iEDGhJ^ELGe*JZ>`r(4lV$JFW9b&Ykfzz_h&6WMibq7Dww}_O< zUj{7~RVef`k5!mJ$Gu_qf_sYh+&ItiFpWjJD%Hudy4z@czG+eW(-#8`exj`=>|y)2 z+?VLpH}<;ijRUJKX3p6gJ&Wy5A`(|VoT>S4ZR%(M(0sFcb-VEuPoYqCruN>7Blz=0 zS%i)o$tCpf!c1)kygtnlClXhq0Mik{GUrMaT%1-Sgr2#@D!6ecZ;?c6)k61X#`N`U zQ!R6ACG~i9=vn_on?U7e?V;cKnk0td#q;^a*vm~;>PNv}hJPuy+lmrsKxYENWO$T` zw=qBi^#^}4Fe9$)c2vcDvI_b(8Gueyj5FV)ZeJjoWZsc&#S_ktfU79jH!u|-C-4e= z+tZE0VW&BA7cmZAR7;gZA^z1_#ZLT5pz%!7Mr%@EiXqjk`aq8jBZ!PG2hr$T@VI zQW>=zifp?4*!Oi1*~Bql7)CB$b0YZ1jS?dD3iG0>H->qQD1hEj6L^Fr8#4J1^NfU< zhkpo%05c{MWWXE2r$ZFQ6SlDblVx0(t8A{DvYY>tih3{Y2<4>Qf2m`OtJwq7%g`8kYCx8lKoe+cAjL_A*t)bgn_D z-PugZUPCVxDqt2kQ?oNdU7DHcu0T*D*XEG+?JWTdCWc*#rS_x&+V$GJV!!z4xS+97xdCNlt1;+lT#iX_Q=Kt*| z5iU#O!g_zZX}4>SoNqL9J>9&1|Kpp?%`{kbyX!^wzQ3g2&tg_6mFU;}5cBIGygEifg?T~+Z^O{s>t?l3KGnl; zc)Rp?C3b2iB!18GuZ0Z_DLp#-R9K7&zmrxX^t8hfJ{o3a*5N(tXd6i(iEbNoSGWDg z7q7B}4h%xk?W<Am$qk^2Z&2_fUc64;03h z$-W|e1(ZBR&|px9n7Z6AP@65;&)q#BE-EFzw;9g44f=S7#GahtWvHWfPBCbaO^m2x zxRAp}aNtQtk@_kQ4sq<4I5!R$)(Zm$0iqDMWxwU~_yN0mUKT<+H8d`?{VP~{#(qh$ zo&NcXf|4BvBKxxa$}-U#J=RJ?$;r)jvG2GUHIZLa>Nqj7Xi*7ByYUe_Xq(N~KF7Un z{WED#SKaBUEBIV2^fHn<((Bozd;q_^~AE4Q6nf5c8krkUPn=yRQ-pZ7U>mAcoIlY(Cnh;*Z85RVgX zO0o3Ri-mK`g@)e`=5b{llF}}ai{6+TF-EG}PLvWKZ~7Yty?7VJhK_GWQ3TV# zav&8Ps!|d*(USp4&Q>0FnQoz`@U9Orhl=_|f+J!ctZ4AS%_K2hQQxoMf2D7VyCuUv z>(b1#bF zJ-J8~%{oSFeeV&Q$Hp$OPN|zbSszw#OX5k+Kx^3$p^mTlN%Ea=-V1KF&UV&<2$~QP zazH%-3eHnuw`{7Bqfay)fgG|8&Nq *HSpcEwr+Mc73IBf63Q+^GK)g$HBws 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 literal 0 HcmV?d00001 diff --git a/docs/guide-es/start-testing.md b/docs/guide-es/start-testing.md new file mode 100644 index 0000000000..8d38a6ca67 --- /dev/null +++ b/docs/guide-es/start-testing.md @@ -0,0 +1,125 @@ +Pruebas (_testing_) +=============================== + +Yii2 Aplicación avanzada utiliza Codeception como framework principal para pruebas. +Existen algunas pruebas ejemplo dentro del directorio `tests` de los directorios `frontend`, `backend`, y `common`. +Para que el siguiente procedimiento funcione, se asume que la aplicación ha sido inicializada utilizando +el entorno `dev`. En caso de que las pruebas requieran ser ejecutadas en un entorno `Production`, `yii_test` y +`yii_test.bat` deberán ser copiados manualmente desde el fólder `environments/dev` dentro del directorio raíz del proyecto. + +Las pruebas requieren una **base de datos adicional**, que deberá ser limpiada entre cada prueba. +Crear base de datos `yii2advanced_test` en mysql (acorde a la configuración en `common/config/test-local.php`) y ejecutar: + + +``` +./yii_test migrate +``` + +Construir las pruebas: + +``` +vendor/bin/codecept build +``` + +Todas las pruebas pueden comenzarse, ejecutando: + + +``` +vendor/bin/codecept run +``` + +Verá un salida similar a esto: + +![](images/tests.png) + +Es recomendable mantener sus pruebas actualizadas. Si una clase, o funcionalidad es borrada, las pruebas correspondientes deberán ser +borradas tambien. +Deberá correr las pruebas regularmente, o mejor configurar el servidor para Integración Continua. + + +Por favor referirse a [Yii2 Framework Case Study](http://codeception.com/for/yii) para aprender sobre como configurar Codeception para su aplicación. + +### Common + +Pruebas para clases en _common_ están ubicadas en `common/tests`. En esta plantilla, solo hay pruebas unitarias. +Ejecútelas con el comando: + +``` +vendor/bin/codecept run -- -c common +``` + +Opción `-c` permite establecer la ruta del archivo de configuración `codeception.yml`. + +Pruebas en la _suite_ `unit` (ubicadas en `common/tests/unit`) pueden utilizar características de Yii framework: `Yii::$app`, Active Record, fixtures, etc. +Esto debido a que el módulo `Yii2` está habilidado en el archivo de configuración `common/tests/unit.suite.yml`. Usted puede deshabilitarlo para correr +pruebas en completo aislamiento. + + +### Frontend + +Para _frontend_ se contienen pruebas unitarias, funcionales y de aceptación. +Ejecútelas con el siguiente comando: + +``` +vendor/bin/codecept run -- -c frontend +``` + +Descripción de las _suites_: + +* `unit` ⇒ Clases relacionadas a la aplicacción _frontend_ solamente. +* `functional` ⇒ Peticiones/respuestas internas de la aplicación (sin un servidor web). +* `acceptance` ⇒ Aplicaciones web, interfaz de usuario y interacciones js en un navegador web real. + +Por predeterminación, las pruebas están deshabilitadas, para ejecutarlas use: + +#### Corriendo pruebas de aceptación + +Las pruebas de aceptación utilizan [geckodriver](https://github.com/mozilla/geckodriver) para firefox por predeterminación, por tanto asegurese de que +[geckodriver](https://github.com/mozilla/geckodriver) esté en su `PATH`. + +Para ejecutar las pruebas de aceptación, haga lo siguiente: + +1. Renombrar `frontend/tests/acceptance.suite.yml.example` a `frontend/tests/acceptance.suite.yml` para habilitar la configuración del conjunto. + +1. Reemplazar el paquete `codeception/base` dentro del `composer.json` con `codeception/codeception` para instalar un versión completa Codeception. + +1. Actualizar las dependencias con Composer + + ``` + composer update + ``` + +1. Auto generar nuevas clases soporte para pruebas de aceptación: + + ``` + vendor/bin/codecept build -- -c frontend + ``` + +1. Descargar [Selenium Server](http://www.seleniumhq.org/download/) y lanzarlo: + + ``` + java -jar ~/selenium-server-standalone-x.xx.x.jar + ``` + > Hay [issues](https://github.com/facebook/php-webdriver/issues/492) con el geckodriver. + > Interacciones con selenium que requieran habilitar _protocol translation_ en Selenium. + > `java -jar ~/selenium-server-standalone-x.xx.x.jar -enablePassThrough false` + +1. Comenzar el servidor web: + + ``` + php -S 127.0.0.1:8080 -t frontend/web + ``` + +1. Ahora puede correr todas pruebas disponibles: + + ``` + vendor/bin/codecept run acceptance -- -c frontend + ``` + +## Backend + +La aplicación _backend_ contiene pruebas unitarias y funcionales. Ejecútelas con: + +``` +vendor/bin/codecept run -- -c backend +``` From 0323ff9aec8574a0a471e7b152d3bd6545b3baf3 Mon Sep 17 00:00:00 2001 From: paweljankowiak06 Date: Sat, 31 Mar 2018 14:16:53 +0200 Subject: [PATCH 019/187] Skip initialization when directory does not exists (#354) --- init | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/init b/init index 47be99e4a1..a7753d9572 100755 --- a/init +++ b/init @@ -57,8 +57,15 @@ if (empty($params['env'])) { } } +$rootPath = "$root/environments/{$env['path']}"; +if (!is_dir($rootPath)) { + printError("$rootPath directory does not exist. Check path in $envName environment."); + exit(3); +} + echo "\n Start initialization ...\n\n"; -$files = getFileList("$root/environments/{$env['path']}"); + +$files = getFileList($rootPath); if (isset($env['skipFiles'])) { $skipFiles = $env['skipFiles']; array_walk($skipFiles, function(&$value) use($env, $root) { $value = "$root/$value"; }); From 4eee1f720eddbac1b1964630c29c90cedaea7004 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Tue, 3 Apr 2018 01:32:55 +0900 Subject: [PATCH 020/187] docs/guide-ja updated [ci skip] (#356) --- docs/guide-ja/README.md | 12 +++--- docs/guide-ja/start-comparison.md | 8 ++-- docs/guide-ja/start-composer.md | 4 +- docs/guide-ja/start-installation.md | 44 ++++++++----------- docs/guide-ja/start-testing.md | 34 +++++++++------ docs/guide-ja/structure-applications.md | 10 ++--- docs/guide-ja/structure-directories.md | 14 +++--- docs/guide-ja/structure-environments.md | 15 ++++--- docs/guide-ja/structure-path-aliases.md | 26 +++++------ docs/guide-ja/topic-adding-more-apps.md | 45 ++++++++++++++++++++ docs/guide-ja/topic-link-backend-frontend.md | 4 +- docs/guide-ja/topic-shared-hosting.md | 16 +++---- 12 files changed, 140 insertions(+), 92 deletions(-) diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 7770a69b5b..3ad4f998e1 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -1,7 +1,7 @@ -Yii 2 アドバンストプロジェクトテンプレート -========================================== +Yii 2 アドバンスト・プロジェクト・テンプレート +============================================== -Yii 2 アドバンストプロジェクトテンプレートは、複数の層を持つ複雑なアプリケーションを開発するのに適した [Yii 2](http://www.yiiframework.com/) アプリケーションのスケルトンです。 +Yii 2 アドバンスト・プロジェクト・テンプレートは、複数の層を持つ複雑なウェブ・アプリケーションを開発するのに適した [Yii 2](http://www.yiiframework.com/) アプリケーションのスケルトンです。 このテンプレートは三つの層、すなわち、フロントエンド、バックエンド、そして、コンソールから構成され、それぞれが独立した Yii アプリケーションとなっています。 @@ -13,7 +13,7 @@ Yii 2 アドバンストプロジェクトテンプレートは、複数の層 -------- * [インストール](start-installation.md) -* [ベーシックプロジェクトテンプレートとの違い](start-comparison.md) +* [ベーシック・プロジェクト・テンプレートとの違い](start-comparison.md) * [Composer を構成する](start-composer.md) * [テストを実行する](start-testing.md) @@ -21,7 +21,7 @@ Yii 2 アドバンストプロジェクトテンプレートは、複数の層 ---- * [ディレクトリ](structure-directories.md) -* [事前定義されたパスエイリアス](structure-path-aliases.md) +* [事前定義されたパス・エイリアス](structure-path-aliases.md) * [アプリケーション](structure-applications.md) * [構成と環境](structure-environments.md) @@ -30,5 +30,5 @@ Yii 2 アドバンストプロジェクトテンプレートは、複数の層 * [バックエンドからフロントエンドへのリンクを作成する](topic-link-backend-frontend.md) * [アプリケーションをさらに追加する](topic-adding-more-apps.md) -* [共有ホスティング環境でアドバンストプロジェクトテンプレートを使う](topic-shared-hosting.md) +* [共有ホスティング環境でアドバンスト・プロジェクト・テンプレートを使う](topic-shared-hosting.md) diff --git a/docs/guide-ja/start-comparison.md b/docs/guide-ja/start-comparison.md index e10156d32e..c739e45105 100644 --- a/docs/guide-ja/start-comparison.md +++ b/docs/guide-ja/start-comparison.md @@ -1,18 +1,18 @@ 比較 ==== -次の表は、アドバンストプロジェクトテンプレートとベーシックプロジェクトテンプレートの違いを示すものです。 +次の表は、アドバンスト・プロジェクト・テンプレートとベーシック・プロジェクト・テンプレートの違いを示すものです。 | 機能 | ベーシック | アドバンスト | |---|:---:|:---:| | プロジェクトの構造 | ✓ | ✓ | -| サイトコントローラ | ✓ | ✓ | +| サイト・コントローラ | ✓ | ✓ | | ユーザのログイン/ログアウト | ✓ | ✓ | | フォーム | ✓ | ✓ | | DB 接続 | ✓ | ✓ | -| コンソールコマンド | ✓ | ✓ | -| アセットバンドル | ✓ | ✓ | +| コンソール・コマンド | ✓ | ✓ | +| アセット・バンドル | ✓ | ✓ | | Codeception テスト | ✓ | ✓ | | Twitter Bootstrap | ✓ | ✓ | | フロントエンドとバックエンド | | ✓ | diff --git a/docs/guide-ja/start-composer.md b/docs/guide-ja/start-composer.md index 44e063da4a..39edd85004 100644 --- a/docs/guide-ja/start-composer.md +++ b/docs/guide-ja/start-composer.md @@ -1,7 +1,7 @@ Composer を構成する =================== -プロジェクトテンプレートがインストールされた後に、ルートディレクトリにあるデフォルトの `composer.json` を修正するのは良い考えです。 +プロジェクト・テンプレートがインストールされた後に、ルート・ディレクトリにあるデフォルトの `composer.json` を修正するのは良い考えです。 ```json { @@ -50,7 +50,7 @@ Composer を構成する 次に興味深い部分です。 あなたは、あなたのアプリケーションが必要とするパッケージを `require` セクションに追加することが出来ます。 -追加のパッケージは全て [packagist.org](https://packagist.org/) から取ってくることが出来ます。ウェブサイトを閲覧して、役に立つコードを探してください。 +追加のパッケージは全て [packagist.org](https://packagist.org/) から取ってくることが出来ます。ウェブ・サイトを閲覧して、役に立つコードを探してください。 `composer.json` を修正した後、`composer update --prefer-dist` を実行し、パッケージがダウンロードされインストールされるのを待ちます。 後はただ使用するだけです。クラスのオートロードは自動的に処理されます。 diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index ad0f35efb1..41ba0f5412 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -3,23 +3,23 @@ ## 必要条件 -このプロジェクトテンプレートが要求する最低限の必要条件は、あなたのウェブサーバが PHP 5.4.0 をサポートしていることです。 +このプロジェクト・テンプレートが要求する最低限の必要条件は、あなたのウェブ・サーバが PHP 5.4.0 をサポートしていることです。 ## Composer を使ってインストールする -[Composer](http:/[Composer](http://getcomposer.org/) を持っていない場合は、決定版ガイドの [Yii をインストールする](https://github.com/yiisoft/yii2/blob/master/docs/guide-ja/start-installation.md#installing-via-composer) の節の指示に従ってインストールしてください。 +[Composer](http://getcomposer.org/) を持っていない場合は、決定版ガイドの [Yii をインストールする](https://github.com/yiisoft/yii2/blob/master/docs/guide-ja/start-installation.md#installing-via-composer) のセクションの指示に従ってインストールしてください。 Composer がインストールされていれば、次のコマンドを使ってアプリケーションをインストールすることが出来ます。 composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application -のコマンドは `yii-application` という名前のディレクトリにアドバンストアプリケーションをインストールします。 +のコマンドは `yii-application` という名前のディレクトリにアドバンスト・アプリケーションをインストールします。 望むなら別のディレクトリ名を選ぶことも出来ます。 -## アーカイブファイルからインストールする +## アーカイブ・ファイルからインストールする -[yiiframework.com](http://www.yiiframework.com/download/) からダウンロードしたアーカイブファイルをウェブルートの直下、`advanced` と名付けられたディレクトリに解凍します。 +[yiiframework.com](http://www.yiiframework.com/download/) からダウンロードしたアーカイブ・ファイルをウェブ・ルートの直下、`advanced` と名付けられたディレクトリに解凍します。 その後は、次の項に記載されている指示に従ってください。 @@ -29,7 +29,7 @@ Composer がインストールされていれば、次のコマンドを使っ アプリケーションをインストールした後に、インストールされたアプリケーションの初期設定をするために、次の各ステップを実行しなければなりません。 これらは全体で一度だけやれば十分です。 -1. コンソールターミナルを開き、`init` コマンドを実行して環境として `dev` を選択します。 +1. コンソール・ターミナルを開き、`init` コマンドを実行して環境として `dev` を選択します。 ``` /path/to/php-bin/php /path/to/yii-application/init @@ -43,9 +43,9 @@ Composer がインストールされていれば、次のコマンドを使っ 2. 新しいデータベースを作成し、それに従って `common/config/main-local.php` の `components['db']` の構成情報を修正します。 -3. コンソールターミナルを開き、`/path/to/php-bin/php /path/to/yii-application/yii migrate` というコマンドでマイグレーションを適用します。 +3. コンソール・ターミナルを開き、`/path/to/php-bin/php /path/to/yii-application/yii migrate` というコマンドでマイグレーションを適用します。 -4. ウェブサーバのドキュメントルートを設定します。 +4. ウェブ・サーバのドキュメント・ルートを設定します。 - フロントエンドのパスは `/path/to/yii-application/frontend/web/`、URL は `http://frontend/` を使用 - バックエンドのパスは `/path/to/yii-application/backend/web/`、URL は `http://backend/` を使用 @@ -66,7 +66,7 @@ Composer がインストールされていれば、次のコマンドを使っ # そうでなければ、index.php にリクエストを引き渡す RewriteRule . index.php - # index.php をインデックスファイルとして使用 + # index.php をインデックス・ファイルとして使用 DirectoryIndex index.php # ... その他の設定 ... @@ -92,7 +92,7 @@ Composer がインストールされていれば、次のコマンドを使っ # そうでなければ、index.php にリクエストを引き渡す RewriteRule . index.php - # index.php をインデックスファイルとして使用 + # index.php をインデックス・ファイルとして使用 DirectoryIndex index.php # ... その他の設定 ... @@ -210,19 +210,19 @@ Composer がインストールされていれば、次のコマンドを使っ アプリケーションにログインするためには、最初にユーザ登録をする必要があります。 -あなたの任意のメールアドレス、ユーザ名、パスワードを指定してください。 -そうすれば、同じメールアドレスとパスワードを使って何時でもアプリケーションにログインすることが出来ます。 +あなたの任意のメール・アドレス、ユーザ名、パスワードを指定してください。 +そうすれば、同じメール・アドレスとパスワードを使って何時でもアプリケーションにログインすることが出来ます。 -> Note: `/` をフロントエンド、`/admin` をバックエンドにして、アドバンストテンプレートを単一のドメインで走らせたい場合は、 -> [共有ホスティング環境でアドバンストプロジェクトテンプレートを使う](topic-shared-hosting.md) を参照して下さい。 +> Note: `/` をフロントエンド、`/admin` をバックエンドにして、アドバンスト・テンプレートを単一のドメインで走らせたい場合は、 +> [共有ホスティング環境でアドバンスト・プロジェクト・テンプレートを使う](topic-shared-hosting.md) を参照して下さい。 ## Vagrant を使ってインストールする この方法が最も簡単ですが、時間はかかります (~20分)。 -**このインストール方法では、(ウェブサーバ、PHP、MySQL 等々の) ソフトウェアを事前にインストールする必要はありません。** - 単に以下のステップを実行するだけです。 steps! +**このインストール方法では、(ウェブ・サーバ、PHP、MySQL 等々の) ソフトウェアを事前にインストールする必要はありません。** - 単に以下のステップを実行するだけです。 #### Linux/Unix ユーザ用マニュアル @@ -238,7 +238,7 @@ Composer がインストールされていれば、次のコマンドを使っ ``` 4. 作成した GitHub personal API token を `vagrant-local.yml` に置く -5. プロジェクトのルートディレクトリに移動する +5. プロジェクトのルート・ディレクトリに移動する ```bash cd yii2-app-advanced @@ -269,21 +269,13 @@ Composer がインストールされていれば、次のコマンドを使っ * vagrant-local.example.yml` を `vagrant-local.yml` にコピーする 6. 作成した GitHub personal API token を `vagrant-local.yml` に置く -7. 次の2行を [hosts file](https://en.wikipedia.org/wiki/Hosts_(file)) に追加する - - ``` - 192.168.83.137 y2aa-frontend.test - 192.168.83.137 y2aa-backend.test - ``` - -8. ターミナル (`cmd.exe`) を開き、 **プロジェクトのルートディレクトリに移動して** 次のコマンドを実行する +7. ターミナル (`cmd.exe`) を開き、 **プロジェクトのルート・ディレクトリに移動して** 次のコマンドを実行する ```bash - vagrant plugin install vagrant-hostmanager vagrant up ``` - (コマンドプロンプトでディレクトリを移動する方法については、[ここ](http://www.wikihow.com/Change-Directories-in-Command-Prompt) を読んでください) + (コマンド・プロンプトでディレクトリを移動する方法については、[ここ](http://www.wikihow.com/Change-Directories-in-Command-Prompt) を読んでください) これで全部です。後はただ完了するのを待つだけです。 完了後には、次の URL でローカルのプロジェクトにアクセスすることが出来ます。 diff --git a/docs/guide-ja/start-testing.md b/docs/guide-ja/start-testing.md index 0226047a44..350aa449bc 100644 --- a/docs/guide-ja/start-testing.md +++ b/docs/guide-ja/start-testing.md @@ -1,8 +1,11 @@ テスト ====== -Yii2 アドバンストアプリケーションは Codeception を主たるテストフレームワークとして使用します。 -`frontend`、`backend` および `common` の `tests` ディレクトリに、既にいくつかのサンプルテストが用意されています。 +Yii2 アドバンスト・アプリケーションは Codeception を主たるテスト・フレームワークとして使用します。 +`frontend`、`backend` および `common` の `tests` ディレクトリに、既にいくつかのサンプル・テストが用意されています。 +下記の手順が動作するために、アプリケーションは `dev` 環境を使って初期化されているものとしています。 +テストを `Production` 環境で実行する必要がある場合は、`yii_test` と `yii_test.bat` が `environments/dev` からプロジェクトのルート・ディレクトリへ手作業でコピーされなければなりません。 + テストには、テストを実行するたびに事前にクリーンアップされる **追加のデータベース** が必要になります。 (`common/config/test.php` の構成に従って) mysql に `yii2advanced_test` というデータベースを作成し、下記を実行して下さい。 @@ -10,13 +13,13 @@ Yii2 アドバンストアプリケーションは Codeception を主たるテ ./yii_test migrate ``` -次に、テストスイートをビルドします。 +次に、テスト・スイートをビルドします。 ``` vendor/bin/codecept build ``` -これで、次のコマンドを実行すれば、全てのサンプルテストを開始することが出来ます。 +これで、次のコマンドを実行すれば、全てのサンプル・テストを開始することが出来ます。 ``` vendor/bin/codecept run @@ -28,7 +31,7 @@ vendor/bin/codecept run あなたのテストを最新の状態に保つことが推奨されます。 クラスまたは機能が削除されたときには、対応するテストも削除されるべきです。 -テストは定期的に実行すべきです。あるいは、もっと良い方法として、継続インテグレーションサーバをテストのためにセットアップしましょう。 +テストは定期的に実行すべきです。あるいは、もっと良い方法として、継続インテグレーション・サーバをテストのためにセットアップしましょう。 Codeception をあなたのアプリケーションのために構成する方法を学ぶために [Yii2 Framework Case Study](http://codeception.com/for/yii) を参照して下さい。 @@ -57,16 +60,18 @@ vendor/bin/codecept run -- -c common vendor/bin/codecept run -- -c frontend ``` -テストスイートの説明 +テスト・スイートの説明 -* 単体 (`unit`) ⇒ フロントエンドアプリケーションだけに関係する諸クラスのテスト -* 機能 (`functional`) ⇒ アプリケーションの内部的なリクエストとレスポンスのテスト (ウェブサーバ抜きで) -* 受入 (`acceptance`) ⇒ 実際のブラウザにおけるWebアプリケーション、ユーザインタフェイス、javascript 相互作用のテスト +* 単体 (`unit`) ⇒ フロントエンド・アプリケーションだけに関係する諸クラスのテスト +* 機能 (`functional`) ⇒ アプリケーションの内部的なリクエストとレスポンスのテスト (ウェブ・サーバ抜きで) +* 受入 (`acceptance`) ⇒ 実際のブラウザにおけるウェブ・アプリケーション、ユーザ・インタフェイス、javascript 相互作用のテスト デフォルトでは、受入テストは無効になっています。受入テストを実行するためには、次のようにします。 #### 受入テストを実行する +受入テストは、デフォルトでは firefox のための [geckodriver](https://github.com/mozilla/geckodriver) を使用します。従って、[geckodriver](https://github.com/mozilla/geckodriver) が `PATH` に含まれていることを確認して下さい。. + 受入テストを実行するためには、次のようにします。 1. `frontend/tests/acceptance.suite.yml.example` を `frontend/tests/acceptance.suite.yml` にリネームして、スイートの構成を有効にする @@ -84,8 +89,11 @@ vendor/bin/codecept run -- -c frontend ``` java -jar ~/selenium-server-standalone-x.xx.x.jar ``` + > 現在、geckodriver には Selenium との相互作用に [問題](https://github.com/facebook/php-webdriver/issues/492) があるため、 + > Selenium でプロトコル変換を有効にする必要があります。 + > `java -jar ~/selenium-server-standalone-x.xx.x.jar -enablePassThrough false` -5. ウェブサーバを開始する +5. ウェブ・サーバを開始する ``` php -S 127.0.0.1:8080 -t frontend/web @@ -99,9 +107,9 @@ vendor/bin/codecept run -- -c frontend ## Backend -バックエンドアプリケーションは、単体テストと機能テストのスイートを含んでいます。 -下記によって、テストスイートを実行します。 +バックエンド・アプリケーションは、単体テストと機能テストのスイートを含んでいます。 +下記によって、テスト・スイートを実行します。 ``` vendor/bin/codecept run -- -c backend -``` \ No newline at end of file +``` diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index a915736ade..196f199749 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -1,17 +1,17 @@ アプリケーション ================ -アドバンストテンプレートには三つのアプリケーションがあります。 +アドバンスト・テンプレートには三つのアプリケーションがあります。 すなわち、フロントエンド、バックエンド、そして、コンソールです。 -フロントエンドは典型的にはエンドユーザに提示されるもので、プロジェクトの本体です。 +フロントエンドは典型的にはエンド・ユーザに提示されるもので、プロジェクトの本体です。 バックエンドは管理パネルや、分析などの機能です。 -コンソールは典型的にはクロンジョブや低レベルのサーバ管理に使用されます。 +コンソールは典型的にはクロン・ジョブや低レベルのサーバ管理に使用されます。 コンソールは、また、アプリケーションの配備の際にも使われ、マイグレーションやアセットを処理します。 さらに、二つ以上のアプリケーションから使われるファイル、例えば `User` モデルを含む `common` ディレクトリがあります。 -フロントエンドとバックエンドは両方ともウェブアプリケーションであり、ともに `web` ディレクトリを含んでいます。 -これがウェブサーバのウェブルートとすべきディレクトリです。 +フロントエンドとバックエンドは両方ともウェブ・アプリケーションであり、ともに `web` ディレクトリを含んでいます。 +これがウェブ・サーバのウェブ・ルートとすべきディレクトリです。 各アプリケーションはそれ自身の名前空間と、その名前に対応するエイリアスをもっています。 同じことは `common` ディレクトリにも当てはまります。 diff --git a/docs/guide-ja/structure-directories.md b/docs/guide-ja/structure-directories.md index 361fca260d..2f23eb4d5a 100644 --- a/docs/guide-ja/structure-directories.md +++ b/docs/guide-ja/structure-directories.md @@ -1,18 +1,18 @@ ディレクトリ ============ -ルートディレクトリは次のサブディレクトリを含みます。 +ルート・ディレクトリは次のサブ・ディレクトリを含みます。 -- `backend` - [バックエンドのウェブアプリケーション](structure-applications.md) +- `backend` - [バックエンドのウェブ・アプリケーション](structure-applications.md) - `common` - [全てのアプリケーションに共通なファイル](structure-applications.md) -- `console` - [コンソールアプリケーション](structure-applications.md) +- `console` - [コンソール・アプリケーション](structure-applications.md) - `environments` - [環境設定](structure-applications.md) -- `frontend` - [フロントエンドのウェブアプリケーション](structure-applications.md) +- `frontend` - [フロントエンドのウェブ・アプリケーション](structure-applications.md) -ルートディレクトリは次の一群のファイルを含みます。 +ルート・ディレクトリは次の一群のファイルを含みます。 - `.gitignore` - git バージョン管理システムによって無視されるディレクトリの一覧を含みます。 - ソースコードのレポジトリに決して入れたくないものがあれば、それをこれに追加してください。 + ソース・コードのレポジトリに決して入れたくないものがあれば、それをこれに追加してください。 - `composer.json` - Composer の構成。[Composer を構成する](start-composer.md) を参照 。 - `init` - 初期化スクリプト。[構成情報と環境](structure-environments.md) を参照。 - `init.bat` - 同上 (Windows 用)。 @@ -20,5 +20,5 @@ - `README.md` - テンプレートのインストールに関する基本的な情報。 あなたのプロジェクトとそのインストールに関する情報に置き換えることを検討してください。 - `requirements.php` - Yii 必要条件チェッカ。 -- `yii` - コンソールアプリケーションのブートストラップスクリプト。 +- `yii` - コンソール・アプリケーションのブートストラップ・スクリプト。 - `yii.bat` - 同上 (Windows 用)。 diff --git a/docs/guide-ja/structure-environments.md b/docs/guide-ja/structure-environments.md index 114381cf1a..fb32cda452 100644 --- a/docs/guide-ja/structure-environments.md +++ b/docs/guide-ja/structure-environments.md @@ -12,16 +12,19 @@ これらの問題を解決するために、Yii は単純な環境の概念を導入しました。 それぞれの環境は `environments` ディレクトリ配下の一群のファイルとして表現されます。 `init` コマンドが環境を初期設定するのに使用されます。 -`init` コマンドが実際にやっていることは、環境ディレクトリから、全てのアプリケーションがあるルートディレクトリへと、すべてをごっそりとコピーすることです。 +`init` コマンドが実際にやっていることは、環境ディレクトリから、全てのアプリケーションがあるルート・ディレクトリへと、すべてをごっそりとコピーすることです。 デフォルトでは二つの環境があります。すなわち、`dev` と `prod` です。 最初のものは開発用の環境で、全ての開発ツールとデバッグが有効になっています。 第二のものは本番サーバ配備用の環境で、デバッグと開発ツールは無効になっています。 -典型的には、環境ディレクトリは `index.php` のようなアプリケーションブートストラップファイルや、`-local.php` という接尾辞を持つ構成情報ファイルを含んでいます。 -これらのファイルは、チーム・メンバーの個人的な構成情報 (通常は `dev` 環境に置きます) であるか、 -特定のサーバの構成情報 (たとえば、本番環境のデータベース接続は `prod` 環境の `-local.php` 構成情報ファイルに置きます) であるかのどちらかです。 -これらのローカルな構成情報は `.gitignore` に追加されており、ソースコードレポジトリには決してプッシュされません。 +典型的には、環境ディレクトリは `index.php` のようなアプリケーション・ブートストラップ・ファイルや、`-local.php` という接尾辞を持つ構成情報ファイルを含んでいます。 +`environments` ディレクトリにあるローカルな構成情報は、`init` が実行された後に、 +対応するアプリケーション構成ディレクトリにコピーされるテンプレートです。 +コピーされた後に、それらがローカルな構成情報となります。 +このディレクトリに置く構成情報は、データベース接続の認証情報など、秘密の環境固有設定情報を保持するためのものであり、 +バージョン・コントロール・システムに入れられることを意図しないものです。 +このため、このディレクトリのファイルは `.gitignore` に追加され、git のステージングの対象から外されます。 重複を避けるために、構成情報はお互いを上書きします。 例えば、フロントエンドは次の順序で構成情報を読み取ります。 @@ -42,4 +45,4 @@ 全体の枠組みはこのようになります。 -![アドバンストアプリケーションの構成情報](images/advanced-app-configs.png) +![アドバンスト・アプリケーションの構成情報](images/advanced-app-configs.png) diff --git a/docs/guide-ja/structure-path-aliases.md b/docs/guide-ja/structure-path-aliases.md index e41936492d..85edb32d46 100644 --- a/docs/guide-ja/structure-path-aliases.md +++ b/docs/guide-ja/structure-path-aliases.md @@ -1,17 +1,17 @@ -事前定義されたパスエイリアス -============================ +事前定義されたパス・エイリアス +============================== - `@yii` - フレームワークのディレクトリ。 -- `@app` - 現在走っているアプリケーションのベースパス。 +- `@app` - 現在走っているアプリケーションのベース・パス。 - `@common` - 共通ディレクトリ。 -- `@frontend` - フロントエンドウェブアプリケーションのディレクトリ。 -- `@backend` - バックエンドウェブアプリケーションのディレクトリ。 -- `@console` - コンソールアプリケーションのディレクトリ。 -- `@runtime` - 現在走っているウェブアプリケーションのランタイムディレクトリ。 -- `@vendor` - Composer の ベンダーディレクトリ。 -- `@bower` - [bower パッケージ](http://bower.io/) を含むベンダーディレクトリ。 -- `@npm` - [npm パッケージ](https://www.npmjs.org/) を含むベンダーディレクトリ。 -- `@web` - 現在走っているウェブアプリケーションのベース URL。 -- `@webroot` - 現在走っているウェブアプリケーションのウェブルートディレクトリ。 +- `@frontend` - フロントエンド・ウェブ・アプリケーションのディレクトリ。 +- `@backend` - バックエンド・ウェブ・アプリケーションのディレクトリ。 +- `@console` - コンソール・アプリケーションのディレクトリ。 +- `@runtime` - 現在走っているウェブ・アプリケーションのランタイム・ディレクトリ。 +- `@vendor` - Composer の ベンダー・ディレクトリ。 +- `@bower` - [bower パッケージ](http://bower.io/) を含むベンダー・ディレクトリ。 +- `@npm` - [npm パッケージ](https://www.npmjs.org/) を含むベンダー・ディレクトリ。 +- `@web` - 現在走っているウェブ・アプリケーションのベース URL。 +- `@webroot` - 現在走っているウェブ・アプリケーションのウェブ・ルート・ディレクトリ。 -アドバンストアプリケーションのディレクトリ構造特有のエイリアス (`@common`、`@frontend`、`@backend`、`@console`) は `common/config/bootstrap.php` で定義されています。 +アドバンスト・アプリケーションのディレクトリ構造特有のエイリアス (`@common`、`@frontend`、`@backend`、`@console`) は `common/config/bootstrap.php` で定義されています。 diff --git a/docs/guide-ja/topic-adding-more-apps.md b/docs/guide-ja/topic-adding-more-apps.md index e87e8b9e79..bcf6ea2199 100644 --- a/docs/guide-ja/topic-adding-more-apps.md +++ b/docs/guide-ja/topic-adding-more-apps.md @@ -9,3 +9,48 @@ `environments/prod/frontend` を `environments/prod/blog` にコピーします。 2. 名前空間とパスが `frontend` ではなく `blog` で始まるように修正します。 3. `common\config\bootstrap.php` に、`Yii::setAlias('blog', dirname(dirname(__DIR__)) . '/blog');` を追加します。 +4. `environments/index.php` を修正します (`+` 印の個所): + +```php +return [ + 'Development' => [ + 'path' => 'dev', + 'setWritable' => [ + 'backend/runtime', + 'backend/web/assets', + 'frontend/runtime', + 'frontend/web/assets', ++ 'blog/runtime', ++ 'blog/web/assets', + ], + 'setExecutable' => [ + 'yii', + 'yii_test', + ], + 'setCookieValidationKey' => [ + 'backend/config/main-local.php', + 'frontend/config/main-local.php', ++ 'blog/config/main-local.php', + ], + ], + 'Production' => [ + 'path' => 'prod', + 'setWritable' => [ + 'backend/runtime', + 'backend/web/assets', + 'frontend/runtime', + 'frontend/web/assets', ++ 'blog/runtime', ++ 'blog/web/assets', + ], + 'setExecutable' => [ + 'yii', + ], + 'setCookieValidationKey' => [ + 'backend/config/main-local.php', + 'frontend/config/main-local.php', ++ 'blog/config/main-local.php', + ], + ], +]; +``` diff --git a/docs/guide-ja/topic-link-backend-frontend.md b/docs/guide-ja/topic-link-backend-frontend.md index 58e2261024..c338d8c2c7 100644 --- a/docs/guide-ja/topic-link-backend-frontend.md +++ b/docs/guide-ja/topic-link-backend-frontend.md @@ -1,8 +1,8 @@ バックエンドからフロントエンドへのリンクを作成する ================================================== -バックエンドアプリケーションからフロントエンドアプリケーションへのリンクを作成しなければならないことがよくあります。 -フロントエンドアプリケーションはそれ自身の URL マネージャ規則を持ち得ますので、それをバックエンドアプリケーションのために別の名前で複製する必要があります。 +バックエンド・アプリケーションからフロントエンド・アプリケーションへのリンクを作成しなければならないことがよくあります。 +フロントエンド・アプリケーションはそれ自身の URL マネージャ規則を持ち得ますので、それをバックエンド・アプリケーションのために別の名前で複製する必要があります。 ```php return [ diff --git a/docs/guide-ja/topic-shared-hosting.md b/docs/guide-ja/topic-shared-hosting.md index 2775bf05e4..51d4a72cea 100644 --- a/docs/guide-ja/topic-shared-hosting.md +++ b/docs/guide-ja/topic-shared-hosting.md @@ -1,17 +1,17 @@ -共有ホスティング環境でアドバンストプロジェクトテンプレートを使う +共有ホスティング環境でアドバンスト・プロジェクト・テンプレートを使う ================================================================ -アドバンストプロジェクトテンプレートを共有ホストに配備するのは、ベーシックプロジェクトテンプレートを配備するのに比べると、少しトリッキーになります。 -なぜなら、アドバンストアプリケーションは、共有ホストがサポートしていない二つのウェブルートを持っているからです。 +アドバンスト・プロジェクト・テンプレートを共有ホストに配備するのは、ベーシック・プロジェクト・テンプレートを配備するのに比べると、少しトリッキーになります。 +なぜなら、アドバンスト・アプリケーションは、共有ホストがサポートしていない二つのウェブ・ルートを持っているからです。 ディレクトリ構造を修正して、フロントエンドの URL が `http://site.test` となり、 バックエンドの URL が `http://site.test/admin` となるようにしなければなりません。 -### エントリスクリプトを単一のウェブルートに移動する +### エントリ・スクリプトを単一のウェブ・ルートに移動する -まずは、ウェブルートディレクトリが必要です。 -新しいディレクトリを作成して、あなたのホストのウェブルートの名前に合った名前を付けて下さい。 +まずは、ウェブ・ルート・ディレクトリが必要です。 +新しいディレクトリを作成して、あなたのホストのウェブ・ルートの名前に合った名前を付けて下さい。 例えば、`www` や `public_html` や、そのような名前です。 -そして、次のようなディレクトリ構成にします。ここで `www` は、たった今作成したホストのウェブルートディレクトリを指します。 +そして、次のようなディレクトリ構成にします。ここで `www` は、たった今作成したホストのウェブ・ルート・ディレクトリを指します。 ``` www @@ -53,7 +53,7 @@ frontend ], ], 'session' => [ - // これがバックエンドへのログインに使用されるセッションクッキーの名前 + // これがバックエンドへのログインに使用されるセッション・クッキーの名前 'name' => 'advanced-backend', 'cookieParams' => [ 'path' => '/admin', From 0f2a0ed2a22489c9964d51ece2129d0adb8bd887 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 5 Apr 2018 01:27:24 +0300 Subject: [PATCH 021/187] Fixes #346: Fixed configs not to error in console with setting "setCookieValidationKey" --- backend/config/test.php | 3 +++ common/config/test.php | 3 --- frontend/config/test.php | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/config/test.php b/backend/config/test.php index ec2e9a17d9..411b05f49c 100644 --- a/backend/config/test.php +++ b/backend/config/test.php @@ -8,5 +8,8 @@ 'urlManager' => [ 'showScriptName' => true, ], + 'request' => [ + 'cookieValidationKey' => 'test', + ], ], ]; diff --git a/common/config/test.php b/common/config/test.php index cbc18c2305..c952c415a5 100644 --- a/common/config/test.php +++ b/common/config/test.php @@ -7,8 +7,5 @@ 'class' => 'yii\web\User', 'identityClass' => 'common\models\User', ], - 'request' => [ - 'cookieValidationKey' => 'test', - ], ], ]; diff --git a/frontend/config/test.php b/frontend/config/test.php index 5881579063..e94a02b107 100644 --- a/frontend/config/test.php +++ b/frontend/config/test.php @@ -8,5 +8,8 @@ 'urlManager' => [ 'showScriptName' => true, ], + 'request' => [ + 'cookieValidationKey' => 'test', + ], ], ]; From 601241c2a9e874b26a6eacc40a80d8ec455f7145 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 5 Apr 2018 01:53:43 +0300 Subject: [PATCH 022/187] Fixes #348: Made test config merging more explicit, fixed priorities --- console/config/.gitignore | 3 ++- console/config/test.php | 4 ++++ .../dev/backend/config/test-local.php | 10 ++-------- environments/dev/backend/web/index-test.php | 11 ++++++++++- environments/dev/common/config/test-local.php | 19 +++++++------------ .../dev/console/config/test-local.php | 3 +++ .../dev/frontend/config/test-local.php | 10 ++-------- environments/dev/frontend/web/index-test.php | 12 +++++++++++- environments/dev/yii_test | 7 ++++++- 9 files changed, 47 insertions(+), 32 deletions(-) create mode 100644 console/config/test.php create mode 100644 environments/dev/console/config/test-local.php diff --git a/console/config/.gitignore b/console/config/.gitignore index 20da318cb2..42799dd2b7 100644 --- a/console/config/.gitignore +++ b/console/config/.gitignore @@ -1,2 +1,3 @@ main-local.php -params-local.php \ No newline at end of file +params-local.php +test-local.php diff --git a/console/config/test.php b/console/config/test.php new file mode 100644 index 0000000000..05e0b10ebb --- /dev/null +++ b/console/config/test.php @@ -0,0 +1,4 @@ +run(); diff --git a/environments/dev/common/config/test-local.php b/environments/dev/common/config/test-local.php index ce8b69e4d7..1087688a8a 100644 --- a/environments/dev/common/config/test-local.php +++ b/environments/dev/common/config/test-local.php @@ -1,13 +1,8 @@ [ - 'db' => [ - 'dsn' => 'mysql:host=localhost;dbname=yii2advanced_test', - ] - ], - ] -); +return [ + 'components' => [ + 'db' => [ + 'dsn' => 'mysql:host=localhost;dbname=yii2advanced_test', + ] + ], +]; diff --git a/environments/dev/console/config/test-local.php b/environments/dev/console/config/test-local.php new file mode 100644 index 0000000000..60c0351d31 --- /dev/null +++ b/environments/dev/console/config/test-local.php @@ -0,0 +1,3 @@ +run(); diff --git a/environments/dev/yii_test b/environments/dev/yii_test index 70ba616ff3..63a4e7a800 100644 --- a/environments/dev/yii_test +++ b/environments/dev/yii_test @@ -13,9 +13,14 @@ require __DIR__ . '/common/config/bootstrap.php'; require __DIR__ . '/console/config/bootstrap.php'; $config = yii\helpers\ArrayHelper::merge( + require __DIR__ . '/common/config/main.php', + require __DIR__ . '/common/config/main-local.php', + require __DIR__ . '/common/config/test.php', require __DIR__ . '/common/config/test-local.php', require __DIR__ . '/console/config/main.php', - require __DIR__ . '/console/config/main-local.php' + require __DIR__ . '/console/config/main-local.php', + require __DIR__ . '/console/config/test.php', + require __DIR__ . '/console/config/test-local.php' ); $application = new yii\console\Application($config); From f0076020a431f6b6e16286c218154f4aa01bf15d Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 26 Apr 2018 21:09:16 +0300 Subject: [PATCH 023/187] Removed redundant line from license [skip ci] --- LICENSE.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index e98f03df86..ee872b9abf 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,3 @@ -The Yii framework is free software. It is released under the terms of -the following BSD License. - Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) All rights reserved. From e042647b13588426ade1f6c7c28904b79c16be98 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 4 May 2018 13:33:19 +0900 Subject: [PATCH 024/187] guide-ja revised [ci skip] --- docs/guide-ja/README.md | 13 ++++++----- docs/guide-ja/start-composer.md | 6 ++--- docs/guide-ja/start-installation.md | 20 ++++++++--------- docs/guide-ja/start-testing.md | 30 +++++++++++++++---------- docs/guide-ja/structure-applications.md | 12 ++++------ docs/guide-ja/structure-environments.md | 12 ++++------ docs/guide-ja/structure-path-aliases.md | 3 ++- docs/guide-ja/topic-adding-more-apps.md | 3 +-- docs/guide-ja/topic-shared-hosting.md | 9 +++----- 9 files changed, 52 insertions(+), 56 deletions(-) diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 3ad4f998e1..743339f105 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -1,13 +1,17 @@ Yii 2 アドバンスト・プロジェクト・テンプレート ============================================== -Yii 2 アドバンスト・プロジェクト・テンプレートは、複数の層を持つ複雑なウェブ・アプリケーションを開発するのに適した [Yii 2](http://www.yiiframework.com/) アプリケーションのスケルトンです。 +Yii 2 アドバンスト・プロジェクト・テンプレートは、複数の層を持つ複雑なウェブ・アプリケーションを開発するのに適した +[Yii 2](http://www.yiiframework.com/) アプリケーションのスケルトンです。 -このテンプレートは三つの層、すなわち、フロントエンド、バックエンド、そして、コンソールから構成され、それぞれが独立した Yii アプリケーションとなっています。 +このテンプレートは三つの層、すなわち、フロントエンド、バックエンド、そして、コンソールから構成され、 +それぞれが独立した Yii アプリケーションとなっています。 -このテンプレートは、チーム開発環境で使用されることを想定して設計されており、多様な環境にアプリケーションを配備することをサポートしています。 +このテンプレートは、チーム開発環境で使用されることを想定して設計されており、 +多様な環境にアプリケーションを配備することをサポートしています。 -機能に関してもいくらか強化されており、必要不可欠なデータベースや、ユーザ登録、パスワード回復などの機能をそのまま使える形で提供しています。 +機能に関してもいくらか強化されており、必要不可欠なデータベースや、ユーザ登録、 +パスワード回復などの機能をそのまま使える形で提供しています。 始めよう -------- @@ -31,4 +35,3 @@ Yii 2 アドバンスト・プロジェクト・テンプレートは、複数 * [バックエンドからフロントエンドへのリンクを作成する](topic-link-backend-frontend.md) * [アプリケーションをさらに追加する](topic-adding-more-apps.md) * [共有ホスティング環境でアドバンスト・プロジェクト・テンプレートを使う](topic-shared-hosting.md) - diff --git a/docs/guide-ja/start-composer.md b/docs/guide-ja/start-composer.md index 39edd85004..408b1b1ed3 100644 --- a/docs/guide-ja/start-composer.md +++ b/docs/guide-ja/start-composer.md @@ -1,7 +1,8 @@ Composer を構成する =================== -プロジェクト・テンプレートがインストールされた後に、ルート・ディレクトリにあるデフォルトの `composer.json` を修正するのは良い考えです。 +プロジェクト・テンプレートがインストールされた後に、ルート・ディレクトリにあるデフォルトの `composer.json` +を修正するのは良い考えです。 ```json { @@ -48,8 +49,7 @@ Composer を構成する 最初に、基本的な情報を更新しましょう。 `name`、`description`、`keywords`、`homepage` および `support` をあなたのプロジェクトに合うように変更します。 -次に興味深い部分です。 -あなたは、あなたのアプリケーションが必要とするパッケージを `require` セクションに追加することが出来ます。 +次に興味深い部分です。あなたは、あなたのアプリケーションが必要とするパッケージを `require` セクションに追加することが出来ます。 追加のパッケージは全て [packagist.org](https://packagist.org/) から取ってくることが出来ます。ウェブ・サイトを閲覧して、役に立つコードを探してください。 `composer.json` を修正した後、`composer update --prefer-dist` を実行し、パッケージがダウンロードされインストールされるのを待ちます。 diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 41ba0f5412..57fa5af833 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -7,7 +7,8 @@ ## Composer を使ってインストールする -[Composer](http://getcomposer.org/) を持っていない場合は、決定版ガイドの [Yii をインストールする](https://github.com/yiisoft/yii2/blob/master/docs/guide-ja/start-installation.md#installing-via-composer) のセクションの指示に従ってインストールしてください。 +[Composer](http://getcomposer.org/) を持っていない場合は、決定版ガイドの [Yii をインストールする](https://github.com/yiisoft/yii2/blob/master/docs/guide-ja/start-installation.md#installing-via-composer) +のセクションの指示に従ってインストールしてください。 Composer がインストールされていれば、次のコマンドを使ってアプリケーションをインストールすることが出来ます。 @@ -16,10 +17,12 @@ Composer がインストールされていれば、次のコマンドを使っ のコマンドは `yii-application` という名前のディレクトリにアドバンスト・アプリケーションをインストールします。 望むなら別のディレクトリ名を選ぶことも出来ます。 +Bower と NPM の依存パッケージを Composer によって管理するために [asset-packagist](https://asset-packagist.org/) を使っています。以前のバージョンのように [asset-plugin](https://packagist.org/packages/fxp/composer-asset-plugin) を使うことも出来ますが、動作は低速です。 ## アーカイブ・ファイルからインストールする -[yiiframework.com](http://www.yiiframework.com/download/) からダウンロードしたアーカイブ・ファイルをウェブ・ルートの直下、`advanced` と名付けられたディレクトリに解凍します。 +[yiiframework.com](http://www.yiiframework.com/download/) からダウンロードしたアーカイブ・ファイルをウェブ・ルートの直下、 +`advanced` と名付けられたディレクトリに解凍します。 その後は、次の項に記載されている指示に従ってください。 @@ -208,16 +211,13 @@ Composer がインストールされていれば、次のコマンドを使っ 127.0.0.1 backend.test ``` - -アプリケーションにログインするためには、最初にユーザ登録をする必要があります。 -あなたの任意のメール・アドレス、ユーザ名、パスワードを指定してください。 +アプリケーションにログインするためには、最初にユーザ登録をする必要があります。あなたの任意のメール・アドレス、ユーザ名、パスワードを指定してください。 そうすれば、同じメール・アドレスとパスワードを使って何時でもアプリケーションにログインすることが出来ます。 > Note: `/` をフロントエンド、`/admin` をバックエンドにして、アドバンスト・テンプレートを単一のドメインで走らせたい場合は、 > [共有ホスティング環境でアドバンスト・プロジェクト・テンプレートを使う](topic-shared-hosting.md) を参照して下さい。 - ## Vagrant を使ってインストールする この方法が最も簡単ですが、時間はかかります (~20分)。 @@ -247,12 +247,10 @@ Composer がインストールされていれば、次のコマンドを使っ 5. 下記のコマンドを実行する ```bash - vagrant plugin install vagrant-hostmanager vagrant up ``` -これで全部です。後はただ完了するのを待つだけです。 -完了後には、次の URL でローカルのプロジェクトにアクセスすることが出来ます。 +これで全部です。後はただ完了するのを待つだけです。完了後には、次の URL でローカルのプロジェクトにアクセスすることが出来ます。 * フロントエンド: http://y2aa-frontend.test * バックエンド: http://y2aa-backend.test @@ -269,6 +267,7 @@ Composer がインストールされていれば、次のコマンドを使っ * vagrant-local.example.yml` を `vagrant-local.yml` にコピーする 6. 作成した GitHub personal API token を `vagrant-local.yml` に置く + 7. ターミナル (`cmd.exe`) を開き、 **プロジェクトのルート・ディレクトリに移動して** 次のコマンドを実行する ```bash @@ -277,8 +276,7 @@ Composer がインストールされていれば、次のコマンドを使っ (コマンド・プロンプトでディレクトリを移動する方法については、[ここ](http://www.wikihow.com/Change-Directories-in-Command-Prompt) を読んでください) -これで全部です。後はただ完了するのを待つだけです。 -完了後には、次の URL でローカルのプロジェクトにアクセスすることが出来ます。 +これで全部です。後はただ完了するのを待つだけです。完了後には、次の URL でローカルのプロジェクトにアクセスすることが出来ます。 * フロントエンド: http://y2aa-frontend.test * バックエンド: http://y2aa-backend.test diff --git a/docs/guide-ja/start-testing.md b/docs/guide-ja/start-testing.md index 350aa449bc..f23be2f2ca 100644 --- a/docs/guide-ja/start-testing.md +++ b/docs/guide-ja/start-testing.md @@ -4,11 +4,13 @@ Yii2 アドバンスト・アプリケーションは Codeception を主たるテスト・フレームワークとして使用します。 `frontend`、`backend` および `common` の `tests` ディレクトリに、既にいくつかのサンプル・テストが用意されています。 下記の手順が動作するために、アプリケーションは `dev` 環境を使って初期化されているものとしています。 -テストを `Production` 環境で実行する必要がある場合は、`yii_test` と `yii_test.bat` が `environments/dev` からプロジェクトのルート・ディレクトリへ手作業でコピーされなければなりません。 +テストを `Production` 環境で実行する必要がある場合は、`yii_test` と `yii_test.bat` が +`environments/dev` からプロジェクトのルート・ディレクトリへ手作業でコピーされなければなりません。 テストには、テストを実行するたびに事前にクリーンアップされる **追加のデータベース** が必要になります。 (`common/config/test.php` の構成に従って) mysql に `yii2advanced_test` というデータベースを作成し、下記を実行して下さい。 + ``` ./yii_test migrate ``` @@ -29,8 +31,7 @@ vendor/bin/codecept run ![](images/tests.png) -あなたのテストを最新の状態に保つことが推奨されます。 -クラスまたは機能が削除されたときには、対応するテストも削除されるべきです。 +あなたのテストを最新の状態に保つことが推奨されます。クラスまたは機能が削除されたときには、対応するテストも削除されるべきです。 テストは定期的に実行すべきです。あるいは、もっと良い方法として、継続インテグレーション・サーバをテストのためにセットアップしましょう。 Codeception をあなたのアプリケーションのために構成する方法を学ぶために [Yii2 Framework Case Study](http://codeception.com/for/yii) を参照して下さい。 @@ -47,8 +48,7 @@ vendor/bin/codecept run -- -c common `-c` オプションが `codeception.yml` 構成ファイルへのパスをセットすることを可能にしています。 単体テスト (`unit` テスト) スイート (`common/tests/unit` にあります) では、Yii フレームワークの機能、例えば、`Yii::$app`、アクティブレコード、フィクスチャなどを使用することが出来ます。 -このことが可能なのは、テストの構成 `common/tests/unit.suite.yml` において `Yii2` モジュールが有効になっているからです。 -これを無効すると、テストを完全に独立した状態で走らせることが出来ます。 +このことが可能なのは、テストの構成 `common/tests/unit.suite.yml` において `Yii2` モジュールが有効になっているからです。これを無効すると、テストを完全に独立した状態で走らせることが出来ます。 ### Frontend @@ -76,15 +76,22 @@ vendor/bin/codecept run -- -c frontend 1. `frontend/tests/acceptance.suite.yml.example` を `frontend/tests/acceptance.suite.yml` にリネームして、スイートの構成を有効にする -2. `composer.json` の `codeception/base` パッケージを `codeception/codeception` に置き換えて、全ての機能をもつ Codeception のバージョンをインストールする +1. `composer.json` の `codeception/base` パッケージを `codeception/codeception` に置き換えて、 + 全ての機能をもつ Codeception のバージョンをインストールする -3. Composer で依存を更新する +1. Composer で依存を更新する ``` composer update ``` -4. [Selenium Server](http://www.seleniumhq.org/download/) をダウンロードして起動する +1. 受入テストのための新しいサポート・クラスを自動生成する + + ``` + vendor/bin/codecept build -- -c frontend + ``` + +1. [Selenium Server](http://www.seleniumhq.org/download/) をダウンロードして起動する ``` java -jar ~/selenium-server-standalone-x.xx.x.jar @@ -93,13 +100,13 @@ vendor/bin/codecept run -- -c frontend > Selenium でプロトコル変換を有効にする必要があります。 > `java -jar ~/selenium-server-standalone-x.xx.x.jar -enablePassThrough false` -5. ウェブ・サーバを開始する +1. ウェブ・サーバを開始する ``` php -S 127.0.0.1:8080 -t frontend/web ``` -6. これで全てのテストを実行することが出来る +1. これで全てのテストを実行することが出来る ``` vendor/bin/codecept run acceptance -- -c frontend @@ -107,8 +114,7 @@ vendor/bin/codecept run -- -c frontend ## Backend -バックエンド・アプリケーションは、単体テストと機能テストのスイートを含んでいます。 -下記によって、テスト・スイートを実行します。 +バックエンド・アプリケーションは、単体テストと機能テストのスイートを含んでいます。下記によって、テスト・スイートを実行します。 ``` vendor/bin/codecept run -- -c backend diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index 196f199749..b6552ed0b1 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -1,17 +1,13 @@ アプリケーション ================ -アドバンスト・テンプレートには三つのアプリケーションがあります。 -すなわち、フロントエンド、バックエンド、そして、コンソールです。 -フロントエンドは典型的にはエンド・ユーザに提示されるもので、プロジェクトの本体です。 -バックエンドは管理パネルや、分析などの機能です。 -コンソールは典型的にはクロン・ジョブや低レベルのサーバ管理に使用されます。 -コンソールは、また、アプリケーションの配備の際にも使われ、マイグレーションやアセットを処理します。 +アドバンスト・テンプレートには三つのアプリケーションがあります。すなわち、フロントエンド、バックエンド、そして、コンソールです。 +フロントエンドは典型的にはエンド・ユーザに提示されるもので、プロジェクトの本体です。バックエンドは管理パネルや、分析などの機能です。 +コンソールは典型的にはクロン・ジョブや低レベルのサーバ管理に使用されます。コンソールは、また、アプリケーションの配備の際にも使われ、マイグレーションやアセットを処理します。 さらに、二つ以上のアプリケーションから使われるファイル、例えば `User` モデルを含む `common` ディレクトリがあります。 フロントエンドとバックエンドは両方ともウェブ・アプリケーションであり、ともに `web` ディレクトリを含んでいます。 これがウェブ・サーバのウェブ・ルートとすべきディレクトリです。 -各アプリケーションはそれ自身の名前空間と、その名前に対応するエイリアスをもっています。 -同じことは `common` ディレクトリにも当てはまります。 +各アプリケーションはそれ自身の名前空間と、その名前に対応するエイリアスをもっています。同じことは `common` ディレクトリにも当てはまります。 diff --git a/docs/guide-ja/structure-environments.md b/docs/guide-ja/structure-environments.md index fb32cda452..5a88abb7ac 100644 --- a/docs/guide-ja/structure-environments.md +++ b/docs/guide-ja/structure-environments.md @@ -3,24 +3,20 @@ 構成情報に対する典型的なアプローチには、いくつもの問題があります。 -- チームの各メンバーは、自分自身の構成オプションを持っています。 - そのような構成をコミットすると、他のメンバーに影響を与えます。 +- チームの各メンバーは、自分自身の構成オプションを持っています。そのような構成をコミットすると、他のメンバーに影響を与えます。 - 本番のデータベースのパスワードと API キーは、レポジトリに入れるべきではありません。 - 複数のサーバ環境があります。すなわち、開発、テスト、本番などです。各サーバはそれ自身の構成情報を持たなければなりません。 - 全ての構成オプションをすべての場合について定義するのは非常に反復の多い作業であり、保守するのにも時間を取りすぎます。 これらの問題を解決するために、Yii は単純な環境の概念を導入しました。 -それぞれの環境は `environments` ディレクトリ配下の一群のファイルとして表現されます。 -`init` コマンドが環境を初期設定するのに使用されます。 +それぞれの環境は `environments` ディレクトリ配下の一群のファイルとして表現されます。`init` コマンドが環境を初期設定するのに使用されます。 `init` コマンドが実際にやっていることは、環境ディレクトリから、全てのアプリケーションがあるルート・ディレクトリへと、すべてをごっそりとコピーすることです。 -デフォルトでは二つの環境があります。すなわち、`dev` と `prod` です。 -最初のものは開発用の環境で、全ての開発ツールとデバッグが有効になっています。 +デフォルトでは二つの環境があります。すなわち、`dev` と `prod` です。最初のものは開発用の環境で、全ての開発ツールとデバッグが有効になっています。 第二のものは本番サーバ配備用の環境で、デバッグと開発ツールは無効になっています。 典型的には、環境ディレクトリは `index.php` のようなアプリケーション・ブートストラップ・ファイルや、`-local.php` という接尾辞を持つ構成情報ファイルを含んでいます。 -`environments` ディレクトリにあるローカルな構成情報は、`init` が実行された後に、 -対応するアプリケーション構成ディレクトリにコピーされるテンプレートです。 +`environments` ディレクトリにあるローカルな構成情報は、`init` が実行された後に、対応するアプリケーション構成ディレクトリにコピーされるテンプレートです。 コピーされた後に、それらがローカルな構成情報となります。 このディレクトリに置く構成情報は、データベース接続の認証情報など、秘密の環境固有設定情報を保持するためのものであり、 バージョン・コントロール・システムに入れられることを意図しないものです。 diff --git a/docs/guide-ja/structure-path-aliases.md b/docs/guide-ja/structure-path-aliases.md index 85edb32d46..8e37c1e7f8 100644 --- a/docs/guide-ja/structure-path-aliases.md +++ b/docs/guide-ja/structure-path-aliases.md @@ -14,4 +14,5 @@ - `@web` - 現在走っているウェブ・アプリケーションのベース URL。 - `@webroot` - 現在走っているウェブ・アプリケーションのウェブ・ルート・ディレクトリ。 -アドバンスト・アプリケーションのディレクトリ構造特有のエイリアス (`@common`、`@frontend`、`@backend`、`@console`) は `common/config/bootstrap.php` で定義されています。 +アドバンスト・アプリケーションのディレクトリ構造特有のエイリアス (`@common`、`@frontend`、`@backend`、`@console`) は +`common/config/bootstrap.php` で定義されています。 diff --git a/docs/guide-ja/topic-adding-more-apps.md b/docs/guide-ja/topic-adding-more-apps.md index bcf6ea2199..6a61c1a448 100644 --- a/docs/guide-ja/topic-adding-more-apps.md +++ b/docs/guide-ja/topic-adding-more-apps.md @@ -2,8 +2,7 @@ ================================ 独立したフロントエンドとバックエンドを持つのが普通ですが、時には、それでは足りない場合もあります。 -例えば、そうですね、ブログのために追加のアプリケーションが必要かも知れません。 -そのためには、 +例えば、そうですね、ブログのために追加のアプリケーションが必要かも知れません。そのためには、 1. `frontend` を `blog` に、`environments/dev/frontend` を `environments/dev/blog` に、そして、 `environments/prod/frontend` を `environments/prod/blog` にコピーします。 diff --git a/docs/guide-ja/topic-shared-hosting.md b/docs/guide-ja/topic-shared-hosting.md index 51d4a72cea..4bc1eb0ea3 100644 --- a/docs/guide-ja/topic-shared-hosting.md +++ b/docs/guide-ja/topic-shared-hosting.md @@ -3,13 +3,11 @@ アドバンスト・プロジェクト・テンプレートを共有ホストに配備するのは、ベーシック・プロジェクト・テンプレートを配備するのに比べると、少しトリッキーになります。 なぜなら、アドバンスト・アプリケーションは、共有ホストがサポートしていない二つのウェブ・ルートを持っているからです。 -ディレクトリ構造を修正して、フロントエンドの URL が `http://site.test` となり、 -バックエンドの URL が `http://site.test/admin` となるようにしなければなりません。 +ディレクトリ構造を修正して、フロントエンドの URL が `http://site.test` となり、バックエンドの URL が `http://site.test/admin` となるようにしなければなりません。 ### エントリ・スクリプトを単一のウェブ・ルートに移動する -まずは、ウェブ・ルート・ディレクトリが必要です。 -新しいディレクトリを作成して、あなたのホストのウェブ・ルートの名前に合った名前を付けて下さい。 +まずは、ウェブ・ルート・ディレクトリが必要です。新しいディレクトリを作成して、あなたのホストのウェブ・ルートの名前に合った名前を付けて下さい。 例えば、`www` や `public_html` や、そのような名前です。 そして、次のようなディレクトリ構成にします。ここで `www` は、たった今作成したホストのウェブ・ルート・ディレクトリを指します。 @@ -25,8 +23,7 @@ frontend ``` `www` が私たちのフロントエンドのディレクトリになりますので、`frontend/web` のコンテンツをこの中に移動します。 -`backend/web` のコンテンツは `www/admin` に移動します。 - どちらの場合も、index.php および index-test.php の中のパスを修正する必要があります。 +`backend/web` のコンテンツは `www/admin` に移動します。 どちらの場合も、index.php および index-test.php の中のパスを修正する必要があります。 ### セッションとクッキーを修正する From dad9edbf353df8ca3eb774900ddef461d3f123ac Mon Sep 17 00:00:00 2001 From: Krystian Date: Fri, 13 Jul 2018 14:06:48 +0200 Subject: [PATCH 025/187] Specify location of main-local.php to edit [skip ci] --- docs/guide/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index d4d128033e..e5bc2b394a 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -44,7 +44,7 @@ the installed application. You only need to do these once for all. /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All ``` -2. Create a new database and adjust the `components['db']` configuration in `common/config/main-local.php` accordingly. +2. Create a new database and adjust the `components['db']` configuration in `/path/to/yii-application/common/config/main-local.php` accordingly. 3. Open a console terminal, apply migrations with command `/path/to/php-bin/php /path/to/yii-application/yii migrate`. From cf9e472eaa8372f07046b3454a99eb26d222a556 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 19 Jul 2018 12:08:49 +0900 Subject: [PATCH 026/187] docs/guide-ja/start-installation.md updated [ci skip] (#373) --- docs/guide-ja/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 57fa5af833..8dbaec840e 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -44,7 +44,7 @@ Bower と NPM の依存パッケージを Composer によって管理するた /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All ``` -2. 新しいデータベースを作成し、それに従って `common/config/main-local.php` の `components['db']` の構成情報を修正します。 +2. 新しいデータベースを作成し、それに従って `/path/to/yii-application/common/config/main-local.php` の `components['db']` の構成情報を修正します。 3. コンソール・ターミナルを開き、`/path/to/php-bin/php /path/to/yii-application/yii migrate` というコマンドでマイグレーションを適用します。 From 5ddff57ee01c4cbc0ac2ec9bb4edbc1957bc589f Mon Sep 17 00:00:00 2001 From: teo1978 Date: Fri, 27 Jul 2018 17:17:09 +0200 Subject: [PATCH 027/187] Update start-installation.md (#375) [skip ci] Fixed inconsistency: the instructions suggested to run the `init` command and "select 'dev' as environment", but the non-interactive-mode example command had `--env=Production`. --- docs/guide/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index e5bc2b394a..07b5de9631 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -41,7 +41,7 @@ the installed application. You only need to do these once for all. If you automate it with a script you can execute `init` in non-interactive mode. ``` - /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All + /path/to/php-bin/php /path/to/yii-application/init --env=Development --overwrite=All ``` 2. Create a new database and adjust the `components['db']` configuration in `/path/to/yii-application/common/config/main-local.php` accordingly. From 9146d9ef13287f33b7b045bf9387c7c7b09c3765 Mon Sep 17 00:00:00 2001 From: Angel Guevara Date: Tue, 31 Jul 2018 04:53:12 -0500 Subject: [PATCH 028/187] Fixed cookie validation errors in Codeception tests --- backend/codeception.yml | 2 +- backend/config/.gitignore | 1 + common/codeception.yml | 2 +- common/config/.gitignore | 1 + .../dev/backend/config/codeception-local.php | 11 +++++++++++ .../dev/common/config/codeception-local.php | 16 ++++++++++++++++ environments/dev/common/config/test-local.php | 2 +- .../dev/frontend/config/codeception-local.php | 11 +++++++++++ environments/index.php | 1 + frontend/codeception.yml | 2 +- frontend/config/.gitignore | 1 + 11 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 environments/dev/backend/config/codeception-local.php create mode 100644 environments/dev/common/config/codeception-local.php create mode 100644 environments/dev/frontend/config/codeception-local.php diff --git a/backend/codeception.yml b/backend/codeception.yml index f598102ebb..98615deec3 100644 --- a/backend/codeception.yml +++ b/backend/codeception.yml @@ -12,4 +12,4 @@ settings: modules: config: Yii2: - configFile: 'config/test-local.php' + configFile: 'config/codeception-local.php' diff --git a/backend/config/.gitignore b/backend/config/.gitignore index 42799dd2b7..7c090d207f 100644 --- a/backend/config/.gitignore +++ b/backend/config/.gitignore @@ -1,3 +1,4 @@ +codeception-local.php main-local.php params-local.php test-local.php diff --git a/common/codeception.yml b/common/codeception.yml index d21394f165..74b1aaf85a 100644 --- a/common/codeception.yml +++ b/common/codeception.yml @@ -12,4 +12,4 @@ settings: modules: config: Yii2: - configFile: 'config/test-local.php' + configFile: 'config/codeception-local.php' diff --git a/common/config/.gitignore b/common/config/.gitignore index 42799dd2b7..7c090d207f 100644 --- a/common/config/.gitignore +++ b/common/config/.gitignore @@ -1,3 +1,4 @@ +codeception-local.php main-local.php params-local.php test-local.php diff --git a/environments/dev/backend/config/codeception-local.php b/environments/dev/backend/config/codeception-local.php new file mode 100644 index 0000000000..2d875dd408 --- /dev/null +++ b/environments/dev/backend/config/codeception-local.php @@ -0,0 +1,11 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], + ] +); diff --git a/environments/dev/common/config/test-local.php b/environments/dev/common/config/test-local.php index 1087688a8a..92430126e1 100644 --- a/environments/dev/common/config/test-local.php +++ b/environments/dev/common/config/test-local.php @@ -3,6 +3,6 @@ 'components' => [ 'db' => [ 'dsn' => 'mysql:host=localhost;dbname=yii2advanced_test', - ] + ], ], ]; diff --git a/environments/dev/frontend/config/codeception-local.php b/environments/dev/frontend/config/codeception-local.php new file mode 100644 index 0000000000..2d875dd408 --- /dev/null +++ b/environments/dev/frontend/config/codeception-local.php @@ -0,0 +1,11 @@ + [ 'backend/config/main-local.php', + 'common/config/codeception-local.php', 'frontend/config/main-local.php', ], ], diff --git a/frontend/codeception.yml b/frontend/codeception.yml index 73035b1015..eec855332a 100644 --- a/frontend/codeception.yml +++ b/frontend/codeception.yml @@ -12,4 +12,4 @@ settings: modules: config: Yii2: - configFile: 'config/test-local.php' + configFile: 'config/codeception-local.php' diff --git a/frontend/config/.gitignore b/frontend/config/.gitignore index 42799dd2b7..7c090d207f 100644 --- a/frontend/config/.gitignore +++ b/frontend/config/.gitignore @@ -1,3 +1,4 @@ +codeception-local.php main-local.php params-local.php test-local.php From 88c51dd06c5cee3447504ee7456d357e0dbb75e0 Mon Sep 17 00:00:00 2001 From: Angel Guevara Date: Tue, 31 Jul 2018 15:42:58 -0500 Subject: [PATCH 029/187] Fix #378 restrict phpunit to prevent BC break (#381) --- composer.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 6c666ada04..bc74d8a54c 100644 --- a/composer.json +++ b/composer.json @@ -23,8 +23,9 @@ "yiisoft/yii2-debug": "~2.0.0", "yiisoft/yii2-gii": "~2.0.0", "yiisoft/yii2-faker": "~2.0.0", - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/base": "^2.4.0", + "phpunit/phpunit": "~7.1.0", + "codeception/verify": "~1.0.0" }, "config": { "process-timeout": 1800, From 38bec6e887c8fa34be4ac124655a09c23a870ea4 Mon Sep 17 00:00:00 2001 From: Georg Spack Date: Sun, 5 Aug 2018 11:22:31 +0200 Subject: [PATCH 030/187] Replaced deprecated exception (#386) --- frontend/controllers/SiteController.php | 3 +-- frontend/models/ResetPasswordForm.php | 7 +++---- frontend/tests/unit/models/ResetPasswordFormTest.php | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/frontend/controllers/SiteController.php b/frontend/controllers/SiteController.php index d24e10742a..54a7d838e7 100644 --- a/frontend/controllers/SiteController.php +++ b/frontend/controllers/SiteController.php @@ -2,7 +2,6 @@ namespace frontend\controllers; use Yii; -use yii\base\InvalidParamException; use yii\web\BadRequestHttpException; use yii\web\Controller; use yii\filters\VerbFilter; @@ -198,7 +197,7 @@ public function actionResetPassword($token) { try { $model = new ResetPasswordForm($token); - } catch (InvalidParamException $e) { + } catch (\InvalidArgumentException $e) { throw new BadRequestHttpException($e->getMessage()); } diff --git a/frontend/models/ResetPasswordForm.php b/frontend/models/ResetPasswordForm.php index f5809867a8..a70cd91a2e 100644 --- a/frontend/models/ResetPasswordForm.php +++ b/frontend/models/ResetPasswordForm.php @@ -2,7 +2,6 @@ namespace frontend\models; use yii\base\Model; -use yii\base\InvalidParamException; use common\models\User; /** @@ -23,16 +22,16 @@ class ResetPasswordForm extends Model * * @param string $token * @param array $config name-value pairs that will be used to initialize the object properties - * @throws \yii\base\InvalidParamException if token is empty or not valid + * @throws \InvalidArgumentException if token is empty or not valid */ public function __construct($token, $config = []) { if (empty($token) || !is_string($token)) { - throw new InvalidParamException('Password reset token cannot be blank.'); + throw new \InvalidArgumentException('Password reset token cannot be blank.'); } $this->_user = User::findByPasswordResetToken($token); if (!$this->_user) { - throw new InvalidParamException('Wrong password reset token.'); + throw new \InvalidArgumentException('Wrong password reset token.'); } parent::__construct($config); } diff --git a/frontend/tests/unit/models/ResetPasswordFormTest.php b/frontend/tests/unit/models/ResetPasswordFormTest.php index f50636828a..6076dd0acb 100644 --- a/frontend/tests/unit/models/ResetPasswordFormTest.php +++ b/frontend/tests/unit/models/ResetPasswordFormTest.php @@ -25,11 +25,11 @@ public function _before() public function testResetWrongToken() { - $this->tester->expectException('yii\base\InvalidParamException', function() { + $this->tester->expectException('\InvalidArgumentException', function() { new ResetPasswordForm(''); }); - $this->tester->expectException('yii\base\InvalidParamException', function() { + $this->tester->expectException('\InvalidArgumentException', function() { new ResetPasswordForm('notexistingtoken_1391882543'); }); } From 11b8244714ffbc3b2b472252f4bf4633fb171db7 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 5 Aug 2018 19:00:19 +0300 Subject: [PATCH 031/187] Fixed exception namespace --- frontend/controllers/SiteController.php | 3 ++- frontend/models/ResetPasswordForm.php | 7 ++++--- frontend/tests/unit/models/ResetPasswordFormTest.php | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/frontend/controllers/SiteController.php b/frontend/controllers/SiteController.php index 54a7d838e7..4ea831d16b 100644 --- a/frontend/controllers/SiteController.php +++ b/frontend/controllers/SiteController.php @@ -2,6 +2,7 @@ namespace frontend\controllers; use Yii; +use yii\base\InvalidArgumentException; use yii\web\BadRequestHttpException; use yii\web\Controller; use yii\filters\VerbFilter; @@ -197,7 +198,7 @@ public function actionResetPassword($token) { try { $model = new ResetPasswordForm($token); - } catch (\InvalidArgumentException $e) { + } catch (InvalidArgumentException $e) { throw new BadRequestHttpException($e->getMessage()); } diff --git a/frontend/models/ResetPasswordForm.php b/frontend/models/ResetPasswordForm.php index a70cd91a2e..6ef7d68d77 100644 --- a/frontend/models/ResetPasswordForm.php +++ b/frontend/models/ResetPasswordForm.php @@ -1,6 +1,7 @@ _user = User::findByPasswordResetToken($token); if (!$this->_user) { - throw new \InvalidArgumentException('Wrong password reset token.'); + throw new InvalidArgumentException('Wrong password reset token.'); } parent::__construct($config); } diff --git a/frontend/tests/unit/models/ResetPasswordFormTest.php b/frontend/tests/unit/models/ResetPasswordFormTest.php index 6076dd0acb..e48944d88c 100644 --- a/frontend/tests/unit/models/ResetPasswordFormTest.php +++ b/frontend/tests/unit/models/ResetPasswordFormTest.php @@ -25,11 +25,11 @@ public function _before() public function testResetWrongToken() { - $this->tester->expectException('\InvalidArgumentException', function() { + $this->tester->expectException('\yii\base\InvalidArgumentException', function() { new ResetPasswordForm(''); }); - $this->tester->expectException('\InvalidArgumentException', function() { + $this->tester->expectException('\yii\base\InvalidArgumentException', function() { new ResetPasswordForm('notexistingtoken_1391882543'); }); } From f362444b81fbf0b58652643ad78de2a59631f313 Mon Sep 17 00:00:00 2001 From: nek Date: Fri, 7 Sep 2018 01:26:14 +0300 Subject: [PATCH 032/187] Fix PHPUnit version on Vagrant (#392) --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index bc74d8a54c..742f40caa9 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "yiisoft/yii2-gii": "~2.0.0", "yiisoft/yii2-faker": "~2.0.0", "codeception/base": "^2.4.0", - "phpunit/phpunit": "~7.1.0", + "phpunit/phpunit": "~6.5.5", "codeception/verify": "~1.0.0" }, "config": { From e67592232acc2163291e5df5a9fd856e59c72695 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Fri, 7 Sep 2018 00:41:35 +0200 Subject: [PATCH 033/187] remove publicly accessable .gitignore files (#388) fixes #324 --- .gitignore | 8 ++++++++ backend/web/.gitignore | 3 --- frontend/web/.gitignore | 3 --- 3 files changed, 8 insertions(+), 6 deletions(-) delete mode 100644 backend/web/.gitignore delete mode 100644 frontend/web/.gitignore diff --git a/.gitignore b/.gitignore index 6ce615566f..3cafba1955 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,11 @@ phpunit.phar # vagrant runtime /.vagrant + +# ignore generated files +/frontend/web/index.php +/frontend/web/index-test.php +/frontend/web/robots.txt +/backend/web/index.php +/backend/web/index-test.php +/backend/web/robots.txt diff --git a/backend/web/.gitignore b/backend/web/.gitignore deleted file mode 100644 index d94a08989c..0000000000 --- a/backend/web/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/index.php -/index-test.php -/robots.txt diff --git a/frontend/web/.gitignore b/frontend/web/.gitignore deleted file mode 100644 index d94a08989c..0000000000 --- a/frontend/web/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/index.php -/index-test.php -/robots.txt From dcb5141deb5434b8a5936cb23f0321d79d88982b Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Tue, 11 Sep 2018 18:03:34 +0900 Subject: [PATCH 034/187] docs/guide-ja/start-installation.md updated [ci skip] (#394) --- docs/guide-ja/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 8dbaec840e..7bf2406bf4 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -41,7 +41,7 @@ Bower と NPM の依存パッケージを Composer によって管理するた あるいは、本番サーバでは、非対話モードで `init` を実行します。 ``` - /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All + /path/to/php-bin/php /path/to/yii-application/init --env=Development --overwrite=All ``` 2. 新しいデータベースを作成し、それに従って `/path/to/yii-application/common/config/main-local.php` の `components['db']` の構成情報を修正します。 From 5ee2e70e9557425bb5c54d4519fdb67b42dbd03e Mon Sep 17 00:00:00 2001 From: bscheshirwork Date: Thu, 13 Sep 2018 12:19:56 +0300 Subject: [PATCH 035/187] setWritable 'console/runtime' (#396) --- environments/index.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/environments/index.php b/environments/index.php index 013f3d2f60..13e81107e5 100644 --- a/environments/index.php +++ b/environments/index.php @@ -34,6 +34,7 @@ 'setWritable' => [ 'backend/runtime', 'backend/web/assets', + 'console/runtime', 'frontend/runtime', 'frontend/web/assets', ], @@ -52,6 +53,7 @@ 'setWritable' => [ 'backend/runtime', 'backend/web/assets', + 'console/runtime', 'frontend/runtime', 'frontend/web/assets', ], From 48d761f3296dd86ad95d990c22331ce2bcbedf57 Mon Sep 17 00:00:00 2001 From: bscheshirwork Date: Sun, 23 Sep 2018 01:27:26 +0300 Subject: [PATCH 036/187] :arrow_up: (#397) --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 260c020cc8..0dd5a97229 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ php: - 5.6 - 7.0 - 7.1 + - 7.2 # - hhvm # faster builds on new travis setup not using sudo From 8f293f6d1a2ed0c9d036c0a5faf6e88c1af6e9cd Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 26 Sep 2018 23:05:20 +0900 Subject: [PATCH 037/187] docs/guide-ja/start-installation.md typo fixed [ci skip] (#398) --- docs/guide-ja/start-installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 7bf2406bf4..3153977f6a 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -14,7 +14,7 @@ Composer がインストールされていれば、次のコマンドを使っ composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application -のコマンドは `yii-application` という名前のディレクトリにアドバンスト・アプリケーションをインストールします。 +このコマンドは `yii-application` という名前のディレクトリにアドバンスト・アプリケーションをインストールします。 望むなら別のディレクトリ名を選ぶことも出来ます。 Bower と NPM の依存パッケージを Composer によって管理するために [asset-packagist](https://asset-packagist.org/) を使っています。以前のバージョンのように [asset-plugin](https://packagist.org/packages/fxp/composer-asset-plugin) を使うことも出来ますが、動作は低速です。 @@ -38,7 +38,7 @@ Bower と NPM の依存パッケージを Composer によって管理するた /path/to/php-bin/php /path/to/yii-application/init ``` - あるいは、本番サーバでは、非対話モードで `init` を実行します。 + スクリプトで自動化する場合は、非対話モードで `init` を実行します。 ``` /path/to/php-bin/php /path/to/yii-application/init --env=Development --overwrite=All From 9df3e0374590e23ffc04b4bc1fa43098d49c4463 Mon Sep 17 00:00:00 2001 From: Isitar Date: Thu, 27 Sep 2018 13:01:58 +0200 Subject: [PATCH 038/187] Added support dash separated params in php init (#399) --- init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init b/init index a7753d9572..1fa01d2df3 100755 --- a/init +++ b/init @@ -161,7 +161,7 @@ function getParams() $params = []; foreach ($rawParams as $param) { - if (preg_match('/^--(\w+)(=(.*))?$/', $param, $matches)) { + if (preg_match('/^--([\w-]*\w)(=(.*))?$/', $param, $matches)) { $name = $matches[1]; $params[$name] = isset($matches[3]) ? $matches[3] : true; } else { From 0d38cf0de98f6f3dd7e7b3718a54167529e7e3c5 Mon Sep 17 00:00:00 2001 From: Ricardo Montuan Date: Wed, 12 Dec 2018 18:03:15 -0200 Subject: [PATCH 039/187] #379 - Adjustment to prevent the execution when args are not passed properly (#402) --- init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init b/init index 1fa01d2df3..139d0898a2 100755 --- a/init +++ b/init @@ -20,7 +20,7 @@ $envNames = array_keys($envs); echo "Yii Application Initialization Tool v1.0\n\n"; $envName = null; -if (empty($params['env']) || $params['env'] === '1') { +if (empty($params['env']) || $params['env'] === true) { echo "Which environment do you want the application to be initialized in?\n\n"; foreach ($envNames as $i => $name) { echo " [$i] $name\n"; @@ -40,7 +40,7 @@ if (empty($params['env']) || $params['env'] === '1') { $envName = $params['env']; } -if (!in_array($envName, $envNames)) { +if (!in_array($envName, $envNames, true)) { $envsList = implode(', ', $envNames); echo "\n $envName is not a valid environment. Try one of the following: $envsList. \n"; exit(2); From fa751a34e4fcc40bdea09812f17db36cf977f388 Mon Sep 17 00:00:00 2001 From: Tobias Munk Date: Tue, 15 Jan 2019 18:37:04 +0100 Subject: [PATCH 040/187] Added minimal Docker setup (#347) --- backend/Dockerfile | 4 ++++ docker-compose.yml | 38 ++++++++++++++++++++++++++++++++ docs/guide/start-installation.md | 38 ++++++++++++++++++++++++++++++++ frontend/Dockerfile | 4 ++++ 4 files changed, 84 insertions(+) create mode 100644 backend/Dockerfile create mode 100644 docker-compose.yml create mode 100644 frontend/Dockerfile diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000000..380c0cd949 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,4 @@ +FROM yiisoftware/yii2-php:7.2-apache + +# Create a symlink for apache (if `/var/www/html` is available) +RUN rm -rf /var/www/html && ln -s /app/backend/web/ /var/www/html || true \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..c8ad750534 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,38 @@ +version: '3.2' + +services: + + frontend: + build: frontend + ports: + - 20080:80 + volumes: + # Re-use local composer cache via host-volume + - ~/.composer-docker/cache:/root/.composer/cache:delegated + # Mount source-code for development + - ./:/app + + backend: + build: backend + ports: + - 21080:80 + volumes: + # Re-use local composer cache via host-volume + - ~/.composer-docker/cache:/root/.composer/cache:delegated + # Mount source-code for development + - ./:/app + + mysql: + image: mysql:5.7 + environment: + - MYSQL_ROOT_PASSWORD=verysecret + - MYSQL_DATABASE=yii2advanced + - MYSQL_USER=yii2advanced + - MYSQL_PASSWORD=secret + + #pgsql: + # image: postgres:9.5 + # environment: + # - POSTGRES_DB=yii2advanced + # - POSTGRES_USER=yii2advanced + # - POSTGRES_PASSWORD=secret \ No newline at end of file diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 07b5de9631..a664aad2df 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -280,3 +280,41 @@ That's all. You just need to wait for completion! After that you can access proj * frontend: http://y2aa-frontend.test * backend: http://y2aa-backend.test + +### Installing using Docker + +Install the application dependencies + + docker-compose run --rm backend composer install + +Initialize the application by running the `init` command within a container + + docker-compose run --rm backend /app/init + +Add a database service like and adjust the components['db'] configuration in `common/config/main-local.php` accordingly. + + 'dsn' => 'mysql:host=mysql;dbname=yii2advanced', + 'username' => 'yii2advanced', + 'password' => 'secret', + +> Docker networking creates a DNS entry for the host `mysql` available from your `backend` and `frontend` containers. + +> If you want to use another database, such a Postgres, uncomment the corresponding section in `docker-compose.yml` and update your database connection. + +> 'dsn' => 'pgsql:host=pgsql;dbname=yii2advanced', + +For more information about Docker setup please visit the [guide](http://www.yiiframework.com/doc-2.0/guide-index.html). + +Run the migrations + + docker-compose run --rm backend yii migrate + +Start the application + + docker-compose up -d + +Access it in your brower by opening + +- frontend: http://127.0.0.1:20080 +- backend: http://127.0.0.1:21080 + diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000000..cf187a3e6c --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,4 @@ +FROM yiisoftware/yii2-php:7.2-apache + +# Create a symlink for apache (if `/var/www/html` is available) +RUN rm -rf /var/www/html && ln -s /app/frontend/web/ /var/www/html || true \ No newline at end of file From a9a6e44f87f3db74dc197ce085464eb88465e992 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Mon, 21 Jan 2019 00:32:04 +0900 Subject: [PATCH 041/187] docs/guide-ja/start-installation.md updated [ci skip] (#405) --- docs/guide-ja/start-installation.md | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 3153977f6a..8247b411e6 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -280,3 +280,41 @@ Bower と NPM の依存パッケージを Composer によって管理するた * フロントエンド: http://y2aa-frontend.test * バックエンド: http://y2aa-backend.test + +### Docker を使ってインストールする + +アプリケーションの依存をインストールします。 + + docker-compose run --rm backend composer install + +コンテナの中で `init` コマンドを実行することによってアプリケーションを初期化します。 + + docker-compose run --rm backend /app/init + +好みのデータベース・サービスを追加して、それに合せて `common/config/main-local.php` の 'db' コンポーネントの構成を修正します。 + + 'dsn' => 'mysql:host=mysql;dbname=yii2advanced', + 'username' => 'yii2advanced', + 'password' => 'secret', + +> Docker ネットワーキングが `backend` および `frontend` のコンテナから利用できる `mysql` というホストの DNS エントリを作成します。 + +> 別のデータベース、例えば Postgres を使いたい場合は、`docker-compose.yml` の対応するセクションのコメントを外して、データベース接続を更新して下さい。 + +> 'dsn' => 'pgsql:host=pgsql;dbname=yii2advanced', + +Docker のセットアップに関する更なる詳細は [ガイド](http://www.yiiframework.com/doc-2.0/guide-index.html) を参照して下さい。 + +マイグレーションを実行します。 + + docker-compose run --rm backend yii migrate + +アプリケーションを開始します。 + + docker-compose up -d + +ブラウザで下記を開いてアプリケーションにアクセスします。 + +- フロントエンド: http://127.0.0.1:20080 +- バックエンド: http://127.0.0.1:21080 + From f29b3eecbdc65dbcd70a7c52ecfb58f377312517 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Mon, 28 Jan 2019 00:57:21 +0300 Subject: [PATCH 042/187] Removed older PHP from tests since Codecetion isn't able to run without PHP 7 --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0dd5a97229..d62ffe591d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,6 @@ language: php php: - - 5.4 - - 5.5 - - 5.6 - 7.0 - 7.1 - 7.2 From d325ad71e0afcb17f2dfa3ebb857104ed372df7b Mon Sep 17 00:00:00 2001 From: Tobias Munk Date: Wed, 30 Jan 2019 23:11:35 +0100 Subject: [PATCH 043/187] replace document root, fixes #409 (#410) --- backend/Dockerfile | 4 ++-- frontend/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 380c0cd949..f4a98f44dc 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ FROM yiisoftware/yii2-php:7.2-apache -# Create a symlink for apache (if `/var/www/html` is available) -RUN rm -rf /var/www/html && ln -s /app/backend/web/ /var/www/html || true \ No newline at end of file +# Change document root for Apache +RUN sed -i -e 's|/app/web|/app/backend/web|g' /etc/apache2/sites-available/000-default.conf \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile index cf187a3e6c..24364f2846 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ FROM yiisoftware/yii2-php:7.2-apache -# Create a symlink for apache (if `/var/www/html` is available) -RUN rm -rf /var/www/html && ln -s /app/frontend/web/ /var/www/html || true \ No newline at end of file +# Change document root for Apache +RUN sed -i -e 's|/app/web|/app/frontend/web|g' /etc/apache2/sites-available/000-default.conf \ No newline at end of file From 88d0808a3144247cd48edcfd24d306359bb94e60 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Thu, 31 Jan 2019 01:04:53 +0100 Subject: [PATCH 044/187] release version 2.0.16 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 742f40caa9..36fec4c077 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From 246a268ec97c0af015d5ecdd6ab0e66efbe0e870 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Thu, 31 Jan 2019 01:05:15 +0100 Subject: [PATCH 045/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 36fec4c077..742f40caa9 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From 56bfe6795dce19a7532c40b7824a6af3aa11415a Mon Sep 17 00:00:00 2001 From: Alexander Kartavenko Date: Fri, 15 Feb 2019 17:14:24 +0200 Subject: [PATCH 046/187] Fix a typo (#413) Correct the command for link creation. --- requirements.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.php b/requirements.php index acc65d8e0d..1d42ec05bb 100644 --- a/requirements.php +++ b/requirements.php @@ -7,7 +7,7 @@ * * In order to run this script from the web, you should copy it to the web root. * If you are using Linux you can create a hard link instead, using the following command: - * ln ../requirements.php requirements.php + * ln ../../requirements.php requirements.php */ // you may need to adjust this path to the correct Yii framework path From b37d32508cb6af1caafbc0e9e1bee26687bae49e Mon Sep 17 00:00:00 2001 From: Alexander Kartavenko Date: Sun, 17 Feb 2019 17:33:08 +0200 Subject: [PATCH 047/187] Search for framework path in requirements.php (#412) The basic template has this block, I think it is a good idea to have it in the advanced template --- requirements.php | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/requirements.php b/requirements.php index 1d42ec05bb..17e69fbe63 100644 --- a/requirements.php +++ b/requirements.php @@ -11,13 +11,32 @@ */ // you may need to adjust this path to the correct Yii framework path -$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2'; - -if (!is_dir($frameworkPath)) { - echo '

Error

'; - echo '

The path to yii framework seems to be incorrect.

'; - echo '

You need to install Yii framework via composer or adjust the framework path in file ' . basename(__FILE__) . '.

'; - echo '

Please refer to the README on how to install Yii.

'; +// uncomment and adjust the following line if Yii is not located at the default path +//$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2'; +if (!isset($frameworkPath)) { + $searchPaths = [ + dirname(__FILE__) . '/vendor/yiisoft/yii2', + dirname(__FILE__) . '/../../vendor/yiisoft/yii2', + ]; + foreach ($searchPaths as $path) { + if (is_dir($path)) { + $frameworkPath = $path; + break; + } + } +} +if (!isset($frameworkPath) || !is_dir($frameworkPath)) { + $message = "

Error

\n\n" + . "

The path to yii framework seems to be incorrect.

\n" + . '

You need to install Yii framework via composer or adjust the framework path in file ' . basename(__FILE__) . ".

\n" + . '

Please refer to the README on how to install Yii.

\n"; + if (!empty($_SERVER['argv'])) { + // do not print HTML when used in console mode + echo strip_tags($message); + } else { + echo $message; + } + exit(1); } require_once $frameworkPath . '/requirements/YiiRequirementChecker.php'; From 8aa58a324cda70163513c8778c62f9ebeda96462 Mon Sep 17 00:00:00 2001 From: MaximAL Date: Wed, 6 Mar 2019 17:37:23 +0300 Subject: [PATCH 048/187] Make requirements checker return error if there were failed checks (#415) --- requirements.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/requirements.php b/requirements.php index 17e69fbe63..9b64ed45d2 100644 --- a/requirements.php +++ b/requirements.php @@ -148,4 +148,8 @@ 'memo' => 'PHP mail SMTP server required', ), ); -$requirementsChecker->checkYii()->check($requirements)->render(); + +$result = $requirementsChecker->checkYii()->check($requirements)->getResult(); +$requirementsChecker->render(); + +exit($result['summary']['errors'] === 0 ? 0 : 1); From 4bdc50648cba963567136108c93a392714cd5f9b Mon Sep 17 00:00:00 2001 From: Craig London Date: Fri, 22 Mar 2019 11:24:14 -0400 Subject: [PATCH 049/187] master: Update composer.json to use Yii2 Debug & Gii v2.1.0 (#419) --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 742f40caa9..f512ed06a7 100644 --- a/composer.json +++ b/composer.json @@ -20,8 +20,8 @@ "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", "codeception/base": "^2.4.0", "phpunit/phpunit": "~6.5.5", From ea7f9f59a55ff20e8595dc81867290723764451a Mon Sep 17 00:00:00 2001 From: rNiedzwiecki <7619981+rNiedzwiecki@users.noreply.github.com> Date: Fri, 22 Mar 2019 21:51:47 +0100 Subject: [PATCH 050/187] Fixed #384: Added email confirmation (#408) --- common/mail/emailVerify-html.php | 15 ++++ common/mail/emailVerify-text.php | 12 +++ common/models/User.php | 24 +++++- ...erification_token_column_to_user_table.php | 16 ++++ frontend/controllers/SiteController.php | 57 +++++++++++-- .../models/ResendVerificationEmailForm.php | 61 ++++++++++++++ frontend/models/SignupForm.php | 27 +++++- frontend/models/VerifyEmailForm.php | 51 +++++++++++ frontend/tests/_data/login_data.php | 11 +++ frontend/tests/_data/user.php | 22 +++++ frontend/tests/functional/LoginCest.php | 6 ++ .../ResendVerificationEmailCest.php | 82 ++++++++++++++++++ frontend/tests/functional/SignupCest.php | 4 +- frontend/tests/functional/VerifyEmailCest.php | 69 +++++++++++++++ .../ResendVerificationEmailFormTest.php | 84 +++++++++++++++++++ frontend/tests/unit/models/SignupFormTest.php | 20 ++++- .../tests/unit/models/VerifyEmailFormTest.php | 55 ++++++++++++ frontend/views/site/login.php | 2 + .../views/site/resendVerificationEmail.php | 30 +++++++ 19 files changed, 632 insertions(+), 16 deletions(-) create mode 100644 common/mail/emailVerify-html.php create mode 100644 common/mail/emailVerify-text.php create mode 100644 console/migrations/m190124_110200_add_verification_token_column_to_user_table.php create mode 100644 frontend/models/ResendVerificationEmailForm.php create mode 100644 frontend/models/VerifyEmailForm.php create mode 100644 frontend/tests/functional/ResendVerificationEmailCest.php create mode 100644 frontend/tests/functional/VerifyEmailCest.php create mode 100644 frontend/tests/unit/models/ResendVerificationEmailFormTest.php create mode 100644 frontend/tests/unit/models/VerifyEmailFormTest.php create mode 100644 frontend/views/site/resendVerificationEmail.php diff --git a/common/mail/emailVerify-html.php b/common/mail/emailVerify-html.php new file mode 100644 index 0000000000..dd63de61b8 --- /dev/null +++ b/common/mail/emailVerify-html.php @@ -0,0 +1,15 @@ +urlManager->createAbsoluteUrl(['site/verify-email', 'token' => $user->verification_token]); +?> +
+

Hello username) ?>,

+ +

Follow the link below to verify your email:

+ +

+
diff --git a/common/mail/emailVerify-text.php b/common/mail/emailVerify-text.php new file mode 100644 index 0000000000..bcc61de509 --- /dev/null +++ b/common/mail/emailVerify-text.php @@ -0,0 +1,12 @@ +urlManager->createAbsoluteUrl(['site/verify-email', 'token' => $user->verification_token]); +?> +Hello username ?>, + +Follow the link below to verify your email: + + diff --git a/common/models/User.php b/common/models/User.php index e1f39cb6f3..5df97661e8 100644 --- a/common/models/User.php +++ b/common/models/User.php @@ -14,6 +14,7 @@ * @property string $username * @property string $password_hash * @property string $password_reset_token + * @property string $verification_token * @property string $email * @property string $auth_key * @property integer $status @@ -24,6 +25,7 @@ class User extends ActiveRecord implements IdentityInterface { const STATUS_DELETED = 0; + const STATUS_INACTIVE = 9; const STATUS_ACTIVE = 10; @@ -51,8 +53,8 @@ public function behaviors() public function rules() { return [ - ['status', 'default', 'value' => self::STATUS_ACTIVE], - ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], + ['status', 'default', 'value' => self::STATUS_INACTIVE], + ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_INACTIVE, self::STATUS_DELETED]], ]; } @@ -101,6 +103,19 @@ public static function findByPasswordResetToken($token) ]); } + /** + * Finds user by verification email token + * + * @param string $token verify email token + * @return static|null + */ + public static function findByVerificationToken($token) { + return static::findOne([ + 'verification_token' => $token, + 'status' => self::STATUS_INACTIVE + ]); + } + /** * Finds out if password reset token is valid * @@ -179,6 +194,11 @@ public function generatePasswordResetToken() $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); } + public function generateEmailVerificationToken() + { + $this->verification_token = Yii::$app->security->generateRandomString() . '_' . time(); + } + /** * Removes password reset token */ diff --git a/console/migrations/m190124_110200_add_verification_token_column_to_user_table.php b/console/migrations/m190124_110200_add_verification_token_column_to_user_table.php new file mode 100644 index 0000000000..42043fdbb5 --- /dev/null +++ b/console/migrations/m190124_110200_add_verification_token_column_to_user_table.php @@ -0,0 +1,16 @@ +addColumn('{{user}}', 'verification_token', $this->string()->defaultValue(null)); + } + + public function down() + { + $this->dropColumn('{{user}}', 'verification_token'); + } +} diff --git a/frontend/controllers/SiteController.php b/frontend/controllers/SiteController.php index 4ea831d16b..a87f0e80d5 100644 --- a/frontend/controllers/SiteController.php +++ b/frontend/controllers/SiteController.php @@ -1,6 +1,8 @@ load(Yii::$app->request->post())) { - if ($user = $model->signup()) { - if (Yii::$app->getUser()->login($user)) { - return $this->goHome(); - } - } + if ($model->load(Yii::$app->request->post()) && $model->signup()) { + Yii::$app->session->setFlash('success', 'Thank you for registration. Please check your inbox for verification email.'); + return $this->goHome(); } return $this->render('signup', [ @@ -212,4 +211,50 @@ public function actionResetPassword($token) 'model' => $model, ]); } + + /** + * Verify email address + * + * @param string $token + * @throws BadRequestHttpException + * @return yii\web\Response + */ + public function actionVerifyEmail($token) + { + try { + $model = new VerifyEmailForm($token); + } catch (InvalidArgumentException $e) { + throw new BadRequestHttpException($e->getMessage()); + } + if ($user = $model->verifyEmail()) { + if (Yii::$app->user->login($user)) { + Yii::$app->session->setFlash('success', 'Your email has been confirmed!'); + return $this->goHome(); + } + } + + Yii::$app->session->setFlash('error', 'Sorry, we are unable to verify your account with provided token.'); + return $this->goHome(); + } + + /** + * Resend verification email + * + * @return mixed + */ + public function actionResendVerificationEmail() + { + $model = new ResendVerificationEmailForm(); + if ($model->load(Yii::$app->request->post()) && $model->validate()) { + if ($model->sendEmail()) { + Yii::$app->session->setFlash('success', 'Check your email for further instructions.'); + return $this->goHome(); + } + Yii::$app->session->setFlash('error', 'Sorry, we are unable to resend verification email for the provided email address.'); + } + + return $this->render('resendVerificationEmail', [ + 'model' => $model + ]); + } } diff --git a/frontend/models/ResendVerificationEmailForm.php b/frontend/models/ResendVerificationEmailForm.php new file mode 100644 index 0000000000..51f9457e29 --- /dev/null +++ b/frontend/models/ResendVerificationEmailForm.php @@ -0,0 +1,61 @@ + '\common\models\User', + 'filter' => ['status' => User::STATUS_INACTIVE], + 'message' => 'There is no user with this email address.' + ], + ]; + } + + /** + * Sends confirmation email to user + * + * @return bool whether the email was sent + */ + public function sendEmail() + { + $user = User::findOne([ + 'email' => $this->email, + 'status' => User::STATUS_INACTIVE + ]); + + if ($user === null) { + return false; + } + + return Yii::$app + ->mailer + ->compose( + ['html' => 'emailVerify-html', 'text' => 'emailVerify-text'], + ['user' => $user] + ) + ->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name . ' robot']) + ->setTo($this->email) + ->setSubject('Account registration at ' . Yii::$app->name) + ->send(); + } +} diff --git a/frontend/models/SignupForm.php b/frontend/models/SignupForm.php index a66a87570e..f1e276bfe2 100644 --- a/frontend/models/SignupForm.php +++ b/frontend/models/SignupForm.php @@ -1,6 +1,7 @@ email = $this->email; $user->setPassword($this->password); $user->generateAuthKey(); - - return $user->save() ? $user : null; + $user->generateEmailVerificationToken(); + return $user->save() && $this->sendEmail($user); + + } + + /** + * Sends confirmation email to user + * @param User $user user model to with email should be send + * @return bool whether the email was sent + */ + protected function sendEmail($user) + { + return Yii::$app + ->mailer + ->compose( + ['html' => 'emailVerify-html', 'text' => 'emailVerify-text'], + ['user' => $user] + ) + ->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name . ' robot']) + ->setTo($this->email) + ->setSubject('Account registration at ' . Yii::$app->name) + ->send(); } } diff --git a/frontend/models/VerifyEmailForm.php b/frontend/models/VerifyEmailForm.php new file mode 100644 index 0000000000..06462e6ae0 --- /dev/null +++ b/frontend/models/VerifyEmailForm.php @@ -0,0 +1,51 @@ +_user = User::findByVerificationToken($token); + if (!$this->_user) { + throw new InvalidArgumentException('Wrong verify email token.'); + } + parent::__construct($config); + } + + /** + * Verify email + * + * @return User|null the saved model or null if saving fails + */ + public function verifyEmail() + { + $user = $this->_user; + $user->status = User::STATUS_ACTIVE; + return $user->save(false) ? $user : null; + } +} diff --git a/frontend/tests/_data/login_data.php b/frontend/tests/_data/login_data.php index 32aef6ea36..2f1fdce18d 100644 --- a/frontend/tests/_data/login_data.php +++ b/frontend/tests/_data/login_data.php @@ -10,4 +10,15 @@ 'updated_at' => '1392559490', 'email' => 'sfriesen@jenkins.info', ], + [ + 'username' => 'test.test', + 'auth_key' => 'O87GkY3_UfmMHYkyezZ7QLfmkKNsllzT', + // Test1234 + 'password_hash' => 'O87GkY3_UfmMHYkyezZ7QLfmkKNsllzT', + 'email' => 'test@mail.com', + 'status' => '9', + 'created_at' => '1548675330', + 'updated_at' => '1548675330', + 'verification_token' => '4ch0qbfhvWwkcuWqjN8SWRq72SOw1KYT_1548675330', + ], ]; diff --git a/frontend/tests/_data/user.php b/frontend/tests/_data/user.php index 3670e09cce..0b94332961 100644 --- a/frontend/tests/_data/user.php +++ b/frontend/tests/_data/user.php @@ -20,4 +20,26 @@ 'email' => 'nicolas.dianna@hotmail.com', 'status' => '0', ], + [ + 'username' => 'test.test', + 'auth_key' => 'O87GkY3_UfmMHYkyezZ7QLfmkKNsllzT', + //Test1234 + 'password_hash' => '$2y$13$d17z0w/wKC4LFwtzBcmx6up4jErQuandJqhzKGKczfWuiEhLBtQBK', + 'email' => 'test@mail.com', + 'status' => '9', + 'created_at' => '1548675330', + 'updated_at' => '1548675330', + 'verification_token' => '4ch0qbfhvWwkcuWqjN8SWRq72SOw1KYT_1548675330', + ], + [ + 'username' => 'test2.test', + 'auth_key' => '4XXdVqi3rDpa_a6JH6zqVreFxUPcUPvJ', + //Test1234 + 'password_hash' => '$2y$13$d17z0w/wKC4LFwtzBcmx6up4jErQuandJqhzKGKczfWuiEhLBtQBK', + 'email' => 'test2@mail.com', + 'status' => '10', + 'created_at' => '1548675330', + 'updated_at' => '1548675330', + 'verification_token' => 'already_used_token_1548675330', + ], ]; diff --git a/frontend/tests/functional/LoginCest.php b/frontend/tests/functional/LoginCest.php index df91a8ef35..5b2688119a 100644 --- a/frontend/tests/functional/LoginCest.php +++ b/frontend/tests/functional/LoginCest.php @@ -50,6 +50,12 @@ public function checkWrongPassword(FunctionalTester $I) $I->seeValidationError('Incorrect username or password.'); } + public function checkInactiveAccount(FunctionalTester $I) + { + $I->submitForm('#login-form', $this->formParams('test.test', 'Test1234')); + $I->seeValidationError('Incorrect username or password'); + } + public function checkValidLogin(FunctionalTester $I) { $I->submitForm('#login-form', $this->formParams('erau', 'password_0')); diff --git a/frontend/tests/functional/ResendVerificationEmailCest.php b/frontend/tests/functional/ResendVerificationEmailCest.php new file mode 100644 index 0000000000..a2a8dda1ec --- /dev/null +++ b/frontend/tests/functional/ResendVerificationEmailCest.php @@ -0,0 +1,82 @@ + [ + 'class' => UserFixture::className(), + 'dataFile' => codecept_data_dir() . 'user.php', + ], + ]; + } + + public function _before(FunctionalTester $I) + { + $I->amOnRoute('/site/resend-verification-email'); + } + + protected function formParams($email) + { + return [ + 'ResendVerificationEmailForm[email]' => $email + ]; + } + + public function checkPage(FunctionalTester $I) + { + $I->see('Resend verification email', 'h1'); + $I->see('Please fill out your email. A verification email will be sent there.'); + } + + public function checkEmptyField(FunctionalTester $I) + { + $I->submitForm($this->formId, $this->formParams('')); + $I->seeValidationError('Email cannot be blank.'); + } + + public function checkWrongEmailFormat(FunctionalTester $I) + { + $I->submitForm($this->formId, $this->formParams('abcd.com')); + $I->seeValidationError('Email is not a valid email address.'); + } + + public function checkWrongEmail(FunctionalTester $I) + { + $I->submitForm($this->formId, $this->formParams('wrong@email.com')); + $I->seeValidationError('There is no user with this email address.'); + } + + public function checkAlreadyVerifiedEmail(FunctionalTester $I) + { + $I->submitForm($this->formId, $this->formParams('test2@mail.com')); + $I->seeValidationError('There is no user with this email address.'); + } + + public function checkSendSuccessfully(FunctionalTester $I) + { + $I->submitForm($this->formId, $this->formParams('test@mail.com')); + $I->canSeeEmailIsSent(); + $I->seeRecord('common\models\User', [ + 'email' => 'test@mail.com', + 'username' => 'test.test', + 'status' => \common\models\User::STATUS_INACTIVE + ]); + $I->see('Check your email for further instructions.'); + } +} diff --git a/frontend/tests/functional/SignupCest.php b/frontend/tests/functional/SignupCest.php index 8cfde9a364..ae35d8a952 100644 --- a/frontend/tests/functional/SignupCest.php +++ b/frontend/tests/functional/SignupCest.php @@ -50,8 +50,10 @@ public function signupSuccessfully(FunctionalTester $I) $I->seeRecord('common\models\User', [ 'username' => 'tester', 'email' => 'tester.email@example.com', + 'status' => \common\models\User::STATUS_INACTIVE ]); - $I->see('Logout (tester)', 'form button[type=submit]'); + $I->seeEmailIsSent(); + $I->see('Thank you for registration. Please check your inbox for verification email.'); } } diff --git a/frontend/tests/functional/VerifyEmailCest.php b/frontend/tests/functional/VerifyEmailCest.php new file mode 100644 index 0000000000..2a0d554e30 --- /dev/null +++ b/frontend/tests/functional/VerifyEmailCest.php @@ -0,0 +1,69 @@ + [ + 'class' => UserFixture::className(), + 'dataFile' => codecept_data_dir() . 'user.php', + ], + ]; + } + + public function checkEmptyToken(FunctionalTester $I) + { + $I->amOnRoute('site/verify-email', ['token' => '']); + $I->canSee('Bad Request', 'h1'); + $I->canSee('Verify email token cannot be blank.'); + } + + public function checkInvalidToken(FunctionalTester $I) + { + $I->amOnRoute('site/verify-email', ['token' => 'wrong_token']); + $I->canSee('Bad Request', 'h1'); + $I->canSee('Wrong verify email token.'); + } + + public function checkNoToken(FunctionalTester $I) + { + $I->amOnRoute('site/verify-email'); + $I->canSee('Bad Request', 'h1'); + $I->canSee('Missing required parameters: token'); + } + + public function checkAlreadyActivatedToken(FunctionalTester $I) + { + $I->amOnRoute('site/verify-email', ['token' => 'already_used_token_1548675330']); + $I->canSee('Bad Request', 'h1'); + $I->canSee('Wrong verify email token.'); + } + + public function checkSuccessVerification(FunctionalTester $I) + { + $I->amOnRoute('site/verify-email', ['token' => '4ch0qbfhvWwkcuWqjN8SWRq72SOw1KYT_1548675330']); + $I->canSee('Your email has been confirmed!'); + $I->canSee('Congratulations!', 'h1'); + $I->see('Logout (test.test)', 'form button[type=submit]'); + + $I->seeRecord('common\models\User', [ + 'username' => 'test.test', + 'email' => 'test@mail.com', + 'status' => \common\models\User::STATUS_ACTIVE + ]); + } +} diff --git a/frontend/tests/unit/models/ResendVerificationEmailFormTest.php b/frontend/tests/unit/models/ResendVerificationEmailFormTest.php new file mode 100644 index 0000000000..fc1835de9a --- /dev/null +++ b/frontend/tests/unit/models/ResendVerificationEmailFormTest.php @@ -0,0 +1,84 @@ +tester->haveFixtures([ + 'user' => [ + 'class' => UserFixture::className(), + 'dataFile' => codecept_data_dir() . 'user.php' + ] + ]); + } + + public function testWrongEmailAddress() + { + $model = new ResendVerificationEmailForm(); + $model->attributes = [ + 'email' => 'aaa@bbb.cc' + ]; + + expect($model->validate())->false(); + expect($model->hasErrors())->true(); + expect($model->getFirstError('email'))->equals('There is no user with this email address.'); + } + + public function testEmptyEmailAddress() + { + $model = new ResendVerificationEmailForm(); + $model->attributes = [ + 'email' => '' + ]; + + expect($model->validate())->false(); + expect($model->hasErrors())->true(); + expect($model->getFirstError('email'))->equals('Email cannot be blank.'); + } + + public function testResendToActiveUser() + { + $model = new ResendVerificationEmailForm(); + $model->attributes = [ + 'email' => 'test2@mail.com' + ]; + + expect($model->validate())->false(); + expect($model->hasErrors())->true(); + expect($model->getFirstError('email'))->equals('There is no user with this email address.'); + } + + public function testSuccessfullyResend() + { + $model = new ResendVerificationEmailForm(); + $model->attributes = [ + 'email' => 'test@mail.com' + ]; + + expect($model->validate())->true(); + expect($model->hasErrors())->false(); + + expect($model->sendEmail())->true(); + $this->tester->seeEmailIsSent(); + + $mail = $this->tester->grabLastSentEmail(); + + expect('valid email is sent', $mail)->isInstanceOf('yii\mail\MessageInterface'); + expect($mail->getTo())->hasKey('test@mail.com'); + expect($mail->getFrom())->hasKey(\Yii::$app->params['supportEmail']); + expect($mail->getSubject())->equals('Account registration at ' . \Yii::$app->name); + expect($mail->toString())->contains('4ch0qbfhvWwkcuWqjN8SWRq72SOw1KYT_1548675330'); + } +} diff --git a/frontend/tests/unit/models/SignupFormTest.php b/frontend/tests/unit/models/SignupFormTest.php index eb9b61c126..46423a441c 100644 --- a/frontend/tests/unit/models/SignupFormTest.php +++ b/frontend/tests/unit/models/SignupFormTest.php @@ -31,12 +31,24 @@ public function testCorrectSignup() ]); $user = $model->signup(); + expect($user)->true(); - expect($user)->isInstanceOf('common\models\User'); + /** @var \common\models\User $user */ + $user = $this->tester->grabRecord('common\models\User', [ + 'username' => 'some_username', + 'email' => 'some_email@example.com', + 'status' => \common\models\User::STATUS_INACTIVE + ]); + + $this->tester->seeEmailIsSent(); + + $mail = $this->tester->grabLastSentEmail(); - expect($user->username)->equals('some_username'); - expect($user->email)->equals('some_email@example.com'); - expect($user->validatePassword('some_password'))->true(); + expect($mail)->isInstanceOf('yii\mail\MessageInterface'); + expect($mail->getTo())->hasKey('some_email@example.com'); + expect($mail->getFrom())->hasKey(\Yii::$app->params['supportEmail']); + expect($mail->getSubject())->equals('Account registration at ' . \Yii::$app->name); + expect($mail->toString())->contains($user->verification_token); } public function testNotCorrectSignup() diff --git a/frontend/tests/unit/models/VerifyEmailFormTest.php b/frontend/tests/unit/models/VerifyEmailFormTest.php new file mode 100644 index 0000000000..6a9150e896 --- /dev/null +++ b/frontend/tests/unit/models/VerifyEmailFormTest.php @@ -0,0 +1,55 @@ +tester->haveFixtures([ + 'user' => [ + 'class' => UserFixture::className(), + 'dataFile' => codecept_data_dir() . 'user.php' + ] + ]); + } + + public function testVerifyWrongToken() + { + $this->tester->expectException('\yii\base\InvalidArgumentException', function() { + new VerifyEmailForm(''); + }); + + $this->tester->expectException('\yii\base\InvalidArgumentException', function() { + new VerifyEmailForm('notexistingtoken_1391882543'); + }); + } + + public function testAlreadyActivatedToken() + { + $this->tester->expectException('\yii\base\InvalidArgumentException', function() { + new VerifyEmailForm('already_used_token_1548675330'); + }); + } + + public function testVerifyCorrectToken() + { + $model = new VerifyEmailForm('4ch0qbfhvWwkcuWqjN8SWRq72SOw1KYT_1548675330'); + $user = $model->verifyEmail(); + expect($user)->isInstanceOf('common\models\User'); + + expect($user->username)->equals('test.test'); + expect($user->email)->equals('test@mail.com'); + expect($user->status)->equals(\common\models\User::STATUS_ACTIVE); + expect($user->validatePassword('Test1234'))->true(); + } +} diff --git a/frontend/views/site/login.php b/frontend/views/site/login.php index 56ea98e1b4..61d477af0f 100644 --- a/frontend/views/site/login.php +++ b/frontend/views/site/login.php @@ -27,6 +27,8 @@
If you forgot your password you can . +
+ Need new verification email?
diff --git a/frontend/views/site/resendVerificationEmail.php b/frontend/views/site/resendVerificationEmail.php new file mode 100644 index 0000000000..84fc64a74a --- /dev/null +++ b/frontend/views/site/resendVerificationEmail.php @@ -0,0 +1,30 @@ +title = 'Resend verification email'; +$this->params['breadcrumbs'][] = $this->title; +?> +
+

title) ?>

+ +

Please fill out your email. A verification email will be sent there.

+ +
+
+ 'resend-verification-email-form']); ?> + + field($model, 'email')->textInput(['autofocus' => true]) ?> + +
+ 'btn btn-primary']) ?> +
+ + +
+
+
From 82a80a91719a2db59c776f5732050e12ff87d268 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 23 Mar 2019 00:13:07 +0300 Subject: [PATCH 051/187] Fixed browser-kit dependency to make Codeception work well --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f512ed06a7..d64092fd8f 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,8 @@ "yiisoft/yii2-faker": "~2.0.0", "codeception/base": "^2.4.0", "phpunit/phpunit": "~6.5.5", - "codeception/verify": "~1.0.0" + "codeception/verify": "~1.0.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { "process-timeout": 1800, From dc2830f00c70f55977e40e344a945a38f04422c3 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 23 Mar 2019 00:43:11 +0300 Subject: [PATCH 052/187] release version 2.0.17 --- composer.json | 2 +- frontend/models/ResendVerificationEmailForm.php | 1 + frontend/models/VerifyEmailForm.php | 1 + frontend/tests/functional/ResendVerificationEmailCest.php | 1 + frontend/tests/functional/VerifyEmailCest.php | 1 - frontend/tests/unit/models/ResendVerificationEmailFormTest.php | 1 + frontend/tests/unit/models/VerifyEmailFormTest.php | 2 +- 7 files changed, 6 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index d64092fd8f..a5a71b2101 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", diff --git a/frontend/models/ResendVerificationEmailForm.php b/frontend/models/ResendVerificationEmailForm.php index 51f9457e29..e4ce9cbf3a 100644 --- a/frontend/models/ResendVerificationEmailForm.php +++ b/frontend/models/ResendVerificationEmailForm.php @@ -14,6 +14,7 @@ class ResendVerificationEmailForm extends Model */ public $email; + /** * {@inheritdoc} */ diff --git a/frontend/models/VerifyEmailForm.php b/frontend/models/VerifyEmailForm.php index 06462e6ae0..0740746765 100644 --- a/frontend/models/VerifyEmailForm.php +++ b/frontend/models/VerifyEmailForm.php @@ -18,6 +18,7 @@ class VerifyEmailForm extends Model */ private $_user; + /** * Creates a form model with given token. * diff --git a/frontend/tests/functional/ResendVerificationEmailCest.php b/frontend/tests/functional/ResendVerificationEmailCest.php index a2a8dda1ec..431d8ec956 100644 --- a/frontend/tests/functional/ResendVerificationEmailCest.php +++ b/frontend/tests/functional/ResendVerificationEmailCest.php @@ -9,6 +9,7 @@ class ResendVerificationEmailCest { protected $formId = '#resend-verification-email-form'; + /** * Load fixtures before db transaction begin * Called in _before() diff --git a/frontend/tests/functional/VerifyEmailCest.php b/frontend/tests/functional/VerifyEmailCest.php index 2a0d554e30..cc62a5e9cb 100644 --- a/frontend/tests/functional/VerifyEmailCest.php +++ b/frontend/tests/functional/VerifyEmailCest.php @@ -7,7 +7,6 @@ class VerifyEmailCest { - /** * Load fixtures before db transaction begin * Called in _before() diff --git a/frontend/tests/unit/models/ResendVerificationEmailFormTest.php b/frontend/tests/unit/models/ResendVerificationEmailFormTest.php index fc1835de9a..bbfb4e2959 100644 --- a/frontend/tests/unit/models/ResendVerificationEmailFormTest.php +++ b/frontend/tests/unit/models/ResendVerificationEmailFormTest.php @@ -14,6 +14,7 @@ class ResendVerificationEmailFormTest extends Unit */ protected $tester; + public function _before() { $this->tester->haveFixtures([ diff --git a/frontend/tests/unit/models/VerifyEmailFormTest.php b/frontend/tests/unit/models/VerifyEmailFormTest.php index 6a9150e896..2ab7533ca0 100644 --- a/frontend/tests/unit/models/VerifyEmailFormTest.php +++ b/frontend/tests/unit/models/VerifyEmailFormTest.php @@ -7,12 +7,12 @@ class VerifyEmailFormTest extends \Codeception\Test\Unit { - /** * @var \frontend\tests\UnitTester */ protected $tester; + public function _before() { $this->tester->haveFixtures([ From 6a1a049517467a18d02618e0a774f053682d6327 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 23 Mar 2019 00:43:29 +0300 Subject: [PATCH 053/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a5a71b2101..d64092fd8f 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From 7e80fb3aac5d778b72d9f926005187f1a2e647ff Mon Sep 17 00:00:00 2001 From: Andrey Leontev Date: Sun, 24 Mar 2019 15:30:53 +0300 Subject: [PATCH 054/187] Fix default migration with 'tablePrefix' (#420) [skip ci] --- ...124_110200_add_verification_token_column_to_user_table.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/console/migrations/m190124_110200_add_verification_token_column_to_user_table.php b/console/migrations/m190124_110200_add_verification_token_column_to_user_table.php index 42043fdbb5..4a20dc719f 100644 --- a/console/migrations/m190124_110200_add_verification_token_column_to_user_table.php +++ b/console/migrations/m190124_110200_add_verification_token_column_to_user_table.php @@ -6,11 +6,11 @@ class m190124_110200_add_verification_token_column_to_user_table extends Migrati { public function up() { - $this->addColumn('{{user}}', 'verification_token', $this->string()->defaultValue(null)); + $this->addColumn('{{%user}}', 'verification_token', $this->string()->defaultValue(null)); } public function down() { - $this->dropColumn('{{user}}', 'verification_token'); + $this->dropColumn('{{%user}}', 'verification_token'); } } From 4772be3dab032520d40086c5472c59fab24935ef Mon Sep 17 00:00:00 2001 From: MaximAL Date: Sun, 24 Mar 2019 16:32:31 +0300 Subject: [PATCH 055/187] Old array syntax in requirement checker (could be run in PHP prior to 5.4) (#421) --- requirements.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.php b/requirements.php index 9b64ed45d2..67b344bbf3 100644 --- a/requirements.php +++ b/requirements.php @@ -14,10 +14,10 @@ // uncomment and adjust the following line if Yii is not located at the default path //$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2'; if (!isset($frameworkPath)) { - $searchPaths = [ + $searchPaths = array( dirname(__FILE__) . '/vendor/yiisoft/yii2', dirname(__FILE__) . '/../../vendor/yiisoft/yii2', - ]; + ); foreach ($searchPaths as $path) { if (is_dir($path)) { $frameworkPath = $path; From bde11637da2b4b01be6497ca9e7f75db03ff5f77 Mon Sep 17 00:00:00 2001 From: Boris Zabolotskikh Date: Tue, 26 Mar 2019 19:24:02 +0700 Subject: [PATCH 056/187] Fix grammatical error (#423) [skip ci] --- docs/guide/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index a664aad2df..0b5fcd95c4 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -313,7 +313,7 @@ Start the application docker-compose up -d -Access it in your brower by opening +Access it in your browser by opening - frontend: http://127.0.0.1:20080 - backend: http://127.0.0.1:21080 From d2d6db52c6dbacb32d2a2ae41ac04fed86a45614 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 23 Apr 2019 15:12:54 +0300 Subject: [PATCH 057/187] Fixes #426: Adjusted contact form email headers --- common/config/params.php | 2 ++ frontend/models/ContactForm.php | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/common/config/params.php b/common/config/params.php index 4ec9ba6d00..b18cb955cc 100644 --- a/common/config/params.php +++ b/common/config/params.php @@ -2,5 +2,7 @@ return [ 'adminEmail' => 'admin@example.com', 'supportEmail' => 'support@example.com', + 'senderEmail' => 'noreply@example.com', + 'senderName' => 'Example.com mailer', 'user.passwordResetTokenExpire' => 3600, ]; diff --git a/frontend/models/ContactForm.php b/frontend/models/ContactForm.php index 8c00d47011..1dd419cadb 100644 --- a/frontend/models/ContactForm.php +++ b/frontend/models/ContactForm.php @@ -52,7 +52,8 @@ public function sendEmail($email) { return Yii::$app->mailer->compose() ->setTo($email) - ->setFrom([$this->email => $this->name]) + ->setFrom([Yii::$app->params['senderEmail'] => Yii::$app->params['senderName']]) + ->setReplyTo([$this->email => $this->name]) ->setSubject($this->subject) ->setTextBody($this->body) ->send(); From c514edd56b5fda151ef66ca472ba11d68185ebe3 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 23 Apr 2019 15:29:25 +0300 Subject: [PATCH 058/187] Fixed contact form test --- frontend/tests/unit/models/ContactFormTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/tests/unit/models/ContactFormTest.php b/frontend/tests/unit/models/ContactFormTest.php index acdf9db549..dff13e33ae 100644 --- a/frontend/tests/unit/models/ContactFormTest.php +++ b/frontend/tests/unit/models/ContactFormTest.php @@ -1,8 +1,8 @@ tester->seeEmailIsSent(); + /** @var MessageInterface $emailMessage */ $emailMessage = $this->tester->grabLastSentEmail(); expect('valid email is sent', $emailMessage)->isInstanceOf('yii\mail\MessageInterface'); expect($emailMessage->getTo())->hasKey('admin@example.com'); - expect($emailMessage->getFrom())->hasKey('tester@example.com'); + expect($emailMessage->getFrom())->hasKey('noreply@example.com'); + expect($emailMessage->getReplyTo())->hasKey('tester@example.com'); expect($emailMessage->getSubject())->equals('very important letter subject'); expect($emailMessage->toString())->contains('body of current message'); } From ee0648715a8e690969a0b91dcd53129f6251cf92 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 23 Apr 2019 15:55:33 +0300 Subject: [PATCH 059/187] release version 2.0.18 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d64092fd8f..a5a71b2101 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From ab9a3f4407be18fc605b75787be073c0e19833d0 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 23 Apr 2019 15:55:48 +0300 Subject: [PATCH 060/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a5a71b2101..d64092fd8f 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From 70cb544a290f3af5857cadcce84ae9b3bf2d209e Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 21 May 2019 19:05:16 +0300 Subject: [PATCH 061/187] release version 2.0.19 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d64092fd8f..a5a71b2101 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From b2b489c5228fab5bae8c011391892c0ed6ea1a27 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 21 May 2019 19:05:30 +0300 Subject: [PATCH 062/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a5a71b2101..d64092fd8f 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From 5febea41f6bcf8f07add58ce3ac44649d2291416 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 23 May 2019 18:29:45 +0300 Subject: [PATCH 063/187] Create FUNDING.yml --- .github/FUNDING.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..89a45e51c2 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: [samdark, machour, silverfire, cebe] +open_collective: yiisoft From 77c7402699f95df44605df843c2e008f93d3e2a0 Mon Sep 17 00:00:00 2001 From: Pantelis Roditis Date: Fri, 28 Jun 2019 21:09:59 +0300 Subject: [PATCH 064/187] Do not apply nowrap to all gridview cells (#431) This makes sure that the nowrap is only applied on the last `td` of each row on grid-view, so that action icons dont wrap. It also ensures sorting icons (up/down arrows) are not wrapped. --- backend/web/css/site.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/web/css/site.css b/backend/web/css/site.css index 2f085b3cc6..442179091f 100644 --- a/backend/web/css/site.css +++ b/backend/web/css/site.css @@ -72,7 +72,8 @@ a.desc:after { content: "\e156"; } -.grid-view td { +.grid-view th, +.grid-view td:last-child { white-space: nowrap; } From 45a6dceb88624f91b3c0714adbb5c154194ad943 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 2 Jul 2019 15:38:07 +0300 Subject: [PATCH 065/187] Remove github from funding options [skip ci] --- .github/FUNDING.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 89a45e51c2..c0c1cacbca 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,3 @@ # These are supported funding model platforms -github: [samdark, machour, silverfire, cebe] open_collective: yiisoft From f4376e13b0000ab8504cb8b9a4b8d74c9dd19c18 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 2 Jul 2019 23:46:04 +0300 Subject: [PATCH 066/187] release version 2.0.22 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d64092fd8f..a5a71b2101 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From d74aa2c501509ebd1288eede886f77fdfc362c45 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 2 Jul 2019 23:46:19 +0300 Subject: [PATCH 067/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a5a71b2101..d64092fd8f 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", From 895dd4034cbf09b9b1e9b1b72019596dc5a77237 Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Wed, 31 Jul 2019 00:49:36 +0300 Subject: [PATCH 068/187] Update codeception/verify to 1.1.0 (#436) And use stringContainsString() instead of contains(), because assertContains with string haystacks is deprecated in PHPUnit 8 --- composer.json | 2 +- frontend/tests/unit/models/ContactFormTest.php | 2 +- frontend/tests/unit/models/ResendVerificationEmailFormTest.php | 2 +- frontend/tests/unit/models/SignupFormTest.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index d64092fd8f..48a6b1a7d7 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "yiisoft/yii2-faker": "~2.0.0", "codeception/base": "^2.4.0", "phpunit/phpunit": "~6.5.5", - "codeception/verify": "~1.0.0", + "codeception/verify": "~1.1.0", "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { diff --git a/frontend/tests/unit/models/ContactFormTest.php b/frontend/tests/unit/models/ContactFormTest.php index dff13e33ae..4cfa1f13cc 100644 --- a/frontend/tests/unit/models/ContactFormTest.php +++ b/frontend/tests/unit/models/ContactFormTest.php @@ -29,6 +29,6 @@ public function testSendEmail() expect($emailMessage->getFrom())->hasKey('noreply@example.com'); expect($emailMessage->getReplyTo())->hasKey('tester@example.com'); expect($emailMessage->getSubject())->equals('very important letter subject'); - expect($emailMessage->toString())->contains('body of current message'); + expect($emailMessage->toString())->stringContainsString('body of current message'); } } diff --git a/frontend/tests/unit/models/ResendVerificationEmailFormTest.php b/frontend/tests/unit/models/ResendVerificationEmailFormTest.php index bbfb4e2959..8b46fbd2c0 100644 --- a/frontend/tests/unit/models/ResendVerificationEmailFormTest.php +++ b/frontend/tests/unit/models/ResendVerificationEmailFormTest.php @@ -80,6 +80,6 @@ public function testSuccessfullyResend() expect($mail->getTo())->hasKey('test@mail.com'); expect($mail->getFrom())->hasKey(\Yii::$app->params['supportEmail']); expect($mail->getSubject())->equals('Account registration at ' . \Yii::$app->name); - expect($mail->toString())->contains('4ch0qbfhvWwkcuWqjN8SWRq72SOw1KYT_1548675330'); + expect($mail->toString())->stringContainsString('4ch0qbfhvWwkcuWqjN8SWRq72SOw1KYT_1548675330'); } } diff --git a/frontend/tests/unit/models/SignupFormTest.php b/frontend/tests/unit/models/SignupFormTest.php index 46423a441c..79f31068bf 100644 --- a/frontend/tests/unit/models/SignupFormTest.php +++ b/frontend/tests/unit/models/SignupFormTest.php @@ -48,7 +48,7 @@ public function testCorrectSignup() expect($mail->getTo())->hasKey('some_email@example.com'); expect($mail->getFrom())->hasKey(\Yii::$app->params['supportEmail']); expect($mail->getSubject())->equals('Account registration at ' . \Yii::$app->name); - expect($mail->toString())->contains($user->verification_token); + expect($mail->toString())->stringContainsString($user->verification_token); } public function testNotCorrectSignup() From dfab55ce8bb5e9694e8d5646dc86951fd2491686 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 22 Aug 2019 16:39:50 +0200 Subject: [PATCH 069/187] Fix typo (#441) [skip ci] --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 52ec8692f2..a2ee924395 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -9,6 +9,6 @@ | Q | A | ---------------- | --- -| Yii vesion | +| Yii version | | PHP version | | Operating system | From a09be780257cc8ffe1408431cd722a39124703fc Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Mon, 26 Aug 2019 18:34:45 +0300 Subject: [PATCH 070/187] Fix PHP 5.6 compatibility (#442) --- .travis.yml | 4 ++++ composer.json | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d62ffe591d..5558126e7c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: php php: + - 5.6 - 7.0 - 7.1 - 7.2 @@ -9,6 +10,9 @@ php: # faster builds on new travis setup not using sudo sudo: false +services: + - mysql + # cache vendor dirs cache: directories: diff --git a/composer.json b/composer.json index 48a6b1a7d7..53782b1e67 100644 --- a/composer.json +++ b/composer.json @@ -24,8 +24,8 @@ "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", "codeception/base": "^2.4.0", - "phpunit/phpunit": "~6.5.5", - "codeception/verify": "~1.1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { From 9de066011b7b9c913d9738a8c09f608063ef7265 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Sep 2019 00:29:33 +0300 Subject: [PATCH 071/187] Fix #440: Corrected PHP version requirement --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 53782b1e67..5563102c86 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", + "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" From f760527279d29e3fc2d3f89b4d215f433d0905c2 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Sep 2019 00:43:00 +0300 Subject: [PATCH 072/187] release version 2.0.26 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5563102c86..2167b003c7 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 4c50035f276c9d1fec558f49604fb6a550770092 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Sep 2019 00:43:18 +0300 Subject: [PATCH 073/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2167b003c7..5563102c86 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From d571e80b3785ac4f6c3a612821ea5d4d13610da9 Mon Sep 17 00:00:00 2001 From: "S.M.A. Djawadi" Date: Mon, 4 Nov 2019 14:35:25 +0330 Subject: [PATCH 074/187] Add phpdoc to User::generateEmailVerificationToken() [skip ci] --- common/models/User.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/models/User.php b/common/models/User.php index 5df97661e8..8234fb2bab 100644 --- a/common/models/User.php +++ b/common/models/User.php @@ -194,6 +194,9 @@ public function generatePasswordResetToken() $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); } + /** + * Generates new token for email verification + */ public function generateEmailVerificationToken() { $this->verification_token = Yii::$app->security->generateRandomString() . '_' . time(); From 53fdb03e46c3515467bc0cd72a71d2093c5f5451 Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Fri, 22 Nov 2019 19:28:25 +0200 Subject: [PATCH 075/187] Use modular Codeception 4.0 (#449) --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5563102c86..4548045891 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,10 @@ "yiisoft/yii2-debug": "~2.1.0", "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - "codeception/base": "^2.4.0", + "codeception/codeception": "4.0.x-dev | ^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", "phpunit/phpunit": "~5.7.27 || ~6.5.5", "codeception/verify": "~0.5.0 || ~1.1.0", "symfony/browser-kit": ">=2.7 <=4.2.4" From fa8f2074705debae058d68397dc4e25d1bf65702 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 6 Dec 2019 19:11:03 +0300 Subject: [PATCH 076/187] Migrate Travis from .org to .com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66fc082341..38965153a1 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Documentation is at [docs/guide/README.md](docs/guide/README.md). [![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced) [![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced) -[![Build Status](https://travis-ci.org/yiisoft/yii2-app-advanced.svg?branch=master)](https://travis-ci.org/yiisoft/yii2-app-advanced) +[![Build Status](https://travis-ci.com/yiisoft/yii2-app-advanced.svg?branch=master)](https://travis-ci.com/yiisoft/yii2-app-advanced) DIRECTORY STRUCTURE ------------------- From a331658bffa35b8df86ba1e49266113b4efec036 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 18 Dec 2019 16:08:22 +0300 Subject: [PATCH 077/187] release version 2.0.27 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4548045891..41b28b5446 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From a05ce6828b99f2cbed50a3d487d2bbf27f7ae237 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 18 Dec 2019 16:08:37 +0300 Subject: [PATCH 078/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 41b28b5446..4548045891 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 52b81754ea0425e8351142f5f4caee536dc86212 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 18 Dec 2019 16:10:00 +0300 Subject: [PATCH 079/187] release version 2.0.31 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4548045891..41b28b5446 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From a32c6eaa49de86cc70c240368cf4ee7c8311f337 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 18 Dec 2019 16:10:14 +0300 Subject: [PATCH 080/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 41b28b5446..4548045891 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 2c7733bfde288b4a82ec03476c09d4a4a6ab2b7b Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Tue, 24 Dec 2019 13:55:11 +0100 Subject: [PATCH 081/187] Adjust docs for new PHP requirement. (#451) --- composer.json | 2 +- docs/guide-es/start-composer.md | 35 ++++++++++++++---------- docs/guide-es/start-installation.md | 2 +- docs/guide-fr/start-composer.md | 35 ++++++++++++++---------- docs/guide-fr/start-installation.md | 2 +- docs/guide-ja/start-composer.md | 35 ++++++++++++++---------- docs/guide-ja/start-installation.md | 2 +- docs/guide-pl/start-composer.md | 35 ++++++++++++++---------- docs/guide-pl/start-installation.md | 2 +- docs/guide-pt-BR/start-composer.md | 37 +++++++++++++++----------- docs/guide-pt-BR/start-installation.md | 2 +- docs/guide-zh-CN/start-composer.md | 37 +++++++++++++++----------- docs/guide-zh-CN/start-installation.md | 2 +- docs/guide/start-composer.md | 35 ++++++++++++++---------- docs/guide/start-installation.md | 2 +- 15 files changed, 157 insertions(+), 108 deletions(-) diff --git a/composer.json b/composer.json index 4548045891..c42655eeaf 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "yiisoft/yii2-debug": "~2.1.0", "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - "codeception/codeception": "4.0.x-dev | ^4.0", + "codeception/codeception": "^4.0", "codeception/module-asserts": "^1.0", "codeception/module-yii2": "^1.0", "codeception/module-filesystem": "^1.0", diff --git a/docs/guide-es/start-composer.md b/docs/guide-es/start-composer.md index c91bac56d9..bb5df4abd7 100644 --- a/docs/guide-es/start-composer.md +++ b/docs/guide-es/start-composer.md @@ -20,28 +20,35 @@ Después de instalar el proyecto plantilla es una buena idea ajustar el archivo }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "php": ">=5.6.0", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0" + "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org/" } - } + ] } ``` diff --git a/docs/guide-es/start-installation.md b/docs/guide-es/start-installation.md index 064835766a..e5719d371e 100644 --- a/docs/guide-es/start-installation.md +++ b/docs/guide-es/start-installation.md @@ -3,7 +3,7 @@ Instalación ## Requerimientos -El requerimiento mínimo para esta plantilla es que su servidor web soporte PHP 5.4.0. +El requerimiento mínimo para esta plantilla es que su servidor web soporte PHP 5.6.0. ## Instalación usando Composer diff --git a/docs/guide-fr/start-composer.md b/docs/guide-fr/start-composer.md index 61bc9337f0..fdc5d4cbeb 100644 --- a/docs/guide-fr/start-composer.md +++ b/docs/guide-fr/start-composer.md @@ -20,28 +20,35 @@ Après avoir installé le modèle de projet, il est conseillé d'ajuster le cont }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "php": ">=5.6.0", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0" + "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org/" } - } + ] } ``` diff --git a/docs/guide-fr/start-installation.md b/docs/guide-fr/start-installation.md index 2b57cc88e7..3d84c6bf63 100644 --- a/docs/guide-fr/start-installation.md +++ b/docs/guide-fr/start-installation.md @@ -3,7 +3,7 @@ Installation ## Exigences -L'exigence minimum de ce modèle de projet est que votre serveur Web prenne en charge PHP 5.4.0. +L'exigence minimum de ce modèle de projet est que votre serveur Web prenne en charge PHP 5.6.0. ## Installation via Composer diff --git a/docs/guide-ja/start-composer.md b/docs/guide-ja/start-composer.md index 408b1b1ed3..0a33729adb 100644 --- a/docs/guide-ja/start-composer.md +++ b/docs/guide-ja/start-composer.md @@ -21,28 +21,35 @@ Composer を構成する }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "php": ">=5.6.0", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0" + "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org/" } - } + ] } ``` diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 8247b411e6..fc80e73a43 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -3,7 +3,7 @@ ## 必要条件 -このプロジェクト・テンプレートが要求する最低限の必要条件は、あなたのウェブ・サーバが PHP 5.4.0 をサポートしていることです。 +このプロジェクト・テンプレートが要求する最低限の必要条件は、あなたのウェブ・サーバが PHP 5.6.0 をサポートしていることです。 ## Composer を使ってインストールする diff --git a/docs/guide-pl/start-composer.md b/docs/guide-pl/start-composer.md index 3c6d7af34c..2cec82819c 100644 --- a/docs/guide-pl/start-composer.md +++ b/docs/guide-pl/start-composer.md @@ -21,28 +21,35 @@ folderze: }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "php": ">=5.6.0", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0" + "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org/" } - } + ] } ``` diff --git a/docs/guide-pl/start-installation.md b/docs/guide-pl/start-installation.md index 9773b5ca10..668462f48a 100644 --- a/docs/guide-pl/start-installation.md +++ b/docs/guide-pl/start-installation.md @@ -3,7 +3,7 @@ Instalacja ## Wymagania -Minimalne wymagania tego szablonu projektu dla serwera to obsługa PHP 5.4.0. +Minimalne wymagania tego szablonu projektu dla serwera to obsługa PHP 5.6.0. ## Instalacja za pomocą Composera diff --git a/docs/guide-pt-BR/start-composer.md b/docs/guide-pt-BR/start-composer.md index ffe5a5db65..00a26cd550 100644 --- a/docs/guide-pt-BR/start-composer.md +++ b/docs/guide-pt-BR/start-composer.md @@ -22,28 +22,35 @@ no diretório raiz: }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "php": ">=5.6.0", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0" + "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org/" } - } + ] } ``` @@ -55,4 +62,4 @@ Todos os pacotes são provindos do [packagist.org](https://packagist.org/) entã pacotes úteis no website. Após alterar seu `composer.json` você pode executar o comando `composer update --prefer-dist`, aguardar o download e -instalação dos pacotes e depois utilizá-los. Todas as classes são carregadas automaticamente através de autoloading. \ No newline at end of file +instalação dos pacotes e depois utilizá-los. Todas as classes são carregadas automaticamente através de autoloading. diff --git a/docs/guide-pt-BR/start-installation.md b/docs/guide-pt-BR/start-installation.md index 27eab42cc6..846f6f8442 100644 --- a/docs/guide-pt-BR/start-installation.md +++ b/docs/guide-pt-BR/start-installation.md @@ -3,7 +3,7 @@ Instalação ## Pré-Requisitos -O requisito mínimo deste template de projetos é que seu servidor Web suporte PHP 5.4.0. +O requisito mínimo deste template de projetos é que seu servidor Web suporte PHP 5.6.0. ## Instalação utilizando Composer diff --git a/docs/guide-zh-CN/start-composer.md b/docs/guide-zh-CN/start-composer.md index 1ffc8e4f57..612e63b621 100644 --- a/docs/guide-zh-CN/start-composer.md +++ b/docs/guide-zh-CN/start-composer.md @@ -20,28 +20,35 @@ }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "php": ">=5.6.0", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0" + "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org/" } - } + ] } ``` @@ -50,4 +57,4 @@ 接下来是见证奇迹的时刻. 您可以将您的应用程序需要的更多包添加到 `require` 部分。 所有这些包都来自 [packagist.org](https://packagist.org/) 浏览这里你可以找到更多的实用的免费代码。 -在你的 `composer.json` 改变之后,你可以运行 `composer update --prefer-dist` ,等待程序包下载完成,安装后,就可以使用它们了。 包里面所有的类都会自动加载。 \ No newline at end of file +在你的 `composer.json` 改变之后,你可以运行 `composer update --prefer-dist` ,等待程序包下载完成,安装后,就可以使用它们了。 包里面所有的类都会自动加载。 diff --git a/docs/guide-zh-CN/start-installation.md b/docs/guide-zh-CN/start-installation.md index 5ae251e1d9..abc63fe458 100644 --- a/docs/guide-zh-CN/start-installation.md +++ b/docs/guide-zh-CN/start-installation.md @@ -3,7 +3,7 @@ ## 要求 -此项目模板的最低要求是您的Web服务器支持PHP 5.4.0。 +此项目模板的最低要求是您的Web服务器支持PHP 5.6.0。 ## 使用Composer安装 diff --git a/docs/guide/start-composer.md b/docs/guide/start-composer.md index a444eea3c6..65d8e01501 100644 --- a/docs/guide/start-composer.md +++ b/docs/guide/start-composer.md @@ -21,28 +21,35 @@ directory: }, "minimum-stability": "dev", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.6", + "php": ">=5.6.0", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0" + "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" }, "require-dev": { - "yiisoft/yii2-debug": "~2.0.0", - "yiisoft/yii2-gii": "~2.0.0", + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - - "codeception/base": "^2.2.3", - "codeception/verify": "~0.3.1" + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.0", + "codeception/module-yii2": "^1.0", + "codeception/module-filesystem": "^1.0", + "phpunit/phpunit": "~5.7.27 || ~6.5.5", + "codeception/verify": "~0.5.0 || ~1.1.0", + "symfony/browser-kit": ">=2.7 <=4.2.4" }, "config": { - "process-timeout": 1800 + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } }, - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org/" } - } + ] } ``` diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 0b5fcd95c4..bcdba69cd9 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -3,7 +3,7 @@ Installation ## Requirements -The minimum requirement by this project template is that your Web server supports PHP 5.4.0. +The minimum requirement by this project template is that your Web server supports PHP 5.6.0. ## Installing using Composer From fdcb3ce84775dc32876dc0658099be6153f279ec Mon Sep 17 00:00:00 2001 From: Richard Pillay Date: Thu, 2 Jan 2020 20:08:29 +1100 Subject: [PATCH 082/187] Update testing database description in start-testing.md [skip ci] As a someone new to Yii, PHP and automated testing, the purpose of some of these steps was not obvious. Hopefully this will help other new users without adding too much noise for more experienced users. Co-authored-by: Alexander Makarov --- docs/guide/start-testing.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/guide/start-testing.md b/docs/guide/start-testing.md index 664ebc7411..9bcc7d4a0c 100644 --- a/docs/guide/start-testing.md +++ b/docs/guide/start-testing.md @@ -8,18 +8,19 @@ the `dev` environment. In the case where tests need to be executed in a `Product `yii_test.bat` must be manually copied from the `environments/dev` folder into the project root directory. Tests require an **additional database**, which will be cleaned up between tests. -Create database `yii2advanced_test` in mysql (according to config in `common/config/test-local.php`) and execute: - - -``` -./yii_test migrate -``` - -Build the test suite: - -``` -vendor/bin/codecept build -``` +This database will be used to hold data that matches the data in your live +database. Its purpose is to run those tests that store data without affecting your own data. +Create database in your database server, using a similar setup to the live database, so that the tests +are run in an environment that is as close to your live environment as possible. + + 1. Your live database connection string is probably in `common/config/main-local.php`. It is + something like `'dsn' => 'mysql:host=localhost;dbname=yii2advanced'`. Copy it to + `common/config/test-local.php` and change the `dbname` so it is obvious that it is the + test database: `'dsn' => 'mysql:host=localhost;dbname=yii2advanced_test'`. + 2. Create an empty database. In this example it would be `yii2advanced_test` in MySql (according to + config in `common/config/test-local.php`). + 3. Execute: `./yii_test migrate`. + 4. Build the test suite: `./vendor/bin/codecept build` Then all sample tests can be started by running: From d1cdafd9e5f5ce15d511680d9dfedc69388ed93e Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 3 Jan 2020 21:47:02 +0900 Subject: [PATCH 083/187] Update Japanese docs on testing [ci skip] (#456) --- docs/guide-ja/start-testing.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/guide-ja/start-testing.md b/docs/guide-ja/start-testing.md index f23be2f2ca..d7f1197354 100644 --- a/docs/guide-ja/start-testing.md +++ b/docs/guide-ja/start-testing.md @@ -8,20 +8,21 @@ Yii2 アドバンスト・アプリケーションは Codeception を主たる `environments/dev` からプロジェクトのルート・ディレクトリへ手作業でコピーされなければなりません。 テストには、テストを実行するたびに事前にクリーンアップされる **追加のデータベース** が必要になります。 -(`common/config/test.php` の構成に従って) mysql に `yii2advanced_test` というデータベースを作成し、下記を実行して下さい。 - - -``` -./yii_test migrate -``` - -次に、テスト・スイートをビルドします。 - -``` -vendor/bin/codecept build -``` - -これで、次のコマンドを実行すれば、全てのサンプル・テストを開始することが出来ます。 +このデータベースが、本番データベースにあるデータに対応するデータを保持することになります。 +目的は、本番のデータに影響を与えることなく、データを保存するテストを実行することです。 +本番データベースと同様の設定を使ってデータベース・サーバにデータベースを作成して、 +可能な限り本番に近い環境でテストが走らせられるようにします。 + + 1. 本番データベースの接続文字列はおそらく `common/config/main-local.php` に書かれているでしょう。 + 例えば `'dsn' => 'mysql:host=localhost;dbname=yii2advanced'` です。 + これを `common/config/test-local.php` にコピーして、テスト用データベースであることを明示するために `dbname` を変更します。 + `'dsn' => 'mysql:host=localhost;dbname=yii2advanced_test'` + 2. 空のデータベースを作成します。今の例では、(`common/config/test-local.php` の構成に従って)、 + MySql で `yii2advanced_test` を作ります。 + 3. `./yii_test migrate` を実行します。 + 4. テスト・スイートをビルドします : `./vendor/bin/codecept build` + +これで、以下のコマンドを実行すれば、全てのサンプル・テストが開始されます。 ``` vendor/bin/codecept run From af555f1c143b988d240a6b9577581bb744d6cc45 Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Fri, 3 Jan 2020 14:48:16 +0200 Subject: [PATCH 084/187] Remove version restriction for PHPUnit (#455) This template does not use PHPUnit directly, It uses Codeception and it is responsibility of Codeception to manage compatibility with PHPUnit. Also there is no such restriction in basic app. --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index c42655eeaf..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,6 @@ "codeception/module-asserts": "^1.0", "codeception/module-yii2": "^1.0", "codeception/module-filesystem": "^1.0", - "phpunit/phpunit": "~5.7.27 || ~6.5.5", "codeception/verify": "~0.5.0 || ~1.1.0", "symfony/browser-kit": ">=2.7 <=4.2.4" }, From 11f23051cb7a6a91608c1bfea39c59e3217eb7c9 Mon Sep 17 00:00:00 2001 From: Richard Pillay Date: Sat, 4 Jan 2020 23:22:10 +1100 Subject: [PATCH 085/187] Fix deprecation messages Moved _bootstrap out of settings - it's use in Settings has been Deprecated --- backend/codeception.yml | 2 +- common/codeception.yml | 2 +- frontend/codeception.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/codeception.yml b/backend/codeception.yml index 98615deec3..19ad7cfbae 100644 --- a/backend/codeception.yml +++ b/backend/codeception.yml @@ -5,8 +5,8 @@ paths: output: tests/_output data: tests/_data support: tests/_support +bootstrap: _bootstrap.php settings: - bootstrap: _bootstrap.php colors: true memory_limit: 1024M modules: diff --git a/common/codeception.yml b/common/codeception.yml index 74b1aaf85a..1dfaf9763b 100644 --- a/common/codeception.yml +++ b/common/codeception.yml @@ -5,8 +5,8 @@ paths: output: tests/_output data: tests/_data support: tests/_support +bootstrap: _bootstrap.php settings: - bootstrap: _bootstrap.php colors: true memory_limit: 1024M modules: diff --git a/frontend/codeception.yml b/frontend/codeception.yml index eec855332a..5d3ed5d7f0 100644 --- a/frontend/codeception.yml +++ b/frontend/codeception.yml @@ -5,8 +5,8 @@ paths: output: tests/_output data: tests/_data support: tests/_support +bootstrap: _bootstrap.php settings: - bootstrap: _bootstrap.php colors: true memory_limit: 1024M modules: From 2929cc23fd9ad1b8aafff7d6eda50fdf6e606888 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 22 Jan 2020 01:43:39 +0300 Subject: [PATCH 086/187] release version 2.0.32 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From f367e616ecd4515e546629f0426df4f4651f9865 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 22 Jan 2020 01:43:54 +0300 Subject: [PATCH 087/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 18891a354027c54d5ee60384baec8212cb806657 Mon Sep 17 00:00:00 2001 From: fleduc Date: Sun, 2 Feb 2020 08:39:16 -0500 Subject: [PATCH 088/187] Update start-installation.md in regards to issues #457 and #458 (#459) Issue #457 is about placing 'php' within the docker command and issue #458 is about inverting commands --- docs/guide/start-installation.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index bcdba69cd9..349ba398fc 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -289,9 +289,9 @@ Install the application dependencies Initialize the application by running the `init` command within a container - docker-compose run --rm backend /app/init + docker-compose run --rm backend php /app/init -Add a database service like and adjust the components['db'] configuration in `common/config/main-local.php` accordingly. +Adjust the components['db'] configuration in `common/config/main-local.php` accordingly. 'dsn' => 'mysql:host=mysql;dbname=yii2advanced', 'username' => 'yii2advanced', @@ -305,14 +305,14 @@ Add a database service like and adjust the components['db'] configuration in `co For more information about Docker setup please visit the [guide](http://www.yiiframework.com/doc-2.0/guide-index.html). -Run the migrations - - docker-compose run --rm backend yii migrate - Start the application docker-compose up -d - + +Run the migrations + + docker-compose run --rm backend yii migrate + Access it in your browser by opening - frontend: http://127.0.0.1:20080 From cc899ff19847b6fd63bd3dd58d68534ad9e3880c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 24 Mar 2020 23:35:38 +0300 Subject: [PATCH 089/187] release version 2.0.33 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From b7c0c9cc7ac078be099301ddcb09409055b14fed Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 24 Mar 2020 23:36:00 +0300 Subject: [PATCH 090/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 534469a158a5256d26210da678bed65fa1ace26f Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 26 Mar 2020 23:54:41 +0300 Subject: [PATCH 091/187] release version 2.0.34 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 9e1bc98f717cc38ebd4cfd1a893a8ebc75c2aca2 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 26 Mar 2020 23:54:59 +0300 Subject: [PATCH 092/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 9dfcdfb66c2dc6b20729e66aaddd407e76b29f7b Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 2 May 2020 14:24:15 +0300 Subject: [PATCH 093/187] release version 2.0.35 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 695dc149d0999a55e76208b0c5f97e40c3a52c9c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 2 May 2020 14:24:29 +0300 Subject: [PATCH 094/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 09360d7cd88f4a0551da29ab22e8c3dd39ca98be Mon Sep 17 00:00:00 2001 From: "Kai Mindermann, M.Sc" Date: Wed, 27 May 2020 10:52:44 +0200 Subject: [PATCH 095/187] Increase default minimum password length to 12 (#465) --- .travis.yml | 3 +++ frontend/models/SignupForm.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5558126e7c..927efed3ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,9 @@ cache: directories: - $HOME/.composer/cache +before_install: + - export COMPOSER_MEMORY_LIMIT=-1 + install: - travis_retry composer self-update && composer --version - travis_retry composer update --dev --prefer-dist --no-interaction diff --git a/frontend/models/SignupForm.php b/frontend/models/SignupForm.php index f1e276bfe2..d5ce29dbc8 100644 --- a/frontend/models/SignupForm.php +++ b/frontend/models/SignupForm.php @@ -33,7 +33,7 @@ public function rules() ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'], ['password', 'required'], - ['password', 'string', 'min' => 6], + ['password', 'string', 'min' => 12], ]; } From dcd1fc0fb5912495af8c0b6ba3d9ab70bcb41ecc Mon Sep 17 00:00:00 2001 From: Wade Date: Tue, 2 Jun 2020 15:02:01 -0400 Subject: [PATCH 096/187] Add missing class to urlManagerFrontend (#467) On custom named url managers, the `class` element is required. You will get a `Invalid Configuration` exception without it! --- docs/guide/topic-link-backend-frontend.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guide/topic-link-backend-frontend.md b/docs/guide/topic-link-backend-frontend.md index 5b6a750a77..40f910a015 100644 --- a/docs/guide/topic-link-backend-frontend.md +++ b/docs/guide/topic-link-backend-frontend.md @@ -11,6 +11,7 @@ return [ // here is your normal backend url manager config ], 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // class is required on custom named url managers! // here is your frontend URL manager config ], From 980dee80ecdb1bc5234ad9bd84553603da5b0de8 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 11 Jun 2020 19:57:21 +0900 Subject: [PATCH 097/187] docs/guide-ja updated [ci skip] (#469) --- docs/guide-ja/start-installation.md | 12 ++++++------ docs/guide-ja/topic-link-backend-frontend.md | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index fc80e73a43..afde7b8d59 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -289,9 +289,9 @@ Bower と NPM の依存パッケージを Composer によって管理するた コンテナの中で `init` コマンドを実行することによってアプリケーションを初期化します。 - docker-compose run --rm backend /app/init + docker-compose run --rm backend php /app/init -好みのデータベース・サービスを追加して、それに合せて `common/config/main-local.php` の 'db' コンポーネントの構成を修正します。 +それに合せて `common/config/main-local.php` の 'db' コンポーネントの構成を修正します。 'dsn' => 'mysql:host=mysql;dbname=yii2advanced', 'username' => 'yii2advanced', @@ -305,14 +305,14 @@ Bower と NPM の依存パッケージを Composer によって管理するた Docker のセットアップに関する更なる詳細は [ガイド](http://www.yiiframework.com/doc-2.0/guide-index.html) を参照して下さい。 +アプリケーションを開始します。 + + docker-compose up -d + マイグレーションを実行します。 docker-compose run --rm backend yii migrate - -アプリケーションを開始します。 - docker-compose up -d - ブラウザで下記を開いてアプリケーションにアクセスします。 - フロントエンド: http://127.0.0.1:20080 diff --git a/docs/guide-ja/topic-link-backend-frontend.md b/docs/guide-ja/topic-link-backend-frontend.md index c338d8c2c7..e1f2b442a3 100644 --- a/docs/guide-ja/topic-link-backend-frontend.md +++ b/docs/guide-ja/topic-link-backend-frontend.md @@ -11,6 +11,7 @@ return [ // ここに通常のバックエンドの URL マネージャの構成 ], 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // 名前を変えた URL マネージャはクラスの指定が必要 ! // ここにフロントエンドの URL マネージャの構成 ], From a3d5c33c023edba33d75ccc0ba434a0a1adee1a2 Mon Sep 17 00:00:00 2001 From: Wade Date: Mon, 15 Jun 2020 03:21:16 -0400 Subject: [PATCH 098/187] Add more detail to "Creating links from backend to frontend" guide --- docs/guide/topic-link-backend-frontend.md | 187 +++++++++++++++++++++- 1 file changed, 183 insertions(+), 4 deletions(-) diff --git a/docs/guide/topic-link-backend-frontend.md b/docs/guide/topic-link-backend-frontend.md index 40f910a015..d86b7071d3 100644 --- a/docs/guide/topic-link-backend-frontend.md +++ b/docs/guide/topic-link-backend-frontend.md @@ -12,6 +12,7 @@ return [ ], 'urlManagerFrontend' => [ 'class' => 'yii\web\UrlManager', // class is required on custom named url managers! + 'hostInfo' => 'https://example.com/', // the full base domain name to use for the links // here is your frontend URL manager config ], @@ -19,22 +20,80 @@ return [ ]; ``` -After it is done, you can get an URL pointing to frontend like the following: +The URL Manager doesn't magically know the root URL of another app on another sub-domain. This is where the `hostInfo` param +comes in. It defines the full domain for the URL manager to generate absolute links with. + +You may need to generate links to the frontend or any another app (ie: [topic-adding-more-apps.md](topic-adding-more-apps.md)). You can have multiple URL managers for multiple apps on multiple sub-domains. + +```php +return [ + 'components' => [ + 'urlManager' => [ + // here is your normal backend URL manager config + ], + 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // class is required on custom named URL managers! + 'hostInfo' => 'https://example.com/', // the full base domain name to use for the links + // here is your frontend URL manager config + ], + 'urlManagerBlog' => [ + 'class' => 'yii\web\UrlManager', // class is required on custom named URL managers! + 'hostInfo' => 'https://blog.example.com/', // the full base domain name to use for the links + // here is your blog URL manager config + ], + + ], +]; +``` + +After it is done, you can get a URL pointing to the frontend like the following: ```php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(...); ``` -In order not to copy-paste frontend rules you may first move these into separate `urls.php` file: +When you have custom rules that need to be repeated across multiple apps, you should place them in their +own "rules" files. This way, when you need to make a change, you only need to modify one file. + +In the `common/config` directory, create a new folder named `rules`. This will house all of your URL manager rules. + +Then create a file named `backend-rules.php` and another named `frontend-rules.php`. + +If the respective app doesn't have/need any rules, just have the rules file return an empty array. + +```php +' => 'affiliate/index', + 'lp/' => 'landing/index', +]; +``` + +Now just include/require the respective rules files for the corresponding URL managers: ```php return [ // ... 'components' => [ 'urlManager' => [ + // backend URL manager + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'rules' => require Yii::getAlias('@common/config/rules/backend-rules.php'), + ], + 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // class is required on custom named url managers! + 'hostInfo' => 'https://example.com/', // the full base domain name to use for the links 'enablePrettyUrl' => true, 'showScriptName' => false, - 'rules' => require 'urls.php', + 'rules' => require Yii::getAlias('@common/config/rules/frontend-rules.php'), ], // ... @@ -43,4 +102,124 @@ return [ ]; ``` -After then you may include it in `urlManagerFrontend` rules as well. +## Hardcoded hostInfo URL + +The examples above are to illustrate what is expected in the field. `hostInfo` expects a full domain name like `https://example.com` or +`https://backend.example.com`. Having a hard-coded domain in your config isn't very practical. Especially for handling multiple environments +(local, staging, production, etc). + +There are a few ways you can do this. The following way allows you to make use of Yii's environments and the `init` process. + +We first need to load functions early on during Composer's autoload. + +In your `composer.json` file, add the following: + +```json +"autoload": { + "files": [ + "common/functions.php" + ] +} +``` + +Now create `common/functions.php`: + +```php + [ + 'urlManager' => [ + // backend URL manager + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'rules' => require Yii::getAlias('@common/config/rules/backend-rules.php'), + ], + 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // class is required on custom named URL managers! + 'hostInfo' => Yii::getAlias('@frontendDomain'), // the full base domain name to use for the links + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'rules' => require Yii::getAlias('@common/config/rules/frontend-rules.php'), + ], + // ... + + ], + // ... +]; +``` From 6ee1e66e17003ee42f2c97c88b42355dd2bd4656 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 25 Jun 2020 17:25:30 +0300 Subject: [PATCH 099/187] Update meta --- .github/FUNDING.yml | 1 + .github/SECURITY.md | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 .github/SECURITY.md diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index c0c1cacbca..6727e75bd0 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,4 @@ # These are supported funding model platforms open_collective: yiisoft +tidelift: "packagist/yiisoft/yii2-app-advanced" diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000000..f713847596 --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,6 @@ +# Security Policy + +Please use the [security issue form](https://www.yiiframework.com/security) to report to us any security issue you find in Yii. +DO NOT use the issue tracker or discuss it in the public forum as it will cause more damage than help. + +Please note that as a non-commerial OpenSource project we are not able to pay bounties at the moment. From 86b1606c8ff326ee2582891a340706034eca3874 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 8 Jul 2020 00:56:51 +0300 Subject: [PATCH 100/187] release version 2.0.36 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 3b328a25d13859bc29cfbbdf749382d3e421114f Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 8 Jul 2020 00:57:09 +0300 Subject: [PATCH 101/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 3d3f5deb06a7cc1a34eb6a3e98d39cfc6bfe119e Mon Sep 17 00:00:00 2001 From: Deryabin Sergey Date: Sun, 12 Jul 2020 22:47:33 +0300 Subject: [PATCH 102/187] Standartize minimal password length by config param user.passwordMinLength #471 (#472) --- common/config/params.php | 1 + frontend/models/ResetPasswordForm.php | 3 ++- frontend/models/SignupForm.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/common/config/params.php b/common/config/params.php index b18cb955cc..9361512cfa 100644 --- a/common/config/params.php +++ b/common/config/params.php @@ -5,4 +5,5 @@ 'senderEmail' => 'noreply@example.com', 'senderName' => 'Example.com mailer', 'user.passwordResetTokenExpire' => 3600, + 'user.passwordMinLength' => 8, ]; diff --git a/frontend/models/ResetPasswordForm.php b/frontend/models/ResetPasswordForm.php index 6ef7d68d77..ab52674957 100644 --- a/frontend/models/ResetPasswordForm.php +++ b/frontend/models/ResetPasswordForm.php @@ -3,6 +3,7 @@ use yii\base\InvalidArgumentException; use yii\base\Model; +use Yii; use common\models\User; /** @@ -44,7 +45,7 @@ public function rules() { return [ ['password', 'required'], - ['password', 'string', 'min' => 6], + ['password', 'string', 'min' => Yii::$app->params['user.passwordMinLength']], ]; } diff --git a/frontend/models/SignupForm.php b/frontend/models/SignupForm.php index d5ce29dbc8..b65de8b0cf 100644 --- a/frontend/models/SignupForm.php +++ b/frontend/models/SignupForm.php @@ -33,7 +33,7 @@ public function rules() ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'], ['password', 'required'], - ['password', 'string', 'min' => 12], + ['password', 'string', 'min' => Yii::$app->params['user.passwordMinLength']], ]; } From c5bcde88b18a21e5c4c563396d18cc9fdbee05ae Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Aug 2020 23:23:12 +0300 Subject: [PATCH 103/187] release version 2.0.37 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 2d01eabef2c94e9e16f3dc8e2db68c28331b0ce0 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Aug 2020 23:23:26 +0300 Subject: [PATCH 104/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 9d9655f1daf83adedc05c27bd1fed835fa2f6531 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 20 Aug 2020 23:14:41 +0900 Subject: [PATCH 105/187] Japanese Guide Updated [ci skip] (#476) --- docs/guide-ja/topic-link-backend-frontend.md | 187 ++++++++++++++++++- 1 file changed, 183 insertions(+), 4 deletions(-) diff --git a/docs/guide-ja/topic-link-backend-frontend.md b/docs/guide-ja/topic-link-backend-frontend.md index e1f2b442a3..69565c4ca0 100644 --- a/docs/guide-ja/topic-link-backend-frontend.md +++ b/docs/guide-ja/topic-link-backend-frontend.md @@ -12,6 +12,7 @@ return [ ], 'urlManagerFrontend' => [ 'class' => 'yii\web\UrlManager', // 名前を変えた URL マネージャはクラスの指定が必要 ! + 'hostInfo' => 'https://example.com/', // リンクに使用するフル・ベース・ドメイン名 // ここにフロントエンドの URL マネージャの構成 ], @@ -19,22 +20,80 @@ return [ ]; ``` -このようにすると、フロントエンドを指す URL を次のようにして取得することが出来ます。 +URL マネージャは別のサブ・ドメインにある別のアプリのルート URL を魔法によって知ることは出来ません。そこで `hostinfo` パラメータの出番となります。 +これが定義するフル・ドメイン名によって URL マネージャが絶対リンクを作成します。 + +フロントエンドだけでなく他のアプリ ([アプリケーションをさらに追加する](topic-adding-more-apps.md)) へのリンクを生成する必要があることもあるでしょう。複数のサブ・ドメイン上の複数のアプリに対応するために複数の URL マネージャを定義することが出来ます。 + +```php +return [ + 'components' => [ + 'urlManager' => [ + // ここに通常のバックエンドの URL マネージャの構成 + ], + 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // 名前を変えた URL マネージャはクラスの指定が必要 ! + 'hostInfo' => 'https://example.com/', // リンクに使用するフル・ベース・ドメイン名 + // ここにフロントエンドの URL マネージャの構成 + ], + 'urlManagerBlog' => [ + 'class' => 'yii\web\UrlManager', // 名前を変えた URL マネージャはクラスの指定が必要 ! + 'hostInfo' => 'https://blog.example.com/', // リンクに使用するフル・ベース・ドメイン名 + // ここにブログの URL マネージャの構成 + ], + + ], +]; +``` + +このように構成すると、フロントエンドを指す URL を次のようにして得ることが出来ます。 ```php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(...); ``` -フロントエンドの規則をコピペしなくても済むように、最初にそれらの規則を独立した `urlsphp` ファイルに移しておくことが出来ます。 +複数のアプリで繰り返す必要のあるカスタム・ルールがある場合は、それ自身の "rules" ファイルに保存するべきです。 +そうすれば、変更が必要になったときに、一つのファイルを修正するだけですみます。 + +`common/config` ディレクトリに `rules` という名前の新しいフォルダを作成します。その中に全ての URL ルールを入れることにします。 + +そして `backend-rules.php` という名前のファイルと `frontend-rules.php` という名前のファイルを作成します。 + +対応するアプリがルールを持たない/必要としない場合は、空の配列を返すようにします。 + +```php +' => 'affiliate/index', + 'lp/' => 'landing/index', +]; +``` + +そして対応する URL マネージャからそれぞれのルール・ファイルを require/include します。 ```php return [ // ... 'components' => [ 'urlManager' => [ + // バックエンドの URL マネージャ 'enablePrettyUrl' => true, 'showScriptName' => false, - 'rules' => require 'urls.php', + 'rules' => require Yii::getAlias('@common/config/rules/backend-rules.php'), + ], + 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // 名前を変えた URL マネージャはクラスの指定が必要 ! + 'hostInfo' => 'https://example.com/', // リンクに使用するフル・ベース・ドメイン名 + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'rules' => require Yii::getAlias('@common/config/rules/frontend-rules.php'), ], // ... @@ -43,4 +102,124 @@ return [ ]; ``` -そして、後でこれを `urlManagerFrontend` の規則としても読み込めば良いわけです。 +## ハードコードされた hostInfo URL + +上記の例はフィールドに何を入れるべきかを示すためのものです。`hostInfo` には `https://example.com` または `https://backend.example.com` のようなフル・ドメイン名を入れなければなりません。 +構成ファイルにハードコードされたドメインを記載するのはあまり実用的ではありません。 +特に複数の環境 (ローカルの開発環境、ステージング、実運用環境) を持つ場合は不便です。 + +いくつかの方法がありますが、以下に示すのは Yii の環境変数と `init` プロセスを利用する方法です。 + +最初に Composer のオートロードの段階で関数をロードする必要があります。 + +`composer.json` ファイルに以下を追加します。 + +```json +"autoload": { + "files": [ + "common/functions.php" + ] +} +``` + +そして `common/functions.php` を作成します。 + +```php + [ + 'urlManager' => [ + // backend URL manager + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'rules' => require Yii::getAlias('@common/config/rules/backend-rules.php'), + ], + 'urlManagerFrontend' => [ + 'class' => 'yii\web\UrlManager', // 名前を変えた URL マネージャはクラスの指定が必要 ! + 'hostInfo' => Yii::getAlias('@frontendDomain'), // リンクに使用するフル・ベース・ドメイン名 + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'rules' => require Yii::getAlias('@common/config/rules/frontend-rules.php'), + ], + // ... + + ], + // ... +]; +``` From dcd4d6d572702020ac714d9f5b8ddcc322ab0b71 Mon Sep 17 00:00:00 2001 From: Deryabin Sergey Date: Tue, 1 Sep 2020 02:50:05 +0300 Subject: [PATCH 106/187] Add minimal center layout and login form (#478) --- backend/controllers/SiteController.php | 2 ++ backend/views/layouts/blank.php | 34 ++++++++++++++++++++++++++ backend/views/site/login.php | 9 ++----- backend/web/css/site.css | 20 ++++++++++++++- 4 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 backend/views/layouts/blank.php diff --git a/backend/controllers/SiteController.php b/backend/controllers/SiteController.php index 6d0a16592a..b1f73254b2 100644 --- a/backend/controllers/SiteController.php +++ b/backend/controllers/SiteController.php @@ -74,6 +74,8 @@ public function actionLogin() return $this->goHome(); } + $this->layout = 'blank'; + $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); diff --git a/backend/views/layouts/blank.php b/backend/views/layouts/blank.php new file mode 100644 index 0000000000..55c7a5e859 --- /dev/null +++ b/backend/views/layouts/blank.php @@ -0,0 +1,34 @@ + +beginPage() ?> + + + + + + + registerCsrfMetaTags() ?> + <?= Html::encode($this->title) ?> + head() ?> + + +beginBody() ?> + +
+ +
+ +
+ +endBody() ?> + + +endPage() ?> diff --git a/backend/views/site/login.php b/backend/views/site/login.php index 20f3f78531..c05272c0fe 100644 --- a/backend/views/site/login.php +++ b/backend/views/site/login.php @@ -8,15 +8,12 @@ use yii\bootstrap\ActiveForm; $this->title = 'Login'; -$this->params['breadcrumbs'][] = $this->title; ?> + \ No newline at end of file diff --git a/backend/web/css/site.css b/backend/web/css/site.css index 442179091f..1021de76e6 100644 --- a/backend/web/css/site.css +++ b/backend/web/css/site.css @@ -3,6 +3,11 @@ body { height: 100%; } +body.blank { + display: flex; + padding: 40px 0; +} + .wrap { min-height: 100%; height: auto; @@ -10,6 +15,19 @@ body { padding: 0 0 60px; } +body.blank .wrap { + display: flex; + align-items: center; + width: 100%; + max-width: 400px; + margin: -40px auto; + padding: 15px; +} + +body.blank .wrap > div { + width: 100%; +} + .wrap > .container { padding: 70px 15px 20px; } @@ -118,4 +136,4 @@ a.desc:after { .nav > li > form > button.logout:focus { outline: none; -} +} \ No newline at end of file From 364d8b6bf4f0812ad11becc12ff8967d9fdb0686 Mon Sep 17 00:00:00 2001 From: Nazar Holubovskyy Date: Wed, 9 Sep 2020 19:15:14 +0100 Subject: [PATCH 107/187] Enh: Add virtual machine IP to the Yii2 Advanced "allowedIPs" (#480) --- Vagrantfile | 2 +- vagrant/provision/once-as-root.sh | 4 ++ vagrant/provision/provision.awk | 70 +++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 vagrant/provision/provision.awk diff --git a/Vagrantfile b/Vagrantfile index 4376f11c80..b46d0adee6 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -68,7 +68,7 @@ Vagrant.configure(2) do |config| config.hostmanager.aliases = domains.values # provisioners - config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone']] + config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone'], options['ip']] config.vm.provision 'shell', path: './vagrant/provision/once-as-vagrant.sh', args: [options['github_token']], privileged: false config.vm.provision 'shell', path: './vagrant/provision/always-as-root.sh', run: 'always' diff --git a/vagrant/provision/once-as-root.sh b/vagrant/provision/once-as-root.sh index a9ae46a44f..0b7ca55c08 100644 --- a/vagrant/provision/once-as-root.sh +++ b/vagrant/provision/once-as-root.sh @@ -5,6 +5,7 @@ source /app/vagrant/provision/common.sh #== Import script args == timezone=$(echo "$1") +readonly IP=$2 #== Provision script == @@ -15,6 +16,9 @@ export DEBIAN_FRONTEND=noninteractive info "Configure timezone" timedatectl set-timezone ${timezone} --no-ask-password +info "AWK initial replacement work" +awk -v ip=$IP -f /app/vagrant/provision/provision.awk /app/environments/dev/*end/config/main-local.php + info "Prepare root password for MySQL" debconf-set-selections <<< "mysql-community-server mysql-community-server/root-pass password \"''\"" debconf-set-selections <<< "mysql-community-server mysql-community-server/re-root-pass password \"''\"" diff --git a/vagrant/provision/provision.awk b/vagrant/provision/provision.awk new file mode 100644 index 0000000000..65e9bdeeea --- /dev/null +++ b/vagrant/provision/provision.awk @@ -0,0 +1,70 @@ +### +# Modifying Yii2's files for initialize Vagrant VM +# +# @author HA3IK +# @version 1.0.0 + +BEGIN { + print "AWK BEGINs its work:" + IGNORECASE = 1 + # Correct IP - wildcard last octet + match(ip, /(([0-9]+\.)+)/, arr) + ip = arr[1] "*" +} +BEGINFILE { + msg = "- Work with: " FILENAME + # Define array index for the file + switch (FILENAME) { + case /environments\/dev\/(back|front)end\/config\/main\-local\.php$/: + isFile["IsMainLocConf"] = 1 + msg = msg " - allow VM IP for Gii and debug toolbar" + break + } + # Print the final message + print msg +} +# BODY +{ + # IF environments/dev/(back|front)end/config/main-local.php + if (isFile["IsMainLocConf"]) { + # IF the line[s] after yii\(debug|gii)\Module + if (FNR == nextLine["nubmer"]) { + # Prepare for next line + ++nextLine["nubmer"] + # IF line has "allowedIPs" + if (index($0, "allowedIPs")) { + # IF our IP is not there + if (!index($0, ip)) { + # Add it + match($0, /([^\]]+)(.+)/, arr) + $0 = sprintf("%s, '%s'%s", arr[1], ip, arr[2]) + } + # Delete next line + delete nextLine + # IF "allowedIPs" are not set - search for the end of an array structure + } else if ($0 ~ /\];$/) { + # Rewrite line + $0 = nextLine["indent"] "'allowedIPs' => ['127.0.0.1', '::1', '" ip "'],\n" $0 + delete nextLine + } + # IF line is done + if (!length(nextLine)) { + printf " Line %d: Allowed IP: %s\n", FNR, ip + } + # Search for yii\(debug|gii)\Module + } else if (match($0, /^(\s+).+yii\\(debug|gii)\\Module/, arr)) { + # Save next line and indent + nextLine["nubmer"] = FNR + 1 + nextLine["indent"] = arr[1] + } + # Rewrite the file + print $0 > FILENAME + } +} +ENDFILE { + delete isFile + close(FILENAME) +} +END { + print "AWK ENDs its work." +} From be107e3e39a217026489ec34f62added32a51cd5 Mon Sep 17 00:00:00 2001 From: Nazar Holubovskyy Date: Thu, 10 Sep 2020 17:56:04 +0100 Subject: [PATCH 108/187] Bug: Vagrant installation was stopping on each missing plugin --- Vagrantfile | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index b46d0adee6..b1999c1679 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -1,9 +1,20 @@ require 'yaml' require 'fileutils' +required_plugins_installed = nil required_plugins = %w( vagrant-hostmanager vagrant-vbguest ) required_plugins.each do |plugin| - exec "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin + unless Vagrant.has_plugin? plugin + system "vagrant plugin install #{plugin}" + required_plugins_installed = true + end +end + +# IF plugin[s] was just installed - restart required +if required_plugins_installed + # Get CLI command[s] and call again + system 'vagrant' + ARGV.to_s.gsub(/\[\"|\", \"|\"\]/, ' ') + exit end domains = { From 05fef12c02b38096f1ff8fb3751b199095375f40 Mon Sep 17 00:00:00 2001 From: Deryabin Sergey Date: Tue, 15 Sep 2020 00:07:38 +0300 Subject: [PATCH 109/187] Fix #215: Remove files from other env which not exists in current env (#479) --- docs/guide-es/start-installation.md | 2 +- docs/guide-fr/start-installation.md | 2 +- docs/guide-ja/start-installation.md | 2 +- docs/guide-pl/start-installation.md | 2 +- docs/guide-pt-BR/start-installation.md | 2 +- docs/guide-zh-CN/start-installation.md | 2 +- docs/guide/start-installation.md | 2 +- init | 56 ++++++++++++++++++++++++++ 8 files changed, 63 insertions(+), 7 deletions(-) diff --git a/docs/guide-es/start-installation.md b/docs/guide-es/start-installation.md index e5719d371e..835a2efc46 100644 --- a/docs/guide-es/start-installation.md +++ b/docs/guide-es/start-installation.md @@ -36,7 +36,7 @@ Después de instalar la aplicación, tienes que realizar los siguientes pasos pa Por otra parte, en producción ejecuta `init` con el modo no interactivo. ``` - php /path/to/yii-application/init --env=Production --overwrite=All + php /path/to/yii-application/init --env=Production --overwrite=All --delete=All ``` 2. Crea una nueva base de datos y ajusta la configuración de `components['db']` en `common/config/main-local.php` como corresponde. diff --git a/docs/guide-fr/start-installation.md b/docs/guide-fr/start-installation.md index 3d84c6bf63..a0a3f5626b 100644 --- a/docs/guide-fr/start-installation.md +++ b/docs/guide-fr/start-installation.md @@ -37,7 +37,7 @@ Après que vous avez installé l'application, vous devez accomplir les étapes s Si vous l'automatisez à l'aide d'un script, vous pouvez exécuter `init` en mode non interactif. ``` - /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All + /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All --delete=All ``` 2. Créez une nouvelle base de données et complétez la configuration de `components['db']` dans `common/config/main-local.php` en conséquence. diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index afde7b8d59..6b6f6ec63d 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -41,7 +41,7 @@ Bower と NPM の依存パッケージを Composer によって管理するた スクリプトで自動化する場合は、非対話モードで `init` を実行します。 ``` - /path/to/php-bin/php /path/to/yii-application/init --env=Development --overwrite=All + /path/to/php-bin/php /path/to/yii-application/init --env=Development --overwrite=All --delete=All ``` 2. 新しいデータベースを作成し、それに従って `/path/to/yii-application/common/config/main-local.php` の `components['db']` の構成情報を修正します。 diff --git a/docs/guide-pl/start-installation.md b/docs/guide-pl/start-installation.md index 668462f48a..c634db3b7a 100644 --- a/docs/guide-pl/start-installation.md +++ b/docs/guide-pl/start-installation.md @@ -39,7 +39,7 @@ zrobić raz na każdym nowym środowisku. W przypadku zautomatyzowanego procesu z użyciem skryptu, możesz uruchomić `init` w trybie nieinteraktywnym. ``` - /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All + /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All --delete=All ``` 2. Stwórz nową bazę danych i zmodyfikuj odpowiednio jej dane w kluczu `components['db']` w pliku `common/config/main-local.php`. diff --git a/docs/guide-pt-BR/start-installation.md b/docs/guide-pt-BR/start-installation.md index 846f6f8442..dc68223320 100644 --- a/docs/guide-pt-BR/start-installation.md +++ b/docs/guide-pt-BR/start-installation.md @@ -39,7 +39,7 @@ para inicializar a aplicação, sendo necessário realizá-los apenas uma vez no Caso queria realizar a automação do processo por meio de um script, você pode executar o comando `init` em modo não interativo. ``` - /caminho/para/binario-php/php /caminho/para/aplicacao-yii/init --env=Production --overwrite=All + /caminho/para/binario-php/php /caminho/para/aplicacao-yii/init --env=Production --overwrite=All --delete=All ``` 2. Crie um novo banco de dados e ajuste a configuração `components['db']` em `common/config/main-local.php` adequadamente. diff --git a/docs/guide-zh-CN/start-installation.md b/docs/guide-zh-CN/start-installation.md index abc63fe458..1b8457075a 100644 --- a/docs/guide-zh-CN/start-installation.md +++ b/docs/guide-zh-CN/start-installation.md @@ -36,7 +36,7 @@ 如果使用脚本自动化,可以在非交互模式下执行 `init` 。 ``` - /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All + /path/to/php-bin/php /path/to/yii-application/init --env=Production --overwrite=All --delete=All ``` 2. 创建一个新的数据库,并相应地调整 `common/config/main-local.php` 中的 `components['db']` 配置。 diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 349ba398fc..509c8009ec 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -41,7 +41,7 @@ the installed application. You only need to do these once for all. If you automate it with a script you can execute `init` in non-interactive mode. ``` - /path/to/php-bin/php /path/to/yii-application/init --env=Development --overwrite=All + /path/to/php-bin/php /path/to/yii-application/init --env=Development --overwrite=All --delete=All ``` 2. Create a new database and adjust the `components['db']` configuration in `/path/to/yii-application/common/config/main-local.php` accordingly. diff --git a/init b/init index 139d0898a2..cf472c98a9 100755 --- a/init +++ b/init @@ -78,6 +78,30 @@ foreach ($files as $file) { } } +$filesToRemove = []; +$skipFiles = !empty($env['skipFiles']) ? $env['skipFiles'] : []; +foreach(array_column($envs, 'path') as $envPath) { + if ($env['path'] === $envPath) continue; + + $filesToRemove = + array_merge( + $filesToRemove, + array_diff(getFileList("$root/environments/{$envPath}"), $files, $filesToRemove, $skipFiles) + ); +} +$filesToRemove = array_filter($filesToRemove, 'file_exists'); +if ($filesToRemove) { + echo "\n Remove files from other environments ...\n\n"; + + $all = false; + foreach ($filesToRemove as $file) { + if (!removeFile($root, $file, $all, $params)) { + break; + } + } + echo "\n"; +} + $callbacks = ['setCookieValidationKey', 'setWritable', 'setExecutable', 'createSymlink']; foreach ($callbacks as $callback) { if (!empty($env[$callback])) { @@ -151,6 +175,38 @@ function copyFile($root, $source, $target, &$all, $params) return true; } +function removeFile($root, $target, &$all, $params) +{ + if (is_file($root . '/' . $target)) { + if ($all) { + echo " delete $target\n"; + } else { + echo " delete $target\n"; + echo " ...confirm? [Yes|No|All|Quit] "; + + $answer = !empty($params['delete']) ? $params['delete'] : trim(fgets(STDIN)); + if (!strncasecmp($answer, 'q', 1)) { + return false; + } else { + if (!strncasecmp($answer, 'y', 1)) { + echo " delete $target\n"; + } else { + if (!strncasecmp($answer, 'a', 1)) { + echo " delete $target\n"; + $all = true; + } else { + echo " skip $target\n"; + return true; + } + } + } + } + return unlink($root . '/' . $target); + } + + return true; +} + function getParams() { $rawParams = []; From 6813b85b8fd31df41ac6177421412fb77af26aee Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 15 Sep 2020 01:06:58 +0300 Subject: [PATCH 110/187] release version 2.0.38 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From a436db44d69593d21bc6e0c4870980ff4ef7878c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 15 Sep 2020 01:07:13 +0300 Subject: [PATCH 111/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 06ab9d9869b9d6096c2edc4108f159dc11a9ac7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D0=BE=D1=84=D0=B5=D0=B9?= <47164430+GelvardMann@users.noreply.github.com> Date: Tue, 15 Sep 2020 19:49:18 +0300 Subject: [PATCH 112/187] Add missing div tag (#483) --- backend/views/layouts/blank.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/views/layouts/blank.php b/backend/views/layouts/blank.php index 55c7a5e859..8196415c62 100644 --- a/backend/views/layouts/blank.php +++ b/backend/views/layouts/blank.php @@ -22,6 +22,8 @@ beginBody() ?> +
+
From 2edc74b384bd5b67cc9961f3a8aefc7ba3b4efe3 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Sat, 31 Oct 2020 13:12:45 -0300 Subject: [PATCH 113/187] Switch to GitHub actions --- .github/workflows/build.yml | 109 ++++++++++++++++++++++++++++++++++++ .travis.yml | 50 ----------------- README.md | 2 +- 3 files changed, 110 insertions(+), 51 deletions(-) create mode 100644 .github/workflows/build.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..2f686be361 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,109 @@ +on: + - pull_request + - push + +name: build + +jobs: + tests: + name: PHP ${{ matrix.php }}-mysql-${{ matrix.mysql }} + + env: + extensions: dom, json, gd, imagick, pdo, pdo_mysql + key: cache-v1 + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: + - ubuntu-latest + + php: + - "5.6" + - "7.0" + - "7.1" + - "7.2" + - "7.3" + - "7.4" + + mysql: + - "5.7" + + services: + mysql: + image: mysql:${{ matrix.mysql }} + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: yii2advanced_test + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup cache environment + id: cache-env + uses: shivammathur/cache-extensions@v1 + with: + php-version: ${{ matrix.php }} + extensions: ${{ env.extensions }} + key: ${{ env.key }} + + - name: Cache extensions + uses: actions/cache@v1 + with: + path: ${{ steps.cache-env.outputs.dir }} + key: ${{ steps.cache-env.outputs.key }} + restore-keys: ${{ steps.cache-env.outputs.key }} + + - name: Install PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: ${{ env.extensions }} + ini-values: date.timezone='UTC' + coverage: pcov + + - name: Determine composer cache directory on Linux + if: matrix.os == 'ubuntu-latest' + run: echo "::set-env name=COMPOSER_CACHE_DIR::$(composer config cache-dir)" + + - name: Cache dependencies installed with composer + uses: actions/cache@v1 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: php${{ matrix.php }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php }}-composer-${{ matrix.dependencies }}- + + - name: Install dependencies with composer + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + + - name: Setup app advanced + run: | + ./init --env=Development + sed -i "s/'dsn' => 'mysql:host=localhost;dbname=yii2advanced_test'/'dsn' => 'mysql:host=127.0.0.1;dbname=yii2advanced_test'/" common/config/test-local.php + sed -i "/'db'/a 'username' => 'root'," common/config/test-local.php + sed -i "/'db'/a 'password' => 'root'," common/config/test-local.php + sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" frontend/config/main.php + sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" backend/config/main.php + + - name: Apply migration + run: php yii_test migrate --interactive=0 + + - name: Run tests with codeception and coverage on Linux php 7.4 and mysql latest + if: matrix.php == '7.4' + run: vendor/bin/codecept run --coverage --coverage-xml + + - name: Run tests with codeception on Linux + if: matrix.php != '7.4' + run: vendor/bin/codecept run + + - name: Code coverage + if: matrix.php == '7.4' + run: | + wget https://scrutinizer-ci.com/ocular.phar + php ocular.phar code-coverage:upload --format=php-clover tests/_output/coverage.xml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 927efed3ba..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,50 +0,0 @@ -language: php - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.2 -# - hhvm - -# faster builds on new travis setup not using sudo -sudo: false - -services: - - mysql - -# cache vendor dirs -cache: - directories: - - $HOME/.composer/cache - -before_install: - - export COMPOSER_MEMORY_LIMIT=-1 - -install: - - travis_retry composer self-update && composer --version - - travis_retry composer update --dev --prefer-dist --no-interaction - # install php extensions - - | - if (php --version | grep -i HipHop > /dev/null); then - echo "Skipping imagick and gmagick tests on HHVM" - else - pear config-set preferred_state beta - printf "\n" | pecl install imagick - # gmagick is not installed on travis currently - #printf "\n" | pecl install gmagick - fi -# setup application: - - | - ./init --env=Development - sed -i s/root/travis/ common/config/main-local.php - sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" frontend/config/main.php - sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" backend/config/main.php - -before_script: - - mysql -e 'CREATE DATABASE yii2advanced_test;' - - php yii_test migrate --interactive=0 - -script: - - composer validate --strict - - vendor/bin/codecept run diff --git a/README.md b/README.md index 38965153a1..68d084153d 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Documentation is at [docs/guide/README.md](docs/guide/README.md). [![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced) [![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced) -[![Build Status](https://travis-ci.com/yiisoft/yii2-app-advanced.svg?branch=master)](https://travis-ci.com/yiisoft/yii2-app-advanced) +[![build](https://github.com/yiisoft/yii2-app-advanced/workflows/build/badge.svg)](https://github.com/yiisoft/yii2-app-advanced/actions?query=workflow%3Abuild) DIRECTORY STRUCTURE ------------------- From 835e0a271076029364451d6fff433c8e86115cdf Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Sat, 31 Oct 2020 13:24:41 -0300 Subject: [PATCH 114/187] Remove unsed code coverage. (#485) --- .github/workflows/build.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2f686be361..c2192580e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -94,16 +94,5 @@ jobs: - name: Apply migration run: php yii_test migrate --interactive=0 - - name: Run tests with codeception and coverage on Linux php 7.4 and mysql latest - if: matrix.php == '7.4' - run: vendor/bin/codecept run --coverage --coverage-xml - - - name: Run tests with codeception on Linux - if: matrix.php != '7.4' + - name: Run tests with codeception run: vendor/bin/codecept run - - - name: Code coverage - if: matrix.php == '7.4' - run: | - wget https://scrutinizer-ci.com/ocular.phar - php ocular.phar code-coverage:upload --format=php-clover tests/_output/coverage.xml From e24093f73785791aeec3c89a97afddca8877d22d Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 10 Nov 2020 14:08:26 +0300 Subject: [PATCH 115/187] release version 2.0.39 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From e16210d26541418dbe2511b9c7f7e48985221b42 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 10 Nov 2020 14:08:43 +0300 Subject: [PATCH 116/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 8b96f6dc3b5ff92f5cf02e3a5622fdfd6c994914 Mon Sep 17 00:00:00 2001 From: Deryabin Sergey Date: Wed, 11 Nov 2020 00:59:54 +0300 Subject: [PATCH 117/187] Update pipline syntax --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c2192580e7..d811feb5ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,7 +69,7 @@ jobs: - name: Determine composer cache directory on Linux if: matrix.os == 'ubuntu-latest' - run: echo "::set-env name=COMPOSER_CACHE_DIR::$(composer config cache-dir)" + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV - name: Cache dependencies installed with composer uses: actions/cache@v1 From 26ca43865095212c02f64b0d257c715a24674fdd Mon Sep 17 00:00:00 2001 From: Deryabin Sergey Date: Mon, 21 Dec 2020 11:45:42 +0300 Subject: [PATCH 118/187] Fix #489: Bump docker container version to 7.4 --- backend/Dockerfile | 2 +- frontend/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index f4a98f44dc..434b4e10ee 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM yiisoftware/yii2-php:7.2-apache +FROM yiisoftware/yii2-php:7.4-apache # Change document root for Apache RUN sed -i -e 's|/app/web|/app/backend/web|g' /etc/apache2/sites-available/000-default.conf \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 24364f2846..c5020f9d62 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM yiisoftware/yii2-php:7.2-apache +FROM yiisoftware/yii2-php:7.4-apache # Change document root for Apache RUN sed -i -e 's|/app/web|/app/frontend/web|g' /etc/apache2/sites-available/000-default.conf \ No newline at end of file From bc805873826c4507b95991fac9c5eba91e8d7294 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 23 Dec 2020 18:54:13 +0300 Subject: [PATCH 119/187] release version 2.0.40 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 803fd1d80288db98039012a644e45091e8b1d3b8 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 23 Dec 2020 18:54:29 +0300 Subject: [PATCH 120/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 4dff0608f7a6bb8c0f0423c00b210916e00e9785 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 3 Mar 2021 01:18:22 +0300 Subject: [PATCH 121/187] Invalidate authentication key on password change --- frontend/models/ResetPasswordForm.php | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/models/ResetPasswordForm.php b/frontend/models/ResetPasswordForm.php index ab52674957..0872118a5c 100644 --- a/frontend/models/ResetPasswordForm.php +++ b/frontend/models/ResetPasswordForm.php @@ -59,6 +59,7 @@ public function resetPassword() $user = $this->_user; $user->setPassword($this->password); $user->removePasswordResetToken(); + $user->generateAuthKey(); return $user->save(false); } From 33b0d62849bb049c03d510fff93a58fd444ae80a Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 4 Mar 2021 01:02:28 +0300 Subject: [PATCH 122/187] release version 2.0.41 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 24cb3ae557a7abcea98788841b993345edd0e80c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 4 Mar 2021 01:02:49 +0300 Subject: [PATCH 123/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From de14d904374180c024e87109f9c4cf690c8577eb Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 6 May 2021 00:18:10 +0300 Subject: [PATCH 124/187] release version 2.0.42 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..f555d9e79a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 135544fdf5547239c852b79d9417aef87fa9681e Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 6 May 2021 00:18:23 +0300 Subject: [PATCH 125/187] prepare for next release --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f555d9e79a..4729e0cf1e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.6.0", "yiisoft/yii2": "~2.0.14", From 7cfd14dbe62512a32a690ed07e56b066fb2b8406 Mon Sep 17 00:00:00 2001 From: sinus Date: Sun, 9 May 2021 02:27:01 +0500 Subject: [PATCH 126/187] Update Gii (#500) --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4729e0cf1e..d06f7a6f67 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ }, "require-dev": { "yiisoft/yii2-debug": "~2.1.0", - "yiisoft/yii2-gii": "~2.1.0", + "yiisoft/yii2-gii": "~2.2.0", "yiisoft/yii2-faker": "~2.0.0", "codeception/codeception": "^4.0", "codeception/module-asserts": "^1.0", From 9b58b89ba26445c1100de629bd5efdd29e168573 Mon Sep 17 00:00:00 2001 From: Bizley Date: Wed, 19 May 2021 14:06:10 +0200 Subject: [PATCH 127/187] Use Bootstrap 4 (#501) --- .github/workflows/build.yml | 1 + backend/assets/AppAsset.php | 2 +- backend/controllers/SiteController.php | 22 +++-- backend/tests/_bootstrap.php | 1 + backend/tests/_support/FunctionalTester.php | 1 + backend/tests/_support/UnitTester.php | 1 + backend/views/layouts/blank.php | 17 ++-- backend/views/layouts/main.php | 36 +++---- backend/views/site/index.php | 10 +- backend/views/site/login.php | 30 +++--- backend/web/css/site.css | 93 +++++-------------- common/fixtures/UserFixture.php | 3 +- common/mail/emailVerify-html.php | 1 + common/mail/layouts/html.php | 4 +- common/mail/layouts/text.php | 4 +- common/mail/passwordResetToken-html.php | 1 + common/models/LoginForm.php | 1 + common/models/User.php | 1 + common/tests/_bootstrap.php | 2 +- common/tests/_support/UnitTester.php | 1 + common/widgets/Alert.php | 5 +- composer.json | 2 +- console/config/main.php | 1 + console/config/params.php | 1 + console/config/test.php | 4 +- docs/guide-es/start-composer.md | 4 +- docs/guide-fr/start-composer.md | 4 +- docs/guide-ja/start-composer.md | 4 +- docs/guide-pl/start-composer.md | 4 +- docs/guide-pt-BR/start-composer.md | 4 +- docs/guide-zh-CN/start-composer.md | 4 +- docs/guide/start-composer.md | 4 +- docs/guide/start-installation.md | 7 +- .../dev/backend/config/params-local.php | 1 + .../dev/backend/config/test-local.php | 1 + environments/dev/backend/web/index.php | 1 + environments/dev/common/config/main-local.php | 1 + .../dev/common/config/params-local.php | 1 + environments/dev/common/config/test-local.php | 1 + .../dev/console/config/main-local.php | 1 + .../dev/console/config/params-local.php | 1 + .../dev/console/config/test-local.php | 3 +- .../dev/frontend/config/params-local.php | 1 + .../dev/frontend/config/test-local.php | 1 + environments/dev/frontend/web/index.php | 1 + .../prod/backend/config/main-local.php | 1 + .../prod/backend/config/params-local.php | 1 + environments/prod/backend/web/index.php | 1 + .../prod/common/config/main-local.php | 1 + .../prod/common/config/params-local.php | 1 + .../prod/console/config/main-local.php | 1 + .../prod/console/config/params-local.php | 1 + .../prod/frontend/config/main-local.php | 1 + .../prod/frontend/config/params-local.php | 1 + environments/prod/frontend/web/index.php | 1 + frontend/assets/AppAsset.php | 2 +- frontend/controllers/SiteController.php | 33 ++++--- frontend/models/PasswordResetRequestForm.php | 1 + .../models/ResendVerificationEmailForm.php | 1 - frontend/models/ResetPasswordForm.php | 1 + frontend/models/SignupForm.php | 3 +- frontend/tests/_bootstrap.php | 1 + frontend/tests/_data/login_data.php | 1 + frontend/tests/_support/FunctionalTester.php | 5 +- frontend/tests/_support/UnitTester.php | 1 + frontend/tests/acceptance/HomeCest.php | 1 + frontend/tests/functional/AboutCest.php | 1 + frontend/tests/functional/ContactCest.php | 1 + frontend/tests/functional/SignupCest.php | 6 +- .../tests/unit/models/ContactFormTest.php | 1 + frontend/tests/unit/models/SignupFormTest.php | 1 + frontend/views/layouts/main.php | 38 ++++---- frontend/views/site/contact.php | 6 +- frontend/views/site/index.php | 10 +- frontend/views/site/login.php | 6 +- .../views/site/requestPasswordResetToken.php | 6 +- .../views/site/resendVerificationEmail.php | 7 +- frontend/views/site/resetPassword.php | 6 +- frontend/views/site/signup.php | 6 +- frontend/web/css/site.css | 76 +++++---------- 80 files changed, 248 insertions(+), 277 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d811feb5ff..ed9da1531a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,6 +26,7 @@ jobs: - "7.2" - "7.3" - "7.4" + - "8.0" mysql: - "5.7" diff --git a/backend/assets/AppAsset.php b/backend/assets/AppAsset.php index 940c0af646..a93f5c3c0b 100644 --- a/backend/assets/AppAsset.php +++ b/backend/assets/AppAsset.php @@ -18,6 +18,6 @@ class AppAsset extends AssetBundle ]; public $depends = [ 'yii\web\YiiAsset', - 'yii\bootstrap\BootstrapAsset', + 'yii\bootstrap4\BootstrapAsset', ]; } diff --git a/backend/controllers/SiteController.php b/backend/controllers/SiteController.php index b1f73254b2..820a2008dd 100644 --- a/backend/controllers/SiteController.php +++ b/backend/controllers/SiteController.php @@ -1,11 +1,13 @@ load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); - } else { - $model->password = ''; - - return $this->render('login', [ - 'model' => $model, - ]); } + + $model->password = ''; + + return $this->render('login', [ + 'model' => $model, + ]); } /** * Logout action. * - * @return string + * @return Response */ public function actionLogout() { diff --git a/backend/tests/_bootstrap.php b/backend/tests/_bootstrap.php index 44f5e81b65..637ce14f0f 100644 --- a/backend/tests/_bootstrap.php +++ b/backend/tests/_bootstrap.php @@ -1,4 +1,5 @@ beginPage() ?> - + - - + registerCsrfMetaTags() ?> <?= Html::encode($this->title) ?> head() ?> - + beginBody() ?> -
- -
+
+
- -
+ endBody() ?> -endPage() ?> +endPage(); diff --git a/backend/views/layouts/main.php b/backend/views/layouts/main.php index 4329c6d6fa..8f814c9b38 100644 --- a/backend/views/layouts/main.php +++ b/backend/views/layouts/main.php @@ -4,35 +4,34 @@ /* @var $content string */ use backend\assets\AppAsset; -use yii\helpers\Html; -use yii\bootstrap\Nav; -use yii\bootstrap\NavBar; -use yii\widgets\Breadcrumbs; use common\widgets\Alert; +use yii\bootstrap4\Breadcrumbs; +use yii\bootstrap4\Html; +use yii\bootstrap4\Nav; +use yii\bootstrap4\NavBar; AppAsset::register($this); ?> beginPage() ?> - + - - + registerCsrfMetaTags() ?> <?= Html::encode($this->title) ?> head() ?> - + beginBody() ?> -
+
Yii::$app->name, 'brandUrl' => Yii::$app->homeUrl, 'options' => [ - 'class' => 'navbar-inverse navbar-fixed-top', + 'class' => 'navbar navbar-expand-md navbar-dark bg-dark fixed-top', ], ]); $menuItems = [ @@ -42,7 +41,7 @@ $menuItems[] = ['label' => 'Login', 'url' => ['/site/login']]; } else { $menuItems[] = '
  • ' - . Html::beginForm(['/site/logout'], 'post') + . Html::beginForm(['/site/logout'], 'post', ['class' => 'form-inline']) . Html::submitButton( 'Logout (' . Yii::$app->user->identity->username . ')', ['class' => 'btn btn-link logout'] @@ -51,12 +50,14 @@ . '
  • '; } echo Nav::widget([ - 'options' => ['class' => 'navbar-nav navbar-right'], + 'options' => ['class' => 'navbar-nav'], 'items' => $menuItems, ]); NavBar::end(); ?> +
    +
    isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], @@ -64,17 +65,16 @@
    -
    + -