From 1bace5ee93d61df956a26ff013390404002975a2 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Fri, 1 Nov 2024 15:01:22 -0400 Subject: [PATCH 001/262] ReadMe setup --- README.md | 200 ++++++++---------------------------------------------- 1 file changed, 27 insertions(+), 173 deletions(-) diff --git a/README.md b/README.md index 8c4770018..556310417 100644 --- a/README.md +++ b/README.md @@ -1,181 +1,35 @@ -# Lab 5: Logout +# CSC 207 Project: Spotify Recommendation and Companion App -## Preamble +## Software Specification +The software is a dashboard from the extension of a user’s Spotify account. +This dashboard is a program that should visualize user listening patterns, +suggest new or related songs for their preferences, search songs by certain +lyrics and keywords that the user gives, and find users with similar preferences. +It is going to be a general extension to the overall Spotify experience. +
+
+The APIs we will use are Spotify (to access user data) and OpenAI (to interpret data and recommend songs) -In the current homework, you added code to the login use case to save the currently-logged-in -user by saving the user in the Data Access Layer. You also added a unit test for this. +## Authors +Yanki Cer -> yankicer
+Dimitrios Gkiokmema -> DimitriosGkiokmema
+Quinn Reynolds -> Reyno256
+Ksenia Tkaczyk -> KseniaTk
+Yicheng (Ethan) Wang -> jcal13 -In this lab, you will complete a logout use case as a team. You will also begin to discuss your project -and the use cases that need to be implemented. +## Phase 1 Project Blueprint +We made six initial user stories; one for each of us to work on independently, and one to collaborate on as a team. +John wants to sign in to / log out of the app (Team) -We have created all the Clean Architecture classes necessary for the logout use case. +* John wants to get song recommendations based on his music preferences. He can click the “For You” button to get a +list of recommendations based on his preferences. (Dimitrios) -By Friday, your team will submit: -- your completed lab code [for credit] -- a draft of your project blueprint proposal. [required, but not for credit] +* John wants to search songs by lyrics and artist. John can enter the artist's name and lyric keywords to find all +songs by that artist that have those lyrics. (Quinn) -# Phase 2 [for credit] -_(recall, Phase 1 was your solo task of adding the storage of the currently-logged-in user)_ +* John wants to see some songs based on a given keyword. John can enter the keyword into a search text box and get +suggestions. (Ethan) -## Task 0: Fork this repo on GitHub -**To get started, one team member should fork this repo on GitHub and share it with the team. -All of you should then clone it.** +* John wants to see what his top tracks are. (Yanki) -* * * - -Suggested logistics: One of you should invite the others to collaborate on their fork of the -original repo on GitHub. You can do this in your repo on GitHub under `Settings -> Collaborators`. -This will allow you to push branches to a common repo and then use pull requests to contribute -your code and review. To prevent others from pushing directly to the main branch, -we recommend you set branch protection rules on GitHub. Below are how the settings might look if you -add branch protection rules: - -![image of branch protection rules for main with the -requirement of two approvers to merge in pull requests. -](images/branch_protection_rules.png) - -* * * - -Open the project in IntelliJ and make sure you can successfully run `app/Main.java`. -Note: you may need to set the Project SDK in the `Project Structure...` menu, and possibly -also manually link the Maven project, as you did in Phase 1. - -## Task 1: Understanding the Program - -You may notice that we have refactored the CA engine code _slightly_ since Phase 1, but the -way we build the engine is drastically different: we have switched from using Factories to -using the Builder design pattern, which we'll be discussing in lecture soon. - -Open up `app.Main` and read it as a team. -- What are the Views and what are the current Use Cases? -- Which Uses Cases are triggered from each View? -- Which version of the DAO is `app.Main` using? - -The major change since Phase 1 is that we have added the `app.AppBuilder` class which makes -it easier to understand how our CA engine is being constructed — it also makes `app.Main` nice and concise! -- Why do all those `addX` methods end in `return this;`? - -Run the program and make sure the signup and login Use Cases work. - -Currently, you'll notice that the "Log Out" button still doesn't actually log you out. It's time to fix -that button, which is part of the `LoggedInView`. -We have created all the classes for you, but some of the code is missing. -As a team, your task is to fill in the missing code so that the Logout Use Case is implemented. -**The next part of the readme describes how your team will do this.** - -* * * - -**Your team will know when you are done when:** - -- Clicking the "Log Out" button takes the user back to the Login View when you use the program. -- The provided `LogoutInteractorTest` test passes. - -The "Log Out" button is an instance variable in class `LoggedInVew`. Go find it. -Also look at the `interface_adapter.change_password.LoggedInViewModel`, which contains any -data showing on the `LoggedInVew`. - -* * * - -## Task 2: Dividing up the work - -There are `TODO` comments left in the files -Recall that you can use the TODO tool window to conveniently pull up a complete list. - -Once the TODOs are all complete, the "Log Out" button _should_ work! - -As a team, split up the TODOs (see below) between the members of your team. - -There are TODOs in seven of the files. -Make sure each member has at least one TODO which they will be responsible for completing. -If your team prefers to work in pairs, that is fine too. Your individual branches -will not be graded for this — only the final, working version. - -The TODOs are summarized below (by file) to help your team decide how to split them up: - -* * * - -- `Main.java` - - - [ ] TODO: add the Logout Use Case to the app using the appBuilder - -* * * - -- `LoggedInView.java` (tip: refer to the other views for similar code) - - - [ ] TODO: save the logout controller in the instance variable. - - [ ] TODO: execute the logout use case through the Controller - -* * * - -- `LogoutController.java` (tip: refer to the other controllers for similar code) - - - [ ] TODO: Save the interactor in the instance variable. - - [ ] TODO: run the use case interactor for the logout use case - -* * * - -- `LogoutInputData.java` (should be done with the LogoutInteractor TODOs below) - - - [ ] TODO: save the current username in an instance variable and add a getter. - -- `LogoutInteractor.java` (tip: refer to `ChangePasswordInteractor.java` for similar code) - - - [ ] TODO: save the DAO and Presenter in the instance variables. - - [ ] TODO: implement the logic of the Logout Use Case - -* * * - -- `LogoutOutputData.java` - - - [ ] TODO: save the parameters in the instance variables. - -* * * - -- `LogoutPresenter.java` (tip: refer to `SignupPresenter.java` for similar code) - - - [ ] TODO: assign to the three instance variables. - - [ ] TODO: have prepareSuccessView update the LoggedInState - - [ ] TODO: have prepareSuccessView update the LoginState - -* * * - -1. Make a branch named the first part of your UofT email address, everything before the `@`. -For example, if your email address is `paul.gries@mail.utoronto.ca`, then the branch name would -be `paul.gries`. - -Make sure you switch to the new branch. - -In the terminal, this would look like below, but replaced with your own information: -``` -git branch paul.gries -git switch paul.gries -``` - -2. Complete your assigned TODOs and make a pull request on GitHub. In your pull request, - briefly describe what your TODOs were and how you implemented them. If you aren't sure - about part of it, include this in your pull request so everyone knows what to look - for when reviewing — or you can of course discuss with your team before making your - pull request since you are physically working in the same space. - - **Important: don't push any changes to the `.idea` folder, as that - may cause issues for your other teammates, as some files contain - configurations specific to your individual IntelliJ projects.** - -3. Review each other's pull requests to ensure each TODO is correctly implemented and that - there are no Checkstyle issues in the files that were modified. - -4. Once all TODOs are completed, your team should debug as needed to ensure the - correctness of the code. Setting a breakpoint where the log-out use case - interactor starts its work will likely be a great place to start when debugging. - -And that's it; you now have a working Logout Use Case! Instructions for -how to submit your work on MarkUs will be posted later. - -Your team should spend the rest of the lab working on your project blueprint. - -* * * - -# Project Blueprint - -See Quercus for details about the project blueprint! By the end of the week, -the goal is for your team to have a fully drafted blueprint so that your team -will be ready to get started on your project after Reading Week. +* John wants to find other individuals that have a similar music preference. (Ksenia) \ No newline at end of file From 518a818f35fb8b6a7b8cbe44c22257df4b26c769 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Mon, 4 Nov 2024 13:04:54 -0500 Subject: [PATCH 002/262] Description of our project in the README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 556310417..c5a71f9cc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # CSC 207 Project: Spotify Recommendation and Companion App ## Software Specification -The software is a dashboard from the extension of a user’s Spotify account. -This dashboard is a program that should visualize user listening patterns, +The software will be made through Java Swing and act as an extension of a user’s Spotify account. +This program that will visualize user listening patterns, suggest new or related songs for their preferences, search songs by certain lyrics and keywords that the user gives, and find users with similar preferences. It is going to be a general extension to the overall Spotify experience. From 6b9ad38728da40ff1b3591e9c2eadd72229569c0 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Mon, 4 Nov 2024 13:28:45 -0500 Subject: [PATCH 003/262] Fixing small mistake in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c5a71f9cc..3269c2a09 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,11 @@ Yanki Cer -> yankicer
Dimitrios Gkiokmema -> DimitriosGkiokmema
Quinn Reynolds -> Reyno256
Ksenia Tkaczyk -> KseniaTk
-Yicheng (Ethan) Wang -> jcal13 +Yicheng (Ethan) Wang -> eulogizee ## Phase 1 Project Blueprint We made six initial user stories; one for each of us to work on independently, and one to collaborate on as a team. -John wants to sign in to / log out of the app (Team) +* John wants to sign in to / log out of the app (Team) * John wants to get song recommendations based on his music preferences. He can click the “For You” button to get a list of recommendations based on his preferences. (Dimitrios) From 0793e5f0526d8cdd094c5ed6c8c62b79ad0e44f4 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Thu, 7 Nov 2024 11:47:47 -0500 Subject: [PATCH 004/262] Added wireframe to README.md --- README.md | 5 ++++- images/CSC207 Project Wireframe.png | Bin 0 -> 209076 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 images/CSC207 Project Wireframe.png diff --git a/README.md b/README.md index 3269c2a09..b350988d1 100644 --- a/README.md +++ b/README.md @@ -32,4 +32,7 @@ suggestions. (Ethan) * John wants to see what his top tracks are. (Yanki) -* John wants to find other individuals that have a similar music preference. (Ksenia) \ No newline at end of file +* John wants to find other individuals that have a similar music preference. (Ksenia) + +Below is a UI sketch that outlines what our project will look like. +![Project UI](Images/CSC207 Project Wireframe.png) \ No newline at end of file diff --git a/images/CSC207 Project Wireframe.png b/images/CSC207 Project Wireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..50939b677e63797ac7e78687f5986556e1d723c9 GIT binary patch literal 209076 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 M8CB^DNz Date: Fri, 8 Nov 2024 16:40:34 -0500 Subject: [PATCH 005/262] Set up clean architecture for spotify app --- .../ChangePasswordController.java | 26 --- .../ChangePasswordPresenter.java | 31 --- .../change_password/LoggedInState.java | 42 ---- .../change_password/LoggedInViewModel.java | 15 -- .../keyword/KeywordController.java | 4 + .../keyword/KeywordPresenter.java | 6 + .../keyword/KeywordState.java | 4 + .../keyword/KeywordViewModel.java | 4 + .../recommend/RecommendController.java | 4 + .../recommend/RecommendPresenter.java | 6 + .../recommend/RecommendState.java | 4 + .../recommend/RecommendViewModel.java | 4 + .../search/SearchController.java | 4 + .../search/SearchPresenter.java | 6 + .../interface_adapter/search/SearchState.java | 4 + .../search/SearchViewModel.java | 4 + .../signup/SignupController.java | 36 ---- .../signup/SignupPresenter.java | 50 ----- .../interface_adapter/signup/SignupState.java | 70 ------ .../signup/SignupViewModel.java | 25 --- .../top_artist/TopArtistController.java | 4 + .../top_artist/TopArtistPresenter.java | 6 + .../top_artist/TopArtistState.java | 4 + .../top_artist/TopArtistViewModel.java | 4 + .../top_tracks/TopTracksController.java | 4 + .../top_tracks/TopTracksPresenter.java | 4 + .../top_tracks/TopTracksState.java | 4 + .../top_tracks/TopTracksViewModel.java | 4 + .../ChangePasswordInputBoundary.java | 14 -- .../ChangePasswordInputData.java | 24 --- .../ChangePasswordInteractor.java | 32 --- .../ChangePasswordOutputBoundary.java | 18 -- .../ChangePasswordOutputData.java | 24 --- ...ChangePasswordUserDataAccessInterface.java | 15 -- .../keyword/KeywordInputBoundary.java | 4 + .../use_case/keyword/KeywordInputData.java | 4 + .../use_case/keyword/KeywordInteractor.java | 4 + .../keyword/KeywordOutputBoundary.java | 4 + .../use_case/keyword/KeywordOutputData.java | 4 + .../recommend/RecommendInputBoundary.java | 4 + .../recommend/RecommendInputData.java | 4 + .../recommend/RecommendInteractor.java | 4 + .../recommend/RecommendOutputBoundary.java | 4 + .../recommend/RecommendOutputData.java | 4 + .../RecommendUserDataAcessInterface.java | 4 + .../use_case/search/SearchInputBoundary.java | 4 + .../java/use_case/search/SearchInputData.java | 4 + .../use_case/search/SearchInteractor.java | 4 + .../use_case/search/SearchOutputBoundary.java | 4 + .../use_case/search/SearchOutputData.java | 4 + .../use_case/signup/SignupInputBoundary.java | 18 -- .../java/use_case/signup/SignupInputData.java | 29 --- .../use_case/signup/SignupInteractor.java | 43 ---- .../use_case/signup/SignupOutputBoundary.java | 24 --- .../use_case/signup/SignupOutputData.java | 24 --- .../signup/SignupUserDataAccessInterface.java | 22 -- .../top_artists/TopArtistInputBoundary.java | 4 + .../top_artists/TopArtistInputData.java | 4 + .../top_artists/TopArtistInteractor.java | 4 + .../top_artists/TopArtistOutputBoundary.java | 4 + .../top_artists/TopArtistOutputData.java | 4 + .../TopArtistUserDataAccessInterface.java | 4 + .../top_tracks/TopTracksInputBoundary.java | 4 + .../top_tracks/TopTracksInputData.java | 4 + .../top_tracks/TopTracksInteractor.java | 4 + .../top_tracks/TopTracksOutputBoundary.java | 4 + .../top_tracks/TopTracksOutputData.java | 4 + .../TopTracksUserDataAccessInterface.java | 4 + src/main/java/view/SignupView.java | 199 ------------------ 69 files changed, 200 insertions(+), 781 deletions(-) delete mode 100644 src/main/java/interface_adapter/change_password/ChangePasswordController.java delete mode 100644 src/main/java/interface_adapter/change_password/ChangePasswordPresenter.java delete mode 100644 src/main/java/interface_adapter/change_password/LoggedInState.java delete mode 100644 src/main/java/interface_adapter/change_password/LoggedInViewModel.java create mode 100644 src/main/java/interface_adapter/keyword/KeywordController.java create mode 100644 src/main/java/interface_adapter/keyword/KeywordPresenter.java create mode 100644 src/main/java/interface_adapter/keyword/KeywordState.java create mode 100644 src/main/java/interface_adapter/keyword/KeywordViewModel.java create mode 100644 src/main/java/interface_adapter/recommend/RecommendController.java create mode 100644 src/main/java/interface_adapter/recommend/RecommendPresenter.java create mode 100644 src/main/java/interface_adapter/recommend/RecommendState.java create mode 100644 src/main/java/interface_adapter/recommend/RecommendViewModel.java create mode 100644 src/main/java/interface_adapter/search/SearchController.java create mode 100644 src/main/java/interface_adapter/search/SearchPresenter.java create mode 100644 src/main/java/interface_adapter/search/SearchState.java create mode 100644 src/main/java/interface_adapter/search/SearchViewModel.java delete mode 100644 src/main/java/interface_adapter/signup/SignupController.java delete mode 100644 src/main/java/interface_adapter/signup/SignupPresenter.java delete mode 100644 src/main/java/interface_adapter/signup/SignupState.java delete mode 100644 src/main/java/interface_adapter/signup/SignupViewModel.java create mode 100644 src/main/java/interface_adapter/top_artist/TopArtistController.java create mode 100644 src/main/java/interface_adapter/top_artist/TopArtistPresenter.java create mode 100644 src/main/java/interface_adapter/top_artist/TopArtistState.java create mode 100644 src/main/java/interface_adapter/top_artist/TopArtistViewModel.java create mode 100644 src/main/java/interface_adapter/top_tracks/TopTracksController.java create mode 100644 src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java create mode 100644 src/main/java/interface_adapter/top_tracks/TopTracksState.java create mode 100644 src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java delete mode 100644 src/main/java/use_case/change_password/ChangePasswordInputBoundary.java delete mode 100644 src/main/java/use_case/change_password/ChangePasswordInputData.java delete mode 100644 src/main/java/use_case/change_password/ChangePasswordInteractor.java delete mode 100644 src/main/java/use_case/change_password/ChangePasswordOutputBoundary.java delete mode 100644 src/main/java/use_case/change_password/ChangePasswordOutputData.java delete mode 100644 src/main/java/use_case/change_password/ChangePasswordUserDataAccessInterface.java create mode 100644 src/main/java/use_case/keyword/KeywordInputBoundary.java create mode 100644 src/main/java/use_case/keyword/KeywordInputData.java create mode 100644 src/main/java/use_case/keyword/KeywordInteractor.java create mode 100644 src/main/java/use_case/keyword/KeywordOutputBoundary.java create mode 100644 src/main/java/use_case/keyword/KeywordOutputData.java create mode 100644 src/main/java/use_case/recommend/RecommendInputBoundary.java create mode 100644 src/main/java/use_case/recommend/RecommendInputData.java create mode 100644 src/main/java/use_case/recommend/RecommendInteractor.java create mode 100644 src/main/java/use_case/recommend/RecommendOutputBoundary.java create mode 100644 src/main/java/use_case/recommend/RecommendOutputData.java create mode 100644 src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java create mode 100644 src/main/java/use_case/search/SearchInputBoundary.java create mode 100644 src/main/java/use_case/search/SearchInputData.java create mode 100644 src/main/java/use_case/search/SearchInteractor.java create mode 100644 src/main/java/use_case/search/SearchOutputBoundary.java create mode 100644 src/main/java/use_case/search/SearchOutputData.java delete mode 100644 src/main/java/use_case/signup/SignupInputBoundary.java delete mode 100644 src/main/java/use_case/signup/SignupInputData.java delete mode 100644 src/main/java/use_case/signup/SignupInteractor.java delete mode 100644 src/main/java/use_case/signup/SignupOutputBoundary.java delete mode 100644 src/main/java/use_case/signup/SignupOutputData.java delete mode 100644 src/main/java/use_case/signup/SignupUserDataAccessInterface.java create mode 100644 src/main/java/use_case/top_artists/TopArtistInputBoundary.java create mode 100644 src/main/java/use_case/top_artists/TopArtistInputData.java create mode 100644 src/main/java/use_case/top_artists/TopArtistInteractor.java create mode 100644 src/main/java/use_case/top_artists/TopArtistOutputBoundary.java create mode 100644 src/main/java/use_case/top_artists/TopArtistOutputData.java create mode 100644 src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java create mode 100644 src/main/java/use_case/top_tracks/TopTracksInputBoundary.java create mode 100644 src/main/java/use_case/top_tracks/TopTracksInputData.java create mode 100644 src/main/java/use_case/top_tracks/TopTracksInteractor.java create mode 100644 src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java create mode 100644 src/main/java/use_case/top_tracks/TopTracksOutputData.java create mode 100644 src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java delete mode 100644 src/main/java/view/SignupView.java diff --git a/src/main/java/interface_adapter/change_password/ChangePasswordController.java b/src/main/java/interface_adapter/change_password/ChangePasswordController.java deleted file mode 100644 index a7abd075f..000000000 --- a/src/main/java/interface_adapter/change_password/ChangePasswordController.java +++ /dev/null @@ -1,26 +0,0 @@ -package interface_adapter.change_password; - -import use_case.change_password.ChangePasswordInputBoundary; -import use_case.change_password.ChangePasswordInputData; - -/** - * Controller for the Change Password Use Case. - */ -public class ChangePasswordController { - private final ChangePasswordInputBoundary userChangePasswordUseCaseInteractor; - - public ChangePasswordController(ChangePasswordInputBoundary userChangePasswordUseCaseInteractor) { - this.userChangePasswordUseCaseInteractor = userChangePasswordUseCaseInteractor; - } - - /** - * Executes the Change Password Use Case. - * @param password the new password - * @param username the user whose password to change - */ - public void execute(String password, String username) { - final ChangePasswordInputData changePasswordInputData = new ChangePasswordInputData(username, password); - - userChangePasswordUseCaseInteractor.execute(changePasswordInputData); - } -} diff --git a/src/main/java/interface_adapter/change_password/ChangePasswordPresenter.java b/src/main/java/interface_adapter/change_password/ChangePasswordPresenter.java deleted file mode 100644 index 3efca4e46..000000000 --- a/src/main/java/interface_adapter/change_password/ChangePasswordPresenter.java +++ /dev/null @@ -1,31 +0,0 @@ -package interface_adapter.change_password; - -import use_case.change_password.ChangePasswordOutputBoundary; -import use_case.change_password.ChangePasswordOutputData; - -/** - * The Presenter for the Change Password Use Case. - */ -public class ChangePasswordPresenter implements ChangePasswordOutputBoundary { - - private final LoggedInViewModel loggedInViewModel; - - public ChangePasswordPresenter(LoggedInViewModel loggedInViewModel) { - this.loggedInViewModel = loggedInViewModel; - } - - @Override - public void prepareSuccessView(ChangePasswordOutputData outputData) { - // currently there isn't anything to change based on the output data, - // since the output data only contains the username, which remains the same. - // We still fire the property changed event, but just to let the view know that - // it can alert the user that their password was changed successfully.. - loggedInViewModel.firePropertyChanged("password"); - - } - - @Override - public void prepareFailView(String error) { - // note: this use case currently can't fail - } -} diff --git a/src/main/java/interface_adapter/change_password/LoggedInState.java b/src/main/java/interface_adapter/change_password/LoggedInState.java deleted file mode 100644 index 54ed80537..000000000 --- a/src/main/java/interface_adapter/change_password/LoggedInState.java +++ /dev/null @@ -1,42 +0,0 @@ -package interface_adapter.change_password; - -/** - * The State information representing the logged-in user. - */ -public class LoggedInState { - private String username = ""; - - private String password = ""; - private String passwordError; - - public LoggedInState(LoggedInState copy) { - username = copy.username; - password = copy.password; - passwordError = copy.passwordError; - } - - // Because of the previous copy constructor, the default constructor must be explicit. - public LoggedInState() { - - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public void setPassword(String password) { - this.password = password; - } - - public void setPasswordError(String passwordError) { - this.passwordError = passwordError; - } - - public String getPassword() { - return password; - } -} diff --git a/src/main/java/interface_adapter/change_password/LoggedInViewModel.java b/src/main/java/interface_adapter/change_password/LoggedInViewModel.java deleted file mode 100644 index 85c81e4e6..000000000 --- a/src/main/java/interface_adapter/change_password/LoggedInViewModel.java +++ /dev/null @@ -1,15 +0,0 @@ -package interface_adapter.change_password; - -import interface_adapter.ViewModel; - -/** - * The View Model for the Logged In View. - */ -public class LoggedInViewModel extends ViewModel { - - public LoggedInViewModel() { - super("logged in"); - setState(new LoggedInState()); - } - -} diff --git a/src/main/java/interface_adapter/keyword/KeywordController.java b/src/main/java/interface_adapter/keyword/KeywordController.java new file mode 100644 index 000000000..342395c1e --- /dev/null +++ b/src/main/java/interface_adapter/keyword/KeywordController.java @@ -0,0 +1,4 @@ +package interface_adapter.keyword; + +public class KeywordController { +} diff --git a/src/main/java/interface_adapter/keyword/KeywordPresenter.java b/src/main/java/interface_adapter/keyword/KeywordPresenter.java new file mode 100644 index 000000000..051e3daf1 --- /dev/null +++ b/src/main/java/interface_adapter/keyword/KeywordPresenter.java @@ -0,0 +1,6 @@ +package interface_adapter.keyword; + +import use_case.keyword.KeywordOutputBoundary; + +public class KeywordPresenter implements KeywordOutputBoundary { +} diff --git a/src/main/java/interface_adapter/keyword/KeywordState.java b/src/main/java/interface_adapter/keyword/KeywordState.java new file mode 100644 index 000000000..0d261d255 --- /dev/null +++ b/src/main/java/interface_adapter/keyword/KeywordState.java @@ -0,0 +1,4 @@ +package interface_adapter.keyword; + +public class KeywordState { +} diff --git a/src/main/java/interface_adapter/keyword/KeywordViewModel.java b/src/main/java/interface_adapter/keyword/KeywordViewModel.java new file mode 100644 index 000000000..a94c3f967 --- /dev/null +++ b/src/main/java/interface_adapter/keyword/KeywordViewModel.java @@ -0,0 +1,4 @@ +package interface_adapter.keyword; + +public class KeywordViewModel { +} diff --git a/src/main/java/interface_adapter/recommend/RecommendController.java b/src/main/java/interface_adapter/recommend/RecommendController.java new file mode 100644 index 000000000..37c2c2d0d --- /dev/null +++ b/src/main/java/interface_adapter/recommend/RecommendController.java @@ -0,0 +1,4 @@ +package interface_adapter.recommend; + +public class RecommendController { +} diff --git a/src/main/java/interface_adapter/recommend/RecommendPresenter.java b/src/main/java/interface_adapter/recommend/RecommendPresenter.java new file mode 100644 index 000000000..716e75bf1 --- /dev/null +++ b/src/main/java/interface_adapter/recommend/RecommendPresenter.java @@ -0,0 +1,6 @@ +package interface_adapter.recommend; + +import use_case.recommend.RecommendOutputBoundary; + +public class RecommendPresenter implements RecommendOutputBoundary { +} diff --git a/src/main/java/interface_adapter/recommend/RecommendState.java b/src/main/java/interface_adapter/recommend/RecommendState.java new file mode 100644 index 000000000..fa5746e5c --- /dev/null +++ b/src/main/java/interface_adapter/recommend/RecommendState.java @@ -0,0 +1,4 @@ +package interface_adapter.recommend; + +public class RecommendState { +} diff --git a/src/main/java/interface_adapter/recommend/RecommendViewModel.java b/src/main/java/interface_adapter/recommend/RecommendViewModel.java new file mode 100644 index 000000000..d704dbe34 --- /dev/null +++ b/src/main/java/interface_adapter/recommend/RecommendViewModel.java @@ -0,0 +1,4 @@ +package interface_adapter.recommend; + +public class RecommendViewModel { +} diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java new file mode 100644 index 000000000..1e3712665 --- /dev/null +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -0,0 +1,4 @@ +package interface_adapter.search; + +public class SearchController { +} diff --git a/src/main/java/interface_adapter/search/SearchPresenter.java b/src/main/java/interface_adapter/search/SearchPresenter.java new file mode 100644 index 000000000..7805acfd7 --- /dev/null +++ b/src/main/java/interface_adapter/search/SearchPresenter.java @@ -0,0 +1,6 @@ +package interface_adapter.search; + +import use_case.search.SearchOutputBoundary; + +public class SearchPresenter implements SearchOutputBoundary { +} diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java new file mode 100644 index 000000000..70a54441b --- /dev/null +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -0,0 +1,4 @@ +package interface_adapter.search; + +public class SearchState { +} diff --git a/src/main/java/interface_adapter/search/SearchViewModel.java b/src/main/java/interface_adapter/search/SearchViewModel.java new file mode 100644 index 000000000..1a716b6cd --- /dev/null +++ b/src/main/java/interface_adapter/search/SearchViewModel.java @@ -0,0 +1,4 @@ +package interface_adapter.search; + +public class SearchViewModel { +} diff --git a/src/main/java/interface_adapter/signup/SignupController.java b/src/main/java/interface_adapter/signup/SignupController.java deleted file mode 100644 index c01d25aa5..000000000 --- a/src/main/java/interface_adapter/signup/SignupController.java +++ /dev/null @@ -1,36 +0,0 @@ -package interface_adapter.signup; - -import use_case.signup.SignupInputBoundary; -import use_case.signup.SignupInputData; - -/** - * Controller for the Signup Use Case. - */ -public class SignupController { - - private final SignupInputBoundary userSignupUseCaseInteractor; - - public SignupController(SignupInputBoundary userSignupUseCaseInteractor) { - this.userSignupUseCaseInteractor = userSignupUseCaseInteractor; - } - - /** - * Executes the Signup Use Case. - * @param username the username to sign up - * @param password1 the password - * @param password2 the password repeated - */ - public void execute(String username, String password1, String password2) { - final SignupInputData signupInputData = new SignupInputData( - username, password1, password2); - - userSignupUseCaseInteractor.execute(signupInputData); - } - - /** - * Executes the "switch to LoginView" Use Case. - */ - public void switchToLoginView() { - userSignupUseCaseInteractor.switchToLoginView(); - } -} diff --git a/src/main/java/interface_adapter/signup/SignupPresenter.java b/src/main/java/interface_adapter/signup/SignupPresenter.java deleted file mode 100644 index 9b654077e..000000000 --- a/src/main/java/interface_adapter/signup/SignupPresenter.java +++ /dev/null @@ -1,50 +0,0 @@ -package interface_adapter.signup; - -import interface_adapter.ViewManagerModel; -import interface_adapter.login.LoginState; -import interface_adapter.login.LoginViewModel; -import use_case.signup.SignupOutputBoundary; -import use_case.signup.SignupOutputData; - -/** - * The Presenter for the Signup Use Case. - */ -public class SignupPresenter implements SignupOutputBoundary { - - private final SignupViewModel signupViewModel; - private final LoginViewModel loginViewModel; - private final ViewManagerModel viewManagerModel; - - public SignupPresenter(ViewManagerModel viewManagerModel, - SignupViewModel signupViewModel, - LoginViewModel loginViewModel) { - this.viewManagerModel = viewManagerModel; - this.signupViewModel = signupViewModel; - this.loginViewModel = loginViewModel; - } - - @Override - public void prepareSuccessView(SignupOutputData response) { - // On success, switch to the login view. - final LoginState loginState = loginViewModel.getState(); - loginState.setUsername(response.getUsername()); - this.loginViewModel.setState(loginState); - loginViewModel.firePropertyChanged(); - - viewManagerModel.setState(loginViewModel.getViewName()); - viewManagerModel.firePropertyChanged(); - } - - @Override - public void prepareFailView(String error) { - final SignupState signupState = signupViewModel.getState(); - signupState.setUsernameError(error); - signupViewModel.firePropertyChanged(); - } - - @Override - public void switchToLoginView() { - viewManagerModel.setState(loginViewModel.getViewName()); - viewManagerModel.firePropertyChanged(); - } -} diff --git a/src/main/java/interface_adapter/signup/SignupState.java b/src/main/java/interface_adapter/signup/SignupState.java deleted file mode 100644 index 4a7f69327..000000000 --- a/src/main/java/interface_adapter/signup/SignupState.java +++ /dev/null @@ -1,70 +0,0 @@ -package interface_adapter.signup; - -/** - * The state for the Signup View Model. - */ -public class SignupState { - private String username = ""; - private String usernameError; - private String password = ""; - private String passwordError; - private String repeatPassword = ""; - private String repeatPasswordError; - - public String getUsername() { - return username; - } - - public String getUsernameError() { - return usernameError; - } - - public String getPassword() { - return password; - } - - public String getPasswordError() { - return passwordError; - } - - public String getRepeatPassword() { - return repeatPassword; - } - - public String getRepeatPasswordError() { - return repeatPasswordError; - } - - public void setUsername(String username) { - this.username = username; - } - - public void setUsernameError(String usernameError) { - this.usernameError = usernameError; - } - - public void setPassword(String password) { - this.password = password; - } - - public void setPasswordError(String passwordError) { - this.passwordError = passwordError; - } - - public void setRepeatPassword(String repeatPassword) { - this.repeatPassword = repeatPassword; - } - - public void setRepeatPasswordError(String repeatPasswordError) { - this.repeatPasswordError = repeatPasswordError; - } - - @Override - public String toString() { - return "SignupState{" - + "username='" + username + '\'' - + ", password='" + password + '\'' - + ", repeatPassword='" + repeatPassword + '\'' - + '}'; - } -} diff --git a/src/main/java/interface_adapter/signup/SignupViewModel.java b/src/main/java/interface_adapter/signup/SignupViewModel.java deleted file mode 100644 index 01f0086bc..000000000 --- a/src/main/java/interface_adapter/signup/SignupViewModel.java +++ /dev/null @@ -1,25 +0,0 @@ -package interface_adapter.signup; - -import interface_adapter.ViewModel; - -/** - * The ViewModel for the Signup View. - */ -public class SignupViewModel extends ViewModel { - - public static final String TITLE_LABEL = "Sign Up View"; - public static final String USERNAME_LABEL = "Choose username"; - public static final String PASSWORD_LABEL = "Choose password"; - public static final String REPEAT_PASSWORD_LABEL = "Enter password again"; - - public static final String SIGNUP_BUTTON_LABEL = "Sign up"; - public static final String CANCEL_BUTTON_LABEL = "Cancel"; - - public static final String TO_LOGIN_BUTTON_LABEL = "Go to Login"; - - public SignupViewModel() { - super("sign up"); - setState(new SignupState()); - } - -} diff --git a/src/main/java/interface_adapter/top_artist/TopArtistController.java b/src/main/java/interface_adapter/top_artist/TopArtistController.java new file mode 100644 index 000000000..bc73f7f1d --- /dev/null +++ b/src/main/java/interface_adapter/top_artist/TopArtistController.java @@ -0,0 +1,4 @@ +package interface_adapter.top_artist; + +public class TopArtistController { +} diff --git a/src/main/java/interface_adapter/top_artist/TopArtistPresenter.java b/src/main/java/interface_adapter/top_artist/TopArtistPresenter.java new file mode 100644 index 000000000..65d60c1b9 --- /dev/null +++ b/src/main/java/interface_adapter/top_artist/TopArtistPresenter.java @@ -0,0 +1,6 @@ +package interface_adapter.top_artist; + +import use_case.top_artists.TopArtistOutputBoundary; + +public class TopArtistPresenter implements TopArtistOutputBoundary { +} diff --git a/src/main/java/interface_adapter/top_artist/TopArtistState.java b/src/main/java/interface_adapter/top_artist/TopArtistState.java new file mode 100644 index 000000000..6510b7770 --- /dev/null +++ b/src/main/java/interface_adapter/top_artist/TopArtistState.java @@ -0,0 +1,4 @@ +package interface_adapter.top_artist; + +public class TopArtistState { +} diff --git a/src/main/java/interface_adapter/top_artist/TopArtistViewModel.java b/src/main/java/interface_adapter/top_artist/TopArtistViewModel.java new file mode 100644 index 000000000..252240de0 --- /dev/null +++ b/src/main/java/interface_adapter/top_artist/TopArtistViewModel.java @@ -0,0 +1,4 @@ +package interface_adapter.top_artist; + +public class TopArtistViewModel { +} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksController.java b/src/main/java/interface_adapter/top_tracks/TopTracksController.java new file mode 100644 index 000000000..5718f9288 --- /dev/null +++ b/src/main/java/interface_adapter/top_tracks/TopTracksController.java @@ -0,0 +1,4 @@ +package interface_adapter.top_tracks; + +public class TopTracksController { +} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java b/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java new file mode 100644 index 000000000..df1560d8f --- /dev/null +++ b/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java @@ -0,0 +1,4 @@ +package interface_adapter.top_tracks; + +public class TopTracksPresenter { +} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksState.java b/src/main/java/interface_adapter/top_tracks/TopTracksState.java new file mode 100644 index 000000000..126d15e82 --- /dev/null +++ b/src/main/java/interface_adapter/top_tracks/TopTracksState.java @@ -0,0 +1,4 @@ +package interface_adapter.top_tracks; + +public class TopTracksState { +} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java b/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java new file mode 100644 index 000000000..583d2e0bd --- /dev/null +++ b/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java @@ -0,0 +1,4 @@ +package interface_adapter.top_tracks; + +public class TopTracksViewModel { +} diff --git a/src/main/java/use_case/change_password/ChangePasswordInputBoundary.java b/src/main/java/use_case/change_password/ChangePasswordInputBoundary.java deleted file mode 100644 index 06ae9448e..000000000 --- a/src/main/java/use_case/change_password/ChangePasswordInputBoundary.java +++ /dev/null @@ -1,14 +0,0 @@ -package use_case.change_password; - -/** - * The Change Password Use Case. - */ -public interface ChangePasswordInputBoundary { - - /** - * Execute the Change Password Use Case. - * @param changePasswordInputData the input data for this use case - */ - void execute(ChangePasswordInputData changePasswordInputData); - -} diff --git a/src/main/java/use_case/change_password/ChangePasswordInputData.java b/src/main/java/use_case/change_password/ChangePasswordInputData.java deleted file mode 100644 index 8e09d8d12..000000000 --- a/src/main/java/use_case/change_password/ChangePasswordInputData.java +++ /dev/null @@ -1,24 +0,0 @@ -package use_case.change_password; - -/** - * The input data for the Change Password Use Case. - */ -public class ChangePasswordInputData { - - private final String password; - private final String username; - - public ChangePasswordInputData(String password, String username) { - this.password = password; - this.username = username; - } - - String getPassword() { - return password; - } - - String getUsername() { - return username; - } - -} diff --git a/src/main/java/use_case/change_password/ChangePasswordInteractor.java b/src/main/java/use_case/change_password/ChangePasswordInteractor.java deleted file mode 100644 index df91196c1..000000000 --- a/src/main/java/use_case/change_password/ChangePasswordInteractor.java +++ /dev/null @@ -1,32 +0,0 @@ -package use_case.change_password; - -import entity.User; -import entity.UserFactory; - -/** - * The Change Password Interactor. - */ -public class ChangePasswordInteractor implements ChangePasswordInputBoundary { - private final ChangePasswordUserDataAccessInterface userDataAccessObject; - private final ChangePasswordOutputBoundary userPresenter; - private final UserFactory userFactory; - - public ChangePasswordInteractor(ChangePasswordUserDataAccessInterface changePasswordDataAccessInterface, - ChangePasswordOutputBoundary changePasswordOutputBoundary, - UserFactory userFactory) { - this.userDataAccessObject = changePasswordDataAccessInterface; - this.userPresenter = changePasswordOutputBoundary; - this.userFactory = userFactory; - } - - @Override - public void execute(ChangePasswordInputData changePasswordInputData) { - final User user = userFactory.create(changePasswordInputData.getUsername(), - changePasswordInputData.getPassword()); - userDataAccessObject.changePassword(user); - - final ChangePasswordOutputData changePasswordOutputData = new ChangePasswordOutputData(user.getName(), - false); - userPresenter.prepareSuccessView(changePasswordOutputData); - } -} diff --git a/src/main/java/use_case/change_password/ChangePasswordOutputBoundary.java b/src/main/java/use_case/change_password/ChangePasswordOutputBoundary.java deleted file mode 100644 index fce28367b..000000000 --- a/src/main/java/use_case/change_password/ChangePasswordOutputBoundary.java +++ /dev/null @@ -1,18 +0,0 @@ -package use_case.change_password; - -/** - * The output boundary for the Change Password Use Case. - */ -public interface ChangePasswordOutputBoundary { - /** - * Prepares the success view for the Change Password Use Case. - * @param outputData the output data - */ - void prepareSuccessView(ChangePasswordOutputData outputData); - - /** - * Prepares the failure view for the Change Password Use Case. - * @param errorMessage the explanation of the failure - */ - void prepareFailView(String errorMessage); -} diff --git a/src/main/java/use_case/change_password/ChangePasswordOutputData.java b/src/main/java/use_case/change_password/ChangePasswordOutputData.java deleted file mode 100644 index b47b83fbc..000000000 --- a/src/main/java/use_case/change_password/ChangePasswordOutputData.java +++ /dev/null @@ -1,24 +0,0 @@ -package use_case.change_password; - -/** - * Output Data for the Change Password Use Case. - */ -public class ChangePasswordOutputData { - - private final String username; - - private final boolean useCaseFailed; - - public ChangePasswordOutputData(String username, boolean useCaseFailed) { - this.username = username; - this.useCaseFailed = useCaseFailed; - } - - public String getUsername() { - return username; - } - - public boolean isUseCaseFailed() { - return useCaseFailed; - } -} diff --git a/src/main/java/use_case/change_password/ChangePasswordUserDataAccessInterface.java b/src/main/java/use_case/change_password/ChangePasswordUserDataAccessInterface.java deleted file mode 100644 index 6b73ab6b0..000000000 --- a/src/main/java/use_case/change_password/ChangePasswordUserDataAccessInterface.java +++ /dev/null @@ -1,15 +0,0 @@ -package use_case.change_password; - -import entity.User; - -/** - * The interface of the DAO for the Change Password Use Case. - */ -public interface ChangePasswordUserDataAccessInterface { - - /** - * Updates the system to record this user's password. - * @param user the user whose password is to be updated - */ - void changePassword(User user); -} diff --git a/src/main/java/use_case/keyword/KeywordInputBoundary.java b/src/main/java/use_case/keyword/KeywordInputBoundary.java new file mode 100644 index 000000000..7ad585e54 --- /dev/null +++ b/src/main/java/use_case/keyword/KeywordInputBoundary.java @@ -0,0 +1,4 @@ +package use_case.keyword; + +public interface KeywordInputBoundary { +} diff --git a/src/main/java/use_case/keyword/KeywordInputData.java b/src/main/java/use_case/keyword/KeywordInputData.java new file mode 100644 index 000000000..86f22e48b --- /dev/null +++ b/src/main/java/use_case/keyword/KeywordInputData.java @@ -0,0 +1,4 @@ +package use_case.keyword; + +public class KeywordInputData { +} diff --git a/src/main/java/use_case/keyword/KeywordInteractor.java b/src/main/java/use_case/keyword/KeywordInteractor.java new file mode 100644 index 000000000..6ce8c454c --- /dev/null +++ b/src/main/java/use_case/keyword/KeywordInteractor.java @@ -0,0 +1,4 @@ +package use_case.keyword; + +public class KeywordInteractor implements KeywordInputBoundary{ +} diff --git a/src/main/java/use_case/keyword/KeywordOutputBoundary.java b/src/main/java/use_case/keyword/KeywordOutputBoundary.java new file mode 100644 index 000000000..fe916f8d2 --- /dev/null +++ b/src/main/java/use_case/keyword/KeywordOutputBoundary.java @@ -0,0 +1,4 @@ +package use_case.keyword; + +public interface KeywordOutputBoundary { +} diff --git a/src/main/java/use_case/keyword/KeywordOutputData.java b/src/main/java/use_case/keyword/KeywordOutputData.java new file mode 100644 index 000000000..dc4e39cd6 --- /dev/null +++ b/src/main/java/use_case/keyword/KeywordOutputData.java @@ -0,0 +1,4 @@ +package use_case.keyword; + +public class KeywordOutputData { +} diff --git a/src/main/java/use_case/recommend/RecommendInputBoundary.java b/src/main/java/use_case/recommend/RecommendInputBoundary.java new file mode 100644 index 000000000..553e3b04b --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendInputBoundary.java @@ -0,0 +1,4 @@ +package use_case.recommend; + +public interface RecommendInputBoundary { +} diff --git a/src/main/java/use_case/recommend/RecommendInputData.java b/src/main/java/use_case/recommend/RecommendInputData.java new file mode 100644 index 000000000..b0a19d336 --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendInputData.java @@ -0,0 +1,4 @@ +package use_case.recommend; + +public class RecommendInputData { +} diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java new file mode 100644 index 000000000..f2da745d4 --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -0,0 +1,4 @@ +package use_case.recommend; + +public class RecommendInteractor implements RecommendInputBoundary{ +} diff --git a/src/main/java/use_case/recommend/RecommendOutputBoundary.java b/src/main/java/use_case/recommend/RecommendOutputBoundary.java new file mode 100644 index 000000000..85c310ab4 --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendOutputBoundary.java @@ -0,0 +1,4 @@ +package use_case.recommend; + +public interface RecommendOutputBoundary { +} diff --git a/src/main/java/use_case/recommend/RecommendOutputData.java b/src/main/java/use_case/recommend/RecommendOutputData.java new file mode 100644 index 000000000..ca1ffdaca --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendOutputData.java @@ -0,0 +1,4 @@ +package use_case.recommend; + +public class RecommendOutputData { +} diff --git a/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java new file mode 100644 index 000000000..f775e314f --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java @@ -0,0 +1,4 @@ +package use_case.recommend; + +public interface RecommendUserDataAcessInterface { +} diff --git a/src/main/java/use_case/search/SearchInputBoundary.java b/src/main/java/use_case/search/SearchInputBoundary.java new file mode 100644 index 000000000..fdd043e47 --- /dev/null +++ b/src/main/java/use_case/search/SearchInputBoundary.java @@ -0,0 +1,4 @@ +package use_case.search; + +public interface SearchInputBoundary { +} diff --git a/src/main/java/use_case/search/SearchInputData.java b/src/main/java/use_case/search/SearchInputData.java new file mode 100644 index 000000000..be7bbb710 --- /dev/null +++ b/src/main/java/use_case/search/SearchInputData.java @@ -0,0 +1,4 @@ +package use_case.search; + +public class SearchInputData { +} diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java new file mode 100644 index 000000000..8b6135aae --- /dev/null +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -0,0 +1,4 @@ +package use_case.search; + +public class SearchInteractor implements SearchInputBoundary{ +} diff --git a/src/main/java/use_case/search/SearchOutputBoundary.java b/src/main/java/use_case/search/SearchOutputBoundary.java new file mode 100644 index 000000000..59a947aa1 --- /dev/null +++ b/src/main/java/use_case/search/SearchOutputBoundary.java @@ -0,0 +1,4 @@ +package use_case.search; + +public interface SearchOutputBoundary { +} diff --git a/src/main/java/use_case/search/SearchOutputData.java b/src/main/java/use_case/search/SearchOutputData.java new file mode 100644 index 000000000..139266262 --- /dev/null +++ b/src/main/java/use_case/search/SearchOutputData.java @@ -0,0 +1,4 @@ +package use_case.search; + +public class SearchOutputData { +} diff --git a/src/main/java/use_case/signup/SignupInputBoundary.java b/src/main/java/use_case/signup/SignupInputBoundary.java deleted file mode 100644 index 1cb69e02e..000000000 --- a/src/main/java/use_case/signup/SignupInputBoundary.java +++ /dev/null @@ -1,18 +0,0 @@ -package use_case.signup; - -/** - * Input Boundary for actions which are related to signing up. - */ -public interface SignupInputBoundary { - - /** - * Executes the signup use case. - * @param signupInputData the input data - */ - void execute(SignupInputData signupInputData); - - /** - * Executes the switch to login view use case. - */ - void switchToLoginView(); -} diff --git a/src/main/java/use_case/signup/SignupInputData.java b/src/main/java/use_case/signup/SignupInputData.java deleted file mode 100644 index 86c5e8abc..000000000 --- a/src/main/java/use_case/signup/SignupInputData.java +++ /dev/null @@ -1,29 +0,0 @@ -package use_case.signup; - -/** - * The Input Data for the Signup Use Case. - */ -public class SignupInputData { - - private final String username; - private final String password; - private final String repeatPassword; - - public SignupInputData(String username, String password, String repeatPassword) { - this.username = username; - this.password = password; - this.repeatPassword = repeatPassword; - } - - String getUsername() { - return username; - } - - String getPassword() { - return password; - } - - public String getRepeatPassword() { - return repeatPassword; - } -} diff --git a/src/main/java/use_case/signup/SignupInteractor.java b/src/main/java/use_case/signup/SignupInteractor.java deleted file mode 100644 index 3fd6560c7..000000000 --- a/src/main/java/use_case/signup/SignupInteractor.java +++ /dev/null @@ -1,43 +0,0 @@ -package use_case.signup; - -import entity.User; -import entity.UserFactory; - -/** - * The Signup Interactor. - */ -public class SignupInteractor implements SignupInputBoundary { - private final SignupUserDataAccessInterface userDataAccessObject; - private final SignupOutputBoundary userPresenter; - private final UserFactory userFactory; - - public SignupInteractor(SignupUserDataAccessInterface signupDataAccessInterface, - SignupOutputBoundary signupOutputBoundary, - UserFactory userFactory) { - this.userDataAccessObject = signupDataAccessInterface; - this.userPresenter = signupOutputBoundary; - this.userFactory = userFactory; - } - - @Override - public void execute(SignupInputData signupInputData) { - if (userDataAccessObject.existsByName(signupInputData.getUsername())) { - userPresenter.prepareFailView("User already exists."); - } - else if (!signupInputData.getPassword().equals(signupInputData.getRepeatPassword())) { - userPresenter.prepareFailView("Passwords don't match."); - } - else { - final User user = userFactory.create(signupInputData.getUsername(), signupInputData.getPassword()); - userDataAccessObject.save(user); - - final SignupOutputData signupOutputData = new SignupOutputData(user.getName(), false); - userPresenter.prepareSuccessView(signupOutputData); - } - } - - @Override - public void switchToLoginView() { - userPresenter.switchToLoginView(); - } -} diff --git a/src/main/java/use_case/signup/SignupOutputBoundary.java b/src/main/java/use_case/signup/SignupOutputBoundary.java deleted file mode 100644 index 314376b93..000000000 --- a/src/main/java/use_case/signup/SignupOutputBoundary.java +++ /dev/null @@ -1,24 +0,0 @@ -package use_case.signup; - -/** - * The output boundary for the Signup Use Case. - */ -public interface SignupOutputBoundary { - - /** - * Prepares the success view for the Signup Use Case. - * @param outputData the output data - */ - void prepareSuccessView(SignupOutputData outputData); - - /** - * Prepares the failure view for the Signup Use Case. - * @param errorMessage the explanation of the failure - */ - void prepareFailView(String errorMessage); - - /** - * Switches to the Login View. - */ - void switchToLoginView(); -} diff --git a/src/main/java/use_case/signup/SignupOutputData.java b/src/main/java/use_case/signup/SignupOutputData.java deleted file mode 100644 index 6dc74d2fb..000000000 --- a/src/main/java/use_case/signup/SignupOutputData.java +++ /dev/null @@ -1,24 +0,0 @@ -package use_case.signup; - -/** - * Output Data for the Signup Use Case. - */ -public class SignupOutputData { - - private final String username; - - private final boolean useCaseFailed; - - public SignupOutputData(String username, boolean useCaseFailed) { - this.username = username; - this.useCaseFailed = useCaseFailed; - } - - public String getUsername() { - return username; - } - - public boolean isUseCaseFailed() { - return useCaseFailed; - } -} diff --git a/src/main/java/use_case/signup/SignupUserDataAccessInterface.java b/src/main/java/use_case/signup/SignupUserDataAccessInterface.java deleted file mode 100644 index b9d60f585..000000000 --- a/src/main/java/use_case/signup/SignupUserDataAccessInterface.java +++ /dev/null @@ -1,22 +0,0 @@ -package use_case.signup; - -import entity.User; - -/** - * DAO for the Signup Use Case. - */ -public interface SignupUserDataAccessInterface { - - /** - * Checks if the given username exists. - * @param username the username to look for - * @return true if a user with the given username exists; false otherwise - */ - boolean existsByName(String username); - - /** - * Saves the user. - * @param user the user to save - */ - void save(User user); -} diff --git a/src/main/java/use_case/top_artists/TopArtistInputBoundary.java b/src/main/java/use_case/top_artists/TopArtistInputBoundary.java new file mode 100644 index 000000000..23e2fbcd9 --- /dev/null +++ b/src/main/java/use_case/top_artists/TopArtistInputBoundary.java @@ -0,0 +1,4 @@ +package use_case.top_artists; + +public interface TopArtistInputBoundary { +} diff --git a/src/main/java/use_case/top_artists/TopArtistInputData.java b/src/main/java/use_case/top_artists/TopArtistInputData.java new file mode 100644 index 000000000..8b85d5fd4 --- /dev/null +++ b/src/main/java/use_case/top_artists/TopArtistInputData.java @@ -0,0 +1,4 @@ +package use_case.top_artists; + +public class TopArtistInputData { +} diff --git a/src/main/java/use_case/top_artists/TopArtistInteractor.java b/src/main/java/use_case/top_artists/TopArtistInteractor.java new file mode 100644 index 000000000..b5438ce7d --- /dev/null +++ b/src/main/java/use_case/top_artists/TopArtistInteractor.java @@ -0,0 +1,4 @@ +package use_case.top_artists; + +public class TopArtistInteractor implements TopArtistInputBoundary{ +} diff --git a/src/main/java/use_case/top_artists/TopArtistOutputBoundary.java b/src/main/java/use_case/top_artists/TopArtistOutputBoundary.java new file mode 100644 index 000000000..a9f8c3b84 --- /dev/null +++ b/src/main/java/use_case/top_artists/TopArtistOutputBoundary.java @@ -0,0 +1,4 @@ +package use_case.top_artists; + +public interface TopArtistOutputBoundary { +} diff --git a/src/main/java/use_case/top_artists/TopArtistOutputData.java b/src/main/java/use_case/top_artists/TopArtistOutputData.java new file mode 100644 index 000000000..cf68bdabe --- /dev/null +++ b/src/main/java/use_case/top_artists/TopArtistOutputData.java @@ -0,0 +1,4 @@ +package use_case.top_artists; + +public class TopArtistOutputData { +} diff --git a/src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java b/src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java new file mode 100644 index 000000000..0eaf6f091 --- /dev/null +++ b/src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java @@ -0,0 +1,4 @@ +package use_case.top_artists; + +public interface TopArtistUserDataAccessInterface { +} diff --git a/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java b/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java new file mode 100644 index 000000000..57c3c4a4f --- /dev/null +++ b/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java @@ -0,0 +1,4 @@ +package use_case.top_tracks; + +public interface TopTracksInputBoundary { +} diff --git a/src/main/java/use_case/top_tracks/TopTracksInputData.java b/src/main/java/use_case/top_tracks/TopTracksInputData.java new file mode 100644 index 000000000..6beef15dc --- /dev/null +++ b/src/main/java/use_case/top_tracks/TopTracksInputData.java @@ -0,0 +1,4 @@ +package use_case.top_tracks; + +public class TopTracksInputData { +} diff --git a/src/main/java/use_case/top_tracks/TopTracksInteractor.java b/src/main/java/use_case/top_tracks/TopTracksInteractor.java new file mode 100644 index 000000000..a51964dcf --- /dev/null +++ b/src/main/java/use_case/top_tracks/TopTracksInteractor.java @@ -0,0 +1,4 @@ +package use_case.top_tracks; + +public class TopTracksInteractor implements TopTracksInputBoundary{ +} diff --git a/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java b/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java new file mode 100644 index 000000000..60030f7c4 --- /dev/null +++ b/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java @@ -0,0 +1,4 @@ +package use_case.top_tracks; + +public interface TopTracksOutputBoundary { +} diff --git a/src/main/java/use_case/top_tracks/TopTracksOutputData.java b/src/main/java/use_case/top_tracks/TopTracksOutputData.java new file mode 100644 index 000000000..aef86036d --- /dev/null +++ b/src/main/java/use_case/top_tracks/TopTracksOutputData.java @@ -0,0 +1,4 @@ +package use_case.top_tracks; + +public class TopTracksOutputData { +} diff --git a/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java b/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java new file mode 100644 index 000000000..ca8a163cf --- /dev/null +++ b/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java @@ -0,0 +1,4 @@ +package use_case.top_tracks; + +public interface TopTracksUserDataAccessInterface { +} diff --git a/src/main/java/view/SignupView.java b/src/main/java/view/SignupView.java deleted file mode 100644 index f98570d62..000000000 --- a/src/main/java/view/SignupView.java +++ /dev/null @@ -1,199 +0,0 @@ -package view; - -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; - -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import interface_adapter.signup.SignupController; -import interface_adapter.signup.SignupState; -import interface_adapter.signup.SignupViewModel; - -/** - * The View for the Signup Use Case. - */ -public class SignupView extends JPanel implements ActionListener, PropertyChangeListener { - private final String viewName = "sign up"; - - private final SignupViewModel signupViewModel; - private final JTextField usernameInputField = new JTextField(15); - private final JPasswordField passwordInputField = new JPasswordField(15); - private final JPasswordField repeatPasswordInputField = new JPasswordField(15); - private SignupController signupController; - - private final JButton signUp; - private final JButton cancel; - private final JButton toLogin; - - public SignupView(SignupViewModel signupViewModel) { - this.signupViewModel = signupViewModel; - signupViewModel.addPropertyChangeListener(this); - - final JLabel title = new JLabel(SignupViewModel.TITLE_LABEL); - title.setAlignmentX(Component.CENTER_ALIGNMENT); - - final LabelTextPanel usernameInfo = new LabelTextPanel( - new JLabel(SignupViewModel.USERNAME_LABEL), usernameInputField); - final LabelTextPanel passwordInfo = new LabelTextPanel( - new JLabel(SignupViewModel.PASSWORD_LABEL), passwordInputField); - final LabelTextPanel repeatPasswordInfo = new LabelTextPanel( - new JLabel(SignupViewModel.REPEAT_PASSWORD_LABEL), repeatPasswordInputField); - - final JPanel buttons = new JPanel(); - toLogin = new JButton(SignupViewModel.TO_LOGIN_BUTTON_LABEL); - buttons.add(toLogin); - signUp = new JButton(SignupViewModel.SIGNUP_BUTTON_LABEL); - buttons.add(signUp); - cancel = new JButton(SignupViewModel.CANCEL_BUTTON_LABEL); - buttons.add(cancel); - - signUp.addActionListener( - // This creates an anonymous subclass of ActionListener and instantiates it. - new ActionListener() { - public void actionPerformed(ActionEvent evt) { - if (evt.getSource().equals(signUp)) { - final SignupState currentState = signupViewModel.getState(); - - signupController.execute( - currentState.getUsername(), - currentState.getPassword(), - currentState.getRepeatPassword() - ); - } - } - } - ); - - toLogin.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent evt) { - signupController.switchToLoginView(); - } - } - ); - - cancel.addActionListener(this); - - addUsernameListener(); - addPasswordListener(); - addRepeatPasswordListener(); - - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - this.add(title); - this.add(usernameInfo); - this.add(passwordInfo); - this.add(repeatPasswordInfo); - this.add(buttons); - } - - private void addUsernameListener() { - usernameInputField.getDocument().addDocumentListener(new DocumentListener() { - - private void documentListenerHelper() { - final SignupState currentState = signupViewModel.getState(); - currentState.setUsername(usernameInputField.getText()); - signupViewModel.setState(currentState); - } - - @Override - public void insertUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - documentListenerHelper(); - } - }); - } - - private void addPasswordListener() { - passwordInputField.getDocument().addDocumentListener(new DocumentListener() { - - private void documentListenerHelper() { - final SignupState currentState = signupViewModel.getState(); - currentState.setPassword(new String(passwordInputField.getPassword())); - signupViewModel.setState(currentState); - } - - @Override - public void insertUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - documentListenerHelper(); - } - }); - } - - private void addRepeatPasswordListener() { - repeatPasswordInputField.getDocument().addDocumentListener(new DocumentListener() { - - private void documentListenerHelper() { - final SignupState currentState = signupViewModel.getState(); - currentState.setRepeatPassword(new String(repeatPasswordInputField.getPassword())); - signupViewModel.setState(currentState); - } - - @Override - public void insertUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - documentListenerHelper(); - } - }); - } - - @Override - public void actionPerformed(ActionEvent evt) { - JOptionPane.showMessageDialog(this, "Cancel not implemented yet."); - } - - @Override - public void propertyChange(PropertyChangeEvent evt) { - final SignupState state = (SignupState) evt.getNewValue(); - if (state.getUsernameError() != null) { - JOptionPane.showMessageDialog(this, state.getUsernameError()); - } - } - - public String getViewName() { - return viewName; - } - - public void setSignupController(SignupController controller) { - this.signupController = controller; - } -} From a889b01fe48e8f76172b5c0ddf818af9a93df37f Mon Sep 17 00:00:00 2001 From: quinn Date: Fri, 8 Nov 2024 16:42:43 -0500 Subject: [PATCH 006/262] Set up clean architecture for spotify app --- .../java/interface_adapter/top_tracks/TopTracksViewModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java b/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java index 583d2e0bd..fc66ec32a 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java @@ -1,4 +1,4 @@ package interface_adapter.top_tracks; -public class TopTracksViewModel { +public class TopTracksViewModel{ } From 0112aa916509cbb0efc5386ee3fc7808509475ef Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 8 Nov 2024 18:38:20 -0500 Subject: [PATCH 007/262] Changed the whole Login Menu to our specifications --- src/main/java/app/Main.java | 16 +++++----- .../login/LoginController.java | 7 ++-- .../interface_adapter/login/LoginState.java | 20 +++--------- .../logout/LogoutController.java | 6 ++-- .../logout/LogoutPresenter.java | 23 ++++++++++--- .../signup/SignupPresenter.java | 2 +- .../java/use_case/login/LoginInputData.java | 16 +++------- .../java/use_case/login/LoginInteractor.java | 20 ++++-------- .../java/use_case/logout/LogoutInputData.java | 6 +++- .../use_case/logout/LogoutInteractor.java | 8 +++-- .../use_case/logout/LogoutOutputData.java | 4 ++- src/main/java/view/LoggedInView.java | 5 +-- src/main/java/view/LoginView.java | 32 +++++++++---------- 13 files changed, 84 insertions(+), 81 deletions(-) diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index bef63ad7a..1e756aefa 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -12,15 +12,15 @@ public class Main { */ public static void main(String[] args) { final AppBuilder appBuilder = new AppBuilder(); - // TODO: add the Logout Use Case to the app using the appBuilder final JFrame application = appBuilder - .addLoginView() - .addSignupView() - .addLoggedInView() - .addSignupUseCase() - .addLoginUseCase() - .addChangePasswordUseCase() - .build(); + .addLoginView() + .addSignupView() + .addLoggedInView() + .addSignupUseCase() + .addLoginUseCase() + .addChangePasswordUseCase() + .addLogoutUseCase() + .build(); application.pack(); application.setVisible(true); diff --git a/src/main/java/interface_adapter/login/LoginController.java b/src/main/java/interface_adapter/login/LoginController.java index 57e950666..369e95e9d 100644 --- a/src/main/java/interface_adapter/login/LoginController.java +++ b/src/main/java/interface_adapter/login/LoginController.java @@ -16,12 +16,11 @@ public LoginController(LoginInputBoundary loginUseCaseInteractor) { /** * Executes the Login Use Case. - * @param username the username of the user logging in - * @param password the password of the user logging in + * @param loginToken the username of the user logging in */ - public void execute(String username, String password) { + public void execute(String loginToken) { final LoginInputData loginInputData = new LoginInputData( - username, password); + loginToken); loginUseCaseInteractor.execute(loginInputData); } diff --git a/src/main/java/interface_adapter/login/LoginState.java b/src/main/java/interface_adapter/login/LoginState.java index e42632034..272105d3e 100644 --- a/src/main/java/interface_adapter/login/LoginState.java +++ b/src/main/java/interface_adapter/login/LoginState.java @@ -4,32 +4,22 @@ * The state for the Login View Model. */ public class LoginState { - private String username = ""; + private String loginToken = ""; private String loginError; - private String password = ""; - public String getUsername() { - return username; + public String getLoginToken() { + return loginToken; } public String getLoginError() { return loginError; } - public String getPassword() { - return password; - } - - public void setUsername(String username) { - this.username = username; + public void setLoginToken(String loginToken) { + this.loginToken = loginToken; } public void setLoginError(String usernameError) { this.loginError = usernameError; } - - public void setPassword(String password) { - this.password = password; - } - } diff --git a/src/main/java/interface_adapter/logout/LogoutController.java b/src/main/java/interface_adapter/logout/LogoutController.java index e184a3bba..558ec6bcc 100644 --- a/src/main/java/interface_adapter/logout/LogoutController.java +++ b/src/main/java/interface_adapter/logout/LogoutController.java @@ -1,6 +1,7 @@ package interface_adapter.logout; import use_case.logout.LogoutInputBoundary; +import use_case.logout.LogoutInputData; /** * The controller for the Logout Use Case. @@ -10,7 +11,7 @@ public class LogoutController { private LogoutInputBoundary logoutUseCaseInteractor; public LogoutController(LogoutInputBoundary logoutUseCaseInteractor) { - // TODO: Save the interactor in the instance variable. + this.logoutUseCaseInteractor = logoutUseCaseInteractor; } /** @@ -18,8 +19,9 @@ public LogoutController(LogoutInputBoundary logoutUseCaseInteractor) { * @param username the username of the user logging in */ public void execute(String username) { - // TODO: run the use case interactor for the logout use case // 1. instantiate the `LogoutInputData`, which should contain the username. // 2. tell the Interactor to execute. + final LogoutInputData logoutInputData = new LogoutInputData(username); + logoutUseCaseInteractor.execute(logoutInputData); } } diff --git a/src/main/java/interface_adapter/logout/LogoutPresenter.java b/src/main/java/interface_adapter/logout/LogoutPresenter.java index 78ef306a1..126da3c94 100644 --- a/src/main/java/interface_adapter/logout/LogoutPresenter.java +++ b/src/main/java/interface_adapter/logout/LogoutPresenter.java @@ -1,7 +1,9 @@ package interface_adapter.logout; import interface_adapter.ViewManagerModel; +import interface_adapter.change_password.LoggedInState; import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.login.LoginState; import interface_adapter.login.LoginViewModel; import use_case.logout.LogoutOutputBoundary; import use_case.logout.LogoutOutputData; @@ -16,9 +18,13 @@ public class LogoutPresenter implements LogoutOutputBoundary { private LoginViewModel loginViewModel; public LogoutPresenter(ViewManagerModel viewManagerModel, - LoggedInViewModel loggedInViewModel, + LoggedInViewModel loggedInViewModel, LoginViewModel loginViewModel) { - // TODO: assign to the three instance variables. + // Done: assign to the three instance variables. + this.loggedInViewModel = loggedInViewModel; + this.viewManagerModel = viewManagerModel; + this.loginViewModel = loginViewModel; + } @Override @@ -29,17 +35,26 @@ public void prepareSuccessView(LogoutOutputData response) { // We also need to set the username in the LoggedInState to // the empty string. - // TODO: have prepareSuccessView update the LoggedInState + // Done have prepareSuccessView update the LoggedInState // 1. get the LoggedInState out of the appropriate View Model, // 2. set the username in the state to the empty string // 3. set the state in the LoggedInViewModel to the updated state // 4. firePropertyChanged so that the View that is listening is updated. + final LoggedInState loggedInState = loggedInViewModel.getState(); + loggedInState.setUsername(""); + loggedInViewModel.setState(loggedInState); + loggedInViewModel.firePropertyChanged(); - // TODO: have prepareSuccessView update the LoginState + // Done: have prepareSuccessView update the LoginState // 5. get the LoginState out of the appropriate View Model, // 6. set the username and password in the state to the empty string // 7. set the state in the LoginViewModel to the updated state // 8. firePropertyChanged so that the View that is listening is updated. + final LoginState loginState = loginViewModel.getState(); + loginState.setLoginToken(""); + // loginState.setPassword(""); + loginViewModel.setState(loginState); + loggedInViewModel.firePropertyChanged(); // This code tells the View Manager to switch to the LoginView. this.viewManagerModel.setState(loginViewModel.getViewName()); diff --git a/src/main/java/interface_adapter/signup/SignupPresenter.java b/src/main/java/interface_adapter/signup/SignupPresenter.java index 9b654077e..5f02c818a 100644 --- a/src/main/java/interface_adapter/signup/SignupPresenter.java +++ b/src/main/java/interface_adapter/signup/SignupPresenter.java @@ -27,7 +27,7 @@ public SignupPresenter(ViewManagerModel viewManagerModel, public void prepareSuccessView(SignupOutputData response) { // On success, switch to the login view. final LoginState loginState = loginViewModel.getState(); - loginState.setUsername(response.getUsername()); + loginState.setLoginToken(response.getUsername()); this.loginViewModel.setState(loginState); loginViewModel.firePropertyChanged(); diff --git a/src/main/java/use_case/login/LoginInputData.java b/src/main/java/use_case/login/LoginInputData.java index 363316832..5e4271c37 100644 --- a/src/main/java/use_case/login/LoginInputData.java +++ b/src/main/java/use_case/login/LoginInputData.java @@ -5,20 +5,14 @@ */ public class LoginInputData { - private final String username; - private final String password; + private final String loginToken; - public LoginInputData(String username, String password) { - this.username = username; - this.password = password; + public LoginInputData(String loginToken) { + this.loginToken = loginToken; } - String getUsername() { - return username; - } - - String getPassword() { - return password; + String getLoginToken() { + return loginToken; } } diff --git a/src/main/java/use_case/login/LoginInteractor.java b/src/main/java/use_case/login/LoginInteractor.java index 5b36ddcd8..13cf19f78 100644 --- a/src/main/java/use_case/login/LoginInteractor.java +++ b/src/main/java/use_case/login/LoginInteractor.java @@ -17,24 +17,16 @@ public LoginInteractor(LoginUserDataAccessInterface userDataAccessInterface, @Override public void execute(LoginInputData loginInputData) { - final String username = loginInputData.getUsername(); - final String password = loginInputData.getPassword(); + final String username = loginInputData.getLoginToken(); if (!userDataAccessObject.existsByName(username)) { loginPresenter.prepareFailView(username + ": Account does not exist."); } else { - final String pwd = userDataAccessObject.get(username).getPassword(); - if (!password.equals(pwd)) { - loginPresenter.prepareFailView("Incorrect password for \"" + username + "\"."); - } - else { - - final User user = userDataAccessObject.get(loginInputData.getUsername()); - - userDataAccessObject.setCurrentUsername(user.getName()); - final LoginOutputData loginOutputData = new LoginOutputData(user.getName(), false); - loginPresenter.prepareSuccessView(loginOutputData); - } + // final String pwd = userDataAccessObject.get(username).getName(); + final User user = userDataAccessObject.get(loginInputData.getLoginToken()); + userDataAccessObject.setCurrentUsername(user.getName()); + final LoginOutputData loginOutputData = new LoginOutputData(user.getName(), false); + loginPresenter.prepareSuccessView(loginOutputData); } } } diff --git a/src/main/java/use_case/logout/LogoutInputData.java b/src/main/java/use_case/logout/LogoutInputData.java index 56a33b375..eb0851437 100644 --- a/src/main/java/use_case/logout/LogoutInputData.java +++ b/src/main/java/use_case/logout/LogoutInputData.java @@ -4,9 +4,13 @@ * The Input Data for the Logout Use Case. */ public class LogoutInputData { + private final String name; public LogoutInputData(String username) { - // TODO: save the current username in an instance variable and add a getter. + this.name = username; } + public String getName() { + return name; + } } diff --git a/src/main/java/use_case/logout/LogoutInteractor.java b/src/main/java/use_case/logout/LogoutInteractor.java index 1ca93b44e..51fae49fb 100644 --- a/src/main/java/use_case/logout/LogoutInteractor.java +++ b/src/main/java/use_case/logout/LogoutInteractor.java @@ -9,17 +9,21 @@ public class LogoutInteractor implements LogoutInputBoundary { public LogoutInteractor(LogoutUserDataAccessInterface userDataAccessInterface, LogoutOutputBoundary logoutOutputBoundary) { - // TODO: save the DAO and Presenter in the instance variables. // Which parameter is the DAO and which is the presenter? + this.userDataAccessObject = userDataAccessInterface; + this.logoutPresenter = logoutOutputBoundary; } @Override public void execute(LogoutInputData logoutInputData) { - // TODO: implement the logic of the Logout Use Case (depends on the LogoutInputData.java TODO) // * get the username out of the input data, // * set the username to null in the DAO // * instantiate the `LogoutOutputData`, which needs to contain the username. // * tell the presenter to prepare a success view. + final String username = logoutInputData.getName(); + userDataAccessObject.setCurrentUsername(null); + final LogoutOutputData logOut = new LogoutOutputData(username, false); + logoutPresenter.prepareSuccessView(logOut); } } diff --git a/src/main/java/use_case/logout/LogoutOutputData.java b/src/main/java/use_case/logout/LogoutOutputData.java index 974279155..771c4f123 100644 --- a/src/main/java/use_case/logout/LogoutOutputData.java +++ b/src/main/java/use_case/logout/LogoutOutputData.java @@ -9,7 +9,9 @@ public class LogoutOutputData { private boolean useCaseFailed; public LogoutOutputData(String username, boolean useCaseFailed) { - // TODO: save the parameters in the instance variables. + this.username = username; + this.useCaseFailed = useCaseFailed; + } public String getUsername() { diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 76d40c0f1..37b43a980 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -100,9 +100,10 @@ public void changedUpdate(DocumentEvent e) { // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { if (evt.getSource().equals(logOut)) { - // TODO: execute the logout use case through the Controller // 1. get the state out of the loggedInViewModel. It contains the username. + final String name = loggedInViewModel.getState().getUsername(); // 2. Execute the logout Controller. + logoutController.execute(name); } } ); @@ -138,6 +139,6 @@ public void setChangePasswordController(ChangePasswordController changePasswordC } public void setLogoutController(LogoutController logoutController) { - // TODO: save the logout controller in the instance variable. + this.logoutController = logoutController; } } diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index 96d4f3845..d0eaa701b 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -27,11 +27,11 @@ public class LoginView extends JPanel implements ActionListener, PropertyChangeL private final String viewName = "log in"; private final LoginViewModel loginViewModel; - private final JTextField usernameInputField = new JTextField(15); + private final JTextField loginTokenInputField = new JTextField(15); private final JLabel usernameErrorField = new JLabel(); - private final JPasswordField passwordInputField = new JPasswordField(15); - private final JLabel passwordErrorField = new JLabel(); + // private final JPasswordField passwordInputField = new JPasswordField(15); + // private final JLabel passwordErrorField = new JLabel(); private final JButton logIn; private final JButton cancel; @@ -46,9 +46,9 @@ public LoginView(LoginViewModel loginViewModel) { title.setAlignmentX(Component.CENTER_ALIGNMENT); final LabelTextPanel usernameInfo = new LabelTextPanel( - new JLabel("Username"), usernameInputField); - final LabelTextPanel passwordInfo = new LabelTextPanel( - new JLabel("Password"), passwordInputField); + new JLabel("Login Token"), loginTokenInputField); + // final LabelTextPanel passwordInfo = new LabelTextPanel( + // new JLabel("Password"), passwordInputField); final JPanel buttons = new JPanel(); logIn = new JButton("log in"); @@ -63,8 +63,8 @@ public void actionPerformed(ActionEvent evt) { final LoginState currentState = loginViewModel.getState(); loginController.execute( - currentState.getUsername(), - currentState.getPassword() + currentState.getLoginToken() + // currentState.getPassword() ); } } @@ -73,11 +73,11 @@ public void actionPerformed(ActionEvent evt) { cancel.addActionListener(this); - usernameInputField.getDocument().addDocumentListener(new DocumentListener() { + loginTokenInputField.getDocument().addDocumentListener(new DocumentListener() { private void documentListenerHelper() { final LoginState currentState = loginViewModel.getState(); - currentState.setUsername(usernameInputField.getText()); + currentState.setLoginToken(loginTokenInputField.getText()); loginViewModel.setState(currentState); } @@ -99,11 +99,11 @@ public void changedUpdate(DocumentEvent e) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - passwordInputField.getDocument().addDocumentListener(new DocumentListener() { + /* loginTokenInputField.getDocument().addDocumentListener(new DocumentListener() { private void documentListenerHelper() { final LoginState currentState = loginViewModel.getState(); - currentState.setPassword(new String(passwordInputField.getPassword())); + currentState.setLoginToken(new String(loginTokenInputField.getText())); loginViewModel.setState(currentState); } @@ -121,12 +121,12 @@ public void removeUpdate(DocumentEvent e) { public void changedUpdate(DocumentEvent e) { documentListenerHelper(); } - }); + }); */ this.add(title); this.add(usernameInfo); this.add(usernameErrorField); - this.add(passwordInfo); + // this.add(passwordInfo); this.add(buttons); } @@ -146,8 +146,8 @@ public void propertyChange(PropertyChangeEvent evt) { } private void setFields(LoginState state) { - usernameInputField.setText(state.getUsername()); - passwordInputField.setText(state.getPassword()); + loginTokenInputField.setText(state.getLoginToken()); + // passwordInputField.setText(state.getPassword()); } public String getViewName() { From eedb7f22ad9a9b678ce93bd79b1b6bd61d874203 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sat, 9 Nov 2024 18:23:10 -0500 Subject: [PATCH 008/262] Fixed issue in readme - wireframe was not displaying --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b350988d1..b440ab054 100644 --- a/README.md +++ b/README.md @@ -35,4 +35,4 @@ suggestions. (Ethan) * John wants to find other individuals that have a similar music preference. (Ksenia) Below is a UI sketch that outlines what our project will look like. -![Project UI](Images/CSC207 Project Wireframe.png) \ No newline at end of file +![Project UI](images/CSC207%20Project%20Wireframe.png) \ No newline at end of file From f7adef18f9cca14d8647d1212c495c93b749c116 Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 11 Nov 2024 10:31:01 -0500 Subject: [PATCH 009/262] updated gitignore --- .idea/.gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.idea/.gitignore b/.idea/.gitignore index 13566b81b..dadd8192d 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -6,3 +6,9 @@ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml +# idea files +/compiler.xml +/encodings.xml +/misc.xml +/uiDesigner.xml +/vcs.xml From e080e5eda250f3c46b190a14bf808b9f399e8e6e Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Mon, 11 Nov 2024 12:32:46 -0500 Subject: [PATCH 010/262] Changed LogggedInView to meet our specifications --- src/main/java/Constants.java | 15 ++++ src/main/java/app/AppBuilder.java | 51 ++++++------ src/main/java/app/Main.java | 2 - src/main/java/view/LoggedInView.java | 117 ++++++++++++++------------- src/main/java/view/LoginView.java | 36 --------- 5 files changed, 101 insertions(+), 120 deletions(-) create mode 100644 src/main/java/Constants.java diff --git a/src/main/java/Constants.java b/src/main/java/Constants.java new file mode 100644 index 000000000..80e4df50b --- /dev/null +++ b/src/main/java/Constants.java @@ -0,0 +1,15 @@ +package java; + +import java.awt.Dimension; +import java.awt.Toolkit; + +/** + * Constants used in this program. + */ +public class Constants { + // App Size + private static final Dimension SCREEN_SIZE = Toolkit.getDefaultToolkit().getScreenSize(); + public static final int APP_WIDTH = SCREEN_SIZE.width; + public static final int APP_HEIGHT = SCREEN_SIZE.height; +} + diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index e9eef5c81..3da2f730f 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -1,10 +1,9 @@ package app; -import java.awt.CardLayout; +import java.Constants; +import java.awt.*; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.WindowConstants; +import javax.swing.*; import data_access.InMemoryUserDataAccessObject; import entity.CommonUserFactory; @@ -60,8 +59,9 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); - private SignupView signupView; - private SignupViewModel signupViewModel; +// Will remove since our project does not cover signing up, only logging in +// private SignupView signupView; +// private SignupViewModel signupViewModel; private LoginViewModel loginViewModel; private LoggedInViewModel loggedInViewModel; private LoggedInView loggedInView; @@ -75,12 +75,12 @@ public AppBuilder() { * Adds the Signup View to the application. * @return this builder */ - public AppBuilder addSignupView() { - signupViewModel = new SignupViewModel(); - signupView = new SignupView(signupViewModel); - cardPanel.add(signupView, signupView.getViewName()); - return this; - } +// public AppBuilder addSignupView() { +// signupViewModel = new SignupViewModel(); +// signupView = new SignupView(signupViewModel); +// cardPanel.add(signupView, signupView.getViewName()); +// return this; +// } /** * Adds the Login View to the application. @@ -108,16 +108,16 @@ public AppBuilder addLoggedInView() { * Adds the Signup Use Case to the application. * @return this builder */ - public AppBuilder addSignupUseCase() { - final SignupOutputBoundary signupOutputBoundary = new SignupPresenter(viewManagerModel, - signupViewModel, loginViewModel); - final SignupInputBoundary userSignupInteractor = new SignupInteractor( - userDataAccessObject, signupOutputBoundary, userFactory); - - final SignupController controller = new SignupController(userSignupInteractor); - signupView.setSignupController(controller); - return this; - } +// public AppBuilder addSignupUseCase() { +// final SignupOutputBoundary signupOutputBoundary = new SignupPresenter(viewManagerModel, +// signupViewModel, loginViewModel); +// final SignupInputBoundary userSignupInteractor = new SignupInteractor( +// userDataAccessObject, signupOutputBoundary, userFactory); +// +// final SignupController controller = new SignupController(userSignupInteractor); +// signupView.setSignupController(controller); +// return this; +// } /** * Adds the Login Use Case to the application. @@ -172,12 +172,15 @@ public AppBuilder addLogoutUseCase() { * @return the application */ public JFrame build() { - final JFrame application = new JFrame("Login Example"); + final JFrame application = new JFrame("CSC207 Project: Spotify Companion App"); application.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); +// Trying to set default size to app, but its not working +// application.setSize(Constants.APP_WIDTH, Constants.APP_HEIGHT); + application.add(cardPanel); - viewManagerModel.setState(signupView.getViewName()); + viewManagerModel.setState(loggedInView.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 1e756aefa..0d3b09a48 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -14,9 +14,7 @@ public static void main(String[] args) { final AppBuilder appBuilder = new AppBuilder(); final JFrame application = appBuilder .addLoginView() - .addSignupView() .addLoggedInView() - .addSignupUseCase() .addLoginUseCase() .addChangePasswordUseCase() .addLogoutUseCase() diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 37b43a980..d1694a59f 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -9,9 +9,6 @@ import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; import interface_adapter.change_password.ChangePasswordController; import interface_adapter.change_password.LoggedInState; @@ -25,76 +22,81 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private final String viewName = "logged in"; private final LoggedInViewModel loggedInViewModel; - private final JLabel passwordErrorField = new JLabel(); private ChangePasswordController changePasswordController; private LogoutController logoutController; private final JLabel username; - private final JButton logOut; - - private final JTextField passwordInputField = new JTextField(15); - private final JButton changePassword; + private final JPanel searchButtons = new JPanel(); + private final JPanel appButtons = new JPanel(); public LoggedInView(LoggedInViewModel loggedInViewModel) { this.loggedInViewModel = loggedInViewModel; this.loggedInViewModel.addPropertyChangeListener(this); - final JLabel title = new JLabel("Logged In Screen"); + final JLabel title = new JLabel("Home Screen"); title.setAlignmentX(Component.CENTER_ALIGNMENT); - final LabelTextPanel passwordInfo = new LabelTextPanel( - new JLabel("Password"), passwordInputField); - final JLabel usernameInfo = new JLabel("Currently logged in: "); username = new JLabel(); - final JPanel buttons = new JPanel(); + final JPanel profile = new JPanel(); logOut = new JButton("Log Out"); - buttons.add(logOut); - - changePassword = new JButton("Change Password"); - buttons.add(changePassword); + profile.add(logOut); + + final JButton description = new JButton("Describe a song"); + searchButtons.add(description); + final JButton lyrics = new JButton("Search song lyrics"); + searchButtons.add(lyrics); + + final JButton home = new JButton("Home"); + appButtons.add(home); + final JButton recommendations = new JButton("Recommendations"); + appButtons.add(recommendations); + final JButton topTracks = new JButton("Top Tracks"); + appButtons.add(topTracks); + final JButton similarListeners = new JButton("Similar listeners"); + appButtons.add(similarListeners); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - passwordInputField.getDocument().addDocumentListener(new DocumentListener() { - - private void documentListenerHelper() { - final LoggedInState currentState = loggedInViewModel.getState(); - currentState.setPassword(passwordInputField.getText()); - loggedInViewModel.setState(currentState); - } - - @Override - public void insertUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - documentListenerHelper(); - } - }); - - changePassword.addActionListener( - // This creates an anonymous subclass of ActionListener and instantiates it. - evt -> { - if (evt.getSource().equals(changePassword)) { - final LoggedInState currentState = loggedInViewModel.getState(); - - this.changePasswordController.execute( - currentState.getUsername(), - currentState.getPassword() - ); - } - } - ); +// passwordInputField.getDocument().addDocumentListener(new DocumentListener() { +// +// private void documentListenerHelper() { +// final LoggedInState currentState = loggedInViewModel.getState(); +// currentState.setPassword(passwordInputField.getText()); +// loggedInViewModel.setState(currentState); +// } +// +// @Override +// public void insertUpdate(DocumentEvent e) { +// documentListenerHelper(); +// } +// +// @Override +// public void removeUpdate(DocumentEvent e) { +// documentListenerHelper(); +// } +// +// @Override +// public void changedUpdate(DocumentEvent e) { +// documentListenerHelper(); +// } +// }); + +// changePassword.addActionListener( +// // This creates an anonymous subclass of ActionListener and instantiates it. +// evt -> { +// if (evt.getSource().equals(changePassword)) { +// final LoggedInState currentState = loggedInViewModel.getState(); +// +// this.changePasswordController.execute( +// currentState.getUsername(), +// currentState.getPassword() +// ); +// } +// } +// ); logOut.addActionListener( // This creates an anonymous subclass of ActionListener and instantiates it. @@ -111,10 +113,9 @@ public void changedUpdate(DocumentEvent e) { this.add(title); this.add(usernameInfo); this.add(username); - - this.add(passwordInfo); - this.add(passwordErrorField); - this.add(buttons); + this.add(profile); + this.add(searchButtons); + this.add(appButtons); } @Override diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index d0eaa701b..566579e8e 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -30,11 +30,7 @@ public class LoginView extends JPanel implements ActionListener, PropertyChangeL private final JTextField loginTokenInputField = new JTextField(15); private final JLabel usernameErrorField = new JLabel(); - // private final JPasswordField passwordInputField = new JPasswordField(15); - // private final JLabel passwordErrorField = new JLabel(); - private final JButton logIn; - private final JButton cancel; private LoginController loginController; public LoginView(LoginViewModel loginViewModel) { @@ -47,14 +43,10 @@ public LoginView(LoginViewModel loginViewModel) { final LabelTextPanel usernameInfo = new LabelTextPanel( new JLabel("Login Token"), loginTokenInputField); - // final LabelTextPanel passwordInfo = new LabelTextPanel( - // new JLabel("Password"), passwordInputField); final JPanel buttons = new JPanel(); logIn = new JButton("log in"); buttons.add(logIn); - cancel = new JButton("cancel"); - buttons.add(cancel); logIn.addActionListener( new ActionListener() { @@ -64,15 +56,12 @@ public void actionPerformed(ActionEvent evt) { loginController.execute( currentState.getLoginToken() - // currentState.getPassword() ); } } } ); - cancel.addActionListener(this); - loginTokenInputField.getDocument().addDocumentListener(new DocumentListener() { private void documentListenerHelper() { @@ -99,34 +88,9 @@ public void changedUpdate(DocumentEvent e) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - /* loginTokenInputField.getDocument().addDocumentListener(new DocumentListener() { - - private void documentListenerHelper() { - final LoginState currentState = loginViewModel.getState(); - currentState.setLoginToken(new String(loginTokenInputField.getText())); - loginViewModel.setState(currentState); - } - - @Override - public void insertUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - documentListenerHelper(); - } - }); */ - this.add(title); this.add(usernameInfo); this.add(usernameErrorField); - // this.add(passwordInfo); this.add(buttons); } From 682280e3f430cabce120e94d606b2cb270d239b0 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 11 Nov 2024 13:10:39 -0500 Subject: [PATCH 011/262] Changed the whole Login Menu to our specifications --- src/main/java/view/LoginView.java | 33 ------------------------------- 1 file changed, 33 deletions(-) diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index d0eaa701b..dfca7dbf5 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -10,7 +10,6 @@ import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; -import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -30,9 +29,6 @@ public class LoginView extends JPanel implements ActionListener, PropertyChangeL private final JTextField loginTokenInputField = new JTextField(15); private final JLabel usernameErrorField = new JLabel(); - // private final JPasswordField passwordInputField = new JPasswordField(15); - // private final JLabel passwordErrorField = new JLabel(); - private final JButton logIn; private final JButton cancel; private LoginController loginController; @@ -47,8 +43,6 @@ public LoginView(LoginViewModel loginViewModel) { final LabelTextPanel usernameInfo = new LabelTextPanel( new JLabel("Login Token"), loginTokenInputField); - // final LabelTextPanel passwordInfo = new LabelTextPanel( - // new JLabel("Password"), passwordInputField); final JPanel buttons = new JPanel(); logIn = new JButton("log in"); @@ -64,7 +58,6 @@ public void actionPerformed(ActionEvent evt) { loginController.execute( currentState.getLoginToken() - // currentState.getPassword() ); } } @@ -99,34 +92,9 @@ public void changedUpdate(DocumentEvent e) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - /* loginTokenInputField.getDocument().addDocumentListener(new DocumentListener() { - - private void documentListenerHelper() { - final LoginState currentState = loginViewModel.getState(); - currentState.setLoginToken(new String(loginTokenInputField.getText())); - loginViewModel.setState(currentState); - } - - @Override - public void insertUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - documentListenerHelper(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - documentListenerHelper(); - } - }); */ - this.add(title); this.add(usernameInfo); this.add(usernameErrorField); - // this.add(passwordInfo); this.add(buttons); } @@ -147,7 +115,6 @@ public void propertyChange(PropertyChangeEvent evt) { private void setFields(LoginState state) { loginTokenInputField.setText(state.getLoginToken()); - // passwordInputField.setText(state.getPassword()); } public String getViewName() { From 4d6f7ec9a46a5ca57b056661aa93d6dee989cb19 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Mon, 11 Nov 2024 13:13:57 -0500 Subject: [PATCH 012/262] Commenting out unnecessary code --- src/main/java/app/AppBuilder.java | 24 ++++++++++++------------ src/main/java/app/Main.java | 1 - src/main/java/view/LoggedInView.java | 10 +++++----- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 3da2f730f..c8712451f 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -138,18 +138,18 @@ public AppBuilder addLoginUseCase() { * Adds the Change Password Use Case to the application. * @return this builder */ - public AppBuilder addChangePasswordUseCase() { - final ChangePasswordOutputBoundary changePasswordOutputBoundary = - new ChangePasswordPresenter(loggedInViewModel); - - final ChangePasswordInputBoundary changePasswordInteractor = - new ChangePasswordInteractor(userDataAccessObject, changePasswordOutputBoundary, userFactory); - - final ChangePasswordController changePasswordController = - new ChangePasswordController(changePasswordInteractor); - loggedInView.setChangePasswordController(changePasswordController); - return this; - } +// public AppBuilder addChangePasswordUseCase() { +// final ChangePasswordOutputBoundary changePasswordOutputBoundary = +// new ChangePasswordPresenter(loggedInViewModel); +// +// final ChangePasswordInputBoundary changePasswordInteractor = +// new ChangePasswordInteractor(userDataAccessObject, changePasswordOutputBoundary, userFactory); +// +// final ChangePasswordController changePasswordController = +// new ChangePasswordController(changePasswordInteractor); +// loggedInView.setChangePasswordController(changePasswordController); +// return this; +// } /** * Adds the Logout Use Case to the application. diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 0d3b09a48..9826c2fb9 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -16,7 +16,6 @@ public static void main(String[] args) { .addLoginView() .addLoggedInView() .addLoginUseCase() - .addChangePasswordUseCase() .addLogoutUseCase() .build(); diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index d1694a59f..d4d99cfc7 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -44,9 +44,9 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { logOut = new JButton("Log Out"); profile.add(logOut); - final JButton description = new JButton("Describe a song"); + final JButton description = new JButton("Search song by description"); searchButtons.add(description); - final JButton lyrics = new JButton("Search song lyrics"); + final JButton lyrics = new JButton("Search song by lyrics"); searchButtons.add(lyrics); final JButton home = new JButton("Home"); @@ -135,9 +135,9 @@ public String getViewName() { return viewName; } - public void setChangePasswordController(ChangePasswordController changePasswordController) { - this.changePasswordController = changePasswordController; - } +// public void setChangePasswordController(ChangePasswordController changePasswordController) { +// this.changePasswordController = changePasswordController; +// } public void setLogoutController(LogoutController logoutController) { this.logoutController = logoutController; From f951f9acae04d17261bb123937a9e63aa721e69b Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 11 Nov 2024 13:27:04 -0500 Subject: [PATCH 013/262] updated gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 650c91720..a9d2f780e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ .idea/easycode.ignore +.idea/ +homework-5.iml target/ From 180096bc35e3854aedc15f5e58e744a7f5518963 Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 11 Nov 2024 13:38:37 -0500 Subject: [PATCH 014/262] updated gitignore --- .idea/.gitignore | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/.idea/.gitignore b/.idea/.gitignore index dadd8192d..650c91720 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,14 +1,32 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# idea files -/compiler.xml -/encodings.xml -/misc.xml -/uiDesigner.xml -/vcs.xml +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ +.idea/easycode.ignore + +target/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file From 0d5bb8835c04f28ef1a04b7329cd77c5ed000ecb Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 11 Nov 2024 13:40:18 -0500 Subject: [PATCH 015/262] updated gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a9d2f780e..5b89a13d2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ out/ .idea/ homework-5.iml + target/ ### Eclipse ### From 9895f18e99d98458acfa937cd5d5bef1580b6fff Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 11 Nov 2024 13:45:35 -0500 Subject: [PATCH 016/262] integrated organization branch --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5b89a13d2..a9d2f780e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ out/ .idea/ homework-5.iml - target/ ### Eclipse ### From c30beef4c21a6c4d5ffbeec55d1aaa906cb5fc09 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 11 Nov 2024 14:01:47 -0500 Subject: [PATCH 017/262] added similarlisteners package --- .../similar_listeners/SimilarListenersInputBoundary.java | 4 ++++ .../use_case/similar_listeners/SimilarListenersInputData.java | 4 ++++ .../similar_listeners/SimilarListenersInteractor.java | 4 ++++ .../similar_listeners/SimilarListenersOutputBoundary.java | 4 ++++ .../similar_listeners/SimilarListenersOutputData.java | 4 ++++ 5 files changed, 20 insertions(+) create mode 100644 src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java create mode 100644 src/main/java/use_case/similar_listeners/SimilarListenersInputData.java create mode 100644 src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java create mode 100644 src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java create mode 100644 src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java new file mode 100644 index 000000000..6c3110115 --- /dev/null +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java @@ -0,0 +1,4 @@ +package use_case.similar_listeners; + +public interface SimilarListenersInputBoundary { +} diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java new file mode 100644 index 000000000..9876c3b69 --- /dev/null +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java @@ -0,0 +1,4 @@ +package use_case.similar_listeners; + +public class SimilarListenersInputData { +} diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java new file mode 100644 index 000000000..d72036986 --- /dev/null +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java @@ -0,0 +1,4 @@ +package use_case.similar_listeners; + +public class SimilarListenersInteractor { +} diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java b/src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java new file mode 100644 index 000000000..9d5dd9a5d --- /dev/null +++ b/src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java @@ -0,0 +1,4 @@ +package use_case.similar_listeners; + +public interface SimilarListenersOutputBoundary { +} diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java new file mode 100644 index 000000000..e4571a64f --- /dev/null +++ b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java @@ -0,0 +1,4 @@ +package use_case.similar_listeners; + +public class SimilarListenersOutputData { +} From 20b1cbc04a51f88b91e79d31949cd65bb670a6be Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 11 Nov 2024 14:02:53 -0500 Subject: [PATCH 018/262] Added a spotify icon into the login menu --- images/spotify2.png | Bin 0 -> 39243 bytes src/main/java/view/LoginView.java | 17 +++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 images/spotify2.png diff --git a/images/spotify2.png b/images/spotify2.png new file mode 100644 index 0000000000000000000000000000000000000000..473d8391b9c360a8880c1ca7686c24795214af10 GIT binary patch literal 39243 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

Phq* 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 Date: Mon, 11 Nov 2024 14:04:28 -0500 Subject: [PATCH 019/262] added similarlisteners package to interface_adapters --- .../similar_listeners/SimilarListenersController.java | 4 ++++ .../similar_listeners/SimilarListenersPresenter.java | 6 ++++++ .../similar_listeners/SimilarListenersState.java | 4 ++++ .../similar_listeners/SimilarListenersViewModel.java | 4 ++++ 4 files changed, 18 insertions(+) create mode 100644 src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java create mode 100644 src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java create mode 100644 src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java create mode 100644 src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java new file mode 100644 index 000000000..2e9daab63 --- /dev/null +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java @@ -0,0 +1,4 @@ +package interface_adapter.similar_listeners; + +public class SimilarListenersController { +} diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java new file mode 100644 index 000000000..748c65392 --- /dev/null +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -0,0 +1,6 @@ +package interface_adapter.similar_listeners; + +import use_case.similar_listeners.SimilarListenersOutputBoundary; + +public class SimilarListenersPresenter implements SimilarListenersOutputBoundary { +} diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java new file mode 100644 index 000000000..a19b87cc1 --- /dev/null +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java @@ -0,0 +1,4 @@ +package interface_adapter.similar_listeners; + +public class SimilarListenersState { +} diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java new file mode 100644 index 000000000..4f05ed003 --- /dev/null +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java @@ -0,0 +1,4 @@ +package interface_adapter.similar_listeners; + +public class SimilarListenersViewModel { +} From dd55895488caec5595716bb36bb1a368be3f9516 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 11 Nov 2024 14:10:46 -0500 Subject: [PATCH 020/262] Removed the title in the login screen. --- src/main/java/view/LoginView.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index 273e733ce..41a11762c 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -36,9 +36,6 @@ public LoginView(LoginViewModel loginViewModel) { this.loginViewModel = loginViewModel; this.loginViewModel.addPropertyChangeListener(this); - final JLabel title = new JLabel("Login Screen"); - title.setAlignmentX(Component.CENTER_ALIGNMENT); - final LabelTextPanel usernameInfo = new LabelTextPanel( new JLabel("Login Token"), loginTokenInputField); @@ -96,7 +93,6 @@ public void changedUpdate(DocumentEvent e) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - this.add(title); this.add(spotifylabel); this.add(usernameInfo); this.add(usernameErrorField); From 133f642173017b28b927fa5d20e66934b939c729 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 11 Nov 2024 14:19:23 -0500 Subject: [PATCH 021/262] Small revisions with size and title names. --- src/main/java/view/LoginView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index 41a11762c..dab36680b 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -37,7 +37,7 @@ public LoginView(LoginViewModel loginViewModel) { this.loginViewModel.addPropertyChangeListener(this); final LabelTextPanel usernameInfo = new LabelTextPanel( - new JLabel("Login Token"), loginTokenInputField); + new JLabel("Access Token"), loginTokenInputField); final JPanel buttons = new JPanel(); logIn = new JButton("log in"); @@ -46,7 +46,7 @@ public LoginView(LoginViewModel loginViewModel) { buttons.add(cancel); final Image spotifyImage = spotifyIcon.getImage(); - final Image finalImage = spotifyImage.getScaledInstance(80, 80, java.awt.Image.SCALE_SMOOTH); + final Image finalImage = spotifyImage.getScaledInstance(100, 80, java.awt.Image.SCALE_SMOOTH); spotifyIcon = new ImageIcon(finalImage); final JLabel spotifylabel = new JLabel(spotifyIcon); spotifylabel.setAlignmentX(Component.CENTER_ALIGNMENT); From 3f264d6987bf2d1fa92097a809b7e242525e7dd5 Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 11 Nov 2024 14:32:32 -0500 Subject: [PATCH 022/262] added Azure OpenAI to maven --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index e5c1e881f..344609afd 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,11 @@ 5.8.1 test + + com.azure + azure-ai-openai + 1.0.0-beta.12 + From a28482b65ef0a0b6bfda854f06e40402cc44ca7c Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 11 Nov 2024 14:35:57 -0500 Subject: [PATCH 023/262] added Azure OpenAI to maven --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 344609afd..7d631a498 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,7 @@ 5.8.1 test + com.azure azure-ai-openai From 9b38cde42c7766e212790aa3ba8609d6f077592d Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 11 Nov 2024 14:41:31 -0500 Subject: [PATCH 024/262] added changes to view --- src/main/java/view/SimilarListenersView.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/view/SimilarListenersView.java diff --git a/src/main/java/view/SimilarListenersView.java b/src/main/java/view/SimilarListenersView.java new file mode 100644 index 000000000..19d8959bb --- /dev/null +++ b/src/main/java/view/SimilarListenersView.java @@ -0,0 +1,14 @@ +package view; + +import javax.swing.*; + +public class SimilarListenersView { + private final SimilarListenersViewModel similarListenersViewModel; + + public SimilarListenersView(SimilarListenersViewModel similarListenersViewModel) { + this.similarListenersViewModel = similarListenersViewModel; + final JLabel title = new JLabel("Similar Listeners"); + + } + +} From 794b968b45510c6026f3ae6d9df193e627630f29 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Mon, 11 Nov 2024 14:49:26 -0500 Subject: [PATCH 025/262] Fixed merging issues --- src/main/java/app/AppBuilder.java | 12 -- .../data_access/DBUserDataAccessObject.java | 38 +------ .../data_access/FileUserDataAccessObject.java | 13 +-- .../InMemoryUserDataAccessObject.java | 11 +- .../change_password/LoggedInState.java | 42 +++++++ .../change_password/LoggedInViewModel.java | 15 +++ src/main/java/view/LoggedInView.java | 2 - .../use_case/signup/SignupInteractorTest.java | 104 ------------------ 8 files changed, 60 insertions(+), 177 deletions(-) create mode 100644 src/main/java/interface_adapter/change_password/LoggedInState.java create mode 100644 src/main/java/interface_adapter/change_password/LoggedInViewModel.java delete mode 100644 src/test/java/use_case/signup/SignupInteractorTest.java diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index c8712451f..783d792e4 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -9,32 +9,20 @@ import entity.CommonUserFactory; import entity.UserFactory; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.ChangePasswordController; -import interface_adapter.change_password.ChangePasswordPresenter; import interface_adapter.change_password.LoggedInViewModel; import interface_adapter.login.LoginController; import interface_adapter.login.LoginPresenter; import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; -import interface_adapter.signup.SignupController; -import interface_adapter.signup.SignupPresenter; -import interface_adapter.signup.SignupViewModel; -import use_case.change_password.ChangePasswordInputBoundary; -import use_case.change_password.ChangePasswordInteractor; -import use_case.change_password.ChangePasswordOutputBoundary; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; import use_case.login.LoginOutputBoundary; import use_case.logout.LogoutInputBoundary; import use_case.logout.LogoutInteractor; import use_case.logout.LogoutOutputBoundary; -import use_case.signup.SignupInputBoundary; -import use_case.signup.SignupInteractor; -import use_case.signup.SignupOutputBoundary; import view.LoggedInView; import view.LoginView; -import view.SignupView; import view.ViewManager; /** diff --git a/src/main/java/data_access/DBUserDataAccessObject.java b/src/main/java/data_access/DBUserDataAccessObject.java index 377ee6e7e..a76db0d5f 100644 --- a/src/main/java/data_access/DBUserDataAccessObject.java +++ b/src/main/java/data_access/DBUserDataAccessObject.java @@ -12,17 +12,14 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -import use_case.change_password.ChangePasswordUserDataAccessInterface; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; -import use_case.signup.SignupUserDataAccessInterface; /** * The DAO for user data. */ -public class DBUserDataAccessObject implements SignupUserDataAccessInterface, +public class DBUserDataAccessObject implements LoginUserDataAccessInterface, - ChangePasswordUserDataAccessInterface, LogoutUserDataAccessInterface { private static final int SUCCESS_CODE = 200; private static final String CONTENT_TYPE_LABEL = "Content-Type"; @@ -125,39 +122,6 @@ public void save(User user) { } } - @Override - public void changePassword(User user) { - final OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - - // POST METHOD - final MediaType mediaType = MediaType.parse(CONTENT_TYPE_JSON); - final JSONObject requestBody = new JSONObject(); - requestBody.put(USERNAME, user.getName()); - requestBody.put(PASSWORD, user.getPassword()); - final RequestBody body = RequestBody.create(requestBody.toString(), mediaType); - final Request request = new Request.Builder() - .url("http://vm003.teach.cs.toronto.edu:20112/user") - .method("PUT", body) - .addHeader(CONTENT_TYPE_LABEL, CONTENT_TYPE_JSON) - .build(); - try { - final Response response = client.newCall(request).execute(); - - final JSONObject responseBody = new JSONObject(response.body().string()); - - if (responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE) { - // success! - } - else { - throw new RuntimeException(responseBody.getString(MESSAGE)); - } - } - catch (IOException | JSONException ex) { - throw new RuntimeException(ex); - } - } - @Override public String getCurrentUsername() { return null; diff --git a/src/main/java/data_access/FileUserDataAccessObject.java b/src/main/java/data_access/FileUserDataAccessObject.java index d301a3241..abb89a8c7 100644 --- a/src/main/java/data_access/FileUserDataAccessObject.java +++ b/src/main/java/data_access/FileUserDataAccessObject.java @@ -12,16 +12,12 @@ import entity.User; import entity.UserFactory; -import use_case.change_password.ChangePasswordUserDataAccessInterface; import use_case.login.LoginUserDataAccessInterface; -import use_case.signup.SignupUserDataAccessInterface; /** * DAO for user data implemented using a File to persist the data. */ -public class FileUserDataAccessObject implements SignupUserDataAccessInterface, - LoginUserDataAccessInterface, - ChangePasswordUserDataAccessInterface { +public class FileUserDataAccessObject implements LoginUserDataAccessInterface { private static final String HEADER = "username,password"; @@ -107,11 +103,4 @@ public String getCurrentUsername() { public boolean existsByName(String identifier) { return accounts.containsKey(identifier); } - - @Override - public void changePassword(User user) { - // Replace the User object in the map - accounts.put(user.getName(), user); - save(); - } } diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index 71f00862c..ac285829c 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -4,18 +4,15 @@ import java.util.Map; import entity.User; -import use_case.change_password.ChangePasswordUserDataAccessInterface; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; -import use_case.signup.SignupUserDataAccessInterface; /** * In-memory implementation of the DAO for storing user data. This implementation does * NOT persist data between runs of the program. */ -public class InMemoryUserDataAccessObject implements SignupUserDataAccessInterface, +public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, - ChangePasswordUserDataAccessInterface, LogoutUserDataAccessInterface { private final Map users = new HashMap<>(); @@ -37,12 +34,6 @@ public User get(String username) { return users.get(username); } - @Override - public void changePassword(User user) { - // Replace the old entry with the new password - users.put(user.getName(), user); - } - @Override public void setCurrentUsername(String name) { this.currentUsername = name; diff --git a/src/main/java/interface_adapter/change_password/LoggedInState.java b/src/main/java/interface_adapter/change_password/LoggedInState.java new file mode 100644 index 000000000..54ed80537 --- /dev/null +++ b/src/main/java/interface_adapter/change_password/LoggedInState.java @@ -0,0 +1,42 @@ +package interface_adapter.change_password; + +/** + * The State information representing the logged-in user. + */ +public class LoggedInState { + private String username = ""; + + private String password = ""; + private String passwordError; + + public LoggedInState(LoggedInState copy) { + username = copy.username; + password = copy.password; + passwordError = copy.passwordError; + } + + // Because of the previous copy constructor, the default constructor must be explicit. + public LoggedInState() { + + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setPasswordError(String passwordError) { + this.passwordError = passwordError; + } + + public String getPassword() { + return password; + } +} diff --git a/src/main/java/interface_adapter/change_password/LoggedInViewModel.java b/src/main/java/interface_adapter/change_password/LoggedInViewModel.java new file mode 100644 index 000000000..85c81e4e6 --- /dev/null +++ b/src/main/java/interface_adapter/change_password/LoggedInViewModel.java @@ -0,0 +1,15 @@ +package interface_adapter.change_password; + +import interface_adapter.ViewModel; + +/** + * The View Model for the Logged In View. + */ +public class LoggedInViewModel extends ViewModel { + + public LoggedInViewModel() { + super("logged in"); + setState(new LoggedInState()); + } + +} diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index d4d99cfc7..8bdc91f44 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -10,7 +10,6 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; -import interface_adapter.change_password.ChangePasswordController; import interface_adapter.change_password.LoggedInState; import interface_adapter.change_password.LoggedInViewModel; import interface_adapter.logout.LogoutController; @@ -22,7 +21,6 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private final String viewName = "logged in"; private final LoggedInViewModel loggedInViewModel; - private ChangePasswordController changePasswordController; private LogoutController logoutController; private final JLabel username; diff --git a/src/test/java/use_case/signup/SignupInteractorTest.java b/src/test/java/use_case/signup/SignupInteractorTest.java deleted file mode 100644 index 00f757c1c..000000000 --- a/src/test/java/use_case/signup/SignupInteractorTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package use_case.signup; - -import data_access.InMemoryUserDataAccessObject; -import entity.CommonUserFactory; -import entity.User; -import entity.UserFactory; -import org.junit.jupiter.api.Test; - -import java.time.LocalDateTime; - -import static org.junit.jupiter.api.Assertions.*; - -class SignupInteractorTest { - - @Test - void successTest() { - SignupInputData inputData = new SignupInputData("Paul", "password", "password"); - SignupUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); - - // This creates a successPresenter that tests whether the test case is as we expect. - SignupOutputBoundary successPresenter = new SignupOutputBoundary() { - @Override - public void prepareSuccessView(SignupOutputData user) { - // 2 things to check: the output data is correct, and the user has been created in the DAO. - assertEquals("Paul", user.getUsername()); - assertTrue(userRepository.existsByName("Paul")); - } - - @Override - public void prepareFailView(String error) { - fail("Use case failure is unexpected."); - } - - @Override - public void switchToLoginView() { - // This is expected - } - }; - - SignupInputBoundary interactor = new SignupInteractor(userRepository, successPresenter, new CommonUserFactory()); - interactor.execute(inputData); - } - - @Test - void failurePasswordMismatchTest() { - SignupInputData inputData = new SignupInputData("Paul", "password", "wrong"); - SignupUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); - - // This creates a presenter that tests whether the test case is as we expect. - SignupOutputBoundary failurePresenter = new SignupOutputBoundary() { - @Override - public void prepareSuccessView(SignupOutputData user) { - // this should never be reached since the test case should fail - fail("Use case success is unexpected."); - } - - @Override - public void prepareFailView(String error) { - assertEquals("Passwords don't match.", error); - } - - @Override - public void switchToLoginView() { - // This is expected - } - }; - - SignupInputBoundary interactor = new SignupInteractor(userRepository, failurePresenter, new CommonUserFactory()); - interactor.execute(inputData); - } - - @Test - void failureUserExistsTest() { - SignupInputData inputData = new SignupInputData("Paul", "password", "wrong"); - SignupUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); - - // Add Paul to the repo so that when we check later they already exist - UserFactory factory = new CommonUserFactory(); - User user = factory.create("Paul", "pwd"); - userRepository.save(user); - - // This creates a presenter that tests whether the test case is as we expect. - SignupOutputBoundary failurePresenter = new SignupOutputBoundary() { - @Override - public void prepareSuccessView(SignupOutputData user) { - // this should never be reached since the test case should fail - fail("Use case success is unexpected."); - } - - @Override - public void prepareFailView(String error) { - assertEquals("User already exists.", error); - } - - @Override - public void switchToLoginView() { - // This is expected - } - }; - - SignupInputBoundary interactor = new SignupInteractor(userRepository, failurePresenter, new CommonUserFactory()); - interactor.execute(inputData); - } -} \ No newline at end of file From 9cd000fde4eb4a37c92bd0bff14513405c9d2c6f Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 11 Nov 2024 14:50:47 -0500 Subject: [PATCH 026/262] added changes to view --- src/main/java/view/SimilarListenersView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/SimilarListenersView.java b/src/main/java/view/SimilarListenersView.java index 19d8959bb..af73d36bd 100644 --- a/src/main/java/view/SimilarListenersView.java +++ b/src/main/java/view/SimilarListenersView.java @@ -2,13 +2,15 @@ import javax.swing.*; -public class SimilarListenersView { +public class SimilarListenersView extends JPanel { private final SimilarListenersViewModel similarListenersViewModel; public SimilarListenersView(SimilarListenersViewModel similarListenersViewModel) { this.similarListenersViewModel = similarListenersViewModel; final JLabel title = new JLabel("Similar Listeners"); + final JPanel list = new JPanel(); + list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS)); + this.add(title); } - } From 0f0548e90ca836e63b43537edf22f6b74976209f Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 11 Nov 2024 17:11:07 -0500 Subject: [PATCH 027/262] Made Revisions on the Entity Class and modified the code so that we only work with access tokens as inputs. --- src/main/java/app/AppBuilder.java | 6 +-- src/main/java/app/Main.java | 1 - .../data_access/DBUserDataAccessObject.java | 28 ++++++------- .../data_access/FileUserDataAccessObject.java | 39 +++++++++--------- .../InMemoryUserDataAccessObject.java | 8 ++-- src/main/java/entity/CommonUser.java | 19 +++++---- src/main/java/entity/CommonUserFactory.java | 4 +- src/main/java/entity/User.java | 12 +++--- src/main/java/entity/UserFactory.java | 6 +-- .../signup/SignupController.java | 8 ++-- .../signup/SignupPresenter.java | 2 +- .../interface_adapter/signup/SignupState.java | 40 +++++++++---------- .../ChangePasswordInteractor.java | 6 +-- .../java/use_case/login/LoginInteractor.java | 4 +- .../login/LoginUserDataAccessInterface.java | 11 ++--- .../use_case/logout/LogoutInteractor.java | 2 +- .../logout/LogoutUserDataAccessInterface.java | 6 +-- .../java/use_case/signup/SignupInputData.java | 22 +++++----- .../use_case/signup/SignupInteractor.java | 10 ++--- src/main/java/view/SignupView.java | 22 +++++----- 20 files changed, 124 insertions(+), 132 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index e9eef5c81..ccb3a3641 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -22,7 +22,7 @@ import interface_adapter.signup.SignupPresenter; import interface_adapter.signup.SignupViewModel; import use_case.change_password.ChangePasswordInputBoundary; -import use_case.change_password.ChangePasswordInteractor; +// import use_case.change_password.ChangePasswordInteractor; import use_case.change_password.ChangePasswordOutputBoundary; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; @@ -138,7 +138,7 @@ public AppBuilder addLoginUseCase() { * Adds the Change Password Use Case to the application. * @return this builder */ - public AppBuilder addChangePasswordUseCase() { + /* public AppBuilder addChangePasswordUseCase() { final ChangePasswordOutputBoundary changePasswordOutputBoundary = new ChangePasswordPresenter(loggedInViewModel); @@ -149,7 +149,7 @@ public AppBuilder addChangePasswordUseCase() { new ChangePasswordController(changePasswordInteractor); loggedInView.setChangePasswordController(changePasswordController); return this; - } + } */ /** * Adds the Logout Use Case to the application. diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 1e756aefa..23d97084d 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -18,7 +18,6 @@ public static void main(String[] args) { .addLoggedInView() .addSignupUseCase() .addLoginUseCase() - .addChangePasswordUseCase() .addLogoutUseCase() .build(); diff --git a/src/main/java/data_access/DBUserDataAccessObject.java b/src/main/java/data_access/DBUserDataAccessObject.java index 377ee6e7e..e75df88b7 100644 --- a/src/main/java/data_access/DBUserDataAccessObject.java +++ b/src/main/java/data_access/DBUserDataAccessObject.java @@ -12,7 +12,7 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -import use_case.change_password.ChangePasswordUserDataAccessInterface; +// import use_case.change_password.ChangePasswordUserDataAccessInterface; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; import use_case.signup.SignupUserDataAccessInterface; @@ -21,15 +21,13 @@ * The DAO for user data. */ public class DBUserDataAccessObject implements SignupUserDataAccessInterface, - LoginUserDataAccessInterface, - ChangePasswordUserDataAccessInterface, - LogoutUserDataAccessInterface { + LoginUserDataAccessInterface, LogoutUserDataAccessInterface { private static final int SUCCESS_CODE = 200; private static final String CONTENT_TYPE_LABEL = "Content-Type"; private static final String CONTENT_TYPE_JSON = "application/json"; private static final String STATUS_CODE_LABEL = "status_code"; - private static final String USERNAME = "username"; - private static final String PASSWORD = "password"; + private static final String ACCESSTOKEN = "accessToken"; + // private static final String PASSWORD = "password"; private static final String MESSAGE = "message"; private final UserFactory userFactory; @@ -53,10 +51,10 @@ public User get(String username) { if (responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE) { final JSONObject userJSONObject = responseBody.getJSONObject("user"); - final String name = userJSONObject.getString(USERNAME); - final String password = userJSONObject.getString(PASSWORD); + final String name = userJSONObject.getString(ACCESSTOKEN); + // final String password = userJSONObject.getString(PASSWORD); - return userFactory.create(name, password); + return userFactory.create(name); } else { throw new RuntimeException(responseBody.getString(MESSAGE)); @@ -68,7 +66,7 @@ public User get(String username) { } @Override - public void setCurrentUsername(String name) { + public void setCurrentAccessToken(String name) { // this isn't implemented for the lab } @@ -100,8 +98,8 @@ public void save(User user) { // POST METHOD final MediaType mediaType = MediaType.parse(CONTENT_TYPE_JSON); final JSONObject requestBody = new JSONObject(); - requestBody.put(USERNAME, user.getName()); - requestBody.put(PASSWORD, user.getPassword()); + requestBody.put(ACCESSTOKEN, user.getAccessToken()); + // requestBody.put(PASSWORD, user.getPassword()); final RequestBody body = RequestBody.create(requestBody.toString(), mediaType); final Request request = new Request.Builder() .url("http://vm003.teach.cs.toronto.edu:20112/user") @@ -125,7 +123,7 @@ public void save(User user) { } } - @Override + /* @Override public void changePassword(User user) { final OkHttpClient client = new OkHttpClient().newBuilder() .build(); @@ -156,10 +154,10 @@ public void changePassword(User user) { catch (IOException | JSONException ex) { throw new RuntimeException(ex); } - } + } */ @Override - public String getCurrentUsername() { + public String getCurrentAccessToken() { return null; } } diff --git a/src/main/java/data_access/FileUserDataAccessObject.java b/src/main/java/data_access/FileUserDataAccessObject.java index d301a3241..5cf6ef9f8 100644 --- a/src/main/java/data_access/FileUserDataAccessObject.java +++ b/src/main/java/data_access/FileUserDataAccessObject.java @@ -20,21 +20,20 @@ * DAO for user data implemented using a File to persist the data. */ public class FileUserDataAccessObject implements SignupUserDataAccessInterface, - LoginUserDataAccessInterface, - ChangePasswordUserDataAccessInterface { + LoginUserDataAccessInterface { - private static final String HEADER = "username,password"; + private static final String HEADER = "accessToken"; private final File csvFile; private final Map headers = new LinkedHashMap<>(); private final Map accounts = new HashMap<>(); - private String currentUsername; + private String currentAccessToken; public FileUserDataAccessObject(String csvPath, UserFactory userFactory) throws IOException { csvFile = new File(csvPath); - headers.put("username", 0); - headers.put("password", 1); + headers.put("accessToken", 0); + // headers.put("password", 1); if (csvFile.length() == 0) { save(); @@ -51,10 +50,10 @@ public FileUserDataAccessObject(String csvPath, UserFactory userFactory) throws String row; while ((row = reader.readLine()) != null) { final String[] col = row.split(","); - final String username = String.valueOf(col[headers.get("username")]); - final String password = String.valueOf(col[headers.get("password")]); - final User user = userFactory.create(username, password); - accounts.put(username, user); + final String accessToken = String.valueOf(col[headers.get("accessToken")]); + // final String password = String.valueOf(col[headers.get("password")]); + final User user = userFactory.create(accessToken); + accounts.put(accessToken, user); } } } @@ -69,7 +68,7 @@ private void save() { for (User user : accounts.values()) { final String line = String.format("%s,%s", - user.getName(), user.getPassword()); + user.getAccessToken()); writer.write(line); writer.newLine(); } @@ -84,23 +83,23 @@ private void save() { @Override public void save(User user) { - accounts.put(user.getName(), user); + accounts.put(user.getAccessToken(), user); this.save(); } @Override - public User get(String username) { - return accounts.get(username); + public User get(String accessToken) { + return accounts.get(accessToken); } @Override - public void setCurrentUsername(String name) { - this.currentUsername = name; + public void setCurrentAccessToken(String accessToken) { + this.currentAccessToken = accessToken; } @Override - public String getCurrentUsername() { - return this.currentUsername; + public String getCurrentAccessToken() { + return this.currentAccessToken; } @Override @@ -108,10 +107,10 @@ public boolean existsByName(String identifier) { return accounts.containsKey(identifier); } - @Override + /* @Override public void changePassword(User user) { // Replace the User object in the map accounts.put(user.getName(), user); save(); - } + } */ } diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index 71f00862c..241f8aec7 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -29,7 +29,7 @@ public boolean existsByName(String identifier) { @Override public void save(User user) { - users.put(user.getName(), user); + users.put(user.getAccessToken(), user); } @Override @@ -40,16 +40,16 @@ public User get(String username) { @Override public void changePassword(User user) { // Replace the old entry with the new password - users.put(user.getName(), user); + users.put(user.getAccessToken(), user); } @Override - public void setCurrentUsername(String name) { + public void setCurrentAccessToken(String name) { this.currentUsername = name; } @Override - public String getCurrentUsername() { + public String getCurrentAccessToken() { return this.currentUsername; } } diff --git a/src/main/java/entity/CommonUser.java b/src/main/java/entity/CommonUser.java index ba25fd20a..409bc769e 100644 --- a/src/main/java/entity/CommonUser.java +++ b/src/main/java/entity/CommonUser.java @@ -5,22 +5,21 @@ */ public class CommonUser implements User { - private final String name; - private final String password; + private final String accessToken; + // private final String password; - public CommonUser(String name, String password) { - this.name = name; - this.password = password; + public CommonUser(String accessToken) { + this.accessToken = accessToken; + // this.password = password; } @Override - public String getName() { - return name; + public String getAccessToken() { + return accessToken; } - @Override + /* @Override public String getPassword() { return password; - } - + } */ } diff --git a/src/main/java/entity/CommonUserFactory.java b/src/main/java/entity/CommonUserFactory.java index ebede69e3..31e71c31a 100644 --- a/src/main/java/entity/CommonUserFactory.java +++ b/src/main/java/entity/CommonUserFactory.java @@ -6,7 +6,7 @@ public class CommonUserFactory implements UserFactory { @Override - public User create(String name, String password) { - return new CommonUser(name, password); + public User create(String accessToken) { + return new CommonUser(accessToken); } } diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index 0ad073902..cb321a807 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -9,12 +9,12 @@ public interface User { * Returns the username of the user. * @return the username of the user. */ - String getName(); + String getAccessToken(); - /** - * Returns the password of the user. - * @return the password of the user. - */ - String getPassword(); + // /** + // * Returns the password of the user. + // * @return the password of the user. + // */ + // String getPassword(); } diff --git a/src/main/java/entity/UserFactory.java b/src/main/java/entity/UserFactory.java index c7a508708..87418402a 100644 --- a/src/main/java/entity/UserFactory.java +++ b/src/main/java/entity/UserFactory.java @@ -6,10 +6,10 @@ public interface UserFactory { /** * Creates a new User. - * @param name the name of the new user - * @param password the password of the new user + * @param accessToken the name of the new user + // * @param password the password of the new user * @return the new user */ - User create(String name, String password); + User create(String accessToken); } diff --git a/src/main/java/interface_adapter/signup/SignupController.java b/src/main/java/interface_adapter/signup/SignupController.java index c01d25aa5..28fff01b2 100644 --- a/src/main/java/interface_adapter/signup/SignupController.java +++ b/src/main/java/interface_adapter/signup/SignupController.java @@ -16,13 +16,11 @@ public SignupController(SignupInputBoundary userSignupUseCaseInteractor) { /** * Executes the Signup Use Case. - * @param username the username to sign up - * @param password1 the password - * @param password2 the password repeated + * @param accessToken the username to sign up */ - public void execute(String username, String password1, String password2) { + public void execute(String accessToken) { final SignupInputData signupInputData = new SignupInputData( - username, password1, password2); + accessToken); userSignupUseCaseInteractor.execute(signupInputData); } diff --git a/src/main/java/interface_adapter/signup/SignupPresenter.java b/src/main/java/interface_adapter/signup/SignupPresenter.java index 5f02c818a..9f06728d4 100644 --- a/src/main/java/interface_adapter/signup/SignupPresenter.java +++ b/src/main/java/interface_adapter/signup/SignupPresenter.java @@ -38,7 +38,7 @@ public void prepareSuccessView(SignupOutputData response) { @Override public void prepareFailView(String error) { final SignupState signupState = signupViewModel.getState(); - signupState.setUsernameError(error); + signupState.setAccessTokenError(error); signupViewModel.firePropertyChanged(); } diff --git a/src/main/java/interface_adapter/signup/SignupState.java b/src/main/java/interface_adapter/signup/SignupState.java index 4a7f69327..5de393297 100644 --- a/src/main/java/interface_adapter/signup/SignupState.java +++ b/src/main/java/interface_adapter/signup/SignupState.java @@ -4,22 +4,22 @@ * The state for the Signup View Model. */ public class SignupState { - private String username = ""; - private String usernameError; - private String password = ""; - private String passwordError; - private String repeatPassword = ""; - private String repeatPasswordError; + private String accessToken = ""; + private String accessTokenError; + // private String password = ""; + // private String passwordError; + // private String repeatPassword = ""; + // private String repeatPasswordError; - public String getUsername() { - return username; + public String getAccessToken() { + return accessToken; } - public String getUsernameError() { - return usernameError; + public String getAccessTokenError() { + return accessTokenError; } - public String getPassword() { + /* public String getPassword() { return password; } @@ -33,17 +33,17 @@ public String getRepeatPassword() { public String getRepeatPasswordError() { return repeatPasswordError; - } + } */ - public void setUsername(String username) { - this.username = username; + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; } - public void setUsernameError(String usernameError) { - this.usernameError = usernameError; + public void setAccessTokenError(String acessTokenError) { + this.accessTokenError = acessTokenError; } - public void setPassword(String password) { + /* public void setPassword(String password) { this.password = password; } @@ -57,14 +57,12 @@ public void setRepeatPassword(String repeatPassword) { public void setRepeatPasswordError(String repeatPasswordError) { this.repeatPasswordError = repeatPasswordError; - } + } */ @Override public String toString() { return "SignupState{" - + "username='" + username + '\'' - + ", password='" + password + '\'' - + ", repeatPassword='" + repeatPassword + '\'' + + "username='" + accessToken + '\'' + '}'; } } diff --git a/src/main/java/use_case/change_password/ChangePasswordInteractor.java b/src/main/java/use_case/change_password/ChangePasswordInteractor.java index df91196c1..281eaead1 100644 --- a/src/main/java/use_case/change_password/ChangePasswordInteractor.java +++ b/src/main/java/use_case/change_password/ChangePasswordInteractor.java @@ -6,7 +6,7 @@ /** * The Change Password Interactor. */ -public class ChangePasswordInteractor implements ChangePasswordInputBoundary { +/* public class ChangePasswordInteractor implements ChangePasswordInputBoundary { private final ChangePasswordUserDataAccessInterface userDataAccessObject; private final ChangePasswordOutputBoundary userPresenter; private final UserFactory userFactory; @@ -25,8 +25,8 @@ public void execute(ChangePasswordInputData changePasswordInputData) { changePasswordInputData.getPassword()); userDataAccessObject.changePassword(user); - final ChangePasswordOutputData changePasswordOutputData = new ChangePasswordOutputData(user.getName(), + final ChangePasswordOutputData changePasswordOutputData = new ChangePasswordOutputData(user.getAccessToken(), false); userPresenter.prepareSuccessView(changePasswordOutputData); } -} +} */ diff --git a/src/main/java/use_case/login/LoginInteractor.java b/src/main/java/use_case/login/LoginInteractor.java index 13cf19f78..3e8cef782 100644 --- a/src/main/java/use_case/login/LoginInteractor.java +++ b/src/main/java/use_case/login/LoginInteractor.java @@ -24,8 +24,8 @@ public void execute(LoginInputData loginInputData) { else { // final String pwd = userDataAccessObject.get(username).getName(); final User user = userDataAccessObject.get(loginInputData.getLoginToken()); - userDataAccessObject.setCurrentUsername(user.getName()); - final LoginOutputData loginOutputData = new LoginOutputData(user.getName(), false); + userDataAccessObject.setCurrentAccessToken(user.getAccessToken()); + final LoginOutputData loginOutputData = new LoginOutputData(user.getAccessToken(), false); loginPresenter.prepareSuccessView(loginOutputData); } } diff --git a/src/main/java/use_case/login/LoginUserDataAccessInterface.java b/src/main/java/use_case/login/LoginUserDataAccessInterface.java index 681e8a52e..831997d57 100644 --- a/src/main/java/use_case/login/LoginUserDataAccessInterface.java +++ b/src/main/java/use_case/login/LoginUserDataAccessInterface.java @@ -28,14 +28,15 @@ public interface LoginUserDataAccessInterface { User get(String username); /** - * Returns the username of the curren user of the application. - * @return the username of the current user; null indicates that no one is logged into the application. + * Returns the access token of the curren user of the application. + * @return the access Token of the current user; null indicates that no one is logged into the application. */ - String getCurrentUsername(); + String getCurrentAccessToken(); /** * Sets the username indicating who is the current user of the application. - * @param username the new current username; null to indicate that no one is currently logged into the application. + * @param accessToken the new current username; null to indicate that no one is currently logged into the + * application. */ - void setCurrentUsername(String username); + void setCurrentAccessToken(String accessToken); } diff --git a/src/main/java/use_case/logout/LogoutInteractor.java b/src/main/java/use_case/logout/LogoutInteractor.java index 51fae49fb..1c3b5baba 100644 --- a/src/main/java/use_case/logout/LogoutInteractor.java +++ b/src/main/java/use_case/logout/LogoutInteractor.java @@ -21,7 +21,7 @@ public void execute(LogoutInputData logoutInputData) { // * instantiate the `LogoutOutputData`, which needs to contain the username. // * tell the presenter to prepare a success view. final String username = logoutInputData.getName(); - userDataAccessObject.setCurrentUsername(null); + userDataAccessObject.setCurrentAccessToken(null); final LogoutOutputData logOut = new LogoutOutputData(username, false); logoutPresenter.prepareSuccessView(logOut); } diff --git a/src/main/java/use_case/logout/LogoutUserDataAccessInterface.java b/src/main/java/use_case/logout/LogoutUserDataAccessInterface.java index 8263700e2..8ef3c6032 100644 --- a/src/main/java/use_case/logout/LogoutUserDataAccessInterface.java +++ b/src/main/java/use_case/logout/LogoutUserDataAccessInterface.java @@ -9,11 +9,11 @@ public interface LogoutUserDataAccessInterface { * Returns the username of the curren user of the application. * @return the username of the current user */ - String getCurrentUsername(); + String getCurrentAccessToken(); /** * Sets the username indicating who is the current user of the application. - * @param username the new current username + * @param accessToken the new current username */ - void setCurrentUsername(String username); + void setCurrentAccessToken(String accessToken); } diff --git a/src/main/java/use_case/signup/SignupInputData.java b/src/main/java/use_case/signup/SignupInputData.java index 86c5e8abc..4da163b07 100644 --- a/src/main/java/use_case/signup/SignupInputData.java +++ b/src/main/java/use_case/signup/SignupInputData.java @@ -5,25 +5,25 @@ */ public class SignupInputData { - private final String username; - private final String password; - private final String repeatPassword; + private final String accessToken; + // private final String password; + // private final String repeatPassword; - public SignupInputData(String username, String password, String repeatPassword) { - this.username = username; - this.password = password; - this.repeatPassword = repeatPassword; + public SignupInputData(String accessToken) { + this.accessToken = accessToken; + // this.password = password; + // this.repeatPassword = repeatPassword; } - String getUsername() { - return username; + String getAccessToken() { + return accessToken; } - String getPassword() { + /* String getPassword() { return password; } public String getRepeatPassword() { return repeatPassword; - } + } */ } diff --git a/src/main/java/use_case/signup/SignupInteractor.java b/src/main/java/use_case/signup/SignupInteractor.java index 3fd6560c7..72432dcd5 100644 --- a/src/main/java/use_case/signup/SignupInteractor.java +++ b/src/main/java/use_case/signup/SignupInteractor.java @@ -21,17 +21,17 @@ public SignupInteractor(SignupUserDataAccessInterface signupDataAccessInterface, @Override public void execute(SignupInputData signupInputData) { - if (userDataAccessObject.existsByName(signupInputData.getUsername())) { + if (userDataAccessObject.existsByName(signupInputData.getAccessToken())) { userPresenter.prepareFailView("User already exists."); } - else if (!signupInputData.getPassword().equals(signupInputData.getRepeatPassword())) { + /* else if (!signupInputData.getPassword().equals(signupInputData.getRepeatPassword())) { userPresenter.prepareFailView("Passwords don't match."); - } + } */ else { - final User user = userFactory.create(signupInputData.getUsername(), signupInputData.getPassword()); + final User user = userFactory.create(signupInputData.getAccessToken()); userDataAccessObject.save(user); - final SignupOutputData signupOutputData = new SignupOutputData(user.getName(), false); + final SignupOutputData signupOutputData = new SignupOutputData(user.getAccessToken(), false); userPresenter.prepareSuccessView(signupOutputData); } } diff --git a/src/main/java/view/SignupView.java b/src/main/java/view/SignupView.java index f98570d62..38082b090 100644 --- a/src/main/java/view/SignupView.java +++ b/src/main/java/view/SignupView.java @@ -66,9 +66,9 @@ public void actionPerformed(ActionEvent evt) { final SignupState currentState = signupViewModel.getState(); signupController.execute( - currentState.getUsername(), - currentState.getPassword(), - currentState.getRepeatPassword() + currentState.getAccessToken() + // currentState.getPassword(), + // currentState.getRepeatPassword() ); } } @@ -86,8 +86,8 @@ public void actionPerformed(ActionEvent evt) { cancel.addActionListener(this); addUsernameListener(); - addPasswordListener(); - addRepeatPasswordListener(); + // addPasswordListener(); + // addRepeatPasswordListener(); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); @@ -103,7 +103,7 @@ private void addUsernameListener() { private void documentListenerHelper() { final SignupState currentState = signupViewModel.getState(); - currentState.setUsername(usernameInputField.getText()); + currentState.setAccessToken(usernameInputField.getText()); signupViewModel.setState(currentState); } @@ -124,12 +124,12 @@ public void changedUpdate(DocumentEvent e) { }); } - private void addPasswordListener() { + /* private void addPasswordListener() { passwordInputField.getDocument().addDocumentListener(new DocumentListener() { private void documentListenerHelper() { final SignupState currentState = signupViewModel.getState(); - currentState.setPassword(new String(passwordInputField.getPassword())); + // currentState.setPassword(new String(passwordInputField.getPassword())); signupViewModel.setState(currentState); } @@ -174,7 +174,7 @@ public void changedUpdate(DocumentEvent e) { documentListenerHelper(); } }); - } + } */ @Override public void actionPerformed(ActionEvent evt) { @@ -184,8 +184,8 @@ public void actionPerformed(ActionEvent evt) { @Override public void propertyChange(PropertyChangeEvent evt) { final SignupState state = (SignupState) evt.getNewValue(); - if (state.getUsernameError() != null) { - JOptionPane.showMessageDialog(this, state.getUsernameError()); + if (state.getAccessTokenError() != null) { + JOptionPane.showMessageDialog(this, state.getAccessTokenError()); } } From b88c7edb50f65d5ae1f107bad06d50bc1d89dc04 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 13 Nov 2024 14:42:17 -0500 Subject: [PATCH 028/262] added changes to SimilarListenersView built the user interface --- src/main/java/view/SimilarListenersView.java | 40 +++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/SimilarListenersView.java b/src/main/java/view/SimilarListenersView.java index af73d36bd..0bd43c1cb 100644 --- a/src/main/java/view/SimilarListenersView.java +++ b/src/main/java/view/SimilarListenersView.java @@ -1,16 +1,54 @@ package view; +import interface_adapter.ViewManagerModel; +import interface_adapter.ViewModel; +import interface_adapter.login.LoginState; +import interface_adapter.login.LoginViewModel; +import interface_adapter.similar_listeners.SimilarListenersViewModel; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeListener; + import javax.swing.*; public class SimilarListenersView extends JPanel { + private final String viewName = "similar listeners"; private final SimilarListenersViewModel similarListenersViewModel; + private final JButton back; - public SimilarListenersView(SimilarListenersViewModel similarListenersViewModel) { + public SimilarListenersView(SimilarListenersViewModel similarListenersViewModel) { this.similarListenersViewModel = similarListenersViewModel; + // this.similarListenersViewModel.addPropertyChangeListener(this); + + // building the interface final JLabel title = new JLabel("Similar Listeners"); final JPanel list = new JPanel(); + + back = new JButton("Back"); + back.addActionListener( + new ActionListener() { + private final ViewManagerModel viewManagerModel = new ViewManagerModel(); + private final LoginViewModel loginViewModel = new LoginViewModel(); + + public void actionPerformed(ActionEvent evt) { + if (evt.getSource().equals(back)) { + viewManagerModel.setState(loginViewModel.getViewName()); + viewManagerModel.firePropertyChanged(); + + } + } + } + ); + list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS)); this.add(title); + this.add(list); + this.add(back); + + } + public String getViewName() { + return this.viewName; } } From 6f349824d3123d320d2193b0a0a1104d8f6f9923 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 13 Nov 2024 14:47:57 -0500 Subject: [PATCH 029/262] added JPanel --- src/main/java/view/SimilarListenersView.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/view/SimilarListenersView.java b/src/main/java/view/SimilarListenersView.java index 0bd43c1cb..e835d8fce 100644 --- a/src/main/java/view/SimilarListenersView.java +++ b/src/main/java/view/SimilarListenersView.java @@ -6,6 +6,7 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.similar_listeners.SimilarListenersViewModel; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeListener; @@ -16,6 +17,7 @@ public class SimilarListenersView extends JPanel { private final String viewName = "similar listeners"; private final SimilarListenersViewModel similarListenersViewModel; private final JButton back; + private final JPanel listOfArtists; public SimilarListenersView(SimilarListenersViewModel similarListenersViewModel) { this.similarListenersViewModel = similarListenersViewModel; @@ -23,7 +25,7 @@ public SimilarListenersView(SimilarListenersViewModel similarListenersViewMo // building the interface final JLabel title = new JLabel("Similar Listeners"); - final JPanel list = new JPanel(); + listOfArtists = new JPanel(); back = new JButton("Back"); back.addActionListener( @@ -40,10 +42,9 @@ public void actionPerformed(ActionEvent evt) { } } ); - - list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS)); + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + this.add(listOfArtists); this.add(title); - this.add(list); this.add(back); } From 3a5cd74ec3d4551d325b224009395618ccab15c4 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Fri, 15 Nov 2024 16:48:10 -0500 Subject: [PATCH 030/262] Initial changes for user story --- images/branch_protection_rules.png | Bin 375819 -> 0 bytes src/main/java/keys.txt | 0 src/main/java/view/RecommendationsView.java | 4 ++++ 3 files changed, 4 insertions(+) delete mode 100644 images/branch_protection_rules.png create mode 100644 src/main/java/keys.txt create mode 100644 src/main/java/view/RecommendationsView.java diff --git a/images/branch_protection_rules.png b/images/branch_protection_rules.png deleted file mode 100644 index 35c6fb2f8f4ce6487382fa231b7a2f8eb1be541a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375819 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 Zq}f@o0Uia=ig6AN*j4$(n>v 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ð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

MZ?+WANC~$LPHiY1jzNO3KxG3KXc}4H5WtYJr z_dX5D?ADXFBSY1BaZFJ!%l?|D9-#AzZP!^rQ3Vp5y`ZRRoH2C~4{Q_2D zv|*KAYa5c@(Y8a=10%dJr_2I|=~JT~aPygr@GHNdnfUI=Jm)0V3r%2@Qa7aml|_B= zETxT6Nxdx-nCaZc+CShE)li{Ju@2XW|#_{R4Gn^oieay&ntNSRKHO zR!j7{Jwmc#*!wE@5wAZmaOugnfA+ZvQ=aq4xM{aH-RG5(3*qx+m?GpY62-Y}pV(-R z^w1dV^>b*wDv~d%6GhD&t$zP}Rq!>mbLt#Ofty`Sgw@uc;PmD}p6`fnx>S|BPH%sX zZoqk->BhkR;n)Mf6yquQ=l+59#Y+C=0r2o{S!TIKw{9#3pj#LmUYp>+*-Q!x0??@b zSDS1j7h!y{4ON!#ShB36ryE7Bx*s(`naGZWkjuPb!*Kt-H(Ni`(7G*-T=-DDzQ z;re+I-F7kRQok=H5`${Vp5@h~?A;3igp}-yzF$gyk$Vif@qYmo*lco%tCNZW1IhV= z?TD{B5M{e*Wju<@CAuStpTP$S#D?h8tzrH9ZjPCa&i#dUSa9C<{t-B+&~+%yit~YC z4100op+Q;#69gdz>eF;tp}S4L~ruIu`3<$QdpswL|D%63kruxhFT4R zn%-!%)YXMc{I;s;^D$Z9_Iq1cp5H(4VMfvb6tdJf=Bi}vxF-}~bxOm6EaIT*(N8=x z&(F>aYI1rXrWlp&J01m@?7>Y>;`2}2vEhR2#yMC)Yg0~;Xtk3qS*WM_QL=MXW$rEP zEz|PvW`>QO_q|ht${5s;2Fxb$=TZRmJ2mTd`F8az$p=Fpw9-@~N$`uaPtdGN+Pghx z3XdV6&ht@+!^Qav6b6o;-{qn(T54%bW4iC-0}AgtK#W*QFXl;ph`yHAyleX_*l%a4 z>D}2QV-U0y#B|fVgh3|Ndc#g}i}iE^iNH!m`~GB`t@i2qcZl6E!IF%f{b1j3%B;{p z@HBy3;CfPo^Edc4TiI^zvV{NLICl2$S{i}hm&ct6YqrLIu5X`aDqOD!F?tb}WSUP) zv7&NN*Qj(v;*%G)xn>v3$oa%a zRifGyXg3xrvt|&O`;JhCL4NX2%HoTW2A4Nmr`{QrxuInPi+&oUgkc0wmA&O`acFsL z=qY|AlP({rlme`o$-vTZsuWIsH;#G4)nRx}Xm4KeOksG(@txB^IQ%cKG#-I_z78Zb z8u{TPd3Fu8G&phl@r3xvS3NOQpL-Q_pJ2EQj4pCvpE(b#d(USfzdf5guWuDx$p(vW zucz8l3~9E63#~h5Vw|17)IIKA|6JXzz|MaUTouN`R_S9Pd?F=E11+BpolAU$k0+2xq`*j$*H;jCv=mWF`OGW7X1x!$iPOYh9Z1~hCvv_3=aSJm6M3=a_hSamFeo_?1>u2yoW*y9BswATO4G0K zrOvO4+N!W*7v{hE5ZDnx<14d*32u`J!Wu$tZc-QKHl~il1xp%>0VNM3T<|mWEPzd} z^nCF6SI6hy=)8F>02%#UNLK3z7jASNwfLA$S@U;*To4~h#eH(7F?K92`_zV7vuRn0Y9N?4OMCI? zSPPsaLHqq-3zXw@=jt0MS(>8DIq}td(w|Z-vebcuE?>zoF@w(H9}ZpdOqX`5vC~gN z8cuh;vUi1*%*zuUCl+NDZYSkCw5HNh@Z0_qaB%?l<3x4bOnAxQ0f3JM8x2dA*iCFS{gv4UFUDx-1CgPYdIfz+;Y-mqi<*%wwLA+9QS3YzS^iM zi$OS)j^m38l$tzzmV7btbOJrha8nTp+h4cZWTz;mHr9UCoF-tG6ggU1<|f7X=|_9N zOtm5&$$fjR9Y|~XeP@P$in(t908TE=D3U-h`{Um?!{Xd zHQebTsjq{AADWzt`@Y3MF5wMt#mJP?^z`JlK5OQJ?e1@T6T59I$hIh-AQNY4#E{zw z3W>F}c#Vm@4;g+0s{+quJ|6H1U<${LnAjNUqdUT7S5So0PX>QR`*1uJ!LONF6eqv^ z>JEMx_=pi(%-JB&GxWgg1jxqZ=Y1eKoxN#h70IA)ztl zseg{gK;$cw$+z{-VhOmA50UcZ(zlUFFA0CE>!b@}QV3pWjWGJYmG{iSg~{(?zHh_z`!sZr$6lq#DZ0-7#7kANh)~w!v5+0W6R+x^o$bz7J+uk?@`wON3 zTPDx%1KH--fuKh?GW(|Od*AMF@5eGR$6ReWMOhq_i%`$J#Gu}17nvk@h%NR*=T{k| zpseEBghhBiVA2{#FX}mRDv%!Gn?1Q`E2s}$eNaKvDqY+Cno&$+c!W-l$0XFQ({u8K zXB_+Yn~luDbUyhuF(md{gZ{~8Q8d|)un2RhTP!J z__%U?lQ!E?Cg1C&ibJEc)gOtx%F-JohSPq@n7Y)d%-C#a-)4tAX7YNf4yP2TOTydp zM#LMUyCRoGlA_;8Pey_C)uBWXMm= z7LmtnCSrV?q^V8WN!j`oQnyP3or=czwbc`Y;(^_G-i>j?HUzLBR#6Icd8)mi>AUWx<7+MsRa>vN`q% zD1^7SDq^aay2UWd{gp3X&S`;-DJ+vI!d9bXsh=zi@-A0!Bk$S;ZTkFh>$`aMV7Qb? zt+&*5Y)jK$CH0CBK4{Wl*#=)paV{pVfa#c?y5hzgPQ3&BW6B(?Vflq#nf-l!cRc|E z^C~k!1_1zsaMFwPYE)gsg;djg49{-kFSn+)Bhd7lEa64u$xDn23nDn`s5X1qu#+bG zTA<{n^61~g^`AJc7!=z~NsnkWE%<;cycwq8^=tlf%R`R#X87SfehoU+Ql6wHcXU&$ zc;#mpHftnR6MNIQC+cltT&QOFo$e3(^NdNwnsGF3*UG?{<4ZvuJxU=%J!<_=$san% zzSdUJ+-<%%jPyR|Mv0sbl2zy)nvGdzZ;rm%z@xkYXi?o)a3-MlHfF5bxN!6{djpCJ z0LpLbpYYrXP10!tZB_rYz z-$H!!Z~C6atCi)p>2^QcMWU*)2FH}=v<6HhwAgK z$xsbcsdVeF1{M$va~M~v;>Mqbr;bp)X@&_#P-mDu?t0Uo(dOjo_&yK6f*k?zzba&3 zwB;!vw%@tB1$}bCH{EVco_rdpiVHfowTz_RA$td$+x|pB3IExcRn)={d=sn(=;@U{ z{|$@c?X!yP@T6;R)I{|b5SwkL>y}UVEI&~aVpBKk=xDqCxGJLd%pv`m);hwD^?vnT z6fH~ARiB&UVO4nyNsSb+*UZ#Q%70MM+fEm zQT}6o6Kjw29u$oDr&r&#`}{8$p=r2$R1;99+xS^rb|v?0yG{v!8w&?UiEE&+17i4V zWA|>YC$hRNrC&Oa zqFK!HJi3z+vkt%oh)X&S04^xKfeEk&TL>Lkt$NUsoNAD_bwSL_r8Y*gPn4kVv}mhr z4Q`)Y;tfx8)zxO#VXgL^H4OcY5Kj3g&XX{Hl{ENwKxO`L?DBu117SA)2iLE!TQ^r{ zt-P&R!f)@7{1AAS%MIb0Ell?A&H9(n2OknhtZr;X~=0C+C)|C$k z$v4kHFO2xnK05wEO`7VBq{sdS1;V-vj!(}vcrn`6XVdfw9s^;P3PK+c>0_Srj2 z$cX{yNj8Y-8}{!N!%VIM9#8IAZCdLJV$a&_M)Yo+ktoM&OxKRq5qRdr7<*%3A8cv? zBX@bDZv4M}R0&jRY(26n*W6Mn*B-s0V__!XH0kk4HKR^^YIMagy$}|b!l7TAY^FKQ zX51{$ED{!0EPj0)bm4tvrjoOod4EEFjK8_hk1R3wl>y#qy zDAX*h^qYLg@X*9-$em5g$M<^H!!+4lv8%szzRh6@0Q%c&c2LW8F+hg)MP+0S~nVjRWZW>jrWeC}uM29`vf ztVj_WEh!+)`tn+4J}JEy!C*~TM~|nDk zMKAEJb3jK?6mRny!~Uol=#slAsj%*hfepV!14-)_MI}v6JGRwR6548B0KQI0oyQ#P zMK4bDa-todX1PySu5Y9kk*TdyZV=jc8Spg1XORkh>I`Nj=k%s)JTQ5;EK-LCnbCp? zHwN4JC>S52-05Ta69U?az{sa^l~`*I#TG9BGINli<{%Ykqbn>)c$6&dMQDXn;U42a zj$LDC)t3BN1$>RhLU5_vk6}POJm>&CM)Ss5k=rHduUK|VKzb*}QKi}I_E4`2P@>vg z#U=y6jKqHIuW*)iO>0cTcS<5S3SwyF{3*hm>Q4CLCZy#euF%#cgue<6bT|;TTQA=+ zWvd=d<>{^0Ts2Qw;h1fk!^7Bi9!V?Py#~{eQ{`g`*6mkexT9?~Gz-4m z-kLcf^deCm^Fx`!Nl6)#LP|KjtL+LKBYCSsoYwM!4B8X5ZpCYYKp#u*b27<9vscxa zw$xqU4LmYnVA^9@rbRQY^&4_n?up*t>K^gn^Kq~(2%x3CDaI~@dv{uOrk5ANCl z2gWiJT1x45%q=9u{!$Qnp{Xa}A8^^U0ck&sAY5y|69`ZhS1Hew|@;^4jHqWj(t~249Ug4h?jO_ zv5f*5)`zDJcip4h5vcoeKnl0&m~;xRF+pJ=!wEudKIUG}<&X&ghib96_<5-v!s7l* z{l899jFrtnk1Wh9*e3feA}ogo3lCAd3i!mgEk(<`;o8PtR^j@;TpQ<9jzOvCN@B|8(fm>&SfHrNRZt z#m9L<0YfrIo=u5Cc%yn@hX2qVa(CmkXD;gHm+izUMr}Gmc@3+ zVJT|l?shQ4^xx4*cpwL;0J)PcyGiI9hJ1D!Y50^2;@4;aX1y^o#!>vh9wS7f{fO0t zaFuQPhD~5eYP!#*0iq!^0&kH4g}RSmw7!;XV{(L~RQ>CCb&SYg|Gvo)hoU_GF}rD= z0^mRP?*=iVfEG7vyR;G&j&baAK%kSSoVy2-x-y#wWm`JkYL`x|bo@}4>#x(b9bo<= zC}lK>9D_i%!f;f=f{IZO_B%jxA~L#sKd#ru9YpbbDad3qZ#l*U_U6FDtNgI-bGlqu z)$mUf$%lOMq5^eBaBaJ#d-0AtL1>g$;9b-l7}Tb|Nu>@+1{p90QTulZTTshPk;WSy zK|?DUvEY1!m=d<;$&ZhoY6yGGxYZ>JF1)M00dD@9&QDwQri}?9mY7R zHWl6KQ3V;llnFU!%8~O)H(35&Q)S0szLA-@LiWPcDUnJFTw0KvjhHRZGrNr;ra@*lBy)33 zUO(Gp_Pw$aykxaxF!wyy5z>5(U-IaHJ-~qauV`grC!lfC(XTvUKatVthX4BLdUZW} zrE~G6*;1!uQW191`2@$*btXRqcEiBB$MjbKv&gyuSE69$;Sux6j@i(Q3SX4cFQ-LE zi$#)TqQy_Tavdi<3hbCn1P`{EJlue~A3=IN%^CFp43(WR;hg=imXY1{P~BfC-<_+7 zi%!L8mbzKLfZCfbeQ2ZfU{4mCta7OsG@X#3o5P?Veovcoim zG$;SqKTg%#HF{4@epNluHgq(ncSCKtU|qxTT;mY0A*x1tNBlQ3IMevL^}1=*x7J~n31uU*A11$ zY3I9g?0886)0+w!KJIElw*S>nl$6L%jKXppAY+TP{;3x`Ps>}#MjyBPy9*5nF+&OYFm z2Zmc~vN=M_X_%L6>g&ehF;DTleXTquAL(q7h5J2USu+NfjByMP?ZoS;#O+I>&V3VM ze%liDL9lGc4c*GYBpuzB`$q^|{By)vc_$X+R|k53w(hX6_nB#_h$1uqnsq@;vD>-W zxk9D|*@3ZoPVV@}O_!^gowr4D{zOi|Z?``)Zs~szNN=FIUbd`7P{P>DDoN4Ge07C# zs7guXcXNxZB>h!@C?(T*qW-;28XW)!H$UOEDFp45A-GNTq}bVBH{pR=H9?VB;=r|H z7v?D>kAWGK&#arFk;eTy`3Ax^;wTd*5pC|-R$H!0jb6Ia~;w?Rg)z60(RWd_~dqXWjlf3A~^Gr+j#B0Z7O zRM=fL!y=+`+GYByMt5z%{4=gqeqI}O0&nLjPSpo^_v9o#2`!Jf8})EueBQ$#ur`T0 zzc+uD{uS)4ZdJfIm-F>s7$*nfbo4yB3DAr?)E~PX&`{}O_X)ou`jmVRn6z&6|7CT6 zHKoRLl%8|$NeDh`IQ>_+8^ePMhHX)PTZ<7KBD8qr+8%gLZM=diibg05>ep0fw?yea zeZ%RJ%JuWXQ(#_mAq}A8b8CKa;_&$iS(e{nL`n?X`$7U~`{oVp7HNT{7*@H!M+^3| zdn7nXbQdyD4l4a5+UBP2aCE%j4F6yQos_g|-TZ~Zk55dNI(ip=_h z50+N|;9&BnLe;WzY;8du!p{#+{^qCx@JX;V)2Oi-k1bVw^#3F5s{^Xqnzt1}Qc?-2 z1JW%Z-QC@dNOw0#cSwVTAl=<1A>G{|B_Q4X?c*)+z2E))cR1{`SI(?iGtWE|LUYM5 z^7ZfI?_7*{fMl0<&dFVuez*0+^=|2!#(p6a=`A4)$Hl16VOv_e@(~sfh#{^t<2EdBltun{oq3N z7AX^jl630eW&P|M(xZ-5S1J}_7to8djP^8(>)OQfcVkMbm0s$VR$e?3kI?Q*?H-x( zl&(P<#yuW}-cIWS93wpr>w8&%K7Zy*(HA558A$6hc^ubdrkDVNJ-ol$p*yUYQtE zP%#J4zlTR9(){GhnH4kr1JElUfJ0@B=(XL>A697q2~SF^c(`dvi!4y@mH7F!5;ZlW z@hJW_~GeuJGg$iNAG!ySr*@6Mu;Es;nisHko>T>4>qUuwkusWCtplXoIrtS5(z zv>Ko5b_g+9l}2Yhtv+=(irC(QU&7s1rAv$aV_g@WR*gtoPa}m}nL;U_N^-mw&eX%o zh!me<$M-97zBr9uBkY{nF3WNa-)W0c1t#+cuF8m66AizRB(C|@B**!WKZ70duMv#B z7_{5;8nN>>yZ~bS(Qnk1;wARh|dhu=-x@OW<5G&3GK^G&d z(l-7qk9;XL88Jf(Y*IwP^7!IkXY)TU(T>ls)u`Z_yQS!tbwaz_uD{Jm-c6RB&9B#T7l2q7SO$EeZi&2OM`CLpP(=NY{g@w*#OwbdiYK@j7A@yKAZErr&@U#F(e!|4nbg>{L>CbwDp`u z*OvMQ-%AI*1FNF+6ausgoXyMPO!I~v)Ff0Dx0`8IazLEJ9g|3;O->1@ITm-zpWx2% z?aAd~z`mrFi|J2^X4#6`&+p9_B-LMla6V*j%+x4%Dl2!BeG>wL)gP;HXzlA&hUgFZnYJo{Od}H)Cog&$xN;F=f?b6Dy_zD4b*zc zas1lG4*qvJ`YzQocrAuwCPZ3%OinpyM3kslCVJf|Q&5IP0>a zLgKgUP|r*CW~;>0-Y;v+dhpO!DwFi`dJ4Lys@3aHAwNfZ(-Hn1dl&-<%4n?3a<6E` zzlJ^ct9#cwRh0%4JXY0$0M~cX2{>pZ8!=#V^0VL~xDScY6ym5i@QnDsKM4gKGa6k^ zXk66}IG8171f}k{zCE`6)epOvjrx0{MDWydTI2ZAw<3- zxuU7FeYb|@xx2@h93=v`>2-7qdT?!>8g-Rw8>6%$ZLAnHwL@9YYEOiFDwQ)yy8(L_ zrjOXO7BG2XH#Ik!92O#&&ut_bfH2IrQ@@@{A183+ka?>z9ywsC!Lo_m^X@W$HRXh9 zTcf>7TYUU(^)?lzHxz8^h8)m?oiw5?|8F=Kw#X^ zHgx;WR7t!S5?Khr<6>_$tsilNj^7z*$-aEyAm%t=*Nb8^3M%PU%r`NGxVXYWf(vW+ zQBslg_IoimgY*#}@8W$qPx&NQQOoQEa`Nz?t8kxW-Q22$dqI;)E6f3gU2C=NW{A^_ zc|3W3{4AJr{$4W|Z<*PmP#ePIsz-SAE)-F2=hN&J&Yf-|YeL?=kl%{qS(DQTBldW= zRSynG(}FkyO66v63>*P<5%m{}*-o{7m9LP#u6&U;tO`Za7^ZjMV7s66`)MTZY=uef4Pd*#&VX=FXE0JDFq{$=Gna-3gd z#SSN1lCrjkECB1;5Dap#Hkor6tvy_k<5Lx)w>Vnz?3qIQ>Z-JH<1Mwe8H#8qI*&HBsN7yjz5_7!CrP+^G^Z^IJ zL|a#y#|^K#O!?UAD0kxZ=Wx-D=2CO|^_@{^-_Ab~kxuT=g8^Z-ECFm!(=D6$>53=E z3F#{XfY>`l0Rh8A?NwGaS%7I6Ao3ssE38$?i|JX~>QuLHvaB};ud<9QRx9n9k^@T7 z&2cAR4PYX8)(ULR*~h9c4m1UAhnmjWW3}rHd=d;%a$!YQ2@{z203bPFgWEs0$$l3t znp!@-I#%qOcM+IAziLdmMgdsbf}I#Y(eWYKH23`YOnTC&#HEgp5g)B?=5oO<+n`yi z`W>hvH2Xm>HeB!}xC+>5aN^RXCOL-MG+|Pw5?Y-n4 zAD;p-%G!iV05O?+i}Fp3@o(gGxcFV@dK!SP6)j0!kd%2nmwUV@;GT(FE1tA_eS3X) z)%I?dx6yj4s`ypd_x<`j{kcf48~?8i7##6d*0LKfVV1J~))moUU18cL?x^{C#pdHn zAYo5#wX5MbJDVQNJb=Kn(8tRMl9A!e_3v3PQm^?@HNGtF)cB~2UtC3iUOYOJo!2Q6 z5(T|lr5O(0HiM-R$43R?e5G&bQ^1~VTS$^6hXAE)MrL`nqJk>_Y>bS6H?a#1kOG#H z*@cHkRuJ=^JXkzdIi~iTCj9YTDN~ty*O|z?HBy2uR*8G(ioX08Z@=*;qvl?x4OY6P zR9ONa)GGqvZQ))8h7L1R=uLJ8?r!<_ zw?IPwq(`1FDBbALb<@&xv`vg=pps>z9@@3FQiR8$dg{y90s+U{>HZjk~lUM12C zpmq~^g{KrpCqd&9SvK9}OQha7l6-zU{pa(@BJXMKpOg(p|IDTWL8C2CuWPXY5t544 z6xIM9tg8NXT+MoC*rYeM{*AXA*e2u)lBxKP0RI*^4XY*|G$#E3(c=up`8k)$BxZ3) ze%kh$$OKr&=v^lzW~$BAQwJ#-{z!+9WPp86qoG2fRG5iYV>H4CRO~h!lpvG;3+mhe zYxTpX1n#|1UGbbOYeHo^80nV*kx*e+0Z2;?r=*!*sKU>=OWU zfDJ70oQ){&>%<2uQA!J7DU7u#%r|2H^97(1Fy^8pmhAW;zlJlI@WJ^Law61!_TS4r z4tVa`Y=mL;LGzKeV15DHK7aBD`~nXp13VdC0>JRa1OhjI)1u`mzOVviu; z_v9<914NMxumJO>4C`Jk+PjHuMS6$+O@IKmem;dDJN2)%0S$p?b?CW%akmI?5)f%O z-vF#JOkgpTGX~1ac>lPu%mEVg*BYreROwK9ORwU;){ zY@wdGuTH`_(lxtV2#L8Q-p}+74xNe&TB(2req*Sw%DsKjXl}$5wEz2hfwx?;Ah2Y~ zig*%|OeoVpn)69}DZmUPwoakA){=7H6Ga@NfB4O>-0BO&Or^0rQ`WnELHSxMl&#ra zE%4n>ssl)@dIgwyBa7n5dcQ1h2rw1s2zv%GJOFb=ren)vvB(%{F1$mpn~U~y*j4r) z2d~x|;c3RFnto#x=1coqOn^M3s+IuI zPtQDSh2EgywvP5@DtR%@%EoEARS*8vq&oW&`Fd}BJdiTfHzv)s=j~9kSWz>3rZvF$ zZzLpMjNr+ChKwb!M<`RXNMO_K;w)3CQr7Bw-vHczkIy~=3bViU*tyfT<@P+jAr?g5 zautkaF^Z42-sHG=RIZ%W>t> zr&6z1019fP#9>x6P>n_zQAP?#XdKnFxSS0axk_Uqj-h|QI@?YxLhmU2!MbmdZ_Z8{ z$owz*g@*>rN<%|VM#8`enUuHQBW3DXe|N>I6B zMPx9Ql5Ei7m4^5uZ7zqM#rBF&$dQoQcpI(4FlM{K=1)Nk1_a$ z)i?tv{U}*VrM}YUcWMu$5Ta8l2b{zL94V?&Y`ib=9csCt@29lfMfdr0tE4&&yADg> zJgb7c_7P>Q_iC0rW?lO>sLS7W+T0U!{G(>PcmUN7^%nM&N~QD@SB?9%LlZSX;H;3Z zpbEH#3pRpG_4WW*ai8*V#*Kbo+%|FBTbcvhWf!UuU*`otw@ozK73>Fd1|Xj=TW$`f zTp`ic0@b8Iox!^~Mb>W-P1yTYDV6iU1)!D1Ns2~}jpuzLVCiZW0YV9P=YFn@BK`4X zr?D0juGCDwj10k$E$6b{#zK{5)9_uOY5)Us(DC&v+SqZq?m5LpQ&tqNiEYoafgxO?i;c}0(insk*3Zq~dL<&n= zC~|D{`+7)D8(>?oZZ4TuuIgS;t0_#a0F^=^<17KX1qIc(Xio)P?FNT1SdzX;ZBlFA zo~SH^6q;8BN+qNAw0)9XNTs~kJSpl$dtdg`K^R18JU6Aee)XYC{5>}YjJl-i%n)@2 zOTp{Cu^5$y10R_`g7|BCVm!;YV8aAbU?`AIQ2gLtD4E-+#<>9X2}LIc`?jlnJP1FC zXKR5?4vZT++O# zZ`pL1BmuyzfN}%MS_`5k_!`33k~h1`SXXxqifM;c>C2ez~@aV$-GRxP!q{i|AblM4-s} zsKFE_+>bhf!2EE_o2i2~&p7`X_MZld_wDv1y8unYHwyQoMAEd#vDs9bHzpIKw1z8n ze`eY1hoOGbS`6~ z@-hd%GVON19@`=gfY?SadEN>(RcdF)Kl&QtRtxx`!~pnG$vJlJ<<^K~_zRegfxadC z`@-lCX`wP1mtv#k_SiGEx;`iSQ|j85_XQbT2u6-qSaP2YB!{pw3IO1H_eGgDh3=Ti z(9#bbJWqpwiY(yzK&*Y|*3cL$bB|QzHvC=oRaQt6M!S3dM%_}ur3Ilfn0mlz_w=fq zH-b9@lB4gWSrc8F>o8X*k zx+!!-)c3A);Z)oJ!q3$Op^99f$OKN)?9j_^wln3#WfvXrGP^vjR{n2&Y}(=7SyZC^ zoSt$R2B^GA8>9ff{1j^g=scP9sHql$Fu;*HWlt@^6W|&q z9v5VKS1gAgfSY;M)^dL%&&lk(AW%@VCBh9+zN0jKVSDnr>yF#i@Uf2Ig#SteYUCX` z3S=gBW<#cUR)hQ~DDwl&2RUQW4@yLt4cIY4a%wtTcSEiYh7Nl_nq2o67l<8}_V1e< zH^!5XlUMdST$`o2E(`O~U!HDVhM^Ctv7<3tXk6BtI;JqLZsys1yLjDXep_SCEiBXe zu|>RI*WjN@GQ2Z$q*KLW95YyOn23NR<+`_p z%R;M5VVK)=7EV@IazSwj>UUlH<>ou+dhtvD+{2K`!1vtF)yPBwJ(9eo(lV)bcvq)} zO6(4icp9x3s+sbcij%t)ALzBII$NBh!ai;7zqkNEW)upUx%^4?n>C#w5P?x#mQ%7# z36lAoXN}jzsD!FCp3ivYk}9`O?5hYo%Bqb6NkL-X-R}T=GU80_SF+4D60)_=${Pv?CQnVckH;w)%!rDN$S8(uWs#(C19GU0<5Q z8C=u%VmI#S*;~KC80vp82z&vWb`}mQMIiXtbaTWVm+$H`U{D^5y_dJF-$7RZ>Op>k z>3p_tYdF+fNsfjq!1t9ER=UK9IU~A^Pk~X5y7YZKO@U&rf~sqHRkmskt!5(#;J!j} z3iVSJguh@me8Hu_&sw=oocy3bW+uJ!seR|Raf4# z>)lS)*HS^R7J{NU^uO(105or(1vQ0ZL6!i6B1uW)Hup=$L24%_htqTDmb438KOna5 ziTBPu{I%)VA+_&;<&&Os4!lv!p7FyZVSn8!fANX5Jpp!8TRW9)XcA8{i*=@L4IU!n zffXWBM`_YUo8K{__salplN^)Nq$mbu3x>;sbRU;ag88mZWlDq3f)T~X2g}YUxhNa_ zR)vffBipve1l)Y_xU6n67I~!*0H3d;%1qdc1yiMatPF3W&+RIgA@S5sxeZodIBvbW z5(6^VdgQ-D`(cfXEv}KveczT=R6#6M@Y7XfSMnm9R}YZV-ePo{h7yK?LyrnJ(WgN` znhik2Tb5;k)bzstTP9Xg0n;`$4MOQPvZE{LXxhn^-LbJo|AA=cv?D@U$tj*$k&JGq)eoSc^p>f!@1+;>C}C&t&K+M2gJO^zf=>;xldhMh!qg3R%=rr^125=Q zpgLzyK%N}7AiqMSuh9A44E02@Idu$`xh^F?+3N+EL&eWy^+Z zqnRsP`++pM;~Pz94DU@Pr$VuKuFqWPzG4ovl3rEDfiFVo8)6PjmKGNvUL*S&>Gvrj z`&#)xXB*2;)P3G-*EzGr)Do3BPl8+VlW|0r=izulTShmoe!D5Q+qw0`{$8%uN>((5 zsc5hw1gdb8$QMo=P;j0xIUu?KLyA>A%b`6@moLE<0`4H+H;|%qPFQoF?w%#fH?AbY z-E+|!^cEgZmT0~*ohlriQyPIlU9K{2s_){5;c$}qa66%iX4KC+Mly4>S^W6wgpQcLwsfQ=>uV^CSQ|6cLhwufFDn7P_&@s#?Mo%~qc@iOnr4s%HzUPODbhj7n@ zl2I->huEA!e`;wBl#JZwx{KuSJd;Q(=@fS>Y%*AJL_DweH>9`RY@1t}S2CY9wv

IDWH+Za$caYWG)i7MkyCv4id6N%ySwFmArbhf#@hzp zyU~BlxW8o-!~wQmIr{0lj8I$oC05gu6OCqga{c%N5W5Lp^VnYtX6Tv1b!ICQ;_XOsIkq>v}}dN!qqc-kvBv-g4f+E z{C3^7k#IBq0k`7lw8OOg{XSPf1e*v;|De3pDbL3v43lZPo4#ev{-Vt;9jWGWY#g4v z{Us%y)7GPkO)UM3U+8~}!Aa%860LRx2~V_mP&@|c8twK+3epg<{C3(tw4>CYSAQt# z#6(_fM?eyqzB}3}o^2SiCx$sZWm&_2O4WRH<%4mGyf()V{gKvp!hT2vk=`&oiKj^}8-}AM1DoEj?^M3x$z1f%4@RBdg743i)BSr7qmp z29$Zek!vXzYn*-8ue+!F4RH#_(!uVnXky{Lyw6a=c-cl!h-dj(O97KfF37f!mOgS(%`aT!X3@1i za6&y&F~R4|Kq}3E@pB7+ildydT^pZs3T(3PBe~@x$b=Lf3^%p|)p`@{P?*=U;g7eJ zxEvm;I6DRBYq_1ihSE?u4W3wG{KwCG5CcAbqHLbqE~|~z`oB@5>wq~pI`Tm+SD_Y- zI?pl>kYekBkw(*m4Rbl!%NbjK1D$H}PzoY~5*>sjwf@$jsHNVp(>^!zl;r4rSM*-f)wWCV6^yPB1F@L5WFjN4 z>*G;&Ee{obEhKz;5m#HAsTjpVI=kUVb*@vSJTH7Pd>_HCoPtEWRG~y|V*+<9*E^YV z&pMS;VoS-=oA+C919ZQ#8oyY@biTNgaHi&SqMKjB+MHf(FfRPjQ0mN zLJQMndX)RDK*kLvzmwq$q9VD)7AA8I%jZ)|$ULXJ+#_LbT*%E zW6rP4pnrSakN}U@2IBIO`7B-XUN=7(m$~%PaSGpX7t8po8_1Uk@~u(@Ty^NuE7RuJ zQid)1lQxs)%A0=dhhZpqha>F)Y<8K7Dn^y}yhm#$G_Q=2jF7XxgmOLAr)j($=)`Q6 z-6Z$GUnVdf@z##T*o=PM5h~=l;NGAI7+Nwzi6HXKYs+Ny;=8*~_yp7c;V%8}IJP7B+<$Bjl4D56tpgAJmra$SAorXEb zsXc#Bkh~B#fPGrsfaDt~UNGC0{C4DNqYweYhq7siQy&VE`jQULT4*bSEV205Z^Yb_ zx^vCDbMk5IN*15TS>28|Bn=f$-J$s;UfF>JOktRfPNrb|{QZyzfk~}-;~4(Aiv*|R zz$nCOQAOvm_(z&1Mw3wq%LX<}yX@U|3Xvo(^I$|TLrOybE*f80^}4r-oO4?qz%Hb~ zB*gS3y4eb_emu)_Q7p|>kUv&*uk~Sh0IVh7BdVbGFTs$eL!r<&>hDz7pG2(UG^rAd zAoJZ7G-}*_I(pWAYa}xS@AwVdH=x5AJtorcdjzvBO7hY?fYTQL(k6)TTrI&Dz}TBQ ztsUsvIpkA|TpL&-KJodDnBiwkZUxNh zzM`MaI>-a7BdB|YfCW@vjB-&dlAX31&?DgJ$-oh{)~C%w z;rXo&bBO}tJD@c92)E{XXo@!dIikV}Q4NJruiFDD0&oyc}SB zhHA!d0Hr;LJ6TopC0O0@jb0G39ykyl+1gtHSIgMQyn>@?s1;=+Ak8Sq@Mvuy2U2vx zt_C<_EjPIPk~BC#yBg)je%rhocgUi)x)V;4&CU1W+8@gq9}s-K%VWm?CnN7_Mbr<>yoe zPR1WC4K3W?15PdZ(o!Ec0XNqAuS){swx^bJEYdPxQ?NYa=VSGL<46AKwD2Vcmc}n@ zW=+Lg@)1&6^F@AvK;ZYCL+Apy9H~??R@?Ot`4grIyF0N}6pcv}8Tqjt5%}D476;nF z5pa@Lck`?%xAyUtL>7%sF4%900;A>=PqScpX%d)~5p$uxE4BB^7J~emqp!o?NPE4VDOG+i{~`9U%0G#)kqrRMIE4G-4ig5 z&v*{zmMRX}2P`xp7pu3Vzw1pFw75M_3srz1Ff`EEoP`oCnyp0h6=^H`(MItZ*9pXT zm%?7N{`GXHcP#8)#Y!_`$F<=Ln#^^$_VyYxQ0Y*JTEM8#SD#LKwbUO=z3v8SoxnJn zW`Fxh`sbFtjJB>kb$s7=wxa1|HfKH{{F>GDFSuDqqYhsb_G*8}JS&~ZOM2BqBcKZY%LF!h4-UZ>XmiI-P7yA+mc@}yTIgOdm zHfHVJ56P37(nvw;iQ5sYm7=@KLyCS$yk{1TT-$YCk#ZZ$P{iJS^P}z3mVTw{aFQIs zZVvlP_^BgBZcCkzVI_vqdfhYK{n4x;km#c4QunCtiZa!8`@CZnSWh^E^#rj9A08Fa z)&AZ-QaF%A5d+fY+d9!VeEvqTe%b-p9e^*(DB?f0hLrJKbM&Rm9_@PlO*|_@irm&{ zQBFrVn)+r6m%UuJWFk=zDrp>IN;7?51P+q`XYT#bJd)XGsfDLetfoquYonbZy?%Ep z0TV&{P4NOiO_EG4NP$RFX*_tm=ihjBmhOB`m?`#VngD2snhxGmTD1cZc4~@FI<*KK z)fz+_tKH6sI`@sRcHCX{w1({c+Myn9{uh`PFSlPH0#3jgOC(Kp83$_&l&^c;aP4<@ zWq!!FuB(^Rm12F)R|{O_7ZzzN47#;FajlK82@`}U7_qdZ=AcCVH!~X?_j`wV zZ*jNlX1%(QH4564sMPbd`YjP<7z2)Ky=7!df$j2~)5UIUWKMbci6!Y=^;4VxMF9rq zZ_;XH=sKlwzVpsU$3YRwW(bU|Y!epjM;=7_x+bSKDR#3GPujeIVE1RM z`IhHL8Zp6%bOmWktTqf>axH^F5#It)J@*0)U24p-A`uZErrjCy<>TsV3{jo zigjJhPC~Xn0GK%`0CK!=L-Ky%_Llcr$x?UFHx4K+ugk@G`18QoVX6D&e)qS_MHdV= z(RKG{<%;H+v3ZdxQufUSAE^X`Rs(c>w#RgQcu*uV@=Y#V!}72 z?nr9f(QXl-wR|@_F1o?r^L;x@a+PEthBWhj>qZiLGLe=&IA1SLwu{MZqIbRAc=c&h z2nMx^Y&@eXeUso(Zbb_!*Gfy zQ(GYvT=zkeBa>!B(k~Na+28Y{gTywUbwGysu@VbyFO9=poa8}nJenO1c&x}9c>-pj zMDf@Ai6>0PN1e~C3`Kmq;sJ*Y`7=?-nI_kqt%;hBfC>^#6Z9lZUx~lhXtMf5+Y`~}UXp%9$lsk9VolZo9 z$E4VQSwXC4s{{y2J417#Z30064;#k0R1#w+TsQxB1K-qYxPWEYY~59ZtJJSAo4XfS z5r%}D6j|8jxpBE26oA{$hSh~e-7!T;QM2wcA77;J*Rbo?PTE(x^F{$yp5KQyciD3N zDEEVgaPhIY>^|Wc8o@@*r(iDz3V1Wz?_I6Zu~w(Fdc5*}Sx(Ke3040_XPAzf%@*B& zL;Va#uEIfc!F9Fny*=5Cts4;#b{Y{CN2gW@33T)OxY!T%@^FKh*|;2us0D7~X^GWb zjb&_sayqm}*44}P;u{NIdpI&h^HI@Thb7zT)-@%9r$?F&~{ zKCDKaFFtqi+n)Oc6JdvFLE))w_Z?hayuA+$5nHDk+t+&2G z1!eQKv!2N7`}>2)9a9@kIxF}2-Er_&SZI>DO9V7r$MaV;h2l>ffvlq}3m+jw{VQRhJe~A5xpcV~3$PkKd@>P{9S7sl%1w`ir?IDX*A+LF z*EPH7q_tqwIZ?4r3zrVwKc`eGd<2|ID8{$WuGGC>-dxmI6|7&3d}hT)Lh(|@d&0Ms=(ByT`LFF<8u4Vt0PVld;RLvG#j)3 zr3uXHbSNvUrxGet^vKwqM{nRS2H2j9e^8C14 zXjO@XBkrh2GK9v?-)8m3ylLw5j{)^i*whzuESsscNI9om3A+vre57r8r*O_gR{)(g z4A7OZGdH3HK^opIoC^C`9|Gtl0pL()@dX?h+b!PQo>|YDBcMyzv;hg)u`B(KD{oV^>m{kWl)Av|I9N=5Pm*%8Vv8_3T~Yr>3n87Rm^6W_$>vI zi0UWRx1V>IIVID_(~a=gzk2RP>4yku3p!fxf+YUB;=5#0vW>2#okg& z3BNH(Po7FEvfMm zE`j#?!`a1%o@$Fll|ax@xSK}3#3NqR-VS9vZ_rsy@YM&4HwD6SubLb*iO+_%$cGhz~ zx8tbH`NS*DqqTZdi0}oH&3APKuGAQ{&z8;#C2Xd!SAWa{pWx%P2d25hE@C1&%uZu% zPFDSqs6;E6EJ)%pRQlY>bx4O@fR#rnts7yd_NShNiTbH0^&o7@fnDdz4BQfi;O&ak zPLqygi{}xW1iBr3Edo|eA`_@6~9j87@X&1j3%!$M=(RgjI+c*v* zeQg$RH1qQZo02^?7rAq!DZMrz83q4Yi@%YjUUb4>#mJn66Uh#Nd_ zU6ID^N)kVAvf3H4@sTpWXm=$YZ+=Wqu<$TaY_mXd8gNBMPMGM=Lw zCJq!!JmO~{f}}5tI&AfFFSi&l39x$F4Zd|N^FS)FK|23!Uz7zq2U*HeYca>_d#xWWU8f!`44Aul4IX3)UAOptGG0Sn;B3xICIDvd{1WUG zKVom@p^^rNsm|R+YU^EiB)+Xt{bBDE5wU~E0JMnH)xkL8wUe{yo5sd_kn_=_3}jQR z9iWt#wZiurq_w@K2DbTOy(+p^n5r9|CJ}tbPia-Pi&7aJANhtMk!Y<~I~k5q?l85Y z>7*J2WwrR0sfmOKHL{mC*F)lGk2mubDWRr@YA5|RQ#9EfrwgE`Yv4$~hQ1`9ih;&W zXsBy_eRYPP8FBjY=xwFCGeh}Hj*>VfEnm>ZdrcP4LEcDTRxc4M_ow}$V$^M4SZFls zbDL_~`utb&I%kUuc8x|d@?;F(oZtvMlLpiHUoJE{e?9}M_<8WBFujxUtjpn0u48EL zqlCom8*hW5`hG#DXj1W#@7{d2RI57otY{NP~ZZWml@ zBJWM#fOW2OP+KXK;+m?av*{np4*ABx=io5}Ofu!|)d}4-PVyyEA@|v;`uUTONb?0X z#&cR2H329Bgo6`+h4P&>?O>IqLe+8*Ug0ZYDk?G8WDESkoxi8H5}*!<#FAA&I-(z$ znw+J>SzBx_wcWMN()27hA-aw>m@!U4djh!^wbm2+=}WdxoGjREH!81c$^`ZnPm%Tm zkGvAuNfyJ0kiX)w+KB*h=Du`zf{C9J_4rGjhF@?LwK}4$7y8km<;#%DVMMd9L-L9u zBYG}#3oW~!?li$$9jIR~m)U)FIi|br9`efu{KrxT1OIicl~_q4U~~k@@F=j5u2F=Z z5uk9WN`_*L;_ImWQFw%n37yd6!hj%&iU$`UHO{!jN zbhntai;0s%GjlEE;hXP)>5|OA3cI)q5v6ETFp2#8fOe?4Bo2@)QnYY7Ito&9+Mz)*265 z4LuQ=gtx=j)CuOc=q+kZthVlB4OhU~EO@$~*UFyHFlL*vhvKF%o!%AU&UwN@xha~| z+#;)S5a#+^x$7j8+7&BM3%U8Fd7Et%>ACtD(~s+e#^mB z&r(rWnu7J}Uq+K|`WMs}kNPm&r;p$(-`d6R?K*oMwljQ8G8mhSy;XrZ^}D_>97^+> zb~fYow_p0WH1D{`i@%!ddPXYcsa~|(Fn8t~)WGDOgdcT#elm@0?e#`L9l68b*ZIm3 z_TE8<;L;Tv_0|yk@1^a#PC`a`U7#AfS1QG94~!uc`^By zwOs@sW9l}R4xCQp=2M683q7XFCEbOIV^HZ!fRri^0yUUK@YchgR|AIqqf|S)U%j<| zpWwfISabqBG);%{9f(n_AH_fYd9e;aY?h$}>Ne=&G`(V#SwZ|8DJla%ho39FwUoZR zdWJ3TADY;YXlltI7I{*91ZRTT7*A*?C&Tv)%l`7;Zf^e!`rrz9&&k#1drpv7P279U z$Ti!|@P5E17);|np9~MeCH?D=aAE+0Ehh&3{6;4bE7oEj8fwAMscBFM^D#xy`N>$E z<}~OmEdu?9${2?v|A~wI8 zyL7E{anSx6YbzxQu$3vF-n~S`pjNXJjbZr!cB^YOyAd#3&PP%z)AU7?N^9|3I*I&u z!;xUxFp<%B>i>-Yr|Xme?7K()(k=8aHr6jIB(huuoG4pWI-9(|B?v%(6AyIk5`Iev z`1$f*+p=T=jQ7PKm%958S^{Z+VZRzu?9l(cSja-)c$W}KRQrQz^(qBVXer}I9QePc z>@Ozo2k0dpCvZ2NK3a#z|D`2Ev2SkJs1MaIau`1a~?hZ{TIIuA85Z5c+Mq+G(z)lu>cRy zt5giU0BjXF7!UjP@Yj(%PTC@uOqT6Fr>XzeMwi z>;F{&^`}XMZBqCfI2<`2JbuMSv*ZW;day}W_2|54Z3?5T<|m(Jx}C z3+}(Jy#XuDgY|a`0c$~YX}kuh2MKb&zYKW~yixb0A45Foz87-@@LJ2oE2D)ms`2Qh6>EPVOVZ;7czitcQ zGbGqX=Y{Y2vdwo)so@IP)g#NSV5MW&8TBu3 z{#8H^vcV&h{D^Y48H?H-#~Gkds37>ZBXn!RdY^JgGz5JxezhyyMKLY*SE)z_hS0-` zk^O%hU9EHA6#p9Cxalrr()R~uu?21v&PVHxM%Tp=5jY&R+IOt(YQ-9LROkCkQl1%` z)&g%ot?TEdPfC(_d|^;B9Tu*lSjCl&hq)Zx-c6)Yu0^80szZCh+aL2r-GN-b*t;VL zt;)Z6}>S_plY9dWZ}a68?Lsc_1vIfi5nFJHMsnkL1~+U(ZwtiZTfC#APk? z6X1REP5=m1bKMr!zZ*zhFf#=(ia-f&dRy*FW)Q{YNyQM6>11IP)eJPMw6jIM`*pQO z^G%7_e5ovu=JYB8j}va!0&>;^$j;Gk%M7aT|0Woc#eePK6=%3nKtQLztw1hcUC1@v z1_hrb--TGR(aHh$rj0=2H6t+PUCkYhNMOe1`M*Ef$;6jr@EE4ssEPGm7(OM_&+yZy#^ zCZq1hLc^4P;_%>mjMOv|so?-sfa<7H`8K=B1ENbRIR^9f;skD;%W3}FVB%Q1e3@QX zoG&ceb|pLpO*e2Qz&Wb>%g{-e1WP?h|Jgsn_p4?9_h--vSiifN%^YD1JxXr};^ZM6 zXYdscYs0*k_It@XfgjwU1Cg!Xm`=z7Xs_?Sb3n0oAR%RaYit^bBh9*Q}%kco|l4bp0`!}?Rs5dV~aJB z(^cZ}Qx115cERj_i0Vo(pp#Zi>RDC(R}cR3jTasGRHI``#|bxu5DbZpq+jpdfpBzp zi!m}12=rqB5RXZfI~Q47MMk^Zisc>)FQ-yqg$9`y8u~WP=aQ&7+%9Ac29k*jl#5XD z)7Yb!G}(IMXWi2k_X#u|VNFlA%;i zTO*wtByJHPw`9b4$!?dV!eGFzd-E@A&=-8|@#eqCijTdW4|GxeIPt%N`QV#Yz)p_h z^49_&xuD264naCvva`~PO zt9d~{L1jew2D!CcEVMXk!(q@6F&Aqi$uKdZ0al4*efks=VD)yzQU77}I)Mdwhy^Q4 zt671N=oJ4h;NDeVEaLg&vapFN+G0=R|3l9%Qv=h{NZjRO`N9i{TY`8%t$Nb^tj<&)sa4gl^`-~|2_hHK$+w%Ki&AM^K8!~53YPl|73x3~9ht`ra%4<7 zr9m{g*4n-f@WA#aj^&&q{MSHy4cMyD0?q@-A;@qSq@x6IM_Z5R*6Nu1cMwCU`a zj%DZoO{!@mmgR_iaPOo%xFyRXqIGa#>pX6(8|}A3m+1gEnC`EbLh~+%6qw8=Q)caj z4!dLV)K}MM$mE-PPS$bqJ9xu8$2uTQ+OqR?G^>TGMBymxuji+St#v>HkouRvU^N0* ziN{cwcapxB>v<$2>dH)LmK4x2rm++!Efz*^_a63QA?-IF2|1gLo3y#wG>C-#DWG4* zf1B3--DUp!g5VP0={d3eX21RFPr?vn@(Am-ptB9*({BRSTB#R9 z^qPo%zSIfjQ3PmTQn(nywq$;!s%IWvm(%TdoFdg zP8}-5g|*kd}o;Gd}FEu$w=Sd}M#*Q4VUc#;uyJAu))#0SQ180B=;j>wq7m)TB ztTq{oHs}f4JFhjLin5|gOIb4L4J8$O@;3nHQjDcWRg%ctB8P1K98q_l4=>M(^}4(g z@l^52?J6O|=CdV~OKo?e^Yho2Z)5C2ta2Li?^spZ+0F_*t;&dl1iQBD61=n)m%vg$u=aOmq3lf~h;P8g15FMnimDZ5@YB;%Uexc5ZDQZNeTU*& zx>)BFR%5fGTc+1+LfxZ-1jY5*RhpG2J^OmO)nn^?Ye>K*nDt-R8bK0hm63f=_2Gsh zh|}cZNBBS-2$!%hSp04nAQt8u+r7hq4g6`_75Hvyf$&VB)g2C#b$)gdu^Sh2GC%g= z=EP&kao%yys1l~f*i~DwpAIU}`Dl?68mMFuHcE0qnWNEali+gKut!3cvqM3m0|cUU z=c|2{qxaBPv0kTN;^_4R07}%yguXzXs5qeft#RMSB#}gsMduZVvXu@NL7KY zL50I0wfs0yz*fLH!z)q> ztWAZd#+-WyfGsltbOthdxW=`=TamICVB~XM{Vatb;p+CycOVmVC z`rJyv@2~K41)c8#v-W56^Lf0^g>U*MJ|(|g zs>yZVFI&{Ak^cJ86Ly{Eff5boaGED8+@0$DvCSNuxi|h+T9x*Bl=t_N0aro=?0?bj zTmfj4MJiGtBXbddc;LVJE5`q;@(;T?YQH8F(Z zLUl>0WLg@Jh<$y4osPS3$e_=QRfr$DL_O+C6xxjR%_r z^YE`!;~zOt{(P>J_43XP-#TkgdBjpG6WK2H?T zQ8y4{{g~HXJavqJ_NY{=Sr&`ca@A?!r0t>X8qdgI;-N~3Jel9e`|~xCSOk$&;uGO% zAb2W^UAE^!dFJx+x6TGaoL9pt{dBH+n)Tj(nDayT*`(%E1@`i8f}!sxZy+>dMZ=B4 zk@kMkYF!^zS>D;FzmpRUfJLoAw`+RQm@Z;6IaE(~*|>+JRIB@XeYjCmLCVZx0@$IIAdcnN`tQC#jk_u8T+od+>n2#HT) zR2)^AZxD5?=C-lR;CyS-s9072T;XtO^)HU^pZlpdCOw32u4AoB12x7c?_TBcTpvTd zv2e9GjKZY?Dflh9;gJ(^@zB*MyeV8jpF87BPGxuZ`T0p@S1qp!-p~X+oTX&t1JDl- zy;pQ#tpy(J+93=tMz@dVH0j@hSs+A58uPOiSS_Yo5pQulyHpQCz|8G5T$))J<-t4p zGe%wQ2_iRM8{au7TXI?eG7_WRk9u~B;vbGD@``ItehILnE}p7E4M8CA1{y2*=4g5A zAAV)oct|~7+PbK-x}p<|oG#W9E8X^1i@@X0Y9Y95OM)qBn_h@gi88vX@arx1zD{0r zAyWThS`6?ZF_xl-i%$4LOS!9I4CJrdU!G$jBpt8vVV0afzIeN>?~o2H%i2B|U-1OU zoARQxe^VESi4l#!AY6&W+PXX?BosHFFG;?9xYk-~)lPLp;On-A-c81@X_S zs~sv~VaZl@hkF)I@56$DUgWH3a^s&LL41FK9I~dP$$VKr_#8XD0q)X8_58Vk%wwiR zmtCVqoiUl$G@{JsY2InzP60mAN~Kg)Ml=#L=K_EQsEj4!W3(IX2Vz!yZVJ4cuaEL9 z>aCkfRFV{h1H^^;Yrbh7rLYh+))6PZnAy*Ny>MoXS->u_UybLrB#hv>a8EcsQ%p<+Nufyec6Y`+3g7%;@s9*R%y zS4JCwaMyIUf0c#6NP#lRH&^BFnFNK~Y%UNw+p~1oYUU^*7TY#__IhoZ9!raTy&-N8 zLLyO9dLb#ZrB`qc*a89fUN28KdD6*DigIo+p(vEub3r>}dg9M5ZkvPg)FxOU4wW_t zu42XB{>LWs-?uHApc0ejGS9pPk^FZ{H%iSGf4+Nw>t?(aY7Eb7N5-MaU{iLUTP>G3 zbfzF%s9Rm9(HD=NcaBOWkwqlp)Cllbhl=>0cpsADTNewo^Fkj_HzG}rw2S0s%XC<8 z{HhenJl&F6+^Wj#4|f?Ub@mMtr^8U`>40E(=1#P~hRJwnFs@LEw@5GFS_hNOvw_Y6 zl|dDYJV7DXL z#^Y8438@qO-^_;)$W|A>Fo8>CK-V6X8cQR~yk(I!AY1Xc71Z>}Zy_$UDNavPqfiEy zkV$2Uo-S6^K**~%$Em(PE`x}tkm0e&(SFefQ*7I5}H1> z+4*?t!E7S;z4iuHog8#cy3R#>xx9e=&ZreiY@_5?pYv|$R=q++(z|}S?g)R*efNjU zy-6;FY#Z&abxkzq>&)u&gK`Im*)708HvVwVp&tP2^7K~tfJExO&RhHrV*|ELqc>TF z0Ki9t$z&1*ip=euth|oyojC7r6z(2Q+Lap`uk3Zs>Qk!ih5_r2)#w`4Bh45x8O<+2 zbAZprP=_C+(RGQ&VC)gD1+qJKR#G_Pg!t{wx04Es#PYwC68PuUypMw5qTOd^w_{G7kNeSNfWe$xJ8-tnYZE8c~dftexra?}2@ z*S29e-WhNXv>Qx*=zZJkUx^vWD3fv6{;dal`_qt;0Mcka4poUgKq;Np&Q;L;bkYxu zJ9wD<43$k2K;2?$>b3bBj`TZne+mMhboCAM>cc;nUsW_qRHHR5@a+@c1nc`vOF{M} z(mE?3b=DmLoc`H?bnORpA~NbR}@=I4^@VU8ofI4qOV;s&uC zdA>bFeg^=|>TW)>J7p;SnR4x~psm}tpYMxNsI=8xY;J$*GnowUesfd_Y2PkLl<9E< zKne4K1X?YysXo~FH$m`wj{fsP{XAW7;ju{IuvsUXvyKR%K`tiQ(n%}|_%>bla1-CW zd2!bfF5n*|LU!N6LpA;kXj1soG{pZuV$p(vD7%?=%zO$4)8z%c&|0f&p`Y~ulz>u^>XFw=_-2t&6hm%M()dhmHX3#zf2B>Tb2e{Sd1 z@@W8RAdRzHVR6l)=N#4kY#qXEyeco5&v{rKlg%-Bxm>q3@GI6+Yx2#`V7zR(u}=zv z0#%WPY1g|mw(HVt>qD2rp8~LI73pFjmOuHsDn76FM|UZn40|2$db@m9?l1j$b1R^o8E{-jyA#6djuyt|r(pIsM)(2n)_E^N{l ziO(E!c|$MRucEHghkb3e;;q=O{|1z?M{k}!6;mP1s5;D`yGXC0Ugw7(tEji$l*n*e z3Z+fyLPrr8Fk1q47%@b~FotU0s$kE$ydEjQls>MsEjRx4zV<`5XQRFQtk!nHp==Zi zvntIOa*g11ZOrZL>J)NQL2fmtq<=5nIs;q!T!<~dG|~^4-EuCMSaoj$!r~j^gU^K8 zcNC^{SD$&R4wtHjJiokG2#D^F=Po}#KbHo0mel9|fYh~ePllcdzK+jP0SDD4=%=q57S(a5$05U~Gu``zLFh8|QD3t5% z_m;~hUK4Y<#7yaRq@lT!%jNF4llz))z~*9Owd}!I5~q}8+~t+5F)GO#1X!=3`e-B{ zOhwUrKkS}Oi8Ub7&bu#foMY(?I0FvZl}J2d0A!v#S{G4IRV^JhRA&c(S`uI%oupnl z0U91=P&1p3s8T9L%kRJ2eju>=tzX>*SW0Ob#y0!DKBqfZzIpy=0XT@w)Y-a zqZ6-!8HFXB-$xa@&p5gom8xg8_~nx{6AWlB zPdlIJwi=~mimAn&)zH6HqA|I>nsr0kN~b7;*ZGifmx><{{WCxT%DzPskbue(*WcC zvjTdHBZ_Ui zzFGE_w<;A)iw%m*;ErQwVa)qrD`{rs?>#ouvlyNQ4tSuPH5$l zh^$*9=~64z;6a@8@X}FnghFpMT4!d9(FQwL-vdU8rS9XBB3rBj4g5mO*H#O8CUAOk z9l!Gbl?L@e9#q~!(WH4$MRwguFPN87{F=mg$q|9WN8+$E40D}CP*SK={sknttk3I_ z&1sMAGY_y8$6h=T5;o)^>4i=5_IiL)_2Kup9_GQh2Un1a%xF~>htZ=K?Tf@sRK!nY z8Cn&2r`wM))4IUU$n(ml z@)(E4UBSB9o_9;&n#0rczIz~Wv)5=mm%GSQ3g4eL?z=wX;^ue~>~8}k#z0w~(Mb!4 zd19#IsfKDTo_!1Clqo{(_Km~!Ww6;3ri;}MmYS~i2Y{#*phw{1Q|h&)`P~!&`1AoH z{>L}4v;q?qYh8J=OHKC}P{@h`R~v=y5<9~sc&R0Ks;^U7(-;2A5<%wDiwZ!%jEw^W zZxyROK^9gtNx*h*@aWd)HuPfSTHbpyBxdGS9;EQ;lwQr~=KbuNt=uU6^B}mysWPYY zqU%7y((Gh5V@0G?LL72mq!dst+=3*HtJ4g+J~BSb7BQI+C$$YqTB_it(!LOzt4^I| zJYctsVxdB*(r?JHUb%Jv`uOIZN8D=%-KBFmrMQKEiUan3lFRCs`ln6yE!=%TE9)+s z!S91dB>k0<>tVUpG_o;xZA&WJIduA@2qAE;hZzz9Cr%QTde>5o=o{ZY-YZxlJU&lQ z870n)|Aj_E1%t16OBELXD+C0fu@{TPi=Uy&T~1~;z4VeQo+$-^9qOr3oYkgMvvfMz z*FC6854BuaNvsavFAv9s+=ji%&>22v1rv6%!_TWN;maiRXq*@*1g$ZmK>I1X*5Uiy zc2E?Zbd_{ASS{2^(6&c;cIZdE0VfmR|5+L9c)Z?@Xgrd_I?+wP$h`kuDpU7ay>9r@ zA68#2VK~|Gm(Awi6vzK9xBT&f03<+$fuT+CI)KiV%M`$3F(=xmtil_*w$d`1n^jJa?Dv_#OJg_JD zy^!~VS0SL5S{9FyLZ^pO&F?Z)2AIQd{GBUcW8|&NG>{k#{B z&Hk0d`wy%?>O&Oh+=NdoC!mz6y@H2mFNhTmH3>8Rp5AgRelOcffe^=0XkXbdQKL=7 zY%`hF%(RcLSJ{~SX@R4*Lbw2s2R*s3twVU#Kp_dlv}6kN-4eKcKIj9Mt3+#)lVf8h znRHxeJXH#BT4`B*lhYMy8b$~dd9#9>dX@WeVZQK8YFq*StSbOG+H<^Z`Ot}-J1v<= zN2~Px$#Ritw`7)9eE;!kR+cy5ZDNSi;%Hr^_-ko>dfgUVsJuXy=0041E2#q){B`N5 z%ZnPbiJ|Q*s#K(}w7ON@EjJ&U;SSiNt`27PnLh`S1Yc9f(c=>sUHXT_=K5x0z+Ax} z@_$1o{kWi^r_I>Ys>(^)%l>ZN(?7Zk46X~&8*{noeEXt3alZ6ezX(9E=q9p7r1nbD zA~5Qd0!)i_ON%P0Pl-}jka|bv6IU7fUV|Z%IPFbL3y24JymuXMwS8`xWB2Fodm?yu z^JOgK4i;-f@ZWLp*MCvVptZmURSGBor!Zznr(1y00EnkMx-Pz{*X)kxxnF6##a8fI6URn8abg+KA~{%*vGHFUM<| zATPBHYeYrEWTbom%AU5zQx)*Lg^}7YQk(b(6h2K zvGx0t)XD>@J#ovo`Q}ckc!^+(?z!ZM#d(kL$?L{EmLuO}w$OL&JW?Y!=O!dk;lDkR zpbbi&5hTqit3H_wlMD8!9IvqGXx;f}&;W+}yChNWa|lQA}~Ho2RcUS4 zM{^c*L>*uOhZ@zN1kjH=;Bom30!jUULIbrIPtW1Hui@XA#9DuVOOQ%=(@fIp+9}|L zsa+o~=e6`4N3~MrUYF@`@4biq_&2|g->aM*00m32;(gVZ`tVo&RJG=_vBMf(_-HvV z^)^c}wHB&{Dm4#_p&=Dm*Ewm8xxxdANPQuQrseKQ&BD-Wx(1wP6j&|1Udwf*%7uzO zm)(ZEi$@Ff#tSo66V;{&jotwMIHZq_Fx39IPkmQnt}@BmuCUsDhRkHQ4h~Rrw23Ky zu&c7ToGk0W05P&Ex6^s9=fa6rI*Z|q^ph1_>POm#=ZBLaHS=i~fTjXXP$kH{(Hjv< zDus4{2tDJTVJU<$Ri@)XyBdPR8Kbc^KW$N^kvc&b+ zmt~o`N_M{S!NJZ5O2ZVEP?@IMS1z1PD!w?Y`ncwM$7DW5f!l-tGJ&FHOzN$ES0xxa{8f>@~^;1guePe2~^V$ly#K} z)n>gryv&Z&16slnhO{5ej_Hs8h;DyL;ILc2b*6#J%u&XuKM{?X%34I67-7&hO`ysJo&;!s3K(q9Ic0~+V@VZuU zIU<2x&%{dAW=Czk=nfVwX|Lf)DxN8CPXQ|9W9f}J212hf0&j2tIxUT%nBOv!*b*== zK_whCtGN?7`7s8XDFKc>jr|n@!GV9LSp3ie@_sj|h^u9DFho+7qQ{WU5xpP!I4;vg zQ$T4zDgvLI>Sd{glFwzDO6AIk^SkC#>W5Nr*+jZlqv1Ht&xm_~AJ@5V42g-BNBmFY zfprL3{JPWt!B52AkGE8DYVH!(9gydOr7f*5t8F-Zp6YbEr*L1^_Vfv?zo_9f>_(R1 zDZc_tU-vhT$3&h0(#iR1~2MAcaA$Z~o=Ht>-N!lP3kpLC#v%pj_Y_Q_J|hmhk5hM)J= z6Ox(Fv@~9-5RrEQI0?N9l^T;XZd(vMHks4GH1p(FwkY}kRMGD}m`?!0O`aRG4`X<= zK0^L=ttR+KsHgm*pT>dc3UMdDvi#7z4HxJ#1o|r`^7uqmU%}GFzJi-aYCB%kATYWK zTQwenYrqDYox+0IZ#`0cB#rmoa6FtE7}lzHPG>Ry_2C4t_5j!>@pIKC$;RPui+yRF z9-~?1@l>jDevt6sVTJF{$2cO+(t(w(0kA)M%bsO3*-CljZ-gpRYRyAbUe&vf8*C-l zrhD?ce^oBll}YRnJ4h&X3^pMqfqE^au~ zPxM3o&ba@J@QG#(Wu#Q>Ney_nF&gwjB#$YxM6s*N=2Og1=sry7buj~)n_ zQekWPn_2hQ-Lmvl$W*?$-(^yu1RpwAYXMKHqZk5xuxcqF*aQ5?U^s&-U8u(SdDOA$ zK0bTS75d9Khaqu>611G_(9p@(iA{6ob+)4_Ek~J*WLTjE1#>xk|GM4g^d_qv5p0;@ z;3`}vs^-tMS7GWggViI#?!7_nddw_21z4OYlm-+in z+E#*WmlZyfBVZv@#4!rJZOjKhcCPlwO#w=;*HHoX&H@v;A+gH3dLGCzsv%!y<~kX$ z`(Q)+E&9rI+@t;NKI08y9|Df+;W`)C%kn;H3>}MN!3~aP6G;!120aN+kO;d0XyV-f z*Nu}ehWFuG;_>!na_e}hl^h`cAp1A@K_qg{+mee5VyYw6e%qcLR^%Z-GTsb9GOC`tz~mKS!pniwzyR;s~7=~ zCl2iH++0rH#&&j&^*^}Nm-^439iD7JF6uHlCkV}>l&WW4YV!OfdEkwyUer>MR{)oZ z0ReVCdLo>Y022I)vKz+!O{qM-Tx3b4-c}&#bFP* z6|%dl)B--$Y0gdL#Rn<(G3cGjH+uESZjny=jQawpdeo1czORg_cH13LH*Xi>)nS(T z;Q)q+A`r58Ib7@Hh{D|+d-%x7v)eqA11A*{el0~8gEnk7LSQ2@iAKODQQY7KcB|zQ z-cT%{i;|7RMf~bJ6Lb<>K1cD@yIr6=gs9!q(l-GiOctYxWaqO^5z43)HDxpuftd6? z9#r=uYSgMx>lyihem{1l;N23Fo0w_6^o>^c8@90FOm?}p$8}f-{)XZ4sC-{wv6#Qv zu{h>&%hjmf=F+ZaE!UX*UNyK4J(x0P^}i9kKYwEjFhWSwjFRw zatEf0rf;c8gdLy0Jv={o>~}oia^~YPWpX-5juzOyAIpT)RymfAtFam~(P$ffA@pi^ zGxR!01MGTw17r6O_SutKXwY1T!^b~BfGj|!LvjA@(aiKo~D3GYj8Aip6b!O2^P;&uEZ8L)lWJw!7S`q8}Y^}|+k%Z8y21zm;gAXTl9x=rY@I@ZHD18A#c3tgsds}_elN>CK zu8eQuR5JoJ6>m*I94;)G1RBGFs8TmE6VmuTdJD~KPBUi&^pUOEk z9%HCtl}U^n0NZTaNZj~C>^PE31nIOO+!``@a~p)>Ow|FX!6>4qIw^Ye-|JeofCiAn z#Xm_7On~GgI;lXzRQ?XTfMr0B#Oet7D}f1*kQF6*N@8eTD4?Dy4KTZIw_VbB|B#!w zQiC#D?-bn@SGp5aETVB_BL}@-VMquzI5E^(&6LryB=qLos&>FWvp4Uw-+%g^7>7z$ znXqzIhq z(>x0$kl!aqhAWZF4K_I)Tyi*U4d!*JaiYj`s|qMOZs}hoAu)-3#ps{`6=yK7mR#ng zjDYG_UdTBWGNqz0Gd^|}p*RdQ8GL%pp>naRP8&Y+y!7j#*H7*7KsONav|p8Z0J)ND zGg0G%Rl`M;e-#KHLzUzKr>_EVo~TZdQ1w)K!lh%0YfB9$t^NuRaY3y6D(54tR(TSD z6Qh_VC<3t92&<&Axr~DO*rO0p1dx)-6!dRPE<7%JWs=<0S*`*gMi0i;XxuyucQX1)!WYfHq(Y^A|q~Vc8ns3q%ij zeKIS3FkMc*a*e;ra1AQbp^>8H{(nGD5Me^ufJP1s4-ue58st&Ms0DmksPsyudD(D5 zFt3DyZqWf>_IdGgJHIUC@jU%;Np=LjrN%NPj32 zGPLl}zhU7)DkvOMe2Na+J!J8^kG%8##W!!K!B(-&kKkpU>J?j zpdAf?8qY+bA!N0542gtM&mcdkx9_b<3OP2&xiK*8nlxpfv5^FK| zeDTyjTQ)A;9DajxPA->1^K^e*i53qm7(-ye5X?NRPg_fq6C8e!RC2;Vc%2?%>KT`W)TcLNxVW}rjJj| zZNS`@XnE(fqy{AzqSd$Ee`Hu4k3kuO^x|6Z44vyG2QE?Y90CK)X8q_IlmO}#(v6os zTmxheQY+raBI;W8*71Q?2dNp(U*Dc@jnTJ1bB%RO#zY6508EblEI&wG9#X((3xq-j zgrP~5{HiQb8L{#YZMHr0%{_>TUy^b$G*fG)4<|4m(?b z$UKJ5i_3#~yNwqGo9WP(#NVLWqmc<)9(%T2C-Ho1kjp;+wuk^aBOF*Oy&Ve)R~R!# zAi$|ul{Vfqzj?;Uq4~oXUnZLlPluIX1LyzQ(My6Dy;_CHgO#@$V@!=&)FQ55UDdoj`=}`@faP0C7OZc;M|*0HAE%dL={;8HSHYmbxfoL^ z#%)31bv>1@G8+8k-Ynq33NWqF2L0gt1)POk>i~DU1b_g+<=<76K&?^~=XgA?!el&X zB%_*D3@`43nsB%g$)7N`P{(=!43*I)z5ECF%Uw#1Dx+wCzmsY#hr>^})a*lCt6Wfw z#cGkVmsxK{Eah`^l?F48+N~DIYBM7ZSmZ070E}V{RjToD{nP7<5Yl()(bg~UbjTha zz23Z}`{qCa8woFujaP}+<6e4u^hqR0c%i|qn!pn4aHdo%M&|4@C-Up*5(OPlPOv{! zNUg9Ol0CHchH#urE`x-hf{r7z6o@lwEyo3c?hM&27*{bEoAZ*3k<;=|SWF7WeeOHFT&A-H#u5E-v%G@YBec)GnKOXw{uxXC}Yod2^pP7{Eq zxEy21`#-+|@m0Ub15*5nmpN{P+tTm+5k3o~^HN$8L|Mw3xnJH+Fc3crUnl%rzLxDm zQ=p26QGhlhBsKeV(#rZYw)4nUf3djY)!RCDk?J*C>^-Jq+B(*{li_i^g&A{=o%f|Si z^uVr5wl~*fn|jx5N-BfX4fAtNaBD8;%zJV)qi6; zGuKCA$U8>ffP|Kp>zRB&O6wkt_^v2p%!=aG$tjq&H#-b>HyVT!> z^B+V(keaA9Z$kQSx_l;(ik!);%OuKNAqvGu2>8J-^!@kk}MJg(?7&hsTeK#L&uN~yktIJAJ|Nk zS*7m2*AZ*Ex?Zrq+e+ltvN`!FU^1MvR^ssGx9|8H8K1xlG(KK+uu^|Djs4^6k+T9f zBD=qBy7m8;;^WKK%oj8AwW8WAi5A|H>BsJ^;R;+o#~{ z{i_E4=f{aN0svJWh9;TxZ(r*lp8~w41gZW}#D?Gf{i49@N8q{x^o)4_5L5rJnXnfG z+~{6Dtvb^0H~M7*m;vjB|LgDn@eME&LE}_^r2czj)BYOJ{Hc){3jNnm>_4+P4IKD8 zE@-S|mESbmU%rA=i(h99Xz2e0H~(!Rqyb#x31~F!e>`Pza^Sj>`hG|yrjlm9|t|GF*#=(?S~;{UkrKi@{t0rM}8 zF6B$WKc-d%a9yLxReKUJPKRyf=IVaHZjcza*UJvEKY=#YXedD^0*^QQ8UHF?k;l%< z*zs|-M59{r`jB(8{Uu^xtt-fnBzoJflM%L_cLa7AEb0RoGzzVzbVT8S%fd`4v~;{g z9_g2FUI2_gm*<#VRb_HTwQ`d&RdO=G2M;~pRyZeWmaHbq895oFpt=zZnI< zB7+@%FN1(CY_bYEsXpw-fUB%Y;10VQb8n4%RV2QFZ?~T;6<7m1Ai-3Lz~Q9ni@*&l zJT~*f-5S&TAP;bxolSn-1b{ zu+QsCw9g_nd)pD7!V)hUo;uj(^^oh6 znIRA(e!;Pp6tIx74Po+HoIn74w0%|3%;hPZt9A|Fi@=BWo>_pBIk|=eG54giVJ%Ax zFOf(jY!HY{w?=05B!;N`M^ZNsqX~|%(LRwaL@SJLNCz&dImy;t)PJfpuwS}jmk2@1 zmr5wn*er0r-e0~l(;IfR9Yo@o8B_dB|x0pu;FY_s;%wb4iD`TqXJNTXMwg)=a_GYS zDJQSpjZBfw=tbZgkoIgSrhe$~4ajv3L7L|>YlwtU%9gH(dkc7#t8KK$CG)?au%^~D zMPO;$7iy1}1SkPeKBpT{RWjZl8)c&-0d;$`CtLi7#4oBBwEJwl75{jRd(tL07|$;R zEHmOa4_C4Y_R)ZM@LFGnZCxbZRpTRK7WO=-_c2T9N!tuAO&dur8{B-n3dMag~Q~NoM!X1%slPM zP2KlHXF?^puG;3vpB6Xm8%ykv)2(Lnxes=#rYM9&kw}*8c9!f#dqVGt8{TKaC!+2f z4yfx4=e-@eOo0SuWUaCK?^Zh;A)vj~4GVw9oM9mN^c?n$@j{&yVSF_$zP=cTl%!6^ z5#8;C=fH~3P|!(x&g81FF4Q23R*0zqPey|PRU9T+O&4gtgCg&RmLtd$#$2no zCuXh7ly;JV%Lo}I&YLG^zR|%60zPQ>AZjmXI?Ef?BtGA~aSs5hlbvVoji zD3YfvGWl}a^=_{Z(|yi@2tiM^W3U&};0m<%^RzFsU&6AuqQ`L!ROB z^m^W??cXdH+GMV&!j#9s26bybF%En`UurSS!BKTOh0#Uca6_#o3JB}};)Ae@jujZh z-KM5}!|1(lwVr)!dy#lj<5^`fO9ylt53)WGmiy#kH=2o`20O6qP^KLzB2~cyAYsGEhUa}s4t|EK^^{mn1mrgCBh5AUk$caZQ z)m(5SE6eicFY@Eu=99_E+HiyxLC(dIJ;Ov{4jcc~)<{F2Yw~|x*LcU!b?C~z`W!4+;IW@OR8Uy!;akv^lCgZ zc=G%2oh*1y1_a7q2xg@u>rbGO1`;2upzTk%YvRnO zJ0uc{7LNmH9eTsDi6Yn!rrU*6bnWu?t6yR>mNLgB8pqViFP9b!cwH8EI3_}z-r>qE z5_sk?vg}xr=#EE()V^GEkuO<&K6}@D0f~ScSE^OVG3I-`VW1IN%Nw1LO1plK8J4Ak zeD%2P6wy8L(vbY4$1`M7s$eI(G-K@T@kUOmA9QceZgqXJ>G@J~Yu_u~4alj18y?Xg zJ7DcrLGFFb5%Bg1Qr&LHe5S-#^&D&ordT(et2-JTix^$9lX0AjIA9Sn&>7z?0X#8Y z3QPBU*i`ib^L^VoURTojThjzF-Z3=QvSdb|3XNvt-n&ewL@SPZL(HI5u2uFK_oOu8QM2_0&Q@}Dqf1gA zb^g*4?5)vQF>f_J#PF&%f=;6jW*ra7QEg7+=|R-_TI_x9-SAnXbazZs!P0s3q3Kf1 zgXvjaH-!*WwmoAHqLU|=paBSU)kG?l(P{eEc0bx7;rp{id=&%*M~n z<89p1@t#-nrmFI!jOTAw1|o15(vQ?RiqGfl53F7$7j%8DNWWl5grbg3#lHU)9FhW@ zViZbkck>q_*%7;Ekg;%x6WZGOWmF#4Uf^Ubs^yxLKEs*x4kj-#G^+U?_)!zagZ(yx ztxHwLQcj-1Mbf{Dy44XsmnxbyydkUTKt3DigL373{dyL3LT(Ku1_)P@_mWcy{8CY? zj{zh~Tzxpo^s%PHNoC2L*pc+V?1JDhQL4DbTcdw)?x@C_jA)s^PnJMDVsl$pb4Nl~ zZG=BuDc63uVrYKzGN0!2avU{gvoICe(;k}amNDI$(f4lPwIesoTh%H}m-!$f=5}~DH zpzW)aDDrgyI=E8XlV%9XPLhl}(v&vxXzvE>2|O;%3x&fWl=lP=-qHnRY+2=IkRe@b zNi^V&q6bSMZNM>x{!%O6hQrMz%&?VzG^R4EBs1OD86TExwA5-*Z(dKImxScPW}=~{J-$<4{p^vq37{VLMSq=7 zIsP8(7(%H%lV~#EyZm9PxZJE%H!b~Gc%`u0&`>loW^12s72bOgL+T;v66mc#Ix^i_ z{fKFrB-50J&2B0GbPBFfxsGqjjds`u>tyCO&8q2|gP^E60=O0p`rGMo%_fFCwsW7v z!0h8a?D#^Q?~&stj~HB>d%O&#b4Pj;>J?6CXhsUMP+2^Vu){Vr24| zktQFrg*~~JiVw5Ps3k8OLy+EFNx)S5reZbLc^G;}dE294f1NG0 z_ZV(->tjTgU+-1dEJByZv4^~5JY8ufAc{YOLEyP80BP5tC1(e;Y+8yC&K7)#W4vUW zGSgSz;*J5mJ>!4gP~k+{bplKF^1_B5wD5e!QNg?VXOF zuJ)q5vdryUH|GJ1zT_WDEZp(4iIbnxqB+|BG!somGc?uKAiH}JcrU(N&W{drkN&Xn z_U5)@j3;pAf@--g%oGQA6EC6QVzJC6_j$&K-+G>>zuI<06Mcwvwr++f^LWfzf{ctt z{@Z7sb+p46x7_La zWx&oockK_7dtBU;nFFC^Zzb#I)*Li)uZJt6WWFPhorVMJ28p6{pD(MVcR;Amv2X+p z)goS{N5ctO2+{E6;jvmys11uQx0~CAS^2%mTe0_4#$`-qzME4Ee` zcF2mdRn+a_dl6XhmTNaFzlQG_?uCeSKsi(^&hg|4L1I8L4<%OT9<~vX#gK+YNQ|lJ zx$8m~J99ixWoSr*6%nAE!Sqe#UI)ts4H2>0nfoSVtmKd>I~37(eEl?d$li`j{#C6r z7SlxKC8gn5g68m@;t2p;4&b^tO$a7NeT^vp5Ue7s;Ux()F0fq&Y%NeIAT)+zY+O#L9(P%ClSpOtyf;*TUN-b|+KScPSt&lLSGck_r zmv1h?EErj*wYg8RGUtwVtWp077HJVh&OFR(umF71$JIlGK?vwuUQ^qQmFYdcCnV^z zGh?8Us+eFm*lp2SYB{-n{pB(DY4>KqviBtm&^@)YduWDe#fU_DRJd?3NlW|+m0tOT|w|eQ5`k| zK%$-IfBvQh}<(%R1sq4Uv-4$W_7 z*Gq1*ykO&#dXnlqk2wg#CY&8ZD^Ccs)9^udsLf^4Y)0O0IR1@BZZol= zZQ@c+ptoUl^+xy8${11j$UDPwJ@t!@UvJS=TEXtuBKcg^5~$8N0jL?^{Fb+%=tQAx zE;1gW8ok41u`cm^Vye-b68aJFybLdXvL=@KGqp|0Afa$YZhXl5!A6*AC--5laNliu zv+2MFW*5WGQ`))lEnRx8!umJ%Nu{}^pL-T(745xgpKT z2PeMz#Mm-kbi8iD_Jo$csJgVK*^fA%so|`UVFPBgK2#jFEwb(L-EPov@c|ZZuzmts zYmPxzsG0tw0Xhzu1DZ4&j5ULn^EXU%SGnHR_!s3ZFL;HKl7nx;{o;xnhhEl#Fo_h~P31n=cY8l5&o{^z=T- z(2pER+=D)BjbYOZj)t2lHKyYZl$*LW5Nv-xFRuQ?RH`#m95JS(xAMF>mz)Wjuv8UX zQjVnyZIksSxMNuE1dBsP2;nuQR2a!HE8$@)fok^<`O0_p36xzow07myMiOSZu?DGR z3nW6(PUd!UY^<>J_V*&`=)5**saNFrSK~srNVsQx-{u}t#lk649Ngz~2>vl|B_dd= zg7o5U5X;exQbE{YGtJgunb`M7r6%mpsOI(Y{1X};rL&LxJghL4v)h&98+aFm$fb3r z>441H@zng;ToE&kr~voJbEz2&mP<=@?Jp|a$Y<)WtxwMJG6m-?3>vDcuja)Co2ECu zrQZI8`pCgKSc{u+DTTbfRX(Z*w-PPS< zeg1uOjIXch(d0p}MdLuzUC++(y&)puDS_VL*QTP2o zR_mF}ttJ_Esm+qBA*Wekm8bUzzBMi;Jl0lq{XEQRqATpZYUujiZK7@`xf=kHNLTWh zXP@xVat5Q&^0UaNxA8qjYUjh=o4UVm$Wo}KXzhAbb3b&4%S{QgLZ@!=l9j;rWxKrP zj84(2OTyFyzqTitibI>>A^{DqOlkK?kv;NuXdLFueDX)GUR;BxjxTKmr8RVlb>{Th zw*V$S`H|L!ZNK@Yi+4}iE)e4itI1l?)fxqh8Ci%TA^4CF1)v*r(k$Rsa80* zJp+B6>?r}y7DtZ+Gv29MSVOJTxJMv89aBP*r-(yOc3~X3=e0;3O`DK5UBlJmG5={+ zO!;~W)9=-~O~WvLu^J_xzWd+sK3%_5fc%u_>xjN;MkRNVF9LTgRj`|AYk29ua+1jR z3X`0$v(nawYVMPZHf7L@^~MzMauoJJ)k%!p!O%~XJ&J#2Bcd>2k*jxMnMn%SsUpN} zu-3`~tz?hKET+HO_50zqS|0*S1+p8{JA+JTw>5^?CC$mN$Tr|3$JY>+XvbdH2i|+I z-*c$Nq#Nm$U$AEPcc)}})qbVz+`xhc^`kJ~p~wgwcn&)5Wa*A=L;_gG?X z!Pg(2qEdDTVb5_a;~F*?a zd$Y!12J-ZrR17tQ7_yl5=%D)8iZ|n<#LaS_Ip}~|_rCa(z1yF8LwJ?(o#KWYmvbZY zX4kjGLG9aG3}@SA@UMTFy!vA$blYnWf=*dO#spEyn{ zZ!=i{jr;$0($^A=&)Gqq3_`cbaR*ZcA3?XW0SQ?-*$aDMiw&1D#a3TwW8#m$ZMG&i zI5S;NfvnJ%>2#KBW>e4?baUwamo05E*fd}S(YEb7|0$uXc>O5__b&Jy6@`29%v!>} z>qmS&7Z&a6*8n#yy6zOt*fEiR-zL#t(F?=Yoq``sG8&EyrF36OYMhLyM#MO7zf~@RPuKTv) zO+tcE3ZayW_9-9>WD7t&9~-Mb*&fd@XBWX5sXO@MU*Te_h3&Pc`185Q2%W4zm9&S* z0j5YHiu(OFYNpn9^wsFZM)LU{jNf~UHp*@df;irpX&dsSG)xvhkiVkYWPK}|+3Qhk zXoI7&no)rak-61NWyq-sr9^eh7l2LSXbyZ9e$tBzf&y1d07uJpv*NPk9YVubc&Z=ri1qA{eGap@@?i z78s8JWW|8GFyhp2hmfj+ZST*9rnsv}mlSQ2_-RbGr)Ujm6?_&D?Lh_;IBqgQvP!-5 ze+pSOcr?dvVf$zV!XS;IMo=a=2LhV0n~2Y3PW}9$kqIP0SH)`oLjmrOZ@5ds`JErp zGNeMrR1M*>(Zaen-0AW5BT&cIn;J+8W3&Xdy7V)_Z4Qmf&p8_&JhGMVoczrd6AMz^ z|3Xg=wh9Gb`PiJfph1_&NS2d-_*9^LY`|T|nzPSP6pKeJRAkTrK`XWN z1cBjO8a<3P!tow3s2+7Ja!dZZ-iN!Xrw`iKE$9x4iCi5yr~Fmzqm01-BFkPTY=P$F zQ9I~##RucS#L~oy^5hXw67T?r2dyEHRpv5!H_cn6@aWi+1n&QvwBSVt)FoqcW;dbJX&!QqLZ>C0*v*=`~kxu6NHExy-N znr=z)ItLS1`4yX+aBTmi`Dt8Dr@Y{4k!B5&aACMaZwzZu)wHVhu1vwCE|jfZkPx$z zFkJBJWb%miSLt2)Ha7hf?c_4-)80%bx-9>j8kjLpo?xBeYPHHsJOZ0Ij+LmlK@#7F zPGF2{BYn@%b=6OlSwr`{WXffG$DfS|DKM`Fy^6ojs+;a>A0J17t`~lKhHXQs6qT)p zHizGANvxejbcUr1#*Cf$tp(I*#ya-itbUBAT!!Jws&31jiPpo}r+q-{b3u1$oW{YxeC zT@}SqrvjD9g<0!{h+XViS8tEhAX;gd{T+t^rs3_xPSIC&Hg=R!y_YC1I3KnA*iBcs zLCzZ~FeYaXt?YX8rjD`C+qs6AB~8a$_YPVZH)geH1MfKfS72H(t)i)4v|dDNdQ+?4 zo|xT%k16;Zd`!{Ia(VuX8iEL2(8BkyMtEdxrOp}ffG@GZT-sTyI@s?l?61`w)F^6M z+XjW~t_CkX-1nnI;+)W4#izaybdq;NdHPSGUC#a4$DtFW5}ZUCt4XXop!QZ6WTcdo}dd+TX2Y(6~v>E_r7{peXLXc;Y(?nOY?5v)}*!DjK$5omeTq~ zf6{X(nDCzYkBj=+e0(mzAz-gvj$E}bJP=P7VVqUQz<4&~v}w>PNa#X?{h926>4jjC zccqTN>So$mF=)FT8yZsly-!z<1R$vR)LFEH(twd;sH&}jRc1z(FCSv^dHznrxD z{~d-1?t)@*I_@C+;JHGPNw!XsJ{3NmH!Trm$i>W&?b`O^eUqico1GrKe*MeIlx_(3 z{V5F%yDyua1k}qA<@%v8nkhV_(@X+!6>PQX`veKDaMCpH4k~Hy*AUSHbsxcqb$Rvc z)4bqockxo{?=M7@#IQt0YE%ZJCM*j_t;{1OO1YfTBQ4IXCw{mNSI@Qu-i#MdX1Wf! zCK9SQG zPQ|z72C>2c0i3SwqaGvxn;J#X_-!$6uir!3s%1^=LYCcP6_0r#SQ!o_3syz|JNBaW zcgK|dHIoY<9w8S5wDTn~mXT$aXKn)q6yB%q%DX%CDV5*;3JzU( z$sl*#!DCG+MWTsLikn~fg3})}Z|i}d*+|J~10Uv`bvk*a82=jd#C`4Sm?b5>^wW%r zur1d5_Ir*AbA7sJ_pjmsJcB@@hZA>&UVR4@hPQs-bKHC^dcrcMLINMLyqYez&Csp9 zn_{K(sYeU=lMC#{D}^+pm?68(YH_aM@rcA*qx)ZK!mFtjD~KsR*a&DSg~66=|kgYy?kP?0OyQQ-?x z;2}*Y=@x6l;aHS-Of|x*-PDq0XLL-!x9tUOAg!uB0%n~_{MilO!2tgc@v|0q)Gvir z?Z2e!ZFA=nW@660@1_)fOT3j}Kf)~CD)?-WxMJ*hHRoqapjh&~xF2A#md+Fx>V#}E z@FvWUV()2)Wwl#S&BF8KGLe+U-@Gg9R=GRlcTNQC@rrUXdPc%uv+|y=aM3oS2geG=+erZSQ8J*)m}AJyYin%iB;CI$3A?X zdBP)LBKW%o=S{fb&z-8UfQg^eripgqmz*2snFdO3`^y5E4dx~TPV4wU-94RP*QO#;CCEvdi z`|#qMVrBv^+Upm8Zec@}503`It4O1^4jvOz^^FszIim4JIGqWeF_djdp|D~% zAmx+l-+?1?qn%jh%W#t@&1Kq;4I^EZvc}0-jlbkCWshfz=-f1=TQf;++dBGt@$WX- zDXq%UAw@D%NV4vS=TW^`Nw`MM4w%j?TD9WfcIii|5d%ZZSI5MRkuzNCy~QfUI$5#X z{SUC94pAi#XO2D&i9dWAn5pMK9~aoY8PBC;$(}QUms#=D>7CA+5<_nu;N2i>ZC)!XUj8u5INB5DVNIz)wg8GNq6UgPYa2_ zR-y3E?-*rk;qwELy-zkk%+8f`Qj0py@-l7J^P|FO=&EjL>|#a1tZc~liqEgA#kETf zOY(IZBu~kwSZ$I~N-&s;&+)0}$8>cV!OoOa_U&mpZmbK6`npJ}1tfCCG|0q3p`3!= zgtS3D-V)4@c#8<+T$gp+yWS8>v(sd6^l0C$+^B&wPpxN3#M)J*!(OX8E^mEl44Ya+ z-1$x{Y?F!7q$B8^6VLH)S-V+MQusOmo-EjslDP^M>#MsXIpw}})JyMKt^90>Othl0b;^G*(tpw`H)wu@H5Woze>d<}qtYTrw=)$CfGhtBJt5?iWg^xVW^$$q z!1XX3!GxdvB=>x4)ke#+qYDw4<#;x0b4D;4C&6dz0~k#9?dH3_u5NJQQ;%C6&Z>Jm zO8Xz`KG+MlRfl!(2|1rH9@(#eo&1)udC}_JEa(-HdH+?QOh)%b4)l*wHkL>W7DTRW z`BN5+mrcB>XFH1ba(Ovj0QYIy;p|x6ste+@*P?m$01Krm{Esn-Ra}>%;BN;KAXBGE zj#r=l#oD-s)8jU^tnS?hVs2)zj*;=4xnZR=g<{z5i~C z{MZvqhHy|Y0$GOVyyn)U1C4vP8!>1g_?cYRGt@;5u=KJ%b0tBOh9cF8%tMuz;zTy& zM%r(A5_0^yQk-Qm2pFDFr4^rD>2M|4?!)(o$8mh8w*=C3?FiLa>yCc(f-U6gF8f4{ z#gA`g%FINQY^FdG!;X0=&q6x`&3Wrf9QnRiT+QUXP1M3}%5SVznoZtSmN*UnpjO83 z71(H$*a#3G(9i`MNT_QL4C{mal$+%(8aWw9noZ!V8?{>5xg+%9 zf%Ib_wz+C0=n5%}sW6`~sY*SKN4nylb40i($q+JsqcGi1nr3%Ac~NKPT4R_qGUGt4 zD)~ar4HDBK=qtTfi1pS}Y2^}&TNO-doDL_KA)S9M#@pFLozI86vZRMU_8`lM?CW%M z{6eIJh@Wa`Gpx>8MwJrgbVVgERvsEXrEj9}py~a1Nyl{c6jARw?K~wlTKx!^i(>iU z+fpPDV%z1wwO)+9Vmwt7A5Cct*ZufY4EC>>&$tO1k6yNWz>WrVPP(=cG>AH+PIa@h zLLJz3GnCSx9K_$ud{Pw1gZuUmHiS~z>^6Fy^N&l>vI4xI*fa?Lf+#6r2d zj}v*N>O0^3DptFTl45hs)>7<$Fp&wpHI+mo&Ywcc(BEEt;g0=;{=@a1MV0QQ4>=lf zw&Io0^s>u%nX-t{(bN6w-}O>MF2NKVDnp31Q}U);{Ngc52sR=T5hL3kThYz^cwSQr zC!0zN`oDsa=IgXGr)T)}Oxo+u9My`L+1yMoPdc917{h`H1a!e0;D?=N6$4(vdjBq^Ce71ai zc24i|?jW=-vo*oE7l4$1V&Zhs^uOAlHKLMD{2oyXe{!Pvk`?caK2O8C;Wn_8I@VAJ zjp8K^sulKE%4%SsR)frIY(x5IFix@Z#iWI>d}?-|!R-`*@*FG8<%!#yCiUhEA+Vg4 ze{w_osy|#@n{gTDV}u`HD76SXTWR`}fwce$FirJ@qR8-|9@HF&^kla`FOL6ui;~V4 zarfu9tg#H^nka;|3VUu+IlOWRJx6$XJMbm|Y;2XKly%RnhoEE0p$%4-PmAKrM088L zlsl#O3?PpiF58aBJ?fHcJ)Z}Y-uV4iIaBntIlJGWd{c6D8f`cIwce__q~Se~#5RVg z`6R^e{?<;LjI&y|YxrqZ#l_Ghg{F^gPvIct`) zPhAuD3ZD^s152e8(6EMAO$xS=wN)2&{k3nw5*zENCS1(iC+`Zq`N{mGrjNY*PV#a+ zsXR3quvwlH=7q7_q$cnl|1`9cQb_XYb(1WYm3SdyOr8u~qZPNNN~fmq~s{>ZPf_*^(&47k{3-0up_-@|kt4Mz@t(ER;ff0C3&SN*&!nH&_M&E8g>gWo z?M#d9{SEuRD>#IsoQUhdpApKGtm2)0yBCKFtU%IV^!(^T`A;bJ5OFu|S3R0-3)W?6PutDd zVVvfi!C>2rbWA)FiDMYtI6(q!ezn_-8|&NV#=Z{blP1IMz>cH**MkYK4->@tE!T@{ z97f~az9x7Cx>3cIiTC4wb;$)Q^rpYdQOYX6*T;21{wCb_+B1<`Z9V6%I2yTZtQ#U9 zmLmgmioS4*|HIuPA3htkJw=$ga9;ZaPvru(F=@%+u>C~iWFvLksQFz^y0%SAE#Az% z7Ur~Ou4?JNqV`YNgYKtWHWq=;9vRy&DQ+hmh6%6l^lX(4@M&qqxBNMzgm>(uaqCUC z658*^^dc$V$gzy)6+<~aww)LjDB&M#z00e&&2Ahx9ka72=r=1qc(Mh-RwaI$t##(S z-x@)}NiOmFdRg;#vY5#!Vge)^EvhA&ZtZbQ{_$gh6nK&8xTYschzBcuoY8E|4m;lO z$u5)0fL@F-AT)1uRcTq z9b}Pj22IgzwfxP2B--Y+ML#Jl^+!VAPl^LwGGjmkhShrdoM!BQ-gWqodY{5BX+~bH z+i;a~H6~XoH-YQM^7p8%90Yh9d7o%#dDz z6NtZyzC!MgGXy}pP&c>w&9pbNgUYA`gY|-~(|qp4&X{DGfEuO22?d`T47=R#BAhS% zY!H1nDE%WCz5i;vqdQI%)g=!(Iv?Ay2A?uTybnC|JQ}Hta*Z81U>dW>=xp_5*39(l zz{V3}dccZ>o!wkPn?Ig_{T^g>KsGUgIqg4{UBa8+Mr81g(=D~@u2m6_eY9+PqUF&FEk!0mVB{BYK#hsdV z&Mug>b-)nJ=_s0Ha}&154%tUG{)I)LTBMs(Fh8L>xKMl^|P)r(;xDKDyo`31_~+Zg^Qe49Lc-GWRJ8@#<_|CT(CaMUOFdpqiCW6xf& z&26$uGUP4gAs=Myj9XI>j?0!V1PNG(D4D_PrE4&(v$VfHfBg$$%P6$ZMm|8}{j{(F zZ0TdbEaf&pj#%lM2sYD1f>sOB#EUf^ML#_n0(w?{RJKODX^Ry}q7PblK<@A2&cnH>_r&>dr zRuU6tXMoO_ZE>~F;Uyz0{qpZl!!DHMZZT26m?gB8U&>=sEZWWXUY05}GnuN@0aG?x ziF@bI$o1CzA%7h-$+rf(nxy~dy(+kZyy!&vrKe( z@=AWXVdpT6o6M}`rI2or%VAaJ&t+A6N9g4B;lWCLr0j<^g12dwwP)LT1uaaf-k9=- z9k`E-)r(sR-E=Pi!}>_-05VeXK-U66JNu&HR8*{|LD+f`7YoD-7`rRHoX?RK>rJ|9 zNh@<@)i7uPBiItN*e%o!& z`RmWXfY@k}gRC(6rmum7UigM8Ety>}b&T|@c!x`|*LHo~7>Nfw+m>u>rIAR9XXdt!8 ztI=s4hJvy|bFFl?YH>9GbxFKLs;)s7%0)@Q6AM=j`Oz@D4WtV&fXoiSq)| z$ydEt2eRW|t-=erAwH@?e$XsbkFxI!&-9ox1y+k_NcOTy>jjj?-_myz5gy$vKr#g7 zDEdu)gqOZ{iF5sm&fVzSybtDD^h-{DWRNrdbJS)8tJcSg>M_hZ+4;I1{1oodOPB~6 zhW>zzR=Dq;jgjvwg=T(60mj4)BX#DR*A-Wn@SWe3DNTRHv-DZ4^o>>K2KOKa$)d>s zPEiRSCi>*vhg9ak_FDcAP^7`Y4g;p}m`%eq|JY&?cDK`Zq!;cwKD#bK> zLNk2k+Hf6GGUkT2LkzI5PgiA1yoDj$%CXfuIatp1twKhEXjDST;M2gzR?zjQe6WPG zHx$BITenphV>l10B2~v0qdz>gG|QOD)_`{% zDa*NQvQKyU*ChkdgX<7t?(Mtfc4b}LQ8TTsP$!uxvU!J7>-yWTk4T1u3j%TN8$FqC zwcZFao4$SfE+FU7kK@5VYoXUGi1>BR-lFM9v}#lt$k7D1l0r;i3l!eAJ<0gG`wKd{ z`XrTBjKnkv=Zt& z{`#zHv}JQe>N*N}a78c2_`~Wu8_sNolkknhP26^nta?WP%?GNdgOul*L=IdZ(W~Em z=Xa{S?Zu5!cJzwJAoyv4yuVK!|cGFDa;o#$q)JT5m&1qr} zCF^3p(De#QUG{iIt@b)EjwP?lh?){$$190>eEEjHUA5@i7C?ZwCwe13DO!F!E;M&g z;Z=>8@%0S#-Zpdwpv%z=Tpkai^yW@Gy8!mgB~1YM>QswVQ|N}utT+j5e^2L&-kJC*wPFj93e~8659EQwnka^06(nWaZoS>AWWF+;%pZ8Y?@q~HM*L^qJ@3i*{^PhY`^d!si6laBL8*DH!G|jHesUM)9g8axyQV*JV zv)q|3O^MbgeSxyaxQF0}5W)}LSc4sf#lDyLuF%Lz1HJ8vEGZ7I=5rW1jc9B2r|A)z zo=CP>d`xn_{Hqy5RPib7KXU=bpdTqDZxkVVCXQ`qU=e`51zoPXlXN}h-GVxbHrlWS z+Wx}Hy>nagvN}7`3k|t2IQR>IFL#pzo8v*pz+yVHB;;GBVDtj zcHW0UZZpqP8Ty_Xp-&S~(?o)1!^Lc1hnVvxY;05quKg?@X?2)~=5)`h>uR&kUyv1?wS?V6`F`v`cw!G3;`^Pvr zOD_v1^CcpiY~!U!r zo#vV6Yn?`G8ZJ7C+0#5P38|TH-2#;8={zJ9MU)tlU;O_1m$1W9CXmk^k(u5#)!ahr zjZt%?DfX(15$lb4t%>4Z5l9Ge#(5YdeQx%O28lL=vbB{}{%+OWO!z+Dbo^^E0e6-C z4Tw^a`}G7d9^234SVaZoHPwl5Oz~td|BD-NCs_!{Q+{7c70}~9qMt${B2vSK-hF7v zOS9|nArvlVz?UQ5y2NM7L~$rJh^ z?_3Q)h(jbgty7Dc23H=oOnPFdtw*zLINy8{>-W7I9;};e(=I1gsXnX;*W-0TmDBy% zJPFbLbLhko6&V$?ZgVACc8n7hqZN10%Ox+H`B&|hFdrd@k2*3HWSt)-2>f(Bgg zJyQCvpMGUsP2tzk)aH-n61w=&Xz8b*fda>ft;~(p?x1zVi0qiqDC(YS`j`)DR6b!x z6xTM|GNx~j+jtq3_zgWiu7_?-U&5ws`6A#=4A?t0P!*tVb*;J(blOwHd^d>PAFa@3 zK2$_I2SQRmga~*@92;M};1Ceg$25(*>>ec8xzJy7U@B~(SUseGANDRbDE!P@|AIT- zHMRBgeZrmqZjHQ%5|t@?!6U_cLQbAFK-|ArsAQsUbGiMnnEOaMCG^j8H?aH`*TgC&^WSFBOfetn*SRi4ErzY@!! zqX|UL=)u^Qe+FEbV}7EPzbbhBC?WNcL-2h-vVPO7Zqm-6E%IAs{~4vcZ}$_uVLfoQ z-&54yb6$;2K(dNIgX`W&jU7ZmZ!i&@Mf+up278c*FQqz1OKx2fDIxA&*YHsVbE@C! zYS&ak82GpeMG6`jJZQ~=E#Qc5oW8mJT2Xl5P`=>$DSo-B-fq$>TW=tCpxA8--_}dd zr>3d#@TsdB6e1-n72XVFmi~S|E)JKNL?^^WiAjI5Kes)e_p|*io%{`D(b=M#Vy)1X z#gK(E6B&vO{nuFZe?;29B6ba5twmM6kVo*ps7_W!1euLv+M46b-M>%HKt6#h}Z2or#U`-KBg+h=Oc=Pr`pgiF6eFV>KXAbX>ob z+C~X?iHFa*>{x?`hrjc868K-eNqfDTDAb2T&%@~NmOC7F^?L=5fuWm#a_vSVDxA<~ zss{AfPfym(DZ65n8;$uLYt^iM$X(SnWyOn8WVjbUM*;B!*HS}$)k>YZoyAEUpZ+KSC=z2Ve)P}qC4^|+gl7G+sJ;ZtE)9exXS(}gzyeB<%1nj> zu=vx*{aMA+aWI-vql%ZOGvfq{59fZ_Dx2EKh)HGY_dZnf4Z72$&WO$vZDK)|f3~%J zX86m%bt&mx@4a_QV0_`V_jIf|W1KWIXe6Tdyr`C%I;u(HMW}@E&O}s5yZ!wlr<}&< z(iF$oh!@d<{r4BKIMYQE!4ka_5;W2yA}<;S{t=5aYt#FDr17r%^JR&;p=XLr-qcZ2 zhM#T|Zxh9*11#ozEPJ|UvCF#Y-A+F?{}*6Tj-Db`X}L%{ z1ADXk&c%=cue)I22)KgCL{N2%CAF}%_^S|eTS=eRC-!#8nmE#lk>X)6;nBqcD{*@D zU*QNnmU+TAQ8!m-h^waYx!ObDLh$0;4ri=AG@`s&C(8IlgUJDp( zIPfQ1ISM%!zj>Q<~|?yvme&rO(YaHtUpWOcLJXnyQ`kl zB%GkzcbBKJ)TRZg20o!>)VJPGS$B21Ls#XvnN}q@nicdOq>Y-I8)masUh{5Sa0wA3 z!f^BD!KJ@Nm+UJM+;-rc4%Pbp%JMrC3)k*Ugr;2}kilR;z0zQDTlw$s7Y>`pL6^9`!hwZCjeW!a#?q$U` z5r4HS6d{NR?tI+5`=3mP|52ui0uy{8I_`(P;~@WnN)CPRfv+yAwmTlDCr#TLP|>;8 zn@Wk$_aJYy+#y&i-MdiFkQ5jIjuzn9mfd`Sg!krT)S*_)|4{^REaP+eaHl2fI|`1f zjT0wZuNODu>MAY&c;Tuge1Jq!)PE_aSK7S(69srT%as1$r(c%S{ATh&=7kcE-T60M z`FSc1=(z~_SLd>g-{X2tAKO;L1Zh)4h$5KK)g`|ljVikG2TP7OR6A-DL{f-e9cF}O zRm!5?&%bq=wS)nwzHNtV-aBtd^mr~S38VG^ruluNnuC-#?9glH2F``cW{go2nkfeL z;EdufJYV6uj<}ULSKhw)@}g z_iGOB(`)3GXTNkE+koxVzcm*vS;EKxC!!r3Q8F zx{{qXKmU|ZpsFITGV^_$oVrbQCT!ER;4i$|6%qwRPv}swZu4}CrU}Am6_Ti(7RQHe zFFrvc<&lop`=g3LTZ_+l8?nvF5;;*&6r>l9}yO_?EtEMq%^0$2H;Yw2XLxjbe*n|dBA zyy5$_+<0{m_cPjv&No4LFnVXEg0qh5)>T8g7f_(x50|9^HAqPb*S<)b0gJ~snlEr|@bC`mNFTX~Kr zbhpdlvO6r*pL^@)mr)cg&7gPd?t0_DCEVT5J^w3?QB6oI+x;$C_bW;kgq24)VU{a8 zZ`);K%OIQ!_KgNC7lDIW%$e}@TSQ-zA$DSatias^6gUVX=ZLKv=_kw0vZ{brkWOJ^ zZdSf-MK5o*7oT3^d({Yr_rKDrT0}=0lKHmQoVSl}#!QvA@@4r*i(G|{+M|G?0x2~@ zHL2z5Kt?#PA-UD|A1%8Pgc!H!y=0BZf7j*v?|**nji}ue;qtVrxQDpU`xE)4Iz!3U z)E~f<`DgiX=N!SAVrnVR=OIO0{jkS?Lx`V*C3N}rCwi4O;bd-B9J%w7hzl%d!1XE1 zG(|YC)ah1PwSd+CpSZLtWEf=n&*wUs+dX_)8G;TfgT57h@qi)W9H6%2PHi}?w zx?e3e9G3E3&DuMLLEX*H-)tkbNL&>UzOKTkCUfKJkSyjsfoioyu^{TKfkGiGM#lrEBMpRUOYPL`L%UKFRC_ zneY6<7OiMJ)zkp|x}L~VW)gk6(Af=2uior@bA_Z=JpouPqd;d3?mBc?e>t-=qFGbM zu?*-;(Lf3a0;POw@OPMhIRQ58nI|*sOoad7i~s#g_}9OPBf9y|k^)pwxYC(K=%(WZ zldr$)LbD79BXsb9WkSItmn#Kc*AtUgG(^-}dj_45^Sq9`Z#7QwRfLGcF<<+AS+;H{ zd=U7=WGd`X+XgX9KRcPw!qM?iNEFgxNO8#?SXWg^$x)6H*96oG1CXtsahh$e)_sP` z3f-P(6iZwm{Y=f$zOZxk?BYL&?&(4i^n(z_)*M5}_m;s+X%U-w9{0<>;$pVA+$XK1 z=vm-C-bm;*($R8@Dw}()@%GZN9nDy9!jHJH?hRClAQansVk60ZAYxE5^hvd^J!(=0 zUW^27b)HtebBP=GDS$)W6CrPuU24q0*?uFDoGO-E^S3dA*_;s)UDr4Mrkl8pfBw^P0+tj1+dE9U>WjJu=U0+NqSY2q;e z8aJ1f9y*l$tKbgjAF8b|N6OQj1Ti=_>8T&Dr9~C#~?4BPnu5HaTN^=h8)&+(#XOgrl>T zRc7GlEZ$VEveNNzZ))^FA&77F1CBA$KScdbtY$B9xn5Z>h(5$3O+Qmeon zTl5%N+xiKwtcp?3vrZLq<(&X2&D0+^oAL>h`rA7)q0j0w6_%^jA*00OsX;qq5fK@Z z2`V+pHBk`4N9Mc!4w((HznDS4)C;a36tXID{m0c*6W<8moP>X@hr#+_D-c#+i~k%c z@DcSnP~iAq^5OqOW&W2g>6ddveFjRc;a|`)Gl{mAn(lg|t(zh=ny!;Rs(!l0h`hui zda-A1TBNnvbSJ(&R!9Tfo2mkM{{FzLup^Y%sy&`gCAMo%TPDt>-^)cRzKIt z5`(**X=9bh2dJ2vaFDzv7oEj4Nu8L_I)1VKS@tJ8k<|=*!pzWgb6Zz-AZzq^Yf$*^ z^Mw7MZpxbHJj=~YV16s9Nn9TBfomqkmNY`i}i0@dDo(qsf$VlkiP&o zJU}F#V1{k9qLiK&Ngzf>r)b~8D;#Qv+6^+7^=aee>kvPRvL7B-TA6pv_g(Q<64uqY zqWTjRznT2DRmoFTVc9a<9Ivro2l`7vC#9g78A6-zhsF!di`zr%91aS#%jUBt<5;z5 zAG0=$O%uKe|2*2y-PgR4GTOBV+DFYw6PCXB+D@CpWpQ)1#*r12>WsP278EehMTEEQ z+BM#8o5PxIZAV3EBF(aqd7(bc(z#%|t?eg%VJ=4g_)Z+?g5*YB!6)^yEO#dC&JXn) zLhY?XaV_y#b+wC{PF8|oFgaG5K0fn_d>|<~DfedW8TQ5q8cm8FsxbV^X7{%NE~_aD zVR9!Gm$a(JRxr?vhYn z7$K03{xtBNrpA6_V*HCkQl;gLZ#5eK*_{2F0Zlo*Qu#NbPJ)rCR-#>Sq_Z8%Yy_?n zF4eDVF29@qQRthWF@7%D4ThcdT`W3jZ%C!yr@>eO7uco&rD3fkx-l?IUu(A<%`T{i z&EySS`jfj;43ao?tXsT?5HgsHuhPmFb8oGs%)50L>x)HMhE=x6h5Pb2Ic-x90%rvA zJHvCEEiiTsxK3Kl|0%3HaGW6bIM;ugqdl5%4+j_7(1hRDbSK@M8?BRX+mgdGg?_Tad}nt9>F>0eNrU)?M+zPP zZ%z6+$hS|(g*yi*kTuKeHMhs|4x+gttA8opQTGX~FJ(xD_U>wM7_F$Sj=m4}g@F6a3j;uf@hd@<64HH#NynxvBEg%YnK#9$-1cWFP%v_gAUcd&HhD+u|u* zGDsOZ5Yu2r9^1>F98-*2^jb<2Z~-_y#H^a9 z^=L)Ylcz@WurgiL{RFPIr>Q|fx-8$KBuGf|31!_~^n6`dlbgk)OQIPn?M*FSp;J{e z`f8`RdrUUKtI~4z6Bo@@!`&Cu%wuIm-r2v#W~a@i{40%b)Y9JkO(mh*$Cbbhh0h^^%Y6Ouz~ve`asraDPLdS{Rggv$Z%F08Z%2 zx}VTvp8YN2{8|q;yjENj`4<`a84t%$2tUz5zVr>rXN1U18_f z_LeeTjCksFGqpxR7IW3_AmKpEK?!T|DRfZtPKjy_Ghy(nEpZW6r7}KFKr+d~Bw+~P^_XdT} z>g!Lp8GAxa9rh|lwo=@X_g8nlN<-9EQV8{&MJ5V$%nxKMwX-cWE?m~-jjsfI9cGZR zxUB~6;}AeqCgKAL7#WIbRkC2yvade#{MiIi)YC2#MeTWe?Rr)3a$NqQm*jn^p^S?> zy64isKy@F-RV=d(1A;pcOv+E2Zgj5+4tTurC%fZvsr;2M(N%xOGU-r}*WWd|U-r;t z6J7t^O?>%`pdWu8euT~_{752_*$Y8ipz_L#Zn6LIg z-SKxL=f54aE&U-0a&UjxNsRO0lRgyyE23KXGg ztghoieIYGvEZ(75wctwv|-<|ez3B2kX0iad*|6;pgDPujzH`(zY2d0;e`mw z8)bkpd(sEhVJqYaKntixU^}QV?x#JsspySoYAJ9QoT~Or-kz)IBzS&QN_7QF1OEY_ z?E*W@V^sRd6-KyK+F{vqdt4`hYU?@76PMBlja!e-z5_;x0of0VWvHCSExmf)m-3$a zSGo0__TdTki4I>!33ub9V>ooQUY!6upUAY5S=Ov4ut~8&28ZTF9u#MybDC%xd=6}R ztF-??wq>Q^M}|Hoz5Ty(Jiki@iYZ@t&v^6ZJVkpD>ZeqDRTS)OVUM%V{=`F6gkt_A$x+cGHSiE0Bw`9`| z&B=D{EzAM8@8%q+w|dP8O9d47kx8EqbpO>nUm^?ku7Ho zeu+w}Ho$5u6K}TQy`E?YQ1x>B3!Li?S5t3b8r(=aev5xpFtU@q1eqnlMCi=fl~25rKbjE`vk3&pE}>C-@$H{6FA7%Q?QDiGb=a$RW8SgIC#A7`|@#-}sOV2vA7;ntM@lLe*$qO(_6}49< zz9<+_AkQ#)js?&e?r#BpuG$6-E6HO&+PZ(8Qh`t{qk9DXqHnH|=yd-u#-TSqe_krj%4sG}>tCr`I zz_+~rx&Reybv%o>urL8!S)`hJmA(ICLIPR|Uy6}!^XoWPwGu-GR6-sIfVMB{aIz3O z6--em{YF7LvmMLS8R{e=`9=R|bYw2ZmL~qXYC{h1cIeS*hFjf#pj1}^%N5}L`U;%WlBb9F_-Qetf7KGJwpV=FVoSGK@bbSWtBTVR3gT4LzAu-v#l_S`2fzY3{_w`8e z&#b6P=*j!jUMcOrvgL?>vRObzFCzmlMeB?dFe(j^>DZg8Vany$y!ZsuuYE~I|Ix3+ zFwP*}LARkH8GYYS+#B;E|CS9fGk4GsnG5sGVMT9EJ3)>YDFu zwA%@j-E7khGl1&%Xrp>vWK7j=Xc6<#*9H<93}UN3sr&X5bq=PTgaDlTa2#Gi zTL;i6Pf?1w^3{ICeUCQ0H@b-Jo4>|q_q~bx&t81=CkkvNxvc-<_QcHAOgQz1zc;SC zVej!!@6he!$xOy9J%CToF4Ak!g{2x{SZ$aEspzD#H`c)g>-4EBIZyB64pQej->S6zcW)ZL!3iK+y4lAnPy3D1@8;2Q^=3wnWZ(+!wiFyPA3}I)eXk8M5E< ze}J4wW~!}YVI40)mmABeRWA%fFoPi)OOlvZKi{`Xy||x&-X_{|$0a8gb}iHS!J?Qu zHWm-QW(G`7tHhz!EM%N{?$5uVz|_o)C%^GI&y{WXbwX;*{Fp7x`_Q$6IWYZXIj_!10T*3Rp6)X zdo}L36UCp|o6cwN8I{r0|6)_(M@-T6yg-t@QK~M& zd~6gA%2hqOu}+opJJ%>H_4wAq0lfU5(m@qni3$H(xK@JEFzaeSav9v6$sW(ohwbraugHnNNU{S5f zCF7&v=ZFt@vcFeL)>eBxc$mL$jz4}U+Z)fo+`}~!`Nas6Y=EsXse|%e9hHX?Hm)$t_Fq({5F9^VdXiPApyARJTEDHiD$P z(@wUY_r=uKoA4CQe4T&+TC0wi7JKs0ymk}ZNsCcOKE}0OPJJAR>~sD&f5QnC&o$hg zRS7=@vdD51V~nW4v9{SArGVEu7d*YY$2=CNx+t_@ay0gy)T>}z^m}ms`zH_%kg@%q z<4dGJiT^X@9=znh#rd=X!#$`MH_FtS#HiA(KQckd*1K1h4Ds9M-F7>Yo21RnAUd5dd)>!~on)h61&o#DI9tI^WBYi48{GU64ES zO0n1tE-P*_N#w<;oB0gqkw&q6WXT><gLk&+q0T+RwfD`NaK{%8#pIxy@rxvqiDFD;R(dNmuMXY zl@dEHuWjl%Fn3PG=ON*Gv{vDlx7>Kj0}=Hn*}QFXhh%)+PQ>9#^>NmdqmG6>yYyh}3iCk^f|>taGJ&|Fr^1Bu^|UFMt4LzCuj=G1)04lYpw9R!y}&Q29uhB zf_aOv68s%sh?&dmhTP^r>Wr#qR4NW}Wu~t`@Un zanXug+2vdcCfRI%UX{1oTblRw_V~Ltm+hODu}D$nQ^8+sF)!W<(fLF+c$&A(f7N|c z`UZ`d=jV|nHLv?=Ujgsb=7}A@R4Qediu)o9Dcqj~_?M>23<8og1pmDMFW#zsea{y% zp>ZMfy5g(x^r)oc=8|Zkb<4!k16u8DYIkNXNxgpLy_&TsmdrECQZ}WCV)$Dyf)LXJPptwKJUy_E2h>nDTQfPsU$H(KqR5^ zK$%c`ehl4madee{cC=}Y^59G)v@45E)5?$wQipTii9(I(gRwQJn&LO;(Orj@-ll9&9tgNdKCX<@I7a^~`pO%N% z#Ubve4g&obBxZ`Q3}M22W!U_1yjVxLP>oUT-7j2>_8^Yeebu~@M`vfBXI&466GuLe zosgKl_)8pr{~0I+vknwGqfh=)YdCO-(AicT3zXPpdDAdXNK!(eE?d!Ea*1w}K4Rc3 zHbkXFF&6YSW^eI&@6s3Fxu;@kLySlRU83{V^UJxaBY4qoB6u-?k)wyu4)~H;iK7x{ z?zLR0?$sZsK_u@1IZR|RtV9fCyRAq&-JSbR6iuW6mNaj!s%qkCaj%2bbQo{IkRd6@~mx%N3d`1eV{c!Jzu1cqRy08*u z#OFe_l05qXU7(^?24D;?*`ZM2i08Ik>`Z_v*(gpSm&TJK(3Q%E@DM>^opFvvv?nIh zHM7b>ZRFd7N9rPHG03=#1w7_K?3Bz}f>1w(?V$?x9NBojZ61R5^+oc4n~wj(wg8*6 z{}9l-Q4r(ZU(D|k3xqoY>4FI<&)=%tF&W| zRg3dB+ARaR@y63nL{&e%Aw9hvnWjE!apfOw_H+;RRAX1nm1)n+W~9fFd|MM3=-T#S zfbp~qLaCc5;*ljPQ|)iP&@8I>S=|u{YCYE|c^ibK^ybYcE9cSMOn(&9Uvd4aox|nN zBs)_31o65X?JpE5o>tIqyrH6nmmF3$1bP!eQn4m*UN=v^+nkY@*F(f&qDa3~Bq-l$ zF1{7XZ+0^}raS2se$~zo$yEMw8@2=UcRW{4jZG*(Kn1xDpg4-q<2xS`8NcDFDxc1|!6?4H7zjx^oBh ztFeFTE6dY!y#B>Xa%v{R<;8PWb3c_iF>*%Bz}h^b0P5cK781J{7Ng-opq+n!6$zU! zQNHw1k}fAT-sW!Acw$e4boOLox58rNH=Z+t3^b0_%(|CMS+lcNUGhZ=y#G5z(X+$6EWP$iS#;1aTU zR2jq})<_v7POsKKbq;*U0n*|6f&$C$vyz!#=(S3C($!2hdhtezl0vsRp)CS}m!HN0 z3c?Qz#D|KtYKpchYNE+RrBKllQgU8Em4F%mPZtM3|Fn=Q%DFE(OcK`(^PeQO#1TmK%(Rw_shq4)M_O>v=@^@-B>Hl1CtM-EBCKs2PFm<;>mQEy zzf79|2^XS3BuHQmJ^a&c63B-AKaFkad-D%c(resYB&vA<=gpz=uTTm1!4uddB+aCH}`z z6S#)S&2@rFDCQq;#v>T07`|6Jd}CADlF%PxEazES7)$>YQS6UV@F-Q|Q zI@40jXcY|&moR117gS_Hh0ELNS?#5LoKdJ7>d4vn;eW35*O&LDSm3=*n4sT0`nLk~ z;gGoJo6W(IUuGzg&&i`%%6Ahsf9-tz?B;kG?RbCj0r?YrlAp+MNL8wZPC5muO%Ev~ z622A$y3BETY>?cX_6{Cz43QTaOv3&9tpEP*b1nd`aQ>qA8TlVHIe!L}t%qf+M_xk^ z7F8~oxf_b6BBd3X0lo3mFJF!Zh`lfAV7m_oCrKmR@i>N2=OOAHt`yjWo+Ta6IK12$ zVW6cpMEu)`{-vq{*@yD z^Thuq(Ldh<6=CG3(N#wMi~OiCmnP#Q%ir|=QwfovbHm8by$09x*L!^dvoG)ulK&sa z|1Ui&|8GH|+0s2B77EB9gnW{}^#UbqntIpe`aM)s-akYh z4m}V9$U-}!(@W&v^npFdPna+dY@Dx^J;q~IinE+jStp)tk*nF8U3)F;2&*|QpA=P~+>==ZN+dgMJjV7?XEq&&KDED4-v60a=A zb5rW<6~w$qpj}K+YFF3C-AeU+{C#riT%r~ex1wj9<6MvbMSqe*Se(pLF{w=^+M^sp zr3XibdSmx%To$<*mms+zq}k_R{Njg!i2OKHIbX3*zJV&7IETB&#^=eOHw4&O1h7r~ z3sNO*l1M5!UAMw1_ov_=!*?W9RAAjMqh6<+Gigo>lmC9d=$WnsNGS>R129;^uQ=$n51-N~&n2^4f1(JvJ2vOe``7zfg30z$ z$78Csy-v~KxJU^rg6VV2(p+y$_J$g z>ev1zGhjn>CK#oea`8TFkLKVTbtlRCs8`y;S;NSzPZU4@VQ^m1;(8wmA;*HJ&hQ14S7le&o2>df_4k_x*1T1&h^6phA4Vva2ENo_)??o>wjNF9c-l z#Q;@7$DL^vH_&G}`|PP0+;2s35F;QUpeWUu;j*`Yk_!}6hZ6ELwm${zeIZPt#Xdc} zce@a@{PNa|x#tswrEH%PE1H#!?$p1$uXhT<_sw?NnHl-??ZXpF&#U7MSN>bm zZTE7!^DYJC$H>YmwGJzmcl{@Lz4h8)eC$v+tM-u)7oG^!|et&hNG zN)fC)mQt>yp^G&3KEaNq)0@{A=_mteD2feiRvQDU=h#G2LI%YPUj*&YnHB3;j2=@? zk^~p}W?vJ0+%0`&K_hrypH!DxrC2*?AeDPPmL`Cto9>wc5{#rGFfTl+72AUKmn)C+ zu4T~pEwd^wC!55^T)w@IZnfZX^NNtyEe5k3IZJ-Abu`0395%!iWpbRS z@bV^vDfH(2OBB0}u4au_)AOw{I<_TIja!`Pahv2$Dcpmq6){!8(r*7ENm># zH*I!DqZg7%MpNc&vKq^$*1uD^JTU0YGY)&M>bi7^3ap(82O|nJC1Um_3#42JQ7K^F z*;k$WnqBt=p$+f`;++57Y50Wz)9*0us}iuEu2Sf$f4XwFFzbHX_pXsBzhUWGnbH7ltZ^y-E=uJxF$miJ;@RO=*~vE0Zdg zU@#~H82WsxBWWl^aw8{RFBhf}K0e0VSnJnvTrh+0K>R?=S)5`JAgxuH>FvVNbITc39-(8B;%Tm6(^1hmuh@r;7HjLnEmyY?= z>L2n0#5$uKptCi*ar+tG+$6PfUgV*s%9l5!$jHdqpeJ`2WLOghNny&P_PN!Cc7s#c z;rgH)*mRgpCK?jCO>E#Z#lL++lX=mdz)arM=RijfwD(wD`MX}6v1)GL>`$La3N$Km zw~mTuYE+0@pODaJDCZBy@Vc{A)p%Yx)w>*Is;J7y>HOg=s-%#cIAX3V=adM?Yu~0xS>Q{+%PiL2`J>X5NSm z-rt(i6mXFlrpw>XSs)O342;$T4#BV3cJd%2rGBgs3R2P;BIGQ#;=b9SsaYwX#c1=V z&rPL6r&B|yw%Lfa;G-Zi5A|w&f4fSV&0)ur9&CdJrz~LXq#zJ9Np`DgL-zzwYs2(B zopO;%X0)m`AdAD}c6;o3GPZ5o2>`IM^nfbX&s7Ud&;Q7Z!SA^B!{_#5ow(2--Tu7x zjQ?C9Cyam@;DGJ%7Vg`F8SZT7dAD9_tSLUwZXR}d{L3PyrbeMok%G&8EtCr)1YVyB z9Y#P?BVA&ROGdrj^2es{s3R*gU)*`OAw)C?#;=+ zY({b!JX?#fE+|;23U|0`_T>5b^nlHMy88?hD2G|{AD{22V#q|1Rn$c!z5DL^jTE4P zQP0^ug@dB9eLLy(3HTf%-3f!1b1EYdd?5>IrZC-damtf<_S?LC0zP53#s3Xrj>e?+o9E)y$l%5BqkTbOq@-C+Ih9#`lKIe?t(Rqw=*8az}nV&^*( znKiTk^KrScg=&R{oR4(hyq%4ui>INj+c@e-B4O1hor^9x{v0&T>d^+&g-6G~;V@@D;Ys*!fA^oD zL>-oPNqTg;L=Ag!WaVZv%~(c*QQt}SLq+jxtmm>v-?l=N=~*OVXV%NMN1z(qME&9$(LQ(y@7$qbKA=Nq%W=M<)|z6D2xgspMke*>T01cvrtTU#9rw*SqZ$9Ilb; zdP1}lCO(o>76gBGowKYT;3Wd zR5pP_p^8R`Z08-Yu2dcBm*pH;(rO_lBnKp{jvJtLphEJbNws)-w94K2`_+i}ocj-( zxAQ*AIbdYk;~3*azf?+}Z0jT&%O>LGV`-z8b|K=bv@sbq?iGjU z1-?iX@;X)@k+-hZKCOF#x!EzmZ}wLF98MT^xFjkqqAD4!DPm#&I?!}up;(JX>vUVW zRM)dWxegko$EFR6AoD)y9zukz(^z{7#MRae-KwVtot|JB^DeE`-1NKA%nNt(nPly3 zA@}t#RzWD$j8Bi^Rg7kJj2@9Uh%Ue|P-(70$eM=|$bc zwiF~NPaP#i%zT>Xl|%<4UMsS`oYrHB=BnU-Kq+l_)C=^HUh?| zmHC?Xg_=wO%59{*D^Jj$=T8q)0Pw$D{YbhSj?{yiyi|+ieS|C1vfHKO>Z>HaHSm^? z#)WxXWJ}vzq}p9i+QC9z?EbbME{FAjVv+M<&I`tkfz~K>&M$~uv4OZJh66DgH}jG0 ztj>E6N5C)y8MXiSAz2cQVMAq-z7Iuy$$ajomNAZ`_0x8vt{0v$AH1)OSJ1}~-7mYM z$Qc*t?3Ag7v*O;*I#{%waozs_g|(<}Yz!GF%#fI$A;Xe5z8JB8@VG!DEH&7eVEmYc zOc08Wj407VI=v+?iYgl$+4PO0;>Tw>Gf>*BTq_+r-p>%VeUrQp%VyOpQpxo8i`T^t zyYRljfVXcG*UoI&hw;)HM88V())evT&z=VeP2;s?Qq5jB4_}#2z8^^8voe&9rNw42 z+>_>7iF471?px?1px|VVS=_Q5CPi$vrEogXpm9z|kL%9@W@lh zq4`D?_tiY_W|lHE-e2Wc!iUNKc(3L&*X1AESuRjk)FhiY8mE}(Pg#-?E#_@5;81v> zKb#$!a}>7yJFu@7J6)A;{c)AY^OYz^a7S`Au%iu*IAxL&{B-G5%KhwSqxgvSRat~HG9KEt0Ab7=gGaQVd`JMA=1{;z; zl}9^_3pp3?Uz!TAHdkuvkukC^`2jg_Ei$8g>^!SZuzvOIR- zc)UH&)>AkahQzo@lMM7d<{I8nV04Fgb}n$UCp7wWhMn`0h;imkWH8XcG&?qSkBXflc6?EN={D9Z#JjDGYz! zFz?h|FFaT(#$iapPY;8x$Lo3JsJtce*ohU??899j|9x> zMcd1a=rqj0P!4L|(v9LXb75Ux^)BlQagCp4mfd9aZYKqE%UsMXR$DA3jUnw3ii|xtg)aL;~A$^`b zaSZrY#u4KB1c9k>aC}V?E+2iCyMhGeMUxFjS@l6qyuzALP;chn6#Q__iGJs zz+fU6R2?d4q4%wNql>4L#4FVO07?zH-A!O7v*W_B=7R)?O!sNw)cnLs zRu0TRFUcGI6JXiM6{K};phJS3(@2FMiX+OjNuW%PtN{E;vOau#R>ReR)TKG4nbMY9 zDLOU(yVs==;_KY-k~nf@2cnUqLAWGc&R!LBs|YBdr-X&-EjJE&AY+ESW0gV3=-~x_ zV01A;KL5Z~(0H+yNiyM8S)hQp?me|!8M85R4fV0qCaDlyeZ5M|?Nk@w=6ftq_|NU8 zb2`KUj6iej`8jJbVhNy@A5kLd{1I3Cs0)ESi8>3$hS(^KYr3!nhZS)kIw7QjP)dq4 zr+JSfS@R#CNGar^w5hb3q`OLtZCYeI!!@*ZlX+()I&x)`e(>U>u|w0k1|#C^pRrkq z0*{8+dHmPQ+nL(5h8L)5_8o>vt=ja$zTUb+rL=KKzJ0XvWZc2LUodMzvK z3s5fEet4kTQ0}d}jy2ZEXm@;;N=;IP$i1dfe;kvt(8BEMU+|Sqg-N^iQxfY@BCiG8 z6JoZP+U#w;LkD-SBVpy|B8iMv0-Qxu3hB5|)C1aWzqh0a()&HfzytV5$An}Y!4riI zsk+@4e$M7mTi}ck5q3PL!rdTD0dd)9AJm9w>*_{!DVu31=Fst0W@_8uNFJ%y45uG3OPPdEnOlR ze-?(&QDC`E6iPUqK)3s_zyhmW)|%E*g>*)h^Z4GfRPy{YS29#4wJ&c3Y1K*y#tM`I zbad2|S|97w_!$+R3%QQTaZ)ZOlUeM2>Cz{6e+reiHk!C0t8RhW zb2f@3UvHrq)LHo_85#m~Jf-tcnHeN#wW{fFzR}&Z6Zq#VJ-Wz|o+ufu(c`be*AP^k zt~4{d3Qt{G-xJ5IE{2reYjoaAE3lYb@Wx-pE}NX<4 zpPj5?8$)o7Wzv~P*icRdNu-bh13EfNUnyF3@j{z#9{#|&8lnM5-DCJ+;CcH*sUM`D>4-D8qZEvlK8`H~=r1R>@@W0tG7KN0An|oyeJ;=8`xVO-B_l>b@i&xe|7y+KtBd{VU4AS+FP%)19yE|a zgicrOq3^o8fuZ}UUK4Ljg_g;)g*$;?Q-v8*D>Z^;nW8in)kQrGtL-Sbn&D;=_e5LcSs}QhB=@F@Ny0i(0@qj66hiuX-9i7`BwMyB;4%#P23^ zg+_p=_Sx^*>uAayyLiNK(DI!Eq78Qi2%MFyZ_}bd zA4$F4(L;Ab-V&i7wd4}Cee>$kluv%{&G6uymSa7A*0orH5*ez)v(v?KYBy;%!)MeL znYPjpKWTP*>w0tfu8@&x&33FkSktRvw*Fnn>l6+%f*LEO*5|m3UWTh*yxFa_)sBjr z5-zWPKhd zNNY*X;-JqRKAJzW&w-r3-xtrQn;DkOHl?~}%de2>2jU5|Uj6v5hCYsmE0SDp$IlQJ zP^xLkFQfq0){@=v&6(D-PGc|5kkT6Yde1Ain@%Df9p*YzhXdD`SJJ9uCW(6h8g)nm z)xt5_J7gwl$K?SOUj6{H{i*ZCuIEJ$wsB)J5wC}#R!pM?8`%JjV)m!|2rC2w-Dgj& zhZLIE1`jiFXI>~D&Tx^)kmRe+9O%-giv~qQRF^s1(uIxpl=7#rY(S?R4NAI!kH=hB zN;#Uz7E&B zwa0{<9&Kh;CAyC^YIk`u7j5p{{6rZ?)Xm0L&?T=)7a9v{={p3UX)rZRgt zk?ZXg*-;deo^Gty#jp_<@tWXtwGIYauZc40?G<`k+UHX3x`M6o^s%*rO{)uTx|_&b z$f=wR?)hG~?rp<$=pAG40$YYbLA^9RiP3Rf=RQWzhn0@QAB$Pkqzl^E z+^$RT3_90T*o=xXO{ilkW)`ZYnZl3IQq;5>Sz5 zS1b=JNb=2=J1VVa*d$R+R4y*hgG#Z=l&-%NXvWf-&qM`4Y*O|L;Jl)ei!pl?8X23u zuG@qAzIa=>$|`%<6*ew~O_vuSQvY}!6crk!zeZ6b=|j#qEJ#tn7O{g6h8*DX;0Qu( zFY?5lg$-L=k8lcY>oJ?_*2Q_L2}6P{Wr@575}3c2;3i;FNXY{rMTutNWLc5EUe1`U zhW@1dm4@rodXv(5b1itnXv)_w%AGeRhtP30+u&}l6n1BEe1;yMo|i@QdI!p`?P*?e zum8yS9{Q-ZwDFLoX}&VQhg>L!KCwbQOtevqkjGJi&}R7j6?Qo1Ti^8s+?B78P8$b-2aUnPuxcvdw*4jMP{gFo zwbm+tbWvNd=$l$0Jp|@WBgL^>0{qrkxkBto71O*d?*0SailE3WFsDYlNf08~hvwaH zbz5dj>R#p2udU1=7P%lx2HBh}`+zOnO`REu#Pf*EZ`c?I(tUP=Tc~CNC#LDC-W1^H z_oK#PZQr?jM|IPUs@y@JD8OYVPp2WSBv@4NZs^%9;YM)NcpmB4>Vk0fI#XFdS@h@E zBLGM^4}D%y4d=G_rRAi2z*sQH8^rWz3=KA%rb_F%;C7}{_>;kN?ekRCB5fm;FxSSr z<-OU`=IQtT3ULd%T+0B-lvCuyk=(NG^_i-MNy_R`7OT4u#@pm#-k%E}y%{f~g%yhx z0#=CHV!ES4_g~vL7gyqy2FiDMv&9`%nEP67t&hZXDKsww0D<&Qy#;i&g2!)}SRP?! z&Nc?NrpZghA1wdUia&VDJ=_xbMZaFD&==xKN!_DoI8C*-0Y3iF_1oB0@)OihTQXQYrY36cVMzTKLyEEFq@AauXep59>e1!oZ^vHokoe4PH!q`g-f?38RoS`|MO+A zV}{D}>V&;KuvVQv%r|+CYs?T_5{Gj%sF&RWgS)pc)=$`V)!qRoAc5`=cM=H4sYFeCx?14l5&u)4PzNeFl-uAvL5(W|Sv^gg?i&O8s2nS=OuO zsqm1c*Dg?OVMlWX4{`}z(T8)bxNjFaByPUEv(W5D z6MYNw$;7{^#=tW}uZpT*^^7yTj*n0`B7?(KFHx`2e6t-@05f=^#bwia5LjJn<& z*uIHK=jkGN<@Q+8RMjex#f0p_i)6u@ynN#+Wa?K44rFX;&$oZRjOSi;yxcITtn}Rv z7F7-4ce(Q{&>SPHt>$`T(n%-?O*IdNX!(TIz)OlfV8cJe7voV&6uwTZm~C)Q=UaO* zI*k>k5otJJ(!h|JJ!H^9E628Gu-g};QTe7sy4uQhifH1BsYyA$EvtkTi-~i&Lsp)s zzL8V{x*!7DAr>QhZwHcc^f=p2rK008OqO4%K_;dGqtZ2XJ}aoGI^Zxd-CUl&MSHQ? zuTwVV)!|#YXF8JGPurwY7^j?w`y?nxz+}62aJ1She;~6Or+-1Ifvj?CZpOa3>03*; zUiizU~Mn+)NPKPCtYWUYNIm&bg{ho$?*qr;?Da4~8cPflk%K5&$2 zmYpBT@#hQMG+zL)TOJLo03Or~O4;WlL^!#V(=MlxM^2Lu!Ur|lURtLVZ8^5W}8LA6vVK5c(qr;+ABD0`H^h8H=l|X_dl7nkmQSN0#qTQmw^+x02`$6 zw2$f6?X8x-c~m8HmN+aUo%m0GJqa>mR~1965iST$9#aZ@< zJtpoT{lK!RvwE}k!o5o-o{>SNL_1NjTwYM?7zLVE<{YU*P|}C_5umeqt90QX+^0xa z(IFN zA(aCx)B^RWHtEo6405r8AN=KevVu@V@>APd4x}9ex?^yMwb`=Id0= zW4LVX z7BH)>vaT3}*{<=z^uUz<=0(WMJ|WTy5=kNa*Kcj~xcn|OchAbf5b=h{fp!)`Ad4I* zvwxo1KAA{NoEf?>j0)G*vro??(;MNc%pgeTK6Ae``9RT_#698TQW5>)O=;tG@M5a$ z^yRP87Ud&MK6$Uf23CGWpB+~No87t1nyr**+!?2)1H4sh{_iNz);k^7jBAwRdH4QM zjMQ~oZ>?%e%7f<&-uO~S`WzK?%DIj-CmKa};hTe0X2QEBVffq~ z=QE@e;}7{d!z(5@kn(9K0{uRW7}H5?jaP+Gq-d#sw4;A|{4#q+%cd!RKyc3Z>XdL( z@Aif$s*YSL7?l}%40^=^jnO*)P*3;ZUjm=tB~oLj+5O$%4+YA_uTLhQG)}UhHdWbu zcZ=t&o5{_3XusAcdS~19;mi8N?Kn4@CzmT&_4e(W?@4qO_)Na}_*oCD-o>iLSU6AN zehWo>S$VQOBwWlhc15=Jtm~v2jM@E5-B zW<+O^uUWFz=1-pU_)S+^6hhgKWOr-k9h=S7S-|XD$l756J9AyWN(3)MP=kk+3Wvvp znx418ezcH9)7+0s3sW*X2Z=5zS)X7QX^!|l$OQLrMk!b$@@e@ z?d?$@#yT|$g%v}k^SJE9nb36FAoR0+OeVv<9>r$vzrxtfDr&7vKq?n%ke0Hi=Xp~# zw8rf9bLh*r!mW%?qjYh+;;5PfXipWhD|rxO$M!&;s+ypU4(6P-+5gjBrAVKihgkpl zpVZwU`T^b@R&+pwQEv=|>l>y8Jo?knkEnztZCIeI3uM2KA}cD4y^XLlRhs#o_U2<9 zT`Gu(Pn5kKC?FFFLs_j`RL3d4;;PUAk?aM6mf zRyKo9p_I#HMgak0SPVK+)fQq8Qd=Pg)?wJ;84m^PXm|JHrK0B4`0dy+e_)br@=>Al21V&K&Y)^XZ($w zkBSRAbOHb@kYAU3eW-FxfvjWy;tPThlgM>ksoZS!y-kT>;8UH~!dHRZ+>a7tj|7Q6 zrUpY6J{eyX#OkHZN5jZodC)^C0xGuJ??UL%T~h#JzgWO1E7V1*#cm-`!+2tI*y!%k zyGHbJ#bt;BcvM!M>uyeQ8>2-vTs1_+CK%mi4+%3fRCZwH z7ho#wh1W?``zm=^df^rRa8@cQ8%{>&2leYcg3FB1;n#``EbQ$1(36 ztzrf9L{N#)DPGK>4yW2iAa+NqZggC&tOWSLb)y;g3$1TCQ z)56t5(+4|qirMrV!5NACO3u_$Y?Y~%M@NTIq-+}~b^y{zk_DJL@y5nRlW{)HY7bJ| z0KHPUXZFMR&IacKaX#b+HT@Oq3a5m{tQw-utAv`O)9|`Opp^K%l%B-bav0sL2 zmzhuqaWl#k|4CzMSuqHawA?a4S+=Lgm?tel8``RA8r)|bA8qZ9aiD73*2+QuC6Bi%QA#L(%?$}#=?rbUH9SIJErEDMuKtT3ezU> z;r>Yya2LpE1Zivgh%i1GDnr9dEqT#Qa9?JfWNah|eTy9J?{XzrJyEf<0`>_K-=(iU ziVF|_Gc&laoe2o)7of2JuHjTD4{ z;MqK@#~~KJq&>TO#K&}r+{gAd@5V$ItS&rgJpAU~hDf!W0P+xKlhGxzH)N_(er&8I z4rl@wp`)X7Tj86lc+0$wi#ZPF&0FwEf69uiAQIT&P1i9isMJ0H{cLmjH@Hw&yVl z`#1gVuig)K?>u7j#E*MvVPJW8^C0z->l%rCMnHsE6wCnsPVQ3FdJuI$XCezF4FRq~ z8q8g`p_W<-iJG;Ft|>stJbkZ$dTV$eZ?rp^-&A1QYJ^z|xo%tM!oORefd?d|gD>Lu zHr!4ro_n*3lA>>U(?h#b{S!sG$C|>0nH`HV2kzQ&O`r$@Id>XyAyzzb@h>(S-_;`T7m9B}3+3U5u~Xz*>iH8WYX$^_pg<{GGb zYV;|95*5df13#WRyr+M&sPk|t{DPm1$B4_#^=48?h7pVCewCB-aEUV>8rMe6ag_-7 zp)Zw=29IOb%R}ggc;`OJa-K40JQK`nZB&Dh$IN@p_qi9~eHMTcZZx<)(asd58h3T` zfo~WEuk?6Vyr^JT;#@(nLpaBD;>S8CWwT_|-eqlMXNSlv!&p}R!Lchz+BXJQU7~Of zn{<^Gv)kGl!6|zt-;r>(8Vw|a%Ek*eEs>1oXldZGr53SmD$bInc1W7w|7=_ z>lW4YttMz}XFJPYs`S&z8p&(beJJ=c;=G=gA7pZuh;yYkqIuEnnx&AwbZnnozN6zv zY!mOEgxmh*g#l-!JTV-Xl)5nc8Gl=}B8+PovG+Z??n2w*W7R<8idnb2VY613byBRq zUstU*HwCwPYNF-7OeVBkkC;ac$%MiW5>0qbD1RJ!$7!!*i6F=9!0#uoECA=%eO|VA zS2Gd#|3nZl?T9i-$VME(yWt=(kUmGy|52ZIAZ&#n!>I6r-?hf%nXC?`uhe$#ZUU>V zK@}tJHD)2A&rg`ad8_uFcM61=bq6SMBH6V?oIXY=( z?k3}^lsOh9D*;4C^j(UmmPlk=d^DZ@N>ci44}mQ<+kn+za7eYvqu@)Vd+H|Rsp%Vg zdKdxBOo3{d>n;Td6ZvfLjxzg3h+hZ9D|sE5?GdIzg9L_No8BF_Y-~u8zLh3AvTqm1 zJz_WFUJ6|}+{0s!x?o;Gs{_0`f*i<$9ZD&xa7tD8_t!5anY9^4s$bGMbq-d1iHKai z>EC(8No3CXs(dNTs4vn3ptLZ@g>7}Qxr$;4y=slt)Y+|r-}e6ODq*edF++;0dqsSO{iSgg#jdp!+SZB8P&*Y7Xe2ja0A$d5Eq{}xlRDL*D4ossJA4jB#(@Q#Bqb-(6RwPSUg8E;MMCcVJ zY%4#>MdPXt3AA$Am&>@RECPPx8{7?t@X`5>P%6#djI(XdzC(0*5PdYCF2~dn5SuXpdZpRG=XmU?WqBr)r^1(X_QxVpz0N zYjse&D_g8Hy5XEU!yPeZiPho;4_}3fE{3+zZa81PN{eg5o}ChU%hc&RVR0vBg;%K@ z+#WhLL#8YDgfUMXd`Yi;ogiGGz6#X&fBsOmr?bTJDHXArc`}yu8-By1?NoUB-j8-yV+gG_ z57e=ghTCHpM9F!|zSP=z7ah4X*C2KemT6}73uRJtXP26oui8wvG6eA7fn!@hUX$Ea zZ;Nvr9n4M%OH<5l_SBr8+O)8kV`bT1XwqyfyQef4S>x)V2Qf5eF>AL?N=%VcC^~_I zZ|MqHE_c66EoI&^vVP*1gXje68fFFGA?&~*doRSQY zxFk&S&0i97IPbm^l>C&Y?Z(;a~K}L+YMgNyIVZc`taa+>poc}N<9;?Foc;@X30BY)EkhfO_jW& zPGa2hqYtP~URaWVZGuD?S!TZc+T=?(iZw94NU`*BTLctNg6j&|$n-5Y8OaJI(vjX| zS-#>husASlHc`>F(kAShdZtTX$=@Gn$GRT_2=+XJOP z3qg&Ov~wS*E^_nbKDAoszlomYI8u%9BJF`+??f)6Rn?S$8uG^6JM2$$@7k5~=f7xq zev-?-z&8n(`(eJ51!XWFW+%&9VQP=R?{D%5D;DGvUr)FWClC>XPllV!#+KSClr@MV zuCBCwg#Hyn{mu-waW{v>-iHsLr`5Yfh-Z};mf@WN@=&l)s%#O#Q z3FX{Tins%!cv6_CDseoIfLV`R_DTj&guknk~UOJH}#>ra<-Gj^$uM~V_1bB zSwgjZ`b87Ro-ub=vTaKXaa70$ogSn8?f5d&U5oNtSFg9|6r2STFT-!ApMS!z29LD_=K|||Qnu{%h&AT; zrhkG(?>FUW@fJm5I=QT7e}a7XYFe?DSPj%hNnqQz^kn{l3RD%-$)<2S_?6$S9ohJO zZunE0VlS_Z{&E>QriUO_i~KRdZEN(2wnOJOWPQg_9)XWTLt)d(+oM>o+1gp4H$GZ| z5o2gt+{#r9u`+CW{M1DF8ORiyqcKv^S5V?Ccmx!;3h_otQSq(R`(9307LTkccdAoA zi9xrU@MZ>9he{2NzXwF@69(?WAbxFg{&7rzc-7tix_*YN%5IM+H07Q=4reB+e{0Ba zO6jTaQ03g7L|+$h#3OCh3*|OEXr4rghB>Z%R(6hycHf$NTl>Yk|Ae}LK8)+RDW}R?E;RnR#LPt^i3(oI4g3Il#<2V*)s%QGtS{WoW}r zAa%}QJqeRGqVsufUID7aKKi}w3Ce;VeZ|4t{4mQWN;w9?=p|bQZ ztx^wpA)%M3q=F;{jd1_6%H2*>IRyl~=j%yHoUb_2-6`V58G`fP*ZHhCCR|mr{1jgII1Dy29P~rx_n19VFfOH zIc1cS_3iL}=YZDBn^5H@#>6f#Z7<*GEA7o_faJ-D=#fuz7Hu>S^EulvtwCx=0V4L} z;RVl}QNaDqvk4?VSZeN^_Yn)ry1Z~7k?pM-S`W8w}q@yV7Na=fu zww^lRa()DSOg#L0;atXprV>E@Afzw|VYRj;{1V*?ihsByVOAWF~a zOOL$g*?8_*g;}+HVyzD>_c>p%dJ7X`5cm(drw0YfpXL}vq&-RFqWaB8 zuk2Xh-_Imi9;tlf+}C%osaf~T9{=oKa>Vv{Ah9$V!$iq6ij>ul6JX#k;E`mE(Wb@+ z>;u$iJ|9QmI=Hc_YY*^G_0)Oz1w5?OKCl22bc!0k)@CLsfo_jXo-z8Z9Yib$q1cIW zv)d_!w*yI3w6){h2OzbZ;QDC)j(h3p-4=a)%-LT&zuaW#*2AhYFgxM8Y@g2_I^Mm< z4AZZ|k0Ua>0AH&g2{HMclWG%?^H%G}*$F<%grHlAwhf8Ro;|@g4oa-I=UMaJ>ukf< zAQi`NL&tW|j$kjf8U8Og__rX-O=7IgX|#+bhbzml7@S&Seu|$a4C`a8sO(IeHqJ*KvbUw$U;|1K6a+D>W@$d%>^SMo7$}@El28J0Ms&`8 zu(ggbuLbDPY>P`s zle=!ofdO>m6Smu%%^<`QF-9VWQJFE{&XpISo-2;dthCYXC^6sy7MNAG;{B;hm$=z_PM2FEbfZaEKnvVF`{c zv!7hI$&`uit7Qjf*tMf1HVnDB*=Whogdx&AzPHz~6Fs@miHR#(2EhcT`!7BIoR@$> zD%1%GqztojXZQmo&P_7p()ufQpt(dqq((OIkjS}wC;L(ICSzN$-7^a-tEUf~BsLi} zmHw58APmPgIzbTD^Dnqiq>Cb86c7P&ZXa)&=McF7+%FlTwDAnmQt6wA@04W2g1-r) zNCNf__T&{kyi_x7^x6FFBHW1lj2kKOqPd8ohqjSCayMOyhIpC77#eeNn!@pu6EL1=_Fu2#p5)O7^dJg zV9%W3bjD(T{tZeJB!S;wp!#CW{Il%Lp6ijz{)9i}Kt&xXj`o)_c%)UTofvzu$qwVQ zx_uTVR%Bti%g$ndj`oXt1YFl3eIOU_yl2B9fKNVotep-k;%9wX*nB8pJSjHw2JVXo z;@bps-kCF(C?7{NMk_~D+cs3*|6iYrz*7XSu}Bxpziyy z`w8}+4Nk&oP8?`Aka3)(shz&<)|~_{E|GU3?q_=4X56!G^CdS-3EnFQd2}((aXD!M3Q?wQB?*%yw8{Ev`XJTj4Kos z$pF6Uh(jV81uEQHho$a`kI9S8kb0T#4Jw)*+y(r2lpEc*HA4k-B9c2-hzpD8v{DEL zJEG!LGpJG_rl{}KTDNB|Z^Wu+^X?@8!Vbk~wd@4l+5U@UyrVR?LXE@UYmWAvU+}_arIr{IKZ*kA& zidMRBt&p9FTP!MoY+gAtm)7!Ex(;_Y6D=E*MMe^I@ zW{y(=&bA(CM^KALeGo&ld@=lS_Iya1_;*VofBcnbl@{IQ38SVK_=LcZkj|`7d$*%Z z+4!cYNhig6TctOcw5iJiR#-kT$~c(a-!gbQIN*+~gBE*z>(9mErvzIM&d>GN6aRfO z<|oz7IWn9QFH#}6s;cqSGFM?r3ZNn*TL9;A~nmte`w(2WW#Wm(M{)t8M9;48-*!dCIZVU}TEeqxI(G z9*j-6s8_;qfl#?X@}~i5%?r-e@lq;ubMgu7xqI52{=MMW9#db9FcmK(Ff_PEVrw!?xC{v08NN*I{1~o#I1GHiXyC2LfR@bWIWeVEaz-cP_3a4OqJ-IL5CFH9w{$e4!qSsBArqD(^+^DakdEa{t;DENQwDi2hvhO$Xe>d+ zVjdu5KOHc^taPIxwd#vgA1d zQ1N2*e)mquWiF{QSLY?J!~I}G7*43eWDC6ZLtWC-JS7H`j`)QJM*nw8j{|5Qd3_VX&_3^BQ^lsU&LfQN*+$pR`K{n;P2 zo<9VV8my=;8l02!@meEBtoy^ypQGPar3d2hfl^mMRU=HW7gKe#NP$FQT3*iS_8ZU4ylzEeNUn33j~G1#B_r z5JHmwFzu;MnD+4|m#_Y9*ZBVodr$M)8Wd%_P*4F;{Y%DwdgPMnt0@gw&vNZy%8uPF}?GihY3B!g^o&WRENiBs=NFwfZ%viI zdIfM#lYo`@F^o_8CiCMQY@jKb2F&L^V7sShTv0kD_yHy4$2xZosZe9LFn?V4oX6$+ z^KJH^Cw~U&A>GVelNOk3`!cruA-nMEuU1ElcLF zPm64M=g@tdo0A0ooumf!p|mEx)~;y7g!L!1hFVBJX(B zahBsmn9xtumCtG2t5B=qn&U;kh(EJIh>se=W|sEBcJo_{BRak(++p-=yx936y~CtYNjb@M#XhC9{Naj?jcYn{Hi=ciuSQjqJ=PBjFb;^?-ctov!ttV;b7x}w`&YY_UjB%J& zJi|8esfR&;1Ok@KmJUPs|Y%(r9r8uvNQqC!ui-HSnxKf0DeWKf`;cti3WA8I(&tYK`LWR7}c&nc~2d~ap5%v1_GocbM zAq6&NWxN!M6knC1abLPE=Ru3gi7z|$Pj}ttzbrY`;wN@x<#}9{`R5@c@#hphJu#zf zb{+btm8QlC?YJ(32}eG`gZ&xXst1Cmnab`z-}dXZ2)GcGfw;{4R}FrCCPhjpC0&_k zu1_jB?{Yk;|3JVQvsNT%lCM?wyP|OHmWE+|!2`&{22VWq%VD*rN)-B*3YtMcQkwj4 zE6#wFR9MK1bQJC{TGR0I)6?HR8`YdT5bze$e#}T^Z#eheIh25N*L?3m;Lwa*G^}>GbSZ7 zgnoDV@3;T+m{pONP+uK;^2uoY^VM@^@JR9W%J2R?_0`Y+aR9wFJlYHSQ!B#3Qcy~= zFnQSTGX5>>*B^RU38mTt%$ZJAq7SsK?^OZypZEUt3=J+eEcyWn2jt(k$5nxMw2Yq_ zru+Xs;++RNJdYw}66fEMDPsVgHLGqf{#VKWj40?VLeN?7U)jU|{rWW{XnEfI%%`X7 zd8(CAD@h^f0>1yHe~ZAvj)FoFN=;Y$|G#wt9ZEq5MQlIdDmvB9=R)8uXRXN-{zqqB zW`-iz@4apQLF#m{%8&cIF5W>{0`7F(6{f~#2VNgUFaSCZR=)X*9Rmp$a zMlUJ^%?;ts@%bN*_0xl9O!fDlnmE>H8xZ~9y~=+V@$W$V`a=#68^*z}+4X0DaumTk zx~p^lSGx{L2&Fa!P8IX|!O7f|NQ3@v;(z8Q0(3-_tUlGLkE_9~v4M~H|Bq%YYkebV X6x3GxP%g}W2K>OqABq) Date: Sat, 16 Nov 2024 16:26:27 -0500 Subject: [PATCH 031/262] Created Recommendations View --- .gitignore | 1 + README.md | 8 +- images/home_screen.png | Bin 0 -> 25166 bytes images/login_screen.png | Bin 0 -> 16125 bytes images/recommendations_screen.png | Bin 0 -> 26510 bytes images/refresh_arrow.jpg | Bin 0 -> 10121 bytes src/main/java/Constants.java | 2 + src/main/java/app/AppBuilder.java | 41 ++++----- src/main/java/app/Main.java | 1 - src/main/java/view/RecommendationsView.java | 87 +++++++++++++++++++- 10 files changed, 114 insertions(+), 26 deletions(-) create mode 100644 images/home_screen.png create mode 100644 images/login_screen.png create mode 100644 images/recommendations_screen.png create mode 100644 images/refresh_arrow.jpg diff --git a/.gitignore b/.gitignore index a9d2f780e..1c6964240 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ out/ .idea/easycode.ignore .idea/ homework-5.iml +keys.txt target/ diff --git a/README.md b/README.md index b440ab054..22a987011 100644 --- a/README.md +++ b/README.md @@ -35,4 +35,10 @@ suggestions. (Ethan) * John wants to find other individuals that have a similar music preference. (Ksenia) Below is a UI sketch that outlines what our project will look like. -![Project UI](images/CSC207%20Project%20Wireframe.png) \ No newline at end of file +![Project UI](images/CSC207%20Project%20Wireframe.png)
+### Login Screen
+![Login Screen](images/login_screen.png)
+### Home Screen
+![Home Screen](images/home_screen.png)
+### Recommendations Screen
+![Recommendations Screen](images/recommendations_screen.png)
\ No newline at end of file diff --git a/images/home_screen.png b/images/home_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..7e894946afe5a42967071d40ee2e2348d2bd02de GIT binary patch literal 25166 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 literal 0 HcmV?d00001 diff --git a/images/login_screen.png b/images/login_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..5c15cf353b97d0485a5824b245bdaf58fa12a324 GIT binary patch literal 16125 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%0A*ThNf5zIiqr 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 S1pu+a|AhltzWu|o{J#MI;kgL_ literal 0 HcmV?d00001 diff --git a/src/main/java/Constants.java b/src/main/java/Constants.java index 80e4df50b..d1252d553 100644 --- a/src/main/java/Constants.java +++ b/src/main/java/Constants.java @@ -11,5 +11,7 @@ public class Constants { private static final Dimension SCREEN_SIZE = Toolkit.getDefaultToolkit().getScreenSize(); public static final int APP_WIDTH = SCREEN_SIZE.width; public static final int APP_HEIGHT = SCREEN_SIZE.height; + public static final int MIN_HEIGHT = 400; + public static final int MIN_WIDTH = 400; } diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 783d792e4..62d27a0ff 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -15,14 +15,21 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; +import interface_adapter.recommend.RecommendController; +import interface_adapter.recommend.RecommendPresenter; +import interface_adapter.recommend.RecommendViewModel; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; import use_case.login.LoginOutputBoundary; import use_case.logout.LogoutInputBoundary; import use_case.logout.LogoutInteractor; import use_case.logout.LogoutOutputBoundary; +import use_case.recommend.RecommendInputBoundary; +import use_case.recommend.RecommendInteractor; +import use_case.recommend.RecommendOutputBoundary; import view.LoggedInView; import view.LoginView; +import view.RecommendationsView; import view.ViewManager; /** @@ -47,29 +54,17 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); -// Will remove since our project does not cover signing up, only logging in -// private SignupView signupView; -// private SignupViewModel signupViewModel; private LoginViewModel loginViewModel; private LoggedInViewModel loggedInViewModel; + private RecommendViewModel recommendViewModel; private LoggedInView loggedInView; private LoginView loginView; + private RecommendationsView recommendationsView; public AppBuilder() { cardPanel.setLayout(cardLayout); } - /** - * Adds the Signup View to the application. - * @return this builder - */ -// public AppBuilder addSignupView() { -// signupViewModel = new SignupViewModel(); -// signupView = new SignupView(signupViewModel); -// cardPanel.add(signupView, signupView.getViewName()); -// return this; -// } - /** * Adds the Login View to the application. * @return this builder @@ -123,19 +118,18 @@ public AppBuilder addLoginUseCase() { } /** - * Adds the Change Password Use Case to the application. + * Adds the Recommend Use Case to the application. * @return this builder */ -// public AppBuilder addChangePasswordUseCase() { -// final ChangePasswordOutputBoundary changePasswordOutputBoundary = -// new ChangePasswordPresenter(loggedInViewModel); +// public AppBuilder addRecommendUseCase() { +// final RecommendOutputBoundary recommendOutputBoundary = +// new RecommendPresenter(loggedInViewModel); // -// final ChangePasswordInputBoundary changePasswordInteractor = -// new ChangePasswordInteractor(userDataAccessObject, changePasswordOutputBoundary, userFactory); +// final RecommendInputBoundary recommendInteractor = +// new RecommendInteractor(userDataAccessObject, recommendOutputBoundary, userFactory); // -// final ChangePasswordController changePasswordController = -// new ChangePasswordController(changePasswordInteractor); -// loggedInView.setChangePasswordController(changePasswordController); +// final RecommendController recommendController = new RecommendController(recommendInteractor); +// recommendationsView.setRecommendController(recommendController); // return this; // } @@ -165,6 +159,7 @@ public JFrame build() { // Trying to set default size to app, but its not working // application.setSize(Constants.APP_WIDTH, Constants.APP_HEIGHT); +// application.setMinimumSize(new Dimension(Constants.MIN_WIDTH, MIN_HEIGHT)); application.add(cardPanel); diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 64c8dc0c3..9826c2fb9 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -16,7 +16,6 @@ public static void main(String[] args) { .addLoginView() .addLoggedInView() .addLoginUseCase() - .addLogoutUseCase() .build(); diff --git a/src/main/java/view/RecommendationsView.java b/src/main/java/view/RecommendationsView.java index 708421f5d..6a6914588 100644 --- a/src/main/java/view/RecommendationsView.java +++ b/src/main/java/view/RecommendationsView.java @@ -1,4 +1,89 @@ package view; -public class RecommendationsView { +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.*; + +import interface_adapter.recommend.RecommendController; +import interface_adapter.recommend.RecommendState; +import interface_adapter.recommend.RecommendViewModel; + +/** + * The View for when the user is logged into the program. + */ +public class RecommendationsView extends JPanel implements PropertyChangeListener { + + private final String viewName = "logged in"; + private final RecommendViewModel recommendViewModel; + private RecommendController recommendController; + + private final JLabel description; + private final JPanel songsPanel; + private final JButton homeButton; + + public RecommendationsView(RecommendViewModel recommendViewModel) { + this.recommendViewModel = recommendViewModel; + this.recommendViewModel.addPropertyChangeListener(this); + + final JLabel title = new JLabel("Recommendations"); + description = new JLabel("Because you've listened to " + getArtist() + + ", here are some songs you might like:"); + homeButton = new JButton("Home"); + + songsPanel = new JPanel(); + final ImageIcon refreshImg = new ImageIcon(getClass().getResource("/images/refresh.png")); + final JButton refreshButton = new JButton(); + refreshButton.setIcon(refreshImg); + final JTextArea songsTextArea = new JTextArea(10, 20); + songsTextArea.setText("TO DO: Get songs to show here"); + final JScrollPane songsScrollPane = new JScrollPane(songsTextArea); + songsPanel.add(songsScrollPane); + songsPanel.add(refreshButton); + + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + +// changePassword.addActionListener( +// // This creates an anonymous subclass of ActionListener and instantiates it. +// evt -> { +// if (evt.getSource().equals(changePassword)) { +// final LoggedInState currentState = loggedInViewModel.getState(); +// +// this.changePasswordController.execute( +// currentState.getUsername(), +// currentState.getPassword() +// ); +// } +// } +// ); + final JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.add(title); + panel.add(description); + panel.add(songsPanel); + panel.add(homeButton); + + this.add(panel, BorderLayout.CENTER); + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals("state")) { + final RecommendState state = (RecommendState) evt.getNewValue(); +// username.setText(state.getUsername()); + } + } + + public String getViewName() { + return viewName; + } + + public void setRecommendController(RecommendController recommendController) { + this.recommendController = recommendController; + } + + public String getArtist() { + return "Slipkot"; + } } From 77b7e9d66e45d9fd7afe26ff11be21b1d2c33a68 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Sat, 16 Nov 2024 20:31:24 -0500 Subject: [PATCH 032/262] Completed the fundamentals for the UI portion of the Top Track and Top Artist charts. Also made the base for the use case, interface, and etx. --- pom.xml | 6 ++ src/main/java/app/AppBuilder.java | 37 +++++++- src/main/java/app/Main.java | 2 +- .../data_access/DBUserDataAccessObject.java | 4 +- .../data_access/FileUserDataAccessObject.java | 6 +- .../InMemoryUserDataAccessObject.java | 6 +- .../top_tracks/TopTracksController.java | 10 +++ .../top_tracks/TopTracksPresenter.java | 6 ++ .../top_tracks/TopTracksState.java | 34 +++++++ .../top_tracks/TopTracksViewModel.java | 11 ++- .../top_tracks/TopTracksInputBoundary.java | 9 ++ .../top_tracks/TopTracksInputData.java | 21 +++++ .../top_tracks/TopTracksInteractor.java | 2 +- .../top_tracks/TopTracksOutputBoundary.java | 15 ++++ .../top_tracks/TopTracksOutputData.java | 21 +++++ .../TopTracksUserDataAccessInterface.java | 31 +++++++ src/main/java/view/LoggedInView.java | 10 +++ .../java/view/TopTracksAndArtistsView.java | 90 +++++++++++++++++++ 18 files changed, 309 insertions(+), 12 deletions(-) create mode 100644 src/main/java/view/TopTracksAndArtistsView.java diff --git a/pom.xml b/pom.xml index 7d631a498..d55d59588 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,12 @@ 1.0.0-beta.12 + + org.jfree + jfreechart + 1.5.4 + + diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 783d792e4..cf74d3515 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -15,14 +15,20 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; +import interface_adapter.top_tracks.TopTracksPresenter; +import interface_adapter.top_tracks.TopTracksViewModel; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; import use_case.login.LoginOutputBoundary; import use_case.logout.LogoutInputBoundary; import use_case.logout.LogoutInteractor; import use_case.logout.LogoutOutputBoundary; +import use_case.top_tracks.TopTracksInputBoundary; +import use_case.top_tracks.TopTracksInteractor; +import use_case.top_tracks.TopTracksOutputBoundary; import view.LoggedInView; import view.LoginView; +import view.TopTracksAndArtistsView; import view.ViewManager; /** @@ -52,8 +58,11 @@ public class AppBuilder { // private SignupViewModel signupViewModel; private LoginViewModel loginViewModel; private LoggedInViewModel loggedInViewModel; + private TopTracksViewModel topTracksAndArtistsViewModel; + private LoggedInView loggedInView; private LoginView loginView; + private TopTracksAndArtistsView topTracksAndArtistsView; public AppBuilder() { cardPanel.setLayout(cardLayout); @@ -92,6 +101,17 @@ public AppBuilder addLoggedInView() { return this; } + /** + * Adds the Top Tracks and Artists View to the application. + * @return this builder + */ + public AppBuilder addTopTracksAndArtistsView() { + topTracksAndArtistsViewModel = new TopTracksViewModel(); + topTracksAndArtistsView = new TopTracksAndArtistsView(topTracksAndArtistsViewModel); + cardPanel.add(topTracksAndArtistsView, topTracksAndArtistsView.getViewName()); + return this; + } + /** * Adds the Signup Use Case to the application. * @return this builder @@ -122,6 +142,21 @@ public AppBuilder addLoginUseCase() { return this; } + /** + * Adds the Login Use Case to the application. + * @return this builder + */ + /* public AppBuilder addTopTracksandArtistsUseCase() { + final TopTracksOutputBoundary topTracksOutputBoundary = new TopTracksPresenter(viewManagerModel, + topTracksAndArtistsViewModel, topTracksAndArtistsView); + final TopTracksInputBoundary loginInteractor = new TopTracksInteractor( + userDataAccessObject, topTracksOutputBoundary); + + final LoginController loginController = new LoginController(loginInteractor); + loginView.setLoginController(loginController); + return this; + } */ + /** * Adds the Change Password Use Case to the application. * @return this builder @@ -168,7 +203,7 @@ public JFrame build() { application.add(cardPanel); - viewManagerModel.setState(loggedInView.getViewName()); + viewManagerModel.setState(topTracksAndArtistsViewModel.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 64c8dc0c3..3b5940169 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -15,8 +15,8 @@ public static void main(String[] args) { final JFrame application = appBuilder .addLoginView() .addLoggedInView() + .addTopTracksAndArtistsView() .addLoginUseCase() - .addLogoutUseCase() .build(); diff --git a/src/main/java/data_access/DBUserDataAccessObject.java b/src/main/java/data_access/DBUserDataAccessObject.java index e75df88b7..ff5262a29 100644 --- a/src/main/java/data_access/DBUserDataAccessObject.java +++ b/src/main/java/data_access/DBUserDataAccessObject.java @@ -15,12 +15,12 @@ // import use_case.change_password.ChangePasswordUserDataAccessInterface; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; -import use_case.signup.SignupUserDataAccessInterface; +// import use_case.signup.SignupUserDataAccessInterface; /** * The DAO for user data. */ -public class DBUserDataAccessObject implements SignupUserDataAccessInterface, +public class DBUserDataAccessObject implements LoginUserDataAccessInterface, LogoutUserDataAccessInterface { private static final int SUCCESS_CODE = 200; private static final String CONTENT_TYPE_LABEL = "Content-Type"; diff --git a/src/main/java/data_access/FileUserDataAccessObject.java b/src/main/java/data_access/FileUserDataAccessObject.java index 5cf6ef9f8..25fc34e07 100644 --- a/src/main/java/data_access/FileUserDataAccessObject.java +++ b/src/main/java/data_access/FileUserDataAccessObject.java @@ -12,14 +12,14 @@ import entity.User; import entity.UserFactory; -import use_case.change_password.ChangePasswordUserDataAccessInterface; +// import use_case.change_password.ChangePasswordUserDataAccessInterface; import use_case.login.LoginUserDataAccessInterface; -import use_case.signup.SignupUserDataAccessInterface; +// import use_case.signup.SignupUserDataAccessInterface; /** * DAO for user data implemented using a File to persist the data. */ -public class FileUserDataAccessObject implements SignupUserDataAccessInterface, +public class FileUserDataAccessObject implements LoginUserDataAccessInterface { private static final String HEADER = "accessToken"; diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index ac285829c..c9e974c10 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -26,7 +26,7 @@ public boolean existsByName(String identifier) { @Override public void save(User user) { - users.put(user.getName(), user); + users.put(user.getAccessToken(), user); } @Override @@ -35,12 +35,12 @@ public User get(String username) { } @Override - public void setCurrentUsername(String name) { + public void setCurrentAccessToken(String name) { this.currentUsername = name; } @Override - public String getCurrentUsername() { + public String getCurrentAccessToken() { return this.currentUsername; } } diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksController.java b/src/main/java/interface_adapter/top_tracks/TopTracksController.java index 5718f9288..02625f48f 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksController.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksController.java @@ -1,4 +1,14 @@ package interface_adapter.top_tracks; +import use_case.top_tracks.TopTracksInputBoundary; + +/** + * The controller for the TopTracks and Artists Use Case. + */ public class TopTracksController { + private TopTracksInputBoundary topTracksInputBoundary; + + public TopTracksController(TopTracksInputBoundary topTracksInputBoundary) { + this.topTracksInputBoundary = topTracksInputBoundary; + } } diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java b/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java index df1560d8f..80a7d2e64 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java @@ -1,4 +1,10 @@ package interface_adapter.top_tracks; +import use_case.top_tracks.TopTracksOutputBoundary; + +/** + * The Presenter for the Top Tracks Use Case. + */ public class TopTracksPresenter { + } diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksState.java b/src/main/java/interface_adapter/top_tracks/TopTracksState.java index 126d15e82..2403c590f 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksState.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksState.java @@ -1,4 +1,38 @@ package interface_adapter.top_tracks; +import java.util.ArrayList; +import java.util.List; + +/** + * The state for the Top Tracks View Model. + */ public class TopTracksState { + private List tracks = new ArrayList<>(); + private List tracksError; + + public TopTracksState(TopTracksState copy) { + tracks = copy.tracks; + tracksError = copy.tracksError; + } + + // Because of the previous copy constructor, the default constructor must be explicit. + public TopTracksState() { + + } + + public List getTracks() { + return tracks; + } + + public List getTracksError() { + return tracksError; + } + + public void setTracks(List tracks) { + this.tracks = tracks; + } + + public void setTracksError(List tracksError) { + this.tracksError = tracksError; + } } diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java b/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java index fc66ec32a..e08360571 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java @@ -1,4 +1,13 @@ package interface_adapter.top_tracks; -public class TopTracksViewModel{ +import interface_adapter.ViewModel; + +/** + * The View Model for the Top Tracks View. + */ +public class TopTracksViewModel extends ViewModel { + public TopTracksViewModel() { + super("Top Tracks"); + setState(new TopTracksState()); + } } diff --git a/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java b/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java index 57c3c4a4f..f383dde92 100644 --- a/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java +++ b/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java @@ -1,4 +1,13 @@ package use_case.top_tracks; +/** + * Input Boundary for actions which are related to Top Tracks Charts in. + */ public interface TopTracksInputBoundary { + + /** + * Executes the Logout use case. + * @param topTracksInputData the input data + */ + void execute(TopTracksInputData topTracksInputData); } diff --git a/src/main/java/use_case/top_tracks/TopTracksInputData.java b/src/main/java/use_case/top_tracks/TopTracksInputData.java index 6beef15dc..419d04c35 100644 --- a/src/main/java/use_case/top_tracks/TopTracksInputData.java +++ b/src/main/java/use_case/top_tracks/TopTracksInputData.java @@ -1,4 +1,25 @@ package use_case.top_tracks; +import java.util.List; + +/** + * The Input Data for the Top Tracks Use Case. + */ public class TopTracksInputData { + + private final List tracks; + private final List time; + + public TopTracksInputData(List tracks, List time) { + this.tracks = tracks; + this.time = time; + } + + List getTracks() { + return tracks; + } + + List getTime() { + return time; + } } diff --git a/src/main/java/use_case/top_tracks/TopTracksInteractor.java b/src/main/java/use_case/top_tracks/TopTracksInteractor.java index a51964dcf..6c890a46d 100644 --- a/src/main/java/use_case/top_tracks/TopTracksInteractor.java +++ b/src/main/java/use_case/top_tracks/TopTracksInteractor.java @@ -1,4 +1,4 @@ package use_case.top_tracks; -public class TopTracksInteractor implements TopTracksInputBoundary{ +public class TopTracksInteractor{ } diff --git a/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java b/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java index 60030f7c4..eab4d81f1 100644 --- a/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java +++ b/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java @@ -1,4 +1,19 @@ package use_case.top_tracks; +/** + * The output boundary for the Top Tracks Use Case. + */ public interface TopTracksOutputBoundary { + + /** + * Prepares the success view for the Login Use Case. + * @param outputData the output data + */ + void prepareSuccessView(TopTracksOutputData outputData); + + /** + * Prepares the failure view for the Login Use Case. + * @param errorMessage the explanation of the failure + */ + void prepareFailView(String errorMessage); } diff --git a/src/main/java/use_case/top_tracks/TopTracksOutputData.java b/src/main/java/use_case/top_tracks/TopTracksOutputData.java index aef86036d..1bb61cf0b 100644 --- a/src/main/java/use_case/top_tracks/TopTracksOutputData.java +++ b/src/main/java/use_case/top_tracks/TopTracksOutputData.java @@ -1,4 +1,25 @@ package use_case.top_tracks; +import java.util.List; + public class TopTracksOutputData { + + private final List tracks; + private final List time; + private final boolean useCaseFailed; + + public TopTracksOutputData(List tracks, List time, boolean useCaseFailed) { + this.tracks = tracks; + this.time = time; + this.useCaseFailed = useCaseFailed; + } + + public List getTracks() { + return tracks; + } + + public List getTime() { + return time; + } + } diff --git a/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java b/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java index ca8a163cf..ee3263391 100644 --- a/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java +++ b/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java @@ -1,4 +1,35 @@ package use_case.top_tracks; +import java.util.List; + +/** + * DAO for the Top Tracks Use Case. + */ public interface TopTracksUserDataAccessInterface { + + /** + * Returns the top track List of the current user of the application. + * @return the access Token of the current user; null indicates that no one is logged into the application. + */ + List getCurrentTopTracks(); + + /** + * Sets the top tracks list indicating who is the current user of the application. + * @param tracks the new top track list; null to indicate that no one is currently logged into the + * application. + */ + void setCurrentTopTracks(List tracks); + + /** + * Returns the top track List of the current user of the application. + * @return the access Token of the current user; null indicates that no one is logged into the application. + */ + List getCurrentTime(); + + /** + * Sets the top tracks list indicating who is the current user of the application. + * @param time the new top track list; null to indicate that no one is currently logged into the + * application. + */ + void setCurrentTime(List time); } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 8bdc91f44..c785355b3 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -13,6 +13,7 @@ import interface_adapter.change_password.LoggedInState; import interface_adapter.change_password.LoggedInViewModel; import interface_adapter.logout.LogoutController; +import interface_adapter.top_tracks.TopTracksController; /** * The View for when the user is logged into the program. @@ -22,6 +23,7 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private final String viewName = "logged in"; private final LoggedInViewModel loggedInViewModel; private LogoutController logoutController; + // private TopTracksController topTracksController; private final JLabel username; private final JButton logOut; @@ -108,6 +110,14 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { } ); + topTracks.addActionListener( + evt -> { + if (evt.getSource().equals(topTracks)) { + // final String name = topTracksController + } + } + ); + this.add(title); this.add(usernameInfo); this.add(username); diff --git a/src/main/java/view/TopTracksAndArtistsView.java b/src/main/java/view/TopTracksAndArtistsView.java new file mode 100644 index 000000000..9f4873496 --- /dev/null +++ b/src/main/java/view/TopTracksAndArtistsView.java @@ -0,0 +1,90 @@ +package view; + +import javax.swing.*; + +import interface_adapter.top_tracks.TopTracksViewModel; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.data.category.DefaultCategoryDataset; +import org.jfree.data.general.DefaultPieDataset; + +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * The View for when the user is opens TopTracks Menu. + */ +public class TopTracksAndArtistsView extends JPanel implements PropertyChangeListener { + private final TopTracksViewModel topTracksViewModel; + + private final String viewName = "Top Tracks"; + private final String topTracks = "Top Tracks"; + + private final JLabel welcomeLabel; + private final JButton goBack; + + DefaultPieDataset dataset1 = new DefaultPieDataset<>(); + DefaultCategoryDataset dataset2 = new DefaultCategoryDataset(); + + public TopTracksAndArtistsView(TopTracksViewModel topTracksViewModel) { + this.topTracksViewModel = topTracksViewModel; + this.topTracksViewModel.addPropertyChangeListener(this); + + welcomeLabel = new JLabel("Welcome"); + welcomeLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + + goBack = new JButton("go back"); + goBack.setAlignmentX(Component.CENTER_ALIGNMENT); + + dataset1.setValue("Artist 1", 200); + dataset1.setValue("Artist 2", 150); + dataset1.setValue("Artist 3", 180); + + dataset2.addValue(300, "Track 1", "1'st"); + dataset2.addValue(250, "Track 2", "2'nd"); + dataset2.addValue(200, "Track 3", "3'rd"); + dataset2.addValue(150, "Track 4", "4'th"); + dataset2.addValue(100, "Track 5", "5'th"); + + final JFreeChart chart = ChartFactory.createPieChart( + "Top Artists", dataset1, true, true, false); + + final JFreeChart chart2 = ChartFactory.createBarChart( + "Top Tracks", "Month", "Track Ranks", dataset2); + + final ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setPreferredSize(new Dimension(300,300)); + + final ChartPanel chartPanel1 = new ChartPanel(chart2); + chartPanel1.setPreferredSize(new Dimension(300, 300)); + + final JPanel chartLayoutPanel = new JPanel(new FlowLayout()); + chartLayoutPanel.add(chartPanel); + chartLayoutPanel.add(chartPanel1); + + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + this.add(welcomeLabel); + this.add(chartLayoutPanel); + this.add(goBack); + + } + + public String getViewName() { + return viewName; + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + /* if (evt.getPropertyName().equals("state")) { + final LoggedInState state = (LoggedInState) evt.getNewValue(); + username.setText(state.getUsername()); + } + else if (evt.getPropertyName().equals("password")) { + final LoggedInState state = (LoggedInState) evt.getNewValue(); + JOptionPane.showMessageDialog(null, "password updated for " + state.getUsername()); + } */ + } +} From 26cdb67af603841ec40331fa409d1dde47d56157 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sun, 17 Nov 2024 08:40:47 -0500 Subject: [PATCH 033/262] Create Keyword in view file --- src/main/java/view/Keyword | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/view/Keyword diff --git a/src/main/java/view/Keyword b/src/main/java/view/Keyword new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/src/main/java/view/Keyword @@ -0,0 +1 @@ + From 114191719194b2b2fbaf276a849a3f4d06f60981 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sun, 17 Nov 2024 08:49:32 -0500 Subject: [PATCH 034/262] Update Keyword --- src/main/java/view/Keyword | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/view/Keyword b/src/main/java/view/Keyword index 8b1378917..9c4c68d47 100644 --- a/src/main/java/view/Keyword +++ b/src/main/java/view/Keyword @@ -1 +1,5 @@ +package view; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; From ae4796178c93577a707825019f1005e2a35514e0 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sun, 17 Nov 2024 09:04:34 -0500 Subject: [PATCH 035/262] Update and rename Keyword to Keyword.java --- src/main/java/view/Keyword | 5 -- src/main/java/view/Keyword.java | 86 +++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 5 deletions(-) delete mode 100644 src/main/java/view/Keyword create mode 100644 src/main/java/view/Keyword.java diff --git a/src/main/java/view/Keyword b/src/main/java/view/Keyword deleted file mode 100644 index 9c4c68d47..000000000 --- a/src/main/java/view/Keyword +++ /dev/null @@ -1,5 +0,0 @@ -package view; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; diff --git a/src/main/java/view/Keyword.java b/src/main/java/view/Keyword.java new file mode 100644 index 000000000..83b5d194b --- /dev/null +++ b/src/main/java/view/Keyword.java @@ -0,0 +1,86 @@ +import javax.swing.*; +import java.awt.*; + +public class SpotifyCompanionUI { + public static void main(String[] args) { + // Create the main frame + JFrame frame = new JFrame("CSC207 Project: Spotify Companion"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(600, 450); + frame.setLayout(null); // Absolute layout for positioning + + // Title label + JLabel titleLabel = new JLabel("CSC207 Project: Spotify Companion", SwingConstants.LEFT); + titleLabel.setBounds(10, 10, 400, 30); + titleLabel.setFont(new Font("Arial", Font.BOLD, 14)); + frame.add(titleLabel); + + // Profile icon (placeholder circle) + JLabel profileIcon = new JLabel("👤", SwingConstants.CENTER); + profileIcon.setBounds(20, 50, 50, 50); + frame.add(profileIcon); + + // Input fields and labels + JLabel artistLabel = new JLabel("Artist Name:"); + artistLabel.setBounds(80, 50, 100, 30); + frame.add(artistLabel); + + JTextField artistField = new JTextField(); + artistField.setBounds(180, 50, 250, 30); + frame.add(artistField); + + JLabel lyricsLabel = new JLabel("Lyrics:"); + lyricsLabel.setBounds(80, 90, 100, 30); + frame.add(lyricsLabel); + + JTextField lyricsField = new JTextField(); + lyricsField.setBounds(180, 90, 250, 30); + frame.add(lyricsField); + + JLabel keywordLabel = new JLabel("Keyword:"); + keywordLabel.setBounds(80, 130, 100, 30); + frame.add(keywordLabel); + + JTextField keywordField = new JTextField(); + keywordField.setBounds(180, 130, 250, 30); + frame.add(keywordField); + + // Search button (magnifying glass icon placeholder) + JButton searchButton = new JButton("🔍"); + searchButton.setBounds(440, 50, 50, 110); + frame.add(searchButton); + + // Divider line + JSeparator separator = new JSeparator(); + separator.setBounds(20, 180, 560, 10); + frame.add(separator); + + // Songs list area + JTextArea songsListArea = new JTextArea("Song1\nSong2\n..."); + songsListArea.setBounds(50, 200, 500, 150); + songsListArea.setEditable(false); + songsListArea.setBackground(Color.LIGHT_GRAY); + frame.add(songsListArea); + + // Bottom buttons + JButton homeButton = new JButton("Home"); + homeButton.setBounds(50, 370, 80, 30); + homeButton.setBorder(BorderFactory.createDashedBorder(Color.BLACK)); + frame.add(homeButton); + + JButton forYouButton = new JButton("For You"); + forYouButton.setBounds(160, 370, 80, 30); + frame.add(forYouButton); + + JButton topTracksButton = new JButton("Top Tracks"); + topTracksButton.setBounds(270, 370, 100, 30); + frame.add(topTracksButton); + + JButton findListenersButton = new JButton("Find Similar Listeners"); + findListenersButton.setBounds(400, 370, 150, 30); + frame.add(findListenersButton); + + // Set frame visibility + frame.setVisible(true); + } +} From c394ccda5f6f68148762e013f9c35da108291bf2 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sun, 17 Nov 2024 10:09:53 -0500 Subject: [PATCH 036/262] Update Keyword.java --- src/main/java/view/Keyword.java | 90 ++++++++++++++------------------- 1 file changed, 37 insertions(+), 53 deletions(-) diff --git a/src/main/java/view/Keyword.java b/src/main/java/view/Keyword.java index 83b5d194b..b11fc63fe 100644 --- a/src/main/java/view/Keyword.java +++ b/src/main/java/view/Keyword.java @@ -1,86 +1,70 @@ import javax.swing.*; import java.awt.*; -public class SpotifyCompanionUI { +public class Keyword { public static void main(String[] args) { // Create the main frame JFrame frame = new JFrame("CSC207 Project: Spotify Companion"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(600, 450); - frame.setLayout(null); // Absolute layout for positioning + frame.setSize(800, 500); // Increased size for better layout + frame.setLayout(null); - // Title label - JLabel titleLabel = new JLabel("CSC207 Project: Spotify Companion", SwingConstants.LEFT); - titleLabel.setBounds(10, 10, 400, 30); - titleLabel.setFont(new Font("Arial", Font.BOLD, 14)); - frame.add(titleLabel); + // Create a panel for the profile icon + JPanel profilePanel = new JPanel(); + profilePanel.setBounds(20, 20, 60, 60); + JLabel profileIcon = new JLabel(new ImageIcon(new ImageIcon("path/to/profile/icon.png").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH))); + profilePanel.add(profileIcon); + frame.add(profilePanel); - // Profile icon (placeholder circle) - JLabel profileIcon = new JLabel("👤", SwingConstants.CENTER); - profileIcon.setBounds(20, 50, 50, 50); - frame.add(profileIcon); - - // Input fields and labels + // Artist and Keyword Labels and Text Fields JLabel artistLabel = new JLabel("Artist Name:"); - artistLabel.setBounds(80, 50, 100, 30); + artistLabel.setBounds(100, 30, 100, 20); frame.add(artistLabel); JTextField artistField = new JTextField(); - artistField.setBounds(180, 50, 250, 30); + artistField.setBounds(200, 30, 400, 20); // Adjusted width for better fit frame.add(artistField); - JLabel lyricsLabel = new JLabel("Lyrics:"); - lyricsLabel.setBounds(80, 90, 100, 30); - frame.add(lyricsLabel); - - JTextField lyricsField = new JTextField(); - lyricsField.setBounds(180, 90, 250, 30); - frame.add(lyricsField); - JLabel keywordLabel = new JLabel("Keyword:"); - keywordLabel.setBounds(80, 130, 100, 30); + keywordLabel.setBounds(100, 70, 100, 20); // Adjusted positioning frame.add(keywordLabel); JTextField keywordField = new JTextField(); - keywordField.setBounds(180, 130, 250, 30); + keywordField.setBounds(200, 70, 400, 20); // Adjusted width for better fit frame.add(keywordField); - // Search button (magnifying glass icon placeholder) - JButton searchButton = new JButton("🔍"); - searchButton.setBounds(440, 50, 50, 110); + // Search Button + JButton searchButton = new JButton("Search"); + searchButton.setBounds(620, 30, 100, 40); // Adjusted positioning frame.add(searchButton); - // Divider line - JSeparator separator = new JSeparator(); - separator.setBounds(20, 180, 560, 10); - frame.add(separator); + // Results Area + JTextArea resultsArea = new JTextArea("Song1\nSong2\n..."); + resultsArea.setBounds(100, 110, 600, 200); // Adjusted height for better fit + resultsArea.setEditable(false); + frame.add(resultsArea); - // Songs list area - JTextArea songsListArea = new JTextArea("Song1\nSong2\n..."); - songsListArea.setBounds(50, 200, 500, 150); - songsListArea.setEditable(false); - songsListArea.setBackground(Color.LIGHT_GRAY); - frame.add(songsListArea); + // Create a panel to center the bottom buttons + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 0)); // 20px horizontal gap between buttons + buttonPanel.setBounds(100, 370, 600, 50); // Adjusted positioning and size - // Bottom buttons + // Home, For You, Top Tracks, and Find Similar Listeners Buttons JButton homeButton = new JButton("Home"); - homeButton.setBounds(50, 370, 80, 30); - homeButton.setBorder(BorderFactory.createDashedBorder(Color.BLACK)); - frame.add(homeButton); - JButton forYouButton = new JButton("For You"); - forYouButton.setBounds(160, 370, 80, 30); - frame.add(forYouButton); - JButton topTracksButton = new JButton("Top Tracks"); - topTracksButton.setBounds(270, 370, 100, 30); - frame.add(topTracksButton); - JButton findListenersButton = new JButton("Find Similar Listeners"); - findListenersButton.setBounds(400, 370, 150, 30); - frame.add(findListenersButton); - // Set frame visibility + // Add buttons to the panel + buttonPanel.add(homeButton); + buttonPanel.add(forYouButton); + buttonPanel.add(topTracksButton); + buttonPanel.add(findListenersButton); + + // Add the button panel to the frame + frame.add(buttonPanel); + + // Set frame visible frame.setVisible(true); } } From 3f7f1dfaff14e4766fa8a3e0f7778ccefb28feab Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sun, 17 Nov 2024 10:13:45 -0500 Subject: [PATCH 037/262] added "package view" statement --- src/main/java/view/Keyword.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/view/Keyword.java b/src/main/java/view/Keyword.java index b11fc63fe..9951dcbbd 100644 --- a/src/main/java/view/Keyword.java +++ b/src/main/java/view/Keyword.java @@ -1,3 +1,5 @@ +package view; + import javax.swing.*; import java.awt.*; From 6487f48933fad7248563363f29c86eac2e0a6b3b Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sun, 17 Nov 2024 10:18:32 -0500 Subject: [PATCH 038/262] Update Keyword.java --- src/main/java/view/Keyword.java | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/main/java/view/Keyword.java b/src/main/java/view/Keyword.java index 9951dcbbd..61d264877 100644 --- a/src/main/java/view/Keyword.java +++ b/src/main/java/view/Keyword.java @@ -5,68 +5,58 @@ public class Keyword { public static void main(String[] args) { - // Create the main frame JFrame frame = new JFrame("CSC207 Project: Spotify Companion"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(800, 500); // Increased size for better layout + frame.setSize(800, 500); frame.setLayout(null); - // Create a panel for the profile icon JPanel profilePanel = new JPanel(); profilePanel.setBounds(20, 20, 60, 60); JLabel profileIcon = new JLabel(new ImageIcon(new ImageIcon("path/to/profile/icon.png").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH))); profilePanel.add(profileIcon); frame.add(profilePanel); - // Artist and Keyword Labels and Text Fields JLabel artistLabel = new JLabel("Artist Name:"); artistLabel.setBounds(100, 30, 100, 20); frame.add(artistLabel); JTextField artistField = new JTextField(); - artistField.setBounds(200, 30, 400, 20); // Adjusted width for better fit + artistField.setBounds(200, 30, 400, 20); frame.add(artistField); JLabel keywordLabel = new JLabel("Keyword:"); - keywordLabel.setBounds(100, 70, 100, 20); // Adjusted positioning + keywordLabel.setBounds(100, 70, 100, 20); frame.add(keywordLabel); JTextField keywordField = new JTextField(); - keywordField.setBounds(200, 70, 400, 20); // Adjusted width for better fit + keywordField.setBounds(200, 70, 400, 20); frame.add(keywordField); - // Search Button JButton searchButton = new JButton("Search"); - searchButton.setBounds(620, 30, 100, 40); // Adjusted positioning + searchButton.setBounds(620, 30, 100, 40); frame.add(searchButton); - // Results Area JTextArea resultsArea = new JTextArea("Song1\nSong2\n..."); - resultsArea.setBounds(100, 110, 600, 200); // Adjusted height for better fit + resultsArea.setBounds(100, 110, 600, 200); resultsArea.setEditable(false); frame.add(resultsArea); - // Create a panel to center the bottom buttons JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 0)); // 20px horizontal gap between buttons - buttonPanel.setBounds(100, 370, 600, 50); // Adjusted positioning and size + buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 0)); + buttonPanel.setBounds(100, 370, 600, 50); - // Home, For You, Top Tracks, and Find Similar Listeners Buttons JButton homeButton = new JButton("Home"); JButton forYouButton = new JButton("For You"); JButton topTracksButton = new JButton("Top Tracks"); JButton findListenersButton = new JButton("Find Similar Listeners"); - // Add buttons to the panel buttonPanel.add(homeButton); buttonPanel.add(forYouButton); buttonPanel.add(topTracksButton); buttonPanel.add(findListenersButton); - // Add the button panel to the frame frame.add(buttonPanel); - // Set frame visible frame.setVisible(true); } } From c4201844f9272d5834d907cd7f44540c42d621e8 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sun, 17 Nov 2024 10:32:47 -0500 Subject: [PATCH 039/262] Update Keyword.java --- src/main/java/view/Keyword.java | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/main/java/view/Keyword.java b/src/main/java/view/Keyword.java index 61d264877..8b29df507 100644 --- a/src/main/java/view/Keyword.java +++ b/src/main/java/view/Keyword.java @@ -41,21 +41,9 @@ public static void main(String[] args) { resultsArea.setEditable(false); frame.add(resultsArea); - JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 0)); - buttonPanel.setBounds(100, 370, 600, 50); - - JButton homeButton = new JButton("Home"); - JButton forYouButton = new JButton("For You"); - JButton topTracksButton = new JButton("Top Tracks"); - JButton findListenersButton = new JButton("Find Similar Listeners"); - - buttonPanel.add(homeButton); - buttonPanel.add(forYouButton); - buttonPanel.add(topTracksButton); - buttonPanel.add(findListenersButton); - - frame.add(buttonPanel); + JButton goBackButton = new JButton("Go Back"); + goBackButton.setBounds(350, 370, 100, 40); + frame.add(goBackButton); frame.setVisible(true); } From 1ecc3098761457cb254587b75413405eebdd7db4 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sun, 17 Nov 2024 10:58:12 -0500 Subject: [PATCH 040/262] Started working on interactor --- .../recommend/RecommendInteractor.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index f2da745d4..d7a142061 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -1,4 +1,32 @@ package use_case.recommend; -public class RecommendInteractor implements RecommendInputBoundary{ +import entity.User; + +/** + * The Recommendations Interactor. + */ +public class RecommendInteractor implements RecommendInputBoundary { + private final RecommendUserDataAcessInterface recommendDataAccessObject; + private final RecommendOutputBoundary recommendPresenter; + + public RecommendInteractor(RecommendUserDataAcessInterface recommendDataAccessInterface, + RecommendOutputBoundary recommendOutputBoundary) { + this.recommendDataAccessObject = recommendDataAccessInterface; + this.recommendPresenter = recommendOutputBoundary; + } + + @Override + public void execute(RecommendInputData recommendInputData) { + final String username = recommendInputData.getLoginToken(); + if (!recommendDataAccessObject.existsByName(username)) { + recommendPresenter.prepareFailView(username + ": Account does not exist."); + } + else { + final String accessToken = recommendDataAccessObject.get(username).getName(); + final User user = userDataAccessObject.get(loginInputData.getLoginToken()); + userDataAccessObject.setCurrentUsername(user.getName()); + final LoginOutputData loginOutputData = new LoginOutputData(user.getName(), false); + loginPresenter.prepareSuccessView(loginOutputData); + } + } } From 6db203dc8961e531430ebcfb232d3dcf0c6496e4 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sun, 17 Nov 2024 11:04:53 -0500 Subject: [PATCH 041/262] README update --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b440ab054..797f70854 100644 --- a/README.md +++ b/README.md @@ -35,4 +35,10 @@ suggestions. (Ethan) * John wants to find other individuals that have a similar music preference. (Ksenia) Below is a UI sketch that outlines what our project will look like. -![Project UI](images/CSC207%20Project%20Wireframe.png) \ No newline at end of file +![Project UI](images/CSC207%20Project%20Wireframe.png) +### Login Screen
+![Login Screen](images/login_screen.png)
+### Home Screen
+![Home Screen](images/home_screen.png)
+### Recommendations Screen
+![Recommendations Screen](images/recommendations_screen.png)
\ No newline at end of file From 5605259c4b21caa49f45c9c8f3d9b1db2d8e4a86 Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 17 Nov 2024 13:01:47 -0500 Subject: [PATCH 042/262] view set up correctly and supporting files are getting close to being ready --- .gitignore | 2 +- src/main/java/app/AppBuilder.java | 21 ++++ src/main/java/app/Main.java | 49 +++++++++- .../interface_adapter/login/LoginState.java | 4 + .../search/SearchController.java | 25 +++++ .../search/SearchPresenter.java | 5 + .../interface_adapter/search/SearchState.java | 14 +++ .../search/SearchViewModel.java | 9 ++ .../use_case/search/SearchInputBoundary.java | 10 ++ .../use_case/search/SearchInteractor.java | 27 ++++- src/main/java/view/LoggedInView.java | 17 ++++ src/main/java/view/SearchView.java | 98 +++++++++++++++++++ 12 files changed, 278 insertions(+), 3 deletions(-) create mode 100644 src/main/java/view/SearchView.java diff --git a/.gitignore b/.gitignore index a9d2f780e..2af69ab0c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ out/ .idea/easycode.ignore .idea/ homework-5.iml - +keys.txt target/ ### Eclipse ### diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 783d792e4..fb33383e8 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -15,12 +15,17 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; +import interface_adapter.search.SearchController; +import interface_adapter.search.SearchPresenter; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; import use_case.login.LoginOutputBoundary; import use_case.logout.LogoutInputBoundary; import use_case.logout.LogoutInteractor; import use_case.logout.LogoutOutputBoundary; +import use_case.search.SearchInputBoundary; +import use_case.search.SearchInteractor; +import use_case.search.SearchOutputBoundary; import view.LoggedInView; import view.LoginView; import view.ViewManager; @@ -155,6 +160,22 @@ public AppBuilder addLogoutUseCase() { return this; } + /** + * Adds the Logout Use Case to the application. + * @return this builder + */ + public AppBuilder addSearchUseCase() { + final SearchOutputBoundary searchOutputBoundary = new SearchPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + + final SearchInputBoundary searchInteractor = + new SearchInteractor(userDataAccessObject, searchOutputBoundary); + + final SearchController searchController = new SearchController(searchInteractor); + loggedInView.setSearchController(searchController); + return this; + } + /** * Creates the JFrame for the application and initially sets the SignupView to be displayed. * @return the application diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 64c8dc0c3..1724630cd 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -1,6 +1,8 @@ package app; -import javax.swing.JFrame; +import javax.swing.*; +import java.Constants; +import java.awt.*; /** * The Main class of our application. @@ -11,6 +13,48 @@ public class Main { * @param args unused arguments */ public static void main(String[] args) { + JPanel thus = new JPanel(); + final String viewName = "Search"; + //private final SearchViewModel searchViewModel; + //private SearchController searchController; + + final int searchBoxSize = 50; + + final JButton returnHome; + final JTextField searchInputField; + final JLabel searchResult; + final JPanel searchButtons = new JPanel(); + + //thus.searchViewModel = searchViewModel; + //thus.searchViewModel.addPropertyChangeListener(this); + + final JLabel title = new JLabel("Song Search By Description"); + + final JPanel homeButton = new JPanel(); + returnHome = new JButton("Go Back"); + homeButton.add(returnHome); + + searchResult = new JLabel("This is where search results will show up"); + + final JLabel description = new JLabel("Type In the Song Description:"); + searchButtons.add(description); + searchInputField = new JTextField(searchBoxSize); + searchButtons.add(searchInputField); + + searchResult.setAlignmentX(Component.RIGHT_ALIGNMENT); + + thus.setLayout(new BoxLayout(thus, BoxLayout.Y_AXIS)); + + thus.add(title); + thus.add(searchButtons); + thus.add(searchResult); + thus.add(homeButton); + final JFrame application = new JFrame("CSC207 Project: Spotify Companion App"); + application.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + application.add(thus); + application.pack(); + application.setVisible(true); + /* final AppBuilder appBuilder = new AppBuilder(); final JFrame application = appBuilder .addLoginView() @@ -18,9 +62,12 @@ public static void main(String[] args) { .addLoginUseCase() .addLogoutUseCase() + .addSearchUseCase() .build(); application.pack(); application.setVisible(true); + + */ } } diff --git a/src/main/java/interface_adapter/login/LoginState.java b/src/main/java/interface_adapter/login/LoginState.java index 272105d3e..8cb9bf4ad 100644 --- a/src/main/java/interface_adapter/login/LoginState.java +++ b/src/main/java/interface_adapter/login/LoginState.java @@ -22,4 +22,8 @@ public void setLoginToken(String loginToken) { public void setLoginError(String usernameError) { this.loginError = usernameError; } + + public String getModelResponse() { + return "not yet implemented"; + } } diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java index 1e3712665..71da7a24f 100644 --- a/src/main/java/interface_adapter/search/SearchController.java +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -1,4 +1,29 @@ package interface_adapter.search; + +import use_case.login.LoginInputBoundary; +import use_case.login.LoginInputData; +import use_case.search.SearchInputBoundary; + +/** + * The controller for the Search Use Case. + */ public class SearchController { + + private final SearchInputBoundary searchUseCaseInteractor; + + public SearchController(SearchInputBoundary searchUseCaseInteractor) { + this.searchUseCaseInteractor = searchUseCaseInteractor; + } + + /** + * Executes the Search Use Case. + * @param loginToken the username of the user logging in + */ + public void execute(String loginToken) { + final LoginInputData loginInputData = new LoginInputData( + loginToken); + + searchUseCaseInteractor.execute(loginInputData); + } } diff --git a/src/main/java/interface_adapter/search/SearchPresenter.java b/src/main/java/interface_adapter/search/SearchPresenter.java index 7805acfd7..15bc677d8 100644 --- a/src/main/java/interface_adapter/search/SearchPresenter.java +++ b/src/main/java/interface_adapter/search/SearchPresenter.java @@ -1,6 +1,11 @@ package interface_adapter.search; +import interface_adapter.ViewManagerModel; +import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.login.LoginViewModel; import use_case.search.SearchOutputBoundary; public class SearchPresenter implements SearchOutputBoundary { + public SearchPresenter(ViewManagerModel viewManagerModel, LoggedInViewModel loggedInViewModel, LoginViewModel loginViewModel) { + } } diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java index 70a54441b..fd6ca1c28 100644 --- a/src/main/java/interface_adapter/search/SearchState.java +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -1,4 +1,18 @@ package interface_adapter.search; +/* + The state for the SearchViewModel + */ public class SearchState { + public String getUsername() { + return "not yet implemented"; + } + + public String getQuery() { + return "not yet implemented"; + } + + public String getModelResponse() { + return "not yet implemented"; + } } diff --git a/src/main/java/interface_adapter/search/SearchViewModel.java b/src/main/java/interface_adapter/search/SearchViewModel.java index 1a716b6cd..f0b0d48c3 100644 --- a/src/main/java/interface_adapter/search/SearchViewModel.java +++ b/src/main/java/interface_adapter/search/SearchViewModel.java @@ -1,4 +1,13 @@ package interface_adapter.search; +import interface_adapter.change_password.LoggedInState; +import view.SearchView; + public class SearchViewModel { + public void addPropertyChangeListener(SearchView searchView) { + } + + public LoggedInState getState() { + return null; + } } diff --git a/src/main/java/use_case/search/SearchInputBoundary.java b/src/main/java/use_case/search/SearchInputBoundary.java index fdd043e47..695c480e0 100644 --- a/src/main/java/use_case/search/SearchInputBoundary.java +++ b/src/main/java/use_case/search/SearchInputBoundary.java @@ -1,4 +1,14 @@ package use_case.search; +import use_case.login.LoginInputData; + +/** + * Input Boundary for actions which are related to logging in. + */ public interface SearchInputBoundary { + /** + * Executes the login use case. + * @param loginInputData the input data + */ + void execute(LoginInputData loginInputData); } diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index 8b6135aae..d5da5555a 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -1,4 +1,29 @@ package use_case.search; -public class SearchInteractor implements SearchInputBoundary{ +import data_access.InMemoryUserDataAccessObject; +import use_case.login.LoginInputData; + +/** + * The Search Interactor. + */ +public class SearchInteractor implements SearchInputBoundary { + + private final InMemoryUserDataAccessObject userDataAccessObject; + private final SearchOutputBoundary searchOutputBoundary; + + /** + * The Search Interactor constructor. + * @param userDataAccessObject abstract data acess object + * @param searchOutputBoundary output information + */ + public SearchInteractor(InMemoryUserDataAccessObject userDataAccessObject, + SearchOutputBoundary searchOutputBoundary) { + this.userDataAccessObject = userDataAccessObject; + this.searchOutputBoundary = searchOutputBoundary; + } + + @Override + public void execute(LoginInputData loginInputData) { + + } } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 8bdc91f44..d2f1ff3c1 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -13,6 +13,7 @@ import interface_adapter.change_password.LoggedInState; import interface_adapter.change_password.LoggedInViewModel; import interface_adapter.logout.LogoutController; +import interface_adapter.search.SearchController; /** * The View for when the user is logged into the program. @@ -22,6 +23,7 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private final String viewName = "logged in"; private final LoggedInViewModel loggedInViewModel; private LogoutController logoutController; + private SearchController searchController; private final JLabel username; private final JButton logOut; @@ -107,6 +109,17 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { } } ); + description.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + evt -> { + if (evt.getSource().equals(description)) { + // 1. get the state out of the loggedInViewModel. It contains the username. + final String name = loggedInViewModel.getState().getUsername(); + // 2. Execute the logout Controller. + searchController.execute(name); + } + } + ); this.add(title); this.add(usernameInfo); @@ -140,4 +153,8 @@ public String getViewName() { public void setLogoutController(LogoutController logoutController) { this.logoutController = logoutController; } + + public void setSearchController(SearchController searchController) { + this.searchController = searchController; + } } diff --git a/src/main/java/view/SearchView.java b/src/main/java/view/SearchView.java new file mode 100644 index 000000000..b91ec55ff --- /dev/null +++ b/src/main/java/view/SearchView.java @@ -0,0 +1,98 @@ +package view; + +import interface_adapter.change_password.LoggedInState; +import interface_adapter.login.LoginState; +import interface_adapter.search.SearchController; +import interface_adapter.search.SearchState; +import interface_adapter.search.SearchViewModel; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * The View for when the user is searching via song description. + */ +public class SearchView extends JPanel implements PropertyChangeListener { + + private final String viewName = "logged in"; + private final SearchViewModel searchViewModel; + private SearchController searchController; + + private final int searchBoxSize = 50; + + private final JButton returnHome; + private final JTextField searchInputField; + private final JLabel searchResult; + private final JLabel title; + private final JPanel searchButtons = new JPanel(); + + public SearchView(SearchViewModel searchViewModel) { + this.searchViewModel = searchViewModel; + this.searchViewModel.addPropertyChangeListener(this); + + title = new JLabel("Song Search By Description"); + + final JPanel homeButton = new JPanel(); + returnHome = new JButton("Go Back"); + homeButton.add(returnHome); + + searchResult = new JLabel("This is where search results will show up"); + + final JLabel description = new JLabel("Type In the Song Description:"); + searchButtons.add(description); + searchInputField = new JTextField(searchBoxSize); + searchButtons.add(searchInputField); + + searchResult.setAlignmentX(Component.RIGHT_ALIGNMENT); + + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + returnHome.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + evt -> { + if (evt.getSource().equals(returnHome)) { + // 1. get the state out of the searchViewModel. It contains the username. + final String name = searchViewModel.getState().getUsername(); + // 2. Execute the search Controller. + searchController.execute(name); + } + } + ); + + this.add(title); + this.add(searchButtons); + this.add(searchResult); + this.add(homeButton); + + } + + /** + * React to a button click that results in evt. + * @param evt the ActionEvent to react to + */ + public void actionPerformed(ActionEvent evt) { + System.out.println("Click " + evt.getActionCommand()); + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + final SearchState state = (SearchState) evt.getNewValue(); + setFields(state); + } + + private void setFields(SearchState state) { + searchInputField.setText(state.getQuery()); + + } + + public String getViewName() { + return viewName; + } + + public void setSearchController(SearchController searchController) { + this.searchController = searchController; + } +} From 0da0f97fd17605075e355339fc9c75e92a4087e1 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Sun, 17 Nov 2024 13:07:54 -0500 Subject: [PATCH 043/262] The top_artists files are not needed. It is going to merged into top_tracks files. Moreover, the functionality for the top tracks button have been added. --- src/main/java/app/AppBuilder.java | 19 +++++++++++- src/main/java/app/Main.java | 1 + .../InMemoryUserDataAccessObject.java | 24 ++++++++++++++- .../top_artist/TopArtistController.java | 4 --- .../top_artist/TopArtistPresenter.java | 6 ---- .../top_artist/TopArtistState.java | 4 --- .../top_artist/TopArtistViewModel.java | 4 --- .../top_tracks/TopTracksController.java | 16 ++++++++++ .../top_tracks/TopTracksPresenter.java | 30 ++++++++++++++++++- .../top_tracks/TopTracksState.java | 6 ++-- .../top_artists/TopArtistInputBoundary.java | 4 --- .../top_artists/TopArtistInputData.java | 4 --- .../top_artists/TopArtistInteractor.java | 4 --- .../top_artists/TopArtistOutputBoundary.java | 4 --- .../top_artists/TopArtistOutputData.java | 4 --- .../TopArtistUserDataAccessInterface.java | 4 --- .../top_tracks/TopTracksInteractor.java | 30 ++++++++++++++++++- src/main/java/view/LoggedInView.java | 11 ++++++- 18 files changed, 129 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/interface_adapter/top_artist/TopArtistController.java delete mode 100644 src/main/java/interface_adapter/top_artist/TopArtistPresenter.java delete mode 100644 src/main/java/interface_adapter/top_artist/TopArtistState.java delete mode 100644 src/main/java/interface_adapter/top_artist/TopArtistViewModel.java delete mode 100644 src/main/java/use_case/top_artists/TopArtistInputBoundary.java delete mode 100644 src/main/java/use_case/top_artists/TopArtistInputData.java delete mode 100644 src/main/java/use_case/top_artists/TopArtistInteractor.java delete mode 100644 src/main/java/use_case/top_artists/TopArtistOutputBoundary.java delete mode 100644 src/main/java/use_case/top_artists/TopArtistOutputData.java delete mode 100644 src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index cf74d3515..e38222fab 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -15,6 +15,7 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; +import interface_adapter.top_tracks.TopTracksController; import interface_adapter.top_tracks.TopTracksPresenter; import interface_adapter.top_tracks.TopTracksViewModel; import use_case.login.LoginInputBoundary; @@ -190,6 +191,22 @@ public AppBuilder addLogoutUseCase() { return this; } + /** + * Adds the Logout Use Case to the application. + * @return this builder + */ + public AppBuilder addTopTracksAndArtistsUseCase() { + final TopTracksOutputBoundary topTracksOutputBoundary = new TopTracksPresenter(viewManagerModel, + topTracksAndArtistsViewModel); + + final TopTracksInputBoundary topTracksInputBoundary = + new TopTracksInteractor(userDataAccessObject, topTracksOutputBoundary); + + final TopTracksController topTracksController = new TopTracksController(topTracksInputBoundary); + loggedInView.setTopTracksController(topTracksController); + return this; + } + /** * Creates the JFrame for the application and initially sets the SignupView to be displayed. * @return the application @@ -203,7 +220,7 @@ public JFrame build() { application.add(cardPanel); - viewManagerModel.setState(topTracksAndArtistsViewModel.getViewName()); + viewManagerModel.setState(loggedInViewModel.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 3b5940169..6a1dc319d 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -18,6 +18,7 @@ public static void main(String[] args) { .addTopTracksAndArtistsView() .addLoginUseCase() .addLogoutUseCase() + .addTopTracksAndArtistsUseCase() .build(); application.pack(); diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index c9e974c10..1ccac5f9f 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -1,11 +1,13 @@ package data_access; import java.util.HashMap; +import java.util.List; import java.util.Map; import entity.User; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; +import use_case.top_tracks.TopTracksUserDataAccessInterface; /** * In-memory implementation of the DAO for storing user data. This implementation does @@ -13,7 +15,7 @@ */ public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, - LogoutUserDataAccessInterface { + LogoutUserDataAccessInterface, TopTracksUserDataAccessInterface { private final Map users = new HashMap<>(); @@ -43,4 +45,24 @@ public void setCurrentAccessToken(String name) { public String getCurrentAccessToken() { return this.currentUsername; } + + @Override + public List getCurrentTopTracks() { + return List.of(); + } + + @Override + public void setCurrentTopTracks(List tracks) { + + } + + @Override + public List getCurrentTime() { + return List.of(); + } + + @Override + public void setCurrentTime(List time) { + + } } diff --git a/src/main/java/interface_adapter/top_artist/TopArtistController.java b/src/main/java/interface_adapter/top_artist/TopArtistController.java deleted file mode 100644 index bc73f7f1d..000000000 --- a/src/main/java/interface_adapter/top_artist/TopArtistController.java +++ /dev/null @@ -1,4 +0,0 @@ -package interface_adapter.top_artist; - -public class TopArtistController { -} diff --git a/src/main/java/interface_adapter/top_artist/TopArtistPresenter.java b/src/main/java/interface_adapter/top_artist/TopArtistPresenter.java deleted file mode 100644 index 65d60c1b9..000000000 --- a/src/main/java/interface_adapter/top_artist/TopArtistPresenter.java +++ /dev/null @@ -1,6 +0,0 @@ -package interface_adapter.top_artist; - -import use_case.top_artists.TopArtistOutputBoundary; - -public class TopArtistPresenter implements TopArtistOutputBoundary { -} diff --git a/src/main/java/interface_adapter/top_artist/TopArtistState.java b/src/main/java/interface_adapter/top_artist/TopArtistState.java deleted file mode 100644 index 6510b7770..000000000 --- a/src/main/java/interface_adapter/top_artist/TopArtistState.java +++ /dev/null @@ -1,4 +0,0 @@ -package interface_adapter.top_artist; - -public class TopArtistState { -} diff --git a/src/main/java/interface_adapter/top_artist/TopArtistViewModel.java b/src/main/java/interface_adapter/top_artist/TopArtistViewModel.java deleted file mode 100644 index 252240de0..000000000 --- a/src/main/java/interface_adapter/top_artist/TopArtistViewModel.java +++ /dev/null @@ -1,4 +0,0 @@ -package interface_adapter.top_artist; - -public class TopArtistViewModel { -} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksController.java b/src/main/java/interface_adapter/top_tracks/TopTracksController.java index 02625f48f..c55395d3e 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksController.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksController.java @@ -1,6 +1,10 @@ package interface_adapter.top_tracks; +import use_case.logout.LogoutInputData; import use_case.top_tracks.TopTracksInputBoundary; +import use_case.top_tracks.TopTracksInputData; + +import java.util.List; /** * The controller for the TopTracks and Artists Use Case. @@ -11,4 +15,16 @@ public class TopTracksController { public TopTracksController(TopTracksInputBoundary topTracksInputBoundary) { this.topTracksInputBoundary = topTracksInputBoundary; } + + /** + * Executes the Logout Use Case. + * @param toptracks the username of the user logging in + * @param time nfvenprne + */ + public void execute(List toptracks, List time) { + // 1. instantiate the `LogoutInputData`, which should contain the username. + // 2. tell the Interactor to execute. + final TopTracksInputData topTracksInputData = new TopTracksInputData(toptracks, time); + topTracksInputBoundary.execute(topTracksInputData); + } } diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java b/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java index 80a7d2e64..b63fc4e73 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java @@ -1,10 +1,38 @@ package interface_adapter.top_tracks; +import interface_adapter.ViewManagerModel; import use_case.top_tracks.TopTracksOutputBoundary; +import use_case.top_tracks.TopTracksOutputData; /** * The Presenter for the Top Tracks Use Case. */ -public class TopTracksPresenter { +public class TopTracksPresenter implements TopTracksOutputBoundary{ + private final TopTracksViewModel topTracksViewModel; + private final ViewManagerModel viewManagerModel; + + public TopTracksPresenter(ViewManagerModel viewManagerModel, + TopTracksViewModel topTracksViewModel) { + this.viewManagerModel = viewManagerModel; + this.topTracksViewModel = topTracksViewModel; + } + + @Override + public void prepareSuccessView(TopTracksOutputData outputData) { + final TopTracksState topTracksState = topTracksViewModel.getState(); + topTracksState.setTracks(outputData.getTracks()); + this.topTracksViewModel.setState(topTracksState); + topTracksViewModel.firePropertyChanged(); + + this.viewManagerModel.setState(topTracksViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); + } + + @Override + public void prepareFailView(String errorMessage) { + final TopTracksState topTracksState = topTracksViewModel.getState(); + topTracksState.setTracksError(errorMessage); + topTracksViewModel.firePropertyChanged(); + } } diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksState.java b/src/main/java/interface_adapter/top_tracks/TopTracksState.java index 2403c590f..013610f60 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksState.java +++ b/src/main/java/interface_adapter/top_tracks/TopTracksState.java @@ -8,7 +8,7 @@ */ public class TopTracksState { private List tracks = new ArrayList<>(); - private List tracksError; + private String tracksError; public TopTracksState(TopTracksState copy) { tracks = copy.tracks; @@ -24,7 +24,7 @@ public List getTracks() { return tracks; } - public List getTracksError() { + public String getTracksError() { return tracksError; } @@ -32,7 +32,7 @@ public void setTracks(List tracks) { this.tracks = tracks; } - public void setTracksError(List tracksError) { + public void setTracksError(String tracksError) { this.tracksError = tracksError; } } diff --git a/src/main/java/use_case/top_artists/TopArtistInputBoundary.java b/src/main/java/use_case/top_artists/TopArtistInputBoundary.java deleted file mode 100644 index 23e2fbcd9..000000000 --- a/src/main/java/use_case/top_artists/TopArtistInputBoundary.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.top_artists; - -public interface TopArtistInputBoundary { -} diff --git a/src/main/java/use_case/top_artists/TopArtistInputData.java b/src/main/java/use_case/top_artists/TopArtistInputData.java deleted file mode 100644 index 8b85d5fd4..000000000 --- a/src/main/java/use_case/top_artists/TopArtistInputData.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.top_artists; - -public class TopArtistInputData { -} diff --git a/src/main/java/use_case/top_artists/TopArtistInteractor.java b/src/main/java/use_case/top_artists/TopArtistInteractor.java deleted file mode 100644 index b5438ce7d..000000000 --- a/src/main/java/use_case/top_artists/TopArtistInteractor.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.top_artists; - -public class TopArtistInteractor implements TopArtistInputBoundary{ -} diff --git a/src/main/java/use_case/top_artists/TopArtistOutputBoundary.java b/src/main/java/use_case/top_artists/TopArtistOutputBoundary.java deleted file mode 100644 index a9f8c3b84..000000000 --- a/src/main/java/use_case/top_artists/TopArtistOutputBoundary.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.top_artists; - -public interface TopArtistOutputBoundary { -} diff --git a/src/main/java/use_case/top_artists/TopArtistOutputData.java b/src/main/java/use_case/top_artists/TopArtistOutputData.java deleted file mode 100644 index cf68bdabe..000000000 --- a/src/main/java/use_case/top_artists/TopArtistOutputData.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.top_artists; - -public class TopArtistOutputData { -} diff --git a/src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java b/src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java deleted file mode 100644 index 0eaf6f091..000000000 --- a/src/main/java/use_case/top_artists/TopArtistUserDataAccessInterface.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.top_artists; - -public interface TopArtistUserDataAccessInterface { -} diff --git a/src/main/java/use_case/top_tracks/TopTracksInteractor.java b/src/main/java/use_case/top_tracks/TopTracksInteractor.java index 6c890a46d..5cd2f95eb 100644 --- a/src/main/java/use_case/top_tracks/TopTracksInteractor.java +++ b/src/main/java/use_case/top_tracks/TopTracksInteractor.java @@ -1,4 +1,32 @@ package use_case.top_tracks; -public class TopTracksInteractor{ +import use_case.logout.LogoutOutputBoundary; +import use_case.logout.LogoutUserDataAccessInterface; + +import java.util.List; + +/** + * The Top Tracks Interactor. + */ +public class TopTracksInteractor implements TopTracksInputBoundary{ + private TopTracksUserDataAccessInterface userDataAccessObject; + private TopTracksOutputBoundary topTracksOutputBoundary; + + public TopTracksInteractor(TopTracksUserDataAccessInterface userDataAccessObject, + TopTracksOutputBoundary topTracksOutputBoundary) { + // Which parameter is the DAO and which is the presenter? + this.userDataAccessObject = userDataAccessObject; + this.topTracksOutputBoundary = topTracksOutputBoundary; + } + + @Override + public void execute(TopTracksInputData topTracksInputData) { + final List topTracks = topTracksInputData.getTracks(); + final List time = topTracksInputData.getTime(); + userDataAccessObject.setCurrentTopTracks(topTracks); + userDataAccessObject.setCurrentTime(time); + + final TopTracksOutputData outputData = new TopTracksOutputData(topTracks, time, false); + topTracksOutputBoundary.prepareSuccessView(outputData); + } } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index c785355b3..cf6ff72f6 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -3,6 +3,8 @@ import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.List; import javax.swing.BoxLayout; import javax.swing.JButton; @@ -23,7 +25,7 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private final String viewName = "logged in"; private final LoggedInViewModel loggedInViewModel; private LogoutController logoutController; - // private TopTracksController topTracksController; + private TopTracksController topTracksController; private final JLabel username; private final JButton logOut; @@ -114,6 +116,9 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(topTracks)) { // final String name = topTracksController + final List lst = new ArrayList<>(); + lst.add("a"); + topTracksController.execute(lst, lst); } } ); @@ -150,4 +155,8 @@ public String getViewName() { public void setLogoutController(LogoutController logoutController) { this.logoutController = logoutController; } + + public void setTopTracksController(TopTracksController topTracksController) { + this.topTracksController = topTracksController; + } } From 7cac91a93ee68fe76eeb564ca0c0ae2d5ca67e32 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sun, 17 Nov 2024 13:45:46 -0500 Subject: [PATCH 044/262] adding screen image --- images/recommendations_screen.png | Bin 26510 -> 27412 bytes .../data_access/DBUserDataAccessObject.java | 5 +-- .../data_access/FileUserDataAccessObject.java | 5 +-- .../recommend/RecommendInteractor.java | 28 ++++++------ src/main/java/view/RecommendationsView.java | 40 +++++++++++------- 5 files changed, 41 insertions(+), 37 deletions(-) diff --git a/images/recommendations_screen.png b/images/recommendations_screen.png index 2718955ae29855d929577785a15589e16d94a5bb..8c50eff62d60b05b2c3270c11859dcae98ec3384 100644 GIT binary patch literal 27412 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 L)vp)Go8JE)81=&P literal 26510 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%0A*ThNf5zIiqr zX+Zq=3T2BMf@bv-nmi?rQRGSi*lh-MCF$C)>-2qm=(o3EOL!do-cso4&F^Fk*O(A5a011_qHBDVSUAh00c}@jMg2q$c5c zvhua|5yisPr9PxWmRu*LEQs>h_EyU!mrEF|LxWLI`2LWWiKArY7tF?IZsf(iA6{mR zg2g}X8_z35gM3G!@sSC>8SA`>DYY;M8{=(K@D??Oyv&rE;gPYx_X_CkioQR4zl6UI zDD2V$&t}Ulzfy!Oi+&Pi%_DZ19=nK_W^^G&zeB~!0sc!|#Qb0QSMKVB%$GGjW0WWl z+pZkQYbYyBfVQA^!$CxnO}P1p?%(DtHFgyQg&b zfj)fZkUa?C*?Au~<_X_o88RzS6W zQ=n^BSBW>$-U}vxaW7+12;h&yxmx3-*IhTe(Jzq@Fyz(KJ9PYv*Qs85B7LsNThO{2 zb>9wRDiJ1Bw){bb&RI6Uy6j5-Dn5KYq8KUAAQQfOgDtw9qr5pNb6ppwL_}PwKN>3Q zBTMuRK;qxhf7j$43%4*GCr}dYfI11HV}RbvW%HGjg+2g8Hc<$n+aCc}eGv$M-B8AXfvgYu;8kPWJ)zIpo(Z32>~3fmab)Up zyGD{R)b?8a9hFfdL31aXq()z&kGya?={=!_KpJ+jn=VrSV)iXFu)>J2VHc6otxt$- zzZ3rHg9g>JD$+$760R71a1`o)*&b^X?#BT`JIu2q=)ZDN7iW)CaIph18=%@gEYb7= zY_BQ;+8i=h7qtu$pp@K{wOfP1ZKbun(scENN}#_6q*(cJ0YB)ih+umoejGX192~PQ zApw~Po3j)O`WYIy3(MLT)xYRr#(Xz0bI$WX>cg(}kHfIeq`)up#m+5D4+0P+eHp<4 zIzNK?X;%N@PO6OF^aLNdjC<|a2cEO~=iTHrj}1@9p`negfthtKzD^B?GwF)I+jQX? zJB~%MD*ZG}6LC!9u29_EufCNobO>+J?)Lr0fsLO2RzJM|*1?>LHyR7v%)e)oMyi%W zJ3rKNZ6rjINz_@L9K92sF_fBYJG-2ujYqfz=92L%RNb7?N1rMKlPa3&KYejyztLii04Y~ zqu9wvckr82F>D)n##z+5Ur&9z!cwRRe;d`w)Ro<81gl!But3yG=rWkk{qp|x(mcvW zd9O;*Ub|@doRC}Ff1WidLo_0TobQ=ZIt~x3o&6rIPi%|pr!|zX3tNgYO-qn%e+W=R zi(NKBCFu$uc^ZwwaU)9HW~nov7W40wGg)A>^SsZawAjSP~{PlaC3{9mxn4iIHFb2C8Fic^Q0F>-j@GZ z%hIONhHqB!t>VF-;!yp%TUE?&qxS~QkC&E^yE{d3gPaG)UBQb3PAjQ8XLtPDw0YkA z&S)IStgK_^q}ogl5zDGB#H~>NJBLyIIrpi-y?@>W7Cpdl$4eadJ@5`qb9aBH&jMEJE8{3SoH^ZCUiB7X{LEX4n-RKGbfLl&CEA; zrw1Dpjyd-}cscsH`ulYp_aClI<@=Hdos2gj9P4QuCVfOe9#R(CM|eC{JGL~!Q2b@{z!_)l z!0}(pI{T-N#1lf1-rwf*_m#>nG4R2OMSZn4DH1ZUnB=i0BzN+_u=r! { @@ -59,12 +67,12 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { // ); final JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); - panel.add(title); - panel.add(description); + panel.add(titlePanel); + panel.add(descriptionPanel); panel.add(songsPanel); - panel.add(homeButton); + panel.add(homeButtonPanel); - this.add(panel, BorderLayout.CENTER); + this.add(panel); } @Override From f16c4e89f358ba0c9ee2bacacde74927a2fe3260 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sun, 17 Nov 2024 13:52:58 -0500 Subject: [PATCH 045/262] Adding images to README --- .gitignore | 1 + images/home_screen.png | Bin 0 -> 25166 bytes images/login_screen.png | Bin 0 -> 16125 bytes images/recommendations_screen.png | Bin 0 -> 27412 bytes images/refresh_arrow.jpg | Bin 0 -> 10121 bytes 5 files changed, 1 insertion(+) create mode 100644 images/home_screen.png create mode 100644 images/login_screen.png create mode 100644 images/recommendations_screen.png create mode 100644 images/refresh_arrow.jpg diff --git a/.gitignore b/.gitignore index a9d2f780e..1c6964240 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ out/ .idea/easycode.ignore .idea/ homework-5.iml +keys.txt target/ diff --git a/images/home_screen.png b/images/home_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..7e894946afe5a42967071d40ee2e2348d2bd02de GIT binary patch literal 25166 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 literal 0 HcmV?d00001 diff --git a/images/login_screen.png b/images/login_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..5c15cf353b97d0485a5824b245bdaf58fa12a324 GIT binary patch literal 16125 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 L)vp)Go8JE)81=&P literal 0 HcmV?d00001 diff --git a/images/refresh_arrow.jpg b/images/refresh_arrow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..862053e29abe3f91565936492819815b767d550e GIT binary patch literal 10121 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 S1pu+a|AhltzWu|o{J#MI;kgL_ literal 0 HcmV?d00001 From 1e3e6453c515ff8f59e4435e63d9ba7a71654a5b Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 17 Nov 2024 15:12:35 -0500 Subject: [PATCH 046/262] updated the description search button so it takes the user to the correct page --- src/main/java/app/AppBuilder.java | 19 +++++++- src/main/java/app/Main.java | 47 +------------------ .../interface_adapter/login/LoginState.java | 4 -- .../search/SearchController.java | 8 +--- .../search/SearchPresenter.java | 44 ++++++++++++++++- .../interface_adapter/search/SearchState.java | 32 ++++++++++--- .../search/SearchViewModel.java | 15 +++--- .../use_case/search/SearchInputBoundary.java | 9 ++-- .../use_case/search/SearchInteractor.java | 19 ++++---- .../use_case/search/SearchOutputBoundary.java | 15 ++++++ .../use_case/search/SearchOutputData.java | 16 ++++++- src/main/java/view/LoggedInView.java | 6 +-- src/main/java/view/SearchView.java | 8 ++-- 13 files changed, 146 insertions(+), 96 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index fb33383e8..caf5fe08b 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -17,6 +17,7 @@ import interface_adapter.logout.LogoutPresenter; import interface_adapter.search.SearchController; import interface_adapter.search.SearchPresenter; +import interface_adapter.search.SearchViewModel; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; import use_case.login.LoginOutputBoundary; @@ -28,6 +29,7 @@ import use_case.search.SearchOutputBoundary; import view.LoggedInView; import view.LoginView; +import view.SearchView; import view.ViewManager; /** @@ -57,8 +59,10 @@ public class AppBuilder { // private SignupViewModel signupViewModel; private LoginViewModel loginViewModel; private LoggedInViewModel loggedInViewModel; + private SearchViewModel searchViewModel; private LoggedInView loggedInView; private LoginView loginView; + private SearchView searchView; public AppBuilder() { cardPanel.setLayout(cardLayout); @@ -86,6 +90,17 @@ public AppBuilder addLoginView() { return this; } + /** + * Adds the Search View to the application. + * @return this builder + */ + public AppBuilder addSearchView() { + searchViewModel = new SearchViewModel(); + searchView = new SearchView(searchViewModel); + cardPanel.add(searchView, searchView.getViewName()); + return this; + } + /** * Adds the LoggedIn View to the application. * @return this builder @@ -166,10 +181,10 @@ public AppBuilder addLogoutUseCase() { */ public AppBuilder addSearchUseCase() { final SearchOutputBoundary searchOutputBoundary = new SearchPresenter(viewManagerModel, - loggedInViewModel, loginViewModel); + loggedInViewModel, searchViewModel); final SearchInputBoundary searchInteractor = - new SearchInteractor(userDataAccessObject, searchOutputBoundary); + new SearchInteractor(searchOutputBoundary); final SearchController searchController = new SearchController(searchInteractor); loggedInView.setSearchController(searchController); diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 1724630cd..211b108d9 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -13,61 +13,18 @@ public class Main { * @param args unused arguments */ public static void main(String[] args) { - JPanel thus = new JPanel(); - final String viewName = "Search"; - //private final SearchViewModel searchViewModel; - //private SearchController searchController; - final int searchBoxSize = 50; - - final JButton returnHome; - final JTextField searchInputField; - final JLabel searchResult; - final JPanel searchButtons = new JPanel(); - - //thus.searchViewModel = searchViewModel; - //thus.searchViewModel.addPropertyChangeListener(this); - - final JLabel title = new JLabel("Song Search By Description"); - - final JPanel homeButton = new JPanel(); - returnHome = new JButton("Go Back"); - homeButton.add(returnHome); - - searchResult = new JLabel("This is where search results will show up"); - - final JLabel description = new JLabel("Type In the Song Description:"); - searchButtons.add(description); - searchInputField = new JTextField(searchBoxSize); - searchButtons.add(searchInputField); - - searchResult.setAlignmentX(Component.RIGHT_ALIGNMENT); - - thus.setLayout(new BoxLayout(thus, BoxLayout.Y_AXIS)); - - thus.add(title); - thus.add(searchButtons); - thus.add(searchResult); - thus.add(homeButton); - final JFrame application = new JFrame("CSC207 Project: Spotify Companion App"); - application.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - application.add(thus); - application.pack(); - application.setVisible(true); - /* final AppBuilder appBuilder = new AppBuilder(); final JFrame application = appBuilder .addLoginView() - .addLoggedInView() .addLoginUseCase() - + .addSearchView() + .addLoggedInView() .addLogoutUseCase() .addSearchUseCase() .build(); application.pack(); application.setVisible(true); - - */ } } diff --git a/src/main/java/interface_adapter/login/LoginState.java b/src/main/java/interface_adapter/login/LoginState.java index 8cb9bf4ad..272105d3e 100644 --- a/src/main/java/interface_adapter/login/LoginState.java +++ b/src/main/java/interface_adapter/login/LoginState.java @@ -22,8 +22,4 @@ public void setLoginToken(String loginToken) { public void setLoginError(String usernameError) { this.loginError = usernameError; } - - public String getModelResponse() { - return "not yet implemented"; - } } diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java index 71da7a24f..95f950f24 100644 --- a/src/main/java/interface_adapter/search/SearchController.java +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -18,12 +18,8 @@ public SearchController(SearchInputBoundary searchUseCaseInteractor) { /** * Executes the Search Use Case. - * @param loginToken the username of the user logging in */ - public void execute(String loginToken) { - final LoginInputData loginInputData = new LoginInputData( - loginToken); - - searchUseCaseInteractor.execute(loginInputData); + public void execute() { + searchUseCaseInteractor.execute(); } } diff --git a/src/main/java/interface_adapter/search/SearchPresenter.java b/src/main/java/interface_adapter/search/SearchPresenter.java index 15bc677d8..8b8dd714d 100644 --- a/src/main/java/interface_adapter/search/SearchPresenter.java +++ b/src/main/java/interface_adapter/search/SearchPresenter.java @@ -4,8 +4,50 @@ import interface_adapter.change_password.LoggedInViewModel; import interface_adapter.login.LoginViewModel; import use_case.search.SearchOutputBoundary; +import use_case.search.SearchOutputData; +import interface_adapter.ViewManagerModel; +import interface_adapter.change_password.LoggedInState; +import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.login.LoginState; +import interface_adapter.login.LoginViewModel; +import use_case.logout.LogoutOutputBoundary; +import use_case.logout.LogoutOutputData; + +/** + * The Presenter for the Logout Use Case. + */ public class SearchPresenter implements SearchOutputBoundary { - public SearchPresenter(ViewManagerModel viewManagerModel, LoggedInViewModel loggedInViewModel, LoginViewModel loginViewModel) { + + private LoggedInViewModel loggedInViewModel; + private ViewManagerModel viewManagerModel; + private SearchViewModel searchViewModel; + + public SearchPresenter(ViewManagerModel viewManagerModel, + LoggedInViewModel loggedInViewModel, + SearchViewModel searchViewModel) { + // Done: assign to the three instance variables. + this.loggedInViewModel = loggedInViewModel; + this.viewManagerModel = viewManagerModel; + this.searchViewModel = searchViewModel; + + } + + @Override + public void prepareSuccessView(SearchOutputData response) { + + final SearchState searchState = searchViewModel.getState(); + searchViewModel.setState(searchState); + searchViewModel.firePropertyChanged(); + + // This code tells the View Manager to switch to the Search. + this.viewManagerModel.setState(searchViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); + } + + @Override + public void prepareFailView(String error) { + // No need to add code here. We'll assume that logout can't fail. + // Thought question: is this a reasonable assumption? } } diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java index fd6ca1c28..34b9b7f2f 100644 --- a/src/main/java/interface_adapter/search/SearchState.java +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -1,18 +1,38 @@ package interface_adapter.search; -/* - The state for the SearchViewModel +import interface_adapter.change_password.LoggedInState; + +/** + * The state for the SearchViewModel. */ public class SearchState { - public String getUsername() { - return "not yet implemented"; + + private String query; + private String modelResponse; + + public SearchState(SearchState copy) { + query = copy.query; + modelResponse = copy.modelResponse; + } + + // Because of the previous copy constructor, the default constructor must be explicit. + public SearchState() { + } public String getQuery() { - return "not yet implemented"; + return query; } public String getModelResponse() { - return "not yet implemented"; + return modelResponse; + } + + public void setQuery(String query) { + this.query = query; + } + + public void setModelResponse(String modelResponse) { + this.modelResponse = modelResponse; } } diff --git a/src/main/java/interface_adapter/search/SearchViewModel.java b/src/main/java/interface_adapter/search/SearchViewModel.java index f0b0d48c3..e953dff33 100644 --- a/src/main/java/interface_adapter/search/SearchViewModel.java +++ b/src/main/java/interface_adapter/search/SearchViewModel.java @@ -1,13 +1,14 @@ package interface_adapter.search; -import interface_adapter.change_password.LoggedInState; -import view.SearchView; +import interface_adapter.ViewModel; -public class SearchViewModel { - public void addPropertyChangeListener(SearchView searchView) { - } +/** +* The view model for the Search use case. + */ +public class SearchViewModel extends ViewModel { - public LoggedInState getState() { - return null; + public SearchViewModel() { + super("search"); + setState(new SearchState()); } } diff --git a/src/main/java/use_case/search/SearchInputBoundary.java b/src/main/java/use_case/search/SearchInputBoundary.java index 695c480e0..b0a5c7992 100644 --- a/src/main/java/use_case/search/SearchInputBoundary.java +++ b/src/main/java/use_case/search/SearchInputBoundary.java @@ -1,14 +1,11 @@ package use_case.search; -import use_case.login.LoginInputData; - /** - * Input Boundary for actions which are related to logging in. + * Input Boundary for actions which are going to the search page. */ public interface SearchInputBoundary { /** - * Executes the login use case. - * @param loginInputData the input data + * Executes the Search use case. */ - void execute(LoginInputData loginInputData); + void execute(); } diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index d5da5555a..88964aa02 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -2,28 +2,27 @@ import data_access.InMemoryUserDataAccessObject; import use_case.login.LoginInputData; +import use_case.logout.LogoutOutputData; /** * The Search Interactor. */ public class SearchInteractor implements SearchInputBoundary { - private final InMemoryUserDataAccessObject userDataAccessObject; - private final SearchOutputBoundary searchOutputBoundary; + private final SearchOutputBoundary searchPresenter; /** * The Search Interactor constructor. - * @param userDataAccessObject abstract data acess object - * @param searchOutputBoundary output information + * @param searchPresenter output information */ - public SearchInteractor(InMemoryUserDataAccessObject userDataAccessObject, - SearchOutputBoundary searchOutputBoundary) { - this.userDataAccessObject = userDataAccessObject; - this.searchOutputBoundary = searchOutputBoundary; + public SearchInteractor(SearchOutputBoundary searchPresenter) { + + this.searchPresenter = searchPresenter; } @Override - public void execute(LoginInputData loginInputData) { - + public void execute() { + final SearchOutputData search = new SearchOutputData(false); + searchPresenter.prepareSuccessView(search); } } diff --git a/src/main/java/use_case/search/SearchOutputBoundary.java b/src/main/java/use_case/search/SearchOutputBoundary.java index 59a947aa1..73d4f4d09 100644 --- a/src/main/java/use_case/search/SearchOutputBoundary.java +++ b/src/main/java/use_case/search/SearchOutputBoundary.java @@ -1,4 +1,19 @@ package use_case.search; +import use_case.logout.LogoutOutputData; +/** + * The output boundary for the Search Use Case. + */ public interface SearchOutputBoundary { + /** + * Prepares the success view for the Search Use Case. + * @param outputData the output data + */ + void prepareSuccessView(SearchOutputData outputData); + + /** + * Prepares the failure view for the Search Use Case. + * @param errorMessage the explanation of the failure + */ + void prepareFailView(String errorMessage); } diff --git a/src/main/java/use_case/search/SearchOutputData.java b/src/main/java/use_case/search/SearchOutputData.java index 139266262..d7f7df381 100644 --- a/src/main/java/use_case/search/SearchOutputData.java +++ b/src/main/java/use_case/search/SearchOutputData.java @@ -1,4 +1,18 @@ package use_case.search; - +/** + * Output Data for the Search Use Case. + */ public class SearchOutputData { + + + private boolean useCaseFailed; + + public SearchOutputData(boolean useCaseFailed) { + this.useCaseFailed = useCaseFailed; + + } + + public boolean isUseCaseFailed() { + return useCaseFailed; + } } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index d2f1ff3c1..8f95f9c43 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -113,10 +113,8 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { if (evt.getSource().equals(description)) { - // 1. get the state out of the loggedInViewModel. It contains the username. - final String name = loggedInViewModel.getState().getUsername(); - // 2. Execute the logout Controller. - searchController.execute(name); + // 1. Execute the logout Controller. + searchController.execute(); } } ); diff --git a/src/main/java/view/SearchView.java b/src/main/java/view/SearchView.java index b91ec55ff..c4a0dbf15 100644 --- a/src/main/java/view/SearchView.java +++ b/src/main/java/view/SearchView.java @@ -17,7 +17,7 @@ */ public class SearchView extends JPanel implements PropertyChangeListener { - private final String viewName = "logged in"; + private final String viewName = "search"; private final SearchViewModel searchViewModel; private SearchController searchController; @@ -49,7 +49,7 @@ public SearchView(SearchViewModel searchViewModel) { searchResult.setAlignmentX(Component.RIGHT_ALIGNMENT); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - + /* this block of code is to be finished after a discussion about a unified return home use case. returnHome.addActionListener( // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { @@ -57,10 +57,10 @@ public SearchView(SearchViewModel searchViewModel) { // 1. get the state out of the searchViewModel. It contains the username. final String name = searchViewModel.getState().getUsername(); // 2. Execute the search Controller. - searchController.execute(name); + loginController.execute(); } } - ); + );*/ this.add(title); this.add(searchButtons); From 038128673153d48966f6561dbf3b92ea73e75671 Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 17 Nov 2024 15:17:10 -0500 Subject: [PATCH 047/262] added progress images --- README.md | 9 ++++++++- images/csc207_progress1_ethan.png | Bin 0 -> 25635 bytes images/csc207_progress1_quinn.png | Bin 0 -> 41974 bytes images/csc207_progress1_yanki.png | Bin 0 -> 72510 bytes 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 images/csc207_progress1_ethan.png create mode 100644 images/csc207_progress1_quinn.png create mode 100644 images/csc207_progress1_yanki.png diff --git a/README.md b/README.md index 797f70854..d6db84ca5 100644 --- a/README.md +++ b/README.md @@ -41,4 +41,11 @@ Below is a UI sketch that outlines what our project will look like. ### Home Screen
![Home Screen](images/home_screen.png)
### Recommendations Screen
-![Recommendations Screen](images/recommendations_screen.png)
\ No newline at end of file +![Recommendations Screen](images/recommendations_screen.png)
+### Description Search Screen
+![Description Search Screen](images/csc207_progress1_quinn.png)
+### Keyword Search Screen
+![Keyword Search Screen](images/csc207_progress1_ethan.png)
+### Analytics Screen
+![Analytics Screen](images/csc207_progress1_yanki.png)
+ diff --git a/images/csc207_progress1_ethan.png b/images/csc207_progress1_ethan.png new file mode 100644 index 0000000000000000000000000000000000000000..37d199a4a36ef35132bacfe11c97a96be60dd9ef GIT binary patch literal 25635 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 iQl(fssS-*(L{ctVzm3e=n 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 K#R5I2$o~Vna*{p( literal 0 HcmV?d00001 diff --git a/images/csc207_progress1_quinn.png b/images/csc207_progress1_quinn.png new file mode 100644 index 0000000000000000000000000000000000000000..e62ffea144f2aa0910fdabbecc86ab8608b3214a GIT binary patch literal 41974 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

ez>iUK*gDd@tkIh| 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�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

ph&>Wcqz_Ai6sp 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 z zJw1ZDyM3?hikX_!?C@ZFbd-8P6Yrr$zsaLaPGjXSlTPEiD52L=VeHa7dTiMz;%*9t z)Tl1q+wtqx$?5mQWmQAJZM6qDBt|Ro$!}8}4K>gc3RVz~JeuA#HT2i<((v}^mF5jq zr*jyO7IbMHVQZ?t`&UhX&vnXwHFo6fA^x93-!B%~Fc|V|tQDnGp~gnWB6D+jqbdcg z98ogaNOSkcnc&B?8=f%t3C11$^h3)Wd+M^f!k*U&8R4rnQmRB+X$wi5uKCuYY&Yid zdHRxa>#><)r3aU&3cJl`fs4Eb)kjf$X7XCyac$GEMJQ#700N6SC}=XR#(NpOBv#5LU zZ}Qlc+A~Rr2Ve;x{_<0fephQ3a+KUXA@7vca8JQ%f~}8N>CSQU?`v&1I+Gp zz4l;)mQMAb%YO0G5GI_|ORG&RBIYA(l)SZGj}$D4oCZKieUefV+5%SHR#DpP zTu3+F&w&9PD4E$dGi!oN1XdSi0I&mMsZeBO-1=ic=m8DY*4I~y(rO)NQK4lcH=UJvdbSs6rZT=3*$=SJ z1X~WlOSU_|}{r*`~-`1ZczN zEnBL_{*ht`8^m6|WYldX5+;DAI|#x-062br%44IjIqyU#4UD^WH1AVBZB5bVTIrm44u;=`=Tzv6O7sh6-SnEm8c2s z6|r`Q!A!e^^fv3wJR#8}7_V!UXwcU1hlqwyiKOS_^7*q4aBhFhDdG-Kh-{SEEglIL z%imdGi~+uXXWs9T5qqLc!HQ@+mbeXfkCRptrvNM)ZX7Q<^0>I2`&gU+rLl%o0B+6Z zZql(T_~rz;J(!e_P&Z$OYJx0R%>6iTq!P-*FJq!YP4R`o?RI@{1_*spNkL(F7}X?p zvv8nGc$rw=1mR-?gwk6m>H$;P?I-WoIIhi6&IOW-NS+K2{p;bGz7 zR_I?h=((SaE=8J1MpLXS(iOz|q~4qQ#o8#1rsCJeD*YGSGR~FB(WMQ=S@1^y{j-3A z$P|p%Oz$>%lykr}$ebv6;Tyuk1!XJy&(+*g7kUpuq_&}9kCIYf<|(ufs2#}!EVvX> z!XZLIS+3bCfi?2;(D>jfA;makU~ob?{YR%lm9!G~sj1e{1s7 zfJPRJVTo=BDln*Q!+Tujj)u}N{~j0bpr@tSu(sw|$64P@i^S0X>xqWq!ra>9TpyXR z!J4B;#3a5~k39XSXYLe5U9*Ex@94^&4>sKq;*oM&F*LaCm^LPEFC^bh#nu3578rKy zu-$aB^hEE2*6yJ1awF+%hfz{pzqwdCDd%xZ#`o64lQyLn{K{l}_4|h>f@Gr3)ji?= zJ?mP@%VFG%wEy|~o}k069)4wW=Q?*j67v4Z6{a0p^R|k6-?1x@n zP>MUQ)6g`WI1~1@sxqX=b9Z>h;DG)=I-kEwj@@Stv>pv-OS*Gw;BT+5f`>||TA?=L*EjvRU`N`td{drz%9x;pQb{)-~od*Xpbv*Z03%0Xc z3ngde(AjxOf4XhZsH;#wCCSUNHTC;<6hT#kcM|vUXvjRFJ;w0pcJ;*Cl^Y7DEY$1b zSf3>NU)<1?V;a#l^z&zf$X)SfiJo6A(TV$cG#H;GOE--eFBqlWk;%C=|yY+Nzq>!^=SIB^8>ukE&tn<~Fgf+mBLeHwzHB%ev zwU2Xho_6mZ;g^-VUwI?^p|n5a!xK-%75Cf=npaCrO#@G$U~uYiVu1IiVYyyfMFBfE z)7+RllS>tpTluQB>gVK^mVEsC6uuVrO$@6p9Bo_4vR^vZ=9|%_*g57BT}bcTv!QPD z?7~3C(#e+DqJ_%~vK>8q9$cMpEoYkdM(Qr!B|jk&pD^y8fBI?K(9zDFifQBD4g4(J kq9aa9rt&g{M!5f3(~qpWb-($q69s;>)b-S!t5^p9e`|ZRxc~qF literal 0 HcmV?d00001 From be98822066f0b5d60a256b89029d81b595084f72 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sun, 17 Nov 2024 15:37:38 -0500 Subject: [PATCH 048/262] Adding similar listeners UI to README --- README.md | 5 +++-- ...reen.png => csc207_progress1_dimitrios.png} | Bin images/csc207_progress1_ksenia.jpg | Bin 0 -> 132375 bytes 3 files changed, 3 insertions(+), 2 deletions(-) rename images/{recommendations_screen.png => csc207_progress1_dimitrios.png} (100%) create mode 100644 images/csc207_progress1_ksenia.jpg diff --git a/README.md b/README.md index d6db84ca5..447a2e0b9 100644 --- a/README.md +++ b/README.md @@ -41,11 +41,12 @@ Below is a UI sketch that outlines what our project will look like. ### Home Screen
![Home Screen](images/home_screen.png)
### Recommendations Screen
-![Recommendations Screen](images/recommendations_screen.png)
+![Recommendations Screen](images/csc207_progress1_dimitrios.png)
### Description Search Screen
![Description Search Screen](images/csc207_progress1_quinn.png)
### Keyword Search Screen
![Keyword Search Screen](images/csc207_progress1_ethan.png)
### Analytics Screen
![Analytics Screen](images/csc207_progress1_yanki.png)
- +### Similar Listeners Screen
+![Similar Listeners Screen](images/csc207_progress1_ksenia.jpg)
diff --git a/images/recommendations_screen.png b/images/csc207_progress1_dimitrios.png similarity index 100% rename from images/recommendations_screen.png rename to images/csc207_progress1_dimitrios.png diff --git a/images/csc207_progress1_ksenia.jpg b/images/csc207_progress1_ksenia.jpg new file mode 100644 index 0000000000000000000000000000000000000000..573bb2d54df0aba229554b2e415b5c857aba175b GIT binary patch literal 132375 zcmbTdWmH^E)GpX)+vcW>N-yLUpP9bBg0@7{H1 zt@$-GyKSvL=Ty~ms?L74)$7XZ4ggO{PEihkfB*m>z+ZsZb-+ge%Kr!&3JMw~8X6iV zE+$-X332}uLQ=y25z_xHl>Z~N{|V#&k^dS&Kt)AGM@Pqlzu&zfe)I1Cv%K~J@X-); zk?oKW=mCiM2uSz{uR{PD_&8Az{zm}+TM!VDkWo;9Xy_Q2@DrNx0Eh@kNQlTtC@9Ft z@Uw&A#{tOrCK3y%nN3=&c@@;7haF)_2S z@_pbJ5EK&rC?hK;ub`-;rLCi@r*B|rX=QC=YiIA^>E-R?>*pU385JE9`z0ZS5TcgG0k3;L)-1`Gv*bOUo;(YrA{<2Zu+;Cy+mv zSJ$wAH@A295C7pp03iJ@Sn%)v1?>NU3m=XP5g8c?8TcPA1Vmr>2MHe;g^nAQKuQB> z?oLS06OKkComSG&kIulWc|mO9F^56I$hZ6U@;_+*gY5quu!#R($o>zo{~OmD01F8L zK6yy^013doiX{~b!d@g;QdJ~H=}-U*Yd$2?42GD4ozh{ikLpcU<+WEp{K!&f30w1o zl@3r8XiO>4rG{c7lB*$LivTv;s0*}$|5y^WjSR}C37Aw7>7)6Buc`%D?l{mQ29pW$MfJC^5(!?g!oOwtYPu5r& z+rKKmdHQZ9E>`vJQ5bsb%J1?=K42O9N0U(2&$Quf`JA9W00_;hVwoxK8X$7+BPK_6cM z;&rcppsztc*xm0+J7q7JzU04{SiJ&zRFy;#_Sml-nVv7~4$LiMhiR#QZ{x;_GpymR zTK7Y)-h@7}xf1v`Wrp^tQYNzd-#T!AP828e%S$F%GJXYggk~wy44e~juiqF5LYwAB zA5rp-GIPbgF9HYZ2tfBf?ssp}LJ02?pGM%fh+XTz;+JUsyybkiQxL-?4v+H&(t4tH zR_gq(VXL6maTGo^njzGVt2(X#OKNvmO2vtdNk)4 zg&~-Kghoi$kM=-~mWQ@8cTgpw2fbO1Cz4(phQra@{d?`pC(>?jCJdj;%}oPpjbXoF|*)iYAc}wDeTKjuYik+ zMS+|)s~hxJz;aE_PPq&enLv0~IHW1?9cAJ@+DP9%k-yrC-f~(HSxZ`c$=K&!&bzO9 zAy{i!?{Sf8)+Fw}g$&0sh>KnoTrpo2_()_0C-wq4u;{IYv`&g~kF`LNKIln9VVgHU zB?_sBW9cq)GLMTTvN%&;VyW8de#Q1r;0uPwk)P?v|ErR}2voJP+HAG0HWd5fK|}iG ztr*b@QSeuneB47*2c`iI!I5brjDk?ys~XZ>lHB?@5C+B7y&d(8xc zhg0|<+Cm8I-AaGCcNU|B4wQ#Rt*JOw-*0RWU>x7O%Quj+T;i_2m*`O2RlZRi+l9C8 z&N*O0XZy$v4B-KozXFElWiMLgQ#-KIi}q@IE3>$n3w zJFkFf%Mx}DPR+IxzgNJlgUy|F34IBYNblMX?&DET{hQCWgAoINU;IJi6)!WL;D?qc z+2ElN@{MO& z+%lTt@R4pvB9MM3aasI$aVyD{pHxhH;;}Jz3bfpvIqlrAl3ScP&0nJVV??9$Skgmd zXR&CUsWZ)m?gXk3d!aeOXLPY73mNnYE&L#vl6Mh%!|@8xB7dqGlv$)Gx9PcX1>A** zM8}mH3(#V(zIdHHVHW$xNU$N} z!%sj`0Gr?=^$-oO(~C3+H;NA(^E8~FQ+}l>kj{f)$9%V2>&5S@#%_`x{O56v6a9n} zb9CvXy8DJxLdpMPB&=n?^w&2|^9GMlC9zzOpT~Xh)t~SO{9<5H_zFPlse-HLzvpqH zyd^RXyhhQu>kh{>S%P<-(u%*aTV^*~euidIPvNGE%|rmBy+8KF=e*#ns?q%Udmer9 z5_#N*DP2EpYe%N znX}KKdd>pckhbGAsNo-I|N^S)3qypLgLcG{lTwB5&*^7{>=QZCax(?8-riRf*;0?ZbIlJ>Uk zX6g)smJB^g@m(ZOJ(po+tHlQ?o;#pB=?|u7pz)j+ykPyOPPIeR!0w{lMp~{@EwFKh zLQ8;M!H-n9R_C#Q{I3HHcn5^~FT4LuB=VAo%<)O{ZMp86U)nVem!NUcV#7LQk0fn> zYz8yqtJqf@1rW+BU;yC7*A~@FJYP7Tvp7Sut!3jB8Mfo4P=X5IQ&2* zS#{~HgMNKH2*2okVp9$5`mZO@MUCEWa+m*=mBa;-sRxK@%oJw#JVsT6yE@3M zPiX5iOg#qt6?buQXS#s_Xy%$waa&n>>cl*RQk33Ow>(rkB>Sa&NX@yj7Y3c4!YrVVj zzoaIR_Gs?3ir_b*$Pe813U~wTPr;-12`Sdwz-BAYP3LnFR0rOvXMFmhWkE6`xyFS; zJ%yPK9J1W`+2ejy_Y7;gyigkgIJ1V)++_DG8|5I;f8b2qsYA@asnov!Y-|t7D+%Fw z$lP^{qd5*fM!q2T?rYWcL0v1=gUR$(UHO-^<6_SD%mk~-Ujf|cOi1T&0(ZyJr=jHR zdv>Df0^QEmEbq893U`D6;ba>B@a$q74EjywXtFbPY)z3M3=4H%SnWP4LAMw{munG|9K%O z+cfufU7_7@rN6ugb*HuFAq?-+DJLZ$%$X@IE=#AgyAd~`L3I7{3NS7Xrg#O!RpEv$ zhgtvR5>I*|hMgDuX@A=o8l}+-K=qhf48RbgCrPn9ioV12eg%lNhV~gfv6|kgFC>fZ z!{DUblR=;$EHRV3$ueL75HWQZ8-vI*2BN@+H5`I8Drj#6X_|*W0x@vQ=qJMqlBvAh zH4bryH(%d1<*6WblZTA1NlIbP4x{b4O6YmYOSghJq7nRQ@!6jXefS4^f5U*3h+~hL z4n$`1lxP31-3z)4>gB2e@C%~E$PcEzPS3u~7YsOS-|D)pP$(r{#-kf&idr^PHk?ZM zHtgE&L?;GyH4@WosE5|_OGJs2GnN_m>@Je^eK;G{qVQ}E{7o?-+ZkPe_lt>H-c3aF z&;)pPBbp?R=VuV0a(5EyBQX+xzE8KWXEPG0VPO3I{Rp8STc7%INH!W(E9GKpkibRl z>@|gA3=y?aZ1NFWx{!~W zBYei7Y=DwYi9HeTO3};TFt<~s>d8qu7Ju=RQca+-^F8gdy;rB6%Tg0FD47g2 zuqnHgfzM>DR}>2Myy1sG1#4GY(cb1S_g+<|5-dBs0!R&|Z+?tW6JN}>@L&qIx`VU3 zLbBM4$S>Ad!yU<)=0CujS}JggVNM~FD6+qz6>unwfE9mUlGC_2j*XhYYffnuH*|l{ zS{~e@;pM^9zvzByf?u+bg6%aKz)6$EL+PCTxyxNjsjMAD5?xZCn&5ZAo01k7LiBsC z$=u1Bqz0~f>P%hOB%_siHrJC`Y-IKK6Fu}(DiCkd8x&!|bQ}x89Z%b*b$43ZO7mrY zdZT0v1qd(19y(K#ZizuZk3>O3*6I9HmH$kc(dOQ7TiVRIBiUlH1>XI9xX?)<1-`YT5ICRJs6rIQM+d?); zZjVQ;TWFr7OTkixZ08b8wCZ*XA;ihu%cAfpK9%1Dk`=prf(GEkj;8+`P2y*L(BcSc zZ0yaU-U7SwWlwVR9slH#c;jTQIW7l`5$tlH+gEBmK@ViItY%J*pzD* zb7N@)WTRD`Q-^u=!$ zIBjP74gxFBw^`9q8~57^utId zF;Tm1rFDSFMf(s{UEJ#I0<+}!Zo%>vwj))x!~y~$b#34KC<y&GVTAuV8Ek|3!4mGz5|6{C@vC+o@R=5}F#e?~lXzTkAH_jUpLNvENcd`zZBWif5Sbe_e$`Rl>n}qIDAi0h&fG*N6B! zS;*O9C_I}RM&lZC0anS2bjA*3ORL)`c_{!7)X*%U0glG1ZJ(zw#QaX@1b@e9oBQ<# z&5ixh80xr`?iV7Qm-Eq}KLUeT&UtP^Gl-SemLbT_>9~_CI~JummRqtExEz89x5JD! zESyEsK~3a>|B78h+tRl~*KGWf^$J=mcnE2m3uF^*&mZEg5PYWCL97JY%ul@)A3{t7 z^Kg)8vVtXx6>`ttxaq$rT#ubOh-6Qy%l~q6K@G()Sd#q}#Z4~CiV@r|VIOCTwSgVk z%~(qxGNYx&=yBPS=cU&n}rl|(7ql>o+e8cvy+N?}a-;ws9W zJU$xpg~EzAxkj=1R3ZrR$-z;>WM(4SPxcBQ{YV7Rh^$&`*^)QKfOWZ?@!;6h@Qmk; z04wJ_-)qwk{H=3JcfW*2rbwu37x3?L1 z*r@Ra`sv4Uii6GaBZ>8n55OB%(Z=(f&P%&i1$fI1yGQOZNM`O^iAtF-&zKNUsJeBp zIlju0)Thq$A4`#eaDJKB;jd0+k~m}McF zo@~%MjND~04s!Lbogi)xJ0=xIGhUd7T9WAEJ_aLNGKCe_w~YrMJ$NCezjtN4%0B>e zsQfIIoHsT5eQM_-*qHsCjR7B*2A)l!;706YfB+nPSQv`lt42XR zGD%l=(`VbU^SJ~HWG0onZAC?JhvT=xk8Ot_!1;Qz1gp!u%YfWwz0rI&F5eWroZlG? zkS0FJg5(Jk|NSQI#sl#f)U6h#crdATmW&zj%uMkDUci8Rbizo*OU$XPv@_l8N$6L5 zDTh=7>gP;pc;;8hTq5(6_kLZ&_maDk#le7kIdd`*9r>+)6^XzcjCF?dXA}luv1te? zMp^M+sH!H&&Nip`1p!vcJ?DH?POri&NPS-!wzrZlT?Gi3!%xyx%=4#>)|d@kP)Ib~ zO+IpRMruaGXU~sfDZ=xjn%PwrN)@#RlkEaS2g_AH0Yl4A$8kN!_D=*TR!I znAY^B$;Dzs;9l3en`GN-t)m$Xi5VqxU8Cao_1xsmnw!VDLc$});8(y$s0u2J6lG@) zd!Tn;x#gPy)Xk}d70n^AWx3$!A8-Yoli_Ki`;%>ZIRXRy54%{7jT;&zPq`vHg^e7+ zA2OlILRL#OoO? zX+9=D%Lau$#ByNi*g;mprAu#E$yd2(X{K?(nSa$cb?J)E-*B{j#cJje=ZY<18hyij zNGmPFE@=fgnL=`*dHiyy5?hrWAa0W|+E)OsQs#Zcu7|)e0O5%~j1&-bRf#IDLyU$o zy588egRy(+rOIi#+&nSm{mJj1c}T3tz%noQSq(&QFc=qFUAV4-R~8!Rc$JobF~+6EO@-vlxFH z-k6h~2h3lQ9bF^EAQ&_(z`e=eswPkS=i)-J3f8EnDtm@w2O0HM1u{#@hf5U{lYQ2> z92&o`mekyDo;EQxt9?+^cZHAncE~Qc@ckcVk$lT=IfQ*(wd4-W5V5~?+xv$GGX|gX8S&3A~tRJL5|qX z9R^10dCm6+SLO>3L3d+m(_Hi#)90VqEM+bpAeiq;swX)=By@e4>ZdNm2VRWy4oJL7 zh>&{)Ot;xQk;M2YB6xu*E%Fk3$9+XYB(+9^?=~>0#iG@t*yY?%6mg~|vi^eS%S;Yl zPLF%eD-_XkruwL^>=8yr)CtO}(_(kOGAGr~2el8SJe~ZoZvVEjGLK4dDS0qPL%mX4 zW!&W^z(juY!-V2Fcs{iK>AM3h^+DR4TW^*0Z$SLOkPk<_B;NU*9Eg}= z!g9$E4>ycqBW^pg*Dc)ZVG?ggaCh9))h+jBANQFG;hJjx_`$YM<>nk657f0gDQ}Gbx{Z}ND&7Pe zl6CdDH>pG>^#vr~{cM4}0_JF`B!Y6E{*H-L*nN#@xAXoBB>&X#iVw`1+ytzU{U8_Lz?cN}69Y&*V4nOlsocw<&O=}Ik0@QQr7UBeM$lUp7v zqH2mT5`;ba#)}?SNS>~q=_h8G0Levje6l}VZywYT$%mcw%Zmx!R>Pj92VS=Pom}YK zR{O6C^>J19D?AK0e?bhB^M9&Yd1Jqs2SzC1xpE1OtakP8A%vKkn^5YlVV+$5HN@z< zY@|8|VBkzk*OT=V#kDYx8C4KF9hI3tDCjFeSvuF3mbyA##39R3cMO74Q~ zH3YF$8NLFn4E~ZfR7~Aep>-4)5D9D_YIxpi$N>;rL8=Sy(gQy_zghbQ%#s8Mk^KR> zFk{-grhOhXp8J=-i<<9`Ju%c7&wvyTqpDdBXvwdbTyXHk@B5)tlDaPl`{}6{zpim9 zmxNRJM&8@n%{FaMy;8(1irAuUcN&0Ndl#bMDyp}~A#Js>}Rh(Q3(Ig6BLjM6=|6um3vXuMF2&$iJ# zT>icdlcJI3UXBZw5y7ZcIJ>IcZuw33MO;ai^tw?o-K|2uwuslUSS-=!!9U5-0&jm2 z&K7a&eBLEd;JekmWVlvaVBrZd<(x2r3nml&V0d zW0jG}llZj#(HI=g_pA{_BVyzri2ZhwTV}3WJ7e~$|p1hcI*8Qr+s8&-5tD=HlxY<|7# z-d&kL*#1ahVkqKdVg6W42t$sHz!t$A-`*>A<16_%?`fAh7AN$-*^5fEh z#jaJF>idn)T6hcB$eFwrsDi#OSPZ9MzZ;g=b|27sRk@Zv;2*p2VR-oaXTJzl`uPF1 zdTfi|=as1d1Ntat*1Q+`NnrhV!ok4Z?@(d$K(Qmxx0xGqi-H;}A2};8R^Y7y14KpW zUwd<|x z?@^P}BdHhFN6n=l9L*waB@y#b-!=MlYc#U(URs<;Q9ZSH3)Nt}7yPk0#`ux_PZuOv zdt$7APNpnfTAh)U3>k=QdE^L-DR@(Y^ep{3Z)Or;C+r92jzp$wT10}AfuUZpRJjE& z#QY8Re_cOTX^L+$+(>$;&9|$H=q!Ekbobo-`yqSA9r4Itv?7DjT9C=L+xU_+pDFrD zilZgyyusKBb6MN~q6afL1r20-7!u=&HGS6qRKO$%?nYs=zox333VP7$e!_Hqcg0_` z@k0bJaPd@a1&%^BpR?Zb_{~7FbRd+GsF9^*DL$SSUm1($`%6zjF zV-@jdNntROL3li|kEgMLc7eE-N`$I*RR>R!5KZ`De)96Ufj_AsyxPOX z7(L6FaLms7awR`rwf$GeyomegS7VHXmkZ!>16S!f6P~@o*dEGGoD3PdTwFO?YQ zeHr~3sWt1Rdr>%2+O-V^7I6}#zF1VAMncjOy@t_~m^`cBmNeSGb0@Qer|LyV*DUy~ z6*fHZF4K~mM`qknYaC1Mf34KMRD8%;^BG+?OZtR*`;QSu6|FVPamN0S6aVC#lBAO% z-jx1#f^_u0NXv1FAURak!D_SVN+dAMWTjNNNid+}*4!xa7Apwo7K! zu^(+3u;cV3Q89CIhQzM?VNhQ*Mvg`pFACgrvjP|q+-uVOqdd3seXQOpeUEEuTU zqE^Z|G5fc&yQ!rsT^X#uNO%}))-I6(_tF!T6C4x#o5{Wk0VUiHaEIK7Jp)jhE6%@s zI9l8@`ktVu%jT79tx3?1Lv(pfc@5QoaMczy|6GOaaFllhd^+iMe`jNTFE5qVKdc1w zwsOL@RgRzM4{Y<~IVAP#*YuOvHS%P+qEq+fKCpxhy9tY@RkRLL*d=}ARkbrXpe5Ph zk;BzUbWe`xP{pukn&q?P+;&vZZ~vpHBn;%p?*8&*P_0&JUv`>^eVR`jDH_gR&iZ0H zpD`ey*XrJ#UETkW0^M-y$E@Xddy8L31vy344ULY z70=?R{BHX$&HbAcqcfISPF8?Chzo!LrV+|#G)C;`?>C>DYUJU4~*kQ|CJmV}Tn zd^C#EY{#%0at>-b13T@LS6LAMPEJ=NJW)3+SN11+PnstnjB~kp6l)rkU0p>{d-1c!)8?5nk-7Tc&_~@SIJiFUY8;biPlBnK+1U>O0 zBzA0@r7F?!u%}~QPVB!aeu5~64h@}=uP1U=5l#4Rvj1v42pf{nnG=SBzQCWPEiEITF}}jc-`;RX%5&&;K2=Xz_c{Z9>~jzV4#uq zq)lp8%Z2EO7#NfXW*jB5#_xbr|B8!1bT&GZ_%iE-lJ}hpZU@`Pf>~O1Wf$)2fimxUki{(Ws1Os~%IG+IUKqQ;6(AQBUTW^eCc1F-Nu- z0IJrOw4^ZNs{|Ae^LhFvgltcwUhpk#OuVU)UCooyE<}eWu$z={{p_td(|WiH>51nk z8LV=k?xtPuP}JkN7@&o5)+KIa#w;WRg??&PS6TnG0zR_ia3O)d9}5Gx9Du4S+_{VTRoE(XL1b+K$~X|w((!3gc?7-BeG>Jlu)ub;n$2I%OZ6s!fk)hoH=YtlTS)Z z3=u3n=;62$?1$eRO(ECjk?CG8(=16ya%SWUz($~JBB;9eKs|y#+uqn&>WTbZ#`Pt8 z#CmJTT-`?;HfjLOW5B+`9aX1_j@COpyAqgqVwK3^?pG#yzs(;adsEC)QMT*L&6ILB zM;k|*%qUXMBm}GE{B`xVJ#NlYSIFlD?vA4mZBV ztB=eOifLXo%@e{{FLb8KHT6QQ`?)6j?D1fwxBKN4FrQ7lDOzOY3=gilFkV@&`N*{2 zw;jYwwo(v=mMSq&g1WYq?5+798OTgFT3Gb_7Jl8T(+n*X^sZX6mspV9%LkymNRL|% zxsUJ{Qw7_bj`G%B(1&NF7%HxFl720qmQHa9Our33`V64J3yH`b!DabL!DN9uIfwS~ zNQ5SX#&;fj|T|_W*?|wiXRpRPcQOuF9e&vw@|; zx>w;$g#uFWcc)Kc%IX3y(ocI&i9nak6=n9up!Secc{Qncebo1q()UQ`BB4rF^r{&= z{0IjiL(~X<>ll@HRwr8#83E6^KOEE5n5dghp0*oX&}3e`Mr=vO+Xjv=`G#=lS1H{h zlh6Dp)nAkqN_q6cGn9D|8_-Gdlf%6EAdILw_8AW0sm0!~V)HLWyW@D(z<0mi^L74( z7zUbXo$BtG$LVlMV7SLW(AnB-c){Ar@+z=-QwDx)r#lYKvg=2*%h8x{bE)J%B*9zm@4$#e(VDJcCy76pJ!vqjG526 zPmsP|ta1Mil4{xswU-cIC+TRL!1{LcXVcU8_=zEVe#_+Z${$}{342!_?JsmF9kxfP z1)>7o$}QcYtuL#%&)Ee%?`DZhEVlR;Gec*^XCw-;7BW)NRpe(u7eDf`F=iCf_ik8@ zJK8%}sO{H1i4%jq!D}vg4WmX8J6nM8TBN0l-}P4%k6o#HPG;`Ou&QyJvFEkR@c6)U z1F2LbPzTV#k-+HKG{16god^J8WAX5*lWZc^NjY*7Fk@Non^xxy^r?=`ZXdmGSgtQd zM`N(J0aEVYYsKZz78#L)%{4$AdYI`e=gQG!_^s3OVl@c#qy#QVp486``d^QF__UL^ z=5d?Mpq5^<*#NW&RT>e3u9W7E_3}vq``W9LZ`_R#2 z4n(p8BLB8&ZBE~RR31m%k*^;W&Vt>RfUAufM5D=^KZb8C_|!;r3aa>4uvfVM!cANzIn&8{_!`Tn4UsgJR67DK7t%qlqF59(#|QL3G4jL-ytsW;if8Q4htolb8gT< zK-y9RhxnTijDCX?VU`q3z!vdq0qT z$5K(pE=ZSSS( z*>`8Fn}FbdrBduJMS37ECLaGF%R>>*@B%%9qxKF&-X@%;#nds6Ywlgol!1sG%ec9p z-md6FMKp`2XPmXCz#Lm&ry`dVse2Mx%J0SdvwL->e>x`NhrOwo)Cye*9gKd&UGwiD z&`GS4Gl*v`tW7X#D6$r~^dT*!@M|~G2y8t;2x{9WAcnP-Sq{!k&kUNA;M;`>-09;^ z?isi(oo*EPjAYXG`-gLRXXEdkFDmr_t9U;TBxk|###G!A;@=wzdxB=jJJ;b4nw_m{ z^ip$@_wp(Wm~8s}b3e{h|DDzOlDFij+YJnC!^7e}KTksm2^5hk1U@#mzbUE-^(K!| z?(BLOdK|?{AR0(%ds(|TVl*`wfG1w``;B0_d=Nb4m{NTwWxu5@*w;VfK40Gyh~!%R zS1%`(E`GPz&ZJMmM=X{)_d^{yrp?qwK`_fSzd`us%n1v+2m{lQZjNwD^qEs_45U)> z3of}+&9MF@PX2Ri=_|n6zept+uMBtBZ`4{sCB9o6QM&!%QLB8cUB7=r8{sSBgZ?pR z`K3*r<8zw3O?LWZkxCA=L+;2Kd7Avx8OjGJ^t8)-7b?E}1?pT8E&s?G7OM0owJ9f= z2!@PXVF@whHTpd9ZDW&Sbq+(GPDkoZQ8B_31lz@I%}xtKDv-7Y(G4gkoW3qo(P2#N zeXCzD1b_|OnVc;91~}JlHpI_pEgWA%hd$z+(SDbcJRNsabzT2;PcRA;I(U2qfRsL7 zLAty*pCGj;lX-IU&i-kyfF|eN*6{Gh#&a9XFu;x(#?X9Ip{MM^@w|??-Dm%w95$TS zHd^f(sW{-oqmG2sUYlt2K6B9MO^pkNBBMfV7%%vQTOqra!XIz=<{*BYL(RMsKU^Z~ zR^S%gtkG^t^uFm>)kv{;AUEB|iXoAv1IN)iEd5z2tyvgUMI@=bIYuiA2z|duwA2C< z?0lv-;=mkQ7LJM&J1cSJYo*r1|4GkE91`YTX}_iy_g++jB$tz8>c>sm@Y^xn>mgY; zZQRbnF5AnWzfLbdLvCAI$??@_GFNtXW6)@#-~KSQnUm3QYY6+IW>U??5@&e(kB74f z&8l(XC#*(y{#t3$XHrgmXwXq+$C57gK(exsM*XXi5j0>AXe7t!jNMV#V~OSJ^ner5 zYRz!U{q5&(F;8Xhh?Wb4Fu+lSq3%6dYXHY#-Isi$1(&i!Q&}uue1(cQZZDQZgsV$K z5<|6{kgA%~RKdlcYbOAS-!ZZ(G>=Dh(Tq@U1ii~ zy%y(ScYO9HHpxqn9&^ zC`s_3nC*J#v6mrL3LaM}HKSTCRANSb!TtgOBP~#MYFf+wy-jdt%CZ$Lk+KmzuJBac z9jr3sIWf#ISli&=cbP-iAp3W98$1U!L4W_%0f&gXsH%daZwPNVtav|s`Kn}P=JY8s zzYt?7n1jz*>Bw=AvDCFGcs{v{PQ`1O>4^aO% z!0J-hEWMQROdiD`l}H32hDdVen-2?f_#bV0FEUhXWrlu9)0vO(*L}drvBb`uJyLHeMumaICa-DO!8D z|GuZyiM}{2=n!iQOaL|V$mXl=j|*xnC#~E}d5Iv|S5hP;|8PItPYh;m!?Fn1cOKo9 zSHS^ZRTK+t(J)Bp%sYKxac0{5P%tZhSUy`AJMnT}0)W9P*G>#w@&g%Ljx=4>8P6H4 zT2OiKmf)q7UGPk#;0yH%5g`5Zm-71-*ylE4#T8XH!_D}m4)3hy4!Z^tk_OoW%ICdu z=LfH9XTBt1zGiq5u_^nSBV6l$B_55gn~G9%+;uCeM-ZZdkOfP(z8X%&BP7ZOAl=P>Cv>p@U3Ns};klpz$J< zLK7m^@-D23BXse^PVGX}kwoCy9vQ@GOl|02lJh3(12UAg$-d5AyNKq}PJCoN5^AM5@; zj+sjWAdHa&J+0I7h6Sz(k?8l0u0ckHh(DAGkMZubq9|*-bCakwd{VY`J7q@xw|L;x zR4ab1zI3!$+qE%+DYKDWGmQqO^!gd8-O$o>vDguu==i3~!yL~&UFh~*(>juxLS|5& zkOLD-Bl2g!vG<2E91uhP0v|TTqkwYy(b${w(~EQVHgX-ZjV{EH(vBE{o{}uOxIU)( zQlDg_CbhP2-SVD)Rl~|QMe|t5W~d&tvkp)2@NeSEDR&4v7myOQeWvL9*_ffr^M$S{ ztp4Z&mNfHU^Gt;D?toz;MWF)`dQu1sYR=zu4BEw4N-a>jFi?jW_#mwb3K}n_vecQa zB8h2i)jPp+D#Ah0`4j%TQmNsRsM%sE0S1Z+{Seq+wG1XrlfMh4$t%@RBf<%W_xf1j zE1EPK&c89H59@OU4dbLp-s=}e?Mha(vbJ0+CQbXn6R#^@1HL^Srcg(OornkTjZhu; zju(dz{jJDs?r4nAk)Kd4B$mPdZv6#meXYWK80JXfkvk?{2!W@&X&GB8d(40(NY!N3 zJDxXr2FpPO&?i}8_E0;8x%z&sg2x4C(Scvif@C6JQ{h__xLaNUZ@Ye=-V3`4BSF-k z63n9~2-FrXYVdkj$mJ(SXL^J+=+?~%aI+9yaoxKzmWmD3zM z)UQIY1za>a+3Plip&y}PfkZ=aabiQsn& z=k(@`18U5@*;Vfq;(Q({xzrn(Kn!3}fyy~j9)M#N? zguP3*6j&|e=mSPW)Y@!N3F+Y^Q;WPVnKABPCU?(3g&U-q!f|HgzVb~FUZPU6^4zR4 z0XpNnThO@lfbyJW+-dt12TO0rsmwQs052BZM)kB>$lNV4%t?7;XfC-NZ5HHyEun%S6Es8D8YBmxcm+Ir zjiX`yX#57SqP+^#K&MAXRuXsx5Eg}L04&l=#Ygq-Ix{q4QdjZhMso^oU9VWsao&cE z6EOAxk35z3*kuV2({5c&1K!zVH|C*^_S10I5{|VET`}ul@K*&OAdd)95dqR@$0RC5 z{W*Q~o(-93jD4Q$sV==cyo>?-BVDj^f{|8~GeWT}U@dn7dQy?RWh3#vYfbgO>4uOG zYuQ;{Yc1Yr{9(E3v_IyGZ8u{e0gxjnwWu(x81G1qByuXG*IiaoxI>;M*B==5?ReD4 z8gQQuH!IE6vglFhmZ{e020j=4mvA4dY( zU-WC#GLH86`_?Bw6|!s*@X%-Ey=ET0zd%=@rN&ha*-Qlz6=Ka>ODE<(?nR4|z|2Qe z2c!vj2trBWFmm$k;DodE(+`rsJA2IRLgi{CO4?_ZWS`NW#=M|Ui#zAX*cB$7 zUd1Q`LBo}amvgeTSBM8yOcHPDN5|+!Fg;ToOiuGJ+TDN0Ishc`WXeH>9SHCcB8C5i zWr~!Be_HfF)zk(^$=$EMA+2b*VLpsn?^r~iuc!y4#4qT&(c*VJt1Y{~!SxAPA;LfM zvFWMUw-}v)M?Nzt#9Yz>?;B3{uuLWYy(J?vmHh}ey#gxho=$2&L(`roN$lal?7>B}+hHGO1vy0>x`|Odzd9m(=VD0t z1$)3Za=6bc7u}&5Br0iGcw1v5Ff}+fi-TK_SQ;HK&j5qxfno&Kk&2GvF}Wh`Ug!m3 z#J>1U+-n)nFWjFp=$Uu_9W3(DWYGh+nVQAo0;5;tM}_!|jl0pU?+=pMy{K69u)SZ- zi3vnRXJ{XbEvuw71`hELsf0t7q%7=Gc&3u`o>t3IavSrC*-iq#nl&qr86-FV+%p27Ej-hD#)Qd6uvmo+zS>5Tm{+sfIce@Ah zoY*2);e1#5zN?BBy+lXa%q4Z^8FI^dmQ|iRygFM#$wMH=N?!FJ!o4#pF5}$0R{#sW z%|ZAuTb%RNyNtu;M9y)t>vM?A0S)VR<6fSSE018uezLH;(n0h2%rqL@G8Y3*#dK=S zG9z6OeM8#J6Ly9|)kh4fJQov->}f5V50MHq+>|wkf0CD{UI@WUU1I6S)+^7|q%`EC z8X0lBBqh|8bl0-ufx2SB+>+_==(yRKS?A2#4y~WsU!eOZ!uw05ZKm0R;bTZ3C9kmj z+7qR3M-1mqiF}6rRJ552 zQVx!g&@{gH)c$Y5n?&mt5iHg(7Z@lX(do%o07#>; ziDufmyD4AC{dE5RD{tLsxoV@#SW1X6tU4N_wN^GLf4STV&?2LU?6@4J00OkFvz$K7 zB^IgOX>K^-4HLNG;Ha`?ILaTW!Z&|VU%c~>6Ri0u_jgo7ft`C{y+WrAumL{_K$9(^ z6(-kX5{nQ3st`#6d!NK5=KrJQ!jeB!ZOu}hoJs;$2BXNjPF{`1V#Zsy9Jb~rqCo!D zwCn2KzsS@pB)GCC@<5l@*UB~t^dlFKdzI{Lm2nC_yzL(@P#^{DMJXw5(_Q;3Q#z0l zD2!3H)zF~or>RZ-2|$3VZ#1&?6S@^(Sr*KW@V5`*#pgb`zXJZ03m`Ya*j-U?(LCfs z2J(?7nLN6ACjzxuUV03`JC+-1S53WrG2T(0~T2Rn?Xhb=NL_i?t-F?H?o=7 zA`TI#r)Of2@7?TbdEwcVzOef5F69XNM&Qq~s@MYXt|*Ye3Vy0ED%KS+G||Zc3h#_WAEJ9B0lZ=QFz%$Xr`w-KCYRWiN#7th0v585 zTF3@1Da?d@$j2$;RhLX(oVz4K5mFTybFdFfWe}Li#=sTmk@J6NPnJ}+2_{C#)P(^k z{9Cfu@6s}uQh`oB)g?T^rK)}3p&Q!!3}S6Ci0pS8^ul1_S&(#A6M=y2ue4PUWrP$Z z3X9ds?cD6?;GWFk_k0V@p$T=n@$cV!XpI95Bv)PsADWCM?r z1PbT0eOFVsk6OLHv`crf5*QRXZOVXfq}7;Cm3LM zkJ7pS00wJMuXtE^f@oGZpFg`(khnPNYew4s!dpj%8Kag= ztzCo*m$+#0jjVqm{HYYRdUqqXkQAAfcR!{*C|3(+=N~a{PC9)npYW!ob$Oy)-(Smb zl#!QpyM{$k{pRVB-_oVE@eYxF7_-x_V47j`6h{TIpHFHpVpXi4sj({{wTW}ro;y^N zkKRQZF)e|XHNbd_#@2doiYz=exe^9K_fxUJjDf^>^*#NotJXFB8%vto`$FbBWRXFS zcLjz4$Q^O-Ma8D8(AeAN-UW@hQIf~daZQ1xX{9kX201=}R(u+!n{blqo@$#&V=@^R zk&41!8F*!4^P2iClk*y`PDig!KN>||KZ({vU+nX2V5{nQB>Dx31o^ruK#XEzx-iJzE9`LlFfH?x23+}j*NeA8NzLl2-w_w(D>uV~@ZybB~uOUG8 z9OPB4F7`X?Hokx}`Rln@jB$@n)E9N7ixHT`ySsPjzMZHcR>^m^OJiv4DHO&mn_^}2 z$^Mw3%u8(=D&s#hH3W3|54aA#NM_w2#xv6t_E{F~Jht;BBkNI196RHNBgazbwMn%a z>?}uULGw4Q1wZl}o?_jwRt(tt+55DX%__X6FPM%?k-+q(z=&=oXqfCBO(nXPhEu;} zU8$iVAZHfRENjkrfAFPe#h4JT6r4L!0Wq=3J0b_=_o8s(-ZLl4fZ!*s433{6(-qkY zD8yreO)RoRXN@tk75*%B_M+va5<})FAPx{yq%3a~+%9lFRG}6B003eL8t9h!6>-ON zMY_a%$)772=)e7HSmYw*-ek*x@-J#^PKc5-scBC|9fbo!V^s1QNy*xCu?HRd(nz~( z$DG-6K2-D+v6$nu!1<;3>?o09NK!TVrEC)2g#zeFIxvnY9Oat@Q_xb#CKnNw!_3@; z9Tt*E(VjS=Y{}h^0AiG&`(R6V;W#oMr!>RJF)Cf`U*5~pJ%ubHWtv5d2A8`Y!@emZ zU-YR2FNFYZZ&6KvF%pQ|Y+U8Lljsc~LPE{9MP6K=nY}SWpY&Ep7m|Kv?a%m9#k|?F ze-|86a^}rR0TVqvXs~QJ`F=oHR|%h)$fn59vc{;TBOP1R)1+rHMoR39KXiBW z;+-RfX#CXM8V{8R=}bBda|=wdeZ*d;rfJdn4Jps=G+m42NlSN;1* zGV_m>MFR*zknJOFPwtKh^rkAW*_$LPXXO;J>{VuE-2D|tYCs@Ji^w-Q=shSJ72_)c z`Hhe6sHaMjG9i?Ylz4vaZTHa!o=Br=lm(kkM@)0Nx6>%_8&@R4Fs&DmCJL*2-pl=Ga>fi52Y+WXjvU& zJ#&`yqAxqkK35*CKn?xaj{s$xucjzF00d_zjP@9(ZkNfzsKDxJ9OV@PVKMp80OBPf zV?6hz*%+5%wnuiMof(i7+Jk|QK}{Y@$&74T0D7Z*+Z=6PbN&>Hj#1TLU{rKx$whe+ezq=|BO%AA3H=f{hqc!DIYBl-$SAgY~CkKF1#PfEYS94=2;oo%_W< zGUSm=A#xQ@1a&m18*y0AC$GIA03AaqUzmz$#xaj$PQ&xa`qOauD!(o$0ZBlhC_h?K zBhJdkR z5Iy2?{HuCT`DTNhj?|IT*ssKBfN*JK!xT_37y8qfW^ljV6d}y-CtbZyU??Auq$^yN z90lM3?M;k=T3&&A3T%1XB;$r1DY@BgfH9u_qJbyWRKSVdx}GR+mfQpUN2j$TkRen9 zAJ(5LuJnlT2UAQsSR@~E9;9=Mdn-wBs4>9j&{JCyTzf7B2vwz$Qg|J{lmPWR?peBp z@ARg?PF_LMn;9Y*Bt7uB`q9eUo!uL!uoMk37b4Z$*8?=JcH1g}jmP;=;H9)9dwU6$B(0bCL&HG4ygdUWU9oI#%oM-T++OWj3u*t!od&}qf4!8Tx z=kBgWGAs*eT%2wr@}dHf+Q|J&9Da1x3YI86Px7EkWc^7OD`Iod=O2|aY^|JN3P zjw#ZOvBelaIT`lkQqBuXkdK(C1MsFRSzE~k&sd{nz&PTTU9#QxIN{$DVllP)^bG zL2_8d8o%A^f$dJY-}Z=M#?=6Pv`#Z~6j6|P+t0N)Z*5PHnEUh}{;t$?8(YWG2yps= z-Z)&~eFy&lTA2fHo=KbdM@n_6cDt4FlB?FEw`THYa5BgA_M|my{Qm$TgJQ)r&U*A( zU|ebEdF#Mmr7GcUNM2Z-y!|MbYTCyde-~CgIG~lc$aLYwtVm8rrbCl= zE2-cEgGILRvbuK84{BE{?R@_LA&@uv#%0TqyBz=&qvf=A>dwkNxTT9C&D($*89u{~ zDXq9!MhL=_$^QWBP(}UK=p+2FL<4Rll6|pHxDE_zjg}(?yJDL+D-wb7cE@^is(q$3 z2jx{!^`Q-}o``V|_T^P=+gB9m42J4Lq;N1>tu`|g-Mp@Ls2KoLZHNL_WAgSC6s`FF zL#_91mPGCRUtZLTS!~NEUWJV^Jgu7&+!M#)PM3JKk9pv?-5*Lqi__#a!g&z@3XJpb zQclVHq{h`8^Y2M>y?lj#n*d-BN|Hrmb``*4xWfBWur<2$F}zWs+W4Nr=ShFvkeP+O zBm?F8R|)XiE58%!AMlfFrCjNe3usfe_=Yo&*YdAawj=HC`1_#a+luA96QWJwtv>z> zmPcu3GAK@V?(Ap=le2x!Z&8y_@h6QW@W8u!J3DAT(=$iINPRLrIK@w3*Zvssj9wdS zm%P*UC=AevPF^-s>+g!v)_gA|?bLoE(XM{We-2`DN6N~38kb7&-OZKh@ea9mmv`(0 zacv(YXg|+DDceFEbh_+i_!8z%_(*(HX>%h#mwKTPl0XD-2cY^^H-{bO9ynKam&v)D zCP_PXf<9kNdsj(!;SEa9#1}fRhxG-t{?WmkE4YToBzDN`YHb6-kKz9S?QK175@D#T z0OvW}!>jwBYAhU%{{V4?@Uusb=SkAMMSVQePqPuDIVh?II(>Pr^HW_m<4)9K)!0LC zBwky&I18Sgc&h#p(cim@tM z5szt?TCA5>Fi$bb z5D>oD&!t+?yfb5@NcyCAS2q%DX#BZfa{Sz9@S~vB)UJ*X!n#=1ei~}}YfhHi@8lVC zwOa@7=iaJn6KXmY$1mb-KEhv$8X8S&6U96pZ0Wb;-mDrM1t9^nF5m z-7X7+QL+mpC|M6;0Y8Oyjil+z;plX4vxc;c^nP2D)Ea`r!`cRgDqQJy+azPmkCtFP z2c-gWR$hl2;j1fqkBHjzlE$($Y=H{^Li5QP{3=_WH&bsEY8QSB)S@?1hBq*`7y$j# zk;tyz+e@&s)#kgmjHBG0(nwo7y)X|-iswSnbxYTp?gE%xGe*T2{dVGmOD%m)Z{hBw zE;Q{$Zf#((j@8P{PyrD*rz|VTiEF(i%BG-Z$Kj+v_<844J@5cMD0s&y%uNk_e_5vC`2o2 z+hZm}!F+H&lnD%xLfETHes=q+F~F&2LOh+%=1OpOW1#IxBuXvgjwIa28=D`>pEN7E zBZQuM$OQ0q)7cY9*asXnXdf1Y>lJle)y(a!VL2H zXJje&-=#9Tjkjq-%#q=ryodRFQ(zoi07YLNa49_B2UQ* zo;~yFK`4!%7G^lcJF_2ZY>yd&IHO&$;|xax`;XG5mMfELo0n=2x|r+rr`^SJS|^?@ zs(4f#dQcW2l)%p%XXJ@7&vS}#F&W8W^s6x=ERstsWu^WV9ls9L$l+yy z*rw@w5AOYaC=m`eTA3wmDL*0#e9AIln^PpPFaT>X?1Hbf8NXc1E@v138N z9JVPLkN~l+)dMWmZd-Z$wEh@J^QD^JQ?qh}g>lD1XbTV(fu`7mDz6#nezefBNi!5X z6?^ymD$7F6H<-$y3E*@fQb%q#w6`E4gTju!)WC`qN8ira#~*;G<5JLa!BBMft0`^6 zJeUL?2T#(EvoG1iuEUOtng&8vMuaM`5rOy|Q6k7fyr+-hQT;!aPWE9VUG57WfK!^# ztEMCj=eMN*K;Cxc-Z6o|9@OpbW#2kv5y0t>N}a7INdt*hq&#ENm+aE4=jRUHO#o8_ z0!yw4=(OM66aiRy zpfFq<^*)q-`yNmkBe>)Iin6v*5< z_t`#ChTwGVnnQ2DZgY;HeJKG)F_IJwyLz9cC&`j~Rn~!9403742u2v^*kg_;0*=r< zhou31TLAu5a6xW26TjF}eVzcTo#d0ycAyG?Fj1E2&BLvu6>#vySI^!)W2tk zb`j1-I^vKO4)r5&`Ub$bA-Ljy*=wG#f_O2lA~il+Tptg953?hSn`v`WAIR z_ra~DNR=LKnH{~U9hwvohWC`54#Jv)Y%I;!)7r1%B(@|V+)g<3qEw7W8Y+*N_4J^g zg$DUx1FrMhmOwy`J`c5M%N%}mP@wro6uS~zqPzg2m>KS+t`lQKqx{G+WsKzqH*(MLapXvc@Tc}T!s*vHb6-IN(_SYvPSibLK109_2|cbTP- zb_bel8-y}RjC2{R@%)z0BYzeJIkO#ttA7#TQxsa!nP^=s$qUyXl{weTwv9j|Cnwgl zt^rt~g!ktZ>#sBI5XFte0l=gwXud{m!eh&iW-z?**XdGA7n^q+OVMyYD$tM@)C6ac zzjxRQNY3l`cO0)lNUpzfGvke(_vPnp5G0Q*k|@Fv+;pqfrCLeu2d7VbVwr8UTD;_+ zm~gZSHGBD$AckKqSvKPt3r$3rS+t6n-OXPLW3k`6?;qtv;g-%cCk4BE8ln@jUWEsZ z(@&50cvkO^!j|GD^5BaY0L%rQ62TOTOwDoOJ9(Zc-z;8F+GdLuUC2K!8LasU|p z1xe&H-|hRMKb2b{Wz;a-9E^PhK(|)VUY5IHo5)DF9By{#qul=hN(~*a^Zbad;dZ%_ zMHo~BAFep2+QmPYJN?nqKc!u^n7l*l}_S!6v);8HbP{Qm$Vv=;I# zGd|!H@tPLiWw6U&2JPI`yhmc&xh#59=R&rr8Em;21JF_-d@IncCA_I+5PSf8Q?4!Y z&_++l0KgSu<97H|e9k+13X)8l^ihV|20-jO3K3S)-iWC!xO?S8z){9H{3wRqTJhMN z2>m}!D#UDl*z8V9j0|?B+c;L5Lb*Nv04h2Uck}#;_V($rSy{$#ep+f{O4|jZh5q;9+JaWg(U3i{7IE)CF*pDYl($yQJfWW7bb9*K_aJS8 z73y)#K1B_A97uT!jG92!jd~&(E!*vprgO9m3{ppK4f$5&uiOKSRfxfR+#_QhPp1^i zOrJ7TKPcySwKCGz=lKxZK^bR|<(r?j4#<_Zkap}@uEPa-&NIbA{#y#mF zL^qEn-P?1I!lXpqsJYMG1n2X`M`}rF++!Fbfa~)aY_TYv_KpD+9BT-%f0rbm%QY-p zg`BK@pIU5%lTSq;a&!4mC9?DhVYgdIQv;LN`qJISADI#;`MBfhPr3PGw~fXJQ%|33 z-y#8wcl;@h?QcO$aQ^^kjC4axfq&CxC22L~neW*+eMj-V+%87~l5{5iCJwFUmC2jH@Z~(Q4 zEMN@v98;(AnrKuJN$(nS-<51Dv$oPECLpm zNeJ4D*wP_CZX~XK2dDWI*clb(W?Z=E9jTSq<|Vj@Tg*woITX+_rySr6;Xw7IjHlS8 zEHcdBf{ICewYE(1%tz2rLfhm^aICiQ4n0R7g+Aavn-Oer(FH*&s+d(`^Ar6& zsf(w`bo(|#2>G9k9>7$W8-CdkRwhm|$E7l6j}bzHWPNuUS7@ZVQH_WOcXXg1`4Yw* zZ=3AxoDNUcnFjTeRf)b<;oS3zWNjNMSZb@#_eU?>- zs)av$)Ou4{rTYSe`B(Ultu!Vqb0chw{nZrd)=#m;=Nu~FDvsirJw8D^j%}b#zFZ&- zo|&mG8CqzSlgffVgVvjLC*2Fp$zimlo0gf^w>?s5P03qIFZ+W_4V@UC} zSE>I13W^trq?Tz$)ltM_jMR~{t?Z8?@0bsiFF{ej#ad$VmXwa20Hy~Z`E z4@y=FwrcaXbQu>j68OZrn# zv9yvnlO%oSrG;GDNwfEGuU0+(04i&VO_1o30r;8&psx6}3j%Sw=X3oio69JW#5PBP zxzBuZXt**w2<*EcUW?rNQ|2wYHjy?&Iwya`P$3Ijw9B*@;f!@XPZZE2c}QcjB?CQ+ zeiZ2&H!9aDv;p$Q1vMo@aMN5zpO*-NfE=Dfd8Z{H1BB>vQN|a@FC%S0ND3)pbWqEOyiwC$doQ`k~4g<|LDl<)^-r)>%o z=G`g$g)l%}&~eVyNfb^r*|iTyRwf zr+RE+7ngumHS0lE9}IXb5=;zo)TkwB@TUX(;-ZK`cOSZ|{zW`081l|>o)_AX#{)Nz zHU$fuam6V!5IFfqwKSpffmt~1#VaI)BX1e#2c-ZhW;;tR#TynxRH;gG@Ya7Kv;Ai<3J0vZQNVs z?MP$7gS#Gp&`f)BN6ns@;8JER4W#jmdI|t}R?6}ZImT(*rQL?dwg9O1C&{$@-A|yW z1U_j+Y@GA>Pyh>t#@>12g<*z}ug%(>vS4)1Dcojd=vEg z3Ns*Gp+E-|&C9oHFC7UqfRG6HD2=w&t1v#$s)qm`YMc2%f=9xDIjgpwQM*^^>FGiP zy2o;yBNtE?!u?nV~yed5nkO%WPCScC7RGcf*&L z_ofN84T{RKg0nLZx^ee^3cGh1XSI*}(v`vOl{Lk{SN;(%130J$qJHj(ku3m8V(XX^dq1RFL^nLY`tYWc=KY z0mn*k)3s=I&1&Ponx(AXZO-f43!(C?*a5y_^9+IRD;reRA-wo__i(OSQRz@z(Y^0^l|(womU<6&Y@TFsUBqMa7r9SddR0#ntZm|d4Vea1UzNw! zHva$$e~2a$c;mxt-+5=9N7Kvy0P9quq_wgoyzxRqs$4~7Wp}APrUb&$J;6KRoQ{2| z2aGhhbT;u^Vdk}GScuz)jhTdaDtc`vky&>7&Gr4xu9n)Brh{)~a>*dr4Z~o6tj7R@ z+k;$1xl!=rQeEavnz9|tFk3Q%xQ^Sp&=J+9dK!4j+RA^kYBpDPvEBwYmoi84OjLc< z0FoGvnF6lqz9L(Tr_gU~ZZ!M0i_VYF0~1E4lDkiDN@t9T58=(@kL_4U{9RaWp#uhXX8%7=pz|Tzx8CL&UZNP1A1d zL)^9d`Bw0#!@Ps49OG$T{*}gfdfvv#ZghQXS-jG(Ebgawg=9$MD(+n*k8c~_zMc9|wj;Xv9bTWS-d<||0NFaFgt~RiDZDI& zU0FR<(~dnWUU^p9X|CPE!)}G#vxl*$7%3J1!3 z)%84Ly1hc`_QOonwLLm7wA{f1yb%8Yd69S@od%He{;YF<@RVydHp9esS~QEKIbHIZ z7tM_r;4?*xj-$O>)I39Tr0UlCWu>9J{?mp@E!`U&pk1KnqMY)33iHi+OKnrb5=u3j zy;D(mm5rQB<)mx~E@e;$%Ag((dg*mNSm~PQhBW~b%?oL_D&{e`qLqscf!I-Qgsa<| z)tx4jtluU4o*vfhg^k4VnJt|p^COj4?*(iRnSDJgA5GWw{aVKM9VbkS{R-kprIJ}n zA=*aJoFAC=BcS4}%Xbfnd_$vMX~)jB(!ALvoB|NMsuV`K10(^H=~-F_h@sLSS=046 zo+w7Ia?#8XvNzqze53CUKMF{hd$Cs9#?0O-v_2PYPU07WTS<+)_WT!F@&G~WyZC*v zNqMSxgGzflj}Y10#bY5G)6I~__-5?t%j z+32?MAhba3b9Px{$sH4KTn@df64%8Vl-f?Ws80k@YI+*VvIRThW{r0Or~9WBPgWx1 z#QKVOpY8tuVcQzmEtN07pCGC zPBUGOkR5zGZNDl-ynio3FrvA?71~|PrD=XlW!f!9-e(FjLayLX;X@R4Uwa~xQSlFl zuPj$pYgz1dS&g|6qb!k2w6gL}7;t(4My0CV-f9;*CYyI@VFiGUPjPee7nV`GVkTDs zRE(Ox<11@wrTmv72T?y<_Q+k+BC$^@}0hBILSQ+YSh-W zIebIm$h5G+E2yn)*#v_t=EJpuu=L2mq=w;l%DoO&_rzCT8+6ugwW}RcAXP4{N)6G{{WvsQO3nI-QjbP3mS5U zO+RZMq;Naar`#;zMjRfBJw53Zz8{d;0*hEII9iNQVTk(7J+B$KEZ0DUQtGANc( zc{#$4-Kt7k{Qm$UZMU(WP8BnNe+nUI7B0tu)9Xx+31ZFM^a6=jWt3@Y@evI0=5cCvq z09t`3qWO;p%djicb93|*lZ6n+5+1$%KMH*9w$=sy5=p0BV9g9z;Xvs?HKn|ev#2)_ zMmq76?@PBg{{SiBJ!vu;{{U_=vjl!vrbJNONX#+-JPHSGet(eba!m6|4*(z3Q(}F# z(>jrZ)}n)Nl_Puq07_KaEV2ptjyUwD3vawo8Fb;t93QPd;|ptV86A22{{a0|PDgy%EdCoEXs6w`%A@_KDm?Op&RYf~0`j;RDT>g}YCsF_oMkydAZlz)ddzuGr zLf2>7CXfy`^r&rut(4Ex=KiLnwLiMJd;ooaN{t9zF}Uj7{uB$h%u+V#K=jG}bo-E2 z-T~b6kF7;;0$4$NWAR_@&bao{Kng{`%KKs%8tKUirkMPX$Z;BN`099+|mQV7^cQqY#q44 z$4=A!ZSt(a9)^AS(DEBllSg~!r_9X>+N1J4p6Iq&UK zs*mjxu;hW)@aavFm9+#;hzCDPWJNyI<#H8A{{X6h>OR+h+9qXT@~Gyu$-vJ8{Pds~PnfD%Y%mw8IX%9VvoTv})f9oBy-6TrV3}+V!i$po zAmeJ0_i>IslnbT2f>Mt(NUMeQ>DW}6N50xVKr_$MmVN&KY>lK}lyn_BbfrQ**i4Jg zK2SaVXdjoL%Wo{tF49#Leqx&g53|a_$|2}IX<%|1c_d6XW&J6U2*s;P+@DUufp#CX z$EOdNDreHZY6DlBlJ zKfWg*e{_FJMw4ZdtV#FyW~WKy?20ItY+wS?8U_AHe2RY66j46uakZPb`4r$7Uxb0T zI2dLlkN&kr?E_t+Mtrnhuj}*_v3W0XAyQ(AM<=-y1%is_;~h-^0Lpa#0NjnJ56s=k_NPesw?vLVF5irv znWi|D*rQ2=L5->FPrCEujwvJoLg1`JpVFAR4w%N~G}+}_^v`lA^CNqeEDTVuLD01q z4&P~xOQZyF1Vgc)$VKk?({zLGN9ce0)Q0yOtpm*?$@{p}aHGB{ArTvMEU&gPoJKp- z;bG@UW=-HX18m_(}-Na9JD^4Z~izY1VUa3w~GrTOLl7{@{EMJ%3j-9}`@lOBuN zX_6`ngpLN?DErUbr!=b@3$2!}3vK1SK9m6PWlO?a_mbm}MgIT_NLpCrbyW{J{w~TX zVo410EDkY`nawubNw!pkjkw&>bU%d%0x3!f79}QM;$zTbrYRCamh7-5T%Kh1_M$I2 zp^!vEs3aCW=ssz+U5n+!3Fp-M{#3wjQEh}!uTz5G=cPH!MOG*j@P73xmS|9vD+=SE zT1jLtu)6Go4n0i(ArP|&qWM?5H-Ex~@>)_OZLyB6-`bRwcOGcl5_AW-^rL)jFPSpo z7ovfTiUur7vToYtA{|Nn1u_*vu6J#SQV%GWmR#*TA_{lz{J%0z!{tf<5g6OC-WD)$ zJxwbkwYKLWBkHUDX{90%Zj_w=00IhGBSno_*q7?7=|B&Y&5$nqZRiw#g(R;#6yBf$ zK2)M;@#XyaW6*XK=2;d|mk!v+(wM=TZ##6Up30-OC!C^9*AbpR=oshIG@wqCa6xn1 z{EAicgSJNYz|K2+Pza4AOtVOX*m@4s)iAPUh8R=hl5k%sxsU1XLY7q^CRp|KA4)@H zd4*SV*+wy{hz%HzbtX|=}4i2aUk8( z=}rC4@Th$-)W5migmOJi0=VT_lX9a1PeMCTf?`=hg4pDm79<6>KRxLcUks|nrL zZi_D8mqA9t0BnP|u%rT=*&ist86V+R?HPX3yOd*qxZ|Z$`IG}01oi{9T(k35?Mve) zr2u?`;>SU$+ylmBVfh*>GsgVtbAQ)YKdls}xyF4zfuGivMQh;j1msh`VRbyez5Ij2adsT^GZ=j-iME9gTF zm8PAi$6;cn5nC#xlZ^YG)fTIz>3X`sZ>ihIbLE}OyMn&BBav4cG-=U3=orpTC>!oK zo&Y;X(v`>Ly$J2C?Q8;RntUk@vghPMf$#OBPqw$SVQpy`NFd=6dN0zXgFa-E`U6db znC;#3g*3&Z{<{&ZHkS@Au3{2NZ2n{{N8N6j6!MnSpu4z;Jg~WFUmT+mjIZHK%ywiR zGI2{M7U-aDIL`^cM0MrfYayBbdl#-O(6yBhZSHR9W>1zQvi*wiEp~SsD%U0@&mVM{#20qh|ybKUZ1tW6yZn8WI)7Y(;}vdV=GD| zP|8Nu1bnyyfsUA{AjTz>bpHSvB4$V=az;B3tpJ|PTR$e+8H^Dmd$>CkDE%o>#CDFz z4(93jP@~JSQH&GE;Z2mXS|Vc#Pfqj_osxb--H|LdBB(O(=Ky4T`&Kpnl_a|6m8-() zv0245PMy!16bxh2ZEIbH*>4eDy)oOTN+)EJ>NIbVC?85;dnUY+C%Jd?VTLjWKJw#^ zMPlh1beG^Est@Z4;i?{eU?EoLjwa(ctfzHsJSnegw-S zz58?bI(t$;Y&B}>=9I89&=9QC!+Ko6;{9_Hs*Cap4@RwxzE|)K;JiC zZ}Y`Ea*C0_I0btBMJ32rnkZL|qxn>Z%HBy1xGp7$Q00eOb2NidMIABM(DD5$Gl}oU z8yLv?`cm71*D^?l08_bddwH+Gd@{3Y4DL4+9CO7o)=%C~GyKhtDYm=6e;^+wI6kz? zc41=gz$c8*3w84(w44iRX8Xmzm1XGKSkSyVZ>A)^f0kS40|V!B*vGbUSKO4+&H)~0 zQ`0@EZpw>zBTCl<2;zA1y6Ggy{rj8{$P;r_WR!j1r z>BTbFh~{u`gkXEo&_37C z@*M*S^~Xn_-C?7{Mg|l$Rlb!y7Ku;O!LozH60NTy_J{3IVMe@<<&6-7F|^v2l|^jo0kS z_eX!FHA=nfNh0O3g;7ZXLoAZHJPw1_kzIa&kn3H=<&jR+8K~iD63R&d`A^I5L;wp} zB`5Fn9jRL>U;*mPIP~J064^gdc}pM|U=liaq?xwC3iRsO>CG2Al^{@Z+#g^`sU;2e zxX>NU1_pX`pmw&Nf=&Lm7>@w}z#LMeMEApg0CB}A$-UYz+eSUO6v#iM6FLEONQ~xFV5vuAcH| z8Q>`IK$gqqJzOP|NJrj0`_U?htfE2DnA2wYETcyC=}UMBSR=bl{D1J>VLwWbCtJ& zPp4W1)8snq=38~grxhgm`*dnY-RypxRCh{6)G-5+n87tC%yloA1GlfI6cqme$Z9gS zsK*=(o<5Y@O`y*I0EHIJTHp2FG1>9>J6317{DE|+L;Rfxzx&*^Hber^HjYkrA5PQ@r^qK%@*`8r z=Yi-ws(X)?>JS@q57Uk+8-lxGMHn1ZkF~C2MO~`BbJUScZ~TXR-*3i2anHB;6kDtP zrcHn`>Hh5`Vm7=xep~{0=}op!eAW%MFfwTmugoorc`_6kVsKpl04i#dwk)WhK1g={ zR6q%|buF<=XEb5Po~lmO7{{s4r3Ca|f=KFZR7SrjJfC`!UoXy%C`SVYpYWuepX|{5 zg%JM$53VWlu`@(vTt|<(I6PAZzd<&|CE!GDioIH$3WlCmjf$WLIqOQTzWaQ`YJrqM zI@C7iCutsK!RV?urO%{DJ2TRigopp&*S z?dwh<1&H%b=5RKs{u*K*KbmbKVgzxHfk#>{i)Irt1cZMA_oTRuf3@J{r9M@g z?P<7)B_v@xEdu`lfDZY*Lv))^ebob#_){Zv`$V!_uR(>3aZ;z79-+GeNil(rLep)` zsXV71WZkp(R8T&oP?*G0ODf^}N7#1hO~grOx;O2<%DttP4jhQ*i%u_Y(#L4 z(l!e>r?8-&gQY-_Ad$CB*b1ZgY4f8;EF*U5@IHd0o6GVdf*x3rx&1zr`GgNVR`4;} zzsK!NKj0F&%rC~n=1crrfWn?Xl_Vx*y_7~ovM}Yn58+Kw8{O=;ZK}E4=e~PWZPYtU z95QT+IA-sk@T7;-b+byoaz}=fKQs0o)f{p-vvh@iZ{mOR?b?>zB$C=qjw82TH+Nzw zQ+wFpkdO`sy#hl_fZBO>$@2dI6PkOpep*{XyCKibBM(YTgF9MA>;!QS;T`GM1<8kc z?Sv78_U*u+2DyQzjx<9YBkwWqMk0HHGvvT98v_~i{3-IWYo%+b_QnUx82tyeAaHI> zw`1=8#2%Ev2^vKqkmSb#o}I}8h!tK5C1&#B?7iu+`9emz*xrv+N7AyCr7vexcMU;zbcMI!^Rc7$&LrG`cToxmpfo@Hcp4I6bw?+ zEyyyb%s2=;Qbt-iNp#;XP6uI+^U{?gkuD0v;L1lQuFyMEVKSr0Bl(;jU)q=gGb>1B zP1555ae%bdc+qzh-siVrPJqm-B16>me@|*~cM-I3uRp}p2#6TcAfRrQxh9@`fS^XX zJ^A2L30Yy=3U~RK(z~HWjx^ex+Z}$C0F1FN)kBs&SahJIWz`^TupFKMqs)f^Q8t0p zZ|8|>P)vndk!hF#~^lC-;U&ZQYeHuD7#U5l7B9gkt`>6Ga7;0 zueC5A9CCnB7#s{|G>B(dPSODGX|cww5j*y;P(5jON#t#33Y|dz0P9jHP}AdT4m;D! zNEJgS7u)%Cq#{CyH;e!_{V5yF;GTo9pjR8Y7^o592iKZi(U#hZ0{tn@W!$Xe<>)=X zDm=yyhEaj?fj|ug-+#)xDaw|`Nmt^UUz{>v4uceC95LIs&`>*vmYY8JPrF7OpgVvW z$n>UGBL#_^!x6=H$Xr7)a{Z7ARM=)AG`-0ap}^47~WY@PvuAMN)Fzh)T^Dp>he!= z4F$)SwO6m8phDt403&xwwP>VWF4oBH?NtehhScl_Ju2OpkL@U_#Q=O?<6rp+N&f&{ zU-{8TjX&fiC;fDj`O!*$5z2ixck)`r&-}DQ`5Nl(1K>yKdJjQdmZyb?DE<~-<}0t8 z=D#C64nI0aS4(;#2{O)zSAmQVPpv3B?nuUV{#2-4r)KQEaqYmSLRciSj+mf*f3AYY zRi$Zh%8mzN?@0+!9FP22;+TMoW{?h8Q;*4PykIf?C>8c%uE^~P9Z95+Y_?Pf@0|Mq zMBglF7BNdFmeQm{g#b`4miZ2tW6Ojblh%>LH1VkFKaiztJ=Qt};)FZyq$|Mx019L4 z_aMoZ=YjV{ENz>XldjR9#*zcQq@0kr&oq$}njAOkrTC!`%eCo*@XgYzKE_W>P#=MXR9)gxdN4iBF5D&+vAEh7$ThQNh4!+b5 zU00$XCSb-v;w`4O*D-4m7 z^rG0u`^lS zwK4p)u~@(#H#z=Pw+g8g5k_&loc{oyYDDb5L+9e!6(^J0lIS)fjEwL&^rGl)mMBp4 z0-Yc-UW7rA1`pvuOEu-j%+yWwoBiD?r7X{7C z2+O$fg&jB)>C`piDiC{Tw-~0VEq>TPC>ba4?MSw@x1tP})D%bqU~s*ukaKk`gnY;` z$8Kr%%-(#iyzL!*Dm!*QOeCF!Lz9jB^+!%Z5SU1JY)FGhcZ^OE1d%RjkgkC=j2<1* zs34u9gfL2KC`dOUr<)@BJ6Hd-tyET<3hwDJXF?^uP433h|TBsmO>*;ww|5`j5_2 z5bCKSR|YaChtmvKl0V^qp#S~Xlf42`__RWOQ?ss?kGSC)UzU7BiX2cwe~48>SwX+` z7H?&s%KVvh8saBy#n>AJufpp%*n@!oBLb9M@SoynWk_q5aD}QYbSuBGqg0!CU4FI} zMKG-Y-Bg6b1^8i!LA&stTYA)e7jC>7^uH_owD*74 zT2r>&X~>eD5y~5*2=L|o7_0!`fw|KzmKiADQI+=3(S5>s$e{hCLB>S%JsD;GW#y98 z4If8_xcUw|BvSuijhF6I$S2ejyUdli^?FQ4OaF9h&g!7j*#@vFhch%`N=7LZF5GON z%JvVng=xp=6twp-HPDQs=JZrA>1!mkm!gHjPgIoQY7gP@N$pqeYagi0!D^3bEvfF} z_O!uXO0IctGM6;NR@&R8B;#wvvi&7Q-|>M0g<^%y#=T1HiC#N@_~})oMO8b;gy8F| z|NTNdo46>FB%)V)uV(JN`ar)RvfO;_es4J-ckpIQE^rt&in01ubZM5yi5etEhll#= z0ZB~VnfjMrDJ!X%4}|SsKT`DLjxmzYsn?aGiTb%puYba8**Vd3F@@NJhsT~~BE-;| zfwJ~VH6JjpVkLfl*ZByBa2*t!0g$(Jbd|J7k){K4Pq+z}E4#7evkVpMyAU9P5+1S7cmEDM&3m81;bO#)k z%rAEf_!N2^ma+Re$*9LUM%!lENX=|gzV1us5i?2nlB=bI6 z8YlXlA@WIqcc(LgXolf|_{_)yi>%dU#IgFyGj;2o9S`HBVulnFieO;!Ji(O7X zsaFoFu#*c4aADpQoa)~-eSwFi-XtkrqAd$ewjR*w zzz=^?0hjSl?LKIKNc?ga`D5xyNT}nl_cM`4!ypEp-~MP8)1;&m(V?*VTJt6CZNv#lat%s(K{II76Dy(OiV3r|`UFOlp>*#X|FOAt|tF zD%)ip^bO*DIq*hQ&kE>N^;!*25&h3HDN;txvL|zV%Bdb4;_5adiq_y~k2#<_l(@=r z$|up!3aWWcd9?2RRFJ?L1Q5>JZ1xZ|gOwFy3e%XZL^yWAE(TrEn$^EiR)mmoD(QD=XVxlup%}oHpqS^JxJ?dh|fr|hq(f*NQPUBk<`iFrl zJFL^kz%7z=;Xu15V4lExZCsNO32ay2wCN@wC#NA<+aDYWi)cmroZ4mVF7p2aQ7OPY zzg+F>x(t@G8QLsDC_RLK^1gb0+PvE<#09S>pb^HxcK}f;CBE}j=O)3P+DJq_Wb)j} z0mPvsQHmR&)J)>EXn;tjeOHxcH>_6p+JuyD7|~MWrImQp=9<((gDf$0w=8;X631!t z=^qZOd8w{LE*-u zGg3n>VhhNMXx=NOwI2`4Pm*2Xaow3aOI4fy>)$Le8sy2nv=tz?Rk;4H;Y?uKf~$6T z7&mxqJXe`%ac2z(e10A^t+MQVC&TkFh59raSai+B@r81&{oN`Q(639a^CTn0B_PCM9eA71df+p>B;z06$t4JpIRbl+ z7f+mVKiEM6wPE>8RJ|bp#PA4Bk>&dxL5ufGxcYI<)>eDWoRo>^2NEs0=^>mzTf)n| zNbH3u1jMaBK^5c!BZAlFPOuFvAy^VPt!dYCb}SdTr1rZ>V=|^CVkQfe3}Dq;{o^I; z<27u-a!>azB-f?%Jjp2@v&~bcOI`KLXUWJ^|6tqIUl(IkT*Q_4WYA4)pF&FAv)c$| z{g02~WcMSzGrPG_xavDs$(-v*34Okm=EYv+ea7k^6f$Pvl&>J5x=v=D5&!FYaK0wQ zq10Vc-I3G!El@ui`GY6L*A}#Ws7J!P7-u&4+uyvwGIB1Tg(&svTcBm~8{+#L2n^PI zL!9TpaTDSIGNJkN6d38bIRO?R(5Ben&5XU(NmG~FDcPYwtUNaSU6FIkopDL~FCJ<7 zLm53o^W3gK%hIa+wtdVdyyGc}76V!#xUo^SVxH0;%8nx8{xInn)r&xe@D)DES`1$g zMk-+EGMc$W>aOdZ%~qPq`&nisFf`$nNDvhE-03 z0MCI`PbjBV*z>xPz-`5xr1)NEZl%@p3X%zJ{@)1wP9D`0fF<%h`t$#|5sqh0Q6E?P zU`_We3JvYSbBVuEU(w(<<;BnHK*9#peS|5C8hB63g?j1XyX?8Hbn@*&Bh#(Jw3Oao zWql+dx{LM*n{^(kSBlo|%%#$oQI~IZOZrC=iU|-)MO?7~&9NAk`6Bt{=G|fv(v0;d z2k}$7)^DW`r2Z^J-m82bU=L#7$5pWI9aq^DX;-YK7x45`LgjBXNr+ajf!Qt7=M%~=WcG?+8l+aElg&ruoKY;iAJdUt1Gw_s+3PPIc>>3O(UX>F7{PG*<)!B_KMH-Ul!* zwf0F@D)=GZ{xz*W|3OBc<;}d_=Y-Q*YaVATmjYzl6(F$6PyE%}f5Vr>=R7YzG!YpS z9oByEda30FQ7?Hc0#~bgztJ(jSRi%#_Xw=xh{?^FJ44AJmxb+_mi*WGKj{r@8bZ(h zUdJqR==_XS>t|PmcJO-aI!mu!&ee<_?f704@lX#Hdb~9mc5s;X2*j$u4$89cr`Fdx zB?v{sF!WZg7y^|e*(($47|wY4U*WL`%=I6GZb~n%)NAxL7((*?6I@uw6Uq1dtr)tt zfi8dTR1zS9BTj}Nq8@K4baUgXQh$B4ABvPUfi-yaRtdyq;V*pXi$D_}(+AJlK1S(y z_P+hts;GNbrYxq9P<^Hg-D&<0BwZu<*KpqADSgYh&;4}6YVH$#B?Sfg{3n{Fl_zrB zrTz2S(OdupJ9{n0^dj;_erx|k)ao~_a#7LBY5;6>V#L>Z-$pWJ37zP^3+rg`S2$rG z)-UjFs_&&K=f?PSKWM|qWPKk`-6_adYG@y1W|XIE$qFWRP@LB|eI}QUl&lhNO>X!M@Bgw(!-0gnIs_^7b{X+B05*Bp_-|5Y{A|NlrlP_Qij3C-d203{GzTRwM z#u3q|1I;yw8@ID)@2%8`8SrTp>q2=;-s3;7m4e=I%R8__Q^J1oOUr3BRkK;SCo~zX z0cF~*QBjfwSLJ*8m)GdUUb04>kzkqgx?|F1*pBf$@Iu$MeoxnPX;SBe(WM0KbA)bX zRATm+W89Pp#(ueVGDo5*Ev7%~2$S7TC53(7G_esI?!i$21~fa&j?nk-S!-e=_oHM3 z5Q=Nf_1Fch@s!G^Gf|&p385?;;>!1{b#|Q!Lsw!EU+c1+K zxf1#kEW()5ML;akje=Sk^7+V7>k!JNcv$?9Z6pAMfug+UlAgpae_5evfo{8qetuxh zb*AhHJTM@YW=|s)$}7(!rf{t^k~uW7&UJfZ*ww}8?e6*goPHDSRi+cZ`)R4@GK`!e zETUh&X8v;z=x}A$1G1{y+)-yuhpRTfTSv#y51`l0hvmnXG_b`8%p!)m{fxI0Jf2g( z%r={i{U5TffFZ*|YLC49HefV0$~kxagNE_4~| zh;KG%Ec{@|D2?0i6j_C1iPGVu<-JZ$+mjHPTup!^%)_1Rd>J`lcE08(k7Z*`w^UGK|6McqONa+~e`TY%8>^?C#&_rV@y3`$dhd@2>FQGH z&3iQ`;-*OL&4~J-^ycF@-_f=G)BdV1(H1qzhjF75o%mzb2ZouFqZ&AS*kfxK_M_;i z!7_$`&tl7;@YHMk!1YWq7ZSrLLJRe0LQIt6RGSr6VpczP&4f=H@`M>l#dXr*FYld z`%E&tV@Sc@3U0<*67qSl*i-=m{gkmg82vMut2(f|GJMtLJ2CdQ5>x zM~SU370G)wu)UZpMj){NOg@@wguYfP5o7pEgw-axUvNA3!LPK44ueV7$bN8FXq?_& zG!e{DOD!c=*@Vv)MPnp2_J$-XwzPHr9+8MLvLrF10z^2sT@NJm)o3|GH1UArvJ`)NZqga+k7awgO~k&1zk^uRQjf z+BAr=E&0eCEwzeeok-rP z3}LZ)g(&3qq$a|Z;Bg!Qt;ET{uo)Zi#V6>woVH${cX8~wupntdQ4-FiB4^LHy())a zLC=2uU}tM6^v%c{Fw6|INAT$B;KPh=+dzrjs~z+siWk6prns&bj?}xtn2yW8#k)&i z)O^U$+|0;7UW;aLPNrc_d$+Jw8u_g)#50a9zLJb3G14;;dYb3zx%-rHyN`qPtYe?i zX8+Q-$22{gqJKnouFb$mqKhKE2WDYSl%16ZGPY`A$Ygzh2ifvw1R%{ZH_?6-hObH)LKv1gn*BpDv0!qQ#-MFz^t;lF}7-ARiIOYmE=*Nwx4CZDzNZo&5dzf_4y~qbE%8#1YgwL z$>Mu{BI2uVb>DJqpoWmU&4uWLVf8~#E2FnvQ&eswM;ULWl(qdw4`fZ?aUQc0S^Lq@ zY;RO12bxF{|3p_%Ao2vOTwQ@D^I_3qaR4uxOfh^k&X5gYE2(#4>|!<~x`sU!3A*|; zp%FX4e)($u?&t<}1COgiheKITz{T+6 zo#e^7sl72^fD=HwCiV?;nYx81*sD0j&L-ZPWn~H7b6~;!1tRLGE%}km`myOpqyu(|JuT@?h3@SyQrx zTR0DVrx%VUFo0@2{X`PHJa7T9{Web+%K#^qzg~xcjb$RfpBo}}us(gt4!(}i=3>vG z-hpJRlkPmVUO%p-hy808h>+c5q{HXm01mlPoG4@)t6B zgh7%%4pPdcWK)pmw?>jE9`3|5R1K^I8xCQ9m(#CvzHon5W#>Z`@^`C9+IXj5dPTyZ z%i$A5F@HJT-O}e`_MH!C5TVM9#D;J-zNw8Tu>}F?^zz#4)1Mq~`c+1&^gl$-Nwf2> z5-pl~Cbwm+um%1>9L^;)9RpuQf>n%HwMX>3b*x^eFl~?xsi7olIlO>>Y{v)OCkmtI z>2;Zur`Az<(E8V*lE-q4lL3;|r3=|W9Ius#=eDOYoURXPzv{i95e0+7KkJaR;7LZl zAsG@+7wRF{!J@us|xo%A9{BNEQxg# zc&SbBjQbQ||Cu%vg#W1dX)1j=@8e+=!g~T>#6_)cHc7(^c>IyUkbIc4S!tE6LxVsr z67z8C_S26Frzf4stn0xpLDj^^>=~`U=$pCyOXoWYF4UMC4HS=gt|wS54;1ZTNADNL z-}<+HZogC0X_NRA{~?2>Ol8s5l-nEE>9T_;l?^rNZ(*+I(eotwTmwT@;r+E|;UK2x zU?AO30k(AF&XB+z>qoy2oRdvGXS@waG+eCW{?~jtr(-U6-*k|ky;|HnNr|IhmzU^7 z!VxeWmoG!)dR-*1vfH^5qsx(Hn|gWPOIwMJVsTs12RF2=va#|;NI-w}Tc|C4@L{g7 z$jXShiwG!W`PeF-RopQdBS*9JziD-O|M;%3a=(`w>UCmO-aq)Ve&A7+ZWT?kC56^Yz`7rPv-E0QltxpmpFKY6#*D(r zn^QQ6a805gC`J4Q3R|og`DQbi<+FD#y+9ldR%(!@_tfGDV2yw>uYOQweqkgK3Im!E zP{WZ6f(aF|*YzEaRTv%3ErPu)jQfDxcJ=~RkN&-`4M*-x{rIORv8B6B0+LY4)Bac7 zW$pokkD4`X7^juuI0I}D&;X3R;TAv0EHC+q(Dvw|#`o0>^;*V#$xe#fTv|RwBiTp@ z(X$A^xU(HWo|#qd7ztT9`DUQ$djkukp9g%jVK>lr%8OQbNjyP$<7Y9Ue1)T5L((|h zu++47wtN|)s@2)zm(z>zvie~uuCeOT0jY)aLx#uVk(sZSIH}6?S z=Cd1eQS-(0h|0nVDP6G;YBBC$9OGNoz!=;%ovUmVT6$AY=JCnCE7k1)3|6WZ8Z~Ai zC!10t_{ux$*b=9+X&@?h>TB3zd$$L|9mkyB>8pooi%hhfXU;ccMJM||1V{z8EKRp& z+RcB7HJE`Z3p$j2gFUWa0Ba9sRwMwH4pyh%(-G!tIc$cos zkcM?t?bAQ_1r}A5ft81*V_Al<(V{fs^JtBXS(AP&Zx>&w{PfZ7c-h)7H{L*cU*Q$# zPo?R0LaXouYrLv-MaqfKQE%fx$;gwK}>ekHI%mU#h76d`)!hUXIR) zppr%9oDrYaVsoFj)8G57GQp&43@x=I02(%d(;<3CH;B_a>k$hw0XdIKM$Yw$Ar)_H zlT{DTD5At{OE^bP@K_AuMBkG4is(J;_UyLUL|JL;1*gl82etkNz9Q!yk-keMIlh@# zJzejNZ1ILvRwo;yLDnHZpN(?RNi>vq*OUDrC!4p^u9j&Tv}wmArMpp z^w82!=Gi$YTEC38>b^84OcLgGC4Jn(s48ar5b1LHiMJXIL9Z6q9#n^F8M z+F`h2FnVP>rGTYzd`Vaxqc$byc;nWD*QLzX@Ao2%`dbH$>1Qme$2(MMsmv9yjqq_g zq&lRZI4qU;1mT5voH($}p@kmrxP}P|TKSaKS)>0BYy0tPZ@V$b7e^k20Ww7TEvQjF zFA*cW*nAo-Rvb{bE!OtytZ{yXMy@dAtaARz&I_>>TdkW}Z3^*K_?$4_7tvXPVK+wY z5oR08EXwjkNZe{XQh#B4*2w&Wn|&H`7zCeFYx?*fXcbKkYi^@i64f~4kNWt+ZfdP_sRVGf`)6Jh<8ENBxxT(c(nRj1$vIv^e)BX;o! z`QN2S0Ag^CfV%(9^=hdkLd$gLv#|D;;XO`9J{OkhA z`NbV&e?iCW3sNZGfqg{TyDW$=VlCH%K0#(Fw)2_A8VendZRwj(TZ})|*Qu_3gfc}F z!>J?Z10Yn5(g}&z6R}$-%wKmVr+%RV*xss7kH;I&Wt4)j$13VYe6~d^BnKo9L-3R< z)CT{7a@EIU_e8ob18XCS6PVY1(NS~JJc=Po;@92SVdh5ZwNgZ=Nr(i|f(%je^VWCa z=pYs$4kiXtalMb{RaCM2nc_;Xsg!g=nR8{hg%%x>mCuB=LERhFIv|%{%0dDea=e`M z{SUnIH{F(tg)PPBB{LgmjOelb+Ypl1j?s2I9^EWdij3uTs*}UiV>HlIR=sHGTYf$a-ehr%l_ub}1J%ozTeCaouoAlgO&nbvdB@@5 zQc|>FVr?yZF5wRg?IFCerVq@EOhOYW4uYJB+(_61Cm%6g$(`)MzsJe|UsrW}`Ip(_ z-@g@e-ZlS9`q|dZz7Ahx3B5Gs7^UWu4Jdycr8F8qV6(Z}95-r=)o2==tbQ&EAzOMhmWyRwjTBsc>sLhn| zzX%|a(?Np0ddu^hDIW!B-cEI3D%4g4_l7S!7sdG=^{>S&cLs0l8 zcMPnP%}U-EHkj&wHIZ5Md%)cB2eBAfy>jr=`8Ow{Jg zz4Sr)_ryY}9>K7C%2;(dy%yclXxj)FXTyu>Q+m*;b+_qY?DSmLkAkYKC(`{RCv!z! zu@i+RE0Zke!LfQ4daMFd2@Xb98%hZi=)(=iGql* z>dSNElH6V)%QsN<2HJ>Brnh{B5XW;#yb%R_HkiLps9(|AH^3BqTHWL1#+jOy3@E_~ zLic-l;<_|6;B;BO)8A1WVx>GO|9oU>bcoj8BJV#y9GVCue9qW;OUd+{-2K8P(Xikz zL0kOLUG!|NSb0r}9|eQJc@z z;w$(-KV4+dy(n^vkJBxZRU}7%ESmkW_Jc=hnOZTBX*AS0SS<55z{`lgQkp9huUO{M zSt(UH-$I=w+NQI39Vo!O;BFhQQ=zORcRT^6H>a0z5SqMrhsw=TuXBSFJAVUfNO}aa zu!UZI&cju`e)#-j+28{XYOnd^L+?lbsA5F|h9wXghWPWU4*mzU0Sr?Sz9RzCKHMm0 z529HO=yQ}l=Yb)`Pbl%R%TIAWI~Q(5Y8IH)Rp>tuEzVYyA^i)c+8jAc)6VF+x;_L3q6C&pF1XyL^TRSf? z%9hd`(1c@zMXHGxg=6q;^E6Os=S0EUCRTrp;;ttA5&pW1L?~KXu1PgHVl-l=QQQ~X z&kxay4L5poKK)P$S0mN-a`tWxU2vkZw9F_Zc>MjZe()0IPGbPn<^(aCrIg_O$c>v)a5uY^$wX(7E?VLSmepZ6 zuYZ7g0p0ESb7@+$)G>=#m-_^)HjMPM!mH({B(nP_12hbGNHsv`_`6+C_!yodW%#Od z)z$=cf{kP@O>`W>{+dV|h~Zda4gy{iqE}r@m5V0K&#q@OH&62SU2Vz|fPiU{2g8_T zLB9=Y7(&~#?PE)s+9k&GcSoyU6oGQ~H|h>S&Qg`M@_-AzO7>n%K~eNqbQfV-g@Szd z&#(QLCf0mH4llOkBV_)!t2#N*mq8qDAIakEMv3kn?p;p2lVAXUF=@&JRqx zK-(D+&3X}$c5ZF@a*u5_#23GGw2U7|i-K#nb?yHHb$4aE$oy20HMMtqF7@;YJ{^)F zTqbHnr{}`YutEJnCty?~)eZf1F|rL!E_pC;%Z;}$33RY{qhZ(U2|RvD!r}cw3yokM zD*&J<_OOnFAdVfdM9m!)-Zw>U|E>jW?Mn}vTSk?ra=u(%C(y6IZQRUI?g!RUYN21w zZgdRn0tCpl`K!R3pTg+9h}v5sWG-uZ!KV#GfgBBXnCNGpdS{kU>x2kv%*9yUmS{s! z?_=U^mq=ODTD*~x$rlw{p@LX485}ipC?6rBcjPhyv8E**GTJX zG^P}PB4)OV1pWinYBnqGTZgYEv@3FooTt2Z@xSL6MkN<&^z=oS$K8~AwpS|~c28OS z^*Tk5P}-&YMb8Ruhd_qm(W=XGozr$goC&p$ap)H{SvcS|n$e87^e ziCfKDfkK?zuB_l{==dTeN&G+1m(_%(8pGD3W)0BEMALTqu8M-9MoL}5-JXOq-Xkyv z^%>S6*Gc!^L}!5vdOR$u%sqK~%#AB~HAx0vrIZJ$5Pfy8<2ZY@wKQiuYDZRr_nfLDQaeSYNRe7W6~IcaveB^|S@o!gnTRA=)nQ%a zwB{tqCz)K7dP{{uNj z9H&Z_mKg#?5coCEFM(b5T3tM{+}(BVZzA`6DaUQ_!B z?ZTspBk)n>H4i(_eJo6oLCxFMJYwVDg@cY?(}EaS|5a!dyw47yU_yc$i2nm+>}A^A zu}6?=MqU;AYcj5T~h2wP8%C^>Cv3W7h*lpzyd@&(9{l`+4SHb@Up#>DYM0PUzwENbnuNbxmD& zU^?01-#Z>1_*W9)B*naXJ~T@z;}NCf;Y{N?H|571XQ+aEgOY63<_T}UN?Kqj&uzkf zckW248q@?W#n$hY_`RSh0`LeGRBhSn2buWOUwQwufFwq~b!GFJ3z|HXKozQ8lQGS* zK(ial6Y=MtY53rRjpHAn+byQbK{9CK^F_-xVlnEn&Qvf+kDYdEJ2eW7t0CeJ)&t7G zyOjnQfUt=U{23_y(co_DDH^NmF{i;3mmOYK7vM#`_dDoYl8?1LHFc>i~_6ZPdV7F;5DVP z@Yeyj8aStZ^K#6bOCC4iDQM|$eQzYTihPDx3_+T8u}k5ZGR^m7(40HRrSk(!%w@u0 z+o+^;rDxpf;`tlC$oKmVB-Cm?$jNHUX(b)*m(f$c-F*?zWcr(pxY*FowbhS^mkm*1 z_TbAI9vR*YPA>W8pKhPLf5B;Xwhxmnh6lf>(jbPI?l%%^xng6!VkALmltkO>9jc*Z zli%TQ>Gl-+NQCjINAQ_IV3c4})m+@(`BT~lWgQOee4e~g98f*np0;^>ZU!ZvH{HT~?5etK!ml zs%iTnEA%P?cAwu!RlN7Hsh)ZYkNUsA3iakZOXmE?F|GvL(@&Pl!dOb@y}Bu`+Ex}1 zRjZ1k0tb{?Iw2|N@p`I5t}H;Rp~8mn_5Q!~>PH3Czh?c@w}#>Cu69k~^)nr^bKtz1 zNhoW5IRg_tr?Kx(ee#Y|*19jypAo)V`Eby1;sOMmY(l17*9Y2`9H1qRyWRFw_J=p0 zFg{%bZw^aDbQ?|fIvkL~mN}ttX=BVCjgkmq2n6FPyEOu!L29Jno$I+MZuX*9HghCZ@ zN@C^4flcrBcq==VgCX`74a!Qe@W`Ao%$-`cuj{^d9T>bPc55BXDmWLX1`j1ZFzTv!#A^dMTS(DI360jFuZneot? zZF(=>g!5_l*_|l~bUSBz*oV9ofPfYQ+tkA9K*j>(Thl6I)d_3@GyjcfK~QxG0bg*~ z^zkxP^M+8sO1|c0qdq_}5@u@avUXZW`EHDV2B0^poDQC`B}7BxSd?||0rA7XqzH|p zTl-~E=t*am^leT?M#t2+qQfPD9&csKs7)WJ!q1^4?GF0I0$~bap!T_HTIN#tszq^` zj;0YRxqP<>5C?PvCw8hV`bWfc{kR0115{Gk?X*SR$1W{|Ghd5+flD8z189w_H|Zx* z66&)FB}U0CIEu@+7;{CX$ z)Su&Irw{p#D7${fy-f4}+2n2IPFRcTa9C{*tpdqD%Wk5k>P{XNiEW}9x28{C4KB1Re#pBQZJh5U9n>(_u?7^wPTt23{_;Qp@ zRFf0EIGa+^GX^>Lx&V#{-kL3^9QM3!rG$UROfJj|@+LqYI6#!XFa+_4&Q*vuVi<75wB z{pE3$K^)<0({IaPMY=3vA00MHtDtxFT7~7uq7uM`x_&7vbJ;jZ=9Zkqw4i_bNPhN@ z%cf32l-DXzWE;DfAYoZvkPc5;)-2>^%e4pWVfvkdA=oUYq3^s`HQW{`!8<1*}Up@KgUqO5b7LZoWNp zkQe9-tJmS#3||}@kvPx?m9BlxKp_YxU_1AMFC;bJ2(hmAY^R61`ra=(Vwi#y29%oo zsCqedM5|AD&_~*X4-Mrr*yld|sx3>yBIaZD0Wy(MWShdz<6Kqnq|rnymm91gt>8-9 z6Uxzb_dGGvXOX=cM!7IRu-ch=HTU*?-ZEk^7Ehq<`4uxxMF_a7bV&aO0{0-*=O+ct zC6yn_>)tPux;;%d{adm8kY$cddh7K{$A=lOjj$Og4xd8CHRnu(x)sn%Jd$Q9ZD{iW*VnG>{*|t<8;@4Xy~Fl3l(LJa{Zh5oRWHf_)}Qc=%(RViE`IeL zsnez*(f`^HjF-9|x9VuAU|3e%|~(KA@eeWZipDT>Scl#cp6It2?FUoAJs- z9j+bl+acgrx|&c;+*l^&nOlje@%oy~(lw{t&w>eLz^xaghf_Dm?lKC#Ss7AV#Z~ck zj#{;*z^8XKDwzIYk(&a&ZP>FS!etKH{-<2d(}^ekWV$wz zdHqKD`oJiyE~7SD7E@e5pCNlQ+t1=}+&{iBHP^Tj@L~>N9HA|m-Sz?^Qd-MiRP$yj z|T=#Gz?sozfyXkL*V*JMJ{sdK3OxE5VikOm(nSapNJnwy=VvW zl97)p|47fO?g_bjq%X~^42W5>xN`O<2ahIAY~o(5mLDRiAqT2`hj_!?k;*btJwd7p zy&=SfQ6%6LZ_uSvUl7+8*mmtVj4Y{RTHg~Yw+4iHE*83#^JC+s_h^G`2jWB)m-$d* zf=;ms$y$<-JJMLRw+@7BQ8KGz<##4vQxtz{n9nYECFDcMaZPp&yAXc%on*O%WqW0N zDJ%Gg$JSX{X>#mbNiaX(YK=$k$RfISQ@QXuuAB20=kroCqJ>XjJQn_pQAG2%eIk|E z0Cy*_T9^6nQHS&VEipo(Hn`rFN z2x7uNuOxKAeV6g^W z2@`FJdRMETwp?nf9|wpn-+TATg*8kBgHb z9;q~1tHXypm*M@=!rlv9FH7ggww8TajAh&|>8E^g_41t$-m$iN=dnxt1sO?kF`E1- zHKQFL+TBNB@x~P5y3)Cit;IH|lp!65frNvImlu~7snVz47%VF!J77|qP9=> z{#xj3tK*iNe|FD|HEIfQ^uShpq&LD$J6A(0G=U6L z&=Ml`jOKT*)QH?xAx~#UW~)23P9*lMM`N+F0*R~8x|*wb@K1}eJhSZJNUYPHsA}zDHT&-r}HgN8!-q5bY_(B63+uK)R!J9k5(49V%yA ztae=#|Co-Fe|ug-lvtcAUMC<&Y4RXLIs}90e*uV-+**=;gvZ@i)H-(xUIZkB1rkP6 zOZarf0d$tM#iJitJ%SGh|zycEDJ)Pwnq8P^ltquaoCa(-dZcl3Y0 z@Q|cWPeB4l-`?6PtMOT11zeiVFmPv@iA?$b^S!PwSA_kE{tuLdFdh>Z1qJQTB_Db1 z-%h0)eHWU&yQRCU{!5~XZVLKd;7MB{Jl}3XXj$RVPH?(6c0TC5LFhr~0Zpez*QH&W z^JH@shloG^$uX3uQUeg8N?U+)Zp4$^Fx~^#@CkbmK@bb&t6`vsu!5j1h^-BKJ&9%q ztif|AJO1KCkZqqBb}rvaC7Y(1j``^lYNuvLkC=tUG)1O|ao?4Qwa$D!(4sNW5m57` zPrOxl%^p8wS2q#WvdMWbKhco5xLj(;Vrsv1CfBqRQ1x2VDTKYVwrMMR{p31{Zof-V z@nEMAt{1=Yxx8kX1jh4Y0GrHdey{Dr$?)B~3UQqx1q=kpeZ0x?SYnljKl%`ksBE|Q zJp;nOHLO@?*7(Q&Q;P}MV&B+7M1*C)j5Wi%XjdH|W(%Z)E`-Vr*2?m5wbr5*-08n+ zl$CVIeuQ$8kDwwglw^hlCw2#zfFsl0HtWQ39u>_MN{84?ZJ*{|4O*a@m_Y$Rzw%Zu zWT`dYtMb(-&XB1%^c!PpI*>IMz~{L!*+RDukvZWfk%3K~#dO$PUwz`959(5$BR?g% z%ZFw16}H~Ta)yj3=|JEYsZUEjV(f&^MiG78h~gbIp(&ez4q9!4yA2$-+_Xu3ZQSzoOwwPcnVxQ1ak zbS2XablFzx_!JaKH@BN`V;hk=1V5=G2`?$bn@VE>6?(X*})?84=ceUJY$|{@!(wY`|UcajQ+D<>`WPstao$b~evbnYFh-L+X)8 zuuf*X){DUc?+lFgZ0Ie7`u|Eeg)AO@$?_!r5H$p`l6=Y12>!YdRNKx&dFaHG)_*nh zJtv#3G$oZNeFUMoq-65QQD6RurD^}rAfL;!f+~F~0@}r6HP{=O+pP7FZ>xD(cgC`gt4yOSSpbia z|DNt+0^hRVHT`2rj@iYIz?Xa9(?(OiGfvrZJG?ZE%&- z>9H!Uw$O+yQ^594y!>uDN2ssLLyc34w88JvKYSQ=sK-&8Ei>vrMdd>0R^G?ER`T-@ zT+W{LopKCtoE<=c8XQjE#f!RB#h)9{Hy324Hu(VXO_6!--qg4muCYGA&w9tjTPERqpjDmTI7`PTBU(a#%kOm*Q>m2eR{o{E zZ*gSVin1q#@fe|WBv1}zc5^86R7*`T<4(3gkJ-(<17h{l#~Fi(9ob`@Vakw+SLf9| zv=MI^f}M$q19k#0P4ruIyG+abm8zj^PXAn|=1tL?DkfGR)E|PwaHcVuq!9`*J2z%y z=cUI~wN3ps%T6au`itZt7ZA%|&V{CF$rArE;SrJci=SKyO=JOVkGaP?k^!RPS48P& z$*=07ny2>DRgPdrJ#HcW+(? z+-qgQPmg9aRi69=hZ5C}S^%vrD zD#8tiTD_<^(B*ZK3;0TtVcRxvyL1&wP-M;@pUD=*VXz4 z{y!ts_jto&vML5%6~^PaqFVUm1+Bo%3h>Ht80*R}%W=Hzy3MgXVT$-tFzD#8R!A~? znbr}3^6#n9z7-xUe4kXq`VPha!97$Gs7xbr&%UmA@xLiy@?7dut}-;tWcium#PrT< zy4L;GTwOAc*6PeYhC4aycdR$1lT0uqLq2 z#joGgGS#n404}VuYAK_vpJL^_sz9!Xh9u9#1z`308P>KFg68WZmodA>EP~eb&T-w1&0zT6DrSgrZqS zN+fkPW-q_M$!rR|N=M3=G%t~(j*GDzopnHTgY+VbbGGeW6sHkS22z2($o(jfF5}Ja zQ5d-py7P#GPqosEp#`0LWq8xjsmXS`0m7>XJ$F(foHz z{m4G|QrY7lOTn~2$n?5R-h~y)y!?x0^FL7AtUVC)-S<64U=0!{d$K)-bSAPw5l3S1 zdPv?Nv)2Q5iPEhiPlm7`ilbLXu$BGgcHs6#|E*e^{}eM>@HxFD8A(PN*h2h5+$)G? z2Ixt@dX!sPBD73HboRJGidybU5&ov%_*-wO8(9E8Rp?$b1;Z*gOM$sa8gLLM$k&`#ZFzRQL~3xvY|VwILN(ff6h%Qlz(8^sr?!8#V|F5Exo zKw}u8J(UawPDhumg>s3Dm07dxmnrp#h4R@t3AX=%6!~lo{3cpxJEByR2O7&+toL}eP4yAyHm+N8TLvoVw7K_hf`@FjHD9voQ zSLu_f)2P?4#*G_mO9xn^ZkmE?&w2z29oU~FG^(P=6z(mTrc`fbZRZ5NY~`o=d#Le> zpb-^ha|cG7NcNevNT2$0hy0W$c_R-Mkb7wInIqW|vCl89CWzM0-uMfLwDHYQ@b}zX zl(OM)ju?^zAY5Tnl5yN<_B0VDuo*HF)ei(0f;}{^KP+z0fB9I2pugbp^*36il6klM z@|ZZI{GyXT8simA)B8c=q-9YA-E?Ul(5J_aXBsXtrlESER49kgXX?j&I_cX6sHP?t zPk&d|ee9{QcomZ-18FzbR$3f?+*DikxiP3*hVc?kTJVRrL06dh4Wbsjr^}>*zRnF8 zT-<>Ar?-!yze6RHBS5@#oJCSJy_4-W?=clR8GH%YXEq>WmMrE0y7$^0q1CCF3I%>t zZ>?@SY+Wg{SD&rfCKl}k8PfzvPGp5%M1#^wqz@bDGzJ1c5FKZ{_h!2h`I zx`F8PCTdL>Qf6$6R0JLB(tpaITVK{upc2btv&q@?i#hV#^vA~TEU?CVI>~zJsomL1 zfrm{T`G`fzkv|LZdn?W>9854@$ee*S;4mr5k0sQy^sYtuo*+6gG|4}cXhaJC-jGlV z-G7q0ya5WHT6UT1wk_~YgeyRK$xZ^s^gzBncV=7KefQM0-n~7Rmd0JK=Ztx^l9=>G zxCK4<);rcVrBs|n;24UtB3Pz~ApajIy+_{tfcsd2M^TaQ{b!CWs)bZAPS1p8KuY5h zNYzmW+Qj-C$9b(0W`$2N%3c;j#Kz5CY1QMmhX4zbUai4fXQ8%#VY~#(&V$lAu}d9n z`rG|)#ku#y#(|E#C(Y_HY{g9w5>^QS>mF`iwN#T- zn%%!GG8wL?MHq5{ypK@%TJu+2Oj7L|d->_NsC1I+ww5PL5R+eBVj#iE=*yp!=v_~U z!4#y8DuRFh_iE}d)1ZpXB7<@?w*-356GceGdGAS`eD;L>= z9@+cELTn0AooD6NyWO~zuU1h^h@VM5YtAye5ryo0Hm2SGj^1QvHeCJ>6n~E8ZF?g= zMEsUvpi{EP1AX~qA8}@C)dO+vl=m+Ktp7C$D0lKMv>}&IQ<|3s?)4`}uCKC9n z4VKJ0Oh~bi5!i_L7u|j~iqZR14a5FYtx?l+X)+o}NCZEEa)u3l{XP&lwk&avzd84U z_jFjQuTs*YL!;h85Lb`HIa}rX$bCTPhng+a^*XCScx25G=T&5dIPn{i#t8jqucBpa z5$+>^{pVSq@G{0yiakkl}hTLHJHTTOR|~f7&HM)Q(%_hSI6E7wzBPK z4JO%DI7R2x@Vi`k?KZXv6tG(49kA({ed4^)gX~r@SfG zZuO@4YAlkz_u&Gd4|TjuU z6=iZ~Hv4^7rda#PFn;|P)C$;7Fb2h@avMjFt#mERj1ht#!MAFi^nzcSk0beICe}Vb zPmi;GMy`pU9M0NomQ`Bf!+%6rYtt3PDHQ9GKpysUJ=NDR8xq?)E!lFQ)h_HV9?bVH z4Hb=^dRJxZ)oyOqg^VC44|%*BH`27&Tj-zYEv|&|mP6bg(tf)B`D|8o8VIsVjPU$U zjy~Asg*p^(3bjOF`&XTjw?$cy7Fy;yf`a51vs2YK-3=(M>yJtfX7lL*Tu8Fch)iSN zw&D*AAL)8#U;7Zq9BRZpuCts7_uMX2viQk6xWUP6j&lfRXxv~X0kWd$^xvL1rcg6% zUgw3rW7%W3m={%Y<1YY5;c5Q< zJA-4>$)P@f$2>=@(sTP(W2ujMcpd%8h1D3=-eph~&-_JIlXuf<@CN-)s*7tH&u1!Q zWlGW_l{zYmn9W;yl27v|9BQdmM8YsI$i$Q5RkO3_hjG(63G9iS@V{oxV!g!Sb;eoV zQBlkD(;k9{@6VvF^<+DWh)D33!CSYvA)qRrRPik%Hl}2@74U5aonyHrrz{>b3Pl%t z=@AztjfW7iaTX5AUJWMV?1)DBYpV6}IYQfsr2CPEg z+LPTE+VHgWXDLqt%3j>!r2Ck(6#0bjTkp$kczqS^!x3WHwWrVDLA+s@+srQg*SlQb zcubk%)|(jilD&DgsXsj6w>&?`Mh}OX%!`BUeZng1#F-K{Rg;M_Zi7wLCfBVqU(FT1 z9mW7#JonZT9Nh&GDA?>H^^h++fb_R(AxHk0wlo;*Pzq97*)+S;*6!#|V>LY7$D=^? zU6Q0X&no9+B0RJC$rRHdc;}#K+K65M&V+LODo$19=L&1#BSj_FKB3WZ`Czl-`#kuB760EGq(MO?lWDGS7vB?PA_kZ@*lC( zVO#o6ikX{4tM2b+8p%h9sIl<~et(zSAM#2*rIm+?q*pbn%`5K-pAz_Z^9c=$RLT#a zKr#&2SgbT&df6QSXZoXv8()zDx+pUbn{1=V(?<+w{jL0F__x@bwFzj{=<_taBTRmF- zg-AV``ZVEKA0rtvR6u|PO9Js_x!+^wf%=u^wjQc0H&AG&z`dABqZaIr8?tZtzwS-9&jSeg{?H~Zt%+}v2QC(kd0O&p5U|1jKm}$( z_Vli0InV9Ai#JVe7{Ui6Gya{g0@U@dp*@LGa%PPA&Tt0%+=`(cCWfWo>B)!{!qT}% zt}PXuwaWYe+<#wO=$UJN2(w3WMDb*<@{3K~z@y(?E-+!{)a;r0V*iCBrxW-b2+B@X z0pSygx%HznQ16EgvB*GUg{E|YD!wnDF8YQTFg^!(rmtjPU-&N(l?=v8XEZtXK}9f> zDCsn_bLx(%m-0O4Vyft$+Iy#!hgemFV78vMXFTQwVFneDF@h(oqIEg(>(Fn&rn*?q zP4KP3i`+)l;&jC@<*p=OP$N1dHBYOb7P*``o>pGGt+!D4cCZw;1~|$zaO|6N8Z!*Y z$KS}s#xVaS6Az31sC{xGeYcP|e&u#u6W{2wsoO2SnL`v~_5HXLx965(a70HHp4#-i z=htt7td2@hc+s>kv*an(^z|j=a#&~{HOC28lyGJ@iJJ7jVx5Zzgd`c$;J$r;vR?%CnyGc`p8-LWN|Zf57=XjbKsMg! ztQ$_D0y>P9GViJt`Ll|t-8k9&DI!}GT&y^xLsd4KF;fu(-yRa`y4Xsxh#uqR~qg@2=l zIT>|?MGqlBg5VUT`P|*Kv+cv@@T=DuN!>H{p9BEZ<~-oS52{e}w8?J9xjwN9ZORJV z_#|gaKrFkW9U&TxuOjA5qXkl z0H=XD)&D?iFy!ODY!B`qx7?D`QpaiFY=#>?sRi-hQWb8bX@A$b{8dE;{>i# z5f{aYPFSk9#3jHtVQvom+_1A)N66LlC?x)f@X~noeF0kLK&@eWMVN*DEaErT(yEk= zYk|(cB7QqCj&p(9{h|jXscc{(9>o!$#NyE2V!N>^vT)A##oym#wOoL%j? z(lls7(*3@L0y`cSF&g21YIXsN$8{oM<)V#O2p@ezP z=IkD@AEx;JHga20d}n6Nv#s64TtsR62Q$l?n%(Qz!a?AKfx1`@f> zdMG(iYbKxR{phKMKDB$TZJMe9e*CwC6{F@xh}5q1@2$I~g&*b%A8l_nHq!f_m3K0h z2Z4VlzLdWHHrqD1=}B=F#;cYZRD|)T|IA2HpL6-N2EYNJCQ^?XwPf}~oHEp`=K*^~ zTsh0?<}*01Oo=XT^NT-#YTUfDR2w%+5n_gU`SW3h*N83#$fyYYuqyJ{(ssE5Xs(0U zjC(ks@5WsJx$MB9sk`N&E|1`nGQSfN9U&U2lg4PJ0%nCTqon-4ILQ#7pC77MA*Yyd z85-;6jVW^Jvwr&|pc;lN)}_YrHI>T7Qa+s7jB{v(KOLW{_fQ1|)SsR3 zy^4wB9tE52shG~>sMq^#XZh=T>m%y@STbk3T2ncs2b-^U=#v^dfQXLKVenBBO74pK zB+;W8E+F>_fk&6jIcuU#zk4xP3SDkbnlN0dtIt5bz4pH0uScm-=!?C*D=c8KGRcM1Hl2w#GBMc zGW5G3*R7m_`+d+d-H?vrO`78nTpBaUu5063mm%+7^1WljNCNt)qMb7GYDn(D^Pj!N!3l%xh*b-x`*F8GYGQ&KaSO=K91tf+*z z@{mtzvMln>BTV(%jy4#;jF&JYQeG=aO~OJ()Iu!g(Qa$n&p9sq5yKM*U)9J?p4dgR z*}oNF-D?vtj34~Y`C2hn+udAUGU-IxZmB(!^#EWL%)Gp3G_rWp0gSMT16w?TeH7aL zXa(xrRBLWpp%Tr9>o4hoMO0nX@1wpKe4$dx{8Adfp2WdHZ_6LPPAtQ~JXH=8-crLU$B~@ZV!o0BLE#c-eW9C}yYF8tmb* zb4jbd{df`C#L=#eKP_v7Utb0{Qo;VK=a})vq2TyrUz1cZ$;GB=t=!B zOFg+X72sIu$WiiBW=CcYIS4K))cx+K9#nj(`kz0sx^4zQMZ8bmSX5lr<;OOADCAI=|?4D8nz^mEut^3|$x@`H^x?10w3gFkJ3}sr> zmF=6$+T>!LomiWHnsdxwiZjC4BT|M=_-Pze>NoVv*|U^E7;z#I8-K%$fXWLGqspZr)=f&4*Mf z)v*)fr7=F#o3I%vIvWWBZ|%VfIXqM~BG_5WnlmAq51d#1h#E+;ugxxoP%7^!ZfR)(%aQG<)f?-=MmH+`{tLz4Ic-ckAhpckUg3VgyN zR=gB7eQRrKMfN}-4rQh~X^=8xWv#eZE_YC5B*aKST4XbF}gAFp0i*a^zB zy&*y=Cjpi!Yt&hebtjUr;+Z1f%*X02P4*y!x6DD0C~D%0%@dw-^bYx>ZWe^|1n(J% zHBZNQi#{jv3?bK#rf|?G3vJ3Es!){0cKf)=XyHwKGse>owN=mj@lZnDb3E&_!_>lS zkbJ~dm5}x8=HfxSUx7=&T4Y%gwQqJW2q9v&7^RuxFAaT>;jEF~baC^a62;_v_-Hhp zRal(jD#YAdC&77L@`TGN0Q$R1uxH>)mQz>XzoYGZrcpl}5=18& zcH)TiOs{QgAxEvT>0sixS0tW!jjEiN4{p_O>X=-y^Hy)3yx>49zE?qMSG~6x*w)jcpzTVGLwIp@doQHb)(mYk`+z(2fg~-!|{a9_&VmUN2=YqXu=IP%kGm>Q26@-*C`d_l~@l^!I2KS&#VM zz?En)v8e6-%?TPbX01^@0jdAy@tn3IR~9PGEK;#&$YMJCOZBVPT55$`SjRk*LEt+F z;m6?6Lf->mq?f3jLd&qvG4x&l?hf<{YqJh9LY3fzo0AUcPU?TKe+R=lvUHN3+Lh~V z^7GC+m@wtdWQ3CI*ru*8y=eH+W1u}c2A)VB7Osw#w$pbh^~`-c+E>^FfSGN-zm~LU zO3!iGQvMz_AEUF`A!ZE~qIX$IE-_dQgxF>xQ>qnuE|G;>N8{b2S= zdVri48Vw9MJT_{uDw=$W3HuxodU0hI5kBvg89fvm{FxaCPXze7aRZ!CXC0xLH(EQA zm&9D_xGx;6H|D}U8uG7ER0>zle*JBUtNIx8>mxs%JnhEgUGLt zgp>9`6I$TmeDraPnZvJ>CE>Nrg_5YL3=IJ=OHnJl*@b^9#{h>ii4=^-VqL;rc#kK)1+ByAg9-jKM_wCcrl2 z`H_USyk14T(d5*cw<;dymg)Kv^{q$FHNcKD8v)#EXb`9CnR;=1*jDu>>U3}!gs5`J zFAgSdxNNHz1R)!PO{UW@IraP@FW_dtEI@4+|dyShC3utV?xjJ_Vuc(8q=$;KUUtJ;on%T=deKFGfk6`b#qLrM>Lj1^U z>(cm1R8N0qP<1l=<(R|Zn+tnKSMa!BUzzmtId$+Nq8EHxaaf?+q{BEW%1cA$DQ+;a z$?`q5jDj`pLGezj5W>2bz8A5rpodG+vDX<~>i^;rft%n{f| zm4>yCPhy@ccY#$6BpJ6BXq!j7p|44FCc0J9H@nVl!!t*I4xJd32B_qmuScIdh0bgi zCCZ1>zjZvMZ?ecbe|KH_GaYq6A;2Q{{@PSrL#iJS+4Pp%_>Fz3R#2ax59KAoxe+VI zE~}43%JX7fJ?W2g0pdJh(qM2_t5b-|IkoRF$`mc)Cdv0@S<(b43~~P&&K+CQGu&s8 zoWN_TMRk@zU6IC<&xU3L%IFL#5VpfhZDK0Dq|r=R)o+~;WxX$i3zSFK-BLepWGXFS zg7=*lcWS&9-@kOxSjznV*{eeDrG=8fp8$#Ci+NxkO17g>Zk;X3g2ittVcHC5*t9i2 zTv6xr{??98$Xq=qiMaZq_4?nI430$ggV=Z9%FYVG;(?i(fv6`uPD;NNY!7{&8@~q}DOy!%Y)( z2VcQ9_X;Hnlk6_~M*i+;R?GQmiKLR*Pz&Q2OMSGH4T(uw&?v9>2SWFKZKb*O47v#s zPC11>PfI+t>R#SUi^Q>_LS=F*8cj;?xJ8?S^Z(XJetsG%bFu@FT9w92HpnJ&T0oe> zCp;6_4DA+K+ENwDmh6Q8T?hNtcrH#I=^twdpb$Mwvn<(o3q~<@_xGgZh~nX36K{5k zMz3GYnL+6 z;lM~!*YmFo2m!F~cL0cf%PSya@ziwY6?15M`d9-v#6Gm3QTF^$gLS}ra>q@CgQTf2hO7j-s-*WhWHUQfq-`rX9*k8fN&cj+88dn2anvCV)Dy;};5c)-uNgr06! zGV7Pwj?xb7$ob50BFmaF9!4U*s0sNn^i61N73ke!TyTxuKx|GbqlGjaMXP(m>j@`< z*$~YBu{ckmOEX|oIQbYHLMMiNgLY9T?-^%y{>NLuhUSG2zCSS}!)5_($Aol}PzllP zLb>K5wr?DGEWh(t%XKytdsutmKi+so;ki;}eq_WWO@N@Fp7Uk7suvGh)HaeSks3MB z)AE)-uUrHBp@cOa24s`^ay zwT?H+Gmcg?G>>0?=nBE8WX$)3JOg(gmkocr3`s13J|v>W6)#3st<8NP=q zB{`2>yg1()BtB2%UBFo*C@y~*_drY$+h zq2K67P%qgjL*-%Uus-i~X-7?i)C36WYSpm>)qBY`12sC8 ze!wgBi!zw%w60Y9dHR>TeGEj&ri&j-`;+l~DQ#i~HX>=+3YrWQ^?nP-`hNY+iBblv z5E3~D$)&Cw;>0H}Jk;d_(&R#dr-VKg#XHCGbg10$6GWYsh^PAF`(tOw+?G|~hanAt+$s~G<(c_&;L?EJbmygG?8)4HOe5R}?ob|{Vx777) zJ14IW=lpglH*}Yc$XA$pOILjGVt^$Ga2JsnWUra8YRP)J>D(J>c7?lZU{97&%(z$M z!4E^uX)7blkU5a|0$zFN+8hY*vHz-n#r%cANgE2#hAAt8KUEcFlOK{eHv zw5&YuW}bFH$rr+EG-Q^bboX63PMoIZRbwe-O4LldBygU`GtA^pNfXL!=6x(h3#1eU z4w?$>CditO5 zuO>>3f*ALbP3`D|HVm6oFa)r4c($?e3a`O4Y6D}l{Wh8m(vVH0L}4W5DTZ)9;|@~l zjAxvjeSzzwUq{nO4Y_J+Es`IIKbn`_0D7Y%w&hm1FR`jw_SHaP<}V_J$q}SEGtSM% zw2LC4eV+!X-+G-Z#Ocp=Z>o#{GR5e2^jYtT_sB$BiXat7ZT66DNHGkqf6q?4B3nl1 zq|be)K}(_kbP}TWF{O|BkE(!18`v{J@`Cn%ppdF{v;&*u56izi$B%`Epr3ooymSAf z!}gai7oUa%-qZ-eWcKoiPaW7iyPbYAuqZ=Ulsx{4^2OO2;y5vBrb zQn?7>SC!dE{84>>jiqpx6uwMhb-b&xo*o1@nFGq% z_}(^$8Du8m$~G6ac<)}V;V8iykCsO__CzjF!!yV+1HIyH$=^2q1k@S(kKqojJS za5a~w7?W38f)sRf`W%o^ZO_ae9j)S)fYI<>h}b_dqxhQhkob&k_zBc=y0|&jKqHyX zCeC+ZK1TA?K6)#~ams0Vp`bX8Y8qF?zo2Fp1&@5MSoMXS;w3zF+ea4oU{bv?YpkW@ zTjI3f5Hl{IU=pAjkVb7o#X5nk@o8BL-Q#I}-+}%vA))zxTw345G3n4#;N?DQXGk2; z3M9f|dgK{P!IWrK?h=+mQRP@|2LrQol%a0Xrg!9_$-kFRU4FFh22l(A0`Q*;T62{{ z%?blZ9im3%u{9n2h@7+_YRNB)q0yBFK7a|ou@;LyF_dsmDy&Vlw&9~?u_|{EcMtu5 z6jdH`a{=H2TWE(O3!Y6#$3OFLitX@HEf0nIPZr9n4i43_t;fGGQ#6TUjbhX5c_j>| zOH)!i8AqQY%IVl$}QQOJS{bk+XzYsAHpi$+0jP%T=&=3|UCe+1HJ(DK3Fhw6# zlJ~c@Ig#X24N2Aq>nirfbC;m(xz8Ollfw(lLRbFg>#-!oMc$P{BWX7TAiSw^ zvg?+AHRy*OjfYT?VRS4@sGUv*uRTs;R2Q$uEv)Zy$cIe>wz-2S#QjC_k?Vo@HRYB)!@B@GKmuq*NDwjGGL~Yk+(6xvAMtNuxP%`b zn%;ZdUZOCuJu+b)aaRib@_E*F@&KYZlOR1YZC{fC2hjP7k>Qqo3>A_l)d{Y}^39gt zuA2c<3tKw7E>T6UJl>q@K~C?yfU(le*bMSPu7FqCWeJLbJ!r+Rg30W2mFI)N?Ks^# zsOP=2ZAv+nWr++ZnepQ$uk|saUB#*~a-nHHFE%v%TLb`4Q2t9?v(ppKqPnf4J=n2S zt~RCln)~d;rEdrs`N)63;n)@smkOeHGq2o5b@8usp@nhbxTn8L@*~&UVudiO5nj+eUfu@|Sn- zA~fn6e>_R{z%Zb~(!^sKI(rd4l1WmCEoSJ+ZD2*NQ@|6QNTLosZS>+$1AP9&jU|Qz zUqW}7GQj$pzDN)3l7io+o|V~ zk6g?*hVHT*0P^bztF7>)i(==lYp-sU<+?4-be1$@w3j1=fah2i@{%CgBl8d{S&@8B z??kUG@F2bE%IxNE-_fMR?Zn;|>_VU;vR=6WkF*&)~d|6Kjuy*aW&0a!T@ zKGGWPm+>sCG{>#6dwqCB%8S&1*Qtyl!`^G$>$cPgPy#=Ggbfn2Y1f5H1v_CiJQh4= z;eT_^F@pSz8^hj}f=ia>e_G=y-7s55HY`5~KlWW1r$-I=E}Bmyr63dDifW*{Ve#E!QC?Lmoj(7NNkm)= z)eBF4@}f1BNjsaSZznIKTrLzDyC$Y`AF1yH zL(@v#g@WehX?1q4npKZi1}w!M?(@#-JG8P3&S*~fM(I-AlUIoL7egs!+JNy(qxXa8 z7n}|}e|>++gJYyudPkLgc8C07`fTXz!F(Z^nsXZdUsY|bjnp$yrh?nd;Y*7GLh09@ zt@q}mG!HK_Y(A>mI|cm$!|;6ZB?4i;w4mkkl*Sr-?(FelN9FnaCDvH)V%1`!=|pQ0 z4f(r}B4+$zWm%e>)q81(%sI9RSe+p>RC$^YPs^H8F0{#&U_QZSzw|8({VkXf+W-)n znI#f+&}7XuR9#v{C9az!$11H+Ok6R9sALLVv(n*V@7XjH*l0t zsM6KSfB741_KD-NG|Hxk3Rdy|{4KibdXrNH$FQmk`xk|j8qUnm$T`)yy0n>Iykx#6 zH`#8)_^0XE8q4~hs@wS5^FE{cp%B4uiM<=d=7?$~IMj7_KG{rHc_t(D*G#DJCm%%H zECryJo!rFYT)17Cm{I|;DlKPnZso(hjKe&g+46!Om2aCnRU>p?t5I5|TM8_4t zHd)1b92Et}V`bc$7#~YOhP7pfW(O zvjpZuW>zzz{<60dCZkJfM6-w*8BF zw)jtae)e5RUL z$$ZMR@6IMlUZPP==Lfg+ek2n~o`1NDtWt;d3PMb3Ghi0YtY1!vFlBkfaRZ^40Nv!P zh;-f8E(|#2DCs7W!Jnt9Ja0C${*q*@0G&j1Gb&0B>=LeH9VuyXPrecTDcSPnwCMjE zI8A7?P)3IZV8#KI$&}}$QSBcls9MC6uv(1#;6XXF3QmW}rwC$D>0)?Jc`Vvco2Ix) z)-$?H-)p<=G)`#|eabuut~r}c}juAC(lu_Zsi>(sOC;2vxKGm3~w)l^C z%Au9#il0td^aA8rJwio7*7VsS4yaghg>t}6BEmt$=x&olQPN*C7crqXJzxSPV|ym9 z$kh59Wq50GHJf|8+6WU@jLr@xbLBr}J^cohe4xpK@1M@SE7N5yTGlwJ(}Al=+fp*e zM2V(I(&K8e2IpJV&@UpW7`|1&O{s&mDdU!#AKCg2#QIOnln!d9&bvwVaF(1yywD_{Aisr5rH8BZ^E6}Q z%`&h7N`yCdh}8y(R7#>gJ(MMvCl|8d{+btLL@2U^{p`47$h|ZPf1?~@=I)$&F-g3{ zwt!grS5SOji>KvJ%6O{1!7b1-vPF8Y*cv)+e7#8yow#|xYD-iNR>RO?$q6?6Uc{g35a!C- zU4P0W#3Q4@K&|=R-F9`6VVDOot?)higR(?j43f51g*fB1!oJznQR36R)a*TjCf=Ee z%c?C6Ig!bzp_=~C_|))pn?^z^n~Is6Q>^9eK8sy_4nyyst4S#LhUxJCKrO2M5T!ys zC(Gy4_Vyepfqg*9vw_35(yWeGk-S&VMz)u=OR0jX0UJ>{<=YCJo{i=AA<6h2M|(c^ z^d(PXkw${6aoVNe1h*qP%T+@>?TK`S;(K{lVt?^F_d=^L@+S*l?c_7U4LI#qm>c;V zgBJAhYfL~sd`gnc@04wc(6v|QDe$=jMxe4~zru($abAW)eoJO?DXLe@C@5-5Lu#+~ z;j!rPfj)v$NrT4v(=3umU+sPea9w(`mdL0ua9#8ryo_zq@GjjB!_c` z`IMesTZsdoK|}pP>*xW`2m68UzrQmCg(+qJ5-t_u48-P(UE;tB=g>71t?@n&zTWFM zqJe7>UD&#ypYoN0z3bE?(y&1^*s((QE;cO4m2BhY${41hVX=HyQ71w?ppSuprC1NO z%}~9OpdOS>`5jz0sZdKnd$;aL89yqbH(M zAqtuK>5Fz%`OkYsPq$BPBlr`|V?Ej44BR?ilj9V>a_o>cVHHPE7akOz z855_2 zd~CYa)RdE&F|8xd-oa^AI)Xad4*$z{p%^qwzQ2l^@~gN3aLK-9`7q`OG5j?`Y#ULq zB9}ZFW9_;*BOv6#6%tgIVio$qTV~_aOZEG3q|Hd6?6Dl}Mm2LMih+(HGwSf{bp%XZ%dBAcc{r>>(Vq z=OEF2ImD(%a*>D0tod|AX=~?%JtW31XHD#IPbE&G^Mb=C2vIp^RJx~E`~tOsAmzsiWx8nLWItv|9rAA%AF6PZep#rTaPA){}t&D5cA&GUM1} zNmK;ukw36{9$?|ztr98okN3n{moRg-DDw4{*`j?={8*|%#939@C)`n%cWD~9fw1YD zAdH8vHaz!+&qDvja}ueFh%%jwMKVeh_hK;6qy0_VOfnFRp(l-oUkhxRdpOiol<|M0 ziecmbU}*Kuaa;ev!;(lbwYJ9LeyIv$x$y_;Xc-o9+VkGv>#5e136I$GUM)V%yk3!~ zRNpK)q4fZZvqz;oh!>KeA-JnhF(2JV$`of;iD3BWn!?OU=iD6@7sl7CEEbgEL~TvV z&@8ak`^~IMsdTdN>t2Sl9wC7tezshAwmp7F(dtBB@;&l4R5vuVXv7q4hem70OIH!cSYE5$%PrC5v!!w|a5VIRzIQoQxdd@AIw0hfA%CL2|lQEV}huc4=1dCVPS(jcF< zk;)ew@(3A#kS@mg)TMT&@rBCxyFIjG{#VR#dqs!~X6&=@3n@Vzh;*71z^kPmKh0L~ zFuVE3_Y==cIjjVqLgtifk@osu7S}S93%Y%!ApfE>+RDFECP*eAVNgM_GR2aa9{=-U zzCr<|DG9C3kx=1A)Y-cP#kZZKEt^oF3H=9TB8ccX%vHw^H^kD`4qPlAOx^7|Nj8Ne z(G&p=d~;8mnc8}2S_LTTQi~bREBalKKg0=lE}e2llKhB0OhqHe$*gS#$f&v_n=bQ_ z@=md;%q-6X9vtWj@Tt=f2Fe&KPoEp}LzcX&=GpuV| zdWyw?E~ldF!zK=l7cTA1QH?%EpwkLo9S^HIiu9>VlX3mh%NVxO#-J~eFp5L%VYD`4 z^_1Qqy~nLd_W8k~{%cwaX7V{7ZKLVe_vcglZ3_P^^gx+c56fDFwpA&UPADNI=r!H1 zNXch`2fK2Qd=hMo2UicFS$A;IFS{{l!;4)`rbZ;_m+SpZz>y|_OD%h_b#sZ;90lw` zdLAE91cHej0?^j5Shi&#%ti90R9A3zD5~?9yt)6aF%G4EQAa&lcrWKy?wbuB*`CM! zhB81gQ8K0a>vX0OdZ2QC zgs>sIUq8l#)3`fmUw03drEoBvU~?38LY3J|YZ$Qwq{o1@&Ug&^NLO_}9a$*v6x9Hz ziRQXomviHHds_Ssb-lK8w^4%6{J4{zfQDo}-bVu17}mwcR8B1De;{6>`Kaodn#~6z z0HKMR;WGbi%BS*^687?a0AX%{Tf-xzpX26O=)fNRDAW%3sK=} zvMGM!w(fSTVVe4WyMm?3k+qF-zrFbddbk-{$E6YY%Il6zvrkW)TNCcEX^+ao7xr|j z0cCVyfJV~dqi9le^sXCI&Djvk#+^&G&&NeF_uX`#JmyNY9r(iJyV4KaGITGSIJ(wR$k*DUTf^R)Zs5N$9rGp*FlzW&Ic|3wY)vxvwNKK11xU!bfC z+z~ODRKafY%W zP)-B#HA(&)-1#Gb-5PQ*6Idx!dOD7iX`g4h(LQF~8=j7Q0E(W>Qdk0T>I;SmZr9cfxOcjAh zws3WoNI^jbfhOqi{i&K=kc6EkbWt^WY)@nG%RYG({yjV~xK636-4P|$fJlbdmTL@f zUF%Evj`MEZ{NsguI^33h;?mItseQK(K=cbtoF93pZl;{qRBO9zWzwMKPF zDG`O8P20kxmB}dKq7uslm!^zCA~%-s%*Jrq$oS z`}a*eow-@h(cF!#4WKdjT>*Wa04?Hc^f|08=xsBS4yM+#B~BN?Z5_iI$`#mg#)LP=gpde4s|{+5psGcC;gM-o4LAR^r2Cn_3~JMf zr?&LR7J$Ab!p5Q!D?tWyNOaUFjafAu`XVog$ql|`aE5I_KfX7_x+2ExVNWVHpHFVx z<20o_#>Z&R99wP>Os!L}*X}%Oq8!DWUVQ!7a7fTKJ%(Z6wA?)r05yK!*53WFFdlAx z5HIG)jH9d(v7CXB5bk-gU5NP1hq_E_(xv0Cl20@bB$GVtD5X|Uj}6;^Bh0x~S%x*{ zKG$B8mB;p1lQb<3mcmLV2h2h_(h5TteYa`#MRJrb`?trttE%M49pXfr1hFvs>>+&Y zU~kjLRHF2UefC#9th~dns<4Q>J2B$>bds>mZZJ=CNw0*wtt1_NgPOkBhAiM|x5U2D zpL@~bAOyNJHWNbe8O%HdJL`C-?*QYL2iOXG{EAnbW)~E`HdDy_DjyJ#yL-w634f-KnY2dRX`yBqtcLkS4H^J z3&cB`p#E+~&Cpk(zc`3@_VQ{oy=CnAKZ?%6AMVGG<8opqPfc@j7-l*rPuDiaCQeUx zH3Ow+r@^idk;e#f6)Bj<7SWG*pfw3DX$e2*HHld5Hj} z9@ha}itYZRrj40kW%0(SN1b1_PW}rO<70}dtQTC7;qhnfz+-<0{+(D~fN-PbJ7?~c z&SH3hEI~qmCfd?DbYhWpfaJsjDU4%j;Zp{X8hl67TO!05j?p33Fc~9hRPmYQ*9-zE zmmD4Nvo^1-3S=+F$Rq#5Aq%C@SI#%9dK3nKr>+V;0jN)oL5~uI5G`5VKVOvmm~7&1 zG}PTyIH&!1f!`(HZoC!n=6JWm2=Q8UfXK496h+nO{dSf0A$3~n&OcJhw14IPGkHaq z=E=v*wl~w=i*JU&;c#xQhci-ut%%g7l5^yko)>3tBvoEsKqDcx(%51sX9ZIV;AsE< zp=Xw5eh3XmQgXRKlOvB+zn!)vn%De^2|K1QLC`<+WKxkwPjDQtxjXxO@umGOS7w_Y zM<+VveNpx(g?d1EbneqP$6j`3HsE|O#`Z1bd>P6W3q#Pzy|x`Met&5=87gYHB-S^v z#~&Pbn!FAO#rrJk>?pcZxxI`lu6L`MyK&-8X5h4Jx0eBxFm0b^D9Q)DBM@w$Rw!}v zz&7g)m;*7TZ;8f0kz8=&E)}4rYmc79qXGFkr}SM*l`hDU^JVCH#+)1lLVnZJD~exo zAF(9Z;;Z#CzIDFK)KwO)v4{yQWxX(*c^` zRi{*`OoBVV(aD)x=Edbj%|<{rp62r1zjfnHc))F6k8pTAfR)whUH)un*WRosgG>D8 zm#pQfwDcZeY0U02N?9tYWq71|?d5Fp zIg>4H7$vD@@AynLGqGMfodK1y6k}_-+I0cz;j!ZKz0V+=K>Mx{(R3D93xpiKtdG(% z(XJHiiSv4vz8FE+nk~K}00$`g`i=G`3S~-LhY+?!O3|g()GwSv;?CMUmx>6HmSS5S zxuG21h6}{g_o(2nQ=xq4JId$%Z91O)QiG*-6(g*kFhbli)+HShX3Ai`>P*y9*DG{+ zqKY6XzSypc)`Vk;w9y2xZ#*WQtiUuuRO(0StAF*H)_383f{ z15R^}aMq0&E@3YCT*(w0AerR|*4LyJCpBC9{9j0G$Zbdb3}+2&d^onPOff*2uho;L zL0JSdl-(#0{$~aqdnE5@Tcmeog>E=oLol?cukirN7wI3zhe^A1cSp$er)vBBs`cHc z+!jy&)Bp@m>ja*+=u%}ZFgsDcuxHP^%&5&L=6gQTj=w=B@y$1^udp6p8iUpixL*o^ zk=_GSiJ$?)g>S7t>*b|BDusLowv(8uwQ!w5zRyo-AYl3z0p{-qw&Pf8>O$05ot8~R zwF(1WLcs&d)^6*6{tRez4+@0Rc)c5B;*vmDSDl$~D%fXKJN!E?=UUpP_16<_tI^wB z$-!_oJzLoKnGpQ+e)xD?`fu6rUC~SRm6d=4y;iXkRqsMSmTwSm4ks$cAS>FcluJfl zczvu+FkIG1Gae~uPzbzp1t5%X3_eR#c>*ed=&0CeZBf$FAH=-T+fE{#gvWx!3-X=P zG{Q33b1Ylz(7CMO->+F`Q4drE4bvXtC;Oo{ z?)ZB&uT+MQWT!QD?>o`!`d6^c4xT_cAS0-|3E5puGY0z455j|kG@kAYO6zMrQVbpDYdf)CRvH%yH95@ z`&$MykFjTKSh&7>29PZ3A&*7TN_|Ezn9WZ88K7y=U&I5E^MnjW8Y;SVQAvyU<>m@P z^W}e~R-KR?5Qo+W+H868wP3I2MAGATB3-i?-6zoGs{Rvsb*WNqwf)E#(WQ_5Lt$S4 z>mG+D^z{4nl-Hkj4ZM_6FZynTh9vxoilQZ6L+>JO`}3FWbnp}^H~S35g;U&{Z432h z_B@9{xTYf#xF`1$Ti5+B%J825fOOkvU?+_aF_s>a4V?#6myFWKdXbeks;P4h1pnd0 zf^p}^IPX@&uP?GU;3SspJev3iO1$CS80uAZL&1+?p`rZs3QK;jEks1(6+sKEi43CG zXAm$vGzE%-8;O|&dVtuinsW_Dd~Y2yUkFvC&^yY}oN9aBz`=HlvZOvItbcKJYW6Ft zLHKXw;3U5!0yZq$M90WKUVWr2`n1+5EBbu(;I(rpfMJK=b6Er?KTDN6W*P|S(lrmXkt|l3N$DOgc+B}mJUPr>@dN0QeD3}$&13G& zW>86XZb<*ky&FERYQl~gIJn^yfY=?_nr_4wjmjD$1r7i{Gb4PF+d2m9idPc6dm1Id zBExqpGd-TclxxG_U^r2V)}qM0hS%VviRoLX?r1)qLTtyh*vyH3PU;z;G`>>zeIVHV zdu|7>00e)20ViBFfdY^q-9~7eKYu$T<3$-QK&yL%a?IZ}i~oTeA>$Q1ZH_hPDMCx* zPyj+$O(fERi*U&Ms*}GAE=!T_0ol$cq(_YO2K;LArGKsdoNLCHHy504(v z5O?)6d!Dr<7hl|DCUg||VAYi;5V#H4Fq^jn06*%JTRQgIcE)WhO`E_PB{dL?8$BlD z0}-}?alWXwIMa9RSW)7XpaN~*7^`?r0f$&`kLQ%gN88M<4C}tvxSEfhe2HXVUqPd9 z!H+{*&fOV*hWkA`XYKGrZx}3M;c_Tvzj6oZea``+PO#)%NYtvmq_IA=U8m=y?*xi9 z^9|(Yz=Fd#Is4+8;!kBG*&m3)CKpi{#Vfb9Sh{=1hQQ2q(H@p(B|HDTfo81OC^hpy zxyGkYng8}26weNFr{2hq%4VzE#1_bf167u8E9W3)de;01r%hOrKN|F%f@aVhora-&+$`@ zUywL41wQnNum28ul&u&n-zlKo2ebhO`;R2s78fR(f2Ubddl-_=w|x_2aF+0w(BddX zL*d^+YH#GQ>}}dxa7r+=@sbn=m!Z(gZK{f#5 z;C(K675>=v=*zZ@W0Ckpwgz@^kbcMCzqje9(GKNY)Z$VS?YIg5d*JfQp)*%0%eEz(paq@?)?^$Y`x-6_x~RiAa+S`n)Zy>-aX{%#BB-!^Wb56Va~u?>Fj ze%uN?so4}$ad+{Td~rX2V5Ai%|AN6~O>FDE^gf?}c6i#s;{acAxZ1hh_uflT`~+*| zz(L4R!O2&<2~5REK8pd`&3`O4Z$fRWWV(Q;i1zklsV@J$@Q+(yzz&1D?xYBB=O2fM z-V)0IW|x(9)#BY_|Iu+zh9jp-eeTZw-uT;*xZhX?i~Eu+H3u;bvPus4K@01ASq6Rm zeD;*!WAp4~{gvc!@}S)kIdh*2`0uw9X;eh|Zv33^MJBo@3BqhOT(Q8&S&>V(zKqt!@uwC;)W(_3dD3fNF-t>eEvh!GNvB0^(-v*TsiC zFFcT`054G?OQ>;-AR{mxo1>fd;2CPMtQo$_q+xF<7N}0aqL4|McEDwNarV3~W-x5i zp;TT#yJbg{BY)#c8xy~YUwSJ*-8?lPYuptmLveC`ZIaQK4(7HTZ3Tz){Ar{pd%m~G z(Hgb6bp_A3Y5cz{HWi$GotD3&nxV+gaL=a28>i`RLxn2v&`^k0$b4Ethq&pmu#h^O z75=}W_EFsHM2xXqaJ5};^b!U%$df?OFd79(=&h15$^Po??#o$2J^mj~KhRE8+uSfh z=G~Wm+OqxaZ$GEut~fW5{c~e8)%RKIkKY?=`hJ^qox>P{24chXf@sAw}9I zo`?>V4wpBxv-H&^B939(L7?AeuXqnczPSIvTxcSPvsWqEmQG<--7SC4mJ8=851hel zS}8UDgC4+KkN-V%*Eh!IWn5HsM8C2F zh2@%73rwiKpD1L;PP#PoYN>Pel2=!G{>s{k7>)$h5enu|OAM}Z)O(Rjqn%lI-g&mk zY5XR7Lm<55-@;F_gy#K~pZ3B|v~QWML%)gXOR8L4BEG@BbDHXZ!ZUA+1I<2ALYH;ClBYfy(G|2M1?qBsI*iPQu7SGjMxnOa5iq)=84AH@*y>hf!2RU=ibFyl3J=0GEh(uFH( zZErD^kLx%Bz`z7gN0!aEBwXR=$Wb^OIHbT{d!zK73B;acrCf;~9=`yerBOBf`>v2l z2GCQP8{*O~E)gli16TuFzGY}N2;l#AG~x^{+vb}%sQG>uG;F=t%%?j0nuyJayj4%M zqz(V9cq+k%kYDHveN=USr8zw)r3n3?s9TXZHFXv4st&?%WPB~%ZMe`)-8hzcCDmUE zg+0+wV|pII0s~df-xBJp1o+7OJb!oURd{@O3}MKsUZx3mui{H#d_6{ncX3h9odva* z<3GLQlc8av+4UNgwAup%gZO-&th_mJ=+rd)flusk?b3|GY&xWwdMR)~Oap|sFUb08 zH>*3wiUQhCw-48x?p6|oU8F;(%?qE76|x~X10RyBKP+^Z0Y%9ZEtR>RJ2>xEqc$M! zj4z!)$4Vmd`!8eJg~_$|@S7fRv2@wGng4S_3JKEPd-V$zwHfvFyB7Tvsk}Qykbk9Z z$Z??#GvLeA%KiujDty1NCpC2vMy8pIEX^g)I-VhFMU(fs{~1?1(2da4t;$fm(ar`O zt|>T+t$ByL1f{4GN>*fS+z?HBxT7|QIK@)6Jp`-vYn z`0alfkCVz~_ZmajkBRNDKw-=$){#g2n2!)oX1=A@uz+K&kzI@U3MtZ{`%FJ3ASpAF z!JEfy9p-MWpS8SFW4EfVV5z0{IyhseFm@+((vTPqSx6(NXKE*#W^Vhcc7?le`P1+1 z=%-k;g%KC;Vm{>c?#qo}qorpFw!Vx#i~41F1q3kU;NS;;T{LP#>4_}B;sdT?@AYoe zh-jI)RlPTr4o;@jO~lwv}A^5kU2%qbO)xq62G=*kDSSbi0j zN@p~8oaa)ZF~YPXGeI#aWeowILdTcIUjs3=M>&HbQyrcfblw9GcNXl5t#eaoCMP2gxZGW9TT?022mup(}vix+)ITKe#P-UT9h)FEqg zBLY2os366su!`s>#+EcqWpNVOI>yem#PZ041C^M#e!tu4;w^wwc3nH4 zdGRhPWvDu3MNFjSR)jBG+NL4ZgQ%E(O{y|q!n8EiZ;#8L3!$(hx?>)Poh5_LPX|46 z#c;O2hVgM0+D7>E9qCuE^Isv7FAoHg*F(B3e2WVPAEHM53Dj(Ox z$+nTyk`JQLa|EC+{okmDJh?|d!2F(W96%gDh8)(y=!slx@*K9&1m|~H8ECzD^MN~I zW$G`#eWDfCSyQg5>!kOL=1%r`!&M4~dd(2R82IQsfwe(+$$ir^7lVVH`O~a_TTM>} zkWTCEbp8WV2dM|Z?Msn4JUJGf*i)i!Xhg|9D(?NSvRg@(gfTFbUqgjRpM!B0^xIf#%BswJ>^+tO`K!rGs>{5A5(Lhj@ z%~44bH-@Eip9pbBeEN>&J%|qhC9nl1o01?KN2@47um+>Mj?r(5E^|)-!j}dwHE{MK z@6{yEHiK*W*3pk~@Ng7!g7DskX=?Y!3=vT7ymlOU9J;Ms#~Jmr>&tXf38(o5MA4V} z`l=s1LOWh|E`xpyyLC8F+WB&??8#Jc5x0PniEO=wIhzqw7@5RlQwGdYa-^vv+C>^y z4z^a;*G9_B6SZP*kn`2MZhfRgKd)i`;b^{nO_IRea7-gN(xx({0U!eZ*82Pk zm++*HQ|$X!p`YVe*q4{N_vl!u{M1_Teyl678h0t}(?P1Uws_J|{-$>!3={-NONs)n zpVRwYWh2|5-+>3jp>gSZ$Iq2%%?IYm&MD}_Y%DXqqT*e zxF}!Y3}{|eRT`*SO~?}Y-;{b0RZoA2*Qicyq-l*h!Ux6>c4NZwcTuQC#RilDm52z= z;lV$nal24~XQ{%3=uN)1L}g$Aoz3Nlo4o)ILcW{J4;}5=2PE;3BaSo8!P|mq(w9tyPdj-e$&$vVc$oeLuw50 zBY~PJQ12R`DT?P{)T%{I@X5BVXo{H+VzO|Xr0j{O-qlJK=-G z^`ZHotpnZG_mDSC=Bk)Y7F$KVOl_9Wa|!OQnDW$OWAyC3$-vMnY3NTfKiyqvHrX%$ zEcxbPyxT4c#i`-hRG8X+s2fZ7{xa%&uWG3~ActwYFf8km7yI=poQDA{?B8@5x|GEa zeJHqS+AQ^_%i~@p4ggO=vHx&DMZmj7sCqGMLY%HWr0I}@ZSR&pU4F!A>`}u84t9-2 zmq18ppG&^YG~RXKojP_~9(PP;N61g@y-Rq2=Gs$hRrqOrqHMr$U-ho{eIN)WWvgAIoz^e;x4nL*A18S~C1R?eH~IGa{Y$0-NL@wLa!m50{%Z$@ zYvYYLlDci!G;m794-UHH6X-P;Jn)pGgFmVa!E7Pu2DXl7)LcGcGTJQPXqy&m6w5kE zEd7T=H324Nhix2fYnt1&3;}juPJ_V{?)!0!E0CWWO+766Q>}9*E~@O#I+%c6zUry) z?OU{(Z|6wu)}5~vuFBWs994f}rLJ^}oz%xt4gbPGK!$aLInlh~y(!t}Z)qbtTGG|c z=cY?M!CoV5xp7Z?SmZs`51mdQLq6nC^DW9aOy{}H5tl+(tsfpm2BCDO&HK4}HY`VC zyfbc1=Epuyj|qMli6^HG7^74Jr43@FsVLf_6Y=YJAc$}5Et;=O58BzL;VRzTW^dz@L$+6Wus`F7e{5;y37IKGNm9Q$I@uG<}ojxXXnA1J=#XQxXA1BQqi zIriVqh6=)qkgXq-T6I!r>>YnP#O)2lAyqJl6kj`m*@MYGy^v5^py*%ekAfE%1<{o9 ztgvDBK=5~aX5P{&tVd`ey=)SW=z$LPBs^f3^2syY8OM8*gI}jq;xSYQNBrMj5I7$5 zSX^9yzNxb-1LMXesn>Kjc;G7TGLH! z@EpfRsW*{8og2^tJ5!mr$>XwkVwXE=W8a|@y+%BE?2EkCdgb{OWZl;|y=1Hm@HDtT z7v#nDgKC7hRRE$#uZ*W&qR-Bres%4o_;)aQoEg0nGa)l6DJ`_w*NVx84}rgSdEXrO~iVRF*;i76R^uHn* z(`iSJQtJmNenl=JIq22G{V~gzGDCIANX7bRCMYOYwI#4-@T@Yg4!eh=k^ib+V5$6JA{G z7VRRrs5Xd<50yjz!}%V=a+YZAqmkqds4RzzDcQeQEqEC>U;)+G>}^7-w2I`Zwx1ue zquo1kOTnVg0zDPvuV-Qim0%>&iUEmkgJ7%;)`T2#Up%|Np&@JIT07%eO7fD&a=Gt& z_o95~M^!UC&7^VKhVXUyj|9#-npGB6ysS*V#GN>+HgXu zDfY7+>VAioB{5g9FPRSO{84n^aa`X}DNh&;*?gyXo=EhSHB?IP5Bn^9l zo@tP=IEGq9KnaOrjb4Ns^F`t^SO9^A-_Gb#@`{b|9P64V}<{?23{QaB6U?> zuD@}0ozG2OW?D4Q6~{f@{O`pke8V=8c(SlWuczdVd1Wyd$kyF@-asCxgDqBVPGR)u zz>#-y(+Mt5<}jIfavzp?^TEFT<-mDiWU7`+U(^08z36HnDy}O}+0dx#`8cb$wueni zacc2qcfFEu<$}Mm(tODxy9Z!VAntTJ z-?G_p8-v3@N>f;`VaT~8TQxJO<9xHdt(Dm~G^S#Zwvmqg&;@hS<0c|sV|6wk0f6;c zYU@6+e0HuD4ubVow#1jKkv4D2OmdfFNj$!3xKoDdv+)7n;Z8O651Pm{jgi}~EO7lG ziiA|ktC9`DCH^0dE0ZRef9UG?dNL9qdzd}r#yk<$2{}GKk*`f3*?qhFk~=eWLMya8 zUw9?WD=8`nI+vfgQl;RnF-Dc7Wg8cTY5pxcM4a0)G$X}XIMw@W)zAu2)V-3vA9 z;~|TTG+_oW04bO69|ac=Q%1Brky!ycRl%99?FS; z_&TWRz9tm@r-8brBH!vioS}z1gLB&&=dQo!Z@TwDX@L#z25s1nuzB4RK=kf~8+WDz zm*Lz#UlUEE(eSdyQnMq=3D9c1q@LDs%J3K4*~u^TcA9_rDFJ4!`aqRO+3FT(|q&@Dz_R#$2TGv%h2HT?vl zWB*ny)SB8A8zYH(SQJS~-z?3VKb4%w+uQ`0cD*Ujmr0UUh+DB|^MdxipP`Zzz+UH&P;cs*o|D)5`s zs$WE7`bw!a_tr|LOME!99jzjp2k5y|vBw%^Mhi;~D()Nt98p|dIt~iahiZ#jIdo?g z?rG~$gfhE)JMD>!_)Q=$baAFm-21+`DP$wtDiC~!MJjXyZV$V*Sln~4!LuXB4zUzv z+7Ef`Xv_0N^@PgVjvBp<#s}`6+HASL^4WWVryP60!a<7Ld1qkpEZk9Jk3xDJ@8bms zu9;GM(w^jvi}?tXubmQ)Ht|Smz0O!HaOHZWHp`nQ>Gzu+aD9g7G12B2t$9fkkjP z4(D=-_rI)~4;;^M?NuU@Pw3|^RNS9l*88VihNNyrNVk0zFkDpx8R{W}{ zqL}Yb63q14r(a_D^$o!%GF#lMZTSyD+U|`kG7xSBizhuS2hhOrv>;Ai3tw?6x-V?X zzZ#C}vt?DWsjFT9k@2IrBXC8QdhJuWvkWT?7YNUtK#2WdfPt9{F^<{RcbWC(8cm|- zl3lU}x#4Nkt{XEil>CSP@yfYwRW}KqX}H>?*MT$FDK5i`GcDxU7HVCcTZR}N*28>q zoZN&qzcn)>aR!4Qt2Dz_VmgzCnm>fZL9T09#5@P&KfeE0nNsS+Hr6sI8_Wmr^Gj9S z-5r6W-qw67f*#rEt<3W6wD7OO9^e$^M%*h0U5Q$#2%%3cE|QqZ0OksiJ>4(9z+ZV8 zM4=4f%NJ53qP9qW)TzX+#Fpb6%*ZioxJno*uw)+;4GN&-&$;#6_&UFD;-v2f9A@kdT z#UwL_?7(}?$=lk)1GRi`l6>E`+5<1HgPD0l=QEP+*7hI8F9u{z?xgSv9Ger!a&o|K zAu-AR=qBR#rAqCxpa_wO+zShZx7iVs;^yR-hU>l0?d3SuEnKqF9VE3TQ43`9` z=8dIbj@E++@8Bn^Mi&#g_vR_u1(D~~+0Ufs3L2C#{B;3N&xb~IVpsLkUS1ETS0{qufe_uIJT5zve>bG&sEew}EsjM1=FTPIAK zD8r?YT*Q1n*l0y-V3X0ElapQ1pAtQZe|&8;B-2T9B5HJ%sB1G>E(|5ePX}N zfqF+w#MC{Z<=SZJbly>g5i+>|qF#zwRL?)>z{fn~TDEY&0XMx#j@Eg0Z7nuwscq4z z;}LK1eo1DJ8!(MDT88P#k~)Xhy?tiC16yXx;bQEk9B6PF6Z*~%^qiVh%q$yq7#BSo zZ3#u<;8p8HDnHS@jq)!xXNXVcZrl2;bctxmSDAUTJ~i<|MbpOPF-pc z(E&HJjSC*^N$_qKy|yn(4Bw_6A()GQOJ;!E8ZdC$GtJjn{CC@LffV<+<#Mw`aD;o? zpB}l%ZMjlYRoQ$T$UU}*DGda86i?mHk2PiHT{{dkzm1xr-I#ERjDeZ33jN@QDBH}h zhh)C1Dx0lgGdSt<$GsgTK$D~9o1Us}b)&d$L3fH#vxr$h5EaYK^JwDeE>WYm&&LOa zg>g(+IRE06x1c=jn8w!>nT%0xKc7#w8WWsL`A<+4_xO~$m?zlLQ;ztvQd)h6-im5+ zKe!ohO>H(5Jv>y6`~75or;sQlq(;_L6Fx$FBbSbacS+#ha>l$ilCo`fLIlUk&W0c( zVVwtDbcb%!;|oH=!2MLyp3_Wj{#<%|QU-?~sZHj0%&&V6WmBF>BrGkqaI$?2k(8y# z0;X59<3&C$zl>+p5;Yf9|KXG?J7GdFD0!(jKFEHMr$94yT>gNt5lgMlGWwe8nPi?Q zGhhFs%XoKXqEWA0v=zWJTCl>nK{4BFPxY&uHl?>Z?q*KY{_-MAU8wd@?Hsf1#a*-W z00xdz1k(j%-1oD8OK+R1ziqXbuVt4c*;S8lXL%FBndtaxC5gky9ED(iZ_@Prg~ffA zxOYR(x<<}PFsW0vD2`HL@fVm<>1%2e6csz!8+Ex79lvUA>eFQPh48OU;IDWC@k!@F z(^}12BZsUN)KPoZs~G)v$`Ilqbnk}uc++F&3B*wOmW zYaVc5dV8twEg^$Q$sXM|Kpq4gBlslMG+DvGaZ<&8Tb|%30V6-USe2ZJCjEk;8l8P$38-8)E*iOn!_yx zH=nCd>=;Di*F!P9I=IH1>Qlq}9_>u{|KA1ix4J=3PvaF={ekD` z8HRpUKbahrMzuIInBGrj=u(qvS|yxXZ<2x_JXRANU+eV1@^%X$CLUj*NO;F5vFzh1 zp1~#r_)X6NgUO+h5}Yw0#hJJ6wzg?w^m{gK?7tFNRi&w&EOm#Fk1(xPtiOfe1GhLpb6JpibQl#?j)&i3xP z_W*^9@ktRn6PCNh6k03%MgmTo=4uENoi~uYrW)qN zl*0rs0Yjxs=%^=N^Pm548lC~>Hod`fL5CeB4~1NWrGR-U$wLN49N&w|xL+wx!QlE& z6Cf%{e2lobm;AbkG_lyifi}pAd#3BSTtP}atvovr<)XG8G*y4>e|{U2jBN2Y#+0w4 z=BBfkho?t4lm95oOO=Du1T#M1J|vggjgP)dZtbm*+=9)n_P$w2aN99*czO6eY-u+;XFg(YDW2`98iAmw4Q)L2ISPI^N^7MpV2#oF^xhWiXxk~oL`aoenC9&M0<$-R#h+3=x_Md zK1i5*JaeQ#WUN73FT*Nsu%8IEaJEB)Nw5;t)Q@EGmPWR^bZq-+P$5 zIj|{uaiHty@1Wj=xMapo}D)ac|#ok zRC-%Tt?)CjM#~w0Ua@XW{~6|RGgf#8=%Gy=LEfKL#HjI0<`M~6a#m#s;+S~T*Mtgj zWWtJP`%`S{#Rk6@jhp!4Bcz%-B=DpZ?4`+m9DM&jG(ILl5ZZ*|SX4O|-2$1uS1m~s z3w-Qn=hE00(v@@%bYck8sW!w9YiowRe7DRhRlSmurcCyz%}C06Ola1%i-A+YcJzVy zWUv7f?>@k>GrZ;hHi(mx>6SMvjeO&h0QXgZ$+!AN49Z@I4b4kYk%>}rD<*- z#RlQd&Isz9LisJ!6Gb!DO3o8WqW^_iS84thCeYMA&qnK4InGp3fvZ459L(KYcYyu3 z>j%FYrh*wBFi~2yGy;U5gxYXQF)Ol0%xt}MVoUu5N1t}J2d~4Gb(?MkU!{0nZS%rJ zQ}65hA&+|dt2+FqHgciiZ(Q`L4_05caDO|ObU)9RCnPV9{!*6skSPu%t3IpWH`W>IPb-(!u2p}BcX~*?! z*`#Wjz1q4F)b{Yhof1tHcD*ei9(g97GVp)yW8#jGHQaB7$17=R2|+Az6So49u2;__ z&>NbOI!ISrhFwzbgtSEN%OChs2`u(r5eaJIJ-_(vsa-Q9EBMH#l-IH6PVvs9od4*K za%AC^CcCO`nx8o8D?zc^mlnS0f2k^fED5uce7Msm8f!T3Uw)}ptjU$HC`_sF@+g#0 zB*!u>hXe#)S~C0dY2dzO1XFIR+?BXER6qYcycAIIz9b5VO?ZYfJF6O&ZwFBVc0Ltm zNy$wMJlK{Nbc?li=0onJ5k{WOg6e_5A3jnu#Oe-byK60DBW=Wt3O$^Q>$ z7-^Gmt9yK`-yFMouX)Vmd^f$vLWJOXdd}!_zVzFOGg5F=WHdB9OJNvFHoXzD1ov#O zFYj3ntul3Kedom zWo#;u*_y69rj(7NdV6xIKdwzYEx?a~dT`0nwZJyd7d-Ov1XPRYYH@fGMpMB+h5`Zp zLwvEnx^V?z$I>YJ&m?*m$hyi2T6Uy&$~*-M9146{nmY3}aL=o~0R!!Q_e_(xMB_~T z&EQ+>ILLCxLT}9;>)Oa-NdStfgJxx8>7O-VI_UT?Y)Wf6+U7#F-*}jdh}(Ty5ITc< z^1vyk?e>F(e4pgO^Z7?S3aTuGT$)qA75qvI<|$Uxi7v|Z8_j=^(24E;bMvs}?WrSu?k|Q@gYharK*GoI<owa;^lQ*W5&zKWJ&OF>5islUEb~M+n8|@4f)^zMp;aZJzhR#;=d+ zo!Too&A`X7l2jL?A&|#>#W!q5tA#6j>=v?0w{t0wq6Gqf5?EIdf@ZS0SE1#ed8g+4 zXl$G@btP$rg+E6G`%XJB_N3q>6=1<#Q7(TEq$1FkeX25uUmap)#QzsddMf@n9)2kb zE(rI3d;#?ACRz$#LfoJ$d~BRsRs2eA&9i!*;^Unf|DV7l7s#lgizO%+`NUOzdjgJST^HLhMuB7vh-v+J~# z-M5|zOjX>}Gqg7$Mq)#78;|HJd;(LMbo^@0osC-O-?oo|Vituf=i292@RLmZ&Xyi# zW8jD>y!u3A!al@j>!Ol=*4#;$Guu{;f}aIYz30Ig*KN(M73m@Siwks-5bYiDo1g z&AIo%zFEnZ;(A+Sz8m5Xihx)*oli5c6)QlEh>4bfy7Tp8>`;~D{C1lulnMIovlK#e zJ^K$fckPjr`g8KwJCrcIG?5wtBXigjXcf$%_32A z%ZHCI=93}0)-_tshAtE`tIQZ*#GDQxp4k$bj<9a~ zl`_PBQO3sY$_3*d@sA48)(3`oE|bd5zpPK+E^cf;{`unL1LztH9|5Zl*FO}>#VGfu z=`*Bo0A4|ojo;Vt)s}wQAr$`UEgDq@;6p7a&9L$yqd@O1;RT^d@+<9R*6e z_-YN%+rwj5F>atR&?FmMKmndgiE$#|nS|VW_@cN`@zJ_N{XeR_4kls%h&!&B<@0JR zX-QBRr^Vv+({(({UaBMJ&!_+4lz#E)uawL_>LJrBQfLzSXE>X;+@30Uqz4&r=E1}S z=saWXfYLq({xHgNoTDRwf6zTRKMQFc=cmQ$NcbZPjdJ$sQnqG> zI&U#n$-O$-lo|(l7B`Zl!s#`q9@-X1Ps6Rn4L%P2GZI%COs~BJPoAL`2^^OSzWMc( zvPS955WkYfc{p!e<%fACgz&sRQ~kuHLmy|2HI!}5#cLnr+BuF?lF!YdV9QPf5u%k8 zWn9tlA!frz6>FUefs$``9Wmi;GKO5AbKdXP(cE;+##|%z!G{lCF__PQuMIt^vFZIJ z05y6#^R74;AuLfxgg^8D3riB{JhCV~(dyUb1&c@O9vZ~!P2N>#YgTMFf#1n!!pITM2eiLcYcF#cUhVTphF3aae$uQ*f z%q0k+vK*JM3|Q|d$9cN1dsqT${G@ZR zyQ_QnV_)^$pj;DdmU=CGmvwcvVc=}3)J8Jg555V02_uyEAOY5T(vZn$vEC26TY|ue zhiT!OtPS>3v~Qjl2N&>se9?pX% zxy0J4Esl(*&WEE-MzD>4_VE(v-_CzHYG9s~#XXBwDo>?H`2xR`tr5pVD6$ zE@T^@cUQYP*{MeTgz5l?Sqm&4v5kIaIMr!BFO1PHk$`}mo#vvnD0_vlSm+b&XV+|C zcihu>Uo$N+gn!BgQFGl@utk(}O#^6_6@s76S2v08G=G>gge zXOGG1KS8Ggb=UvlXqmsXIhQHqgn6$`=iykpU}z$XWy3&ezYeeG&0qPNRW9{xdG<@J ze3;+0)3K#ApPL6l&?M@`w)XQW#YABj*nG8_3NvFH!hMo1!4JT#?s)aI6wS%m)e^bdE#ZzRd2@c2>>_F}{XP8W2o=V%Ock#ln z`0KV%u~FdnDQg>t5JAq(JC4Zsms{XV7AKsz-?tsfTnREyy;G;N0s6)Q*vlp%48Xge zUX}Y^~ zgAOz$RZ>w zN00aZ$I)5FHTk}McnAnchX~RzV#q*3934`lO9h8?OA690EjeIFcUpkJXpkBuAfUwP zo;qTb&G;b(M1%bI{=HU=w#y`F0B9C6Jp#ZjLy*O>v+k2H2_YavC>q zsQ$~$Vw=1DY)N{$Nz)T&5an!Jp9TGqa04M{tyJePXQry78d-v~2iaACVWH{n&zKqm zD|w#}-j$7ELa5d_PU+7>&z>5D_+A(fCb(Bh0iC!oySec6fk!1NEBf;V(`Z#$p%Ur` zh+*1DaH?*gXc6&0qo73Bj~hA?OVa(s;e?xrAr&wyZx! z1rHDV?QWZ#F&blFV^Ej7yhN8x?bb|>#d7LP>|6vHFO`cg3{a6UZ=4l$-$4xXS^|hpNA`<JP>2swB0LVlC z8p%(-Ks=ERd3#W~bY8#I>tT?O zDWzSz>aMuwvT3Q7F6m)ug-!CSS`18gh1Vr)dF0@AY|w`xvCC2k!IYMwYe^qp%>{Yu z_&h}2NO$PfTv6a~1CJJ*Pt=dP1Nk`bO=G7M!8x&2Z8(3WgX*2G|0Ut^7pdtbMaCw6 zr7%0IbYLr4d=QczFS>8m9_Td)d$vcmrGEr;cpL8{>NFHLU(FUxr;eZ&bOQGs3XisW z*i1M=%Q<%{2d!Y2u#OqY^jIChG$C3vkiRg2GEj)}x3$RGvi8#a z8<3qMcRH#}%S5v-l>h%wOkA@#H)vEaKdm5*=F?w@)R7$GJ87Y`Q%-1T471_zqsEwW zh&y)WVB<=tDRCPi133JeEepP;*22#~4{&&DEY;=_4_>b=?|XeBrE^Dhc*3>Poj0S{4zKxz&vTi{Q}hPKkIE?H*Wo2ijdI(o z*%Ltm(VF3RJ2UPTfusX3?(1YWBLm#sRbxmP1)muB#(asEhN9cMywmY2dXx=XkCcS( z9q~UnLdu$ay7~DkRLUp@>9`Z_P@cG0afxu*|3(~4#q|q0EU44E*1*#slQua(-)yWy zR49}NmwV#{d*S|Zods+*+1cmhjd2Z4T`+Qrox5$lo_s(P9t8l%%|pbbyypcJ9K>2eD$aU-llssfiwD8;tRaxv$P%HZ-Pwl$+PqP zQPd?&Ayd9m6y@%6BaycT-w)q}Z<+v%-3%R9_Y!oZm&D`xiY)i5-A{Nd$NY8uIK(km z5Uo|JS9j}iVRsfITOfZTPi8{kQfeQ&ZNxNzohM;GY{JoRHDv#{P}J?PHOxMegXKs9B-WsyULzUPkOcUY>%})kH4}>_!5cb)_C^`Rrz7Ii{#+s*<^}f2A z_ml4JdBd3u_{%@07?X~Zouw9+Q+WLnF+ar=Wd?0D-Me>Af*d*Zj#jSwOmtQwkY#U{ zS;-AF(|Ge9wgzi$W>B*1DrPo(7u+i}>q+pA;rI^(?CnpweWA*zu_u(N;F6}}=BwIW z*fx{N^nq2UVHwE}qnwN&-plPsu-I$IR$bD|nrW%GDs_DxQ^TV8bej1=7oLRsWXqR) ze>-v3h-YGw)lb<;PfNkg1WvdW#iWpe5J~g>`W&}mC!zYHOy3$XBHayH&qhWBcqDqu z%+eMDKW-AA-BZl`!c^pxT&N!&;n!11;X>e2T9DQtPzj!Cp0DQ<;NV0DgET5C+7aZI zhb9XD79cp_^m9HlKlSTl_foj@f)MjbWJsLj>ca~a+KokOz}PCoVqXlpLd(*5PbEjr zi|n6?+8DoMjtub~paa$q49by>DecM}az;#k;~)Lq^^5&WWo&@&v3hChbJ|?9Fufl-iNOtwauR>{9(FDLf1lcJ%_BUrzw4%#Jh6CIUDS2 zn#5A;*`j%mLA5d*HS%e;RQ5eU-$rBmk%02Ox{Y+@kFcic+QBjwrY`%Ho)*g;4sTtD zoJ`TxYS@4%_HB~ba1Z+=xs^i1Jd-u;zHR0N*HWUqck+yQi$f2aVUQPO(9fm;cB8UL z(@15f(86gEdbyr?ogI;n_E|_(@M84jz=h1wjwH+i&Fo?~wAG2G;2&+?r!dX)>OVMTqL?(~r`C8Jd{gVa%#vUg;1A~xX~~0X+s+f>wj;}VfY2~KN+HhG z@Tg|=%XghEJys%G!II-LhAPmW8!*=C-RPJn0_r{)&c@Zhyg6Hz_0lUIknYZBOUYwF zL<@yfi4ErwDCd=P6GY5JYKP8EJ72w&@xN?Nn~l~1rmA+B`R^iX`N4xa@o?(CFm>j( zx7~Qd*7Nu*K$jBwT=1YLW6iv0;~ufn6PC~QXM=bDVYdf;j%|!+V>m+7clD=2D^^I3 zrl;?c+iY(?<(s1^iZSyq;M9974Bwgh(EGPItyM&}FsJrWi%43>-D~=>j3R?-a>_TRbH6~T zJbdBGjhc5v1T;Lq1*ZdDGU(Lv_l;ykuYK@3vf;%&549Zcq^adIz-mkVv1 z1|j9RzsGPWR{&v8aZJ05fXX8?7HVD{>;tV$1 z$2tA(Tnh`=1k+_!jwLLf#+1sgxYRHG^IdcQIwgO3@2eUfg-=^HXtx;Nc!7T7+j6;r z;&3VN>$%z7kfiScU9OBtX=JXhqg{W8g*PM9K)92tIWE(VG*~R6DM5b@v+b>~RfgLA z4|J;-2$$EhyjX{WSr#7NL!-5|^8R*tvqHXC%^l5*~D0? zPOoLX*n9S%BO1VCxk3xY6yab)D}dgeCHnRUAheU9r)xpF=zEn>Vicp0bHWLGjxxJ` z#~W4JS|RBqUw%&9$dU?CaHJ^(ZvF?txV-zyQf=E1$a(+=5or&DgTm}RyTVM5x8o9} zzM9#(Pc;+$2eLO_8sL72?OmFR3u`znoc1Rfc`%6T#OA55(FORdAyc06dGIV^;!)|J~ife3L@si?kyXAEGp} z^V5pRotqySqc8t5g{&-9nrp9ZztP2?>x66Hu>xqG1W0FKzDN3VfP(R&@d30y?te?j zA`TAbFQiBcS+9Z1ZwQ?11{N0^!(@BnRD{RJpj28J7WvHH>A*jJfJvHvLiAs6N^#g- z?tlz^O7c3Zwg6`CZ@zK>5Gni()5Y?)D5;S5&1s3{X|+XdkPl$#3CL%B zXoC^to|M*V)7yP9e;MC7`{)PTFY;26Tivrph1>Bk}@TTn)I>_h+2o-2i#?8+^t z7&Zniau86Bz-3!!7})&A#Zd~kWhY1FToLZ6W4G_?cbI6^yb4FM`a0fEa#TM8Tl$@H z)L1^dU)nL+W+`30N!wdMX~Ch6BBdIUu2+Cn&I9#SIU)9FDboy2N$kc;BR=>m$rMil6K04YYw|vgNdQeu(#DjSHTYCC0 zUMky!pt+J39=YfHX_h0d3gFNCohGgBrxm@o+e^hg zVGnYa9pPstSS&hiuNivd^_ruvleY_^M9B?h(^bLD7d~2u;BFA-{AqD7^!Q*}+$Ar| zZa!-WE%lY$u(?0#1`B>oGMd1n+s{^=7T$HR)Fdm>0D3!OOiK*zIC zRb%^X|GVt*HxVza5TSHqn>{Jm$gi2e0)-y3D-(j(kI@I#1%1>=w)H*N2`mNJQN?yrE8DXf#s_03=9mn!bg*p&#(|aefu|@nZ)lf2LY;~`eA^hv&OAM9Za3mQt$@jP-psdI! zh0Uaqlr3-4I4g1Aj~) zcV{+Pocsj-2*8+(LuE=(`sA3t{8)XlZ0WPYE10(@b-q^H6O?NuSJM961tD zDk)hL{1zEL&m?zimwCkw3jH~283qsnU_BL0F;vDc7t`yao{5|gW0{&87BG~HI+w$F zFoUrCX{a%|yM0UkUgoit?j-D(!_$rP$DYUdP|rCNP~Vnk>mCVa*u&2Z-za8+>D6s^ zUb5#q@R4x@88@{HzME9devJ#>=7q(Qb9No;&q|sLY!dLZY#Kn} zt}f@2@TmVian_TS$xv@V;6eL}X?l&1#D*-q52s3YLAv-|gs!$K+Y_U3(}-=g&F{N) zvo~W$ol;s5G&Pi_Bg@qEjLd2J!sHA8tDN;qRhCtj-u2u${@G3Ngu8zrl~<}T6Nfjz zO^p{lA?E0a60*A-gDv6p3(dZGW;vQr(SKptPjtOTZT|<7pl5)7sZk{3(zf^MDCb z+5&wkHjMhnqrfOH&WYXqGBQKw!Der$ZG(hTc{-}nx<7L z_l9NZ4<4_r_}!9I`#efai{ws4*8t^L z{A#WqtR249Q?_L^dAz}-x6>Kbk@rmKpV}@9t4G9a|%dnOTDXg=-6$HjdW1DD$KC`E3|YmkkUbqP^~rxOK3_9eLqrOE*(|LeS( zlw5+RM)|JNMZG#DZ$cr%63gWFXp{@hP@C{I z1W(x%-;%2; zFc$aE6wT#q&Wp09krgCV?{Q~}guU9&RuVSZPQeMp!u4@1q2CrFJG<6&r=bg@vf*uH z+FDx!qi`Qq!O}b4!S6lLO8e}|#X(`2L**@rn<$H6EJw>}ai}UQFV((;&7~-8y*Tb~ zEGx&L8B#hj(il5#INT`-ncx731Q5H#W#b=vehP74T+Y}h$DH2(j4>iOFP+cZyJVd*b_E{IWw-sV zVj=NP@D-Lo+KmBm9-e|JIOkK+IF&>`6!i17=I}0LvU5y##BQu`X0FONIpLi|(Blej zNt@cyGg%dRhBhEU;BpAo6wp; z_QB8l5sJSPS?2$;{tguiD89q_WTMg~ChZed^leel->$~(lpPR?4b;QBo_m1F9~KZF zBCg;xBQ*nbevzrbRy(l*llT6=sf^ciy=$S63IS|Om%_b;%#Z(pMAsrZvxv(I>jn zo7SO6s3j%tyftZ|(vzIpTC927Z*cLX;(M!-(16sZdYHb#i-^hB14*@t8!Ne9DQd8! zqeTFxb2nuMa2dTG7#td>4FaW!;0TqJoX5o@>DnbK0*{BUAh(9f$%|kW_BqB5CK+2@ z;rqGXOH}{<1NG+*NB(v$>kk>md}1>2^Daz3=sXLs-3*_$-?#x@eSdu(-_rGV53v){ zTvZQD?Je+Ef2Z0O^_#%LF6G1kn40;z9<;aqY&6%*b`SS_VC~gVGp-n0%5_J22f_Kp zXGb_QJPW=`vtI1^$a(?ywNN;?o~Omsn5~MqN;}a`>3yOXf|cdwsis~d%T!&o@Mnb! zWBK|(kgy#LJYAVJ`XyI_>|jbyVEfL1;!6LB z1)X#3BE4!NGnNZvRqa!RZVX#?Dup!yD%!{ToY{q^Xa!z%FH=_oO%Cc4%XoeuU1L__ zL9}_TK+1>dI%H-{dX2ccFuLEz|ILTM&4T#^ZF~hrD&lL4;<#QsL7(h$o4@!QKgZB2 zSDzGQM3(O{p9bmKymsM9d2U`PEfit*M~#9zMRW0~52lj{I|H>el1%G3nrM~orKy!mMOR8)Ht4djU`#5q3bNuO%G{2{?yl0$N%y-QHf$B8;l%|w) zy1`OeTb}JS>YhkTHhTptWeFMHwC>>*3(LIg`DfBs)u}`7p?TP$0;$B$ts@6#6^suS zr(QeEjk3mScu#P}@OS5?UhWyZIbb7xJlf_Qdf1t52({#OtZ#lOgZz45a zb%$~ThJ>rQk{KDGeDLS4NxlGJYhL(;)etzK4A?ZB-6v{of3uF<`Fn^3KRhr48GJcE ztr0c9(?@T?%?G%*M0JfVG}$8R4*T6mv6vQrM zMVl;N{UiTyrdg%!ro(6{KR%aC1`4LtR)_5a9M`RPV_jo{wnD>FSl_Iw^qC zJ~*TP@|6b+^QA)8Q(BJnNY*aqD!e!1-4F85KX5#%Zu%P&=z8KIZw9?ztVPzsl+Q^;X3iePTb z!;{2;IS(^Mr3Xg68a5-vv+Umla6o?5!_X*m{WArEO+@PPbBudJ>J>HRE zN;)xyso~mTLV$6$cu`~8HLm3W5i94Hk9`X2Pl$g-yq$B;Z+OQVlC@A?K(M==M>;6A zL%7Ex13g)fB7{3s+Y{C&^rQa+6&+0_Y-U_4K1zND%S-jSQRkp|DW4WtL-XGFr>PVF z;x*(Yer-A=o`S01BdpPK^d=&`k2QtA1 zdCFjx1l|;BiSeaW7*lq=LQBkJR!44c+&{mnmwjyk?oin%A~yhhl4&s@h}}r}nPBrr z3n)m2DXT+E?=_oyi}bNrZNY1DjI}Jco@9)Zv4zG+Z_7o`@I?`CYsqFzazZ@hcOPlZ za@to_6=T9H#0~IbYLZ52=Lc+AcRC~nVHby2zjfx-(CK*{AMJptl8b;}s;OEQN$R`? zY~r60`0b_o3mm1EEN>*H3a4qK;OPnG-%Qu@dk2HuvX0@<51;sz_u750iM*%ZTZ61g z%O3tnN%qh?3S{zUp={~yuZnF;Ms`=PcYlEGJ#Bj9_U>AW^^`w`DKK#+`Y(bd7@&o1 z%jjwY&9nWi;%S7}t|8qnCTRJoMMNld;&5fu3yM$2f6l1_7F~Hc z6xu)>*9z*e^Z!5#-$bw>1&`6)COR&Z6V>oj7ismS&h|va)2w~_6l^?(w7a+@qpN%Q zzWM6UuXIP{eC$3cK~#PNY@4aiJReeQ|CZapVYJ_rI?o=LELabnZWrt&+% z;in3mL?CZO(3D-aVS6xO$N(!zftm-_a|bxhIJUL*;)&@aXA_}z=t2S_N6DYcjtyv{ z1D@%*N7cEn^1htJ?Ul|nLtcS1URwMIB0o2^OFdeMb5|9<>MC=yVYGmYsDWSg>{QoC z?IvYt*|?+n{&mI~j6S*>EnbJ(wu_Gqv)Ev%GQ*yy>rTP9dIKr{0QY|BQXFZy`ZRKN zSg6@^X#>a-y#O{eL;9O3-xf@y8iW9=G$K4LC<;}j?At!a<@GMh<66Z$w!}GPTxmCr zj2trR(_1;VC^_dotw2Yq7Z&AoBRo&Qn*|sy{}mkEc9z=q5G#zgtVAtu{ra}n6qg?Y z%;?1j@Vn5CABY!^QF)sod$7x{q8JIK283B-4ukG0b!Tj7t=8w#xB9o1DCN8+QpmcG zD+5u@7haJ{fe$#f*l95f$X&%Ep8F4UUNLs*9Vtpz?~)O!Mm^Hz`klaIJDXMpZpLG% zQy~7>Zs~~OKAr%6t9Ks)+=~fTc3XdNE8v_vBv*+Qw0uS?VE5*={Q=jMVNwx-P9bOB?2HgBQ^Z(O? zAp-p+W1^NzYDTzh2r&(YmX&;QMYl87B}s4hQH z`r0|LVT0i3JFTQ}6Y;}~7Ic|QD|dTqTDkhBk6(Bp?HYs*n8g9Pd7)}(#HbfG;N0%U zYKIAJSYMa8ez3tZ_x>t|2caiN(-FAY7_)T?=F>|9D<$Z}J%oGZ*|PL*5GvXknWDB2 zl3Uls&r_6!sw^L^EVzI6NY~!jO8tY^7^YZJSbj{n3);X=#mAKUrTTbDn1$5rEA!V?(uqXRLYo2zv#l6? zh^VoR6Z=&2B-@rjRWpQ>ysVy9?zZFQhr%rWf%g7%9mx#2$0KEh&Xg_$%Ca|?d3jN^ zr6v`@<((;rXe!K&d8!oA^eRxF?)u@a$`2d z5mE0Qdq%ZS;Au>bzF#GbxJgz<)ULyam%@>6>zE03B(Ep9cQ&^1<;+`Iu;zZ}N56*e z0#qMi`tOx?4l3zAnsqwgYRwUIfH-8T$|oy6P`7V|8L&ec*q%1hrxt1`XblQ+hfI>A z9~;fk*@7p8S=S&WGO$Ntdc%5pTN+vxqx4CIWN)+?Pm*jnDCeEW?^IOHo~ z3U+e_kOXplrT;ML5C9U<{z<914Z#?;F~S}Kyf6aCsIuIP{tV2kHlbA|nGK+-WGTCc zfG%dFyeP|8-AgOQb9|S_c$~@Ez$|>UY(FBL==(3xUI93rJG#gY?}vh|iZk!19RHqE zH$9K?`GsUD`VR3}^jGYCKNAvT(D>zj#NO+m3u8_2@1(nrmHxMNZ1QQNz`vZjp!K}F z01Wkgrk+~3)d?tHKc{olpalPD=G`Aa>DK?jXq%!|m7g+Z{H$SqZe}VHDvJ~%8T^Wk zKgCn6jO33x-#S?g*QPowN8BPTT`Lx5{&H5W#g7I}Q^trBaq)E-KpWj9CH7|;eP9=4!<;HFbJ_k}p<2ND z2^^T0a=Mih@@YM0?yO6y0*jrhMA$@1)hjzd8GV$^M;XmguYwZXar}WFxHTCzN70*a zcVSqaK8fuE(7QVGlsjtv_9&P?!bHtOtcGK`8y#m z@j;0PT?ZeXbK^#ey{|q*{|MizR*Y)zree3cR#yvS*gE8TEi2z}JEopcGoc^#f&2aF zw&oH2Hzn=7QGw+L$#YgvrDJ+SjfPq|2$8pG%2wS2?XMK%!{2UajCm^gR37a@Y$U4P z-);?3NTqe8mj#BO{er}6ZE3XJezO$uT0sF~@|R%2oUx^nM5HEG&mQRT9`FDPCO?)+ zXiWvsuH^MPic^=SPOQhrC43Bv3~{3XYm$fHC-wREl~-f^0K=fYA1iSTySMTsC6l90 ztaBa_*>WjK)@R!6@oxn)Y5m$#AN^`}oc9yC;nCC&-OD(t@7cKL`p8LHbB-CDucM}n z8&D5AJA*O|hFM&(Fx4?C};=}uF%9SSWm!iysRGCdk>x?yLZw_%!6x@L= z4}Dyo=$JAbRl=F7I#j>F^i;kOap4$|s`Beb`@<+VHP0$dACo$};uG!fqg+|xS&u_> zTx;K(@0%O171GT;a-mO_q7#nf76lI7tl&a%WlZv zQ)U`M%kb5;Djr=+u&ZjauU0&0TG8F9ryQ|Arh)UnA}e|}VOwkjMm%R+j-*_9>|yqX zBhFPV^ZL_h#+Gk<0RSLs-%278!L*f-#9vlC z9%{X?x2by(Z?7O8FRzBwYLK*x?5lpj$ms=A4}j{sBQi64!=Bv?ykaGjlYMCw2_S^<$++qxcS8$POb;~Y{M?(AhAjprxX?uW7xRGL0I{Efe*P_$}%T>5HZa}?cDXm zW22B#>qmk}e@OQZPQL>Y&3sr?XcU=Jb_nF>4A`V55k3AAJKJ~z-<&4WM5^YMj^(18 zTDsho%~%W88!Xdns^M8;+*JO!eicKTrx)z$ZX?foSLoK-NNSe>@f8Gm-?Mq7p2u;J zwNn97IyaMdBcK5zhm}nE30Y(|9IkVU;U*`1E8*= zeyu15wN8>;nUd+JReq#h>wXwl#Fs{OC%P8C@Z~wBi{(ai+UT7= zkL2w!Zy*%;Rb5I*F;IW{ulRJL?Yt6L`mo9jdNcWOjzoi2I9+Uu?J4eclg z#PdbK-r7n6yAU|Y=}M@bUu<%$BHCEn3vCO_ zoK=2xL_Xy>v%qGOcAIsGg!Vs>)sA|7>r3^rxNV!{2|QlM`s=93I`I~^dg~e|1w;}< zOPyEc?DlqAFxqrqg2lw$9Rf}uJnD?vfbNs$==NK4e)xkQ5G{aWa-EI*qqdi$50 zVYrBq%PosxsqccBE$+37g+8%TmGr^arF_nh~Qy6gb-7sS(}2*o8#Q|wzw z_k3%*1;xDmJl9ilw3$PWF%_pfJr!vGzJJ-2IC-fn^ICC^&Bf#MINkNkY31A#Flt(U zVhj6)NOQWoiCG}4b0Y7a?xhY}OmyU(6tmQ$8>TipgEqBBqcnXh4wnn31#nYV=HECn z;>u85u6J87E9x%!Jtb+`!hhwxc~e~CZ4Te8WZb8H7g2WDtMz1A=e47!CS!T|g?(2y zrg+6b=0UAhLs}Wnef!gENb_^Wrim4RwXRlaN7Bj~LrEKB=b?q`xb6jd zpomzQcF+4RN0PKzn{n<1;YBy1>m9Q?h7sj<>`sx|P}GW!%V&d$q|%)V%HoZR#$D-U z%Gl}6z`T(-z>VW`O)5*$?hYOH6y>?NyoQ8*7sh$Y6X>ckt-PlSww9y|w#UBRhM7!m zG*K2e&kku79vtH`*)${WO;aPTaHnNXqv z>bLS4FLGDz{Fr5y9C!!?#wDuBX$53yj&T)e1Zi{gZ|~OA10{B23k%OWE#3qqbzhMM zr#f`zbi$LPvkjm0#uKMHPyAyKi~6MlK$xMf9F1Go7_%Zh3H6dHDlLB^u;`i zO~+<-UnePybLP+cPf7J=^L0z9IT$ADlj*uY?|h>IjPD(Z(ny5D%G(mPJW3XB+^!!6 z(R#Wf;-wcWnsUbG&WmJLk8hV3-itlAZS-?7SP?8P?c0ma!%JTv)0Tb5L452)|09Lz zjh!yUo+~3A*-XQIFYKD+?18VLb8wLYL=Evm9#IRr>kUhw)xT70A)A>Hi8f2AZ2Ihi zu63Xrltuk7-^1@`AhEiWvJ&&)j+hO! za2Zz7+G;q}tgP!hp`sNv#U`D*!?pr5Fet|BxQjeHozepE=!!mrey4*FKIUi50veod z;|eXucx4xdT^@9-91(QX(~l)VavFFXFW))o1e6yX!K{syZknW>q3(aPeLQmNZp(4G zB1XM$^$_1{wHs9G&1HOsplMH8d%;@i4X)a&s*rVPOFWfv>`!?f%@K1?`bfo_@_}cI z=h|<`1p9$2J+jxOAdoZPTb1oa?77{HdjH|RA4@WstCpj)C#U&_K=`UUyETo{#6QE> zJ<3xCBL4n-s@Jz6%~Rj0`^Sd2Eixh$NI@O3FTS%dEG~-T63(BqV%GGM@g!22 zS80@MpdRw?x7a9`WMqizn11HML=r$!pJiaHPS}O_ZPZ8>-X<&9Ud{#4oM}cMI~>Gt zuf;Cr+tB|qqJs18cw?#aiq{gDf|iP0AzOl7%#q|#E~&fpU&R3X#NU!^`}rwAK1OM@ zEfEM9X^v-QXQbrMyjK3;myXCEA`_fGH~GcNeB4KpV>eo_GWw7#r>sj;k&R#6WoZ)cK33;;^FDeA zV3rkJg=|6zU<1M%J8i%Y>~&*Kc|XNDia))au;L~}dwy2TKyKS2E~~b}o6^-t z7xMN?Cw-q(9qjr1owKtG$>4>#)pQyAMbC5JFm~+`qK|Go90NeRV4RVUabY zL27$Gpx=Iar_lIAD=5j1^O$sS6s-F@Pr8_O;x$BRa;xR3RaS6eRFOy&yi7uLW-!Pb zqw)mq$=|csP9J1fQ|#udNj%=G$Y&^da#E#E1?3C$Y$BsBJWe=u5vAZ8Rk^B8fEFxe zZzcJS3sI6hM6#>S8T}a$fqQRBXsFig}dO+zGqpBZ#Ts+MBRBO5_=()2_4CQpU zX9Y+K1L`q3Vl;5R#nnaemy`;6Mw%MC|5j%UTf)tN`4x#6q7rLCh37Rx)&$7{Wfa7X z;apgdA%f-Xgw>4?~R9V=+aIf z4Dh@c9~B(MB^ieu*c1f(gxIP|4b1j9vwtD{V@$lQXoiUDFCl8R~*bG^1Ie? z%v-l^h-CwcCY098>z0jQFbGvV+Lw&Nr0;eI87j5E+=3}~cC#+k= z9J3}})F0YgqS)sm%xNDhDo2}UVxL@=?2jG^1eu5&LX%^cA0yO!aD*h&l=qoxA9Xk- z=bpv?ZD|m}(H*e}=O6yT>G}vGgkcK>%B7~(fI~^Ci6MKj%Yz04G{Hd_&vf_RyTYBX zgQr7!pdpQ^zr%Y`f%fiE>c<;coEqV)+w+$nCdHa=(J#}3)GslgHMPm3wztq?sf3A zV*+uxxVT`6;_>bN3~)W7B)#o==3?53;hpnF_FiFBfxIq@vo70K{$Hzis`y3kL zQ)zSa3pTejdPw;ab#e?)=@My)paGFVtENG)A+Vqxd0{N4efHyH0fu z+~P}$vGDolZ6E}0qaVa-1YIjtNQ-@i%Qfb64-@}UZ{r&V?_qCUFB)^M#yfNX*s!;Vi7tjnWs|HcmCcNyg^0kVC0mKlI}Z zm6oH@^g`h~iG{{|Ui#@@W$za?t0E&O#uTnwiZlPF)sHs+NE8%oxyhX7MsU~sYy-@@ z+Hd;crw+O{O2*-L5V6;b;&iISfVp+BNcfy4Z4mlP=*HM|^K{cT&zqgcSSVE<&||a& zROW)`?gj#W*Vy1`Ru)|+4qB!t>{S|^$=HCSk!4le-^yQhTbS2zwI?1tTFnql`gH`l6)-r7AWaS8$w7WQO}Z^3$WcR)tMKS$kJ(T~ zi(kqVzxP%ZmspTmWmYHovg!TTrPQ?=IvWQSZ2HDQWP_g^tjF*R062LF(4+)75 z-;(#%HP`4eQVKx89uB4X|LE2qCFG?K3u=o3yE64ie3min(E8`>Z*PL8H?^F)O(59& z$Hb{_CU$0yU4iB9>4Rm&v(u@rcV4~OjiCe2_G@hMCVPFK%5i5;_TBfGQ|@T?f&;xX zqgQl+{4Gjgm#jNVZKTZUBgW=S&4XdTH@?_t^fbMiL8#{s`)obD(+NL2zA%wG%^P_? zD6PRJb1k0xro)HwSxefvce6Ip%0Xq!dzZW-^5`ATu6*N`Y`u_ySh&*H3h^4l?@refsbTA3!ITHPZkaF#(~>7YH2fd~u4p_@KcO?pkQ_-Y&y;+S4F)PLRA4 zwu&j+QhPy@gwNGi>>P;bo;sV`BqgUqHi@D%$heIyLknF>6YA2b-s~w|97hhWcyp|) zbEgc>MD~o{Sa!{z)5_o+6*ZT|9-c-i25a!w&1d(bxUsed`jV*!RZ@^Q)#N4a^@4&^ z?+rd>+e;7_JW9}wTbUt$XBxo3i0J`!>tavHcp&ld6=al6FDz_)i`VEVl*~rQoe3ZG zY!M&xeA@>*mFr)p*j1hQxaiWr4J3E$Bu{kXttvlU%LVZtTf8Mp1suq~xLks(5Fzd= zaUL)!6vOao!qj}=pZ0ujU{pbKu|H!b;4ov+80Hp1{}+n5ReD1}b=`s|Hgb42+szBhHU3CgL)Eb-i)MX3!5hkA8k5 zt$X^sZo-Ww6D5gIC;3_};I~@X9(o%BCCz`R=hf%?2|LN9g2lo82u#oWicxgmn)ZPo zoPYsX#%9><$89->^ek$`zw$h(KQ*Pd6nwM$p?Tm`d-M=^Uln&wuGUj@YJ}-Y5Mj^0rUeD9h_CJv0 z%Of-ura8PXG0nnGYyK6h)`g^9YWPG2PfHYs*l_)m@w=NCLEMeEUZR+L;}d9d!RJE4 z2hXgFi|~uME&W6}olu3XtY~DnvMjB#oZ*C%XJu$1b~}Ay%zIX8?Fq)+v!YfMoQ2sm zu<9|g(Nt?(;MH{FnNFG&(Z4YjQ&ICHh-RMM6ZM)~cuOD#8cEHESeHa|w4UI>=>&RB z?bnS)KIht~)?-p!T< zRNc2O#J{(5*1EKtWx9-QbBEfuE~I~c*ws?b|A2pszFyC3LFJ+5RzKO;mHowfmgu~1 zW$Z6$^0jFw<@;B*_HaE$k--KAd0U|UiyIopt z>GKP?Qtv4HUa}=d-lw{Xh`%YC8 z-7dqkt^&XxIEkx08VZ?C6>&-wl{_=12b$FA-V?6PNE7z`w_RO?z zAOq1wcKejZ?5{(FUXKk3IXC%bA!HV?pG(1|!c56wEZZ5^x1P1DzJ$B@08J#(A=4!E z|N4rayzA?7I<~d-C*ge;COfEwy;IoAnIUEp{p^%U3;KEg87!)g%8s-xjQCev{WHSd zPaDW{+xl}q+JeX{C9#Uzx9@d3)rIz_0&wc7m?*Y(0?NtF$XaV7m7t{UOXt~<1!awX z`Ld;0QB}2};t$64^q0OASmr`SZOgSlpcAKrd=pfO8j=o*ZR@biJn8IVQ&G*9TW5 zzItUynY5SD4P2ZI!yM)5h=CmC^Srte3WeAKA9iLS0CV>;bXTG)<-CPj!qf2j`WwbmR!#oMuf!V01lB9@*9`AB>Hj4EL|TP0>ehu z5~gxIp!w!BU_E77RENH^^Sb8D2oYF^K%{S{d^xU63@eD*W~3f7!iopSvY!D}TDkb5 zdJSpBe%9=cU_tk_=RxHt=w9iAXZ;_$J3M!E*l$1B;CT1d>6S*ZyDQyw>B5EC1}{9H z4l$MIdZc`$`ZlCLbZ<_{Y6P|9!P8R6<_9=p!-~D(E<3#6J#YVVbI3oMiWH4P7=Znb z${}60GhpJ+Pn@fyCDBi!0h$D{$nbs!@G?k-rGvEpCK93o6?SG zGlqpFf4REFovU@ERfBwe->ub@$7psM0A}Djt@f)Pq4BW2H7$iy)~`9x7M;3D{Gm|J zJMqr+Xz@98)GUcdMRT}5FhrA}EJNsTtVTwj>J zbuGo@KFuo8D>T&saDq$?k2(jYt}1vfcao+ZipG#iGSV6{oR#@biHPE<&vO{{6O8ul zzx2??S^MjujSbGqJOHQCc}5b?xtv)K_c&wFd3dL$ha`+cD8@Yp>@TMbCgE(PfEuO) zK?WJ8g@`cU4aTO=FAwiu{{Z$ONCf5!u*9`gH;mW>t4lkP^?W-a`|lTQiBu#$IHGjuPgeHG*C0YGnbZ%C080zN{7p9Xi?tsI;J z`N^C)6mU3+oI-d82~FmZ16pK)8;dTTy!DM;B&Oi>3yipv;+7QY(n#?xgy-@BpVmfU zkGE>Mz+z*ZH8HpMuZX%2RH?V|b1FR-(}|1kiIjvmAW@)64+(20ZqCe|#3$t5f+KP? zLYxaUyqkmKXPTZB)Zl^Vlrfgav8>Gx09=P%CymDlP2|0+Ye?)jk+I$S+K{(37(#iV zt(*~G@7v=lR!2F1F#uz242PuIOoD)ck2X=A9l3SBXD13(i;@NXqy@1r>AL~*g|d2~`+ z(jAWzTb9ott^(40_7Npo*XJ27=QGVgAf*W=kZ1H!ayxJpCX zYqWbDWyJO{ll6Nj+J>2W~}U!Y}ZD4673N?DQ?88ViA=BG@FuHYs|lzl|DD>N*>^eHeZ(Ybx?R%t}rB1w*(i7YPuZp z25^WA8)K6M0jX?7Z}1Xeu+(q{Ar_bUX+MlA&c07xaHDI;X*Zg>d`_Ze@m3=SE@_tV zP2a`TYO7hG93cNPYPm>V(Us^?^Hkdc3g$Hfgze7JZrHh+lcA1lXL((?l3RvCDFgq^ z-{Z!pHxrQvvfKS_al=nH!%3Q9?g7sBP+}9+m=QCNvOxUmng3Fukug9v%IQ#ZNsD)) zOgmn@c@CobVV#ilZW~7W!-%QqC1AV^n;k3T;r8BgBH)J2W6SKk8U~m0=P!o16MKGe zZxk!Wf~CHP#&if?WNI?X>XQwN@9QB{F17dWY3w;wq)jjmW$C1pIL^Y!avif;1i#+ z*y7X#i3=}GqqcnIOp5ZO>;t{_1OZVs76xAw^Dl@;dB$59q3v--!8z!Wq;-P(tWL&r z_?yOIJS^}GsT0kU@XSf;C@)6R3-oyP!bGD6&MS!5e@8qHf`QH!j2>IPDq{gJ)!UuL znch=6AnmK5BEY?a= zVX^dDr)fECBlV-~i-00+W)BBkPQl|V>Pm(*x~~EwQqp`VE%)9G`ecyoHXk@0dQp{?*XJMBMxr;GpkYIvHH>>YSw@Yre{4StXuEJ`zqVwM_OR??%x(} z?%y-#`2|j&qAKJl@S2ZhGgPT`kXytpHz793O>{LfwJL>h2+az{TZ=We&`mNw?*<=ob=Y#?+z4t zwL-?$Fuh{A;II9_{*9~W(+uqjRBF0q%zK*u7K+v8N97w3?>(-DvOyjpp3d6`y=YFp zd{qT`<8*)f%QC<7i_mgbJN8T`s>vnggw~&ohk^s{rhWX;X#=Mfs3eNy(a-j>TspwP z3tU4r7p}y(BjojXdLkAGnjkXzdfacn;?hXl&$j^WgeSaEtrc~K%<~!&oPWc=#Wy`C zu<7%*aBV!g^smAI&iK&1-+a_xT#|*wxJ8U~+e&_~&F#sb1eq<=h6?F9i<3|hSq@uz zMoJMG@L`aPS<8G)RXZ2ImEXY0epN&7L7X#e+^G0Ig!*i@$a)D4bq8((ARP4AtKSZ;op;{hT@YJO*4?Ekh2NJ;6v@F`{ z%3G3t%pckHh3@5PFPYlFSS$h@3mbe3*6%=Cm}nD|))Du~_SU(X&)_xDZ9d#hjpw8G zWc}2mr4O?rGU3+qsA&mNHCkT@G_&HCZm*_|sZQ#yZo0}HEBU=(zU|m9DMvj`4^qQ) z6$P{lDv`J!S_dc@qLRLm;KAnSD9 z(szGfmps_ldX}@(wWjtf+3P3D~wJL=Ek=H*3p^gdb=xd+ZTm9?X zn@iIEby)Ds*{Q^Sy(g@ONMk8)yi7U7lae80fP$GfJ+j~~BHP7Eg}|Ni@hoE-wExPm z+G1c=&Cz`#msvhmaGRH*HR(Z*l9&Gf{EviNCs$x`L(S6G)FZasQ36k(9~P61Q9!e1 zQ&LgWriFUr3`6V5qSW%g<)=V?$r`!bd$$+od>6PZ(&bv^}PW96j37xIdt+0m1oWG8PfU1v8y68GA0iY`26nu6Kz0 z{m%V4cPz<-cl0^%c5p?O=pVYz5dCRB-DqyXR1`4Fg!j(ohk1JRysSe`LO4Pc{m3mE zJ>_Q1EZoU+#<$MPPAQy^ZCYA5y84#UC0iIE;}Fk(V;(?p9RVqYN%3yf@ z^|APZaM1pM56VC{xO58Nj(tr_$gUmLqo+FC1HE7`-UI1hB>3YCjwPBkwuD3!&&H!h z^ewJp&J>s67K1pEfRe+sN*S}5p9z;qMo*blfepw_4ZAbZ)p&5^l$sI=$KGj$cEWa# zxOEB@D;O!FwiJ}PA3>E;1m zXvP+Tt!DbR=;H5ZAyJT%NKFd6?DUw53L;y|&Gyj~hxP3(=tUXk=b@DDMZjrY<_-FK z0n|EUVP!ck>rO*e*o3#Q=}c)P@qu8+;_3l*4GT~mETBc2?6QH2q}=~Z(FGGzYaPgNJw^rX;})Il(pE>zmyn(qjXIHdKVeV z!>{d<;LbJ-HLgy%#^YlHY5j>+fsHW!^3zSQhnrVKJ!mO+D}x)A7@$Huv9J$|2Bj-< z&2^W9O%NsC-)|$>Awoo-EY;lIPYe-qtRf-2!{&DQ(`IY_HJ#jA?^d1(Q zoI`e#x(CpgB>ZOAEvN5eS&~TaAO5@X#rMm$cmv01bR(lDH%rGe3n}aY+5b(uMg)Wn#QKyW(+WCpjT})lM^M@KdKs{zoJiU ziv{4Cu5=%RydZn1AMbmLIg6YsVElIaLiBQ|hJDr90fCvN$ejTW*^`tLZMj`z8v7+Y z4q-g%*~F^2kcu;sY(l%peVjoY;1qp%{d5Ssc-mk5uIMJ>u||1ZkUemJJ)8D=S4oGN zdiQO=mHz}bIOjgp)ubtXyQ~dB^PnYypZk~kd6J&5n$W_5II($7gX}_M;3Ca|>{caM zq<>njsnJwvtVC|^2f+p1<^9;#Z6yB;^hdyq_uW~WL`d7ndz!D~+n#{FP^Ys$hy*A% zdD0Bud9wb9XX<;NVJg}fElTsYJmo=v8U4MkK(ABkXT}}tBt@R+)Qb zv}514zd$t~<;-w4QRuTm6HKmV34@fK0d4GG_ngoXHrgbM7hQ92*hjS~m%u@emc44g z#!ZtjeYinQyYkRvmq^A@`Wo)EaJQ=&r=XN@;F!X5sx}3U)Lbk}4 zzE}EaAtvP!jaBjkidsRR=yayCD^6pSEJ!f-v zha8cMAy=k$xkpWyuosZ8;p<_#a;AcXdBmr_iv?*MGNuJ5`*B4i3nRIaMkq z7U-NDa&GQ39a?>csjQV;etx3CeW*nJ%nE@RbP-MKZ;J1?dYy3Xsq#2fs;c1LE+1?v*Y*3S?=gj-cL`}e| z;}8wHPUMxPv-T1L83@LGYD3wRwYee!T8ZPio1Qs9_7#*A2`Jjo(^!ig=k zg%w}vKJn9*{?rNm*IGI%t@-bXRU(A@3%!2rvpzZH@8iR2LIL!48OJ*xT`q#b3`~u0 zTfrN0u)fe@V5|1&y%`zx%qRjZ9O&0D0z)Y68@Koxsu&m?G6WeXrTLDkfsGS6-vf2m zhhrkL{Kt6~2}#>=^OqwO}T}i3id_uEqLepBid>5?r=VqS4@4!nm*fKS#|Eg zpy)~k8!wMcuUUUQ-z3e~VbgS!8EM&=^o!nQMlny?!E#$6F}!`= zJ#-HL#o-q+=U$$eyO){q@SGXV#=r2elb-ubNN@NS6G2_UZ7j+G3x`;@74skPq4d%CHtrn%xRGKZiaXGTK? zsTl>VmqU^i+M+fN7GfoVJo$}75+ljBHFWMHqw>&;8lEipclw_$gc}hV6&+sVtZtnK zH1hZFEr!O8%}~7CRC@453Jc^B8H_Ljlr&^z8>I--%pE&I?*pQzF~-(_A;LvbM)rSM zQ@=mumONb~9;Blc?+TBVVw*t4x!u(oS@n532T2M8-86$bO(V62jPE0+w3NpIR8VZ> zTUWHmn-q@RSh4AeQ=OUjugW?43*A1?OkB63=h*J^G-MyZ74h+*^3tU-)&p)u&p^BQ z>10N$y+Fr9kff=GAr({9B#a8us3~>vMpp9q0N+mu+}q*2q*vo9R0`3c)qY)Y{erzu zne&|`AuQZh9eZ9D7-P!QEUVJMlF#}-p7>H63ie1+m6T0HKUkR3SAym<9YFu#Y|`H5 znfFeBkIlor7N4-)HmWU$0Q$w^2a%oXd^$Ok_ECTpytDOu8EVwV~;BHuew z`6e?^GeBjMS!(qDmxAbV_7w;Nq_;(J2Bwu(*m1{ENmD)^y5`8k{gPQ8D@bS3o;etx z8cp=>h~lDlUV`_hi_$o4ZVeuZA#>Y25Dc?7~LG6tW5;FnD|sXV7D| zk@F`^1R_uofXWoGbNamkWex3B9(qWTcN+|AEFN=B6O__C1OmhoOOU!K-AAcFLLy}D zCMm39$Paf<9oAXgqE30jo8N?AaJ#7viYXcpSjA8{^BGy&jS4P=L8j53?zXeiD+1Bb z^O3{z(u$TeU0S7b@9SZNQ{AH`4X!ue24w&Jj+g?i{i3KUB&M+OM0$#e%N3H?947I` zS%k?kf5WlfByVrtJ{pOH1{S3DaZ_kMX%n{#J)c(1Z-*p>co>k+68k@jGXC zA?Av&>ven7N75UTABZc}wys1^5Sly;=sF+eQJ;Ud_S~{&!W$+EE0l+rYdCzDTbfp> zCr3&HWi+m(;(^_D9V(VxjM3e@IK0*-0Uie);s58hgP}c zxccNC;39-8`C*tdL)$hOe|-2|CY9FZ+(%}Aa_tDV?ho!5kqKF&WtE6#o21FajPMf@ zF7+PB_&qC^w@-|?lSEr`-|aPk24jnj$?Q&JIAjU#-c>|tZ=N|>3?c-zK&@e?Tg(TF z{fOf!)O^|Us(pFJfj$na)i~CX3!AxA3`FbCCA~Q-{Vu7V$a91)0pO$DnCjf_Ta_ct z^4{3b#Czzma^#NM_Jlv_>R+lp1vQRXsK$xQVn*PIK3+soPWfb(zshBTWm;SLKlP0y z3()QU{=7xIiN*P~ZDuOTSh1E6Uu)Mqtv#M<33dJwRymhvJ_hyX(D0Q1ro(`Jb>B#A z`R?!)lm0PK82W7g7hnDA1D24^6T){e=oPB&=|}wRZ;AP>Ov1(27LF(Sd{6EguTJhF$R9$ojZWR|dD18s zrf@?70i%K&7SH(;!ULv2BU^2{%Cl&}=rc+0f3vPWbvyF`qlbURGB_knm`3kdXX`QU z{tvo>n%Knw8r!m37+Az6H<9Om{7Ih1_EuoSrV2m0UWo@OR5R)uj)EIpc(r4MA!tN7 z$F|XskI~=H!Vmn~a4&$E0Z$%gS9b>Yg?+2Qdl*=0IVffW9iPMYZE~^bdzn$fHtxvS zdT>XV5fgQm=ydR$dqr!WnWsk^8p5XVf6GQOfK94YGU5WMcM5H$O|m= zxqhJdh)P^#_G{BpNu`IwTvlOMo81;c$|fS9&6S9ow!iK&OpTF34&f|!M5yuZ_3QrR z;${ijQT|1`|L{oa{~0cXyq>nGae$Mir>3W!%`Jf}wRqosa1|hzxh3M+8XG6e6J>>N z5rFn{buLN4DHV@PB8z(C{~1W}d}NVpShiGuzzgRt7)Lk;PGX>C_;p4x>7p+(KFSd9#A$)XoM z3&!td9;h1DBHRVmz;Xx1XzPM7NEw5qbtuxs3lG~#kYwAs8Ux3jI&Z|&)^G?bDOGkj zS0pj>ST#iWB0;*Wht8}`HU@Ss_(?)3M_dTc_8WegYoi8*fzKX12q$ykXvVV%nQiHR zx*n1>=pz2muD7ks+2LAC-Hn~KxMoB6jw+Q}tS1&^!G(Hyaos}`ZUzFs6bK7?V7cM)3l$8VCL z;S-k+-qZJN&Y2TlGvt4xMC2~$ z5nUNup2Y0nKFE<3CQl?dXp9CMeev+YLtjRaYi`2$H^)7*Q7xKs#?K^l>N?&s4Uv8d ze}5Mmn8_0ea;IuqldeQe#;Llcbcgc7x)2MU>u%p0A4z`8TVvEjUIK-Ej{ zL~a7xVONBQ#ThBffQ>v-aP6EIOMvikF)4;iYCOvMdr>tc0wbYd77D*CA;Bs`Qt6g> z5aft}n^=M5dluCr&YJ5mAXFna&k$~2|1JCkm;)oUUbz|)dJQYs25)uawPG7ILF9D& z-|XePA@-<6F#$bo09vTUfbl4dAHfvcm$cG!OU8O~Q~e|>fOT4vzK;yydzn_n z|5`z|O3nS-b27zS7eYcS_t;U7l=+3SJn1~B#c!YuIML&+Ci~NY_I0TiNiv|xXQAD9 z{w@dECq$2dPC@sus`@hVYCCA-^Fw8RTP?zO3lwQu1WR?DLJD?TU&Q)70pNa znMyL@*mMcnVlZ_*Bm%)k&0YytYB<-b8Q5;PDEUO`m{H(i8Bqi=f4)p0JSN|j5d zJExp2*6ka)?zrdy%>lMg-94S$SrH3d%BL(UBVRSN}YcrdRp<};0)NF6zN9(d#Uax6pvm7 z4r+7x#Ig^AYy0Z+Gsg1Y7~bt>MTW2|PSG!7?J0ikC(Th`xr8f@b;`@7wGJy{SWOK6 z>AKvgFIm$$6%Rc0&M%=7QCxjmTgK}j}EGhjWA)I4stc}~c zbQF-iHdfC0hBpBHi`9!|{iG4|ky;Dgsg}0qx{TP zwymbFLXx=NNp*d=L6^MNBAm|WZfon~;;uABZ0_5WxbR;O09`qW$&(QDrAhw1as=X8 z>>fF^q|}fSRr^She+znEnF8&2YwbPiJI6ks{@hfqvi0%IJ%vU4Z#3R%hB|cJQ43?2 zW@(fvdwf;=QR>&4Tv9a1KNYC6@F{LyTGFr3UBtaR)f^_hn2QRYX^WtHquiOxH$aUb z>Rn$D>GCb!eiB#K?Dy8s_;M{^BXzb?+BDm>4YimKGB;b8ROabkEHRuX(cSzNZsDB0 zIF@{x2bo2K8^tBE;Z^3^z=)Cr9OATt4WQi*PKgrKUEA~b?6QD=g%-OwebX07AeG@y z;x^}yY9f*$X&PDV;bM_v&LPCK#ur)O2O=KdR`=o2wxQ2KL{q+G^$5c^4C0si^lD&ZVY z)Ry4kLf{bCryf(}XbjGoVyn5J>WyEPHs|Z478%h?#=toQKik7C?|+J6>o9cWeYmlL z|K>Rf@&|ljXh-|W{RxYLs|YPYdwC4QDik#-d$}(34oJhM+Qm8VdT7cT0O}?TYS%0- z%Bv}!Qm`IuU}*EjL^v0GxDduq_v>&MtSM%i>mb*Nd-bPGX&)J1km4AFh0UXAa@=XH zzHqVecbb)JlwY61@tC$wD%j*{tb!UbL%Y>%BIP(+_=Rzf$qSqq@tQ|@$t~pa`HS{Q z%eOkwU$9q3+T4Oy9!@7Cm-=Pv0T|JvO2^9uI$77`IdHVSQ#-lrLyLE1 zdAk+}1xxR0@{%p2CsxyqOH4mVYGSK|eSno3=(cRu5Ugs?-VyRjEY`voG$~a35?jg0 zsH5YZky_MjCQ!v(B|s;)uGB+Wj z7}!4z^a@G)YkhzwKs)LsF>rdA`l|lfv%0}x+vZ9ypBI4@ZE*F5L?nSD-s4M-_}LE& zS#wtDI6gid7Q55wVDExCA$vnRR)bQFw&e%`+rkL({C5*It&c?0ezq`v5Qro4KiybA z?A!Z;oDM{dlKHr&)|yOj7!-B?aTeN&%@7oXeeDa7D+v5w#;Gu9ds)tqhK}aNl^@e4 zd{Z_gKW9B9Vas|e>g&7GXuxzwGhPkqk_@OH=@Vl|t`_@y{D=Kid??uF|j<)KRPcy;N4FV48wkE6@LTdKXTFD6uwbs} zXd6~nRm_6kX85eNZh#C{UG7W78iD@9Lxf4OdY@NDJ@5~htvM|P?BjYe#%^U%W)7Wg zZ$7p|I5_Q4pjMMjNBB;@z2@-ut(zq6QcY`&KZO%7{7TvFnp3}L#V3sa3oHU9XA;j9 z+|D#47(>^o&6mHkbanYn*2sB3VAz;tlYVp!y`$?Ve$X|HX+BvSXJv9!3_9sM#2{v0 z#T#VF)yo+7DHLz$&Tbcr4Y`$2o^IRyshs1>7OV9>`jBpVfd+9V_X>5ZHs`2?fWHV~ zgAOmlM1Mg5wk%_se_)z8$79-QBkYG-Vw0CE02mMey!2$|g*HB)wHzZDTlQlOvCUDp zer@QUBE<-|9B&3)CoTKJ{*}$jhIEb!?EW#^+DX{Qx)cat63*ri=?25_fgpBH=5 zidk8<&U`m1Y-WABGgrN@?d=-|oPGzJ>Njw1mV7d;}2Mw z6!|V2wX6D1n+#iqrN_syL?sRbCo>F=0}LrgY><^ zE-%H$R%ni<=4HXyy686$%>b?dKO&rWlIMtihs} zC``a2*-6&N3U4$aJp z33s0|#@?x^IRYZmBwGjK1HRcQu|npx>laU#aYBnK=pNgB!Mi`vGcJO46Ot!#pQXMn zj%}r!m#u1RaD^ns;aCdZaQv@xaCMi$;;l#(ZfVCh#PQ0g77>7`1BxjpPt!bu0}h~_ z0SjCfvLW2w-s6gYs8%y~P;o3Al84c<><{)aY3CNMDzmm`1zseaVI;U)NYm012J_Z) z6#$(1hl#IN$>Y~a{sJTVWqA;X`QEz{ch9h@e-sz#T(e~(+0Cf{A&FIT#NKYNAjocR zfn2E6X$$6D!D})M@&{H5=ft%=Dl2Gcs*neZ$6TiJ{$Y~)tR8oqCi-Z!FU24D;bV=g z)CIy-Pf^FDxK|u|=ViZEY7?LSV1ZIF$=^j+@@&5-+Fa?HlJHsPH$^Y&-=WT{w1ut# zlRg)HxFIa!u|*<}c4o*npQ5+;$W4tL+M-c@lRe^leOOPMVi?0x6af|>bACF zXCsZOcBuy&DwK~Sig&cW?EXFSq>mOREl1(bt1uH$&O)DG?cEVdh}KQF#$lZ8yW4Pv z`eQlg7oc%Jlv8C#yX=F)#&YGp~5q*=yrTwxwXpi&g`lCz|nFSXi zuljibSmrL#CPiCMQO`KnTCFp4X3x3g8x`&DK0>cbFl6$lNU}7zFM`jsq~J0 ztrO5!>QE$$T_3o z`u~}+3#HOIVWfS|7E$QgD0dv;pGQnvBz|Zls_sdjU6JU6U6pd~Ir&~{7qg87O+r!0 zJx=>Mb2gMM6ARS~`>U7t>-;!&CfPPpS#zlrJdd_!ll==ltodP`VNL28>Ogyg|JQ7^xFXxG0^Q;u?#Sj_|P(hh&!>ToT z8QwyFlFKxdXbtH03nH^Xp@Doz90&_WIdLZv6ZpTy4oO!5Eo`Qnx}U!1pWisaofhqq zZ8WYpbPO1og%_=WPV*Eh{W|H*$j=P?R3yH7g&S~bI}u>KU!kd=zt-?kM3{c5rK(nf33H z1I~2j_`7k-?0&xg@RAVY+=O~9f7#ZB6)cYSN@^+_Js{n>iljqNk@4JLJ~;a!luUiP zJ6XP8|GAX-p(8eo z^p*0geDLJ?OZ%O8Pkk5Sc&=Q*L;^QQf_+_0du^YOZ6u#Uf{iBZ@#(_V4WbfrZz?rK zJ}r=&JTO_%*uF>5=%vq6oumOLCYRFilHN=5+v&ZI{5g7Ct{DZP+m?|n4(_4?@v z4VNT?(oYT`)#+$rAYu+^^hhlmQ$tQBf^JENL~a<9`t>9xT~I+onQHtQICrHev-07S zrwDZ@A3nr`E7j08e%D8Ql4myOLX{;n#&Ic+#{E?3_lY@iMpW8Sk{M;9eVG~t8GA1| z7A`EvbQCTk4-txq%;3QsiN1#pad!8tXG|>`N~TA%2G7Xuu0oSCEdkc<@3O;!@rU2q zh9y7FPH~1*o@J)c+)J_x=DWOKSndx4;b`zQFUo8{a4_vnBTQTy+&Jk+S?*GE-G(Qtl-^(%9`3`VSB6A`>`7qxv?8 z=UEHm4ydkSwfCKBt;Y#9zGA`*Y4%j+KosZ=szz}`twUpH$7JE7=v)m}H`e}?H7zSR zEMlZ;n(rgss%CF6$R7VPp6SX6BMpO?Ki!fKCO4Jac>53ESWypBU;}S(2|EU z6&+wk?@YL?>)SQnkUU6#mVD&>(xcVtwQ+9JrjoPNUtUlq?r8O;Qf{=q#At~xx^fHJQ;0$?H=1PgQ~KQz9CttsMa9%W$5 zRFZH6P?vuzW_tpj!`L6DC2_i^C!KQt;idE2xs1;c{T|5}*t1!A-#_~r*ID`?)-EH4 z6-L7PB3s42H<1Phrz%>ztFHvtd3D6tv8=Ji?#-qzt-Nlc`@3{#0?caGiXB0$ewFPR zyxl1)!s96)uR;t?altt}fvw9x-OW{vkyAu-o<$^_F}9?}A9p|Vt9OksrXi!6$Xjfz{reqr1FKcFuU1F76Ao7ove0;lX>uVw-HbjCKm(%Mn3tPIydcC z*m*w@!O63cx}9h2Wa!T_;V+h)id;w8c~2juuwGvq*ST+fnC#5G;9uvw_)E~j;H5Dx zv8&r~c6wL%%j({fmq;VomxX)z2gf`8#X$f9^ii?hMWf(Ez>QE)cmckq4eKFclgARN ztnZw}K1XxDbJYC?n3SIcpKCB-aBylvkjro-GZu$~6vYFs3{lIpSvY^X;Y|!E&me!#1IaWbgFZ+f0w2Z~M)utu z3U&|Dn$e?Jc0HIIQ-ICNWMOymS*}I>G`Y!5EcKTLgaHOknJrFZ`iD^-B2bcGG3xJi zn6_@XV32NMw(zAuQy>=*d69zEsJWYQxTbd>8wq>nYO%Ly+E?Urp48gIw`bbCBMmC` zpJfc4=?7c&7Ed?+!&AtN`eEufCqJJvf=?5019>U@O8<<{z1lnW7}X+K=Y>Q*If(ie zGW^B=1qIXbK5TxRtb)Pl8DW^hS;%}w%bc@%B&*%pu0&Ljh4vDidx|5;kAjXEws!wT zQGp`_i!@Qw1MaZhb09+L?&{1PyCM}X{~U^}o8`@K{Z2J^nR6WmA;1hEn+-l=nFBgG z&i)zDzNRiQ4MR|9^4Nm2z7&b4T!0XU=IFOS8DC4gz3-X-HCg$&z`IqG;~0MmdRJh~ zKZxkeHjYm65qmh(RNe4n&B@sDScFKE#{Sb`uciA2>bkT6WH8$ z%4=bSiD2m{Etrn%mAi+iSO9gk{w1CwUb7d_McKl^jHQ zEPoyT6l}P{CeqoP%`QU1Es-w2-C;wUn!$O+8e)7(D(e%(mFG8G*)_d{KKmU^69POUp*g; zj7=#T@He_b-7DJLaNB%5N`z@1&VQyn-R=8nCJu-XU_hm)AZBc~uYK@?q>n-uxsLa> zteaq-dF7`S%foTU?emJ}*2p^h_BJ;mQgT@itx!!z;v)Ovy#N9VY@UmGAL73JzGL9B zU&^ zXiZ<n#YGodG88R1PhlUJp|0JGu_JUw??bj`%wttpvXraP~dWL~QIoid5 zsgrCAK-8@ST)7I^*u~;0##hq*dRp0ik8JmD%E@i3Z@lNP zDvDM~-Di0e9LBc@fy?AAgEJjQl|bXx^rCE+!k*SbHBb*tcok9XqKzzp{yJCoCiJRs z?(`oWmdCrx+^?P>=5-YGQtBf)+QX{NKVea)?>+X=*xo~h1{>*mf{h316WiX1i5ED| zrk%2ubyBs%HYpNT)+Vz0`Y+J>{rTQ|1OBY1_~82fl3yfPJ%n^=r&au9L5h!z5eg&d ziF@Sy`UDNcr1p)e$~2DY*Igsq6UU;by;svUB?5QNvM2KYF*X20P4I0Q#VMHGt^P6s zxub(ZXnZaX4*E$Vs{v3TjTShI$J^nql?t9}1RQ#h)-$D4o}s=K(Qk}EF5=s+Mv*hK z_OfG@jG^P>0nnF2F+Fu|W`aB$#)kB9N)h?NK8gC7;H}#{HHH~8i6(q7oQfu3>Ys5r z{7J}jH{!x8*Z^;O1;Y;qpC(HUFOlFE3q^SW3>t6ZzK3q@YVzKTJ%9*tnr@^`x?fVK zcI_gZHlj$kHa@e=6&U&x25fT1`|YI%Z>8y1inxwgB$!K=dhKe*AO3>O3jDDycbv$H zEFOk$a??*}5-{XcPqjJ^KS>ad@Vc(BiIewodOYx8D(-L8%_#~{pp;I(ioY-2RUE=% zwP}i;{DeK|20GZQ_*qy;Pko!GxQXj(s4R)%5in~qg++0d$cQk!rKsnO{( zp)@#I3F2J%-Z9&>s-b<>D)BBDOb_!k4okoV9s)93e~>|jlfm50ZVq0Pnj+0`EO+#d zfx=&D6Xv6vws2KEM!s(Rc{hUxewz%q;6{+efH-q$^bp4r_Oe;x6S^9kEw1c4DUYhRNpb-zClZ5 zLSwSF5#L|%F2q{~G9#DutZY-%TNR|Mk9dj?elZ82hnEA9Q*x<057-y7KZk`?KXcRM zjWR1I3K#~lUMMV7@-805iBv<8+Fo@sK_`bPlxda$Rk?2vznF*n@X=PN7m7*5vCmWy70^SZNAsg;B+*T9JxpS2)5lf`oM+= zETaBM`rE?KDw*j<4I9sV7h(MftvBh_LS1pBUS*l%UT^U6@YtPbzrE=%pqw6FUvlRp zB7v=qMWzO=jnO`O6IdDae2B$M_5vyQp_x43efenx!cnx=g7`b&!T(*N{G@*Y#;GK) zd6>j37>!3Z#X1AdC`>5#yq7iE$YsX{L|pz>Gf8-REV1~aH}sqs!||mhQUovgjX$i( z8A*u7;q(>eNnbxwT4pbF_LlJzxo&yjSOkF{mw4n?;E}_RAtRUOjZALIq%1B0;RtT?y!3CH zJa-Ha9{c8L()UbCO%|^xo_>t`Wwd}xHiK#U#nB2K3)!X18k#+9EsdzM#v$l%0zPEx zX(K0UzVk8dg;7r-ix5_1|EtAKZGG2-|L_XKY<#e+DN8zzP<v%Y0av6~{iphCO|a2kK~A@+X-or2DR_>%1CsDaHcoZA|Yt{9)g)O2Ec@B}~E4 zf?|iCPqyIl;J%YvtI8vR_`QCMz4&i_g;27gUw9XZ8e`ayvtY*562DEj=ZAP7As3{V?DgAkR?p7&Bo{4AYuMn)x_Af=<#lgZ`oTfiXLu~k?-~lTG^5^ahsg_afQqt53Arxw@FJ|B9c~V2mAQBPLsS7NB zlBP(nSEc|Wd=bRb;+Y4N#=~cGm}Igiru5_(#*DPd0{#o^GjN7EiQVPY3h>v4Vrut4 zs_lCCM*oZ~-cbYIbl!~A+;(YNL`^vIJ6lYe96ymBNqFW`u7jy9Obrvw^pee~Gou{N z^Y)b-9%IRQ+2(dw3w=_n=xM#D5|IS8emj{zgjZO^M!~SP*dI(cMd{I|rZ|@OQ-o!E zv9#3&nacU zUwqtlsCsE3v4Am*JrMm_;8&sJVBbxGYn$sI&Nu$TzE{aJSHG~8C{}}##ul7J>h^S{ z9W*4qh{c6l22^x)wqy>m9GSM^ywf_bY-1RkP#HY?D(;&t@sGRgFP`#jd&{c1Q;$S5 zE9$k}pPa0iQ%R8=L{`bHdk;O`ZRzMveI+`?p%8P9XT*xQ3Q)bICFz8%5)Uh!vG>{i z$Orq%Uww57vOIcw{y$hkb#&#>Pb9{xBa+J`n;V3oTuOd(3Xv2O3vxF$LYU|U%M?&fhj{)|FAR#CPvB~$;`uIP=vp}#p;bI$~r^R#=Z`<9NL2@f+FpPRfsf}CrMVz7_ z-td9{;mf1?&-P8m5(<`Y99~r^RUfsG@wB9d7C(N3$Nf`YbVw4#C}tI)R_=SxR3M;> z^8O$U0RLq!3?b{f>xEXP%s+*Me)!5tqu!(-5)x5h7#N5jCu{K{mFBO<78^f&ZCi>( z5RuR#-(6RikVuTPyji)+Df_)BSevPFz2|$HhJ7hC;R-TABvH_a4Fb-&KZn|(?4URd z@7m+7;$Y-F54#1nNnpidlDH_95k>h=dSBY%DOuAIS@c^U8#O=z4ABBJ0Wz3-ET7>@!YKJ%72m0gIb!& z+#)&nT|#~RyO=xdp3lG58J0i}hiH8Zrv|IWk(*SWK^k-CU+?2`-yfR>_F`;#TBC5U zIej>llx`+@4$Nb`)I90`04#_>$SG{Kd0yy&uCJL}Mz_BkXM>^F;P^b%;-RKD;V7~e zWfZ#BUygJcm=}CX@vhvsS`H2u>Cp*|h?O-!eSZ_jTWpw7?1d?V4l8PbBtbhK?vjZu zVk?DDt!?k|Z+NGDOGNzEg*vEu+wIDez1AA+jen&<7m}*-?97{e zrQEnfP%0rD*dbrk<9$MtKdUQemkXIo|KXKHJQmtAt(#qavX2NH4tKz#{;H7qoN)(o za52M1FyQWBE48r`>Z@Dyjnwb<=l%AR81|U+p*JfQ>O@_J>Jk3n2_+8b)~UJ0IISz4 zM|YM6M|)@csvbS%WZL)*L|VPE|lxZmVI6?M#gRyDMq^7W2ae2kmAgI29z=faQ79NSL+;V7r3 zHuAXGT39PjJR4^%pUz?Uvf0PIlof#WT1cF$(=2$A^tZbAVWef)oaK`157F`o#O%`8 zA&b@oQ;h*N_?*7eKS*NL($r~P8SQrWlEGzsr1M7WHdVHLrfv&`(oNrkt7G&0m-47xT-QC@Sl!SD5m!b$rOc)&kBSbnzgVgB$ zpfEyOgb^cTl)wA^{kO;N-QCX4+1)ws^LjmBI>N;H{xf;w?GW0%RHERO>hJR9_uOx+ z!uYA_)tQ;`ibYWv((ESDik4)Qkdk`kjV8`6W%dmO;;08iM5{ zBwzyRcn9#NU`Cv_h`ADfOputa2yz1xjP_2C>xQ$gKqQY}_lAC9*^SnT2?4gqEsc<) za4)=?4cp4KV}b6l|v z=H$HX{V&&!U! z=1@~RCVw74-e@>C426two&n+Wv*wOH-N9~nojY*;p}v5=sLGEndTcex0=3CTVliMl0&1Y4Q($W>yMLRj%4MTW=@+=Fi3? zJmW@0$68BEz=)sp>* zs+p{0GavAH46L9Q7g|Z0wWw-7Je(I01D^d6MaUqbq7qx*|Ln(;ZSm%AU*M7I9TP@A z3@8s?U$QE~iSRi;HMu8}1^1t}-ZGFDw(pA$N=JP(W=GN$=K@NU7oxO96Q0^sFF_3_ z+Gv>-W>q3OhCEk+%F%_0#G)0N_Y}NnwWq6AnvTgVjyNZer}NALKVs)>;hX_rE{G|U z?dSq6!cWmICZh_ytmmImO-M()f4i95ShRDL&gT9o>QE?;RzQfEe59R*!2|_aiHM&` zPL2J$M!7w6DnmvZjO_)E1_#G74K3}lv>A~rYFBt%pVg@U!8Aja zZb{3gk>)m8g#h6tlihF0M;{o=d~jLOC9-_ZMe`f<$2~h8<;ehN{D3aCsJIoDDIh-O z(zW92qECQ>ODHMYbOek%UEn8aZ*!TYp8$z_AXKSUm8J__oTHi7orFQ&`2F#O$eRFK1 zQ!BS8z=^}a&;1%Q1PzfTiLV;E+B1h3hH(-lIoUa5R+Nx&%H;myO@SG?%Zk6{)TAQc zr*Ww4rp8wfGj^%Z3-v#cUzBUIir*IYGbUj9Jpbh+__;gbQ0FS%kzrG#)fi2>{5N|5 zXZVGNh{~Qfy&6GqV^G}=dcjxb<;q8axhz9&0y#V*Kl$N+zoDSOd+vGJVRFswdTn6+ z)${IGSR|0fkrv^tiKU=>IV6O$BH6Sw@J4#P5QzIMo4u<{j$M18Fe z4K?HrMz#qOhz?n}*^jQ!gA=$4_G64l&h3pJ0dEp{ifw$3ig+_BnuaH`d$hVsCrB%ipC_26!QA8xMd?LA8l#g}!_4SiJFW! zS3x_@Oz}x^ee2UFZP|dnkYUyg*Kj{0Xy!nT+uOf6^V2$k0nG^SH~b0o*~v{%}w=_-F3=k z!X%VgTf&n371nCi^U2>Orb~@|D`a&Pn`H%2O5VM&yn}ys2W2G9F1=9d>Q`zUb6lL= zc1SB|E{bJ}&&VRdbs<`vH5ODA?=CtDkESFU$P7#lONSn{oqLpl_iG!dc@)DL&PWH8ZrBJ>vfelh)^;KP*GeD6)UeRmo)2Iy0 z`#yn}h}ci0aq^qr5%;=Nj5GN_`;l!tY&!GfRpX9Q-RT`W$d*xl}nhsj(RAGo~qX0JH zZoj_qk~74CVo^3)HG~NCk%C0#*@;#FgQFAmK3mAmRrMQk9pA5&o`C(;I*Oava3-`= zA?s-$nlhM2%d%dTeTa1?iO6&R3nz@XQIj9SHNAKEc|ObG{3Lkj7Y{m$yHRz@e~fUT zWQ?cFGaN<*ZO<1nIxJ~fIMBbq9$c7;t^>`b zdj!kL-v?E{-ihotdT36#?gFYvh&OdRVEaNiQ6yq_n(2ZKZEMEkd-vBhW)GTQu+v%TWj^e(NQFzc65PBZ#Gx4t`Xzy2mr<;%%}Tu;*9JJ|KQY( z9TQ`-+dzmeksvNe#+Xp{Qip`#>pi)y=$WhC%pWiWDA_x3PX&p0oE~E$ieT z1fQMKz*;mV^km=iN)j#5{&uDN5A_306xxl&=}mBm@z=n1%QbJA|@z8BKrx4v}oD;-OIy!-@u)|oB0 z(dN3sJx$+~XrmDgMl}`*PMygd)9)`Hmee?askdFu&o_=0qm6ZQi*VgpxMrv8d)%9% zf}4ek;D>2zZVOtP$;H>iv6K!z5KvuBWPy z?@Obm7sfF)YG%GT_zLAi)k0%&jeB#u;A1`qp^vckQW(BFO9I=apS)?BBkqV_Us+>G z#5A?v_MeitcD9PQovGG2<(>jXgMs2GT&}rSR!mBd^#hRTigl!{zlIMHCdF6S4*>*c zZy08J7Ui>KH;e&U!S-w)XpDZ|m|T*!up}JEa#nm_h(oFU(PNzFc|bc(OV6*Ezm9fo=sw3_%W})f9NHhQWJ!T9G>WP4rb-PbM3ON;F6-wRPrvWXHUyse~!X`z!UA z{yuxXy2)bF&u9RnU~gUfot9W;r;kPX5XOEoYAY6z~*3)avDY3oOKX-)D z7MZCa#OC!<@|S|kJ!C0!_j_8G_tQvM#7hPcK*F?JLF}vfILCyNaxNr69P!rvs8F+h zls_jCNvf@N&(lwWxJv}o*47q8ROT1S#R48hoS!By=f4}TKNP0lE6*y=4%2RkuSUs< z9Oy6dImcV1-lGGF7MO~)&y~(zSa*Q|FX!7!%OmVvZ$dK{r8^~|qC&y2x*3%-@#3vf zugfU1iE~ITpIEX_6M`vnC*Wcs)LX= zjgbf1hlz!~Ol6Mu_JSm9SU8k?8D_T47^bwyIbD`Er8Z_^eVGfCUQa5{&QIjF)b6R! z#gta{h6Qg%esyVEt1b@PB&*30VL!mw(aG0S`<12_2qh-gAt(M8U6wYU5agrm!qppC zJNKl!wH2GlBj&Oa65RqfCs%ZUzuoJQ)7;0uarn~RJEvcoXVbF_FCx$|5DM7|Mi%@K ztM~XT9g-Gk_xKfZWTIMicb^>|U&ag)1X>@hB#BsWItt2$DnEOdOS38tVv0|mkScR6 z&*)wTAJ<7znR~2>wFXpJ*bd8=k=Pj@- zPOV;vBE&`(iR7Z!nB2>%BeMvj9#y809dQrP-5X*fY~q&)-iAHZ%eO!|+BD*vH{1Y| zQHkH;Vb9U5t+Do66Ft(qwdEGyYE5}gC-0?7w_M9V@s--~lldD|!`fXrLcb&vQ3Uze zxxbO`3Z(G!V4Jg2R^~~|?KJKdKetWf(;otdUcfTE_B$*9OprjpdZva~KuBUk2J?40 zDN3BwF1`^2uD`8dn^z;h1i6lf=ZtKP=dL}1?=ZFHH_LmEY*$UIpy@D#fwosU)9Z|^ zamA8NS91w0JdM8%S`F!FK0Y{D{BFac7zdQ^3^cBs?T^8G-i)2dFYbU-o zp?=$3L@TzHfRc#s6)RDqY052NQ4<-zI@?uNE9y65ZjUex!8kJFhX)OPZb;I4N}igG zWURt3#jt#ye#5<2@e^Uc4z*m;T9~$0ElY{v&us24)hu#a=?b+il&jYLUia3T1N*cj zd{+GK_KC0x`+lx(mwGgcuj;+lilr}=A}Fwu?X-2SJy+=dzrQ1RY^2_n71>q49y?fl zNoQ|N)ha+4r9Z2jPyCf=B?{@qKdo=oB3(9rR`gmpT)-X)6LWy;sE5(G;4m$|gXZ(S z&k8$}N`*{qI4HRYWx@Nt$;*!d@1Ygc}cB-8zM7aF)(O z5?q8i>?*h&pi~-e&v?T@l9XdMkB0c}+JY4%?0<9DFv#m$6e;yz3`@zz;ZXnC2qcNm zRC$)sU7T}K5>CMPSCLI%#$ILU5aclE1C#q=z+&Au8*yVei%PIA>cO9nOG(!?vYeqg z(T`~n=6JdLr8KwH*y43yr9@G`h;MtzqwdsU9AXk~whW6{Q^yL8825md4~~M{FjCfC zrG5m+P$(h&v?lKGK#7dHe|x=LfN3*sp-xD1-O7m=OYt3gmWf2NY<$Arile~%`FBG{ z`3uod`N1?8NMeFHUHUI2s!q_ryLeM)_dGTnNQ%oDFS4QpIqSxU2VxgO8OZy~_G$2e zFBJrME=Z!P6AeR=--j7bf$6v#2q(n^t-;m9g_UEgd7`Zxhj6!M!D#5-7>b9#z6~tF z-Ig*LW=oVuDBK75>}o6G9IAdXU-Avd=!#sMsRUBbViauJ!cI!{llJNR3aP52WKZ>v zk8#Ok2yvhnOqr&7x072PI}Ze2c?009Y)sN^_*wiU8gKpQUCm}6eqm=7;|S@Yo&UP{ zNd~@*hUC?^--SMYqT-*NyM&*tavHq)VM2&GHsHMW!*Ud>%`tny!V|A1-vn$ANuTdWE2W;o&adX zR=&PG%kEUrA2${^;^7kObb#dwvX;q36i7P~9q1LAXT)X!cece!*|A&tieoW1s4~7E!uE2}t|~6|PO*`RN1_Vp#PD=QA8E>wG_qE9E(j+1?QO z5lRpey9AKP3F#KHokKM8syv3QIzM$Iw|&m;^`03*xV%t_{WE@RH^3 zjaFcN|1BDX(3kPkhiEMi zmAAfEPqlRNDx=vdrgV^TfoklWwS>f%?c&f%&HATisPMO(TT6)0FUXNmjJAZ_gA?a+9s5TAo3Z4`HJgTk$I`b|VL7 zMP+g*XCF)}5G~f}qbmUB`U@-qcfoABU6fw9jteUpeCXOM)sROxo(<|>p5d?s%}~O1 za1fN@J6sM}Gr$CnNo^=&#J8~?Ze)=4yy#eLdUysLTjFo7XBns(LdL2IJ!J^o`}o{3 zjKT0T`qJ??_kd_;FP8qI5^^@MJYGa@fhM24w8)?p$Kz$CX{-j(OL)#Q{J8xGV&UV+;D^02-uIb|;%b2k zo)<)4?-x7HL+6!Q3)n*0d!2!r;h~X_pcQ8zjYG6E0Fl0+v_VxNS-soNB|)Q88x0o~ z$l9+KW18JF-w2Qe6us$TwP zzxzyMFF}4}D{nL#ld%GM2>d*5ZrqUKcbF7}Y_?V8G=8~@!3TjWFJPUy?0qJ_U1kPE zKN-S}UKhY${!X75ffu>jZ%KaGyf)!4d%yKZCbTd3;}52{sodx>AGtr64ITkzfY?`H zIEP%@_zEF^R&r3Rq_acC8pQWZRa_@1?~Jb&={f_{G}sehix7Hs*&xT?3NzXnd}>n| zvSMzs$VpN=m^h6S^p?8*of6cYY_FG3x}1a4M$35h#6I2PHbzNFLeTxOGA|@!mQLqQ zhr~4WC*ths1E2+NOXIQAY^=;t9634u2Pz&^~b(+~2O?XA_16N18l zKfm-=vY597<0jjf5!cE0d)h=?|8UrUABOk>j81P`@}b=u&B@D~#tSxjZs{CQ5RE1m%k ztHsA>(=X;O_H^jenynO*8b%sb9uwo5(L9!m#m=v+98C>g>AKY@ywi~0-2j9qqLryD z_vKk$J6R#6U~}8M;BOmD!`pJSE%!cK?3ZngWd}bR$M|5~G0yz^2?{7LS=2>c-;nLI z*0Y5B+NGMXFnhn(R-@u-MvKKN@u3KsZx+$?*TLI{@ArqKD{8;0c;0Tqdx|HOHLCjW z+P~d@emRR=QMWPQtN++4hhutHSIi(SH<90&^;_vMz>|B( zd60o8QMTp{??7Kz0H&vB$il_~68r|Lb$5C2f>=Gdz(>dKuDKI?12!G!@r1I6!$;=U z#No!F9)r@%QD#jl`4#pLaz8DtsT;b*4N12 z;l5{TORcb$>LA}QoI#$dzXEx4ZU>iIO0~**LTig7KA+2xPSaSE#6J!e1|PH63Z*0IIAxCl~h z3+lBMovsq9@Nd!UMT^h|WIOcOv5jTC5_6yt_^x+4k8fa)LJ@ zC3ySG0YW>dn~+V|T6f)A(YI_JLZrl3Gx5UnLlt9{N)l38#wxhIEknf+Mz zN(Vn9ALxr%oIUhoha3<2B2u`vgLrF2q3K;;5!gjxLi4a@B%MWE1W{9+)G1~hv$GC_xmI|P^QM4Q(Dl_Yw877zX7NYSYK&D7TKQ2(mrHS$E0G&q ziC=AIc^evY{rJ{+HEck0r!ZQ70DvqI$M4W<3GC^uXdQ>D^% z=Q{yON>2x@4a)8ewLf<}26mEx$R1<7;NU%F!AFwV$zc@i8EabpJwio&_wG)dZDr4I zg{`_F=&63nFMJ8rr0;`&0i$q|94Vr}510x4tb*D={zIp3*sYzO!kT3|p=ke|yOL;& zNd!|1wQn+QR8}D%RHRZ$q}T72$!}=y!*hi7lXV zACy%3jfD4^;)@&-RXWl*vnW4N5DXsgFWhl4zLzyn;UD7kMR`BhO$%R%B>;{q*P|vrq-Oh1uM+wak<8pG` zwQxz#ln9eC`i6eTgQVcy;1YsZrCGld{gpDXz8k`!O+i|(2L4%BIl*=$wq3TUz>qAE z(eI)%VWyt)J+rYiQz5sKKhWp!6i1lW+YxybNU-r&@Ig{oKMf8;NTvPgLENmdgkpK% zubTz3!ZybYt$ssLWdXoJI??o(FH6m&6k+_t{+-Ctuj?VKRr4hdEMWb`e_j_;9GW?4 z(r*UpOD_MX5)Rgwl;?1~s?R(t$~3pF4}?po)+@$jQBkaJN^TH|ujwdg-&P!*SimD| z8pA^{YLP6PWuLSZ>$?d}i1}9^_Jr~8aLoht;q6m=-@73~=#S57Zn$fIkW*pfArJF* znbcF?bSJ+Bt6iF`bcTA@2FW!kDr0@uf9Llq`x)$`IG0`q5Pr8Yi={b>paZleE8lvW zr3eXFgqAW;#m{LdQHXW9D$zGFylgCc`>eaKLb7=MXu-Sq_+AzfQt7@XObw|Q$_`x8(WPxa-)9;yq$6H^%B5+oIvb>#3>$s>*d>qq!2fieVSUD z{`r-=5gfub_L<44Zvu!J_im_olXLu87UzNL%T*X_o6s;5Aw~yK!w7i}ncqGKb=(eR z3{z8h=p{iL)VpBmJF(hTchwC_wC5aIZC@{jEv+;m8w3+KGnJxEva)E5!brY6tTfpy z!KcA6GNEjr0-&s}G*=btyqjer zu~sEUmL{RugSP%!O!c0Me{=!?BYULfrb%GaKaj_(2B!U#Xi64szonTbaeiABKX6fR zj?t`%HzVB{?qO`@aoo(Vh0eAC0sDT=O<^LkIjWn=zGE|tE1S2+=8 z&VQKeoxK{URFZcpn%u&#$=G*qI!dt~(I;$><;Vc|7Iv-2L(lt-^cQAol&3>!p2T5D zvT$t`t|N#)iRP6G$qGD)6}l)_aHGEQ4r)7P`z*V^tBMZ_2iW<~Q2?QexgWdzI-2E9 zHaS4&>j(bO$DiUfi^=ZrDRrCOUHlGO>6sQEi=?I;q8y9IvdX<0abo3Sc$nRw;~HSz zh{j9s&P!@}_G>1YmkF)ZykS@lGH!@1iMO_c*neEm=jd{c^q7HSz6;fX9?7b;m9fG| z{Q-pcD#y|OqT|A8*_071aoeV_LoUL(-A$hN8a$f1FJ#pT7%s-KJ~DJp;U2@h#OyV@*1OS*RUp3D4CFh+Q_!?MQsdjv zbxES3kJzUb+xt;W9r<*R`@=LQ3cL6)$*GS<_W613kd8kot?@I38JJ*}rh5;meupLW zMif_b86o!`kL|tbVph_J7^R>0axca=wqL$0?K)?HcY2Z@*IzHHY!@fgp3rU4>*V_5 z+mumSDQ3C;`5Z-R>6RHK;djj!HC}!3OtN7 zIWft?WHCy*$=kQ3qHbke9~LG7EbQfMnFp1AchuU$_WF@?AjQ`Tr-v(%q^N=evfQNX zEX)jgD)J%5RjX7PnkTAcb>i*3e?~>shr;s1^{y#X`aH^#kD1@S`|uc80As+)%TWbt zygNSmve?qjxo%I|<8`XjCZm4?d!Cp*e+g)7nm_9GubKJtHk6F zL-9SaNz7(MXsk-3Cm%N1qsNVa79N|@|3NuHwLtF2mkU_lYK!qvBxn1da6c`FAJMvv zrBzBJ;dGd)yRb8^79k?~*F8<;Y4?xI?9$|g$Y>rWT;L2?V4TBq6QD`@wH+a|H{K&| zOSHItg&RW~cG@Fhy04N@%JX4QapDl`X*iYkb~2R+A3EL$Vt4fYBF-W^~v4aX0pYm-?cfyRRT^Oj$#zJfPqa5FO!-@EY$5<$R z@xcky)DUY-vq+d<9P;hai=Fn!keU$~?9&@uN8D|2maqbohih#Qh1vs|mUXmgPm3~7 z=`OHECEwcce$S8jCD}*^2EbU;`CHfMTm?T?{LU8pBr-kHuU=G@OVzdyfVSA?Kl^lf z8J8v7M0!R(`cMobX$fjLQ1^iRS(0yWfJQiH4q!Q3KP^7Tm;@f|z(WGsw5*tSevFCt zN}b^n9479pt$i@45ac1a^Qf<|Wu@D1Tj#nuYn~05Cn#t^1(= z3fH7|@MsY8`J_pg!xLe#JAwAa6Z1`3p@&Y^EJj@GFH{aE#2X5Cf#66kvcPqz(#7R& z2tl3Wd#pR9{+UBNu)s&L$(?CMDup}t@T1~jQ^npykm!BqqEV&T#PI{?4|4;bz0q_V z1cijT3&VovejJ@@YgdZPd;hIoMLTkj$#2v-su+C@E?~TBCtrLk z*(Y|QqTYnybxB*Ts?ID#Z}wL#yHhVkq==}a+rm~QXVCQ-CPO#Z=1KI~W;5GHYFm8a zV)l$(nN;n+~7f-g}ShK^rM$6T{TYaA9q6Fe7+<_1)kxt-Wngu_d3R?SS(ggUx}CQ6M=)RRCuGkCeK8s zNr~VUYU1-hUPJ!4<`$P$tOi`vzxzBa&t_|7)WP}CDRDjfzQ;|s82#r0D2b0%ioDu8=weJXK!fLdAM3eTnvM15bKW=W zdl{I!4$2+vFYL=kx4g|oZXT@O4lP?prHBpsmT^)v7=wP z@>=T+FqDVY6o}YNWi0H89+CLKRZebm`11%-rt=NYXjs|qxxMEDc4ZT^xmQ?6@71EC zd%t{z68o^v_~b0T%WM4(6lvUK4C(h!%8GwX4|byCMo;C?Ew{>! zyMqGWxqAg^F6>By05;9!xsZBv{Y+o$`tjb&8|O@GgYHJCVpProzHy~fbgb%?zwY1c z0M(jVj$PV|s$WqG0zmI;u{;cxTpqm0m!AS&=Xj(*cTFl%4epJOS&=NC z>^kr16VVsmoX*2SHw$tjN5y^l$`JZVYy z+*F&ZS)5`f7aDl7p30xSwVo~20Ir_$sVK5vT_KAtn&tF}tnFU?XBTnQSsdo&_boTX zU5n?%<|ii4p{Of`kEKKBi)i^HCg#)0-~@G;r*#o(9%4X#t*XqDX58k?7La$Xmb?ww zC}bh(Xa9t~SH0Vs)>V0i|1QOY=D*kH_-Ec2KRqAvYtyF0R>=^Oe;|qL06PLt9ISve z_s-92>Ou_DLJ0g;YOrV*>oH-Z)@D#T<$n&u(okZ2bh$jwX?Fmo=Bu(2!zJ)j|4zl{&Q+X>M!Am!B%0pd9UG31tEbK4+5enw?ypJWye71+kTR z7_jtM0v3PI%sO3v`XxEn{7nr?vuQ%dhA`wNOry2@59t2 z;YD_Sf0H8(uHCEQx0?HH&nh?bKK63oi9g0#wBDXmxVb!CG=C<-alJi$`^%JKXij|j znHytOL%`&1ZZGehG%grLOUU#QabE6|yg|}LihQGRiuE9N+6G`RZX5e)$}*+)S8tOH zQesG(Dp4kpJs?GeTGF%P&D*%!gKI#995d3(Y%7E^uEum4jWb-z6nla{$>YpCa=b9B zvf5UNO#>g$-f-R3Y?BvdaUE#)!{q;g;;v*O-B0Be{##`Tp?7<`{UKf??#b9ye|>5v zF$oWlVNQ!uJo(>wmzZnhum2D?eBb*o!JE21pB^YiIi`0q9%cd2HAW-$KWP*~pPK~z z;P}Vq+SZl^9AZ!mJ|R7Yff-uBn+wi&cECN##t`2f4wmEUkjM@=NV~SVc|pvdC2$V} z5HFS7dCyOaAN=pu2TaCl_9Z*b-Z3~b7`NNn%#`$P1|Red!ob4-#&B`rtaH@2(?H=8 zc;|#r5*dfjt{0`7VIgvzhuhYWYU)?v13ypBqb(0?t-b+frX`q5yC?PGMP1~*w292t z*AsioOZyG^Ow+bT`kEY6Mtrv9*lz_M9*t5d1yTlguBfONCl=zh2{lC_RwFTIb81wg z!P0L!Ob6*m#U30CnEul`D$C5y{`wCTlEhV;%O2A#@((l-c9jY`r-yHw&g00Wf7bm< z@F1c_nJ)TXtcErcmS=Ps49Jx+^%iH&Jsgdp&=5G85@jt#2_XLF9W#!h;3}<9ZW2-0 zD_y-~cCw?4T&j8;a?RPXYOL*Rg1fmg#w@1hVKB^TlI~al3-JS((EO1 zk(m876!ts3=cb|zNR{I%%{fXSs42qNh6qvA;4A(a#HHgZ;eB6Ql$xlbe47S(e~{$b zG*5+vF6VmyH1tNAZqJo`D!nWi|Gg?zRu~%zU_xrI<2}bd{eV@hi0f$1x{Va*EPW$Y1$&pseArxj<%Q z|F)=+9_ZKChWM}kYaZsZnB6 zHZHe-xSY+BtL!4+cTYSESm4q$XIW-VZ)nltu*e50Yi!0zn)kHzI;6v@k zr$ymLYM|$Jzue3SXc$H2lK?gU>v5bE<2t{zS6n4HG$tvgv0m1Xxk_-6vE1TMIz){$ z9jFL$VdR?FYN9N#Ui&=nlbokOE4C%3 zJ|E~kP3r?5*9iMeOPeHDVG@DYNR+1hn)gX0{&hA?X^873`r7x&BPS4vYiaD$DP>_1 z#C-bdaM6b(t`a;6@_0!(9wq-CWuP&FHYIYTqPtzXQ47Eoi#-%2Um3ue!GXXbfZWzW zXhi?J|MmkTS7|Jp)laJgWf47zxqa`!{{hC5KzM(^oteen`eQ&}BHC|vE~-8ILPWTVG^*{q%A(M@oXR3)vWmWp~s!QhnAv?%i zs%vSE#rT2#Z`aazBW5aqTgt;#QbUodz+)>NQ^ZvYi#^_r=@c~1$!yks&s7@tj5TJyR$YQg8tA@^w2D)G;Fm&HRIKgx3w5!T#D!Bi3#2-;XEvxt UX7RJ(kO%=iR3#Wu{BQaH0L<5n2mk;8 literal 0 HcmV?d00001 From 3f5a60f1abc3620b590ed7b54ee69c8d71ce1a40 Mon Sep 17 00:00:00 2001 From: eulogizee Date: Mon, 18 Nov 2024 10:19:13 -0500 Subject: [PATCH 049/262] Rename InterfaceAdapter.change_password to InterfaceAdapter.logged_in --- src/main/java/app/AppBuilder.java | 3 +-- .../{change_password => logged_in}/LoggedInState.java | 2 +- .../{change_password => logged_in}/LoggedInViewModel.java | 2 +- src/main/java/interface_adapter/login/LoginPresenter.java | 4 ++-- src/main/java/interface_adapter/logout/LogoutPresenter.java | 4 ++-- src/main/java/view/LoggedInView.java | 4 ++-- 6 files changed, 9 insertions(+), 10 deletions(-) rename src/main/java/interface_adapter/{change_password => logged_in}/LoggedInState.java (95%) rename src/main/java/interface_adapter/{change_password => logged_in}/LoggedInViewModel.java (85%) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index e38222fab..c38b49b32 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -1,6 +1,5 @@ package app; -import java.Constants; import java.awt.*; import javax.swing.*; @@ -9,7 +8,7 @@ import entity.CommonUserFactory; import entity.UserFactory; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginController; import interface_adapter.login.LoginPresenter; import interface_adapter.login.LoginViewModel; diff --git a/src/main/java/interface_adapter/change_password/LoggedInState.java b/src/main/java/interface_adapter/logged_in/LoggedInState.java similarity index 95% rename from src/main/java/interface_adapter/change_password/LoggedInState.java rename to src/main/java/interface_adapter/logged_in/LoggedInState.java index 54ed80537..6acf23ff7 100644 --- a/src/main/java/interface_adapter/change_password/LoggedInState.java +++ b/src/main/java/interface_adapter/logged_in/LoggedInState.java @@ -1,4 +1,4 @@ -package interface_adapter.change_password; +package interface_adapter.logged_in; /** * The State information representing the logged-in user. diff --git a/src/main/java/interface_adapter/change_password/LoggedInViewModel.java b/src/main/java/interface_adapter/logged_in/LoggedInViewModel.java similarity index 85% rename from src/main/java/interface_adapter/change_password/LoggedInViewModel.java rename to src/main/java/interface_adapter/logged_in/LoggedInViewModel.java index 85c81e4e6..ba0184f58 100644 --- a/src/main/java/interface_adapter/change_password/LoggedInViewModel.java +++ b/src/main/java/interface_adapter/logged_in/LoggedInViewModel.java @@ -1,4 +1,4 @@ -package interface_adapter.change_password; +package interface_adapter.logged_in; import interface_adapter.ViewModel; diff --git a/src/main/java/interface_adapter/login/LoginPresenter.java b/src/main/java/interface_adapter/login/LoginPresenter.java index 66560d51a..087996fd2 100644 --- a/src/main/java/interface_adapter/login/LoginPresenter.java +++ b/src/main/java/interface_adapter/login/LoginPresenter.java @@ -1,8 +1,8 @@ package interface_adapter.login; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInState; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInState; +import interface_adapter.logged_in.LoggedInViewModel; import use_case.login.LoginOutputBoundary; import use_case.login.LoginOutputData; diff --git a/src/main/java/interface_adapter/logout/LogoutPresenter.java b/src/main/java/interface_adapter/logout/LogoutPresenter.java index 126da3c94..d2343fd0f 100644 --- a/src/main/java/interface_adapter/logout/LogoutPresenter.java +++ b/src/main/java/interface_adapter/logout/LogoutPresenter.java @@ -1,8 +1,8 @@ package interface_adapter.logout; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInState; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInState; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginState; import interface_adapter.login.LoginViewModel; import use_case.logout.LogoutOutputBoundary; diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index cf6ff72f6..8d0d2ec95 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -12,8 +12,8 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; -import interface_adapter.change_password.LoggedInState; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInState; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.top_tracks.TopTracksController; From dac97d53f863de06dbdef5899de7a3e5797d22bf Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:40:31 -0500 Subject: [PATCH 050/262] renames lyrics to keyword --- src/main/java/view/LoggedInView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 8d0d2ec95..2afcd67ff 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -48,8 +48,8 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final JButton description = new JButton("Search song by description"); searchButtons.add(description); - final JButton lyrics = new JButton("Search song by lyrics"); - searchButtons.add(lyrics); + final JButton lyrics = new JButton("Search song by keyword"); + searchButtons.add(keyword); final JButton home = new JButton("Home"); appButtons.add(home); From dce92a45e8146f19f502b9fb5355272202933ac5 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:48:33 -0500 Subject: [PATCH 051/262] Update LoggedInView.java --- src/main/java/view/LoggedInView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 2afcd67ff..76998ce36 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -48,7 +48,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final JButton description = new JButton("Search song by description"); searchButtons.add(description); - final JButton lyrics = new JButton("Search song by keyword"); + final JButton keyword = new JButton("Search song by keyword"); searchButtons.add(keyword); final JButton home = new JButton("Home"); From 786edff9af7c6eb6e22241c316699999a3be9d54 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 18 Nov 2024 13:23:04 -0500 Subject: [PATCH 052/262] Update LoggedInView.java --- src/main/java/view/LoggedInView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 8bdc91f44..984a3216a 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -44,8 +44,8 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final JButton description = new JButton("Search song by description"); searchButtons.add(description); - final JButton lyrics = new JButton("Search song by lyrics"); - searchButtons.add(lyrics); + final JButton keyword = new JButton("Search song by keyword"); + searchButtons.add(keyword); final JButton home = new JButton("Home"); appButtons.add(home); From 40beaf8b89ce7c145cbe0dd7727eeb192af256bf Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 18 Nov 2024 13:31:51 -0500 Subject: [PATCH 053/262] Completed some refactoring to make the code more understandable. --- src/main/java/app/AppBuilder.java | 35 +++++++++-------- .../InMemoryUserDataAccessObject.java | 4 +- .../top_items/TopItemsController.java | 29 ++++++++++++++ .../top_items/TopItemsPresenter.java | 38 +++++++++++++++++++ .../TopItemsState.java} | 8 ++-- .../top_items/TopItemsViewModel.java | 13 +++++++ .../top_tracks/TopTracksController.java | 30 --------------- .../top_tracks/TopTracksPresenter.java | 38 ------------------- .../top_tracks/TopTracksViewModel.java | 13 ------- .../top_items/TopItemsInputBoundary.java | 13 +++++++ .../TopItemsInputData.java} | 6 +-- .../top_items/TopItemsInteractor.java | 29 ++++++++++++++ .../TopItemsOutputBoundary.java} | 6 +-- .../TopItemsOutputData.java} | 6 +-- .../TopItemsUserDataAccessInterface.java} | 4 +- .../top_tracks/TopTracksInputBoundary.java | 13 ------- .../top_tracks/TopTracksInteractor.java | 32 ---------------- src/main/java/view/LoggedInView.java | 10 ++--- ...sAndArtistsView.java => TopItemsView.java} | 12 +++--- 19 files changed, 167 insertions(+), 172 deletions(-) create mode 100644 src/main/java/interface_adapter/top_items/TopItemsController.java create mode 100644 src/main/java/interface_adapter/top_items/TopItemsPresenter.java rename src/main/java/interface_adapter/{top_tracks/TopTracksState.java => top_items/TopItemsState.java} (82%) create mode 100644 src/main/java/interface_adapter/top_items/TopItemsViewModel.java delete mode 100644 src/main/java/interface_adapter/top_tracks/TopTracksController.java delete mode 100644 src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java delete mode 100644 src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java create mode 100644 src/main/java/use_case/top_items/TopItemsInputBoundary.java rename src/main/java/use_case/{top_tracks/TopTracksInputData.java => top_items/TopItemsInputData.java} (71%) create mode 100644 src/main/java/use_case/top_items/TopItemsInteractor.java rename src/main/java/use_case/{top_tracks/TopTracksOutputBoundary.java => top_items/TopItemsOutputBoundary.java} (72%) rename src/main/java/use_case/{top_tracks/TopTracksOutputData.java => top_items/TopItemsOutputData.java} (70%) rename src/main/java/use_case/{top_tracks/TopTracksUserDataAccessInterface.java => top_items/TopItemsUserDataAccessInterface.java} (93%) delete mode 100644 src/main/java/use_case/top_tracks/TopTracksInputBoundary.java delete mode 100644 src/main/java/use_case/top_tracks/TopTracksInteractor.java rename src/main/java/view/{TopTracksAndArtistsView.java => TopItemsView.java} (87%) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index e38222fab..5a95761cb 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -1,6 +1,5 @@ package app; -import java.Constants; import java.awt.*; import javax.swing.*; @@ -15,21 +14,21 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; -import interface_adapter.top_tracks.TopTracksController; -import interface_adapter.top_tracks.TopTracksPresenter; -import interface_adapter.top_tracks.TopTracksViewModel; +import interface_adapter.top_items.TopItemsController; +import interface_adapter.top_items.TopItemsPresenter; +import interface_adapter.top_items.TopItemsViewModel; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; import use_case.login.LoginOutputBoundary; import use_case.logout.LogoutInputBoundary; import use_case.logout.LogoutInteractor; import use_case.logout.LogoutOutputBoundary; -import use_case.top_tracks.TopTracksInputBoundary; -import use_case.top_tracks.TopTracksInteractor; -import use_case.top_tracks.TopTracksOutputBoundary; +import use_case.top_items.TopItemsInputBoundary; +import use_case.top_items.TopItemsInteractor; +import use_case.top_items.TopItemsOutputBoundary; import view.LoggedInView; import view.LoginView; -import view.TopTracksAndArtistsView; +import view.TopItemsView; import view.ViewManager; /** @@ -59,11 +58,11 @@ public class AppBuilder { // private SignupViewModel signupViewModel; private LoginViewModel loginViewModel; private LoggedInViewModel loggedInViewModel; - private TopTracksViewModel topTracksAndArtistsViewModel; + private TopItemsViewModel topTracksAndArtistsViewModel; private LoggedInView loggedInView; private LoginView loginView; - private TopTracksAndArtistsView topTracksAndArtistsView; + private TopItemsView topItemsView; public AppBuilder() { cardPanel.setLayout(cardLayout); @@ -107,9 +106,9 @@ public AppBuilder addLoggedInView() { * @return this builder */ public AppBuilder addTopTracksAndArtistsView() { - topTracksAndArtistsViewModel = new TopTracksViewModel(); - topTracksAndArtistsView = new TopTracksAndArtistsView(topTracksAndArtistsViewModel); - cardPanel.add(topTracksAndArtistsView, topTracksAndArtistsView.getViewName()); + topTracksAndArtistsViewModel = new TopItemsViewModel(); + topItemsView = new TopItemsView(topTracksAndArtistsViewModel); + cardPanel.add(topItemsView, topItemsView.getViewName()); return this; } @@ -196,14 +195,14 @@ public AppBuilder addLogoutUseCase() { * @return this builder */ public AppBuilder addTopTracksAndArtistsUseCase() { - final TopTracksOutputBoundary topTracksOutputBoundary = new TopTracksPresenter(viewManagerModel, + final TopItemsOutputBoundary topItemsOutputBoundary = new TopItemsPresenter(viewManagerModel, topTracksAndArtistsViewModel); - final TopTracksInputBoundary topTracksInputBoundary = - new TopTracksInteractor(userDataAccessObject, topTracksOutputBoundary); + final TopItemsInputBoundary topItemsInputBoundary = + new TopItemsInteractor(userDataAccessObject, topItemsOutputBoundary); - final TopTracksController topTracksController = new TopTracksController(topTracksInputBoundary); - loggedInView.setTopTracksController(topTracksController); + final TopItemsController topItemsController = new TopItemsController(topItemsInputBoundary); + loggedInView.setTopTracksController(topItemsController); return this; } diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index 1ccac5f9f..e04702dd5 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -7,7 +7,7 @@ import entity.User; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; -import use_case.top_tracks.TopTracksUserDataAccessInterface; +import use_case.top_items.TopItemsUserDataAccessInterface; /** * In-memory implementation of the DAO for storing user data. This implementation does @@ -15,7 +15,7 @@ */ public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, - LogoutUserDataAccessInterface, TopTracksUserDataAccessInterface { + LogoutUserDataAccessInterface, TopItemsUserDataAccessInterface { private final Map users = new HashMap<>(); diff --git a/src/main/java/interface_adapter/top_items/TopItemsController.java b/src/main/java/interface_adapter/top_items/TopItemsController.java new file mode 100644 index 000000000..0ab48a00f --- /dev/null +++ b/src/main/java/interface_adapter/top_items/TopItemsController.java @@ -0,0 +1,29 @@ +package interface_adapter.top_items; + +import use_case.top_items.TopItemsInputBoundary; +import use_case.top_items.TopItemsInputData; + +import java.util.List; + +/** + * The controller for the TopTracks and Artists Use Case. + */ +public class TopItemsController { + private TopItemsInputBoundary topItemsInputBoundary; + + public TopItemsController(TopItemsInputBoundary topItemsInputBoundary) { + this.topItemsInputBoundary = topItemsInputBoundary; + } + + /** + * Executes the Logout Use Case. + * @param toptracks the username of the user logging in + * @param time nfvenprne + */ + public void execute(List toptracks, List time) { + // 1. instantiate the `LogoutInputData`, which should contain the username. + // 2. tell the Interactor to execute. + final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, time); + topItemsInputBoundary.execute(topItemsInputData); + } +} diff --git a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java new file mode 100644 index 000000000..a740a7e41 --- /dev/null +++ b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java @@ -0,0 +1,38 @@ +package interface_adapter.top_items; + +import interface_adapter.ViewManagerModel; +import use_case.top_items.TopItemsOutputBoundary; +import use_case.top_items.TopItemsOutputData; + +/** + * The Presenter for the Top Tracks Use Case. + */ +public class TopItemsPresenter implements TopItemsOutputBoundary { + + private final TopItemsViewModel topItemsViewModel; + private final ViewManagerModel viewManagerModel; + + public TopItemsPresenter(ViewManagerModel viewManagerModel, + TopItemsViewModel topItemsViewModel) { + this.viewManagerModel = viewManagerModel; + this.topItemsViewModel = topItemsViewModel; + } + + @Override + public void prepareSuccessView(TopItemsOutputData outputData) { + final TopItemsState topItemsState = topItemsViewModel.getState(); + topItemsState.setTracks(outputData.getTracks()); + this.topItemsViewModel.setState(topItemsState); + topItemsViewModel.firePropertyChanged(); + + this.viewManagerModel.setState(topItemsViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); + } + + @Override + public void prepareFailView(String errorMessage) { + final TopItemsState topItemsState = topItemsViewModel.getState(); + topItemsState.setTracksError(errorMessage); + topItemsViewModel.firePropertyChanged(); + } +} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksState.java b/src/main/java/interface_adapter/top_items/TopItemsState.java similarity index 82% rename from src/main/java/interface_adapter/top_tracks/TopTracksState.java rename to src/main/java/interface_adapter/top_items/TopItemsState.java index 013610f60..f6e9ed970 100644 --- a/src/main/java/interface_adapter/top_tracks/TopTracksState.java +++ b/src/main/java/interface_adapter/top_items/TopItemsState.java @@ -1,4 +1,4 @@ -package interface_adapter.top_tracks; +package interface_adapter.top_items; import java.util.ArrayList; import java.util.List; @@ -6,17 +6,17 @@ /** * The state for the Top Tracks View Model. */ -public class TopTracksState { +public class TopItemsState { private List tracks = new ArrayList<>(); private String tracksError; - public TopTracksState(TopTracksState copy) { + public TopItemsState(TopItemsState copy) { tracks = copy.tracks; tracksError = copy.tracksError; } // Because of the previous copy constructor, the default constructor must be explicit. - public TopTracksState() { + public TopItemsState() { } diff --git a/src/main/java/interface_adapter/top_items/TopItemsViewModel.java b/src/main/java/interface_adapter/top_items/TopItemsViewModel.java new file mode 100644 index 000000000..e77edeb91 --- /dev/null +++ b/src/main/java/interface_adapter/top_items/TopItemsViewModel.java @@ -0,0 +1,13 @@ +package interface_adapter.top_items; + +import interface_adapter.ViewModel; + +/** + * The View Model for the Top Tracks View. + */ +public class TopItemsViewModel extends ViewModel { + public TopItemsViewModel() { + super("Top Tracks"); + setState(new TopItemsState()); + } +} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksController.java b/src/main/java/interface_adapter/top_tracks/TopTracksController.java deleted file mode 100644 index c55395d3e..000000000 --- a/src/main/java/interface_adapter/top_tracks/TopTracksController.java +++ /dev/null @@ -1,30 +0,0 @@ -package interface_adapter.top_tracks; - -import use_case.logout.LogoutInputData; -import use_case.top_tracks.TopTracksInputBoundary; -import use_case.top_tracks.TopTracksInputData; - -import java.util.List; - -/** - * The controller for the TopTracks and Artists Use Case. - */ -public class TopTracksController { - private TopTracksInputBoundary topTracksInputBoundary; - - public TopTracksController(TopTracksInputBoundary topTracksInputBoundary) { - this.topTracksInputBoundary = topTracksInputBoundary; - } - - /** - * Executes the Logout Use Case. - * @param toptracks the username of the user logging in - * @param time nfvenprne - */ - public void execute(List toptracks, List time) { - // 1. instantiate the `LogoutInputData`, which should contain the username. - // 2. tell the Interactor to execute. - final TopTracksInputData topTracksInputData = new TopTracksInputData(toptracks, time); - topTracksInputBoundary.execute(topTracksInputData); - } -} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java b/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java deleted file mode 100644 index b63fc4e73..000000000 --- a/src/main/java/interface_adapter/top_tracks/TopTracksPresenter.java +++ /dev/null @@ -1,38 +0,0 @@ -package interface_adapter.top_tracks; - -import interface_adapter.ViewManagerModel; -import use_case.top_tracks.TopTracksOutputBoundary; -import use_case.top_tracks.TopTracksOutputData; - -/** - * The Presenter for the Top Tracks Use Case. - */ -public class TopTracksPresenter implements TopTracksOutputBoundary{ - - private final TopTracksViewModel topTracksViewModel; - private final ViewManagerModel viewManagerModel; - - public TopTracksPresenter(ViewManagerModel viewManagerModel, - TopTracksViewModel topTracksViewModel) { - this.viewManagerModel = viewManagerModel; - this.topTracksViewModel = topTracksViewModel; - } - - @Override - public void prepareSuccessView(TopTracksOutputData outputData) { - final TopTracksState topTracksState = topTracksViewModel.getState(); - topTracksState.setTracks(outputData.getTracks()); - this.topTracksViewModel.setState(topTracksState); - topTracksViewModel.firePropertyChanged(); - - this.viewManagerModel.setState(topTracksViewModel.getViewName()); - this.viewManagerModel.firePropertyChanged(); - } - - @Override - public void prepareFailView(String errorMessage) { - final TopTracksState topTracksState = topTracksViewModel.getState(); - topTracksState.setTracksError(errorMessage); - topTracksViewModel.firePropertyChanged(); - } -} diff --git a/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java b/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java deleted file mode 100644 index e08360571..000000000 --- a/src/main/java/interface_adapter/top_tracks/TopTracksViewModel.java +++ /dev/null @@ -1,13 +0,0 @@ -package interface_adapter.top_tracks; - -import interface_adapter.ViewModel; - -/** - * The View Model for the Top Tracks View. - */ -public class TopTracksViewModel extends ViewModel { - public TopTracksViewModel() { - super("Top Tracks"); - setState(new TopTracksState()); - } -} diff --git a/src/main/java/use_case/top_items/TopItemsInputBoundary.java b/src/main/java/use_case/top_items/TopItemsInputBoundary.java new file mode 100644 index 000000000..1752b5ae1 --- /dev/null +++ b/src/main/java/use_case/top_items/TopItemsInputBoundary.java @@ -0,0 +1,13 @@ +package use_case.top_items; + +/** + * Input Boundary for actions which are related to Top Tracks Charts in. + */ +public interface TopItemsInputBoundary { + + /** + * Executes the Logout use case. + * @param topItemsInputData the input data + */ + void execute(TopItemsInputData topItemsInputData); +} diff --git a/src/main/java/use_case/top_tracks/TopTracksInputData.java b/src/main/java/use_case/top_items/TopItemsInputData.java similarity index 71% rename from src/main/java/use_case/top_tracks/TopTracksInputData.java rename to src/main/java/use_case/top_items/TopItemsInputData.java index 419d04c35..43ce936d2 100644 --- a/src/main/java/use_case/top_tracks/TopTracksInputData.java +++ b/src/main/java/use_case/top_items/TopItemsInputData.java @@ -1,16 +1,16 @@ -package use_case.top_tracks; +package use_case.top_items; import java.util.List; /** * The Input Data for the Top Tracks Use Case. */ -public class TopTracksInputData { +public class TopItemsInputData { private final List tracks; private final List time; - public TopTracksInputData(List tracks, List time) { + public TopItemsInputData(List tracks, List time) { this.tracks = tracks; this.time = time; } diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java new file mode 100644 index 000000000..a81c75c40 --- /dev/null +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -0,0 +1,29 @@ +package use_case.top_items; + +import java.util.List; + +/** + * The Top Tracks Interactor. + */ +public class TopItemsInteractor implements TopItemsInputBoundary { + private TopItemsUserDataAccessInterface userDataAccessObject; + private TopItemsOutputBoundary topItemsOutputBoundary; + + public TopItemsInteractor(TopItemsUserDataAccessInterface userDataAccessObject, + TopItemsOutputBoundary topItemsOutputBoundary) { + // Which parameter is the DAO and which is the presenter? + this.userDataAccessObject = userDataAccessObject; + this.topItemsOutputBoundary = topItemsOutputBoundary; + } + + @Override + public void execute(TopItemsInputData topItemsInputData) { + final List topTracks = topItemsInputData.getTracks(); + final List time = topItemsInputData.getTime(); + userDataAccessObject.setCurrentTopTracks(topTracks); + userDataAccessObject.setCurrentTime(time); + + final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, time, false); + topItemsOutputBoundary.prepareSuccessView(outputData); + } +} diff --git a/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java b/src/main/java/use_case/top_items/TopItemsOutputBoundary.java similarity index 72% rename from src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java rename to src/main/java/use_case/top_items/TopItemsOutputBoundary.java index eab4d81f1..1f7ebee0e 100644 --- a/src/main/java/use_case/top_tracks/TopTracksOutputBoundary.java +++ b/src/main/java/use_case/top_items/TopItemsOutputBoundary.java @@ -1,15 +1,15 @@ -package use_case.top_tracks; +package use_case.top_items; /** * The output boundary for the Top Tracks Use Case. */ -public interface TopTracksOutputBoundary { +public interface TopItemsOutputBoundary { /** * Prepares the success view for the Login Use Case. * @param outputData the output data */ - void prepareSuccessView(TopTracksOutputData outputData); + void prepareSuccessView(TopItemsOutputData outputData); /** * Prepares the failure view for the Login Use Case. diff --git a/src/main/java/use_case/top_tracks/TopTracksOutputData.java b/src/main/java/use_case/top_items/TopItemsOutputData.java similarity index 70% rename from src/main/java/use_case/top_tracks/TopTracksOutputData.java rename to src/main/java/use_case/top_items/TopItemsOutputData.java index 1bb61cf0b..2fefaa052 100644 --- a/src/main/java/use_case/top_tracks/TopTracksOutputData.java +++ b/src/main/java/use_case/top_items/TopItemsOutputData.java @@ -1,14 +1,14 @@ -package use_case.top_tracks; +package use_case.top_items; import java.util.List; -public class TopTracksOutputData { +public class TopItemsOutputData { private final List tracks; private final List time; private final boolean useCaseFailed; - public TopTracksOutputData(List tracks, List time, boolean useCaseFailed) { + public TopItemsOutputData(List tracks, List time, boolean useCaseFailed) { this.tracks = tracks; this.time = time; this.useCaseFailed = useCaseFailed; diff --git a/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java b/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java similarity index 93% rename from src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java rename to src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java index ee3263391..e844c67b5 100644 --- a/src/main/java/use_case/top_tracks/TopTracksUserDataAccessInterface.java +++ b/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java @@ -1,11 +1,11 @@ -package use_case.top_tracks; +package use_case.top_items; import java.util.List; /** * DAO for the Top Tracks Use Case. */ -public interface TopTracksUserDataAccessInterface { +public interface TopItemsUserDataAccessInterface { /** * Returns the top track List of the current user of the application. diff --git a/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java b/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java deleted file mode 100644 index f383dde92..000000000 --- a/src/main/java/use_case/top_tracks/TopTracksInputBoundary.java +++ /dev/null @@ -1,13 +0,0 @@ -package use_case.top_tracks; - -/** - * Input Boundary for actions which are related to Top Tracks Charts in. - */ -public interface TopTracksInputBoundary { - - /** - * Executes the Logout use case. - * @param topTracksInputData the input data - */ - void execute(TopTracksInputData topTracksInputData); -} diff --git a/src/main/java/use_case/top_tracks/TopTracksInteractor.java b/src/main/java/use_case/top_tracks/TopTracksInteractor.java deleted file mode 100644 index 5cd2f95eb..000000000 --- a/src/main/java/use_case/top_tracks/TopTracksInteractor.java +++ /dev/null @@ -1,32 +0,0 @@ -package use_case.top_tracks; - -import use_case.logout.LogoutOutputBoundary; -import use_case.logout.LogoutUserDataAccessInterface; - -import java.util.List; - -/** - * The Top Tracks Interactor. - */ -public class TopTracksInteractor implements TopTracksInputBoundary{ - private TopTracksUserDataAccessInterface userDataAccessObject; - private TopTracksOutputBoundary topTracksOutputBoundary; - - public TopTracksInteractor(TopTracksUserDataAccessInterface userDataAccessObject, - TopTracksOutputBoundary topTracksOutputBoundary) { - // Which parameter is the DAO and which is the presenter? - this.userDataAccessObject = userDataAccessObject; - this.topTracksOutputBoundary = topTracksOutputBoundary; - } - - @Override - public void execute(TopTracksInputData topTracksInputData) { - final List topTracks = topTracksInputData.getTracks(); - final List time = topTracksInputData.getTime(); - userDataAccessObject.setCurrentTopTracks(topTracks); - userDataAccessObject.setCurrentTime(time); - - final TopTracksOutputData outputData = new TopTracksOutputData(topTracks, time, false); - topTracksOutputBoundary.prepareSuccessView(outputData); - } -} diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index cf6ff72f6..4a4f36f18 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -15,7 +15,7 @@ import interface_adapter.change_password.LoggedInState; import interface_adapter.change_password.LoggedInViewModel; import interface_adapter.logout.LogoutController; -import interface_adapter.top_tracks.TopTracksController; +import interface_adapter.top_items.TopItemsController; /** * The View for when the user is logged into the program. @@ -25,7 +25,7 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private final String viewName = "logged in"; private final LoggedInViewModel loggedInViewModel; private LogoutController logoutController; - private TopTracksController topTracksController; + private TopItemsController topItemsController; private final JLabel username; private final JButton logOut; @@ -118,7 +118,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { // final String name = topTracksController final List lst = new ArrayList<>(); lst.add("a"); - topTracksController.execute(lst, lst); + topItemsController.execute(lst, lst); } } ); @@ -156,7 +156,7 @@ public void setLogoutController(LogoutController logoutController) { this.logoutController = logoutController; } - public void setTopTracksController(TopTracksController topTracksController) { - this.topTracksController = topTracksController; + public void setTopTracksController(TopItemsController topItemsController) { + this.topItemsController = topItemsController; } } diff --git a/src/main/java/view/TopTracksAndArtistsView.java b/src/main/java/view/TopItemsView.java similarity index 87% rename from src/main/java/view/TopTracksAndArtistsView.java rename to src/main/java/view/TopItemsView.java index 9f4873496..357d9517e 100644 --- a/src/main/java/view/TopTracksAndArtistsView.java +++ b/src/main/java/view/TopItemsView.java @@ -2,7 +2,7 @@ import javax.swing.*; -import interface_adapter.top_tracks.TopTracksViewModel; +import interface_adapter.top_items.TopItemsViewModel; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; @@ -16,8 +16,8 @@ /** * The View for when the user is opens TopTracks Menu. */ -public class TopTracksAndArtistsView extends JPanel implements PropertyChangeListener { - private final TopTracksViewModel topTracksViewModel; +public class TopItemsView extends JPanel implements PropertyChangeListener { + private final TopItemsViewModel topItemsViewModel; private final String viewName = "Top Tracks"; private final String topTracks = "Top Tracks"; @@ -28,9 +28,9 @@ public class TopTracksAndArtistsView extends JPanel implements PropertyChangeLis DefaultPieDataset dataset1 = new DefaultPieDataset<>(); DefaultCategoryDataset dataset2 = new DefaultCategoryDataset(); - public TopTracksAndArtistsView(TopTracksViewModel topTracksViewModel) { - this.topTracksViewModel = topTracksViewModel; - this.topTracksViewModel.addPropertyChangeListener(this); + public TopItemsView(TopItemsViewModel topItemsViewModel) { + this.topItemsViewModel = topItemsViewModel; + this.topItemsViewModel.addPropertyChangeListener(this); welcomeLabel = new JLabel("Welcome"); welcomeLabel.setAlignmentX(Component.CENTER_ALIGNMENT); From e57b9daa6bb5ca4d4e6356faf9b5ea3889f1455b Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 18 Nov 2024 13:32:20 -0500 Subject: [PATCH 054/262] Added an ActionListener to the "search song by keyword" button --- src/main/java/view/LoggedInView.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 984a3216a..9c3d52b79 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -10,8 +10,8 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; -import interface_adapter.change_password.LoggedInState; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInState; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.logout.LogoutController; /** @@ -47,6 +47,16 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final JButton keyword = new JButton("Search song by keyword"); searchButtons.add(keyword); + // Add an ActionListener to open the Keyword window + keyword.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // Create and show the Keyword window + Keyword keywordWindow = new Keyword(); + keywordWindow.show(); + } + }); + final JButton home = new JButton("Home"); appButtons.add(home); final JButton recommendations = new JButton("Recommendations"); From b0977d9eda42933fff855501a9b8134d5ce6505a Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 18 Nov 2024 13:33:06 -0500 Subject: [PATCH 055/262] Added "show" method to Keyword --- src/main/java/view/Keyword.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/view/Keyword.java b/src/main/java/view/Keyword.java index 8b29df507..f7f38ee95 100644 --- a/src/main/java/view/Keyword.java +++ b/src/main/java/view/Keyword.java @@ -4,9 +4,9 @@ import java.awt.*; public class Keyword { - public static void main(String[] args) { - JFrame frame = new JFrame("CSC207 Project: Spotify Companion"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + public void show() { + JFrame frame = new JFrame("Search Song by Keyword"); + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(800, 500); frame.setLayout(null); From 54de34749f53a0716bb6b7354de554c7cb947c43 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 13:33:17 -0500 Subject: [PATCH 056/262] implemented SimilarListenersInputData --- .../similar_listeners/SimilarListenersInputData.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java index 9876c3b69..430e67e1c 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java @@ -1,4 +1,15 @@ package use_case.similar_listeners; public class SimilarListenersInputData { + + private final String loginToken; + + public SimilarListenersInputData(String loginToken) { + this.loginToken = loginToken; + } + + String getLoginToken() { + return loginToken; + } + } From 7fc64d0e85a81d25bbe695e316ee5898dee542c5 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 13:39:08 -0500 Subject: [PATCH 057/262] implemented SimilarListenersOutputData instance variables and constructor --- .../SimilarListenersOutputData.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java index e4571a64f..a72ed0fd6 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java @@ -1,4 +1,16 @@ package use_case.similar_listeners; +import java.util.List; + public class SimilarListenersOutputData { + + private List similarArtists; + + public SimilarListenersOutputData(List similarArtists) { + this.similarArtists = similarArtists; + } + + public List getSimilarArtists() { + return similarArtists; + } } From 264db97bba82cbddbe2ebb1c1fa70c165e22c91f Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 13:41:41 -0500 Subject: [PATCH 058/262] added execute method to SimilarListenersInputBoundary interface --- .../similar_listeners/SimilarListenersInputBoundary.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java index 6c3110115..c3f848db7 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputBoundary.java @@ -1,4 +1,10 @@ package use_case.similar_listeners; public interface SimilarListenersInputBoundary { + + /** + * Execute the similar listeners use case. + * @param similarListenersInputData the input data. + */ + void execute(SimilarListenersInputData similarListenersInputData); } From 0f5fc7708f4d3919d17ca5a5d4a6f85f34eb0823 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 13:44:21 -0500 Subject: [PATCH 059/262] added instance variable --- .../similar_listeners/SimilarListenersOutputData.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java index a72ed0fd6..6137501e9 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java @@ -4,10 +4,12 @@ public class SimilarListenersOutputData { - private List similarArtists; + private final List similarArtists; + private final boolean useCaseFailed; - public SimilarListenersOutputData(List similarArtists) { + public SimilarListenersOutputData(List similarArtists, boolean useCaseFailed) { this.similarArtists = similarArtists; + this.useCaseFailed = useCaseFailed; } public List getSimilarArtists() { From 508f121a84448c9d6068f656fe178ca17ae61f6e Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 13:46:23 -0500 Subject: [PATCH 060/262] added prepareSuccessView and prepareFailView methods --- .../SimilarListenersOutputBoundary.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java b/src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java index 9d5dd9a5d..73acfc56b 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersOutputBoundary.java @@ -1,4 +1,15 @@ package use_case.similar_listeners; public interface SimilarListenersOutputBoundary { + /** + * Prepares the success view for the Similar Listeners Use Case. + * @param similarListenersOutputData the output data + */ + void prepareSuccessView(SimilarListenersOutputData similarListenersOutputData); + + /** + * Prepares the failure view for the Similar Listeners Use Case. + * @param errorMessage the explanation of the failure + */ + void prepareFailView(String errorMessage); } From c13c28169a900582bfc8ba24016b73b83ef6befd Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 13:52:54 -0500 Subject: [PATCH 061/262] added constructor to Interactor --- .../SimilarListenersInteractor.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java index d72036986..e56885f30 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java @@ -1,4 +1,17 @@ package use_case.similar_listeners; -public class SimilarListenersInteractor { +public class SimilarListenersInteractor implements SimilarListenersInputBoundary { + private final SimilarListenersUserDataAccessInterface userDataAccessObject; + private final SimilarListenersOutputBoundary loginPresenter; + + public SimilarListenersInteractor(SimilarListenersUserDataAccessInterface userDataAccessInterface, + SimilarListenersOutputBoundary similarListenersOutputBoundary) { + this.userDataAccessObject = userDataAccessInterface; + this.loginPresenter = similarListenersOutputBoundary; + } + + @Override + public void execute(SimilarListenersInputData similarListenersInputData) { + + } } From ec05fa7551e0af470338704779cee6a7315748c3 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 13:53:16 -0500 Subject: [PATCH 062/262] created SimilarListenersUserDataAccessInterface --- .../SimilarListenersUserDataAccessInterface.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java new file mode 100644 index 000000000..0f3ecb342 --- /dev/null +++ b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java @@ -0,0 +1,4 @@ +package use_case.similar_listeners; + +public interface SimilarListenersUserDataAccessInterface { +} From 526aec21eb406d6cf44484386494366e655ddea4 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 14:01:24 -0500 Subject: [PATCH 063/262] added methods to interface --- ...milarListenersUserDataAccessInterface.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java index 0f3ecb342..b90e1f3d9 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java @@ -1,4 +1,32 @@ package use_case.similar_listeners; +import java.util.List; + +import entity.User; + +/** + * DAO for SimilarListeners use case. + */ public interface SimilarListenersUserDataAccessInterface { + + /** + * Returns the user with the given username. + * @param username the username to look up + * @return the user with the given username + */ + User get(String username); + + /** + * Returns the access token of the curren user of the application. + * @return the access Token of the current user; null indicates that no one is logged into the application. + */ + String getCurrentAccessToken(); + + /** + * Return the artists that the current user follows. + * @return list of artists that this user follows. + */ + List getFollowedArtists(); + + } From b6b74bf0bfc9bc705e4aeb52cdf65bd86ff741f4 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 18 Nov 2024 14:07:08 -0500 Subject: [PATCH 064/262] Added the parameters needed for the top artist chart and made some revisions. --- .../InMemoryUserDataAccessObject.java | 10 +++++ .../TopItemsUserDataAccessObject.java | 38 +++++++++++++++++++ .../top_items/TopItemsController.java | 9 +++-- .../top_items/TopItemsViewModel.java | 2 +- .../use_case/top_items/TopItemsInputData.java | 8 +++- .../top_items/TopItemsInteractor.java | 3 +- .../top_items/TopItemsOutputData.java | 7 +++- .../TopItemsUserDataAccessInterface.java | 18 +++++++-- src/main/java/view/LoggedInView.java | 2 +- src/main/java/view/TopItemsView.java | 8 ++-- 10 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 src/main/java/data_access/TopItemsUserDataAccessObject.java diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index e04702dd5..8205dc0b1 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -56,6 +56,16 @@ public void setCurrentTopTracks(List tracks) { } + @Override + public List getCurrentTopArtists() { + return List.of(); + } + + @Override + public void setCurrentTopArtists(List artists) { + + } + @Override public List getCurrentTime() { return List.of(); diff --git a/src/main/java/data_access/TopItemsUserDataAccessObject.java b/src/main/java/data_access/TopItemsUserDataAccessObject.java new file mode 100644 index 000000000..dbac4de50 --- /dev/null +++ b/src/main/java/data_access/TopItemsUserDataAccessObject.java @@ -0,0 +1,38 @@ +package data_access; + +import use_case.top_items.TopItemsUserDataAccessInterface; + +import java.util.List; + +public class TopItemsUserDataAccessObject implements TopItemsUserDataAccessInterface { + + @Override + public List getCurrentTopTracks() { + return List.of(); + } + + @Override + public void setCurrentTopTracks(List tracks) { + + } + + @Override + public List getCurrentTopArtists() { + return List.of(); + } + + @Override + public void setCurrentTopArtists(List artists) { + + } + + @Override + public List getCurrentTime() { + return List.of(); + } + + @Override + public void setCurrentTime(List time) { + + } +} diff --git a/src/main/java/interface_adapter/top_items/TopItemsController.java b/src/main/java/interface_adapter/top_items/TopItemsController.java index 0ab48a00f..66ddca3de 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsController.java +++ b/src/main/java/interface_adapter/top_items/TopItemsController.java @@ -17,13 +17,14 @@ public TopItemsController(TopItemsInputBoundary topItemsInputBoundary) { /** * Executes the Logout Use Case. - * @param toptracks the username of the user logging in - * @param time nfvenprne + * @param toptracks the top tracks of the user. + * @param time the timespan of the data. + * @param topartists the top artists of the user. */ - public void execute(List toptracks, List time) { + public void execute(List toptracks, List topartists, List time) { // 1. instantiate the `LogoutInputData`, which should contain the username. // 2. tell the Interactor to execute. - final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, time); + final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, topartists, time); topItemsInputBoundary.execute(topItemsInputData); } } diff --git a/src/main/java/interface_adapter/top_items/TopItemsViewModel.java b/src/main/java/interface_adapter/top_items/TopItemsViewModel.java index e77edeb91..9a9f69094 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsViewModel.java +++ b/src/main/java/interface_adapter/top_items/TopItemsViewModel.java @@ -7,7 +7,7 @@ */ public class TopItemsViewModel extends ViewModel { public TopItemsViewModel() { - super("Top Tracks"); + super("Top Items"); setState(new TopItemsState()); } } diff --git a/src/main/java/use_case/top_items/TopItemsInputData.java b/src/main/java/use_case/top_items/TopItemsInputData.java index 43ce936d2..79dceff2e 100644 --- a/src/main/java/use_case/top_items/TopItemsInputData.java +++ b/src/main/java/use_case/top_items/TopItemsInputData.java @@ -9,9 +9,11 @@ public class TopItemsInputData { private final List tracks; private final List time; + private final List artists; - public TopItemsInputData(List tracks, List time) { + public TopItemsInputData(List tracks, List artists, List time) { this.tracks = tracks; + this.artists = artists; this.time = time; } @@ -19,6 +21,10 @@ List getTracks() { return tracks; } + List getArtists() { + return artists; + } + List getTime() { return time; } diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index a81c75c40..61af71552 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -19,11 +19,12 @@ public TopItemsInteractor(TopItemsUserDataAccessInterface userDataAccessObject, @Override public void execute(TopItemsInputData topItemsInputData) { final List topTracks = topItemsInputData.getTracks(); + final List topArtists = topItemsInputData.getArtists(); final List time = topItemsInputData.getTime(); userDataAccessObject.setCurrentTopTracks(topTracks); userDataAccessObject.setCurrentTime(time); - final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, time, false); + final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, time, false); topItemsOutputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/use_case/top_items/TopItemsOutputData.java b/src/main/java/use_case/top_items/TopItemsOutputData.java index 2fefaa052..7e579e9a6 100644 --- a/src/main/java/use_case/top_items/TopItemsOutputData.java +++ b/src/main/java/use_case/top_items/TopItemsOutputData.java @@ -6,10 +6,12 @@ public class TopItemsOutputData { private final List tracks; private final List time; + private final List artists; private final boolean useCaseFailed; - public TopItemsOutputData(List tracks, List time, boolean useCaseFailed) { + public TopItemsOutputData(List tracks, List artists, List time, boolean useCaseFailed) { this.tracks = tracks; + this.artists = artists; this.time = time; this.useCaseFailed = useCaseFailed; } @@ -22,4 +24,7 @@ public List getTime() { return time; } + public List getArtists() { + return artists; + } } diff --git a/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java b/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java index e844c67b5..f9d5ad7c1 100644 --- a/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java +++ b/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java @@ -9,17 +9,29 @@ public interface TopItemsUserDataAccessInterface { /** * Returns the top track List of the current user of the application. - * @return the access Token of the current user; null indicates that no one is logged into the application. + * @return the top track List of the current user; null indicates that there are no track lists. */ List getCurrentTopTracks(); /** * Sets the top tracks list indicating who is the current user of the application. - * @param tracks the new top track list; null to indicate that no one is currently logged into the - * application. + * @param tracks the new top track list; null to indicate that there is no top tracks. */ void setCurrentTopTracks(List tracks); + /** + * Returns the top artist List of the current user of the application. + * @return the top artist List of the current user; null indicates that there are no artist lists. + */ + List getCurrentTopArtists(); + + /** + * Sets the top artist list indicating who is the current user of the application. + * @param artists the new top artist list; null to indicate that there is no top tracks. + */ + void setCurrentTopArtists(List artists); + + /** * Returns the top track List of the current user of the application. * @return the access Token of the current user; null indicates that no one is logged into the application. diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 4a4f36f18..3ad92429a 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -118,7 +118,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { // final String name = topTracksController final List lst = new ArrayList<>(); lst.add("a"); - topItemsController.execute(lst, lst); + topItemsController.execute(lst, lst, lst); } } ); diff --git a/src/main/java/view/TopItemsView.java b/src/main/java/view/TopItemsView.java index 357d9517e..6cae13a81 100644 --- a/src/main/java/view/TopItemsView.java +++ b/src/main/java/view/TopItemsView.java @@ -19,14 +19,13 @@ public class TopItemsView extends JPanel implements PropertyChangeListener { private final TopItemsViewModel topItemsViewModel; - private final String viewName = "Top Tracks"; - private final String topTracks = "Top Tracks"; + private final String viewName = "Top Items"; private final JLabel welcomeLabel; private final JButton goBack; - DefaultPieDataset dataset1 = new DefaultPieDataset<>(); - DefaultCategoryDataset dataset2 = new DefaultCategoryDataset(); + private final DefaultPieDataset dataset1 = new DefaultPieDataset<>(); + private final DefaultCategoryDataset dataset2 = new DefaultCategoryDataset(); public TopItemsView(TopItemsViewModel topItemsViewModel) { this.topItemsViewModel = topItemsViewModel; @@ -69,7 +68,6 @@ public TopItemsView(TopItemsViewModel topItemsViewModel) { this.add(welcomeLabel); this.add(chartLayoutPanel); this.add(goBack); - } public String getViewName() { From 959bba1fc24dbc80d23680f6c4c8c97dbfd202e0 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 14:09:13 -0500 Subject: [PATCH 065/262] added methods to interface --- .../use_case/similar_listeners/SimilarListenersInteractor.java | 3 +++ .../SimilarListenersUserDataAccessInterface.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java index e56885f30..2cd9372f4 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java @@ -1,5 +1,7 @@ package use_case.similar_listeners; +import java.util.List; + public class SimilarListenersInteractor implements SimilarListenersInputBoundary { private final SimilarListenersUserDataAccessInterface userDataAccessObject; private final SimilarListenersOutputBoundary loginPresenter; @@ -13,5 +15,6 @@ public SimilarListenersInteractor(SimilarListenersUserDataAccessInterface userDa @Override public void execute(SimilarListenersInputData similarListenersInputData) { + } } diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java index b90e1f3d9..9f687cac5 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java @@ -28,5 +28,7 @@ public interface SimilarListenersUserDataAccessInterface { */ List getFollowedArtists(); + void setCurrentFollowedArtists(List followedArtists); + } From 4936d348084d0421d90d177054d53539af12ee28 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 14:16:46 -0500 Subject: [PATCH 066/262] implemented SimilarListenersController --- .../SimilarListenersController.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java index 2e9daab63..f77b8267b 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java @@ -1,4 +1,24 @@ package interface_adapter.similar_listeners; +import use_case.similar_listeners.SimilarListenersInputBoundary; +import use_case.similar_listeners.SimilarListenersInputData; + public class SimilarListenersController { + private final SimilarListenersInputBoundary similarListenersInputBoundary; + + public SimilarListenersController(SimilarListenersInputBoundary similarListenersUseCaseInteractor) { + this.similarListenersInputBoundary = similarListenersUseCaseInteractor; + } + + /** + * Executes the Login Use Case. + * @param loginToken the username of the user logging in + */ + public void execute(String loginToken) { + final SimilarListenersInputData similarListenersInputData = new SimilarListenersInputData( + loginToken); + + similarListenersInputBoundary.execute(similarListenersInputData); + } } + From 409db802c3278eacc0f2b179049c1b254cec65e2 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 14:19:17 -0500 Subject: [PATCH 067/262] implemented SimilarListenersViewModel --- .../similar_listeners/SimilarListenersViewModel.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java index 4f05ed003..5d48b2846 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersViewModel.java @@ -1,4 +1,13 @@ package interface_adapter.similar_listeners; -public class SimilarListenersViewModel { +import interface_adapter.ViewModel; + +/** + * The View Model for SimilarListeners View. + */ +public class SimilarListenersViewModel extends ViewModel { + public SimilarListenersViewModel() { + super("similar listeners"); + setState(new SimilarListenersState()); + } } From b536e3d24100e0da6c889808723a0012f6ca3763 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Mon, 18 Nov 2024 14:21:43 -0500 Subject: [PATCH 068/262] Revised the memory access files. --- src/main/java/app/AppBuilder.java | 4 ++- .../InMemoryUserDataAccessObject.java | 31 +------------------ 2 files changed, 4 insertions(+), 31 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 5a95761cb..7056c78aa 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -5,6 +5,7 @@ import javax.swing.*; import data_access.InMemoryUserDataAccessObject; +import data_access.TopItemsUserDataAccessObject; import entity.CommonUserFactory; import entity.UserFactory; import interface_adapter.ViewManagerModel; @@ -52,6 +53,7 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); + private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); // Will remove since our project does not cover signing up, only logging in // private SignupView signupView; @@ -199,7 +201,7 @@ public AppBuilder addTopTracksAndArtistsUseCase() { topTracksAndArtistsViewModel); final TopItemsInputBoundary topItemsInputBoundary = - new TopItemsInteractor(userDataAccessObject, topItemsOutputBoundary); + new TopItemsInteractor(topItemsUserDataAccessObject, topItemsOutputBoundary); final TopItemsController topItemsController = new TopItemsController(topItemsInputBoundary); loggedInView.setTopTracksController(topItemsController); diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index 8205dc0b1..a96b85961 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -15,7 +15,7 @@ */ public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, - LogoutUserDataAccessInterface, TopItemsUserDataAccessInterface { + LogoutUserDataAccessInterface { private final Map users = new HashMap<>(); @@ -46,33 +46,4 @@ public String getCurrentAccessToken() { return this.currentUsername; } - @Override - public List getCurrentTopTracks() { - return List.of(); - } - - @Override - public void setCurrentTopTracks(List tracks) { - - } - - @Override - public List getCurrentTopArtists() { - return List.of(); - } - - @Override - public void setCurrentTopArtists(List artists) { - - } - - @Override - public List getCurrentTime() { - return List.of(); - } - - @Override - public void setCurrentTime(List time) { - - } } From 13014ec431897c1d4cbd664948d7cab58da75974 Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 18 Nov 2024 14:26:49 -0500 Subject: [PATCH 069/262] Corrected typos and created infrastructure for integrating with Azure OpenAI --- .gitignore | 2 +- .../LanguageModelDataAcessObject.java | 83 +++++++++++++++++++ .../login/LoginUserDataAccessInterface.java | 4 +- ...mmendLanguageModelDataAccessInterface.java | 13 +++ .../RecommendUserDataAccessInterface.java | 4 + .../RecommendUserDataAcessInterface.java | 4 - ...earchLanguageModelDataAccessInterface.java | 13 +++ 7 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/main/java/data_access/LanguageModelDataAcessObject.java create mode 100644 src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java create mode 100644 src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java delete mode 100644 src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java create mode 100644 src/main/java/use_case/search/SearchLanguageModelDataAccessInterface.java diff --git a/.gitignore b/.gitignore index 1c6964240..eac2451b8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ out/ .idea/easycode.ignore .idea/ homework-5.iml -keys.txt +keys target/ diff --git a/src/main/java/data_access/LanguageModelDataAcessObject.java b/src/main/java/data_access/LanguageModelDataAcessObject.java new file mode 100644 index 000000000..ae71d33d6 --- /dev/null +++ b/src/main/java/data_access/LanguageModelDataAcessObject.java @@ -0,0 +1,83 @@ +package data_access; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.azure.ai.openai.OpenAIClient; +import com.azure.ai.openai.OpenAIClientBuilder; +import com.azure.ai.openai.models.ChatCompletions; +import com.azure.ai.openai.models.ChatCompletionsOptions; +import com.azure.ai.openai.models.ChatRequestAssistantMessage; +import com.azure.ai.openai.models.ChatRequestMessage; +import com.azure.ai.openai.models.ChatRequestSystemMessage; +import com.azure.ai.openai.models.ChatRequestUserMessage; +import com.azure.core.credential.AzureKeyCredential; +import use_case.recommend.RecommendLanguageModelDataAccessInterface; +import use_case.search.SearchLanguageModelDataAccessInterface; + +/** + * Data access object to connect to Azure openAI. + */ +public class LanguageModelDataAcessObject implements RecommendLanguageModelDataAccessInterface, + SearchLanguageModelDataAccessInterface { + + private String endpoint = "https://spotifycompanion.openai.azure.com/"; + private String accessToken; + + public LanguageModelDataAcessObject() { + accessToken = getKey(); + } + + /** + * This is a helper method to get the Azure API key. + * @return the access token stored in the local keys.txt file + */ + private String getKey() { + final File file; + file = new File("src/keys"); + file.length(); + String key = "not found"; + try { + final BufferedReader br = new BufferedReader(new FileReader(file)); + key = br.readLine(); + + br.close(); + } + catch (FileNotFoundException ex) { + System.out.println("The file does not exist"); + } + catch (IOException ex) { + System.out.println("Error reading file"); + } + return key; + } + + @Override + public String query(String prompt) { + final OpenAIClient client = new OpenAIClientBuilder() + .credential(new AzureKeyCredential(accessToken)) + .endpoint(endpoint) + .buildClient(); + final List chatMessages = new ArrayList<>(); + chatMessages.add(new ChatRequestSystemMessage("You are a Spotify analyst, you will either send back a " + + "list of songs based on a description or a list of songs which are similar to a provided list.")); + chatMessages.add(new ChatRequestUserMessage("Can you help me find songs similar to Driver's License")); + chatMessages.add(new ChatRequestAssistantMessage(" Similar songs include Femininomenon by Chappell Roan" + + ", Birds of A Feather by Billie Eilish and Part of Me by Noah Kahan")); + chatMessages.add(new ChatRequestUserMessage("Is there a song about a house in the south of" + + " the US and includes something about the sun?")); + chatMessages.add(new ChatRequestUserMessage("House of the Rising Sun by The Animals")); + chatMessages.add(new ChatRequestUserMessage(prompt)); + + final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", + new ChatCompletionsOptions(chatMessages)); + + return chatCompletions.getChoices().getLast().getMessage().getContent(); + + } +} diff --git a/src/main/java/use_case/login/LoginUserDataAccessInterface.java b/src/main/java/use_case/login/LoginUserDataAccessInterface.java index 831997d57..861619656 100644 --- a/src/main/java/use_case/login/LoginUserDataAccessInterface.java +++ b/src/main/java/use_case/login/LoginUserDataAccessInterface.java @@ -34,8 +34,8 @@ public interface LoginUserDataAccessInterface { String getCurrentAccessToken(); /** - * Sets the username indicating who is the current user of the application. - * @param accessToken the new current username; null to indicate that no one is currently logged into the + * Sets the access token indicating who is the current user of the application. + * @param accessToken the new current access token; null to indicate that no one is currently logged into the * application. */ void setCurrentAccessToken(String accessToken); diff --git a/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java new file mode 100644 index 000000000..ea56994e8 --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java @@ -0,0 +1,13 @@ +package use_case.recommend; + +/** +* The recommend DAO for accessing the Azure OpenAI api. + */ +public interface RecommendLanguageModelDataAccessInterface { + /** + * Sends a query to the LLM at the API endpoint. + * @param prompt is a string which the model will respond to + * @return the model's response to that prompt + */ + String query(String prompt); +} diff --git a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java new file mode 100644 index 000000000..1ca95cb3c --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java @@ -0,0 +1,4 @@ +package use_case.recommend; + +public interface RecommendUserDataAccessInterface { +} diff --git a/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java deleted file mode 100644 index f775e314f..000000000 --- a/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.recommend; - -public interface RecommendUserDataAcessInterface { -} diff --git a/src/main/java/use_case/search/SearchLanguageModelDataAccessInterface.java b/src/main/java/use_case/search/SearchLanguageModelDataAccessInterface.java new file mode 100644 index 000000000..87bee79f9 --- /dev/null +++ b/src/main/java/use_case/search/SearchLanguageModelDataAccessInterface.java @@ -0,0 +1,13 @@ +package use_case.search; + +/** + * The search DAO for accessing the Azure OpenAI api. + */ +public interface SearchLanguageModelDataAccessInterface { + /** + * Sends a query to the LLM at the API endpoint. + * @param prompt is a string which the model will respond to + * @return the model's response to that prompt + */ + String query(String prompt); +} From ef399fe326e152350d00a501ea67a6d780dac210 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 14:26:54 -0500 Subject: [PATCH 070/262] implemented SimilarListenersPresenter constructor --- .../SimilarListenersPresenter.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index 748c65392..9d2d0a117 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -1,6 +1,30 @@ package interface_adapter.similar_listeners; +import interface_adapter.ViewManagerModel; import use_case.similar_listeners.SimilarListenersOutputBoundary; +import use_case.similar_listeners.SimilarListenersOutputData; public class SimilarListenersPresenter implements SimilarListenersOutputBoundary { + private final SimilarListenersViewModel similarListenersViewModel; + private final ViewManagerModel viewManagerModel; + + public SimilarListenersPresenter(SimilarListenersViewModel similarListenersViewModel, + ViewManagerModel viewManagerModel) { + this.similarListenersViewModel = similarListenersViewModel; + this.viewManagerModel = viewManagerModel; + + } + + @Override + public void prepareSuccessView(SimilarListenersOutputData similarListenersOutputData) { + + this.viewManagerModel.setState(similarListenersViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); + + } + + @Override + public void prepareFailView(String errorMessage) { + + } } From aa160e492b8f01f4ded3d41d958eb70db1daad89 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Mon, 18 Nov 2024 14:33:40 -0500 Subject: [PATCH 071/262] started implementing user story files --- .../InMemoryUserDataAccessObject.java | 9 +++++ .../recommend/RecommendController.java | 22 ++++++++++++ .../recommend/RecommendPresenter.java | 36 +++++++++++++++++++ .../recommend/RecommendState.java | 12 +++++++ .../recommend/RecommendViewModel.java | 11 +++++- .../recommend/RecommendInputBoundary.java | 9 +++++ .../recommend/RecommendInputData.java | 13 +++++++ .../recommend/RecommendInteractor.java | 28 +++++++-------- 8 files changed, 125 insertions(+), 15 deletions(-) diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index ac285829c..913081856 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -14,6 +14,15 @@ public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, LogoutUserDataAccessInterface { + @Override + public String getCurrentAccessToken() { + return ""; + } + + @Override + public void setCurrentAccessToken(String accessToken) { + + } private final Map users = new HashMap<>(); diff --git a/src/main/java/interface_adapter/recommend/RecommendController.java b/src/main/java/interface_adapter/recommend/RecommendController.java index 37c2c2d0d..e582fdf64 100644 --- a/src/main/java/interface_adapter/recommend/RecommendController.java +++ b/src/main/java/interface_adapter/recommend/RecommendController.java @@ -1,4 +1,26 @@ package interface_adapter.recommend; +import use_case.recommend.RecommendInputBoundary; +import use_case.recommend.RecommendInputData; + +/** + * The controller for the Recommend Use Case. + */ public class RecommendController { + private final RecommendInputBoundary recommendUseCaseInteractor; + + public RecommendController(RecommendInputBoundary recommendUseCaseInteractor) { + this.recommendUseCaseInteractor = recommendUseCaseInteractor; + } + + /** + * Executes the Recommend Use Case. + * @param accessToken the username of the user logging in + */ + public void execute(String accessToken) { + final RecommendInputData recommendInputData = new RecommendInputData( + accessToken); + + recommendUseCaseInteractor.execute(recommendInputData); + } } diff --git a/src/main/java/interface_adapter/recommend/RecommendPresenter.java b/src/main/java/interface_adapter/recommend/RecommendPresenter.java index 716e75bf1..873783175 100644 --- a/src/main/java/interface_adapter/recommend/RecommendPresenter.java +++ b/src/main/java/interface_adapter/recommend/RecommendPresenter.java @@ -1,6 +1,42 @@ package interface_adapter.recommend; +import interface_adapter.ViewManagerModel; +import interface_adapter.change_password.LoggedInState; +import interface_adapter.change_password.LoggedInViewModel; import use_case.recommend.RecommendOutputBoundary; +import use_case.recommend.RecommendOutputData; +/** + * The Presenter for the Recommend Use Case. + */ public class RecommendPresenter implements RecommendOutputBoundary { + private final RecommendViewModel recommendViewModel; + private final LoggedInViewModel loggedInViewModel; + private final ViewManagerModel viewManagerModel; + + public RecommendPresenter(ViewManagerModel viewManagerModel, + LoggedInViewModel loggedInViewModel, + RecommendViewModel recommendViewModel) { + this.viewManagerModel = viewManagerModel; + this.loggedInViewModel = loggedInViewModel; + this.recommendViewModel = recommendViewModel; + } + + @Override + public void prepareSuccessView(RecommendOutputData response) { + // On success, switch to the logged in (i.e. the home) view. + + final LoggedInState loggedInState = loggedInViewModel.getState(); + loggedInState.setUsername(response.getUsername()); + this.loggedInViewModel.setState(loggedInState); + this.loggedInViewModel.firePropertyChanged(); + + this.viewManagerModel.setState(loggedInViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); + } + + @Override + public void prepareFailView() { + recommendViewModel.firePropertyChanged(); + } } diff --git a/src/main/java/interface_adapter/recommend/RecommendState.java b/src/main/java/interface_adapter/recommend/RecommendState.java index fa5746e5c..9b6a3ab47 100644 --- a/src/main/java/interface_adapter/recommend/RecommendState.java +++ b/src/main/java/interface_adapter/recommend/RecommendState.java @@ -1,4 +1,16 @@ package interface_adapter.recommend; +/** + * The state for the Recommendation View Model. + */ public class RecommendState { + private String accessToken = ""; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } } diff --git a/src/main/java/interface_adapter/recommend/RecommendViewModel.java b/src/main/java/interface_adapter/recommend/RecommendViewModel.java index d704dbe34..5b0907bce 100644 --- a/src/main/java/interface_adapter/recommend/RecommendViewModel.java +++ b/src/main/java/interface_adapter/recommend/RecommendViewModel.java @@ -1,4 +1,13 @@ package interface_adapter.recommend; -public class RecommendViewModel { +import interface_adapter.ViewModel; + +/** + * The View Model for the Recommendations View. + */ +public class RecommendViewModel extends ViewModel { + public RecommendViewModel() { + super("recommendations"); + setState(new RecommendState()); + } } diff --git a/src/main/java/use_case/recommend/RecommendInputBoundary.java b/src/main/java/use_case/recommend/RecommendInputBoundary.java index 553e3b04b..410aa34b2 100644 --- a/src/main/java/use_case/recommend/RecommendInputBoundary.java +++ b/src/main/java/use_case/recommend/RecommendInputBoundary.java @@ -1,4 +1,13 @@ package use_case.recommend; +/** + * Input Boundary for actions which are related to recommendations. + */ public interface RecommendInputBoundary { + + /** + * Executes the login use case. + * @param recommendInputData the input data + */ + void execute(RecommendInputData recommendInputData); } diff --git a/src/main/java/use_case/recommend/RecommendInputData.java b/src/main/java/use_case/recommend/RecommendInputData.java index b0a19d336..80bd56116 100644 --- a/src/main/java/use_case/recommend/RecommendInputData.java +++ b/src/main/java/use_case/recommend/RecommendInputData.java @@ -1,4 +1,17 @@ package use_case.recommend; +/** + * The Input Data for the Recommend Use Case. + */ public class RecommendInputData { + + private final String accessToken; + + public RecommendInputData(String accessToken) { + this.accessToken = accessToken; + } + + String getAccessToken() { + return accessToken; + } } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index c98d0f623..2d4dc04ec 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -15,18 +15,18 @@ public RecommendInteractor(RecommendUserDataAcessInterface recommendDataAccessIn this.recommendPresenter = recommendOutputBoundary; } -// @Override -// public void execute(RecommendInputData recommendInputData) { -// final String username = recommendInputData.getLoginToken(); -// if (!recommendDataAccessObject.existsByName(username)) { -// recommendPresenter.prepareFailView(username + ": Account does not exist."); -// } -// else { -// final String accessToken = recommendDataAccessObject.get(username).getName(); -// final User user = userDataAccessObject.get(loginInputData.getLoginToken()); -// userDataAccessObject.setCurrentUsername(user.getName()); -// final LoginOutputData loginOutputData = new LoginOutputData(user.getName(), false); -// loginPresenter.prepareSuccessView(loginOutputData); -// } -// } + @Override + public void execute(RecommendInputData recommendInputData) { + final String accessToken = recommendInputData.getAccessToken(); + if (!recommendDataAccessObject.existsByName(username)) { + recommendPresenter.prepareFailView(username + ": Account does not exist."); + } + else { + final String accessToken = recommendDataAccessObject.get(username).getName(); + final User user = userDataAccessObject.get(loginInputData.getLoginToken()); + userDataAccessObject.setCurrentUsername(user.getName()); + final LoginOutputData loginOutputData = new LoginOutputData(user.getName(), false); + loginPresenter.prepareSuccessView(loginOutputData); + } + } } From e937e93fbf92001d43745a66c6b12a8841a67e10 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 14:39:34 -0500 Subject: [PATCH 072/262] implemented SimilarListenersState with needed methods --- .../SimilarListenersState.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java index a19b87cc1..614eca67d 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java @@ -1,4 +1,37 @@ package interface_adapter.similar_listeners; +import interface_adapter.logged_in.LoggedInState; + +import java.util.List; + public class SimilarListenersState { + private List similarArtists; + private String similarArtistsError; + + public SimilarListenersState(SimilarListenersState copy) { + similarArtists = copy.similarArtists; + similarArtistsError = copy.similarArtistsError; + } + + // Because of the previous copy constructor, the default constructor must be explicit. + public SimilarListenersState() { + + } + + public List getSimilarArtists() { + return similarArtists; + } + + public void setSimilarArtists(List similarArtists) { + this.similarArtists = similarArtists; + } + + public String getSimilarArtistsError() { + return similarArtistsError; + } + + void setSimilarArtistsError(String similarArtistsError) { + this.similarArtistsError = similarArtistsError; + } + } From 54339790685544b99d5f7ddc6c33426949be331f Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 18 Nov 2024 14:39:52 -0500 Subject: [PATCH 073/262] updated prepareSuccessView method --- .../similar_listeners/SimilarListenersPresenter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index 9d2d0a117..b0b16af57 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -17,6 +17,10 @@ public SimilarListenersPresenter(SimilarListenersViewModel similarListenersViewM @Override public void prepareSuccessView(SimilarListenersOutputData similarListenersOutputData) { + final SimilarListenersState similarListenersState = similarListenersViewModel.getState(); + similarListenersState.setSimilarArtists(similarListenersOutputData.getSimilarArtists()); + this.similarListenersViewModel.setState(similarListenersState); + similarListenersViewModel.firePropertyChanged(); this.viewManagerModel.setState(similarListenersViewModel.getViewName()); this.viewManagerModel.firePropertyChanged(); From f4f03cf09730ce4a9d1c46f3360be7e0d684f8eb Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 18 Nov 2024 14:43:43 -0500 Subject: [PATCH 074/262] fixed error when getting last item from chat response --- ...cessObject.java => LanguageModelDataAccessObject.java} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename src/main/java/data_access/{LanguageModelDataAcessObject.java => LanguageModelDataAccessObject.java} (92%) diff --git a/src/main/java/data_access/LanguageModelDataAcessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java similarity index 92% rename from src/main/java/data_access/LanguageModelDataAcessObject.java rename to src/main/java/data_access/LanguageModelDataAccessObject.java index ae71d33d6..03bc916c8 100644 --- a/src/main/java/data_access/LanguageModelDataAcessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -23,13 +23,13 @@ /** * Data access object to connect to Azure openAI. */ -public class LanguageModelDataAcessObject implements RecommendLanguageModelDataAccessInterface, +public class LanguageModelDataAccessObject implements RecommendLanguageModelDataAccessInterface, SearchLanguageModelDataAccessInterface { private String endpoint = "https://spotifycompanion.openai.azure.com/"; private String accessToken; - public LanguageModelDataAcessObject() { + public LanguageModelDataAccessObject() { accessToken = getKey(); } @@ -76,8 +76,8 @@ public String query(String prompt) { final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", new ChatCompletionsOptions(chatMessages)); - - return chatCompletions.getChoices().getLast().getMessage().getContent(); + final int back = chatCompletions.getChoices().size() - 1; + return chatCompletions.getChoices().get(back).getMessage().getContent(); } } From 5fd85b67a3c91c8082da62eb40ec867e86ff8df7 Mon Sep 17 00:00:00 2001 From: quinn Date: Mon, 18 Nov 2024 14:44:30 -0500 Subject: [PATCH 075/262] fixed error when getting last item from chat response --- src/main/java/data_access/LanguageModelDataAccessObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index 03bc916c8..24c5d833a 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -71,7 +71,7 @@ public String query(String prompt) { + ", Birds of A Feather by Billie Eilish and Part of Me by Noah Kahan")); chatMessages.add(new ChatRequestUserMessage("Is there a song about a house in the south of" + " the US and includes something about the sun?")); - chatMessages.add(new ChatRequestUserMessage("House of the Rising Sun by The Animals")); + chatMessages.add(new ChatRequestUserMessage("House of the Rising Sun by The Animals.")); chatMessages.add(new ChatRequestUserMessage(prompt)); final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", From dc9f7bc5541a567683a041b938a3adbc74347db5 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Mon, 18 Nov 2024 16:23:45 -0500 Subject: [PATCH 076/262] Update all user story files, can now work on API --- .gitignore | 2 +- src/main/java/app/AppBuilder.java | 37 ++++++------------- .../recommend/RecommendController.java | 8 ++-- .../recommend/RecommendPresenter.java | 23 +++++------- .../recommend/RecommendState.java | 27 +++++++++++--- .../recommend/RecommendInputData.java | 12 +++--- .../recommend/RecommendInteractor.java | 22 ++++------- .../recommend/RecommendOutputBoundary.java | 14 +++++++ .../recommend/RecommendOutputData.java | 16 ++++++++ .../RecommendUserDataAcessInterface.java | 16 ++++++++ 10 files changed, 109 insertions(+), 68 deletions(-) diff --git a/.gitignore b/.gitignore index 1c6964240..eac2451b8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ out/ .idea/easycode.ignore .idea/ homework-5.iml -keys.txt +keys target/ diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 62d27a0ff..13ce2ba69 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -87,21 +87,6 @@ public AppBuilder addLoggedInView() { return this; } - /** - * Adds the Signup Use Case to the application. - * @return this builder - */ -// public AppBuilder addSignupUseCase() { -// final SignupOutputBoundary signupOutputBoundary = new SignupPresenter(viewManagerModel, -// signupViewModel, loginViewModel); -// final SignupInputBoundary userSignupInteractor = new SignupInteractor( -// userDataAccessObject, signupOutputBoundary, userFactory); -// -// final SignupController controller = new SignupController(userSignupInteractor); -// signupView.setSignupController(controller); -// return this; -// } - /** * Adds the Login Use Case to the application. * @return this builder @@ -121,17 +106,17 @@ public AppBuilder addLoginUseCase() { * Adds the Recommend Use Case to the application. * @return this builder */ -// public AppBuilder addRecommendUseCase() { -// final RecommendOutputBoundary recommendOutputBoundary = -// new RecommendPresenter(loggedInViewModel); -// -// final RecommendInputBoundary recommendInteractor = -// new RecommendInteractor(userDataAccessObject, recommendOutputBoundary, userFactory); -// -// final RecommendController recommendController = new RecommendController(recommendInteractor); -// recommendationsView.setRecommendController(recommendController); -// return this; -// } + public AppBuilder addRecommendUseCase() { + final RecommendOutputBoundary recommendOutputBoundary = + new RecommendPresenter(viewManagerModel, recommendViewModel); + + final RecommendInputBoundary recommendInteractor = + new RecommendInteractor(recommendDataAccessInterface, recommendOutputBoundary); + + final RecommendController recommendController = new RecommendController(recommendInteractor); + recommendationsView.setRecommendController(recommendController); + return this; + } /** * Adds the Logout Use Case to the application. diff --git a/src/main/java/interface_adapter/recommend/RecommendController.java b/src/main/java/interface_adapter/recommend/RecommendController.java index e582fdf64..4c6f8d7aa 100644 --- a/src/main/java/interface_adapter/recommend/RecommendController.java +++ b/src/main/java/interface_adapter/recommend/RecommendController.java @@ -1,5 +1,7 @@ package interface_adapter.recommend; +import java.util.Map; + import use_case.recommend.RecommendInputBoundary; import use_case.recommend.RecommendInputData; @@ -15,11 +17,11 @@ public RecommendController(RecommendInputBoundary recommendUseCaseInteractor) { /** * Executes the Recommend Use Case. - * @param accessToken the username of the user logging in + * @param songRecommendations the map of song recommendations in the form of song, artist */ - public void execute(String accessToken) { + public void execute(Map songRecommendations) { final RecommendInputData recommendInputData = new RecommendInputData( - accessToken); + songRecommendations); recommendUseCaseInteractor.execute(recommendInputData); } diff --git a/src/main/java/interface_adapter/recommend/RecommendPresenter.java b/src/main/java/interface_adapter/recommend/RecommendPresenter.java index 873783175..45fc76395 100644 --- a/src/main/java/interface_adapter/recommend/RecommendPresenter.java +++ b/src/main/java/interface_adapter/recommend/RecommendPresenter.java @@ -1,8 +1,6 @@ package interface_adapter.recommend; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInState; -import interface_adapter.change_password.LoggedInViewModel; import use_case.recommend.RecommendOutputBoundary; import use_case.recommend.RecommendOutputData; @@ -11,32 +9,29 @@ */ public class RecommendPresenter implements RecommendOutputBoundary { private final RecommendViewModel recommendViewModel; - private final LoggedInViewModel loggedInViewModel; private final ViewManagerModel viewManagerModel; public RecommendPresenter(ViewManagerModel viewManagerModel, - LoggedInViewModel loggedInViewModel, RecommendViewModel recommendViewModel) { this.viewManagerModel = viewManagerModel; - this.loggedInViewModel = loggedInViewModel; this.recommendViewModel = recommendViewModel; } @Override - public void prepareSuccessView(RecommendOutputData response) { - // On success, switch to the logged in (i.e. the home) view. + public void prepareSuccessView(RecommendOutputData output) { + final RecommendState recommendState = recommendViewModel.getState(); + recommendState.setSongRecommendations(output.getSongRecommendations()); + this.recommendViewModel.setState(recommendState); + this.recommendViewModel.firePropertyChanged(); - final LoggedInState loggedInState = loggedInViewModel.getState(); - loggedInState.setUsername(response.getUsername()); - this.loggedInViewModel.setState(loggedInState); - this.loggedInViewModel.firePropertyChanged(); - - this.viewManagerModel.setState(loggedInViewModel.getViewName()); + this.viewManagerModel.setState(recommendViewModel.getViewName()); this.viewManagerModel.firePropertyChanged(); } @Override - public void prepareFailView() { + public void prepareFailView(String errorMessage) { + final RecommendState recommendState = recommendViewModel.getState(); + recommendState.setRecommendationError(errorMessage); recommendViewModel.firePropertyChanged(); } } diff --git a/src/main/java/interface_adapter/recommend/RecommendState.java b/src/main/java/interface_adapter/recommend/RecommendState.java index 9b6a3ab47..6775740bd 100644 --- a/src/main/java/interface_adapter/recommend/RecommendState.java +++ b/src/main/java/interface_adapter/recommend/RecommendState.java @@ -1,16 +1,33 @@ package interface_adapter.recommend; +import java.util.HashMap; +import java.util.Map; + /** * The state for the Recommendation View Model. */ public class RecommendState { - private String accessToken = ""; + private Map songRecommendations = new HashMap(); + private String recommendationError; + + public RecommendState(RecommendState recommendState) { + songRecommendations = recommendState.songRecommendations; + recommendationError = recommendState.recommendationError; + } + + public Map getSongRecommendations() { + return songRecommendations; + } + + public String getRecommendationError() { + return recommendationError; + } - public String getAccessToken() { - return accessToken; + public void setSongRecommendations(Map songRecommendations) { + this.songRecommendations = songRecommendations; } - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; + public void setRecommendationError(String recommendationError) { + this.recommendationError = recommendationError; } } diff --git a/src/main/java/use_case/recommend/RecommendInputData.java b/src/main/java/use_case/recommend/RecommendInputData.java index 80bd56116..5d0943a60 100644 --- a/src/main/java/use_case/recommend/RecommendInputData.java +++ b/src/main/java/use_case/recommend/RecommendInputData.java @@ -1,17 +1,19 @@ package use_case.recommend; +import java.util.Map; + /** * The Input Data for the Recommend Use Case. */ public class RecommendInputData { - private final String accessToken; + private final Map songRecommendations; - public RecommendInputData(String accessToken) { - this.accessToken = accessToken; + public RecommendInputData(Map songRecommendations) { + this.songRecommendations = songRecommendations; } - String getAccessToken() { - return accessToken; + public Map getRecommendations() { + return songRecommendations; } } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index 2d4dc04ec..4ea5926d7 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -1,32 +1,26 @@ package use_case.recommend; -import entity.User; +import java.util.Map; /** * The Recommendations Interactor. */ public class RecommendInteractor implements RecommendInputBoundary { private final RecommendUserDataAcessInterface recommendDataAccessObject; - private final RecommendOutputBoundary recommendPresenter; + private final RecommendOutputBoundary recommendationOutputBoundary; public RecommendInteractor(RecommendUserDataAcessInterface recommendDataAccessInterface, RecommendOutputBoundary recommendOutputBoundary) { this.recommendDataAccessObject = recommendDataAccessInterface; - this.recommendPresenter = recommendOutputBoundary; + this.recommendationOutputBoundary = recommendOutputBoundary; } @Override public void execute(RecommendInputData recommendInputData) { - final String accessToken = recommendInputData.getAccessToken(); - if (!recommendDataAccessObject.existsByName(username)) { - recommendPresenter.prepareFailView(username + ": Account does not exist."); - } - else { - final String accessToken = recommendDataAccessObject.get(username).getName(); - final User user = userDataAccessObject.get(loginInputData.getLoginToken()); - userDataAccessObject.setCurrentUsername(user.getName()); - final LoginOutputData loginOutputData = new LoginOutputData(user.getName(), false); - loginPresenter.prepareSuccessView(loginOutputData); - } + final Map songRecommendations = recommendInputData.getRecommendations(); + recommendDataAccessObject.setSongRecommendations(songRecommendations); + + final RecommendOutputData outputData = new RecommendOutputData(songRecommendations, false); + recommendationOutputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/use_case/recommend/RecommendOutputBoundary.java b/src/main/java/use_case/recommend/RecommendOutputBoundary.java index 85c310ab4..a918243e6 100644 --- a/src/main/java/use_case/recommend/RecommendOutputBoundary.java +++ b/src/main/java/use_case/recommend/RecommendOutputBoundary.java @@ -1,4 +1,18 @@ package use_case.recommend; +/** + * The output boundary for the Recommend Use Case. + */ public interface RecommendOutputBoundary { + /** + * Prepares the success view for the Login Use Case. + * @param outputData the output data + */ + void prepareSuccessView(RecommendOutputData outputData); + + /** + * Prepares the failure view for the Login Use Case. + * @param errorMessage the explanation of the failure + */ + void prepareFailView(String errorMessage); } diff --git a/src/main/java/use_case/recommend/RecommendOutputData.java b/src/main/java/use_case/recommend/RecommendOutputData.java index ca1ffdaca..8fd08afb9 100644 --- a/src/main/java/use_case/recommend/RecommendOutputData.java +++ b/src/main/java/use_case/recommend/RecommendOutputData.java @@ -1,4 +1,20 @@ package use_case.recommend; +import java.util.Map; + +/** + * The output data for the Recommend Use Case. + */ public class RecommendOutputData { + private final Map songRecommendations; + private final boolean useCaseFailed; + + public RecommendOutputData(Map songRecommendations, boolean useCaseFailed) { + this.songRecommendations = songRecommendations; + this.useCaseFailed = useCaseFailed; + } + + public Map getSongRecommendations() { + return songRecommendations; + } } diff --git a/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java index f775e314f..cbd5c38ef 100644 --- a/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java +++ b/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java @@ -1,4 +1,20 @@ package use_case.recommend; +import java.util.Map; + +/** + * DAO for the Recommendations Use Case. + */ public interface RecommendUserDataAcessInterface { + /** + * Returns the song recommendation Map of the current user of the application. + * @return the recommendations Map of the current user; null indicates that there are no recommendation Maps + */ + Map getSongRecommendations(); + + /** + * Sets the song recommendations map. + * @param songRecommendations the new song recommendation Map; null to indicate that there is no recommendations. + */ + void setSongRecommendations(Map songRecommendations); } From 1071208516d10719c405a0e4ee64306fdf579707 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 20 Nov 2024 13:39:13 -0500 Subject: [PATCH 077/262] Updated the mention of username into accesstoken. --- src/main/java/use_case/login/LoginOutputData.java | 8 ++++---- src/main/java/view/LoginView.java | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/use_case/login/LoginOutputData.java b/src/main/java/use_case/login/LoginOutputData.java index 3ea119a8f..02b46b8f6 100644 --- a/src/main/java/use_case/login/LoginOutputData.java +++ b/src/main/java/use_case/login/LoginOutputData.java @@ -5,16 +5,16 @@ */ public class LoginOutputData { - private final String username; + private final String accessToken; private final boolean useCaseFailed; - public LoginOutputData(String username, boolean useCaseFailed) { - this.username = username; + public LoginOutputData(String accessToken, boolean useCaseFailed) { + this.accessToken = accessToken; this.useCaseFailed = useCaseFailed; } public String getUsername() { - return username; + return accessToken; } } diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index 5f2f3e540..9ea97e602 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -23,7 +23,7 @@ public class LoginView extends JPanel implements ActionListener, PropertyChangeL private final LoginViewModel loginViewModel; private final JTextField loginTokenInputField = new JTextField(15); - private final JLabel usernameErrorField = new JLabel(); + private final JLabel accessTokenErrorField = new JLabel(); private ImageIcon spotifyIcon = new ImageIcon("images/spotify2.png"); @@ -35,7 +35,7 @@ public LoginView(LoginViewModel loginViewModel) { this.loginViewModel = loginViewModel; this.loginViewModel.addPropertyChangeListener(this); - final LabelTextPanel usernameInfo = new LabelTextPanel( + final LabelTextPanel AccessTokenInfo = new LabelTextPanel( new JLabel("Access Token"), loginTokenInputField); final JPanel buttons = new JPanel(); @@ -89,8 +89,8 @@ public void changedUpdate(DocumentEvent e) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.add(spotifylabel); - this.add(usernameInfo); - this.add(usernameErrorField); + this.add(AccessTokenInfo); + this.add(accessTokenErrorField); this.add(buttons); } @@ -106,7 +106,7 @@ public void actionPerformed(ActionEvent evt) { public void propertyChange(PropertyChangeEvent evt) { final LoginState state = (LoginState) evt.getNewValue(); setFields(state); - usernameErrorField.setText(state.getLoginError()); + accessTokenErrorField.setText(state.getLoginError()); } private void setFields(LoginState state) { From 2b381b68868b6ef53d290f7430d301c69fc2bfc8 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 20 Nov 2024 15:44:08 -0500 Subject: [PATCH 078/262] Updated the mention of username into accesstoken. --- src/main/java/interface_adapter/login/LoginState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/interface_adapter/login/LoginState.java b/src/main/java/interface_adapter/login/LoginState.java index 272105d3e..16e1d802c 100644 --- a/src/main/java/interface_adapter/login/LoginState.java +++ b/src/main/java/interface_adapter/login/LoginState.java @@ -19,7 +19,7 @@ public void setLoginToken(String loginToken) { this.loginToken = loginToken; } - public void setLoginError(String usernameError) { - this.loginError = usernameError; + public void setLoginError(String accessTokenError) { + this.loginError = accessTokenError; } } From 90684f02898a0b30ad47278799a1f3590009f38f Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 10:39:11 -0500 Subject: [PATCH 079/262] updated prepareFailView method --- .../similar_listeners/SimilarListenersPresenter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index b0b16af57..fced9df49 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -29,6 +29,9 @@ public void prepareSuccessView(SimilarListenersOutputData similarListenersOutput @Override public void prepareFailView(String errorMessage) { + final SimilarListenersState similarListenersState = similarListenersViewModel.getState(); + similarListenersState.setSimilarArtistsError(errorMessage); + similarListenersViewModel.firePropertyChanged(); } } From 6e793d5533df4770969c9ed909c60cad09f837f0 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 10:39:27 -0500 Subject: [PATCH 080/262] updated SimilarListenersState import statements --- .../similar_listeners/SimilarListenersState.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java index 614eca67d..03e02f3be 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java @@ -1,7 +1,5 @@ package interface_adapter.similar_listeners; -import interface_adapter.logged_in.LoggedInState; - import java.util.List; public class SimilarListenersState { From e2f2fdee128ad4d1d1c38a2f7b9cf42ddb3a9916 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 10:40:11 -0500 Subject: [PATCH 081/262] added javadoc --- .../similar_listeners/SimilarListenersPresenter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index fced9df49..4e01702f0 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -4,6 +4,9 @@ import use_case.similar_listeners.SimilarListenersOutputBoundary; import use_case.similar_listeners.SimilarListenersOutputData; +/** + * The Presenter for Similar Listeners use case. + */ public class SimilarListenersPresenter implements SimilarListenersOutputBoundary { private final SimilarListenersViewModel similarListenersViewModel; private final ViewManagerModel viewManagerModel; From d060ba5816a699052cbd1b206be73cac9cf42447 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 10:41:07 -0500 Subject: [PATCH 082/262] added javadoc --- .../similar_listeners/SimilarListenersState.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java index 03e02f3be..75b497e22 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java @@ -2,6 +2,9 @@ import java.util.List; +/** + * The state for Similar Listeners View Model. + */ public class SimilarListenersState { private List similarArtists; private String similarArtistsError; From 0bcc43b37ebbd0b81fab38de3a90cc7fa3e386ea Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 10:42:02 -0500 Subject: [PATCH 083/262] added javadoc --- .../similar_listeners/SimilarListenersController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java index f77b8267b..1cd41e54f 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java @@ -3,6 +3,9 @@ import use_case.similar_listeners.SimilarListenersInputBoundary; import use_case.similar_listeners.SimilarListenersInputData; +/** + * The controller for SimilarListeners use case. + */ public class SimilarListenersController { private final SimilarListenersInputBoundary similarListenersInputBoundary; From f7ad05ca670f5c631155eea038531292763a7d0b Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 10:43:24 -0500 Subject: [PATCH 084/262] changed parameter name --- .../similar_listeners/SimilarListenersController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java index 1cd41e54f..e390e34b0 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java @@ -15,11 +15,11 @@ public SimilarListenersController(SimilarListenersInputBoundary similarListeners /** * Executes the Login Use Case. - * @param loginToken the username of the user logging in + * @param accessToken the username of the user logging in */ - public void execute(String loginToken) { + public void execute(String accessToken) { final SimilarListenersInputData similarListenersInputData = new SimilarListenersInputData( - loginToken); + accessToken); similarListenersInputBoundary.execute(similarListenersInputData); } From 4365e5b07208631128e69e7ed9209b340034bd59 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 10:48:01 -0500 Subject: [PATCH 085/262] changed parameter name --- .../similar_listeners/SimilarListenersInputData.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java index 430e67e1c..bf77d4c7c 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java @@ -2,14 +2,14 @@ public class SimilarListenersInputData { - private final String loginToken; + private final String accessToken; - public SimilarListenersInputData(String loginToken) { - this.loginToken = loginToken; + public SimilarListenersInputData(String accessToken) { + this.accessToken = accessToken; } String getLoginToken() { - return loginToken; + return accessToken; } } From 3d3e2499eb089478b84b95051137d019290318d7 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 11:02:20 -0500 Subject: [PATCH 086/262] added instance variable --- .../SimilarListenersInputData.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java index bf77d4c7c..7018d3338 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java @@ -1,15 +1,25 @@ package use_case.similar_listeners; +import java.util.ArrayList; +import java.util.List; + public class SimilarListenersInputData { private final String accessToken; + private final List artistsFollowed; + + public SimilarListenersInputData(String accessToken, ArrayList artistsFollowed) { - public SimilarListenersInputData(String accessToken) { this.accessToken = accessToken; + this.artistsFollowed = artistsFollowed; } - String getLoginToken() { + String getAccessToken() { return accessToken; } + List getArtistsFollowed() { + return artistsFollowed; + } + } From 22c0fda12faa33f4a08c9b2f5a035d9b1e873381 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 11:06:17 -0500 Subject: [PATCH 087/262] implemented execute method --- .../SimilarListenersInteractor.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java index 2cd9372f4..cbead3a08 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java @@ -4,17 +4,27 @@ public class SimilarListenersInteractor implements SimilarListenersInputBoundary { private final SimilarListenersUserDataAccessInterface userDataAccessObject; - private final SimilarListenersOutputBoundary loginPresenter; + private final SimilarListenersOutputBoundary similarListenersPresenter; public SimilarListenersInteractor(SimilarListenersUserDataAccessInterface userDataAccessInterface, SimilarListenersOutputBoundary similarListenersOutputBoundary) { this.userDataAccessObject = userDataAccessInterface; - this.loginPresenter = similarListenersOutputBoundary; + this.similarListenersPresenter = similarListenersOutputBoundary; } @Override public void execute(SimilarListenersInputData similarListenersInputData) { - + final String accessToken = similarListenersInputData.getAccessToken(); + if (userDataAccessObject.getFollowedArtists().isEmpty()) { + similarListenersPresenter.prepareFailView("You do not follow any artists. Similar Listeners cannot be determined."); + } + else { + final List followedArtists = userDataAccessObject.getFollowedArtists(); + userDataAccessObject.setCurrentFollowedArtists(followedArtists); + final SimilarListenersOutputData similarListenersOutputData = new SimilarListenersOutputData(followedArtists, false); + similarListenersPresenter.prepareSuccessView(similarListenersOutputData); + } + } } -} + From 40a72afd1e51cce5a13f2efea0b299b6273dc334 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 11:09:48 -0500 Subject: [PATCH 088/262] updated execute method --- .../similar_listeners/SimilarListenersController.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java index e390e34b0..49bf6c4af 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java @@ -1,5 +1,7 @@ package interface_adapter.similar_listeners; +import java.util.ArrayList; + import use_case.similar_listeners.SimilarListenersInputBoundary; import use_case.similar_listeners.SimilarListenersInputData; @@ -16,10 +18,11 @@ public SimilarListenersController(SimilarListenersInputBoundary similarListeners /** * Executes the Login Use Case. * @param accessToken the username of the user logging in + * @param followedArtists the list of artists this user follows. */ - public void execute(String accessToken) { - final SimilarListenersInputData similarListenersInputData = new SimilarListenersInputData( - accessToken); + public void execute(String accessToken, ArrayList followedArtists) { + final SimilarListenersInputData similarListenersInputData = new SimilarListenersInputData(accessToken, + followedArtists); similarListenersInputBoundary.execute(similarListenersInputData); } From 5321f3702c90fd00362d5ab5f4a699b5b36bccfa Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 11:15:00 -0500 Subject: [PATCH 089/262] updated execute method --- .../SimilarListenersInteractor.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java index cbead3a08..3677f8075 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java @@ -2,6 +2,9 @@ import java.util.List; +/** + * SimilarListeners Interactor. + */ public class SimilarListenersInteractor implements SimilarListenersInputBoundary { private final SimilarListenersUserDataAccessInterface userDataAccessObject; private final SimilarListenersOutputBoundary similarListenersPresenter; @@ -14,17 +17,19 @@ public SimilarListenersInteractor(SimilarListenersUserDataAccessInterface userDa @Override public void execute(SimilarListenersInputData similarListenersInputData) { - final String accessToken = similarListenersInputData.getAccessToken(); + // final String accessToken = similarListenersInputData.getAccessToken(); if (userDataAccessObject.getFollowedArtists().isEmpty()) { - similarListenersPresenter.prepareFailView("You do not follow any artists. Similar Listeners cannot be determined."); + similarListenersPresenter.prepareFailView("You do not follow any artists. " + + "Similar Listeners cannot be determined."); } else { final List followedArtists = userDataAccessObject.getFollowedArtists(); userDataAccessObject.setCurrentFollowedArtists(followedArtists); - final SimilarListenersOutputData similarListenersOutputData = new SimilarListenersOutputData(followedArtists, false); + final SimilarListenersOutputData similarListenersOutputData = new SimilarListenersOutputData( + followedArtists, false); similarListenersPresenter.prepareSuccessView(similarListenersOutputData); } } - } +} From e559c9c939ec96e21b36771cf39ff8f569c7428d Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Thu, 21 Nov 2024 11:15:56 -0500 Subject: [PATCH 090/262] added javadoc --- .../use_case/similar_listeners/SimilarListenersInputData.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java index 7018d3338..058ca6397 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java @@ -3,6 +3,9 @@ import java.util.ArrayList; import java.util.List; +/** + * The input data for SimilarListeners use case. + */ public class SimilarListenersInputData { private final String accessToken; From 02e237841d01b7f4739545f423d3c562416f1aa0 Mon Sep 17 00:00:00 2001 From: quinn Date: Thu, 21 Nov 2024 22:17:08 -0500 Subject: [PATCH 091/262] made go home button functional --- src/main/java/app/AppBuilder.java | 15 +++++++++++++++ .../search/SearchController.java | 4 ++-- .../search/SearchPresenter.java | 7 ++++--- .../interface_adapter/search/SearchState.java | 11 ++++++++++- .../java/use_case/login/LoginInteractor.java | 17 ++++++----------- .../use_case/search/SearchInputBoundary.java | 2 +- .../java/use_case/search/SearchInteractor.java | 4 ++-- .../java/use_case/search/SearchOutputData.java | 13 +++++++++++-- src/main/java/view/LoggedInView.java | 6 ++++-- src/main/java/view/SearchView.java | 17 ++++++++++++----- 10 files changed, 67 insertions(+), 29 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 592f999c7..f85b50f82 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -108,9 +108,16 @@ public AppBuilder addLoginView() { * @return this builder */ public AppBuilder addSearchView() { + //TODO discuss this implementation with team searchViewModel = new SearchViewModel(); searchView = new SearchView(searchViewModel); cardPanel.add(searchView, searchView.getViewName()); + final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + final LoginInputBoundary loginInteractor = new LoginInteractor( + userDataAccessObject, loginOutputBoundary); + final LoginController loginController = new LoginController(loginInteractor); + searchView.setLoginController(loginController); return this; } @@ -219,6 +226,14 @@ public AppBuilder addLogoutUseCase() { * @return this builder */ public AppBuilder addSearchUseCase() { + final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + final LoginInputBoundary loginInteractor = new LoginInteractor( + userDataAccessObject, loginOutputBoundary); + + final LoginController loginController = new LoginController(loginInteractor); + searchView.setLoginController(loginController); + final SearchOutputBoundary searchOutputBoundary = new SearchPresenter(viewManagerModel, loggedInViewModel, searchViewModel); diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java index 95f950f24..07538ed16 100644 --- a/src/main/java/interface_adapter/search/SearchController.java +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -19,7 +19,7 @@ public SearchController(SearchInputBoundary searchUseCaseInteractor) { /** * Executes the Search Use Case. */ - public void execute() { - searchUseCaseInteractor.execute(); + public void execute(String accessToken) { + searchUseCaseInteractor.execute(accessToken); } } diff --git a/src/main/java/interface_adapter/search/SearchPresenter.java b/src/main/java/interface_adapter/search/SearchPresenter.java index 8b8dd714d..50980a6aa 100644 --- a/src/main/java/interface_adapter/search/SearchPresenter.java +++ b/src/main/java/interface_adapter/search/SearchPresenter.java @@ -1,14 +1,14 @@ package interface_adapter.search; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginViewModel; import use_case.search.SearchOutputBoundary; import use_case.search.SearchOutputData; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInState; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInState; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginState; import interface_adapter.login.LoginViewModel; import use_case.logout.LogoutOutputBoundary; @@ -37,6 +37,7 @@ public SearchPresenter(ViewManagerModel viewManagerModel, public void prepareSuccessView(SearchOutputData response) { final SearchState searchState = searchViewModel.getState(); + searchState.setAccessToken(response.getAccessToken()); searchViewModel.setState(searchState); searchViewModel.firePropertyChanged(); diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java index 34b9b7f2f..08e45cf62 100644 --- a/src/main/java/interface_adapter/search/SearchState.java +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -1,6 +1,6 @@ package interface_adapter.search; -import interface_adapter.change_password.LoggedInState; +import interface_adapter.logged_in.LoggedInState; /** * The state for the SearchViewModel. @@ -9,6 +9,7 @@ public class SearchState { private String query; private String modelResponse; + private String accessToken; public SearchState(SearchState copy) { query = copy.query; @@ -35,4 +36,12 @@ public void setQuery(String query) { public void setModelResponse(String modelResponse) { this.modelResponse = modelResponse; } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } } diff --git a/src/main/java/use_case/login/LoginInteractor.java b/src/main/java/use_case/login/LoginInteractor.java index 3e8cef782..ef9d70bee 100644 --- a/src/main/java/use_case/login/LoginInteractor.java +++ b/src/main/java/use_case/login/LoginInteractor.java @@ -17,16 +17,11 @@ public LoginInteractor(LoginUserDataAccessInterface userDataAccessInterface, @Override public void execute(LoginInputData loginInputData) { - final String username = loginInputData.getLoginToken(); - if (!userDataAccessObject.existsByName(username)) { - loginPresenter.prepareFailView(username + ": Account does not exist."); - } - else { - // final String pwd = userDataAccessObject.get(username).getName(); - final User user = userDataAccessObject.get(loginInputData.getLoginToken()); - userDataAccessObject.setCurrentAccessToken(user.getAccessToken()); - final LoginOutputData loginOutputData = new LoginOutputData(user.getAccessToken(), false); - loginPresenter.prepareSuccessView(loginOutputData); - } + final String token = loginInputData.getLoginToken(); + final User user = userDataAccessObject.get(token); + userDataAccessObject.setCurrentAccessToken(token); + final LoginOutputData loginOutputData = new LoginOutputData(token, false); + loginPresenter.prepareSuccessView(loginOutputData); + } } diff --git a/src/main/java/use_case/search/SearchInputBoundary.java b/src/main/java/use_case/search/SearchInputBoundary.java index b0a5c7992..960d6951c 100644 --- a/src/main/java/use_case/search/SearchInputBoundary.java +++ b/src/main/java/use_case/search/SearchInputBoundary.java @@ -7,5 +7,5 @@ public interface SearchInputBoundary { /** * Executes the Search use case. */ - void execute(); + void execute(String accessToken); } diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index 88964aa02..9ee9206dd 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -21,8 +21,8 @@ public SearchInteractor(SearchOutputBoundary searchPresenter) { } @Override - public void execute() { - final SearchOutputData search = new SearchOutputData(false); + public void execute(String accessToken) { + final SearchOutputData search = new SearchOutputData(accessToken,false); searchPresenter.prepareSuccessView(search); } } diff --git a/src/main/java/use_case/search/SearchOutputData.java b/src/main/java/use_case/search/SearchOutputData.java index d7f7df381..507acebc1 100644 --- a/src/main/java/use_case/search/SearchOutputData.java +++ b/src/main/java/use_case/search/SearchOutputData.java @@ -4,15 +4,24 @@ */ public class SearchOutputData { - + private String accessToken; private boolean useCaseFailed; - public SearchOutputData(boolean useCaseFailed) { + public SearchOutputData(String token, boolean useCaseFailed) { this.useCaseFailed = useCaseFailed; + this.accessToken = token; } public boolean isUseCaseFailed() { return useCaseFailed; } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 988245612..90bf1efd3 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -119,8 +119,10 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { if (evt.getSource().equals(description)) { - // 1. Execute the logout Controller. - searchController.execute(); + // 1. get the state out of the loggedInViewModel. It contains the username. + final String accessToken = loggedInViewModel.getState().getUsername(); + // 2. Execute the logout Controller. + searchController.execute(accessToken); } } ); diff --git a/src/main/java/view/SearchView.java b/src/main/java/view/SearchView.java index c4a0dbf15..3f0fd5730 100644 --- a/src/main/java/view/SearchView.java +++ b/src/main/java/view/SearchView.java @@ -1,6 +1,7 @@ package view; -import interface_adapter.change_password.LoggedInState; +import interface_adapter.logged_in.LoggedInState; +import interface_adapter.login.LoginController; import interface_adapter.login.LoginState; import interface_adapter.search.SearchController; import interface_adapter.search.SearchState; @@ -20,6 +21,7 @@ public class SearchView extends JPanel implements PropertyChangeListener { private final String viewName = "search"; private final SearchViewModel searchViewModel; private SearchController searchController; + private LoginController loginController; private final int searchBoxSize = 50; @@ -49,18 +51,19 @@ public SearchView(SearchViewModel searchViewModel) { searchResult.setAlignmentX(Component.RIGHT_ALIGNMENT); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - /* this block of code is to be finished after a discussion about a unified return home use case. + /* this block of code is to be finished after a discussion about a unified return home use case.*/ returnHome.addActionListener( // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { if (evt.getSource().equals(returnHome)) { // 1. get the state out of the searchViewModel. It contains the username. - final String name = searchViewModel.getState().getUsername(); + final String accessToken = searchViewModel.getState().getAccessToken(); // 2. Execute the search Controller. - loginController.execute(); + loginController.execute(accessToken); + } } - );*/ + ); this.add(title); this.add(searchButtons); @@ -95,4 +98,8 @@ public String getViewName() { public void setSearchController(SearchController searchController) { this.searchController = searchController; } + + public void setLoginController(LoginController loginController) { + this.loginController = loginController; + } } From d6ba6fb8fd3f12857689b7e6249da573e516e2b0 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Thu, 21 Nov 2024 22:33:24 -0500 Subject: [PATCH 092/262] Began working on recommendUserDataInterface --- src/main/java/app/AppBuilder.java | 74 +++++++------------ .../InMemoryUserDataAccessObject.java | 10 --- .../recommend/RecommendInteractor.java | 4 +- .../RecommendUserDataAccessInterface.java | 16 ++++ .../RecommendUserDataAcessInterface.java | 20 ----- 5 files changed, 45 insertions(+), 79 deletions(-) delete mode 100644 src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index b1d862ba7..04d8ecee1 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -15,6 +15,9 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; +import interface_adapter.recommend.RecommendController; +import interface_adapter.recommend.RecommendPresenter; +import interface_adapter.recommend.RecommendViewModel; import interface_adapter.top_items.TopItemsController; import interface_adapter.top_items.TopItemsPresenter; import interface_adapter.top_items.TopItemsViewModel; @@ -24,11 +27,16 @@ import use_case.logout.LogoutInputBoundary; import use_case.logout.LogoutInteractor; import use_case.logout.LogoutOutputBoundary; +import use_case.recommend.RecommendInputBoundary; +import use_case.recommend.RecommendInteractor; +import use_case.recommend.RecommendOutputBoundary; +import use_case.recommend.RecommendUserDataAccessInterface; import use_case.top_items.TopItemsInputBoundary; import use_case.top_items.TopItemsInteractor; import use_case.top_items.TopItemsOutputBoundary; import view.LoggedInView; import view.LoginView; +import view.RecommendationsView; import view.TopItemsView; import view.ViewManager; @@ -53,34 +61,23 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); + private final RecommendUserDataAccessInterface recommendUserDataAccessInterface = new RecommendUserDataAccessInterface(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); -// Will remove since our project does not cover signing up, only logging in -// private SignupView signupView; -// private SignupViewModel signupViewModel; private LoginViewModel loginViewModel; private LoggedInViewModel loggedInViewModel; private TopItemsViewModel topTracksAndArtistsViewModel; + private RecommendViewModel recommendViewModel; private LoggedInView loggedInView; private LoginView loginView; private TopItemsView topItemsView; + private RecommendationsView recommendationsView; public AppBuilder() { cardPanel.setLayout(cardLayout); } - /** - * Adds the Signup View to the application. - * @return this builder - */ -// public AppBuilder addSignupView() { -// signupViewModel = new SignupViewModel(); -// signupView = new SignupView(signupViewModel); -// cardPanel.add(signupView, signupView.getViewName()); -// return this; -// } - /** * Adds the Login View to the application. * @return this builder @@ -114,21 +111,6 @@ public AppBuilder addTopTracksAndArtistsView() { return this; } - /** - * Adds the Signup Use Case to the application. - * @return this builder - */ -// public AppBuilder addSignupUseCase() { -// final SignupOutputBoundary signupOutputBoundary = new SignupPresenter(viewManagerModel, -// signupViewModel, loginViewModel); -// final SignupInputBoundary userSignupInteractor = new SignupInteractor( -// userDataAccessObject, signupOutputBoundary, userFactory); -// -// final SignupController controller = new SignupController(userSignupInteractor); -// signupView.setSignupController(controller); -// return this; -// } - /** * Adds the Login Use Case to the application. * @return this builder @@ -144,6 +126,21 @@ public AppBuilder addLoginUseCase() { return this; } + /** + * Adds the Recommend Use Case to the application. + * @return this builder + */ + public AppBuilder addRecommendUseCase() { + final RecommendOutputBoundary recommendOutputBoundary = + new RecommendPresenter(viewManagerModel, recommendViewModel); + final RecommendInputBoundary recommendInteractor = + new RecommendInteractor(recommendUserDataAccessInterface, recommendOutputBoundary); + + final RecommendController recommendController = new RecommendController(recommendInteractor); + recommendationsView.setRecommendController(recommendController); + return this; + } + /** * Adds the Login Use Case to the application. * @return this builder @@ -159,23 +156,6 @@ public AppBuilder addLoginUseCase() { return this; } */ - /** - * Adds the Change Password Use Case to the application. - * @return this builder - */ -// public AppBuilder addChangePasswordUseCase() { -// final ChangePasswordOutputBoundary changePasswordOutputBoundary = -// new ChangePasswordPresenter(loggedInViewModel); -// -// final ChangePasswordInputBoundary changePasswordInteractor = -// new ChangePasswordInteractor(userDataAccessObject, changePasswordOutputBoundary, userFactory); -// -// final ChangePasswordController changePasswordController = -// new ChangePasswordController(changePasswordInteractor); -// loggedInView.setChangePasswordController(changePasswordController); -// return this; -// } - /** * Adds the Logout Use Case to the application. * @return this builder @@ -221,7 +201,7 @@ public JFrame build() { application.add(cardPanel); - viewManagerModel.setState(loggedInViewModel.getViewName()); + viewManagerModel.setState(recommendViewModel.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index c68141cd5..b9b3d4f24 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -16,16 +16,6 @@ public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, LogoutUserDataAccessInterface { - @Override - public String getCurrentAccessToken() { - return ""; - } - - @Override - public void setCurrentAccessToken(String accessToken) { - - } - private final Map users = new HashMap<>(); private String currentUsername; diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index 4ea5926d7..1ad8a4e06 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -6,10 +6,10 @@ * The Recommendations Interactor. */ public class RecommendInteractor implements RecommendInputBoundary { - private final RecommendUserDataAcessInterface recommendDataAccessObject; + private final RecommendUserDataAccessInterface recommendDataAccessObject; private final RecommendOutputBoundary recommendationOutputBoundary; - public RecommendInteractor(RecommendUserDataAcessInterface recommendDataAccessInterface, + public RecommendInteractor(RecommendUserDataAccessInterface recommendDataAccessInterface, RecommendOutputBoundary recommendOutputBoundary) { this.recommendDataAccessObject = recommendDataAccessInterface; this.recommendationOutputBoundary = recommendOutputBoundary; diff --git a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java index 1ca95cb3c..834c201eb 100644 --- a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java @@ -1,4 +1,20 @@ package use_case.recommend; +import java.util.Map; + +/** + * DAO for the Recommendations Use Case. + */ public interface RecommendUserDataAccessInterface { + /** + * Returns the song recommendation Map of the current user of the application. + * @return the recommendations Map of the current user; null indicates that there are no recommendation Maps + */ + Map getSongRecommendations(); + + /** + * Sets the song recommendations map. + * @param songRecommendations the new song recommendation Map; null to indicate that there is no recommendations. + */ + void setSongRecommendations(Map songRecommendations); } diff --git a/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java deleted file mode 100644 index cbd5c38ef..000000000 --- a/src/main/java/use_case/recommend/RecommendUserDataAcessInterface.java +++ /dev/null @@ -1,20 +0,0 @@ -package use_case.recommend; - -import java.util.Map; - -/** - * DAO for the Recommendations Use Case. - */ -public interface RecommendUserDataAcessInterface { - /** - * Returns the song recommendation Map of the current user of the application. - * @return the recommendations Map of the current user; null indicates that there are no recommendation Maps - */ - Map getSongRecommendations(); - - /** - * Sets the song recommendations map. - * @param songRecommendations the new song recommendation Map; null to indicate that there is no recommendations. - */ - void setSongRecommendations(Map songRecommendations); -} From ec9c52a9ca71bde393fd7a001d1919d29a5ddf65 Mon Sep 17 00:00:00 2001 From: quinn Date: Fri, 22 Nov 2024 17:13:26 -0500 Subject: [PATCH 093/262] begun implementation of search use case --- .../interface_adapter/search/SearchController.java | 10 +++++++++- src/main/java/use_case/search/SearchInputBoundary.java | 5 +++++ src/main/java/use_case/search/SearchInteractor.java | 9 +++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java index 95f950f24..00f7eaf99 100644 --- a/src/main/java/interface_adapter/search/SearchController.java +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -17,9 +17,17 @@ public SearchController(SearchInputBoundary searchUseCaseInteractor) { } /** - * Executes the Search Use Case. + * Goes to the search use case. */ public void execute() { searchUseCaseInteractor.execute(); } + + /** + * Executes the Search Use Case. + * @param searchText the search the user is inputting. + */ + public void executeSearch(String searchText) { + searchUseCaseInteractor.executeSearch(searchText); + } } diff --git a/src/main/java/use_case/search/SearchInputBoundary.java b/src/main/java/use_case/search/SearchInputBoundary.java index b0a5c7992..16775d4ef 100644 --- a/src/main/java/use_case/search/SearchInputBoundary.java +++ b/src/main/java/use_case/search/SearchInputBoundary.java @@ -8,4 +8,9 @@ public interface SearchInputBoundary { * Executes the Search use case. */ void execute(); + + /** + * Executes the Search use case. + */ + void executeSearch(String searchText); } diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index 88964aa02..df0e44210 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -1,5 +1,6 @@ package use_case.search; +import data_access.DBUserDataAccessObject; import data_access.InMemoryUserDataAccessObject; import use_case.login.LoginInputData; import use_case.logout.LogoutOutputData; @@ -9,6 +10,7 @@ */ public class SearchInteractor implements SearchInputBoundary { + private final SearchUserDataAccessInterface userDataAccessObject; private final SearchOutputBoundary searchPresenter; /** @@ -25,4 +27,11 @@ public void execute() { final SearchOutputData search = new SearchOutputData(false); searchPresenter.prepareSuccessView(search); } + + @Override + public void executeSearch(String query){ + searchPresenter.prepareSuccessView(search); + } + + } From f8f7e699b67afafd02563ec8d47995952a91f6dc Mon Sep 17 00:00:00 2001 From: quinn Date: Fri, 22 Nov 2024 17:13:26 -0500 Subject: [PATCH 094/262] begun implementation of search use case --- .../interface_adapter/search/SearchController.java | 10 +++++++++- src/main/java/use_case/search/SearchInputBoundary.java | 7 ++++++- src/main/java/use_case/search/SearchInteractor.java | 9 +++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java index 07538ed16..8344302b9 100644 --- a/src/main/java/interface_adapter/search/SearchController.java +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -17,9 +17,17 @@ public SearchController(SearchInputBoundary searchUseCaseInteractor) { } /** - * Executes the Search Use Case. + * Goes to the search use case. */ public void execute(String accessToken) { searchUseCaseInteractor.execute(accessToken); } + + /** + * Executes the Search Use Case. + * @param searchText the search the user is inputting. + */ + public void executeSearch(String searchText) { + searchUseCaseInteractor.executeSearch(searchText); + } } diff --git a/src/main/java/use_case/search/SearchInputBoundary.java b/src/main/java/use_case/search/SearchInputBoundary.java index 960d6951c..16775d4ef 100644 --- a/src/main/java/use_case/search/SearchInputBoundary.java +++ b/src/main/java/use_case/search/SearchInputBoundary.java @@ -7,5 +7,10 @@ public interface SearchInputBoundary { /** * Executes the Search use case. */ - void execute(String accessToken); + void execute(); + + /** + * Executes the Search use case. + */ + void executeSearch(String searchText); } diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index 9ee9206dd..fc90f8f0e 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -1,5 +1,6 @@ package use_case.search; +import data_access.DBUserDataAccessObject; import data_access.InMemoryUserDataAccessObject; import use_case.login.LoginInputData; import use_case.logout.LogoutOutputData; @@ -9,6 +10,7 @@ */ public class SearchInteractor implements SearchInputBoundary { + private final SearchUserDataAccessInterface userDataAccessObject; private final SearchOutputBoundary searchPresenter; /** @@ -25,4 +27,11 @@ public void execute(String accessToken) { final SearchOutputData search = new SearchOutputData(accessToken,false); searchPresenter.prepareSuccessView(search); } + + @Override + public void executeSearch(String query){ + searchPresenter.prepareSuccessView(search); + } + + } From 7332760f4d70895878f913ca8eec2c2e4780348e Mon Sep 17 00:00:00 2001 From: quinn Date: Fri, 22 Nov 2024 17:31:52 -0500 Subject: [PATCH 095/262] added parameters to constructor --- src/main/java/use_case/search/SearchInteractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index fc90f8f0e..704bb5275 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -17,7 +17,7 @@ public class SearchInteractor implements SearchInputBoundary { * The Search Interactor constructor. * @param searchPresenter output information */ - public SearchInteractor(SearchOutputBoundary searchPresenter) { + public SearchInteractor(SearchOutputBoundary searchPresenter, SearchUserDataAccessInterface) { this.searchPresenter = searchPresenter; } From 9914d203137f693ca8dfaf490f043fc78e92e899 Mon Sep 17 00:00:00 2001 From: quinn Date: Fri, 22 Nov 2024 18:18:35 -0500 Subject: [PATCH 096/262] Created functional search use case --- src/main/java/app/AppBuilder.java | 6 +++-- .../search/SearchController.java | 6 +++-- .../search/SearchPresenter.java | 2 ++ .../interface_adapter/search/SearchState.java | 25 ++++--------------- .../use_case/search/SearchInputBoundary.java | 4 +-- .../use_case/search/SearchInteractor.java | 10 +++++--- .../use_case/search/SearchOutputData.java | 10 ++++++++ src/main/java/view/SearchView.java | 20 +++++++++++++-- 8 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index f85b50f82..47a6797bc 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -5,6 +5,7 @@ import javax.swing.*; import data_access.InMemoryUserDataAccessObject; +import data_access.LanguageModelDataAccessObject; import data_access.TopItemsUserDataAccessObject; import entity.CommonUserFactory; import entity.UserFactory; @@ -63,6 +64,7 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); + private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); // Will remove since our project does not cover signing up, only logging in // private SignupView signupView; @@ -108,7 +110,6 @@ public AppBuilder addLoginView() { * @return this builder */ public AppBuilder addSearchView() { - //TODO discuss this implementation with team searchViewModel = new SearchViewModel(); searchView = new SearchView(searchViewModel); cardPanel.add(searchView, searchView.getViewName()); @@ -238,9 +239,10 @@ public AppBuilder addSearchUseCase() { loggedInViewModel, searchViewModel); final SearchInputBoundary searchInteractor = - new SearchInteractor(searchOutputBoundary); + new SearchInteractor(languageModelDataAccessObject, searchOutputBoundary); final SearchController searchController = new SearchController(searchInteractor); + searchView.setSearchController(searchController); loggedInView.setSearchController(searchController); return this; } diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java index 8344302b9..1321885c4 100644 --- a/src/main/java/interface_adapter/search/SearchController.java +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -18,6 +18,7 @@ public SearchController(SearchInputBoundary searchUseCaseInteractor) { /** * Goes to the search use case. + * @param accessToken the access token for spotify. */ public void execute(String accessToken) { searchUseCaseInteractor.execute(accessToken); @@ -26,8 +27,9 @@ public void execute(String accessToken) { /** * Executes the Search Use Case. * @param searchText the search the user is inputting. + * @param accessToken the access token for spotify. */ - public void executeSearch(String searchText) { - searchUseCaseInteractor.executeSearch(searchText); + public void executeSearch(String accessToken, String searchText) { + searchUseCaseInteractor.executeSearch(accessToken, searchText); } } diff --git a/src/main/java/interface_adapter/search/SearchPresenter.java b/src/main/java/interface_adapter/search/SearchPresenter.java index 50980a6aa..d16f07654 100644 --- a/src/main/java/interface_adapter/search/SearchPresenter.java +++ b/src/main/java/interface_adapter/search/SearchPresenter.java @@ -38,9 +38,11 @@ public void prepareSuccessView(SearchOutputData response) { final SearchState searchState = searchViewModel.getState(); searchState.setAccessToken(response.getAccessToken()); + searchState.setDisplayText(response.getDisplayText()); searchViewModel.setState(searchState); searchViewModel.firePropertyChanged(); + // This code tells the View Manager to switch to the Search. this.viewManagerModel.setState(searchViewModel.getViewName()); this.viewManagerModel.firePropertyChanged(); diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java index 08e45cf62..f35924013 100644 --- a/src/main/java/interface_adapter/search/SearchState.java +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -7,35 +7,20 @@ */ public class SearchState { - private String query; - private String modelResponse; + private String displayText; private String accessToken; public SearchState(SearchState copy) { - query = copy.query; - modelResponse = copy.modelResponse; + displayText = copy.displayText; + accessToken = copy.accessToken; } // Because of the previous copy constructor, the default constructor must be explicit. public SearchState() { } - - public String getQuery() { - return query; - } - - public String getModelResponse() { - return modelResponse; - } - - public void setQuery(String query) { - this.query = query; - } - - public void setModelResponse(String modelResponse) { - this.modelResponse = modelResponse; - } + public String getDisplayText() {return displayText;} + public void setDisplayText(String displayText) {this.displayText = displayText;} public String getAccessToken() { return accessToken; diff --git a/src/main/java/use_case/search/SearchInputBoundary.java b/src/main/java/use_case/search/SearchInputBoundary.java index 16775d4ef..e2dad7a59 100644 --- a/src/main/java/use_case/search/SearchInputBoundary.java +++ b/src/main/java/use_case/search/SearchInputBoundary.java @@ -7,10 +7,10 @@ public interface SearchInputBoundary { /** * Executes the Search use case. */ - void execute(); + void execute(String accessToken); /** * Executes the Search use case. */ - void executeSearch(String searchText); + void executeSearch(String accessToken, String searchText); } diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index 704bb5275..f7db0060a 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -10,14 +10,15 @@ */ public class SearchInteractor implements SearchInputBoundary { - private final SearchUserDataAccessInterface userDataAccessObject; + private final SearchLanguageModelDataAccessInterface modelDataAccess; private final SearchOutputBoundary searchPresenter; /** * The Search Interactor constructor. * @param searchPresenter output information */ - public SearchInteractor(SearchOutputBoundary searchPresenter, SearchUserDataAccessInterface) { + public SearchInteractor(SearchLanguageModelDataAccessInterface modelDataAccess, SearchOutputBoundary searchPresenter) { + this.modelDataAccess = modelDataAccess; this.searchPresenter = searchPresenter; } @@ -29,7 +30,10 @@ public void execute(String accessToken) { } @Override - public void executeSearch(String query){ + public void executeSearch(String accessToken, String searchText){ + final SearchOutputData search = new SearchOutputData(accessToken,false); + final String response = modelDataAccess.query(searchText); + search.setDisplayText(response); searchPresenter.prepareSuccessView(search); } diff --git a/src/main/java/use_case/search/SearchOutputData.java b/src/main/java/use_case/search/SearchOutputData.java index 507acebc1..437665748 100644 --- a/src/main/java/use_case/search/SearchOutputData.java +++ b/src/main/java/use_case/search/SearchOutputData.java @@ -5,9 +5,11 @@ public class SearchOutputData { private String accessToken; + private String displayText; private boolean useCaseFailed; public SearchOutputData(String token, boolean useCaseFailed) { + this.displayText = "This is where the response will appear."; this.useCaseFailed = useCaseFailed; this.accessToken = token; @@ -24,4 +26,12 @@ public String getAccessToken() { public void setAccessToken(String accessToken) { this.accessToken = accessToken; } + + public String getDisplayText() { + return displayText; + } + + public void setDisplayText(String displayText) { + this.displayText = displayText; + } } diff --git a/src/main/java/view/SearchView.java b/src/main/java/view/SearchView.java index 3f0fd5730..d9cc3d7f8 100644 --- a/src/main/java/view/SearchView.java +++ b/src/main/java/view/SearchView.java @@ -26,6 +26,7 @@ public class SearchView extends JPanel implements PropertyChangeListener { private final int searchBoxSize = 50; private final JButton returnHome; + private final JButton searchButton; private final JTextField searchInputField; private final JLabel searchResult; private final JLabel title; @@ -41,12 +42,14 @@ public SearchView(SearchViewModel searchViewModel) { returnHome = new JButton("Go Back"); homeButton.add(returnHome); - searchResult = new JLabel("This is where search results will show up"); + searchResult = new JLabel(searchViewModel.getState().getDisplayText()); final JLabel description = new JLabel("Type In the Song Description:"); searchButtons.add(description); searchInputField = new JTextField(searchBoxSize); + searchButton = new JButton("Search"); searchButtons.add(searchInputField); + searchButtons.add(searchButton); searchResult.setAlignmentX(Component.RIGHT_ALIGNMENT); @@ -65,6 +68,19 @@ public SearchView(SearchViewModel searchViewModel) { } ); + searchButton.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + evt -> { + if (evt.getSource().equals(searchButton)) { + // 1. get the state out of the searchViewModel. It contains the username. + final String accessToken = searchViewModel.getState().getAccessToken(); + // 2. Execute the search Controller. + searchController.executeSearch(accessToken, searchInputField.getText()); + + } + } + ); + this.add(title); this.add(searchButtons); this.add(searchResult); @@ -87,7 +103,7 @@ public void propertyChange(PropertyChangeEvent evt) { } private void setFields(SearchState state) { - searchInputField.setText(state.getQuery()); + searchResult.setText(state.getDisplayText()); } From 56ab707c5e65360f85a001ff1d82ecb7cc0f0d36 Mon Sep 17 00:00:00 2001 From: quinn Date: Fri, 22 Nov 2024 18:20:46 -0500 Subject: [PATCH 097/262] Created functional search use case --- src/main/java/interface_adapter/search/SearchState.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java index f35924013..1c759e78a 100644 --- a/src/main/java/interface_adapter/search/SearchState.java +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -20,7 +20,9 @@ public SearchState() { } public String getDisplayText() {return displayText;} - public void setDisplayText(String displayText) {this.displayText = displayText;} + public void setDisplayText(String displayText) { + this.displayText = displayText; + } public String getAccessToken() { return accessToken; From fc60b1f9d4175eeee31283877c54f2d64948d2fc Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 18:30:30 -0500 Subject: [PATCH 098/262] updated pom file with Spotify Wrapper dependency --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index d55d59588..a79719c58 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,14 @@ 1.5.4 + + + se.michaelthelin.spotify + spotify-web-api-java + 9.0.0-RC1 + + + From 0d1e1abd47508ef6857239d0a20abaa5a75f4889 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 18:31:34 -0500 Subject: [PATCH 099/262] added helper methods to get info from spotify api implemented methods in TopItemsUserDataAccessInterface --- .../data_access/SpotifyDataAccessObject.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/main/java/data_access/SpotifyDataAccessObject.java diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java new file mode 100644 index 000000000..0c239d3e3 --- /dev/null +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -0,0 +1,132 @@ +package data_access; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.neovisionaries.i18n.CountryCode; +import entity.CommonUser; +import entity.User; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import interface_adapter.login.LoginState; +import org.apache.hc.core5.http.ParseException; +import org.json.JSONException; +import org.json.JSONObject; +import se.michaelthelin.spotify.SpotifyApi; +import se.michaelthelin.spotify.exceptions.SpotifyWebApiException; +import se.michaelthelin.spotify.model_objects.specification.Artist; +import se.michaelthelin.spotify.model_objects.specification.Paging; +import se.michaelthelin.spotify.model_objects.specification.Track; +import se.michaelthelin.spotify.requests.data.artists.GetArtistsTopTracksRequest; +import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopArtistsRequest; +import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; +import use_case.top_items.TopItemsUserDataAccessInterface; + +public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface { + + private LoginState loginState = new LoginState(); + private String accessToken; + private User currentUser; + private SpotifyApi spotifyApi; + private GetUsersTopTracksRequest getTopTracksRequest; + private GetUsersTopArtistsRequest getTopArtistsRequest; + + public SpotifyDataAccessObject(String accessToken) { + //this.accessToken = loginState.getLoginToken(); + this.accessToken = accessToken; + this.currentUser = new CommonUser(accessToken); + this.spotifyApi = new SpotifyApi.Builder() + .setAccessToken(accessToken) + .build(); + this.getTopTracksRequest = spotifyApi.getUsersTopTracks() + .build(); + this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() + .build(); + } + + /** + * A helper method to get the current users top tracks. + * @return a list of the track names. + */ + private List getUsersTopTracksSync() { + try { + // Using Spotify Wrapper to get the given users top tracks from API + final Paging trackPaging = getTopTracksRequest.execute(); + + Track[] tracks = trackPaging.getItems(); + + List topTracks = new ArrayList(); + for (Track track : tracks) { + topTracks.add(track.getName()); + } + System.out.println("Top Tracks: " + topTracks); + return topTracks; + + } catch (IOException | SpotifyWebApiException | ParseException e) { + System.out.println("Error: " + e.getMessage()); + return null; + } + } + + private List getUsersTopArtistsSync() { + try { + // Using Spotify Wrapper to get the given users top artists from API + final Paging artistPaging = getTopArtistsRequest.execute(); + + Artist[] artists = artistPaging.getItems(); + + List topArtists = new ArrayList(); + for (Artist artist : artists) { + topArtists.add(artist.getName()); + } + System.out.println("Top Artists: " + topArtists); + return topArtists; + + } catch (IOException | SpotifyWebApiException | ParseException e) { + System.out.println("Error: " + e.getMessage()); + return null; + } + } + + @Override + public List getCurrentTopTracks() { + return getUsersTopTracksSync(); + } + + @Override + public void setCurrentTopTracks(List tracks) { + + } + + @Override + public List getCurrentTopArtists() { + return getUsersTopArtistsSync(); + } + + @Override + public void setCurrentTopArtists(List artists) { + + } + + @Override + public List getCurrentTime() { + return List.of(); + } + + @Override + public void setCurrentTime(List time) { + + } + + public static void main(String[] args) { + SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQCOFgyHIg-eAjqOM8ITkCEynoZwEoN2__Sccimaakn2rZjBzIBTwSVK391IUAD7umWe6vvEE9MiiqvN6j1jFySdxecxQL0gS1Tt2y3DAlrt6c6XlfD6jEQJPiNqyOHueQr9ZQe4Um0A6Bz2cbKvzi-fW1MQG19K2rmT_Z0rLFQY-p3S9ssF-5213Ol_hAvpB0kORgMoazMdzPYe6A"); + spotifyDataAccessObject.getUsersTopTracksSync(); + spotifyDataAccessObject.getUsersTopArtistsSync(); + + } + +} + From 947d35167dee6e18e044caeea96edc5176f0e466 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 18:35:24 -0500 Subject: [PATCH 100/262] added helper methods to get info from spotify api implemented methods in TopItemsUserDataAccessInterface --- src/main/java/data_access/SpotifyDataAccessObject.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 0c239d3e3..01aeb6a0e 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -4,12 +4,8 @@ import java.util.ArrayList; import java.util.List; -import com.neovisionaries.i18n.CountryCode; import entity.CommonUser; import entity.User; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; import interface_adapter.login.LoginState; import org.apache.hc.core5.http.ParseException; @@ -20,7 +16,6 @@ import se.michaelthelin.spotify.model_objects.specification.Artist; import se.michaelthelin.spotify.model_objects.specification.Paging; import se.michaelthelin.spotify.model_objects.specification.Track; -import se.michaelthelin.spotify.requests.data.artists.GetArtistsTopTracksRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; import use_case.top_items.TopItemsUserDataAccessInterface; From 8cb905ad59677f769da5d6d4afc9e13f7987b47d Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 19:05:19 -0500 Subject: [PATCH 101/262] updated instance variables --- .../similar_listeners/SimilarListenersInputData.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java index 058ca6397..eff2d98ca 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java @@ -9,20 +9,20 @@ public class SimilarListenersInputData { private final String accessToken; - private final List artistsFollowed; + // private final List artistsFollowed; - public SimilarListenersInputData(String accessToken, ArrayList artistsFollowed) { + public SimilarListenersInputData(String accessToken) { this.accessToken = accessToken; - this.artistsFollowed = artistsFollowed; + // this.artistsFollowed = artistsFollowed; } String getAccessToken() { return accessToken; } - List getArtistsFollowed() { - return artistsFollowed; - } + // List getArtistsFollowed() { + // return artistsFollowed; + // } } From 81497e2b4993cd0217bf0c980ea329fe02bf6c76 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 19:05:35 -0500 Subject: [PATCH 102/262] created test for interactor --- .../SimilarListenersInteractorTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java diff --git a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java new file mode 100644 index 000000000..c9af40cc6 --- /dev/null +++ b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java @@ -0,0 +1,45 @@ +package use_case.similar_listeners; + +import data_access.InMemoryUserDataAccessObject; +import entity.CommonUserFactory; +import entity.User; +import entity.UserFactory; +import org.junit.jupiter.api.Test; +import use_case.logout.*; + +import static org.junit.jupiter.api.Assertions.*; + +public class SimilarListenersInteractorTest { + + @Test + void successTest() { + SimilarListenersInputData inputData = new SimilarListenersInputData("BQCOFgyHIg-eAjqOM8ITkCEynoZwEoN2__Sccimaakn2rZjBzIBTwSVK391IUAD7umWe6vvEE9MiiqvN6j1jFySdxecxQL0gS1Tt2y3DAlrt6c6XlfD6jEQJPiNqyOHueQr9ZQe4Um0A6Bz2cbKvzi-fW1MQG19K2rmT_Z0rLFQY-p3S9ssF-5213Ol_hAvpB0kORgMoazMdzPYe6A"); + InMemoryUserDataAccessObject userRepository = new InMemoryUserDataAccessObject(); + + // For the success test, we need to add Paul to the data access repository before we log in. + UserFactory factory = new CommonUserFactory(); + User user = factory.create("Paul", "password"); + userRepository.save(user); + userRepository.setCurrentUsername("Paul"); + + // This creates a successPresenter that tests whether the test case is as we expect. + LogoutOutputBoundary successPresenter = new LogoutOutputBoundary() { + @Override + public void prepareSuccessView(LogoutOutputData user) { + // check that the output data contains the username of who logged out + assertEquals("Paul", user.getUsername()); + } + + @Override + public void prepareFailView(String error) { + fail("Use case failure is unexpected."); + } + }; + + LogoutInputBoundary interactor = new LogoutInteractor(userRepository, successPresenter); + interactor.execute(inputData); + // check that the user was logged out + assertNull(userRepository.getCurrentUsername()); + } + +} From 6459f83e608a7097ee6a1f171422c3b3a3036a2b Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 19:05:42 -0500 Subject: [PATCH 103/262] updated paramters --- .../similar_listeners/SimilarListenersController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java index 49bf6c4af..2f1bd587c 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java @@ -18,11 +18,9 @@ public SimilarListenersController(SimilarListenersInputBoundary similarListeners /** * Executes the Login Use Case. * @param accessToken the username of the user logging in - * @param followedArtists the list of artists this user follows. */ - public void execute(String accessToken, ArrayList followedArtists) { - final SimilarListenersInputData similarListenersInputData = new SimilarListenersInputData(accessToken, - followedArtists); + public void execute(String accessToken) { + final SimilarListenersInputData similarListenersInputData = new SimilarListenersInputData(accessToken); similarListenersInputBoundary.execute(similarListenersInputData); } From ab087aabe4acbdad32dfd2bbafdfc468c76608f9 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 19:05:54 -0500 Subject: [PATCH 104/262] created access object for testing --- .../SimilarListenersTestDataAccessObject.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/data_access/SimilarListenersTestDataAccessObject.java diff --git a/src/main/java/data_access/SimilarListenersTestDataAccessObject.java b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java new file mode 100644 index 000000000..0b82efca3 --- /dev/null +++ b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java @@ -0,0 +1,19 @@ +package data_access; + +import use_case.similar_listeners.SimilarListenersUserDataAccessInterface; + +import java.util.List; + +public class SimilarListenersTestDataAccessObject implements SimilarListenersUserDataAccessInterface { + + + @Override + public List getFollowedArtists() { + + } + + @Override + public void setCurrentFollowedArtists(List followedArtists) { + + } +} From f75d14b922650fbb0864868d71c05d2c876857f1 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 19:06:03 -0500 Subject: [PATCH 105/262] updated --- ...milarListenersUserDataAccessInterface.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java index 9f687cac5..7fd24c34e 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java @@ -2,32 +2,21 @@ import java.util.List; -import entity.User; - /** * DAO for SimilarListeners use case. */ public interface SimilarListenersUserDataAccessInterface { - /** - * Returns the user with the given username. - * @param username the username to look up - * @return the user with the given username - */ - User get(String username); - - /** - * Returns the access token of the curren user of the application. - * @return the access Token of the current user; null indicates that no one is logged into the application. - */ - String getCurrentAccessToken(); - /** * Return the artists that the current user follows. - * @return list of artists that this user follows. + * @return list of artists that this user follows. Return null if there are no followed artists. */ List getFollowedArtists(); + /** + * Sets the users followed artists. + * @param followedArtists is the list of artists names. + */ void setCurrentFollowedArtists(List followedArtists); From 95ccb268e1dc4eb61f809d3cd63593f2156272df Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Fri, 22 Nov 2024 19:52:39 -0500 Subject: [PATCH 106/262] tests for two methods --- .../SpotifyDataAccessObjectTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/java/data_access/SpotifyDataAccessObjectTest.java diff --git a/src/test/java/data_access/SpotifyDataAccessObjectTest.java b/src/test/java/data_access/SpotifyDataAccessObjectTest.java new file mode 100644 index 000000000..76bbfc3dd --- /dev/null +++ b/src/test/java/data_access/SpotifyDataAccessObjectTest.java @@ -0,0 +1,33 @@ +package data_access; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class SpotifyDataAccessObjectTest { + + @Test + void getCurrentTopTracks() { + List expected = new ArrayList(); + expected.add("Lovefool"); + expected.add("Надія є"); + SpotifyDataAccessObject dataAccessObject= new SpotifyDataAccessObject("BQDQP8XOnHL5-1B_9f7dvNJ1eN2Nj1rH6d4SZAjxfkZVZDHS-4R447KFvYGqFY4hhu2WgCscHg_egtYI-069ekDuy_MjFiIx9erWLJRYfg_mBaBwiN_DNfu9N9lUwXbz8OQ_WMnGtD5_GuCwC-b4CodFYQO3fGp1UKkkQbdyM_9qUStbGCnnxhr3IL_pDLJ8ny12eN9Pw5k1e1FjyZpLjjq7-xJV6TU"); + assertEquals(expected.get(0), dataAccessObject.getCurrentTopTracks().get(0)); + assertEquals(expected.get(1), dataAccessObject.getCurrentTopTracks().get(1)); + + } + + @Test + void getCurrentTopArtists() { + List expected = new ArrayList(); + expected.add("Mad Heads"); + expected.add("Haydamaky"); + expected.add("Kozak System"); + SpotifyDataAccessObject dataAccessObject= new SpotifyDataAccessObject("BQDQP8XOnHL5-1B_9f7dvNJ1eN2Nj1rH6d4SZAjxfkZVZDHS-4R447KFvYGqFY4hhu2WgCscHg_egtYI-069ekDuy_MjFiIx9erWLJRYfg_mBaBwiN_DNfu9N9lUwXbz8OQ_WMnGtD5_GuCwC-b4CodFYQO3fGp1UKkkQbdyM_9qUStbGCnnxhr3IL_pDLJ8ny12eN9Pw5k1e1FjyZpLjjq7-xJV6TU"); + assertEquals(expected, dataAccessObject.getCurrentTopArtists()); + } +} \ No newline at end of file From d342eecea4928e85ed0c161b2bf55cb649d36126 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sat, 23 Nov 2024 11:11:05 -0500 Subject: [PATCH 107/262] Updated recommend files, still need to get data from the spotify api to send to Azure for the recommendations --- .gitignore | 2 +- src/main/java/Constants.java | 2 +- src/main/java/app/AppBuilder.java | 33 +++++++++++----- src/main/java/app/Main.java | 8 ++-- .../InMemoryUserDataAccessObject.java | 13 ++++++- .../LanguageModelDataAccessObject.java | 39 +++++++++++++++++++ .../recommend/RecommendState.java | 14 ++++--- .../search/SearchPresenter.java | 6 +-- .../interface_adapter/search/SearchState.java | 2 +- .../recommend/RecommendInputData.java | 2 +- .../recommend/RecommendInteractor.java | 10 ++--- ...mmendLanguageModelDataAccessInterface.java | 4 +- .../recommend/RecommendOutputData.java | 8 ++-- .../RecommendSpotifyDataAccessInterface.java | 14 +++++++ src/main/java/view/LoggedInView.java | 19 +++++++++ src/main/java/view/RecommendationsView.java | 5 --- src/main/java/view/SearchView.java | 2 +- 17 files changed, 139 insertions(+), 44 deletions(-) create mode 100644 src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java diff --git a/.gitignore b/.gitignore index bc9333b15..e00dc3664 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ out/ .idea/ homework-5.iml -keys +src/keys target/ ### Eclipse ### diff --git a/src/main/java/Constants.java b/src/main/java/Constants.java index d1252d553..ce3a5c882 100644 --- a/src/main/java/Constants.java +++ b/src/main/java/Constants.java @@ -1,4 +1,4 @@ -package java; +package main.java; import java.awt.Dimension; import java.awt.Toolkit; diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index c849a386e..091f3cd46 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -5,6 +5,7 @@ import javax.swing.*; import data_access.InMemoryUserDataAccessObject; +import data_access.LanguageModelDataAccessObject; import data_access.TopItemsUserDataAccessObject; import entity.CommonUserFactory; import entity.UserFactory; @@ -33,7 +34,6 @@ import use_case.recommend.RecommendInputBoundary; import use_case.recommend.RecommendInteractor; import use_case.recommend.RecommendOutputBoundary; -import use_case.recommend.RecommendUserDataAccessInterface; import use_case.search.SearchInputBoundary; import use_case.search.SearchInteractor; import use_case.search.SearchOutputBoundary; @@ -68,7 +68,9 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); - private final RecommendUserDataAccessInterface recommendUserDataAccessInterface = new RecommendUserDataAccessInterface(); + private final LanguageModelDataAccessObject lmDataAccessObject = new LanguageModelDataAccessObject(); + // Change below file name to the DAO Ksenia will make, use it to get user listening history in song: artist format +// private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private LoginViewModel loginViewModel; @@ -82,7 +84,6 @@ public class AppBuilder { private TopItemsView topItemsView; private RecommendationsView recommendationsView; - public AppBuilder() { cardPanel.setLayout(cardLayout); } @@ -109,6 +110,17 @@ public AppBuilder addSearchView() { return this; } + /** + * Adds the Recommendation View to the application. + * @return this builder + */ + public AppBuilder addRecommendationsView() { + recommendViewModel = new RecommendViewModel(); + recommendationsView = new RecommendationsView(recommendViewModel); + cardPanel.add(recommendationsView, recommendationsView.getViewName()); + return this; + } + /** * Adds the LoggedIn View to the application. * @return this builder @@ -153,11 +165,13 @@ public AppBuilder addLoginUseCase() { public AppBuilder addRecommendUseCase() { final RecommendOutputBoundary recommendOutputBoundary = new RecommendPresenter(viewManagerModel, recommendViewModel); - final RecommendInputBoundary recommendInteractor = - new RecommendInteractor(recommendUserDataAccessInterface, recommendOutputBoundary); + final RecommendInputBoundary recommendInputBoundary = + new RecommendInteractor(lmDataAccessObject, recommendOutputBoundary); +// Use line 171 instead of 169 +// new RecommendInteractor(lmDataAccessObject, spotifyDataAccessObject, recommendOutputBoundary); - final RecommendController recommendController = new RecommendController(recommendInteractor); - recommendationsView.setRecommendController(recommendController); + final RecommendController recommendController = new RecommendController(recommendInputBoundary); + loggedInView.setRecommendController(recommendController); return this; } @@ -207,7 +221,8 @@ public AppBuilder addSearchUseCase() { loggedInView.setSearchController(searchController); return this; } - /** + + /** * Adds the Top Tracks and Artists Use Case to the application. * @return this builder */ @@ -236,7 +251,7 @@ public JFrame build() { application.add(cardPanel); - viewManagerModel.setState(recommendViewModel.getViewName()); + viewManagerModel.setState(loggedInViewModel.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 774d378ab..437e3cd52 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -1,8 +1,6 @@ package app; -import javax.swing.*; -import java.Constants; -import java.awt.*; +import javax.swing.JFrame; /** * The Main class of our application. @@ -18,9 +16,11 @@ public static void main(String[] args) { final JFrame application = appBuilder .addLoginView() .addLoginUseCase() + .addLoggedInView() + .addRecommendationsView() + .addRecommendUseCase() .addSearchView() .addTopTracksAndArtistsView() - .addLoggedInView() .addLogoutUseCase() .addSearchUseCase() .addTopTracksAndArtistsUseCase() diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index b9b3d4f24..4510c0bba 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -7,6 +7,7 @@ import entity.User; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; +import use_case.recommend.RecommendUserDataAccessInterface; import use_case.top_items.TopItemsUserDataAccessInterface; /** @@ -15,7 +16,8 @@ */ public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, - LogoutUserDataAccessInterface { + LogoutUserDataAccessInterface, + RecommendUserDataAccessInterface { private final Map users = new HashMap<>(); private String currentUsername; @@ -45,4 +47,13 @@ public String getCurrentAccessToken() { return this.currentUsername; } + @Override + public Map getSongRecommendations() { + return Map.of(); + } + + @Override + public void setSongRecommendations(Map songRecommendations) { + + } } diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index 24c5d833a..465f9c88e 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -6,7 +6,9 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.azure.ai.openai.OpenAIClient; import com.azure.ai.openai.OpenAIClientBuilder; @@ -33,6 +35,20 @@ public LanguageModelDataAccessObject() { accessToken = getKey(); } + // Used for testing LLM +// public static void main(String[] args) { +// final LanguageModelDataAccessObject lmdao = new LanguageModelDataAccessObject(); +// final Map songs = new HashMap<>(); +// songs.put("(sic)", "Slipknot"); +// songs.put("Left Behind", "Slipknot"); +// songs.put("Jumpdafuckup", "Soulfly"); +// songs.put("Roots Bloody Roots", "Sepultura"); +// songs.put("Dragula", "Rob Zombie"); +// songs.put("Spit It Out", "Slipknot"); +// System.out.println(lmdao.getRecommendations(songs)); +// +// } + /** * This is a helper method to get the Azure API key. * @return the access token stored in the local keys.txt file @@ -78,6 +94,29 @@ public String query(String prompt) { new ChatCompletionsOptions(chatMessages)); final int back = chatCompletions.getChoices().size() - 1; return chatCompletions.getChoices().get(back).getMessage().getContent(); + } + @Override + public String getRecommendations(Map history) { + final OpenAIClient client = new OpenAIClientBuilder() + .credential(new AzureKeyCredential(accessToken)) + .endpoint(endpoint) + .buildClient(); + final List chatMessages = new ArrayList<>(); + final List songList = new ArrayList<>(); + for (String s : history.keySet()) { + songList.add(history.get(s)); + songList.add(s); + } + chatMessages.add(new ChatRequestSystemMessage("You are a Spotify analyst, you will either send back a " + + "list of songs which are similar to a provided list.")); + chatMessages.add(new ChatRequestUserMessage("Can you help me find songs similar to " + songList + + "which is a list of songs where each song is followed by its artist name.")); + chatMessages.add(new ChatRequestUserMessage(String.valueOf(songList))); + + final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", + new ChatCompletionsOptions(chatMessages)); + final int back = chatCompletions.getChoices().size() - 1; + return chatCompletions.getChoices().get(back).getMessage().getContent(); } } diff --git a/src/main/java/interface_adapter/recommend/RecommendState.java b/src/main/java/interface_adapter/recommend/RecommendState.java index 6775740bd..5541492e9 100644 --- a/src/main/java/interface_adapter/recommend/RecommendState.java +++ b/src/main/java/interface_adapter/recommend/RecommendState.java @@ -1,13 +1,10 @@ package interface_adapter.recommend; -import java.util.HashMap; -import java.util.Map; - /** * The state for the Recommendation View Model. */ public class RecommendState { - private Map songRecommendations = new HashMap(); + private String songRecommendations; private String recommendationError; public RecommendState(RecommendState recommendState) { @@ -15,7 +12,12 @@ public RecommendState(RecommendState recommendState) { recommendationError = recommendState.recommendationError; } - public Map getSongRecommendations() { + // Because of the previous copy constructor, the default constructor must be explicit. + public RecommendState() { + + } + + public String getSongRecommendations() { return songRecommendations; } @@ -23,7 +25,7 @@ public String getRecommendationError() { return recommendationError; } - public void setSongRecommendations(Map songRecommendations) { + public void setSongRecommendations(String songRecommendations) { this.songRecommendations = songRecommendations; } diff --git a/src/main/java/interface_adapter/search/SearchPresenter.java b/src/main/java/interface_adapter/search/SearchPresenter.java index 8b8dd714d..31f41d9ba 100644 --- a/src/main/java/interface_adapter/search/SearchPresenter.java +++ b/src/main/java/interface_adapter/search/SearchPresenter.java @@ -1,14 +1,14 @@ package interface_adapter.search; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginViewModel; import use_case.search.SearchOutputBoundary; import use_case.search.SearchOutputData; import interface_adapter.ViewManagerModel; -import interface_adapter.change_password.LoggedInState; -import interface_adapter.change_password.LoggedInViewModel; +import interface_adapter.logged_in.LoggedInState; +import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginState; import interface_adapter.login.LoginViewModel; import use_case.logout.LogoutOutputBoundary; diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java index 34b9b7f2f..f08424f59 100644 --- a/src/main/java/interface_adapter/search/SearchState.java +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -1,6 +1,6 @@ package interface_adapter.search; -import interface_adapter.change_password.LoggedInState; +//import interface_adapter.change_password.LoggedInState; /** * The state for the SearchViewModel. diff --git a/src/main/java/use_case/recommend/RecommendInputData.java b/src/main/java/use_case/recommend/RecommendInputData.java index 5d0943a60..08b15b9a6 100644 --- a/src/main/java/use_case/recommend/RecommendInputData.java +++ b/src/main/java/use_case/recommend/RecommendInputData.java @@ -13,7 +13,7 @@ public RecommendInputData(Map songRecommendations) { this.songRecommendations = songRecommendations; } - public Map getRecommendations() { + public Map getListeningHistory() { return songRecommendations; } } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index 1ad8a4e06..b5737d0e6 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -6,10 +6,10 @@ * The Recommendations Interactor. */ public class RecommendInteractor implements RecommendInputBoundary { - private final RecommendUserDataAccessInterface recommendDataAccessObject; + private final RecommendLanguageModelDataAccessInterface recommendDataAccessObject; private final RecommendOutputBoundary recommendationOutputBoundary; - public RecommendInteractor(RecommendUserDataAccessInterface recommendDataAccessInterface, + public RecommendInteractor(RecommendLanguageModelDataAccessInterface recommendDataAccessInterface, RecommendOutputBoundary recommendOutputBoundary) { this.recommendDataAccessObject = recommendDataAccessInterface; this.recommendationOutputBoundary = recommendOutputBoundary; @@ -17,10 +17,10 @@ public RecommendInteractor(RecommendUserDataAccessInterface recommendDataAccessI @Override public void execute(RecommendInputData recommendInputData) { - final Map songRecommendations = recommendInputData.getRecommendations(); - recommendDataAccessObject.setSongRecommendations(songRecommendations); + final Map history = recommendInputData.getListeningHistory(); + final String songRecommendations = recommendDataAccessObject.getRecommendations(history); - final RecommendOutputData outputData = new RecommendOutputData(songRecommendations, false); + final RecommendOutputData outputData = new RecommendOutputData(songRecommendations); recommendationOutputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java index ea56994e8..e1d4bbe94 100644 --- a/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java @@ -1,5 +1,7 @@ package use_case.recommend; +import java.util.Map; + /** * The recommend DAO for accessing the Azure OpenAI api. */ @@ -9,5 +11,5 @@ public interface RecommendLanguageModelDataAccessInterface { * @param prompt is a string which the model will respond to * @return the model's response to that prompt */ - String query(String prompt); + String getRecommendations(Map prompt); } diff --git a/src/main/java/use_case/recommend/RecommendOutputData.java b/src/main/java/use_case/recommend/RecommendOutputData.java index 8fd08afb9..fc17217fb 100644 --- a/src/main/java/use_case/recommend/RecommendOutputData.java +++ b/src/main/java/use_case/recommend/RecommendOutputData.java @@ -6,15 +6,13 @@ * The output data for the Recommend Use Case. */ public class RecommendOutputData { - private final Map songRecommendations; - private final boolean useCaseFailed; + private final String songRecommendations; - public RecommendOutputData(Map songRecommendations, boolean useCaseFailed) { + public RecommendOutputData(String songRecommendations) { this.songRecommendations = songRecommendations; - this.useCaseFailed = useCaseFailed; } - public Map getSongRecommendations() { + public String getSongRecommendations() { return songRecommendations; } } diff --git a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java new file mode 100644 index 000000000..906216d61 --- /dev/null +++ b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java @@ -0,0 +1,14 @@ +package use_case.recommend; + +import java.util.List; + +/** + * The recommend DAO for accessing the Spotify api. + */ +public interface RecommendSpotifyDataAccessInterface { + /** + * Sends a query to the Spotify at the API endpoint. + * @return a list of songs that the user listened to most recently + */ + List getHistory(); +} diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 988245612..db3c7223b 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -4,7 +4,9 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.swing.BoxLayout; import javax.swing.JButton; @@ -15,6 +17,7 @@ import interface_adapter.logged_in.LoggedInState; import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.logout.LogoutController; +import interface_adapter.recommend.RecommendController; import interface_adapter.search.SearchController; import interface_adapter.top_items.TopItemsController; @@ -30,6 +33,7 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private LogoutController logoutController; private SearchController searchController; private TopItemsController topItemsController; + private RecommendController recommendController; private final JLabel username; private final JButton logOut; @@ -136,6 +140,16 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { } ); + recommendations.addActionListener( + evt -> { + if (evt.getSource().equals(recommendations)) { + // final String name = topTracksController + final Map songRecommendations = new HashMap<>(); + recommendController.execute(songRecommendations); + } + } + ); + this.add(title); this.add(usernameInfo); this.add(username); @@ -172,7 +186,12 @@ public void setLogoutController(LogoutController logoutController) { public void setSearchController(SearchController searchController) { this.searchController = searchController; } + public void setTopTracksController(TopItemsController topItemsController) { this.topItemsController = topItemsController; } + + public void setRecommendController(RecommendController recommendController) { + this.recommendController = recommendController; + } } diff --git a/src/main/java/view/RecommendationsView.java b/src/main/java/view/RecommendationsView.java index 455317ddb..98949d81c 100644 --- a/src/main/java/view/RecommendationsView.java +++ b/src/main/java/view/RecommendationsView.java @@ -1,11 +1,8 @@ package view; -import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Objects; -import javax.imageio.ImageIO; import javax.swing.*; import interface_adapter.recommend.RecommendController; @@ -43,9 +40,7 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { homeButtonPanel.add(homeButton); final JPanel songsPanel = new JPanel(); - final ImageIcon refreshImg = new ImageIcon(Objects.requireNonNull(getClass().getResource("images/refresh.png"))); refreshButton = new JButton("Refresh"); - refreshButton.setIcon(refreshImg); songsTextArea = new JTextArea(10, 30); songsTextArea.setText("TO DO: Get songs to show here"); final JScrollPane songsScrollPane = new JScrollPane(songsTextArea); diff --git a/src/main/java/view/SearchView.java b/src/main/java/view/SearchView.java index c4a0dbf15..90237dd34 100644 --- a/src/main/java/view/SearchView.java +++ b/src/main/java/view/SearchView.java @@ -1,6 +1,6 @@ package view; -import interface_adapter.change_password.LoggedInState; +//import interface_adapter.change_password.LoggedInState; import interface_adapter.login.LoginState; import interface_adapter.search.SearchController; import interface_adapter.search.SearchState; From a2550361e719606b6acca194b0ce2bbb61961d2b Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Sat, 23 Nov 2024 15:44:58 -0500 Subject: [PATCH 108/262] Completed the majority of the code for this use case, still need to access the spotify API --- src/main/java/app/AppBuilder.java | 8 ++--- .../data_access/SpotifyDataAccessObject.java | 33 +++++++++++++++++++ .../recommend/RecommendPresenter.java | 4 +-- .../recommend/RecommendState.java | 15 ++------- .../recommend/RecommendInteractor.java | 9 +++-- .../recommend/RecommendOutputData.java | 2 -- .../RecommendSpotifyDataAccessInterface.java | 6 ++-- src/main/java/view/RecommendationsView.java | 23 ++++++++----- 8 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 src/main/java/data_access/SpotifyDataAccessObject.java diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 091f3cd46..2679046cb 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -6,6 +6,7 @@ import data_access.InMemoryUserDataAccessObject; import data_access.LanguageModelDataAccessObject; +import data_access.SpotifyDataAccessObject; import data_access.TopItemsUserDataAccessObject; import entity.CommonUserFactory; import entity.UserFactory; @@ -69,8 +70,7 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final LanguageModelDataAccessObject lmDataAccessObject = new LanguageModelDataAccessObject(); - // Change below file name to the DAO Ksenia will make, use it to get user listening history in song: artist format -// private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private LoginViewModel loginViewModel; @@ -166,9 +166,7 @@ public AppBuilder addRecommendUseCase() { final RecommendOutputBoundary recommendOutputBoundary = new RecommendPresenter(viewManagerModel, recommendViewModel); final RecommendInputBoundary recommendInputBoundary = - new RecommendInteractor(lmDataAccessObject, recommendOutputBoundary); -// Use line 171 instead of 169 -// new RecommendInteractor(lmDataAccessObject, spotifyDataAccessObject, recommendOutputBoundary); + new RecommendInteractor(lmDataAccessObject, spotifyDataAccessObject, recommendOutputBoundary); final RecommendController recommendController = new RecommendController(recommendInputBoundary); loggedInView.setRecommendController(recommendController); diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java new file mode 100644 index 000000000..bb7216462 --- /dev/null +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -0,0 +1,33 @@ +package data_access; + +import java.util.HashMap; +import java.util.Map; + +import use_case.recommend.RecommendSpotifyDataAccessInterface; + +/** + * Test DAO for spotify + */ +public class SpotifyDataAccessObject implements RecommendSpotifyDataAccessInterface { + private Map songs; + + public SpotifyDataAccessObject() { + songs = new HashMap<>(); + songs.put("(sic)", "Slipknot"); + songs.put("Left Behind", "Slipknot"); + songs.put("Jumpdafuckup", "Soulfly"); + songs.put("Roots Bloody Roots", "Sepultura"); + songs.put("Dragula", "Rob Zombie"); + songs.put("Spit It Out", "Slipknot"); + } + + @Override + public Map getHistory() { + return songs; + } + + public static void main(String[] args) { + SpotifyDataAccessObject spotify = new SpotifyDataAccessObject(); + System.out.println(spotify.getHistory()); + } +} diff --git a/src/main/java/interface_adapter/recommend/RecommendPresenter.java b/src/main/java/interface_adapter/recommend/RecommendPresenter.java index 45fc76395..4be7268ce 100644 --- a/src/main/java/interface_adapter/recommend/RecommendPresenter.java +++ b/src/main/java/interface_adapter/recommend/RecommendPresenter.java @@ -30,8 +30,6 @@ public void prepareSuccessView(RecommendOutputData output) { @Override public void prepareFailView(String errorMessage) { - final RecommendState recommendState = recommendViewModel.getState(); - recommendState.setRecommendationError(errorMessage); - recommendViewModel.firePropertyChanged(); + // No need to add code here, as we assume there won't be an error } } diff --git a/src/main/java/interface_adapter/recommend/RecommendState.java b/src/main/java/interface_adapter/recommend/RecommendState.java index 5541492e9..bfa06be1c 100644 --- a/src/main/java/interface_adapter/recommend/RecommendState.java +++ b/src/main/java/interface_adapter/recommend/RecommendState.java @@ -5,11 +5,8 @@ */ public class RecommendState { private String songRecommendations; - private String recommendationError; public RecommendState(RecommendState recommendState) { - songRecommendations = recommendState.songRecommendations; - recommendationError = recommendState.recommendationError; } // Because of the previous copy constructor, the default constructor must be explicit. @@ -17,19 +14,11 @@ public RecommendState() { } - public String getSongRecommendations() { - return songRecommendations; - } - - public String getRecommendationError() { - return recommendationError; - } - public void setSongRecommendations(String songRecommendations) { this.songRecommendations = songRecommendations; } - public void setRecommendationError(String recommendationError) { - this.recommendationError = recommendationError; + public String getSongRecommendations() { + return songRecommendations; } } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index b5737d0e6..fe725926a 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -7,17 +7,22 @@ */ public class RecommendInteractor implements RecommendInputBoundary { private final RecommendLanguageModelDataAccessInterface recommendDataAccessObject; + private final RecommendSpotifyDataAccessInterface spotifyDataAccessObject; private final RecommendOutputBoundary recommendationOutputBoundary; public RecommendInteractor(RecommendLanguageModelDataAccessInterface recommendDataAccessInterface, - RecommendOutputBoundary recommendOutputBoundary) { + RecommendSpotifyDataAccessInterface spotifyDataAccessObject, + RecommendOutputBoundary recommendOutputBoundary) { this.recommendDataAccessObject = recommendDataAccessInterface; + this.spotifyDataAccessObject = spotifyDataAccessObject; this.recommendationOutputBoundary = recommendOutputBoundary; } @Override public void execute(RecommendInputData recommendInputData) { - final Map history = recommendInputData.getListeningHistory(); + // Calls Spotify API to get user data + final Map history = spotifyDataAccessObject.getHistory(); + // Takes user data and asks Azure for recommendations final String songRecommendations = recommendDataAccessObject.getRecommendations(history); final RecommendOutputData outputData = new RecommendOutputData(songRecommendations); diff --git a/src/main/java/use_case/recommend/RecommendOutputData.java b/src/main/java/use_case/recommend/RecommendOutputData.java index fc17217fb..9052c4a3d 100644 --- a/src/main/java/use_case/recommend/RecommendOutputData.java +++ b/src/main/java/use_case/recommend/RecommendOutputData.java @@ -1,7 +1,5 @@ package use_case.recommend; -import java.util.Map; - /** * The output data for the Recommend Use Case. */ diff --git a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java index 906216d61..14faeecdd 100644 --- a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java @@ -1,6 +1,6 @@ package use_case.recommend; -import java.util.List; +import java.util.Map; /** * The recommend DAO for accessing the Spotify api. @@ -8,7 +8,7 @@ public interface RecommendSpotifyDataAccessInterface { /** * Sends a query to the Spotify at the API endpoint. - * @return a list of songs that the user listened to most recently + * @return a map of songs that the user listened to most recently */ - List getHistory(); + Map getHistory(); } diff --git a/src/main/java/view/RecommendationsView.java b/src/main/java/view/RecommendationsView.java index 98949d81c..dde82f9a8 100644 --- a/src/main/java/view/RecommendationsView.java +++ b/src/main/java/view/RecommendationsView.java @@ -3,7 +3,12 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import javax.swing.*; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; import interface_adapter.recommend.RecommendController; import interface_adapter.recommend.RecommendState; @@ -24,7 +29,7 @@ public class RecommendationsView extends JPanel implements PropertyChangeListene public RecommendationsView(RecommendViewModel recommendViewModel) { this.recommendViewModel = recommendViewModel; -// this.recommendViewModel.addPropertyChangeListener(this); + this.recommendViewModel.addPropertyChangeListener(this); final JLabel title = new JLabel("Recommendations"); final JPanel titlePanel = new JPanel(); @@ -41,7 +46,7 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { final JPanel songsPanel = new JPanel(); refreshButton = new JButton("Refresh"); - songsTextArea = new JTextArea(10, 30); + songsTextArea = new JTextArea(); songsTextArea.setText("TO DO: Get songs to show here"); final JScrollPane songsScrollPane = new JScrollPane(songsTextArea); songsPanel.add(songsScrollPane); @@ -72,10 +77,12 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { @Override public void propertyChange(PropertyChangeEvent evt) { - if (evt.getPropertyName().equals("state")) { - final RecommendState state = (RecommendState) evt.getNewValue(); -// username.setText(state.getUsername()); - } + final RecommendState state = (RecommendState) evt.getNewValue(); + setFields(state); + } + + private void setFields(RecommendState state) { + songsTextArea.setText(state.getSongRecommendations()); } public String getViewName() { @@ -87,6 +94,6 @@ public void setRecommendController(RecommendController recommendController) { } public String getArtist() { - return "Slipkot"; + return "INSERT ARTIST"; } } From b992ddc53704f468e945bc6882a39456e9a2c36f Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 15:58:24 -0500 Subject: [PATCH 109/262] added java doc --- .../data_access/SpotifyDataAccessObject.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 01aeb6a0e..30d2a0416 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -20,6 +20,9 @@ import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; import use_case.top_items.TopItemsUserDataAccessInterface; +/** + * DAO for getting relevant information from Spotify API. + */ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface { private LoginState loginState = new LoginState(); @@ -29,8 +32,21 @@ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface private GetUsersTopTracksRequest getTopTracksRequest; private GetUsersTopArtistsRequest getTopArtistsRequest; + public SpotifyDataAccessObject() { + this.accessToken = loginState.getLoginToken(); + //this.accessToken = accessToken; + this.currentUser = new CommonUser(accessToken); + this.spotifyApi = new SpotifyApi.Builder() + .setAccessToken(accessToken) + .build(); + this.getTopTracksRequest = spotifyApi.getUsersTopTracks() + .build(); + this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() + .build(); + } + + // Constructor used for testing. public SpotifyDataAccessObject(String accessToken) { - //this.accessToken = loginState.getLoginToken(); this.accessToken = accessToken; this.currentUser = new CommonUser(accessToken); this.spotifyApi = new SpotifyApi.Builder() @@ -117,7 +133,7 @@ public void setCurrentTime(List time) { } public static void main(String[] args) { - SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQCOFgyHIg-eAjqOM8ITkCEynoZwEoN2__Sccimaakn2rZjBzIBTwSVK391IUAD7umWe6vvEE9MiiqvN6j1jFySdxecxQL0gS1Tt2y3DAlrt6c6XlfD6jEQJPiNqyOHueQr9ZQe4Um0A6Bz2cbKvzi-fW1MQG19K2rmT_Z0rLFQY-p3S9ssF-5213Ol_hAvpB0kORgMoazMdzPYe6A"); + SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQDQP8XOnHL5-1B_9f7dvNJ1eN2Nj1rH6d4SZAjxfkZVZDHS-4R447KFvYGqFY4hhu2WgCscHg_egtYI-069ekDuy_MjFiIx9erWLJRYfg_mBaBwiN_DNfu9N9lUwXbz8OQ_WMnGtD5_GuCwC-b4CodFYQO3fGp1UKkkQbdyM_9qUStbGCnnxhr3IL_pDLJ8ny12eN9Pw5k1e1FjyZpLjjq7-xJV6TU"); spotifyDataAccessObject.getUsersTopTracksSync(); spotifyDataAccessObject.getUsersTopArtistsSync(); From b3ebccbab2e45c729e715cd7284a1c427a501ed0 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 16:01:08 -0500 Subject: [PATCH 110/262] added java doc --- src/main/java/data_access/SpotifyDataAccessObject.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 30d2a0416..f499e017a 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -34,7 +34,6 @@ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface public SpotifyDataAccessObject() { this.accessToken = loginState.getLoginToken(); - //this.accessToken = accessToken; this.currentUser = new CommonUser(accessToken); this.spotifyApi = new SpotifyApi.Builder() .setAccessToken(accessToken) @@ -82,6 +81,10 @@ private List getUsersTopTracksSync() { } } + /** + * A helper method to get the current users top artists. + * @return a list of the artist names. + */ private List getUsersTopArtistsSync() { try { // Using Spotify Wrapper to get the given users top artists from API From 70d674767c67c237c6389b7c0ee506a2de145f17 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 17:29:53 -0500 Subject: [PATCH 111/262] added success test --- .../SimilarListenersInteractorTest.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java index c9af40cc6..8be9787c4 100644 --- a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java +++ b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java @@ -1,11 +1,14 @@ package use_case.similar_listeners; import data_access.InMemoryUserDataAccessObject; +import data_access.SimilarListenersTestDataAccessObject; import entity.CommonUserFactory; import entity.User; import entity.UserFactory; import org.junit.jupiter.api.Test; -import use_case.logout.*; + +import java.util.ArrayList; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -13,21 +16,25 @@ public class SimilarListenersInteractorTest { @Test void successTest() { - SimilarListenersInputData inputData = new SimilarListenersInputData("BQCOFgyHIg-eAjqOM8ITkCEynoZwEoN2__Sccimaakn2rZjBzIBTwSVK391IUAD7umWe6vvEE9MiiqvN6j1jFySdxecxQL0gS1Tt2y3DAlrt6c6XlfD6jEQJPiNqyOHueQr9ZQe4Um0A6Bz2cbKvzi-fW1MQG19K2rmT_Z0rLFQY-p3S9ssF-5213Ol_hAvpB0kORgMoazMdzPYe6A"); - InMemoryUserDataAccessObject userRepository = new InMemoryUserDataAccessObject(); + SimilarListenersInputData inputData = new SimilarListenersInputData("token"); + SimilarListenersTestDataAccessObject accessObject = new SimilarListenersTestDataAccessObject(); // For the success test, we need to add Paul to the data access repository before we log in. - UserFactory factory = new CommonUserFactory(); - User user = factory.create("Paul", "password"); - userRepository.save(user); - userRepository.setCurrentUsername("Paul"); + List allfollowedArtists = new ArrayList<>(); + allfollowedArtists.add("Michael Jackson"); + allfollowedArtists.add("Drake"); + allfollowedArtists.add("Madonna"); + allfollowedArtists.add("Lady Gaga"); + allfollowedArtists.add("The Police"); + accessObject.setCurrentFollowedArtists(allfollowedArtists); // This creates a successPresenter that tests whether the test case is as we expect. - LogoutOutputBoundary successPresenter = new LogoutOutputBoundary() { + SimilarListenersOutputBoundary successPresenter = new SimilarListenersOutputBoundary() { @Override - public void prepareSuccessView(LogoutOutputData user) { + public void prepareSuccessView(SimilarListenersOutputData outputData) { // check that the output data contains the username of who logged out - assertEquals("Paul", user.getUsername()); + assertEquals(allfollowedArtists, outputData.getSimilarArtists()); + assertEquals("Madonna", outputData.getSimilarArtists().get(2)); } @Override @@ -36,10 +43,8 @@ public void prepareFailView(String error) { } }; - LogoutInputBoundary interactor = new LogoutInteractor(userRepository, successPresenter); + SimilarListenersInputBoundary interactor = new SimilarListenersInteractor(accessObject, successPresenter); interactor.execute(inputData); - // check that the user was logged out - assertNull(userRepository.getCurrentUsername()); } } From e655754c2064851aceb5a01c69c4d4a1a74d5d3c Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 17:30:10 -0500 Subject: [PATCH 112/262] created access object for testing --- .../data_access/SimilarListenersTestDataAccessObject.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/data_access/SimilarListenersTestDataAccessObject.java b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java index 0b82efca3..bb378498e 100644 --- a/src/main/java/data_access/SimilarListenersTestDataAccessObject.java +++ b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java @@ -6,14 +6,16 @@ public class SimilarListenersTestDataAccessObject implements SimilarListenersUserDataAccessInterface { + private List followedArtists; @Override public List getFollowedArtists() { - + return this.followedArtists; } @Override - public void setCurrentFollowedArtists(List followedArtists) { + public void setCurrentFollowedArtists(List artists) { + this.followedArtists = artists; } } From fc3d30fc0500ed876ce53fb80c04cdf881629050 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 17:56:40 -0500 Subject: [PATCH 113/262] updated execute method --- .../SimilarListenersInteractorTest.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java index 8be9787c4..9e92ff645 100644 --- a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java +++ b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java @@ -17,7 +17,7 @@ public class SimilarListenersInteractorTest { @Test void successTest() { SimilarListenersInputData inputData = new SimilarListenersInputData("token"); - SimilarListenersTestDataAccessObject accessObject = new SimilarListenersTestDataAccessObject(); + SimilarListenersUserDataAccessInterface accessObject = new SimilarListenersTestDataAccessObject(); // For the success test, we need to add Paul to the data access repository before we log in. List allfollowedArtists = new ArrayList<>(); @@ -47,4 +47,30 @@ public void prepareFailView(String error) { interactor.execute(inputData); } + @Test + void failTest() { + SimilarListenersInputData inputData = new SimilarListenersInputData("token"); + SimilarListenersUserDataAccessInterface accessObject = new SimilarListenersTestDataAccessObject(); + + List allfollowedArtists = new ArrayList<>(); + accessObject.setCurrentFollowedArtists(allfollowedArtists); + + SimilarListenersOutputBoundary successPresenter = new SimilarListenersOutputBoundary() { + @Override + public void prepareSuccessView(SimilarListenersOutputData outputData) { + // check that the output data contains the username of who logged out + fail("Use case success is unexpected."); + } + + @Override + public void prepareFailView(String error) { + assertEquals("You do not follow any artists. " + + "Similar Listeners cannot be determined.", error); + } + }; + SimilarListenersInputBoundary interactor = new SimilarListenersInteractor(accessObject, successPresenter); + interactor.execute(inputData); + + } + } From 7f50bf63c5cd2e7211aa4327c6c93e2ec52fc2a7 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 17:57:05 -0500 Subject: [PATCH 114/262] updated javadoc for getFollowedArtists method --- .../SimilarListenersUserDataAccessInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java index 7fd24c34e..bdcd3ff38 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java @@ -9,7 +9,7 @@ public interface SimilarListenersUserDataAccessInterface { /** * Return the artists that the current user follows. - * @return list of artists that this user follows. Return null if there are no followed artists. + * @return list of artists that this user follows. Return an empty list if there are no followed artists. */ List getFollowedArtists(); From 9b59c1a2f0d82b85cf2df7af3d3ed3ee2bc28aeb Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 18:06:43 -0500 Subject: [PATCH 115/262] fixed checkStyle --- .../SimilarListenersUserDataAccessInterface.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java index bdcd3ff38..f4cfefc81 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java @@ -19,5 +19,4 @@ public interface SimilarListenersUserDataAccessInterface { */ void setCurrentFollowedArtists(List followedArtists); - } From d8d112ef9a44daa66847d9b06a347b8def5e0626 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 18:25:04 -0500 Subject: [PATCH 116/262] updated --- .../java/data_access/SpotifyDataAccessObject.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index f499e017a..95da69612 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -66,9 +66,9 @@ private List getUsersTopTracksSync() { // Using Spotify Wrapper to get the given users top tracks from API final Paging trackPaging = getTopTracksRequest.execute(); - Track[] tracks = trackPaging.getItems(); + final Track[] tracks = trackPaging.getItems(); - List topTracks = new ArrayList(); + final List topTracks = new ArrayList(); for (Track track : tracks) { topTracks.add(track.getName()); } @@ -90,9 +90,9 @@ private List getUsersTopArtistsSync() { // Using Spotify Wrapper to get the given users top artists from API final Paging artistPaging = getTopArtistsRequest.execute(); - Artist[] artists = artistPaging.getItems(); + final Artist[] artists = artistPaging.getItems(); - List topArtists = new ArrayList(); + final List topArtists = new ArrayList(); for (Artist artist : artists) { topArtists.add(artist.getName()); } @@ -135,12 +135,5 @@ public void setCurrentTime(List time) { } - public static void main(String[] args) { - SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQDQP8XOnHL5-1B_9f7dvNJ1eN2Nj1rH6d4SZAjxfkZVZDHS-4R447KFvYGqFY4hhu2WgCscHg_egtYI-069ekDuy_MjFiIx9erWLJRYfg_mBaBwiN_DNfu9N9lUwXbz8OQ_WMnGtD5_GuCwC-b4CodFYQO3fGp1UKkkQbdyM_9qUStbGCnnxhr3IL_pDLJ8ny12eN9Pw5k1e1FjyZpLjjq7-xJV6TU"); - spotifyDataAccessObject.getUsersTopTracksSync(); - spotifyDataAccessObject.getUsersTopArtistsSync(); - - } - } From 22dcecfae02539bd662762bc58dbaab86cf4c8c0 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 18:59:56 -0500 Subject: [PATCH 117/262] updated --- src/main/java/data_access/SpotifyDataAccessObject.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 95da69612..e626a6ef6 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -39,8 +39,10 @@ public SpotifyDataAccessObject() { .setAccessToken(accessToken) .build(); this.getTopTracksRequest = spotifyApi.getUsersTopTracks() + .time_range("short_term") .build(); this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() + .time_range("short_term") .build(); } From 64afe2c6cad89035b4b52272988eea8868c0ae68 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 19:08:03 -0500 Subject: [PATCH 118/262] added constant --- src/main/java/data_access/SpotifyDataAccessObject.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index e626a6ef6..d0bea3f7f 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -24,6 +24,7 @@ * DAO for getting relevant information from Spotify API. */ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface { + public static final int OFFSET = 4; private LoginState loginState = new LoginState(); private String accessToken; @@ -39,9 +40,11 @@ public SpotifyDataAccessObject() { .setAccessToken(accessToken) .build(); this.getTopTracksRequest = spotifyApi.getUsersTopTracks() + .offset(OFFSET) .time_range("short_term") .build(); this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() + .offset(OFFSET) .time_range("short_term") .build(); } From 1e0d6f373b7db25993c1730cd18c05916f272b30 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Sat, 23 Nov 2024 19:09:18 -0500 Subject: [PATCH 119/262] Removed the time variable from the TopItems implementation. --- .../data_access/TopItemsUserDataAccessObject.java | 10 ---------- .../top_items/TopItemsController.java | 2 +- .../java/use_case/top_items/TopItemsInputData.java | 8 +------- .../use_case/top_items/TopItemsInteractor.java | 4 +--- .../use_case/top_items/TopItemsOutputData.java | 8 +------- .../top_items/TopItemsUserDataAccessInterface.java | 14 -------------- 6 files changed, 4 insertions(+), 42 deletions(-) diff --git a/src/main/java/data_access/TopItemsUserDataAccessObject.java b/src/main/java/data_access/TopItemsUserDataAccessObject.java index dbac4de50..ba6d38e58 100644 --- a/src/main/java/data_access/TopItemsUserDataAccessObject.java +++ b/src/main/java/data_access/TopItemsUserDataAccessObject.java @@ -25,14 +25,4 @@ public List getCurrentTopArtists() { public void setCurrentTopArtists(List artists) { } - - @Override - public List getCurrentTime() { - return List.of(); - } - - @Override - public void setCurrentTime(List time) { - - } } diff --git a/src/main/java/interface_adapter/top_items/TopItemsController.java b/src/main/java/interface_adapter/top_items/TopItemsController.java index 66ddca3de..7aaa3dae7 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsController.java +++ b/src/main/java/interface_adapter/top_items/TopItemsController.java @@ -24,7 +24,7 @@ public TopItemsController(TopItemsInputBoundary topItemsInputBoundary) { public void execute(List toptracks, List topartists, List time) { // 1. instantiate the `LogoutInputData`, which should contain the username. // 2. tell the Interactor to execute. - final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, topartists, time); + final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, topartists); topItemsInputBoundary.execute(topItemsInputData); } } diff --git a/src/main/java/use_case/top_items/TopItemsInputData.java b/src/main/java/use_case/top_items/TopItemsInputData.java index 79dceff2e..fc897afa3 100644 --- a/src/main/java/use_case/top_items/TopItemsInputData.java +++ b/src/main/java/use_case/top_items/TopItemsInputData.java @@ -8,13 +8,11 @@ public class TopItemsInputData { private final List tracks; - private final List time; private final List artists; - public TopItemsInputData(List tracks, List artists, List time) { + public TopItemsInputData(List tracks, List artists) { this.tracks = tracks; this.artists = artists; - this.time = time; } List getTracks() { @@ -24,8 +22,4 @@ List getTracks() { List getArtists() { return artists; } - - List getTime() { - return time; - } } diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index 61af71552..f4132a8cb 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -20,11 +20,9 @@ public TopItemsInteractor(TopItemsUserDataAccessInterface userDataAccessObject, public void execute(TopItemsInputData topItemsInputData) { final List topTracks = topItemsInputData.getTracks(); final List topArtists = topItemsInputData.getArtists(); - final List time = topItemsInputData.getTime(); userDataAccessObject.setCurrentTopTracks(topTracks); - userDataAccessObject.setCurrentTime(time); - final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, time, false); + final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, false); topItemsOutputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/use_case/top_items/TopItemsOutputData.java b/src/main/java/use_case/top_items/TopItemsOutputData.java index 7e579e9a6..a9f74dd9c 100644 --- a/src/main/java/use_case/top_items/TopItemsOutputData.java +++ b/src/main/java/use_case/top_items/TopItemsOutputData.java @@ -5,14 +5,12 @@ public class TopItemsOutputData { private final List tracks; - private final List time; private final List artists; private final boolean useCaseFailed; - public TopItemsOutputData(List tracks, List artists, List time, boolean useCaseFailed) { + public TopItemsOutputData(List tracks, List artists, boolean useCaseFailed) { this.tracks = tracks; this.artists = artists; - this.time = time; this.useCaseFailed = useCaseFailed; } @@ -20,10 +18,6 @@ public List getTracks() { return tracks; } - public List getTime() { - return time; - } - public List getArtists() { return artists; } diff --git a/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java b/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java index f9d5ad7c1..af6898afb 100644 --- a/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java +++ b/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java @@ -30,18 +30,4 @@ public interface TopItemsUserDataAccessInterface { * @param artists the new top artist list; null to indicate that there is no top tracks. */ void setCurrentTopArtists(List artists); - - - /** - * Returns the top track List of the current user of the application. - * @return the access Token of the current user; null indicates that no one is logged into the application. - */ - List getCurrentTime(); - - /** - * Sets the top tracks list indicating who is the current user of the application. - * @param time the new top track list; null to indicate that no one is currently logged into the - * application. - */ - void setCurrentTime(List time); } From fdcf5b37426d3372171d4edff8cfe10989474d18 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sat, 23 Nov 2024 19:17:21 -0500 Subject: [PATCH 120/262] updated constructor --- src/main/java/data_access/SpotifyDataAccessObject.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index d0bea3f7f..5446c1f6c 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -57,8 +57,12 @@ public SpotifyDataAccessObject(String accessToken) { .setAccessToken(accessToken) .build(); this.getTopTracksRequest = spotifyApi.getUsersTopTracks() + .offset(OFFSET) + .time_range("short_term") .build(); this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() + .offset(OFFSET) + .time_range("short_term") .build(); } From 531386bb91a347061077f79d1a5fc88647d096e2 Mon Sep 17 00:00:00 2001 From: eulogizee Date: Sat, 23 Nov 2024 19:39:33 -0500 Subject: [PATCH 121/262] imported ActionListener and ActionEvent class --- .idea/checkstyle-idea.xml | 6 ++---- src/main/java/view/LoggedInView.java | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml index aa01ae2cb..63b2cb7c6 100644 --- a/.idea/checkstyle-idea.xml +++ b/.idea/checkstyle-idea.xml @@ -1,12 +1,10 @@ - 10.18.0 + 10.18.1 JavaOnly +

  • -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%0DmE(CjawVD*mFT{uf^w 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

    l1pY*b6)Gb?`try40d`W+#fx{s$@ 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ⅆN6UFX0_5N-<70P7R~scvL(#qv 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

    BTrM8zv{N#K=8OcqeCgw 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�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

    dHmKLOJKTqdGO&jIC*z$Py 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

    (t&s&O)q-dL4H*@M>6_hL4bl7-!B8IQnS68# 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 z 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 Wb5{K7Hi8EHdG Date: Mon, 25 Nov 2024 14:43:23 -0500 Subject: [PATCH 159/262] added action listener for similarListeners button --- src/main/java/view/LoggedInView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index ec5c7e4e2..54cf43f58 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -20,6 +20,7 @@ import interface_adapter.search.SearchController; import interface_adapter.similar_listeners.SimilarListenersController; +import interface_adapter.similar_listeners.SimilarListenersViewModel; import interface_adapter.top_items.TopItemsController; @@ -154,9 +155,9 @@ public void actionPerformed(ActionEvent e) { similarListeners.addActionListener( evt -> { if (evt.getSource().equals(similarListeners)) { - final List lst = new ArrayList<>(); final String accessToken = loggedInViewModel.getState().getUsername(); similarListenersController.execute(accessToken); + } } ); From 7a9cf6df86d4e23d1e164510e094a2aa981a929d Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 25 Nov 2024 14:45:27 -0500 Subject: [PATCH 160/262] added instance variable for spotifyAccessObject --- src/main/java/app/AppBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 12a342afd..1318927b6 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -5,6 +5,7 @@ import javax.swing.*; import data_access.InMemoryUserDataAccessObject; +import data_access.SpotifyDataAccessObject; import data_access.TopItemsUserDataAccessObject; import entity.CommonUserFactory; import entity.UserFactory; @@ -63,6 +64,7 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); // Will remove since our project does not cover signing up, only logging in // private SignupView signupView; From 7a832572ec0d95233bed32ef2e80057b6322131e Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 25 Nov 2024 14:51:01 -0500 Subject: [PATCH 161/262] added method for recommendations --- .../data_access/SpotifyDataAccessObject.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 03c79f58b..32c12da54 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -14,10 +14,8 @@ import se.michaelthelin.spotify.SpotifyApi; import se.michaelthelin.spotify.enums.ModelObjectType; import se.michaelthelin.spotify.exceptions.SpotifyWebApiException; -import se.michaelthelin.spotify.model_objects.specification.Artist; -import se.michaelthelin.spotify.model_objects.specification.Paging; -import se.michaelthelin.spotify.model_objects.specification.PagingCursorbased; -import se.michaelthelin.spotify.model_objects.specification.Track; +import se.michaelthelin.spotify.model_objects.specification.*; +import se.michaelthelin.spotify.requests.data.browse.GetRecommendationsRequest; import se.michaelthelin.spotify.requests.data.follow.GetUsersFollowedArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; @@ -43,6 +41,8 @@ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, private static final ModelObjectType type = ModelObjectType.ARTIST; private List currFollowedArtists; + private GetRecommendationsRequest getRecommendationsRequest; + public SpotifyDataAccessObject() { this.accessToken = loginState.getLoginToken(); this.spotifyApi = new SpotifyApi.Builder() @@ -61,6 +61,9 @@ public SpotifyDataAccessObject() { this.getUsersFollowedArtistsRequest = spotifyApi.getUsersFollowedArtists(type).build(); this.currFollowedArtists = getUsersFollowedArtistsSync(); + + this.getRecommendationsRequest = spotifyApi.getRecommendations() + .build(); } // Constructor used for testing. @@ -148,6 +151,19 @@ private List getUsersFollowedArtistsSync() { } } + /** + * A helper method to get the current users recommendations from spotify. + */ + private void getRecommendationsSync() { + try { + final Recommendations recommendations = getRecommendationsRequest.execute(); + + System.out.println("Length: " + recommendations.getTracks().length); + } catch (IOException | SpotifyWebApiException | ParseException e) { + System.out.println("Error: " + e.getMessage()); + } + } + @Override public List getCurrentTopTracks() { return this.currentTopTracks; From 3771891e562c924f654f7f17dba89ee673011642 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Mon, 25 Nov 2024 14:57:07 -0500 Subject: [PATCH 162/262] added instance variable for spotify access object --- src/main/java/app/AppBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 97311dbfd..e76faa6eb 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -6,6 +6,7 @@ import data_access.InMemoryUserDataAccessObject; import data_access.LanguageModelDataAccessObject; +import data_access.SpotifyDataAccessObject; import data_access.TopItemsUserDataAccessObject; import entity.CommonUserFactory; import entity.UserFactory; @@ -66,6 +67,7 @@ public class AppBuilder { private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); // Will remove since our project does not cover signing up, only logging in private LoginViewModel loginViewModel; From f9286e3767a855b91a840c0ba129d420859f285d Mon Sep 17 00:00:00 2001 From: eulogizee Date: Mon, 25 Nov 2024 14:58:09 -0500 Subject: [PATCH 163/262] added a folder spotify_api and a file SpotifyService.java --- src/main/java/spotify_api/SpotifyService.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/main/java/spotify_api/SpotifyService.java diff --git a/src/main/java/spotify_api/SpotifyService.java b/src/main/java/spotify_api/SpotifyService.java new file mode 100644 index 000000000..cbe9779b0 --- /dev/null +++ b/src/main/java/spotify_api/SpotifyService.java @@ -0,0 +1,57 @@ +package spotify_api; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import okhttp3.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class SpotifyService { + private static final String SEARCH_URL = "https://api.spotify.com/v1/search"; + private final String accessToken; + + public SpotifyService(String accessToken) { + if (accessToken == null || accessToken.isEmpty()) { + throw new IllegalArgumentException("Access token cannot be null or empty."); + } + this.accessToken = accessToken; + } + + public List searchSongs(String artistName, String keyword) { + OkHttpClient client = new OkHttpClient(); + + // Build the search query URL + HttpUrl url = HttpUrl.parse(SEARCH_URL).newBuilder() + .addQueryParameter("q", "artist:" + artistName + " " + keyword) // Combine artist and keyword + .addQueryParameter("type", "track") + .build(); + + // Prepare the API request + Request request = new Request.Builder() + .url(url) + .addHeader("Authorization", "Bearer " + accessToken) // Use the provided access token + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful() && response.body() != null) { + JsonObject jsonObject = JsonParser.parseString(response.body().string()).getAsJsonObject(); + List songs = new ArrayList<>(); + + // Extract tracks from the response + jsonObject.getAsJsonObject("tracks").getAsJsonArray("items").forEach(track -> { + String songName = track.getAsJsonObject().get("name").getAsString(); + songs.add(songName); // Add the track name to the list + }); + + return songs; + } else { + throw new RuntimeException("Failed to search songs: " + response.message()); + } + } catch (IOException e) { + throw new RuntimeException("Error searching songs", e); + } + } +} \ No newline at end of file From a94ed0e1ef3a77d914caf8ed082e03799fce5967 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:08:10 -0500 Subject: [PATCH 164/262] Update LoggedInView.java, the actionlistener of keyword --- src/main/java/view/LoggedInView.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index d80fd57e7..1797162de 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -171,15 +171,23 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { ); // Add an ActionListener to open the Keyword window - keyword.addActionListener(new ActionListener() { + keyword.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - // Create and show the Keyword window - Keyword keywordWindow = new Keyword(); + // Initialize the required components + KeywordViewModel viewModel = new KeywordViewModel(); // Create a new ViewModel + KeywordPresenter presenter = new KeywordPresenter(viewModel); // Create a presenter + SpotifyService spotifyService = new SpotifyService("ACCESS_TOKEN_HERE"); // Replace with your access token + KeywordInteractor interactor = new KeywordInteractor(spotifyService, presenter); // Initialize interactor + KeywordController controller = new KeywordController(interactor, viewModel); // Initialize controller + + // Create and show the KeywordView with required dependencies + KeywordView keywordWindow = new KeywordView(controller, viewModel); keywordWindow.show(); } }); +// Add components to the panel this.add(title); this.add(usernameInfo); this.add(username); From 099cf073eeaa90562149018d69343ff11dc84adc Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:10:28 -0500 Subject: [PATCH 165/262] Update and rename spotify_api.java to SpotifyService.java --- .../java/data_access/{spotify_api.java => SpotifyService.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/data_access/{spotify_api.java => SpotifyService.java} (99%) diff --git a/src/main/java/data_access/spotify_api.java b/src/main/java/data_access/SpotifyService.java similarity index 99% rename from src/main/java/data_access/spotify_api.java rename to src/main/java/data_access/SpotifyService.java index ba3826fa8..12a707b53 100644 --- a/src/main/java/data_access/spotify_api.java +++ b/src/main/java/data_access/SpotifyService.java @@ -1,4 +1,4 @@ -package spotify_api; +package data_access; import com.google.gson.JsonObject; import com.google.gson.JsonParser; From 87f66c224b0c12e5a447ba462fc888aaaee7954e Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:11:37 -0500 Subject: [PATCH 166/262] Update LoggedInView.java, made the right import statement --- src/main/java/view/LoggedInView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 1797162de..05b7fa327 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -19,7 +19,7 @@ import interface_adapter.search.SearchController; import interface_adapter.top_items.TopItemsController; -import spotify_api.SpotifyService; +import data_access.SpotifyService; import use_case.keyword.KeywordInteractor; import use_case.keyword.KeywordUserDataAccessObject; import use_case.login.LoginInputData; From b9dcbf4a180da9bdb27025f2de195bf4f66db22c Mon Sep 17 00:00:00 2001 From: eulogizee Date: Mon, 25 Nov 2024 18:20:58 -0500 Subject: [PATCH 167/262] Fixed issues from previous merge --- src/main/java/spotify_api.java | 57 ------------------- .../use_case/keyword/KeywordInteractor.java | 6 +- src/main/java/view/KeywordView.java | 11 ++-- src/main/java/view/LoggedInView.java | 16 +++--- 4 files changed, 15 insertions(+), 75 deletions(-) delete mode 100644 src/main/java/spotify_api.java diff --git a/src/main/java/spotify_api.java b/src/main/java/spotify_api.java deleted file mode 100644 index ba3826fa8..000000000 --- a/src/main/java/spotify_api.java +++ /dev/null @@ -1,57 +0,0 @@ -package spotify_api; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import okhttp3.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class SpotifyService { - private static final String SEARCH_URL = "https://api.spotify.com/v1/search"; - private final String accessToken; - - public SpotifyService(String accessToken) { - if (accessToken == null || accessToken.isEmpty()) { - throw new IllegalArgumentException("Access token cannot be null or empty."); - } - this.accessToken = accessToken; - } - - public List searchSongs(String artistName, String keyword) { - OkHttpClient client = new OkHttpClient(); - - // Build the search query URL - HttpUrl url = HttpUrl.parse(SEARCH_URL).newBuilder() - .addQueryParameter("q", "artist:" + artistName + " " + keyword) // Combine artist and keyword - .addQueryParameter("type", "track") - .build(); - - // Prepare the API request - Request request = new Request.Builder() - .url(url) - .addHeader("Authorization", "Bearer " + accessToken) // Use the provided access token - .get() - .build(); - - try (Response response = client.newCall(request).execute()) { - if (response.isSuccessful() && response.body() != null) { - JsonObject jsonObject = JsonParser.parseString(response.body().string()).getAsJsonObject(); - List songs = new ArrayList<>(); - - // Extract tracks from the response - jsonObject.getAsJsonObject("tracks").getAsJsonArray("items").forEach(track -> { - String songName = track.getAsJsonObject().get("name").getAsString(); - songs.add(songName); // Add the track name to the list - }); - - return songs; - } else { - throw new RuntimeException("Failed to search songs: " + response.message()); - } - } catch (IOException e) { - throw new RuntimeException("Error searching songs", e); - } - } -} diff --git a/src/main/java/use_case/keyword/KeywordInteractor.java b/src/main/java/use_case/keyword/KeywordInteractor.java index 344dea140..85f751c5e 100644 --- a/src/main/java/use_case/keyword/KeywordInteractor.java +++ b/src/main/java/use_case/keyword/KeywordInteractor.java @@ -1,6 +1,6 @@ package use_case.keyword; -import spotify_api.SpotifyService; +import data_access.SpotifyService; import java.util.List; @@ -15,7 +15,7 @@ public class KeywordInteractor implements KeywordInputBoundary { /** * Constructs a KeywordInteractor. * - * @param spotifyService The SpotifyService to handle API calls. + * @param spotifyService The data_access.SpotifyService to handle API calls. * @param outputBoundary The output boundary to send results or errors to the presenter. */ public KeywordInteractor(SpotifyService spotifyService, KeywordOutputBoundary outputBoundary) { @@ -34,7 +34,7 @@ public void searchByKeyword(KeywordInputData inputData) { String artistName = inputData.getArtistName(); String keyword = inputData.getKeyword(); - // Use SpotifyService to fetch and filter songs + // Use data_access.SpotifyService to fetch and filter songs List songs = spotifyService.searchSongs(artistName, keyword); if (songs.isEmpty()) { diff --git a/src/main/java/view/KeywordView.java b/src/main/java/view/KeywordView.java index bd60560d9..0a1d6dd8b 100644 --- a/src/main/java/view/KeywordView.java +++ b/src/main/java/view/KeywordView.java @@ -1,19 +1,16 @@ package view; - import interface_adapter.keyword.KeywordController; import interface_adapter.keyword.KeywordViewModel; import interface_adapter.logged_in.LoggedInViewModel; import javax.swing.*; -import java.awt.*; - -public class Keyword { +public class KeywordView { private final KeywordController controller; private final KeywordViewModel viewModel; - public Keyword(KeywordController controller, KeywordViewModel viewModel) { + public KeywordView(KeywordController controller, KeywordViewModel viewModel) { this.controller = controller; this.viewModel = viewModel; } @@ -83,5 +80,7 @@ public JPanel getPanel(JFrame frame) { return panel; } -} + public void show() { + } +} \ No newline at end of file diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 05b7fa327..17e85aba3 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -21,9 +21,6 @@ import interface_adapter.top_items.TopItemsController; import data_access.SpotifyService; import use_case.keyword.KeywordInteractor; -import use_case.keyword.KeywordUserDataAccessObject; -import use_case.login.LoginInputData; -import use_case.login.LoginUserDataAccessInterface; /** @@ -67,7 +64,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { JFrame frame = (JFrame) SwingUtilities.getWindowAncestor(this); // Retrieve the access token - String accessToken = "BQDDn_mcxlh_IGVdFgYNQnTX-DZbP7EGYxYJ5hIGO3FvZrAkn__uoGsSR8RR79CMf5ApJyqWLfQ-Exkq0EXkVpPHHGbl7F67uRepDSX-pcpUdlS9Ve8"; // Assuming the token is stored as the username + String accessToken = "BQCBkcgNkBgo48s7ZJlGRO2ohyiOJHc1nlBD-E6-6EsRsOILmexOHd3G81Bj3wKAymo8i1qOg8tvHPUSQASHL67WGTw4E_KlyXkpRyfMGIF67EOVLtY"; // Assuming the token is stored as the username // Ensure the token exists if (accessToken == null || accessToken.isEmpty()) { @@ -83,7 +80,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { KeywordController keywordController = new KeywordController(interactor, viewModel); // Create the Keyword view and set it as the content pane - Keyword keywordPage = new Keyword(keywordController, viewModel); + KeywordView keywordPage = new KeywordView(keywordController, viewModel); frame.setContentPane(keywordPage.getPanel(frame)); frame.revalidate(); // Refresh the frame to display the new content } @@ -163,15 +160,16 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { topTracks.addActionListener( evt -> { if (evt.getSource().equals(topTracks)) { - // final String name = topTracksController + // final String name = topTracksController final List lst = new ArrayList<>(); topItemsController.execute(lst, lst); } } ); - - // Add an ActionListener to open the Keyword window - keyword.addActionListener(new ActionListener() { + + // Add an ActionListener to open the Keyword window + // Add an ActionListener to open the Keyword window + keyword.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // Initialize the required components From ac9b0b1982416960cfbc14b24c66d9456ac215ec Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 16:44:26 -0500 Subject: [PATCH 168/262] added instance variable for spotify access object --- src/main/java/app/AppBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 930ac05fa..0c98ca292 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -6,6 +6,7 @@ import data_access.InMemoryUserDataAccessObject; import data_access.LanguageModelDataAccessObject; +import data_access.SpotifyDataAccessObject; import data_access.TopItemsUserDataAccessObject; import entity.CommonUserFactory; import entity.UserFactory; @@ -65,6 +66,7 @@ public class AppBuilder { private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); // Will remove since our project does not cover signing up, only logging in private LoginViewModel loginViewModel; From d0dc6167b41b638c2d4ff8d55d758dd27b9fe979 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 16:48:38 -0500 Subject: [PATCH 169/262] added instance variable for spotify access object --- src/main/java/app/AppBuilder.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index e76faa6eb..5694949aa 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -222,11 +222,11 @@ public AppBuilder addTopItemsUseCase() { public AppBuilder addSimilarListenersUseCase() { final SimilarListenersOutputBoundary similarListenersOutputBoundary = new SimilarListenersPresenter(similarListenersViewModel, viewManagerModel); - //final SimilarListenersInputBoundary similarListenersInputBoundary = - //new SimilarListenersInteractor(userDataAccessObject, similarListenersOutputBoundary); - //final SimilarListenersController similarListenersController = - //new SimilarListenersController(similarListenersInputBoundary); - //loggedInView.setSimilarListenersController(similarListenersController); + final SimilarListenersInputBoundary similarListenersInputBoundary = + new SimilarListenersInteractor(spotifyDataAccessObject, similarListenersOutputBoundary); + final SimilarListenersController similarListenersController = + new SimilarListenersController(similarListenersInputBoundary); + loggedInView.setSimilarListenersController(similarListenersController); return this; } From e3e3c99e1b53c1a88a61c8d52e0d6a1a1ddeeeea Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 17:14:53 -0500 Subject: [PATCH 170/262] added dependency --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dc5479505..702847f17 100644 --- a/pom.xml +++ b/pom.xml @@ -60,14 +60,21 @@ 1.5.4 + + + + + + se.michaelthelin.spotify spotify-web-api-java - 9.0.0-RC1 + 8.4.1 + From b08a7fc7b0bbc2042f98e086d7298607579111c2 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 17:54:13 -0500 Subject: [PATCH 171/262] added dependency --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index 702847f17..8b18dce33 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,14 @@ + + + org.slf4j + slf4j-jdk14 + 2.0.0-alpha0 + runtime + + se.michaelthelin.spotify From 61ce9aac1012723b4d1b38b0a8b903db610fb3f8 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 18:02:48 -0500 Subject: [PATCH 172/262] added spotify access object --- src/main/java/app/AppBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 5694949aa..c43fb92c2 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -67,7 +67,7 @@ public class AppBuilder { private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); - private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQDHlHAK0p8EEVuqoiNBCzyQwioML8E3cPAPml6lrXNVbMmcQcJoITssAh6CmMz4OE_yAGVsVudy0Qh1vZftCvWmOQT3fDY9z_dqnAgRs2cRBCkfG0bVtu1vDeqnuMjB9tJd1Y22Fp9A3L9ASDHYNze7wU4DxPhWAC3zXT34MxC1HgRsDlTmnCHb6WKa5-FF2xwIFxvXGPThpifkFw"); // Will remove since our project does not cover signing up, only logging in private LoginViewModel loginViewModel; From 2cb1a1faf68f49e593d27e586736046af5565faa Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 18:03:26 -0500 Subject: [PATCH 173/262] updated constructor and methods --- src/main/java/data_access/SpotifyDataAccessObject.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 03c79f58b..329e32cc2 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -77,6 +77,11 @@ public SpotifyDataAccessObject(String accessToken) { .offset(OFFSET) .time_range("short_term") .build(); + this.currentTopTracks = getUsersTopTracksSync(); + this.currentTopArtists = getUsersTopArtistsSync(); + + this.getUsersFollowedArtistsRequest = spotifyApi.getUsersFollowedArtists(type).build(); + this.currFollowedArtists = getUsersFollowedArtistsSync(); } /** @@ -95,7 +100,7 @@ private List getUsersTopTracksSync() { for (Track track : tracks) { topTracks.add(track.getName()); } - System.out.println("Top Tracks: " + topTracks); + //System.out.println("Top Tracks: " + topTracks); return topTracks; } catch (IOException | SpotifyWebApiException | ParseException e) { @@ -120,7 +125,7 @@ private List getUsersTopArtistsSync() { for (Artist artist : artists) { topArtists.add(artist.getName()); } - System.out.println("Top Artists: " + topArtists); + //System.out.println("Top Artists: " + topArtists); return topArtists; } catch (IOException | SpotifyWebApiException | ParseException e) { From 1bca5c6d1c4e14e03199cc53ec8923d284e87bc4 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 18:11:19 -0500 Subject: [PATCH 174/262] added dependency --- pom.xml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dc5479505..e812c38c0 100644 --- a/pom.xml +++ b/pom.xml @@ -60,10 +60,24 @@ 1.5.4 + + + + + + + + org.slf4j + slf4j-jdk14 + 2.0.0-alpha0 + runtime + + + se.michaelthelin.spotify spotify-web-api-java - 9.0.0-RC1 + 8.4.1 From 63548b472dc12116e619e80b9d15d28fb29a898b Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 18:11:36 -0500 Subject: [PATCH 175/262] updated constructor and methods --- .../data_access/SpotifyDataAccessObject.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 32c12da54..5d74f5776 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -80,6 +80,25 @@ public SpotifyDataAccessObject(String accessToken) { .offset(OFFSET) .time_range("short_term") .build(); + this.spotifyApi = new SpotifyApi.Builder() + .setAccessToken(accessToken) + .build(); + this.getTopTracksRequest = spotifyApi.getUsersTopTracks() + .offset(OFFSET) + .time_range("short_term") + .build(); + this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() + .offset(OFFSET) + .time_range("short_term") + .build(); + this.currentTopTracks = getUsersTopTracksSync(); + this.currentTopArtists = getUsersTopArtistsSync(); + + this.getUsersFollowedArtistsRequest = spotifyApi.getUsersFollowedArtists(type).build(); + this.currFollowedArtists = getUsersFollowedArtistsSync(); + + this.getRecommendationsRequest = spotifyApi.getRecommendations() + .build(); } /** @@ -98,7 +117,7 @@ private List getUsersTopTracksSync() { for (Track track : tracks) { topTracks.add(track.getName()); } - System.out.println("Top Tracks: " + topTracks); + // System.out.println("Top Tracks: " + topTracks); return topTracks; } catch (IOException | SpotifyWebApiException | ParseException e) { @@ -123,7 +142,7 @@ private List getUsersTopArtistsSync() { for (Artist artist : artists) { topArtists.add(artist.getName()); } - System.out.println("Top Artists: " + topArtists); + // System.out.println("Top Artists: " + topArtists); return topArtists; } catch (IOException | SpotifyWebApiException | ParseException e) { From f55d677171440e39f48c9e37bb7084624d5ffbfc Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:09:28 -0500 Subject: [PATCH 176/262] Added the artists variable into the TopItemsState to work on the Top Artists Graph --- .../top_items/TopItemsState.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/interface_adapter/top_items/TopItemsState.java b/src/main/java/interface_adapter/top_items/TopItemsState.java index 918032aaa..1afe9b0fe 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsState.java +++ b/src/main/java/interface_adapter/top_items/TopItemsState.java @@ -7,7 +7,9 @@ */ public class TopItemsState { private List tracks; + private List artists; private String tracksError; + private String artistsError; public TopItemsState(TopItemsState copy) { // tracks = copy.tracks; @@ -34,4 +36,22 @@ public void setTracks(List tracks) { public void setTracksError(String tracksError) { this.tracksError = tracksError; } + + public List getArtists() { + return artists; + } + + public String getArtistsError() { + return artistsError; + } + + public void setArtists(List artists) { + this.artists = artists; + } + + public void setArtistsError(String artistsError) { + this.artistsError = artistsError; + } + + } From f4b270b1e985598a023d6328356a18c00ec2620e Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:10:13 -0500 Subject: [PATCH 177/262] Added the setArtistGraph to update the dataset for the TopArtists Graph. --- src/main/java/view/TopItemsView.java | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/view/TopItemsView.java b/src/main/java/view/TopItemsView.java index 55a917c04..96cc825a8 100644 --- a/src/main/java/view/TopItemsView.java +++ b/src/main/java/view/TopItemsView.java @@ -37,11 +37,11 @@ public TopItemsView(TopItemsViewModel topItemsViewModel) { homeButton = new JButton("go back"); homeButton.setAlignmentX(Component.CENTER_ALIGNMENT); - dataset1.setValue("Artist 1", 200); + /* dataset1.setValue("Artist 1", 200); dataset1.setValue("Artist 2", 150); dataset1.setValue("Artist 3", 180); - /* dataset2.addValue(300, "Track 1", "1'st"); + dataset2.addValue(300, "Track 1", "1'st"); dataset2.addValue(250, "Track 2", "2'nd"); dataset2.addValue(200, "Track 3", "3'rd"); dataset2.addValue(150, "Track 4", "4'th"); @@ -74,6 +74,7 @@ public TopItemsView(TopItemsViewModel topItemsViewModel) { public void propertyChange(PropertyChangeEvent evt) { final TopItemsState state = (TopItemsState) evt.getNewValue(); setTrackGraph(state); + // setArtistGraph(state); } public String getViewName() { @@ -87,9 +88,22 @@ public String getViewName() { public void setTrackGraph(TopItemsState state) { int decrease = 300; - for (int i = 0; i < state.getTracks().size(); i++) { + for (int i = 0; i < 4; i++) { dataset2.addValue(decrease, state.getTracks().get(i), String.valueOf(i + 1)); decrease -= 50; } } + + /** + * The method updates the dataset for the Top Tracks Graph. + * @param state stands for the TopItemsState that is being used. + */ + public void setArtistGraph(TopItemsState state) { + int decrease = 200; + + for (int i = 0; i < 3; i++) { + dataset1.setValue(state.getArtists().get(i), decrease); + decrease -= 50; + } + } } From f130051560daa02deb4d1145514e767432ae19e3 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:10:37 -0500 Subject: [PATCH 178/262] Done some refactoring. --- src/main/java/view/LoggedInView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 15cb9f746..be7051175 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -160,7 +160,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { topItems.addActionListener( evt -> { - if (evt.getSource().equals(topTracks)) { + if (evt.getSource().equals(topItems)) { // final String name = topTracksController final List lst = new ArrayList<>(); From e6c33bf53514c3f18945bd0a7c807087aa04b1fa Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Tue, 26 Nov 2024 19:13:47 -0500 Subject: [PATCH 179/262] updated constructor --- .../data_access/SpotifyDataAccessObject.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 5d74f5776..89441d5de 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -80,17 +80,7 @@ public SpotifyDataAccessObject(String accessToken) { .offset(OFFSET) .time_range("short_term") .build(); - this.spotifyApi = new SpotifyApi.Builder() - .setAccessToken(accessToken) - .build(); - this.getTopTracksRequest = spotifyApi.getUsersTopTracks() - .offset(OFFSET) - .time_range("short_term") - .build(); - this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() - .offset(OFFSET) - .time_range("short_term") - .build(); + this.currentTopTracks = getUsersTopTracksSync(); this.currentTopArtists = getUsersTopArtistsSync(); @@ -117,7 +107,7 @@ private List getUsersTopTracksSync() { for (Track track : tracks) { topTracks.add(track.getName()); } - // System.out.println("Top Tracks: " + topTracks); + System.out.println("Top Tracks: " + topTracks); return topTracks; } catch (IOException | SpotifyWebApiException | ParseException e) { @@ -142,7 +132,7 @@ private List getUsersTopArtistsSync() { for (Artist artist : artists) { topArtists.add(artist.getName()); } - // System.out.println("Top Artists: " + topArtists); + System.out.println("Top Artists: " + topArtists); return topArtists; } catch (IOException | SpotifyWebApiException | ParseException e) { From c01a3f0f4e59de2ca8e36d63cbfd55f9f267c004 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:31:06 -0500 Subject: [PATCH 180/262] Updated the controller calls in the presenter class. --- src/main/java/interface_adapter/top_items/TopItemsPresenter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java index 3042a5fd9..423635a27 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java +++ b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java @@ -22,6 +22,7 @@ public TopItemsPresenter(ViewManagerModel viewManagerModel, public void prepareSuccessView(TopItemsOutputData outputData) { final TopItemsState topItemsState = topItemsViewModel.getState(); topItemsState.setTracks(outputData.getTracks()); + topItemsState.setArtists(outputData.getArtists()); this.topItemsViewModel.setState(topItemsState); topItemsViewModel.firePropertyChanged(); From cff3349f509acebe54aaab00bc93755e5679efa8 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:31:19 -0500 Subject: [PATCH 181/262] Added some dummmy tests. --- .../java/data_access/TopItemsUserDataAccessObject.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/data_access/TopItemsUserDataAccessObject.java b/src/main/java/data_access/TopItemsUserDataAccessObject.java index 7c0d4050e..ac10de997 100644 --- a/src/main/java/data_access/TopItemsUserDataAccessObject.java +++ b/src/main/java/data_access/TopItemsUserDataAccessObject.java @@ -8,13 +8,19 @@ public class TopItemsUserDataAccessObject implements TopItemsUserDataAccessInterface { private List tracks; + private List artists; public TopItemsUserDataAccessObject() { tracks = new ArrayList<>(); + artists = new ArrayList<>(); tracks.add("Heartbreaker"); tracks.add("reincarnated"); tracks.add("Kill Bill"); tracks.add("Crew Love"); + artists.add("The Weeknd"); + artists.add("Kanye West"); + artists.add("A$AP Rocky"); + } @Override @@ -28,7 +34,7 @@ public void setCurrentTopTracks(List tracks) { @Override public List getCurrentTopArtists() { - return List.of(); + return artists; } @Override From d596ba068ee15ddd6e5c5c7f996c4569f51516e9 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:31:30 -0500 Subject: [PATCH 182/262] Updated the View Class. --- src/main/java/view/TopItemsView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/TopItemsView.java b/src/main/java/view/TopItemsView.java index 96cc825a8..8c13348b7 100644 --- a/src/main/java/view/TopItemsView.java +++ b/src/main/java/view/TopItemsView.java @@ -74,7 +74,7 @@ public TopItemsView(TopItemsViewModel topItemsViewModel) { public void propertyChange(PropertyChangeEvent evt) { final TopItemsState state = (TopItemsState) evt.getNewValue(); setTrackGraph(state); - // setArtistGraph(state); + setArtistGraph(state); } public String getViewName() { From 2c6195cfa8ff22d15e7eda27a93d3e16291a7fef Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:38:29 -0500 Subject: [PATCH 183/262] Created a seperate list for the execution in topItems. --- src/main/java/view/LoggedInView.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index be7051175..64b06abf7 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -163,8 +163,9 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { if (evt.getSource().equals(topItems)) { // final String name = topTracksController - final List lst = new ArrayList<>(); - topItemsController.execute(lst, lst); + final List lst1 = new ArrayList<>(); + final List lst2 = new ArrayList<>(); + topItemsController.execute(lst1, lst2); } } ); From efc2fd2e05ba954e6b62e291939103bba199931a Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:39:06 -0500 Subject: [PATCH 184/262] Updated the Data Access class for the graph menu. --- .../data_access/SpotifyDataAccessObject.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 5d74f5776..109d67bd4 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -28,6 +28,7 @@ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, SimilarListenersUserDataAccessInterface { public static final int OFFSET = 4; + public static final int OFFSET2 = 0; private LoginState loginState = new LoginState(); private String accessToken; @@ -50,11 +51,11 @@ public SpotifyDataAccessObject() { .build(); this.getTopTracksRequest = spotifyApi.getUsersTopTracks() .offset(OFFSET) - .time_range("short_term") + .time_range("medium_term") .build(); this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() .offset(OFFSET) - .time_range("short_term") + .time_range("medium_term") .build(); this.currentTopTracks = getUsersTopTracksSync(); this.currentTopArtists = getUsersTopArtistsSync(); @@ -74,22 +75,22 @@ public SpotifyDataAccessObject(String accessToken) { .build(); this.getTopTracksRequest = spotifyApi.getUsersTopTracks() .offset(OFFSET) - .time_range("short_term") + .time_range("medium_term") .build(); this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() - .offset(OFFSET) - .time_range("short_term") + .offset(OFFSET2) + .time_range("medium_term") .build(); this.spotifyApi = new SpotifyApi.Builder() .setAccessToken(accessToken) .build(); this.getTopTracksRequest = spotifyApi.getUsersTopTracks() .offset(OFFSET) - .time_range("short_term") + .time_range("medium_term") .build(); this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() - .offset(OFFSET) - .time_range("short_term") + .offset(OFFSET2) + .time_range("medium_term") .build(); this.currentTopTracks = getUsersTopTracksSync(); this.currentTopArtists = getUsersTopArtistsSync(); From 4d0bbdabed03505dde034fa03b56afa0fad8fdf3 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Tue, 26 Nov 2024 19:40:37 -0500 Subject: [PATCH 185/262] Update --- src/main/java/app/AppBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 0c98ca292..71d1decaa 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -66,7 +66,7 @@ public class AppBuilder { private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); - private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQDPmgxEeX6U1nUlJKfSiF3dgCNVDFE1qR1lprhYgMMDVMyYb1zsGQ5uYVMOXvk0odD9pQWaLDRN3yuSD_nqeoh9Q3N96EerOA-67bLSNJ3zf-Qtj_EBRiE33I8zraNf7Q5g_LeLHLTIPELxrB0QYotzB6gl8hFFo_NhqWmV7yVwBald5ncDDdILNwj5ymgwiRNdB_icKVhjKJtSrA"); // Will remove since our project does not cover signing up, only logging in private LoginViewModel loginViewModel; @@ -198,7 +198,7 @@ public AppBuilder addTopItemsUseCase() { topTracksAndArtistsViewModel); final TopItemsInputBoundary topItemsInputBoundary = - new TopItemsInteractor(topItemsUserDataAccessObject, topItemsOutputBoundary); + new TopItemsInteractor(spotifyDataAccessObject, topItemsOutputBoundary); final TopItemsController topItemsController = new TopItemsController(topItemsInputBoundary); loggedInView.setTopTracksController(topItemsController); From 57a92af161b2d115c30b67a915aeb7efa8dabdf6 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Tue, 26 Nov 2024 20:45:46 -0500 Subject: [PATCH 186/262] Created recommend test file --- .../recommend/RecommendInteractorTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/use_case/recommend/RecommendInteractorTest.java diff --git a/src/test/java/use_case/recommend/RecommendInteractorTest.java b/src/test/java/use_case/recommend/RecommendInteractorTest.java new file mode 100644 index 000000000..24ec6bde6 --- /dev/null +++ b/src/test/java/use_case/recommend/RecommendInteractorTest.java @@ -0,0 +1,43 @@ +package use_case.recommend; + +import data_access.InMemoryUserDataAccessObject; +import entity.CommonUserFactory; +import entity.User; +import entity.UserFactory; +import org.junit.jupiter.api.Test; +import use_case.logout.*; + +import static org.junit.jupiter.api.Assertions.*; + +public class RecommendInteractorTest { + @Test + void successTest() { + LogoutInputData inputData = new LogoutInputData("Paul"); + InMemoryUserDataAccessObject userRepository = new InMemoryUserDataAccessObject(); + + // For the success test, we need to add Paul to the data access repository before we log in. + UserFactory factory = new CommonUserFactory(); + User user = factory.create("Paul", "password"); + userRepository.save(user); + userRepository.setCurrentUsername("Paul"); + + // This creates a successPresenter that tests whether the test case is as we expect. + LogoutOutputBoundary successPresenter = new LogoutOutputBoundary() { + @Override + public void prepareSuccessView(LogoutOutputData user) { + // check that the output data contains the username of who logged out + assertEquals("Paul", user.getUsername()); + } + + @Override + public void prepareFailView(String error) { + fail("Use case failure is unexpected."); + } + }; + + LogoutInputBoundary interactor = new LogoutInteractor(userRepository, successPresenter); + interactor.execute(inputData); + // check that the user was logged out + assertNull(userRepository.getCurrentUsername()); + } +} From af00c85ac10fb0ca01bd815b2bcac0bf0dc9881c Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Tue, 26 Nov 2024 20:50:30 -0500 Subject: [PATCH 187/262] added temp values to test --- .../use_case/recommend/RecommendInteractorTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/use_case/recommend/RecommendInteractorTest.java b/src/test/java/use_case/recommend/RecommendInteractorTest.java index 24ec6bde6..2a6dbe624 100644 --- a/src/test/java/use_case/recommend/RecommendInteractorTest.java +++ b/src/test/java/use_case/recommend/RecommendInteractorTest.java @@ -7,6 +7,9 @@ import org.junit.jupiter.api.Test; import use_case.logout.*; +import java.util.HashMap; +import java.util.Map; + import static org.junit.jupiter.api.Assertions.*; public class RecommendInteractorTest { @@ -35,6 +38,15 @@ public void prepareFailView(String error) { } }; +// Use for test input +// final Map songs = new HashMap<>(); +// songs.put("(sic)", "Slipknot"); +// songs.put("Left Behind", "Slipknot"); +// songs.put("Jumpdafuckup", "Soulfly"); +// songs.put("Roots Bloody Roots", "Sepultura"); +// songs.put("Dragula", "Rob Zombie"); +// songs.put("Spit It Out", "Slipknot"); + LogoutInputBoundary interactor = new LogoutInteractor(userRepository, successPresenter); interactor.execute(inputData); // check that the user was logged out From e5d082f180af46ccf952af2b94c9baed7c06b646 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 09:15:03 -0500 Subject: [PATCH 188/262] updated constructor --- .../java/data_access/SpotifyDataAccessObject.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 109d67bd4..f4e43d685 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -70,17 +70,6 @@ public SpotifyDataAccessObject() { // Constructor used for testing. public SpotifyDataAccessObject(String accessToken) { this.accessToken = accessToken; - this.spotifyApi = new SpotifyApi.Builder() - .setAccessToken(accessToken) - .build(); - this.getTopTracksRequest = spotifyApi.getUsersTopTracks() - .offset(OFFSET) - .time_range("medium_term") - .build(); - this.getTopArtistsRequest = spotifyApi.getUsersTopArtists() - .offset(OFFSET2) - .time_range("medium_term") - .build(); this.spotifyApi = new SpotifyApi.Builder() .setAccessToken(accessToken) .build(); From 2b564420a18021fd350c608dfcf1fa66ee453b76 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 09:17:16 -0500 Subject: [PATCH 189/262] updated instance variables --- src/main/java/app/AppBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 593e6570b..a12d8feb3 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -74,10 +74,12 @@ public class AppBuilder { private LoggedInViewModel loggedInViewModel; private TopItemsViewModel topTracksAndArtistsViewModel; private SearchViewModel searchViewModel; + private SimilarListenersViewModel similarListenersViewModel; private LoggedInView loggedInView; private LoginView loginView; private SearchView searchView; private TopItemsView topItemsView; + private SimilarListenersView similarListenersView; public AppBuilder() { From 0a399aa8356dc70e1bb11d93b23729588054ec45 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 09:48:57 -0500 Subject: [PATCH 190/262] updated prepare fail view --- .../similar_listeners/SimilarListenersPresenter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index 4e01702f0..43ee56576 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -36,5 +36,8 @@ public void prepareFailView(String errorMessage) { similarListenersState.setSimilarArtistsError(errorMessage); similarListenersViewModel.firePropertyChanged(); + this.viewManagerModel.setState(similarListenersViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); + } } From d41a11c0ad313d07397ca8211ff7d27f53bb0cef Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 09:50:45 -0500 Subject: [PATCH 191/262] added action listener to similar listeners button --- src/main/java/view/LoggedInView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 6ebf66427..3d8575ddc 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -193,7 +193,6 @@ public void actionPerformed(ActionEvent e) { } }); -// Add components to the panel similarListeners.addActionListener( evt -> { if (evt.getSource().equals(similarListeners)) { @@ -204,6 +203,8 @@ public void actionPerformed(ActionEvent e) { } ); +// Add components to the panel + this.add(title); this.add(usernameInfo); this.add(username); From ce737d8a55c161289f777a7cd86c5c49eec4fa1b Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 09:58:31 -0500 Subject: [PATCH 192/262] updated prepare fail view --- .../similar_listeners/SimilarListenersPresenter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index 43ee56576..7bf9c854c 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -4,6 +4,8 @@ import use_case.similar_listeners.SimilarListenersOutputBoundary; import use_case.similar_listeners.SimilarListenersOutputData; +import java.util.ArrayList; + /** * The Presenter for Similar Listeners use case. */ @@ -34,6 +36,7 @@ public void prepareSuccessView(SimilarListenersOutputData similarListenersOutput public void prepareFailView(String errorMessage) { final SimilarListenersState similarListenersState = similarListenersViewModel.getState(); similarListenersState.setSimilarArtistsError(errorMessage); + similarListenersState.setSimilarArtists(new ArrayList<>()); similarListenersViewModel.firePropertyChanged(); this.viewManagerModel.setState(similarListenersViewModel.getViewName()); From 122af743d134ed54054ef7ee4487469f893e0ae7 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 09:58:56 -0500 Subject: [PATCH 193/262] updated set list of artists method --- src/main/java/view/SimilarListenersView.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/view/SimilarListenersView.java b/src/main/java/view/SimilarListenersView.java index 39502e5da..6ef5e80e6 100644 --- a/src/main/java/view/SimilarListenersView.java +++ b/src/main/java/view/SimilarListenersView.java @@ -70,12 +70,18 @@ public void propertyChange(PropertyChangeEvent evt) { } private void setListOfArtists(SimilarListenersState similarListenersState) { - String artistsNames = ""; - List followedArtists = similarListenersState.getSimilarArtists(); - for (String followedArtist : followedArtists) { - artistsNames += followedArtist + "\n"; + if (similarListenersState.getSimilarArtists().isEmpty()) { + listOfArtists.setText(similarListenersState.getSimilarArtistsError()); } - listOfArtists.setText(artistsNames); + else { + String artistsNames = ""; + List followedArtists = similarListenersState.getSimilarArtists(); + for (String followedArtist : followedArtists) { + artistsNames += followedArtist + "\n"; + } + listOfArtists.setText(artistsNames); + } + } From 2073bcf0a79e65a0746dcea298eb399d3c07da60 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 09:59:52 -0500 Subject: [PATCH 194/262] updated --- src/main/java/data_access/SpotifyDataAccessObject.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index f4e43d685..cd13ab00c 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -153,11 +153,13 @@ private List getUsersFollowedArtistsSync() { for (Artist artist : artists) { followedArtists.add(artist.getName()); } + // System.out.println(followedArtists); return followedArtists; } catch (IOException | SpotifyWebApiException | ParseException e) { System.out.println("Error: " + e.getMessage()); return new ArrayList<>(); } + } /** From a69b857cf7a1246a84f2f73efc2e41f9967cc12d Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 10:03:47 -0500 Subject: [PATCH 195/262] added similarListeners view and usecase --- src/main/java/app/AppBuilder.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index a12d8feb3..f3349ec2c 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -4,10 +4,7 @@ import javax.swing.*; -import data_access.InMemoryUserDataAccessObject; -import data_access.LanguageModelDataAccessObject; -import data_access.SpotifyDataAccessObject; -import data_access.TopItemsUserDataAccessObject; +import data_access.*; import entity.CommonUserFactory; import entity.UserFactory; import interface_adapter.ViewManagerModel; @@ -67,7 +64,7 @@ public class AppBuilder { private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); - private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQDPmgxEeX6U1nUlJKfSiF3dgCNVDFE1qR1lprhYgMMDVMyYb1zsGQ5uYVMOXvk0odD9pQWaLDRN3yuSD_nqeoh9Q3N96EerOA-67bLSNJ3zf-Qtj_EBRiE33I8zraNf7Q5g_LeLHLTIPELxrB0QYotzB6gl8hFFo_NhqWmV7yVwBald5ncDDdILNwj5ymgwiRNdB_icKVhjKJtSrA"); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQB7iZX3H2Qquv3K6WwqoVzI1pPvWefEYZe1E8VVptdtHE_5BDF7egTm2GwbWwf37SeVYZaXU8eg29_SeCzCzxvPqf5Hb3jfh01jyGUkCNzh97Xe1oR6rIHoWglAjooaBLKGOwTMC7EsODZW8fcOtOhLnmvZYrg-cPYpo8CDsFYutRw0pDXWWP1TQTnj1UKraw45bM6v-X1eZZ7-bA"); // Will remove since our project does not cover signing up, only logging in private LoginViewModel loginViewModel; From 0ceec592a8f7164139c8759dcff63b8648063155 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 10:05:02 -0500 Subject: [PATCH 196/262] updated --- .../java/data_access/SimilarListenersTestDataAccessObject.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/data_access/SimilarListenersTestDataAccessObject.java b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java index bb378498e..62a6361a7 100644 --- a/src/main/java/data_access/SimilarListenersTestDataAccessObject.java +++ b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java @@ -2,6 +2,7 @@ import use_case.similar_listeners.SimilarListenersUserDataAccessInterface; +import java.util.ArrayList; import java.util.List; public class SimilarListenersTestDataAccessObject implements SimilarListenersUserDataAccessInterface { From c3cd0a852fa3cea54662a64eee9f444c4307af0d Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 13:18:50 -0500 Subject: [PATCH 197/262] Implemented back button functionality --- src/main/java/app/AppBuilder.java | 25 ++++++++++++++++++- src/main/java/app/Main.java | 2 +- .../data_access/SpotifyDataAccessObject.java | 19 +++++++++++++- .../recommend/RecommendController.java | 4 +-- .../recommend/RecommendPresenter.java | 1 + .../recommend/RecommendState.java | 12 ++++++--- .../recommend/RecommendInputData.java | 8 +++++- .../recommend/RecommendInteractor.java | 4 ++- .../recommend/RecommendOutputData.java | 12 ++++++++- src/main/java/view/LoggedInView.java | 23 +++++++++-------- src/main/java/view/RecommendationsView.java | 23 ++++++++++++++--- 11 files changed, 108 insertions(+), 25 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index b3bd0279d..2f204167a 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -233,6 +233,29 @@ public AppBuilder addTopItemsUseCase() { return this; } + /** + * Adds the Recommend Use Case to the application. + * @return this builder + */ + public AppBuilder addRecommendUseCase() { + final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + final LoginInputBoundary loginInteractor = new LoginInteractor( + userDataAccessObject, loginOutputBoundary); + + final LoginController loginController = new LoginController(loginInteractor); + recommendationsView.setLoginController(loginController); + + final RecommendOutputBoundary recommendOutputBoundary = + new RecommendPresenter(viewManagerModel, recommendViewModel); + final RecommendInputBoundary recommendInputBoundary = + new RecommendInteractor(languageModelDataAccessObject, spotifyDataAccessObject, recommendOutputBoundary); + + final RecommendController recommendController = new RecommendController(recommendInputBoundary); + loggedInView.setRecommendController(recommendController); + return this; + } + /** * Creates the JFrame for the application and initially sets the SignupView to be displayed. * @return the application @@ -246,7 +269,7 @@ public JFrame build() { application.add(cardPanel); - viewManagerModel.setState(loggedInViewModel.getViewName()); + viewManagerModel.setState(loggedInView.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index fca37b6c0..7d5d77dc9 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -1,7 +1,7 @@ package app; import javax.swing.*; -import java.Constants; +//import java.Constants; import java.awt.*; /** diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 109d67bd4..4af32e69f 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -2,7 +2,9 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import entity.CommonUser; import entity.User; @@ -19,6 +21,7 @@ import se.michaelthelin.spotify.requests.data.follow.GetUsersFollowedArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; +import use_case.recommend.RecommendSpotifyDataAccessInterface; import use_case.similar_listeners.SimilarListenersUserDataAccessInterface; import use_case.top_items.TopItemsUserDataAccessInterface; @@ -26,7 +29,8 @@ * DAO for getting relevant information from Spotify API. */ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, - SimilarListenersUserDataAccessInterface { + SimilarListenersUserDataAccessInterface, + RecommendSpotifyDataAccessInterface { public static final int OFFSET = 4; public static final int OFFSET2 = 0; @@ -215,5 +219,18 @@ public void setCurrentFollowedArtists(List followedArtists) { this.currFollowedArtists = followedArtists; } + + @Override + public Map getHistory() { + final Map songs = new HashMap<>(); + songs.put("(sic)", "Slipknot"); + songs.put("Left Behind", "Slipknot"); + songs.put("Jumpdafuckup", "Soulfly"); + songs.put("Roots Bloody Roots", "Sepultura"); + songs.put("Dragula", "Rob Zombie"); + songs.put("Spit It Out", "Slipknot"); + + return songs; + } } diff --git a/src/main/java/interface_adapter/recommend/RecommendController.java b/src/main/java/interface_adapter/recommend/RecommendController.java index 4c6f8d7aa..09d071926 100644 --- a/src/main/java/interface_adapter/recommend/RecommendController.java +++ b/src/main/java/interface_adapter/recommend/RecommendController.java @@ -19,9 +19,9 @@ public RecommendController(RecommendInputBoundary recommendUseCaseInteractor) { * Executes the Recommend Use Case. * @param songRecommendations the map of song recommendations in the form of song, artist */ - public void execute(Map songRecommendations) { + public void execute(Map songRecommendations, String accessToken) { final RecommendInputData recommendInputData = new RecommendInputData( - songRecommendations); + songRecommendations, accessToken); recommendUseCaseInteractor.execute(recommendInputData); } diff --git a/src/main/java/interface_adapter/recommend/RecommendPresenter.java b/src/main/java/interface_adapter/recommend/RecommendPresenter.java index 4be7268ce..235bc1806 100644 --- a/src/main/java/interface_adapter/recommend/RecommendPresenter.java +++ b/src/main/java/interface_adapter/recommend/RecommendPresenter.java @@ -20,6 +20,7 @@ public RecommendPresenter(ViewManagerModel viewManagerModel, @Override public void prepareSuccessView(RecommendOutputData output) { final RecommendState recommendState = recommendViewModel.getState(); + recommendState.setAccessToken(output.getAccessToken()); recommendState.setSongRecommendations(output.getSongRecommendations()); this.recommendViewModel.setState(recommendState); this.recommendViewModel.firePropertyChanged(); diff --git a/src/main/java/interface_adapter/recommend/RecommendState.java b/src/main/java/interface_adapter/recommend/RecommendState.java index bfa06be1c..0a036ebc6 100644 --- a/src/main/java/interface_adapter/recommend/RecommendState.java +++ b/src/main/java/interface_adapter/recommend/RecommendState.java @@ -5,9 +5,7 @@ */ public class RecommendState { private String songRecommendations; - - public RecommendState(RecommendState recommendState) { - } + private String accessToken; // Because of the previous copy constructor, the default constructor must be explicit. public RecommendState() { @@ -21,4 +19,12 @@ public void setSongRecommendations(String songRecommendations) { public String getSongRecommendations() { return songRecommendations; } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getAccessToken() { + return accessToken; + } } diff --git a/src/main/java/use_case/recommend/RecommendInputData.java b/src/main/java/use_case/recommend/RecommendInputData.java index 08b15b9a6..d870c3b2e 100644 --- a/src/main/java/use_case/recommend/RecommendInputData.java +++ b/src/main/java/use_case/recommend/RecommendInputData.java @@ -8,12 +8,18 @@ public class RecommendInputData { private final Map songRecommendations; + private String accessToken; - public RecommendInputData(Map songRecommendations) { + public RecommendInputData(Map songRecommendations, String accessToken) { this.songRecommendations = songRecommendations; + this.accessToken = accessToken; } public Map getListeningHistory() { return songRecommendations; } + + public String getAccessToken() { + return accessToken; + } } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index fe725926a..b03e89364 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -24,8 +24,10 @@ public void execute(RecommendInputData recommendInputData) { final Map history = spotifyDataAccessObject.getHistory(); // Takes user data and asks Azure for recommendations final String songRecommendations = recommendDataAccessObject.getRecommendations(history); + // Gets access token + final String accessToken = recommendInputData.getAccessToken(); - final RecommendOutputData outputData = new RecommendOutputData(songRecommendations); + final RecommendOutputData outputData = new RecommendOutputData(songRecommendations, accessToken); recommendationOutputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/use_case/recommend/RecommendOutputData.java b/src/main/java/use_case/recommend/RecommendOutputData.java index 9052c4a3d..4fb176a58 100644 --- a/src/main/java/use_case/recommend/RecommendOutputData.java +++ b/src/main/java/use_case/recommend/RecommendOutputData.java @@ -5,12 +5,22 @@ */ public class RecommendOutputData { private final String songRecommendations; + private String accessToken; - public RecommendOutputData(String songRecommendations) { + public RecommendOutputData(String songRecommendations, String accessToken) { this.songRecommendations = songRecommendations; + this.accessToken = accessToken; } public String getSongRecommendations() { return songRecommendations; } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index f22689637..e57299110 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -149,6 +149,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { } } ); + description.addActionListener( // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { @@ -161,6 +162,18 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { } ); + recommendations.addActionListener( + evt -> { + if (evt.getSource().equals(recommendations)) { + // final String name = topTracksController + final Map songRecommendations = new HashMap<>(); + final String accessToken = loggedInViewModel.getState().getUsername(); + System.out.println(accessToken); + recommendController.execute(songRecommendations, accessToken); + } + } + ); + topItems.addActionListener( evt -> { @@ -193,16 +206,6 @@ public void actionPerformed(ActionEvent e) { } }); - recommendations.addActionListener( - evt -> { - if (evt.getSource().equals(recommendations)) { - // final String name = topTracksController - final Map songRecommendations = new HashMap<>(); - recommendController.execute(songRecommendations); - } - } - ); - // Add components to the panel this.add(title); this.add(usernameInfo); diff --git a/src/main/java/view/RecommendationsView.java b/src/main/java/view/RecommendationsView.java index b3f0f6ac3..a9fb0a733 100644 --- a/src/main/java/view/RecommendationsView.java +++ b/src/main/java/view/RecommendationsView.java @@ -10,7 +10,8 @@ import javax.swing.JScrollPane; import javax.swing.JTextArea; -import interface_adapter.recommend.RecommendController; +import interface_adapter.logged_in.LoggedInViewModel; +import interface_adapter.login.LoginController; import interface_adapter.recommend.RecommendState; import interface_adapter.recommend.RecommendViewModel; @@ -21,7 +22,7 @@ public class RecommendationsView extends JPanel implements PropertyChangeListene private final String viewName = "recommendations"; private final RecommendViewModel recommendViewModel; - private RecommendController recommendController; + private LoginController loginController; private final JButton refreshButton; private final JTextArea songsTextArea; @@ -65,6 +66,20 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { // } // } // ); + + homeButton.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + evt -> { + if (evt.getSource().equals(homeButton)) { + // 1. get the state out of the searchViewModel. It contains the username. + final String accessToken = recommendViewModel.getState().getAccessToken(); + // 2. Execute the search Controller. + loginController.execute(accessToken); + + } + } + ); + final JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(titlePanel); @@ -89,8 +104,8 @@ public String getViewName() { return viewName; } - public void setRecommendController(RecommendController recommendController) { - this.recommendController = recommendController; + public void setLoginController(LoginController loginController) { + this.loginController = loginController; } public String getArtist() { From dadf0d5371ad4ae280dbb82d70b6604b2d95bf60 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 14:01:27 -0500 Subject: [PATCH 198/262] Changed user story to use the spotify api. Before I was hardcoding dummy data --- .../data_access/InMemoryUserDataAccessObject.java | 13 +------------ .../data_access/LanguageModelDataAccessObject.java | 11 +++-------- .../java/data_access/SpotifyDataAccessObject.java | 13 ------------- .../use_case/recommend/RecommendInteractor.java | 5 +++-- .../RecommendLanguageModelDataAccessInterface.java | 6 +++--- .../RecommendSpotifyDataAccessInterface.java | 4 ++-- .../recommend/RecommendUserDataAccessInterface.java | 6 +++--- 7 files changed, 15 insertions(+), 43 deletions(-) diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index 4510c0bba..9757ee610 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -16,8 +16,7 @@ */ public class InMemoryUserDataAccessObject implements LoginUserDataAccessInterface, - LogoutUserDataAccessInterface, - RecommendUserDataAccessInterface { + LogoutUserDataAccessInterface { private final Map users = new HashMap<>(); private String currentUsername; @@ -46,14 +45,4 @@ public void setCurrentAccessToken(String name) { public String getCurrentAccessToken() { return this.currentUsername; } - - @Override - public Map getSongRecommendations() { - return Map.of(); - } - - @Override - public void setSongRecommendations(Map songRecommendations) { - - } } diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index c92b73be6..418d60239 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -83,22 +83,17 @@ public String query(String prompt) { } @Override - public String getRecommendations(Map history) { + public String getRecommendations(List songs) { final OpenAIClient client = new OpenAIClientBuilder() .credential(new AzureKeyCredential(accessToken)) .endpoint(endpoint) .buildClient(); final List chatMessages = new ArrayList<>(); - final List songList = new ArrayList<>(); - for (String s : history.keySet()) { - songList.add(history.get(s)); - songList.add(s); - } chatMessages.add(new ChatRequestSystemMessage("You are a Spotify analyst, you will either send back a " + "list of songs which are similar to a provided list.")); - chatMessages.add(new ChatRequestUserMessage("Can you help me find songs similar to " + songList + chatMessages.add(new ChatRequestUserMessage("Can you help me find songs similar to " + songs + "which is a list of songs where each song is followed by its artist name.")); - chatMessages.add(new ChatRequestUserMessage(String.valueOf(songList))); + chatMessages.add(new ChatRequestUserMessage(String.valueOf(songs))); final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", new ChatCompletionsOptions(chatMessages)); diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 4af32e69f..3a61890fd 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -219,18 +219,5 @@ public void setCurrentFollowedArtists(List followedArtists) { this.currFollowedArtists = followedArtists; } - - @Override - public Map getHistory() { - final Map songs = new HashMap<>(); - songs.put("(sic)", "Slipknot"); - songs.put("Left Behind", "Slipknot"); - songs.put("Jumpdafuckup", "Soulfly"); - songs.put("Roots Bloody Roots", "Sepultura"); - songs.put("Dragula", "Rob Zombie"); - songs.put("Spit It Out", "Slipknot"); - - return songs; - } } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index b03e89364..4f97c86db 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -1,5 +1,6 @@ package use_case.recommend; +import java.util.List; import java.util.Map; /** @@ -21,9 +22,9 @@ public RecommendInteractor(RecommendLanguageModelDataAccessInterface recommendDa @Override public void execute(RecommendInputData recommendInputData) { // Calls Spotify API to get user data - final Map history = spotifyDataAccessObject.getHistory(); + final List songs = spotifyDataAccessObject.getCurrentTopTracks(); // Takes user data and asks Azure for recommendations - final String songRecommendations = recommendDataAccessObject.getRecommendations(history); + final String songRecommendations = recommendDataAccessObject.getRecommendations(songs); // Gets access token final String accessToken = recommendInputData.getAccessToken(); diff --git a/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java index e1d4bbe94..6adb141ed 100644 --- a/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java @@ -1,6 +1,6 @@ package use_case.recommend; -import java.util.Map; +import java.util.List; /** * The recommend DAO for accessing the Azure OpenAI api. @@ -8,8 +8,8 @@ public interface RecommendLanguageModelDataAccessInterface { /** * Sends a query to the LLM at the API endpoint. - * @param prompt is a string which the model will respond to + * @param prompt is a list of strings which the model will respond to * @return the model's response to that prompt */ - String getRecommendations(Map prompt); + String getRecommendations(List prompt); } diff --git a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java index 14faeecdd..5cd5d23a5 100644 --- a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java @@ -1,6 +1,6 @@ package use_case.recommend; -import java.util.Map; +import java.util.List; /** * The recommend DAO for accessing the Spotify api. @@ -10,5 +10,5 @@ public interface RecommendSpotifyDataAccessInterface { * Sends a query to the Spotify at the API endpoint. * @return a map of songs that the user listened to most recently */ - Map getHistory(); + List getCurrentTopTracks(); } diff --git a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java index 834c201eb..d3792b4a5 100644 --- a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java @@ -1,6 +1,6 @@ package use_case.recommend; -import java.util.Map; +import java.util.List; /** * DAO for the Recommendations Use Case. @@ -10,11 +10,11 @@ public interface RecommendUserDataAccessInterface { * Returns the song recommendation Map of the current user of the application. * @return the recommendations Map of the current user; null indicates that there are no recommendation Maps */ - Map getSongRecommendations(); + List getCurrentTopTracks(); /** * Sets the song recommendations map. * @param songRecommendations the new song recommendation Map; null to indicate that there is no recommendations. */ - void setSongRecommendations(Map songRecommendations); + void setSongRecommendations(List songRecommendations); } From ca5057b525138437886b471f1a1bfdee99df79d2 Mon Sep 17 00:00:00 2001 From: quinn Date: Wed, 27 Nov 2024 16:05:57 -0500 Subject: [PATCH 199/262] Removed deprecated tests --- .../use_case/login/LoginInteractorTest.java | 69 ++----------------- 1 file changed, 7 insertions(+), 62 deletions(-) diff --git a/src/test/java/use_case/login/LoginInteractorTest.java b/src/test/java/use_case/login/LoginInteractorTest.java index 9fc1bfc89..0e7df2caf 100644 --- a/src/test/java/use_case/login/LoginInteractorTest.java +++ b/src/test/java/use_case/login/LoginInteractorTest.java @@ -6,27 +6,25 @@ import entity.UserFactory; import org.junit.jupiter.api.Test; -import java.time.LocalDateTime; - import static org.junit.jupiter.api.Assertions.*; class LoginInteractorTest { @Test void successTest() { - LoginInputData inputData = new LoginInputData("Paul", "password"); + LoginInputData inputData = new LoginInputData("Generic token"); LoginUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); // For the success test, we need to add Paul to the data access repository before we log in. UserFactory factory = new CommonUserFactory(); - User user = factory.create("Paul", "password"); + User user = factory.create("Generic token"); userRepository.save(user); // This creates a successPresenter that tests whether the test case is as we expect. LoginOutputBoundary successPresenter = new LoginOutputBoundary() { @Override public void prepareSuccessView(LoginOutputData user) { - assertEquals("Paul", user.getUsername()); + assertEquals("Generic token", user.getAccessToken()); } @Override @@ -41,19 +39,19 @@ public void prepareFailView(String error) { @Test void successUserLoggedInTest() { - LoginInputData inputData = new LoginInputData("Paul", "password"); + LoginInputData inputData = new LoginInputData("Generic token"); LoginUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); // For the success test, we need to add Paul to the data access repository before we log in. UserFactory factory = new CommonUserFactory(); - User user = factory.create("Paul", "password"); + User user = factory.create("Generic token"); userRepository.save(user); // This creates a successPresenter that tests whether the test case is as we expect. LoginOutputBoundary successPresenter = new LoginOutputBoundary() { @Override public void prepareSuccessView(LoginOutputData user) { - assertEquals("Paul", userRepository.getCurrentUsername()); + assertEquals("Generic token", userRepository.getCurrentAccessToken()); } @Override @@ -63,62 +61,9 @@ public void prepareFailView(String error) { }; LoginInputBoundary interactor = new LoginInteractor(userRepository, successPresenter); - assertEquals(null, userRepository.getCurrentUsername()); - - interactor.execute(inputData); - } - - @Test - void failurePasswordMismatchTest() { - LoginInputData inputData = new LoginInputData("Paul", "wrong"); - LoginUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); - - // For this failure test, we need to add Paul to the data access repository before we log in, and - // the passwords should not match. - UserFactory factory = new CommonUserFactory(); - User user = factory.create("Paul", "password"); - userRepository.save(user); - - // This creates a presenter that tests whether the test case is as we expect. - LoginOutputBoundary failurePresenter = new LoginOutputBoundary() { - @Override - public void prepareSuccessView(LoginOutputData user) { - // this should never be reached since the test case should fail - fail("Use case success is unexpected."); - } - - @Override - public void prepareFailView(String error) { - assertEquals("Incorrect password for \"Paul\".", error); - } - }; + assertEquals(null, userRepository.getCurrentAccessToken()); - LoginInputBoundary interactor = new LoginInteractor(userRepository, failurePresenter); interactor.execute(inputData); } - @Test - void failureUserDoesNotExistTest() { - LoginInputData inputData = new LoginInputData("Paul", "password"); - LoginUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); - - // Add Paul to the repo so that when we check later they already exist - - // This creates a presenter that tests whether the test case is as we expect. - LoginOutputBoundary failurePresenter = new LoginOutputBoundary() { - @Override - public void prepareSuccessView(LoginOutputData user) { - // this should never be reached since the test case should fail - fail("Use case success is unexpected."); - } - - @Override - public void prepareFailView(String error) { - assertEquals("Paul: Account does not exist.", error); - } - }; - - LoginInputBoundary interactor = new LoginInteractor(userRepository, failurePresenter); - interactor.execute(inputData); - } } \ No newline at end of file From c9dd850461a24da6eb8855c8c1dc354a1cd493c9 Mon Sep 17 00:00:00 2001 From: quinn Date: Wed, 27 Nov 2024 16:17:03 -0500 Subject: [PATCH 200/262] Removed deprecated use case and refactored methods to remove reference to username. Also created test for LanguageModelDataAccessObject with 100% coverage. --- .../LanguageModelDataAccessObject.java | 8 ++-- .../login/LoginPresenter.java | 2 +- .../ChangePasswordInteractor.java | 32 ---------------- .../java/use_case/login/LoginOutputData.java | 2 +- src/main/java/view/LoggedInView.java | 38 ------------------- .../LanguageModelDataAccessObjectTest.java | 18 +++++++++ .../SpotifyDataAccessObjectTest.java | 5 +-- .../use_case/logout/LogoutInteractorTest.java | 10 ++--- 8 files changed, 31 insertions(+), 84 deletions(-) delete mode 100644 src/main/java/use_case/change_password/ChangePasswordInteractor.java create mode 100644 src/test/java/data_access/LanguageModelDataAccessObjectTest.java diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index 24c5d833a..66b16ca69 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -26,8 +26,8 @@ public class LanguageModelDataAccessObject implements RecommendLanguageModelDataAccessInterface, SearchLanguageModelDataAccessInterface { - private String endpoint = "https://spotifycompanion.openai.azure.com/"; - private String accessToken; + final private String endpoint = "https://spotifycompanion.openai.azure.com/"; + final private String accessToken; public LanguageModelDataAccessObject() { accessToken = getKey(); @@ -40,7 +40,6 @@ public LanguageModelDataAccessObject() { private String getKey() { final File file; file = new File("src/keys"); - file.length(); String key = "not found"; try { final BufferedReader br = new BufferedReader(new FileReader(file)); @@ -49,7 +48,8 @@ private String getKey() { br.close(); } catch (FileNotFoundException ex) { - System.out.println("The file does not exist"); + System.out.println("The file which should contain the " + + "azure access token does not exist in the correct place. Either create the file and place a valid api key in it or move the file to the src folder"); } catch (IOException ex) { System.out.println("Error reading file"); diff --git a/src/main/java/interface_adapter/login/LoginPresenter.java b/src/main/java/interface_adapter/login/LoginPresenter.java index 087996fd2..707fef163 100644 --- a/src/main/java/interface_adapter/login/LoginPresenter.java +++ b/src/main/java/interface_adapter/login/LoginPresenter.java @@ -28,7 +28,7 @@ public void prepareSuccessView(LoginOutputData response) { // On success, switch to the logged in view. final LoggedInState loggedInState = loggedInViewModel.getState(); - loggedInState.setUsername(response.getUsername()); + loggedInState.setUsername(response.getAccessToken()); this.loggedInViewModel.setState(loggedInState); this.loggedInViewModel.firePropertyChanged(); diff --git a/src/main/java/use_case/change_password/ChangePasswordInteractor.java b/src/main/java/use_case/change_password/ChangePasswordInteractor.java deleted file mode 100644 index 281eaead1..000000000 --- a/src/main/java/use_case/change_password/ChangePasswordInteractor.java +++ /dev/null @@ -1,32 +0,0 @@ -package use_case.change_password; - -import entity.User; -import entity.UserFactory; - -/** - * The Change Password Interactor. - */ -/* public class ChangePasswordInteractor implements ChangePasswordInputBoundary { - private final ChangePasswordUserDataAccessInterface userDataAccessObject; - private final ChangePasswordOutputBoundary userPresenter; - private final UserFactory userFactory; - - public ChangePasswordInteractor(ChangePasswordUserDataAccessInterface changePasswordDataAccessInterface, - ChangePasswordOutputBoundary changePasswordOutputBoundary, - UserFactory userFactory) { - this.userDataAccessObject = changePasswordDataAccessInterface; - this.userPresenter = changePasswordOutputBoundary; - this.userFactory = userFactory; - } - - @Override - public void execute(ChangePasswordInputData changePasswordInputData) { - final User user = userFactory.create(changePasswordInputData.getUsername(), - changePasswordInputData.getPassword()); - userDataAccessObject.changePassword(user); - - final ChangePasswordOutputData changePasswordOutputData = new ChangePasswordOutputData(user.getAccessToken(), - false); - userPresenter.prepareSuccessView(changePasswordOutputData); - } -} */ diff --git a/src/main/java/use_case/login/LoginOutputData.java b/src/main/java/use_case/login/LoginOutputData.java index 02b46b8f6..11dab6f52 100644 --- a/src/main/java/use_case/login/LoginOutputData.java +++ b/src/main/java/use_case/login/LoginOutputData.java @@ -13,7 +13,7 @@ public LoginOutputData(String accessToken, boolean useCaseFailed) { this.useCaseFailed = useCaseFailed; } - public String getUsername() { + public String getAccessToken() { return accessToken; } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 64b06abf7..d90ef2a55 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -96,44 +96,6 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); -// passwordInputField.getDocument().addDocumentListener(new DocumentListener() { -// -// private void documentListenerHelper() { -// final LoggedInState currentState = loggedInViewModel.getState(); -// currentState.setPassword(passwordInputField.getText()); -// loggedInViewModel.setState(currentState); -// } -// -// @Override -// public void insertUpdate(DocumentEvent e) { -// documentListenerHelper(); -// } -// -// @Override -// public void removeUpdate(DocumentEvent e) { -// documentListenerHelper(); -// } -// -// @Override -// public void changedUpdate(DocumentEvent e) { -// documentListenerHelper(); -// } -// }); - -// changePassword.addActionListener( -// // This creates an anonymous subclass of ActionListener and instantiates it. -// evt -> { -// if (evt.getSource().equals(changePassword)) { -// final LoggedInState currentState = loggedInViewModel.getState(); -// -// this.changePasswordController.execute( -// currentState.getUsername(), -// currentState.getPassword() -// ); -// } -// } -// ); - logOut.addActionListener( // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { diff --git a/src/test/java/data_access/LanguageModelDataAccessObjectTest.java b/src/test/java/data_access/LanguageModelDataAccessObjectTest.java new file mode 100644 index 000000000..3516f1ea0 --- /dev/null +++ b/src/test/java/data_access/LanguageModelDataAccessObjectTest.java @@ -0,0 +1,18 @@ +package data_access; + +import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class LanguageModelDataAccessObjectTest { + + @Test + public void queryTest(){ + // checks that the key is in the right place and is functional + LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); + final String response = languageModelDataAccessObject.query("A song where a man steals a car piece by piece."); + + assertNotNull(response); + + } +} diff --git a/src/test/java/data_access/SpotifyDataAccessObjectTest.java b/src/test/java/data_access/SpotifyDataAccessObjectTest.java index 76bbfc3dd..29f960339 100644 --- a/src/test/java/data_access/SpotifyDataAccessObjectTest.java +++ b/src/test/java/data_access/SpotifyDataAccessObjectTest.java @@ -1,6 +1,5 @@ package data_access; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -11,7 +10,7 @@ class SpotifyDataAccessObjectTest { @Test - void getCurrentTopTracks() { + void getCurrentTopTracksTest() { List expected = new ArrayList(); expected.add("Lovefool"); expected.add("Надія є"); @@ -22,7 +21,7 @@ void getCurrentTopTracks() { } @Test - void getCurrentTopArtists() { + void getCurrentTopArtistsTest() { List expected = new ArrayList(); expected.add("Mad Heads"); expected.add("Haydamaky"); diff --git a/src/test/java/use_case/logout/LogoutInteractorTest.java b/src/test/java/use_case/logout/LogoutInteractorTest.java index b005a402c..6cc242420 100644 --- a/src/test/java/use_case/logout/LogoutInteractorTest.java +++ b/src/test/java/use_case/logout/LogoutInteractorTest.java @@ -12,21 +12,21 @@ class LogoutInteractorTest { @Test void successTest() { - LogoutInputData inputData = new LogoutInputData("Paul"); + LogoutInputData inputData = new LogoutInputData("Generic token"); InMemoryUserDataAccessObject userRepository = new InMemoryUserDataAccessObject(); // For the success test, we need to add Paul to the data access repository before we log in. UserFactory factory = new CommonUserFactory(); - User user = factory.create("Paul", "password"); + User user = factory.create("Generic token"); userRepository.save(user); - userRepository.setCurrentUsername("Paul"); + userRepository.setCurrentAccessToken("Generic token"); // This creates a successPresenter that tests whether the test case is as we expect. LogoutOutputBoundary successPresenter = new LogoutOutputBoundary() { @Override public void prepareSuccessView(LogoutOutputData user) { // check that the output data contains the username of who logged out - assertEquals("Paul", user.getUsername()); + assertEquals("Generic token", user.getUsername()); } @Override @@ -38,7 +38,7 @@ public void prepareFailView(String error) { LogoutInputBoundary interactor = new LogoutInteractor(userRepository, successPresenter); interactor.execute(inputData); // check that the user was logged out - assertNull(userRepository.getCurrentUsername()); + assertNull(userRepository.getCurrentAccessToken()); } } \ No newline at end of file From 0c9964e39885f0a27cb010514629a7b6b9bb0083 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:34:09 -0500 Subject: [PATCH 201/262] Added an ActionListener for homeButton to make it functional. --- src/main/java/view/TopItemsView.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/view/TopItemsView.java b/src/main/java/view/TopItemsView.java index 8c13348b7..d74c53075 100644 --- a/src/main/java/view/TopItemsView.java +++ b/src/main/java/view/TopItemsView.java @@ -2,6 +2,7 @@ import javax.swing.*; +import interface_adapter.login.LoginController; import interface_adapter.top_items.TopItemsState; import interface_adapter.top_items.TopItemsViewModel; import org.jfree.chart.ChartFactory; @@ -20,6 +21,7 @@ public class TopItemsView extends JPanel implements PropertyChangeListener { private final String viewName = "Top Items"; private final TopItemsViewModel topItemsViewModel; + private LoginController loginController; private final JLabel welcomeLabel; private final JButton homeButton; @@ -65,6 +67,16 @@ public TopItemsView(TopItemsViewModel topItemsViewModel) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + homeButton.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + evt -> { + if (evt.getSource().equals(homeButton)) { + final String accessToken = topItemsViewModel.getState().getAccessToken(); + loginController.execute(accessToken); + } + } + ); + this.add(welcomeLabel); this.add(chartLayoutPanel); this.add(homeButton); @@ -81,6 +93,9 @@ public String getViewName() { return viewName; } + public void setLoginController(LoginController loginController) { + this.loginController = loginController; + } /** * The method updates the dataset for the Top Tracks Graph. * @param state stands for the TopItemsState that is being used. From 07bf689e84d3b0c9077727d353efcaf8a2df64cf Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:34:57 -0500 Subject: [PATCH 202/262] Added accessToken into the TopItemsState. Updated the constructor and added get set methods for accessToken. --- .../interface_adapter/top_items/TopItemsState.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/interface_adapter/top_items/TopItemsState.java b/src/main/java/interface_adapter/top_items/TopItemsState.java index 1afe9b0fe..96f6561d2 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsState.java +++ b/src/main/java/interface_adapter/top_items/TopItemsState.java @@ -10,10 +10,12 @@ public class TopItemsState { private List artists; private String tracksError; private String artistsError; + private String accessToken; public TopItemsState(TopItemsState copy) { - // tracks = copy.tracks; - // tracksError = copy.tracksError; + tracks = copy.tracks; + tracksError = copy.tracksError; + accessToken = copy.accessToken; } // Because of the previous copy constructor, the default constructor must be explicit. @@ -53,5 +55,13 @@ public void setArtistsError(String artistsError) { this.artistsError = artistsError; } + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getAccessToken() { + return accessToken; + } + } From 4287e8cd487a94a68bbd72861353c5bbe14c993a Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:35:27 -0500 Subject: [PATCH 203/262] Revised the prepareSuccessView in order to make it functional for the home button. --- src/main/java/interface_adapter/top_items/TopItemsPresenter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java index 423635a27..241ca093e 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java +++ b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java @@ -23,6 +23,7 @@ public void prepareSuccessView(TopItemsOutputData outputData) { final TopItemsState topItemsState = topItemsViewModel.getState(); topItemsState.setTracks(outputData.getTracks()); topItemsState.setArtists(outputData.getArtists()); + topItemsState.setAccessToken(outputData.getAccessToken()); this.topItemsViewModel.setState(topItemsState); topItemsViewModel.firePropertyChanged(); From 8581c9e0cfe63d38d02f64455c671e332dfbb995 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:35:53 -0500 Subject: [PATCH 204/262] Added the accessToken variable into the Output class and added get set methods. --- .../java/use_case/top_items/TopItemsOutputData.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/use_case/top_items/TopItemsOutputData.java b/src/main/java/use_case/top_items/TopItemsOutputData.java index 1b1261321..1752dc988 100644 --- a/src/main/java/use_case/top_items/TopItemsOutputData.java +++ b/src/main/java/use_case/top_items/TopItemsOutputData.java @@ -9,10 +9,12 @@ public class TopItemsOutputData { private final List tracks; private final List artists; + private String accessToken; - public TopItemsOutputData(List tracks, List artists) { + public TopItemsOutputData(List tracks, List artists, String accessToken) { this.tracks = tracks; this.artists = artists; + this.accessToken = accessToken; } public List getTracks() { @@ -22,4 +24,12 @@ public List getTracks() { public List getArtists() { return artists; } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } } From 06ab63d79c267993f740dde6d1e18e0846c3999e Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:36:16 -0500 Subject: [PATCH 205/262] Revised the interactor to make it functional for the home button. --- src/main/java/use_case/top_items/TopItemsInteractor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index d1515ff36..f942b8b05 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -19,8 +19,9 @@ public TopItemsInteractor(TopItemsUserDataAccessInterface userDataAccessObject, public void execute(TopItemsInputData topItemsInputData) { final List topTracks = userDataAccessObject.getCurrentTopTracks(); final List topArtists = userDataAccessObject.getCurrentTopArtists(); + final String accessToken = topItemsInputData.getAccessToken(); - final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists); + final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, accessToken); topItemsOutputBoundary.prepareSuccessView(outputData); } } From 9f19becf27efb58c526ca7250689f117cbfddd0a Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:36:42 -0500 Subject: [PATCH 206/262] Added the accessToken variable into the input class and made a get method. --- src/main/java/use_case/top_items/TopItemsInputData.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/use_case/top_items/TopItemsInputData.java b/src/main/java/use_case/top_items/TopItemsInputData.java index 9ca5a9b4e..4b41e5018 100644 --- a/src/main/java/use_case/top_items/TopItemsInputData.java +++ b/src/main/java/use_case/top_items/TopItemsInputData.java @@ -9,10 +9,12 @@ public class TopItemsInputData { private final List tracks; private final List artists; + private String accessToken; - public TopItemsInputData(List tracks, List artists) { + public TopItemsInputData(List tracks, List artists, String accessToken) { this.tracks = tracks; this.artists = artists; + this.accessToken = accessToken; } List getTracks() { @@ -22,4 +24,8 @@ List getTracks() { List getArtists() { return artists; } + + public String getAccessToken() { + return accessToken; + } } From a3d02778b9b80d40ff7443cffbfff8f845b1d94a Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:36:59 -0500 Subject: [PATCH 207/262] Updated the controller class to make it functional for the home button. --- .../java/interface_adapter/top_items/TopItemsController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/interface_adapter/top_items/TopItemsController.java b/src/main/java/interface_adapter/top_items/TopItemsController.java index 58f86b963..fa45946c4 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsController.java +++ b/src/main/java/interface_adapter/top_items/TopItemsController.java @@ -20,8 +20,8 @@ public TopItemsController(TopItemsInputBoundary topItemsUseCaseInteractor) { * @param toptracks the top tracks of the user. * @param topartists the top artists of the user. */ - public void execute(List toptracks, List topartists) { - final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, topartists); + public void execute(List toptracks, List topartists, String accessToken) { + final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, topartists, accessToken); topItemsUseCaseInteractor.execute(topItemsInputData); } From 7ed4db2470e4365c6f482cb00955d7b96bc073dc Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:37:51 -0500 Subject: [PATCH 208/262] Updated the LoggedInView to pass the accessToken into the topItems controller and made some refactoring. --- src/main/java/view/LoggedInView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 64b06abf7..35263a493 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -161,11 +161,11 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(topItems)) { - // final String name = topTracksController + final List topTracks = new ArrayList<>(); + final List topArtists = new ArrayList<>(); + final String accessToken = loggedInViewModel.getState().getUsername(); - final List lst1 = new ArrayList<>(); - final List lst2 = new ArrayList<>(); - topItemsController.execute(lst1, lst2); + topItemsController.execute(topTracks, topArtists, accessToken); } } ); From dcf34d6e04ec5442efe3176e3f02154ffede959c Mon Sep 17 00:00:00 2001 From: ceryanki Date: Wed, 27 Nov 2024 16:38:03 -0500 Subject: [PATCH 209/262] Updated the AppBuilder. --- src/main/java/app/AppBuilder.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 71d1decaa..cfd8eae83 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -66,7 +66,7 @@ public class AppBuilder { private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); - private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject("BQDPmgxEeX6U1nUlJKfSiF3dgCNVDFE1qR1lprhYgMMDVMyYb1zsGQ5uYVMOXvk0odD9pQWaLDRN3yuSD_nqeoh9Q3N96EerOA-67bLSNJ3zf-Qtj_EBRiE33I8zraNf7Q5g_LeLHLTIPELxrB0QYotzB6gl8hFFo_NhqWmV7yVwBald5ncDDdILNwj5ymgwiRNdB_icKVhjKJtSrA"); + private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); // Will remove since our project does not cover signing up, only logging in private LoginViewModel loginViewModel; @@ -194,11 +194,20 @@ public AppBuilder addSearchUseCase() { * @return this builder */ public AppBuilder addTopItemsUseCase() { + + final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + final LoginInputBoundary loginInteractor = new LoginInteractor( + userDataAccessObject, loginOutputBoundary); + + final LoginController loginController = new LoginController(loginInteractor); + topItemsView.setLoginController(loginController); + final TopItemsOutputBoundary topItemsOutputBoundary = new TopItemsPresenter(viewManagerModel, topTracksAndArtistsViewModel); final TopItemsInputBoundary topItemsInputBoundary = - new TopItemsInteractor(spotifyDataAccessObject, topItemsOutputBoundary); + new TopItemsInteractor(topItemsUserDataAccessObject, topItemsOutputBoundary); final TopItemsController topItemsController = new TopItemsController(topItemsInputBoundary); loggedInView.setTopTracksController(topItemsController); From a18016d8fb212264a831937165300b49dbbdfd11 Mon Sep 17 00:00:00 2001 From: quinn Date: Wed, 27 Nov 2024 16:40:25 -0500 Subject: [PATCH 210/262] Created SearchInteractor test with 100% coverage and a dummy language model data access object. --- .../SearchTestDataAccessObject.java | 13 +++++ .../use_case/search/SearchInteractorTest.java | 55 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/main/java/data_access/SearchTestDataAccessObject.java create mode 100644 src/test/java/use_case/search/SearchInteractorTest.java diff --git a/src/main/java/data_access/SearchTestDataAccessObject.java b/src/main/java/data_access/SearchTestDataAccessObject.java new file mode 100644 index 000000000..afed8707d --- /dev/null +++ b/src/main/java/data_access/SearchTestDataAccessObject.java @@ -0,0 +1,13 @@ +package data_access; + +import use_case.search.SearchLanguageModelDataAccessInterface; + +public class SearchTestDataAccessObject implements SearchLanguageModelDataAccessInterface { + + public SearchTestDataAccessObject(){} + + @Override + public String query(String prompt) { + return "One Piece at a Time by Johnny Cash"; + } +} diff --git a/src/test/java/use_case/search/SearchInteractorTest.java b/src/test/java/use_case/search/SearchInteractorTest.java new file mode 100644 index 000000000..4f3019844 --- /dev/null +++ b/src/test/java/use_case/search/SearchInteractorTest.java @@ -0,0 +1,55 @@ +package use_case.search; +import data_access.SearchTestDataAccessObject; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.*; + +class SearchInteractorTest { + private SearchTestDataAccessObject dummyLanguageModel; + + @BeforeEach + void setUp() { + dummyLanguageModel = new SearchTestDataAccessObject(); + } + + @Test + void querySuccess(){ + // This creates a successPresenter that tests whether the test case is as we expect. + SearchOutputBoundary successPresenter = new SearchOutputBoundary() { + @Override + public void prepareSuccessView(SearchOutputData outputData) { + assertEquals("One Piece at a Time by Johnny Cash", outputData.getDisplayText()); + } + + @Override + public void prepareFailView(String error) { + fail("Use case failure is unexpected."); + } + }; + + SearchInteractor interactor = new SearchInteractor(dummyLanguageModel, successPresenter); + interactor.executeSearch("Generic Token", "A song in which a man steals a car part by part"); + } + + @Test + void goToPageSuccess(){ + // This creates a successPresenter that tests whether the test case is as we expect. + SearchOutputBoundary successPresenter = new SearchOutputBoundary() { + @Override + public void prepareSuccessView(SearchOutputData outputData) { + assertEquals("Generic Token", outputData.getAccessToken()); + } + + @Override + public void prepareFailView(String error) { + fail("Use case failure is unexpected."); + } + }; + + SearchInteractor interactor = new SearchInteractor(dummyLanguageModel, successPresenter); + interactor.execute("Generic Token"); + } + +} From 2a88ff692a17cb0bebb99647ee4847363b946f9f Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 18:58:53 -0500 Subject: [PATCH 211/262] updated --- .../similar_listeners/SimilarListenersInputData.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java index eff2d98ca..2168ad21c 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInputData.java @@ -9,20 +9,15 @@ public class SimilarListenersInputData { private final String accessToken; - // private final List artistsFollowed; public SimilarListenersInputData(String accessToken) { this.accessToken = accessToken; - // this.artistsFollowed = artistsFollowed; } String getAccessToken() { return accessToken; } - // List getArtistsFollowed() { - // return artistsFollowed; - // } } From c216e6a35f3f0519ba000db8415fd6263b289c86 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:05:36 -0500 Subject: [PATCH 212/262] updated --- .../similar_listeners/SimilarListenersState.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java index 75b497e22..ad8e820b1 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersState.java @@ -8,10 +8,12 @@ public class SimilarListenersState { private List similarArtists; private String similarArtistsError; + private String accessToken; public SimilarListenersState(SimilarListenersState copy) { similarArtists = copy.similarArtists; similarArtistsError = copy.similarArtistsError; + accessToken = copy.accessToken; } // Because of the previous copy constructor, the default constructor must be explicit. @@ -35,4 +37,12 @@ void setSimilarArtistsError(String similarArtistsError) { this.similarArtistsError = similarArtistsError; } + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getAccessToken() { + return accessToken; + } + } From 326465c9f06c6963e5346be502a7e84214fc4ef4 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:10:06 -0500 Subject: [PATCH 213/262] updated --- .../similar_listeners/SimilarListenersOutputData.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java index 6137501e9..a23057dde 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java @@ -6,13 +6,23 @@ public class SimilarListenersOutputData { private final List similarArtists; private final boolean useCaseFailed; + private String accessToken; public SimilarListenersOutputData(List similarArtists, boolean useCaseFailed) { this.similarArtists = similarArtists; this.useCaseFailed = useCaseFailed; + this.accessToken = accessToken; } public List getSimilarArtists() { return similarArtists; } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } } From 34c9caba8513e5b0dd7aa5936820ed9f5ae7ef2a Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:10:09 -0500 Subject: [PATCH 214/262] updated --- .../similar_listeners/SimilarListenersPresenter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index 7bf9c854c..ca0af7c99 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -24,6 +24,7 @@ public SimilarListenersPresenter(SimilarListenersViewModel similarListenersViewM public void prepareSuccessView(SimilarListenersOutputData similarListenersOutputData) { final SimilarListenersState similarListenersState = similarListenersViewModel.getState(); similarListenersState.setSimilarArtists(similarListenersOutputData.getSimilarArtists()); + similarListenersState.setAccessToken(similarListenersOutputData.getAccessToken()); this.similarListenersViewModel.setState(similarListenersState); similarListenersViewModel.firePropertyChanged(); @@ -37,6 +38,7 @@ public void prepareFailView(String errorMessage) { final SimilarListenersState similarListenersState = similarListenersViewModel.getState(); similarListenersState.setSimilarArtistsError(errorMessage); similarListenersState.setSimilarArtists(new ArrayList<>()); + //similarListenersState.setAccessToken(similarListenersOutputData.getAccessToken()); similarListenersViewModel.firePropertyChanged(); this.viewManagerModel.setState(similarListenersViewModel.getViewName()); From dfeee9912a0571e3e7846c13707a523dcf338ddc Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:11:50 -0500 Subject: [PATCH 215/262] updated --- .../use_case/similar_listeners/SimilarListenersInteractor.java | 3 ++- .../use_case/similar_listeners/SimilarListenersOutputData.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java index 3677f8075..04c4360b4 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java @@ -25,8 +25,9 @@ public void execute(SimilarListenersInputData similarListenersInputData) { else { final List followedArtists = userDataAccessObject.getFollowedArtists(); userDataAccessObject.setCurrentFollowedArtists(followedArtists); + final String accessToken = similarListenersInputData.getAccessToken(); final SimilarListenersOutputData similarListenersOutputData = new SimilarListenersOutputData( - followedArtists, false); + followedArtists, false, accessToken); similarListenersPresenter.prepareSuccessView(similarListenersOutputData); } } diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java index a23057dde..b52ed5f96 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersOutputData.java @@ -8,7 +8,7 @@ public class SimilarListenersOutputData { private final boolean useCaseFailed; private String accessToken; - public SimilarListenersOutputData(List similarArtists, boolean useCaseFailed) { + public SimilarListenersOutputData(List similarArtists, boolean useCaseFailed, String accessToken) { this.similarArtists = similarArtists; this.useCaseFailed = useCaseFailed; this.accessToken = accessToken; From 94f865cd705cb475429772f038bbe2e81adf2fe1 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:13:39 -0500 Subject: [PATCH 216/262] updated --- src/main/java/view/SimilarListenersView.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/view/SimilarListenersView.java b/src/main/java/view/SimilarListenersView.java index 6ef5e80e6..9d5ca3863 100644 --- a/src/main/java/view/SimilarListenersView.java +++ b/src/main/java/view/SimilarListenersView.java @@ -3,6 +3,7 @@ import java.util.List; import interface_adapter.ViewManagerModel; +import interface_adapter.login.LoginController; import interface_adapter.login.LoginViewModel; import interface_adapter.similar_listeners.SimilarListenersState; import interface_adapter.similar_listeners.SimilarListenersViewModel; @@ -18,6 +19,7 @@ public class SimilarListenersView extends JPanel implements PropertyChangeListener { private final String viewName = "similar listeners"; private final SimilarListenersViewModel similarListenersViewModel; + private LoginController loginController; private final JButton back; private final JTextArea listOfArtists; @@ -38,16 +40,10 @@ public SimilarListenersView(SimilarListenersViewModel similarListenersViewMo back = new JButton("Go Back"); back.setAlignmentX(Component.CENTER_ALIGNMENT); back.addActionListener( - new ActionListener() { - private final ViewManagerModel viewManagerModel = new ViewManagerModel(); - private final LoginViewModel loginViewModel = new LoginViewModel(); - - public void actionPerformed(ActionEvent evt) { - if (evt.getSource().equals(back)) { - viewManagerModel.setState(loginViewModel.getViewName()); - viewManagerModel.firePropertyChanged(); - - } + evt -> { + if (evt.getSource().equals(back)) { + final String accessToken = similarListenersViewModel.getState().getAccessToken(); + loginController.execute(accessToken); } } ); @@ -62,6 +58,10 @@ public String getViewName() { return viewName; } + public void setLoginController(LoginController loginController) { + this.loginController = loginController; + } + @Override public void propertyChange(PropertyChangeEvent evt) { final SimilarListenersState similarListenersState = (SimilarListenersState) evt.getNewValue(); From f0d5da75ac7abb99f821522a12c17070dd261946 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:14:00 -0500 Subject: [PATCH 217/262] updated addSimilarUseCase method --- src/main/java/app/AppBuilder.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index ea193de1b..3d8d8a0ae 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -43,6 +43,7 @@ import view.LoginView; import view.SearchView; import view.TopItemsView; +import view.SimilarListenersView; import view.ViewManager; @@ -231,6 +232,14 @@ public AppBuilder addTopItemsUseCase() { } public AppBuilder addSimilarListenersUseCase() { + final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + final LoginInputBoundary loginInteractor = new LoginInteractor( + userDataAccessObject, loginOutputBoundary); + + final LoginController loginController = new LoginController(loginInteractor); + similarListenersView.setLoginController(loginController); + final SimilarListenersOutputBoundary similarListenersOutputBoundary = new SimilarListenersPresenter(similarListenersViewModel, viewManagerModel); final SimilarListenersInputBoundary similarListenersInputBoundary = From be16aaba38fb997b62c96b38ab94a9209d99c740 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:14:44 -0500 Subject: [PATCH 218/262] updated --- .../similar_listeners/SimilarListenersPresenter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java index ca0af7c99..21e948b42 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersPresenter.java @@ -38,7 +38,6 @@ public void prepareFailView(String errorMessage) { final SimilarListenersState similarListenersState = similarListenersViewModel.getState(); similarListenersState.setSimilarArtistsError(errorMessage); similarListenersState.setSimilarArtists(new ArrayList<>()); - //similarListenersState.setAccessToken(similarListenersOutputData.getAccessToken()); similarListenersViewModel.firePropertyChanged(); this.viewManagerModel.setState(similarListenersViewModel.getViewName()); From 6408078fbe318698b3a776498738af71a21eda20 Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Wed, 27 Nov 2024 19:32:52 -0500 Subject: [PATCH 219/262] updated test to get 100 percent coverage --- .../SimilarListenersInteractorTest.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java index 9e92ff645..f8b407b9c 100644 --- a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java +++ b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java @@ -35,6 +35,7 @@ public void prepareSuccessView(SimilarListenersOutputData outputData) { // check that the output data contains the username of who logged out assertEquals(allfollowedArtists, outputData.getSimilarArtists()); assertEquals("Madonna", outputData.getSimilarArtists().get(2)); + assertEquals("token", outputData.getAccessToken()); } @Override @@ -72,5 +73,14 @@ public void prepareFailView(String error) { interactor.execute(inputData); } + @Test + void tokenTest() { + SimilarListenersOutputData outputData = + new SimilarListenersOutputData(new ArrayList<>(), false, "token"); + outputData.setAccessToken("new token"); + assertEquals("new token", outputData.getAccessToken()); + + } + } + -} From 65f558e9b8f8eefabda3874717d08a42d502eba0 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 20:16:02 -0500 Subject: [PATCH 220/262] Added top artists in recommendationView description --- .../LanguageModelDataAccessObject.java | 10 ++++---- .../data_access/SpotifyDataAccessObject.java | 23 +++++++++++++++++-- .../recommend/RecommendController.java | 5 ++-- .../recommend/RecommendPresenter.java | 1 + .../recommend/RecommendState.java | 9 ++++++++ .../recommend/RecommendInputData.java | 13 ++++++++--- .../recommend/RecommendInteractor.java | 5 ++-- ...mmendLanguageModelDataAccessInterface.java | 2 +- .../recommend/RecommendOutputData.java | 8 ++++++- .../RecommendSpotifyDataAccessInterface.java | 6 +++++ src/main/java/view/LoggedInView.java | 5 ++-- src/main/java/view/RecommendationsView.java | 16 ++++++------- 12 files changed, 76 insertions(+), 27 deletions(-) diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index 418d60239..3357b96cd 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -83,16 +83,16 @@ public String query(String prompt) { } @Override - public String getRecommendations(List songs) { + public String getRecommendations(List songs, String topArtists) { final OpenAIClient client = new OpenAIClientBuilder() .credential(new AzureKeyCredential(accessToken)) .endpoint(endpoint) .buildClient(); final List chatMessages = new ArrayList<>(); - chatMessages.add(new ChatRequestSystemMessage("You are a Spotify analyst, you will either send back a " - + "list of songs which are similar to a provided list.")); - chatMessages.add(new ChatRequestUserMessage("Can you help me find songs similar to " + songs - + "which is a list of songs where each song is followed by its artist name.")); + chatMessages.add(new ChatRequestSystemMessage("You are a Spotify analyst, you will send back a " + + "list of songs which are similar to a provided list of songs and artists that a user has listened to.")); + chatMessages.add(new ChatRequestUserMessage("A user's top artists are" + topArtists + + ". Their top tracks are" + songs + ". What are some song recommendations, based on these?")); chatMessages.add(new ChatRequestUserMessage(String.valueOf(songs))); final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 3a61890fd..44bb698c7 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -190,7 +190,27 @@ private void getRecommendationsSync() { @Override public List getCurrentTopTracks() { - return this.currentTopTracks; +// return this.currentTopTracks; + final List lst = new ArrayList(); + lst.add("(sic)"); + lst.add("Left Behind"); + lst.add("Spit It Out"); + lst.add("People = Shit"); + lst.add("Metabolic"); + lst.add("Everything Ends"); + return lst; + } + + @Override + public String getTopArtists() { +// final List lst = getCurrentTopArtists(); +// final StringBuilder sb = new StringBuilder(); +// for (Object o : lst) { +// sb.append(o); +// sb.append(","); +// } +// return sb.toString(); + return "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; } @Override @@ -217,7 +237,6 @@ public List getFollowedArtists() { @Override public void setCurrentFollowedArtists(List followedArtists) { this.currFollowedArtists = followedArtists; - } } diff --git a/src/main/java/interface_adapter/recommend/RecommendController.java b/src/main/java/interface_adapter/recommend/RecommendController.java index 09d071926..3e506c6b7 100644 --- a/src/main/java/interface_adapter/recommend/RecommendController.java +++ b/src/main/java/interface_adapter/recommend/RecommendController.java @@ -1,5 +1,6 @@ package interface_adapter.recommend; +import java.util.List; import java.util.Map; import use_case.recommend.RecommendInputBoundary; @@ -19,9 +20,9 @@ public RecommendController(RecommendInputBoundary recommendUseCaseInteractor) { * Executes the Recommend Use Case. * @param songRecommendations the map of song recommendations in the form of song, artist */ - public void execute(Map songRecommendations, String accessToken) { + public void execute(List songRecommendations, String topArtists, String accessToken) { final RecommendInputData recommendInputData = new RecommendInputData( - songRecommendations, accessToken); + songRecommendations, topArtists, accessToken); recommendUseCaseInteractor.execute(recommendInputData); } diff --git a/src/main/java/interface_adapter/recommend/RecommendPresenter.java b/src/main/java/interface_adapter/recommend/RecommendPresenter.java index 235bc1806..7aa5e3b28 100644 --- a/src/main/java/interface_adapter/recommend/RecommendPresenter.java +++ b/src/main/java/interface_adapter/recommend/RecommendPresenter.java @@ -21,6 +21,7 @@ public RecommendPresenter(ViewManagerModel viewManagerModel, public void prepareSuccessView(RecommendOutputData output) { final RecommendState recommendState = recommendViewModel.getState(); recommendState.setAccessToken(output.getAccessToken()); + recommendState.setTopArtists(output.getTopArtists()); recommendState.setSongRecommendations(output.getSongRecommendations()); this.recommendViewModel.setState(recommendState); this.recommendViewModel.firePropertyChanged(); diff --git a/src/main/java/interface_adapter/recommend/RecommendState.java b/src/main/java/interface_adapter/recommend/RecommendState.java index 0a036ebc6..14ccb0b96 100644 --- a/src/main/java/interface_adapter/recommend/RecommendState.java +++ b/src/main/java/interface_adapter/recommend/RecommendState.java @@ -6,6 +6,7 @@ public class RecommendState { private String songRecommendations; private String accessToken; + private String topArtists; // Because of the previous copy constructor, the default constructor must be explicit. public RecommendState() { @@ -27,4 +28,12 @@ public void setAccessToken(String accessToken) { public String getAccessToken() { return accessToken; } + + public void setTopArtists(String topArtists) { + this.topArtists = topArtists; + } + + public String getTopArtists() { + return topArtists; + } } diff --git a/src/main/java/use_case/recommend/RecommendInputData.java b/src/main/java/use_case/recommend/RecommendInputData.java index d870c3b2e..c2a04cf71 100644 --- a/src/main/java/use_case/recommend/RecommendInputData.java +++ b/src/main/java/use_case/recommend/RecommendInputData.java @@ -1,5 +1,6 @@ package use_case.recommend; +import java.util.List; import java.util.Map; /** @@ -7,18 +8,24 @@ */ public class RecommendInputData { - private final Map songRecommendations; + private final List songRecommendations; + private final String topArtists; private String accessToken; - public RecommendInputData(Map songRecommendations, String accessToken) { + public RecommendInputData(List songRecommendations, String topArtists, String accessToken) { this.songRecommendations = songRecommendations; + this.topArtists = topArtists; this.accessToken = accessToken; } - public Map getListeningHistory() { + public List getListeningHistory() { return songRecommendations; } + public String getTopArtists() { + return topArtists; + } + public String getAccessToken() { return accessToken; } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index 4f97c86db..afcd70c81 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -23,12 +23,13 @@ public RecommendInteractor(RecommendLanguageModelDataAccessInterface recommendDa public void execute(RecommendInputData recommendInputData) { // Calls Spotify API to get user data final List songs = spotifyDataAccessObject.getCurrentTopTracks(); + final String topArtists = spotifyDataAccessObject.getTopArtists(); // Takes user data and asks Azure for recommendations - final String songRecommendations = recommendDataAccessObject.getRecommendations(songs); + final String songRecommendations = recommendDataAccessObject.getRecommendations(songs, topArtists); // Gets access token final String accessToken = recommendInputData.getAccessToken(); - final RecommendOutputData outputData = new RecommendOutputData(songRecommendations, accessToken); + final RecommendOutputData outputData = new RecommendOutputData(songRecommendations, topArtists, accessToken); recommendationOutputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java index 6adb141ed..96c3ef205 100644 --- a/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendLanguageModelDataAccessInterface.java @@ -11,5 +11,5 @@ public interface RecommendLanguageModelDataAccessInterface { * @param prompt is a list of strings which the model will respond to * @return the model's response to that prompt */ - String getRecommendations(List prompt); + String getRecommendations(List prompt, String topArtists); } diff --git a/src/main/java/use_case/recommend/RecommendOutputData.java b/src/main/java/use_case/recommend/RecommendOutputData.java index 4fb176a58..1cc81d1b4 100644 --- a/src/main/java/use_case/recommend/RecommendOutputData.java +++ b/src/main/java/use_case/recommend/RecommendOutputData.java @@ -5,10 +5,12 @@ */ public class RecommendOutputData { private final String songRecommendations; + private final String topArtists; private String accessToken; - public RecommendOutputData(String songRecommendations, String accessToken) { + public RecommendOutputData(String songRecommendations, String topArtists, String accessToken) { this.songRecommendations = songRecommendations; + this.topArtists = topArtists; this.accessToken = accessToken; } @@ -23,4 +25,8 @@ public String getAccessToken() { public void setAccessToken(String accessToken) { this.accessToken = accessToken; } + + public String getTopArtists() { + return topArtists; + } } diff --git a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java index 5cd5d23a5..9ca7d414f 100644 --- a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java @@ -11,4 +11,10 @@ public interface RecommendSpotifyDataAccessInterface { * @return a map of songs that the user listened to most recently */ List getCurrentTopTracks(); + + /** + * Sends a query to the Spotify at the API endpoint. + * @return a String of the user's top artists + */ + String getTopArtists(); } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index e57299110..1df254bfe 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -166,10 +166,11 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(recommendations)) { // final String name = topTracksController - final Map songRecommendations = new HashMap<>(); + final List songRecommendations = new ArrayList<>(); + final String artistRecommendations = ""; final String accessToken = loggedInViewModel.getState().getUsername(); System.out.println(accessToken); - recommendController.execute(songRecommendations, accessToken); + recommendController.execute(songRecommendations, artistRecommendations, accessToken); } } ); diff --git a/src/main/java/view/RecommendationsView.java b/src/main/java/view/RecommendationsView.java index a9fb0a733..9907e1ebd 100644 --- a/src/main/java/view/RecommendationsView.java +++ b/src/main/java/view/RecommendationsView.java @@ -24,7 +24,7 @@ public class RecommendationsView extends JPanel implements PropertyChangeListene private final RecommendViewModel recommendViewModel; private LoginController loginController; - private final JButton refreshButton; + private JLabel topArtists; private final JTextArea songsTextArea; private final JButton homeButton; @@ -36,8 +36,8 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { final JPanel titlePanel = new JPanel(); titlePanel.add(title); - final JLabel description = new JLabel("Based on your listening history, " - +"here are some songs you might like:"); + final JLabel description = new JLabel("Because you've listened to " + topArtists + + "here are some songs you might like:"); final JPanel descriptionPanel = new JPanel(); descriptionPanel.add(description); @@ -46,12 +46,10 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { homeButtonPanel.add(homeButton); final JPanel songsPanel = new JPanel(); - refreshButton = new JButton("Refresh"); songsTextArea = new JTextArea(); songsTextArea.setText("TO DO: Get songs to show here"); final JScrollPane songsScrollPane = new JScrollPane(songsTextArea); songsPanel.add(songsScrollPane); - songsPanel.add(refreshButton); // changePassword.addActionListener( // // This creates an anonymous subclass of ActionListener and instantiates it. @@ -97,6 +95,10 @@ public void propertyChange(PropertyChangeEvent evt) { } private void setFields(RecommendState state) { + topArtists = new JLabel(); + String topArtistsText = state.getTopArtists() != null ? state.getTopArtists() : "No top artists available"; + topArtists.setText(topArtistsText); + System.out.println(topArtistsText); songsTextArea.setText(state.getSongRecommendations()); } @@ -107,8 +109,4 @@ public String getViewName() { public void setLoginController(LoginController loginController) { this.loginController = loginController; } - - public String getArtist() { - return "INSERT ARTIST"; - } } From a23c235664a4845f37e5b72c4f2aba474f9d496f Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 21:01:30 -0500 Subject: [PATCH 221/262] Changed formating of Chat GPT response --- .../LanguageModelDataAccessObject.java | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index 1e0963cc8..b00d1acd0 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -5,10 +5,7 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import com.azure.ai.openai.OpenAIClient; import com.azure.ai.openai.OpenAIClientBuilder; @@ -98,6 +95,38 @@ public String getRecommendations(List songs, String topArtists) { final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", new ChatCompletionsOptions(chatMessages)); final int back = chatCompletions.getChoices().size() - 1; - return chatCompletions.getChoices().get(back).getMessage().getContent(); + String response = chatCompletions.getChoices().get(back).getMessage().getContent(); + + // Removes extra characters placed by the AI + response = response.replace("*", ""); + + String[] lines = response.split("\n"); + + System.out.println("Output:"); + for (String line : lines) { + System.out.println(line + "|"); + } + + // Check if there are at least three lines + if (lines.length <= 2) { + // If there are less than 3 lines, return an empty string or handle as desired + return ""; + } + + // Create a new StringBuilder to hold the result + StringBuilder result = new StringBuilder(); + + // Append lines from the second to the second last (index 1 to length-2) + for (int i = 1; i < lines.length - 1; i++) { + if (!Objects.equals(lines[i], "")) { + result.append(lines[i]); + } + if (i < lines.length - 2) { + result.append("\n"); // Add a newline character if not the last line + } + } + + // Return the result as a string + return result.toString(); } } From 7d894ae6d7024500bffe902f34fc29e68cfb367a Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 21:08:04 -0500 Subject: [PATCH 222/262] Fixed issue in logging in --- src/main/java/app/AppBuilder.java | 2 +- src/main/java/app/Main.java | 4 ++-- .../data_access/LanguageModelDataAccessObject.java | 11 ----------- src/main/java/view/LoggedInView.java | 5 ----- 4 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index feacabb6b..58a56125c 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -278,7 +278,7 @@ public JFrame build() { application.add(cardPanel); - viewManagerModel.setState(loggedInView.getViewName()); + viewManagerModel.setState(loginView.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 7d5d77dc9..6f77dd455 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -17,13 +17,13 @@ public static void main(String[] args) { final AppBuilder appBuilder = new AppBuilder(); final JFrame application = appBuilder .addLoginView() - .addLoginUseCase() .addLoggedInView() .addRecommendationsView() - .addRecommendUseCase() .addSearchView() .addTopItemsView() + .addLoginUseCase() .addLogoutUseCase() + .addRecommendUseCase() .addSearchUseCase() .addTopItemsUseCase() .build(); diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index b00d1acd0..7e2c545fd 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -102,17 +102,6 @@ public String getRecommendations(List songs, String topArtists) { String[] lines = response.split("\n"); - System.out.println("Output:"); - for (String line : lines) { - System.out.println(line + "|"); - } - - // Check if there are at least three lines - if (lines.length <= 2) { - // If there are less than 3 lines, return an empty string or handle as desired - return ""; - } - // Create a new StringBuilder to hold the result StringBuilder result = new StringBuilder(); diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 5a6b23711..dd9b2e40c 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -131,7 +131,6 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final List songRecommendations = new ArrayList<>(); final String artistRecommendations = ""; final String accessToken = loggedInViewModel.getState().getUsername(); - System.out.println(accessToken); recommendController.execute(songRecommendations, artistRecommendations, accessToken); } } @@ -195,10 +194,6 @@ public String getViewName() { return viewName; } -// public void setChangePasswordController(ChangePasswordController changePasswordController) { -// this.changePasswordController = changePasswordController; -// } - public void setLogoutController(LogoutController logoutController) { this.logoutController = logoutController; } From 8419428536d7e02edf9037193913e8f65fd7431e Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 22:12:48 -0500 Subject: [PATCH 223/262] Deleted hard-coded data to use api --- .../data_access/SpotifyDataAccessObject.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 44bb698c7..5bf45c49f 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -2,17 +2,10 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; - -import entity.CommonUser; -import entity.User; import interface_adapter.login.LoginState; import org.apache.hc.core5.http.ParseException; -import org.json.JSONException; -import org.json.JSONObject; import se.michaelthelin.spotify.SpotifyApi; import se.michaelthelin.spotify.enums.ModelObjectType; import se.michaelthelin.spotify.exceptions.SpotifyWebApiException; @@ -190,27 +183,32 @@ private void getRecommendationsSync() { @Override public List getCurrentTopTracks() { -// return this.currentTopTracks; - final List lst = new ArrayList(); - lst.add("(sic)"); - lst.add("Left Behind"); - lst.add("Spit It Out"); - lst.add("People = Shit"); - lst.add("Metabolic"); - lst.add("Everything Ends"); - return lst; + // Used for testing +// final List lst = new ArrayList(); +// lst.add("(sic)"); +// lst.add("Left Behind"); +// lst.add("Spit It Out"); +// lst.add("People = Shit"); +// lst.add("Metabolic"); +// lst.add("Everything Ends"); +// return lst; + + return this.currentTopTracks; } @Override public String getTopArtists() { -// final List lst = getCurrentTopArtists(); -// final StringBuilder sb = new StringBuilder(); -// for (Object o : lst) { -// sb.append(o); -// sb.append(","); -// } -// return sb.toString(); - return "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; + // Used for testing +// return "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; + final List lst = getCurrentTopArtists(); + final StringBuilder sb = new StringBuilder(); + + for (Object o : lst) { + sb.append(o); + sb.append(","); + } + + return sb.toString(); } @Override From 196797bb74afac341f64bfb55f759276627a0693 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 22:16:18 -0500 Subject: [PATCH 224/262] Updated spotify api --- .../data_access/SpotifyDataAccessObject.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 5bf45c49f..e3106020d 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -183,29 +183,20 @@ private void getRecommendationsSync() { @Override public List getCurrentTopTracks() { - // Used for testing -// final List lst = new ArrayList(); -// lst.add("(sic)"); -// lst.add("Left Behind"); -// lst.add("Spit It Out"); -// lst.add("People = Shit"); -// lst.add("Metabolic"); -// lst.add("Everything Ends"); -// return lst; - return this.currentTopTracks; } @Override public String getTopArtists() { - // Used for testing -// return "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; - final List lst = getCurrentTopArtists(); + final List lst = this.currentTopArtists; final StringBuilder sb = new StringBuilder(); - for (Object o : lst) { - sb.append(o); - sb.append(","); + for (int i = 0; i < lst.size(); i ++) { + sb.append(lst.get(i)); + + if (i != lst.size() - 1) { + sb.append(", "); + } } return sb.toString(); From fc39fed301ab5149ceef738373c47c136e5aba18 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Wed, 27 Nov 2024 22:19:20 -0500 Subject: [PATCH 225/262] Changed button location in home screen, updated views --- src/main/java/view/LoggedInView.java | 9 ++++----- src/main/java/view/RecommendationsView.java | 18 +----------------- .../recommend/RecommendInteractorTest.java | 17 ++++++++++------- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index dd9b2e40c..aea928ec2 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -1,14 +1,12 @@ package view; -import java.awt.Component; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import javax.swing.*; @@ -50,11 +48,12 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final JLabel title = new JLabel("Home Screen"); title.setAlignmentX(Component.CENTER_ALIGNMENT); + final JPanel profile = new JPanel(new FlowLayout(FlowLayout.LEFT)); final JLabel usernameInfo = new JLabel("Currently logged in: "); username = new JLabel(); - - final JPanel profile = new JPanel(); logOut = new JButton("Log Out"); + profile.add(usernameInfo); + profile.add(username); profile.add(logOut); final JButton description = new JButton("Search song by description"); diff --git a/src/main/java/view/RecommendationsView.java b/src/main/java/view/RecommendationsView.java index 9907e1ebd..0bdf0e87f 100644 --- a/src/main/java/view/RecommendationsView.java +++ b/src/main/java/view/RecommendationsView.java @@ -10,7 +10,6 @@ import javax.swing.JScrollPane; import javax.swing.JTextArea; -import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginController; import interface_adapter.recommend.RecommendState; import interface_adapter.recommend.RecommendViewModel; @@ -47,24 +46,10 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { final JPanel songsPanel = new JPanel(); songsTextArea = new JTextArea(); - songsTextArea.setText("TO DO: Get songs to show here"); + songsTextArea.setText("Error: songs not displaying"); final JScrollPane songsScrollPane = new JScrollPane(songsTextArea); songsPanel.add(songsScrollPane); -// changePassword.addActionListener( -// // This creates an anonymous subclass of ActionListener and instantiates it. -// evt -> { -// if (evt.getSource().equals(changePassword)) { -// final LoggedInState currentState = loggedInViewModel.getState(); -// -// this.changePasswordController.execute( -// currentState.getUsername(), -// currentState.getPassword() -// ); -// } -// } -// ); - homeButton.addActionListener( // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { @@ -98,7 +83,6 @@ private void setFields(RecommendState state) { topArtists = new JLabel(); String topArtistsText = state.getTopArtists() != null ? state.getTopArtists() : "No top artists available"; topArtists.setText(topArtistsText); - System.out.println(topArtistsText); songsTextArea.setText(state.getSongRecommendations()); } diff --git a/src/test/java/use_case/recommend/RecommendInteractorTest.java b/src/test/java/use_case/recommend/RecommendInteractorTest.java index 2a6dbe624..3995477a2 100644 --- a/src/test/java/use_case/recommend/RecommendInteractorTest.java +++ b/src/test/java/use_case/recommend/RecommendInteractorTest.java @@ -39,13 +39,16 @@ public void prepareFailView(String error) { }; // Use for test input -// final Map songs = new HashMap<>(); -// songs.put("(sic)", "Slipknot"); -// songs.put("Left Behind", "Slipknot"); -// songs.put("Jumpdafuckup", "Soulfly"); -// songs.put("Roots Bloody Roots", "Sepultura"); -// songs.put("Dragula", "Rob Zombie"); -// songs.put("Spit It Out", "Slipknot"); +// final List lst = new ArrayList(); +// lst.add("(sic)"); +// lst.add("Left Behind"); +// lst.add("Spit It Out"); +// lst.add("People = Shit"); +// lst.add("Metabolic"); +// lst.add("Everything Ends"); +// return lst; + +// "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; LogoutInputBoundary interactor = new LogoutInteractor(userRepository, successPresenter); interactor.execute(inputData); From 94517c2c750e922e42fd92ed251064294339a697 Mon Sep 17 00:00:00 2001 From: quinn Date: Thu, 28 Nov 2024 22:06:10 -0500 Subject: [PATCH 226/262] created user output for the case where there's no valid openAI key. --- .../LanguageModelDataAccessObject.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index 66b16ca69..d3602af29 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -28,6 +28,9 @@ public class LanguageModelDataAccessObject implements RecommendLanguageModelData final private String endpoint = "https://spotifycompanion.openai.azure.com/"; final private String accessToken; + private boolean keyExists; + final private String errorMessage ="The file which should contain the " + + "azure access token does not exist in the correct place. Either create the file and place a valid api key in it or move the file to the src folder"; public LanguageModelDataAccessObject() { accessToken = getKey(); @@ -42,23 +45,31 @@ private String getKey() { file = new File("src/keys"); String key = "not found"; try { + this.keyExists = file.exists(); final BufferedReader br = new BufferedReader(new FileReader(file)); key = br.readLine(); br.close(); } catch (FileNotFoundException ex) { - System.out.println("The file which should contain the " + - "azure access token does not exist in the correct place. Either create the file and place a valid api key in it or move the file to the src folder"); + this.keyExists = false; + System.out.println(errorMessage); + return key; } catch (IOException ex) { - System.out.println("Error reading file"); + this.keyExists = false; + System.out.println(errorMessage); + System.out.println("It appears the file does not exist"); + return key; } return key; } @Override public String query(String prompt) { + if (!this.keyExists) { + return errorMessage; + } final OpenAIClient client = new OpenAIClientBuilder() .credential(new AzureKeyCredential(accessToken)) .endpoint(endpoint) From 5e1917342f3eb7f6a8fc8a565bbe579e71761f45 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Fri, 29 Nov 2024 00:29:37 -0500 Subject: [PATCH 227/262] Created tests and passed all of them --- src/main/java/app/AppBuilder.java | 8 +- .../LanguageModelDataAccessObject.java | 27 +++++-- .../RecommendTestDataAccessObject.java | 50 ++++++++++++ .../RecommendUserDataAccessObject.java | 50 ++++++++++++ .../data_access/SpotifyDataAccessObject.java | 16 +++- .../recommend/RecommendPresenter.java | 2 +- .../recommend/RecommendInteractor.java | 25 +++--- .../RecommendUserDataAccessInterface.java | 25 ++++-- .../recommend/RecommendInteractorTest.java | 78 +++++++++++-------- 9 files changed, 218 insertions(+), 63 deletions(-) create mode 100644 src/main/java/data_access/RecommendTestDataAccessObject.java create mode 100644 src/main/java/data_access/RecommendUserDataAccessObject.java diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 58a56125c..9a81ca55c 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -4,10 +4,7 @@ import javax.swing.*; -import data_access.InMemoryUserDataAccessObject; -import data_access.LanguageModelDataAccessObject; -import data_access.SpotifyDataAccessObject; -import data_access.TopItemsUserDataAccessObject; +import data_access.*; import entity.CommonUserFactory; import entity.UserFactory; import interface_adapter.ViewManagerModel; @@ -70,6 +67,7 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); + private final RecommendUserDataAccessObject recommendUserDataAccessObject = new RecommendUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); @@ -258,7 +256,7 @@ public AppBuilder addRecommendUseCase() { final RecommendOutputBoundary recommendOutputBoundary = new RecommendPresenter(viewManagerModel, recommendViewModel); final RecommendInputBoundary recommendInputBoundary = - new RecommendInteractor(languageModelDataAccessObject, spotifyDataAccessObject, recommendOutputBoundary); + new RecommendInteractor(recommendUserDataAccessObject, recommendOutputBoundary); final RecommendController recommendController = new RecommendController(recommendInputBoundary); loggedInView.setRecommendController(recommendController); diff --git a/src/main/java/data_access/LanguageModelDataAccessObject.java b/src/main/java/data_access/LanguageModelDataAccessObject.java index 7e2c545fd..bced6564a 100644 --- a/src/main/java/data_access/LanguageModelDataAccessObject.java +++ b/src/main/java/data_access/LanguageModelDataAccessObject.java @@ -16,6 +16,7 @@ import com.azure.ai.openai.models.ChatRequestSystemMessage; import com.azure.ai.openai.models.ChatRequestUserMessage; import com.azure.core.credential.AzureKeyCredential; +import org.jetbrains.annotations.NotNull; import use_case.recommend.RecommendLanguageModelDataAccessInterface; import use_case.search.SearchLanguageModelDataAccessInterface; @@ -81,19 +82,37 @@ public String query(String prompt) { @Override public String getRecommendations(List songs, String topArtists) { + if (accessToken.isEmpty()) { + return "Error getting access token"; + } + if (topArtists.isEmpty()) { + return "Error getting artists from Spotify"; + } + if (songs.isEmpty()) { + return "Error getting tracks from Spotify"; + } + final OpenAIClient client = new OpenAIClientBuilder() .credential(new AzureKeyCredential(accessToken)) .endpoint(endpoint) .buildClient(); final List chatMessages = new ArrayList<>(); chatMessages.add(new ChatRequestSystemMessage("You are a Spotify analyst, you will send back a " - + "list of songs which are similar to a provided list of songs and artists that a user has listened to.")); + + "list of songs which are similar to a given list of songs and artists that a user has listened to.")); chatMessages.add(new ChatRequestUserMessage("A user's top artists are" + topArtists + ". Their top tracks are" + songs + ". What are some song recommendations, based on these?")); chatMessages.add(new ChatRequestUserMessage(String.valueOf(songs))); final ChatCompletions chatCompletions = client.getChatCompletions("gpt-4", new ChatCompletionsOptions(chatMessages)); + StringBuilder result = getStringBuilder(chatCompletions); + + // Return the result as a string + return result.toString(); + } + + @NotNull + private static StringBuilder getStringBuilder(ChatCompletions chatCompletions) { final int back = chatCompletions.getChoices().size() - 1; String response = chatCompletions.getChoices().get(back).getMessage().getContent(); @@ -107,15 +126,13 @@ public String getRecommendations(List songs, String topArtists) { // Append lines from the second to the second last (index 1 to length-2) for (int i = 1; i < lines.length - 1; i++) { - if (!Objects.equals(lines[i], "")) { + if (!Objects.equals(lines[i], "\n")) { result.append(lines[i]); } if (i < lines.length - 2) { result.append("\n"); // Add a newline character if not the last line } } - - // Return the result as a string - return result.toString(); + return result; } } diff --git a/src/main/java/data_access/RecommendTestDataAccessObject.java b/src/main/java/data_access/RecommendTestDataAccessObject.java new file mode 100644 index 000000000..39d74f9ab --- /dev/null +++ b/src/main/java/data_access/RecommendTestDataAccessObject.java @@ -0,0 +1,50 @@ +package data_access; + +import use_case.recommend.RecommendSpotifyDataAccessInterface; +import use_case.recommend.RecommendUserDataAccessInterface; + +import java.util.ArrayList; +import java.util.List; + +public class RecommendTestDataAccessObject implements RecommendSpotifyDataAccessInterface, + RecommendUserDataAccessInterface { + private List topTracks; + private String topArtists; + + public RecommendTestDataAccessObject(){ + topTracks = new ArrayList<>(); + topTracks.add("(sic)"); + topTracks.add("Left Behind"); + topTracks.add("Spit It Out"); + topTracks.add("People = Shit"); + topTracks.add("Metabolic"); + topTracks.add("Everything Ends"); + + topArtists = "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; + } + + @Override + public List getCurrentTopTracks() { + return topTracks; + } + + @Override + public void setCurrentTopTracks(List topTracks) { + this.topTracks = topTracks; + } + + @Override + public String getTopArtists() { + return topArtists; + } + + @Override + public void setTopArtists(String topArtists) { + this.topArtists = topArtists; + } + + @Override + public String getRecommendations(List songs, String topArtists) { + return ""; + } +} diff --git a/src/main/java/data_access/RecommendUserDataAccessObject.java b/src/main/java/data_access/RecommendUserDataAccessObject.java new file mode 100644 index 000000000..71cfaf9e4 --- /dev/null +++ b/src/main/java/data_access/RecommendUserDataAccessObject.java @@ -0,0 +1,50 @@ +package data_access; + +import use_case.recommend.RecommendUserDataAccessInterface; +import data_access.LanguageModelDataAccessObject; + +import java.util.ArrayList; +import java.util.List; + +public class RecommendUserDataAccessObject implements RecommendUserDataAccessInterface { + private List topTracks; + private String topArtists; + + public RecommendUserDataAccessObject() { + topTracks = new ArrayList<>(); + topTracks.add("(sic)"); + topTracks.add("Left Behind"); + topTracks.add("Spit It Out"); + topTracks.add("People = Shit"); + topTracks.add("Metabolic"); + topTracks.add("Everything Ends"); + + topArtists = "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; + } + + @Override + public List getCurrentTopTracks() { + return topTracks; + } + + @Override + public void setCurrentTopTracks(List topTracks) { + this.topTracks = topTracks; + } + + @Override + public String getTopArtists() { + return topArtists; + } + + @Override + public void setTopArtists(String artists) { + this.topArtists = artists; + } + + @Override + public String getRecommendations(List songs, String topArtists) { + final LanguageModelDataAccessObject languageModel = new LanguageModelDataAccessObject(); + return languageModel.getRecommendations(songs, topArtists); + } +} diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index e3106020d..dfd887b68 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import interface_adapter.login.LoginState; @@ -14,7 +15,7 @@ import se.michaelthelin.spotify.requests.data.follow.GetUsersFollowedArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; -import use_case.recommend.RecommendSpotifyDataAccessInterface; +import use_case.recommend.RecommendUserDataAccessInterface; import use_case.similar_listeners.SimilarListenersUserDataAccessInterface; import use_case.top_items.TopItemsUserDataAccessInterface; @@ -23,7 +24,7 @@ */ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, SimilarListenersUserDataAccessInterface, - RecommendSpotifyDataAccessInterface { + RecommendUserDataAccessInterface { public static final int OFFSET = 4; public static final int OFFSET2 = 0; @@ -202,6 +203,17 @@ public String getTopArtists() { return sb.toString(); } + @Override + public void setTopArtists(String artists) { + this.currentTopArtists = new ArrayList<>(); + this.currentTopArtists.addAll(Arrays.asList(artists.split(", "))); + } + + @Override + public String getRecommendations(List songs, String topArtists) { + return ""; + } + @Override public void setCurrentTopTracks(List tracks) { this.currentTopTracks = tracks; diff --git a/src/main/java/interface_adapter/recommend/RecommendPresenter.java b/src/main/java/interface_adapter/recommend/RecommendPresenter.java index 7aa5e3b28..5859555de 100644 --- a/src/main/java/interface_adapter/recommend/RecommendPresenter.java +++ b/src/main/java/interface_adapter/recommend/RecommendPresenter.java @@ -32,6 +32,6 @@ public void prepareSuccessView(RecommendOutputData output) { @Override public void prepareFailView(String errorMessage) { - // No need to add code here, as we assume there won't be an error + System.out.printf(errorMessage); } } diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index afcd70c81..0df56e901 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -1,35 +1,36 @@ package use_case.recommend; import java.util.List; -import java.util.Map; /** * The Recommendations Interactor. */ public class RecommendInteractor implements RecommendInputBoundary { - private final RecommendLanguageModelDataAccessInterface recommendDataAccessObject; - private final RecommendSpotifyDataAccessInterface spotifyDataAccessObject; + private final RecommendUserDataAccessInterface userDataAccessObject; private final RecommendOutputBoundary recommendationOutputBoundary; - public RecommendInteractor(RecommendLanguageModelDataAccessInterface recommendDataAccessInterface, - RecommendSpotifyDataAccessInterface spotifyDataAccessObject, + public RecommendInteractor(RecommendUserDataAccessInterface userDataAccessObject, RecommendOutputBoundary recommendOutputBoundary) { - this.recommendDataAccessObject = recommendDataAccessInterface; - this.spotifyDataAccessObject = spotifyDataAccessObject; + this.userDataAccessObject = userDataAccessObject; this.recommendationOutputBoundary = recommendOutputBoundary; } @Override public void execute(RecommendInputData recommendInputData) { // Calls Spotify API to get user data - final List songs = spotifyDataAccessObject.getCurrentTopTracks(); - final String topArtists = spotifyDataAccessObject.getTopArtists(); + final List songs = userDataAccessObject.getCurrentTopTracks(); + final String topArtists = userDataAccessObject.getTopArtists(); // Takes user data and asks Azure for recommendations - final String songRecommendations = recommendDataAccessObject.getRecommendations(songs, topArtists); - // Gets access token + final String songRecommendations = userDataAccessObject.getRecommendations(songs, topArtists); + // Gets spotify access token final String accessToken = recommendInputData.getAccessToken(); final RecommendOutputData outputData = new RecommendOutputData(songRecommendations, topArtists, accessToken); - recommendationOutputBoundary.prepareSuccessView(outputData); + if (songRecommendations.contains("Error")) { + recommendationOutputBoundary.prepareFailView(songRecommendations); + } + else { + recommendationOutputBoundary.prepareSuccessView(outputData); + } } } diff --git a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java index d3792b4a5..9bad9fe2b 100644 --- a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java @@ -1,20 +1,35 @@ package use_case.recommend; import java.util.List; +import java.util.SplittableRandom; /** * DAO for the Recommendations Use Case. */ public interface RecommendUserDataAccessInterface { /** - * Returns the song recommendation Map of the current user of the application. - * @return the recommendations Map of the current user; null indicates that there are no recommendation Maps + * Returns the top track list of the current user of the application. + * @return the top track List of the current user; null indicates that there are no track lists. */ List getCurrentTopTracks(); /** - * Sets the song recommendations map. - * @param songRecommendations the new song recommendation Map; null to indicate that there is no recommendations. + * Sets the top tracks list indicating who is the current user of the application. + * @param tracks the new top track list; null to indicate that there is no top tracks. */ - void setSongRecommendations(List songRecommendations); + void setCurrentTopTracks(List tracks); + + /** + * Returns the top artist list of the current user of the application. + * @return the top artist list of the current user; null indicates that there are no artist lists. + */ + String getTopArtists(); + + /** + * Sets the top artist list indicating who is the current user of the application. + * @param artists the new top artist list; null to indicate that there is no top tracks. + */ + void setTopArtists(String artists); + + String getRecommendations(List songs, String topArtists); } diff --git a/src/test/java/use_case/recommend/RecommendInteractorTest.java b/src/test/java/use_case/recommend/RecommendInteractorTest.java index 3995477a2..26fb6da8b 100644 --- a/src/test/java/use_case/recommend/RecommendInteractorTest.java +++ b/src/test/java/use_case/recommend/RecommendInteractorTest.java @@ -1,35 +1,36 @@ package use_case.recommend; -import data_access.InMemoryUserDataAccessObject; -import entity.CommonUserFactory; -import entity.User; -import entity.UserFactory; +import data_access.RecommendTestDataAccessObject; +import data_access.RecommendUserDataAccessObject; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import use_case.logout.*; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; public class RecommendInteractorTest { - @Test - void successTest() { - LogoutInputData inputData = new LogoutInputData("Paul"); - InMemoryUserDataAccessObject userRepository = new InMemoryUserDataAccessObject(); + private RecommendTestDataAccessObject dummySpotify; + private List topTracks; + private String topArtists; - // For the success test, we need to add Paul to the data access repository before we log in. - UserFactory factory = new CommonUserFactory(); - User user = factory.create("Paul", "password"); - userRepository.save(user); - userRepository.setCurrentUsername("Paul"); + @BeforeEach + void setUp() { + dummySpotify = new RecommendTestDataAccessObject(); + topTracks = dummySpotify.getCurrentTopTracks(); + topArtists = dummySpotify.getTopArtists(); + } + @Test + void successTest() { // This creates a successPresenter that tests whether the test case is as we expect. - LogoutOutputBoundary successPresenter = new LogoutOutputBoundary() { + RecommendOutputBoundary successPresenter = new RecommendOutputBoundary() { @Override - public void prepareSuccessView(LogoutOutputData user) { - // check that the output data contains the username of who logged out - assertEquals("Paul", user.getUsername()); + public void prepareSuccessView(RecommendOutputData outputData) { + final String topArtists = "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; + // check that the output data contains the artist names + assertEquals(topArtists, outputData.getTopArtists()); } @Override @@ -38,21 +39,32 @@ public void prepareFailView(String error) { } }; -// Use for test input -// final List lst = new ArrayList(); -// lst.add("(sic)"); -// lst.add("Left Behind"); -// lst.add("Spit It Out"); -// lst.add("People = Shit"); -// lst.add("Metabolic"); -// lst.add("Everything Ends"); -// return lst; + RecommendInputBoundary interactor = new RecommendInteractor(dummySpotify, successPresenter); + interactor.execute(new RecommendInputData(topTracks, topArtists, "token")); + } + + @Test + void failTest() { + // Create empty track list and inputData object + List tracks = new ArrayList<>(); + RecommendInputData inputData = new RecommendInputData(tracks, topArtists, "token"); + + RecommendUserDataAccessInterface accessObject = new RecommendUserDataAccessObject(); + accessObject.setCurrentTopTracks(tracks); -// "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; + RecommendOutputBoundary successPresenter = new RecommendOutputBoundary() { + @Override + public void prepareSuccessView(RecommendOutputData outputData) { + fail("Use case success is unexpected."); + } - LogoutInputBoundary interactor = new LogoutInteractor(userRepository, successPresenter); + @Override + public void prepareFailView(String error) { + assertEquals("Error getting tracks from Spotify", error); + } + }; + RecommendInputBoundary interactor = new RecommendInteractor(accessObject, successPresenter); interactor.execute(inputData); - // check that the user was logged out - assertNull(userRepository.getCurrentUsername()); + } } From f244e371f57c79bc158f95636718848660ac14e9 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Fri, 29 Nov 2024 00:45:32 -0500 Subject: [PATCH 228/262] Fixed merge issue --- src/main/java/view/LoggedInView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index b0a7564eb..9fc5186ea 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -1,6 +1,6 @@ package view; -import java.awt.Component; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; From 1675ed4ee15792fc273985447a01db8baa558757 Mon Sep 17 00:00:00 2001 From: Dimitrios Date: Fri, 29 Nov 2024 09:07:31 -0500 Subject: [PATCH 229/262] Implemented spotify api usage, removed hard-coded data --- .../RecommendTestDataAccessObject.java | 4 ++-- .../RecommendUserDataAccessObject.java | 17 ++++++----------- .../data_access/SpotifyDataAccessObject.java | 11 ++++++++++- .../use_case/recommend/RecommendInputData.java | 11 +++++------ .../use_case/recommend/RecommendInteractor.java | 7 +++++-- .../RecommendSpotifyDataAccessInterface.java | 2 +- .../RecommendUserDataAccessInterface.java | 4 ++-- src/main/java/view/LoggedInView.java | 7 +++---- .../recommend/RecommendInteractorTest.java | 4 ++-- 9 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/main/java/data_access/RecommendTestDataAccessObject.java b/src/main/java/data_access/RecommendTestDataAccessObject.java index 39d74f9ab..3d8a16992 100644 --- a/src/main/java/data_access/RecommendTestDataAccessObject.java +++ b/src/main/java/data_access/RecommendTestDataAccessObject.java @@ -24,12 +24,12 @@ public RecommendTestDataAccessObject(){ } @Override - public List getCurrentTopTracks() { + public List getTopTracks() { return topTracks; } @Override - public void setCurrentTopTracks(List topTracks) { + public void setTopTracks(List topTracks) { this.topTracks = topTracks; } diff --git a/src/main/java/data_access/RecommendUserDataAccessObject.java b/src/main/java/data_access/RecommendUserDataAccessObject.java index 71cfaf9e4..33c961d69 100644 --- a/src/main/java/data_access/RecommendUserDataAccessObject.java +++ b/src/main/java/data_access/RecommendUserDataAccessObject.java @@ -2,6 +2,7 @@ import use_case.recommend.RecommendUserDataAccessInterface; import data_access.LanguageModelDataAccessObject; +import data_access.SpotifyDataAccessObject; import java.util.ArrayList; import java.util.List; @@ -11,24 +12,18 @@ public class RecommendUserDataAccessObject implements RecommendUserDataAccessInt private String topArtists; public RecommendUserDataAccessObject() { - topTracks = new ArrayList<>(); - topTracks.add("(sic)"); - topTracks.add("Left Behind"); - topTracks.add("Spit It Out"); - topTracks.add("People = Shit"); - topTracks.add("Metabolic"); - topTracks.add("Everything Ends"); - - topArtists = "Slipknot, Soulfly, Korn, Sepultura, System Of A Down"; + final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); + topTracks = spotifyDataAccessObject.getCurrentTopTracks(); + topArtists = spotifyDataAccessObject.getTopArtists(); } @Override - public List getCurrentTopTracks() { + public List getTopTracks() { return topTracks; } @Override - public void setCurrentTopTracks(List topTracks) { + public void setTopTracks(List topTracks) { this.topTracks = topTracks; } diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 9ecf21d49..18e151d44 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -178,9 +178,18 @@ public List getCurrentTopTracks() { return this.currentTopTracks; } + @Override + public List getTopTracks() { + return getUsersTopTracksSync(); + } + + public void setTopTracks(List topTracks) { + this.currentTopTracks = topTracks; + } + @Override public String getTopArtists() { - final List lst = this.currentTopArtists; + final List lst = currentTopArtists; final StringBuilder sb = new StringBuilder(); for (int i = 0; i < lst.size(); i ++) { diff --git a/src/main/java/use_case/recommend/RecommendInputData.java b/src/main/java/use_case/recommend/RecommendInputData.java index c2a04cf71..a8a22655e 100644 --- a/src/main/java/use_case/recommend/RecommendInputData.java +++ b/src/main/java/use_case/recommend/RecommendInputData.java @@ -7,19 +7,18 @@ * The Input Data for the Recommend Use Case. */ public class RecommendInputData { - - private final List songRecommendations; + private final List topTracks; private final String topArtists; private String accessToken; - public RecommendInputData(List songRecommendations, String topArtists, String accessToken) { - this.songRecommendations = songRecommendations; + public RecommendInputData(List topTracks, String topArtists, String accessToken) { + this.topTracks = topTracks; this.topArtists = topArtists; this.accessToken = accessToken; } - public List getListeningHistory() { - return songRecommendations; + public List getTopTracks() { + return topTracks; } public String getTopArtists() { diff --git a/src/main/java/use_case/recommend/RecommendInteractor.java b/src/main/java/use_case/recommend/RecommendInteractor.java index 0df56e901..5194d99f2 100644 --- a/src/main/java/use_case/recommend/RecommendInteractor.java +++ b/src/main/java/use_case/recommend/RecommendInteractor.java @@ -18,10 +18,13 @@ public RecommendInteractor(RecommendUserDataAccessInterface userDataAccessObject @Override public void execute(RecommendInputData recommendInputData) { // Calls Spotify API to get user data - final List songs = userDataAccessObject.getCurrentTopTracks(); + final List topTracks = userDataAccessObject.getTopTracks(); + userDataAccessObject.setTopTracks(topTracks); final String topArtists = userDataAccessObject.getTopArtists(); + userDataAccessObject.setTopArtists(topArtists); // Takes user data and asks Azure for recommendations - final String songRecommendations = userDataAccessObject.getRecommendations(songs, topArtists); + System.out.printf("Calling spotify api with songs: " + topTracks); + final String songRecommendations = userDataAccessObject.getRecommendations(topTracks, topArtists); // Gets spotify access token final String accessToken = recommendInputData.getAccessToken(); diff --git a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java index 9ca7d414f..73b7275d3 100644 --- a/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendSpotifyDataAccessInterface.java @@ -10,7 +10,7 @@ public interface RecommendSpotifyDataAccessInterface { * Sends a query to the Spotify at the API endpoint. * @return a map of songs that the user listened to most recently */ - List getCurrentTopTracks(); + List getTopTracks(); /** * Sends a query to the Spotify at the API endpoint. diff --git a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java index 9bad9fe2b..80f935c50 100644 --- a/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java +++ b/src/main/java/use_case/recommend/RecommendUserDataAccessInterface.java @@ -11,13 +11,13 @@ public interface RecommendUserDataAccessInterface { * Returns the top track list of the current user of the application. * @return the top track List of the current user; null indicates that there are no track lists. */ - List getCurrentTopTracks(); + List getTopTracks(); /** * Sets the top tracks list indicating who is the current user of the application. * @param tracks the new top track list; null to indicate that there is no top tracks. */ - void setCurrentTopTracks(List tracks); + void setTopTracks(List tracks); /** * Returns the top artist list of the current user of the application. diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 9fc5186ea..054ef0633 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -129,11 +129,10 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { recommendations.addActionListener( evt -> { if (evt.getSource().equals(recommendations)) { - // final String name = topTracksController - final List songRecommendations = new ArrayList<>(); - final String artistRecommendations = ""; + final List topTracks = new ArrayList<>(); + final String topArtists = ""; final String accessToken = loggedInViewModel.getState().getUsername(); - recommendController.execute(songRecommendations, artistRecommendations, accessToken); + recommendController.execute(topTracks, topArtists, accessToken); } } ); diff --git a/src/test/java/use_case/recommend/RecommendInteractorTest.java b/src/test/java/use_case/recommend/RecommendInteractorTest.java index 26fb6da8b..52e94ccc2 100644 --- a/src/test/java/use_case/recommend/RecommendInteractorTest.java +++ b/src/test/java/use_case/recommend/RecommendInteractorTest.java @@ -18,7 +18,7 @@ public class RecommendInteractorTest { @BeforeEach void setUp() { dummySpotify = new RecommendTestDataAccessObject(); - topTracks = dummySpotify.getCurrentTopTracks(); + topTracks = dummySpotify.getTopTracks(); topArtists = dummySpotify.getTopArtists(); } @@ -50,7 +50,7 @@ void failTest() { RecommendInputData inputData = new RecommendInputData(tracks, topArtists, "token"); RecommendUserDataAccessInterface accessObject = new RecommendUserDataAccessObject(); - accessObject.setCurrentTopTracks(tracks); + accessObject.setTopTracks(tracks); RecommendOutputBoundary successPresenter = new RecommendOutputBoundary() { @Override From dca27e3c4051ac9b7664f79c1bba24c60e62f0b9 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:37:22 -0500 Subject: [PATCH 230/262] Created the tests necessary for the TopTracks use case. --- .../topitems/TopItemsInteractorTest.java | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/test/java/use_case/topitems/TopItemsInteractorTest.java diff --git a/src/test/java/use_case/topitems/TopItemsInteractorTest.java b/src/test/java/use_case/topitems/TopItemsInteractorTest.java new file mode 100644 index 000000000..9c991b900 --- /dev/null +++ b/src/test/java/use_case/topitems/TopItemsInteractorTest.java @@ -0,0 +1,139 @@ +package use_case.topitems; + +import data_access.TopItemsUserDataAccessObject; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import use_case.top_items.*; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class TopItemsInteractorTest { + private TopItemsUserDataAccessInterface dummyObject; + private TopItemsInputData dummyInput; + + @BeforeEach + public void setUp() { + dummyObject = new TopItemsUserDataAccessObject(); + dummyInput = new TopItemsInputData("accessToken"); + } + + @Test + void successTest() { + List topTracks = new ArrayList<>(); + topTracks.add("Heartbreaker"); + topTracks.add("reincarnated"); + topTracks.add("Kill Bill"); + topTracks.add("Crew Love"); + + List topArtists = new ArrayList<>(); + topArtists.add("The Weeknd"); + topArtists.add("Kanye West"); + topArtists.add("A$AP Rocky"); + dummyObject.setCurrentTopTracks(topTracks); + dummyObject.setCurrentTopArtists(topArtists); + + TopItemsOutputBoundary success = new TopItemsOutputBoundary() { + @Override + public void prepareSuccessView(TopItemsOutputData outputData) { + assertEquals(topTracks, outputData.getTracks()); + assertEquals(topArtists, outputData.getArtists()); + assertEquals("accessToken", outputData.getAccessToken()); + } + + @Override + public void prepareFailView(String errorMessage) { + fail("Use Case failure is not expected"); + } + }; + + TopItemsInputBoundary topItemsInteractor = new TopItemsInteractor(dummyObject, success); + topItemsInteractor.execute(dummyInput); + } + + @Test + void failTestForTopTracks() { + List topTracks = new ArrayList<>(); + + List topArtists = new ArrayList<>(); + topArtists.add("The Weeknd"); + topArtists.add("Kanye West"); + topArtists.add("A$AP Rocky"); + + dummyObject.setCurrentTopTracks(topTracks); + dummyObject.setCurrentTopArtists(topArtists); + + TopItemsOutputBoundary fail = new TopItemsOutputBoundary() { + @Override + public void prepareSuccessView(TopItemsOutputData outputData) { + fail("User case success is not expected"); + } + + @Override + public void prepareFailView(String errorMessage) { + assertEquals("Top Tracks cannot be determined", errorMessage); + } + }; + + TopItemsInputBoundary topItemsInteractor = new TopItemsInteractor(dummyObject, fail); + topItemsInteractor.execute(dummyInput); + + } + + @Test + void failTestForTopArtists() { + List topTracks = new ArrayList<>(); + topTracks.add("Heartbreaker"); + topTracks.add("reincarnated"); + topTracks.add("Kill Bill"); + topTracks.add("Crew Love"); + + List topArtists = new ArrayList<>(); + + dummyObject.setCurrentTopTracks(topTracks); + dummyObject.setCurrentTopArtists(topArtists); + + TopItemsOutputBoundary fail = new TopItemsOutputBoundary() { + @Override + public void prepareSuccessView(TopItemsOutputData outputData) { + fail("User case success is not expected"); + } + + @Override + public void prepareFailView(String errorMessage) { + assertEquals("Top Artists cannot be determined", errorMessage); + } + }; + + TopItemsInputBoundary topItemsInteractor = new TopItemsInteractor(dummyObject, fail); + topItemsInteractor.execute(dummyInput); + } + + @Test + void failBoth() { + List topTracks = new ArrayList<>(); + + List topArtists = new ArrayList<>(); + + dummyObject.setCurrentTopTracks(topTracks); + dummyObject.setCurrentTopArtists(topArtists); + + TopItemsOutputBoundary fail = new TopItemsOutputBoundary() { + @Override + public void prepareSuccessView(TopItemsOutputData outputData) { + fail("User case success is not expected"); + } + + @Override + public void prepareFailView(String errorMessage) { + assertEquals("Top Tracks and Top Artists cannot be determined", errorMessage); + } + }; + + TopItemsInputBoundary topItemsInteractor = new TopItemsInteractor(dummyObject, fail); + topItemsInteractor.execute(dummyInput); + } + +} From c918c9014236e791b30f2889dafc8e20f0fc2e4c Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:38:26 -0500 Subject: [PATCH 231/262] Changed the constructor for the test file and updated the method calls. --- .../data_access/TopItemsUserDataAccessObject.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/data_access/TopItemsUserDataAccessObject.java b/src/main/java/data_access/TopItemsUserDataAccessObject.java index ac10de997..485c9fc69 100644 --- a/src/main/java/data_access/TopItemsUserDataAccessObject.java +++ b/src/main/java/data_access/TopItemsUserDataAccessObject.java @@ -11,16 +11,6 @@ public class TopItemsUserDataAccessObject implements TopItemsUserDataAccessInter private List artists; public TopItemsUserDataAccessObject() { - tracks = new ArrayList<>(); - artists = new ArrayList<>(); - tracks.add("Heartbreaker"); - tracks.add("reincarnated"); - tracks.add("Kill Bill"); - tracks.add("Crew Love"); - artists.add("The Weeknd"); - artists.add("Kanye West"); - artists.add("A$AP Rocky"); - } @Override @@ -30,6 +20,7 @@ public List getCurrentTopTracks() { @Override public void setCurrentTopTracks(List tracks) { + this.tracks = tracks; } @Override @@ -39,6 +30,7 @@ public List getCurrentTopArtists() { @Override public void setCurrentTopArtists(List artists) { + this.artists = artists; } } From ae9168afe983311b5730011d0639b091de71a7ea Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:39:13 -0500 Subject: [PATCH 232/262] Created a FailView for the Top Items use case. --- .../top_items/TopItemsPresenter.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java index 241ca093e..d76b23e2e 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java +++ b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java @@ -4,6 +4,8 @@ import use_case.top_items.TopItemsOutputBoundary; import use_case.top_items.TopItemsOutputData; +import java.util.ArrayList; + /** * The Presenter for the Top Tracks Use Case. */ @@ -34,6 +36,13 @@ public void prepareSuccessView(TopItemsOutputData outputData) { @Override public void prepareFailView(String errorMessage) { - // No code needed because there won't be an error. + final TopItemsState topItemsState = topItemsViewModel.getState(); + topItemsState.setTracksError(errorMessage); + topItemsState.setArtistsError(errorMessage); + topItemsState.setTracks(new ArrayList<>()); + topItemsState.setArtists(new ArrayList<>()); + + this.viewManagerModel.setState(topItemsViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); } } From 58975c213f53a29bcd45851a2f50594ebf0c5534 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:39:58 -0500 Subject: [PATCH 233/262] Updated the interactor because it had some wrong implementations. --- .../top_items/TopItemsInteractor.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index f942b8b05..41ac2f3bf 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -17,11 +17,30 @@ public TopItemsInteractor(TopItemsUserDataAccessInterface userDataAccessObject, @Override public void execute(TopItemsInputData topItemsInputData) { - final List topTracks = userDataAccessObject.getCurrentTopTracks(); - final List topArtists = userDataAccessObject.getCurrentTopArtists(); - final String accessToken = topItemsInputData.getAccessToken(); + if (userDataAccessObject.getCurrentTopTracks().isEmpty() || userDataAccessObject.getCurrentTopArtists() + .isEmpty()) { + if (userDataAccessObject.getCurrentTopArtists().isEmpty() && userDataAccessObject.getCurrentTopTracks() + .isEmpty()) { + topItemsOutputBoundary.prepareFailView("Top Tracks and Top Artists cannot be determined"); + } + else if (userDataAccessObject.getCurrentTopTracks().isEmpty()) { + topItemsOutputBoundary.prepareFailView("Top Tracks cannot be determined"); + } + else { + topItemsOutputBoundary.prepareFailView("Top Artists cannot be determined"); + } + } - final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, accessToken); - topItemsOutputBoundary.prepareSuccessView(outputData); + else { + final List topTracks = userDataAccessObject.getCurrentTopTracks(); + final List topArtists = userDataAccessObject.getCurrentTopArtists(); + final String accessToken = topItemsInputData.getAccessToken(); + userDataAccessObject.setCurrentTopTracks(topTracks); + userDataAccessObject.setCurrentTopArtists(topArtists); + + final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, accessToken); + topItemsOutputBoundary.prepareSuccessView(outputData); + + } } } From 335c23499174398de3c3bcd4d5b520b01754f3e5 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:40:29 -0500 Subject: [PATCH 234/262] Updated the TopItemsInputData because Tracks and Artists are not needed as inputs. --- .../use_case/top_items/TopItemsInputData.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/main/java/use_case/top_items/TopItemsInputData.java b/src/main/java/use_case/top_items/TopItemsInputData.java index 4b41e5018..5a8c043a4 100644 --- a/src/main/java/use_case/top_items/TopItemsInputData.java +++ b/src/main/java/use_case/top_items/TopItemsInputData.java @@ -6,25 +6,12 @@ * The Input Data for the TopItems Use Case. */ public class TopItemsInputData { - - private final List tracks; - private final List artists; private String accessToken; - public TopItemsInputData(List tracks, List artists, String accessToken) { - this.tracks = tracks; - this.artists = artists; + public TopItemsInputData(String accessToken) { this.accessToken = accessToken; } - List getTracks() { - return tracks; - } - - List getArtists() { - return artists; - } - public String getAccessToken() { return accessToken; } From 0ade2f1a8a1953bdc6e77051a1c5e9784e18bcfd Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:40:43 -0500 Subject: [PATCH 235/262] Updated the TopItemsInputData call. --- .../interface_adapter/top_items/TopItemsController.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/interface_adapter/top_items/TopItemsController.java b/src/main/java/interface_adapter/top_items/TopItemsController.java index fa45946c4..fd0c96f30 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsController.java +++ b/src/main/java/interface_adapter/top_items/TopItemsController.java @@ -17,11 +17,10 @@ public TopItemsController(TopItemsInputBoundary topItemsUseCaseInteractor) { /** * Executes the TopItems Use Case. - * @param toptracks the top tracks of the user. - * @param topartists the top artists of the user. + * @param accessToken the access Token of the user. */ - public void execute(List toptracks, List topartists, String accessToken) { - final TopItemsInputData topItemsInputData = new TopItemsInputData(toptracks, topartists, accessToken); + public void execute(String accessToken) { + final TopItemsInputData topItemsInputData = new TopItemsInputData(accessToken); topItemsUseCaseInteractor.execute(topItemsInputData); } From 907084633169b8528d5a72e759e422549573b548 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:41:13 -0500 Subject: [PATCH 236/262] Did some refactoring. --- src/main/java/app/AppBuilder.java | 3 +-- src/main/java/view/LoggedInView.java | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 3d8d8a0ae..9d7ed11b2 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -68,7 +68,6 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); - private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); @@ -224,7 +223,7 @@ public AppBuilder addTopItemsUseCase() { topTracksAndArtistsViewModel); final TopItemsInputBoundary topItemsInputBoundary = - new TopItemsInteractor(topItemsUserDataAccessObject, topItemsOutputBoundary); + new TopItemsInteractor(spotifyDataAccessObject, topItemsOutputBoundary); final TopItemsController topItemsController = new TopItemsController(topItemsInputBoundary); loggedInView.setTopTracksController(topItemsController); diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index dfd0bde4f..1107190fc 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -126,11 +126,8 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(topItems)) { - final List topTracks = new ArrayList<>(); - final List topArtists = new ArrayList<>(); final String accessToken = loggedInViewModel.getState().getUsername(); - - topItemsController.execute(topTracks, topArtists, accessToken); + topItemsController.execute(accessToken); } } ); From 65d68686e643df835b111a8ff0d7cb8aa028feb3 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 14:44:03 -0500 Subject: [PATCH 237/262] Did some refactoring. --- src/main/java/use_case/top_items/TopItemsInteractor.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index 41ac2f3bf..49fb8516e 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -35,8 +35,6 @@ else if (userDataAccessObject.getCurrentTopTracks().isEmpty()) { final List topTracks = userDataAccessObject.getCurrentTopTracks(); final List topArtists = userDataAccessObject.getCurrentTopArtists(); final String accessToken = topItemsInputData.getAccessToken(); - userDataAccessObject.setCurrentTopTracks(topTracks); - userDataAccessObject.setCurrentTopArtists(topArtists); final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, accessToken); topItemsOutputBoundary.prepareSuccessView(outputData); From 1d10ed5e074ab50806e6c1a86f4a4e93d0a8c467 Mon Sep 17 00:00:00 2001 From: ceryanki Date: Fri, 29 Nov 2024 16:48:36 -0500 Subject: [PATCH 238/262] Did some refactoring. --- src/main/java/use_case/top_items/TopItemsInteractor.java | 1 - src/test/java/use_case/topitems/TopItemsInteractorTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index 49fb8516e..7465f799a 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -30,7 +30,6 @@ else if (userDataAccessObject.getCurrentTopTracks().isEmpty()) { topItemsOutputBoundary.prepareFailView("Top Artists cannot be determined"); } } - else { final List topTracks = userDataAccessObject.getCurrentTopTracks(); final List topArtists = userDataAccessObject.getCurrentTopArtists(); diff --git a/src/test/java/use_case/topitems/TopItemsInteractorTest.java b/src/test/java/use_case/topitems/TopItemsInteractorTest.java index 9c991b900..dcd9fd6b7 100644 --- a/src/test/java/use_case/topitems/TopItemsInteractorTest.java +++ b/src/test/java/use_case/topitems/TopItemsInteractorTest.java @@ -123,7 +123,7 @@ void failBoth() { TopItemsOutputBoundary fail = new TopItemsOutputBoundary() { @Override public void prepareSuccessView(TopItemsOutputData outputData) { - fail("User case success is not expected"); + fail("Use case success is not expected"); } @Override From e69446b67006c6b9c46db8b9127cc29038d3d222 Mon Sep 17 00:00:00 2001 From: quinn Date: Fri, 29 Nov 2024 18:12:54 -0500 Subject: [PATCH 239/262] Made keyword search in clean architecture --- src/main/java/app/AppBuilder.java | 59 ++++++- src/main/java/app/Main.java | 2 + .../data_access/DBUserDataAccessObject.java | 163 ------------------ .../data_access/FileUserDataAccessObject.java | 116 ------------- .../InMemoryUserDataAccessObject.java | 7 - .../SimilarListenersTestDataAccessObject.java | 5 +- .../data_access/SpotifyDataAccessObject.java | 75 +++++++- .../TopItemsUserDataAccessObject.java | 44 ----- .../keyword/KeywordController.java | 28 ++- .../keyword/KeywordPresenter.java | 42 +++-- .../keyword/KeywordState.java | 58 ++----- .../keyword/KeywordViewModel.java | 57 ++---- .../logout/LogoutPresenter.java | 1 - .../search/SearchController.java | 3 - .../search/SearchPresenter.java | 2 +- .../interface_adapter/search/SearchState.java | 2 - .../SimilarListenersController.java | 2 - .../top_items/TopItemsController.java | 2 +- src/main/java/spotify_api/SpotifyService.java | 57 ------ .../keyword/KeywordDataAccessInterface.java | 13 ++ .../keyword/KeywordInputBoundary.java | 11 ++ .../use_case/keyword/KeywordInteractor.java | 39 +++-- .../keyword/KeywordOutputBoundary.java | 17 +- .../use_case/keyword/KeywordOutputData.java | 17 +- .../keyword/KeywordUserDataAccessObject.java | 41 ----- .../java/use_case/login/LoginInteractor.java | 3 - .../login/LoginUserDataAccessInterface.java | 7 - .../java/use_case/search/SearchInputData.java | 4 - .../use_case/search/SearchInteractor.java | 5 - .../use_case/search/SearchOutputBoundary.java | 1 - ... SimilarListenersDataAccessInterface.java} | 2 +- .../SimilarListenersInteractor.java | 6 +- ....java => TopItemsDataAccessInterface.java} | 2 +- .../top_items/TopItemsInteractor.java | 4 +- src/main/java/view/KeywordView.java | 126 ++++++++++---- src/main/java/view/LoggedInView.java | 31 ++-- .../SimilarListenersInteractorTest.java | 8 +- 37 files changed, 409 insertions(+), 653 deletions(-) delete mode 100644 src/main/java/data_access/DBUserDataAccessObject.java delete mode 100644 src/main/java/data_access/FileUserDataAccessObject.java delete mode 100644 src/main/java/data_access/TopItemsUserDataAccessObject.java delete mode 100644 src/main/java/spotify_api/SpotifyService.java create mode 100644 src/main/java/use_case/keyword/KeywordDataAccessInterface.java delete mode 100644 src/main/java/use_case/keyword/KeywordUserDataAccessObject.java delete mode 100644 src/main/java/use_case/search/SearchInputData.java rename src/main/java/use_case/similar_listeners/{SimilarListenersUserDataAccessInterface.java => SimilarListenersDataAccessInterface.java} (89%) rename src/main/java/use_case/top_items/{TopItemsUserDataAccessInterface.java => TopItemsDataAccessInterface.java} (95%) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 3d8d8a0ae..2fdb71b03 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -8,6 +8,9 @@ import entity.CommonUserFactory; import entity.UserFactory; import interface_adapter.ViewManagerModel; +import interface_adapter.keyword.KeywordController; +import interface_adapter.keyword.KeywordPresenter; +import interface_adapter.keyword.KeywordViewModel; import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.login.LoginController; import interface_adapter.login.LoginPresenter; @@ -23,6 +26,9 @@ import interface_adapter.top_items.TopItemsController; import interface_adapter.top_items.TopItemsPresenter; import interface_adapter.top_items.TopItemsViewModel; +import use_case.keyword.KeywordInputBoundary; +import use_case.keyword.KeywordInteractor; +import use_case.keyword.KeywordOutputBoundary; import use_case.login.LoginInputBoundary; import use_case.login.LoginInteractor; import use_case.login.LoginOutputBoundary; @@ -39,13 +45,7 @@ import use_case.top_items.TopItemsInputBoundary; import use_case.top_items.TopItemsInteractor; import use_case.top_items.TopItemsOutputBoundary; -import view.LoggedInView; -import view.LoginView; -import view.SearchView; -import view.TopItemsView; -import view.SimilarListenersView; - -import view.ViewManager; +import view.*; /** * The AppBuilder class is responsible for putting together the pieces of @@ -68,7 +68,6 @@ public class AppBuilder { // thought question: is the hard dependency below a problem? private final InMemoryUserDataAccessObject userDataAccessObject = new InMemoryUserDataAccessObject(); - private final TopItemsUserDataAccessObject topItemsUserDataAccessObject = new TopItemsUserDataAccessObject(); private final LanguageModelDataAccessObject languageModelDataAccessObject = new LanguageModelDataAccessObject(); private final SpotifyDataAccessObject spotifyDataAccessObject = new SpotifyDataAccessObject(); @@ -83,6 +82,8 @@ public class AppBuilder { private SearchView searchView; private TopItemsView topItemsView; private SimilarListenersView similarListenersView; + private KeywordView keywordView; + private KeywordViewModel keywordViewModel; public AppBuilder() { @@ -150,6 +151,23 @@ public AppBuilder addSimilarListenersView() { return this; } + /** + * Adds the Keyword View to the application. + * @return this builder + */ + public AppBuilder addKeywordView() { + keywordViewModel = new KeywordViewModel(); + keywordView = new KeywordView(keywordViewModel); + cardPanel.add(keywordView, keywordView.getViewName()); + final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + final LoginInputBoundary loginInteractor = new LoginInteractor( + userDataAccessObject, loginOutputBoundary); + final LoginController loginController = new LoginController(loginInteractor); + keywordView.setLoginController(loginController); + return this; + } + /** * Adds the Login Use Case to the application. * @return this builder @@ -180,7 +198,30 @@ public AppBuilder addLogoutUseCase() { loggedInView.setLogoutController(logoutController); return this; } + /** + * Adds the Keyword Search Use Case to the application. + * @return this builder + */ + public AppBuilder addKeywordUseCase() { + final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, + loggedInViewModel, loginViewModel); + final LoginInputBoundary loginInteractor = new LoginInteractor( + userDataAccessObject, loginOutputBoundary); + final LoginController loginController = new LoginController(loginInteractor); + keywordView.setLoginController(loginController); + + final KeywordOutputBoundary keywordOutputBoundary = new KeywordPresenter(viewManagerModel, + loggedInViewModel, keywordViewModel); + + final KeywordInputBoundary keywordInteractor = + new KeywordInteractor(spotifyDataAccessObject, keywordOutputBoundary); + + final KeywordController keywordController = new KeywordController(keywordInteractor); + keywordView.setKeywordController(keywordController); + loggedInView.setKeywordController(keywordController); + return this; + } /** * Adds the Search Use Case to the application. * @return this builder @@ -224,7 +265,7 @@ public AppBuilder addTopItemsUseCase() { topTracksAndArtistsViewModel); final TopItemsInputBoundary topItemsInputBoundary = - new TopItemsInteractor(topItemsUserDataAccessObject, topItemsOutputBoundary); + new TopItemsInteractor(spotifyDataAccessObject, topItemsOutputBoundary); final TopItemsController topItemsController = new TopItemsController(topItemsInputBoundary); loggedInView.setTopTracksController(topItemsController); diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 8a72dcf06..bc8eb8c69 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -20,12 +20,14 @@ public static void main(String[] args) { .addLoginUseCase() .addSearchView() .addTopItemsView() + .addKeywordView() .addLoggedInView() .addSimilarListenersView() .addLogoutUseCase() .addSearchUseCase() .addTopItemsUseCase() .addSimilarListenersUseCase() + .addKeywordUseCase() .build(); application.pack(); diff --git a/src/main/java/data_access/DBUserDataAccessObject.java b/src/main/java/data_access/DBUserDataAccessObject.java deleted file mode 100644 index ff5262a29..000000000 --- a/src/main/java/data_access/DBUserDataAccessObject.java +++ /dev/null @@ -1,163 +0,0 @@ -package data_access; - -import java.io.IOException; - -import org.json.JSONException; -import org.json.JSONObject; - -import entity.User; -import entity.UserFactory; -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -// import use_case.change_password.ChangePasswordUserDataAccessInterface; -import use_case.login.LoginUserDataAccessInterface; -import use_case.logout.LogoutUserDataAccessInterface; -// import use_case.signup.SignupUserDataAccessInterface; - -/** - * The DAO for user data. - */ -public class DBUserDataAccessObject implements - LoginUserDataAccessInterface, LogoutUserDataAccessInterface { - private static final int SUCCESS_CODE = 200; - private static final String CONTENT_TYPE_LABEL = "Content-Type"; - private static final String CONTENT_TYPE_JSON = "application/json"; - private static final String STATUS_CODE_LABEL = "status_code"; - private static final String ACCESSTOKEN = "accessToken"; - // private static final String PASSWORD = "password"; - private static final String MESSAGE = "message"; - private final UserFactory userFactory; - - public DBUserDataAccessObject(UserFactory userFactory) { - this.userFactory = userFactory; - // No need to do anything to reinitialize a user list! The data is the cloud that may be miles away. - } - - @Override - public User get(String username) { - // Make an API call to get the user object. - final OkHttpClient client = new OkHttpClient().newBuilder().build(); - final Request request = new Request.Builder() - .url(String.format("http://vm003.teach.cs.toronto.edu:20112/user?username=%s", username)) - .addHeader("Content-Type", CONTENT_TYPE_JSON) - .build(); - try { - final Response response = client.newCall(request).execute(); - - final JSONObject responseBody = new JSONObject(response.body().string()); - - if (responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE) { - final JSONObject userJSONObject = responseBody.getJSONObject("user"); - final String name = userJSONObject.getString(ACCESSTOKEN); - // final String password = userJSONObject.getString(PASSWORD); - - return userFactory.create(name); - } - else { - throw new RuntimeException(responseBody.getString(MESSAGE)); - } - } - catch (IOException | JSONException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public void setCurrentAccessToken(String name) { - // this isn't implemented for the lab - } - - @Override - public boolean existsByName(String username) { - final OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - final Request request = new Request.Builder() - .url(String.format("http://vm003.teach.cs.toronto.edu:20112/checkIfUserExists?username=%s", username)) - .addHeader(CONTENT_TYPE_LABEL, CONTENT_TYPE_JSON) - .build(); - try { - final Response response = client.newCall(request).execute(); - - final JSONObject responseBody = new JSONObject(response.body().string()); - - return responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE; - } - catch (IOException | JSONException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public void save(User user) { - final OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - - // POST METHOD - final MediaType mediaType = MediaType.parse(CONTENT_TYPE_JSON); - final JSONObject requestBody = new JSONObject(); - requestBody.put(ACCESSTOKEN, user.getAccessToken()); - // requestBody.put(PASSWORD, user.getPassword()); - final RequestBody body = RequestBody.create(requestBody.toString(), mediaType); - final Request request = new Request.Builder() - .url("http://vm003.teach.cs.toronto.edu:20112/user") - .method("POST", body) - .addHeader(CONTENT_TYPE_LABEL, CONTENT_TYPE_JSON) - .build(); - try { - final Response response = client.newCall(request).execute(); - - final JSONObject responseBody = new JSONObject(response.body().string()); - - if (responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE) { - // success! - } - else { - throw new RuntimeException(responseBody.getString(MESSAGE)); - } - } - catch (IOException | JSONException ex) { - throw new RuntimeException(ex); - } - } - - /* @Override - public void changePassword(User user) { - final OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - - // POST METHOD - final MediaType mediaType = MediaType.parse(CONTENT_TYPE_JSON); - final JSONObject requestBody = new JSONObject(); - requestBody.put(USERNAME, user.getName()); - requestBody.put(PASSWORD, user.getPassword()); - final RequestBody body = RequestBody.create(requestBody.toString(), mediaType); - final Request request = new Request.Builder() - .url("http://vm003.teach.cs.toronto.edu:20112/user") - .method("PUT", body) - .addHeader(CONTENT_TYPE_LABEL, CONTENT_TYPE_JSON) - .build(); - try { - final Response response = client.newCall(request).execute(); - - final JSONObject responseBody = new JSONObject(response.body().string()); - - if (responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE) { - // success! - } - else { - throw new RuntimeException(responseBody.getString(MESSAGE)); - } - } - catch (IOException | JSONException ex) { - throw new RuntimeException(ex); - } - } */ - - @Override - public String getCurrentAccessToken() { - return null; - } -} diff --git a/src/main/java/data_access/FileUserDataAccessObject.java b/src/main/java/data_access/FileUserDataAccessObject.java deleted file mode 100644 index 25fc34e07..000000000 --- a/src/main/java/data_access/FileUserDataAccessObject.java +++ /dev/null @@ -1,116 +0,0 @@ -package data_access; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -import entity.User; -import entity.UserFactory; -// import use_case.change_password.ChangePasswordUserDataAccessInterface; -import use_case.login.LoginUserDataAccessInterface; -// import use_case.signup.SignupUserDataAccessInterface; - -/** - * DAO for user data implemented using a File to persist the data. - */ -public class FileUserDataAccessObject implements - LoginUserDataAccessInterface { - - private static final String HEADER = "accessToken"; - - private final File csvFile; - private final Map headers = new LinkedHashMap<>(); - private final Map accounts = new HashMap<>(); - private String currentAccessToken; - - public FileUserDataAccessObject(String csvPath, UserFactory userFactory) throws IOException { - - csvFile = new File(csvPath); - headers.put("accessToken", 0); - // headers.put("password", 1); - - if (csvFile.length() == 0) { - save(); - } - else { - - try (BufferedReader reader = new BufferedReader(new FileReader(csvFile))) { - final String header = reader.readLine(); - - if (!header.equals(HEADER)) { - throw new RuntimeException(String.format("header should be%n: %s%but was:%n%s", HEADER, header)); - } - - String row; - while ((row = reader.readLine()) != null) { - final String[] col = row.split(","); - final String accessToken = String.valueOf(col[headers.get("accessToken")]); - // final String password = String.valueOf(col[headers.get("password")]); - final User user = userFactory.create(accessToken); - accounts.put(accessToken, user); - } - } - } - } - - private void save() { - final BufferedWriter writer; - try { - writer = new BufferedWriter(new FileWriter(csvFile)); - writer.write(String.join(",", headers.keySet())); - writer.newLine(); - - for (User user : accounts.values()) { - final String line = String.format("%s,%s", - user.getAccessToken()); - writer.write(line); - writer.newLine(); - } - - writer.close(); - - } - catch (IOException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public void save(User user) { - accounts.put(user.getAccessToken(), user); - this.save(); - } - - @Override - public User get(String accessToken) { - return accounts.get(accessToken); - } - - @Override - public void setCurrentAccessToken(String accessToken) { - this.currentAccessToken = accessToken; - } - - @Override - public String getCurrentAccessToken() { - return this.currentAccessToken; - } - - @Override - public boolean existsByName(String identifier) { - return accounts.containsKey(identifier); - } - - /* @Override - public void changePassword(User user) { - // Replace the User object in the map - accounts.put(user.getName(), user); - save(); - } */ -} diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index a96b85961..e4f0b647b 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -1,13 +1,11 @@ package data_access; import java.util.HashMap; -import java.util.List; import java.util.Map; import entity.User; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; -import use_case.top_items.TopItemsUserDataAccessInterface; /** * In-memory implementation of the DAO for storing user data. This implementation does @@ -21,11 +19,6 @@ public class InMemoryUserDataAccessObject implements private String currentUsername; - @Override - public boolean existsByName(String identifier) { - return users.containsKey(identifier); - } - @Override public void save(User user) { users.put(user.getAccessToken(), user); diff --git a/src/main/java/data_access/SimilarListenersTestDataAccessObject.java b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java index 62a6361a7..fa3733ed8 100644 --- a/src/main/java/data_access/SimilarListenersTestDataAccessObject.java +++ b/src/main/java/data_access/SimilarListenersTestDataAccessObject.java @@ -1,11 +1,10 @@ package data_access; -import use_case.similar_listeners.SimilarListenersUserDataAccessInterface; +import use_case.similar_listeners.SimilarListenersDataAccessInterface; -import java.util.ArrayList; import java.util.List; -public class SimilarListenersTestDataAccessObject implements SimilarListenersUserDataAccessInterface { +public class SimilarListenersTestDataAccessObject implements SimilarListenersDataAccessInterface { private List followedArtists; diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index cd13ab00c..fdc76d971 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -4,13 +4,14 @@ import java.util.ArrayList; import java.util.List; -import entity.CommonUser; -import entity.User; - +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import interface_adapter.login.LoginState; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; import org.apache.hc.core5.http.ParseException; -import org.json.JSONException; -import org.json.JSONObject; import se.michaelthelin.spotify.SpotifyApi; import se.michaelthelin.spotify.enums.ModelObjectType; import se.michaelthelin.spotify.exceptions.SpotifyWebApiException; @@ -19,14 +20,15 @@ import se.michaelthelin.spotify.requests.data.follow.GetUsersFollowedArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; -import use_case.similar_listeners.SimilarListenersUserDataAccessInterface; -import use_case.top_items.TopItemsUserDataAccessInterface; +import use_case.keyword.KeywordDataAccessInterface; +import use_case.similar_listeners.SimilarListenersDataAccessInterface; +import use_case.top_items.TopItemsDataAccessInterface; /** * DAO for getting relevant information from Spotify API. */ -public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, - SimilarListenersUserDataAccessInterface { +public class SpotifyDataAccessObject implements TopItemsDataAccessInterface, + SimilarListenersDataAccessInterface, KeywordDataAccessInterface { public static final int OFFSET = 4; public static final int OFFSET2 = 0; @@ -34,6 +36,7 @@ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, private String accessToken; private List currentTopTracks; private List currentTopArtists; + private List currentSearchResults; private SpotifyApi spotifyApi; private GetUsersTopTracksRequest getTopTracksRequest; private GetUsersTopArtistsRequest getTopArtistsRequest; @@ -174,6 +177,46 @@ private void getRecommendationsSync() { System.out.println("Error: " + e.getMessage()); } } + /** + * A helper method to get the current users search results from spotify. + * @param artistName the name of the artist the user is searching for. + * @param keyword the keyword search the user is making. + */ + private void getSearchResultsSync(String artistName, String keyword) { + final String SEARCH_URL = "https://api.spotify.com/v1/search"; + OkHttpClient client = new OkHttpClient(); + + // Build the search query URL + HttpUrl url = HttpUrl.parse(SEARCH_URL).newBuilder() + .addQueryParameter("q", "artist:" + artistName + " " + keyword) // Combine artist and keyword + .addQueryParameter("type", "track") + .build(); + + // Prepare the API request + Request request = new Request.Builder() + .url(url) + .addHeader("Authorization", "Bearer " + accessToken) // Use the provided access token + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful() && response.body() != null) { + JsonObject jsonObject = JsonParser.parseString(response.body().string()).getAsJsonObject(); + List songs = new ArrayList(); + + // Extract tracks from the response + jsonObject.getAsJsonObject("tracks").getAsJsonArray("items").forEach(track -> { + String songName = track.getAsJsonObject().get("name").getAsString(); + songs.add(songName); // Add the track name to the list + }); + currentSearchResults = songs; + } else { + throw new RuntimeException("Failed to search songs: " + response.message()); + } + } catch (IOException e) { + throw new RuntimeException("Error searching songs", e); + } + } @Override public List getCurrentTopTracks() { @@ -206,5 +249,19 @@ public void setCurrentFollowedArtists(List followedArtists) { this.currFollowedArtists = followedArtists; } + + @Override + public List searchSongs(String artistName, String keyword) { + getSearchResultsSync(artistName, keyword); + return getCurrentSearchResults(); + } + + public List getCurrentSearchResults() { + return currentSearchResults; + } + + public void setCurrentSearchResults(List currentSearchResults) { + this.currentSearchResults = currentSearchResults; + } } diff --git a/src/main/java/data_access/TopItemsUserDataAccessObject.java b/src/main/java/data_access/TopItemsUserDataAccessObject.java deleted file mode 100644 index ac10de997..000000000 --- a/src/main/java/data_access/TopItemsUserDataAccessObject.java +++ /dev/null @@ -1,44 +0,0 @@ -package data_access; - -import use_case.top_items.TopItemsUserDataAccessInterface; - -import java.util.ArrayList; -import java.util.List; - -public class TopItemsUserDataAccessObject implements TopItemsUserDataAccessInterface { - - private List tracks; - private List artists; - - public TopItemsUserDataAccessObject() { - tracks = new ArrayList<>(); - artists = new ArrayList<>(); - tracks.add("Heartbreaker"); - tracks.add("reincarnated"); - tracks.add("Kill Bill"); - tracks.add("Crew Love"); - artists.add("The Weeknd"); - artists.add("Kanye West"); - artists.add("A$AP Rocky"); - - } - - @Override - public List getCurrentTopTracks() { - return tracks; - } - - @Override - public void setCurrentTopTracks(List tracks) { - } - - @Override - public List getCurrentTopArtists() { - return artists; - } - - @Override - public void setCurrentTopArtists(List artists) { - - } -} diff --git a/src/main/java/interface_adapter/keyword/KeywordController.java b/src/main/java/interface_adapter/keyword/KeywordController.java index 38e9d53df..2bb4fbc06 100644 --- a/src/main/java/interface_adapter/keyword/KeywordController.java +++ b/src/main/java/interface_adapter/keyword/KeywordController.java @@ -5,29 +5,45 @@ public class KeywordController { private final KeywordInputBoundary interactor; - private final KeywordViewModel viewModel; - public KeywordController(KeywordInputBoundary interactor, KeywordViewModel viewModel) { + public KeywordController(KeywordInputBoundary interactor) { this.interactor = interactor; - this.viewModel = viewModel; } public void searchByKeyword(String artistName, String keyword) { // Validate inputs if (artistName == null || artistName.isEmpty()) { - viewModel.setErrorMessage("Artist name cannot be empty."); + //viewModel.setErrorMessage("Artist name cannot be empty."); return; // Stop further execution } if (keyword == null || keyword.isEmpty()) { - viewModel.setErrorMessage("Keyword cannot be empty."); + //viewModel.setErrorMessage("Keyword cannot be empty."); return; // Stop further execution } // Clear any previous error messages - viewModel.setErrorMessage(null); + //viewModel.setErrorMessage(null); // Pass input data to the interactor KeywordInputData inputData = new KeywordInputData(artistName, keyword); interactor.searchByKeyword(inputData); } + + /** + * Goes to the search use case. + * @param accessToken the access token for spotify. + */ + public void execute(String accessToken) { + interactor.execute(accessToken); + } + + /** + * Executes the keyword Use Case. + * @param keyword the keyword the user is inputting. + * @param artist the artist the user wants info about. + * @param accessToken the access token for spotify. + */ + public void executeSearch(String accessToken, String artist, String keyword) { + interactor.executeSearch(accessToken, artist, keyword); + } } \ No newline at end of file diff --git a/src/main/java/interface_adapter/keyword/KeywordPresenter.java b/src/main/java/interface_adapter/keyword/KeywordPresenter.java index 03f35209d..fb51e7c15 100644 --- a/src/main/java/interface_adapter/keyword/KeywordPresenter.java +++ b/src/main/java/interface_adapter/keyword/KeywordPresenter.java @@ -1,22 +1,42 @@ package interface_adapter.keyword; +import interface_adapter.ViewManagerModel; +import interface_adapter.logged_in.LoggedInViewModel; +import interface_adapter.search.SearchState; +import interface_adapter.search.SearchViewModel; import use_case.keyword.KeywordOutputBoundary; import use_case.keyword.KeywordOutputData; - +/** + * The Presenter for the Search Use Case. + */ public class KeywordPresenter implements KeywordOutputBoundary { - private final KeywordViewModel viewModel; + private LoggedInViewModel loggedInViewModel; + private ViewManagerModel viewManagerModel; + private KeywordViewModel keywordViewModel; + + public KeywordPresenter(ViewManagerModel viewManagerModel, + LoggedInViewModel loggedInViewModel, + KeywordViewModel keywordViewModel) { + // Done: assign to the three instance variables. + this.loggedInViewModel = loggedInViewModel; + this.viewManagerModel = viewManagerModel; + this.keywordViewModel = keywordViewModel; - public KeywordPresenter(KeywordViewModel viewModel) { - this.viewModel = viewModel; } @Override - public void presentResults(KeywordOutputData outputData) { - if (outputData.hasError()) { - viewModel.setErrorMessage(outputData.getErrorMessage()); - } else { - viewModel.setSongs(outputData.getSongs()); - } - viewModel.setLoading(false); + public void prepareSuccessView(KeywordOutputData outputData) { + final KeywordState keywordState = keywordViewModel.getState(); + keywordState.setAccessToken(outputData.getSpotifyToken()); + keywordState.setDisplayText(outputData.getSongs()); + keywordViewModel.setState(keywordState); + keywordViewModel.firePropertyChanged(); + // This code tells the View Manager to switch to the Search. + this.viewManagerModel.setState(keywordViewModel.getViewName()); + this.viewManagerModel.firePropertyChanged(); + } + + @Override + public void prepareFailView(String errorMessage) { } } \ No newline at end of file diff --git a/src/main/java/interface_adapter/keyword/KeywordState.java b/src/main/java/interface_adapter/keyword/KeywordState.java index 4babd5fbe..613225204 100644 --- a/src/main/java/interface_adapter/keyword/KeywordState.java +++ b/src/main/java/interface_adapter/keyword/KeywordState.java @@ -1,52 +1,30 @@ package interface_adapter.keyword; - -import java.util.List; - +/** + * The state for the KeywordViewModel. + */ public class KeywordState { - private boolean isLoading; - private List songs; - private String errorMessage; - - // Constructor to initialize default state - public KeywordState() { - this.isLoading = false; - this.songs = null; - this.errorMessage = null; - } - - // Getter and Setter for isLoading - public boolean isLoading() { - return isLoading; - } - - public void setLoading(boolean loading) { - isLoading = loading; - } + private String displayText; + private String accessToken; - // Getter and Setter for songs - public List getSongs() { - return songs; + public KeywordState(KeywordState copy) { + displayText = copy.displayText; + accessToken = copy.accessToken; } - public void setSongs(List songs) { - this.songs = songs; - } + // Because of the previous copy constructor, the default constructor must be explicit. + public KeywordState() { - // Getter and Setter for errorMessage - public String getErrorMessage() { - return errorMessage; } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; + public String getDisplayText() {return displayText;} + public void setDisplayText(String displayText) { + this.displayText = displayText; } - // Helper methods - public boolean hasError() { - return errorMessage != null; + public String getAccessToken() { + return accessToken; } - public boolean hasResults() { - return songs != null && !songs.isEmpty(); + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; } -} \ No newline at end of file +} diff --git a/src/main/java/interface_adapter/keyword/KeywordViewModel.java b/src/main/java/interface_adapter/keyword/KeywordViewModel.java index 0932260a7..76891a7d3 100644 --- a/src/main/java/interface_adapter/keyword/KeywordViewModel.java +++ b/src/main/java/interface_adapter/keyword/KeywordViewModel.java @@ -1,51 +1,16 @@ package interface_adapter.keyword; -import java.util.List; - -public class KeywordViewModel { - private boolean proper_input = false; - private String errorMessage = null; // Error message starts as null - private List songs = null; // Song list starts as null +import interface_adapter.ViewModel; +import interface_adapter.search.SearchState; - // Getter for loading state - public boolean isProper_input() { - return proper_input; - } - - // Setter for loading state - public void setLoading(boolean proper_input) { - this.proper_input = proper_input; - } - - // Getter for error message - public String getErrorMessage() { - return errorMessage; - } - - // Setter for error message - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - // Getter for song list - public List getSongs() { - return songs; - } - - // Setter for song list - public void setSongs(List songs) { - this.songs = songs; - } - - // Helper method to determine if there is an error - public boolean hasError() { - return errorMessage != null && !errorMessage.isEmpty(); - } - - // Method to clear state when starting a new search - public void reset() { - this.proper_input = false; - this.errorMessage = null; - this.songs = null; +import java.util.List; +/** +* The view model for the Search use case. +*/ +public class KeywordViewModel extends ViewModel { + + public KeywordViewModel() { + super("keyword"); + setState(new KeywordState()); } } \ No newline at end of file diff --git a/src/main/java/interface_adapter/logout/LogoutPresenter.java b/src/main/java/interface_adapter/logout/LogoutPresenter.java index d2343fd0f..c49521d9b 100644 --- a/src/main/java/interface_adapter/logout/LogoutPresenter.java +++ b/src/main/java/interface_adapter/logout/LogoutPresenter.java @@ -20,7 +20,6 @@ public class LogoutPresenter implements LogoutOutputBoundary { public LogoutPresenter(ViewManagerModel viewManagerModel, LoggedInViewModel loggedInViewModel, LoginViewModel loginViewModel) { - // Done: assign to the three instance variables. this.loggedInViewModel = loggedInViewModel; this.viewManagerModel = viewManagerModel; this.loginViewModel = loginViewModel; diff --git a/src/main/java/interface_adapter/search/SearchController.java b/src/main/java/interface_adapter/search/SearchController.java index 1321885c4..dfd11b93e 100644 --- a/src/main/java/interface_adapter/search/SearchController.java +++ b/src/main/java/interface_adapter/search/SearchController.java @@ -1,8 +1,5 @@ package interface_adapter.search; - -import use_case.login.LoginInputBoundary; -import use_case.login.LoginInputData; import use_case.search.SearchInputBoundary; /** diff --git a/src/main/java/interface_adapter/search/SearchPresenter.java b/src/main/java/interface_adapter/search/SearchPresenter.java index d16f07654..6ff2b544d 100644 --- a/src/main/java/interface_adapter/search/SearchPresenter.java +++ b/src/main/java/interface_adapter/search/SearchPresenter.java @@ -15,7 +15,7 @@ import use_case.logout.LogoutOutputData; /** - * The Presenter for the Logout Use Case. + * The Presenter for the Search Use Case. */ public class SearchPresenter implements SearchOutputBoundary { diff --git a/src/main/java/interface_adapter/search/SearchState.java b/src/main/java/interface_adapter/search/SearchState.java index 1c759e78a..6cc4b28b2 100644 --- a/src/main/java/interface_adapter/search/SearchState.java +++ b/src/main/java/interface_adapter/search/SearchState.java @@ -1,7 +1,5 @@ package interface_adapter.search; -import interface_adapter.logged_in.LoggedInState; - /** * The state for the SearchViewModel. */ diff --git a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java index 2f1bd587c..77dde9c77 100644 --- a/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java +++ b/src/main/java/interface_adapter/similar_listeners/SimilarListenersController.java @@ -1,7 +1,5 @@ package interface_adapter.similar_listeners; -import java.util.ArrayList; - import use_case.similar_listeners.SimilarListenersInputBoundary; import use_case.similar_listeners.SimilarListenersInputData; diff --git a/src/main/java/interface_adapter/top_items/TopItemsController.java b/src/main/java/interface_adapter/top_items/TopItemsController.java index fa45946c4..f1e95843d 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsController.java +++ b/src/main/java/interface_adapter/top_items/TopItemsController.java @@ -9,7 +9,7 @@ * The controller for the TopItems Use Case. */ public class TopItemsController { - private TopItemsInputBoundary topItemsUseCaseInteractor; + final private TopItemsInputBoundary topItemsUseCaseInteractor; public TopItemsController(TopItemsInputBoundary topItemsUseCaseInteractor) { this.topItemsUseCaseInteractor = topItemsUseCaseInteractor; diff --git a/src/main/java/spotify_api/SpotifyService.java b/src/main/java/spotify_api/SpotifyService.java deleted file mode 100644 index cbe9779b0..000000000 --- a/src/main/java/spotify_api/SpotifyService.java +++ /dev/null @@ -1,57 +0,0 @@ -package spotify_api; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import okhttp3.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class SpotifyService { - private static final String SEARCH_URL = "https://api.spotify.com/v1/search"; - private final String accessToken; - - public SpotifyService(String accessToken) { - if (accessToken == null || accessToken.isEmpty()) { - throw new IllegalArgumentException("Access token cannot be null or empty."); - } - this.accessToken = accessToken; - } - - public List searchSongs(String artistName, String keyword) { - OkHttpClient client = new OkHttpClient(); - - // Build the search query URL - HttpUrl url = HttpUrl.parse(SEARCH_URL).newBuilder() - .addQueryParameter("q", "artist:" + artistName + " " + keyword) // Combine artist and keyword - .addQueryParameter("type", "track") - .build(); - - // Prepare the API request - Request request = new Request.Builder() - .url(url) - .addHeader("Authorization", "Bearer " + accessToken) // Use the provided access token - .get() - .build(); - - try (Response response = client.newCall(request).execute()) { - if (response.isSuccessful() && response.body() != null) { - JsonObject jsonObject = JsonParser.parseString(response.body().string()).getAsJsonObject(); - List songs = new ArrayList<>(); - - // Extract tracks from the response - jsonObject.getAsJsonObject("tracks").getAsJsonArray("items").forEach(track -> { - String songName = track.getAsJsonObject().get("name").getAsString(); - songs.add(songName); // Add the track name to the list - }); - - return songs; - } else { - throw new RuntimeException("Failed to search songs: " + response.message()); - } - } catch (IOException e) { - throw new RuntimeException("Error searching songs", e); - } - } -} \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordDataAccessInterface.java b/src/main/java/use_case/keyword/KeywordDataAccessInterface.java new file mode 100644 index 000000000..96947843d --- /dev/null +++ b/src/main/java/use_case/keyword/KeywordDataAccessInterface.java @@ -0,0 +1,13 @@ +package use_case.keyword; + +import java.util.List; + +public interface KeywordDataAccessInterface { + /** A method with searches for songs based on a given name and keyword about the song. + * @param artistName the name of the artist to search for. + * @param keyword a keyword about the song, possibly a lyric. + * @return the related songs. + */ + List searchSongs(String artistName, String keyword); + +} diff --git a/src/main/java/use_case/keyword/KeywordInputBoundary.java b/src/main/java/use_case/keyword/KeywordInputBoundary.java index 1b9c61198..c101511de 100644 --- a/src/main/java/use_case/keyword/KeywordInputBoundary.java +++ b/src/main/java/use_case/keyword/KeywordInputBoundary.java @@ -7,4 +7,15 @@ public interface KeywordInputBoundary { * @param inputData The input data containing the artist's name and keyword. */ void searchByKeyword(KeywordInputData inputData); + + /** + * takes us to the keyword search use case. + */ + void execute(String accessToken); + + /** + * Executes the keyword search use case. + */ + void executeSearch(String accessToken, String artist, String keyword); + } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordInteractor.java b/src/main/java/use_case/keyword/KeywordInteractor.java index 85f751c5e..6b1912823 100644 --- a/src/main/java/use_case/keyword/KeywordInteractor.java +++ b/src/main/java/use_case/keyword/KeywordInteractor.java @@ -1,7 +1,8 @@ package use_case.keyword; -import data_access.SpotifyService; +import use_case.search.SearchOutputData; +import java.util.ArrayList; import java.util.List; /** @@ -9,18 +10,18 @@ * Handles the business logic and interacts with the Spotify API service. */ public class KeywordInteractor implements KeywordInputBoundary { - private final SpotifyService spotifyService; // Interacts with Spotify API - private final KeywordOutputBoundary outputBoundary; // Sends results to the presenter + private final KeywordDataAccessInterface keywordDataAccessInterface; // Interacts with Spotify API + private final KeywordOutputBoundary keywordPresenter; // Sends results to the presenter /** * Constructs a KeywordInteractor. * - * @param spotifyService The data_access.SpotifyService to handle API calls. + * @param keywordDataAccessInterface The data_access.SpotifyDataAccessObject to handle API calls. * @param outputBoundary The output boundary to send results or errors to the presenter. */ - public KeywordInteractor(SpotifyService spotifyService, KeywordOutputBoundary outputBoundary) { - this.spotifyService = spotifyService; - this.outputBoundary = outputBoundary; + public KeywordInteractor(KeywordDataAccessInterface keywordDataAccessInterface, KeywordOutputBoundary outputBoundary) { + this.keywordDataAccessInterface = keywordDataAccessInterface; + this.keywordPresenter = outputBoundary; } /** @@ -35,18 +36,34 @@ public void searchByKeyword(KeywordInputData inputData) { String keyword = inputData.getKeyword(); // Use data_access.SpotifyService to fetch and filter songs - List songs = spotifyService.searchSongs(artistName, keyword); + List songs = keywordDataAccessInterface.searchSongs(artistName, keyword); if (songs.isEmpty()) { // No songs found matching the keyword - outputBoundary.presentResults(new KeywordOutputData("No songs found matching the keyword.")); + keywordPresenter.prepareSuccessView(new KeywordOutputData("No songs found matching the keyword.")); } else { // Pass the list of songs to the presenter - outputBoundary.presentResults(new KeywordOutputData(songs)); + keywordPresenter.prepareSuccessView(new KeywordOutputData("placeholder token",songs)); } } catch (Exception e) { // Pass any exception as an error message to the presenter - outputBoundary.presentResults(new KeywordOutputData("Error: " + e.getMessage())); + keywordPresenter.prepareSuccessView(new KeywordOutputData("Error: " + e.getMessage())); } } + + @Override + public void execute(String accessToken) { + List songs = new ArrayList(); + songs.add("There are no songs to display."); + final KeywordOutputData search = new KeywordOutputData(accessToken,songs); + keywordPresenter.prepareSuccessView(search); + } + + @Override + public void executeSearch(String accessToken, String artist, String keyword){ + + final List songs = keywordDataAccessInterface.searchSongs(artist,keyword); + final KeywordOutputData search = new KeywordOutputData(accessToken,songs); + keywordPresenter.prepareSuccessView(search); + } } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordOutputBoundary.java b/src/main/java/use_case/keyword/KeywordOutputBoundary.java index 7ce338585..05f99b039 100644 --- a/src/main/java/use_case/keyword/KeywordOutputBoundary.java +++ b/src/main/java/use_case/keyword/KeywordOutputBoundary.java @@ -1,5 +1,20 @@ package use_case.keyword; +import use_case.search.SearchOutputData; +/** + * The output boundary for the keyword Search Use Case. + */ public interface KeywordOutputBoundary { - void presentResults(KeywordOutputData outputData); + /** + * Prepares the success view for the keyword search Use Case. + * @param outputData the output data + */ + void prepareSuccessView(KeywordOutputData outputData); + + /** + * Prepares the failure view for the keyword Search Use Case. + * @param errorMessage the explanation of the failure + */ + void prepareFailView(String errorMessage); + } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordOutputData.java b/src/main/java/use_case/keyword/KeywordOutputData.java index aa6eb3324..11899d688 100644 --- a/src/main/java/use_case/keyword/KeywordOutputData.java +++ b/src/main/java/use_case/keyword/KeywordOutputData.java @@ -5,27 +5,38 @@ public class KeywordOutputData { private final List songs; private final String errorMessage; + private String spotifyToken; // Constructor for successful results - public KeywordOutputData(List songs) { + public KeywordOutputData(String spotifyToken,List songs) { + this.spotifyToken = spotifyToken; this.songs = songs; this.errorMessage = null; } // Constructor for errors public KeywordOutputData(String errorMessage) { + this.spotifyToken = "spotifyToken"; this.songs = null; this.errorMessage = errorMessage; } - public List getSongs() { - return songs; + public String getSongs() { + return songs.toString(); } + public String getErrorMessage() { return errorMessage; } + public void setSpotifyToken(String spotifyToken) { + this.spotifyToken = spotifyToken; + } + public String getSpotifyToken() { + return spotifyToken; + } + public boolean hasError() { return errorMessage != null; } diff --git a/src/main/java/use_case/keyword/KeywordUserDataAccessObject.java b/src/main/java/use_case/keyword/KeywordUserDataAccessObject.java deleted file mode 100644 index 80a6c3742..000000000 --- a/src/main/java/use_case/keyword/KeywordUserDataAccessObject.java +++ /dev/null @@ -1,41 +0,0 @@ -package use_case.keyword; - -import entity.User; -import use_case.login.LoginUserDataAccessInterface; - -import java.util.HashMap; -import java.util.Map; - -/** - * Implementation of LoginUserDataAccessInterface for the Keyword feature. - */ -public class KeywordUserDataAccessObject implements LoginUserDataAccessInterface { - private final Map userStore = new HashMap<>(); // Stores users by username - private String currentAccessToken; // Stores the current session's access token - - @Override - public boolean existsByName(String username) { - return userStore.containsKey(username); - } - - @Override - public void save(User user) { - - } - - - @Override - public User get(String username) { - return userStore.get(username); - } - - @Override - public String getCurrentAccessToken() { - return currentAccessToken; - } - - @Override - public void setCurrentAccessToken(String accessToken) { - this.currentAccessToken = accessToken; - } -} \ No newline at end of file diff --git a/src/main/java/use_case/login/LoginInteractor.java b/src/main/java/use_case/login/LoginInteractor.java index ef9d70bee..87b259e25 100644 --- a/src/main/java/use_case/login/LoginInteractor.java +++ b/src/main/java/use_case/login/LoginInteractor.java @@ -1,7 +1,5 @@ package use_case.login; -import entity.User; - /** * The Login Interactor. */ @@ -18,7 +16,6 @@ public LoginInteractor(LoginUserDataAccessInterface userDataAccessInterface, @Override public void execute(LoginInputData loginInputData) { final String token = loginInputData.getLoginToken(); - final User user = userDataAccessObject.get(token); userDataAccessObject.setCurrentAccessToken(token); final LoginOutputData loginOutputData = new LoginOutputData(token, false); loginPresenter.prepareSuccessView(loginOutputData); diff --git a/src/main/java/use_case/login/LoginUserDataAccessInterface.java b/src/main/java/use_case/login/LoginUserDataAccessInterface.java index 861619656..e2286dde0 100644 --- a/src/main/java/use_case/login/LoginUserDataAccessInterface.java +++ b/src/main/java/use_case/login/LoginUserDataAccessInterface.java @@ -7,13 +7,6 @@ */ public interface LoginUserDataAccessInterface { - /** - * Checks if the given username exists. - * @param username the username to look for - * @return true if a user with the given username exists; false otherwise - */ - boolean existsByName(String username); - /** * Saves the user. * @param user the user to save diff --git a/src/main/java/use_case/search/SearchInputData.java b/src/main/java/use_case/search/SearchInputData.java deleted file mode 100644 index be7bbb710..000000000 --- a/src/main/java/use_case/search/SearchInputData.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.search; - -public class SearchInputData { -} diff --git a/src/main/java/use_case/search/SearchInteractor.java b/src/main/java/use_case/search/SearchInteractor.java index f7db0060a..527779f1d 100644 --- a/src/main/java/use_case/search/SearchInteractor.java +++ b/src/main/java/use_case/search/SearchInteractor.java @@ -1,10 +1,5 @@ package use_case.search; -import data_access.DBUserDataAccessObject; -import data_access.InMemoryUserDataAccessObject; -import use_case.login.LoginInputData; -import use_case.logout.LogoutOutputData; - /** * The Search Interactor. */ diff --git a/src/main/java/use_case/search/SearchOutputBoundary.java b/src/main/java/use_case/search/SearchOutputBoundary.java index 73d4f4d09..19a042900 100644 --- a/src/main/java/use_case/search/SearchOutputBoundary.java +++ b/src/main/java/use_case/search/SearchOutputBoundary.java @@ -1,6 +1,5 @@ package use_case.search; -import use_case.logout.LogoutOutputData; /** * The output boundary for the Search Use Case. */ diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java b/src/main/java/use_case/similar_listeners/SimilarListenersDataAccessInterface.java similarity index 89% rename from src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java rename to src/main/java/use_case/similar_listeners/SimilarListenersDataAccessInterface.java index f4cfefc81..e41bf70d4 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersUserDataAccessInterface.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersDataAccessInterface.java @@ -5,7 +5,7 @@ /** * DAO for SimilarListeners use case. */ -public interface SimilarListenersUserDataAccessInterface { +public interface SimilarListenersDataAccessInterface { /** * Return the artists that the current user follows. diff --git a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java index 04c4360b4..d53c301b8 100644 --- a/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java +++ b/src/main/java/use_case/similar_listeners/SimilarListenersInteractor.java @@ -6,10 +6,10 @@ * SimilarListeners Interactor. */ public class SimilarListenersInteractor implements SimilarListenersInputBoundary { - private final SimilarListenersUserDataAccessInterface userDataAccessObject; + private final SimilarListenersDataAccessInterface userDataAccessObject; private final SimilarListenersOutputBoundary similarListenersPresenter; - public SimilarListenersInteractor(SimilarListenersUserDataAccessInterface userDataAccessInterface, + public SimilarListenersInteractor(SimilarListenersDataAccessInterface userDataAccessInterface, SimilarListenersOutputBoundary similarListenersOutputBoundary) { this.userDataAccessObject = userDataAccessInterface; this.similarListenersPresenter = similarListenersOutputBoundary; @@ -24,7 +24,7 @@ public void execute(SimilarListenersInputData similarListenersInputData) { } else { final List followedArtists = userDataAccessObject.getFollowedArtists(); - userDataAccessObject.setCurrentFollowedArtists(followedArtists); + // userDataAccessObject.setCurrentFollowedArtists(followedArtists); final String accessToken = similarListenersInputData.getAccessToken(); final SimilarListenersOutputData similarListenersOutputData = new SimilarListenersOutputData( followedArtists, false, accessToken); diff --git a/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java b/src/main/java/use_case/top_items/TopItemsDataAccessInterface.java similarity index 95% rename from src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java rename to src/main/java/use_case/top_items/TopItemsDataAccessInterface.java index 41b9ad1bd..754929854 100644 --- a/src/main/java/use_case/top_items/TopItemsUserDataAccessInterface.java +++ b/src/main/java/use_case/top_items/TopItemsDataAccessInterface.java @@ -5,7 +5,7 @@ /** * DAO for the Top Tracks Use Case. */ -public interface TopItemsUserDataAccessInterface { +public interface TopItemsDataAccessInterface { /** * Returns the top track list of the current user of the application. diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index f942b8b05..b4398fcf4 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -6,10 +6,10 @@ * The TopItems Interactor. */ public class TopItemsInteractor implements TopItemsInputBoundary { - private TopItemsUserDataAccessInterface userDataAccessObject; + private TopItemsDataAccessInterface userDataAccessObject; private TopItemsOutputBoundary topItemsOutputBoundary; - public TopItemsInteractor(TopItemsUserDataAccessInterface userDataAccessObject, + public TopItemsInteractor(TopItemsDataAccessInterface userDataAccessObject, TopItemsOutputBoundary topItemsOutputBoundary) { this.userDataAccessObject = userDataAccessObject; this.topItemsOutputBoundary = topItemsOutputBoundary; diff --git a/src/main/java/view/KeywordView.java b/src/main/java/view/KeywordView.java index 0a1d6dd8b..02a7a11b2 100644 --- a/src/main/java/view/KeywordView.java +++ b/src/main/java/view/KeywordView.java @@ -1,47 +1,59 @@ package view; import interface_adapter.keyword.KeywordController; +import interface_adapter.keyword.KeywordState; import interface_adapter.keyword.KeywordViewModel; -import interface_adapter.logged_in.LoggedInViewModel; +import interface_adapter.login.LoginController; +import interface_adapter.search.SearchState; import javax.swing.*; - -public class KeywordView { - private final KeywordController controller; - private final KeywordViewModel viewModel; - - public KeywordView(KeywordController controller, KeywordViewModel viewModel) { - this.controller = controller; - this.viewModel = viewModel; - } - - public JPanel getPanel(JFrame frame) { - JPanel panel = new JPanel(); - panel.setLayout(null); - - JLabel artistLabel = new JLabel("Artist Name:"); +import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +public class KeywordView extends JPanel implements PropertyChangeListener { + private final KeywordViewModel keywordViewModel; + private final String viewName = "keyword"; + private KeywordController keywordController; + private LoginController loginController; + + private final JButton homeButton; + private final JScrollPane scrollPane; + private final JTextArea resultsArea; + private final JButton searchButton; + private final JTextField artistField; + private final JTextField keywordField; + private final JLabel keywordLabel; + private final JLabel artistLabel; + private final JPanel panel = new JPanel(); + + public KeywordView( KeywordViewModel keywordViewModel) { + this.keywordViewModel = keywordViewModel; + this.keywordViewModel.addPropertyChangeListener(this); + + artistLabel = new JLabel("Artist Name:"); artistLabel.setBounds(50, 30, 100, 30); panel.add(artistLabel); - JTextField artistField = new JTextField(); + artistField = new JTextField(); artistField.setBounds(150, 30, 400, 30); panel.add(artistField); - JLabel keywordLabel = new JLabel("Keyword:"); + keywordLabel = new JLabel("Keyword:"); keywordLabel.setBounds(50, 80, 100, 30); panel.add(keywordLabel); - JTextField keywordField = new JTextField(); + keywordField = new JTextField(); keywordField.setBounds(150, 80, 400, 30); panel.add(keywordField); - JButton searchButton = new JButton("Search"); + searchButton = new JButton("Search"); searchButton.setBounds(580, 30, 100, 80); panel.add(searchButton); - JTextArea resultsArea = new JTextArea(); + resultsArea = new JTextArea(); resultsArea.setEditable(false); - JScrollPane scrollPane = new JScrollPane(resultsArea); + scrollPane = new JScrollPane(resultsArea); scrollPane.setBounds(50, 140, 650, 200); // Adjust size as needed panel.add(scrollPane); @@ -51,10 +63,10 @@ public JPanel getPanel(JFrame frame) { String keyword = keywordField.getText(); // Trigger search and update viewModel - viewModel.setLoading(true); - controller.searchByKeyword(artistName, keyword); + // controller.searchByKeyword(artistName, keyword); // Check results and update the UI accordingly + /* should all be stored in a prepareFailView if (viewModel.isProper_input()) { resultsArea.setText("Artist and keyword can not be empty"); } else if (viewModel.hasError()) { @@ -66,21 +78,69 @@ public JPanel getPanel(JFrame frame) { // Display the list of songs resultsArea.setText(String.join("\n", viewModel.getSongs())); } - }); - JButton homeButton = new JButton("Return Home"); + */ + resultsArea.setText(keywordViewModel.getState().getDisplayText()); + }); + homeButton = new JButton("Home Button"); homeButton.setBounds(580, 350, 150, 30); // Positioned at the bottom-right corner + homeButton.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + evt -> { + if (evt.getSource().equals(homeButton)) { + // 1. get the state out of the searchViewModel. It contains the username. + final String accessToken = keywordViewModel.getState().getAccessToken(); + // 2. Execute the search Controller. + loginController.execute(accessToken); + + } + } + ); panel.add(homeButton); + searchButton.addActionListener( + // This creates an anonymous subclass of ActionListener and instantiates it. + evt -> { + if (evt.getSource().equals(searchButton)) { + // 1. get the state out of the searchViewModel. It contains the username. + final String accessToken = keywordViewModel.getState().getAccessToken(); + // 2. Execute the search Controller. + keywordController.executeSearch(accessToken, artistField.getText(),keywordField.getText()); + + } + } + ); + this.add(panel); + } - homeButton.addActionListener(e -> { - LoggedInView loggedInPage = new LoggedInView(new LoggedInViewModel()); - frame.setContentPane(loggedInPage); - frame.revalidate(); - }); + /** + * React to a button click that results in evt. + * @param evt the ActionEvent to react to + */ + public void actionPerformed(ActionEvent evt) { + System.out.println("Click " + evt.getActionCommand()); + } - return panel; + @Override + public void propertyChange(PropertyChangeEvent evt) { + final KeywordState state = (KeywordState) evt.getNewValue(); + setFields(state); } - public void show() { + private void setFields(KeywordState state) { + resultsArea.setText(state.getDisplayText()); + } + + public String getViewName() { + return viewName; + } + + public void setKeywordController(KeywordController keywordController) { + this.keywordController = keywordController; + } + + public void setLoginController(LoginController loginController) { + this.loginController = loginController; + } + } \ No newline at end of file diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index dfd0bde4f..f3578cb4b 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -36,6 +36,7 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private SearchController searchController; private TopItemsController topItemsController; private SimilarListenersController similarListenersController; + private KeywordController keywordController; private final JLabel username; private final JButton logOut; @@ -61,6 +62,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final JButton keyword = new JButton("Search song by keyword"); searchButtons.add(keyword); // Add ActionListener for the "Search song by keyword" button + /* keyword.addActionListener(evt -> { if (evt.getSource().equals(keyword)) { // Retrieve the current frame @@ -79,7 +81,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { KeywordViewModel viewModel = new KeywordViewModel(); KeywordPresenter presenter = new KeywordPresenter(viewModel); SpotifyService spotifyService = new SpotifyService(accessToken); - KeywordInteractor interactor = new KeywordInteractor(spotifyService, presenter); + KeywordInteractor interactor = new KeywordInteractor(spotifyData, presenter); KeywordController keywordController = new KeywordController(interactor, viewModel); // Create the Keyword view and set it as the content pane @@ -87,7 +89,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { frame.setContentPane(keywordPage.getPanel(frame)); frame.revalidate(); // Refresh the frame to display the new content } - }); + });*/ final JButton home = new JButton("Home"); appButtons.add(home); final JButton recommendations = new JButton("Recommendations"); @@ -104,9 +106,9 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(logOut)) { // 1. get the state out of the loggedInViewModel. It contains the username. - final String name = loggedInViewModel.getState().getUsername(); + final String accessToken = loggedInViewModel.getState().getUsername(); // 2. Execute the logout Controller. - logoutController.execute(name); + logoutController.execute(accessToken); } } ); @@ -137,10 +139,9 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { // Add an ActionListener to open the Keyword window // Add an ActionListener to open the Keyword window + /* keyword.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { - // Initialize the required components KeywordViewModel viewModel = new KeywordViewModel(); // Create a new ViewModel KeywordPresenter presenter = new KeywordPresenter(viewModel); // Create a presenter @@ -153,7 +154,17 @@ public void actionPerformed(ActionEvent e) { keywordWindow.show(); } - }); + });*/ + + keyword.addActionListener( + evt -> { + if (evt.getSource().equals(keyword)) { + final String accessToken = loggedInViewModel.getState().getUsername(); + keywordController.execute(accessToken); + + } + } + ); similarListeners.addActionListener( evt -> { @@ -192,9 +203,9 @@ public String getViewName() { return viewName; } -// public void setChangePasswordController(ChangePasswordController changePasswordController) { -// this.changePasswordController = changePasswordController; -// } + public void setKeywordController(KeywordController keywordController) { + this.keywordController = keywordController; + } public void setLogoutController(LogoutController logoutController) { this.logoutController = logoutController; diff --git a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java index f8b407b9c..222723510 100644 --- a/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java +++ b/src/test/java/use_case/similar_listeners/SimilarListenersInteractorTest.java @@ -1,10 +1,6 @@ package use_case.similar_listeners; -import data_access.InMemoryUserDataAccessObject; import data_access.SimilarListenersTestDataAccessObject; -import entity.CommonUserFactory; -import entity.User; -import entity.UserFactory; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -17,7 +13,7 @@ public class SimilarListenersInteractorTest { @Test void successTest() { SimilarListenersInputData inputData = new SimilarListenersInputData("token"); - SimilarListenersUserDataAccessInterface accessObject = new SimilarListenersTestDataAccessObject(); + SimilarListenersDataAccessInterface accessObject = new SimilarListenersTestDataAccessObject(); // For the success test, we need to add Paul to the data access repository before we log in. List allfollowedArtists = new ArrayList<>(); @@ -51,7 +47,7 @@ public void prepareFailView(String error) { @Test void failTest() { SimilarListenersInputData inputData = new SimilarListenersInputData("token"); - SimilarListenersUserDataAccessInterface accessObject = new SimilarListenersTestDataAccessObject(); + SimilarListenersDataAccessInterface accessObject = new SimilarListenersTestDataAccessObject(); List allfollowedArtists = new ArrayList<>(); accessObject.setCurrentFollowedArtists(allfollowedArtists); From f691543fc90a822b5442501258b7291fb4d6cc32 Mon Sep 17 00:00:00 2001 From: eulogizee Date: Fri, 29 Nov 2024 18:52:25 -0500 Subject: [PATCH 240/262] documentation modify --- src/main/java/interface_adapter/keyword/KeywordController.java | 2 +- src/main/java/view/LoggedInView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/interface_adapter/keyword/KeywordController.java b/src/main/java/interface_adapter/keyword/KeywordController.java index 2bb4fbc06..496b5d655 100644 --- a/src/main/java/interface_adapter/keyword/KeywordController.java +++ b/src/main/java/interface_adapter/keyword/KeywordController.java @@ -30,7 +30,7 @@ public void searchByKeyword(String artistName, String keyword) { } /** - * Goes to the search use case. + * Goes to the keyword use case page. * @param accessToken the access token for spotify. */ public void execute(String accessToken) { diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index f3578cb4b..a11736307 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -69,7 +69,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { JFrame frame = (JFrame) SwingUtilities.getWindowAncestor(this); // Retrieve the access token - String accessToken = "BQCBkcgNkBgo48s7ZJlGRO2ohyiOJHc1nlBD-E6-6EsRsOILmexOHd3G81Bj3wKAymo8i1qOg8tvHPUSQASHL67WGTw4E_KlyXkpRyfMGIF67EOVLtY"; // Assuming the token is stored as the username + String accessToken = "BQB3C0RPRK-jw-xptb5X9nQ_A1yPkwIQBTtdhPbYa5oza3jmru20-sSaMGtPIBT7zcwHblQuYBTnh5Z_pgXC0RGrA5TagXUALHCr8hyXzc3Mxp0cgvI"; // Assuming the token is stored as the username // Ensure the token exists if (accessToken == null || accessToken.isEmpty()) { From 2d6050f4364d329f4c30b0c079956198bcea35b9 Mon Sep 17 00:00:00 2001 From: eulogizee Date: Fri, 29 Nov 2024 20:14:27 -0500 Subject: [PATCH 241/262] polished keywordview --- .../keyword/KeywordPresenter.java | 2 +- .../keyword/KeywordInputBoundary.java | 2 +- .../use_case/keyword/KeywordInteractor.java | 2 +- src/main/java/view/KeywordView.java | 138 ++++++++---------- 4 files changed, 66 insertions(+), 78 deletions(-) diff --git a/src/main/java/interface_adapter/keyword/KeywordPresenter.java b/src/main/java/interface_adapter/keyword/KeywordPresenter.java index fb51e7c15..9c0c9ad94 100644 --- a/src/main/java/interface_adapter/keyword/KeywordPresenter.java +++ b/src/main/java/interface_adapter/keyword/KeywordPresenter.java @@ -31,7 +31,7 @@ public void prepareSuccessView(KeywordOutputData outputData) { keywordState.setDisplayText(outputData.getSongs()); keywordViewModel.setState(keywordState); keywordViewModel.firePropertyChanged(); - // This code tells the View Manager to switch to the Search. + // This code tells the View Manager to switch to the keyword. this.viewManagerModel.setState(keywordViewModel.getViewName()); this.viewManagerModel.firePropertyChanged(); } diff --git a/src/main/java/use_case/keyword/KeywordInputBoundary.java b/src/main/java/use_case/keyword/KeywordInputBoundary.java index c101511de..4f89ce5a5 100644 --- a/src/main/java/use_case/keyword/KeywordInputBoundary.java +++ b/src/main/java/use_case/keyword/KeywordInputBoundary.java @@ -9,7 +9,7 @@ public interface KeywordInputBoundary { void searchByKeyword(KeywordInputData inputData); /** - * takes us to the keyword search use case. + * takes us to the keyword use case. */ void execute(String accessToken); diff --git a/src/main/java/use_case/keyword/KeywordInteractor.java b/src/main/java/use_case/keyword/KeywordInteractor.java index 6b1912823..56a213d3d 100644 --- a/src/main/java/use_case/keyword/KeywordInteractor.java +++ b/src/main/java/use_case/keyword/KeywordInteractor.java @@ -54,7 +54,7 @@ public void searchByKeyword(KeywordInputData inputData) { @Override public void execute(String accessToken) { List songs = new ArrayList(); - songs.add("There are no songs to display."); + songs.add(""); final KeywordOutputData search = new KeywordOutputData(accessToken,songs); keywordPresenter.prepareSuccessView(search); } diff --git a/src/main/java/view/KeywordView.java b/src/main/java/view/KeywordView.java index 02a7a11b2..695cebcc9 100644 --- a/src/main/java/view/KeywordView.java +++ b/src/main/java/view/KeywordView.java @@ -4,9 +4,9 @@ import interface_adapter.keyword.KeywordState; import interface_adapter.keyword.KeywordViewModel; import interface_adapter.login.LoginController; -import interface_adapter.search.SearchState; import javax.swing.*; +import java.awt.*; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -23,101 +23,91 @@ public class KeywordView extends JPanel implements PropertyChangeListener { private final JButton searchButton; private final JTextField artistField; private final JTextField keywordField; - private final JLabel keywordLabel; + private final JLabel keywordLabel; private final JLabel artistLabel; private final JPanel panel = new JPanel(); - public KeywordView( KeywordViewModel keywordViewModel) { + public KeywordView(KeywordViewModel keywordViewModel) { this.keywordViewModel = keywordViewModel; this.keywordViewModel.addPropertyChangeListener(this); + setLayout(new BorderLayout(10, 10)); // Add spacing between sections + setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Add padding around the panel + + // Input Panel + JPanel inputPanel = new JPanel(); + inputPanel.setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); // Add spacing between components + gbc.fill = GridBagConstraints.HORIZONTAL; + + // Artist Name Label and TextField artistLabel = new JLabel("Artist Name:"); - artistLabel.setBounds(50, 30, 100, 30); - panel.add(artistLabel); + gbc.gridx = 0; + gbc.gridy = 0; + inputPanel.add(artistLabel, gbc); artistField = new JTextField(); - artistField.setBounds(150, 30, 400, 30); - panel.add(artistField); + gbc.gridx = 1; + gbc.gridy = 0; + gbc.weightx = 1.0; + inputPanel.add(artistField, gbc); + // Keyword Label and TextField keywordLabel = new JLabel("Keyword:"); - keywordLabel.setBounds(50, 80, 100, 30); - panel.add(keywordLabel); + gbc.gridx = 0; + gbc.gridy = 1; + gbc.weightx = 0; + inputPanel.add(keywordLabel, gbc); keywordField = new JTextField(); - keywordField.setBounds(150, 80, 400, 30); - panel.add(keywordField); + gbc.gridx = 1; + gbc.gridy = 1; + gbc.weightx = 1.0; + inputPanel.add(keywordField, gbc); + // Search Button searchButton = new JButton("Search"); - searchButton.setBounds(580, 30, 100, 80); - panel.add(searchButton); + gbc.gridx = 2; + gbc.gridy = 0; + gbc.gridheight = 2; + gbc.fill = GridBagConstraints.BOTH; + inputPanel.add(searchButton, gbc); + // Results Panel resultsArea = new JTextArea(); resultsArea.setEditable(false); scrollPane = new JScrollPane(resultsArea); - scrollPane.setBounds(50, 140, 650, 200); // Adjust size as needed - panel.add(scrollPane); - - // Add ActionListener for the "Search" button - searchButton.addActionListener(e -> { - String artistName = artistField.getText(); - String keyword = keywordField.getText(); - - // Trigger search and update viewModel - // controller.searchByKeyword(artistName, keyword); - - // Check results and update the UI accordingly - /* should all be stored in a prepareFailView - if (viewModel.isProper_input()) { - resultsArea.setText("Artist and keyword can not be empty"); - } else if (viewModel.hasError()) { - resultsArea.setText("Error: " + viewModel.getErrorMessage()); - } else if (viewModel.getSongs() == null && viewModel.getSongs().isEmpty()) { - // No results found - resultsArea.setText("Sorry, no songs found matching the keyword \"" + keyword + "\" for artist \"" + artistName + "\"."); - } else if (viewModel.getSongs() != null) { - // Display the list of songs - resultsArea.setText(String.join("\n", viewModel.getSongs())); + scrollPane.setBorder(BorderFactory.createTitledBorder("Results")); + + // Button Panel + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10)); + homeButton = new JButton("Home"); + buttonPanel.add(homeButton); + + // Add Listeners + searchButton.addActionListener(evt -> { + if (evt.getSource().equals(searchButton)) { + final String accessToken = keywordViewModel.getState().getAccessToken(); + keywordController.executeSearch(accessToken, artistField.getText(), keywordField.getText()); } + }); - */ - resultsArea.setText(keywordViewModel.getState().getDisplayText()); + homeButton.addActionListener(evt -> { + if (evt.getSource().equals(homeButton)) { + final String accessToken = keywordViewModel.getState().getAccessToken(); + loginController.execute(accessToken); + } }); - homeButton = new JButton("Home Button"); - homeButton.setBounds(580, 350, 150, 30); // Positioned at the bottom-right corner - homeButton.addActionListener( - // This creates an anonymous subclass of ActionListener and instantiates it. - evt -> { - if (evt.getSource().equals(homeButton)) { - // 1. get the state out of the searchViewModel. It contains the username. - final String accessToken = keywordViewModel.getState().getAccessToken(); - // 2. Execute the search Controller. - loginController.execute(accessToken); - - } - } - ); - panel.add(homeButton); - searchButton.addActionListener( - // This creates an anonymous subclass of ActionListener and instantiates it. - evt -> { - if (evt.getSource().equals(searchButton)) { - // 1. get the state out of the searchViewModel. It contains the username. - final String accessToken = keywordViewModel.getState().getAccessToken(); - // 2. Execute the search Controller. - keywordController.executeSearch(accessToken, artistField.getText(),keywordField.getText()); - - } - } - ); - this.add(panel); - } - /** - * React to a button click that results in evt. - * @param evt the ActionEvent to react to - */ - public void actionPerformed(ActionEvent evt) { - System.out.println("Click " + evt.getActionCommand()); + // Add Components to Main Panel + panel.setLayout(new BorderLayout(10, 10)); + panel.add(inputPanel, BorderLayout.NORTH); + panel.add(scrollPane, BorderLayout.CENTER); + panel.add(buttonPanel, BorderLayout.SOUTH); + + this.add(panel); } @Override @@ -128,7 +118,6 @@ public void propertyChange(PropertyChangeEvent evt) { private void setFields(KeywordState state) { resultsArea.setText(state.getDisplayText()); - } public String getViewName() { @@ -142,5 +131,4 @@ public void setKeywordController(KeywordController keywordController) { public void setLoginController(LoginController loginController) { this.loginController = loginController; } - } \ No newline at end of file From 0dd403af9018e774e80258c016e06ca3e0db3a69 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sat, 30 Nov 2024 19:49:36 -0500 Subject: [PATCH 242/262] Create accessibility-report.md --- accessibility-report.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 accessibility-report.md diff --git a/accessibility-report.md b/accessibility-report.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/accessibility-report.md @@ -0,0 +1 @@ + From 9448be542b039c6b9a67ba25269f385246001b56 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sat, 30 Nov 2024 19:57:37 -0500 Subject: [PATCH 243/262] Update accessibility-report.md --- accessibility-report.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/accessibility-report.md b/accessibility-report.md index 8b1378917..d12bde3bc 100644 --- a/accessibility-report.md +++ b/accessibility-report.md @@ -1 +1,30 @@ +Principles of Universal Design + 1. Equitable Use + • Our “search songs by description” feature is useful for users with diverse preferences, such as those who may not remember a song title but can describe its theme or mood. + • In the future, we could ensure all features are accessible to screen readers so users with visual impairments can benefit equally. + 2. Flexibility in Use + • Users can search for songs using either keywords or artist names, providing flexibility based on their preferences or the information they have. + • Features like “get song recommendations based on your music preferences” adapt to the user’s individual music taste, offering personalized results. + 3. Simple and Intuitive Use + • The interface for searching songs and getting recommendations will be designed with clear buttons and instructions, making it easy for first-time users to navigate. + • We could implement a guided onboarding process to explain each feature briefly to ensure users understand how to use the program effectively. + 4. Perceptible Information + • We could provide visual cues (e.g., icons for search and recommendations) alongside textual labels for clarity. + • In the future, adding audio feedback or haptic signals for critical actions could further ensure the program communicates effectively to users with varying sensory abilities. + 5. Tolerance for Error + • When searching for songs, the program allows partial matches or spelling mistakes, reducing the chance of user frustration from errors. + • Features like “get similar artists” and “get top tracks” are forgiving if a user does not know specific song titles or artist names, broadening the scope of results. + 6. Low Physical Effort + • The program minimizes effort by enabling users to perform all tasks with a few clicks or taps, such as retrieving top tracks or similar artists in one action. + • We could implement voice commands in the future to allow hands-free operation, further reducing physical effort. + 7. Size and Space for Approach and Use + • The interface will be designed with large, clickable buttons and clear spacing to accommodate users with limited dexterity or those using touchscreen devices. + • Future versions could include customizable font sizes and layouts to improve usability for individuals with visual impairments or different screen sizes. +Marketing the Program + +Our program, Spotify Companions, would be marketed primarily to music enthusiasts who seek a more personalized and engaging experience with their music library. This includes individuals who enjoy discovering new music, exploring similar artists, or curating playlists based on mood or preferences. Students, professionals, and casual listeners alike would benefit from features like keyword searches and recommendations, as these streamline the process of finding music that resonates with them. Additionally, by leveraging Spotify’s existing user base, our program appeals to a wide demographic of people who already interact with music streaming services. + +Demographics Less Likely to Use the Program + +Certain demographics might be less likely to use our program, particularly those who are not active users of Spotify or other music streaming services. People unfamiliar with digital music platforms or those with limited internet access may find the program less appealing or accessible. Moreover, users with disabilities such as visual impairments might face challenges if we do not implement accessibility features like screen reader compatibility or alternative input methods. To address this, we should prioritize accessibility considerations in our design, ensuring that the program does not unintentionally exclude users from diverse backgrounds. This aligns with the principles of ethical software design and inclusivity discussed in our embedded ethics modules. From 39d0d25ac6d7c171ad9f3fdd83575a255c0f4dd2 Mon Sep 17 00:00:00 2001 From: Ethan Wang <149852312+eulogizee@users.noreply.github.com> Date: Sat, 30 Nov 2024 20:42:42 -0500 Subject: [PATCH 244/262] Update accessibility-report.md --- accessibility-report.md | 50 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/accessibility-report.md b/accessibility-report.md index d12bde3bc..63000d8a9 100644 --- a/accessibility-report.md +++ b/accessibility-report.md @@ -1,30 +1,30 @@ Principles of Universal Design - 1. Equitable Use - • Our “search songs by description” feature is useful for users with diverse preferences, such as those who may not remember a song title but can describe its theme or mood. - • In the future, we could ensure all features are accessible to screen readers so users with visual impairments can benefit equally. - 2. Flexibility in Use - • Users can search for songs using either keywords or artist names, providing flexibility based on their preferences or the information they have. - • Features like “get song recommendations based on your music preferences” adapt to the user’s individual music taste, offering personalized results. - 3. Simple and Intuitive Use - • The interface for searching songs and getting recommendations will be designed with clear buttons and instructions, making it easy for first-time users to navigate. - • We could implement a guided onboarding process to explain each feature briefly to ensure users understand how to use the program effectively. - 4. Perceptible Information - • We could provide visual cues (e.g., icons for search and recommendations) alongside textual labels for clarity. - • In the future, adding audio feedback or haptic signals for critical actions could further ensure the program communicates effectively to users with varying sensory abilities. - 5. Tolerance for Error - • When searching for songs, the program allows partial matches or spelling mistakes, reducing the chance of user frustration from errors. - • Features like “get similar artists” and “get top tracks” are forgiving if a user does not know specific song titles or artist names, broadening the scope of results. - 6. Low Physical Effort - • The program minimizes effort by enabling users to perform all tasks with a few clicks or taps, such as retrieving top tracks or similar artists in one action. - • We could implement voice commands in the future to allow hands-free operation, further reducing physical effort. - 7. Size and Space for Approach and Use - • The interface will be designed with large, clickable buttons and clear spacing to accommodate users with limited dexterity or those using touchscreen devices. - • Future versions could include customizable font sizes and layouts to improve usability for individuals with visual impairments or different screen sizes. + 1. Equitable Use: + • Our program adheres to equitable use by offering features such as “search songs by description” and “search songs by keyword and artist,” which allow users with diverse music preferences to easily find songs regardless of specific knowledge about artists or genres. + • Future enhancements could include adding a text-to-speech feature to ensure visually impaired users can interact with the program seamlessly. + 2. Flexibility in Use: + • Features like “get song recommendations based on your music preferences” adapt to different user tastes and listening behaviors, offering personalized recommendations. + • We could add language options in the future to accommodate non-English speakers, ensuring the interface is accessible to a broader audience. + 3. Simple and Intuitive Use: + • The program’s interface for “search songs by keyword and artist” is designed to be straightforward, so even first-time users can understand and interact with it effectively. + • Tooltips or brief explanations could be added to further improve intuitiveness, helping users unfamiliar with some features. + 4. Perceptible Information: + • Users can clearly view and navigate their “top tracks” and “song recommendations” without requiring prior knowledge, thanks to a well-organized and readable display. + • To improve accessibility, we could implement audio cues for visually impaired users. + 5. Tolerance for Error: + • If users make typos while using the “search songs by keyword and artist” feature, the program could provide suggestions for corrections or display close matches. + • Future updates could include an undo feature to revert accidental actions, such as removing a song from a playlist. + 6. Low Physical Effort: + • The program minimizes physical effort by providing quick access to “top tracks” and “similar listeners” through single-click or tap actions. + • Voice command integration could be a future addition, further reducing physical interaction requirements. + 7. Size and Space for Approach and Use: + • The program’s interface is responsive and designed for both desktop and mobile platforms, ensuring that it remains functional and accessible regardless of the user’s device or screen size. + • Future updates could optimize the app further for assistive devices, like screen readers or one-handed operation. -Marketing the Program +Target Market -Our program, Spotify Companions, would be marketed primarily to music enthusiasts who seek a more personalized and engaging experience with their music library. This includes individuals who enjoy discovering new music, exploring similar artists, or curating playlists based on mood or preferences. Students, professionals, and casual listeners alike would benefit from features like keyword searches and recommendations, as these streamline the process of finding music that resonates with them. Additionally, by leveraging Spotify’s existing user base, our program appeals to a wide demographic of people who already interact with music streaming services. +If we were to market the program, our primary audience would include music enthusiasts and Spotify users who want to enhance their music discovery experience. This includes students seeking new music for studying or relaxation, casual listeners looking for recommendations, and advanced users who want insights like “similar listeners.” Additionally, our program could appeal to professionals in creative fields, like writers or designers, who use music to inspire their work. By focusing on personalization and intuitive search features, we aim to attract users who value ease of use and customization in their music experience. -Demographics Less Likely to Use the Program +Demographic Considerations -Certain demographics might be less likely to use our program, particularly those who are not active users of Spotify or other music streaming services. People unfamiliar with digital music platforms or those with limited internet access may find the program less appealing or accessible. Moreover, users with disabilities such as visual impairments might face challenges if we do not implement accessibility features like screen reader compatibility or alternative input methods. To address this, we should prioritize accessibility considerations in our design, ensuring that the program does not unintentionally exclude users from diverse backgrounds. This aligns with the principles of ethical software design and inclusivity discussed in our embedded ethics modules. +Our program is less likely to be used by people who do not use Spotify, as all features are designed around Spotify’s API and ecosystem. Additionally, some demographics may face barriers, such as those without internet access, non-English speakers, or users unfamiliar with digital music platforms. To mitigate this, we could add offline features or expand language support. Drawing from the ethics modules, we recognize the importance of accessibility for users with disabilities. As such, we plan to incorporate features like text-to-speech, voice commands, and screen reader compatibility to ensure that our program does not exclude these demographics. By addressing these considerations, we aim to create a more inclusive and universally appealing tool. From c87ade0f28cda1ece5a2e3163c00f9ae340d951c Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 1 Dec 2024 12:08:16 -0500 Subject: [PATCH 245/262] updated gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bc9333b15..e00dc3664 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ out/ .idea/ homework-5.iml -keys +src/keys target/ ### Eclipse ### From 66584a89b289532c0b469fb76470c64cf373d0ef Mon Sep 17 00:00:00 2001 From: eulogizee Date: Sun, 1 Dec 2024 12:30:00 -0500 Subject: [PATCH 246/262] added test for keyword use_case --- src/main/java/data_access/SpotifyDataAccessObject.java | 5 +++++ src/main/java/data_access/SpotifyService.java | 2 +- .../java/interface_adapter/keyword/KeywordViewModel.java | 1 + .../java/use_case/keyword/KeywordDataAccessInterface.java | 2 ++ src/main/java/use_case/keyword/KeywordOutputData.java | 4 ++++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index fdc76d971..b98579fd7 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -250,6 +250,11 @@ public void setCurrentFollowedArtists(List followedArtists) { } + @Override + public List fetchSongs(String artist, String keyword) { + return List.of(); + } + @Override public List searchSongs(String artistName, String keyword) { getSearchResultsSync(artistName, keyword); diff --git a/src/main/java/data_access/SpotifyService.java b/src/main/java/data_access/SpotifyService.java index 12a707b53..c0a8b4620 100644 --- a/src/main/java/data_access/SpotifyService.java +++ b/src/main/java/data_access/SpotifyService.java @@ -19,7 +19,7 @@ public SpotifyService(String accessToken) { this.accessToken = accessToken; } - public List searchSongs(String artistName, String keyword) { + public List searchsongs(String artistName, String keyword) { OkHttpClient client = new OkHttpClient(); // Build the search query URL diff --git a/src/main/java/interface_adapter/keyword/KeywordViewModel.java b/src/main/java/interface_adapter/keyword/KeywordViewModel.java index 76891a7d3..88ae8f3b1 100644 --- a/src/main/java/interface_adapter/keyword/KeywordViewModel.java +++ b/src/main/java/interface_adapter/keyword/KeywordViewModel.java @@ -13,4 +13,5 @@ public KeywordViewModel() { super("keyword"); setState(new KeywordState()); } + } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordDataAccessInterface.java b/src/main/java/use_case/keyword/KeywordDataAccessInterface.java index 96947843d..f2ed07f5f 100644 --- a/src/main/java/use_case/keyword/KeywordDataAccessInterface.java +++ b/src/main/java/use_case/keyword/KeywordDataAccessInterface.java @@ -3,6 +3,8 @@ import java.util.List; public interface KeywordDataAccessInterface { + List fetchSongs(String artist, String keyword); + /** A method with searches for songs based on a given name and keyword about the song. * @param artistName the name of the artist to search for. * @param keyword a keyword about the song, possibly a lyric. diff --git a/src/main/java/use_case/keyword/KeywordOutputData.java b/src/main/java/use_case/keyword/KeywordOutputData.java index 11899d688..f2c1f8cef 100644 --- a/src/main/java/use_case/keyword/KeywordOutputData.java +++ b/src/main/java/use_case/keyword/KeywordOutputData.java @@ -40,4 +40,8 @@ public String getSpotifyToken() { public boolean hasError() { return errorMessage != null; } + + public String getDisplayText() { + return ""; + } } \ No newline at end of file From f821be7c6967d7f6a4c1b87c9dc8c79d6024388e Mon Sep 17 00:00:00 2001 From: KseniaTk Date: Sun, 1 Dec 2024 13:13:36 -0500 Subject: [PATCH 247/262] fixed some null pointer exceptions --- .../data_access/SpotifyDataAccessObject.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 18e151d44..8f58ddb02 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -5,6 +5,9 @@ import java.util.Arrays; import java.util.List; +import entity.CommonUserFactory; +import entity.User; +import entity.UserFactory; import interface_adapter.login.LoginState; import org.apache.hc.core5.http.ParseException; import se.michaelthelin.spotify.SpotifyApi; @@ -29,6 +32,8 @@ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, public static final int OFFSET2 = 0; private LoginState loginState = new LoginState(); + private UserFactory userFactory = new CommonUserFactory(); + private User user = userFactory.create(loginState.getLoginToken()); private String accessToken; private List currentTopTracks; private List currentTopArtists; @@ -43,7 +48,7 @@ public class SpotifyDataAccessObject implements TopItemsUserDataAccessInterface, private GetRecommendationsRequest getRecommendationsRequest; public SpotifyDataAccessObject() { - this.accessToken = loginState.getLoginToken(); + this.accessToken = user.getAccessToken(); this.spotifyApi = new SpotifyApi.Builder() .setAccessToken(accessToken) .build(); @@ -110,7 +115,7 @@ private List getUsersTopTracksSync() { } catch (IOException | SpotifyWebApiException | ParseException e) { System.out.println("Error: " + e.getMessage()); - return null; + return new ArrayList<>(); } } @@ -135,7 +140,7 @@ private List getUsersTopArtistsSync() { } catch (IOException | SpotifyWebApiException | ParseException e) { System.out.println("Error: " + e.getMessage()); - return null; + return new ArrayList<>(); } } @@ -191,14 +196,13 @@ public void setTopTracks(List topTracks) { public String getTopArtists() { final List lst = currentTopArtists; final StringBuilder sb = new StringBuilder(); - - for (int i = 0; i < lst.size(); i ++) { + if (lst != null) {for (int i = 0; i < lst.size(); i ++) { sb.append(lst.get(i)); if (i != lst.size() - 1) { sb.append(", "); } - } + }} return sb.toString(); } From 97237a6b164d0821be13f7a77723ecd2651c046a Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 1 Dec 2024 13:48:57 -0500 Subject: [PATCH 248/262] finished refactor to top items Data Access to remove refences to a user --- .../java/data_access/InMemoryUserDataAccessObject.java | 2 -- ...DataAccessObject.java => TopItemsDataAccessObject.java} | 7 +++---- .../java/use_case/topitems/TopItemsInteractorTest.java | 6 +++--- 3 files changed, 6 insertions(+), 9 deletions(-) rename src/main/java/data_access/{TopItemsUserDataAccessObject.java => TopItemsDataAccessObject.java} (71%) diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index f656eb5ab..73dd25511 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -6,8 +6,6 @@ import entity.User; import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; -import use_case.recommend.RecommendUserDataAccessInterface; -import use_case.top_items.TopItemsUserDataAccessInterface; /** * In-memory implementation of the DAO for storing user data. This implementation does diff --git a/src/main/java/data_access/TopItemsUserDataAccessObject.java b/src/main/java/data_access/TopItemsDataAccessObject.java similarity index 71% rename from src/main/java/data_access/TopItemsUserDataAccessObject.java rename to src/main/java/data_access/TopItemsDataAccessObject.java index 485c9fc69..66445f3b9 100644 --- a/src/main/java/data_access/TopItemsUserDataAccessObject.java +++ b/src/main/java/data_access/TopItemsDataAccessObject.java @@ -1,16 +1,15 @@ package data_access; -import use_case.top_items.TopItemsUserDataAccessInterface; +import use_case.top_items.TopItemsDataAccessInterface; -import java.util.ArrayList; import java.util.List; -public class TopItemsUserDataAccessObject implements TopItemsUserDataAccessInterface { +public class TopItemsDataAccessObject implements TopItemsDataAccessInterface { private List tracks; private List artists; - public TopItemsUserDataAccessObject() { + public TopItemsDataAccessObject() { } @Override diff --git a/src/test/java/use_case/topitems/TopItemsInteractorTest.java b/src/test/java/use_case/topitems/TopItemsInteractorTest.java index dcd9fd6b7..590134578 100644 --- a/src/test/java/use_case/topitems/TopItemsInteractorTest.java +++ b/src/test/java/use_case/topitems/TopItemsInteractorTest.java @@ -1,6 +1,6 @@ package use_case.topitems; -import data_access.TopItemsUserDataAccessObject; +import data_access.TopItemsDataAccessObject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import use_case.top_items.*; @@ -11,12 +11,12 @@ import static org.junit.jupiter.api.Assertions.*; public class TopItemsInteractorTest { - private TopItemsUserDataAccessInterface dummyObject; + private TopItemsDataAccessInterface dummyObject; private TopItemsInputData dummyInput; @BeforeEach public void setUp() { - dummyObject = new TopItemsUserDataAccessObject(); + dummyObject = new TopItemsDataAccessObject(); dummyInput = new TopItemsInputData("accessToken"); } From 3146eb8abd7129f847bf1967da0e146f1554f6ba Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 1 Dec 2024 20:01:42 -0500 Subject: [PATCH 249/262] renamed variables --- .../logged_in/LoggedInState.java | 29 ++++++---------- .../login/LoginPresenter.java | 2 +- .../logout/LogoutPresenter.java | 2 +- .../java/use_case/login/LoginInteractor.java | 1 - src/main/java/view/LoggedInView.java | 34 ++++++++----------- src/main/java/view/SearchView.java | 1 + 6 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/main/java/interface_adapter/logged_in/LoggedInState.java b/src/main/java/interface_adapter/logged_in/LoggedInState.java index 6acf23ff7..ef885b214 100644 --- a/src/main/java/interface_adapter/logged_in/LoggedInState.java +++ b/src/main/java/interface_adapter/logged_in/LoggedInState.java @@ -4,15 +4,13 @@ * The State information representing the logged-in user. */ public class LoggedInState { - private String username = ""; - private String password = ""; - private String passwordError; + private String accessToken = ""; + private String tokenError; public LoggedInState(LoggedInState copy) { - username = copy.username; - password = copy.password; - passwordError = copy.passwordError; + accessToken = copy.accessToken; + tokenError = copy.tokenError; } // Because of the previous copy constructor, the default constructor must be explicit. @@ -20,23 +18,16 @@ public LoggedInState() { } - public String getUsername() { - return username; + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; } - public void setUsername(String username) { - this.username = username; + public String getAccessToken() { + return accessToken; } - public void setPassword(String password) { - this.password = password; + public void settokenError(String accessTokenError) { + this.tokenError = accessTokenError; } - public void setPasswordError(String passwordError) { - this.passwordError = passwordError; - } - - public String getPassword() { - return password; - } } diff --git a/src/main/java/interface_adapter/login/LoginPresenter.java b/src/main/java/interface_adapter/login/LoginPresenter.java index 707fef163..b9f879faa 100644 --- a/src/main/java/interface_adapter/login/LoginPresenter.java +++ b/src/main/java/interface_adapter/login/LoginPresenter.java @@ -28,7 +28,7 @@ public void prepareSuccessView(LoginOutputData response) { // On success, switch to the logged in view. final LoggedInState loggedInState = loggedInViewModel.getState(); - loggedInState.setUsername(response.getAccessToken()); + loggedInState.setAccessToken(response.getAccessToken()); this.loggedInViewModel.setState(loggedInState); this.loggedInViewModel.firePropertyChanged(); diff --git a/src/main/java/interface_adapter/logout/LogoutPresenter.java b/src/main/java/interface_adapter/logout/LogoutPresenter.java index c49521d9b..a9a72f4b3 100644 --- a/src/main/java/interface_adapter/logout/LogoutPresenter.java +++ b/src/main/java/interface_adapter/logout/LogoutPresenter.java @@ -40,7 +40,7 @@ public void prepareSuccessView(LogoutOutputData response) { // 3. set the state in the LoggedInViewModel to the updated state // 4. firePropertyChanged so that the View that is listening is updated. final LoggedInState loggedInState = loggedInViewModel.getState(); - loggedInState.setUsername(""); + loggedInState.setAccessToken(""); loggedInViewModel.setState(loggedInState); loggedInViewModel.firePropertyChanged(); diff --git a/src/main/java/use_case/login/LoginInteractor.java b/src/main/java/use_case/login/LoginInteractor.java index 87b259e25..ef18831d7 100644 --- a/src/main/java/use_case/login/LoginInteractor.java +++ b/src/main/java/use_case/login/LoginInteractor.java @@ -19,6 +19,5 @@ public void execute(LoginInputData loginInputData) { userDataAccessObject.setCurrentAccessToken(token); final LoginOutputData loginOutputData = new LoginOutputData(token, false); loginPresenter.prepareSuccessView(loginOutputData); - } } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 775814790..4878e55c6 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -1,8 +1,6 @@ package view; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; @@ -11,8 +9,6 @@ import javax.swing.*; import interface_adapter.keyword.KeywordController; -import interface_adapter.keyword.KeywordPresenter; -import interface_adapter.keyword.KeywordViewModel; import interface_adapter.logged_in.LoggedInState; import interface_adapter.logged_in.LoggedInViewModel; import interface_adapter.logout.LogoutController; @@ -20,10 +16,7 @@ import interface_adapter.search.SearchController; import interface_adapter.similar_listeners.SimilarListenersController; -import interface_adapter.similar_listeners.SimilarListenersViewModel; import interface_adapter.top_items.TopItemsController; -import data_access.SpotifyService; -import use_case.keyword.KeywordInteractor; /** @@ -40,7 +33,7 @@ public class LoggedInView extends JPanel implements PropertyChangeListener { private SimilarListenersController similarListenersController; private KeywordController keywordController; - private final JLabel username; + private final JLabel accessToken; private final JButton logOut; private final JPanel searchButtons = new JPanel(); private final JPanel appButtons = new JPanel(); @@ -54,10 +47,10 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { final JPanel profile = new JPanel(new FlowLayout(FlowLayout.LEFT)); final JLabel usernameInfo = new JLabel("Currently logged in: "); - username = new JLabel(); + accessToken = new JLabel(); logOut = new JButton("Log Out"); profile.add(usernameInfo); - profile.add(username); + profile.add(accessToken); profile.add(logOut); final JButton description = new JButton("Search song by description"); @@ -109,7 +102,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(logOut)) { // 1. get the state out of the loggedInViewModel. It contains the username. - final String name = loggedInViewModel.getState().getUsername(); + final String name = loggedInViewModel.getState().getAccessToken(); // 2. Execute the logout Controller. logoutController.execute(name); } @@ -121,7 +114,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(description)) { // 1. get the state out of the loggedInViewModel. It contains the username. - final String accessToken = loggedInViewModel.getState().getUsername(); + final String accessToken = loggedInViewModel.getState().getAccessToken(); // 2. Execute the logout Controller. searchController.execute(accessToken); } @@ -133,7 +126,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { if (evt.getSource().equals(recommendations)) { final List topTracks = new ArrayList<>(); final String topArtists = ""; - final String accessToken = loggedInViewModel.getState().getUsername(); + final String accessToken = loggedInViewModel.getState().getAccessToken(); recommendController.execute(topTracks, topArtists, accessToken); } } @@ -143,7 +136,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(topItems)) { - final String accessToken = loggedInViewModel.getState().getUsername(); + final String accessToken = loggedInViewModel.getState().getAccessToken(); topItemsController.execute(accessToken); } } @@ -170,7 +163,7 @@ public void actionPerformed(ActionEvent e) { keyword.addActionListener( evt -> { if (evt.getSource().equals(keyword)) { - final String accessToken = loggedInViewModel.getState().getUsername(); + final String accessToken = loggedInViewModel.getState().getAccessToken(); keywordController.execute(accessToken); } @@ -180,17 +173,15 @@ public void actionPerformed(ActionEvent e) { similarListeners.addActionListener( evt -> { if (evt.getSource().equals(similarListeners)) { - final String accessToken = loggedInViewModel.getState().getUsername(); + final String accessToken = loggedInViewModel.getState().getAccessToken(); similarListenersController.execute(accessToken); } } ); - // Add components to the panel this.add(title); this.add(usernameInfo); - this.add(username); this.add(profile); this.add(searchButtons); this.add(appButtons); @@ -200,11 +191,14 @@ public void actionPerformed(ActionEvent e) { public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("state")) { final LoggedInState state = (LoggedInState) evt.getNewValue(); - username.setText(state.getUsername()); + accessToken.setText("This should be displayed"); + String token = state.getAccessToken(); + System.out.println(token); + accessToken.setText("token"); } else if (evt.getPropertyName().equals("password")) { final LoggedInState state = (LoggedInState) evt.getNewValue(); - JOptionPane.showMessageDialog(null, "password updated for " + state.getUsername()); + JOptionPane.showMessageDialog(null, "password updated for " + state.getAccessToken()); } } diff --git a/src/main/java/view/SearchView.java b/src/main/java/view/SearchView.java index d9cc3d7f8..226a26172 100644 --- a/src/main/java/view/SearchView.java +++ b/src/main/java/view/SearchView.java @@ -62,6 +62,7 @@ public SearchView(SearchViewModel searchViewModel) { // 1. get the state out of the searchViewModel. It contains the username. final String accessToken = searchViewModel.getState().getAccessToken(); // 2. Execute the search Controller. + this.searchInputField.setText(""); loginController.execute(accessToken); } From 9ea4553b182b8a8913803f6e0c558c66401f087f Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 1 Dec 2024 20:57:16 -0500 Subject: [PATCH 250/262] removed access token passing in top items use case --- src/main/java/app/AppBuilder.java | 16 +++--- .../LoginTestDataAccessObject.java | 10 ++++ .../data_access/SpotifyDataAccessObject.java | 12 ++-- src/main/java/data_access/SpotifyService.java | 57 ------------------- .../top_items/TopItemsController.java | 5 +- .../top_items/TopItemsPresenter.java | 1 - .../login/LoginDataAccessInterface.java | 5 ++ .../java/use_case/login/LoginInteractor.java | 6 +- .../use_case/top_items/TopItemsInputData.java | 8 +-- .../top_items/TopItemsInteractor.java | 4 +- .../top_items/TopItemsOutputData.java | 12 +--- src/main/java/view/LoggedInView.java | 4 +- .../use_case/login/LoginInteractorTest.java | 7 ++- .../topitems/TopItemsInteractorTest.java | 2 +- 14 files changed, 47 insertions(+), 102 deletions(-) create mode 100644 src/main/java/data_access/LoginTestDataAccessObject.java delete mode 100644 src/main/java/data_access/SpotifyService.java create mode 100644 src/main/java/use_case/login/LoginDataAccessInterface.java diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 2522b46a3..33090422e 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -127,7 +127,7 @@ public AppBuilder addSearchView() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); searchView.setLoginController(loginController); return this; @@ -188,7 +188,7 @@ public AppBuilder addKeywordView() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); keywordView.setLoginController(loginController); return this; @@ -202,7 +202,7 @@ public AppBuilder addLoginUseCase() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); loginView.setLoginController(loginController); @@ -232,7 +232,7 @@ public AppBuilder addKeywordUseCase() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); keywordView.setLoginController(loginController); @@ -256,7 +256,7 @@ public AppBuilder addSearchUseCase() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); searchView.setLoginController(loginController); @@ -282,7 +282,7 @@ public AppBuilder addTopItemsUseCase() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); topItemsView.setLoginController(loginController); @@ -306,7 +306,7 @@ public AppBuilder addRecommendUseCase() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); recommendationsView.setLoginController(loginController); @@ -325,7 +325,7 @@ public AppBuilder addSimilarListenersUseCase() { final LoginOutputBoundary loginOutputBoundary = new LoginPresenter(viewManagerModel, loggedInViewModel, loginViewModel); final LoginInputBoundary loginInteractor = new LoginInteractor( - userDataAccessObject, loginOutputBoundary); + userDataAccessObject,spotifyDataAccessObject, loginOutputBoundary); final LoginController loginController = new LoginController(loginInteractor); similarListenersView.setLoginController(loginController); diff --git a/src/main/java/data_access/LoginTestDataAccessObject.java b/src/main/java/data_access/LoginTestDataAccessObject.java new file mode 100644 index 000000000..05df81fa7 --- /dev/null +++ b/src/main/java/data_access/LoginTestDataAccessObject.java @@ -0,0 +1,10 @@ +package data_access; + +import use_case.login.LoginDataAccessInterface; + +public class LoginTestDataAccessObject implements LoginDataAccessInterface { + @Override + public void setAccessToken(String newToken) { + + } +} diff --git a/src/main/java/data_access/SpotifyDataAccessObject.java b/src/main/java/data_access/SpotifyDataAccessObject.java index 7e90f7854..b95bcc609 100644 --- a/src/main/java/data_access/SpotifyDataAccessObject.java +++ b/src/main/java/data_access/SpotifyDataAccessObject.java @@ -24,6 +24,7 @@ import se.michaelthelin.spotify.requests.data.follow.GetUsersFollowedArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopArtistsRequest; import se.michaelthelin.spotify.requests.data.personalization.simplified.GetUsersTopTracksRequest; +import use_case.login.LoginDataAccessInterface; import use_case.recommend.RecommendUserDataAccessInterface; import use_case.keyword.KeywordDataAccessInterface; import use_case.similar_listeners.SimilarListenersDataAccessInterface; @@ -34,13 +35,11 @@ */ public class SpotifyDataAccessObject implements TopItemsDataAccessInterface, - SimilarListenersDataAccessInterface, RecommendUserDataAccessInterface, KeywordDataAccessInterface{ + SimilarListenersDataAccessInterface, RecommendUserDataAccessInterface, KeywordDataAccessInterface, LoginDataAccessInterface { public static final int OFFSET = 4; public static final int OFFSET2 = 0; private LoginState loginState = new LoginState(); - private UserFactory userFactory = new CommonUserFactory(); - private User user = userFactory.create(loginState.getLoginToken()); private String accessToken; private List currentTopTracks; private List currentTopArtists; @@ -56,7 +55,7 @@ public class SpotifyDataAccessObject implements TopItemsDataAccessInterface, private GetRecommendationsRequest getRecommendationsRequest; public SpotifyDataAccessObject() { - this.accessToken = user.getAccessToken(); + this.accessToken = "this should never be reached"; this.spotifyApi = new SpotifyApi.Builder() .setAccessToken(accessToken) .build(); @@ -311,5 +310,10 @@ public List getCurrentSearchResults() { public void setCurrentSearchResults(List currentSearchResults) { this.currentSearchResults = currentSearchResults; } + + @Override + public void setAccessToken(String newToken) { + this.accessToken = newToken; + } } diff --git a/src/main/java/data_access/SpotifyService.java b/src/main/java/data_access/SpotifyService.java deleted file mode 100644 index c0a8b4620..000000000 --- a/src/main/java/data_access/SpotifyService.java +++ /dev/null @@ -1,57 +0,0 @@ -package data_access; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import okhttp3.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class SpotifyService { - private static final String SEARCH_URL = "https://api.spotify.com/v1/search"; - private final String accessToken; - - public SpotifyService(String accessToken) { - if (accessToken == null || accessToken.isEmpty()) { - throw new IllegalArgumentException("Access token cannot be null or empty."); - } - this.accessToken = accessToken; - } - - public List searchsongs(String artistName, String keyword) { - OkHttpClient client = new OkHttpClient(); - - // Build the search query URL - HttpUrl url = HttpUrl.parse(SEARCH_URL).newBuilder() - .addQueryParameter("q", "artist:" + artistName + " " + keyword) // Combine artist and keyword - .addQueryParameter("type", "track") - .build(); - - // Prepare the API request - Request request = new Request.Builder() - .url(url) - .addHeader("Authorization", "Bearer " + accessToken) // Use the provided access token - .get() - .build(); - - try (Response response = client.newCall(request).execute()) { - if (response.isSuccessful() && response.body() != null) { - JsonObject jsonObject = JsonParser.parseString(response.body().string()).getAsJsonObject(); - List songs = new ArrayList<>(); - - // Extract tracks from the response - jsonObject.getAsJsonObject("tracks").getAsJsonArray("items").forEach(track -> { - String songName = track.getAsJsonObject().get("name").getAsString(); - songs.add(songName); // Add the track name to the list - }); - - return songs; - } else { - throw new RuntimeException("Failed to search songs: " + response.message()); - } - } catch (IOException e) { - throw new RuntimeException("Error searching songs", e); - } - } -} diff --git a/src/main/java/interface_adapter/top_items/TopItemsController.java b/src/main/java/interface_adapter/top_items/TopItemsController.java index abf7e3bfa..e01591867 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsController.java +++ b/src/main/java/interface_adapter/top_items/TopItemsController.java @@ -17,10 +17,9 @@ public TopItemsController(TopItemsInputBoundary topItemsUseCaseInteractor) { /** * Executes the TopItems Use Case. - * @param accessToken the access Token of the user. */ - public void execute(String accessToken) { - final TopItemsInputData topItemsInputData = new TopItemsInputData(accessToken); + public void execute() { + final TopItemsInputData topItemsInputData = new TopItemsInputData(); topItemsUseCaseInteractor.execute(topItemsInputData); } diff --git a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java index d76b23e2e..b31b21dc7 100644 --- a/src/main/java/interface_adapter/top_items/TopItemsPresenter.java +++ b/src/main/java/interface_adapter/top_items/TopItemsPresenter.java @@ -25,7 +25,6 @@ public void prepareSuccessView(TopItemsOutputData outputData) { final TopItemsState topItemsState = topItemsViewModel.getState(); topItemsState.setTracks(outputData.getTracks()); topItemsState.setArtists(outputData.getArtists()); - topItemsState.setAccessToken(outputData.getAccessToken()); this.topItemsViewModel.setState(topItemsState); topItemsViewModel.firePropertyChanged(); diff --git a/src/main/java/use_case/login/LoginDataAccessInterface.java b/src/main/java/use_case/login/LoginDataAccessInterface.java new file mode 100644 index 000000000..b04c8d814 --- /dev/null +++ b/src/main/java/use_case/login/LoginDataAccessInterface.java @@ -0,0 +1,5 @@ +package use_case.login; + +public interface LoginDataAccessInterface { + void setAccessToken(String newToken); +} diff --git a/src/main/java/use_case/login/LoginInteractor.java b/src/main/java/use_case/login/LoginInteractor.java index 87b259e25..7bcb03d1f 100644 --- a/src/main/java/use_case/login/LoginInteractor.java +++ b/src/main/java/use_case/login/LoginInteractor.java @@ -5,11 +5,13 @@ */ public class LoginInteractor implements LoginInputBoundary { private final LoginUserDataAccessInterface userDataAccessObject; + private final LoginDataAccessInterface loginDataAccessObject; private final LoginOutputBoundary loginPresenter; - public LoginInteractor(LoginUserDataAccessInterface userDataAccessInterface, + public LoginInteractor(LoginUserDataAccessInterface userDataAccessInterface, LoginDataAccessInterface loginDataAccessObject, LoginOutputBoundary loginOutputBoundary) { this.userDataAccessObject = userDataAccessInterface; + this.loginDataAccessObject = loginDataAccessObject; this.loginPresenter = loginOutputBoundary; } @@ -18,7 +20,7 @@ public void execute(LoginInputData loginInputData) { final String token = loginInputData.getLoginToken(); userDataAccessObject.setCurrentAccessToken(token); final LoginOutputData loginOutputData = new LoginOutputData(token, false); + loginDataAccessObject.setAccessToken(token); loginPresenter.prepareSuccessView(loginOutputData); - } } diff --git a/src/main/java/use_case/top_items/TopItemsInputData.java b/src/main/java/use_case/top_items/TopItemsInputData.java index 5a8c043a4..0a082c399 100644 --- a/src/main/java/use_case/top_items/TopItemsInputData.java +++ b/src/main/java/use_case/top_items/TopItemsInputData.java @@ -6,13 +6,7 @@ * The Input Data for the TopItems Use Case. */ public class TopItemsInputData { - private String accessToken; - public TopItemsInputData(String accessToken) { - this.accessToken = accessToken; - } - - public String getAccessToken() { - return accessToken; + public TopItemsInputData() { } } diff --git a/src/main/java/use_case/top_items/TopItemsInteractor.java b/src/main/java/use_case/top_items/TopItemsInteractor.java index 7f545703f..7b943c52c 100644 --- a/src/main/java/use_case/top_items/TopItemsInteractor.java +++ b/src/main/java/use_case/top_items/TopItemsInteractor.java @@ -33,9 +33,7 @@ else if (userDataAccessObject.getCurrentTopTracks().isEmpty()) { else { final List topTracks = userDataAccessObject.getCurrentTopTracks(); final List topArtists = userDataAccessObject.getCurrentTopArtists(); - final String accessToken = topItemsInputData.getAccessToken(); - - final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists, accessToken); + final TopItemsOutputData outputData = new TopItemsOutputData(topTracks, topArtists); topItemsOutputBoundary.prepareSuccessView(outputData); } diff --git a/src/main/java/use_case/top_items/TopItemsOutputData.java b/src/main/java/use_case/top_items/TopItemsOutputData.java index 1752dc988..1b1261321 100644 --- a/src/main/java/use_case/top_items/TopItemsOutputData.java +++ b/src/main/java/use_case/top_items/TopItemsOutputData.java @@ -9,12 +9,10 @@ public class TopItemsOutputData { private final List tracks; private final List artists; - private String accessToken; - public TopItemsOutputData(List tracks, List artists, String accessToken) { + public TopItemsOutputData(List tracks, List artists) { this.tracks = tracks; this.artists = artists; - this.accessToken = accessToken; } public List getTracks() { @@ -24,12 +22,4 @@ public List getTracks() { public List getArtists() { return artists; } - - public String getAccessToken() { - return accessToken; - } - - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } } diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 775814790..4323ffe46 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -22,7 +22,6 @@ import interface_adapter.similar_listeners.SimilarListenersController; import interface_adapter.similar_listeners.SimilarListenersViewModel; import interface_adapter.top_items.TopItemsController; -import data_access.SpotifyService; import use_case.keyword.KeywordInteractor; @@ -143,8 +142,7 @@ public LoggedInView(LoggedInViewModel loggedInViewModel) { evt -> { if (evt.getSource().equals(topItems)) { - final String accessToken = loggedInViewModel.getState().getUsername(); - topItemsController.execute(accessToken); + topItemsController.execute(); } } ); diff --git a/src/test/java/use_case/login/LoginInteractorTest.java b/src/test/java/use_case/login/LoginInteractorTest.java index 0e7df2caf..8a6ffdb1d 100644 --- a/src/test/java/use_case/login/LoginInteractorTest.java +++ b/src/test/java/use_case/login/LoginInteractorTest.java @@ -1,6 +1,7 @@ package use_case.login; import data_access.InMemoryUserDataAccessObject; +import data_access.LoginTestDataAccessObject; import entity.CommonUserFactory; import entity.User; import entity.UserFactory; @@ -14,6 +15,7 @@ class LoginInteractorTest { void successTest() { LoginInputData inputData = new LoginInputData("Generic token"); LoginUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); + LoginTestDataAccessObject spotify = new LoginTestDataAccessObject(); // For the success test, we need to add Paul to the data access repository before we log in. UserFactory factory = new CommonUserFactory(); @@ -33,12 +35,13 @@ public void prepareFailView(String error) { } }; - LoginInputBoundary interactor = new LoginInteractor(userRepository, successPresenter); + LoginInputBoundary interactor = new LoginInteractor(userRepository, spotify, successPresenter); interactor.execute(inputData); } @Test void successUserLoggedInTest() { + LoginTestDataAccessObject spotify = new LoginTestDataAccessObject(); LoginInputData inputData = new LoginInputData("Generic token"); LoginUserDataAccessInterface userRepository = new InMemoryUserDataAccessObject(); @@ -60,7 +63,7 @@ public void prepareFailView(String error) { } }; - LoginInputBoundary interactor = new LoginInteractor(userRepository, successPresenter); + LoginInputBoundary interactor = new LoginInteractor(userRepository,spotify, successPresenter); assertEquals(null, userRepository.getCurrentAccessToken()); interactor.execute(inputData); diff --git a/src/test/java/use_case/topitems/TopItemsInteractorTest.java b/src/test/java/use_case/topitems/TopItemsInteractorTest.java index 590134578..e41b967a7 100644 --- a/src/test/java/use_case/topitems/TopItemsInteractorTest.java +++ b/src/test/java/use_case/topitems/TopItemsInteractorTest.java @@ -17,7 +17,7 @@ public class TopItemsInteractorTest { @BeforeEach public void setUp() { dummyObject = new TopItemsDataAccessObject(); - dummyInput = new TopItemsInputData("accessToken"); + dummyInput = new TopItemsInputData(); } @Test From 050738ad81c1c30bf393665141afb160f3970667 Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 1 Dec 2024 21:16:22 -0500 Subject: [PATCH 251/262] added new login execute implementation --- src/main/java/app/AppBuilder.java | 2 +- src/main/java/app/Main.java | 3 +-- .../login/LoginController.java | 10 +++++++++ .../login/LoginPresenter.java | 1 - .../java/use_case/login/LoginInputData.java | 3 +++ .../java/use_case/login/LoginInteractor.java | 22 ++++++++++++++----- .../java/use_case/login/LoginOutputData.java | 8 +------ src/main/java/view/KeywordView.java | 2 +- .../topitems/TopItemsInteractorTest.java | 1 - 9 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 33090422e..c1f0b4ae3 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -353,7 +353,7 @@ public JFrame build() { application.add(cardPanel); - viewManagerModel.setState(loggedInViewModel.getViewName()); + viewManagerModel.setState(loginViewModel.getViewName()); viewManagerModel.firePropertyChanged(); return application; diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 1d5f0a7e2..18f98cc65 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -17,14 +17,13 @@ public static void main(String[] args) { final AppBuilder appBuilder = new AppBuilder(); final JFrame application = appBuilder .addLoginView() - .addLoggedInView() .addRecommendationsView() .addSearchView() .addTopItemsView() - .addLoginUseCase() .addKeywordView() .addLoggedInView() .addSimilarListenersView() + .addLoginUseCase() .addLogoutUseCase() .addRecommendUseCase() .addSearchUseCase() diff --git a/src/main/java/interface_adapter/login/LoginController.java b/src/main/java/interface_adapter/login/LoginController.java index 369e95e9d..0e4213298 100644 --- a/src/main/java/interface_adapter/login/LoginController.java +++ b/src/main/java/interface_adapter/login/LoginController.java @@ -24,4 +24,14 @@ public void execute(String loginToken) { loginUseCaseInteractor.execute(loginInputData); } + + /** + * Executes the Login Use Case without changing the token. + */ + public void execute() { + final LoginInputData loginInputData = new LoginInputData(); + + loginUseCaseInteractor.execute(loginInputData); + } + } diff --git a/src/main/java/interface_adapter/login/LoginPresenter.java b/src/main/java/interface_adapter/login/LoginPresenter.java index 707fef163..670232a3a 100644 --- a/src/main/java/interface_adapter/login/LoginPresenter.java +++ b/src/main/java/interface_adapter/login/LoginPresenter.java @@ -28,7 +28,6 @@ public void prepareSuccessView(LoginOutputData response) { // On success, switch to the logged in view. final LoggedInState loggedInState = loggedInViewModel.getState(); - loggedInState.setUsername(response.getAccessToken()); this.loggedInViewModel.setState(loggedInState); this.loggedInViewModel.firePropertyChanged(); diff --git a/src/main/java/use_case/login/LoginInputData.java b/src/main/java/use_case/login/LoginInputData.java index 5e4271c37..d6819931a 100644 --- a/src/main/java/use_case/login/LoginInputData.java +++ b/src/main/java/use_case/login/LoginInputData.java @@ -10,6 +10,9 @@ public class LoginInputData { public LoginInputData(String loginToken) { this.loginToken = loginToken; } + public LoginInputData() { + loginToken = "noToken"; + } String getLoginToken() { return loginToken; diff --git a/src/main/java/use_case/login/LoginInteractor.java b/src/main/java/use_case/login/LoginInteractor.java index 7bcb03d1f..cc9cf4fbe 100644 --- a/src/main/java/use_case/login/LoginInteractor.java +++ b/src/main/java/use_case/login/LoginInteractor.java @@ -17,10 +17,22 @@ public LoginInteractor(LoginUserDataAccessInterface userDataAccessInterface, Log @Override public void execute(LoginInputData loginInputData) { - final String token = loginInputData.getLoginToken(); - userDataAccessObject.setCurrentAccessToken(token); - final LoginOutputData loginOutputData = new LoginOutputData(token, false); - loginDataAccessObject.setAccessToken(token); - loginPresenter.prepareSuccessView(loginOutputData); + try { + if (loginInputData.getLoginToken().equals("noToken")) { + final LoginOutputData loginOutputData = new LoginOutputData(false); + loginPresenter.prepareSuccessView(loginOutputData); + } else { + final String token = loginInputData.getLoginToken(); + userDataAccessObject.setCurrentAccessToken(token); + final LoginOutputData loginOutputData = new LoginOutputData(false); + loginDataAccessObject.setAccessToken(token); + loginPresenter.prepareSuccessView(loginOutputData); + } + } + catch (Exception e) { + final LoginOutputData loginOutputData = new LoginOutputData(false); + loginPresenter.prepareSuccessView(loginOutputData); + } + } } diff --git a/src/main/java/use_case/login/LoginOutputData.java b/src/main/java/use_case/login/LoginOutputData.java index 11dab6f52..c49302ae4 100644 --- a/src/main/java/use_case/login/LoginOutputData.java +++ b/src/main/java/use_case/login/LoginOutputData.java @@ -5,16 +5,10 @@ */ public class LoginOutputData { - private final String accessToken; private final boolean useCaseFailed; - public LoginOutputData(String accessToken, boolean useCaseFailed) { - this.accessToken = accessToken; + public LoginOutputData( boolean useCaseFailed) { this.useCaseFailed = useCaseFailed; } - public String getAccessToken() { - return accessToken; - } - } diff --git a/src/main/java/view/KeywordView.java b/src/main/java/view/KeywordView.java index 695cebcc9..0bc99f2bd 100644 --- a/src/main/java/view/KeywordView.java +++ b/src/main/java/view/KeywordView.java @@ -97,7 +97,7 @@ public KeywordView(KeywordViewModel keywordViewModel) { homeButton.addActionListener(evt -> { if (evt.getSource().equals(homeButton)) { final String accessToken = keywordViewModel.getState().getAccessToken(); - loginController.execute(accessToken); + loginController.execute(); } }); diff --git a/src/test/java/use_case/topitems/TopItemsInteractorTest.java b/src/test/java/use_case/topitems/TopItemsInteractorTest.java index e41b967a7..a4810eff7 100644 --- a/src/test/java/use_case/topitems/TopItemsInteractorTest.java +++ b/src/test/java/use_case/topitems/TopItemsInteractorTest.java @@ -40,7 +40,6 @@ void successTest() { public void prepareSuccessView(TopItemsOutputData outputData) { assertEquals(topTracks, outputData.getTracks()); assertEquals(topArtists, outputData.getArtists()); - assertEquals("accessToken", outputData.getAccessToken()); } @Override From 9bbb7c6bfac03f41daa58ddd6a9b16c6b829f9c9 Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 1 Dec 2024 21:19:52 -0500 Subject: [PATCH 252/262] prevented null access token being passed from keyword --- src/main/java/view/KeywordView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/view/KeywordView.java b/src/main/java/view/KeywordView.java index 0bc99f2bd..610070cff 100644 --- a/src/main/java/view/KeywordView.java +++ b/src/main/java/view/KeywordView.java @@ -96,7 +96,6 @@ public KeywordView(KeywordViewModel keywordViewModel) { homeButton.addActionListener(evt -> { if (evt.getSource().equals(homeButton)) { - final String accessToken = keywordViewModel.getState().getAccessToken(); loginController.execute(); } }); From 8edd3e188e5f50dc634f3744db08161a13c55264 Mon Sep 17 00:00:00 2001 From: quinn Date: Sun, 1 Dec 2024 21:25:27 -0500 Subject: [PATCH 253/262] made back buttons functional --- src/main/java/view/RecommendationsView.java | 6 ++---- src/main/java/view/SearchView.java | 6 ++---- src/main/java/view/SimilarListenersView.java | 3 +-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/view/RecommendationsView.java b/src/main/java/view/RecommendationsView.java index 0bdf0e87f..834cc931d 100644 --- a/src/main/java/view/RecommendationsView.java +++ b/src/main/java/view/RecommendationsView.java @@ -54,10 +54,8 @@ public RecommendationsView(RecommendViewModel recommendViewModel) { // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { if (evt.getSource().equals(homeButton)) { - // 1. get the state out of the searchViewModel. It contains the username. - final String accessToken = recommendViewModel.getState().getAccessToken(); - // 2. Execute the search Controller. - loginController.execute(accessToken); + // 1. Execute the search Controller. + loginController.execute(); } } diff --git a/src/main/java/view/SearchView.java b/src/main/java/view/SearchView.java index d9cc3d7f8..c436d4ad7 100644 --- a/src/main/java/view/SearchView.java +++ b/src/main/java/view/SearchView.java @@ -59,10 +59,8 @@ public SearchView(SearchViewModel searchViewModel) { // This creates an anonymous subclass of ActionListener and instantiates it. evt -> { if (evt.getSource().equals(returnHome)) { - // 1. get the state out of the searchViewModel. It contains the username. - final String accessToken = searchViewModel.getState().getAccessToken(); - // 2. Execute the search Controller. - loginController.execute(accessToken); + // 1. Execute the home Controller. + loginController.execute(); } } diff --git a/src/main/java/view/SimilarListenersView.java b/src/main/java/view/SimilarListenersView.java index 9d5ca3863..3d1bad58a 100644 --- a/src/main/java/view/SimilarListenersView.java +++ b/src/main/java/view/SimilarListenersView.java @@ -42,8 +42,7 @@ public SimilarListenersView(SimilarListenersViewModel similarListenersViewMo back.addActionListener( evt -> { if (evt.getSource().equals(back)) { - final String accessToken = similarListenersViewModel.getState().getAccessToken(); - loginController.execute(accessToken); + loginController.execute(); } } ); From 23dae545f8194be5feaad18ed4180f39b90970cf Mon Sep 17 00:00:00 2001 From: eulogizee Date: Sun, 1 Dec 2024 21:50:32 -0500 Subject: [PATCH 254/262] Deleted token reference in related files and cleaned up some codes --- .../keyword/KeywordController.java | 31 ++++------------ .../keyword/KeywordInputBoundary.java | 10 ++---- .../use_case/keyword/KeywordInteractor.java | 35 +++---------------- .../use_case/keyword/KeywordOutputData.java | 3 +- src/main/java/view/KeywordView.java | 4 +-- src/main/java/view/LoggedInView.java | 2 +- 6 files changed, 16 insertions(+), 69 deletions(-) diff --git a/src/main/java/interface_adapter/keyword/KeywordController.java b/src/main/java/interface_adapter/keyword/KeywordController.java index 496b5d655..78ba4a0d5 100644 --- a/src/main/java/interface_adapter/keyword/KeywordController.java +++ b/src/main/java/interface_adapter/keyword/KeywordController.java @@ -1,7 +1,6 @@ package interface_adapter.keyword; import use_case.keyword.KeywordInputBoundary; -import use_case.keyword.KeywordInputData; public class KeywordController { private final KeywordInputBoundary interactor; @@ -10,40 +9,22 @@ public KeywordController(KeywordInputBoundary interactor) { this.interactor = interactor; } - public void searchByKeyword(String artistName, String keyword) { - // Validate inputs - if (artistName == null || artistName.isEmpty()) { - //viewModel.setErrorMessage("Artist name cannot be empty."); - return; // Stop further execution - } - if (keyword == null || keyword.isEmpty()) { - //viewModel.setErrorMessage("Keyword cannot be empty."); - return; // Stop further execution - } - // Clear any previous error messages - //viewModel.setErrorMessage(null); - - // Pass input data to the interactor - KeywordInputData inputData = new KeywordInputData(artistName, keyword); - interactor.searchByKeyword(inputData); - } /** * Goes to the keyword use case page. - * @param accessToken the access token for spotify. */ - public void execute(String accessToken) { - interactor.execute(accessToken); + public void execute() { + interactor.execute(); } /** * Executes the keyword Use Case. - * @param keyword the keyword the user is inputting. + * * @param artist the artist the user wants info about. - * @param accessToken the access token for spotify. + * @param keyword the keyword the user wants info about. */ - public void executeSearch(String accessToken, String artist, String keyword) { - interactor.executeSearch(accessToken, artist, keyword); + public void executeSearch(String artist, String keyword) { + interactor.executeSearch(artist, keyword); } } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordInputBoundary.java b/src/main/java/use_case/keyword/KeywordInputBoundary.java index 4f89ce5a5..b6b32350e 100644 --- a/src/main/java/use_case/keyword/KeywordInputBoundary.java +++ b/src/main/java/use_case/keyword/KeywordInputBoundary.java @@ -1,21 +1,15 @@ package use_case.keyword; public interface KeywordInputBoundary { - /** - * Initiates the search for songs by the given artist name and keyword. - * - * @param inputData The input data containing the artist's name and keyword. - */ - void searchByKeyword(KeywordInputData inputData); /** * takes us to the keyword use case. */ - void execute(String accessToken); + void execute(); /** * Executes the keyword search use case. */ - void executeSearch(String accessToken, String artist, String keyword); + void executeSearch(String artist, String keyword); } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordInteractor.java b/src/main/java/use_case/keyword/KeywordInteractor.java index 56a213d3d..52311afa4 100644 --- a/src/main/java/use_case/keyword/KeywordInteractor.java +++ b/src/main/java/use_case/keyword/KeywordInteractor.java @@ -1,7 +1,5 @@ package use_case.keyword; -import use_case.search.SearchOutputData; - import java.util.ArrayList; import java.util.List; @@ -24,46 +22,21 @@ public KeywordInteractor(KeywordDataAccessInterface keywordDataAccessInterface, this.keywordPresenter = outputBoundary; } - /** - * Processes the input data, fetches song data from Spotify, and passes results to the output boundary. - * - * @param inputData Input data containing the artist's name and the keyword. - */ - @Override - public void searchByKeyword(KeywordInputData inputData) { - try { - String artistName = inputData.getArtistName(); - String keyword = inputData.getKeyword(); - - // Use data_access.SpotifyService to fetch and filter songs - List songs = keywordDataAccessInterface.searchSongs(artistName, keyword); - if (songs.isEmpty()) { - // No songs found matching the keyword - keywordPresenter.prepareSuccessView(new KeywordOutputData("No songs found matching the keyword.")); - } else { - // Pass the list of songs to the presenter - keywordPresenter.prepareSuccessView(new KeywordOutputData("placeholder token",songs)); - } - } catch (Exception e) { - // Pass any exception as an error message to the presenter - keywordPresenter.prepareSuccessView(new KeywordOutputData("Error: " + e.getMessage())); - } - } @Override - public void execute(String accessToken) { + public void execute() { List songs = new ArrayList(); songs.add(""); - final KeywordOutputData search = new KeywordOutputData(accessToken,songs); + final KeywordOutputData search = new KeywordOutputData(songs); keywordPresenter.prepareSuccessView(search); } @Override - public void executeSearch(String accessToken, String artist, String keyword){ + public void executeSearch(String artist, String keyword){ final List songs = keywordDataAccessInterface.searchSongs(artist,keyword); - final KeywordOutputData search = new KeywordOutputData(accessToken,songs); + final KeywordOutputData search = new KeywordOutputData(songs); keywordPresenter.prepareSuccessView(search); } } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordOutputData.java b/src/main/java/use_case/keyword/KeywordOutputData.java index f2c1f8cef..3889a62ba 100644 --- a/src/main/java/use_case/keyword/KeywordOutputData.java +++ b/src/main/java/use_case/keyword/KeywordOutputData.java @@ -8,8 +8,7 @@ public class KeywordOutputData { private String spotifyToken; // Constructor for successful results - public KeywordOutputData(String spotifyToken,List songs) { - this.spotifyToken = spotifyToken; + public KeywordOutputData(List songs) { this.songs = songs; this.errorMessage = null; } diff --git a/src/main/java/view/KeywordView.java b/src/main/java/view/KeywordView.java index 610070cff..fb35e2d79 100644 --- a/src/main/java/view/KeywordView.java +++ b/src/main/java/view/KeywordView.java @@ -89,8 +89,8 @@ public KeywordView(KeywordViewModel keywordViewModel) { // Add Listeners searchButton.addActionListener(evt -> { if (evt.getSource().equals(searchButton)) { - final String accessToken = keywordViewModel.getState().getAccessToken(); - keywordController.executeSearch(accessToken, artistField.getText(), keywordField.getText()); + + keywordController.executeSearch(artistField.getText(), keywordField.getText()); } }); diff --git a/src/main/java/view/LoggedInView.java b/src/main/java/view/LoggedInView.java index 2bdeecb24..22f5f0acf 100644 --- a/src/main/java/view/LoggedInView.java +++ b/src/main/java/view/LoggedInView.java @@ -164,7 +164,7 @@ public void actionPerformed(ActionEvent e) { evt -> { if (evt.getSource().equals(keyword)) { final String accessToken = loggedInViewModel.getState().getAccessToken(); - keywordController.execute(accessToken); + keywordController.execute(); } } From 48d8599017303824d8e8069bb7609c43d914a93a Mon Sep 17 00:00:00 2001 From: eulogizee Date: Mon, 2 Dec 2024 10:48:45 -0500 Subject: [PATCH 255/262] finalize keyword use case failview --- src/main/java/interface_adapter/keyword/KeywordPresenter.java | 4 ++++ src/main/java/use_case/keyword/KeywordInteractor.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/interface_adapter/keyword/KeywordPresenter.java b/src/main/java/interface_adapter/keyword/KeywordPresenter.java index 9c0c9ad94..39c926a34 100644 --- a/src/main/java/interface_adapter/keyword/KeywordPresenter.java +++ b/src/main/java/interface_adapter/keyword/KeywordPresenter.java @@ -38,5 +38,9 @@ public void prepareSuccessView(KeywordOutputData outputData) { @Override public void prepareFailView(String errorMessage) { + final KeywordState keywordState = keywordViewModel.getState(); + keywordState.setDisplayText(errorMessage); // Set error message to display + keywordViewModel.setState(keywordState); + keywordViewModel.firePropertyChanged(); // Notify view of changes } } \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordInteractor.java b/src/main/java/use_case/keyword/KeywordInteractor.java index 52311afa4..02f4d3477 100644 --- a/src/main/java/use_case/keyword/KeywordInteractor.java +++ b/src/main/java/use_case/keyword/KeywordInteractor.java @@ -34,6 +34,10 @@ public void execute() { @Override public void executeSearch(String artist, String keyword){ + if ((artist == null || artist.trim().isEmpty()) && (keyword == null || keyword.trim().isEmpty())) { + keywordPresenter.prepareFailView("Error: Artist and keyword cannot both be empty."); + return; + } final List songs = keywordDataAccessInterface.searchSongs(artist,keyword); final KeywordOutputData search = new KeywordOutputData(songs); From 46925e485bab2f5b64e35087ab7473e13a83e9b5 Mon Sep 17 00:00:00 2001 From: eulogizee Date: Mon, 2 Dec 2024 16:31:58 -0500 Subject: [PATCH 256/262] added test for keyword use case --- .../KeywordTestDataAccessObject.java | 23 +++++++ .../keyword/KeywordInteractorTest.java | 65 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/data_access/KeywordTestDataAccessObject.java create mode 100644 src/test/java/use_case/keyword/KeywordInteractorTest.java diff --git a/src/main/java/data_access/KeywordTestDataAccessObject.java b/src/main/java/data_access/KeywordTestDataAccessObject.java new file mode 100644 index 000000000..aa04c7c7a --- /dev/null +++ b/src/main/java/data_access/KeywordTestDataAccessObject.java @@ -0,0 +1,23 @@ +package data_access; + +import use_case.keyword.KeywordDataAccessInterface; +import java.util.ArrayList; +import java.util.List; + +public class KeywordTestDataAccessObject implements KeywordDataAccessInterface { + + @Override + public List fetchSongs(String artist, String keyword) { + return new ArrayList<>(); + } + + @Override + public List searchSongs(String artistName, String keyword) { + if ("Taylor Swift".equals(artistName) && "Love".equals(keyword)) { + List results = new ArrayList<>(); + results.add("Love Story"); + return results; + } + return new ArrayList<>(); + } +} \ No newline at end of file diff --git a/src/test/java/use_case/keyword/KeywordInteractorTest.java b/src/test/java/use_case/keyword/KeywordInteractorTest.java new file mode 100644 index 000000000..38b565066 --- /dev/null +++ b/src/test/java/use_case/keyword/KeywordInteractorTest.java @@ -0,0 +1,65 @@ + +package use_case.keyword; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import data_access.KeywordTestDataAccessObject; + + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Test class for the Keyword Search Use Case. + */ +public class KeywordInteractorTest { + + private KeywordInteractor keywordInteractor; + private KeywordTestDataAccessObject testDataAccess; + private MockKeywordPresenter mockPresenter; + + @BeforeEach + public void setUp() { + testDataAccess = new KeywordTestDataAccessObject(); + mockPresenter = new MockKeywordPresenter(); + keywordInteractor = new KeywordInteractor(testDataAccess, mockPresenter); + } + + @Test + public void testExecuteSearch_Success() { + keywordInteractor.executeSearch("Taylor Swift", "Love"); + assertEquals(1, mockPresenter.successCount); + assertEquals(0, mockPresenter.failCount); + assertFalse(mockPresenter.latestOutputData.hasError()); + assertEquals("[Love Story]", mockPresenter.latestOutputData.getSongs()); + } + + @Test + public void testExecuteSearch_Failure_EmptyInput() { + keywordInteractor.executeSearch("", ""); + assertEquals(0, mockPresenter.successCount); + assertEquals(1, mockPresenter.failCount); + assertEquals("Error: Artist and keyword cannot both be empty.", mockPresenter.latestErrorMessage); + } + + // Mock presenter class for testing + private static class MockKeywordPresenter implements KeywordOutputBoundary { + int successCount = 0; + int failCount = 0; + KeywordOutputData latestOutputData; + String latestErrorMessage; + + @Override + public void prepareSuccessView(KeywordOutputData outputData) { + successCount++; + latestOutputData = outputData; + } + + @Override + public void prepareFailView(String errorMessage) { + failCount++; + latestErrorMessage = errorMessage; + } + } +} + + From 84f6b0abc3941a7b4fbf0c7bf9f85312db9b60e1 Mon Sep 17 00:00:00 2001 From: eulogizee Date: Mon, 2 Dec 2024 16:37:34 -0500 Subject: [PATCH 257/262] fixed checkstyle error --- .../keyword/KeywordDataAccessInterface.java | 17 +++++++++++------ .../keyword/KeywordInputBoundary.java | 11 ++++++++--- .../use_case/keyword/KeywordInputData.java | 19 ------------------- 3 files changed, 19 insertions(+), 28 deletions(-) delete mode 100644 src/main/java/use_case/keyword/KeywordInputData.java diff --git a/src/main/java/use_case/keyword/KeywordDataAccessInterface.java b/src/main/java/use_case/keyword/KeywordDataAccessInterface.java index f2ed07f5f..6950c3e69 100644 --- a/src/main/java/use_case/keyword/KeywordDataAccessInterface.java +++ b/src/main/java/use_case/keyword/KeywordDataAccessInterface.java @@ -1,15 +1,20 @@ + package use_case.keyword; import java.util.List; +/** + * An interface for accessing keyword-related data. + */ public interface KeywordDataAccessInterface { - List fetchSongs(String artist, String keyword); - /** A method with searches for songs based on a given name and keyword about the song. - * @param artistName the name of the artist to search for. - * @param keyword a keyword about the song, possibly a lyric. - * @return the related songs. + /** + * Searches for songs based on a given artist name and keyword about the song. + * + * @param artistName the name of the artist to search for, may be null + * @param keyword a keyword about the song, possibly a lyric, may be null + * @return the related songs */ List searchSongs(String artistName, String keyword); -} +} \ No newline at end of file diff --git a/src/main/java/use_case/keyword/KeywordInputBoundary.java b/src/main/java/use_case/keyword/KeywordInputBoundary.java index b6b32350e..eba6a90d4 100644 --- a/src/main/java/use_case/keyword/KeywordInputBoundary.java +++ b/src/main/java/use_case/keyword/KeywordInputBoundary.java @@ -1,15 +1,20 @@ + package use_case.keyword; +/** + * An interface for the Keyword Input Boundary. + */ public interface KeywordInputBoundary { /** - * takes us to the keyword use case. + * Takes us to the keyword use case. */ void execute(); /** * Executes the keyword search use case. + * @param artist the artist user input, may be null + * @param keyword the keyword user input, may be null */ void executeSearch(String artist, String keyword); - -} \ No newline at end of file +} diff --git a/src/main/java/use_case/keyword/KeywordInputData.java b/src/main/java/use_case/keyword/KeywordInputData.java deleted file mode 100644 index 57fa55370..000000000 --- a/src/main/java/use_case/keyword/KeywordInputData.java +++ /dev/null @@ -1,19 +0,0 @@ -package use_case.keyword; - -public class KeywordInputData { - private final String artistName; - private final String keyword; - - public KeywordInputData(String artistName, String keyword) { - this.artistName = artistName; - this.keyword = keyword; - } - - public String getArtistName() { - return artistName; - } - - public String getKeyword() { - return keyword; - } -} \ No newline at end of file From fa706aea83c0aa22539ef58bbc659f0379d7b921 Mon Sep 17 00:00:00 2001 From: eulogizee Date: Mon, 2 Dec 2024 16:39:32 -0500 Subject: [PATCH 258/262] fixed checkstyle error --- .idea/checkstyle-idea.xml | 4 +++- .../use_case/keyword/KeywordInteractor.java | 24 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml index 63b2cb7c6..0a0561d2c 100644 --- a/.idea/checkstyle-idea.xml +++ b/.idea/checkstyle-idea.xml @@ -4,7 +4,9 @@ 10.18.1 JavaOnly

  • MUFIZ#V~^0y+S)o5ejB7;F>ofDEoEe8 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 z zQeo7S(r!;03Ym}+TMw=3Ff(43PT+N6Z%H^O)gY?Y8S?eUGvJ&j)zfM2Ea|0z$N6*- zi`7k?zk2S5A#1O2vU?(|m7`Y_-gC0 zDfPn9KXPYVuX_8bR>jI3?CpFXn&Z`|9r#5;04J9VMVng;LgOhJzt$$JCJDg1lN zLCFnVa+93vkXa02a3F48&Jn6^#%(4-YVF*2Cd)==K%XKzHX z3UEEDxHSc1vxsL0l6m~ec|k}O2D=Te;`qbIUx5p9QojAL@E`^kfbQ<$v+;5xlsbGdHYi$P+80RHKxd&&nKVT0)l7T1e2R5!nsN7>H%TSX)nU;BrQ+VkawN zTpZH@c>*AYMESXjeDWj^yrOX+6)TH?$>TmsB?AheMg$s}JAH258T`K5HhCalB+kUP zJtZ|cjwgKd<|QRlSQyZ7_)ODeWrIWqK7xtqhND<^WPjMATlWKl%oHrw=$KTo+>X2z z7#5YlsdtFrp|JI!vvo-lW!HD16|S41Z?K}N#gG-2yy##itru#PcVHma51}ZJiy$D}RXf6UqG58F1<%`F~QeZ>C z8+9p^daChAJ40>Yg0S6P40GKMVFt*Tz601g_f1zE8wOz;nU}(;Q78!0Y$2k~IL7Zl zyjjc6Fb)u>W3I2!oJj@>loD!J>4E@lHtRA?);Iks#><4sOIm&%o@g!&L44&9i*tW4 z`#x3uSk#o2^GE1fWbH_o%8Ny`t1>SF)>m~R>35f!Tq_!dy3a2n$S32dxh`JwBpHP% z`7Sza7!BSE5D$t@t_c)hJ#Xi}zdWquM6N}i%?qVwhTgG4h1o%Fe5szo)x#AXCqJh` zHp~yka(WLMIQJ(Uo(L3IkepGn{O+YuF1)ud5xcbjktv+2itG)-+7io7koy)kw7wD(zL)rp>H%k@&)jP? zNzhToP0uG$0nf3*O53PgEd9y5>|6|il)k#bb}`QE1ZM3hbP`Sm>Ir~3pTDGh*S~=2 zabG%L6oN7}fdM)Zn{@h3X+h0GX8`p*hu(vj3bc#^0sBwoO>@o9F&K)oDc%)-;1XA$ zkSx`0LdO%~E?x4z^3S2%4#rALJAZ0iOhumpp+|=`>9_ih)*K}m>TUhX9b6nr2-#n7 zAtNIX>D-C>aX$lEG$cwtY1Ai$;Hictaw8pS-QV5Lj#~hUFMaR+WC5Dn4(J`wj)I|` zMWsTYw(a`(M=27>b;%dG>eyzcd5*`!xK0M?(8UFWIL7}GRS4?ZP!RYO`M6O1n`=a4 zp2dXC;FyJg<=y;r=&EEF(BVQAKs_P5Us6IWpDjx%6M?T+S_War!2aLs^APJ$lNVNy zMb<3Ju#C-qRdW8WD}2xKqx@RS#|Y_Kf#}3asN_bYuZkLdN6@5Qai3T z_G?@ns3lwv!{-(&1K?g(KLqHnb|DZI8ZnP!$(!~{{zBe9AZLVZ}Od7BnyEhE{ zvDWjUq%^kDA;csYht5e!o*PQ%THRDExWu<{MK4KOj@0^Us0kfAS!;IlY>_6Z`t~n2 zQRH+rFBs*Y0TtbA3|a)iF3L$PX4l_1=rlpkV%ZfhY69QXddP!*94s_5r5Sa6?4V&L zo8sXLyeMm>M-3P4TK8cEZN#&ycam;Y*HUf_poC;6MB0eVYx>3+2&#TgA{k6^Zx;wPjnxXTM9yynFUR1aw~%t%!8Cs^np$sD>DD!T!NE8fH4SFfZD&eK7h(Hm6s;oX3kR z&>0y@6BvL2V^voJ=~V|G zaZO$n%R5AcO`oglH@caF5k7TE?+V(<^GqQ^c>=I3Qt)_D#i|4g!9jT&jf2PIcT1%{ zL7)s2HQPqF^y34o$6kS=w26^E7Pb#2D?QHV$d}tqxR~nM43Gy0KAkpl>06B#zsp}# zYAEu)by7RhJpyX^rA6mBoTWaJ;I*vGBSD0+cY-nyV@HzRY#~rir_)fhp+|a6&#J9Y z5G0VI0T2SJ%yBr?j5`){nux3YCoThggMn%t;Slb8&Xlfhz0U*Y$fCWu9LP$F@Rb!rH5;pl}S5o9%+aCiN|s zA|168Gz8$1m>YBK=QEw|Je1-$wZpsYX#j{;I;_UZ3hht=(WODxurE43@~@ydkX>T( zO9T-@D<-l9eMMQ6vqJTnP|T z4}sty4vm7Va2GPfi?b92{#e*VemC?WU&%#)MVh7`U9! ztwCYqt}~8hMCC%#P>PO^34{?i)U$b#4K>UX2Rxw-zC>bH(~iqWJRf>m7wM2W9}=-? zY3}xU@nC*&sePoGUuIi@ypG}`)?=Z6oiqYQAdPTsV-Ln>%w6_)OcF}3uTo=l{R*!6BEH>+RLsRyJ+@>028q{zNjUc#tw;#n$}Gn=w>JL#QrtEZ8(i^FRj-O7Ue3= z2XNWQjNz%qNQIML4Qe`SOQ=eIGKVCBw%u;+6W;XAauQYdCQ^4g2dudc7v)eWfRP$9 zdXY)r;U|Fw;|s*uudFAfv&cu-R6Y)7;B=uwWVn37dn@94tO@rdd!;8i0euPS_tSN! zdin>HmzKwzRw7Q5kkd$^&iw{WbpB+v4!y-n+xDpKR=rAtkmKQpP9gywe~A`BX`>fe z2<2NxIUA17KMC+A)Vw{gGGuG5K5UMWyN0{!DiWPv1Pml_rcbV7V`CF5C@QCmtuago zqGjw&mK&k%&qwo^u)SzhCJ$Oo1*a9YoHBZ|<6BV7vueNHDl~~QNGhBrI-A)b%)af4)}UOgTLZfZu#P^&&#${Qjhl z-(n$#$GDf?SAlvg{fl0s!k#-O9#c#f4(8sRZgFb&W7g(tuzHb}tk_4k=`FgLs5g!F zc=g|7In1b+z96*keU11OS#m@YFXmH41>Rg*aOjrG)EEUb(Pi9h{?OERl1^ZC@o-sC zf=~8u1$`B}3hjNFA5dJ9xIG6R{NW0|)z>_DPp^2AexVRQYz6D!(r4i9E;V}S`W1)1 zfp^7{ZGe-@&qpd`y-Vm5`&Ba1LDwSR-aO_e3h5^62MORNjkc{<-2RQ+_vqMy5tW%Q zxBk_RF$PpRCPJty3bmX%sKh6U3L_&YX$l&847rdt3MkI{Wv*iKNh00rR_F!a&iK_! z6~JKDqo+VtOe;-)c8Dx0NZW0X0&TO&Ucieac-9m|^aAYEQRbPGt6@I<@qF}~Ad}Nv z>NnuQ=Z&Hs@StcW?-G!D0O$ZxvVoZl{v0cFOL5@rL#ixP-W zBM*~Kj@KRT?+{r4Rtco_%V2^o;nPP(k0P{41Z?K<72sen81w9FgLcx&#nsfCPT*FL zJai`fra?yuxVvK{r5MhXl(nO80Z?z7q(*`%QNQxw6JO@q-A~(t3EmE*&Gk#2yi0`p zHxXXy2tFRj@t6zSP<==_NwN3Q=F@!RH7=&zBi)8}zfaYnh5%$bo!@3!4u!OSRSunq zRVt26!{kE}l1!OYa5NX4nNXVx)#JCc-fjU+^9E90&#f^V-^)a5 z9I5o!q}TZ2mpKCw_Y;|4cY!))Ld(Jj4U)AE8+cv8pf@PF0|ZP;gWF@{?37sK9x_^$ zra8dnAVD}QY*CO#Q(K~ip5~MPS5)S7ot>{0>FU>OPl zYpCjbM(6!mUr`aGP6bSQg`QVq%I$#^%X?FmU8W5{_LyQ<&a6KrQ#!;e8%T=V3o$Y? z&}{iI_}Gg40N5fzFZ9_1#o>PbX)u_YrQLD0WW3k&sb{FExeCD*qPYOQ4iCnaH(mG| zK!CwKmaj6>eE{%9R2c{Jea8|rwo?d=t#$Cm-Rk+3)+C47*Q5$AacZW27XPCE6L6Tm zZ+C#KIQk-)m>Uk25c76+K-{_FCl40>wnNO2ZXnB#AKuBVUig6KXG+@4C3_f!K=@O{ zL8IZ;a$9}%_zLF(>erQ~VIGcKLi#OGR+TKjAjBV~5UlNbLOn?MCXgA0fgu5wGw8W{ z0*kt4pwdBs#4mtU*-2++i%q%B8GN%5Z<~(vhOAyX4`&ct|vse3ad2>H3n4PP%ZvO zwIjT$M9D#>7C07+=Sr6z;=N$@o-kBLT|Wc#%^?==wEZF=oLkRuWFnrHy*Qjs-=J&V zPbFJ ziUC@9jq3=6Onvj)Q~zGVz=#sr^tOwyjF&Z>d1kLXQ9~v43711NY@i3YvYn9r&;DFZ z)b8CQiP|-fyc&l5Yu9*erdw+IGrl*yt(_p~|5pY<#G89th|S!&V4 zcAJ;C6P8D%ZMsFDomN!)+Pxet&W+sGX^!2+*q`{Jz^K>0;$)qRxQMx*?HZ=y?gRst z2QBka@t997nne&I1hcHx6rVmi8Qb#;2X7$`C<0)#rP^Vagq+#&nhi+Bm`Ip^8EqY# z%|8BD>IhDd268L5fzv!ud>q3BhMU)Sg``LN!2QwshV|zmE~Hr%0!2$!a{|`mKK85q zOidjmcY+`8&J`{2Ea5HI4FPU}4_Zhqig)g{l@2B>m~XnU_N1MywUk!b)td@|{zB>t zujXwlQ3l@w!lP`Y+0L*6Ut@~mO zcSeSXRgkd1j*b*VVqej|{EYN&*7o?q0I1F&TnZFtH4;q&=x-l|GCV>;SyGWJA12!T zeihbn8|^Rtk;|oQLX3WKNBmo-p5_%&G!_=LbiMXs<3Rd8Zg*Sz67Hk!f$qb5e6*pb zwzM2CN^)9-;xNnk>01tvoI*E?E0_n8>=SoJen%MN&5-vP@*)8WJSII7iZkztE_?2Z zD~9V4bV-66?y}G1QxJRz=y#f|&)1so72KUQOSOO4(Vct`Mj!5$Nu3xKu}x>TQ++yV z)*$QSDn%}$U+QWb!N0!vNYveM-hoAuYI1`dRT(6DcI0-x&xYw3&#ANQa3~VHX8{sD zW>?E)2bk=p-{Fcb>mTF-*>1yT`~f`qHVpRS?G}m_DBtbiK7%jz3mKd3Rw_{A=*-@X z^VaejTW4C8<2lgaVQ;m_$QokcZ?jdm+ydoUMo>O^rZ4wUIjwv0gU*+SJ8_5KdOwEFzLQiY8q_{P zZAz65qx_!dkdx(lvd;aA{t}XV1dCMuGPEBVC;n`d&7Pd#}@a?6r@tF}Wl~-QGJ}G)%KPzv+C0Nh9WKr_S;gAgrrO zvJ-h-%%{Jo(uN0(;2QvH0#xTkE)%EMtDLkANBuKJ8p=n)`fLqMbM%xjF~koGg*?elK!GMYKYx;NS*{=JKa(#R4gIFHLrLm#WU5pTO4`~4 zn)s1|+%z$>fGq1v7AbPj62PtXsm^J~dW1#>85EA_VNLveN({4=$JZ7#vuyHqbC6Ev zF}xm+K?c2rkrIe=e_BoUA9iJ=3)nOXE~^N&l^OKlV}u~h3RN9I561K98p%YO{hIFY z+*fJ=Xh+}hT@HwVBD@#tVOYA?CuJZBrSc|tlmHPxmVJki7Hy6wFTln=`1~+{c zj_@-%k8yq(Xgt-Z9Sd8!G9sysH6uya|F|xf+UdRS+ppR9gY}o0>1SerrO}9T?AoJR|DBT6juc<`JBEo#W1Z8l+ znBRO(tPyv#ZRQdzO9&8k?h(5`Uc-QVw!t=V)DK62di#G=Z}$kpa^(8?y!E+As5rk-H}XeBM6{G95%RaD`!)%;k}>R}FV2fC=2R{lV8GD}7xhS4 zUrNv z>EsP(n)UCkj_$AnT#FCnTdQ?vzF8rI(Z)%<@8_P-W``bZ^U3zVX^7uuYRb_G4*5#Y zC5xP5Z{0W(SEYl6fh&q+j5Hsee?yhw`z|knqHTAl^=TMTG3tHXoC_cYSfU0}ShA6m z>!#m>W)K`PRD5#xc?Lfehd`rJid1fx_)40>l%sP9ej48= z>o`>_*vGDS*_NDqdIX10+?e=@W#N0wv%TsC5`5wpQnMe3gsiSYeQ`}*-uJg*dA}?> zV7bqRpPa{Fil62hetjJq9JZ~}eLX%K*L$a;N3m;s zQGLplOe!sCKdy3+(B1K&3pw|1!Q@Zp|Ai!Pn9qM^IX|$?XY6ZhPXy(hJPpvAY%f2n zblxy6Jl?;iFQLf|!`nUMDQ)X`KGK!$%|NYuD38$GpUT=8T7+JFh6ED>?vDM@v7qU` zJ#N!Z6wJNeSFz2SBtO&GN?oXhKcmcfHpo!`q_Qpj^KXsS)(5J)z@agGWIA~W!bsj(!P3uof+IVC zCxOD8E^rED7)5&nZtsgGtOuPSubWoScMfrf6ZozyMC!#)x)SU%wiOE+u1)6TN_ z@c&`zEW@G-+qFGIBMnm0AR*F7H&TLhcY{bb4Ba3pAR%1>(jhr?cXxM5_fX&RefR#3 zea!j^6RhF6>$=X{0L`9-lVdQB3ck?3An-ae}DL6J7+MBhGd+Ar-$Pmi$TV( zw{P*vl*RpI@j%w4B1B#6j04Y7^y;KH!LtE!?a~al#|hZ;I$n!7@1pne^Bd@P!H67e z;*5H^!0!)b29ubj0i6-f)*tCuJC<8QX)9?&k^jiZVIMv(YL(nPL^=MJsUjNNDMjFj z^Bss6={`;5Q-FG$Bb2MhAHdC_nbO|9mqjL|cny5l@Q{n5@TYtO`M{@`0jLt8oF+js*i4jEHP%uo9rw zS?}nMikM-#s{-u2g+{$R4+EA&1nupjKTcM>P^7$OMrMWD1O8dWp=v8)tcJb|-6@sU zv)-{~q-&r<94i3e`)JBG94_Mfh%lHs)kzm4jAq?$+82ZBm(Fq4Lug23^FiwE6b6y9 z!*bMMYX#i?L{_CJk|^}GCFttu0gIAtTMmp((f86W+M}P!=S=W|twXS;kk$LPK5^+c zdI2C#`trC57vv8*=>rz4S%Luk&Vqyss09HY{>(SAcN zC(WZE{`iPHQTXrci~_$qcivxixIE6|a9M`|PS`7a2Ce=S)e~UAa)H>z;h&8?%#3_< ziUIBin4!W)&{B{M4Jl}W0gpSoBamh2HIYMnv<)0ia4hv;*XIkzckhC3Onakf7g0mu z;-vNV5?*n7O_=m}W-8J?vc=f5>rPJ?#gOya zAa0JO^P!Q*X>l{w*)1^4zsxk0FXxF+Q%qm8zi|IGWh-l$diA#;@($FJ7Vv!28P-F# zh2TTbi)#UoF+*fDH+qao{9K~$r+GE!Y#CHKe|7vr9&t~gtJe2Y(n;G{8OIToZGm|CY?tYUT zJ7q_ElC^k(>{{5~snQ%g5Zv591SlSCaJ%DGXZd-+?JNH_(~eiElhu|0E84%xO%o%i z25+qAh-d}vFV$D@B4VXszC1s$W^KF4rvJPjpwB{adIP-;O5DEK86qE4r^h3}_~%{# zzMn5FhM$*s${b}w82eo=oBXUs*5t&y-|HTbK`QKgHd=4ic51CgWNFan_XKXqI|@DM zaP5F@rKVQ}i@I+gT-@{49G}aVtZRNIj>CED1}&0qor)T!F+k-13lRAeoA*Tz8fCuK zeswr)UGzibLW(%wh`D-hJi?>}`zQm{ALy!skG~%K=No%a(<^(gCZI-(?S=trfl^0B z(ur6*gSK3PfC$<6s+iDkPQpOLQR?dG3n-LUX&xxr2AZP9quz{%ke|US8MzLSdlU%1sH6g{`}&q`zjX&bk&>FTPN}3-%wAUPZ`PdsBNC~!$H-xM|d+nECA^+Q4)lDFj*DltVU z2U|)&I@+szK2@nttWL+QsO!Q|dwQ|V{Lt^{cZZpAWxfHtPI|ykv+BD2vhm(TG~*hJ*7b-{lQh3h zzO*cheWQ~4N?npIk=UFkQV;|FgjXE|f>jQC%|8ShiRhTc;r}lS;OGGF;USPZ?inxV z1GWJOvW|y@PV|-y2T*Zv_ak@xCQYA5?;y|N#05^&BKWh{fF2Y#*y4CmI|?zQIIW^n zMya}@y|eCc$I2+XOpvru5`iq+dv*FFFuzyvQ@nTIoGf_nvRCeGs@8kitzMTvKj}n= zVIPaSek=?tBA@xKt_w{FYIk|OtIGXip~QVAhAVSY^tW9%K>03=&-u$!sB26hWSLbi zsWgg}gnGVI!0nJB>QsN=Z7u&+i!Iz%Q~Y`QV!b`Zt5^J6vKIyzB}rt&A%q^}o?h1E zV4^0bpj==FDn0B}4P?q;j8{5F`2|U|Q{YskkF#;O|c}xKskCIG(1yrT| zefpwFOc7y@beTMz{V`hKQ>U;thlRs@RP$Y5^xI6gYgMAZCEC?&~ z8aaG!^$AT)KJxnc`E@MD#MV5z9<&|eNto} zP_IT(SRWv-!+xv3L`YB9e^nn6Pq;!Bg-S;5UVJBDeO}R`gnv+-`bFUOU9DK$J&pj#InH+b-*>b2*wSLG_g#G(~}xvU&)6KgLicLAbrv{3q_ zBh5H8iMzkk`8R+nXzcF-Pz_%BKlR8Z;)1OFEr1%0uBCfM8{1yYVpg%M7q{PZWpU;) z(A3y49t3$C`iv^tz+C5!|Jlw0xsQlhr!*MkMV;~VaC4Tsz_t9U3VBoV<-K7J?wE+9 z&2Glevh|Ca)oc=IaPj9onFg7O%|{wLa0B4tFzOk{YWMq87yg6tUY=x*#8qlJmz3}r zJbtc#WSxdcvTURsmZFGxb{RQ}#8PkAw%hLe#%p9 z(VfyVFMrn2R3RT~Y~^p@P3yRxyic#p1dD!IAJ|Hy)n)lT{CVBTHE9zS_KA&c`d z3H(%jK|dl%p@kIS`^tIZs^rfY?0i|`B~ ziHn5l{Rmg$R)mMA$-`8#0NSXkAV~2NP#aE$$R&GX%|Q(HU|w5?C9Q{%-XNsY@f>)3 zRs-?J&ua>YVtV89h>m7x;|7lKxWS!zdrQ& zOyTz!(Qp6!=qV+X-so6Y4os6iown)*JwIMz(V;#~rRMt(Ai3_(SLOBFcLt-n1@x@4 z#MSTOcs7CNy93;vrA06JO}ZI6WXV?xQSwJ#Lno&`@{f$yBGd6ZFW_Z!=A|{+`?O1&Gogyl#fE3p#(!`-6ktxgM%* zE+JlGBhWK}V%?7q)el9o+eTWSF|r7he<()ty6j`)g+!r$zgao~y0G2|*?sm3Y23D{ zr8TuVFksmwNBIqfnCLMI=Z|-)be*V_>LnVSY#l(3j)O2|fvyAKr-R;FW8IlyL=o5gb~eNSYkxqu_h zo`yv+vpZ`ZCUDb5yl$B0jN>|FuTGjz zFCvq6q=`ei0#WDZclx%rKP9|-Kc_y}uhPDN7KbatbxpCN;=JMWuTv3#)FB)HuwoWXI&Ts zgF5wg%vzf44*G10Gzh%0XpuOT$mGxd%amH}ne3*aOS9e;HMoRq zqeI*pE4C|J`Cu&vBxK~Uvl}{pa6k9>9SaR&@COs z%zcSVE6e^~#VO6-+RHWme)D(I3VNp|`0C;21heBJ2AI|&g;O|X#_sa@J{C1-z8FQp zO-FHm;EY^?KmToXDAeq(<3l=FtKNlxpMupDh)c^Xaz!|bToVw#6SVGy~p5v)${YZkjU5gj_N_k8|{9T6VcD1=gbT31r+6tsm8*pyG+9=E?J62 z^QDmQHi}Gec58J#gJUbmsDqkYrg-EO%X15qT~5`q{qlki4&Zv`P0Z-Uw> z;g~K{ZVR@z^R{cw&ZpzJN?u%fk^2+qPAb*^mg@_c;c{2-4uFw3;^ffhMNIfpJ1ySQ zllrjVu+^)Ts)ZQJnsU%A2rYILN~i2eJsKpks49>ihb6oPrt_4-7D^%gyf^7eEt-M- zx7~pLOR=jBIhDf_|9W}svbu3(%DkTeJ=X}`-Cr@oL6U=wjY=PezIkhQYS(Al_roRc z>wFPs4=kdTsFKRYrbp0MLUq z!fKC{|Km$j_{K<~sB1X0yr{py73o7%`wCJ_4fO&$u7^+1xj&brB5416{;R7VPOUye zsE3{8bdcabL7gT`hBS6zelPNHu)&T#O=&9gQ{*q(cbW!6I&UW_rdu%lrrNY0#3jH# z5BSvB)`x;C?E|jKP=AFy{KpD8&4a#r<8qAYPk!LO&o%tYJL*Dwn!`xm@h}Cf@p%iE z;qNDqkPFgEG4%t&vP0~Y4jvocPj7=qfE45QCCkHYH?|QghJ2nG;X!1Qo#a!tZ6yx_ zVmIf7i%7#KI(M&Qnyrn)FORMcd5V-HKfRki@(J&V{Q%V7+GUM_#?U2yb}8(AX9g0g zU<*o92@jtHUMr`sYd&#Ro|u-pKJKg}KbS1HaMhQ=<21g2*?oVC_2=(T5rXDvMy#sw zLB$}5MA6*Ydq$PcYPu-PX_A+!RYpY0tE!;pB{PG*2zdR6HsYW<1?IQ|z;y|?zhRll zY36a=w3}5>>v^0eq^#@OE1ctLZ$F!l`sV)Abee z(ewpqY^xm7%kI>Xu z_^?Kmr189HRH`-Sy~oz1CL?N~$v8`-reOV*;+TMX_Bc{=RBV=aoy*(oS1voip@~lk zvy8Qy3=lce#h)T&wO%;sd>Ov^j=7~xyV)DWvxwh*x6vgXak>oH#5q1$`Ku4;{IQYW zAwquTb}^7ZH*QX+?N4d2+(AA_NK5Es+{;>`x=@erU?Of!K;we70BZYj%P>)qYTUmnwYEC8%UrCS-<1?~Y}$1_Fs#_sgSS zR*ACJZd7VwW?6Lp=M4UyR|r@RBBC%A--lx!$5Q0XnOb0KG;HK;O@|$Pu+oghIigF@ z1R{92+k!X{pr4C8vdw8x3XGHjOKj`$PMr6izf^{lM5bTPA3C1rO4cQD z5l5u>dckqg@#}N~g(zY51N+ zHbdlpm}|rKj4e*1hX2||mXR9&1sgbT_YX+X@pZ@ECykIGBt(B!ZAoI*42TwILc3-J zSR7QR7Hp@s0@5oo{%nVPuP!|RZ<9xq`D;n-HamNJmFPi2 z6h@!lS!6c>K4%=aE*KX_$_$s+4QU_-@s{yXl6+@-2V?tDnD;%J3go%WztpgvUkwn3 z-p@N!TDthVR9dN)K`VOWdD zgj5{n$P1c*V;T5QS{SP3-jb^yK2xSV-=3T=OTTwXr81R5x+%ngsa#4t1&tx122rYG zc^t6x7k(8T_W2l1G3zx=nC)JR3=>gM@i=RTxihfdUZO9LWe`*Jq^wXx8OoS0&5mG3 z(km*8w&2`Q)x1tcG^Le%HDrZkA##tt1!prTbKWzrx|ftEjmc@+cI;jZD5O*a0z)Jw z)Pk_QK(KJZn|xm%pC6|YI2fX*GFWw>E03`DUk^jc6?ZR@*b}OkpWdd{Xhku)SBZrZ z^t}lO=%IaFbFKe((mqi5#07F;LB_t+W;_|IP^$6Wk2Lz-`|PQAKY*4Y4o_yzT7A5xjddGXgGfK zYJcFL-FHA|Q4r^<7z-sZe0Y%hS6pVhwTu8M?(0P9p*}B?V;Hy#-iW)A8E-RSLzg+Dqh8Y@t#aiaq>TvqAK+wWU=- z(Jh}YF{v8{ugZEWt|u(jeu;B!R_~32=rq<14q{!ax*ptd=8p|8T3&lKX)Fv` z%9AP(1_qhE4%1BB*cxjy_ILV}wt;!F(owo{DNY2E$v!(!ef|);@H7(tLy`0D@Y)LL zNb^aOL_<3~ad=~R3_s`NWQy-9M=>9de~Uu&OydGv-c?w$kB z20(A23(pusj6~kQkA?Ul*V@AyuRh2gEg<~T;a2H&XTW-5jo`fSOUi~b57}XPm96bv7TZl4+FgOvD%lnxLb*+ z2Qlycj}1TATBal9z&gTB`8dzBPz7`N69g_Z2dDkQ6!D1qdJ%M}W0AZOvyt;0^`7++ ztH@DTes->;5=oUZA@4LB0rj~08Z+Dl7Z<%Yb{@}y!Tu+eu_=5US=%RILqPW`ZnYJf#L zk@ghshs@xsc5QDUG@QKMsNy}3H;$%!BLpR;oKyo}IfN%OA;0+aJO^|dKC|~FoLqcm z&Af8IJuGuW%p`1B1;7f#5?u^5G7^RIX;iz#z>-a{`=BVM9i%fi*;7=w|6T_ zvbW?yJa}D;AmRFVq*Yi zVIAxf76sbIJ^lxt++FvB%5L4}L&>UnQqdB1Ml==r4?d1-ZGLUo=o>jdm<2&s`}2&= zP$n8-lxb5!Db6Wj&_YinVPOFL8WYlqrJDy^WE!H8gMVj%|C3Bz)hj0v_Y=~ZhWhx9 zZrAQ`9JO_>Azu*AZg(Tdi1}c>#_*5OFv=o3i5~crQc1Jsb~Z+C!`8<*Q( zcwE0WDNUh`j%tHsBwZ^43t%+5Le?V9_ROys1a^{3MU%7@zhBHV?i!n>+*}2sC~7*F zWhl2$XS+GmEAh90>}s85>yy#NLXDV)k<$SyxPr%?L+&wiWik~Q?}~%)Ly>w%#z2m2 zx8gvFDB4y8kKk`r+syo_+lSa+tN&N@QE7XFLl-q8cYLLCSaboeqsgV5toVCtWB=u< z21d!*Pr^&hxt{~T^qzuHV_GpS)a?46M3yN=t;$N!M$m!f(X9L=UpGFh18!7Hke@gB zFl-+FT%%M?J)I>$vYv#yH+&fM`Gm-taSF;bMPtCQR&Ab#es~4MOCelF)n9_N-a@yc ze!v1ZFS`vqkICnBhwbOly1;v_*6463{%({8)2|l3J7x-G!@go_7f6L> zcKlPFyQ8i8vr!^)jUdqt__3ZIM4QN@uHhkIlBKCwQJI_sfrIP3Gx=-Y9~ZHg^q4DC zw~MYl3vl05fi|x&^2ayB0df8OHxe5@kJ7F5Qf?rhR=AMh9710ncm-J4c&=G?UwWN1 zA1bYc=rQGgIc5iaLj#dM?z%r7JD&p08zLE2gr?BbcptdEy-jb|#*x6Kl; zbtjv_yZ>brA0c>;#!1A_)#7~}uQ&o#(DXb$N_jTS?x$sFNR;5=ne^48{kjnoJKDo)Fh zPpBR%cN_`&dY9`FnE-%?ZQT@u;DH=atlp?Z!Cj8*8P*e+g6%AJow(9#Zr`aE;#1mh zdtJiR;fS6#5myP7qlDAthf*CTQvFeTiN63Ea)dJ?4Ge$M0-S_7c}{02`f^`YC?xHA z%WoUB(&9X%{2}(Cqn}#tM$g3C(3mD>{3^sZDd{@x$5yuCaTKCK^;~3vE z*bRI7sB40zX!Jf^h{qn@+`QE)<#oC8RI?>MO6t<4}X09WU|7;AI zz$^FyfcZ5qH<)*liG=hOG$%qM0uC6k>0X6)VFY#6Y{VbDRs5#_2Y@<_o>iWMdu)YH+4sdWi?va`b_< z)??X6$}ZP~>acRT!tua|={59hckau7CI~TB(w}=auj@NKOZ3@)ffA8piXwl(Rhv_xvI3-^9`tMccQkkweS1Lj+|-d8%(ekoI%*kz zdiTL~(4ZTuO=|E-(*&~aTE)We8xyPi1b;bnbk+F7BLoc9dX!EojX#FaetQ=_W4a2x zFVbWk@`r1;1*X6n&o|`l@y*VAZb)<5@R-LT?z8%C-CWjl$}JFzh%bO*B^&T0d=mqf zL;DzbINB<+0kLX)Oq#-nD0fk4{%4_h$g9w1gz>GOeE>1Ru{?oU7b6GC^Q^bCFBQdP z8*d%6&Te^?-6ye7XG=mOv>Zjm9uK}EIAa58kHYPX+;6MGU`G{YlTN$Fo81w^?QOCM zwhPs?K4%>y?ZWLxlHXqc0-VKYFL_4Vx3`6g!uJw_hQ??A8pjK-T&uvcNJJFb-r>YV z_9d;F{;LLFRMF$0tFI*ef;#{`q9w}yls`oKum)0I)2;JnpAKIM9zDHA*;!@b2vESY=lhu{vu^fcl-)xu9*tnb)K zdx6)8JxB59V|r0QMnZuHJ8uH|Hp!ynrMi@so|+n%a>sm5l~LYG2h-^{y}h10U?!-O zJYa^tVFLktVBp}e351l<5xAfr5Vs7V+4{C1m!2P&C008A0_aRrl~*7&%9#xQtu1aN zej2QVRJdq)@Gy-g7h(oHiUNcrY!n6iI0|0I`Iq4XQ2A6b+wK=KGNWf)S~(JWo}zWT zqqy$Bm-g+Oyr^)jnm764J&Yz*ryLYdE-4sre?L`i4y%oQ{ycuo&HY?yc^8+C@#bw% zb4xAex#LHVtnbu&c=x3SLR>f7%Yj$pnxvnu-M^lRE4%Rbt>5ESDCSinX2+tNjwuVZ z?9i{_(ZKnWrvmc0iaKw1pzD|$H2g}UKF8HyO#TiE> z#XA@-Q0;Gl)5AbAtYTLlN$U{HNA-1~&94#sZ^qZa%7x6X^8fHgDYap9sSvD;x9vFd ze#9dAVH*Fi8=|kr{VPCM#)wTzs()Sq>;!8%a1A&eNh@{fk2M7&n+Ozi9&h{-KVaolchX)-~W{tk}wCg*tGdXkuhkLHhkeQ8YXyzaUT0b(>oN9 znL}3j*>ers!2h7ej)CCb)SBEFMOXAN0t&Cd7RWV@zZQrdoP8DA0GI7v&w`tNfM)cI z$7MV6Lkm}ItDXpv;GU*ojRMIN0j>6&c1HYbKp8Y)S{;)BMfk`eY>y&>zyDr198G5waS%6gPYa ziy9Ux=%1uBM?q`>6Rj2;F=mDR*Xg1G_@b5#sA->@u&-^n#|?o$zzMAUy0$~Z_b~w& zczvI(Fr*K}XVytHxjT!IR(#=1xN({)L%*jVFE1DT zeLTqkJYF}0_pEnsWCd8g`j1X!PnzCv1a!D!QPFfc0|BT~Ec`nT|2U)26R^7w=ub0!e3=;23%_rjRPu}qQ|oh_=&kV5zwOwTN|9-OZe02nqT|+)*TXO zy%6Z>Shqe!+q>wT8xNk&U!%Sv+#WXu|Mm?mT_L=EuwL&UMG_qoR9T=I!fz)?k_AxlCz# z8t>dpygV_{(~1&W*&j)0rlkm1P*7R!UAal$?Xdp2z_t)~O~Z{`QWRdZ;dZhk;G)8v zUA~bO5&nxR%4<4?#7+r<`|nj8E80YA0`@zz%w*jHia9U7K^+;hv?L_={G0uoZ2SP z`7oikn&q|ntl=V+V4~V~g0$DrSSz`voi}eEutv0ZJY`Y$e;C=_Yu2j{G?5h++_vJ;*{-d+P!|{iV72bmlKwg$tmd5u|xf!)^1?*Im5Tnk8OqbWPpFG$S+Z$iS@-36N)dp8*H%x3Y@VNQ)QH;KE&XHm*wvLs z4lWBD?q&JhG}e-iS-BlA(o#fe&kyiilM6vm(5^^&+^74vNr(|r3v(nVPR*pg3 z05}R7g;)Qy(t%@uv-DNu^_Z7X_s@_AKwOPq;szPy2*e-1Bp_OBcpuCi5K zFV8}ZLw8FvP(}dU(x|B6svW|IGyYyUA|m3$i@ld{6XN;3-&jF+ewlBX1az5TmEGSR zlb6B3V6NQNFi7M0Ls&7lK5ireVA-;bx$z3@ghTmRBgz!GIU@2Znt>!o_x^> z))j!##Kc(1ReQVBk5KD`y5svo&0aPg5BHCQ*)n|^a);YbeoXpa)gN&l*)s7eh6p-z zI#p{~!9sIN3QXf0l3(0T{w{D%!UPRT99n_nZz~PU1UQLA|9erY!41%6SFAQM?l8tr zRdQE!pEgxyKIE282t;H3dFiLfKsY1E&e#gn2mqn*(koRuutOSkDH=JcUWC%f&~UfV0{( zM^!d_ukl0%6~57io@Fx7ir#kp18|7F0}ipgzF;j_oZ&}b1>!qdOCE(?2ZEaw$dT<; zJ3Lmn*Q~3`8XzN;?vpwg-nsv(%H|lL^|hW+ga{1D6l}CwZa|&nWg!`e4nCSGsmIpS z$itxtodV47kXWO|^7=m(BR@Mqr$@D7-iqjChqJ8*R+CL4@wYe@)~f+M?@pKOnu9WN z*3P9v0;Ff(EfS--=omCiA-)gB;x^1aj_q!!M)}7xoE$%D4|uX#;#L$=eMlA<$B_St zf-y?|hR3azDtFJDOu)6EVX~k{Jp83QFx-)R#h4}+=n5p8E;nl`W}$r*$2wx2_VZ>G=RmxU`r3y7adDzHty=JPEc5MA7ZYT!FgY} zQDAp@s*5?%#Xgh|^a>LV#x7X%ixxKKhk<)#p~oB*f55djyzC z7X!PUlGK5h7yCwqhl?v%8gK*$)9gNcLtu}5NT>KL5gw-BDVbRd9i01{j#BOQZAOr1 zbsv}9>DhhFC;9o=E0gK);j}H8T3y(9!z@d<#R?EBa47hAzh$~4RD>vRRyuC=P5@aa zOCAkv_FiY9{6j}2o9}i%&f)wyK5G@f$aZ!6PsH6YOj?x43p62(#+K{ZrRnT|p~F8m z4wJ~Sgpq3tK=K=A*U&+$CI2lc44Au3IgbgIAWs1BlOh1jAVpLWW1`%0awk?9aW|=C z2aLlvrPyUN`H5K-=F4<>zOFuUs|V{70!M~CTKDl(vh!Yrqv9V$=Q8f9G=e*B^*CWD(8vtqS3wi<7D%ccIpVbVF09P z`Mgy!{u$b&6@x`|2(>-IakGrk`dMlQe$w>R2EOyk1XIU%4nl*Bg13$*=_1j;k0qe8 z>%)G~y%1zKtYMq$3}*R#1^X#RW3H#l%1k>qC~pvA|6ibWbXe6DLX}Mz$)WYZZbyq@ z)YO9Zvn7rXeibZ+46RF>a#VpZfK|U*Mp&&MWlDMlBEFmfIM8Ph&wrU+BtCRBe<;Fl zMcWgC|~y6hQf52-d39S6HnjiVGEElX|atl1i2fo>toNK-(GW|mE232Y(zx9 z|A^11kt9aa6M4AWl8L29nnS=_DMGaYD#MRVOb>SjkP_l^5$acjo>igyh3c8WN-AF6$fl2GdAo4J*5a0W<~2!!8)C#-qdwD@MUw>?gKOv>22KaCs^r))&HQrFSQkJ9Ft>|Lvi!|f}gX^S}zvsFF|=r7Xi`(19kt9xr*mTvIOey`i#QHDdm%a^Qdf#+DI6h}RVz zGfNE5eA?=bzUDyc-RNl8%k;|piuO@)&F41b?)cDNS~9=ZKa<4s{4doaM+HxYNb5@V z$ihWZp6tkK&gTU*l}g^5;pJd$~4)2dl?&(*k9Uw?RDR*J9kRA zg=Xm0+k~HXVbRN$eQb8KD~n5LO8*7?yJGyYx&%Gl?=k)4*m16~38-5r0pXloO^sob zpg(PdSzT?#ifGY(s$x4a1iJU;Pk=EysX3@n!j#&RV&fTshG;JYUkCza@hc&JT4m5_ zHSv_qKG(Knd)kDHob!-MYPOHQO~2JP_W%B!Xl^ce$C0~|&+pkA2H4Y}I^BMFM|1Ys z<6j8k-@I*|tK8~wv+2L9oM+#+b)*nrKB=;}^QV@724-&0zjDx&C`x0puYpp(xiJY>WLb1~netsCxQUY$QV&sn! ztT*CcTb0j#rvuw3`kjLC#}!l90(_rb>1KfJ@zt|-LkTIXC^7q{zU!MacEFc$1=ywD zMB?9J{i?BeqADMH0Xm2DJDZV~nVuSU75T6BssN8wEI(Jw?)}xYsv;yR>^mE=(4*0! z42u22!KSh^-d}`@e{#{;H2Wmo#B{(-p*3C_x!jmO_@hL&Wb5~5Afy@F@TI+YbYB`z zbRrt$8W7yp%sAHl9-H0Nq!Xe%oZT5o8gA6{t+JXgieO(GruJ$Ub~K+w!v{edM1xep1^N*FS!cOSE>>i^n;V@tm|b2%Ro^g}5V@k*E5K0fkGgHen8 zqeE}5J;BM*3G7H;0L@{35PxXDALq6cg|^cI?Zyuc?ZP65J910gd+gF^qSLRN0&et3 za!68$D>yD~h2L1n&=y?So6x4ZJCbp%Ud|X?_HhnJgKNI(+JhjsghTC(@P)T=l}P0F z!trv|h$&(=iv>^L0Qx72WkU0Tbi`w84X=~0%57parhCzOfm47CwmSx$@R~Y5Ysi@U z(WnPX2rO@pNfw+uw?iEcAY+x%rp+Y2%iQWdXeRo*)GS?YGkpp4angV58|u%VTJHry zuHPuFdf(H&_`Rf_{sDbt<<#%gpz5$j5HUh&_(n8L}ry=Sb1W)S6aWejqw18)-$A{wXpqMmPwB;{TuP zEq%Z??l`?=mXhWnz5lKMv`FYa7$x5oZozpwKdFp7Cu;LlJPh+BkL!KX`1gN{_JI4KMxhiHYKOHLQMvo5BYWz5kSb7U4p z%s0wu!hmxq>L*Yz^RcI34LTDLR28L^OCANb=hgX-zD)>-Ekh}0jN-U-k4jF z$;@4QgFmLQU7UCYS{cGHy!u?@uLfA>@aTR2DkDkDr}IvvMQ3dp|=atIyH;4$=Mi)}l+Ng7GMW~o5 znaih^j2tK}3|7Ce)vf>5gGm22ExvQHq8d~&$c?stzfk~*{>cH`?2%Y(GLNixiX+aUuCEhH14~7L$FpOKt-DLz%U8x_xK9`z&9Nw7(;DM@w`$3(6BsTlcl1R$KCRr3q@C&z zuR68z$nBZ*4Fsm{U9$Hc%O2?SK&G7Xb=HX)ZmaSxLm=PP&9`V9Ii#VXS|xGN+-X4% zxf$p=d~+j=7k`;4(Tn_Q7TgoodI^@Mz|pw6&)K{>;1oyCP#z_$qZ}!@nLmfFhk%B~ z`F6(yXxQZ3!g^T91l#nek6fIHDE(_Hp>zFyPz$*nE-GC4CT%Ep6Ds=$rBx45Xxt-XUx{ zTGEfgV=Pn~*gj7)gksuF8aqPQ(|9-s1(QqXz-kerFSmB5WUCn(rD*j&5p~V(r(#?o z;O^75mzZCQx3dy_Wn+d-fUsERV+Nqr!qv%WMrF7G>EY^N=h|ng;zg8Ev#yksg8TQd zDM?hb7!jQ9?Zr@Nj5l;X=j(ZVPseL~rOela<6i$A5o+5=z+3Y>NZ9XSrP&hD3;$7I>dUXchv(9ao( zcX;KO>c(`F`pnM{tqG7GoPZTCg*g9@vcC?Ca{a=FVHrVE8EWX3ZV;sz8cFE}0Vzc~ zhZazf5~aICq`Nz$yCkH$hZ^d;+40+ZzsK`E@A3ZQ!NI^d+}Cxjb*^)r*STnAWD9PX z4fv4Z`Y}zMenUD$b234*E1fhSUz2la=BahlVN|jBH^ZB*k1-Kzu|}-lBr|=Rib__K zIed_qS`5q0qs{91hhu+77s4lt)P}%liI}xOlNYQ@$r%7QM-tAR>TF-X-cCA@V$ozh z)pqU_e-E+##Sei4@mfzhH_A6f3sN?5213D{;Z6&~qS&kiDeKEF>OXXw-raf`zD$^h)t8zEX=O=0 z2sy+K34B<$(uwE1Jz0LE^jmcD2f@@Ob*XksZ@&G?t#mI!XliH2+hl^>F-{Fhc;m#? zcB$$32{J$spXAY38hTJ9%jV#nCZQpDaU&_yO+fj+$vwgt07}$9BYR(M2E-@+yGQ4_zHfjIegzon9N7xjbM~O|%Vr8Qk7k!!CGP;ZfQ_QC<58L<7cQ;LBkb$*&TOAOzr=ICATc9@DIdI@|qf z^jFxJMXDlK=x`}g6L1qb-uv!mD(%-hEoH{{FE%t_g3t3_m~_+|W=K22j5f@Xs@)la z0So(AiO;cRTUju5bl%}JO{IxF+#b&ld4_+{MOutm2&Fg84S5wX_QQbaxpmF>yHL^> zAAxzHxcThJ>O}+|?9jb^9J$noZ-Zj^=FV}-X#?47{`LYWne()%dR1IRIgyoVGBQBe zrg~|fel%8#MJ}LCVyC{Pim=>|9Xmr#9J0D(HmK>2?tAYbfd{MgLalu#Ib>+-M#QOc z`p9v0$9Z$uHGoUi_`zjngk`Jfi9Zv4&Iu7L3Jr5}VwvfqRpqOUd`?TmvOLGjNo!8$ z@t(-G-iBPr&=j;pW&C*|Wtzu+;}m#^11#;rpmg1%RaMd{73iD7R@#hs>uM6Rt~3Xu zW~bnN8}RAX_{%2QtfLn=0ASLoJL*ad$eyC1m?)1v1LmrPH6gYEFD_@*ba9m04>^EK z+DGS;p+H0vKX{Z;5Pf5B86~H7YTv?s<7IN{`jyi zXdZ0SJl{wa77z%>TRz`#xm z$T&+kWTe&_a;90Ns-fF_yEC+?QPEurcr3TgdRlQT@fulNbtsXsI`D?1xn~;zms0}y znrl4MU!fd7LHgCHPhTe;&8!vO>bP;e6}f1Xs;=YGP107zdmdZZdsn?_RR4xMNhcOp zbAG0*zKQ6Q)HXwhbDbEcfX{7`7IBkgLsDF^d)4M3WH6fUy#`t{bbqdNzWsaE=M~!O ze5WlwX24~$o1K)*Ro!#uq>6_%wA$g?K}{;ug1wZ-x9qKm#aZeyNi)s26ZQvyN+E01 z-b|9z;2f&)nxj_?C`g`Jvu0kvewBC^YLt}(&}~$9 zKVCN=SnkkYz5GrV!DgFSA*G!?#WqxMF%H|yKV#S!aZ_p-^iDT+s6us?LPa{g-msPO za;kt7{twSQ@EezT078tvFtMiAr;YP`!gro}Z)f4=2*7P3aM0>|VR(;K=I*wA!s5%iP+}eo z(;vn1iugNHz$sI_yQzMqyP;V>FUTa5U5e{aUX=#u(8dq;kfNwfACZW9ld%zWJ)+%P z@UCxuW?pALplci~WZN@2ty4anE&sxbEXvv7=Bk-|i=B^oF`VDxj9?@05R4mmC1L^z zx)Myi{%HX?57}Go+GcZhG)QWvn;Vb|Ciek@egb0bUyTQC?uZ}~tyhloZ3@$|4o`5b zMMOJcQlC8ZYe7v_fHaxK+5YOB5_~?mBHfs)oSKeua+jk~uopJzunaU>(P$?II;IUR zRtKV40NKpY)Q&IGO(##vyX!DypyHDWF7ZvNtd0;qt9d#|^2#vpyWnJ3sbOUi=iA=! z=7{ydWLj77QKg_NE>G)(ju`NOu+; z?Bm-t?cvUtja;Q00p^aAIq6)yqmQIEUuY1(eHGbAV3709kGf5Q7(rK??*{eZ_=12d z@EpqmdrPqI0=sR=QiE(7Fg8&9ccK>Bez=^9O9h($XLKYhfYJ{nIMi271Im&H(|5P6 z$A_^IKF^k7i}qqP#tc&&}2 zWlV^7xh3B$nWOQ@3m?kEwg)!393t6roiDkbov$3Ym%nc&j1xRh-FWKrvYaTDpU-}d zJ~}o&S=gh?G~KV5+ieM%XTyH^HZHlqU~Z8$qhCH_*O4aKwZ1pD7;4rV6T5e7(Ym;9 za-HHRJog0B&OmP%1@bh~-@{n7Un0a|k09*g?Ec;Rljc{ubuC$e$gfK3q@`=BF0ZA7 z{MQJa!751!9e|W0T=}ZeT_3 z&;*ehPy@)BF#ZQD(0KeTafcT<0uHb1CsTa}%jQlE4q$#Dl%TPxA3E~aUG`z#*GC?R ztAiFFWlRmIC~#5x@@guCqbeG5c={Z19NU=w!mPH4@jaqkzAQMvv$C6vkO|2yt2Zow zbGW}_$~_CQR-jZ+BkO=B3H1SH7YfAL1%;;uC1pDl++JYu<~~0OIiZ;O^M)_S3w|2CgCvVh2M#Qc=Y5O{T#ZTf6^& zg-%>Vi(N#)_s^X}fU*=fp_q)hXNAvsTkDzQxw<0!b(z4y*nSz@9MW_Ha5O6si(fUm33x#;sZ7Zu+_r5;Me z@1m0aMlEgcF#1@1Jg#Ap9T04=58G^4yFk!pZaQz~qx5qON~@R_;Nk-N54n0)({fJz zJ=qp$3T*pjvky4y9-yY?RP?-u-e{GHKh&J z3MoP_H&w%#oQ(O8ZwlW3BJ5~ONvN%hbY7@vh+cS!c*_ipgTw;8XRnw|r z6U+Xf8gIx^z{M}ic@6D`=N|7u7Zz*3QEcjGyp%l1+GC2QpIiBUPMgbVt(%dROH~Jq z+Z@jsc*w0&Y-l@tdvkTls$L1*6ZhO(ujn#K!X>XLaXT4y&Jx09|iH?iqG z578J#ZzcSgLBAohgu?Myo3%3E-ZQsHL6z|dNJi4Pw*_{dmQBMCr}xcWZFL5&eBJ7(?r=1UhN%$o|?H%`axx(99hSg9E?i{&eRGdrgLj62N&{ z%&n$R;}067_Z^vzWp@bpgMB3aBLS<3WwQwmhRgP7`mbc)wF-7m>V(|4qe}2Sr;ox9 zm$n_L)>ivsBY@iM?X@AE>;iQ3_yFpKfM=L?x3LUkXFX2On&|v_i@cCNzQVx~az8tT zrVvtoG!0ne|4f!HGN|9?c?U@Uw*d824l0Ekbf2#!W&M3(l=14H5)x*}Z5W&rp`d-3`&QQY@9;ZK`|~gARqXf5fu) zaV-KYTe`xD6*q=bt0mPXHxYnCvy53^bS5x9t1mg>;_Cb>xGxpx7Y!zf$P2pcriCRw z9|l?_Omvla;9^B+l zW(YeJ?`QV7W~AHc}=}NyhOlk)YQOw2J|v2Ox7@JLt6YEUWK8k z1M?fM;c_fUwgZJq*0A;e)ewQVZGI0?Hvw@D zFLHf2H+AGw@Lxxnq8&^OTB6X(Eo`V?6NYb^M(EJr?bq9GZKUSvb?KmdTybyxJ~vKe z4xCdU5{BwlHR!QIJ^H7^J`xV!Aa)cI_#LIy4@6epc~YmHOLdFs%PB~r4v6F4AC({- zko)m!v{45zB_u|#zQbB(gbN(R4XQZKWh_rk*|{7*!xkUPsS5LOCmx9KM&JxS`z9cNxj1Ot!`{ zpM;@NmpYm~B%6yj`D(C@_l^D!v`uF&GFL1RFbi1BM^cvx7||zS9C#}*(==u=DBJET z_5wnzhJpkEp5Yg2sm>FDyqX$rb-*GUxCP2h!1xME62EoUpgs zOnQw3MmzTka8)&~wvXw9RW_eINcfy}|IHeK!UV$K4Z~-2-_>hr)&>%l%>})$<2d8$ zqD5}qGEDchYElT3ssv}ph+$E0@P~Q6k=ix{8+snmVXrJST=k0Hv8Dly{87O2-(Ory zVV4gWkz&fMS4GBV)RY92Q{?LWe&!#1MP8ZYz?pb)6bD+E{!Ux>xhx6?kP}j;MU+Lp zoLL9Bzp`r;!GFE}04)m{0Pb1H&g1C++oWiIfJpRY^{1(J4ptU9Q)G;5qxp!kTpe7T z$f(Q)m03GI8vHZ2+`6~2U~2PlGSzbE7+wARNYpGr8$6uYX*b7(w#k<3yV4ScD=T0_ zg$oqmlEO%HGCdTXLqjD z-=(X2tjWt`Yd9Ub4z|Xe%;zr79@7)W#IyD@Iq`VCPlh#Nql{Urh~|2KUTQE^RG9+^ zhgvg{XuiH8lHZy5aU`q-%Kq1y2HGH!Uwr?-k;qKBO&LJz+ROAK*}F(eK4e$Qn`qthEwo2{H`u zV_{`)ev%B*OaJ%*w7H!2=PrYyBR&+OPX{mY@gl<~`;$KAX!>Q1-BOeP36Ml^-Mg4n zB;Jxu$qI2~Az#UkTWzYS%0i0~9pZqUWr6BgqD>C$bVqHyKVCx}+6`Pn9|5wr)l!>} z)y7~l(%NG>E@XK6FrIs+8O_J($8Y}k(1Cz~#)I@nSm6AoINvG8_pPoQyYSzyKk$2f zuhS=b+w<`6P5UJYxs5H&V&?=?i4D$S;z@zRDt&=i+I79HOla#S&YKvx}(!+0x{JFlWG~? zO|mY}Q&r zEzsq!Xf$L^OfpJDeArbxGw0p_gjRrGWZT0hku)I=VpMzJ7O$tzyGd3^^j6+(s$|GQ zQ%TSzpp?sb#xx(%z%&2S3rnN_@oBm@(NL$@&@4WzeANHXhxw9lkAZn3C}yAh^=Yj9 zp-++F3hWkxJB+{_C>8Xh<289F1Ux>^nv{fq3<>R_!CVV<&87eS8`*$rB5HIxzGAPC z$Y;KMv#COrhHdp4fL7>~^d> z?k~k$KuIz0A3TYwNCjYQ?t_T}Eq`{}Y@RN0O4S5o*6~z!1DITFI3w@Snl=$CocbD> zhAC}h(!A%3A8@`{0WrhPGjb!@pPK;grZ3j35=f16i!9Qw{Tf=C$^4(hhsFUE^}u71 z{qw0I!>N}gT>kk9AftxFGFJGRIiY zcX_kqv~mz-fZ@}|0%~d&EX?Msh8O2sF!@}w3_?DNS^iw~ zx&l6gOLJV9I4ST}=~8ZDGoMhfuOeT=)3Cyg>0UoS^GVd=7JAoz)2^~;$`)D7pE&2` z^*gvqJI1;2_iGt_v5s=)hEO zbn%)wRq=<7{KV_V!eU}dYhGDE%|B8cFw=9wgilTVkiix{&A_^QUsv+9xh0;?9c?qr zSn-s?$nklt;Q4l9JEQBqP*hx;tOTM4V);~t6zD5H>CFQe5-2nkcU*$Qh5etm=n(MJ_QAIF)?#@(d(F-t3ivRlZ!LN&0p37WWRs9{ zVaXS01v|S%hK+LV3*H0m+jV9+L{H#!(n>Fp8p$2dHjVujrjjZXUqoVj@)c2iqhg~= z_W;Q&Kqf^CKSzE;<0mgp${@`gi*X)O9_2OLI`KMXk?5RH!$DvAf=%P`%57rRL9-zq z2#E^(|7G!hU|M`I{_y`etvkpjm%>!?lh$zQyT~Xp?R1OtmGL3Vi83jXPw?pdo4i+% z8QcS*lua4gn0IIKB5^%Hp@dm*PPYj-)jRPSH=E(abDQO4bjpta-c+0LpLm8=qq)k; zmza=rOu|8(E)O$Kl+_w`hP9tszW1R_tFsNnvLPRu1oU|0%im-J_Zi2$TN#hq+*u?I zjcXk?vaeAvMmj@+opv{k1$_2@XpuNR82Z$3iP=jI1_qSUtal(e;x=yxX&LUXv!!h~ z)CvP*6|gM1WJMxBNxkcqq6FCs*<#`|i_1hj9hNe77k<@!3IxKDv${jAlw$sO(JzL* zA8~8?p>6uF#Q>&Qy^*vG$pY?kn}&R>!yAL&B0filW~!M?1wXtxpI)F1l~bf(I44wt zBz^ET0&0LOsi(MTI6_jI)?0eRp@>$>lcAr{B-SMQK1~q(-?#o(*!!Zb3wmF$k!hs< z+-bNbz@chGMe_Q;B%ly8ASDR>KT^Ud$WPlFdzh{F#N#jsN%;DS)#>bM{($LFpHt#w zVTNsv=hGYVx@NY(9so$Ct2|shWd4Mbo9yulsL4xyQLWt`+Kr>Tq}*sR0f{mYNXxk)HgMP-ic-+Pa0NI zQ0dC8XUd4JE)srKcoPgJO*@f`&vae=@kmAI<7o1&UW&$O)*hi-@RkUqq z!u}hnA#71JWN{!PKrQnto_|pNR%yJLp|7FIDKl=%WQpSA*U9G8d3{2MfxTX*=5BYh zgm5&nc&izNs-o{>b$M&5fb0gPaz`VA;qM)2{Zwe$x!#z5}Eo=S?MhGnO8)YqQx{;9C538fwLr-ho`{ zTa#relF{66TKtz7_&Myts6B_-87agWA}*Z)C?_rk9`biFVej%yqPItfDCM9&JIUu` z1LF9DHe-kh^;%uUtqp7g=;C&y#be{fNa%^(FA;a2I55QlulRx2;mhw+oAmBYuC7AS zj06@PTNIEB?~8@kR+ot==WP34uOgmbFDk?{qD%vVAIwmX$7F1QzgfL0#_RD6UgAD3 z=-&!tyc$Sf348X?!x?M3j5jv>e9K?OpHT(vM?D5oW3*nm3A*Cd+cJ$PoE*$eyub-3 zFMGd8#-Atigx@UZzh_glHZVddwIX`5zOj)`jl_QICRSmEAB;PK0W;r4G#(E(1pv;B zn+gqBjn}fLZFD}7dr-W5x{`rX-UuNWw;Gmo(7*)4;kz4L$+z?Px|QROsGok!l#QJf z!_(TNKF606ZG6IgGMZ(7;HG_az=}v|hKg~y5N`EG_eB}7vX(k9D3Rsbw=YD6JpHk( z5%-P1&k8VDN;B;Qot3Sz`q?sEM7>&{DobgGDRbaN_W>?$OZm;#LU1)4xG%n(ezC)M?wMn|xT{wT|U zo0jZUzLe?WS8xN@9jnxA7s{LC--r{iZQ`a|>M{^RBf#}QmJ>fWI$*)2rUG;RiAh^_ z;aK3|oo62oO=%t>J=XaLhEP2Q|3Nn>Kg`@~2q|SvvR6W4`lsx;uY=y>1g)L>YAuqP zYvbHm!okMr?pnkCq)(6_Iq^tdXvB{Y>S=4p14uM?0U!Rx z(R1RsF*pLZ70LDTSjqn~?VhHe{eAo*XZ@q|<v*bGmu*{n3pbZdLM=kZJDfK(n2EWmL1JD4fMDvJA=y)s7X&nSI~w?5 zq_@w>`JG;+?1YH&`CbiP0-TG2#`h^m%qc1HrO4H5{JlBAJSj~gqZ!1`sZZ0ll$@^QXGnji`f|gc6UA% zCP$)Owb9)_lO9*4`h^ojNZo=0H=91C#!NxZ!(3Bqm?dBLB792bY?^K;>MA=MAAK;p zV@umx7Wu-WOi_xqK@ky%27rRovm{8p_BD0U`Mil%NJgieYG$HMHup%gxkAmpPZ%A_me9x5zTt2 zL#uG!E4t$dx{)iaPWhAAZ{_ zG}sxY6h!12?$SUK)T46|MMQ{7qRktr=rCF|zCU)PIkPbsKk+l1t%H|tGO#v>ad8d# zmyH_T{g%XCPaO7bPBt@t6nIHE*TAJ%md5`<^a9m!vF-ZgDR|cz-&$m7*8UMF{V!T0 z02e3`55=IAG$Q}b?s0Ul8%iYeeMOR|V~Sw|vr!t?)4iYz-U7{_6}sk?NJVRMZ?7=j zj>`x%OdG*~)8~8}$N&gfNdl??k4B%d<@`r@{? zH*_T91(_I-$>oQ5!{sg22g64WBOo41#@;$+*5z{fRO*L~Ov`*>`4uQY0n*6X|Qy&K3(Y$nicjI%%`)&RDwp_+A z<%QJe*r;nwHoa9G3+D{X%{{~yjq8Ecuv^+SqCek7>r0z$m5o%lW#rz?v1v0K>mMQlezqewG^!eg-VcU!)% zp~YDNQEI12QomAjGvKk4v_LwpMn6*A2|eIg7qEK*x<$((M)LBFaV)IS3I1+ioTQ6J zqUf9l_l#odSe(or8_j=KgvQ=Rr~jOie}O%8<>KHh&&WzDIsZ5Kg1970o+ z%5gl}LF<-CmM*?|w zDB3-P5U^-v3%MW5akV9A^ldFmO~sssbJOB7WNmynKcSuMu;AeI6};Z5_#LX7jGhjBv3FQU+sHMyr&iL^O8(hsrPY-m31~?x>bhs;JgN2K z^QmOTWZUQX&zW5ikve{&j&0ZNrwkmAnx10i77-A<7SUST?m6mRx`&(zn4ap6GNKM{ zZ|m-Qud+m2g6GBFQQ_DUdd=F;JD;|I5%puYUPWwkV=Zq3^P%oBc+Mw(7JdYvs1+g0>WzPG8hKEtUzK8J7p+0#;=B6oQN3~Re` zIBmbAlaC$o_e3~{T-CKWxApi%*}X2-GNdz~3@lCRQ3~z1mvbtZ>RbY9tWigDLsO1U z+eNulZ%%PUs@J6kvs%+vxDQbI099f&9Q7pqoC&zwT`LY1v7O{F92h0!0<A#L0B=crmqH4U`|HZ96!0%Q1iQkJ4 z1+HjYFSz-?pe1~xs>Q5T`nluT?Yy@W-;ytJywCx!W$5$>7YjeZaPxu>{#s9D`@tai zZGX+zRxg3E&JM}ZKLS@wm<$!#1=Sbeu9C>B9>(gHFsU^5qf87n8Ku1IZOeet?x(&R zRPq+a(US%g+o(SMqD?mAyy@X0?R>aXlxl|uc6Ub!Ec^T)uQ>LbZx5PpIk>YP`1RoY z$@n7^->1e_(Eo|w!3_i<mT&d*YmUdOOtIs4 zfuTUp%w=u2&Kc7FhABA)b(SInac9|ZLKYR>paBCj*0>YFo70^LZv8u8?I zI5U5Y^x@;3Mb@IT4Zg5w6vT+c)#y>?r^YfCW9$3dGc~w}y)N+Wp3gMff=&$;;Xdnd zD_FIUYw>er+_VsvcDA%T)2?T_e6}%Kj=RY47mME5^Rvr_5%9SKM~k7+^njbP1Ay9z zIRXkRvpnW?i*I_mXh@zff64?FtmK@&3#dFgpUB@+Asqg7>c_J~vrFw&uX<9itI|$i zO|&KuZVhl_zqb-MvacSFm&KQQO{{jn|sck|!BGNc>iMhD6$or4&=2%rG2GH8Z8Y-}b%X@3ZMf}TZy)Tl?a z^|*^?pTwt;UZ=x3#MPiy-+tHC%EEs1Tl2r6AU-aJ+2w;1rzUwE9YjP!X3q< zl>h^vI%f;5_K@gZMAA~DqZFZD0^ zlLZ&P)dH`L^=Wzozj)0&=Saps9{uRFUi&b2aAvUh{;|ZBbk&w%adqqZ zQ{R)sxZ~%O#@hMQ1!ChnWPYD0hsAEVRul;D*95S0!i-& zcuLs|plyaj`L8ZEv>%t#P&-2bnhMYd%vwzut4%(4BGe>7uFoDdgt^T)5WJavulHiC zG*gCbO@c-l1cbJuU8cc*D)c{k1^9pPnT1M}B2HhruzmELf1O?2_fJaYoQaziw2yA3 zv`@@8l%Yo1Fmf0?-i7;p4GO$&!cLH7sLUiJ;uUg{i^-d!u0fD+_m;EwdFNB63a{0z zSiaAIY*0DjwC{YBa`%&=w;T|K&HI!ZA2nGxnF369#pfLMh9KsoT4?%7_!Pe^{ycoEjyQb~XMfz5jg zpu+L?BJlRs@uQhY0krZ}TP%TlfhSoE5Gr3GtR_$yOwAb5uw#DFnuvizE@r&Ajgj|e zODDct!Osq{SD%n55mGeFx)QAoe)}{I_OsLaOE^CKvGaBV*S&ipZJTCF~Ou2R$VXRY@$jpgpSzQX# zobs{wx|$E7>#6TF^V~DS5&9$T)5S^Wjee#=#U8@Ny}9A~_!sq-j7r;iL`N#vrp*q& zheBS>Epo6wi}OJ=3}5ECXNIR6`g|uVws_c-_pM7RwV1hakBcd_h9&6fzPn8#1r8O} zUsx*v`wy&z$0h06^LMKj=o)d!x40Px(;#_$#3Ig@E)*Eu*2tKC1lxOSp}7jo3WoB& zb8PAdy0=WT6~@WenW1k#`1BHnSx@3aBRzYBt1-v#(ur*7_-P zF(S|O9Z!$1{kngtY8tyIuz3w#devc#{UXR~;nhZJ9P|Q82-T;WMJ5C@DUtpGYrA-p zG39K6W;l80Omrx4-ks-J&m)96^lEgpKi~DXsWuG0Lf>@v7Dgy|$i<3~7aEl(X|frt zPRM(Wbj<1SST6i9Y8c%_s`I^Vxow0m<@v!X;1+{lrTPy>RP_gZM2Sb5KjH5ckP`xB zud$xd{{Lz}u&c4m#7Bzzs^o85=;IX4BiDv>6g*^7fTF!oaL?*-J9FIJiyMhZKc zwJv_LHb{+4<&so4SY|)Qh5hfkc(ar(e)@`jSaazkKYvv&s9#Ucnsf)iyAxOG_}O&dMV@*ByDbRrH`m8WSOY~Dd^`qPyJ@EAqXP03O0ZNLES3+MraDT&X! z|DD3;;P->_QLJ?B!2DHKZ?r+G8$d0V0}KRGZS%Y7m>m9njTdCL6neKni}DZJ17tl} zilEY43cIWM_nTejY^%S^0@sQ~+*9v+7rfI`YyFBGt~>Jl-@K;5h0=0#S}R3?MxcI5peL2P*y^V?S49G@M1)h8=0lCUn_sEU3%e34O7Mc~pTpd2ix_ zg9$f}v*o2Pn}lGgKw56bv_GPu=5|@`)%q^2+_;I$cgJN)!j|-+kLA}5wy>fz$@9o1 z$}kG?tMmPgM~XH$lfNjx87Bt#-oE<=n3~{Yc9sJ|f-y!U;nW6RYY=c#O^gKen!0{Q ztdyIpp=Wo+@#{}1HtKv+Xq%FRQmU-=cOuuTVhRJnw@So0E}++@$c?BG zk&dz5p92pqlv3e6xgoiym#(pKwqYF&rqwQMs)*aZmlT&5tNDcWuP)^@%=iwZzx)8f z-Vc5p9eRDA)G1l3m$Q3^<&!<+VysaBFjzbSc)hRHA}oI$IhQhKBnde)r%kzTPdAy- zD#r8a5?GK?!j7ftnly#oMf6w)t2Ig3np&ShN9aL2ZLJ4dcNwwIHNV5ZuiuBIqqt`wW)}_MP6)t zJVOVh+c=-~cX9*RA_*%ELuSmT#vf9qcDqkM?I_>DT5lNK_nWut)TW9iR16BXJ)*_} z#^O_X+H{`xerEft1OEu}f8khyeMP#R`SWK_d7mBtqwPnl*b=eM0RPe)lTNu|U@V2z z1V(H&H^EQQmZ|S*sob9_=c89BJ^A%(0fVMdVC2Fkh9n##c#mr`kf(}V2Km2x+4x@0 z07ciC;I!2)|4?N+FYB@Fiq`6B0|0L3iT6(5zycPLFE1J$`UP!AgH2`BA)|$&<){0_ z0nm6tcda5#e;Y!`GVnjyWIe9-O~Ldob>v`HVOE+fb#-m1!1unL)49C;mACcYsU9p- z;JS2laF*MSeq}Zbq;$4@k2o94S^b!DlcVNm2Sdb8#{ut*J?e|R^0kA%cKrCkdc4!{ z25Gt7TG)s%dndyudSO5B{3YRVcXWZ|P^FKC`3efy$cx+1n%KLom{U|6$qQhKI>kRM zl!>e#c4pZ-bbnwqQF$;FQvXZHDrkd0l6`xllSC>|?177rk@@XmC79VDdP9FdQ(Oob z&qCpTyX4{DSp=%jUfgeIO|y^yHQzpqb}K4>=cMLXw{}*aol5u>%d4E!pe~Ma$QDO) zAQ63MeHU;rmr3>E8!ZtZoa&+-YOvNPZC1RCxz*#;%P~`dMR?POiLhT^aUgc8Dc2T_ zre}pCig68$YV7sMgWXZ{YQd%O`Vdx#?j0>r(=A^lFx#L?^yJfpSv#}p6~4FN}Q zrZ9Qj9-VA1%-#OWn`9Q_tVO4c$9ap6tstIBW`T;UV94hCVL3sTY!e_zo* zc0SA}&$CMcdVm*kC#xWN7y1SC4{tq614#0?fH;4xYFG$Uq<-E*T@5m-hXvyI71$rq zrE#cdF?M!FN59l*DRJz6UT1gPP_e98Bg@6i?%ls}JcE0a^LR%+l5Z9)i`hn;SVT+o z&wB&tbd=Sv;*jE1jU~ECU%wpH!MhSXJiM)U#@XHg(4hE<0b!RTH}vQO=X*$g#v9D- zjR0hh%1xlQUN4^rlvUQRlY~)@iMNP723^jp7n$zqX!`Q8h0r0_O`E9B6x$pH{EXc- zZ?@qR@yn^JFwWz$7Eim>K?;*Ipf4){^v$Wprgb=9U+6l=EXd?xhou3PLSq@+r zhuyKn@_HAdVcV8~VC<6Utr~u;N)~;`y`_=9fYV@sT04dhjxl2zfD%ZS`ZpRbJfs1& zrttAE9po3>^zQv2m}7(Y?Y-6}9=ylWJy!=OQE)$5QxiKr;JH4>uVnP6b=jL!N^KCG zlWkAgt|T4ySFSikGmUi4QHU36qYwA`bhfu(6~JU;{nAS|RY|&Le@k?k)_q$YZ7|qt zVCMA|@vip0ZmaYGFcMncp%gvBxn%BmokNz~1AbDof6Cu&R=#478Sv}0a(hfdx#{v<2ZpT!V1ELZQsWIb&X%<=*2~s0CxpesJLApygicQncv{Cd%$|ZN;l{(@_o5ITrb(TdMh?rHBZ@P@1uSga#puCa2cV3hK<9+6bU*ni^cN;I?jJ~tD`x&2wDPYtq+ouU! zH3R{g!P}f4GwByG*ySf0FzT;d20mYthBx%;5^}-1Kz=BV8X>fu z1#CCs_wyCrkG*cTu9)R0oR8j9K{iiC8bwVWkPFldF=}yqdzg%NGSiC~<8Y2N+tgeR z6AzT(&?4O1==~O(;&sW}Ym}CjqOYrKRJv+}Si9ob%w})Qcl$ZYo#OhF^tP%`&O1!t zaoz;&5DaboRD7~fS6bBTgx{dfNd>zKenJ!Zq_`IO^1e?KX4}+W;$6gjsO@!fDO2Iz z{+8eknU0;;UArQtvf~!ZWGDs z7F+{kDgLU7f}Vi31?Q(g*i$PXbJ0>ym~vA@FZ9m~+yE^6>Q4j#9dXb4{0i%LhK;Cul1WViZGj@Tb-?iYmm&EB= zOjI5F)>ier%RU@1`Be^BgJ@xO=Vr z^s_lMGb&2V7Zc3~uKjM4uRdWs+3J}*z=W{V2W|)zX?->3@|wZW$P2jsB`p9993$Ub ztnb@=7*Zu4n-84|rVPXWTq=-c*AldHsoiA4`%-BTp9x{#C-NljwLpSZHpiCV4BQ)JGZkh&t7o~rygZN3{DfzDv%Tgmbv@UeVZz!6 zToBRkvMR-UeO)yWzFqN7o^k1R-J0`0ySs&3{QMdXSfMRf`qJUsbjo+B)XHfD<~3g#8s+V1^kks{XEWwUG4EseL z_J0WPuYk;&6Ng63m+khPSV&V>3%HQY*Z3kY*NnHf?CQexN+RpsOEkYfC8-Kjbtv#6 zu2Ga@ztDu=yleUT8^wxqtr;GTOpqWGr)s!;xg$U`6V zu29aqIUYJb9G3geJL``p9ZR?0%FZcEk9Gck?7ekRT-~!S9NgVPaCZoV;O_3OAwX~o z?(PmDKyV8L4GzJb;1=8lcOBfm&F{@?r|!A+Ro(N~ty@J=Q?q9_?6p>}epdI>PcPmc z^vU53r1h!ye52@V>RXxPr%dq-X(Zx`mH!i(zx?l^dH#C{el%3wWHW~IyQ{+jAjt0? ztqJJA6n!}KVDp*`adwi?5(=!Qc>#*zC+L0_#`^0=s1&o^Q>Zk?df;;ZvT0!~dRV7l z;-2kLR;SLqRWs1m(g$zJMU%m(>>fM%aVC`G);>rW=t;*-i`EaAMw#oJJ%px$pu%}i2cEUocIn@ z1N=AK;?DqSzFPf<9R8cRDrSvbN}$*&ZU}dWTU5KUhr3U|)hk@1LI+gK9)el*Wn1D_eBQK@Xo@wq+U zqyWkNp=&n^X&7+TnmQA}+D++Tp#O#cXUSYf}Y zMzc5%`9%*e`TN805kh;w1jj||C#>q;>aTGmn=cU+b|11)N{f|8&N;O)_8y1II&IS{ z`uzAv89uA#%`BYGTgK4xp@T;{-&V6tzoCR}RB?Ka4uyzhu5rVkx$U+_F1cH*Kv{C? z*o!QfN)tk5ScOwH(gD(U5QZVeH^q0)ptzi*iK1LE@(%GxP~fOd+AxJLhw-S5FYB6M z%I&i~zm9$OOfEbA%hgaHyUB;*m#F7XI#4D-w;xyw*QFeFMicCD7k-Z_3j2RQs?wW~ z9>m!qB9tU}n$s?&3gKm|_15z*_Rs5r7BSFA8noO0)U^7;Y%PL;y>4PaO0qTUw=`*d z*14v;=!}|V2*UIB>?j9ZRH*k{hdF6V$>U+~I}D|*C|KL> zlfrL8Z<1ealZ@*6IDNm1(Kw$Ut8F5tPhbwEWVozC)>cV4S>9BX**IUNpYiC3!kp9< z@SRN>AYy%Gl?)H6l=^MWC;xq=z-Kj5AOlr}jl*J)fQf}=aWP=}**M`jX`u8SeRC)^ z65xijOr{I^#wY-a1fEw1xh0zAT3e#oG!XD+eD15r|2~~TKGz5aD@&04&W4dXV}(&e zwAdv`cfOUU{Q$o$Z{*VHa(7lBGJ<0hHtuARt$Wa`K8J98Fo>oZHLakXf5WGDF`Hyu zKI&zg%%TU{x*ggE759}BI(lz8HhF;%IcLlS&@}m7HdFTBWG!qWX*M(poVz#dRWkJH zW!)??8#Z(fU!;z9smJPbKY!WfrW3~&xEpb~$H4$A@a6hJymEWsZs+#Dj5T9`FE{G9 z+6SircMH{sU2<)DKNVVfN(EaRTC;zCy`1AJ!@$-PSuu8`MIbgLIVH^-G^|W$f z8+uPc3d8ejB?DcOGztZ-b7<3pPT}i^K~6_ihe4jjJ}cAa(YGj-t+d*Bn{>jNdx{C> zE9FlTO;KRIHhqG|Vk_p)(#`|-(moV1P|;^<=S~{9-s}^3J|}(mi66>0dp2*3^o$!G z7uSpzeJPQQZC4)&DvwF7TITkMO>wr|ABx{xc$W?&8u!JY-7Wke9O>G1D(nPP^p!aE z)>}+C`u7ozBLxT!|IVtiU;b~%9KFvKNbi15vBH}rAg~t$h4jx%;y-@;X~_W%VA@y6 z>@a^WruGD(8iXAt0t-YnNH(h1Z^ZAo)jK(6lvzX(W`|&CA<}sDl0cY^4g&S60K-9` z(7|HwldZzn8JIl!H^~%T;(qiJz2DCC{kI+m_Yxqvxvo6!AOJ8ZA|cZGZnPp^>{ef5#PPq~^E-#%Om*@Q;I!iq(IacQ{ z02E_0;SyTcFW6h}kM7fD^c|PEr|#EZE*)oJl2t1FUK&dOz3=?9F6SjsqNF7H?-C`c zC7`M_?jIG5{xw3RZ-E{_T5?40UbCYkOahLPeWrj|>Co|j$wob(v$#>tDP6{_($HyQ zB>kR`%nQpVfi7rZ#GIrM=SiK{6jf8@Qiq2jJ~LA({Dw>J=7R5s;bt|Ws>4=ZTTQXT zNa4K)@lwS=-T&q9NMxidr#FE2m}6&L%cRzDKBz;4O4F#8=zaa3uX>o>I&;%M@=%&h z^>NjCQ#0~dO;->9X>?ipg@l8b?>$7%(pz-BK;9lYjT(s@rU_iv2v2*4Bb9U!hr3!S zI+zG-x}&&NXjhw?rc%u{@tLjN)9gKbCMghME%my_Tm8-53vfei%d*{a+lXweZgus@ zul-#IE2}NLHe0v*-F5L;-B_Z1y_QVk`ns*tzV%p%a18KiZl9^UeVqqCzpXx}S09N_ z;2J7p>#}+)df5VXi!z$cE4RaV(aX5H^1vGM$W{2=f)+2-c&2@extM8ui!BeUAxeAw z5h`L)pi5+gDQtOY%bXF`^v(8U~WqDw$PREX)BmwgD>-27F8Of)-}YOJ?WE$=YO)> zl%1JyCn=9DBwl`$-DHc=#rSpjO%K+BX0oPsAaPSoLfB4mevm0?kjqwFt-kOhetw4B zfsi#yZ44Dh0hN`~ahW8})J^Ogo> zl)m3j$nmcZzt7i+wca?gQC8QFxGm**Z`E7+6RT-ru!h6^=?iWA&4P0_-{THFwy?e+ zc|bC??XL^kX!8<7V;#L;Gz2oU9DAAMukz$9wXhj@moyA!ntiuM*GFA2=9uv+$18}K zZ1sFU88uz^YnjY5bGtu;OKgPJB%%EDGG?gImzgWkT|gwbk7H8#65w@YkKRKdu8{T7 zm+Tt_LHwvJ+pz8^RW_Iw7@~d3YQJSBFW?mxiKf}#Ta8~IrVD^Lip9ec5^VXl14EBUqe)4~3U_yTK{*-v4Do%(nCt z)^uH~3hW%6r@KS}6;5Ox8{4OhmPNwE8H~-rAH5f5c75qCgwig&jtl9Rgpe|^fTmTw z0zI(0I{P3!I8Pm%{~Q5e|8Zl4xab5v5X;|}!~Gg}Bq-$7jM3jC`@9yF(_XZ}i5;Hz zwfs5c=tS_%BoN;H{Rv7@0nGG{wjInms-0|PYHyruMlN3fYS+EKcB{Vz@ve`ln!WFE zms>o|QW74AX3NTotqpC5nf7j8;sx+95Tq6&Em}KgT+-QmOAlZl+kZvna!Od>{xn3= z7e>hOF^tP($2hDntD$aVv%u|V7&IMwQx?qJ&Fvs@E zU-K($`%i3zRc`W95PMY6_Y%9urV`LEKyHXG z<7?h?A^dZ#0(eEp9zL%0VdZIAq`geH;Qw~!+r)<9|@sd!ljy&__B#Aa0R z)-l?g<-0UN??>n=m}QTbzn{kJGYr@kWDL=gcHO}9=U@Uh#P`|H!w7iXzRdM8!k0*9 zBBIgze`23MfRKNYyx$5`?&Zz;@}JNt3>A7g*>8DB199uZYhW^vnQ-#lbTJ2|)T+WJ zmf!PM%`IveC@1}#7^;Q(Cq4iWmwlEHvR74u!}_b{F0(i>+T6ZPN9zH1&jk^-3hXm2 zC>vz7a~A@B>fkfsxm{rKkj#;1-Tate1O<9M%3{g zz!gS$Ti*2#90NRFE(e4UTG;${tmo+O3#2^gVT_O-KXnkh!DWm{ma@*JP@8>zoOT9X ziG8u8R&|7(=gqZD+iZWsL{cX}rHuwqHDwk_F!@QUkj^z5R-Nq5P4@aVsJW!2i@7uT!sd7RFr;*PnMHqZN`p(ab`B*SBpmot%$jlSUxvX zBr{lai{p{!8Rl)tqbmFZ;{M?{bRa2{+Z?w!ntP=^!!fDZzQl{Ts^*3GEvIalU23po zOsV3~)zk~_o1Z{l^X;MCb4N^njGitly5{X>owY+=xY}ACRgQ(^Tl;qaZ>kzsW>WK zRH@H=R56Vy==S@tdKXRbqnQFgZ*fYQbnFS!erStRLpkgH<)s(n%YmK{WVVqEK~X|O zDXikbR}Q0YS$C-TRCO^2(Bv9Ic3(lXMal13<_Ac7-m?+y;O>w67EyQk)^Uij!Sc8~ z2sZc}B4RV^5k9UT-w3gOB>T&H(LEq5Pl!M}suHtU*U-_&w&jmV3LEeayL> z)-^QvMx}yib2f+GpGK7~31i&ZeveCG>i@yGw5zT_wceIPZS-dtrl&*sK0vgUJ@uT4 zCDH0)SaM#gd>W5!?7DRc0;bH&VqwyiuRE5+@Dr2aYpjtB0az$WMLa?BJHyr&NM$!WA8gG@_ zuNRY~3p$cZ-R;<}s^(LAscoxDePK_fitv4Uz&l!Lf?~iM4QYa?XS6Z-Fb_^$t*&Sd zW#63`WDGs5E>r}?mJzI;Jo3{LI{T_f{rs3jW|Z4)kJ&@&3T4Z4z`zx*gYrr^S4?`f zb1u;yJl49Z7Cyy6HK-mCOTdBaozCj>aj-eN_I;DwML-|`&+i- zaZYClpP3>7uT=N$V*Q5BRSeu8H-b`FjoSf{ zzV53w=G=PCgw8jOFd*g3BL`reSEbFp4@nt1nUF!`Xp_au(K?+_(K$95#sA0tXP+!2 z2S)V09`iZrMVMrJnd^FY9?8EFHYW}q;V>bC0juz_WF?yD)NR+GtlbR$%zTpz{d@km zBmaNQe@Y>unMhZ_fAt4DBF_t8K(h?ym*rdZ!c&EI8>$`ltQlOJra;%rbb8M@#mV5; z2Bx#*8~jau*{t-Q8-C>{dz(lnM4Yl4;`u51h&y)Kq4RTz5=8>y$x@XQn>ov7hLK$v zuX9QGJnUKeMUVNNa#QYCT~7%a!?MFsgdfQOsu2o2eJwCeHW99Tvf|xtuDm^i($@Z{-xgZrll0{x`+aS! zIMEmLN~h&1^k1=2y#)fLrPK(+U$`J`4cahGI32fHpyhRHuv|1Bm^+#+E zd&6>vm6?4I$h7xWqcONtkJye_A@@1gN zh#Xb?{UM>+Pu>rfboxRpS+OTZA(i+JT`{{fhkr z2!AnT?*8P43D&GI2sgU`es?|GUG=mPaF%xfoH-ECZ+@o%RHlB8k${&2>7gUSY%}k) zBTq&Lz1WI^b_yd%>F;MYumR)alPs#jq-R6XC4@W!wbA>J17JI}h`10xO_iU3+C5)w z0)Kps7Va$#V-Y&LUi6@2m)PXUECxP+4OJW#C z19uEg;K!?ab2RreJT-|5!!}`udx(ZDUxcIOMwDGPlYpUR?)E|{gfJY2&s7Wccdmu% z#8N}cwa4(Lu6J7~vn}hIpvp`QjQ%*fH`q+t#PtTnM3`EMV>~rE%GDfkqlIBb#3~Tp z5-fJ+zZzrb-y-egW%&tE$LtC>6vM-uHMf~xioGS~I(tMAtMOa@g#nm0?ko0t=*O;K zmK?TPXm^(nn*(Ya$&A{s_I}xsYRr<}LBU-bx2g>jAik{*13KXOlW&UrpS;HZJZr(TLR_Tx1L|JY z=NpKb^y#M?j=g=o|3+ntRI5LaA-qEs{Q)otFQ$>1JRG3S=5-0Ci@G>G3c5J2&=v9T z>=A!d*4y$rJiAfgz(~Saf(CEAU~ryCj-ycYp;c}Df;oz1rwMr*bls#MBDYLC#*B1> zh^t;00s}@2R;5&Y>>O(d_Rd9cCpKiWLu~djb@QHPpp^bh_@({^LglMWSykZ^7dE7= zzUHoFErG}l{af){aJcWgp3c-_xmdNHBy#%I2n=k4HXjsMM!^TG%bYpyESHQ333n29@W|JJ{g$f z`?;)`KY@9MJ>1J%Wuz`Otk-ZaF42oYqo`AU&vJ+ZU{Clzq5eNl>fZi_p zGSJw~iH`0IkUS}-c%x}eLZf`bFiR2wqH}r+yy~^dyf_XL*wnyz4TCZ}7K;Ye>)wIr zdM9rW_0`FDv1{z74-Ga88dD*50i1TrL8g<;3y7`|{O)PTzpByPOzS*3UtfiMKn2i= z{tzNZvhtVi^Oies;7}dM=coHO){iUH43qGqkvsk`L2&)NCjXjkoIhq;>GXU`CKIS> znF40J=YKWZ^19Ccz}}50=4-tK&s)#)=%Si;w5?S4{;l%k^(lp34p(Ye?8RZY$Za30 zc@xUZvVr8`EYxiUB1c*@g@ERF1zl8mP_|2coE3&Jg@|!|7eNSE0AjyXPYh(prm+Lj zsTBD0*4uURgNcd9{rTbw<&!ZCTD>6ZZS{g(cgi@~JDO$umP3;KT2(H1lo~zsm*jdV zRD?)ad?2O1Fa`$}={ZAFu+y!!Jv|1)T^;SrF|SJ}P)l}rytp)g}#zRJBE5d+I=fDV^^w0l0Ea7hU$&P7*Fe}SX>}VwvZ`80I%ZoE# z`W}0&HyTMAlcwY93ObI>R7NU;2gPLY3rf|8LD=2NLRZW4+l&3zHhb6&K3zv*?LTRw z*gDmP6!9$Ed>+UE0kqtv$H&L-fMR2V<2JLKySs4otG8s~htRg|n>8Bc_dUDcht_WR zJulnSxvTv?Lq#K#k;A<=;W9Xa`iIv|5jue{+7<)63Yr#s<(Uacj-5N$E9D=c>^VB# z4b6AMpKa1OaN-~;%4JCf|2Y8kq%_;|m>hf}y>187w!%>w4*$PdyGKLl)x z_VjR9A$18RVhL))8_f(#lHCexX58tB?!LqR{J<^`A5}7QqlXYp_XG&ve1Gt@S{-ZE z|Kx*)S z%6<0tspoM%cwO4Hevh}1DiT~x-R2!ugvrmIltayg*@GU@1O;dLM^`&F%;4t=#!bAW6y!TmTZ zd&e8LZadhUBr}%r*3;H}xh}1k*TKZsEsXpjTja=#w&rmfT_^GI+Q@tLG!HIUr~Z*^ zmojx%I6CQE{*r%SfqZhuIp~B@zT7sjy(*xyAG5*+#?Vs8_tF! z##aM*3v6J*!yblQ4uujGw}t_RGiB{oHxaX;_t&k)c4SAb03B{9ixsuC(`t5*H|-UL z)5CJByXYrv`BpMvp0b2^4sVIK3dH;#VKet+4g!|zFLO@}V8C1o7MPNB%`E%IslBJS zhPWNO>!DPrmA{S!6D2M}Y25g>gs{>u-=}puE>E!*r)ZFb<1kPYUhkuEdDxS9%{4Po zD#oiUVeR_JT#0&9VZ5qf$EU^1XPRE(^we;-;}`!MUz`5Dq}9}d$)8i+r)q79!T&1u;x&b4cgf%8YHva)!kL* zKf_$V<6rP(&uE1b{g|~MT|FU88;`vgXzg(uo5J|gux$?w>BD`P!S}+j8g1*WH?e45 z58iOfE>Fw)DN*kg@V)x*bImM`M>gWgc_okTY4wgM*C;*YlgaYfUFXa7D}~_sE+8?r zwnq$=MpYaz1!esUwS^Q#Y%%51g7=HrB&14tywfW%xf93OZ5O#ZyX!T1sfxZvl|M)d z1G=T+b3h}~ci{GNa%RDNp)Wq71k-)1liA8|XfcC!?4Tls(2iG_(hxqTF^bcN8sDy^ zP0OTPQ)R~nW_I#2k-P!Ep}am zoVLeStc{^W!<5O3(@Aipec zqL2LYz5xZoy~hj{NR>K#K|vEstb&yV_RO&rodI9xw1^oNDPq@I>!5hL+Ws0AYZh-h zT8+LkLJa&ta77ru8vB~;IX86+5qF&d>26S9p31hV#Arw|$@*?-{_T5N3q+v3Vj$E` zs=>gZ*w;hRy1X;%!-O&t&umRCuFk)pQ4ktLLJLXf&#&6!P%Uxo3xeIK;tB6vT+hi@ z`g2u0EXV7MXX$d0b~6yUyNrQ|q6`<(&O+_J-{^)ZwB$#PO6xhy*;=dQKvX_P(n(L# zU__j3>BI^$0Um{Hp)cpVlZU9Bo$m#=H~=$QsWdjD)vlr(BY6NSC>TG-vAdEgW;S=q z@^7-}eScB+)GD8n(sND|LlP>V#u+}>Srsh_91)nn*e3#_Vkq5L?orKlf1%Rn(^?#s z(r7qiHX1h{S~=)vCq9~hjhFd9_5i?g+L<6TABo4T`k|>L9vrmnHhX3ZrKGXVeQ0KF z7Mfu%?<-;Q!;*qBMU~{3p#TYS_3{L%qm^n=x46%y!U#JB8G;d@{u1v+HwRD`eJz>% zyi;yJqg=(cGEtFAUU?~OsFJzQ?mfO#KxQ+8MoC^wFfvde67`Zb2M^JAGuG`fnWg<` z#aG;Dm*`%Y4^OSwK+zp)W`7s*P`sK3)T$8aoz`-sy7h8}_=GUI;j0k&g-=&B0zBSG zW&o8V4HUvs(Zx*T-^E#r~*V zBSZ~I59Ms{xS~eUSYdLSW*G3tdZ%S6zYGE64@G({F+;ezuMF97fx`x#K^YP@bNK+= zm3d^_+gBxec(i(uEfE9(`mbpA#{(at_aC`j*n}<@Z?cgidJ0~<4XqxX+|Q|wqi&8j z6sjZAE&}ptm&eQ0d?|_98GK+_qlY!_M9^BJ>WRLm$(LX6eweP)&)yZDdKQ_JhM{>Q z18Qs-kBfEEQ?wx^SW|ZgR_bZZMTQ*??pssJT#ol7ZfCP|c@1o+rumTNd`dX6u_E@+ z;M=!?4q}3C=UZ>V_&mZ>XwiO|e7Q98mTpUeQN#mR$IJc-^UFe)dhR)HsS$AkqSWJ; zbEGcqs1Q(?5tl!e(6-fPgm%bHfQyT+3k9V%Bx_>Nxg3M zy>c1Wz>G*AuhH6YiHn zEJi1v|8f=ZoRAy-0#=uVv#n&w^@5KnlT$DhiY~q1ore-lKgxEx-`ub3*xNnaQ!T98 zOg(3ML5$geN8%`#`yf|JBH%@v&hN>gm$UgZ5$<9Gs#_pa&==Ka{v|_F@Qgwi&|>Rj zw|W0Y5(1D~Km~-B>iA%91J@TD&rf1K9p3Fvmwk6T6?q-G&BQRzb_^Q4C{AJkRkZlR ze89Ce#dwR}b@-ye=wJ3}PnMmDr7c9l?3HJkm&u$SUc4QAH~iP$^PdDyXQE$W8{9K| z*kDr9B3*3opaXQ3WV;FK&EbGx38n*GX@&BYBdzW@y8CDv4{rIbA@=5B6PgC`=(ggM zau}UBgb%c&P@DVV$LqTaK@*&?iw?N4LDzt@dx2&{Gq>~GBy`a$Vjk(u(JWTtdzK8< zi+(Gg?d1l>+QU9ceRxA4x?7~NfPM@xIM;h4(ExUQuvj=&6K{}HECcS@(AMH_aP_ZpAi z+wi=NGE$@_`T+9Q^t`aEQMGT1bywuwKswJf-VyAg+GZBJEd=FWK{itQMJ2DzB6@@4 zT}ZKLyv(nCdWY7d8~v;xVe(bFJUDt~fnSs2TTaV6_dkC@7wJXp(GjOBmAQ!08Wwzg z&3`&7tX1n&Ui_6LaG*xqJfY_>ZN@&g!@WPeAdc-pvhA$PZfV^~Kg5D&8V8MDqv$I~+{r-g)B zpCt%F&@d=xBTzmEDjjaW>o|zE37F@O-{Y?bwPcd$pn<2*<%6^?C!IpAgxW&;9Tn@? z$&AK!cCm4=l5vMKY1hEQ%O~Fyv1g%L+R;HI7!=vA-dZa6RP`p`kU-L6ikaIMm{TDa z`=Dc}yC8VOdR84*>_H?}{JmZ&9%?A09V&$7zmsSnalicI&=c?1B{ncr^RaPV3u<6& zya^YX1!}wjK1p38smp<87-sXYtinz?3oW|V`ZLxqdS`@z{wqB6Yg;y;Ys(dIt)!r zn9BWtI<^XkQAY6HU;sUgp@$MBFOs(`OOUt;@tL3kvCFiW1m?^jJEt zWvDnXW$=N1yXQmwC82W{Xa)zb%woDMK02y84#ge}8~sH%9@7-`HsXu)iELkm=dkTm z&D)J?fV)0jkJT(by0kei>r$%|683bf?u(5c>wUTi1XPw z&?72Y{vhU&J%c|W@Tpu0&?~$Xp)8~3{KTk2J+_29Gui z9LzA>ZzZ|Yzbh?q7zyJ+Jjb)-t5R5fQqaHcUzj`l3y9K0oO{4&PEc36JjJUf;hmp$ z-F2>qUR}`p_YP_lqrTnqqPH$>u1l6syfLBRuhxAlF@qZ&e!+kTGD(=xpzau$4Bqlb z*lDTW4grz`;T)TYh@Zy9Pc-^4wP-LY<&ZDhUU%=^xjvx!%x~ZoOEN(9Bd`JKH1W~x zC3QzY6~_=kxMsdnim5KCe-#D{APo(L>(D$>ApOMU0(Sp{@{{d*WjN0axBED5?Ph@mdMPX@zu+gbx-Cuzjj<`2%8+N8GBSAt~ z+?FGz8=Aj531+vL3@5=01zX0pS+oQ)drOL(VbiUyHBQF8R(=nrJluRemtA=5Rw-7; z93h`3fK_wX!5l|*N*^9Kn$AVuef0sOM4cos5f8|9_Ql?#lq3&3az!-@h=T?{l!-65 zF12;p?fW{=vH*z%#EP_t=HJO2u1~4~8cb4Y%oO=DiMUS%U5>lai5O=Lyg*W=4-yA; z&-OqQ|3{b;Nl@-xx3t)|q@88)xAA4Mn{AJau)3V(RqTZhpW2ih`ZF0wOa{``5!#%M zORVHr(CCQ?A-vNYPP2j7V8eu{9;>hk<1&^xBs`2OGBy@AvZwwKc=TD$g`ZCLd}GHCj=a`$ z4JsNAvjd*!rUUC}NDwV02y%^Qx9yrM&gkCPj&~nsPZwY@%piab-9oU_P{__L#1-9D zd(0lQU3XULa}9-mDt2!P-w?KgHt9reg8jo@XbCHJm$WtEKiLEZ&^!2>W5S|9j>(sH z)Lzt1OzcbU%biM?&F^4o67rW9V&Ow7H)oBKxN&7eiFbJ#C`>Ia@)n~DMT&pe1j{!V z=tX}b-ny=iKsXSy!j=n7zCs49%qLn1^SlWo|??3Acc%5?E|2@Yhdb| zLf#=h(s-{Yh(J=&5b(+6q3(5#uBKbq;K=*_*uYz^< znRYeuD0Nlz$+EgB)Id?!GEQHbh>yzQ1w2+;gs=dkJuY1`G(1fhV==5Fdw zxzoYS1-dyewC_3oXfKyn7F`I$2oA$Hq5eV5dFGe-qlcja=_^;4v(E-!Mcx+aRA*+t z$1UcxnnY>w*~T^Px^sp-%Ve@~wOv5=wPp?ajQI`w`(6N;u<^W$lZh80kw}-LGi!lE z+Of7Qnz&Cksf2PuWoo`g9S<9C8^>L>5A`{r{i%gGe)+s0P6O`&2u7pgju2L)mACGtj0i{rv3pV8LaA<6f3Vl=rOzMDvU;AO;m)HcVJK+IV zh)v^;=Puw?Mp3Go61|pkIUZ~2A&>ihh-)O6HM^Bo2U;X)av;k4H2VX=#dc}Oo(nM3 zD;K6{NUSkWce7BBEKVFO!u*zB8i+e()KOYfxwrjB}aF z+08(4)Ojv35HE8_1Jo6PFnN9Z@tJ8u6b}aGo|{?xNH!iA8) zeEWT(Q-uuQsx}>l)vh)T1n*An4|Deb{w9-I>5TbV$;06t5E7^TxB}yPvT5yV2T{6Y-t{5pGNBcW(I_`;ii=H0@}YOMXK1<>Sr{LVZJ^#ql_ zU{DED{E#HCApa-RNNYeuDL0bNhd7AW;Ic(| zSK?Vb(^Ih_e2?hSnzUTlhjJKvCj$?hh_DYU3>&rF+A8jLHOcv%OIZ*f>>?WOrII_4 zil>U;mbuSXW8)l5>gFe8UL;CfY8teu3%{m_*A}vKZWU$7evWBu>~P`x_Z~!UkAhHH zC3{Tk(tGXFRfH;HVZ7yFgX@IzJ}7l>9bT`t>VLPmn8+>;`}pP4xLvnN7_f;-$@;qh zO2N59xxPl1n(U+ z)ti5VzxTd;BR7+M;SJ2$^*=aFJa0F0Fdmv-lxbiPLbT}FbR1Y1RGsyC&fVin7;dzh z6Bq!oNn&RH-Tk}G22W^m9ifUV4aD^ezU_v%*l=qLMV&WvG0E;*9wM|MsXM;EXgi}x z3?vWym*pZR|5~0xT3B3BiCNVjBq3VhLtZRvBiRk&k$ZS4VZ`#$miE=S#bDfkhm6CH zOg&*ikW==Ou9aSqk>N&Z;1f+>Vm0P5*f|~&C%3^JXL-6Yo4pro;*19xt%}~9;j9vSOz+IsMw$|U zlJJ$GSetK05C1+Q0sk%#6ud}(DGdY0SL%=Z$xzMZ);5R-IwCSVK3AiK0R!}ffCVnk zS;F_d5#fo()nV4R%HXw|>JL~7R?xYD_7c2$G5@+BaM1UI&h7FPI=T_u^T3AcgMlw3j9K#4Y`UA2jsS!72GL3sFhh-U{a#w%xJ>*RUG*1PJF9BB`dDsk4xIOeSQm4+rS({(8I|Ca@>s zAH$OzKO9VEF`9a@?ppRp0jSJ@fiMvn?h%Vw=6$E?Oqfqdp?ArHvO$EJ1(_hR>Z3@{ z)W(Z}m8N~y*{Y5?2b?4roZLXb?F1?C#pIf`w>`}xaF*XN@QKTM!(RwKN#qv*fvN1l zUriqgA4}>(_)+^1g6o>@LyH_V# zXW|gzNQEIy9<%19Ybp7Tw0|t|`ZBeznLQReNNN0<8jK#n>7kZ)Y9W zM10dj-sR^NG$lgWeXM zZEg&jMZRX=8Kbsa?@_+#O>gd87_k0btV#*pcfVzjQ?T?J5HCA~^J8mQe+ z9S-_pu%Sv(M1n=I@OjF-4q(l~^&}7ejd$u1;yyi~KY9ld!p^dv)Nx1?Dk`5E4OSNr zq6CK-;A@FV$*}}t4-b|NZI^8WrBk2avBwfq_<^95(hnzmT8&aJ?2}V}t~!LL9I6M{ zr)h_?ZUio`YxIMaHnio{6=htOI$ol%Ge{3e(aaZnQ{RvPFc%E8H)qfQ_h5}M|={(g8w{{ zMsKZCbBMY;=hz8EGJ^avKi6}3HqqqR0^nm6pob2&CNpZ{x7_*C%}=_2Q-FShNdyfJ zjz|hneC5j!mfj_eG`OYcn45lUsTh}OUk_^BdmfEU9IQfeQnnhA==QrD@u z6E@jh*QrNP;Nyby_);XYW>q3Y_;K?BL!8}zV_@@~ycNhZI~2f}^`UqWEWv@ip=iD- zycSr8ejg^NKLTB-~l90)f6Kh=oC6#G25FE z%bLKU$f?L?&IAq@0iq2N5HR{cADS)a6mFj)RV)Ylp^J`6$%EZv&-FN>V8t{qIGD)K z*rx#O?Non?1d>}jeBKustl#K>p1uIbCs0COH+*SQhDeu_$AIMa3K_rB&mi;L_k~t8 z2!4cS+PKR>^d#V{hO*vt9EC>HdNnqz4Fu5)j@R*kh4? zvD~y7nu#v}A{BZk0h%Z?Z%*XqPpK=hievMiBxI^&k}JUD}`f&IZAa`hMLnYsD1K6L*Yvbrt$w%mYeNpe&C( z$4|g@`MyC#jqP4}?P+!6G;inhC|LGA5NAB!y221Nn2;SFr+^brVGmlb_&3i^FUIGx1Dt?~3aIih*_&;)3Cfv7syPWfF9k{%s8U@q!6ERB&m% z@)&&}Gis7MfzmtQm%*3V18POEZ}+{KBfDLCa_8)CuZ@ysiX9F6&2?dHr`m1*6Y!M4 zSTY9JGWfi99iR<8Tcvh_#gYIAN}?UX=&0j4-s$tfA$^FcuZhK=pr({cQTjB#g0Z}6 z>DqxHT*ehQQ%LJIS6XXsNq|^+b#OhLqrIeiS2t|+Zj?k<=xRsa;K`Q*VMiKT(U=Fw zrRFjLO^-_DIr~3T)DJ#*Pc#H;1^Xkr7#m6vD&&aGMJR12Qj;r?cs_MY6B1<5I4I$V zcL3Y~xQzxs$mkhms3!R1b8;xb4H<+_pZll=!AuTz^FJc@&OuO~@45zhen@{`2Qr*+ z(fbvQC^9SP) z=3NM~t3=4N?XFFcX!V+Fie%qI>XfY`l%u{wttH?HQQ4&bb^vqu^pI&Rz`+A36-BEga(0Re`QCJDYjIfx>{(81&^csLh|TXk7F3Xm zNB{|volZtf2Y|*lOd#Ukay|m-)-r|N*Jed9;py4h*oqztvXzRISl;d_WIBpvsFL{P z*XnZk3Z3M5SHqvWR0yUVlGc*LS0tEdxL;E8F+5e3?{8 zdW}+28FR*RZGx(GI+X@=lfe&sz5 z1bUUXAbl9kEWiuq837cL^VTE&f~e1S2@(@(`7Xu=(Q?H4_*IKzSx^b`6pIpDwm*@x zc6&67d$u<=>xCC04u(6YGByyK!3q7Sz=ajY+=;(Uu}%2buJ%XChc|*)^3{v#{_~6d znb(jlj=I6mp5`O#sJh5joX^Y*$RS=_gwJJ7oj+QfM2;pSa;6+^W z7OWwA=zVZR1luj3hHf!o8g#h?S6nr0<%?^O{S%8nyo?~nkGHyhygcbTv6<$IgjL*q zyD-FwWnMagDwO1QA((yY=zA*>QFGe9$n5jEDt8X+Q<#876}Hkuo{= z>$p6hG~v*tD4U_djpsN4)GKvZo?qM2q6j7^;tXaZfhC+prizPQbcMr9HVv@t{bjcm zkw6}q_b{M!#a4|qceYy;O@`Uf5?m#zOt!a9yKm&Wch`OQHQVDKJXa0x7o<1iN#xPcoC?%!{`tF6WIPh-BB!`(7)Vrxr2q=?oV2+dBhfg zLg*QqxUtIe8+U`9fJ+ z)k*}`Yt(}|h^IAZ^y7m@(Ec%RL|dA4U>y981)=laTd`;y%<*IK(S5wp47T|`9FlV! zT6&GIafev~r)Z^GT&mPWd}FHA87og^x-nRGG4N>s(L$skRsh%GELZTOkfz(+R;|?j znlHU>trN2Wl$p|MA`<<3B5v)_s4f{HMVp`DBvUioiISapp=jN11#G*gS!+&cyx+Ic zr2NxmK9%_;q98-yBq_gxXz3th6r=#;<1fBo_lTfT3w(kfVuYWxq)p2{3z|nxqZv+( zBB*>4MFV5dWIvhqs5l8FYJod{^&KuioQ#h9zB}94EteBXT50jrEYc~cDq5&NezDkB zsZ@(Ko&<}!0|&TN%%(E+rcB)?yBlw$>y5;aTolY~PP=io{%~k3jS9c()AcTZtDJ3C z;bZw!ewO4fzR`s?DALy2qW-fv3%9*k-Aaw8s6TdHLb%oICTI@WAV7DYZ32ohnFfc` z%Sgvui4bO79~+UT%TbozRH-+03{#9>_hX3m$f&BBP2|%FVd>@?@61**O_i(565a;D zM84}`i76Qolce?<8iBT)zJ}*<<;Yx^Dbq!({xGU4k<&<0GJrwofIc?a8XRFjyB7Sy z;5g=loFy|lYMWg9!zdm~zjbKYcZYtEnA7ha<5|i}E=vHV*EG8tJlZ?**{fVdK;mTJLrdPP=H)8I0y73TqQNJK$GXg4Xb zBo3k2&z=(@(&^*eTXfB9j;%@R&}JnhVb05~dK{eVY~u{8c;sJ(P?uE+p7dwgn(W_b zJ64YLg47^NyFBJ2(q>JXHx;sbyIjMfusUY5qf-9X4=mmzMT7M~54U%a$#@_(C6S6EElTCqh7`m2B>R$6uqv<+AEs+Q680s( z)a=E+Wpe9I`@GDF5lX(v|847aq7~c_ z$3!MuZe{GY!m++XnG#UnR2h+1LFmml2$r3hTH3w|`>^R&LcT{s9-MA8 zj8U_62P2Y~W%j_7macKl5ofNsHvF|ARO>aN@%f=G# zQuDft=9U=uN}W4QGX&Yc{xZG+j8ZBzM&+$+denOflI7$LsYy1UUi$8qkCZ9*&(@Q#h%j&uH`5)aRW!MC2wzu;-i`WKh->N0$ zz7oa?WgSfEDO!A&D7D-q@9lnE=XGcLlA7fpXHeN#C2C%B!KlhSb9CuA9_bHKw``NH z#8zr*F1n?M8Pj<<1cwl+KZxKFVoeiv!tzd~;Uq+=QfQ~xfce@YOOT>3{+l- zle3NVDHXb>3Kl}C0?v=eSkrL#mF;qaDmJ-a0R>_(tH2o7qXKc#>G_*1iV(O4YclG( zB2}!mr5uY=)h5rqn8ivc+R^7`V&N;z;>&L}B73uq_f@6HE~y2(xBhKLYs?ScCd|M2 ztB>--8hAO8(s(X3QpEKkN>VRm+k{#J9`DQ@vfNyAQO7;gl&$!M?CwV`FG?c;DRxtj zf5+j5S7&E{+5G-nY5Y4*qAue&&vH^OH*r4GDyNe4{Kr{8Z@gTgxajEjjw)EicP6MH z2>6qh>1ndiM=Z!6mpbqz>z#K$M`w1v=B}<9)Q1@UfZ}3NiF7P_AZBVEVA)m+EDJRR zJ@q}fJ9OUyXC0OH#%-UH3wqO(SZ4f`j{2aSZBK6krY;1wF=sf400eD4C{)iVlXwq^ z_EAue*8P+D9YX8CjBHVFWB}`PRdpA?snik_{dkjwmn`6hS@mHWKeZmyc^c>~e;uq&U2ZVX(2m~kV(KipUibu9XvWC1EJB$gdVQf_#$=NV~!D6W^M5MxurgS&0fT7h*i)wx8mmFJC*7|pD zvw@aF>u6DNuZ`brpY4O0J;o0^-B-~$TM+umpb5AhrH*xPqpy=3Ye^9e#R{%>w zfBPs)LNZFehF7G&DBR?OO4<8A7$FB} zo6~&!t(GQ!j!zm|fb!n;@)R2dx^cZ0!O}`9T@f3=^u7PnCrpn09VVzErc#;+aV!;( zt*_YAeBMeXrZ%e6{AvyP1Q;yt3_Nc3nPwNXX-r=^CVTH2c!()QWoF11Rd({ryrHZh z&<<}y6*4O}Xi`Rtr?aqc;Bg3!C%9%$aXOeN3KzqtF6A%ueq}JfKU<4R(w~AkY$bB% z@M6=XOrD5EW)$!62P-4n{OghIfL!q$SF;ZNLogYK2$22}0pSP=o!xj>c>#|(x#^#; z4+)^-&C|R^%Z)2#IuY&a6fQ@`%jfc-jo*QIN<35RHEi)y)y=el;Z3eW)KA;xjwrc< zwU@=7n>fb{BN2E=ja$LgS6mYCI1Bnunw?eXW1Kg#6I2#A}(65dzu+zxKDPf7hYu zH8@Vv8)%BTXC%PS?G-4S4s|Cd-n zMiOoeUq54}6Z$hOzd+a(iC)?eKuC(@WdILOc%0C2L*kQlyMFNMu#9bbxzGw3>>~d2 zS?(YD0x<2uH1Ly;KVgH3GgER&}e6~@8qvTn9nvTCP32O>f+GRFv{gYEoXrD7ZtGnJzdOPa4<5K0N*Uf!y- z@bwn0aoHDfKbXS|iXvBc)`$*&!Yx+#eH7+k?ktn|occ!NfJ4aj0A2Wt!Kbu@+jr`c zt9K}>C!P%(42zaRQh%ezcE$+=p*UaJb#eS3oca%C%VA9GRBq=9P)D%pJ;xndI286m z5P4tPuz22FZRE$k^VOMd?Y8WYm&>B|x@>SA_VZh& z!dv4XuUA8rbL1^#qG|YH5(A7ixB^jv&O44r&hth3EHV)V`wbpJ1`~|(W#ob*c?=O` z>0QnQUdUI7?c#&8R$4%|n(wIPy?Ih*deSMYV)5&Jv9E7^iPxobf^n|qz#bllfgYdN z8tYHJTGHR`6;Zg67RBN3+LD@YAHn;YDEd?CpSlqKEbQlhjwBp0TG?<8JcE`^Zse$nR+YkEL11k)2_Yqs_4|H;)dY^F4L|K@$r>3f>2 z@!Fr#x<_S(W$!UQ3Nv<<9vrla*8u)$=a(#Mu2Pyxj&@@?WH`q#%rWl`eIWE~Z?@ib zmy}SB-SE`^m)uuok5IgNhKS~Sptb$+Pg83*6Yin=t;0C`M7de9zm0N8ix5ms%4L5x zaC6v9{M!(HI#bb5^h+xZ&hCxQlcW;cTkna+%VLNNp&oHr^p{khx}bO|XUBc{Xf9O6 zHBSt0;3u;fF19<#_gdwiY>HAsI?polik_)+BAaRS!0k!6#j{`SK`Q--8WTpszU1X2 zn#^bP^E5>`i8qc-SL5e*$oR?iCGNuSXfUO{-E=Z*l_zUC*I+j4us*k><_woi1XCEY zPJ9+a&R>Rvp>LrFk}~;NVRXSI7s<=3v4$gS$p%b|F7X6c_>VsVk)Le+54y{$213Bzdy# z;r))|C-WRn4?4&9=}CNbaL`0uVwbB>)cco~*+?90IfDB+Dqz-S!Q^;HQQx{ZQ3s4W zV3js1a7WE^Xnm%VDypD8Y+(Dq4R7{D3YDY*ve)|llqvB)-(N~dld$Vy^=kgCaGIKc zZ_Hso%g9A&)hq?`gYdm)+Lydb_YNBnBdPnk73S;`Yim5RGCn&KobWi2u{UoOkoN~f zE+v93|2Q!#APLGBTBorqDt1I*H1Mj2G!k zkfGsHeg=l7%zN&nq1DT+zzhd9DX2nxpjavjI4U}#c$P#^S0ecI={-i~tVhJ6w++a| zYzCHPRg8>El(_s3D|i`Wz``vCd{Hgn-HB~D@9K#AA*1fZS3Y)|F>Lm}-*;(|-b1k@ zhz=B03`1e1xVO}XPmB0p^!G+q|KyQszkiod^b*1~^9JaobE>O8A^_`SxL=@t}t z%;4^HwGoFRon`RZ!}9Zl&J~7abZ(DRpteZ~1-kDgj56-i3X+K^x``ohPq zMnuRp76li2D2dDdT#f+wXZ%G!O3kh|zn?lUJ1Y+D2>j_zGSH1HvaLNNMx*hMPu_Z) z+Ov{GbmupmK<@fVe#q|neToJvVMOeq^EUi;lI7O#Vi*gTNRlD*RB-t<;EPpUs0)rA zja=YfpjD4gRe29PV?J)PC!=jvGFlGB>ebM%ko09xOb#$aW?pFVyMFGpMMUzIx_1wj zP8;`3os^1;5|Y54((WY7?=S!)Jm1fHE&f@_`u$e8Q}BS59(C|1Ps_DJ$ypnJnf+ct zz1w1Huo*?k|Cnx~Z*DR`_z9(;yB2E*#d~@lJd~9vWH_4KKj%CF{k1QK1n%8XKjD6E zDiatAm&dyA14EvmM_|BIOX2n_&9@K#dgb8f$ctdt4vkxZKdd*LPkT~0w=RD{0?qUTJf}P_e+HjHFlw1;6YJ6tl#a!f!o+|su4Dl((mI!Yw%B*m8({;!63X^8EywEv zfw^$d*2dsu#<-npaLYtI(gCZD3DSZ;jj-uf)287s_=`D^;))01Nbl$P2*MQ@eg=F~ zTYF|WRz9`Wwr8`U-Dto18Vt9f@=Z&ls<4`$%*P~R(Ruvqk3UN0@kYo??}qb@6T#SQ zpo@*jqZVK%n2hyJ0Q>yHfIIsO#O6h0gns>LaD_IKG%Gb`jQ~9Tx)i_7aO2$E*S>z;_XH<~E3p@2Fni%Q`&9Ynvul0V4MQl+D z_tJ#rL$D(fR;Pg0+f9apJw+g}4ph7`Pj>5p;6=@$%(f$H0>8SehO5o0BC}NJ!wibi zc7G-9nGHP@ch^ZVg@)51MS!Yc`>O^&G~^{9X7SeptT$Z0rvFF^m<2O#0wO7<9$s2c zmc8LrrZ}=!T)etCevN0CWkvFLe#dX2?K*S>t0<0tl+pg(^x*8O+Gh9-dRMm0w}vZG@1w^t z3<~)uhaK+xMQ!OGhvUB%9GkPdh3JU9&JUv7KMuNOR>|rqt-eU716xzJrl8x&jtQn? z=@fT|Km?KijzCUO&3=|_ETkunnVv?g-kB|QX+6xb{qqS_XEfiHqKo7@QyxL-dUF-X zG+(-mtJT<+fqk%Drh9N^qJhc5YQy#DJ9D4_?=A=+=gA|;twqB5xT z&|FciN6Z>;t_HU-Zd5jQER6YETc%dI1d)jQC$#Ot|7p4aK~HiQ^!oiTs2KlEyZQZ) zdnyDBSiJe{>5pmH32sQ=aWNyfH1V9{m@ACv%6u3JYet3oVk6iT5M{R>(%59Xs!doo z3A72mB1UZi&%LJT7XKs#B+PqH6Cm$BE~pqOKI5#ADisKsMFwu+PpA)#*3;^LrQh`o z8&O?+W9Y-eUbuzt&zkuP$rBa31m>$h3#-tEh(2sAHS6D@@4+GGL-+Rz%6C_PrrF_D zCGpCWAi5g4aghU3e9i^Hx27AVsOtfqeByJAUtgmnKVBTILd7quGT15PiVeILSMr9- zo`HW;3f|dF-kYg?*a_`2ej;*vrD{G@6YYPt3 zIV7+09K-g64X0#e1&KrvFNU4-Wu<7vFv2HI(zu6I-dc)Tw-@VF8`HL5f`@~Ig0k`~ zhjSW9ZHJ&f&2tk$Wi++#ySb?AzM637C?VOxJ(XhlZzOCdz=FI4Nl0o>^96#1x-I)C zyqoF|8%F9qhG-A)f`X&fJ?N3Xsau0J1`Y3-i!w@NUx=?4U*hUh8#Z~; z*zA=HvVL;7IXSf;_)SU_yq&tHTZzEg^3>Bk7}*yd(bmUO-1NFUZI4=J3^4}dPiPgj zHmNljpTLDT#-z^_T>G6UJUz|l`}@&~ zZ`a?`j~-xeiEV4JF=G}LX}dL3Cw=iW+vxj53(Y+xVM}J*qfW1_R=GYve+{uEY+5!B zai!smX}fJG)z#&v-$8b9cTOjjN_C|i+L7?v^xt}5V`e+9mJ+KH{ukfv-TQU^El9&v z>xU(1#I#cK=UWBE=~CFnCJa;JaU`(eoh%?j^i9}ZoW`7P^16K68NS*2Kn^-pWfNqG z(*4vcBCKL(AZLbdHRR*m9Gfco$!qIdVdMmF1R9?iTAM5EydN;4r6N(32k!g08;v_H5Bw7)mcngSN48QPPSQIp)ZH|z1X z<2PqM*p&IZ-9ENBDbG`wCa?m4nC3u5sq6`Oi(m7{rMBl@E=2zj8-Es3@i}pF zNEEiJ0}?KYqe`psPhx?dZ!h-+Vci?WI5yD}E^PrH+r(?M`4nhY^3_=$dK{x*^yrnj zHXR5l%&jI>n=?x^#NDE%iXI8c`JuFke~!fac%A8eEwJ=hw!?xL@w%$0AxKqUXV$mP z&}TQ$sJ)Ppf8#RK73889r5P^8d&&*2oGPfqbR6 zejg1kzN^PPIIfVyBN&{viX{J7^Z_s-(MnV{@o7sL=Fu=AUH?#Nhbp&z%E)8a_wfZo zRDPTO`dTyz$bv*slC)kBRvzzJNkE^jtdAZ28=7cgiUl52hGj z-%i7~?z7D=RCsHsj|#1 z5*)ne{aeJKX$Ngra6+@h&g^Pqo>2NDfd-Wg!PlAnz9*{Ga$oz}mK|r^(|%i*Vn_Ol zRLnmSC|>}x0G2Vj8~-dq+xXH^;3Gw_wlG}!n1lf#$AK&YcLUBoEWvz+`;+FxT)H+9 z_U@nU7fn)A{UylqF{Ly3{vyYOsq0-2X?_|sVk)LOdb2yBS@7W{EB5#IqqzB97LT5}93l-oG{YQGE7#z)*1~1c zydn7M4VWDgWsp*gPLM5i!ovQj&=d>Lh148MU?S!}|+N%(PU%o=a zxKFtHUUd}kmRoO%$)pO^{>F^(^%gpvj!$rzM6>i<>(jpDS-i$+*d_Bp#HMjNL>_&S zpR4S?ycD+4+aN@jA-bh?hdR?kUAAhN{ZUQ{JEQzpm}C5jmgNYk(vY9qcPMjK^{0vA zrqnwoNGe}v=EEursQZOo51wO@uN3q=z}^Wm&W*zxssX&uHv1u;RarKJD>;4I%0D}P63_0)dCsm^YqavC z)cqy?e8tDY8is*n{`<4u8>?zJ!wuSBM7-Rgj|g-YUegoJ+@b1@w!knW{vy72IM;Su zkMxa+9^g_g+3n**`p(Uy^6zd5iklJZA$g^L68S+$K@jdSP2Et9&FMm~Hxz`khr0ih z-@49;pe6QmO4ZRMO5ib#?%ERz@$C;2VXyO3<)7?s3@DEj9nQR;m^e9#+?~)}&{AW( zlVq_%6J|avcL3qIi0?cbW6S(JuK7vO7ZgO~>1jWvh=@o{#vA4nVVe)MuODv6#W98S zx;@6#STXTl>)Tv1(xQC-j%W@}^<2jD+wjA7+}XONAw^u1(p4U}vXz?fZj{m$j6Xf3 zJR>BjA|CnHz_=fR`^|YD4l+<1J>&-DS&EP!evikl*G~TvRd@E5wuC#=845B28ub&J-r`E=;N4Lcg!s69SZ-=xZ1Azfku5JCu#B$VEl-H_B#G zeCmk`NAD_HDhsK{;!Gg=y^Z`FEiON`(ls@d0@?Jjc9qf$y6pEtiYZ)-jj)7ZEnGN` zSB1=%rw*$<@g+{vIO;l;;LE~uA+)e(a@$Wmu`B_jRv@`wYXfIH6_VZ};FB~(4{4o{ zu2*D5#rl)^TUkXO#aBdC+2~{#_tw#vO~IciQufQ%XxG}Cz~y&PfuvPz{hKWHleKJ_ z=r#r%6s>wdn4}6TRZs_((!p(Jvhu1JyMBPBSKY5-QwIbvm%R~6%dwx-h!WF3I*HsaO#tx1;qr()kdxak9wvMO%WkzZ zn2016%|QdSgCFV;&1HfK$bqTKqZ(10ExO-d*;rsr0**V#fGVI>J)jV}CuvPD;VEQU zUS)GD-mz&+5SgOK=WJfq1>U_{6TeuhF(ISk&WldE>6VT|`*@J_`WHJQDA#h>hU