From a7a02e1e446b8bee6e63be22a0edc33fe88064e3 Mon Sep 17 00:00:00 2001 From: modares Date: Mon, 18 May 2020 16:02:05 -0700 Subject: [PATCH 1/9] module retro --- Pipfile | 14 ++ Pipfile.lock | 179 ++++++++++++++++++ .../web_app/__init__.py | 16 ++ .../web_app/routes/book_routes.py | 35 ++++ .../web_app/routes/home_routes.py | 14 ++ .../web_app/templates/books.html | 14 ++ 6 files changed, 272 insertions(+) create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 module1-web-application-development-with-flask/web_app/__init__.py create mode 100644 module1-web-application-development-with-flask/web_app/routes/book_routes.py create mode 100644 module1-web-application-development-with-flask/web_app/routes/home_routes.py create mode 100644 module1-web-application-development-with-flask/web_app/templates/books.html diff --git a/Pipfile b/Pipfile new file mode 100644 index 00000000..5aef96e4 --- /dev/null +++ b/Pipfile @@ -0,0 +1,14 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +flask = "*" +flask-sqlalchemy = "*" +flask-migrate = "*" + +[requires] +python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 00000000..cb425b6b --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,179 @@ +{ + "_meta": { + "hash": { + "sha256": "0d0656ea395efb10f6c8c22e3976488f199c8929a15bcaa17f644ef4ec76bdd6" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "alembic": { + "hashes": [ + "sha256:035ab00497217628bf5d0be82d664d8713ab13d37b630084da8e1f98facf4dbf" + ], + "version": "==1.4.2" + }, + "click": { + "hashes": [ + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + ], + "version": "==7.1.2" + }, + "flask": { + "hashes": [ + "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", + "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557" + ], + "index": "pypi", + "version": "==1.1.2" + }, + "flask-migrate": { + "hashes": [ + "sha256:4dc4a5cce8cbbb06b8dc963fd86cf8136bd7d875aabe2d840302ea739b243732", + "sha256:a69d508c2e09d289f6e55a417b3b8c7bfe70e640f53d2d9deb0d056a384f37ee" + ], + "index": "pypi", + "version": "==2.5.3" + }, + "flask-sqlalchemy": { + "hashes": [ + "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327", + "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d" + ], + "index": "pypi", + "version": "==2.4.1" + }, + "itsdangerous": { + "hashes": [ + "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", + "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" + ], + "version": "==1.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", + "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" + ], + "version": "==2.11.2" + }, + "mako": { + "hashes": [ + "sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d", + "sha256:8e8b53c71c7e59f3de716b6832c4e401d903af574f6962edbbbf6ecc2a5fe6c9" + ], + "version": "==1.1.2" + }, + "markupsafe": { + "hashes": [ + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" + ], + "version": "==1.1.1" + }, + "python-dateutil": { + "hashes": [ + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + ], + "version": "==2.8.1" + }, + "python-editor": { + "hashes": [ + "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d", + "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b", + "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8" + ], + "version": "==1.0.4" + }, + "six": { + "hashes": [ + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" + ], + "version": "==1.14.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:128bc917ed20d78143a45024455ff0aed7d3b96772eba13d5dbaf9cc57e5c41b", + "sha256:156a27548ba4e1fed944ff9fcdc150633e61d350d673ae7baaf6c25c04ac1f71", + "sha256:27e2efc8f77661c9af2681755974205e7462f1ae126f498f4fe12a8b24761d15", + "sha256:2a12f8be25b9ea3d1d5b165202181f2b7da4b3395289000284e5bb86154ce87c", + "sha256:31c043d5211aa0e0773821fcc318eb5cbe2ec916dfbc4c6eea0c5188971988eb", + "sha256:65eb3b03229f684af0cf0ad3bcc771970c1260a82a791a8d07bffb63d8c95bcc", + "sha256:6cd157ce74a911325e164441ff2d9b4e244659a25b3146310518d83202f15f7a", + "sha256:703c002277f0fbc3c04d0ae4989a174753a7554b2963c584ce2ec0cddcf2bc53", + "sha256:869bbb637de58ab0a912b7f20e9192132f9fbc47fc6b5111cd1e0f6cdf5cf9b0", + "sha256:8a0e0cd21da047ea10267c37caf12add400a92f0620c8bc09e4a6531a765d6d7", + "sha256:8d01e949a5d22e5c4800d59b50617c56125fc187fbeb8fa423e99858546de616", + "sha256:925b4fe5e7c03ed76912b75a9a41dfd682d59c0be43bce88d3b27f7f5ba028fb", + "sha256:9cb1819008f0225a7c066cac8bb0cf90847b2c4a6eb9ebb7431dbd00c56c06c5", + "sha256:a87d496884f40c94c85a647c385f4fd5887941d2609f71043e2b73f2436d9c65", + "sha256:a9030cd30caf848a13a192c5e45367e3c6f363726569a56e75dc1151ee26d859", + "sha256:a9e75e49a0f1583eee0ce93270232b8e7bb4b1edc89cc70b07600d525aef4f43", + "sha256:b50f45d0e82b4562f59f0e0ca511f65e412f2a97d790eea5f60e34e5f1aabc9a", + "sha256:b7878e59ec31f12d54b3797689402ee3b5cfcb5598f2ebf26491732758751908", + "sha256:ce1ddaadee913543ff0154021d31b134551f63428065168e756d90bdc4c686f5", + "sha256:ce2646e4c0807f3461be0653502bb48c6e91a5171d6e450367082c79e12868bf", + "sha256:ce6c3d18b2a8ce364013d47b9cad71db815df31d55918403f8db7d890c9d07ae", + "sha256:e4e2664232005bd306f878b0f167a31f944a07c4de0152c444f8c61bbe3cfb38", + "sha256:e8aa395482728de8bdcca9cc0faf3765ab483e81e01923aaa736b42f0294f570", + "sha256:eb4fcf7105bf071c71068c6eee47499ab8d4b8f5a11fc35147c934f0faa60f23", + "sha256:ed375a79f06cad285166e5be74745df1ed6845c5624aafadec4b7a29c25866ef", + "sha256:f35248f7e0d63b234a109dd72fbfb4b5cb6cb6840b221d0df0ecbf54ab087654", + "sha256:f502ef245c492b391e0e23e94cba030ab91722dcc56963c85bfd7f3441ea2bbe", + "sha256:fe01bac7226499aedf472c62fa3b85b2c619365f3f14dd222ffe4f3aa91e5f98" + ], + "version": "==1.3.17" + }, + "werkzeug": { + "hashes": [ + "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", + "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" + ], + "version": "==1.0.1" + } + }, + "develop": {} +} diff --git a/module1-web-application-development-with-flask/web_app/__init__.py b/module1-web-application-development-with-flask/web_app/__init__.py new file mode 100644 index 00000000..1b2601e4 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/__init__.py @@ -0,0 +1,16 @@ +from flask import Flask + +from web_app.routes.home_routes import home_routes +from web_app.routes.book_routes import book_routes + + +def create_app(): + app = Flask(__name__) + app.register_blueprint(home_routes) + app.register_blueprint(book_routes) + return app + + +if __name__ == "__main__": + my_app = create_app() + my_app.run(debug=True) \ No newline at end of file diff --git a/module1-web-application-development-with-flask/web_app/routes/book_routes.py b/module1-web-application-development-with-flask/web_app/routes/book_routes.py new file mode 100644 index 00000000..39edf639 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/routes/book_routes.py @@ -0,0 +1,35 @@ + +from flask import Blueprint, jsonify, request, render_template + +book_routes = Blueprint("book_routes", __name__) + + +@book_routes.route("/books.json") +def list_books(): + books = [ + {"id": 1, "title": "Book 1"}, + {"id": 2, "title": "Book 2"}, + {"id": 3, "title": "Book 3"}, + ] + return jsonify(books) + + +@book_routes.route("/books") +def list_books(): + books = [ + {"id": 1, "title": "Book 1"}, + {"id": 2, "title": "Book 2"}, + {"id": 3, "title": "Book 3"}, + ] + return render_template("books.html", message="Here's some books", books=books) + + +# @book_routes.route("/books/new") +# def new_book(): +# return render_template("new_book.html") + + + + + + diff --git a/module1-web-application-development-with-flask/web_app/routes/home_routes.py b/module1-web-application-development-with-flask/web_app/routes/home_routes.py new file mode 100644 index 00000000..e8cee3bd --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/routes/home_routes.py @@ -0,0 +1,14 @@ +from flask import Blueprint + +home_routes = Blueprint("home_routes", __name__) + + +@home_routes.route("/") +def index(): + x = 2 + 2 + return f"Hello World {x}" + + +@home_routes.route("/about") +def about(): + return "about me" \ No newline at end of file diff --git a/module1-web-application-development-with-flask/web_app/templates/books.html b/module1-web-application-development-with-flask/web_app/templates/books.html new file mode 100644 index 00000000..47415050 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/templates/books.html @@ -0,0 +1,14 @@ + + + + + + Document + + + +

aaaaaaa

+ + + + \ No newline at end of file From 3b7a06eb08a52d8422ecdc0133c0cf6963350ff8 Mon Sep 17 00:00:00 2001 From: modares Date: Tue, 19 May 2020 09:01:57 -0700 Subject: [PATCH 2/9] finished replicating --- .../.gitignore | 3 + .../Pipfile | 14 ++ .../Pipfile.lock | 179 ++++++++++++++++++ .../web_app/__init__.py | 9 + .../web_app/models.py | 21 ++ .../web_app/routes/book_routes.py | 40 ++-- .../web_app/templates/books.html | 12 +- .../web_app/templates/new_book.html | 24 +++ 8 files changed, 285 insertions(+), 17 deletions(-) create mode 100644 module1-web-application-development-with-flask/.gitignore create mode 100644 module1-web-application-development-with-flask/Pipfile create mode 100644 module1-web-application-development-with-flask/Pipfile.lock create mode 100644 module1-web-application-development-with-flask/web_app/models.py create mode 100644 module1-web-application-development-with-flask/web_app/templates/new_book.html diff --git a/module1-web-application-development-with-flask/.gitignore b/module1-web-application-development-with-flask/.gitignore new file mode 100644 index 00000000..09ae28fa --- /dev/null +++ b/module1-web-application-development-with-flask/.gitignore @@ -0,0 +1,3 @@ +migrations/ + +test_db.db \ No newline at end of file diff --git a/module1-web-application-development-with-flask/Pipfile b/module1-web-application-development-with-flask/Pipfile new file mode 100644 index 00000000..5aef96e4 --- /dev/null +++ b/module1-web-application-development-with-flask/Pipfile @@ -0,0 +1,14 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +flask = "*" +flask-sqlalchemy = "*" +flask-migrate = "*" + +[requires] +python_version = "3.6" diff --git a/module1-web-application-development-with-flask/Pipfile.lock b/module1-web-application-development-with-flask/Pipfile.lock new file mode 100644 index 00000000..cb425b6b --- /dev/null +++ b/module1-web-application-development-with-flask/Pipfile.lock @@ -0,0 +1,179 @@ +{ + "_meta": { + "hash": { + "sha256": "0d0656ea395efb10f6c8c22e3976488f199c8929a15bcaa17f644ef4ec76bdd6" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "alembic": { + "hashes": [ + "sha256:035ab00497217628bf5d0be82d664d8713ab13d37b630084da8e1f98facf4dbf" + ], + "version": "==1.4.2" + }, + "click": { + "hashes": [ + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + ], + "version": "==7.1.2" + }, + "flask": { + "hashes": [ + "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", + "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557" + ], + "index": "pypi", + "version": "==1.1.2" + }, + "flask-migrate": { + "hashes": [ + "sha256:4dc4a5cce8cbbb06b8dc963fd86cf8136bd7d875aabe2d840302ea739b243732", + "sha256:a69d508c2e09d289f6e55a417b3b8c7bfe70e640f53d2d9deb0d056a384f37ee" + ], + "index": "pypi", + "version": "==2.5.3" + }, + "flask-sqlalchemy": { + "hashes": [ + "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327", + "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d" + ], + "index": "pypi", + "version": "==2.4.1" + }, + "itsdangerous": { + "hashes": [ + "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", + "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" + ], + "version": "==1.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", + "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" + ], + "version": "==2.11.2" + }, + "mako": { + "hashes": [ + "sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d", + "sha256:8e8b53c71c7e59f3de716b6832c4e401d903af574f6962edbbbf6ecc2a5fe6c9" + ], + "version": "==1.1.2" + }, + "markupsafe": { + "hashes": [ + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" + ], + "version": "==1.1.1" + }, + "python-dateutil": { + "hashes": [ + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + ], + "version": "==2.8.1" + }, + "python-editor": { + "hashes": [ + "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d", + "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b", + "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8" + ], + "version": "==1.0.4" + }, + "six": { + "hashes": [ + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" + ], + "version": "==1.14.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:128bc917ed20d78143a45024455ff0aed7d3b96772eba13d5dbaf9cc57e5c41b", + "sha256:156a27548ba4e1fed944ff9fcdc150633e61d350d673ae7baaf6c25c04ac1f71", + "sha256:27e2efc8f77661c9af2681755974205e7462f1ae126f498f4fe12a8b24761d15", + "sha256:2a12f8be25b9ea3d1d5b165202181f2b7da4b3395289000284e5bb86154ce87c", + "sha256:31c043d5211aa0e0773821fcc318eb5cbe2ec916dfbc4c6eea0c5188971988eb", + "sha256:65eb3b03229f684af0cf0ad3bcc771970c1260a82a791a8d07bffb63d8c95bcc", + "sha256:6cd157ce74a911325e164441ff2d9b4e244659a25b3146310518d83202f15f7a", + "sha256:703c002277f0fbc3c04d0ae4989a174753a7554b2963c584ce2ec0cddcf2bc53", + "sha256:869bbb637de58ab0a912b7f20e9192132f9fbc47fc6b5111cd1e0f6cdf5cf9b0", + "sha256:8a0e0cd21da047ea10267c37caf12add400a92f0620c8bc09e4a6531a765d6d7", + "sha256:8d01e949a5d22e5c4800d59b50617c56125fc187fbeb8fa423e99858546de616", + "sha256:925b4fe5e7c03ed76912b75a9a41dfd682d59c0be43bce88d3b27f7f5ba028fb", + "sha256:9cb1819008f0225a7c066cac8bb0cf90847b2c4a6eb9ebb7431dbd00c56c06c5", + "sha256:a87d496884f40c94c85a647c385f4fd5887941d2609f71043e2b73f2436d9c65", + "sha256:a9030cd30caf848a13a192c5e45367e3c6f363726569a56e75dc1151ee26d859", + "sha256:a9e75e49a0f1583eee0ce93270232b8e7bb4b1edc89cc70b07600d525aef4f43", + "sha256:b50f45d0e82b4562f59f0e0ca511f65e412f2a97d790eea5f60e34e5f1aabc9a", + "sha256:b7878e59ec31f12d54b3797689402ee3b5cfcb5598f2ebf26491732758751908", + "sha256:ce1ddaadee913543ff0154021d31b134551f63428065168e756d90bdc4c686f5", + "sha256:ce2646e4c0807f3461be0653502bb48c6e91a5171d6e450367082c79e12868bf", + "sha256:ce6c3d18b2a8ce364013d47b9cad71db815df31d55918403f8db7d890c9d07ae", + "sha256:e4e2664232005bd306f878b0f167a31f944a07c4de0152c444f8c61bbe3cfb38", + "sha256:e8aa395482728de8bdcca9cc0faf3765ab483e81e01923aaa736b42f0294f570", + "sha256:eb4fcf7105bf071c71068c6eee47499ab8d4b8f5a11fc35147c934f0faa60f23", + "sha256:ed375a79f06cad285166e5be74745df1ed6845c5624aafadec4b7a29c25866ef", + "sha256:f35248f7e0d63b234a109dd72fbfb4b5cb6cb6840b221d0df0ecbf54ab087654", + "sha256:f502ef245c492b391e0e23e94cba030ab91722dcc56963c85bfd7f3441ea2bbe", + "sha256:fe01bac7226499aedf472c62fa3b85b2c619365f3f14dd222ffe4f3aa91e5f98" + ], + "version": "==1.3.17" + }, + "werkzeug": { + "hashes": [ + "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", + "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" + ], + "version": "==1.0.1" + } + }, + "develop": {} +} diff --git a/module1-web-application-development-with-flask/web_app/__init__.py b/module1-web-application-development-with-flask/web_app/__init__.py index 1b2601e4..3b00395e 100644 --- a/module1-web-application-development-with-flask/web_app/__init__.py +++ b/module1-web-application-development-with-flask/web_app/__init__.py @@ -2,10 +2,19 @@ from web_app.routes.home_routes import home_routes from web_app.routes.book_routes import book_routes +from web_app.models import db, migrate + + +DATABASE_URI = "sqlite:///test_db.db" def create_app(): app = Flask(__name__) + + app.config["SQLALCHEMY_DATABASE_URI"] = DATABASE_URI + db.init_app(app) + migrate.init_app(app, db) + app.register_blueprint(home_routes) app.register_blueprint(book_routes) return app diff --git a/module1-web-application-development-with-flask/web_app/models.py b/module1-web-application-development-with-flask/web_app/models.py new file mode 100644 index 00000000..b10d72b7 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/models.py @@ -0,0 +1,21 @@ + + +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate + + +db = SQLAlchemy() + +migrate = Migrate() + + +class Book(db.Model): + __table_name__ = "books" + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(128)) + author_id = db.Column(db.String(128)) + + +class User(db.Model): + __table_name__ = "users" + diff --git a/module1-web-application-development-with-flask/web_app/routes/book_routes.py b/module1-web-application-development-with-flask/web_app/routes/book_routes.py index 39edf639..d13d4eb0 100644 --- a/module1-web-application-development-with-flask/web_app/routes/book_routes.py +++ b/module1-web-application-development-with-flask/web_app/routes/book_routes.py @@ -1,33 +1,41 @@ -from flask import Blueprint, jsonify, request, render_template +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import Book, db book_routes = Blueprint("book_routes", __name__) @book_routes.route("/books.json") -def list_books(): - books = [ - {"id": 1, "title": "Book 1"}, - {"id": 2, "title": "Book 2"}, - {"id": 3, "title": "Book 3"}, - ] +def list_books_json(): + book_records = Book.query.all() return jsonify(books) @book_routes.route("/books") def list_books(): - books = [ - {"id": 1, "title": "Book 1"}, - {"id": 2, "title": "Book 2"}, - {"id": 3, "title": "Book 3"}, - ] - return render_template("books.html", message="Here's some books", books=books) + book_records = Book.query.all() + return render_template("books.html", message="Here's some books", books=book_records) + + +@book_routes.route("/books/new") +def new_book(): + return render_template("new_book.html") -# @book_routes.route("/books/new") -# def new_book(): -# return render_template("new_book.html") +@book_routes.route("/books/create", methods=["POST"]) +def create_book(): + print("FORM DATA:", dict(request.form)) + # st() + new_book = Book(title=request.form["Book_title"], author_id=request.form["author_name"]) + db.session.add(new_book) + db.session.commit() + # return jsonify({ + # "message": "BOOK CREATED OK", + # "book": dict(request.form) + # }) + return redirect(f"/books") diff --git a/module1-web-application-development-with-flask/web_app/templates/books.html b/module1-web-application-development-with-flask/web_app/templates/books.html index 47415050..d6737885 100644 --- a/module1-web-application-development-with-flask/web_app/templates/books.html +++ b/module1-web-application-development-with-flask/web_app/templates/books.html @@ -7,7 +7,17 @@ -

aaaaaaa

+ {% if books %} + + {% else %} +

no books!

+ {% endif %} diff --git a/module1-web-application-development-with-flask/web_app/templates/new_book.html b/module1-web-application-development-with-flask/web_app/templates/new_book.html new file mode 100644 index 00000000..04f7cd98 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/templates/new_book.html @@ -0,0 +1,24 @@ + + + + + + Document + + +

New Book message

+

fill this form

+
+ + + + + + +
+ + \ No newline at end of file From b30a008439f4514f332f7ec9846ab26ebb865c24 Mon Sep 17 00:00:00 2001 From: modares Date: Tue, 19 May 2020 13:41:31 -0700 Subject: [PATCH 3/9] module1 works now --- .../web_app/__init__.py | 2 + .../web_app/models.py | 12 +- .../web_app/routes/book_routes.py | 18 +-- .../web_app/routes/user_routes.py | 21 ++++ .../web_app/templates/new_user.html | 18 +++ module2-consuming-data-from-an-api/.gitignore | 1 + .../Pipfile | 5 +- .../Pipfile.lock | 111 +++++++++++++++++- .../web_app/__init__.py | 25 ++++ .../web_app/models.py | 22 ++++ .../web_app/routes/book_routes.py | 43 +++++++ .../web_app/routes/home_routes.py | 14 +++ .../web_app/services/basilica_service.py | 17 +++ .../web_app/templates/books.html | 24 ++++ .../web_app/templates/new_book.html | 24 ++++ .../web_app/test_db.db | Bin 0 -> 16384 bytes 16 files changed, 337 insertions(+), 20 deletions(-) create mode 100644 module1-web-application-development-with-flask/web_app/routes/user_routes.py create mode 100644 module1-web-application-development-with-flask/web_app/templates/new_user.html create mode 100644 module2-consuming-data-from-an-api/.gitignore rename Pipfile => module2-consuming-data-from-an-api/Pipfile (72%) rename Pipfile.lock => module2-consuming-data-from-an-api/Pipfile.lock (64%) create mode 100644 module2-consuming-data-from-an-api/web_app/__init__.py create mode 100644 module2-consuming-data-from-an-api/web_app/models.py create mode 100644 module2-consuming-data-from-an-api/web_app/routes/book_routes.py create mode 100644 module2-consuming-data-from-an-api/web_app/routes/home_routes.py create mode 100644 module2-consuming-data-from-an-api/web_app/services/basilica_service.py create mode 100644 module2-consuming-data-from-an-api/web_app/templates/books.html create mode 100644 module2-consuming-data-from-an-api/web_app/templates/new_book.html create mode 100644 module2-consuming-data-from-an-api/web_app/test_db.db diff --git a/module1-web-application-development-with-flask/web_app/__init__.py b/module1-web-application-development-with-flask/web_app/__init__.py index 3b00395e..3f38b651 100644 --- a/module1-web-application-development-with-flask/web_app/__init__.py +++ b/module1-web-application-development-with-flask/web_app/__init__.py @@ -2,6 +2,7 @@ from web_app.routes.home_routes import home_routes from web_app.routes.book_routes import book_routes +from web_app.routes.user_routes import user_routes from web_app.models import db, migrate @@ -17,6 +18,7 @@ def create_app(): app.register_blueprint(home_routes) app.register_blueprint(book_routes) + app.register_blueprint(user_routes) return app diff --git a/module1-web-application-development-with-flask/web_app/models.py b/module1-web-application-development-with-flask/web_app/models.py index b10d72b7..c716e68c 100644 --- a/module1-web-application-development-with-flask/web_app/models.py +++ b/module1-web-application-development-with-flask/web_app/models.py @@ -10,12 +10,18 @@ class Book(db.Model): - __table_name__ = "books" id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(128)) author_id = db.Column(db.String(128)) class User(db.Model): - __table_name__ = "users" - + # __table_name__ = "user" + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(128)) + + +class Tweet(db.Model): + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("user.id")) + text = db.Column(db.String(500)) diff --git a/module1-web-application-development-with-flask/web_app/routes/book_routes.py b/module1-web-application-development-with-flask/web_app/routes/book_routes.py index d13d4eb0..5f645447 100644 --- a/module1-web-application-development-with-flask/web_app/routes/book_routes.py +++ b/module1-web-application-development-with-flask/web_app/routes/book_routes.py @@ -9,7 +9,7 @@ @book_routes.route("/books.json") def list_books_json(): book_records = Book.query.all() - return jsonify(books) + return jsonify(book_records) @book_routes.route("/books") @@ -26,18 +26,8 @@ def new_book(): @book_routes.route("/books/create", methods=["POST"]) def create_book(): print("FORM DATA:", dict(request.form)) - # st() - new_book = Book(title=request.form["Book_title"], author_id=request.form["author_name"]) + new_book = Book(title=request.form["book_title"], author_id=request.form["author_name"]) + db.session.add(new_book) db.session.commit() - - # return jsonify({ - # "message": "BOOK CREATED OK", - # "book": dict(request.form) - # }) - return redirect(f"/books") - - - - - + return redirect(f"/books") \ No newline at end of file diff --git a/module1-web-application-development-with-flask/web_app/routes/user_routes.py b/module1-web-application-development-with-flask/web_app/routes/user_routes.py new file mode 100644 index 00000000..3370a3a0 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/routes/user_routes.py @@ -0,0 +1,21 @@ + +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import User, db + +user_routes = Blueprint("user_routes", __name__) + + +@user_routes.route("/users/new") +def new_user(): + return render_template("new_user.html") + + +@user_routes.route("/users/create", methods=["POST"]) +def create_user(): + new_user = User(username=request.form["username"]) + print("FORM DATA:", dict(request.form)) + db.session.add(new_user) + db.session.commit() + # flash("asdf") + return redirect("/users/new") \ No newline at end of file diff --git a/module1-web-application-development-with-flask/web_app/templates/new_user.html b/module1-web-application-development-with-flask/web_app/templates/new_user.html new file mode 100644 index 00000000..8df26f44 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/templates/new_user.html @@ -0,0 +1,18 @@ + + + + + + Document + + +

New user

+

fill this form

+
+ + + + +
+ + \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/.gitignore b/module2-consuming-data-from-an-api/.gitignore new file mode 100644 index 00000000..2eea525d --- /dev/null +++ b/module2-consuming-data-from-an-api/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/Pipfile b/module2-consuming-data-from-an-api/Pipfile similarity index 72% rename from Pipfile rename to module2-consuming-data-from-an-api/Pipfile index 5aef96e4..db207b85 100644 --- a/Pipfile +++ b/module2-consuming-data-from-an-api/Pipfile @@ -6,8 +6,11 @@ verify_ssl = true [dev-packages] [packages] +python-dotenv = "*" +requests = "*" +basilica = "*" +tweepy = "*" flask = "*" -flask-sqlalchemy = "*" flask-migrate = "*" [requires] diff --git a/Pipfile.lock b/module2-consuming-data-from-an-api/Pipfile.lock similarity index 64% rename from Pipfile.lock rename to module2-consuming-data-from-an-api/Pipfile.lock index cb425b6b..049829f3 100644 --- a/Pipfile.lock +++ b/module2-consuming-data-from-an-api/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0d0656ea395efb10f6c8c22e3976488f199c8929a15bcaa17f644ef4ec76bdd6" + "sha256": "8a95d2cb6f3681bad4e791c08fae5a42a54bf81565d3f42ae10847341ffc101d" }, "pipfile-spec": 6, "requires": { @@ -22,6 +22,27 @@ ], "version": "==1.4.2" }, + "basilica": { + "hashes": [ + "sha256:10d111538e7fee4ece43b9a2f0f33c8b6a34dc1a061e44c035b53ac4297e3a4d" + ], + "index": "pypi", + "version": "==0.2.8" + }, + "certifi": { + "hashes": [ + "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304", + "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519" + ], + "version": "==2020.4.5.1" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, "click": { "hashes": [ "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", @@ -50,9 +71,15 @@ "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327", "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d" ], - "index": "pypi", "version": "==2.4.1" }, + "idna": { + "hashes": [ + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" + ], + "version": "==2.9" + }, "itsdangerous": { "hashes": [ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", @@ -112,6 +139,48 @@ ], "version": "==1.1.1" }, + "oauthlib": { + "hashes": [ + "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889", + "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea" + ], + "version": "==3.1.0" + }, + "pillow": { + "hashes": [ + "sha256:04766c4930c174b46fd72d450674612ab44cca977ebbcc2dde722c6933290107", + "sha256:0e2a3bceb0fd4e0cb17192ae506d5f082b309ffe5fc370a5667959c9b2f85fa3", + "sha256:0f01e63c34f0e1e2580cc0b24e86a5ccbbfa8830909a52ee17624c4193224cd9", + "sha256:12e4bad6bddd8546a2f9771485c7e3d2b546b458ae8ff79621214119ac244523", + "sha256:1f694e28c169655c50bb89a3fa07f3b854d71eb47f50783621de813979ba87f3", + "sha256:3d25dd8d688f7318dca6d8cd4f962a360ee40346c15893ae3b95c061cdbc4079", + "sha256:4b02b9c27fad2054932e89f39703646d0c543f21d3cc5b8e05434215121c28cd", + "sha256:9744350687459234867cbebfe9df8f35ef9e1538f3e729adbd8fde0761adb705", + "sha256:a0b49960110bc6ff5fead46013bcb8825d101026d466f3a4de3476defe0fb0dd", + "sha256:ae2b270f9a0b8822b98655cb3a59cdb1bd54a34807c6c56b76dd2e786c3b7db3", + "sha256:b37bb3bd35edf53125b0ff257822afa6962649995cbdfde2791ddb62b239f891", + "sha256:b532bcc2f008e96fd9241177ec580829dee817b090532f43e54074ecffdcd97f", + "sha256:b67a6c47ed963c709ed24566daa3f95a18f07d3831334da570c71da53d97d088", + "sha256:b943e71c2065ade6fef223358e56c167fc6ce31c50bc7a02dd5c17ee4338e8ac", + "sha256:ccc9ad2460eb5bee5642eaf75a0438d7f8887d484490d5117b98edd7f33118b7", + "sha256:d23e2aa9b969cf9c26edfb4b56307792b8b374202810bd949effd1c6e11ebd6d", + "sha256:eaa83729eab9c60884f362ada982d3a06beaa6cc8b084cf9f76cae7739481dfa", + "sha256:ee94fce8d003ac9fd206496f2707efe9eadcb278d94c271f129ab36aa7181344", + "sha256:f455efb7a98557412dc6f8e463c1faf1f1911ec2432059fa3e582b6000fc90e2", + "sha256:f46e0e024346e1474083c729d50de909974237c72daca05393ee32389dabe457", + "sha256:f54be399340aa602066adb63a86a6a5d4f395adfdd9da2b9a0162ea808c7b276", + "sha256:f784aad988f12c80aacfa5b381ec21fd3f38f851720f652b9f33facc5101cf4d" + ], + "version": "==7.1.2" + }, + "pysocks": { + "hashes": [ + "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", + "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", + "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" + ], + "version": "==1.7.1" + }, "python-dateutil": { "hashes": [ "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", @@ -119,6 +188,14 @@ ], "version": "==2.8.1" }, + "python-dotenv": { + "hashes": [ + "sha256:25c0ff1a3e12f4bde8d592cc254ab075cfe734fc5dd989036716fd17ee7e5ec7", + "sha256:3b9909bc96b0edc6b01586e1eed05e71174ef4e04c71da5786370cebea53ad74" + ], + "index": "pypi", + "version": "==0.13.0" + }, "python-editor": { "hashes": [ "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d", @@ -127,6 +204,21 @@ ], "version": "==1.0.4" }, + "requests": { + "hashes": [ + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" + ], + "index": "pypi", + "version": "==2.23.0" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", + "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a" + ], + "version": "==1.3.0" + }, "six": { "hashes": [ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", @@ -167,6 +259,21 @@ ], "version": "==1.3.17" }, + "tweepy": { + "hashes": [ + "sha256:8abd828ba51a85a2b5bb7373715d6d3bb32d18ac624e3a4db02e4ef8ab48316b", + "sha256:ecc7f200c86127903017e48824efd008734814e95f3e8e9b45ce0f4120dd08db" + ], + "index": "pypi", + "version": "==3.8.0" + }, + "urllib3": { + "hashes": [ + "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", + "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" + ], + "version": "==1.25.9" + }, "werkzeug": { "hashes": [ "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", diff --git a/module2-consuming-data-from-an-api/web_app/__init__.py b/module2-consuming-data-from-an-api/web_app/__init__.py new file mode 100644 index 00000000..3b00395e --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/__init__.py @@ -0,0 +1,25 @@ +from flask import Flask + +from web_app.routes.home_routes import home_routes +from web_app.routes.book_routes import book_routes +from web_app.models import db, migrate + + +DATABASE_URI = "sqlite:///test_db.db" + + +def create_app(): + app = Flask(__name__) + + app.config["SQLALCHEMY_DATABASE_URI"] = DATABASE_URI + db.init_app(app) + migrate.init_app(app, db) + + app.register_blueprint(home_routes) + app.register_blueprint(book_routes) + return app + + +if __name__ == "__main__": + my_app = create_app() + my_app.run(debug=True) \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/models.py b/module2-consuming-data-from-an-api/web_app/models.py new file mode 100644 index 00000000..1d06460b --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/models.py @@ -0,0 +1,22 @@ + + +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate + + +db = SQLAlchemy() + +migrate = Migrate() + + +class Book(db.Model): + __table_name__ = "books" + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(128)) + author_id = db.Column(db.String(128)) + + +class User(db.Model): + __table_name__ = "users" + id = db.Column(db.Integer, primary_key=True) + diff --git a/module2-consuming-data-from-an-api/web_app/routes/book_routes.py b/module2-consuming-data-from-an-api/web_app/routes/book_routes.py new file mode 100644 index 00000000..d13d4eb0 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/routes/book_routes.py @@ -0,0 +1,43 @@ + +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import Book, db + +book_routes = Blueprint("book_routes", __name__) + + +@book_routes.route("/books.json") +def list_books_json(): + book_records = Book.query.all() + return jsonify(books) + + +@book_routes.route("/books") +def list_books(): + book_records = Book.query.all() + return render_template("books.html", message="Here's some books", books=book_records) + + +@book_routes.route("/books/new") +def new_book(): + return render_template("new_book.html") + + +@book_routes.route("/books/create", methods=["POST"]) +def create_book(): + print("FORM DATA:", dict(request.form)) + # st() + new_book = Book(title=request.form["Book_title"], author_id=request.form["author_name"]) + db.session.add(new_book) + db.session.commit() + + # return jsonify({ + # "message": "BOOK CREATED OK", + # "book": dict(request.form) + # }) + return redirect(f"/books") + + + + + diff --git a/module2-consuming-data-from-an-api/web_app/routes/home_routes.py b/module2-consuming-data-from-an-api/web_app/routes/home_routes.py new file mode 100644 index 00000000..e8cee3bd --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/routes/home_routes.py @@ -0,0 +1,14 @@ +from flask import Blueprint + +home_routes = Blueprint("home_routes", __name__) + + +@home_routes.route("/") +def index(): + x = 2 + 2 + return f"Hello World {x}" + + +@home_routes.route("/about") +def about(): + return "about me" \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/services/basilica_service.py b/module2-consuming-data-from-an-api/web_app/services/basilica_service.py new file mode 100644 index 00000000..68b954d4 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/services/basilica_service.py @@ -0,0 +1,17 @@ +import basilica +import os +from dotenv import load_dotenv + +load_dotenv() +BASILICA_API_KEY = os.getenv("BASILICA_API_KEY", default="oops") + +sentences = [ + "This is a sentence!", + "This is a similar sentence!", + "I don't think this sentence is very similar at all...", +] + +with basilica.Connection(BASILICA_API_KEY) as c: + embeddings = list(c.embed_sentences(sentences)) + +print(embeddings) \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/templates/books.html b/module2-consuming-data-from-an-api/web_app/templates/books.html new file mode 100644 index 00000000..d6737885 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/templates/books.html @@ -0,0 +1,24 @@ + + + + + + Document + + + + {% if books %} +
    + {% for book in books %} +

    +

  • {{ book.title }}
  • +

    + {% endfor %} +
+ {% else %} +

no books!

+ {% endif %} + + + + \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/templates/new_book.html b/module2-consuming-data-from-an-api/web_app/templates/new_book.html new file mode 100644 index 00000000..04f7cd98 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/templates/new_book.html @@ -0,0 +1,24 @@ + + + + + + Document + + +

New Book message

+

fill this form

+
+ + + + + + +
+ + \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/test_db.db b/module2-consuming-data-from-an-api/web_app/test_db.db new file mode 100644 index 0000000000000000000000000000000000000000..b8b9f7f72bea3a12473d1402048cd9a38c6bfdfa GIT binary patch literal 16384 zcmeI%K~IA)7zW@L&f2CC+q8Ur=%wN8)C!Y;wWEI5PgsS_6H3W0V}y_?o+X~YlE5Fv z>-4MRhjNOnE|{U8h;9Ii}&7%r*8blcg=Jq{v~5)os_@HyvglyUaeftQDrnNtkp3c40WR1H&ol z>swmd>fa?-QQzZZvOOnG{m5`G*`ayKN?}V=w1Gx*#d4WG%EKu9PS9(hh=8)ZmyebBE+%zc&t0Zbn&!IN!V)z z5Akh>pW;2f)@WGwvXkkV29a;InRL75d8X Date: Tue, 19 May 2020 14:51:03 -0700 Subject: [PATCH 4/9] assignment 1 finished --- .../web_app/routes/user_routes.py | 33 +++++++++++++++++-- .../web_app/templates/user_tweets.html | 31 +++++++++++++++++ .../web_app/templates/users.html | 25 ++++++++++++++ 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 module1-web-application-development-with-flask/web_app/templates/user_tweets.html create mode 100644 module1-web-application-development-with-flask/web_app/templates/users.html diff --git a/module1-web-application-development-with-flask/web_app/routes/user_routes.py b/module1-web-application-development-with-flask/web_app/routes/user_routes.py index 3370a3a0..77e4e28c 100644 --- a/module1-web-application-development-with-flask/web_app/routes/user_routes.py +++ b/module1-web-application-development-with-flask/web_app/routes/user_routes.py @@ -1,11 +1,40 @@ from flask import Blueprint, jsonify, request, render_template, redirect, flash from pdb import set_trace as st -from web_app.models import User, db +from web_app.models import Tweet, User, db +from sqlalchemy.orm import joinedload + user_routes = Blueprint("user_routes", __name__) +@user_routes.route("/users/") +def list_users(): + user_records = User.query.all() + return render_template("users.html", users=user_records) + + +@user_routes.route("/users//") +def list_user_tweets(username=None): + user = User.query.filter_by(username=username).first() + user_id = user.id + user_tweets = Tweet.query.filter_by(user_id=user_id).all() + # st() + return render_template("user_tweets.html", username=username, user_tweets=user_tweets) + + +@user_routes.route("/users//new_tweet", methods=["POST"]) +def user_create_new_tweet(username=None): + user = User.query.filter_by(username=username).first() + # st() + user_id = user.id + new_tweet = Tweet(user_id=user_id, text=request.form["tweet_text"]) + db.session.add(new_tweet) + db.session.commit() + return redirect(f"/users/{username}/") + + + @user_routes.route("/users/new") def new_user(): return render_template("new_user.html") @@ -18,4 +47,4 @@ def create_user(): db.session.add(new_user) db.session.commit() # flash("asdf") - return redirect("/users/new") \ No newline at end of file + return redirect("/users") diff --git a/module1-web-application-development-with-flask/web_app/templates/user_tweets.html b/module1-web-application-development-with-flask/web_app/templates/user_tweets.html new file mode 100644 index 00000000..7d566366 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/templates/user_tweets.html @@ -0,0 +1,31 @@ + + + + + + Document + + +

{{ username }} tweets:

+ {% if user_tweets %} +
    + {% for tweets in user_tweets %} +

    +

  • {{ tweets.text }}
  • +

    + {% endfor %} +
+ {% else %} +

no tweets!

+ {% endif %} +

Create tweet

+
+ + + + +
+ users list + + + \ No newline at end of file diff --git a/module1-web-application-development-with-flask/web_app/templates/users.html b/module1-web-application-development-with-flask/web_app/templates/users.html new file mode 100644 index 00000000..78b89975 --- /dev/null +++ b/module1-web-application-development-with-flask/web_app/templates/users.html @@ -0,0 +1,25 @@ + + + + + + Document + + + + {% if users %} + + {% else %} +

no users!

+ {% endif %} + create new users + + + + \ No newline at end of file From 510fd41155a45fa279d0ee15294595f4c5eb9dee Mon Sep 17 00:00:00 2001 From: modares Date: Tue, 19 May 2020 14:52:29 -0700 Subject: [PATCH 5/9] missed one single '/' --- .../web_app/routes/user_routes.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module1-web-application-development-with-flask/web_app/routes/user_routes.py b/module1-web-application-development-with-flask/web_app/routes/user_routes.py index 77e4e28c..132e9c3e 100644 --- a/module1-web-application-development-with-flask/web_app/routes/user_routes.py +++ b/module1-web-application-development-with-flask/web_app/routes/user_routes.py @@ -34,8 +34,7 @@ def user_create_new_tweet(username=None): return redirect(f"/users/{username}/") - -@user_routes.route("/users/new") +@user_routes.route("/users/new/") def new_user(): return render_template("new_user.html") From 3e740f051413381d0183bdb252d56a9b100056f7 Mon Sep 17 00:00:00 2001 From: modares Date: Wed, 20 May 2020 21:24:03 -0700 Subject: [PATCH 6/9] module 2 retro --- Pipfile | 11 ++ .../migrations/README | 1 + .../migrations/alembic.ini | 45 ++++++++ .../migrations/env.py | 96 ++++++++++++++++++ .../migrations/script.py.mako | 24 +++++ .../migrations/versions/153f1fd5ddf9_.py | 51 ++++++++++ .../web_app/__init__.py | 4 + .../web_app/models.py | 30 +++++- .../web_app/routes/book_routes.py | 18 +--- .../web_app/routes/twitter_routes.py | 48 +++++++++ .../web_app/routes/user_routes.py | 49 +++++++++ .../web_app/services/basilica_service.py | 15 +-- .../web_app/services/twitter_service.py | 29 ++++++ .../web_app/templates/new_user.html | 18 ++++ .../web_app/templates/user_tweets.html | 31 ++++++ .../web_app/templates/users.html | 25 +++++ .../web_app/test_db.db | Bin 16384 -> 32768 bytes 17 files changed, 471 insertions(+), 24 deletions(-) create mode 100644 Pipfile create mode 100644 module2-consuming-data-from-an-api/migrations/README create mode 100644 module2-consuming-data-from-an-api/migrations/alembic.ini create mode 100644 module2-consuming-data-from-an-api/migrations/env.py create mode 100644 module2-consuming-data-from-an-api/migrations/script.py.mako create mode 100644 module2-consuming-data-from-an-api/migrations/versions/153f1fd5ddf9_.py create mode 100644 module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py create mode 100644 module2-consuming-data-from-an-api/web_app/routes/user_routes.py create mode 100644 module2-consuming-data-from-an-api/web_app/services/twitter_service.py create mode 100644 module2-consuming-data-from-an-api/web_app/templates/new_user.html create mode 100644 module2-consuming-data-from-an-api/web_app/templates/user_tweets.html create mode 100644 module2-consuming-data-from-an-api/web_app/templates/users.html diff --git a/Pipfile b/Pipfile new file mode 100644 index 00000000..9534830b --- /dev/null +++ b/Pipfile @@ -0,0 +1,11 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] + +[requires] +python_version = "3.6" diff --git a/module2-consuming-data-from-an-api/migrations/README b/module2-consuming-data-from-an-api/migrations/README new file mode 100644 index 00000000..98e4f9c4 --- /dev/null +++ b/module2-consuming-data-from-an-api/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/migrations/alembic.ini b/module2-consuming-data-from-an-api/migrations/alembic.ini new file mode 100644 index 00000000..f8ed4801 --- /dev/null +++ b/module2-consuming-data-from-an-api/migrations/alembic.ini @@ -0,0 +1,45 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/module2-consuming-data-from-an-api/migrations/env.py b/module2-consuming-data-from-an-api/migrations/env.py new file mode 100644 index 00000000..94521792 --- /dev/null +++ b/module2-consuming-data-from-an-api/migrations/env.py @@ -0,0 +1,96 @@ +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +from flask import current_app +config.set_main_option( + 'sqlalchemy.url', + str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%')) +target_metadata = current_app.extensions['migrate'].db.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives, + **current_app.extensions['migrate'].configure_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/module2-consuming-data-from-an-api/migrations/script.py.mako b/module2-consuming-data-from-an-api/migrations/script.py.mako new file mode 100644 index 00000000..2c015630 --- /dev/null +++ b/module2-consuming-data-from-an-api/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/module2-consuming-data-from-an-api/migrations/versions/153f1fd5ddf9_.py b/module2-consuming-data-from-an-api/migrations/versions/153f1fd5ddf9_.py new file mode 100644 index 00000000..c712da49 --- /dev/null +++ b/module2-consuming-data-from-an-api/migrations/versions/153f1fd5ddf9_.py @@ -0,0 +1,51 @@ +"""empty message + +Revision ID: 153f1fd5ddf9 +Revises: +Create Date: 2020-05-20 15:25:43.879556 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '153f1fd5ddf9' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('book', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('title', sa.String(length=128), nullable=True), + sa.Column('author_id', sa.String(length=128), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('user', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('screen_name', sa.String(length=128), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('location', sa.String(), nullable=True), + sa.Column('followers_count', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('tweet', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=True), + sa.Column('full_text', sa.String(length=500), nullable=True), + sa.Column('embedding', sa.PickleType(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('tweet') + op.drop_table('user') + op.drop_table('book') + # ### end Alembic commands ### diff --git a/module2-consuming-data-from-an-api/web_app/__init__.py b/module2-consuming-data-from-an-api/web_app/__init__.py index 3b00395e..b3d92c97 100644 --- a/module2-consuming-data-from-an-api/web_app/__init__.py +++ b/module2-consuming-data-from-an-api/web_app/__init__.py @@ -2,6 +2,8 @@ from web_app.routes.home_routes import home_routes from web_app.routes.book_routes import book_routes +from web_app.routes.user_routes import user_routes +from web_app.routes.twitter_routes import twitter_routes from web_app.models import db, migrate @@ -17,6 +19,8 @@ def create_app(): app.register_blueprint(home_routes) app.register_blueprint(book_routes) + app.register_blueprint(user_routes) + app.register_blueprint(twitter_routes) return app diff --git a/module2-consuming-data-from-an-api/web_app/models.py b/module2-consuming-data-from-an-api/web_app/models.py index 1d06460b..93c93ee4 100644 --- a/module2-consuming-data-from-an-api/web_app/models.py +++ b/module2-consuming-data-from-an-api/web_app/models.py @@ -10,13 +10,35 @@ class Book(db.Model): - __table_name__ = "books" id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(128)) author_id = db.Column(db.String(128)) +# class User(db.Model): +# # __table_name__ = "user" +# id = db.Column(db.Integer, primary_key=True) +# username = db.Column(db.String(128)) + + +# class Tweet(db.Model): +# id = db.Column(db.Integer, primary_key=True) +# user_id = db.Column(db.Integer, db.ForeignKey("user.id")) +# text = db.Column(db.String(500)) + + class User(db.Model): - __table_name__ = "users" - id = db.Column(db.Integer, primary_key=True) - + id = db.Column(db.BigInteger, primary_key=True) + screen_name = db.Column(db.String(128), nullable=False) + name = db.Column(db.String) + location = db.Column(db.String) + followers_count = db.Column(db.Integer) + #latest_tweet_id = db.Column(db.BigInteger) + + +class Tweet(db.Model): + id = db.Column(db.BigInteger, primary_key=True) + user_id = db.Column(db.BigInteger, db.ForeignKey("user.id")) + full_text = db.Column(db.String(500)) + embedding = db.Column(db.PickleType) + user = db.relationship("User", backref=db.backref("tweets", lazy=True)) diff --git a/module2-consuming-data-from-an-api/web_app/routes/book_routes.py b/module2-consuming-data-from-an-api/web_app/routes/book_routes.py index d13d4eb0..5f645447 100644 --- a/module2-consuming-data-from-an-api/web_app/routes/book_routes.py +++ b/module2-consuming-data-from-an-api/web_app/routes/book_routes.py @@ -9,7 +9,7 @@ @book_routes.route("/books.json") def list_books_json(): book_records = Book.query.all() - return jsonify(books) + return jsonify(book_records) @book_routes.route("/books") @@ -26,18 +26,8 @@ def new_book(): @book_routes.route("/books/create", methods=["POST"]) def create_book(): print("FORM DATA:", dict(request.form)) - # st() - new_book = Book(title=request.form["Book_title"], author_id=request.form["author_name"]) + new_book = Book(title=request.form["book_title"], author_id=request.form["author_name"]) + db.session.add(new_book) db.session.commit() - - # return jsonify({ - # "message": "BOOK CREATED OK", - # "book": dict(request.form) - # }) - return redirect(f"/books") - - - - - + return redirect(f"/books") \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py b/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py new file mode 100644 index 00000000..77bd0d25 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py @@ -0,0 +1,48 @@ +from flask import Blueprint, render_template, jsonify +from web_app.services.twitter_service import twitter_api +from web_app.services.basilica_service import Connection as basilica_connection +from web_app.models import User, Tweet, db + +twitter_routes = Blueprint("twitter_routes", __name__) + + +@twitter_routes.route("/users/") +def get_user(screen_name=None): + print(screen_name) + api = twitter_api() + user = api.get_user(screen_name) + statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False) + # return jsonify({"user": user._json, "tweets": [s._json for s in statuses]}) + + db_user = User.query.get(user.id) or User(id=user.id) + db_user.screen_name = user.screen_name + db_user.name = user.name + db_user.location = user.location + db_user.followers_count = user.followers_count + db.session.add(db_user) + db.session.commit() + #breakpoint() + + all_tweet_texts = [status.full_text for status in statuses] + embeddings = list(basilica_connection.embed_sentences(all_tweet_texts, model="twitter")) + print("NUMBER OF EMBEDDINGS", len(embeddings)) + + # TODO: explore using the zip() function maybe... + counter = 0 + for status in statuses: + print(status.full_text) + print("----") + #print(dir(status)) + # get existing tweet from the db or initialize a new one: + db_tweet = Tweet.query.get(status.id) or Tweet(id=status.id) + db_tweet.user_id = status.author.id # or db_user.id + db_tweet.full_text = status.full_text + #embedding = basilica_client.embed_sentence(status.full_text, model="twitter") # todo: prefer to make a single request to basilica with all the tweet texts, instead of a request per tweet + embedding = embeddings[counter] + print(len(embedding)) + db_tweet.embedding = embedding + db.session.add(db_tweet) + counter+=1 + db.session.commit() + #breakpoint() + return "OK" \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/routes/user_routes.py b/module2-consuming-data-from-an-api/web_app/routes/user_routes.py new file mode 100644 index 00000000..3c94e5ef --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/routes/user_routes.py @@ -0,0 +1,49 @@ + +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import Tweet, User, db +from sqlalchemy.orm import joinedload + + +user_routes = Blueprint("user_routes", __name__) + + +@user_routes.route("/users/") +def list_users(): + user_records = User.query.all() + return render_template("users.html", users=user_records) + + +@user_routes.route("/users//") +def list_user_tweets(username=None): + user = User.query.filter_by(username=username).first() + user_id = user.id + user_tweets = Tweet.query.filter_by(user_id=user_id).all() + # st() + return render_template("user_tweets.html", username=username, user_tweets=user_tweets) + + +# @user_routes.route("/users//new_tweet", methods=["POST"]) +# def user_create_new_tweet(username=None): +# user = User.query.filter_by(username=username).first() +# # st() +# user_id = user.id +# new_tweet = Tweet(user_id=user_id, text=request.form["tweet_text"]) +# db.session.add(new_tweet) +# db.session.commit() +# return redirect(f"/users/{username}/") + + +@user_routes.route("/users/new/") +def new_user(): + return render_template("new_user.html") + + +@user_routes.route("/users/create", methods=["POST"]) +def create_user(): + new_user = User(username=request.form["username"]) + print("FORM DATA:", dict(request.form)) + db.session.add(new_user) + db.session.commit() + # flash("asdf") + return redirect("/users") diff --git a/module2-consuming-data-from-an-api/web_app/services/basilica_service.py b/module2-consuming-data-from-an-api/web_app/services/basilica_service.py index 68b954d4..11bced6a 100644 --- a/module2-consuming-data-from-an-api/web_app/services/basilica_service.py +++ b/module2-consuming-data-from-an-api/web_app/services/basilica_service.py @@ -1,4 +1,6 @@ -import basilica + +from basilica import Connection +from pdb import set_trace as st import os from dotenv import load_dotenv @@ -10,8 +12,9 @@ "This is a similar sentence!", "I don't think this sentence is very similar at all...", ] - -with basilica.Connection(BASILICA_API_KEY) as c: - embeddings = list(c.embed_sentences(sentences)) - -print(embeddings) \ No newline at end of file +# x = 12 +connection = Connection('2d39d84b-a0e9-717a-361e-8ce5d55d7123') +# embeddings = list(connection.embed_sentences(sentences)) +# # embeddings = list(c.embed_sentence(sentence)) for one sentence +# print(embeddings) +# # st() \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/services/twitter_service.py b/module2-consuming-data-from-an-api/web_app/services/twitter_service.py new file mode 100644 index 00000000..0a7df01d --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/services/twitter_service.py @@ -0,0 +1,29 @@ +import tweepy +import os +from dotenv import load_dotenv + +load_dotenv() + +TWITTER_API_KEY = os.getenv("TWITTER_API_KEY") +TWITTER_API_SECRET = os.getenv("TWITTER_API_SECRET") +TWITTER_ACCESS_TOKEN = os.getenv("TWITTER_ACCESS_TOKEN") +TWITTER_ACCESS_TOKEN_SECRET = os.getenv("TWITTER_ACCESS_TOKEN_SECRET") + + +def twitter_api(): + auth = tweepy.OAuthHandler(TWITTER_API_KEY, TWITTER_API_SECRET) + auth.set_access_token(TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_TOKEN_SECRET) + print("AUTH", auth) + api = tweepy.API(auth) + print("API", api) + #print(dir(api)) + return api + + +if __name__ == "__main__": + api = twitter_api() + user = api.get_user("elonmusk") + print("USER", user) + print(user.screen_name) + print(user.name) + print(user.followers_count) \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/templates/new_user.html b/module2-consuming-data-from-an-api/web_app/templates/new_user.html new file mode 100644 index 00000000..8df26f44 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/templates/new_user.html @@ -0,0 +1,18 @@ + + + + + + Document + + +

New user

+

fill this form

+
+ + + + +
+ + \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/templates/user_tweets.html b/module2-consuming-data-from-an-api/web_app/templates/user_tweets.html new file mode 100644 index 00000000..7d566366 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/templates/user_tweets.html @@ -0,0 +1,31 @@ + + + + + + Document + + +

{{ username }} tweets:

+ {% if user_tweets %} +
    + {% for tweets in user_tweets %} +

    +

  • {{ tweets.text }}
  • +

    + {% endfor %} +
+ {% else %} +

no tweets!

+ {% endif %} +

Create tweet

+
+ + + + +
+ users list + + + \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/templates/users.html b/module2-consuming-data-from-an-api/web_app/templates/users.html new file mode 100644 index 00000000..78b89975 --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/templates/users.html @@ -0,0 +1,25 @@ + + + + + + Document + + + + {% if users %} + + {% else %} +

no users!

+ {% endif %} + create new users + + + + \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/test_db.db b/module2-consuming-data-from-an-api/web_app/test_db.db index b8b9f7f72bea3a12473d1402048cd9a38c6bfdfa..808295bab26e05a6eb606f7b0237a917e38a4548 100644 GIT binary patch delta 701 zcmZo@U~Fh$njkI6&cMLH0mLxCGEv7^nw>#UW&bbv4`iq9bC;PO~; za#3n(UVL6+ZYta(hDH{eD85I?0(}AUPfmVvVo7Fx9!v{3K=N~P^2<|;isO^>OY=$; zfI;Z$?h00p?tLyzbyhZUYf+GoxIylVHw2Mvo7?$v1$hijjnfR%QcP1)(kwSAeBl>D z7T^U%zQATdf&2UuCrI;vxJ>+882In=ZvhIf;E&K`Vq=k1muKd+_`~a1T3nKv2O$+4 zb8?DOQ$jLQ75o#6Gm9C&8p|`XvB=8vvM?=5(oN0D&&w?>&UOXT3cf%F6QA^PF0kqE k8TfzjzlT^Ez#`7U%)$sVoQa*8g%hL|)k$n1O$ZkP0Im)DG*QP`n3X|KW&Ct8|qQux9zfh@oaG>D1+83X?p{%1fvxA>)am{=Gj1rv)?(uxxu O4Y?Ru7(~H5M?(PbMI875 From 129399357521bcea80188bd0468f24ec0fce838f Mon Sep 17 00:00:00 2001 From: modares Date: Wed, 20 May 2020 22:12:30 -0700 Subject: [PATCH 7/9] finished assigment module 2 --- .../web_app/__init__.py | 4 ++-- .../web_app/routes/twitter_routes.py | 10 +++++---- .../web_app/routes/user_routes.py | 21 +++++++++++------- .../web_app/services/basilica_service.py | 18 ++++++++++----- .../web_app/test_db.db | Bin 32768 -> 163840 bytes 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/module2-consuming-data-from-an-api/web_app/__init__.py b/module2-consuming-data-from-an-api/web_app/__init__.py index b3d92c97..6d233d93 100644 --- a/module2-consuming-data-from-an-api/web_app/__init__.py +++ b/module2-consuming-data-from-an-api/web_app/__init__.py @@ -17,8 +17,8 @@ def create_app(): db.init_app(app) migrate.init_app(app, db) - app.register_blueprint(home_routes) - app.register_blueprint(book_routes) + # app.register_blueprint(home_routes) + # app.register_blueprint(book_routes) app.register_blueprint(user_routes) app.register_blueprint(twitter_routes) return app diff --git a/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py b/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py index 77bd0d25..ea1d6ef7 100644 --- a/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py +++ b/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py @@ -1,12 +1,13 @@ from flask import Blueprint, render_template, jsonify from web_app.services.twitter_service import twitter_api -from web_app.services.basilica_service import Connection as basilica_connection +from web_app.services.basilica_service import basilica_api_client from web_app.models import User, Tweet, db +from pdb import set_trace as st twitter_routes = Blueprint("twitter_routes", __name__) -@twitter_routes.route("/users/") +@twitter_routes.route("/users//") def get_user(screen_name=None): print(screen_name) api = twitter_api() @@ -24,9 +25,10 @@ def get_user(screen_name=None): #breakpoint() all_tweet_texts = [status.full_text for status in statuses] - embeddings = list(basilica_connection.embed_sentences(all_tweet_texts, model="twitter")) + st() + basilica_connection = basilica_api_client() + embeddings = list(basilica_connection.embed_sentences(sentences=all_tweet_texts, model="twitter")) print("NUMBER OF EMBEDDINGS", len(embeddings)) - # TODO: explore using the zip() function maybe... counter = 0 for status in statuses: diff --git a/module2-consuming-data-from-an-api/web_app/routes/user_routes.py b/module2-consuming-data-from-an-api/web_app/routes/user_routes.py index 3c94e5ef..014f0435 100644 --- a/module2-consuming-data-from-an-api/web_app/routes/user_routes.py +++ b/module2-consuming-data-from-an-api/web_app/routes/user_routes.py @@ -8,19 +8,24 @@ user_routes = Blueprint("user_routes", __name__) +@user_routes.route("/") +def index(): + return redirect("/users/") + + @user_routes.route("/users/") def list_users(): user_records = User.query.all() return render_template("users.html", users=user_records) -@user_routes.route("/users//") -def list_user_tweets(username=None): - user = User.query.filter_by(username=username).first() - user_id = user.id - user_tweets = Tweet.query.filter_by(user_id=user_id).all() - # st() - return render_template("user_tweets.html", username=username, user_tweets=user_tweets) +# @user_routes.route("/users//") +# def list_user_tweets(username=None): +# user = User.query.filter_by(username=username).first() +# user_id = user.id +# user_tweets = Tweet.query.filter_by(user_id=user_id).all() +# # st() +# return render_template("user_tweets.html", username=username, user_tweets=user_tweets) # @user_routes.route("/users//new_tweet", methods=["POST"]) @@ -41,7 +46,7 @@ def new_user(): @user_routes.route("/users/create", methods=["POST"]) def create_user(): - new_user = User(username=request.form["username"]) + new_user = User(screen_name=request.form["username"]) print("FORM DATA:", dict(request.form)) db.session.add(new_user) db.session.commit() diff --git a/module2-consuming-data-from-an-api/web_app/services/basilica_service.py b/module2-consuming-data-from-an-api/web_app/services/basilica_service.py index 11bced6a..ad22e155 100644 --- a/module2-consuming-data-from-an-api/web_app/services/basilica_service.py +++ b/module2-consuming-data-from-an-api/web_app/services/basilica_service.py @@ -7,13 +7,19 @@ load_dotenv() BASILICA_API_KEY = os.getenv("BASILICA_API_KEY", default="oops") -sentences = [ - "This is a sentence!", - "This is a similar sentence!", - "I don't think this sentence is very similar at all...", -] +# sentences = [ +# "This is a sentence!", +# "This is a similar sentence!", +# "I don't think this sentence is very similar at all...", +# ] # x = 12 -connection = Connection('2d39d84b-a0e9-717a-361e-8ce5d55d7123') +# connection = Connection(BASILICA_API_KEY) + + +def basilica_api_client(): + connection = Connection(BASILICA_API_KEY) + print(type(connection)) #> + return connection # embeddings = list(connection.embed_sentences(sentences)) # # embeddings = list(c.embed_sentence(sentence)) for one sentence # print(embeddings) diff --git a/module2-consuming-data-from-an-api/web_app/test_db.db b/module2-consuming-data-from-an-api/web_app/test_db.db index 808295bab26e05a6eb606f7b0237a917e38a4548..40b47583a2fe006fa94adbd223659ce71fcca330 100644 GIT binary patch literal 163840 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 FuIp~Hu<0Q=tluCiIdVmk)BXGi#A0p#R> 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%0Aa*KS6wSpqT7P`MHU>KT(F{nMH?eh6rxv;; z?VFTQM(JgBcPMUCPWI4u>kWJJdMvDu2*|R}8DgY%K_w|ddSm~|(n6gYXs)#wbH_5W z{kre)=6ay0Go?&0m%8byGfB-0ld(r?yCcN7|ti@TSj1 z=IO6mWG!ZO<1g(!xytc=;bV7evcBfFd#$y<@WWpcwFIxDAikERi6Tln^iZlaFj$RZ zh&}ZUi%pQ(!a^}I5#9MDD?kL1F_j8pa9MWw?c&^F-o$rD2id)hxI~)E@1C1^^=3=i zp4OEC&HF9Hr2Jb!7qcyAGFmG1BYSiC=gZ5B_71!m|6wdBOquL06?F12-pel?A9rlK zIfopkqhVsQpbB$Zc(nAbF`Bz7divoK?>{j_s?EmUu?5XN4ZEIBvldl`!CFk~MrFn+ zQ+$~#Q(D(v^x*_dCgDY3mheT&4|Cv8xzUxb19Awp`ZgNcbrA|Ok6y{;DVNbq58_;t zUBda{fK|6Gs@|9;5fjur&W20@+c%9Q@=jtcOV-#^2A)YNN;{AaJlcUCqabw?x|PBv2R-gxy~)M}cT zW7TIP@9g%I09jrZB+){VgnZnmwSHt6XhF#%QUmN%C0#u{rz>x$q#!%vB56^&>%A{b=)cnq7*)2! zG+T!J~jAK3e@P@`g3E}3`*_PQNOG4s3m&}+nh9KwiTv2|>9%@(V zOfb#`Pf53G4&hjt-sz}MUIfC!8wRZIfoyzKpT{8E{+I$~=+6IAT&wsXOx&qi9+?O0 z-U3eFY}dK-E1D_uLbs9am+fSMVp6ym+n&%u%j1EGDZa?B>+Q8xpz5mMjSxkJLWx2> zKL*SHbhjC8fH-7fQN5?V?9vMap`f0Vmxdek%c|>)MWS0(6ne_i=5E)Texe=a15N9) zcDK6D&4p3Qr~yNiClRRkqO?RYoJwA<@3!q?E_tE!h&usO^ubC`_hlrxw!Fn7{P#xD z3x}w$c`>MRHnuJ*`u?l~rfBY1#XNago??25JaN|oA(}i(F)2e{-Q-uz>5*Xn)UD?k z(1R7de)-L86rhV zqP`e{q`hzw>rzZdm&J>5@Es76{Qet74F^WAMTCljVRLLt<5$blRM#NS2R(N#>>P?1 z_gr()&kOmvk)k@i#)cq7e)tz=Vx==#K#F>c{RLUbG47^Fy@A!pyOQ+SWU^87jQ-qu-52HH)FC%zMl0TMoESQf@=Sam za=Lgf81R8};QcX4KJw2vUWy3x|nh+D;61arm2!!kl#2p{n$8GQ5bC8ZGSzQ ze}_b)0=viQ%nqA__~UHll+KqGM#BmXfm-34R_84-@MOmjYbH*y_K>b{c@ARd)r^V) zUyx`@5LMH~ET>Ewf8@@y`Y71jiZVOTq16E;BL+cCJIg9ErQwx0WGR!xpmfyx$yIb- zV+$TqabUKnv1qCND3~9(4$I2wf7|Q`7n!G~{NzF|QCf`Cjytm(S;|)K%wAfyP8S(# zVLqZujT}2DRj4$^c6azhs)${Epcoh>tLiK!p05S}dMx+?6(kZq?B}#2*>2Okjc4lt z=7%Fz#C_hdo|{|K{q*t(JhLqED776(-PwK~I%A%*t6z)k_G%meH3_z%_7UvZjgoak zN8;2z5JYkL0HNr!JC9zlKF9(Utmg7(OQe5z)jwy}>cA?0SC?nGH-D&2d_ch>52+j0+auy*)t?l}^K^44GtX)=} z6RA6}kf*25Q$#2qw^lzq>Lak{mAT$QwJo5*a&5Pb77Ni54?FdF={$ENBC22vli#}3 zW>^;o4z7Yx0X4U{!c}ex4u$(n5eT};0+R#__}n+#l<$TsgRCu)L;H3rk3DA*_x(2a zwqN~Xu;1a=cdK4*z(~c%{?^jg6cA{;@440O6wvAQ+OaxE$>?U8oD<|5xI2;)h#t$o zAUvtwxH1&M^)^_A2I$_Aug}8|auS#)%rTinI1(w$?u5f)q~tIkHl=vhu}fRgKY@fPN1fmO1msWj!KxPgoAB zOdIU&L$Hb%*tVx))DO3Nz?s@_P8>>h_!D`Yb#pEnR2X}9fl2Zer6sZ|os~zRKVV&A z#!PQacFc=;SDVPo`C~Qv!M^w6S!rHtpU2-DFgIdSlb8TJSf!u?VXe1Kikm*|^n@r5VrRtE1Kl0|AtN9$5|{*jJcUQ!&2^Pw&6!x{dL@w$R;zIO`psO)(H05jT}m} zG*A*Zx9nBoc%6w9YCU@9IOaR%__l)DQI@hXyZ^P*D59cor|$T9W33XmyT{vYM(WO= za~*D=LTs<1oEZjvfv?&Xd1c3k_2>h@FcN67qRZ2C9eLZmZ`;B(`@y*RHH z-LD#5o5p4;7*pkC!xGfqteyah+bSp&J99ylG1TgM>ofkISciLzAl#UmjIcRKg^PUr z%Wv^-N^p4NT&DScn7AB2u8F$o{4QOQ4bh>Nj*J!EnAhX9*;k(KyUV1@c8>B*xtgf3 z;#EVWtp}JzMjUIs;1%**{Pe=)1*7O}oHd|fnAHNzM1nTc3&yj+nEn3cvp}c$k&2mC z)$??_z8P>3Orj_=lqHDr*GZU(qBCOj6hYZ?)n6XZKNf?wsX?*H{dmLiVork}=RT;u zGPOw?*jUEbw+&lcfq&XlR8P8a@kJ;t;uOFGtr7O!TABY}uhMA!|9#HyKi~MD9r(`< z{AUOL_YT~0*A~?P=As(FtkrMUsj7lNU<@4ot|a+s{CAdE{>>J+iX6Z6i!M&mf7W*G z+Qr1ud70DVO=~xGDLi(b+JOK6-~T=TzkG>{jrH28P8O#BBmXZ?eqrX}KPiiF<&&Lu z&VQUC?A`9%82^|txGJqL_Wi@gnBU~80Agl=A~YoaC!!xN?KAz3zr#Q%*(%qE9DlWc zMK`pr@RQEt8We1L)M@BHn2e$f2${@Xuu6rluOQ*azQi;z*Qf=VI*TxTREnb}&^K1F6I9xFbCbJ2}=MoRqlpk$^-er zf{8yl!sHikcDiV5eAhBk-C|P8aRUcnK#>M*PJBJ+vvIDEF1N+rHn`Fk+|fGFJj ztrbU?@tfQ&w@TFN2XO@NMF}n*O6jL_DaqT3+28r9Kl18Q9-4IcP_}OPYw)esA34kQ zcVMhZJkjijNc?hU`09isAgECH?#X+L$o@&z+YTpMw^{WztBdghRCIkqvMQXaR2VxK zx3M}duoBJ$R&o2*T^+xkNK4qN@H+Rkc<#S7dFpx0nDDZ?Xtn5z>-1c`n9Xy*yg9IN7WLeC7vl33xk+hhFe_(qsrBsrcI~ zhJ_FRKtxMwHv)-0f97Da?F&#U_UJe<+ncWD4lma=U6q6jM$3!l$L_pXkwCGCR*b^K zl@-qZoVRI`8y=IG06Nf#D6a2`!I@foJmHo!9~9&qukxaL>H{8ea)r9lQBFDDxcM>j zThSm)F_5VZk&W66F&~&9%p<{S_WM{QTyTHu{|2^K5^Y>lkb1~&nH`#AvEe2m7p-=o zAFqf7ZoHee&3piHo>9-s?Nv26!Qh3q$6m9pP^lRi2~T%lD@I2$kT>d4SH}fY5!%=m zY#za!Xhrvx?84y7ri1_Ho6ia6stNqBk|j&s&1Y{RSenstzmuCGZ%AJZ9LjjFv08S) zI>7#t)uJ1ncg{}!JCu9GE$Cr1D0DTUq+F^0nokvcrVvE$1h8K@OtvU%>B#_}Ox$WM z1~d1V&lMg!w)5`~uOZl?{$o%XU#Kco;~-H2WxE5sUn$4N1?av%`eYSqF!gOsW78pa z#D^csE^FVxev^h?HnBmR<&D2F4{Ijdk10P;U+ZVAGs-ceD!+D$;7>(p&zgmJM!Y7J6s4G!TfErp`@m;C zNL@mkU3NT#9F3^6amC}#5Un6;2`IGPGk>f*jE9@k|KiY36F9HBQlrmj{S1+CL+zV8 z`(Ul)Ry*o+mY@cUL_dN9x3Wg>OI%+)0*}FD$#=zW$G)$)F{)sEKFa*p%$K^Bm&m^e z|5OjtpFeo5tBW14k!}}q7#?zNuA|=so$p%QuS4@U4miPuJrn%l^_nrJ2=>k?GsAm* z<#e=HHk;UX9?Q`lJl7$wh~r+-akRntP3(_o5-5nn1bA0ozf_1;uXrXgcHoP(6td12 zR_<6HRADgy!G3sz>@~rY4AJV_X_<)pi19+))7+t@o;mBel@(DEWh1eAMF?7!0X@%} z4+}vB=QAHX_;m^*q1bs@+J(^UDKcN~#h!+=9vSEO8+6U$@&ibw;1M)LwDLttWK|_6 zxU0#wZ&3>f-6-Op@?=GNf-xvbk@Kb!smmT0&_cBjyCX{7MPN z3PllL_JWozNaiBp(FPpkWx8Wj;?VIn2 zqC~Jw8f5m1ucKgJNo26RbAN-1Y8z8d@SOxeS|j0s%NE!5Lf6HKypCv*$r!RFwdDp! zP?M2F%*n3S6_ItPeC=EpS;!lHoYL3-hYFIpP0`z*F>3EJ&5#UMT75^bi&#ds tc06_JubGcIiz7Wm+yYRc+>MYq=4WeF-eWX9`@7RuO$bP5JGi{pe*wRuoF@PP delta 39 vcmZo@;A&`Knjp=}&cMLHF;T&uk$q#rJbxzX Date: Thu, 21 May 2020 12:33:25 -0700 Subject: [PATCH 8/9] assignment 3 --- .../web_app/test_db.db | Bin 163840 -> 163840 bytes .../Pipfile | 18 ++ .../Pipfile.lock | 287 ++++++++++++++++++ .../migrations/README | 1 + .../migrations/alembic.ini | 45 +++ .../migrations/env.py | 96 ++++++ .../migrations/script.py.mako | 24 ++ .../migrations/versions/65d0f9cd7b34_.py | 51 ++++ .../web_app/__init__.py | 29 ++ .../web_app/models.py | 44 +++ .../web_app/routes/book_routes.py | 33 ++ .../web_app/routes/home_routes.py | 14 + .../web_app/routes/twitter_routes.py | 50 +++ .../web_app/routes/user_routes.py | 54 ++++ .../web_app/services/basilica_service.py | 26 ++ .../web_app/services/twitter_service.py | 29 ++ .../web_app/templates/books.html | 24 ++ .../web_app/templates/new_book.html | 24 ++ .../web_app/templates/new_user.html | 18 ++ .../web_app/templates/user_tweets.html | 31 ++ .../web_app/templates/users.html | 25 ++ .../web_app/test_db.db | Bin 0 -> 32768 bytes 22 files changed, 923 insertions(+) create mode 100644 module3-adding-data-science-to-a-web-application/Pipfile create mode 100644 module3-adding-data-science-to-a-web-application/Pipfile.lock create mode 100644 module3-adding-data-science-to-a-web-application/migrations/README create mode 100644 module3-adding-data-science-to-a-web-application/migrations/alembic.ini create mode 100644 module3-adding-data-science-to-a-web-application/migrations/env.py create mode 100644 module3-adding-data-science-to-a-web-application/migrations/script.py.mako create mode 100644 module3-adding-data-science-to-a-web-application/migrations/versions/65d0f9cd7b34_.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/__init__.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/models.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/routes/book_routes.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/routes/home_routes.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/routes/twitter_routes.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/routes/user_routes.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/services/basilica_service.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/services/twitter_service.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/templates/books.html create mode 100644 module3-adding-data-science-to-a-web-application/web_app/templates/new_book.html create mode 100644 module3-adding-data-science-to-a-web-application/web_app/templates/new_user.html create mode 100644 module3-adding-data-science-to-a-web-application/web_app/templates/user_tweets.html create mode 100644 module3-adding-data-science-to-a-web-application/web_app/templates/users.html create mode 100644 module3-adding-data-science-to-a-web-application/web_app/test_db.db diff --git a/module2-consuming-data-from-an-api/web_app/test_db.db b/module2-consuming-data-from-an-api/web_app/test_db.db index 40b47583a2fe006fa94adbd223659ce71fcca330..447450b331f1d438bde8e5ae8f9cf04d9e013535 100644 GIT binary patch delta 31 mcmZo@;A&{#njp<6I8nx#QE+3zJb$KU)uw>90LEnjOa=g#iU~~s delta 31 mcmZo@;A&{#njp<6Fj2;tQD9@jJbxxz!KQ$=0LEnjOa=gxnF#R! diff --git a/module3-adding-data-science-to-a-web-application/Pipfile b/module3-adding-data-science-to-a-web-application/Pipfile new file mode 100644 index 00000000..5c5189aa --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/Pipfile @@ -0,0 +1,18 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +python-dotenv = "*" +requests = "*" +basilica = "*" +tweepy = "*" +flask = "*" +flask-migrate = "*" +sqlalchemy = "*" + +[requires] +python_version = "3.6" diff --git a/module3-adding-data-science-to-a-web-application/Pipfile.lock b/module3-adding-data-science-to-a-web-application/Pipfile.lock new file mode 100644 index 00000000..6fb35cef --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/Pipfile.lock @@ -0,0 +1,287 @@ +{ + "_meta": { + "hash": { + "sha256": "919b6b4af1179c11379eb9b40a3e3637fbae3fa378525b1869a362ffa158aabf" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "alembic": { + "hashes": [ + "sha256:035ab00497217628bf5d0be82d664d8713ab13d37b630084da8e1f98facf4dbf" + ], + "version": "==1.4.2" + }, + "basilica": { + "hashes": [ + "sha256:10d111538e7fee4ece43b9a2f0f33c8b6a34dc1a061e44c035b53ac4297e3a4d" + ], + "index": "pypi", + "version": "==0.2.8" + }, + "certifi": { + "hashes": [ + "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304", + "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519" + ], + "version": "==2020.4.5.1" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "click": { + "hashes": [ + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + ], + "version": "==7.1.2" + }, + "flask": { + "hashes": [ + "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", + "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557" + ], + "index": "pypi", + "version": "==1.1.2" + }, + "flask-migrate": { + "hashes": [ + "sha256:4dc4a5cce8cbbb06b8dc963fd86cf8136bd7d875aabe2d840302ea739b243732", + "sha256:a69d508c2e09d289f6e55a417b3b8c7bfe70e640f53d2d9deb0d056a384f37ee" + ], + "index": "pypi", + "version": "==2.5.3" + }, + "flask-sqlalchemy": { + "hashes": [ + "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327", + "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d" + ], + "version": "==2.4.1" + }, + "idna": { + "hashes": [ + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" + ], + "version": "==2.9" + }, + "itsdangerous": { + "hashes": [ + "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", + "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" + ], + "version": "==1.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", + "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" + ], + "version": "==2.11.2" + }, + "mako": { + "hashes": [ + "sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d", + "sha256:8e8b53c71c7e59f3de716b6832c4e401d903af574f6962edbbbf6ecc2a5fe6c9" + ], + "version": "==1.1.2" + }, + "markupsafe": { + "hashes": [ + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" + ], + "version": "==1.1.1" + }, + "oauthlib": { + "hashes": [ + "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889", + "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea" + ], + "version": "==3.1.0" + }, + "pillow": { + "hashes": [ + "sha256:04766c4930c174b46fd72d450674612ab44cca977ebbcc2dde722c6933290107", + "sha256:0e2a3bceb0fd4e0cb17192ae506d5f082b309ffe5fc370a5667959c9b2f85fa3", + "sha256:0f01e63c34f0e1e2580cc0b24e86a5ccbbfa8830909a52ee17624c4193224cd9", + "sha256:12e4bad6bddd8546a2f9771485c7e3d2b546b458ae8ff79621214119ac244523", + "sha256:1f694e28c169655c50bb89a3fa07f3b854d71eb47f50783621de813979ba87f3", + "sha256:3d25dd8d688f7318dca6d8cd4f962a360ee40346c15893ae3b95c061cdbc4079", + "sha256:4b02b9c27fad2054932e89f39703646d0c543f21d3cc5b8e05434215121c28cd", + "sha256:9744350687459234867cbebfe9df8f35ef9e1538f3e729adbd8fde0761adb705", + "sha256:a0b49960110bc6ff5fead46013bcb8825d101026d466f3a4de3476defe0fb0dd", + "sha256:ae2b270f9a0b8822b98655cb3a59cdb1bd54a34807c6c56b76dd2e786c3b7db3", + "sha256:b37bb3bd35edf53125b0ff257822afa6962649995cbdfde2791ddb62b239f891", + "sha256:b532bcc2f008e96fd9241177ec580829dee817b090532f43e54074ecffdcd97f", + "sha256:b67a6c47ed963c709ed24566daa3f95a18f07d3831334da570c71da53d97d088", + "sha256:b943e71c2065ade6fef223358e56c167fc6ce31c50bc7a02dd5c17ee4338e8ac", + "sha256:ccc9ad2460eb5bee5642eaf75a0438d7f8887d484490d5117b98edd7f33118b7", + "sha256:d23e2aa9b969cf9c26edfb4b56307792b8b374202810bd949effd1c6e11ebd6d", + "sha256:eaa83729eab9c60884f362ada982d3a06beaa6cc8b084cf9f76cae7739481dfa", + "sha256:ee94fce8d003ac9fd206496f2707efe9eadcb278d94c271f129ab36aa7181344", + "sha256:f455efb7a98557412dc6f8e463c1faf1f1911ec2432059fa3e582b6000fc90e2", + "sha256:f46e0e024346e1474083c729d50de909974237c72daca05393ee32389dabe457", + "sha256:f54be399340aa602066adb63a86a6a5d4f395adfdd9da2b9a0162ea808c7b276", + "sha256:f784aad988f12c80aacfa5b381ec21fd3f38f851720f652b9f33facc5101cf4d" + ], + "version": "==7.1.2" + }, + "pysocks": { + "hashes": [ + "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", + "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", + "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" + ], + "version": "==1.7.1" + }, + "python-dateutil": { + "hashes": [ + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + ], + "version": "==2.8.1" + }, + "python-dotenv": { + "hashes": [ + "sha256:25c0ff1a3e12f4bde8d592cc254ab075cfe734fc5dd989036716fd17ee7e5ec7", + "sha256:3b9909bc96b0edc6b01586e1eed05e71174ef4e04c71da5786370cebea53ad74" + ], + "index": "pypi", + "version": "==0.13.0" + }, + "python-editor": { + "hashes": [ + "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d", + "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b", + "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8" + ], + "version": "==1.0.4" + }, + "requests": { + "hashes": [ + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" + ], + "index": "pypi", + "version": "==2.23.0" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", + "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a" + ], + "version": "==1.3.0" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "version": "==1.15.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:128bc917ed20d78143a45024455ff0aed7d3b96772eba13d5dbaf9cc57e5c41b", + "sha256:156a27548ba4e1fed944ff9fcdc150633e61d350d673ae7baaf6c25c04ac1f71", + "sha256:27e2efc8f77661c9af2681755974205e7462f1ae126f498f4fe12a8b24761d15", + "sha256:2a12f8be25b9ea3d1d5b165202181f2b7da4b3395289000284e5bb86154ce87c", + "sha256:31c043d5211aa0e0773821fcc318eb5cbe2ec916dfbc4c6eea0c5188971988eb", + "sha256:65eb3b03229f684af0cf0ad3bcc771970c1260a82a791a8d07bffb63d8c95bcc", + "sha256:6cd157ce74a911325e164441ff2d9b4e244659a25b3146310518d83202f15f7a", + "sha256:703c002277f0fbc3c04d0ae4989a174753a7554b2963c584ce2ec0cddcf2bc53", + "sha256:869bbb637de58ab0a912b7f20e9192132f9fbc47fc6b5111cd1e0f6cdf5cf9b0", + "sha256:8a0e0cd21da047ea10267c37caf12add400a92f0620c8bc09e4a6531a765d6d7", + "sha256:8d01e949a5d22e5c4800d59b50617c56125fc187fbeb8fa423e99858546de616", + "sha256:925b4fe5e7c03ed76912b75a9a41dfd682d59c0be43bce88d3b27f7f5ba028fb", + "sha256:9cb1819008f0225a7c066cac8bb0cf90847b2c4a6eb9ebb7431dbd00c56c06c5", + "sha256:a87d496884f40c94c85a647c385f4fd5887941d2609f71043e2b73f2436d9c65", + "sha256:a9030cd30caf848a13a192c5e45367e3c6f363726569a56e75dc1151ee26d859", + "sha256:a9e75e49a0f1583eee0ce93270232b8e7bb4b1edc89cc70b07600d525aef4f43", + "sha256:b50f45d0e82b4562f59f0e0ca511f65e412f2a97d790eea5f60e34e5f1aabc9a", + "sha256:b7878e59ec31f12d54b3797689402ee3b5cfcb5598f2ebf26491732758751908", + "sha256:ce1ddaadee913543ff0154021d31b134551f63428065168e756d90bdc4c686f5", + "sha256:ce2646e4c0807f3461be0653502bb48c6e91a5171d6e450367082c79e12868bf", + "sha256:ce6c3d18b2a8ce364013d47b9cad71db815df31d55918403f8db7d890c9d07ae", + "sha256:e4e2664232005bd306f878b0f167a31f944a07c4de0152c444f8c61bbe3cfb38", + "sha256:e8aa395482728de8bdcca9cc0faf3765ab483e81e01923aaa736b42f0294f570", + "sha256:eb4fcf7105bf071c71068c6eee47499ab8d4b8f5a11fc35147c934f0faa60f23", + "sha256:ed375a79f06cad285166e5be74745df1ed6845c5624aafadec4b7a29c25866ef", + "sha256:f35248f7e0d63b234a109dd72fbfb4b5cb6cb6840b221d0df0ecbf54ab087654", + "sha256:f502ef245c492b391e0e23e94cba030ab91722dcc56963c85bfd7f3441ea2bbe", + "sha256:fe01bac7226499aedf472c62fa3b85b2c619365f3f14dd222ffe4f3aa91e5f98" + ], + "index": "pypi", + "version": "==1.3.17" + }, + "tweepy": { + "hashes": [ + "sha256:8abd828ba51a85a2b5bb7373715d6d3bb32d18ac624e3a4db02e4ef8ab48316b", + "sha256:ecc7f200c86127903017e48824efd008734814e95f3e8e9b45ce0f4120dd08db" + ], + "index": "pypi", + "version": "==3.8.0" + }, + "urllib3": { + "hashes": [ + "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", + "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" + ], + "version": "==1.25.9" + }, + "werkzeug": { + "hashes": [ + "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", + "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" + ], + "version": "==1.0.1" + } + }, + "develop": {} +} diff --git a/module3-adding-data-science-to-a-web-application/migrations/README b/module3-adding-data-science-to-a-web-application/migrations/README new file mode 100644 index 00000000..98e4f9c4 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/migrations/alembic.ini b/module3-adding-data-science-to-a-web-application/migrations/alembic.ini new file mode 100644 index 00000000..f8ed4801 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/migrations/alembic.ini @@ -0,0 +1,45 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/module3-adding-data-science-to-a-web-application/migrations/env.py b/module3-adding-data-science-to-a-web-application/migrations/env.py new file mode 100644 index 00000000..94521792 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/migrations/env.py @@ -0,0 +1,96 @@ +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +from flask import current_app +config.set_main_option( + 'sqlalchemy.url', + str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%')) +target_metadata = current_app.extensions['migrate'].db.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives, + **current_app.extensions['migrate'].configure_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/module3-adding-data-science-to-a-web-application/migrations/script.py.mako b/module3-adding-data-science-to-a-web-application/migrations/script.py.mako new file mode 100644 index 00000000..2c015630 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/module3-adding-data-science-to-a-web-application/migrations/versions/65d0f9cd7b34_.py b/module3-adding-data-science-to-a-web-application/migrations/versions/65d0f9cd7b34_.py new file mode 100644 index 00000000..7d070e5a --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/migrations/versions/65d0f9cd7b34_.py @@ -0,0 +1,51 @@ +"""empty message + +Revision ID: 65d0f9cd7b34 +Revises: +Create Date: 2020-05-21 12:27:34.652463 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '65d0f9cd7b34' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('book', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('title', sa.String(length=128), nullable=True), + sa.Column('author_id', sa.String(length=128), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('user', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('screen_name', sa.String(length=128), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('location', sa.String(), nullable=True), + sa.Column('followers_count', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('tweet', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=True), + sa.Column('full_text', sa.String(length=500), nullable=True), + sa.Column('embedding', sa.PickleType(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('tweet') + op.drop_table('user') + op.drop_table('book') + # ### end Alembic commands ### diff --git a/module3-adding-data-science-to-a-web-application/web_app/__init__.py b/module3-adding-data-science-to-a-web-application/web_app/__init__.py new file mode 100644 index 00000000..6d233d93 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/__init__.py @@ -0,0 +1,29 @@ +from flask import Flask + +from web_app.routes.home_routes import home_routes +from web_app.routes.book_routes import book_routes +from web_app.routes.user_routes import user_routes +from web_app.routes.twitter_routes import twitter_routes +from web_app.models import db, migrate + + +DATABASE_URI = "sqlite:///test_db.db" + + +def create_app(): + app = Flask(__name__) + + app.config["SQLALCHEMY_DATABASE_URI"] = DATABASE_URI + db.init_app(app) + migrate.init_app(app, db) + + # app.register_blueprint(home_routes) + # app.register_blueprint(book_routes) + app.register_blueprint(user_routes) + app.register_blueprint(twitter_routes) + return app + + +if __name__ == "__main__": + my_app = create_app() + my_app.run(debug=True) \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/models.py b/module3-adding-data-science-to-a-web-application/web_app/models.py new file mode 100644 index 00000000..93c93ee4 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/models.py @@ -0,0 +1,44 @@ + + +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate + + +db = SQLAlchemy() + +migrate = Migrate() + + +class Book(db.Model): + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(128)) + author_id = db.Column(db.String(128)) + + +# class User(db.Model): +# # __table_name__ = "user" +# id = db.Column(db.Integer, primary_key=True) +# username = db.Column(db.String(128)) + + +# class Tweet(db.Model): +# id = db.Column(db.Integer, primary_key=True) +# user_id = db.Column(db.Integer, db.ForeignKey("user.id")) +# text = db.Column(db.String(500)) + + +class User(db.Model): + id = db.Column(db.BigInteger, primary_key=True) + screen_name = db.Column(db.String(128), nullable=False) + name = db.Column(db.String) + location = db.Column(db.String) + followers_count = db.Column(db.Integer) + #latest_tweet_id = db.Column(db.BigInteger) + + +class Tweet(db.Model): + id = db.Column(db.BigInteger, primary_key=True) + user_id = db.Column(db.BigInteger, db.ForeignKey("user.id")) + full_text = db.Column(db.String(500)) + embedding = db.Column(db.PickleType) + user = db.relationship("User", backref=db.backref("tweets", lazy=True)) diff --git a/module3-adding-data-science-to-a-web-application/web_app/routes/book_routes.py b/module3-adding-data-science-to-a-web-application/web_app/routes/book_routes.py new file mode 100644 index 00000000..5f645447 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/routes/book_routes.py @@ -0,0 +1,33 @@ + +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import Book, db + +book_routes = Blueprint("book_routes", __name__) + + +@book_routes.route("/books.json") +def list_books_json(): + book_records = Book.query.all() + return jsonify(book_records) + + +@book_routes.route("/books") +def list_books(): + book_records = Book.query.all() + return render_template("books.html", message="Here's some books", books=book_records) + + +@book_routes.route("/books/new") +def new_book(): + return render_template("new_book.html") + + +@book_routes.route("/books/create", methods=["POST"]) +def create_book(): + print("FORM DATA:", dict(request.form)) + new_book = Book(title=request.form["book_title"], author_id=request.form["author_name"]) + + db.session.add(new_book) + db.session.commit() + return redirect(f"/books") \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/routes/home_routes.py b/module3-adding-data-science-to-a-web-application/web_app/routes/home_routes.py new file mode 100644 index 00000000..e8cee3bd --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/routes/home_routes.py @@ -0,0 +1,14 @@ +from flask import Blueprint + +home_routes = Blueprint("home_routes", __name__) + + +@home_routes.route("/") +def index(): + x = 2 + 2 + return f"Hello World {x}" + + +@home_routes.route("/about") +def about(): + return "about me" \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/routes/twitter_routes.py b/module3-adding-data-science-to-a-web-application/web_app/routes/twitter_routes.py new file mode 100644 index 00000000..d5baa0b3 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/routes/twitter_routes.py @@ -0,0 +1,50 @@ +from flask import Blueprint, render_template, jsonify +from web_app.services.twitter_service import twitter_api +from web_app.services.basilica_service import basilica_api_client +from web_app.models import User, Tweet, db +from pdb import set_trace as st + +twitter_routes = Blueprint("twitter_routes", __name__) + + +@twitter_routes.route("/users//") +def get_user(screen_name=None): + print(screen_name) + api = twitter_api() + user = api.get_user(screen_name) + statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False) + # return jsonify({"user": user._json, "tweets": [s._json for s in statuses]}) + + db_user = User.query.get(user.id) or User(id=user.id) + db_user.screen_name = user.screen_name + db_user.name = user.name + db_user.location = user.location + db_user.followers_count = user.followers_count + db.session.add(db_user) + db.session.commit() + #breakpoint() + + all_tweet_texts = [status.full_text for status in statuses] + # st() + basilica_connection = basilica_api_client() + embeddings = list(basilica_connection.embed_sentences(sentences=all_tweet_texts, model="twitter")) + print("NUMBER OF EMBEDDINGS", len(embeddings)) + # TODO: explore using the zip() function maybe... + counter = 0 + for status in statuses: + print(status.full_text) + print("----") + #print(dir(status)) + # get existing tweet from the db or initialize a new one: + db_tweet = Tweet.query.get(status.id) or Tweet(id=status.id) + db_tweet.user_id = status.author.id # or db_user.id + db_tweet.full_text = status.full_text + #embedding = basilica_client.embed_sentence(status.full_text, model="twitter") # todo: prefer to make a single request to basilica with all the tweet texts, instead of a request per tweet + embedding = embeddings[counter] + print(len(embedding)) + db_tweet.embedding = embedding + db.session.add(db_tweet) + counter+=1 + db.session.commit() + #breakpoint() + return "OK" diff --git a/module3-adding-data-science-to-a-web-application/web_app/routes/user_routes.py b/module3-adding-data-science-to-a-web-application/web_app/routes/user_routes.py new file mode 100644 index 00000000..014f0435 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/routes/user_routes.py @@ -0,0 +1,54 @@ + +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import Tweet, User, db +from sqlalchemy.orm import joinedload + + +user_routes = Blueprint("user_routes", __name__) + + +@user_routes.route("/") +def index(): + return redirect("/users/") + + +@user_routes.route("/users/") +def list_users(): + user_records = User.query.all() + return render_template("users.html", users=user_records) + + +# @user_routes.route("/users//") +# def list_user_tweets(username=None): +# user = User.query.filter_by(username=username).first() +# user_id = user.id +# user_tweets = Tweet.query.filter_by(user_id=user_id).all() +# # st() +# return render_template("user_tweets.html", username=username, user_tweets=user_tweets) + + +# @user_routes.route("/users//new_tweet", methods=["POST"]) +# def user_create_new_tweet(username=None): +# user = User.query.filter_by(username=username).first() +# # st() +# user_id = user.id +# new_tweet = Tweet(user_id=user_id, text=request.form["tweet_text"]) +# db.session.add(new_tweet) +# db.session.commit() +# return redirect(f"/users/{username}/") + + +@user_routes.route("/users/new/") +def new_user(): + return render_template("new_user.html") + + +@user_routes.route("/users/create", methods=["POST"]) +def create_user(): + new_user = User(screen_name=request.form["username"]) + print("FORM DATA:", dict(request.form)) + db.session.add(new_user) + db.session.commit() + # flash("asdf") + return redirect("/users") diff --git a/module3-adding-data-science-to-a-web-application/web_app/services/basilica_service.py b/module3-adding-data-science-to-a-web-application/web_app/services/basilica_service.py new file mode 100644 index 00000000..ad22e155 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/services/basilica_service.py @@ -0,0 +1,26 @@ + +from basilica import Connection +from pdb import set_trace as st +import os +from dotenv import load_dotenv + +load_dotenv() +BASILICA_API_KEY = os.getenv("BASILICA_API_KEY", default="oops") + +# sentences = [ +# "This is a sentence!", +# "This is a similar sentence!", +# "I don't think this sentence is very similar at all...", +# ] +# x = 12 +# connection = Connection(BASILICA_API_KEY) + + +def basilica_api_client(): + connection = Connection(BASILICA_API_KEY) + print(type(connection)) #> + return connection +# embeddings = list(connection.embed_sentences(sentences)) +# # embeddings = list(c.embed_sentence(sentence)) for one sentence +# print(embeddings) +# # st() \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/services/twitter_service.py b/module3-adding-data-science-to-a-web-application/web_app/services/twitter_service.py new file mode 100644 index 00000000..0a7df01d --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/services/twitter_service.py @@ -0,0 +1,29 @@ +import tweepy +import os +from dotenv import load_dotenv + +load_dotenv() + +TWITTER_API_KEY = os.getenv("TWITTER_API_KEY") +TWITTER_API_SECRET = os.getenv("TWITTER_API_SECRET") +TWITTER_ACCESS_TOKEN = os.getenv("TWITTER_ACCESS_TOKEN") +TWITTER_ACCESS_TOKEN_SECRET = os.getenv("TWITTER_ACCESS_TOKEN_SECRET") + + +def twitter_api(): + auth = tweepy.OAuthHandler(TWITTER_API_KEY, TWITTER_API_SECRET) + auth.set_access_token(TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_TOKEN_SECRET) + print("AUTH", auth) + api = tweepy.API(auth) + print("API", api) + #print(dir(api)) + return api + + +if __name__ == "__main__": + api = twitter_api() + user = api.get_user("elonmusk") + print("USER", user) + print(user.screen_name) + print(user.name) + print(user.followers_count) \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/templates/books.html b/module3-adding-data-science-to-a-web-application/web_app/templates/books.html new file mode 100644 index 00000000..d6737885 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/templates/books.html @@ -0,0 +1,24 @@ + + + + + + Document + + + + {% if books %} +

    + {% for book in books %} +

    +

  • {{ book.title }}
  • +

    + {% endfor %} +
+ {% else %} +

no books!

+ {% endif %} + + + + \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/templates/new_book.html b/module3-adding-data-science-to-a-web-application/web_app/templates/new_book.html new file mode 100644 index 00000000..04f7cd98 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/templates/new_book.html @@ -0,0 +1,24 @@ + + + + + + Document + + +

New Book message

+

fill this form

+
+ + + + + + +
+ + \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/templates/new_user.html b/module3-adding-data-science-to-a-web-application/web_app/templates/new_user.html new file mode 100644 index 00000000..8df26f44 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/templates/new_user.html @@ -0,0 +1,18 @@ + + + + + + Document + + +

New user

+

fill this form

+
+ + + + +
+ + \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/templates/user_tweets.html b/module3-adding-data-science-to-a-web-application/web_app/templates/user_tweets.html new file mode 100644 index 00000000..7d566366 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/templates/user_tweets.html @@ -0,0 +1,31 @@ + + + + + + Document + + +

{{ username }} tweets:

+ {% if user_tweets %} +
    + {% for tweets in user_tweets %} +

    +

  • {{ tweets.text }}
  • +

    + {% endfor %} +
+ {% else %} +

no tweets!

+ {% endif %} +

Create tweet

+
+ + + + +
+ users list + + + \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/templates/users.html b/module3-adding-data-science-to-a-web-application/web_app/templates/users.html new file mode 100644 index 00000000..78b89975 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/templates/users.html @@ -0,0 +1,25 @@ + + + + + + Document + + + + {% if users %} + + {% else %} +

no users!

+ {% endif %} + create new users + + + + \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/test_db.db b/module3-adding-data-science-to-a-web-application/web_app/test_db.db new file mode 100644 index 0000000000000000000000000000000000000000..45f76332e5d1e5568605e39964d7463d30f79ef3 GIT binary patch literal 32768 zcmeI&&u-c<9Ki9U6ey^aU8-Dm@TD42r>V4Sw`r!bz|bxR)GU9qiF(-O^6xn_x|NEEUeuPe&cqiVe= z>J6FS)oPDLHZvZ%L+83mmGs8G?}Y9}DBhRs%BzxH*xlMPRgK$kyWOrg_$bP?Mp>1- zwX1JR_NjPnor;3jjqW;Z*jDwZuF4A2)=gnshn8*CE7plnWzo%9(@dv~eM8s0LD#() zeevZo%xR6oAo}h^J$H)HX=SpvoHo|i^~**St!hN&WGvQyP2Uyjs55lkfir0J-Rsbb z+t1CI$IV(5p&xWwp%)BhPeek2?+54ZaO8A?@gNk^)H<^4+d#7Bqh!i>xqerSs>e=I z9aED;B8qV0MG>}x;7sM^ScIx%I+)X6jrBhCLO&jy>Xan?6hxyu8&MVZ?cJT2dfM3B z)GsqpFIv7Fbg$!lmC;ItxvxvHzRgvtZcZO_2IKw=u&}co7q2wxCr!JgCgxlV&gZj^ zh)uB@?U`9~e<@`gZ{9^a-&k?3AR+%s(b_&IFZBFxO@2rSAb Date: Thu, 21 May 2020 19:37:43 -0700 Subject: [PATCH 9/9] retro module 4 --- .../web_app/routes/home_routes.py | 5 +- .../web_app/routes/twitter_routes.py | 1 + .../web_app/templates/prediction_form.html | 39 ++++++++ .../web_app/templates/result.html | 20 ++++ .../Pipfile | 1 + .../Pipfile.lock | 90 +++++++++++++++++- .../models/latest_model.pkl | Bin 0 -> 972 bytes .../web_app/iris_classifier.py | 43 +++++++++ .../web_app/routes/stats_routes.py | 64 +++++++++++++ .../web_app/test_db.db | Bin 32768 -> 163840 bytes .../web_app/__init__.py | 29 ++++++ .../web_app/iris_classifier.py | 43 +++++++++ .../web_app/models.py | 44 +++++++++ .../web_app/routes/book_routes.py | 33 +++++++ .../web_app/routes/home_routes.py | 14 +++ .../web_app/routes/stats_routes.py | 64 +++++++++++++ .../web_app/routes/twitter_routes.py | 50 ++++++++++ .../web_app/routes/user_routes.py | 54 +++++++++++ .../web_app/services/basilica_service.py | 26 +++++ .../web_app/services/twitter_service.py | 29 ++++++ .../web_app/templates/books.html | 24 +++++ .../web_app/templates/new_book.html | 24 +++++ .../web_app/templates/new_user.html | 18 ++++ .../web_app/templates/user_tweets.html | 31 ++++++ .../web_app/templates/users.html | 25 +++++ .../web_app/test_db.db | Bin 0 -> 163840 bytes 26 files changed, 767 insertions(+), 4 deletions(-) create mode 100644 module2-consuming-data-from-an-api/web_app/templates/prediction_form.html create mode 100644 module2-consuming-data-from-an-api/web_app/templates/result.html create mode 100644 module3-adding-data-science-to-a-web-application/models/latest_model.pkl create mode 100644 module3-adding-data-science-to-a-web-application/web_app/iris_classifier.py create mode 100644 module3-adding-data-science-to-a-web-application/web_app/routes/stats_routes.py create mode 100644 module4-web-application-deployment/web_app/__init__.py create mode 100644 module4-web-application-deployment/web_app/iris_classifier.py create mode 100644 module4-web-application-deployment/web_app/models.py create mode 100644 module4-web-application-deployment/web_app/routes/book_routes.py create mode 100644 module4-web-application-deployment/web_app/routes/home_routes.py create mode 100644 module4-web-application-deployment/web_app/routes/stats_routes.py create mode 100644 module4-web-application-deployment/web_app/routes/twitter_routes.py create mode 100644 module4-web-application-deployment/web_app/routes/user_routes.py create mode 100644 module4-web-application-deployment/web_app/services/basilica_service.py create mode 100644 module4-web-application-deployment/web_app/services/twitter_service.py create mode 100644 module4-web-application-deployment/web_app/templates/books.html create mode 100644 module4-web-application-deployment/web_app/templates/new_book.html create mode 100644 module4-web-application-deployment/web_app/templates/new_user.html create mode 100644 module4-web-application-deployment/web_app/templates/user_tweets.html create mode 100644 module4-web-application-deployment/web_app/templates/users.html create mode 100644 module4-web-application-deployment/web_app/test_db.db diff --git a/module2-consuming-data-from-an-api/web_app/routes/home_routes.py b/module2-consuming-data-from-an-api/web_app/routes/home_routes.py index e8cee3bd..d7c18263 100644 --- a/module2-consuming-data-from-an-api/web_app/routes/home_routes.py +++ b/module2-consuming-data-from-an-api/web_app/routes/home_routes.py @@ -1,12 +1,11 @@ -from flask import Blueprint +from flask import Blueprint, render_template home_routes = Blueprint("home_routes", __name__) @home_routes.route("/") def index(): - x = 2 + 2 - return f"Hello World {x}" + return render_template("prediction_form.html") @home_routes.route("/about") diff --git a/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py b/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py index ea1d6ef7..4089e2bd 100644 --- a/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py +++ b/module2-consuming-data-from-an-api/web_app/routes/twitter_routes.py @@ -10,6 +10,7 @@ @twitter_routes.route("/users//") def get_user(screen_name=None): print(screen_name) + st() api = twitter_api() user = api.get_user(screen_name) statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False) diff --git a/module2-consuming-data-from-an-api/web_app/templates/prediction_form.html b/module2-consuming-data-from-an-api/web_app/templates/prediction_form.html new file mode 100644 index 00000000..dbed6e7d --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/templates/prediction_form.html @@ -0,0 +1,39 @@ + + + + + + Document + + +

Prediction Time

+ +

Use the form below to predict which user is more likely to say a given tweet...

+ +
+ + + +
+ + + +
+ + + +
+ + +
+ + + \ No newline at end of file diff --git a/module2-consuming-data-from-an-api/web_app/templates/result.html b/module2-consuming-data-from-an-api/web_app/templates/result.html new file mode 100644 index 00000000..2e7cc03b --- /dev/null +++ b/module2-consuming-data-from-an-api/web_app/templates/result.html @@ -0,0 +1,20 @@ + + + + + + Document + + + + + +

Results!

+ +

Between '@{{ screen_name_a }}' and '@{{ screen_name_b }}', + the user who is most likely to say '{{ tweet_text }}' + is '@{{ screen_name_most_likely }}' +

+ + + \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/Pipfile b/module3-adding-data-science-to-a-web-application/Pipfile index 5c5189aa..cbfe0f59 100644 --- a/module3-adding-data-science-to-a-web-application/Pipfile +++ b/module3-adding-data-science-to-a-web-application/Pipfile @@ -13,6 +13,7 @@ tweepy = "*" flask = "*" flask-migrate = "*" sqlalchemy = "*" +scikit-learn = "*" [requires] python_version = "3.6" diff --git a/module3-adding-data-science-to-a-web-application/Pipfile.lock b/module3-adding-data-science-to-a-web-application/Pipfile.lock index 6fb35cef..1752ceb3 100644 --- a/module3-adding-data-science-to-a-web-application/Pipfile.lock +++ b/module3-adding-data-science-to-a-web-application/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "919b6b4af1179c11379eb9b40a3e3637fbae3fa378525b1869a362ffa158aabf" + "sha256": "3eebd6216f3a21ea97edbd2205d3b0eb2d92a9134823254bd1c857947df7a30d" }, "pipfile-spec": 6, "requires": { @@ -94,6 +94,13 @@ ], "version": "==2.11.2" }, + "joblib": { + "hashes": [ + "sha256:61e49189c84b3c5d99a969d314853f4d1d263316cc694bec17548ebaa9c47b6e", + "sha256:6825784ffda353cc8a1be573118085789e5b5d29401856b35b756645ab5aecb5" + ], + "version": "==0.15.1" + }, "mako": { "hashes": [ "sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d", @@ -139,6 +146,32 @@ ], "version": "==1.1.1" }, + "numpy": { + "hashes": [ + "sha256:00d7b54c025601e28f468953d065b9b121ddca7fff30bed7be082d3656dd798d", + "sha256:02ec9582808c4e48be4e93cd629c855e644882faf704bc2bd6bbf58c08a2a897", + "sha256:0e6f72f7bb08f2f350ed4408bb7acdc0daba637e73bce9f5ea2b207039f3af88", + "sha256:1be2e96314a66f5f1ce7764274327fd4fb9da58584eaff00b5a5221edefee7d6", + "sha256:2466fbcf23711ebc5daa61d28ced319a6159b260a18839993d871096d66b93f7", + "sha256:2b573fcf6f9863ce746e4ad00ac18a948978bb3781cffa4305134d31801f3e26", + "sha256:3f0dae97e1126f529ebb66f3c63514a0f72a177b90d56e4bce8a0b5def34627a", + "sha256:50fb72bcbc2cf11e066579cb53c4ca8ac0227abb512b6cbc1faa02d1595a2a5d", + "sha256:57aea170fb23b1fd54fa537359d90d383d9bf5937ee54ae8045a723caa5e0961", + "sha256:709c2999b6bd36cdaf85cf888d8512da7433529f14a3689d6e37ab5242e7add5", + "sha256:7d59f21e43bbfd9a10953a7e26b35b6849d888fc5a331fa84a2d9c37bd9fe2a2", + "sha256:904b513ab8fbcbdb062bed1ce2f794ab20208a1b01ce9bd90776c6c7e7257032", + "sha256:96dd36f5cdde152fd6977d1bbc0f0561bccffecfde63cd397c8e6033eb66baba", + "sha256:9933b81fecbe935e6a7dc89cbd2b99fea1bf362f2790daf9422a7bb1dc3c3085", + "sha256:bbcc85aaf4cd84ba057decaead058f43191cc0e30d6bc5d44fe336dc3d3f4509", + "sha256:dccd380d8e025c867ddcb2f84b439722cf1f23f3a319381eac45fd077dee7170", + "sha256:e22cd0f72fc931d6abc69dc7764484ee20c6a60b0d0fee9ce0426029b1c1bdae", + "sha256:ed722aefb0ebffd10b32e67f48e8ac4c5c4cf5d3a785024fdf0e9eb17529cd9d", + "sha256:efb7ac5572c9a57159cf92c508aad9f856f1cb8e8302d7fdb99061dbe52d712c", + "sha256:efdba339fffb0e80fcc19524e4fdbda2e2b5772ea46720c44eaac28096d60720", + "sha256:f22273dd6a403ed870207b853a856ff6327d5cbce7a835dfa0645b3fc00273ec" + ], + "version": "==1.18.4" + }, "oauthlib": { "hashes": [ "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889", @@ -219,6 +252,54 @@ ], "version": "==1.3.0" }, + "scikit-learn": { + "hashes": [ + "sha256:04799686060ecbf8992f26a35be1d99e981894c8c7860c1365cda4200f954a16", + "sha256:058d213092de4384710137af1300ed0ff030b8c40459a6c6f73c31ccd274cc39", + "sha256:0c3464e46ef8bd4f1bfa5c009648c6449412c8f7e9b3fc0c9e3d800139c48827", + "sha256:0e7b55f73b35537ecd0d19df29dd39aa9e076dba78f3507b8136c819d84611fd", + "sha256:16feae4361be6b299d4d08df5a30956b4bfc8eadf173fe9258f6d59630f851d4", + "sha256:244ca85d6eba17a1e6e8a66ab2f584be6a7784b5f59297e3d7ff8c7983af627c", + "sha256:3e6e92b495eee193a8fa12a230c9b7976ea0fc1263719338e35c986ea1e42cff", + "sha256:5bcea4d6ee431c814261117281363208408aa4e665633655895feb059021aca6", + "sha256:93f56abd316d131645559ec0ab4f45e3391c2ccdd4eadaa4912f4c1e0a6f2c96", + "sha256:9e04c0811ea92931ee8490d638171b8cb2f21387efcfff526bbc8c2a3da60f1c", + "sha256:bded94236e16774385202cafd26190ce96db18e4dc21e99473848c61e4fdc400", + "sha256:c2fa33d20408b513cf432505c80e6eb4bf4d71434f1ae36680765d4a2c2a16ec", + "sha256:e3fec1c8831f8f93ad85581ca29ca1bb88e2da377fb097cf8322aa89c21bc9b8", + "sha256:e585682e37f2faa81ad6cd4472fff646bf2fd0542147bec93697a905db8e6bd2", + "sha256:e9879ba9e64ec3add41bf201e06034162f853652ef4849b361d73b0deb3153ad", + "sha256:ebe853e6f318f9d8b3b74dd17e553720d35646eff675a69eeaed12fbbbb07daa" + ], + "index": "pypi", + "version": "==0.23.1" + }, + "scipy": { + "hashes": [ + "sha256:00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4", + "sha256:0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7", + "sha256:1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70", + "sha256:2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb", + "sha256:3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073", + "sha256:386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa", + "sha256:71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be", + "sha256:770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802", + "sha256:787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d", + "sha256:8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6", + "sha256:8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9", + "sha256:9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8", + "sha256:a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672", + "sha256:a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0", + "sha256:a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802", + "sha256:bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408", + "sha256:c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d", + "sha256:cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59", + "sha256:dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088", + "sha256:dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521", + "sha256:dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59" + ], + "version": "==1.4.1" + }, "six": { "hashes": [ "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", @@ -260,6 +341,13 @@ "index": "pypi", "version": "==1.3.17" }, + "threadpoolctl": { + "hashes": [ + "sha256:48b3e3e9ee079d6b5295c65cbe255b36a3026afc6dde3fb49c085cd0c004bbcf", + "sha256:72eed211bb25feecc3244c5c26b015579777a466589e9b854c66f18d6deaeee1" + ], + "version": "==2.0.0" + }, "tweepy": { "hashes": [ "sha256:8abd828ba51a85a2b5bb7373715d6d3bb32d18ac624e3a4db02e4ef8ab48316b", diff --git a/module3-adding-data-science-to-a-web-application/models/latest_model.pkl b/module3-adding-data-science-to-a-web-application/models/latest_model.pkl new file mode 100644 index 0000000000000000000000000000000000000000..b9ea874ea7365dc9edb06255e980fdff73d2bd64 GIT binary patch literal 972 zcmZuwOHb5L6mFT}VR;C?Km-**9K;!UiKys|j)ug_By@EXHJ7&2nJIMIIqj`T3_*>E zY*`zP{s0prH2xGNh_IE8!^6U%_2zHn{#*QL5>5b@L%h2p;OPYS4^a(X0mf_0Ny!>E#5gMT9Iioh%<{r!)`IL33o2QYG>2k28dQlK5@_&Z820q<4v5W!Y&Ew0wOQ^CZIka7$>6{ zO@Q5OGUd(21+2djN)3@vs6omQbg^}0&Z?82+xd!4GD zuDp&%QbDT3%=qPkbB`J$H}!$4;aNWN?ET|;TpyT&ZURRYwjU&|4Kxt68^X+^=SfU6jVte&c9PkH_>~A5M^7}7V78>wZmCg G3H=7yP(Q{1 literal 0 HcmV?d00001 diff --git a/module3-adding-data-science-to-a-web-application/web_app/iris_classifier.py b/module3-adding-data-science-to-a-web-application/web_app/iris_classifier.py new file mode 100644 index 00000000..e42ac9bb --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/iris_classifier.py @@ -0,0 +1,43 @@ +import os +import pickle + +from sklearn.datasets import load_iris +from sklearn.linear_model import LogisticRegression # for example + +MODEL_FILEPATH = os.path.join(os.path.dirname(__file__), "..", "models", "latest_model.pkl") + + +def train_and_save_model(): + print("TRAINING THE MODEL...") + X, y = load_iris(return_X_y=True) + #print(type(X), X.shape) #> (150, 4) + #print(type(y), y.shape) #> (150,) + classifier = LogisticRegression() # for example + classifier.fit(X, y) + + print("SAVING THE MODEL...") + with open(MODEL_FILEPATH, "wb") as model_file: + pickle.dump(classifier, model_file) + + return classifier + + +def load_model(): + print("LOADING THE MODEL...") + with open(MODEL_FILEPATH, "rb") as model_file: + saved_model = pickle.load(model_file) + return saved_model + +if __name__ == "__main__": + + train_and_save_model() + + clf = load_model() + print("CLASSIFIER:", clf) + + X, y = load_iris(return_X_y=True) # just to have some data to use when predicting + inputs = X[:2, :] + print(type(inputs), inputs) + + result = clf.predict(inputs) + print("RESULT:", result) \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/routes/stats_routes.py b/module3-adding-data-science-to-a-web-application/web_app/routes/stats_routes.py new file mode 100644 index 00000000..bf3134d7 --- /dev/null +++ b/module3-adding-data-science-to-a-web-application/web_app/routes/stats_routes.py @@ -0,0 +1,64 @@ +# web_app/routes/stats_routes.py + +from flask import Blueprint, request, jsonify, render_template + +# from sklearn.linear_model import LogisticRegression # for example + +# from web_app.models import User, Tweet +# from web_app.services.basilica_service import basilica_api_client + +stats_routes = Blueprint("stats_routes", __name__) + +@stats_routes.route("/predict", methods=["POST"]) +def predict(): + print("PREDICT ROUTE...") + print("FORM DATA:", dict(request.form)) + #> {'screen_name_a': 'elonmusk', 'screen_name_b': 's2t2', 'tweet_text': 'Example tweet text here'} + screen_name_a = request.form["screen_name_a"] + screen_name_b = request.form["screen_name_b"] + tweet_text = request.form["tweet_text"] + + # print("-----------------") + # print("FETCHING TWEETS FROM THE DATABASE...") + # # todo: wrap in a try block in case the user's don't exist in the database + # user_a = User.query.filter(User.screen_name == screen_name_a).one() + # user_b = User.query.filter(User.screen_name == screen_name_b).one() + # user_a_tweets = user_a.tweets + # user_b_tweets = user_b.tweets + # #user_a_embeddings = [tweet.embedding for tweet in user_a_tweets] + # #user_b_embeddings = [tweet.embedding for tweet in user_b_tweets] + # print("USER A", user_a.screen_name, len(user_a.tweets)) + # print("USER B", user_b.screen_name, len(user_b.tweets)) + + # print("-----------------") + # print("TRAINING THE MODEL...") + # embeddings = [] + # labels = [] + # for tweet in user_a_tweets: + # labels.append(user_a.screen_name) + # embeddings.append(tweet.embedding) + + # for tweet in user_b_tweets: + # labels.append(user_b.screen_name) + # embeddings.append(tweet.embedding) + + # classifier = LogisticRegression() # for example + # classifier.fit(embeddings, labels) + + # print("-----------------") + # print("MAKING A PREDICTION...") + # #result_a = classifier.predict([user_a_tweets[0].embedding]) + # #result_b = classifier.predict([user_b_tweets[0].embedding]) + + # basilica_api = basilica_api_client() + # example_embedding = basilica_api.embed_sentence(tweet_text) + # result = classifier.predict([example_embedding]) + # #breakpoint() + + # #return jsonify({"message": "RESULTS", "most_likely": result[0]}) + # return render_template("results.html", + screen_name_a=screen_name_a, + screen_name_b=screen_name_b, + tweet_text=tweet_text, + # screen_name_most_likely= result[0] + ) \ No newline at end of file diff --git a/module3-adding-data-science-to-a-web-application/web_app/test_db.db b/module3-adding-data-science-to-a-web-application/web_app/test_db.db index 45f76332e5d1e5568605e39964d7463d30f79ef3..a23e4d7eb922a99a361305d1d580f7a1860307dd 100644 GIT binary patch literal 163840 zcmeFabzD_l*Dg$_2q=nTVIhbph=>JSB^Dq8DiRhVEnRwpfvA9ufEZvAih>x3v@E*2 zyHk)d05Q(Bws6k-Jiqgvf4_5{Z~ME&y*GQUHRp(HTw}~J=Y3$Grj?7CsJXq9t+9)! zERz5eGc(gpQBfu)CNBIH$KRPhYA#WV5q@h8sq z;d?gw*sORy_y5CHj9)P%z>ok#0t^W-B*2gWLjnv5FeJc`07C-*O9GxdIXH!dg_$oJ zxfq|YF>^U>X68cw!Kt)gWtXmssP3-anku67k3_|JxUEb@cdHZXTDqcI+W31=Q*)gt z54WqcnUm4~{1x?yxvPzhk&D?sE~0w7_A9CF+Al6AEiFO)#?1DFnW?FjorUObP3_&( zCp!Dp_wL$nD7r_*P*mK?l>RMM?fok1gckLg`1IW+ME9$xs_a+MQc^h}N_|HEGLM7= zCx@_tFf)^tovGPB&W<)n!;FkwUF_-ajp!pclA-^@<++)SQ+VDy=8M|&*-|&5{<8ne zT>swszniMFiIbU`ospfft=a#an#{&668|EP|N2{MhBo#l#x7R&b~9JdC1h`7V}IJr z$=S%n-qp@U6f#vIRQCVx1i~Y+hMhxr`@H{dj?{>aWT>AUo~*3&8G2gLXL!Qi-kSQ$ z_AfJ}KABeL^i%(3^e$E|Hvc*~YETfVr9EBCGa99){l6csrvx*nu%smOMQ-{ijBTKF zD-)wrm@TC6Z*N)tWo-ZUOKO>wxb5U6f(|+Z~J?tW8A! z#l-&0{UmrK6j(Tf_euVDqW$-q$^6>~tZ*eNzh~mZUuOOhCj7_v!;k<&0t^W-B*2gW zLjnv5FeJc`07C){2{0tUkN`sh{~;2X&CIfTvz)24`BoEC`4h66crY(U{{J7MT*fpQ z5@1MxApwR27!qJefFS{f1Q-%vNPr;$h6ETAn3e!P>uT=*n*USl|7iMW{9#CdApwR2 z7!qJefFS{f1Q-%vNPr;$h6ETAU`T)=f&X9${O$j5W#VuB51u4rY77Z5B*2gWLjnv5 zFeJc`07C){2{0tUkN`sh3<>;aOJEr@2iuZmd~7VCC#1}5?Coq_ovl^yujpR9V43Yt z{_X#tV8Ri7j6VzsFeJc`07C){2{0tUkN`sh3<)qKz>ok#0t^W-B=8?50ZvvnZmKB2 zj(PF(f1qY3&OgQfoqv>nkiVC|gTI--j=z$>gg>7@i=X6A`ummtFd;Ce!;k<&0t^W- zB*2gWLjnv5FeJc`07C){2{0tUkih@t5)k9Z09Vb%j}=r4zvwLdSjvkZi>VcT5pMig zKppTupA$cXIPhZ*mFf#n{{z3-)an1TSnz|FnfkT>zYG(<48J1(9)1IUGkzz25B?kc z5BQ(+zvoZmFXnGRJ>V<8#`wdK07C){2{0tUkN`sh3<)qKz>ok#0t^W-B*2is|9>Pf zi+c)44enLaOq}#L zo)Y_C-#O02@%N3)J%6DQ7IylZONGt-HE)^N{=TXHYM|T3#7ckTWm-0CJ`*boFDnPP zptrWV*ZkYel;WJydQ%7*scawoKud(6RdEK1Z>n%0XdUfhqN}&M60~;vv#S(}J`v=* zLkrwB)Fug9{^&A)oAa*;vOP@x#jMFLd{UcHAawl&K}N34uUnmCLXZt11!js?WG69h?`70P|7ts-cXJ^O6m zHeVuW$yr~LP8+=^Xk|LKHIJm%;8}L!7Hjmp30iKm9b1~=a)S2pS|VVe1Vk{LeED2gy>ObuPQua{O$&$z~$7BfFHBU9GpGy`KWcin8=Ofqh5@cvbW6bVmNVWd1 z*PN9LWHIKHuI1;%H884Bqm!0i+E0Lfz)6H3e zprz!NC#%mdz;{jwtO<0W5oC?VFJ0Yvk_1`wTl?p|K*+g6_Fgm7_-VWt{wa9$`$34V zk^8yhuna-w9RE!`SOnW>ln~ZA|0obvH*ND|<)C=X^SAXd+R@G7Oj9ojGFEzDt%-OR zK{h$LS{nCD5M*XayF1I&QGynyv&V7Bup4u?nB;qO8Xng&Z6svg?W~sc^jZjNuJVNw zw}%Pxp;@DtWM?eKQ}uaWYWN^QtJwcjOfRYh*6aJ0x3CB9(6&dd^0nnLsA<@5@t1=o z1T8|{%ZvXp#uIz+gW|T5jc^B=+>@`rY@xVY*Bo1{q6xCCfwx=Wwj)8Fz3J;Jeri7C zyx^s>%#|$!E#cOd9X|FDc*BK5Qciy=@M75$<^*%NRk!eUc_u=OAp6F;s5=p~UYGYz z)_^{o@mFxjySoBV?&#ky(-Jaxp-}F~aNKaJ=2<{!8?HJRs4tXQ2rc`xyOt}s0uvS=Yt)Z~Qx~7Vu;t06R46xc zo?z=wKxN<2=i$o2KA4UV?MHeAhjz)b&h4?D}g=@7K68TU*GE7RSX{|&gYXQdFcVir)nd{Ix&0X(9MxV)0T z)Dw=jv%h+gb|0|rLS^Z9%}LlHQ|zJcKj8$~%xkejdwT@znI*z~-C!O;RwLG|czhf1 z75m)G@H^#AMElXX!m+XOg*nsp~N><;cAHnK_b}P8T`+(@#Ze2F0EntOpPZIh z2Ouhbz!KE;WfMUwFFtI^9$E{>Z~M7EY0Vp0xMKHEQwATVe5ALS^?(y@$j)1LMlS)9 z5A1$37UB$HE;N&@%rpj6ZaCE=aPl22;c??cViF|Zr@K5&SsYQO{A1_T$1@Ok?n0t8 z^yEr}n>I0(uAV0ZS&)D3#+Up3kn{ByG_3+ld~$Sb<>Qk{u#NV$`#P705o9k^Yg7kE z^U?mGKB=Y$r~Y*Hlw7Y8#1ebq*{k9M_(bKihDZ(ky;d|U_*o|$qg#Qyv>go~tUUwl))%&>JS$ zX9R@&ut@fV)FQZf`IQOd=X?~lL`xM4ne{{R#U_QG&Kn8Zi=@Nvm{M(EQ9*~UChp6@ zBTTnN1Sd5Sw2Zx9Jsv3F=~;s&*4!r0*QY1TgzhW2LGJ;UYov1!Tw=?Vb^Q7eO5TA2 z8oYtAeNwB1s9-jkZz5JKFi3&FGfx{pdGejRtAged=9e}=Q=F%wA@j=lh?Nt} zpjLYkVZW#8eDwJMSbqJu>xkTSg7$i4v1#ZoF3hy(z*=>W=TK#YW4^<95-1J#_m!MB z?4X7GE$hFw34$@suHzAYI}T(^N|(7M4EXAhx8VMvn++5Fxio(`G?}2Kg2>w4yGfAY z>BWKSFVYCw`){+nzyHCV3$Dg}X~jd^)U z8|Ma7VnM{+_JSbuioFaSVjn}@LLyf3<-ZA9-oRCzQ`;7Tq7RvTSASHG@7yS^-=T{8 zs4x2@n|b*nL33~3e!0hRJDxQ@QQ&!h3|C3*bLvwud60~9% zvrNewaDXFXj+e?BFy@U;N^{R}g7V3p7>n7)Hp!-{s~9#g%g?a)w@i z2h-Z)l)ca$b59!NTorE*n$a_~vGbw`f@W`~pSIeLw*ZIUPezvustH=;vwsQ(CvbVE zq^qg4BwV;<^v098xsYMa6{{Ru`Ry>RO6NCIY(w~Dn(2}8i&m+{hQm)wH~2(z@mdhH zCS{({!mGf9vgZ?GpCdsAGX5;okzKkCp!dpgR!ksLn5yoy#0PVMerZ~U5*EyedR>>x zMHhtcAZT85_8eK-l?UinvN+nj77m;Lp-hJT@HK+GP296nU5~h2OgJA|upaTNhW&dI zhiDY;oUw4g&Fcm5?hV&lvcCjEn8dyk@y|vut)jcC;wk~N0aW6>Bs`SWqdkL z@W3RPmfsxS1;?*y{P3u0DZH{E*80`BvIAsje&?$1@xugdFh6$geUq(#ix)(U>Xv+< z-{gzpPppW!@6_fmRGsJqO3ZS*&SB6-(C&_P@a%bi6bZ}c%avQk?<2ljh@@+pgQ1Nw zYhO3G1&6I9eXIu8fhbn_yr|jh!B3F&NHfAGfV5G5hKBMl0fTMFRg%8Reg(1>Dar(V z&mhRe+q838IzX*=ekLb3hG7;->`~jIirrvH13GWV&b&t?iW=s4{|{1ztT`uG4&2iR z2e@kWH2NBxI@V~ft>fY_41S*clb7e`!f0cK3zmy^Ae1~9eJ%CuAR@?aUImS=wMeqs zUY!dW)WWY~>eS2bH!9i_K^XEj4s_qmTMq&(t0vi( zB8+fsv2x0%5GGp3U)yECT8yg{BiK^bm=I*ZcFksS(=d#u{l(ADfntLExt=b1;335d zkNqIXi?(b%3reIAwgjimrd%#uEcqbPCEH%T@sd~lzrfD5;a8to7 z@pUl7`eAbCVr|5Uc7ud9KSUs@>RYz+q6O^X4}Y%tZVLuXJpR$^uQ5UbZUTd(?`!SE zi$ibz`8^CO?B}eimKZGuKhI@illh22x3s!zxyK`5{8%z7ynf_0Mt^6&%+!=GL~m_W zaB}P;E?3rbT;0qK2yoR88ogpikP}qc;r4{)IJI6hcqkCG;GuboM#i;)GAlNm)TxQV zmxnG#yJ=v|-);(g6UhheRI4tsRVv$xI1wUvbXj07<}T2-LP+d4xomK1x@dEuPfXphB)ezv+;c0UV_$L z{PNkJ@;e~)`Kz8gO_3@yZx1cGrqbOEGkkJ~i-KOk95VxYU^7ChD!R+!Jm$==$ z4mpWRe8ES5n*q4io(X*r;t48emQ;EQyP&>vbbv%vjq&% zce9n+{qIQEzb@6V?KlDhI$PsW`7I7JMT!;_2PpYC!)a=zeSFl80SiKnX&)wBMuC-& z?FJmgSaIi5^PM(oUV;yQ+oAttr7GMqA@_*JC2+nG{@}Uuk8Z~v5d-{3EIG*uj>J;O#~U$*Pwn=un2f+W4wQ@Jq_q!JkL<- zKD?<{qj-Vl8c`4+?X!`tS4WURh1|T<9^wGSY3XDS$RLu97_fJLnSBAqe@x420iW&pte+gf!=hvB{g~|FAijHye=n~mXo)J; z%8L?UNM*auhR&J23<1?)vVuG~4*?!5Y}Hj5_GkX7>tb7V5a7?7e%regyvJ|4_Dbs- zf4R`=s6XtvOk+dI4?lbJ#}yIPCEAyWay+ zJdo<>a=MK|r{G-vJiV4QYU3Q>YCUCq zhoSDW_|LoI54oZ?lpXyw$Wa<9P>kB_&hH1bS@H06ko7)Deg!kJrYRMqpI-KXD&yZ8 zOpp&+U@d`L6RtRc1oT|-^%gl^1vyLDYRZ1til>JStdli;2l#SJj!wJJ3+)JrzOQ-> zmuY`IWm~}c9WMm#Cg0CR2q*}jj-Iu%tkw3OLeO;Ycds)s7y!d7cb;-L+6{J#8raKg zF9@=3`+-+xj$)L4d=B8y5}RzY^qg;k!$dYB0jayG2Ii zr7cJ>ynF(h@4-aFpGHJh>3ZT3ch~*$o%IiJwV|A2NV*XELcBj*uL42UF~`b@;aUEF z24nM|<^iM3|LT;?d^+-MxE~Huv0>y&Ks@4md&gUoHg^fANzQjYdr>~h%`%-44dK5C znvWunSb_a2&}I8WceSpc2Q26KfA5pffDk(FZMEfI09HVKp#BURY;*noYxy7eMRL-? z^2}%u@x`;AGrh%~KO$X$0fIYv?OMW=o=ec)lpj5)@(Pii3P=e=kJ5f>|392Wio>8MSCRNSJs6fjz>T$Q&OAk6Dre&wq)%=lCM zgJbRTAQe}bKDA#1@2Lzi?ix4y4Umz~n7yta2+$@pU*4_19D@&f>t$zk5@z%9_JUr0 zNDAAog{!WEYv#vr9HIH6+iS`XsUsu)`F zo3a-U2zaBRBBNPZMOr^Wq`HjIDSt!-&J z>mhJ&-k9WJfm0dlcqOutHw(O5FM`R8ey^0i zvlz-P3=+0&C>es$DklGOd<(>Ge%Qbyw9+A5G!am_7ASauK6 zxWAQ9KM7UVDLxL_sSl%VbXvHA{~L1qQit)xHmsb`s?M6MLEZ>|e=?=Ua|i=#Qj6O! z&*p~O^w{7c)o3uQ3i18xpZ4Y-7=Y(BrR1GR|H^7TUT@}t3zwy(|McCs z1!!Zx{sx;@2;@wK%w_Pn5kqRdD+tjl=vsCP%?dt`VHhWh+fM1cNrP{&zGlV&lqV16}!OZK!Hb&qEiH<^G) zn?Fk0FAPAi)AyRF=$;2P9r(*&$^N|(bC;%lfK-jTcX#Wzz#XSEgE9gSVPLuE34Fs3d%|07s3lJg~uP$?04ryfa1{(b%_Ykya z!I2^1rwFxCin%=QOdqP%%+Uwe%@Uc?xg?C9ABI6Y=0-TTJ?R89S0ti>4w@xB&*kJ8Ku z%yiCCitJ-NSPNvgTm~T8%n={Cx*p>FE_t%I+5*tsXUf7Q{1frQ&NjHK7>g4@9P5Qo zdcbU2f(rA}O8j9Pi$w${fBAq6h|rU1(6G>#v#M6&KAo|e@;&1s@E!e9BQ0ea3UWemOI4QP&T-t#9FxxX(HbMm@ z;t$R$SR$sh!ds8-Psc<3eKMHRM)1P^vQOe8gp$5r*BTPP9U^E?JrgRF+2_KdK<50S zd|@r6^w5Z>cl`RfFx?46@#Dl-XErv3q?byE^1__V*3-}bXZy&6{}_K55@1MxA%XvQ zBoMcSnS+CE>)^VXZYJtP6D4Ci6EhppnSWeuTwI;ZmS12CWMA}mW=HRcQ)^dsM}PPL zt1GX`i*fuwwC$Zed7onplq31Mn0?K@cPPI7oJ`(*yaXA+g6o1igI0l!__}$mS%goD zWz$P+xD}B{w4Svvj6y;YqHjI^q;);Y+@0Qj-0~?RZ#RG&uB)ZO3BtEFy@LQ1t@f*5 zWG#_(rpAy|P5_cNvwB@gUE_eFV!gb#2T!O7YS6~)RR{Hvrj@to#@^i4i+E?UH(KT= z*jgjY9@&No46JMSS86!}!7=(x`P@s^s29Cju>9CJL&T1SYn>ehy6}kUh)gE1HMRKX zA~mR;QmT8{^#TEX&K7|_uiGfrzdy`Nf~1noAJ-@xjzZE=jjJ0n?*12uT zM%s`RLB3{t(X=jQIX-dTL<^0kL1GeTerOukVW_oKb3qd3&hh<@sxzo>!`Zo~s@0v* zOt!CHAmTIP<^Xd>r{bT5U>aDL=DXs7L|}2g>4^(4iTsE3`WM*jbh{F*A>-*v(Yya( z7@v4UzP2jZd8QJzmz)6+YX{qGP0%P z$-{mqHzKxM+Z~Lho%44E%UuxWjAs*?(fU|s%gcIY)A02*1}|=ZtwPToh3meO>vM)6 zmbcsI>s<;0&2Hg2_B&v~DacSV#Lis?d?^a+iglT1z%ZBg-TdOb7HLTF*>7LFpwo<9 z)I#e840S)-8-EEnQ6rk4_R((P@)v^C4M6)TwY!0?ceLCqv;LS0%6j@7|1$kpa2N#} zBnJYZ$KCl$ggQTBVBMC_*f}FmYo*p`B-)YqdnIgF(Xj#j6LLCN*qj8tFBfeeuT?;b zv2Qr8=_yp1>pnL_Hw?afZnbZdr)wMvBOLvIK%Swm`K`3O3y>0a^I5OBnGf6O3Xb)& z3AcmdlKz?&El4zF%i1}U5GK`__x%@qhq$l8o_P!PD`R1&SvP73GR{Y2yU~-nbV%3h^S4 zbA%f`oyNL}6QQzY81~aYXU@LuhsOa;H&srwJ?Vo6XYn&nUCcx>RYot_z(MxkJA0)! z80FLKFe)Fy;6n`$C-=D_KSCR3OtUY!8B(ayN=)Ca$RhT$t`ibASB>gjxAu zkhz*H6vvX!wRrs|u-P?!ik>R`aQvavVAjoS?GFgw;0ypww>9uTv zv{ser^D=|L%LnzUOCw9b?e`qC>=W(5<(`jL`c=c~N|Q&LPTl+oU8L?q{z?L$=kiT{ z%y|m?i5?pq@BI!vM_&?7VP^frL{{C1hkM;soY%DweRv7a!IHr|bOyh#Oi z*y*-lVa3)ZSR{_FzMU40r{~WUh4Q^K#4bES(or>}cTGnJhF$e+ZSH|yE|~ESs&8!r z;ssWijhpU3O;n%80c0OVE9fijuvIhW4g+mXTy@Rh{r4RkkpwODU7}bG{HYlf)n40n z9^P#o*z}$-VH~SAE5}tvdyN`0IoN-LhVi#k%^_WgX{wpd;H<} zVSI5ReHimAzSS2UuHc6K!5gpJdJjSfi)xk~?ruOPNEIpP-a)XN^K{TD1ihW_B<$zzGQU7lgrNOCU4PJV&m)LM*w-?31EAn;c<{l) zXT{-+{_VrgX&F$r5%bXedklDls>O)9Ert-Xc&r18%Kjj= zG+uWyV;-Qpv;6F_?;EI@Zc(C8fuQ}3A~=^W4aZ*1*rAT;!{CaAYw|{Oq*K4 zbOC|9mnqJ5B)baF+Q@C;Q*swWr8^3~Tr)0m9#28NkuE|Qz{%Njt>#*NLOl)L40ErS zAdq#f$KpFov`&hB?26hJ#7dn3m@lLeynRdZMhD!mqD;&9Mh9f*HShT$ryWNjx*$J+ zV~Y{~Vp#Y3AL7APo#+o^0s0g=`iSOeGTjfDbz6thfh*pToZ>vR7eQi_}lFzmRohz_XQ5cT_-$<+#%jkeR zRL%6q=V-4u$8v2cOmv8U$NO$qSj+V47;W$~cEa4NZ?YM+3$DQ$1ap(yoNa-? z!|Kl*zsKQUEeGh`Te$PxAfCFA`9SQm{3^o6szlo22Xa5RYa7E3`OiE?M-Cvj$a2LW zuB*_OJH5{uYND!N^|`putjnOo+<)``T}*7d{@vWIB@&3=#KOtJc5wre z@R|KZNWyi^oNbInRb6dtL=TwRm`f=;S)H=7vkGR`jRMYWww&74GyMgQK?-p$GPSnQC z*;&-Z(%4RPqo}QwovRCOX6zzr>Ehzxyluk+xw`bOW82}EkFE^LFcAIMgjYcX%!XB3FbKNpEspLh($SsrvB&n`|G&6mixE6$(gXb%QIsMK9O#v%Z2RF1AU(+8YLf#@A$EQkuLyhOb3AXI-J zqc6(?pl{6TUwrEoVm1Hd#sl7W_y+<8i>TgAWeCak+Z^6%s zn7v-2<$KUiBywpJmt=qXAl|H}c5jU$Zl%9!S@;u0|2Tn|>d17EtszUv6PFD^0@`;6 zKF_Y;1U29IF~hcG8y^9Ogxu!BPzQL=%CR9^Yd<&L0urHmz505BG!if*6H_(Mkp?IW z?yxjpgo6Icn_(G(R|xW1X{F#b>pxhIYNz)}f^DC)!zv-ZlOz3(T3P}Frg<*Y)_IEY zaM~>abHe3d-}POP>O1Dr&bo_u(PmC@E8Ot;^Q2FjTfxYC&V7kf2`NOcjJrdt`8qF% zx8&(*RvXN;NN$4L&utszlW{R;SOG5*Jk#aKYCGK7^oZQGpI|U84*7TEEqD;%x%?iZ z$^doCDZP$zyNmnG>&+_Luv3ou+X=5(}>RuPk3~ z&IWBt?Xxkv)Ta*v7$31<&%1|THSFA9V;+giRlCw!4bnlIp1bdVm|LZrf?wA7X9euGxD3e~{Ozlt zrPa*Id9@thNxj}Nj(rcnjn^sE7D4d%jO>o$v^ns~OMkZqk)2dyCo3KrTS{*ff=>0O zeD%jsE*$b&%`%jmk7N()(#MK0!bWWP8Y+{5Z8R(7C0K*%Rj;wwJ6{&+9zS?wf3H*s z3@MVsBv<@nwgAT9$(*%|F!xqx(=(C58ZeS{tBmb#$j#cjsMa$hG&#w(9B3|vHx2Vje~5H6 z0PPn1Wq@Tu813}V7;?0os;VJr?2&LhH~Po|%VU8(-Z7iip_Ih}wW;^@p)ZRQv-`^V zu|&=3wZTIjMq5GUI~hnqa;c@pweiTHet)^`^%V=ic{AO|JxgBZ`+L1aZE;{_XZ&4d6S(d|vJMZrJoVx(ay;~QG?RqZ(FfZ|veaGp7LT$WH`dVhV zLkY{dE9s5QXnX2Eu|9v-8rZ!3vgUz$^j>uSeDK;|dj-HjcfzCYw=9}n0wfd!Bw_Q< zG7MiSrKzJX)@(S7rwk@>JnkV^YbYS4+&GfPx@R_`)hhSLlBM|Mv&35IgB!vAdmenr zo%O&PS^Al(8?mophabItfJDX6@}>3HD9j&eNO|JsTaE|`37o3UH$x% zs7b+v->}}2m@Gw6X7$25KhN}{@{(Xr#GM`|Xb&h{o7)Dx&p6s>Ay8fn5SK^q;ekDq z5-}G>*NFoLsn&OHJmRYlz0HIwtNmSrC%>3|neFinE}X`yO{v+Fb7ji|W>GtYmRh46}JDA`gx@SJei;Kcm=h2I1KneP8 zQYpj&gX43}XYa@5>^}ywxWF!k$6cbrd=TghReufa&quwl|Gso*aS*;!bB}K8u)}== zUP}}3NlN{P{=@$i103dkaQ^h(5-#lRTmB#!6KthAPfr8GW4Hy>e=M5^8B!ZfUtEOb zv5Z{b+6co|!;aiDS*QshacY{ zLOd`Y))UL#XGp|kq0rWPWaU^ti_C+982KKveF^CChiL{ zyE%a^4>=B-RCeQ6aa(8kaZVAmhwVjM_Ui$bFPu<_&$$3!?vDD~WI*d{GI_mv7nJf! z;M?d`u_sj7gu@5`5WHF0D9U&@EFF2kWRVIrEKS}WqZq_&3w zNX)P&US1P;X0L$7sGSfqTIQUifUkq*ld?xwJx1)Mz1jVb#vQ;9#UHj_!*`UNzs&D+ zL}7fgRrgl$Eg)spqchK~Zorj4O!qX_({~dCahv%^XBWD(fTX-$+;VgQSbXEqTqq$7 zBb*^$kwc9Gd(%;H3tcCF*M9eFg63$bcja^o;znD~wj+y=UxnXieUz;TG)0$@NWh<; z&sYdDOzzAq{<>rs-5TrjRf~YrFSe~O9bXBPuX6F~Y}kPDB)V{JsW&@;65Nt=q?!k8 zzs&%>jV%C@9E<2%N~?BbI&HD-OHyE2z51THLO%h|<`!wMz0E$rb?kc=ys&jbt*P(a zx-(b#0LIdMUD<-LzAx|n{7n}D=CgEb7Oh<~2DGreqbR_^1%I9H_9wg3ze>hgNW+z_ zb*U~?%)ODm^B(ZLX<;Xm&?F*19n;q#0<6da+yDUHcwGWmK?PN__AhB*4+6fL{>gVc zycvU+?7`U-u)55d`ur0U?}T|?5N6vGSAo3;0VGAbga`I}Ll;^bj zfK`W8Prnb$f-nzHcU@LJy<_y~n>s?J@9f(tXH=nOs$2S$4dUTUD`U+kFXhvJ=Aky2 z6y2krpap51J(T4b`ww>Z#yB#4T?EsLc{p(N-Ss~xwDQmYx@AuYlwx8aaU)$B4_&#v zzMunMo<=p1%fUh7Uv%(JZuACmkmLKEql_^Z-p}p0xHADvq+rjSz1)u>7HYGbe-ALm z`1Gg6mV;IB^o!S+>CB4HC+|0^kzD6c{jTc(Q>;R) z`(Uy%IcEUA%;Chtb?-coiP{~nhg7fRj^9|5B$jM?_E88k>LZ@%t>wAMM3-9oj2Nim-oWP-U@9n{(Kl7hsyi)niGKV`>zvbmtus? z@w+tkO0Gj2-kI+rVIu(1>(~%!R8fMV3JjI4tHcDGg}G&zC18*rnBN~W{}>K_w=X^5 z{d44wx8Evg@SW5I)LEK~^v;@#5pD%mbv%WZ71-a{SjE9M=+#hQ%S#8j#k)L!8x`H# zJe&9sc2f6>m~jZr2dEn?mr!wj0e$&fYGMyH{FFM6!U8NTV$SY~FdmJSjg*%^$5Yw3d44(4T!@SSN9B`Ug z8pQD&bfdeU`*pQ7tha(9yXH{JH*x+s8SW;C&)Y4pH{3x0sa4ze!fK}+LHqSu$i1C_ zo3|L%MMpi+!=3HSwpjiWf%WDr@rENH$TS}3^Df_s7)6=2CB{7FdjHX=FqWdORB8Xi zr(cT$MBFHdLbzz5Qew#;NbEe;{N7X00DaB$FlXD87`d-I~!r10Ne>%tT3ETl)$}68kaqZRDsPiK+R|9mpJK@$08ob=0i@=sx7rl&%e6a_)5SL7YN z4N~Jq;530) z&^Kg#i5+piN$U0y*3EFwjxduLy+7%g*Oi|ECf}S9qu3iP} zMNnNghf-7d&DEdF4nRBDsDOhy09MoSnQWlELg_o)f!e#t3y5nItyE9-MaZquwc=|F zz*U1cMlbN3g%>=p3L3YFLb6_D+T|_weKzPkclQzgLT#{~KW;cAXCLJJl1cHCDD1FI z@>gupYEIbLw7=5^+T*GeSnna!HW|tkoU;IujGn1Wb-IU{+P=;T=SJ+dad4a6dKb$& zjeJ+mlPl7o<=$%Z(p?x>^+l?ay8&$F3mh?$YyK>hG@z=w2Xb_fhi~Cg@y0=)j}|RlQ`^D>Z1^;ieM@9;THExN$t1RSPttPIp0 zDsyQ=0lpk$cF4G-+BYnHg$NOhZ@FMd%ThwuD_e7i_ z1OBWA2W&!rzz%-{u#4$46v$LLK5>pWFo{hyv{%eDMA#0|+fqnf5K0c092w4D20?W$ zq}hnU>bfea(;c25yG0|7W3U#AVfNp0(nSQ(`7l@H*0={~c=dthJ*?G$_xFU@2E}&} zU8+Fo;l zGuD>|7k**jrce)x6}WDT?fTlw(7WAmNarWe%+AFz`%75Y13aCnRdzhR@qtQQ=BZgA z4AVQm$Tp68YS%fw<5%r5`2q5&nchuG%N9Lw5ZD~~jL&-;sn(CD%+T>j!-grqhTVX>PVFJbOf zB4eFH6>f3x503+^mwtANF$|LJ9Zpv1MJt7hhq>S@xWmBo=~T4FR<`C3`;S6mW2J#r zeZZftndRUsx@mhpP-~j8-l97NEjdv**~z!gKq$#*(cC9^@&?@e(1DGwra%HK z3i5hxDN-2am=MXda4njSEdCg5JCF!CwR{(}%LpVVp(rD{yaLwSjYjc(PdVU~-OQ&Z zF1N!HT3+QZR|Pk&O3+)P#LHs6EfOYQO3MyU4@_QeKtUh&!bVm?E-Y!LZej z4TZMB>N=D(n4`+0;O|y;24Nczo64ql?$8qYyE}+02Vr&c8y{{ue-k)AOh0A@P%zCU z(9Qn$P!BTayfv-=M+d*+|d z^~OSc+ZYvXPVTdc!Ai-*knd-Pzv zS(gf?w!1Dz3r(s%8tqv@jl6e?dV1vISML0`?4OoT61#QtbJ>$aPbg9;qbTyN9LE6x`Lpg93GEc`#!$m5>O8KTLf~+sN}ZO_ z;DKT5qpIs5jfytx6pe>esdD7JNthOWk1P~ddB;<->zW~UHXVv@awkC;dX2X3IU^nj z&zQmLX+i21_8tUY| z;Sf-LF3)4qSq)NUo9`Z&hs5V?Qsi|*)9;Ag=*>IZe;m8I+Dij;B6q;!dMsXeWk&!~ zmI;`9+(wLRRk>{ED}gvz-nr4L^&X5ZAN^!);UXa0t@N$)Sj;h__t2wC_xOHOqdb5y zXL^Sn**2p671;+&^a!U#<=zpDu+ho$S1^W}1b=aML@bEnKWaU1Ijp6fzDspCsx?=7 zgI?SCVirzp5{GPn5^27lvew@ZBFJAy)J|43!PuIoj})QB2>kfLk)8|{TzqD{cLKla zpWeq!rqfwG%(%Ym?E>RvH3+`dlMlDNMY*MU=ERM!Q}ogh@W)_5c77O;t#^7y8#!?q zanT)y)b^&m;SBFqw6?C+vRknjX=y>DaWeal!I}R5n@nsssY(Fj4?_YB2{0t^|B(dZ zELqV@;3h7YdfPi}XQ6dsZnVpk(|MXo#HIIJW&3=^8kV{WqnvL+yD*1rtw=p=UW|o!CPbZWR zZ@QH|KLx6gRoO3^W(77|RbjF7!X%>Ggx83@m9hoGW$bsHngKT3)V{fQaf2l8BcyiY zc;OdB+o_8gA3gAh#_5Gh8hwj7x;M#oWou-=pFvsG)t5u`wS1vY9 zLfCCKRHc?Pac331J?0xwPir2{6g$+6TrA(L@`3$}4R}_zxVVDc07wz`z)SRVA$jS- zDrwqvBpqJ!sahSf`>|lEIDvW1Y+g9)ve?H}q6F1f$3q&WG8l6+5XZ4&`CTzTY=yNUXh#we>F?AlEG#Kv*8~~xw zhJme+SoZ#h9ey>jbHP&9afEN4WaaKz$fn=n_*$7jkTeqytNB@d=a3SbkCe9SD&bcz z=;RDC|FmKA1OiXcHae(_F~7d%RMwo&<61K z+#`^O*oh>+!nAiXRTQu?eEe74pVtSWz$DgNSf`b!%ciqvz2?^hP=#tk4+deLKBJH<#W61y?D=rL#;-m<6H&|=+(j!Zv$%n>-gwxyb$b#(P%pHZ zNwa&x9gdy7xzOMqQkAYfb^(X|VaAWC^NCWy&Cny1KaP4@hUo*2qR>VNoIV^@2#PxA zYBMGnJJWzY{8ePw-j@wEfmTN$+Wyse#IN;tESVi)5~F)R1pWg^X`bGuLB`FT$MWT- zG&Z)f<5^pKqJmd8BU$*BZhVXcrSE!s`0Q^35Z(HJ%8KMl79f8d)h={{&ntO8MI7g5pURNYe}OYR0U*<{l@!N{$v?)!D0frcM+$FYHmy2G`JaJHciGc$&aFPwJ-xx17W>cX zwhk#DRN=OlTbSYNS(E=aZcB6SQ5q=7zu&UWO*9XJfi@fz-IwaG=NHQfw^hRlIz)Sy#IgGF*6H-+ddhq0hJI=ddDQqaPi71XErb^esseXk0LL zFWH$3S$Pw^-h<22Lr<=Fe-$=1Y(kwnfD!t-KVk6|b3@O<*OO0u3QWbbOS6BiS2-k0WV8{Z1HLV@_ ztbpXV)Ahn9k2iKz?<@g+h2)*OSupb8j@gSFj zAkSQQL9jD*+!u5q{31Z+DWuvI{|r{|fJL8~!&^i3vlHJ7!Kv#D6{%Di-hJ-!?IjE6 z!9@KJ$Hyhlg`d)o&q3LtF~XR|O&=~3gtFS2-vsg{q;<@vAZaDy#YzpI&RcI0b5)8u~qM@MXnl0 z!~O#lu7|ccOMPPp#I;PH5JYs^Th~w#q> zNW-amgh=|vf<-VAyCXP0nglS~wlYPHqZ-rAGCybDiU?FGr_cB%%hkKIpY8)nwA?a{ zk=ZGPGUMf^T>^13u%Dp6o8QU4bR4^G{2CQe{e-=Vx$=OxRnwJ?F{&JLKM($n1FYb> zcwwk$6u%5>vKiRj7vB$^wiPL#m9E4r`ibe9Nx8wNvu!_N#^L_$3t}Y)F~a>FQ=Qw2 zp=JN=uMT+Kf_NA8{n_Y_q2|-|4`NpStA#qg1(nsrIQsy(3gD0Q8vZR8#StbvIaW1q zScGR8t)P$bwD{Vu;cr6)(@guHBi>j*^`xn6+NoJ=I#X*^h{~) zSnvVv`S3=7X#E`s%5Hj1w%t(DqwU%V>OAxff56`4kjj<6J5WIA(fB%2r(6bqccnIU z+y)g156FA66UhI}nY*L5oDaI-L3uCXHvsmG+}g`qfX{DFn_GT*wi?w29{#=V&GSJ9 z>e%^Z-6CNC?O|Wd?QrMLub*y4d?|$`?557!r(qfB&k-BJkU2z}P(9j@#N%PTHkyVm zJwTg+nR;XSa&30eav69Ni`Sq+6n+&OVhxs0wf{5q^f7~*w9fu!uFfL|&!gAV&%oiR zqy0O*aS>HXUYUXjDNdb2?uQzcUi9_U?n|&)?xu-=A74>eRgvw9Hw3k5r4I2`#k4wu zw+;2{6M(wuQ%1-(x=-%Ied=9$4u67$c0Jnc_(~`TK@X=@v1??)5U}5hwH`sQ-G^#2 zlmreP%WU|N3EoNH)}YzK9z=_e9Zy3f(5C2c64a13xRK7Te?i>g{>p++#7YqhxcZsi#;3sKrTW zA`Pc;xgmWo7!+8@-G8(AJ;Z`axy4B*H~~(%Uy==^9G%|Mibk|tE-aNphUo^_9Qz1` zAL_K4TMek9tt`6P@oFQcOr3eMWdhR)h*IKLSBFl;7(vP)OAaN_|)tUsm z5Ue<+PrK>iS1ii1g6LkS(~tjxIlmq}8+f(~gU`L4pne7B)3d5K3g@T7@0Zi}aDhfq zrN9%gh=_aRb)N*mar#UZ>kY$rF!$*OGFqksT~Y+icJH~4_2`%(KT+qV$rKQ@JC5oL zPUrAoru0?qr2reg$WGfyM2W8KZ_#(3KLr=qY4Yfp#ukDcCn;XVguOT|O7m;jp^M;w zod*v+Lk01>TvHBBXbvE1P|N8+gEL}gTT8{25(l^-Re&D5j45;fJvE0`Lxopv*kLWb z;S)~qwP@>~n%RMf5?B?&_hBvTt}G?yKt35UXGuF6B4o!RoIrFR{+h?JwYn?p5-9C+ zWAUwQ>#=BzGisjP)`cq+=0{F|zW4ePT5s_Mduif#sdxPx3i^N(fuRDeCJQTX{>j@BXnza z(|kueH>Mk}ej70%%#2zK1zr7jf0y6^)6n5A+%pTcW3Dcu2salwXC-;N0! z_=8t1)R$rJ<0OSMVfTTPW!>V-A&7+0lRKm0gNYsWrigxNgkN!Zy83V;JfBF(1@NXz z9&Wz#d?Ly?=DU=Hp~&3DyN8wxt~Al$z;DPC%+CYLL$^2QkCXj&ex`a!yVyB%<8{wa#!?-@8<>L* zs^ZJkJ)%nldmky$#LmIU_ym;%|KjAM@8}WCY(TWye=9xdw+$0#)nZYT*vUwy+y|)$ zT`EdWg9v3-9&6ofRwe(in0flkCzXfZF6h&#?*bxQkv3}4jZ-g!Vur!^D9R3m0)`86A!ROnRW#}9 zTY1sGfRR}2=n?Z8E}IOVig0dguz2}$iW?&b_AKAt5aYRhi1&e_XDEK1I^CHT;4xYa z{uKO?Yx+!+R?R6Nc)}*vY`$H4gcGj2XnKXPUEcJ{pLP$NT)D~%wnp>4RspEncneN0lrika;?6tx)OoWvaihoK z;{vG1O0z32Q=5)7d{BV@${M;gIr15zb-j7z)qu^wjV%jDm+ZiNUFqVG?7AB#_2AT| z#=U23LL@#%1)PuQPB^Ic`NvU(@C7pOg2HoHO#hC_yLqsSCl2hjN2%j`+S`msnE*yM zy|nu5KrEY&RgzWNc5s<*U+tM2S1v|(L~qb51iQ2a3>c%h?)XdlJnkJx0%5@!*dpd7 zft|KT|HjR+*x{=A*CIMq^nP;kk6Au4VLWeUqM~*Nd<_ z;iH)BF2yjOu{#}m16_9MHL69Qas9}y^?s5JvlMQ9MC~O;jm;7Mg!iI>gwv3^YMRpe zIk&C;(L30>mwGLZ))>14>vw0+wyBL?@>^ON?QHXbs~HjDg5ZFAUvuelgZWEP5Shzb zks8ux-L*OOG3K?s?9wxljrbJ-J<6|zBm9E0Y2#PSm%u3N7Ga1~lzu)Z6w7_uRd8Ri zc5x0n(>a8C=lXa|-UJvZS}(fCkxZlAQ)X2Fgra*rt>%)?sTN3cE*wJ4l5Y7(fus7!8VhzOx4D2ISnLX_LFxT6IuJJmX zPrF~N#ijVO@X7SfZ=Pp=^TOy45yTKjidqytL#?9Z5fSBCeV4KB^|qqR6BU=utMx&f z{;v3NYV$^-Z80X(I+q{S72M@r@ZHkljv5Gwyw^#Q`&0B|V+uZxg9`2756)Sp-BM=k zqBT0M7{@U%Kg2D%1-%%3^pAJ1e}>c8y!CVkTYN!A=GmZzdmkAnE_T>5=8U!>KJLvw z(gcw-RZLOdRa2Ry);ETCjT#Pxad?2($MaywMcaa3!VK1jT`@IH%tQhlo_@(w} z?ys`EoZ3Vl5o=$?{ywms-wOI=GB`|!p1VD55~jDpm86Ys{jkI5%b3BvrW5mqU~+SY z$8{Rp8Aub)R;TwaSPAd^vBFg2saH!3WAqu}ehB@(Zi>+-lPRF1i zHcKsBlYN*q+V{YC(jLO)=P_L-k8KO6>Cty3(e3Aef%97eccVs1Jz%7)$RULP zoKMPOa=nSCuGc4`I{f~bXKQ{U^YyhKx7MM{sZwoVG6 z5c@tE=WwIe!*HK~3RlgYtKS!3@I%*ofBNyA!;G@m3~HI#6{p$wM+KU6H#Z`0bPz+k2rL&8E6OfFc?p4Rmdyka*Mo`b&|8mvJ+`I3m>ec;>HU4;P z(SSjF(KwlkUy;zR%Oh6{?jppt?a)i>-|_K#8>!Q$0f5Eqqs3KB!J%{S?G)XRsMz`aoN4Gwl{aN!llgm%JpBkr1A+xaft|I z#=ZkJ{+Dv&r&5t6%8pSK*f6kqAS#Kre*UDP2aLGO^w6m+Mk*>Z<32g^{aE<2W- z>N}mg@X&rRZPWqy|9;9l?4BMleZIzLIC5C~vuJMxz$|R?TfOE^a7(yo_ZiKpo_Y+? z&p41?y-6e19_&hb<5*%13s2Z~j#sGa|Nrs-{r^<){O@P~JAwaB;Q#gnUJkD= z^Z&_9Per@HEYT-mv1VoaEh|^FH(Lt>LFvttul{HK|8>c^u`X&L@R*?blZ)E6!||20 zi738K-ZHxqPUJ4ulo!6aygv8==XlZlo#}4(6i`-P(`lcQNJTo$eO55~8&OPxtB?1I zY52s*zELwe*29Se+37x_2NT~BWnk3)LV=p#=P^7u~@0> z+Wpvz@qyIsC7z%bICNIcJ&*orpgi_tQ?sMf-iazlWarMe!M7g_cUv^Q8$}v~!u6Cv z>+mnJ%LHE=k9zj+rOp_0;ZN-s|i`Tw&3m zepR(hmNvx~;b6~BpDLQR91QyNUitJ?QC-|567F2hqOFaTK-*-SAi12~bR zniz~_!xI}GIhLEvpSRtpNom))-o91up1}X7Stb(t9E;mz!2pPxd-EdBW`A!QF3SA( z&+q>ghaMvSFBFvCd%W73vj8w3sRl5QEddM5?=D4PObZ=EdXGz z4jh?#eQN-DLa}aU9J!9db>FWoHvLYl`u&||yAC@^@b5YFf`lc1Y<=4Ls^&*ryp{T- zmdOSnc{Z&azjT9CeP+AOJsa>nPHuT4MkI4$*`s=S*cF30Z`N$Q#(kO&P(e&)8~)&r zGX{^=+_aC6%Zu9-_j~lw`to`TS;70sQ+{cH$zxl$bKmYbkV_FX*R2+j2V+2ist@7$ z496Q*i4QsF9}{LLbVFLgE%!h$^qMbJ6$S(AH6c+=CNr~a&G+17vO2*MOBz9IkW|U2 z%Im;ka5UG89FC}xwg-V{R%|k<>DY`rRdpzMPK~@zT+gYBOj!fOFSo|948Mi8qynl_ z60`6FPE^j?867tmfT{`&q8#L%2}K>@(Po#>Gkl%cx8^jqdfz<3O|WhC4;35SGX8 zgmQwTty%&xxY6EyjZEuW8O(luPp+VDifkl4k4% zuD?v(Uw!*xV%6YDU+>K;04qA@uK06wekC}$d`7pXx>a~(YR4yD)g)3@(O3kASUZ&% zmU9KFH0)Kw@xJ{`i3mQex>=*3Gnv&S)i~f~Rl|PDV+rIDKW5cGw8bkAU0&F|{M{J} zGKHF(t50p+n!7Oa7{2v9F>i_#nCfr{6a%SQ5`w8OJ~gW$5*5S1u~xhXfLZLqa{fy~ zW8kcuj1EB{=dIFCT!7`nFAh#?NXuNa|M+mUJ;~eDnsWy>t9-{mUgEHzEBRgct!y#z zkp?PW`7UxtEx@N&aF4||+SFk=K=2<Kl>o{GY~^wu<{i3R*RI|6*O2VFAVK_;}1t z>v{1n5&i{DJBGNRU-5JA%&xA(!#nsy#~iT+_Q&s+&?n+|w%N(~>D1X^I%DZ5*-53kj#sz{7`$yJc`4l6n1CRT|`*qT6VLbXv<*`Z=vQw z_AsE!s$IQ)`RPv9w+I&82VD^hiU8GLUy{YaeBH0;e5TiaqQwlRI4Am}P2o}+6_uGc zF=B*I8J8O-4|plxR`s;I-4VqPv$YqLAAHw9Sg2bc&&u4sj zm&mC;SvEXDy93fImE`;KUQm%$JJ02&h*VCiwODmJ)f0XI^xJxVvi4 zkR$`eo;IUOudz%y0CdNgUxw z!;cC7=q~fTX6zkrY}vUbHWLy`c-v4$kGeC~&gbM`tSO1f2-hS06k9ZIparqo6Dh@^ zxzS?NW=B_ky{W$W{#efNy{K;0K{mo!N}Zg!jb|3Dk)b#7?}X$qwP5h;|0{+oJ{;7l z7BL?2tN0syeq;~sG?T>^LvEIX0S-x(cT!|0Yb;zk6N$|n4p@o9Xjm&W(O|!fPKHS4G$p+@xoFsBpXv%J<#)7 zG~YAC=PJugup4u?4oK8n!ePqBK~X&KWIJXo$k1v&D=~HTMOGbicUEX;BJ)EoEb(#u z#{V*CW|KQcM4boc-mgBi^<`}4y4dW#KA3KI0jD;62jmDA`xChSRMqy?IMI|Jk9|&% z67yiBbdkEV%*KWv747v?XqmB+un1Eou<~|`JBjU;XSNjP{$I@=xshDT?>MuOR{bHo zyS#Bo@lM)Zub{ZrWXqis$2q!(wO4=KdEqiyTg-! z5Tc*N>=lj-YuNd7cT~8gvq(WQPN7=Slh^Z8Z}TqaarA7Su5$;7m8cpKj*@n+%;0sB zQr8|m$bU-H>6o3;4CkAZD>@N5)qCH^S1f22PCleGE1^yZ!MKf@o@L66{?Np_=+-@H zgqL~Ip{>)1Pa5d^**nuB_pL{IYb~K|?u&u)X#M4{&y6All*X9Ymt!4Cadh@B3>=9; zyCCdrha3$4N9QTm#>4;DGSf1DL_so1p_x{_VG(9f-ame$?_aEXu)JJC;bM3!P5tu# za!TVOfZZAbdjI3u{Bo5EO*UYdBPa4h#665QY9K=5X+J^Q)fTy0Zs1Sf-Rw z6a>!no-mlJh?lEC%F^10>nN`+M|H~crq-E3g8yv$+OE|e0o{>+Str55;o2Zij}a z>fHd*_^1ds^6JbJOdI^oA=D!Z8ywuPvG&;eo4B_uiKvyln%2Leab;Lu{Fcx?-!OHO zeZ-4q&ivQxNUM{W#sCpV6pZj|=a_-;{t-oI#4uVc`n{b8pjHtXeUUk8l=Y&GsWUADZ1U(R34 zpH(>)v3GV7|0&&Q_UQ*<4f$WH3mQo?u8HLyYr=Tuyaukzi35P@5@JIhkmA^$E8IinrN_Uja(x1mIHDVIF?gZYE1BAQ961F_9i|x#96R$0u#2& z3@112+JCutdJD?E_uooL=BZ>a5vN*x=Mt70axmgKHM*Mp=3A#W0@29(_LQMgZG%h6 zo1}kHBcL5cq$V~4c7;rZhQL5fMNhy#izc0_IM^(Qr7wR}@;zmGPGX9O=DG68<#Xm? zgX0?3thMjAHwdCY-+1nd^@yKr1r<*r>)6kA@UYad3m~?lE-QNqaXRpkC+y2Zr4&12GFztJk zC*t>ZSjvSPPl2KlAq^X>`_1==&BzU(;fSZ03yCKgw%!LrLU&_Ulv1wUVmUV$B2qzrRA#tUW{ z{ws+nb5u)!UYh^@bEC=tvgWoOi)ia4u=cw}oKjm1JYwRa zkmY5%2$GmV9!*sGe(dt;DW9_Oe%?mz$G>5S?v#5vX|-qzYF>P()kmAQ2*958C)UpH z%bT9*a(mi$l-hOZ(guspek5Sk{8D$yu&V?>TXsAD@!QCo8cJ>gPiy&S;H_2K28zn| z62uaCK`#48*WahB_7}q#?A1uD9Rv*C7iG=a21;u!?^UZugRqjtdc#S;jck<#$WpB{ zEUh!gE2exracXxLOS4S?e4D)M^$TxN7VxtRAOELOV}xXVgJ=&sChE?UET=ORiuKr5%WzSo-gAr`jE#O;wzncbCqVd{5;+LR*DTv;@fct-r)| zF&9Y#B$-^)pZpH%C$n!U67x4Gd`EG-=?5n^XfyF8g@XRXWzCV^!c>_tq129{+dcY7 zOG35%HeSuSQ}DxJZy-{MXfo^RgN>TLM9nv5G0A)9O^s%sPr%x!I`*ss>dcdV6$QVuZDmW6~zoL>jUK?=T6KeKoP+X1Bq1N2`bEXO-(_P{Y17$dUdt#OY zD6nDMP^Y#lu_WfMz2C)96n$mtXnmxs7P#Y^w5o!X!_RpYja$FK3p?F@58)7}dQIMQ z5S{;xJ#_W(%l-01F`cG^S?Te2C*DP^*!bP0E!M`(uWDDbCs^b3kZxK~5)d)G&@^7$ z8n?cAb7`#=JEkFis!jEYrVslbjSQrgzGC~1WE0#?rmBzsN+;#_hhHA?VDOkP-0=V{ zSl2b%paoZu^Q7Cp?biJ0yCc(bA*M&hE>dx9?95f#h%6hx4 zSpQP@`;E5qI^J@r*=2m=d4VkllGUK+B(T7XzJ{%P4yLxlM)`|UxE6KSH>wuW+h^|m z3@_r>W5kNBc1H+GXlR6G4?w+N8VyG_^4f~6*aR-mC7v?Sg{nRotpeRaIZdyb4lTv+ zKu$O3&Td?i+a9%N$qtm}7W|C7e366lf(d9xAa>*R{$=a?b*e_`(rEa=Z59zU@%1QL zW@GpPXSXMMRe4p6aQbDIqm8j9-EvGWbH$}5_#eN3NTi8%mS->VTl2+s>N$LKk9&n~ z=6ot%q>2`D^1-5!ep?XYSAD*%#l&7{Znm`T7R$D(hUf(X_S%izf9OLB@e^YulfrVq zbu)C%4Kb*TAkDwRPVRdI3aaPHJlOo!?5$i%?0Zoo>SXs`oaR_aMi@q=D`SnbELGZgfReNo{IsKkYw=K7dEF_}1=u1$gtWa~x9?o`}tve|$QM zyt>ZmYqhHr?}m+K<>GY?p>d~{11q19l-2QKBMF!-ObVa2V=6UFYlqC`QI#sH$r!=U z)8IC5q22T#QyCnTew7|&>oLn8H{P9Ks8`GvLNnjL2)(#VgTboj2tWqqT($Z}QP)0yGJNUV=jKlWQJuK(w;rSrqijtEIKygErvCM-K+!Mmu_lHd!Hr5w=r2_yXNF` zE?4JN0y_nPsbU~|>rB4+qS#_L6olp;*4Ut@38-Mm!g$Ss2gspoy}`L_jM0<@uU3rI z#`!+8KX9#EV;i=BuZrz#W1Y>riwT<2IC@%xx4_}ciNy#~g%h~rM47Zg@kOFX?S-3g zZ0NCU6%X$=di0L|7xZxx&7^S+H234%%#Xiu6DjM(+BZyhV4fJ$Z^{#ju&0$eW%hcF z9DkH-!sn)WZ=1Un`T4R>&={QNF}4h~(w)L#eo%EgM*bbAd!s*MoV&9`?ZK`-{8q^4 zlRLkG{o)Ra-7@3w!g9}@GE%h_Bl~5*gP@ce2nlm(*Uw^7+y%$cbj)(RL*HdhTA$$x zB$ieXS`7S3gIV+oC3SC zu}#I3iNK7PE=TvT?LZ1Yxz8AZG?4^Vo3ros^R=SWaCTYO%Ct+a$KjVNstTfeqV`1> zlP7J9z^8OkKIw6J4)Ah-G{4Bln-u9ch{Jr{bE>Pk>dP!p6LWG)uVc(Js>_Upv9}~( zM@TI=5fcK)Y8XiL100kzRMiASq}menV$btlM{JJ~4hSN(W3l{}Xj(IFht*%rjXBNC)WbDRBZ*;7Qx4MfU0LT{yTyHPT;>2_#}wY;P*V$hGtVTtY2@-bKqa3un*_xTwAv|z10cedJVS^*+;4p;S#CtajS=k-gv9| ziG>6mF;Gbhu6X5}W?kc+CojT}XW14PKLs!+)z+7GzA94X_C{r<$-ozj%P4r}w3lYT zh#Djss0|bWVvAnyy>5zy@Bdc4xcezSE|^hwx)BMgYO^lvJr1{SO(3b;>E+vvr-@8e zBOozD|4qCrvv18ky>QA4ipI}{za$uUaqkm9R};VB8aQe2iSM|=AQ7N814U$>=(%3~ zVpF0I6&bZ_y_P25F5>t;E&9jGr_8SERBg>V{GH#5ZUKH>HTdKFDPo3^cNZi#?KhHi zZ*!{inCU%02sLHb<1N0p$qx{VW|u=>{d0i)k}<3Zi0&4xE!&ByvhKN5w z(kx-xW3M;wfk3fSC59@Fx1!wi;P@+Gk7`n4U*NYyhuXJSf%@t_wJyB>gfLBNN9YI8 z%~+#2w2NpuK52|dD)7hMM)W8i!3)MDmd?=${|0WCcd9AfL|jpe==F)``-(blBapg+ zT4qCoyph8xlWh7JqA6Ko?zIE0F0s*qehg3@E=BPCM1_i^JyEnQPx?VXk?G;F``l(` z6vWCu&as+I{|uwGbP`^coIV$YL(OG zcST;cZNcd@bEow<-A(xvd zSOm7^kfw$S(%5$k5$-yZ>kdH|p!Dy0qSf7IUpZbCkyBK#pn*0(!u1wM+do;s*iyNUn5Aj-`22xj20*bPuj^aOw*29JFbjB$Mdj`%d-3fry;YxE3#|-<3d+f zoY+wf`V27eFKJ^3$w2pNxkc)PpQi>I`)dv2EnaN+HwO-r2)XTA7@4?FuNy30ZNnE% zzhHL!F^cw1keyauLy%MrAUT_o-l@;&NqRZ!yk|fEOW4dolNK=zK=hjYxP*x=5-h6S ztA#V59{K$U#?hBs^ z%#yiIV*BPp*eP&f zXJ0<`9wO2$DI8SdwaJ3~lQeakGY|J_I1(wpk1%2+nD3FBUzD#*T&MmS-wdN?Br!Vk z@LC1?8+(x1$dMEdQc%#tfAv(r+EaA(|8>INYj*}EsyH4gcR zt!sHC^}zEA{xRGA@`w({IZWFT=L7w!P)T{xw$GyeNXz%LGQDi3Xo}d;5bI~Q^mQ)} z5-yZvQrwREyWqC27`YV}^uKq^AyvaPbv()fmR zt*NL?>p-<-P9KOmU%qa9wu>dI_s#6)y-BlCVIzrd8B-|_hAIk@T}D`jYw$M-eYX6K zNXA0SP4vqAs_^@oA&2E6!(oU`NHY-(5M)2TN}Q1ONP7GjlD>Q)ez2nVKkh|k(5xz= zjRvP+4;%0UA~+xW#G|`hx)92F>#3cd`ie?^Z~+@6$ZTX7u6xq1dOH%c(f!3VJ(4M= zmYR|`$ba8>OVGsO9=< zt6QzOowC;%eHW#3alwT~t7hNC`jsqyTz^>>+Em)OwX0k28Qg_RB=Ty$x31iHmjTMH z{obuy_ZHEzlm@#1C+Z$i_p5U(jwzab^2|{Dv<8Cpa35OvVC~BCZcDIQ5>r7x{*&|A zTJ=s+7x?m7UNV}iZMhf%L=q8$DvyM{<}RN989X_A6&ah@*MiMjmxm8z-gUn{hrrPG z###JC>e-uu;(+4XwIsa}P0NY*+q>7?(34D5Laf70`_}x8r$lBCD)4I3YxXCt6izJc zPt4$1SNVrL*`Rdk?fti){|U^+ftKbrlkisYQq6fdHvGp?#ZPaJH%2D1QGQlI8h`c+ zG>ybF9{=rZkTc;XNtmZ+-epY zo{D8V@Og->es?vh5)wT==i`yqbNlVEP~>OA+4I&3X`Hhv3zxo|4Ff5d(|4jj?;Cb3 zMl5xyk-|6Mi;IP;h3J0muHvNJP`u31wJexgi8=ioyrM;wFaxh9lbOhFY>Y{P-#7kN z8MOFDw_oo!D&fFG?=J5!>=;H^Apl>bdak*gV+(s}^|jH`oD=<*rf`ZaB2a;D#)#_zuFlcDcLp`F6OASqFy0Qo`lfggELX zb5QA0`Vvs^X_{Kbz%w^tpsn4w-SF~4?q4+-o-v|=-}P$zu3@mLWO^0}^Y0#gx=QWk{ITF*s;!TOgYu@WcU9Eu zmei_=(+k^iWBZgM#HLoMXm3WDF5MENz1+LBVXGb*9N?@!JZLM{eM>=nw_Y6TwTPV6f@qVh#QBSeK*LWw-)1-8Jh!-}-NlOBg zC`gIOPM_oCi={SOx4I~zRY}1N zUFDn7vqCoZ*<^oo#%Bg>5&OJ2s85T;98*`E-Xr&WEQ_NW@a3M>qn^BAvb3~jFK>~P zGxNw9f~_(WG3MABt(>cO-26m7qAsSKC)t5|@@|MVs{F(r!IleJiB$C&pDm8)F(cI; zkRo=I)kOfJ9`&qy@i1@dQ^T^wfv7_mEg_ekkj#weBkLL!o#!p8r{^}*13i5d{eEs( ziCZ^s*v`AgPh^|ksSGN(LcP7&o7hzc0dfBIrKB`IYP`gx#-|{t={JG@RB-kmx3(g; z%bCp`94B(l(l%6dC+XbrDmRz)$Ja?x1L!VW{*PcsnbLA|4*cOfq1Kw+O|D&}m?;QX zY9HoP4t`4myuM%_{-` z7vXIT4t3H9$N#*Qcq1_LRYl1X$LR9D^}6io-7%H+y`*(B%1@2vI=b)E!1SIOIPADn zkkH)Q>J+q@3JcC@`?s(bSJ^xE!;&d_;6#~mLs9(n@T)xEUAP_DoGQZQ(xoC!?g>&P zdvw~9^d3{0;1Kbx>P}0*>EDWLhx(!2c?Hd(=HfImH=J5%u@z%gWR~IGGY)6<7Ru)A z(5d27Mdo=M0w5YNhGRTS*F0!Py&oWx6Id~O=mo4qNeiJf9KwcMv|kpW_$uf5NmV+C z(mwod(ikKDQ~60j%z}0gZu2X(js^vgXfL;>(RZ-Vstt;Mwg0jIDYBBfCS_j5XSzo> zRX)160CSokR!SV>5XN@Dyl3yVsoJ9R=IY{$ZYS{$ap#|1Ihk^cf}WGq!O9CJN(}yZ2bG%V$fK3Y5QlbG z+w6>|HQ;c|jW0BW^%KxQI}?1YaQY)GeKv?m>VonxCzz9M?2)J`ygdcRE%e8y%$Rk014L zZrSYCZdw(LwvCV7#Z~&txfx}2e?e{H1kf|Rt{*xMPwihYzy$b@?nw9*n3?rcruYsQ zjN=KMPohTF&U2pJ>Dz@aOGaCcz|N~$oT3|)4L;GaHjN2Y+d;a5ZAougr=ISf+X#TR zdy7FGv09ExzCoZwH1K)+r70`lVr0Tj1cmC<0|WRtebm~2?JR@ zpf^)^ojkX!lu^e~5TAL^e65UtVK34uDl5kz*vA^oNr>x?C6PLlb|56@XUFYy7=hc` z@#hl@k8rGS6Hq$M3dLtMZXg%eqT_K z=-dHz3@FK>*Zy<7gaXvEGN9MlPW z(T_zMGJAzNr95J+(a%m*+|47_pOuHYQyaww2^7DE=vY5X+}t~fi`v4c#De!5N?elT#wxDHIk-{ksGW?C@jB8jpatZC zIy@+~*o=O;tr=>hlV^@2ix8^Jb-(RBc$C>EMB;9V$(FjQ_~j&t)^sL8DnHxjLNsTGo~Jn{^C!YBZHR-n;;C^mar`!=9^5u-PEywD^gBHe+>tO6h%gdd2z1 zOVU2UT|7J~){Z z%N#4Fhj{o*tEUSBEnR4KyZ(26Ze%8U0SivE7Z!L}Z5<2f^m&Z*$QEbTyhWb({_Cw* zh*e_hNnA>7wdBOcbwEuXfv$qi1(i9t$u)ofaID`a-SvsBF+_G{f=D2TL9(kx=H7M$ z8c#otebeM~7c85TSR~p}Nbi}UYbRXhR0YdRZNxb0jkNt1ziha;Mdn1*>Z{B?s*HQ) z;x?lZ5BBkh|2&<;gfJQMvQTB*{V(N2yg2cZ4X@W6a+fPu+1O!fsT%V?Ki4!oevT|u zGNkse-bNu3UMpXY)|o0C>lh7>W8DZ?t-BujP-`T-7+vF!UHjY={PWFj$AEP;P={T^ z)^?01=ag54PWE;H>CE=h3RjHGi@rv-T_>Pck}_#v)!*!HPx}>4s`=WmaF==@nTJc0 zUO6Q2UJ}9EU^?2WAHMZ=dL5=~4n4S{zA%m0YVWX;gE1Z$nFn_@=f=WgQ|=it~PeB;^N{2H;4vy zBZba~u}J{D-F>@0EnK-4P+?mCPcuE9IYY3c_Phul`(ek1OLQ<^HN*LS;3&^cPVNX& z&$96|T0KPAMv8`wKe&=sPL6$>^B5nb_AGq2&sd2x4n>2>ccC>3lJ4*!x#QtgMB7zH zx-WCKI#tw`0xMzJAwaB;J*|2KRyAsp*5-2 z9~dO6^*v@hwOLw4RO<~bGWK0IX8?br$(Hpd%QnEuZ@Qh@y#+-6v#8`xS-G78y@kcf zjb;|+?JZ0x)|+o%xkZ}V-@J9Dxy4%3O(WZHUjwl}m3%SFzuk0;xds0c<$MeAzppVd zGh4Zd34a;^#+z)hSi{$>Fxjd2fAas&FdIB*{hST@=9B(s{eMrspJUk&&}>l119h!C zIHMH0NjnA}03Agbl=Yv#0yBOo=B4qKeT;0?(VMiiCpahjk2IVO5_@j3pVJw&)=kjQtd#6zzPG4gweCuyO;6EOQ7F5&0AdAg=dOraMf}3sO05GRF{RGF02r&%) zad#@i5BrObf8d0QMn2u-h~1E8CwZ`_vP0S<$KfuM-Xz-TIszx2$%sy=Y7h%n4TJf2 zh^VJk;)17;*f?i_B6`NPPI-6<>?&_UR%V_4$04i?&vx`;K!h~NrQ|9V+x#H#?{aeg z!H!G#c*E&O5~txeFa9yDIiV%M+h?!TIZ1UZ_~!jiP2<3mGbKVGFy0Y)UNJ$M%4mW| zj<^jU`A~dNX>^muz4qV=MQz>|&mO5StzMuG+~|3Huf5=t&_7mMUT1K!;W-lBpn+H2 zC=1VZRzD4tCOeP!yKID)%VzKu+ zG6{7RUo$Rpbdf${0qi75=0vK#3}z2+m``{v?>$x&He6$88cHmGuknxA zfJpMypZ4VH2itBSaC`i2z2Q%45pP&nk8=maiay@vojCdMM-YJ%US$pJc#};bE95OYe{A`JZ{m?qpe5rp9YFSufgCGha+OkB?qPAg^oEtbJoZLfK!a4 zJSvvL#K+7Qrrfi#F>6=#3sXVYvaKxW?Ny|e ziluxLc+&d zUms_L_F}KPrhX?7tywFQIy!b0fs#x1){zQM{_oW}piM4Lss^Zm_T^lV;#8K~y><%- zHiIQH&s`wH3BB?>n_nZY(F*+1X$P-k<2vMb;|9ovf5^WfIYkUieD#}fJJBMS^Y{}# zDrms!+{Wzu67@y2vf|vew5{I|+E4c)PgUvLi8q~;*HCM~SBBeGws;=8u_mC=ainAD z4quMfzv9-5VlusP^7=wWq-VF~ZRQb&X4?er+*iJsaEAT^CzjSJVrSj7IlSmL$XV=9 zo=65DLWQ@pD9y7pgNU-0X57F9*U`#AadTQ+oUjCGoX;D%i%OB8+6EiDF_I4H48Cyi zfww2T(e8pUjdz8&$>F>oysgKK+I*pA3#&y9mT+GQ4`h~GKdD%Y*>O4JNH(#QtYE{( zT2I?xdn4oyAZ5Xn5)E#F=sxL5(_6R75#yg-Z}%F00SUi0ugijJ3;E-x5hKR6AR*>0 zC|iG#Kq!ckHahbu-5qALx{%X;xUcG1ttGk`*tyQtP#OZ#nGf4}B@!FPs?X^WHwGCy z<7Vm9uhwk-xM;$K=7E=a3qk0wO$eX=n^`g!FV0yo;*LCm&^~?UI5S3Sy94gI{z!;p{vsr~d<&!=3<`>194)zBTs9%B58NGE;G zm<1y;NI_SM%I>d9N~v*Xn|^0;gB}wCTJ^oxkIdn@f2+L};n$vaXxOF-)|joMnrrN_ zQ3q$U4i@_yqbg#@h%x7N2%Gn+-AmehGD4SC!?mw^D?0VE8pNkUMM&s%7~SBdlombK}hEQZqdTr1M?;A+G)!97{4l? z?-Gt9o0lPNNmhK6Qyj`*azojF?;<3d6NY^ri~(`{ptS{ppVoQh1x+Ot>yhvE@4Q}~|n8&AYY4enUv?3cvzsnt?upWE3g zxY^Z-oyXScyuP#vzqR}OpaWSG`Bb!6;_@9DJNLTR^ITle(-&e0{)BxaJoP8f|kbZh0BRQMOvBn!Xtg=diA@l%+c*y(G#arVs-8z+kgn}asvwt8fJjB9`x`%5FEykMAJ^!C?3@G{{K zD@9%zS6gCE!Hw_n5%con@$ZQ~t^Dp}-o&j-{bwsMj8S)r)II~%Zd-I6Yn?XywsVN6s_QLs|CnU(Bg8{XXLc=N zXSCA8ur*W1IH^P_uWv>O5C0J4G&p+IL_&nvJ>Cgp{$4au^#Ed}#M*0jG15j>1!Z_Y z2i)lE)*@Ahtlk`8tx*e$6fv$p9sgGhyjt8Mxwz4v_ZoAhbG4=#W_lSnS znW@;8U2$0h_1be{?wvsSO$5?kaK-pISt6M@R2l8KdEl0DfH-GSR-AKFEMqa%yc&W5 z@Tw>pVvx2LICjdj=+O5cAczmIZEQPV!9!Y!77R2mRyn5aRPR(It0PNYXIg=JqQ}FH z8bJ-*;_p_EqP3thJNH@7PDD2kz9Hu>S7oy}`B^Ozv^^%%3=(1yY_EKGIZcTEsvsaX z1Y9`Y^qo_~9|I5}ubyW3b7|dPk;S}e^I<#l!wb;hOvzVb2`u{qMvnpKlf(8v@yeyV zKTWqA_$BD;?~PW+P|DW}7Z^Eg=9*%q#pi02>sJfbZ4GXR-Lgksoa5I=OEl2z2$&I* zdms@NjGZSK&?;bI^~~yE*&P#}D?2o$H>R<@2z}ru zXzA1Wh>x;QK41K#I12$-KJ+S+_V~j#gYQn-U5)JE{amUw$pEWfFIV^T;Gm+UQp6Ch z$xw1+cx=t?bp{og!_+=bB?jEakdi-mUWM z;Q=1L>aLjw2S;J*!hYV}wqX-tim%wV7J<=Ht!#aqb^T7kY>awn*ZdvPzrUhrzn+Fd z427C+%^BKr@eb_t(mDH!q90L*N#9D_WDKV6_l!|PhknIYDg9^F4>*J8KjS*uI?RYu z^;kSau?O`1zvnreS4h$j0M;MRhib$V31UBvV%};wm$?_*A*t-<(g$0kra+ zccUi{Hloy5YrTlcRpXY!PKm8aI^3z~@3lWkVW-O))7c$yJE6}HPjK+Wq`0=4(|Ez8 zxp@AzS9M1m8O)nXYlgK6cbjne9EJI(AQ2gIp@8@{l={aj{Onq zOj<^g%@u@3F4iDo)o^uooqrWDctaYrXjOs9eYEs(oZP7E$p|<{4Hd&+)76(mS6wl@@Z( zl^t;ayw;nS~Z&R2P?7ahe&7e%~uA$uiw2l)!Jp-eHXs=!O4scDS%@K&E32B zQ0c`U!m=6W?O!~CM>UYF9`(0|B`ZSf3=-$_k4!<4ag^Q0qmeO>0*xr=D{cAFJ);CN z!#;Q3mlx<5gUiiNTv_D9E9aaoZyofEXdt!8Tc~!L^XreMz90KEg2FNsgicp*9J$iM z@|rYyb{O{M$-@31KYX~kgs2W(MsLu71Pf3QaUVtl14;!Kq` zMgzJ7Boc98OW@59qrGMkRz?Y0i+*qUiF<<1UX!Bw(oqgSN8pM4PtR*xaTEl)&-VR7 zW6kP_#B$Fl(QHH+NVqfP0mTA%ytF4eE;f58i{dg7`UL7K!@$LQ_4LA!y^V(5dV&Cmm- zo}h04^t9Bl$fa#Z(l%+ky1%YVFp>F7+K$Jmnl>{z*Ay5YS{nS!c0mU$?aKHak3DMR zK^S1w**_kMVzt!V^QUo$*FHRD+Y%z7LRb#J?lPV6mhX|;8g$TtaWhtSyIq5yP}RF~ zZ|)U6<8YBJJ^so05fAosx6zLuv)^%;7i)>7jNsq+qy7V}Kzup!8d623vGpsEFTqy7 zYxmyRfb<{M``WX1UQOKJ_NIea9z=K{7+2yhV@}0ztN#fuS1jVxXajsQ@yZ_d`#LA~ z?o;&ehUDfZE6FvvWLo9+@6r z;XiL_lT{4>u<6vIsgI#4>h2x^4TCXO50R~+Y>mhYQ?Z@9B;d*V} zS&z^FPJW-X2?_Jnp{ZzS0Pb$SIysE3D2g0yX@HyO+4Q}}lGh-#9Ko2IXoFQB-G`F! zDz52-?w;F?xvv783bH*hGAVV`QmRC7VnGKIb3gl3#dNFIOL@&&tDbfN z*A}kgm-82U?pGsPF)_a%4lM+1`{+nxRrnOuc15anYU9JHSYBo zmnqvpG6TNfI@^Z>&%E7Sk-U=3N8<4WvIiVXu-S!%jjz4tl|M?OP8{7Id8=x2VD*Om zz8B$2RHfa}FS}1ETIz9hKjpm`84H%&?p70t%9BUC6+S9Tk=NBm8gz23Lchi^OT7=; zfdBN)Vq6UQi9XxGh*SgL{s$n<>*R-TI@Lpd@;1*KP&%3)O?MwBanC7(10^)T zHOboS2VNDRnQ10PsjhVfUP|9 z4i~fP7Wm5S58Va-1PDatyinxq`ZqqLc(lV{#ICK4&>a@ScDj8H9lUjM=%V9Vpg7O* zw)F-7NWAEIt3#CREoew~1tR>#WoZXa;;DV);=IyNu39J}yOt$Q3!6$NxcQmWmPz+$ zzm?dW@VTkuE{g4g0XK#K@tdO^t(kbU=$1epUVdzxn_FL?g%x>Olay3=UJ|E&Kf7lBErPmdRgpU6!`9=b-g zkYAr76~%y&pD%0l*L)0eR&9BExOmL(ibi@kVtLv?>D90F7*xZoweMQ(X2A36Uh^la{Oc=m@t$pSye`B8m=l=s-#}71a+Xz1+qQ(&1v^actB)tf^bL*I){pB=A_4;a z9p6rZR4se&wpJ$!R)#z?V_7u$G>zYPYxE%yaC3U+SU0f?m?5#>Dy^14jwBUrW&8(` z9ttEMa^W9gmf}Hi*uAD5aLvWHrR)GtD7PUfGnXxO4%8tw^dF>dex%M7BCnG}6OP_8 z=YNqn>&Ef$=O+AS2{y^{lI^;Ce}frb5$v6bCu8%W`L-2x*8?XCe=xT?jep#U=(}K1 zyF8quw1j>FZ`wcgYSLQ5ndHxl=Y(z`$K{nJwaVjdViT)fbgNPoy&8vJtkb=ybi3R86^_y;cX6;A*!5gwt)+Yimq;+=d_?xNfhbC7YMZjg2 zwC&WdSSlC_^@Vks5wAswJZ3iw(pJkCU0+w*8Cf;Ho@nqYia5ef%r_rK_$PV_9&s{$ zGt_#`T$fIA^095m66HZq4Lcf43_<(egvU%^l6drenLp%}79sqU{taFqx(~k9JzV2d z$}SQ|RTs8Dudn0-N?lEZ7mrd@C)L1eTmjd~bX10irI~mz3px)%TlL zSxXQt7W`I09df$~qJ{Rvs+V1^gxuT*kXzigS)D!T>F%#{9f#e20eX}Qv1H+L4oZu} z_#4mCmoM2Y%EC3hV$%d3KKzD20x28;3 zX1bIUa~Ii}TKbHLCwx!cHDxz=a{aI)d+Xi?{;8;tOFS1ayGX3@5w`suSNP)ysc6TW zmaEv~!==9VvHWPu$2a>WlA3rLc6YSN@g*pc*;beIaeEL*mMqMuCdt{>zEME>yz9qCv1OGUj%u_nLRxG%#6Y>K@aKx-mpf46 z8(8`H^qMS=ZrriLkPWjrmM3~i4>K}(9l7GIh+*bHFd!?7H^po>+nEFKzA8u*=OI!3 zWf$PnY!^Fc3pr<*-bInIHEPbxAkH~kMS=ZBW{+2d!#~<5Y6l_Vq<#l?8+F3|G!g@k zBzQC03bvBxJcipPeYLUS9G$8zkh$i{vBw#cNSXy!E^=+idj))u^qjziP$Biz2yD2D zLf`Z6gTnP+$CIOw%Pxwn7811~7U{Z8cv7W55C5v&TzW|`gA~W}t`KnD(ivP*-prds z#Id_pAM)MFXel%4o)4w1KJUIkw;F#qG0pvgWr80Sdr)8c5DA7#?d!zyR}HVLRpWeK z?tFgD?*_tOl>XGrdk|T;C(=^lCRh@iaV-xXI)nw-`}TL0%?cLVG2lHr!WRo5CkK>H zA{1{iA2&K`tH=`|QQ1SMX?DTvB&wD>*{v$H-51`EF()%jjNNCNVBx)oWTGsZ7bFgz;uuAnwbLkza%`K2(v9Y#$v}~JM=n`^5UbEP&c?9|@j0jTUmjKQUNm*NaV*JUExWGX zLPFm3TcS>n=d-9iiEg@TT*}iyBbA>vxua-`9(7;qWpmC`zMr_XV=m_`cZVrrZROgo z^UNn*b>>l;$!0atHn(EJSkc$iiI1n9f1jK>E|AA~ERWHIfAIO<=xaHNqrbCiUkt~e zMoLrGCiIwyfcx%q1Lb9Myc&ys5v?oqH%(UMjcQ6dhIq(&A+!uwpSMJV04Mn`54=v>fZhN)W@i#6GwQ| zOw}rfsJ8X*S8*biPfyeOHK8sNl`e=jM^-UVZnxUxm$<%y$AH4g)SY*KyYQdXDRW$= zomp{`v}gFUTFTsXBs{~&*EM{OAM^i7bnJQCAR7{aWD7iX-izSB2IjQUVXhejre42G zzs0D-d1&|J4v1|tA-dYO)_Qa%mAz`VB=aJ9qs@<-`Y*i=)Os5DF~9%>@d1`7t74qh zvuAzh%(}H6Iif*ecP&zhQO(|oh7=B?Pt1jjPsixYn|sg|C@7p&c*g(Zys1Nzd1*|W6Uw$A+M!h+?c~zyM!i=Xl?lq zjq%=R-r#!=sukF)r{(3T2g6d)m;}XC4SDq~P7@MZ^HbY&r=m!n zK1VSUxj5VmV)9pbY>}hhT*R6cWsCB}vDQ}9iE%46_DkjBlg%-HO0JS%#gs@{ytr>_ zgFUnMm{Tx4^(L?J7R`1o@GVXEY5IpC2(f7+A>BE~xdl`wdgUpK);M`?z?hvaHAt|1 zQq0Jed;Zw9O)a+#c;Vs;*_=QFY(oQ4#CHIrE(jrlPw*#0VU1nTPUUrd@cfU17`%*w zbxy8(+yPMFJ*G{KlePX4I=u53Kiljj+pBDnOag2&>lI7cbwT0Uwe{IL1*3@E`*p-A z&s|7X_PmQjLeFmi9=f-3c-HSOf}ot#nsLHuWA>OA05nOO^{IorxK0$A@T74Xk*`** z<*sJkGDTl;xFAW_T%|1^aWd^#Gp$+>QA*72qcN+D zvz+t+kDYy^tREClJo3&ni`$H>%dT#f> zt-)C_)f(*f`CH74-Ayn^3AqVw5RGE$6jWXEyo=R?lx3OIoE&c~z$aujPr3E2?-s;H z`i4V@1l%sS&UfVC8j02)p0sq9amo*)vDlco8*XPb_=ZC>>QE4TjU;7e{II(1)r~>% z<7Z~~PJf2Ac+rmd&kBf^t3n)_Jk>k5mPhpjL zwZCFb1vMtK<&AR(|bDpMPY5RM(V%V-W>OP<1*DB5LM*3J#y|e z3%?OyaD76P+QONSrpKmiOe~a<aLqmTd-M|?IsT5W!MF7&k)r=!?jzV5hJ&pCDCRZD6WQB^ZA^%XFRG{DxG+0b ziU~{c(p39-RDmZ8I&yR;-MpIrR-R)1h{T$YYgYW@?cQSJH=rPvGkn|I z>JvZ*KAA!lI_9*n+vd1o1Csf{S|R{opXXm}*eH1%zhT4(Y{FReXAY5bz4)OrDa}-S z5RN+YNOgWfR_6Ta`i}L*Xu;tZt6o)kf~Vdbm}&H}9XmECs`e9mQaj~+ECh!l+O6cn zDWUaqZ*VRF8OT59A(|4tz0V4`)VTO^8uuma22d+;Q_+5XH~fV|X_s|ZSt*r7>C!Q8bTvxBS&75y2FG_CKRBP+MlW;+feL-IHiHm$%G#L&ik6etI6q zq~yHteyV4&zdn{NduB-M**!He!aebn>wv4P*I#I@J%jvK>i*$(y=13JP%S+0>sH24 zY~A$7%TFBQPXPtdl~>2?0gvl;e&II^c;Hm`iE#di#J}pcWLZj!B27qA=yOPln0;kV z172KDBXMNwyU6pBo^ric#D(#K`0#rfk?X|oUs{|ZA}%UhLR5@w90l1w7#$^mox1x#!%J-9=sHkjNEdcY%*W^-MO0cYk?B)tlPCqwpv#BzHy`W7&bu*Kf<^~q zjCl!6MQ356Gh2su`7FItes0?jvMgQW7!8k=$gGXWR!7af69(Ep*xiAYUcbQ~h73Y? zTm^+{XC%Sar)jZ)4)!Ne1okQc;Efxm(^KU7IEDSQ-z@!fjL22%b49@ibqtfxbI5w>hN7JD1`NBJdhBq zJR;lbUC!J?9Gq|km3(q(RJ!XFi^~}5+ZOWW)7bF%jnY44Rm#mZr>er+{YrQ~Najg! zeHsCfF_*|{T0&XDsJmhW4c=kjMb}Yk3)%2c?+y`9kd1;Hd(Q{9COq|8EA#==RB)l# zBBh}h%VCwQ()uyRurnc;i&jkHu9WlAd z%4)TMg0-gtV-5og#W0>m_xaKZ%eS6P$I|+)Y`y5h-Ee?w(1)L~<$Q9UjZ{O3w{mqG z*JS=#WEFST=I9dqj=K5m{YP)%2S;QUwx8S|aH4)?a#c-p_9u9`aqh|jBvawdWzp}7 z9lq&t?j@o`NfoDAqF+5ZNPhBeT;`$&2E6Od<1W8qgD@bY4dRxUoF@cfB>D+4IPu-- ztu6(BMzcau3_2qSJhq_el%NbUD3Ld$nT)8g$(x7u+GTNqfd)oL*J1e+1*?xI_NP$6 zfiFvaq-c+is?~egYg_zIlHk^Fk;IcKsa&&r{jAWLvV?E{-)Z&HR|J_lfI$%($#NLnt~cw9&%`j=uM`EiP!*`Cefrx4M5J$6KIX=Pk)Trz z#WeezLwQ>-PR7}Vug^Zy<69%#sG$2WuR>@U(y{LdH@d!^t*Cs*-6Wl=p4=h#URhmQ zBDe7S*=vs>@H;@|+KGMo*p~9qmyY)8Rv!yVeN&AVKUq(We~DTPVo4)SniXB};y8=H zd#F4=SDmkzqtOtWS#83IztfkcKA8BhwmZlnruAl%`O8QM<&5=?>~{_%?0>Y? z>gI7ee4t~HC`BUo5G(X^9!RfjQ!W3SDSV(8;ccfHAerv^8{?iE@uY%ZaFrEyL-gzY zKS)6r0;1zZ(N~$--FlH%wx@76fnzA6hsW*n7L9`0IEEus; zA80M|w?^-Ah$rsNj?@C_CD`2@u2(OG+L@6J1bRax#ORc9*o3g^%pmm|x;8hDr*FW# z`@LJ+%Jq`A?23+y@%witfiz;uOFwkkLx~}a!teg{?b8n6nrPebVYdog$qLcOF&C$x zm_8uS9VMF3dNVteEh9fz#m(cz)aC{9N?!!S)6XtNyMu@G$q`*5rh zp+rwC?MI8|ddb&`tscjSNkObo!PY2G7uEX~pyjA1FB>q~2Yr9}Lha@zN6^mS>bi2- zyM6i%i{@kNK5xyC&Ag56O)D?ZE%*9dKN&F3JFELM(8+ zX8zt5Wl|Zyq7A#Z>S-?Avtz?9eFME+o8S!Cvs;h30L%i|wP6#q0srIv|G{AT{w8Kahs z0G}jCg!k=9jhp)m)?Q+tF5@S@ECI5{L4VV?s00k7!+6h9!ac)ITIUO~`Rp!%M=PclINoF<3F0Q0{Pk=FLBK zdII1(bzeKYjVl0REtRDn!Nn`4=E{?- z+jK}Bxs2y}a9w0p*n~1g_sqkoPCF`x;}dtRS#LV)0|4WbZZ}bFOb~r^Rgaw}5g-<3 znB8=-;BmMdAdw0l*s{EZ(d}kz6io)GQhRx75tIC!5sF6jd?;6Cs8Bu~Vh=bd8s86fd zi<^*^?;<`Ypm2P#Nc&j%0ye7N5<%h5b5&NuT3KmdvHCpviW|A9XIm4Gco_=P=UMiqS?i-#OWSr=^6_%EosEC zeLHc=<>x2*ciu`M5GT=O?PfP_H(s2&jHHme7@M?|3`t<0wV-APgmzJf zD`&Ji6V9AmM=~jqP3Sr7$H4hLfYA1VM>Y*D;sY1#{FLNY6X@H)!1vm>d@jSAKA&9f zw~U-^Z$SoGNkIB#dk3EeAo<)r>t3~)j7a$J?q69e{1^7;+r5{i3x*POWca{)N@Q_b zL7FLxG+#IXqFYd?G~m~m@0xjxiI{Qd;9W(&F~dtyYMNHZyUoLF-X1mIF8EU|qVi9Q z(dF`7#f`4~Uz+HV<8xxiPPnuEmB=81Gt3Z6ekzI!r^7(78V#oj<2qI=cLP`gI4@ZWn2?2mk6siHahsWWFP z4ZU24B`H^seA&<5SWmOXF2rVe3@{eM_&up%{J^+1D5L1`HDh}n+~044ypPaH(R(b< zH`1$Z-GV?VzTlh5u|q&#i1RRLc$wy-baZahasa$`zlkvZbUkdIf1I(?Oe{}BYU-Opp^V>cXgv^d34+By{)?KgRd z9aAu0%j`n5t~OV1$5DDMr!)=F?+Lx1O&e!^3GW0htDW|4jIVM`%b+IaVf&*U0 zV_Lgylf#Mbi@ucBmtsK#W5tzU}20zn!NbnVa$vRebZzTVn^g!>*%9kMGqz&zP1cXP^2rbS0HY0~4F0qwv=kxlX;0oIYFGA8!#+zD z{H=)cwpUk+$ltBW)95w;bDC=d^V#s#n0I^cA%RO-ynhpE3@5oVi?1tRht(9@QY*#u znjOVB#g=-#M&lVjAHDGI*YrW?psk`oFt&!;VAp(Hz_(V4gY%`S`NuPskr_Qh%)%vf zO0Bj?@&x4|fMk#!>KVkcM-94mE#Hgyy?EX! z&0-m6kfQN>3GmSi7IQd*phZA&axXm*7oGM%Q>Q<|? zHspEY1wp~jv!oe+uS%Ks!W3(4G{m75#_a>!c9Dh>e z-sJCs?X*{_V?_NGS8DR45wVLiFOXd>{rxq$)*PV?O2Q2o83F~xSZR6KkBZ%Ds&_f1K^?6>*#jZd=T#?}>+qOd@_Pb@~MVYu1|)`P_Z|*VJiGE?Mw=!PY;V=I zI=ux`N-V;&ARq!qErwx4V#2=;?KtMht9gK(_+4MeJ?*G1Gti5uq2F^7znR-I&p(3Q zNbf90JOlLXoOM4Q9Sef^Z1L5vfyEYlLY^p7^`+NWQCcnk`hBn|C7zfKt>ZsUpQ5H2 z+h>TOzdW*%x9W2d#`NGXL`zK7tc9t|LCN-6VQh+ZG;N=ht-#o<9hCQP8H(a@-Y56p z5nh}$Na}b-!22K4*LgF97wfH&zxbX+=wNV>?ph$^bAvkbmMnis60T+2$@{y-@I%=| zTp9up@-%5|)iRzvM^!N*)mwoVWQndXC$I2-ilT_B!)Xp|uiD-(&z~7$-N!%qLCpn^ zBTX2n18muHyy(|vH#|Vpjzz!iZ*e6u!+rd&`PdIj1xbYb&8yklr>x|ZqYA?xP+-b3 zUPTB>8tNmIh1BKG#FS(mZTZe2{=Mf48r66)H#F=6qdY1iLa*!eM%|@BAmAw{`?JCM zhmIj6%Py!zXtp6SuejWh6`C3BveV>BKS&B4n~}{;D%e+34wB94Wn=uM9P?AG!E`!r zH13y^x|l@-PMnh`nlwRAZ})F1d({QdlyUcJ!2=FAwN>50HG2p1743b7JiGOaZBc|f z^5V?nklS|TEX3TP^KQt77%1U*L)^sH56bO;fs9g+kjnxjVtCw+=Vf)X2R|3{fKX$% z@I@e#l=M(pN*?Cihe?sY8tw-;R37p9dw3V%H1^Pwks+v+XT4tgO6K$gn@HoqfPNus zrLqc~o@OoY4V`4{^A^Q4r@}o7I(omKW$n%wO~K;s8nywFH;icZs^J%YPv;8at#oC; zp(v*B%A`rnqkRDHPr5H(oNSF}6Llby5ZXuubDcaYakXt7c|I+6Rr3TtI?pcO?-F%< zDr+|BKkY)VhLl=1sW*B;PALop8>|N4 zGS*D0!xcSgN3Z_7#kt2``W|St3?!1%MXciho5?ut$$yFPVq2Q$RPFo?3v}0#FJ>o= zA(EIU=E%20*a982mR}+QKHB(>mE*NA_VC?KhE-r8^GVc0-^|q|4BJ#!BP4ktstb3b z1@@Mn`_%We#UJjNyylnQN{Z~)4r+=A1r+SAI=FTsKHOa({sadexli)!dsh+K`~aiW z#3Jx`m|6EF5%-G$o*RBHZyzDd#a!1nds^G$)t4t+?QJucKT-U+?=4}9nQM2`& z&2ceg4I}dfhFe=3e7SY!Z zPFz{z_0tiSD|jw34X}eL0qfDjwKMJ#*(W;OY4`9pS{V(!U=x#MNd8Oz#@5w4ir*O^ zKq)a_u5!{!kf5o)P1K(LrQU90ah_d__tL~ogkA1%f!Q%glyUbhfeTrDq!NJ!<{SI} zbHeQS`+mw_I2K6at+?}%6);pq^X7geTq@9&5iymmN)uv?vVu;c*St+@jWwlQR&TH*q7+ zC#nliEgG_i8Dd*bik=lGK5)m>1_v$@nZ+oXDWWBI7v7ckV{sEkQsCC5@mEU_3DbXq zX9mDHBkJ4>J3`_2^{+1Z<;0pdSst@*(m#kV6|;c2)szJ|?Xw;-eF0{u83&VsPDHI@X6r^PWNmV z@`>LlS+bo2ODxA4aH$pWeuca2+f`vMT5U@VC2JU>q%wOb$gPKE;U>fc>Y0s@a0{Dj zbGxv08KP>s%#5cHyl&KdEO8fctgn_52%pVGmzqSiNOUffGk zCzRU%Zlmmn^U)@cCwlUcAHmw%<(uQ!Ld)8lQt}OW$(v$?D4}k%k!gGZ(45KSKl|tVheX zz0-ZbiC?^6lPbbnRfNr4eB}kVf4ifzzL;nM-X$9NEks@24~&@Y)su6#5Yr2AwK0q? zxc=cS0nqA{KKU83s2(wLpJW~Ums)ViicjowvLG87!L~$7-8vJ2Mzz*^g?^s_ey;2) zMx2rwyp*$K(3SBxsm{-9#N@Lr&u?_B8$0P1ze!({WAMBdxYs-6SKx@YoGISa)r1F3 z4?Fy7&-pT7k5}xeT5lg98{-Fmbli?ser{^DD%@o|BB7|8m-(2)UER~4Ty>aouw9N1*mXVP7+D~ za#sw7A|>oHWXFx`^Z7vYv-c)8Ck>GEQCdBJ@;1Akzr0*qeq!DdRnIr0DKtN6=013J zIUjhsnmAona!7DgKvU4HyB-!KE0TynbiNGN1_0GX1416%&t^TaBHB88kXHs7q}ZPRC0! zkOKh8nYTu7t4p*UJiU5yo$UIt>yX7PL?wGPj_42|oI3Pu$R2EH*8RCW*f9P7$ zE~11il!?Zp#e4YnQk(plao4Q?oZ6Ba~H>nKu?yCB`k_1eN4? zk!Dg+HA{UeEs;|$UokUmFa|$rQoo=v-Ep<=m9)AA=f8EWvz2Xe-(nsd{`VqMM>&4C z@H?EBG@x_^Zerf#oFN@`dHbhJ4L-NWRA!I@%`S)#&UaL9#0uc|)r4IkhbwUt8DeCU zJF!fp`eDn-!Rmw_OY|GHno@{ab`gVK>VieZe2b<0DNPLSFg=Mm?Ile|Lxn}r{*lk* zoZ2jdBQSw4z5CeyW@CJAj1+?&Aq!r6Tl`F0#P74Z*VpusAhb`H=BZURJ%#mS-~oyS z?p^kD;1shygcX7o<8U<5@p{K~e|`(CoV|E*uidUBzq6}ux$I^cPAj)xTifhCc3xW= zY(OfPFznZlX9KFlh?rL>m8S2kh#7IOLpuzC%%b2rhK!|rnbuLr} zgfMoVVnQ7U$AG`}7IpZp2^p>(6HwStrb;$&^yl1_Eg9u?#k?7eLxOS0;JtSMC%MYu zw}ri%*2?hUNpn=K&-Cp{(4Y15!(kQMRM7G)VI2aM_y2EesJ;DvedG7v_y4y8|Lwqk zJMe$q0mn&oYu8rOp)%mud9`PYstE!XZQr4(qql4S|9Stfy;OUo!LrTUH!u00_y2Nb zfqe8qn=gJtu+`tiU@(y$jPJFslKwqHWESlXeI{xu&`O z<=5a+MNPLn_U=CBv?T#Ty6qZc`;RyxSL%!#3{dH_L=cgI40}(U_}O+9k?G?`DxD|o zpl&y2x&HKL1ko8i@6zD|CjWe*!S;jo*Ww_Q4HlV4#5Ir_8NWW4?w(q_0YJFDdf<^f z^}-`@X8?q*w=;F~o5{G;3mrbXd;yC8+;(Xr+7E zH=K1vgNaKrSx->&>w^yl6O4yS&39_#8$IgI?0X+z8D3bO8Iz^xzx--a=0Xvo&X}ot z`^K{7Hrq_+niJrZ?iz7);vAAfxpq^wY);y!?XD{EF%Kr@g?Rcv$~YpO2VwfhRodX@ z=6OICg}2T8X1G{=M^jvL^Z70B&Df_cJL-G=*`@`RoL8n8B(R?o9Fu!GY41Dk+pma5 zx{rK&@!bR4UiAVrD%vUJ<;s>Ok0#@;bob{2;{yb1^Dw?k^NU+(%5=chleQ3Bg#pr( zIN4Ce^v|g05hiMbJE>f*lao_n&g8L+nN1H+FF6F8>jcP#5Re-4=GD=wHO0p!Nz zHEm}z%u$whYy8q(5ZSre)zZ4sP`pk(A<4q*zPx&bGH5YgPYj-`{x8rpf-A{;{NQ> zY5-xLh#A&_c;6knJ}f5i2{kXu=p#l%7zx*Td$=Iw`bk)%;MbEUq)Qj&Y|Dc^BO0n` zlU_bqmi}T^Hehf2=fP+7&O^C4*HP0cr5`D~l3SPOri~>4ydRl8K?N{;z3JqR>pX69 z1g|8;AO~1hzMYO@(s6z<#kK$b05IoS?^!>HyFRA}noV0BJ3#;Thr;Wl1|eEG6K%fz zD4WRK(nEzqKI;*oq^*~(;Ms7|-K_f;xPIr=n25{hX(G)y8Xu2?Zx=JM>Q5-Yu}hdQ zyNt>lSKo4eLuml~8hsR`nTcZT=*)eH&AQDRQyO=}Mumux?&#^G?MW*J%#e#P_I{|t zaiDJ;Y^vNjqSQ?DKHQCPCgblZ!_`}gki#?W54@c@mDkh=IlX+xd(=TmMe5V5{A$GR zDiY4O2W5raAuY2fFFdVp$8m^X)5pz*reShF)1YUV7ej90Gk%`T8luwz{@D(=&KO!3~?vE$>8PM$ZxgYCr z0bA}3njOm9Pu@InX|Po*v_Ls2BT2fk9>i<1N9;+7v<1?8^srp@?GWaI?uvc3>yeH0 z)W~z8?9cgrJNGx!U5t=Cd%xt$Ns<*#BimK}3;IjyPa3bWhlL%LN(+b)E{RF^7@35x zS5H?w#@V_5$V&;Fg=MRpJ^Ej4qZ>SzVtlha@kM7rQ-c^Y=j^cDh;)J4Z@EeunV+Z+ zVL4}NvUMqa{V2q%`S%XTCaEWey-gd z&Q!?;>#<+dMR()v#nrtsvXWNyXQX$?B-EAYSarF%Sf(1%qU~k^H;E#(4sE+SSN_${ z9-}S$MR(VvV&pk@iXyL4EJ|l$Z*YRQqVFHFG$j4L>-jUf(QuJoA_Kk)VM|j>dB0#a zN@TP4*VsE5*m+TCxBCE(qZ|PD1j5Dc@$qbwpc$^shCey;jO$foqj9yODsGfgk1tzfb2@o@Xb)1Gs1kdyh zvBlt98!j4bcbEr^5|bMpNMyPH+~83E_$GccSVL5CvAsk0&TZ<*;tP(H--lBb)2%u% z&_DMIMlUeo&FM6BFpFeJf5Us=pN5W)^V{>9v(haqM%ZhjrTLLgxg6!RuHo`W*HH&6 z?f6z(D~dS{xoZ_XPZK{E?>~9d`IKTk9>8U`Z$PP zwO{bnGclPDlxFtgj#C+?V*mLIhw@U8?%=6I(#Eb|(Hd3MZC5rSZo&78+g|qY z8qC?WwNnJi?l<&w&;aIF~$inCspW{Bo{}A%vX6NmDyda347EHjZqRAcJ9H4)4-- zj6X)==+VQLs`n=&NKfB6{4%#izrN@OBt%WU3_euS!iImdfATCzgJ&Q9tILjUXk6r) z@;|ArS2=eY*863Htin{DPT#I}m-SGO6!t2V=w88oB2PCHU2-^%^m%(lPdNAg&8thv z)%E_=R_E(iJ&?l?KT2!=Z3~!qv}YM_H@L7 zLURaL7)%O$_blcp}aPN!FJ#P|AoYyF-?a;7<|>sqkTG9qugN~)q8nu<6Tap_Apflcj_W24C>)U9W`q$ueB&z7!qdI7)5ej z9~o3I$2AIbs3gA5ZPLUf$rC7Xc5dy^c`GiGR{6CSKl+o`#PrihlkqtZp1yRAu78>> zl&Z5DVE~lu-w8qO10V?H*~h9gC*xYg9Ybmrp2 zWKhpEdCegMvACgvu)gjz^z6PMHmX{LPXaIkyuT6JPm^Rc}EK*forbl<_3Sbk6RY z`vP>}?>TRm`buzFX+@Qo;)Cp)JgytA&zWY3K@}UH^At6|cA8eqxqB%FXv-r~TGGnD z5ub4EmDu}tOfXeyn_uIBuB=27TB7W2bwu_+Vxv(JJ>cTx)y#!P1wg@f|o zCufglXKtfm)wPq|!|fQztQw!(^uqoDNsd-TK3|v#B(YQ_E%fhUQPydnTNHvwI6B(LFLIwP>Z_i~asoPlgShs(9Fc=nZhicEPK*N= zdUG9ooX;a{Da{vauNaIwb%A<*=tXRKS^utcK0e;ZWRgv)Q~yQc1fc^upoF*^1ZyZW}<>9%LCQ&|x7 z6j}xVNbwXwp!|~SAnl^RcMo9&ea}fnFNn>)xN+B(p1~^bu-iJh5~%lqmS11&xQz+x#qzYAVwi?~eY! zd3p!x)~6|sd%UQLD_e9yBmzHp&6_>l2I2qMGkV2Ze^l?0=+y(I`UpuMhdMZ=zgeVr z0+8!5b65?hOV9Wm_|JELZG{{rn>uaRcEs$=>N!>3gQtkj@}VXPm5C5+FC&(d`h6L} zTm@3dL2DM=wV4)XVHnaBala~>gT7v$p+!CU)x)@)(mM;5`RRuQG4r^hd0hP z5#(E22@6tEZccwaQQN)d#*xfn!W-u*1t4<9zzXO2kMMPMnd`i-1X)!UznInBIQX)b z*fFI)yk2%?S49CAGM~CO4m+Mal(SIIlTYzqe@+&of=C?R?%H!a>Y2M+qIBnSW0K?Q z%A@zWgNmm*0u1)D;%Q!Omd_m>5OQPsN|R`rlco6!asW` zTlL(!6@P1{WsJrx%Cyr@KZr?rDK$E1%gmm-IiA11nNxn?P-o5y97o=>I^0|%JcREKnA|q`hIv#?rJ7VP@nBpR4~Iiuc%*iVkp?4loEoZQ}c)X zI2eIehDuWrG0RO&992#iAuXg&=62-ZN)r{7>{BYjA8T*Y$$3z=MD_NSgP9WxF@*`!X{# z&_RHLLs%a3=hk+N8;_G&l{F@0CAuSVnQtOnBi%{xL&5gyaoKWx$3ydND}VEVMpBKx zw*2z_YqK9rn1ZEM-spNOqvV(ooqzqlSc3hl|wk@z|~@i~k<;hGKY zK6Yx#eK#DLqtDzvb=`bXPm0&nuBhP)6oZ~*AByWO|JD*bRX9!r9<{+i6*C3B3|at$ zOEQ_k*3A<{L0bWyipW*wELspcds868+{=yQfJn*W(xo?svFx_%#-4|#Q8F|8c~FhX zK*(h=-+Tl^MN5&4Ry@!M}t05rJ`brmDWSYemxz1JTB>?FMs-+@PqF#p#*XKNh$ zEXs0gHULY+&xkkcF@WRFz4?S1Ml4$lwg0ooYUnjMoU8VFB;u#+1Nkf%LR(^%a}D-p zq`nS7_{WMY4Kn7UpfZz1pV^Q;;H4hVCFbFL1Fl9X=XiU1>W%tW70P#2D!Ai*o}Ia` z{jJ8FvT|xbL|3zzV?SAHM%VFQUdHw!PTea8w6LCN!=gIfK5Qq<6~hp&TVo1LtQKvP zJ-~PWvafI1V+WQbqi~W+LKyg0CugIkFZ=BIXVIdTed{44o2EE?*oQo)iYvC-!hlGO zA|3gSaI2OE6;$(bm(*t)p6}HLybYJfY&$LExz3o3(^YxM zj;$-5Q?rG@S`w8eJ0_+ZFg}OVnJ+cUXv^-1{L+$ltgwUn9Fw*nw7~Cur*ch4>O!KV z!VrC^I^4iL{wacVsQJC?->^1Wr*3X~UoPiej};fE&KJZCJ5DfCF~?h0a9kP{hoyBL zUTD131BW>J+-$?KsT^)^y)MiB+EaCM{FY&h9oXj#I0QvAmCQ>qBTE+UFXp79m8lY6 zT^-Islzt}UV>68}t6C4l9jDK(b*%}zk)bbcaycDmrH9S9t3YVc!npTx;kXN?QH8@M zWHH5k>N%X9BQs0Zg(Z*_nX|cU%@ZAP3q>)Lx*6~q$Kxyd@5VQkxSyr8+XZmDyg|M2 z@tB<$DgUC0nk(wOWVYY0?H*>Wg2D=F5Kx>vi<*iyx3JhBS0!{TutXr8$_>ZX8DAf- zhtq1GY0BrUEE&Hxnd82$btXRe{X7oted=zv@own*Jc$nu=vZe{lup?k44R-fn4}7* zxKU_2@GVd+*`?@})ALZQsJ=8(i&$n}v6t)eYpCA#lSYXzF+0A;`VFf47O9K5J^nzQ z1xeW6UGEm0G(nrf?WDm@2!LpG+CUU|V@_^y`lKL6^BtV_a#A6VwS3FU{yJLSaZ*wV zGCnR&IT18j(SjwbSh%5P=CZkbg_xhXD2t<9bjGl0(KTKyiqp5)vz}ESu2yZpgQSU( z4);kyB-(9@J>W8c*umWKzaG`{H7Y9f26B+UO%yt!)Hs$^cQ;1-to zFADi!v-B1h8XlMayv#NvHzT1`mXR^!?AQR+0@kA(2^%M}W4a);1jXbIS?Iw0?yd5U zpgW4G#qwa0SS-u{(kN0pvh1cBFPzHfAbv~}kl9XR@k%z-NCi8UJUUvU1R#Mo#G`^K zU3@87=vnWH(LSx0ig~~Z%4~X;sCrz*wnXfZrZBTn^Ilx}mxqmxA?JspG$gXUn<)>>swxOk9j;C5TeX zw=pQ}%u6llh(lWXH2YaoolAzoZY?X;)Ms153)&kLEnx9^clTJ$u8U(W*H(-#&P|mn zma)$!`&w_9Z;m~bMC_>Y{{KM@HPH?5-@pHM;J+RCZwLOr*#XC;^|{;#=Vzy4-pF%w|D-T^TWK>WC8N9X_Z{(t0(_0x9GoI3j8|K$Id-MHC5 zdd_3~c$CxwNK)v3=RdQ}4Ye9OpCbh{SV654KCEL4=Ewj-wn(8V;NfzN)~J|aq!7h? z@D&YkBJrNj7Ns7;dW%^`4pk!ZvOe*1b2hhjajIu`|LH~2W1ikb{e2Gs4?(IAxBw(^ zB%I0BSn%Y8Cy{?;BlsLqy=O_(c~40r6{uuBxAWh={g-|kWv$yqk3WHAxYM~^y+7kJ z5(Uq+-526?2HP5$_5nC`w>;_Cix?_1(&kEs^*6wi^H+V&$pj*%YaC_xP$}P~oE@FF zgUMBMH?YJ&y!khUjouQNrbO z?K;Q*c<5=ntMsI*)rf7m-J+Lu**g*%c~j@r2v~TJH0;)CjpFN(rA!lZ;f=45u@Ozg zok^O#tGjSR{NrK@(lyVVo04*zvhmV0k8Yc-0-H%3o|6HDPfT=r`~szWUlCpYWOYjI z3R;gG0Ah*I*(C@fJ%(SUDknTS4`!ThyRc$B=OobEB3!F zN3@hZ3i8{(MsDtsz$v#i?>)W=kj#J0rtA7)Z-En#>rIRL1zi6m%{Kyo4G9;7iey@# ztA;HT%+Ox+!jh4A*-UYP@3})1T3i=A0;}58xQreEGJ|0A zbXMZPi+p~)TpsdPv2HnfTBkl7gxzE z_=+{Omuh_h-##z=u>0XK_Bo|(=YrwpLc%G6iA4BQ=>o5H$C&+5mQqF+#V3XO6L9%8 zZ}`*I_Ynbw7;*WBFeG%1)Pe+Pv4i5A20(KvOlS)(KWvl(SR)cszjF z?Y%>EG%<_a+2*HPt1L!^m6=1vkuaR$fVRx|?GC$%^LVjeY6PQH3bpUQnrIHqkT z(;qHrkH*enV%krZJus-c#w#xuA>*Va-E7rwI93{W60m-2$7idQg9_!MnF$b3*5!Ql%0+E+iE3D>;qeEuw(MdSF=Qbpm0 z%QfkSkGj7=*DaEzE!xHtl_(oOr}?k zTSju=mB_94Bv*F(l_sIDq~xeS2GdHf~L~`e>Tq!#JmTsyPw4BPK$pErbe5o>z8noxMTicWCuxvtaM-eur zD_Cyj5lwU!cQEk7k_bvjb*yoa82Q`|f%KN@&ziE~Vj}mL*JM9tD7gJSJKHkpTAOIP zcu?88XoC7o4`Bijq%T8vb)XLn8i3YsTS=gxf8Wd(q)I}R z1S>wx2cCVS&bB12>Gf*z@VY$UvJlZ!%WuN!Z!v0!U>CGjj5I3wvt`4}7bNX7Eu>5q zD-6ASt6y9gXDU3?bdsEr1~qrK(GKUBh)bhwICqyQK><>Wc-CBS0sbQWuAGOM*YxVF zaT7@JdW(MYa;)*YMo~5I3?;9dJg4JMwYhC^F3KD4@_aV&Kux;bpZyIFf?EE`3J?WCvwxHh`1Fhpwk!*MvQv+eBB7A11^7+9CyYodDx z1+zf*jxkk7&1$fCbAz6Pe0L)Jb*uXrXcKXLAAkJ>Zx3DOR%axK5~~;lAopO1lDbV5 zh^Tny*LCZHc~_s0^V| z@qxkZpFVrP6pJLDp}RGrr5J=H%Q|#;zvk0Ml(Ce}czJ95Luey1KO1?g;PHbb7S_J( zJUj&>cVY@m4^{olPyw7oO|0(6a&PVRca>Sh9A0BvrB-ryCi+!hno!Q%cKf}jTfqS& z^LDwqexp4yZ-22TFu$FE`d8iGr~yEF6u-Kbiz|qm6nzzCM*8wkn|@!8$BtF2|97ma z(3nQg-wz6n;oY7crs-vOW?g0>?T_TBW4Zh6-q|D@2Vz&F$IY#7+bJoFuAa0hkBdp) z=_4DXEn8^(JFf4eZAhQsbD!ubv!+MckhF07*Jj>O+-bzJ1LG5p z>7!>O8Ya}f`4z0aq4>@do0fcq+tUea>SF5B6+G~=tT;vXJzTW+FR>6KgAiumAO z*AF-PcjZg3jcSsA`YMvXZJB>bxeNK8MlD;D4UeC`9@y~^CCuYnN9;w}x z2>C${E?8MA_vm>{(+Ne-d5X~Sxh?K-UJo9v%h+r6hb|)@4@&$DID-AE(~?)OM-mkD zM@-q6>@(j63l}L(l~yHV2hnBkelvKAe&mAt7H**0#rFu8~Rzx%`pl0B|U|g)e;0oHgQB$}#!Tv5h$DJXXwPFr;ObG-{k; zqkt|Q^hU>l!hRGrJ~vbgM?KbRPt^b(Fka9yB_I;{b52mBpv~eL+CKjDeXyImG+LL8 z-Tk{~5}sm*f+jbHn|T0UE64WB<6W=O;Ko`xPgf)A>D`*rU5j96sofDBi#$8yag3*- zf<8{ts3xkrq$C=5M_zTMx@kb1$oT7?26tRrR}?($Mq>vXXDw5#a2XbiDH&UzicE*>#$#h z3+G-YuckzkXX=<}nYo|k+fRw26XdyA)HfVr>uj6&h3d}q;_c@y0!pn2ju&S9)Bh2Q zQNQC-GoU{%%piKpAn&2nrSG7DyWSz#!J_hfeGaBc z!ms%G4s!HG*XJs>2>8 zH2|z`-1wWgu{j13^O)oAjLXgXE=Zs8tHMHU8;MoEcZ`Ux0ivZB_SeqX3aB-%dN`ge z!nxV|oZcv7zBKv(SK!pF(z0&B20TA^n&(V0*ztX`?ON+;qST`1KqHF{Ul(LGByAoA z(2DR~p5-v_eYeq^h4bYa1G@I&k-yG`Cqs8BawvN1x1gR;tF}@%%UAeynmg}N-&6d? z+Ua;Bn>Ls)sZXIL`2a2z^}BxJD->A-*$-t=V4Cye`5pfG;2f0Wso!|n7T>NM$iiCe z_c!=RRcNTPX}of!7}bVk#@yQ&wc8f&_pFtAhZg4A6b^Tso8vvZ@+uAo?l`o-Y&*WAH>pT z$+g}ao$9-L)_e}Gu$AE5i$GI8*}na-peZgFE|rB}F%Fg+U#CnScM}O$k;tq$ zLGKshIq*B;B6T~yDO)1{p3O0x(i034;PH8tE(vQ-vd`mpJcSmWXTOrz<=bcEeH8aEi+T2|`|R_l5V@wu6EP0vekocSI>C9_%zq@vDmbP_#VR4A6L|{7;2^ob zS;2nW3EKFJo7ME@GJnO88d>=PXp2`J;Yq(LxZ}J+Z~S`kf~-$`XU&Z7ajYk^MO;sd z$A37lJmV7ihGcEoF{9@PyPVEr&4C5RM~<(dIR16N$%{U3L~JG~d~U`;>9&rNdL@73 z*WEGB4y`rN3lXJ=X)GZJGPZ5=c!tYfBUPjj&lxunRo0|ZT8bu*a*PaQRa;)LbsxsA zn95c+2oL^*HRUdSbp>RIJ>f!om(+!Ea0bdZfo+)yuu&>pRn#4Cap!ElOth$Ih zw!gIFQy;gsZ1~}Bk2}yF2v|kK`dh9yrtu+`W9xq#<6j`?%&X_ z1W_NZO|+f2_xiNmC-~uW4_BiLKiG|oR1c5Xu+xCAraA*xyCC5qpRP`@QbXf1+!O&& ze0)v8hKM96n@Io6%h8>99)WZypRKMj=R5FF_2%V04?gpnUe#CV@`Oodd+K~npsqpT zvSr@RgPK7=0J)6jW8IPa38d`yU*EW}9PnP$w*jNwfZ-0Q4lmX$JA@!fSh*>df1YUI z2Jw|X?C(j63q_MC@Q3mg+h^quPel&zUah?=-5;0{?k^H|?0ls8<=m7q0)>=;V*Z*D z{#_JSkBmfY&Qu&?HVS_lBe7Z|Yy!HsIg1m2bLqzO)(hFOJqLQF2P6`DD(TK#=4UXx0Cv_9w$w^1Gc5p*wx7nDI<@zhd;}*w&}*v<%qG!EA~c(BTB0W*~q=) zjXaQl0aq@~iW=V=wOYDY{Z7Jg7Pisb=hhrl_|0O|qnDpqfB_cTofv10Y4Z8}W#0*{ z6rkg>hy~j&cEo!=Xz$pjAK2#V%)0}88gFKw>3cSDWar~(lX~ldEBU&1o*4c^I4COQ zo&q6!Hj56Yu9#&8E%h{$!3~=?Z>3WMuvWw_kxavCg((vQp6Q}Gz7=judH3k0X(cnh zfXWor*)bx({UtJX$?izK;ybAM!=MH#TQLQhTTJgZ*I2DBliDsG@f7Y=8#Z3*(SomV z_DpLyk#o;OCx?cDMN5`2Cqt8nJbLfaJ%f{`a3}+rpn902Ox<>|Lrhc(?^@8MK0WG) z`uzzpJ##u^nzl+4uuzbsk70LeTd^CzH@3Re(4BApD$OqBPlmU<%`wj;MYQN>%3^z5 zo3{c#%OfNPs-0LHvAZXJk~47VLh=+05VAtlr14y_*JnOwZXBE0{mHx^TCFko)=>O+ zT1NV(uZ`;4&%D^hQ)*Dar%XC-(_{wGMB=GxRw;SJ7abA1V3B^9|ElN-m~;{Iln!EK ze0L1Ft>XS1M@E(4MrS0-tkSOh*;m4oWWifCiBpc9snfUbpZDkmEfzg&+<`_SC}|tW z>B#)I7P=s-?qAjk{6$c+cF`Q&3=SnbsA$tYKU|wT^KA$GnZmgbpLl~v6$2}(9+x3V zubl$w2E18=ixjn>1AxRY+i&)2HVWCuZ?)jo;dA^D0~zkGG$2HlxhkWXfYxPMYm9r} zKS!8z*3>$&A)vzEAtCvgKh`hadzFjl$2myCYe5Onfv>1o6w&N8p>V;KyQ5<3>9b}= zqwTjQ=j1NNR<%KTvyXR|zv*p(m2j*K{1S(H<{XvAcLC?_I_$q}w-nqGaAjfP=!bYT z#oSK0>!QhXhHiG|?Oy!^PKo0>w?4|kHl1i~u~6u{5>SQSSU}Ys z?#9$yvQ~VTl03!B>)khvU8GmDhwqGt-hBZ~JMZJ-?(Z-l>Yur50Sp^e|6pnoh1X!~2u-xYJA*=+fPI6v%| zG7?V|97i|!oG3?2!4ircD^`el`T!*niDLSwJn!7}QAaAVnI*nDo_!ovVgaOTA>3%V z)DAG2AMP%Jpm)3S{{K@AwNL-wT>AaDkpFhzza98*2mY@+;5fQI)d6EgbwHc6h$VJX zb%24f@s8bN1`aeHpuc_K*7-|!EZk?jz;NXM?EiOhekls(K+Z!$^`CqA(*Iw(x-wlJ zb2e76M}uK%uBh{N!3#1i*G|9e9GpOC;Lx5S0s3HI!RK9p%dmLs)#Rc9P9&0nT!U6) z*fX|nFv(v^k|9;l3_tY3XhWo~mXQb4l=vPA(+W*Rnf@-^_uN~>ex=~0sL$WHK?8V4 zcbvO-ZM+SBO6yKH)fQ**<4Qc>%V1o(g>ka)n~EC(elV_{b0p8^rkFNM0uxj9X`LRb z0IClj6^*69o51Q`2YI%g)@bXmqre^y#r5`nonie(=`wJcYlK zf3UPtr{hhp-#k}AH9C?#x^aBqhUv>${LkNZ?mdDb`6_(;tdGVb0O~)l0dC8A_NO1M zmb7*Ar|@m{lU-*9t^mUXp155eRSd2W_ntE*0zUs$mzK-3*1rt#o@@s8*mT0=XUFw; z$>SM2A0E5RUAl{JVg19yS@YtDMm}~2z&VT}pOn#qgrRl%vO7Tm)Uql0x4rL41Hixo zq96P<`RY=sK%p05H5{7j;t8GnMH}ue-k#ApP4JKrupeQ}c|9U-~K0 zrm}T=-1iZ>{~5I>-4gcLn*j0zO0?S9&g`r-X&HIyd7)X`b^qM2jYkaUAMN3 z45wP;M2>cG3|>1{F$fII`L9XQ2aYm~&U|_ZC`+7Ud-YJ3B}ijJeZf>s$#bw(!%k0! zvMskRj;x{0ixbwG>C!iYL@h}j+T%WuH9?F(8$#HaygY6{C7(MMYTj$0GM zftu0gJ1)Gw$!=sl(DK*rNAfMU;LiB|XL-BS8TC7q7oYzzHdmK-xz%s?sUn|*YKkDn z^g~Dz#Z<;3!oBQut!B?odjn`}P4#fE9MnPC4^g4$^paN^FTC0>w4;KGISkG~ou$|6y4;)RDJSY#27-r3BU3=0?m6~ZG4^~TC?YiVP%9W<}t$# zu53bwmc*Nm0QmkM+2QHYZ-C)iE6Yr~ow^-M3dIL_w?y0({Rz>{J;S|$MA1iEf;pX7N1>=aX-^!{)<}y1dGe|e#hdokc>s156APA>Vv*+6pGvDU&#oZ# zlljmeywQ^rj2HFR&O!XpK^pGGdaTsBu9?C9C_30=UuIV4l;jc0aoLtHHZ~5MaHhEZ%LcommD&4uW2o3TYe5*-R%LA8LmuD##7s$ z^7|2qh}nT}i{l+xYNkZe%p=D?*4S{rIoo@E`0EQJQR-NTDMwx7aqc8{TlOs3o7YH9 zWgKqOb17L*=6SRtFIU8zdau{!q_QjPsW?sSjzme^^O$#sS8wmnOO;_sHoKfY{F>l5 zR^r2)L_}$7^@3g&j6+qA!%&4{H+0(tTK{yq;G%vJD}hW`G>Yc&ldR?5efPR_j3!w#AVkGJpX$eVw`@f`YdE2iV2(Y0B6C{ zPVieH=7zSz3B-Fx=uQ|g>IWM>yGzMLGc?8B)?nm!w`Lf| z2jZE>VWa+ba%UUKzCI{yHe@hyU-rjuJ#|TNBG*lKr`ekP**jG3v^6LGx zNCKC^smByOWJ3%m?nu1<{cT+_6od^|5DLiCSH8cW+!1$^F4ZIXak!$IrPWzHtVEqL znx#$;npt#t6)wPeoYlOsM9OheeZe7STY zYxbTi$Oe$8z&=xT@(PGL6ZBLLELHuAzTcnOYtjTn)P2r8pTfcHd_{(J5%}=BHpp4!#s@Z$x6u_V=~wOy7vAK_Q`kcqxU`HMb?^Qj`8$(p8MvTrRIL#JxWC* z?(Z1g_fNaeT(iy>wb4A1ag9pgNTrwUZV{1@_-E9f(XCc05Ej!je9Ao`tdU zVUW?-D4$Wk!2I7Mey39Yde`ai+d8Ri_|xh>N0Lyzgui{nw4Qi(!8$S%X{q;Ga5Pby zGK%ZkZ3U&sh+})^re51Af$ooQxmjgh z_Tg-rjfyVl_p_@&uIuTx>N4gDpZfl2duH!KmQf*siV<9ewUSCeh@ogu0s~f=UC;bL zL5l*;R>k>TaAKIJU!SSSNY#HQ=nmlerKcQ17CeAnM~#AUfPKWK*FQ&d8#%z~^0qeJ zxn`FtZX?MCWRM4C@I;3(`)iya@SHN<-@P|sLVnfj%^$TT+_=zpR(RSP>NF{;i-NF- zHuSsJ#Y9P@8W_>^%Z>i*oUn@(rigJIG&ptfAd?Z7UUMc5#t13^%$NY*IzXfrZ=E!* z@cbn#idoYcUlOjMG3`ExR$=r*+9!Q}$o8~o^^#E3-!bUZ?y1%UXdmiNEoj>g%j7Wd z3s7N*VWZ;(Z+lZ|OS3|}H)9S11qsDUHp;y~&Ei$SI~JBcuRGW;h?tP-*4jiO;A6tI ziHND}(0gr}Pu_Q<&z^0T>3EU{BhMf6!EzU$5Ufrcu#0y+lqWx%asRI)aHfXoDZjRI z;6L2XvW8cyR2^^(0nmIgGk<@3Ow`>5cUC<7iEPwirf0K0UpW5Ty=FP+P;&EZr^Y$U zSdV2$Esf&MM6xm|s3KhCTIbQc@G1gl7Eh8Q_`P2KVi|Cbq$GuNI-jMGn2VkE-A|QO z$p?Mcb?WzO(a35@mpQIUiZ_^EK^L^u6VVbt9=2)-z{Yjv*~Z;C3jzBvm`}yRVE#S~ zgXB4Mc6H+>!Tgha8LmuH4MYWrj*yez5iNS0L%rQ_1sfg9kM-Hannh>hXD5yzXv~-< zU;H^Q^#`NY86e>o=3KL$Xo2x7YooWXV?(0&QcDSh1E>PgWVpD9Te7g9gI{Quaz9`& zZ0(>}R_OCjjY4P-jE%l?YqdoaIa4}ZSGtsA-93&Az%%+;#P5*Iab{g)Rh2i}%@0~b<%Q{utCWK?mg`fhmRD(=%>`g@OI*#xJ@q!cc8b`REHdtw}G77oQ~ zxt?O{g+@Wu_S*CADt6-QVO~|w_4$s>i&l(w#FCq4{~f4Z%6je>&b)JG7qju9R4CCPt5brXS!qX3mdMmIfG3|(9~;^QJXV$xp!}6vn>sm(}iJdrXV8P$C;+e81IVo zrAzB|o7ES8p<+KtR}ndu3DOZuR3_hdnZIW_4mPEl+>zvcSMTw}p&v-Upt@=Kqdi9E z&~fwO>o9{^IlGtWt{+akStvm!@TtLqyYLN%Vx?@o$kCqPOoBpgRu2T*?Tl?&4>tUX zZ_PeMJ(>{>!8xyYb?0M#$>(pW~)3y4M-=)v#vo z(f2Si0WZS?eNHx}UXotMVMKF3aLvUjEM^x{xAu8$#cD?^NuyUQR{de?a;%>TY70c7 zqX3Y>Fuuy}4L3KR%9^xn&hCOp7Jonj*uVnB7ta|LLMRd0v(4bQJuL|wj;Ig3ob!(j zm+_^QQ6sJu&{)hDX6Vync?K(S)ZOvpB~&k7CahKj#%qUUE*p!Ct(?5gwy86VU*ISp zG7$c!+o$y%@*B1Ky7aI4Ja*Mfps>vf!o0hEnzLUooP`~zE{M5RapzqUe zY^t^n5q;jh(ts$!OGgOV#K3+x`Ew-h72%J7z<-VA=8}%r%Vd9Y+^tWXi9`!j*j9=H z!H=>c2GNqZ6i}i^x1;R;uI|bTrOED5n4K>vLG@0fjGpUGZZKSpCHb_vuR!}IlTQ46 zyU`6wGGWTaP#tLU(6s|*dufw5N4}bBp_ed}r7jY1_Q+U>#n%3s`~RR;`R8m`N$)9Ghbb zg2bhr$0w>#SK#pRI>#xGd3{Xh?nm5~#IlLPK2bkf^-n6PXU5!3Q(g_-$TED_pLlV; z7B@V>BN^bGNF>`g=+~`{>-c6V_?n02-V{XaoiVUA4b>oepcb<5q;+r)9Q1q1OHi`% zl_qgI=qaxXfXM3A@jLgkc5M2Uj-}lw(Fh`163_~cEM?TpI<*=qd7Z+Nls(7L(|3Or zgRYme8;O8j6Pg1HHLV<84t&$62QBYk@0-9MSGQ*nIEu?m_ew4pML|D_v5p=4+qlWb z3bM&8ZTJLUL|_U$Qro?8S^!SGI6srIkcDq$;Qf?Aw-uKr zBdeeC=Tw}W%f~ZhYzSrAxxUK_7YMKS+_}8<7b^rwZr)UU9C@a{pS}wQ?Tnd0vCU=v zsrQPZTtlL#GWd@2>2N!ph7)~p^h%TX-}!_GA5;`}q0)^$Vsqd6Re$AqH*9ay3!N@$ zj9|?h-v4@ChDQsVEkWrKZ)_`R(!~bHnj%8>+O+)gRfp(+=8~w9T8$YSNbPxmQ)Ej_DzOSR8Wx zVfSg2TTWFga;)RZp$PTr&7pjdt%M>$qQo=6l|XJ-5k;voT4qp0-_`C-&KG&ufxExe zdkOve7Jsf`0q!PJ0s$LLvZZ5@)2u6gFhvHMQ{?$Kcsykdv1s1^0MMMu1A02L1l67e>%TNmi| zMutnFB%Z*BkC#D2K+t{^acZxTkHI{jd{#({2lW$>4_aNTT$g@ukv}5LC0MD z8=z>0X&~X;!bUZ&7Lc}xT+OTH4bfPRX)1EK-6tHy_fbm|m)68B0$ELciU_-Tqk3moV&0#87+)Rts3J*+(#yrR&xP?H}+63m~JIDx*wK=`;?k zjt7}~gF2)i`;#W~F~tayt8pRNsMQWvXR&?>EZr!-CNASbnmL)J+`PF-z;isMfpL3R<4jQ*6uH@4ojup{$4X!GxG6 zM+t!A(zEEE!D=BCt(ei_~6eVQ3YxV2*9s)B1o7cYFr(JaHl z64EbESWB{2Dth^rqUNCwtuEV~Femn7EX4SM8X_vj|99`huBtF^qg33vuX`*27jvBI z{{Ny{^^5=4>$d;?;J+RCZwLO{f&Ujf@N7x_S~aWhuEyQ|j(k&%=I&}@@_+J56Rnlj zCd9vH9QU|F@2rGjZK?oB3;}{-5{%iBBeK z)Cs^ydaF{5FHJ7pj5c~pjJI8C_@|1pS>1a`he*n?Rld)x9*O(*RYCYgCwc)XM||?k z{a^Nd1ET$K?vNWbSW6URj;c}J|-q(t5cgukrNl5of}_C*?=>8 z&iI+xj~w#Zib@PDWjeEI5cQGf>zYN+FFMSW_3=)lXLifRn`j@t2m=&e;8@DbCh??T zLBHp@p7C74H&?6Q@t5dW{J6Pv0U&qWBwt+?ga?m$PJ?9S_M4?~-h z@^nh<+xj{=ukY`d9UZTbNP5F{J1=hs)w3JX45Ja3h6pUrNe<-l&cAoARgiV=7o}1Ri#b4Uq;_g`;J|zZ;@k3weintMy(KJ;Yq_)=z{|BW18K z_np0a9r{X0_BiO6r}KGqC3&Ou>w`GFC31=NPXUpMvact(=M4M9NHzgt==zKzOsc;qY>Td?gXI5|@VmD_i5Ix0$61 zR;!qsECWzZgK*9?{*TXeH7iO#LZBw45^!J3;?!Cdi5s9X5 zgZrEs4CQN`qkXOfqUJIBH3UpMHp(Gl=5K@M`~a;la!fsKq|~C!3bh0zT#H>HnDWn?t+MWjVVQXJ{olKG%Dn8d@|zk0ff=(Sm+X{fF>bEcjrimELxNU;wDFCi-h;#WcUXq#HEF{M=Fkyz>~3pJ zfkEtwn){9PlpFV-nyPS$<5P!_LY({L1meSE@-lA@kSX`UZSL83R>4 z3pq0OxFSrDtBquPKYrV5w=Gp0yXvx21GH!~_u1KD)oY=H?#hz3Lo5*E1mkdJU!!>l z$(~bY_Lf`~zI-BGVsVtZfo7B5JwvSoXsX&-N{CI~uFw3o8uzz3dXJ8+zn}3L4 zlPkH!r(I8+xP^9)88jQ{WWM=isKe{7cq^a!{Z8ij^u<2^6qSfal-khRL9Mwo(v+Lh<7crdc|^}3~w2#J)y4M6ytRvG29tcVkAF?@ec zJuGBg^wqkiE3g1%(}sT@bax)U5(eUS?s&9#&E9k}VdCEIOaJ#p7lr*ZYGZ(hE`L+- zE~nP(XGlWn6?4r-#}t%GIy;CGFNu=#4+FQkZ}^miAEM6wJeA8k@w3!+M2z9Q0+^A! z6wwRS!*^=z#Rz|rZ|f9-Nb*ilBMw(ZK$E}W-D1%{r3^nTI*5|FL}(a$I=c53?9bHk zbJll8cl_lWT}2*1nH2rVRXu0CJ@|ATLB-|+zZTp&&FxQC+wMKBG3Gg?|3VX@YhplD zMb2b-o=+J$c;4=tMl&#Ix(SzVbdSatwEx^Gby+N*db93gOz<%JM~oUwpVp?3k4yY` z{3ce06j6Gq+K#gB%)9pIfD1KtN1qv84p+gL+ntJy-lUI{%IH+ZwDwfwStS6`6DPxC z*N1{(#v8XwG1SU@%q#D0l@VeVv85Y9POn88f7EMIk!T=I^0MKndsabXP8{XCr4$Bc zo>kQf;CHqq&mi;r=#fbnVO2+4n2Mz|@Z|aquKG4O&G`a4A34lDK5j}C*D&mJl8h-6 zs=i?1g>Hy?VEr~12MyP!8)Ddp?hJQQqj+>_%+d*|RP#!84EC;?$+md^>Jgqx+0*e% z58adId|`?V)Tk_N{Kg1`V(O^2PNVA``lzS4{#*0I7suCp&kY&WxcK(kTW15VV=kc3 z`)~&1S+e)lz;O|4(LsT@m`3%(OD<(ApY030KU~o7mYE#UDW9ytTc|GA0<~HSh(!b& zx^(!=sXJ{=1;%q523AGB>DfpIxDOKjdHb*}>2mjh@=@y$lce1}P(2A`a-5!LvjvB` z+&kexi`?^;D|?2PllY4(SzGE?UeheJxw*x%$>Twa<3>FQHDX~I|G_7LYUbBs?p&BR0veUtn}IT~du-u8EAdoK*hvBs_A zHpX&)+eJ(m_ol?|-%)X+J26+pk;bd$hxSIj5}yBF*f&&9d9HDWpp@W`gDU%46j7JI zo?ABntMie`644-~OcOWqnvIc>UIIlL{m7i+dSp>1+vCxEx4zFWE5aYuR8NV_H>C`- z?y&!;?-kBg6=Hk!4@*g}uE*W%2>m*_$1$0i^^Zl3c+rAV(3OEZk9`(;X0+leEL%L? zu+^SJHQKR1+GD45U2Df~sNf>Q@NXk)1@Our;tM+M%H_RWnhm+`vJ*pcv$7Qx4s$uw z3f(<)i%;VbVAntX=v`|j@17|xlRECFN_5AiOXQqnA~nHoZdRbDT>1CpnSFOGdDffo z1^W-4!$3B1nOud*HY&!u-S_2zNb#d8%C;$~c$-*5{b-A9oL-20Bd7dw zA;NpOA%5dh-O&72?=aY5zmDqv_)YEq=fh!5gM2g*t)I(xO|?fP(j>{+gm1~n447y% zoj*QuYru??COFSfx5Rea*`G`mK4)gJJpL3mE`+3L0Un#Cq0O1Tgc~YE+_ZmdTlbiX zw<(szPm%CXnv>=W+qEhfHUks&REC3AMEQIW9TGU$Xu&9;MQ|}pC~#Ngd7x>QLl-yP z&e1(~H*W+J+nU>oVRNKKV(;eZsUm6GNWD2uri@m4eCZq1F(Zu;&9l3YN!@7ylMa<#99s=YP>vcrtj(cylvjr4Ayt@jA;-=fs$3f-nvv1?R;k{NY z#Zo#+onNGJm-1cuWnn2x0Gl>81F9+wsh80GFsL< z+T{jrN5D0hvYC%h&x!bvPtYAELqaI>Q$J^h?qU<7izax_dr0v0@ywY~3-{w~o|RV7 zeVuMaPCR$V`MFJBaRi;70Jii41Np*Ru}*4jv0QviQQ5b_F(etnmJ@k?>emf z6SaV-`8C}vOGBoh1*+kE->roLAeO2yL{be}wC0svt9S19U;}}}hOv&r{~hHr{P2yg zvt}M>vEH=bWqK$B}6sxyWauDPmM0C2_qK~&AazB8Sp({ zq4^Tn<3QLoGJ4^F4u;L|JP5cp-d*PPQeI!YwpoXefqKe0e;$`TR^rD>mmJnMY}_7` z^0r{9u0F2GBh9ULS{ICPT4}!lx2%U_n!ILz*k5c(>QEH1k#O<|NcP* z2kmYl8YB`4e@y=<7A_^aJbYN+{LSS*c=ahC|CtZqkMlN&xqo$jBd~l15C?fk3Fid< z>G`7L*H6vnhxOiFfL3AJ*7=Cptv-`*-B}d|BU(P?4%6k$A6f@d#;+shUhg=O3s1h5 zu2Lj(lNf8|-P6^JvcgBxvT(Pi2s#5jG&ZO!@%cC+)~_4L2{1@(j*v1L*@k5ExP#|kvcon&Ty zC*Jt^>T@VQ5~z72v}xbbd|;#zfZ4vYbq?ZXLRAfDne7e@cN#yE*O~qR^Vx(`o^(dg zV-o{Ny@kA2c)uTh)8p&nw%!L31)>fwX=<32-G_V^;ahlVA*F)Gk@@rOg81WVC%XR( zI>EwJAbUQeWSp@eII0BElQKpH|DLJB{RvOPrS0RYnIaxBq75C zJKe<-_qSbRW8`ET?qOza)tY+(9sDr6Y}3Ns{cuu;$1L)?$(ql|Yw*mjuwQU(W6M%cG_xuE+P-gKP9V;}W;=(4IEJne4X)aqvjWAGI+=t(RS<2`QT zVebu}y*lFtI+$qbd*o#=0&|yNqn(zF+KSJWhkO(_PPBR6%ylJ>?37F_S<$(RfEhty z_gv}Pe7WI|9!n_@g~Xy5th;bTwHND3uMbED+~gCap(vTF^~Q=T6iou47* zlRruIm#Q4x4(m3zrx6kPl?x9B;DWA5^?fvGbN` ztZIOLzCZa)>&bIhAcyKJ0JiUnkj!hG5t}69x~8JpK!*+YmXN{-jdpv&Ji|ssY^$7@ zQbeXZ-OX-FB$Mk3M&srSn7DSA+iZzNK~iQ3VPWS(3PWa{of3$3q9!FO^ z+arY_JVF97&;ahNLzKqVwa*Yp73a>$h86AoEO6O@GJ&2VLJ&`-yu<=@)Vi>lU`g?L znqa`9Eb&PiG+4!(9vSy~^pk1mj&8xXp=#RLc|i)O%Jd z(Gi7-Ya-MgwMuWl=4|Py`y}EkG+LkdPAHq=3Ps~8A|kiT$4}m9bB>)CoMLm(%INtO znk~P)CcW73ZyE6H7~wf$h7RlJvF6>Y*Ry64Z-i7%m?)B@5TF-^an}6}qpXnC)D6L+ zx`zM+=RQ|zVlFzR6%rJY@nLKv(ksg1n=Y}8rGid(AS+DNG`!o6gypNVrD*3OY}N@AOXGB^ zrPU8EZ9@$3Bwqbs?RB*Un>kN3e%P{jk@Q^zs59q%IIARuiM#6ztzDHhWdr3*7hz(!Z$CroxXSw zrdyz@Xv}9@+LvaWIAYDA^owl2+xZ~n!%`V)GQEHvMg7M#yImDfPhKcmw*_a~en#e_ zX6rwCIII~*V18@TYpdI4IVFaM`Aog z9i$=xD(us{I6|XIPok#yDr3KCMiJntK> z4cnbSN+sXMD6^lYeEGzwTZ3m7A^A) zE6ubv@k=eUEmPye(@1cn>k zul8>>COX31FCl;xz8Nf$*$`s3`?`)fPB-)b-Q2#h zBuc?;TMZv(Mg)~E=&tMHO_Ehf^sDt-l*C}9sOFVz{t8C{y0iEnQ7F({lQJkO`h9xh zIDg?AJ>|5qH(uK8Bt(p#bxR;?($1jUxaECKa^3>5;&mHw)|~ll3Trk2NIz^~C+P+>Vt@Ze_;DcR4rV*}3LVFE_C27&F;A=yTacb``Ogp-B zY6iZ(zqovyM6q%vw4X}{WMb^+Ig3E?Y{)fK93R? zj|{-GC#mp>yntsN)a)3`P!Xq}DJzNaX`(^G^->PbGdozjeyRC{SEdYQWc-X8*X|t0 zf^PgKY+BEnqiQ*^Lcj+t#@*vLIX+ukl=Jb7OD}TrbjiG)$WWWg&v~6bnQ3zt*G61b zj6Ud2>LkC8(tpFXoa1FS)MsE_?{Ren@qh$p&m+<)4Q;!|M!7WCThk$ddymvUKN|-R zTFf7lqmAvw_NLGWV*ic5$!xvl?}zIIx`D&y<~iP=R1&*$@}plbEvY+Alfh)u8dZt( zZbps}E%&M`Jll)EzKPhZQ}_(;9nO7e?6qjWiZJfq<{CN`R4qe(MDS-z){qKHb?tAH z8NY)#dd`Po1dU=Er|2)*WM5OjSaI%moqpK&A{;GD6R1{O*fBwpopO?mS|rhQQR+9@ zb$ouSO{kvgDz#YE2<%p8O3$k!-k`#)yu&wMF#6yO_G2~`S^-PdmhXv>umY^Xmu@h{ z>hy7f;ZQNB4h6a*V!UqC^1bAA*?;z(YS)U;H^9~DASE@*o;h_Q&bRD|cF&nxvD$tL z)nLIV*Qg)M7%2e%t|QNiI_K|wCv*4F9IRhpdX-O!TGyRo7N7OK_0E2WP*1@~8M2$u zPStD@o*R;T`X5>lI6TLHq3sOI4QM+@W zmhE#r2CW=)tIKO6s?!x$+b?6}o_&@f>yX6y8tbj+v)LuHJ ziS-8rV7bF)uHGpQbm{fVruSD8B>|J4?TS{$%OmuT6*YW^i{Za#T?}U=7Z|fb!98HZ zhTDHiJnLh=7yXj4A(XkRyLZfdK>(j1>Ii0ENikxi<`B+nTvqMGujtoDL0j9r3JQ`a zkAJ7V)hc}#L=N???cj@Ry*RJ%VLsmr22l(wk(nPAkC)Uc(>R2prML`DGEe5?nO{kC zTabMuS=^$F%ZIlZbST}dcps-DUF_*lQGadkpSEWVsqWEvCkCIa&4oo3yG3e`q7ki; zkyCF4AqnBq*EB`nKUz$EZHtxgRMA964O`T9*&+To#Z$td6|zxTa8`s+Hnd!p$};@P zlMGzAU+D2%J-`!{2{>)I<<~|2DYcHE5wC*ynHvlMZk0UCu4HDm;d0ss;&1O;DK414 z#R)td(zL^8)`a%eX~&_gU$pW;=dm2_xb1V!Jo&`deY9)(q}e(oL5AX2M2y*NHM=wC z?kVA8ped0OpadrO!vT5jI;*xIkmGQ}C1ijZq(u)C@4oF=pVL{p8W4SU%wf1*#J%hr zJS$aVGiRfq`Sfrc$R=pDjr@5Y>mk@tDduN)&%A{%xUr?J z{;3YsC}c<)WxQL_>w%iQR|uo^O>z+R0<7XZ!=2=_ckhc!a86m=7^IN6W#v5_l-`JR z@8#+2aw|JbcUGs1zZQ23p{_E+a$no|Nbi+Vf+1r+%`etp#6T!{x~eb|x4eDip~d}q zmNZ7S7WGuQq*K}@S56kS=b`^Y^OqXd;-ncdz@rAsnrR&0#`b<2z4Gc3EK>Hy=Y?aQ zFTlLZ_|%H@gs_OIA4Rt4o+?sp9uZaLpU1A-SP}_IW(^)~b@TBJJ09kHTqOu?wBYeI zNGdYfF)PuiUjq!sNoK*D44ROBo)^S)O~}*bDuE(ydYxG(Td^A-RM&s0a*F{?>-8H} zsn|=HVNux>rbz6aqTXgb;X!zxH5)H1orUnf6{d}fR+gYtpQXuh&!19W95aF9_SKrg zwjo+t{evEMZp*@?-j^NtIGI#P;cZ;fX4wNoBC`$kxjG2sW7}oF3N8iUPsNzxtf#1O zNw2QAhYSJXx1;_Nr;Z0Wro5&#cr}!9t>K{l!!YmhDbkn{(M8<*d6E0D^Es+EsPLJ0 zSC1aFmGZ?!_oGv9Z)ZIox#BJtq3tCBm!h7UMxMVtc>0TV7kbWUn2z}x(RA;4Z^~bx zk4lZoW?n&BzVDs?X21{L-E#GK)1d@8iL&KaM)Z)-iSSncbhh3;sn0*rDYx{wmY!#G zS1}w?3%`@L>~X-T4;-b3!4SL&vZ|UTirH%F+{1r1rP`wNMByDoB>waMKLWI(26?&M zn6bbY#(@i;Abo{3lEv*KMpWQ6PQ^~YGGBc%>&$v4h@PIZ>fEaihJUd-aGv#$k(*t6 zoqK|bdg3&_!c&agq{UXYYbav`{J-e1ERK~aT>Mlx-eI}_>c9F)wbFT4>hLd@=2C!c zE|_tsTBY24>i_xhQAG9qfM(HE;_wOL_ILglN{N$}jCB0*j>bWov4yYa<75(5cKY#} zcCPgvWpbo))1=ZpW0J=C+C&g#Dn_G_#FzV8-=9s1bb+Vh+bI;+?R2+C!6g_r*KO~M z{%jcu)V$31qD(nT8{4H)6h)r6P&`+;rsQRXyKZhnQM?v3Y96%t8p>@ZNjTP2g#H2; zGb~I%uH<7#Tt9E7GY`;#aaqY%59cClw(-d)^#}^GB)W9sseF&SJBQ|1qyF^t{ANcN z6eVh9C5on^kmGP}I;k0vNDy!Yfv)Vtq8+5Y*rqYteC zN0}e7UN}N@v9`v?7wxezW$U!fhysZ~H_ubEZsw280|vL5eM|m0Q!3Wuqn>q};9!dN zDs-N8J*D~!Fz8BLDzeud#ng$L)F9k)TGx~N}h8?RH+oD5Jvr~4Dgjd{&wqBZ!@CquOb1ys=3Fp=5%NNCd0q`*DE22 zUq_(Tt#G;f_dAU}>3d`{+FwRFDhh#AXTGHjewu{X|8toT zC18+nGRpLU{mRdsF5`4Er*A!d;Q|j`{o}o6J3@&fQ5i3O&XslgA(L|tr}Iy=O3%t) ziuf&+ul@6u9{PQDB~fao#LR~qOoBGuwgLt5%$J7X`BW>3g@yAn6TOavHcC-9ZbK@Z zHAkk)%RGNJvtm7l$V-HqqmjB&?jOdjJ;mWpH4y12#$ktYl3m~#p00`|{dRO}sXpQ# zCM7!Ou-DVEv{wII^1DIo3j&aD5>o=mbyYqcitF=KRJ%9sOk2{INTj-Lte?9fA-`<> z6kcBH+j934O5`_|2$We^?U$SOTVKW=E|a;VGaA-i^7m{@tk&Vm6iu12Xsno*#HR#% zB@a+bqM<*hLha2v$^b5Hd(atUhIa3jXEk%Qx{C>JHhg|^oZpeNWTj$seGFks=El6S z-5hYs88x?;cz0RIaj#5TKH0B~UBSsqhsU7hen_zLk4-6XC(*hEurPJ8w zj{+##3Z>RroqX}$ecb5b7E#X@unC0~nTGeL+p!)MC0Z1mV#y!X`1qYlcyncZuGIU< z_1(dp8ENKZ9v&BtT}w9PEK*yU2plEc#Nn{*x`X%dI^kVfc)dlfg8f>}Hcse>o2XK; z=lxqdqC%&a59+rtL87d#9y4Fwi)+Bg(pU`6PDk{%1tDWqhpkJW*Mk-V6@^_o*kspU zt>u*?Dm$2!K?z1`_0QvBBZ8{+ew0gSll*qg{9(O+(qZ{`LjIM@B%^tG(!TJiksFI_ zvRGJpr%L!fg=5M2*pkgV$?Rpc8pW5^0`{HQHZZwW6pccdWfhT8%Ir{4KftjHdixNb zm0Fq?+jUw;%thIf{_4saTv_8a>fc0Rb7it_h5Nm@0dKEhpR)u_!klI-Ra>xi-=+$6 zDKNk@=nU!3>X*@f_H07NK29HBw}ezCBU2qt=d;FRjPhf>eCwYtThlYx=gZi?EKyOvAz^;Z0&Jru6 zB}8CcjmI!1x=Brvl&o^3u#gqnWkrI!#d>yL-d2*6MZoy7jY8{=0%zCQ;;q3Sg17fB z>vxn~HRTJHLsaa^!<_= zi*J9*@cJwK#od!@$6Dw*0Hh|E#|^~y%$B*I3P0z8@}EZh(_8?X#z1dQWK1!6{e4!Sl3SRJnu6QA&rHd5CA?j{py+0Ij$_0{1 zAmn>i^Jbj;Yr>w4OEw<8-bZr;x7UB^cPkwOJ16UcqXiLTn&|usAgD+?^lg%VD-I>t zY>mOK@-di773n~Tz2)bkff(3=dh5k@qJsvN(+Emm{d0!3U!USo61shTe{vBY?E!?}PDE>+H=n&(FZ zhaBfw3i|pxbjQCB{<6!c0we5WT#)PNx0-XW>8XCxWdLq#d}jS6PjCw9XTQB)eFZZZ zElM<7ZCM5kp%68&KR4~hbW@HXS+CLdy7hMpqLju0-j3fCy!l?m@NIMcN#^@dl&hG~ z!bL3k@H2<2nwQSgk!aSDG53alZq?|G3y|RL8&TN4c|Lpb`ao*T5`g+}4({Rn!^w@2 zy3hDN^?fvMq^qWVlGR4#XdS?Hr6IDLNmnqx}M_vFk7ppCa7n$0I1dK zj5WT-Wqs2I1UVAx$W*>iFrCb=uBRN+^VDdINk0g&2G7v!ybrhTBT>_!O~;&i=AMb_ z&mV6)?|7~$k<1&pcBL$%_IR#H7nwJ#>G;TM2EHjs>u~xwViMmq(G4v7phQL3z?Fp! z@u#CCP%9u1TmGIgsd+J?CC?TrL)S=MD>(7Lu_tF0y&|)#&8moUKI@3$ht?XI3Z5#Dz!o=6KFU9>jc;wfng}GR&9I`}xq759 z!yokg9(j^;mjNl1FI?96mwzK%d97;WEs*JNl#i5~ws?p^ve5HB+SQhk0hh`Eddif~ zv>Q*xTZPIve##V4l2g0S1wM^QvBi!Y)5d?plC+nxKY_6a{dDk*p3KYD>0br0Nt&0X z-;ww7d^EB`edZ62@`BX*&JPq~js5YAVJZ%?lREBmYBHvaYzndriA0@K6zw zq0=g|&SPzUKN1}&N7V)?)z*3)f_smmhbjg-lwUq31(F$`^*U37Zv6O>V+ zqH2vXzo)$;cJdR|{r@1f>Vy98cXI#z#eX~S-wyn@18UDlH{f!9kDj=k*Nr~gv|lwb zoj=>eX5DhF)izqzCN{RxOui}i^p?gOR@$z%w9vA(G+w?%Yq{z2)fP6kT4UBNH#ad} zt~Jhbg9R7))*IHD*!0nwthH(Nx^-GBOti!Y%uKY_t+p`XceZ9)CL2wxw^;IjChKfW z_{&vV%Ppk;=Yh+u#Uo9Od+`O!ZPxNhIs#VP@+IrGh%YlY>GOZi|L4rFEG{Vm_t*na zPT-VLkv{D6LNm;-U{C2pdY;^8v4G+s*BDgUVX6pYIDUJ|Z$ge=XCK;r#_jr4w94)u zmP$1H^1JmJACk@7nj+iVgcp#gJMo*rP8NM0`4E6b?rmQ!bV3Z#S}nn*ND>`hz4Sq? z%)4Z-<)a_AeQ_1f^=k5n!{tO`&viOC*Zs@FfOZwyK3C#E+Yc7kb(FO4b||GZLPbL5 zo{Ca?%uMg#M1;`rh=JytefX)%mWv+t1|_HJU+I#LP`q4>OLpN|H6+Y&A~99Qot7@o zf|Tm-7-Ku?0>MMt*;)^^@>skCUpbhEZu>^(H&vYv`pf@zh_$2?*>}Ll{@HQdg-TtU zRJ4k_$t;t(?m$)lcg~pg~e1Xw&U&JORBwO8+GtKbN z5ius=ma4}*Yk|~M$%X?%Xm^M*$dfCHt$(lP@QU=lT0!BGmNO#R37P~R34Rb;P`89L+J=k4Zj$2T5fwyF(6>u6H^ z^=1{Ktd*ie<`CCGyNx2huGz+MYYy9SZ#r)gswy4F)Nvf$e-a8CSijejUI|2fcdeJ& z7X(@n-!9uA?z2%(6?s8Ka@4s`t_lL(rf>gr=~qD7*gs^^tqE*qxY*|8a^y!Pv{6xy zyCvA8O^GVJ(SWYfog(w5CHREWYNW9x%|-KS zA8HGoR*KFl9{Or;dBN?2oQ^Hg@MtH@SLBCf{oape6C@Tpif_>Z?|d`W zn9TZM(APtSOW*FN4Wa`kE_dv-`Q4G{OpVx8L&uRiMS3jA{O3e=_RRdm=7_GO2B~!= z$_+e7-{M1OpT{8Bv!mMd=!!*339n?vRF)-MhP5xvBu8l9)PCfaS_t-&?G6vlOefuI z?YZIh22o`)9OxUjW;}8@BPOs`2vQepG0%x+E3(C~-vS<)!O)9|YTq~FQ(iS|ocwz> zC7_~urX!{gzk??dwMCoy?cr~=i^b*NbLZ&MeaIRmeVnHbk8n)%KZKxcbM|-$J`sccI-n1 z>7(34uSoW+YzpIsC}W61%&Nc_Hap; z)5fFOu~<>I)P0FwRG;|l>a(SoQz_?aD838nS=!MCsp5h}FPbbw8(^?uC$ z3^z#ZW-Lxw#i^be<9T#L9wEew5led}?~dnnu1I6(R9g1EU;pnr{yp!(vFiJ8yklV( z{(9Utq2LoGXzmUA@dMy-qQ_j3J#>?+&ZJogt$J0xs_h!H_U~{-sf?=eDd2Jg1R#HZy_jutP>1yTGD?5R$K)T{ zui2KzhyS+exSp~@{LigoN(%W|alm?m83r~zO+egWjh{tEE&DiuLy3)>*(#{kQtDvx zJ-On2vzN|yFP}%_4ALo}`?L6B0XK+5g{!z zoXC4URXg+P8}F6U#933Pbsy5|oGftz$3uT9K3#Lc#0BDGtUYtEEyll$u4wpEC@$=@ zuzMRKkf=_XXD(P#Ve{2_x}@Y!GG_{5r$G?bi*Gg(Zv!n znT{fx!OEk`h3Df3TuemL(-&1zlqf=trPdN;e~Z?RX?3twuVHsuw4q-)8M(!qJ` zL3x({T|d1g0g%57<(BN8GP?E9>7Z`@8UvOK)xGvvA&0S{xm_>@OW8V6teN&7Ml?^oxsf2Y0f){_vPUBk~tU-ElEw^=QuPAKhaK-E9|6`JR(o%P?$1 zPDObYpWm8X1M2^K9NuLwkz?!pk)dsn;&Q>M0qKA;P0%2HyZJALJNr32Q8@HQn2?&2+ zwwM6+_Q)sVlo*x~?IC$*dZ^;Ij_)qHwFPuxf0-iJsXkw}Z-@J2LE@PmNMA3UEc zwT7F=)p|p*Gi1fFw@t?1hT?|Nb3n}ao3s;=B||YJ%EL0#!9@m%X1QMDy+pn5+D#&( zrJ^z12H5~*y1L^Zj$p3D?XIW1HQ%_s@#HytPgOBgL}k>gs7+|$)xY@ggBy3Rx>86u z|HCQ2*8me7b^W1btIi$abxahRKRqdp-|>8&e{LuVYv7K_(XUoH@T_La;t8ABmb~1D z3mxBK?_Iv`pY`hbced_B@A&w|?EFjjL2qaF@kfO_i@abMA{ujUch3xR5qG6!!S_s5 zChzZ;B?0wqaZSe-T^jfiOOksWCbEsw*}4>F0TmCC7XPp_wOwxzj!CpSXxw9Clj^H3 z5-X(^CabxA$6WX>p2i>*CDM1TbfOAU6-0cU(pMUO4~oSiB^dYXIrti*W;T5=ewG#c`QV(jEQ)5 zn;5xb+;WZ4)0}aGE$MQ%dP(qZJaEz9BzuxAaRPpbO-`-TJ};{_BUyj4(sFo*QLJ!? zn%>kaYl%Q10Lu8h0SRxmy8P6#K|G>=b8Vn~u@b+Yjx=s?6_L1aBw|r4(&bkPb#}3J zZ{8F?dzKQ$4~FI@OS;{|c+S(^{&RXdGA4gqk-Am>cue$H(Qkz6mHO+X&VY9b@}zfx{1cy@^mPOlyHKm!o5A(`%X?=z*6O=Qbn5nbWQ#7jz~DnD_Prs?tS8{1D@r(Y!jMH3uDt==M{GKq%b z`N5^}{qvCdyk??1XbiqUBo!st!_*YP?J$lL?6E37x+iauQZ8uVS*o{)v@-8=1i@N@ ze2yJ6Y7~Af&Vt_z(#d`jL&+gb?qpSFz0W-iMh|n~v&UCFKD&x0k-^zz4xSiBFFE{C zWJsXzwYV=epS5#VvrWjx$?x;cW@-~BzI6k7h%hPzmuZmGh=wM$*NxI{8*(O3rbz(No+>UF?|SWv9*5u*66Em@#j$TrOY?uEG4(A)qSOOos(RkKu^2NLdgE!~ z@xf1dmWup2!>uztZMc%8hpvWEqw|oK+=ZJzUBZBbs1zi@Wy3=dv-K3aHEVQqHNt-d z$36AF9Oxu!V02m<;{GC2@=f0#_{n>naLFoqUKLvDH6>ZgKTM|Q+oOq>lT$JqB@uVj zWqaktD>6{hv9&O#{xYYb_jw zn8j~m>R3W)_DZ~sSOER;H;Z=>IViUYgvxmsw1{p3>Hw{r`+1_} z3=TI@MK$@(-gFI!Rfx@`ChsOWA7zCq%7f${lkJ?tFrHpsl|U_uXBqF0MdzW*&Os)I zqrZ5tt0Ov38DTt-)Io(%TJl2Avd01ufi$p6sMiOVl=eT=8?luHU&@qPn=ef`T^*CM z(_v+k@?efhIETP2lKxW{=#wX(i@g-H_}4*}nl2zyY|Hc%wpWMizR4u$P6k+H+hKKl zQ^p9-tq=GoUontvHbGBeRmFMzx#mA9oT!-LU&^yI%JdI{{Dh3^iSI+lR+lIzcmjV0 z;{uUPu<0YuDukfch`uJf}qYjr5{x+?Lyu9~_%)YkFHsZI&sJ2z(x;V1QUz=Yn`9=H_r~S=YeJv5J zoY^a1bpB^iCmQ!~4Wio|Wb*GATk(zwNV@ zea&cx5?vJJVZ=yIb8dXw->ZTXR3Y5v!rYVbr5YLMoY)>NTD+I9s;e||rbNld3Rktx zuCKxAluDy>*!c^|nzg%mQ*wB(YOQ_RpjQ*O-4AeNjrSyvEoqK1SIx=f%z%o{5V7%+ z(GeBy`8!VkZjK@H9xN!e!g0p}-e;W~&X?Y|VciLPUe8=@*ZvX))+^*e?3H)I_DXOu zyjQvCc=(it3kYlD)#dhL)@(XJ%>5HO_B_zDYv6aJg^t7@PY<*61QH{rWBIS|?Cb9T z1Zx~GapquGmEXH+tQp-1O;I%wzn3y$JKiftE35nY&SXH+fVmnat2-kXx^~#jZb%4` z$e3G|FFunT2s}at4p6r_fFKnwOA0#_WJNIGZnfb_DvxlR-_RuJR4F=0Kgotz;>=gi z?{$uezRFTt=31@agUTey>@bR~bz8SzO_@PaO{O7GetfxP0a#JA%|5^P+kPFNLM0_(8!~X%&WX$Pleasr>PAMayyCB+%);0;H1= zG*w{dY+_r&n?7~8w~UzNUQ6fP0RvM}qP6*{CUqy0CChkBinNWLwWj>+$R7tKPMV;B z+X@d!`0e`wE0HR-_if@?XT#fEUWJ{{NtRFC49FT2z37YVi}l&iJa&OYaySTHDR8y+og zl{2-f#ynKCw)P=z30IMGMuv)7(+}#Aq7m8_3y?2{Hms{-(7es>Zmrdu7rfG>n4Uk? z{lA%7bu&>3`0u~}cHqAq_-_aP|KEY<>J7y_|8iOew$1G_D$+_d&u_8TMr)O&wRGFR z($aDr(Eg^T+~(6VV53!h-F{cv)mvX)oGiY6`nc9qOKTIYRU0g{R$7{`wlJloKx>QT z25YU#&I21uON$Qw`~3e*iw$~%*Up+Wb>LbCPl zWhVZmpjM~nmge~JuI>MA2^fbH`6h^K+YvBJfO}-zF;LA_EearzGk$gMbp}Co#D&y( z8|t^ERk@>;-l-Q;xJ?SFUeS2(Gt$qz*8=PCvs?qhv2K@uw>9(rJw3@ zFa3sr654?2M*`BDc{rBbu)_B`=#>AMOU||P~JLcv!C5w@$y$BjN znwF^5O2bb@lJ6|*g>TI@ng6X|VQu`Kio_~YZB6-_8|+5()?C-_8Bvt9Wkf>Hs!K)v zG=q5HMf(faMzGL$XMA%JhUHG&MQrx0$_d33nYr&9)t`J=0Yu{Oi}(+GEyUgiW{R#I>5l zX0bJ{Ia@a^=5286@aw$XYyu!IZc3Z%=nM{B~uO;Of-$~ zw!Aw{^?`?@sm9!|95_>EGuZIq-&q14X3+)xyW*0sOgH&nbTt?ZrADD~!_Q+Mp9-2H z;TKZ7Q~WJEwf`%%yZB4KxqGQ&WT>uI{CC#`Lx~7Hng!Q$5X<;^RPzovDFr%rKZl)rE8hzF3rnQ&ur3-Oa7%@3FKc9m*{YP{*wt!TO7B z8$~M#|Gw?FUl6IwJm;C3e>+qq94$CeiFd7h-`g+ku9^ucMr51m+1FBtf#pjZrPIGD zK?~L%KuF}aXho4LM1Y-ZArj5~nrYuA*h_07_uvQC7N}#$*eg{(OIX4Wh6=i&gXd&) zbe9@~Z#e&*HA6Roc7Jj^1?_n|2n5={Pd(uZLW{|&xRC?3JIw6%K&0@Sq|ttibQ zy>De;sYLw-jPesgUupO@z0;p8A$1a%A8IxBaN}dGc5-R_!Gk6Pb}Vj9@0aO-TQr_`*vqmkXgyJQXA6OP#bo-9}eiF;ZReZW|UqI9_1ZnwO{8_8m{ zWrl*3L(S4JYPgYN6n!n&}zHyBw12fx=Wjqq*bDQBeW=_@Vw8oP~3Kl$l)KUq9UCb z`;1{jLvG$?dlkb$VU=_7v@9TWTjjd|(c;bRY1oCC%B5S$- z7yRqMWvXHAF&tUvuBUrPVA^V4IFHP7UBd7?F$MbV1FF?-{p6jLWuEmuPl*Iveg%>J zUg+fhKUtM$-I=~?cj`hyWX$89;arcOK6KcfKWeb%uLSe`?cYc{4nIKDUntA-PujP9n!131pPn=$VSp%*s+7`8ClFD80-cwnc5r$R2uazrED79t*oq1Z3IgbTLvpzk(DYy|MpfYN1Z`HP@SsyJsHJ zVZ(QLbKOwX8B!*gOWkzs`6ta(u{)DXsoBG#Z8>?S^NZQKT!(;vK>57{(r?yCXEYau z4#~k2&8j8pg(pDlw-8CraKKp}8xgW*#f{{1Zc@+HCwiYtY>D;9F@lYf)twpvAOqRA#I) z#h0-rsZGt5eVl;t6ubz`a$eq%83rz+I7u;FVS6%CGsRL2&_Y;-oF`|g%98Kb!MHsO zkaB;67z@PNip(0pGug}Kf36KiSbPdfE9_yUw z6v_{WExK=0^~5xZn4snRDDg8H{6yPgwK)UJZ={FJiFCNS8t!Y5&j!QV4Y^2<^vBP}SYO0uH z)ps-R?DCTUSzhWd(L#}geA>5-UPLhECoz9~?vTv)+=HRWF&%{Uwx8P&4R@|Z>PQKA zpsTD3m@P03BSX#g=pAWjLCGUh1ME~jxp8b>H{MW5L3Z9r(xP)m6P8DT)e(5`}tx z9G3t2-m$a+;*bSL_L=djYi|&Qf_hF~5~|-nv$hKsiEdR<=qXE`zf)`G>GqTlG_B3t z+xiwa7e*<=1`JWIM4;ZA(h|jRDtVcn%Z@8KZAGDdrLj$il(=yF{mvYY_^n5`Nw-k$=byRq5 zRZMfL8L`be8IW>&Q`wp~kNl`1Rv+K4Q(Op{#w(2+{52jU>IK6->bB!7iZg%7s!2tq z#NJq#=JGy-aK2()@+?SD9D?jnAnsP9J_RFDA%-XV?3k9oJ;gVv@nwJFcJ-JyC7bWb zRPsmoiORi3+?4#g_FHD=u+o%4mKKHf-I>Srl4-0aAF#$AVtfUv>FQs`&UUFQz+8f+ zt`SoA=FZOmKZI<{7SCPLA9b-wq$~%cAqBzw9$(%^8aUSufn0mPg|)2@hw{1R1SNy0 zFNPqsT0DhyDW;>#;>0-kjtEKKfX$+Y1Ebd>OvToqIku(o>y@dh>yYOo?zb|NK4mVR-YAGWsGRc> z&9v%HC6SoZR}(5)pZ*hsHDNhKO0h%{wr$n-9fx_ZJoBTRX$5>rYK~^5fmu#l8oF>D zu4jK5=u+^EGX;!EWD0o-ydYoQc;fogSuHvDtr}mMOU!uI=XQ*pis41ez~jv2HP ze|D`Hh=F7(>6fDzWv_LBqfB*i%RaLntsd{O<#tbZEbZyjM?dP8W3fL}x2>GsoNalj z)~!>}P<|69+649ZAxdOn=2@7_=Dm(Q6f~L$N?B*WpxcKIb2`d73ok|KLSqNACD6+( z)aQOZQP$ta(n3FWCHE%dU44p@LCVU7y zS2Q0C81CrzaNLuLY@Nikv=RAv)YCTHYB&O!HNxyg|I3((3U_N~BbJjZYF0XCBP0#; zUr+Tv2(*c?tS~(b>dEY+=x;A_XnY{_UL1Buq8ebwJ{%RE)qIeeBqQpqBB467ZfY1} zq)uZ`$ zNi-_3dz{PYxYeIO&Qeb4d{u5Zyubjc6}rVCce%bhJBC;@af-DEc7w}vFgveiSm^hX zL{q$|nl55FrPBB#SDw{Z!QNJw(PbX34k#Hh2x7(sR*@kMuf!osnj!|Jqu$S~rSlqF z@Q8|ou}d0@mfBB(`GM=Ovb6rUt#)vcxogVLEanoWM%(YYH@A_wY|ZYh6{Q<=kg*n~ zBfD11v4c{DN@Hwy$IqmS*wt{wz$jT|7cudCJ^0scQ5{r}Ncixd(~e|&O>#G1s0WxI z3tJugWz$A(Zgr1ytHSWiGR33Rb|G~a`nze5d%>=LEwnkHaTwGj*oHcUv17N3Hw+tv zQyVUb;_?7OQ5SZfxNLcZ1u9t08+aa+9$~9W*T1<Beq{X@qGsDhgTwZ|&geL!sd zwp(8f0t`GEad?*dmsE4vsCN5%1#1H)Lx-suHY+n@$>+b>yqSWRT&5&{OSvzVg78o= z!DBAaFb%Q31NV=w{zA2qCW(eo{LdG-0p$rYrffYC|RM;$y1b;$SSqh9EbjZb%_}> zeK6V4FBjZsA}`~Q)s_zNdJxA-bKC5D`n>^jBPKP82_V-6W}3s(ua2EAv#ogrf<4lA zBrR=3k2rnCV}XArUMMqh>WJp=T-Dy7G7t%e#{se?^t_i;{fmpHtOC!M5HB>BZ*Y;nDPDvJoWJvIk3;D@xH}i5*&FDDs&6?Dy?ND0WyJKX z+OE~ESF_;*?3T7%&qRwaJX5H>zGIF<6x5Egq|I3aZk|IC6@EK=&)XAgm9Wz_&Soo8cj=<@ z2z?b|d*x-!FlelSj9GM0@rwxn!8(U*RlNZcj;x(F)iR(T-oHd;#*(wzNmE$3_{Dw) zdtIEy)f2VWwm2*oBKq~#`NX-GHO}32^AoDuTfrY8^NF?^(0Ch>&P;;OjsN!Gyjt|Q zVR&-}o2g(-m6r~WS9|L)2^6-H;8@p_Yb>72aOZ^W504Jl$)Lao3$3<=ZkfQDMca z21;8GFpCH~*=Ese zCT(G3nONU0czrqkX)jSd>BPksp|r5G01vcA@OMjP{(qxNqmBRfIlupW<9~MGKRfWB z9r)inaM!h!s0J_<)c|8#|7Mx2DhLF|!Qt;rlAp$ZM~UTs>>_884DVC#F%U|&%8h}iULRWB z9jz<;q)WI4`CA@$9`+9=qc9ypCQ~P@Qi1bpNcgcY(GAQsYC)J;d#SF`J^=&h?}UU6 zG@>AUls_LZsRot-Olp>by)M(vgONUb{CVn-&nKokiZFa+lAR{dH%74IAH)&JJ>&YV zv>V@Z=Xmt>F{eDS9dtrdF^Lx=ja?TuQ6!w6R^wt6TEw=hd;|8VPiQsgE#RS|T)`Zh z=%abkGyi-??ANu43ea#&J{-679g7HzlFeM+$$?=SY2X1*!95Kp?s72X+*(f!KB(^RfbgqR;1-@9>2QdMFDBQyB z)nni93ne-}|aJ>c$El`sCQrES=Cd;9IRfvRCQt z!dR1dqS+6T_~rZvhxp?ls36xKi3bYF{z=x`1}9plS=A1$t;Azh>iu`Ex&jQa_(@+V zPk}swGypHwb(m4V+D#l&Gjpi7`Vvz3zO;6--f@m8dZehzCCl1h#X7+oSMJJJ&kaLY z`~sqDZ!g%DaJ@x^ihCs+WhE$s|Kg#J(wI_#VOEMkQpm<~?^(|`|1P4PA}mPo?TKG} zj=CD~uTVjCCwqVFMNQrCNS5;>vR&@7nIgD!b8GSM?CRTm1>}Z?`wFq;3v({~S?UGqD|R1T5HlaQ zu`1TD0?q_h5pwswws$Y2C3tOUt?PO`_ura4cRy)Fcv)SvTJ*zpdZAwYvBeHNrm><*c$Js14_l5m>_0*)79MZ)rO{PpWuSg@}l{v2QOAAP%NSqt?+PV z1#`dTZkghO$0R0z4zeeT>veiah87=>zbnlL1v$s5ysVlY&LhsORyRDsDaRQ#KWTb5 z3WO;JGPNbLQIjs_0~3UKELhEcACH6!?r*){!1hX_jhhNm582(ZN9UPsxtcbM@2BoC9Y~yK^oz2ksv4YNz+&r@Z&+85)QpUTr@5{dqazu}8~M1K-Jq?N@)fS8bGH#JO>cR~-o=17q%Q^zWxUrIEt>#s zV1KcL=tk$Avl9Of;vR7edKwN6av+qHBlTbNsr)Y#g6N(G_A7_U7G|zE875HN3KKs;&-$*nzb5_U}$;~baevB zEBZ5*jfw81v6;yHsV?gmC-rwkBb}2PpZJ?o0Zj77%ga?M5LHTqcNDyw^3+GIJxU`m zE_pRYW16<#N0uafLsiYcXs!G$^IBH5c!E4DpLNT4W9#&`r|1te*zK#Cyo94X;`q-# z&q6A0)})x;IuuIi=Fl}SuYb;%%f9s;e`%R(2uY}$1CJlti60STeR;dvss-pwW%e+N z&bYI%gvd)jH!u5?^aJ&^an=UI?6Fkk*Gv=qsR-?bv4QSkZwMttDyHQYEgSoNP)biy zm(XUHo(d#KBkF9N@wn4PD~MV=3T^M~9~+M0;bsrGGVJpt&a1Y>@XG~n10>v_)t%ja zu~u@6UA5ZFQGm5%vU@-MVb<<+K_y-!`|9<6hlqjQ*u9?2l*?$dAPYcvjrHT7XtBPmvfq@WomRS?3EY zcCGR+HyemxKRQnKn&3&gX!Y&9Qbc~lcp>g-&ae{q?2X*Y@<@rYkyyPV1T9O4o@d?1 z#h`*q8R6l-PD3OVJ16Ur zG}-YjauJ~$Mf_8qs7OyR2IWb_g6Tx+vL^VpQ0>Or=NBv~NOdBL;@iR9NNq0?F837a zvG-URkEElptm2~HR{h-Hw2x@#(rbkwW)2}J zK)lg)zkkProrR9tuwv1hzU;FI>w0-&6fE2I*ILV2lqi6iEP4I>4h9LVy>L%M4xk8* zB#CWuIGRmAUV!PU+6wb>=d=C91O%;+B#bTtBPCp#WQ%W*3<-Y@!vp=F_4m z5p0tRnf*w=B14?5CW?@tz`X0jN;!M&LZt3pFYqFq-ZITwUKn#}v diff --git a/module4-web-application-deployment/web_app/__init__.py b/module4-web-application-deployment/web_app/__init__.py new file mode 100644 index 00000000..6d233d93 --- /dev/null +++ b/module4-web-application-deployment/web_app/__init__.py @@ -0,0 +1,29 @@ +from flask import Flask + +from web_app.routes.home_routes import home_routes +from web_app.routes.book_routes import book_routes +from web_app.routes.user_routes import user_routes +from web_app.routes.twitter_routes import twitter_routes +from web_app.models import db, migrate + + +DATABASE_URI = "sqlite:///test_db.db" + + +def create_app(): + app = Flask(__name__) + + app.config["SQLALCHEMY_DATABASE_URI"] = DATABASE_URI + db.init_app(app) + migrate.init_app(app, db) + + # app.register_blueprint(home_routes) + # app.register_blueprint(book_routes) + app.register_blueprint(user_routes) + app.register_blueprint(twitter_routes) + return app + + +if __name__ == "__main__": + my_app = create_app() + my_app.run(debug=True) \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/iris_classifier.py b/module4-web-application-deployment/web_app/iris_classifier.py new file mode 100644 index 00000000..e42ac9bb --- /dev/null +++ b/module4-web-application-deployment/web_app/iris_classifier.py @@ -0,0 +1,43 @@ +import os +import pickle + +from sklearn.datasets import load_iris +from sklearn.linear_model import LogisticRegression # for example + +MODEL_FILEPATH = os.path.join(os.path.dirname(__file__), "..", "models", "latest_model.pkl") + + +def train_and_save_model(): + print("TRAINING THE MODEL...") + X, y = load_iris(return_X_y=True) + #print(type(X), X.shape) #> (150, 4) + #print(type(y), y.shape) #> (150,) + classifier = LogisticRegression() # for example + classifier.fit(X, y) + + print("SAVING THE MODEL...") + with open(MODEL_FILEPATH, "wb") as model_file: + pickle.dump(classifier, model_file) + + return classifier + + +def load_model(): + print("LOADING THE MODEL...") + with open(MODEL_FILEPATH, "rb") as model_file: + saved_model = pickle.load(model_file) + return saved_model + +if __name__ == "__main__": + + train_and_save_model() + + clf = load_model() + print("CLASSIFIER:", clf) + + X, y = load_iris(return_X_y=True) # just to have some data to use when predicting + inputs = X[:2, :] + print(type(inputs), inputs) + + result = clf.predict(inputs) + print("RESULT:", result) \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/models.py b/module4-web-application-deployment/web_app/models.py new file mode 100644 index 00000000..93c93ee4 --- /dev/null +++ b/module4-web-application-deployment/web_app/models.py @@ -0,0 +1,44 @@ + + +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate + + +db = SQLAlchemy() + +migrate = Migrate() + + +class Book(db.Model): + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(128)) + author_id = db.Column(db.String(128)) + + +# class User(db.Model): +# # __table_name__ = "user" +# id = db.Column(db.Integer, primary_key=True) +# username = db.Column(db.String(128)) + + +# class Tweet(db.Model): +# id = db.Column(db.Integer, primary_key=True) +# user_id = db.Column(db.Integer, db.ForeignKey("user.id")) +# text = db.Column(db.String(500)) + + +class User(db.Model): + id = db.Column(db.BigInteger, primary_key=True) + screen_name = db.Column(db.String(128), nullable=False) + name = db.Column(db.String) + location = db.Column(db.String) + followers_count = db.Column(db.Integer) + #latest_tweet_id = db.Column(db.BigInteger) + + +class Tweet(db.Model): + id = db.Column(db.BigInteger, primary_key=True) + user_id = db.Column(db.BigInteger, db.ForeignKey("user.id")) + full_text = db.Column(db.String(500)) + embedding = db.Column(db.PickleType) + user = db.relationship("User", backref=db.backref("tweets", lazy=True)) diff --git a/module4-web-application-deployment/web_app/routes/book_routes.py b/module4-web-application-deployment/web_app/routes/book_routes.py new file mode 100644 index 00000000..5f645447 --- /dev/null +++ b/module4-web-application-deployment/web_app/routes/book_routes.py @@ -0,0 +1,33 @@ + +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import Book, db + +book_routes = Blueprint("book_routes", __name__) + + +@book_routes.route("/books.json") +def list_books_json(): + book_records = Book.query.all() + return jsonify(book_records) + + +@book_routes.route("/books") +def list_books(): + book_records = Book.query.all() + return render_template("books.html", message="Here's some books", books=book_records) + + +@book_routes.route("/books/new") +def new_book(): + return render_template("new_book.html") + + +@book_routes.route("/books/create", methods=["POST"]) +def create_book(): + print("FORM DATA:", dict(request.form)) + new_book = Book(title=request.form["book_title"], author_id=request.form["author_name"]) + + db.session.add(new_book) + db.session.commit() + return redirect(f"/books") \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/routes/home_routes.py b/module4-web-application-deployment/web_app/routes/home_routes.py new file mode 100644 index 00000000..e8cee3bd --- /dev/null +++ b/module4-web-application-deployment/web_app/routes/home_routes.py @@ -0,0 +1,14 @@ +from flask import Blueprint + +home_routes = Blueprint("home_routes", __name__) + + +@home_routes.route("/") +def index(): + x = 2 + 2 + return f"Hello World {x}" + + +@home_routes.route("/about") +def about(): + return "about me" \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/routes/stats_routes.py b/module4-web-application-deployment/web_app/routes/stats_routes.py new file mode 100644 index 00000000..bf3134d7 --- /dev/null +++ b/module4-web-application-deployment/web_app/routes/stats_routes.py @@ -0,0 +1,64 @@ +# web_app/routes/stats_routes.py + +from flask import Blueprint, request, jsonify, render_template + +# from sklearn.linear_model import LogisticRegression # for example + +# from web_app.models import User, Tweet +# from web_app.services.basilica_service import basilica_api_client + +stats_routes = Blueprint("stats_routes", __name__) + +@stats_routes.route("/predict", methods=["POST"]) +def predict(): + print("PREDICT ROUTE...") + print("FORM DATA:", dict(request.form)) + #> {'screen_name_a': 'elonmusk', 'screen_name_b': 's2t2', 'tweet_text': 'Example tweet text here'} + screen_name_a = request.form["screen_name_a"] + screen_name_b = request.form["screen_name_b"] + tweet_text = request.form["tweet_text"] + + # print("-----------------") + # print("FETCHING TWEETS FROM THE DATABASE...") + # # todo: wrap in a try block in case the user's don't exist in the database + # user_a = User.query.filter(User.screen_name == screen_name_a).one() + # user_b = User.query.filter(User.screen_name == screen_name_b).one() + # user_a_tweets = user_a.tweets + # user_b_tweets = user_b.tweets + # #user_a_embeddings = [tweet.embedding for tweet in user_a_tweets] + # #user_b_embeddings = [tweet.embedding for tweet in user_b_tweets] + # print("USER A", user_a.screen_name, len(user_a.tweets)) + # print("USER B", user_b.screen_name, len(user_b.tweets)) + + # print("-----------------") + # print("TRAINING THE MODEL...") + # embeddings = [] + # labels = [] + # for tweet in user_a_tweets: + # labels.append(user_a.screen_name) + # embeddings.append(tweet.embedding) + + # for tweet in user_b_tweets: + # labels.append(user_b.screen_name) + # embeddings.append(tweet.embedding) + + # classifier = LogisticRegression() # for example + # classifier.fit(embeddings, labels) + + # print("-----------------") + # print("MAKING A PREDICTION...") + # #result_a = classifier.predict([user_a_tweets[0].embedding]) + # #result_b = classifier.predict([user_b_tweets[0].embedding]) + + # basilica_api = basilica_api_client() + # example_embedding = basilica_api.embed_sentence(tweet_text) + # result = classifier.predict([example_embedding]) + # #breakpoint() + + # #return jsonify({"message": "RESULTS", "most_likely": result[0]}) + # return render_template("results.html", + screen_name_a=screen_name_a, + screen_name_b=screen_name_b, + tweet_text=tweet_text, + # screen_name_most_likely= result[0] + ) \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/routes/twitter_routes.py b/module4-web-application-deployment/web_app/routes/twitter_routes.py new file mode 100644 index 00000000..d5baa0b3 --- /dev/null +++ b/module4-web-application-deployment/web_app/routes/twitter_routes.py @@ -0,0 +1,50 @@ +from flask import Blueprint, render_template, jsonify +from web_app.services.twitter_service import twitter_api +from web_app.services.basilica_service import basilica_api_client +from web_app.models import User, Tweet, db +from pdb import set_trace as st + +twitter_routes = Blueprint("twitter_routes", __name__) + + +@twitter_routes.route("/users//") +def get_user(screen_name=None): + print(screen_name) + api = twitter_api() + user = api.get_user(screen_name) + statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False) + # return jsonify({"user": user._json, "tweets": [s._json for s in statuses]}) + + db_user = User.query.get(user.id) or User(id=user.id) + db_user.screen_name = user.screen_name + db_user.name = user.name + db_user.location = user.location + db_user.followers_count = user.followers_count + db.session.add(db_user) + db.session.commit() + #breakpoint() + + all_tweet_texts = [status.full_text for status in statuses] + # st() + basilica_connection = basilica_api_client() + embeddings = list(basilica_connection.embed_sentences(sentences=all_tweet_texts, model="twitter")) + print("NUMBER OF EMBEDDINGS", len(embeddings)) + # TODO: explore using the zip() function maybe... + counter = 0 + for status in statuses: + print(status.full_text) + print("----") + #print(dir(status)) + # get existing tweet from the db or initialize a new one: + db_tweet = Tweet.query.get(status.id) or Tweet(id=status.id) + db_tweet.user_id = status.author.id # or db_user.id + db_tweet.full_text = status.full_text + #embedding = basilica_client.embed_sentence(status.full_text, model="twitter") # todo: prefer to make a single request to basilica with all the tweet texts, instead of a request per tweet + embedding = embeddings[counter] + print(len(embedding)) + db_tweet.embedding = embedding + db.session.add(db_tweet) + counter+=1 + db.session.commit() + #breakpoint() + return "OK" diff --git a/module4-web-application-deployment/web_app/routes/user_routes.py b/module4-web-application-deployment/web_app/routes/user_routes.py new file mode 100644 index 00000000..014f0435 --- /dev/null +++ b/module4-web-application-deployment/web_app/routes/user_routes.py @@ -0,0 +1,54 @@ + +from flask import Blueprint, jsonify, request, render_template, redirect, flash +from pdb import set_trace as st +from web_app.models import Tweet, User, db +from sqlalchemy.orm import joinedload + + +user_routes = Blueprint("user_routes", __name__) + + +@user_routes.route("/") +def index(): + return redirect("/users/") + + +@user_routes.route("/users/") +def list_users(): + user_records = User.query.all() + return render_template("users.html", users=user_records) + + +# @user_routes.route("/users//") +# def list_user_tweets(username=None): +# user = User.query.filter_by(username=username).first() +# user_id = user.id +# user_tweets = Tweet.query.filter_by(user_id=user_id).all() +# # st() +# return render_template("user_tweets.html", username=username, user_tweets=user_tweets) + + +# @user_routes.route("/users//new_tweet", methods=["POST"]) +# def user_create_new_tweet(username=None): +# user = User.query.filter_by(username=username).first() +# # st() +# user_id = user.id +# new_tweet = Tweet(user_id=user_id, text=request.form["tweet_text"]) +# db.session.add(new_tweet) +# db.session.commit() +# return redirect(f"/users/{username}/") + + +@user_routes.route("/users/new/") +def new_user(): + return render_template("new_user.html") + + +@user_routes.route("/users/create", methods=["POST"]) +def create_user(): + new_user = User(screen_name=request.form["username"]) + print("FORM DATA:", dict(request.form)) + db.session.add(new_user) + db.session.commit() + # flash("asdf") + return redirect("/users") diff --git a/module4-web-application-deployment/web_app/services/basilica_service.py b/module4-web-application-deployment/web_app/services/basilica_service.py new file mode 100644 index 00000000..ad22e155 --- /dev/null +++ b/module4-web-application-deployment/web_app/services/basilica_service.py @@ -0,0 +1,26 @@ + +from basilica import Connection +from pdb import set_trace as st +import os +from dotenv import load_dotenv + +load_dotenv() +BASILICA_API_KEY = os.getenv("BASILICA_API_KEY", default="oops") + +# sentences = [ +# "This is a sentence!", +# "This is a similar sentence!", +# "I don't think this sentence is very similar at all...", +# ] +# x = 12 +# connection = Connection(BASILICA_API_KEY) + + +def basilica_api_client(): + connection = Connection(BASILICA_API_KEY) + print(type(connection)) #> + return connection +# embeddings = list(connection.embed_sentences(sentences)) +# # embeddings = list(c.embed_sentence(sentence)) for one sentence +# print(embeddings) +# # st() \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/services/twitter_service.py b/module4-web-application-deployment/web_app/services/twitter_service.py new file mode 100644 index 00000000..0a7df01d --- /dev/null +++ b/module4-web-application-deployment/web_app/services/twitter_service.py @@ -0,0 +1,29 @@ +import tweepy +import os +from dotenv import load_dotenv + +load_dotenv() + +TWITTER_API_KEY = os.getenv("TWITTER_API_KEY") +TWITTER_API_SECRET = os.getenv("TWITTER_API_SECRET") +TWITTER_ACCESS_TOKEN = os.getenv("TWITTER_ACCESS_TOKEN") +TWITTER_ACCESS_TOKEN_SECRET = os.getenv("TWITTER_ACCESS_TOKEN_SECRET") + + +def twitter_api(): + auth = tweepy.OAuthHandler(TWITTER_API_KEY, TWITTER_API_SECRET) + auth.set_access_token(TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_TOKEN_SECRET) + print("AUTH", auth) + api = tweepy.API(auth) + print("API", api) + #print(dir(api)) + return api + + +if __name__ == "__main__": + api = twitter_api() + user = api.get_user("elonmusk") + print("USER", user) + print(user.screen_name) + print(user.name) + print(user.followers_count) \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/templates/books.html b/module4-web-application-deployment/web_app/templates/books.html new file mode 100644 index 00000000..d6737885 --- /dev/null +++ b/module4-web-application-deployment/web_app/templates/books.html @@ -0,0 +1,24 @@ + + + + + + Document + + + + {% if books %} +
    + {% for book in books %} +

    +

  • {{ book.title }}
  • +

    + {% endfor %} +
+ {% else %} +

no books!

+ {% endif %} + + + + \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/templates/new_book.html b/module4-web-application-deployment/web_app/templates/new_book.html new file mode 100644 index 00000000..04f7cd98 --- /dev/null +++ b/module4-web-application-deployment/web_app/templates/new_book.html @@ -0,0 +1,24 @@ + + + + + + Document + + +

New Book message

+

fill this form

+
+ + + + + + +
+ + \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/templates/new_user.html b/module4-web-application-deployment/web_app/templates/new_user.html new file mode 100644 index 00000000..8df26f44 --- /dev/null +++ b/module4-web-application-deployment/web_app/templates/new_user.html @@ -0,0 +1,18 @@ + + + + + + Document + + +

New user

+

fill this form

+
+ + + + +
+ + \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/templates/user_tweets.html b/module4-web-application-deployment/web_app/templates/user_tweets.html new file mode 100644 index 00000000..7d566366 --- /dev/null +++ b/module4-web-application-deployment/web_app/templates/user_tweets.html @@ -0,0 +1,31 @@ + + + + + + Document + + +

{{ username }} tweets:

+ {% if user_tweets %} +
    + {% for tweets in user_tweets %} +

    +

  • {{ tweets.text }}
  • +

    + {% endfor %} +
+ {% else %} +

no tweets!

+ {% endif %} +

Create tweet

+
+ + + + +
+
users list + + + \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/templates/users.html b/module4-web-application-deployment/web_app/templates/users.html new file mode 100644 index 00000000..78b89975 --- /dev/null +++ b/module4-web-application-deployment/web_app/templates/users.html @@ -0,0 +1,25 @@ + + + + + + Document + + + + {% if users %} + + {% else %} +

no users!

+ {% endif %} + create new users + + + + \ No newline at end of file diff --git a/module4-web-application-deployment/web_app/test_db.db b/module4-web-application-deployment/web_app/test_db.db new file mode 100644 index 0000000000000000000000000000000000000000..a23e4d7eb922a99a361305d1d580f7a1860307dd GIT binary patch literal 163840 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