From ba2c76ff063a1d8f5957d8f8ec6b6ab5c53debf5 Mon Sep 17 00:00:00 2001 From: Takiguchi Date: Sat, 29 Sep 2018 18:33:56 +0200 Subject: [PATCH] First commit --- .gitignore | 28 ++++ pom.xml | 84 ++++++++++ src/main/bash/minager-service | 28 ++++ src/main/bash/minager.sh | 80 +++++++++ .../minecraft-server/minecraft-server-service | 28 ++++ .../bash/minecraft-server/minecraft-server.sh | 158 ++++++++++++++++++ .../java/org/minager/MinagerApplication.java | 14 ++ .../minager/account/AccountController.java | 96 +++++++++++ .../org/minager/account/AccountService.java | 124 ++++++++++++++ .../java/org/minager/core/AbstractFilter.java | 129 ++++++++++++++ .../minager/core/config/JpaConfiguration.java | 42 +++++ .../org/minager/core/constant/ResultCode.java | 18 ++ .../core/entities/business/SystemResult.java | 99 +++++++++++ .../core/entities/dto/PasswordWrapperDTO.java | 34 ++++ .../minager/core/entities/dto/UserDTO.java | 97 +++++++++++ .../core/entities/persistence/User.java | 126 ++++++++++++++ .../minager/core/entities/security/Token.java | 82 +++++++++ .../core/repositories/UserRepository.java | 39 +++++ .../core/security/AuthenticationFilter.java | 47 ++++++ .../org/minager/core/security/CorsFilter.java | 44 +++++ .../java/org/minager/core/security/Route.java | 71 ++++++++ .../minager/core/security/TokenService.java | 132 +++++++++++++++ .../core/services/business/SystemService.java | 69 ++++++++ .../org/minager/core/utils/RegexUtils.java | 82 +++++++++ .../org/minager/core/utils/StringUtils.java | 93 +++++++++++ .../ServerHandlingController.java | 38 +++++ .../serverhandling/ServerHandlingService.java | 59 +++++++ src/main/resources/application.properties | 15 ++ src/main/sql/0_init_db.sql | 25 +++ src/main/ts/.editorconfig | 13 ++ src/main/ts/README.md | 27 +++ src/main/ts/angular.json | 137 +++++++++++++++ src/main/ts/e2e/protractor.conf.js | 28 ++++ src/main/ts/e2e/src/app.e2e-spec.ts | 14 ++ src/main/ts/e2e/src/app.po.ts | 11 ++ src/main/ts/e2e/tsconfig.e2e.json | 13 ++ src/main/ts/package.json | 55 ++++++ src/main/ts/src/app/app.component.html | 6 + src/main/ts/src/app/app.component.scss | 4 + src/main/ts/src/app/app.component.spec.ts | 27 +++ src/main/ts/src/app/app.component.ts | 10 ++ src/main/ts/src/app/app.module.ts | 68 ++++++++ src/main/ts/src/app/app.routes.ts | 15 ++ src/main/ts/src/app/core/entities.ts | 10 ++ .../core/interceptors/token-interceptor.ts | 45 +++++ .../ts/src/app/core/services/auth.service.ts | 39 +++++ .../disconnection/disconnection.component.ts | 21 +++ .../ts/src/app/header/header.component.html | 27 +++ .../ts/src/app/header/header.component.ts | 22 +++ .../ts/src/app/login/login.component.html | 22 +++ src/main/ts/src/app/login/login.component.ts | 60 +++++++ src/main/ts/src/app/login/login.service.ts | 22 +++ .../ts/src/app/server/server.component.html | 46 +++++ .../ts/src/app/server/server.component.ts | 85 ++++++++++ src/main/ts/src/app/server/server.service.ts | 29 ++++ src/main/ts/src/assets/favicon.png | Bin 0 -> 109785 bytes src/main/ts/src/browserslist | 11 ++ .../ts/src/environments/environment.prod.ts | 3 + src/main/ts/src/environments/environment.ts | 19 +++ src/main/ts/src/favicon.ico | Bin 0 -> 5430 bytes src/main/ts/src/favicon.png | Bin 0 -> 109785 bytes src/main/ts/src/index.html | 14 ++ src/main/ts/src/karma.conf.js | 31 ++++ src/main/ts/src/main.ts | 13 ++ src/main/ts/src/polyfills.ts | 80 +++++++++ src/main/ts/src/styles.scss | 1 + src/main/ts/src/test.ts | 20 +++ src/main/ts/src/tsconfig.app.json | 11 ++ src/main/ts/src/tsconfig.spec.json | 18 ++ src/main/ts/src/tslint.json | 17 ++ src/main/ts/tsconfig.json | 21 +++ src/main/ts/tslint.json | 131 +++++++++++++++ .../org/minager/MinagerApplicationTests.java | 16 ++ 73 files changed, 3243 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/bash/minager-service create mode 100644 src/main/bash/minager.sh create mode 100644 src/main/bash/minecraft-server/minecraft-server-service create mode 100644 src/main/bash/minecraft-server/minecraft-server.sh create mode 100644 src/main/java/org/minager/MinagerApplication.java create mode 100644 src/main/java/org/minager/account/AccountController.java create mode 100644 src/main/java/org/minager/account/AccountService.java create mode 100644 src/main/java/org/minager/core/AbstractFilter.java create mode 100644 src/main/java/org/minager/core/config/JpaConfiguration.java create mode 100644 src/main/java/org/minager/core/constant/ResultCode.java create mode 100644 src/main/java/org/minager/core/entities/business/SystemResult.java create mode 100644 src/main/java/org/minager/core/entities/dto/PasswordWrapperDTO.java create mode 100644 src/main/java/org/minager/core/entities/dto/UserDTO.java create mode 100644 src/main/java/org/minager/core/entities/persistence/User.java create mode 100644 src/main/java/org/minager/core/entities/security/Token.java create mode 100644 src/main/java/org/minager/core/repositories/UserRepository.java create mode 100644 src/main/java/org/minager/core/security/AuthenticationFilter.java create mode 100644 src/main/java/org/minager/core/security/CorsFilter.java create mode 100644 src/main/java/org/minager/core/security/Route.java create mode 100644 src/main/java/org/minager/core/security/TokenService.java create mode 100644 src/main/java/org/minager/core/services/business/SystemService.java create mode 100644 src/main/java/org/minager/core/utils/RegexUtils.java create mode 100644 src/main/java/org/minager/core/utils/StringUtils.java create mode 100644 src/main/java/org/minager/serverhandling/ServerHandlingController.java create mode 100644 src/main/java/org/minager/serverhandling/ServerHandlingService.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/sql/0_init_db.sql create mode 100644 src/main/ts/.editorconfig create mode 100644 src/main/ts/README.md create mode 100644 src/main/ts/angular.json create mode 100644 src/main/ts/e2e/protractor.conf.js create mode 100644 src/main/ts/e2e/src/app.e2e-spec.ts create mode 100644 src/main/ts/e2e/src/app.po.ts create mode 100644 src/main/ts/e2e/tsconfig.e2e.json create mode 100644 src/main/ts/package.json create mode 100644 src/main/ts/src/app/app.component.html create mode 100644 src/main/ts/src/app/app.component.scss create mode 100644 src/main/ts/src/app/app.component.spec.ts create mode 100644 src/main/ts/src/app/app.component.ts create mode 100644 src/main/ts/src/app/app.module.ts create mode 100644 src/main/ts/src/app/app.routes.ts create mode 100644 src/main/ts/src/app/core/entities.ts create mode 100644 src/main/ts/src/app/core/interceptors/token-interceptor.ts create mode 100644 src/main/ts/src/app/core/services/auth.service.ts create mode 100644 src/main/ts/src/app/disconnection/disconnection.component.ts create mode 100644 src/main/ts/src/app/header/header.component.html create mode 100644 src/main/ts/src/app/header/header.component.ts create mode 100644 src/main/ts/src/app/login/login.component.html create mode 100644 src/main/ts/src/app/login/login.component.ts create mode 100644 src/main/ts/src/app/login/login.service.ts create mode 100644 src/main/ts/src/app/server/server.component.html create mode 100644 src/main/ts/src/app/server/server.component.ts create mode 100644 src/main/ts/src/app/server/server.service.ts create mode 100644 src/main/ts/src/assets/favicon.png create mode 100644 src/main/ts/src/browserslist create mode 100644 src/main/ts/src/environments/environment.prod.ts create mode 100644 src/main/ts/src/environments/environment.ts create mode 100644 src/main/ts/src/favicon.ico create mode 100644 src/main/ts/src/favicon.png create mode 100644 src/main/ts/src/index.html create mode 100644 src/main/ts/src/karma.conf.js create mode 100644 src/main/ts/src/main.ts create mode 100644 src/main/ts/src/polyfills.ts create mode 100644 src/main/ts/src/styles.scss create mode 100644 src/main/ts/src/test.ts create mode 100644 src/main/ts/src/tsconfig.app.json create mode 100644 src/main/ts/src/tsconfig.spec.json create mode 100644 src/main/ts/src/tslint.json create mode 100644 src/main/ts/tsconfig.json create mode 100644 src/main/ts/tslint.json create mode 100644 src/test/java/org/minager/MinagerApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a08031d --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +.mvn +**/node_modules \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..92be9b2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + org.minager + minager + 0.0.1-SNAPSHOT + jar + + Minager + Minecraft server managing application + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.mindrot + jbcrypt + 0.4 + + + org.postgresql + postgresql + runtime + + + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + + diff --git a/src/main/bash/minager-service b/src/main/bash/minager-service new file mode 100644 index 0000000..6a91d09 --- /dev/null +++ b/src/main/bash/minager-service @@ -0,0 +1,28 @@ +#!/bin/sh + +USER=minecraft +MINECRAFT_SERVER_PATH=/home/minecraft/minager/ +MINECRAFT_SHELL=minager.sh + +case "$1" in + 'start') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL start" + ;; + 'stop') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL stop" + ;; + 'status') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL status" + ;; + 'restart') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL restart" + ;; + *) + # If no argument, we launch the app in case of server startup + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL start &>/dev/null" + # And show the script usage + echo "Usage: /etc/init.d/minecraft {start|stop|status|restart}\n" >&2 + exit 3 + ;; +esac +exit 0 diff --git a/src/main/bash/minager.sh b/src/main/bash/minager.sh new file mode 100644 index 0000000..9ceb59a --- /dev/null +++ b/src/main/bash/minager.sh @@ -0,0 +1,80 @@ +#!/bin/sh +# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing. +if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then + set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script +fi + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' + +DESC="The Minager web app server" +NAME='minager' +MINECRAFT_HOME='/home/minecraft' +MINAGER_HOME="$MINECRAFT_HOME/minager" +DAEMON_HOME="$MINAGER_HOME/bin" +DAEMON="$DAEMON_HOME/$NAME.jar" +PIDFILE="$DAEMON_HOME/$NAME.pid" +SCRIPTNAME="$DAEMON_HOME/$0" + +start() +{ + # If PIDFILE exists and PID is in running processes + if [ -f $PIDFILE ] && kill -0 `cat $PIDFILE` 2>/dev/null + then + echo 'Service already running\n' + else + echo "Starting service $NAME" + cd $DAEMON_HOME + nohup 2>/dev/null java -jar $DAEMON &>/dev/null & + expr $! - 1 > $PIDFILE + echo "Service started [`cat $PIDFILE`]\n" + fi +} + +stop() +{ + # If PIDFILE doesn't exists or PID isn't in running processes + if [ ! -f "$PIDFILE" ] || ! kill -0 `cat "$PIDFILE"` + then + echo 'Service not running\n' + else + echo 'Stopping service...' + # Send signal to end to the process + kill -15 `cat "$PIDFILE"` && rm -f "$PIDFILE" + echo 'Service stopped\n' + fi +} + +status() +{ + if [ -f $PIDFILE ] && kill -0 `cat $PIDFILE` 2>/dev/null + then + echo "Service is running (${GREEN}● active${NC})\n" + else + echo "Service not running (${RED}● inactive${NC})\n" + fi +} + +case "$1" in + 'start') + start + ;; + 'stop') + stop + ;; + 'status') + status + ;; + 'restart') + stop + sleep 5 + start + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|status|restart}\n" >&2 + exit 3 + ;; +esac +exit 0 diff --git a/src/main/bash/minecraft-server/minecraft-server-service b/src/main/bash/minecraft-server/minecraft-server-service new file mode 100644 index 0000000..67cee47 --- /dev/null +++ b/src/main/bash/minecraft-server/minecraft-server-service @@ -0,0 +1,28 @@ +#!/bin/sh + +USER=takiguchi +MINECRAFT_SERVER_PATH=/home/minecraft/server +MINECRAFT_SHELL=minecraft-server.sh + +case "$1" in + 'start') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL start" + ;; + 'stop') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL stop" + ;; + 'status') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL status" + ;; + 'restart') + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL restart" + ;; + *) + # If no argument, we launch the app in case of server startup + sudo -H -u $USER bash -c "$MINECRAFT_SERVER_PATH/$MINECRAFT_SHELL start &>/dev/null" + # And show the script usage + echo "Usage: /etc/init.d/minecraft {start|stop|status|restart}\n" >&2 + exit 3 + ;; +esac +exit 0 diff --git a/src/main/bash/minecraft-server/minecraft-server.sh b/src/main/bash/minecraft-server/minecraft-server.sh new file mode 100644 index 0000000..41b5125 --- /dev/null +++ b/src/main/bash/minecraft-server/minecraft-server.sh @@ -0,0 +1,158 @@ +#!/bin/sh +# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing. +if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then + set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script +fi + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' + +DESC="The Minecraft server" +NAME='minecraft-server' +MINECRAFT_HOME='/home/minecraft' +DAEMON_HOME="$MINECRAFT_HOME/server" +DAEMON="$DAEMON_HOME/$NAME.jar" +PIDFILE="$DAEMON_HOME/$NAME.pid" +SCRIPTNAME="$DAEMON_HOME/$0" + +# *********************************************** +# Normal functions for bash commands. +# *********************************************** +start() +{ + # If PIDFILE exists and PID is in running processes + if [ -f $PIDFILE ] && kill -0 `cat $PIDFILE` 2>/dev/null + then + echo 'Service already running\n' + else + echo "Starting service $NAME" + cd $DAEMON_HOME + nohup 2>/dev/null java -jar $DAEMON &>/dev/null & + expr $! - 1 > $PIDFILE + echo "Service started [`cat $PIDFILE`]\n" + fi +} + +stop() +{ + # If PIDFILE doesn't exists or PID isn't in running processes + if [ ! -f "$PIDFILE" ] || ! kill -0 `cat "$PIDFILE"` + then + echo 'Service not running\n' + else + echo 'Stopping service...' + # Send signal to end to the process + kill -15 `cat "$PIDFILE"` && rm -f "$PIDFILE" + echo 'Service stopped\n' + fi +} + +status() +{ + if [ -f $PIDFILE ] && kill -0 `cat $PIDFILE` 2>/dev/null + then + echo "Service is running (${GREEN}● active${NC})\n" + else + echo "Service not running (${RED}● inactive${NC})\n" + fi +} + +# *********************************************** +# Commands used by Minager to drive the server. +# *********************************************** +api_check_error() +{ + if [ $1 != 0 ] + then + exit 1 + fi +} + +api_status() +{ + if [ -f $PIDFILE ] && kill -0 `cat $PIDFILE` 2>/dev/null + then + echo 1 # Running + else + echo 0 # Stopped + fi +} + +api_start() { + # If PIDFILE exists and PID is in running processes + if [ -f $PIDFILE ] && kill -0 `cat $PIDFILE` 2>/dev/null + then + exit 2 # STATE_UNCHANGED + else + cd $DAEMON_HOME + api_check_error $? + + nohup 2>/dev/null java -jar $DAEMON &>/dev/null & + api_check_error $? + + expr $! - 1 > $PIDFILE + api_check_error $? + fi +} + +api_stop() +{ + # If PIDFILE doesn't exists or PID isn't in running processes + if [ ! -f "$PIDFILE" ] || ! kill -0 `cat "$PIDFILE"` + then + exit 2 # STATE_UNCHANGED + else + # Send signal to end to the process + kill -15 `cat "$PIDFILE"` && rm -f "$PIDFILE" + api_check_error $? + fi +} + +api_restart() +{ + # Stop if running + if [ $(api_status) = 1 ] + then + kill -15 `cat "$PIDFILE"` && rm -f "$PIDFILE" + api_check_error $? + fi + + sleep 5 + api_start +} + +case "$1" in + 'start') + start + ;; + 'stop') + stop + ;; + 'status') + status + ;; + 'restart') + stop + sleep 5 + start + ;; + 'api_status') + api_status + ;; + 'api_start') + api_start + ;; + 'api_stop') + api_stop + ;; + 'api_restart') + api_restart + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|status|restart}\n" >&2 + exit 3 + ;; +esac +exit 0 diff --git a/src/main/java/org/minager/MinagerApplication.java b/src/main/java/org/minager/MinagerApplication.java new file mode 100644 index 0000000..07d2aa5 --- /dev/null +++ b/src/main/java/org/minager/MinagerApplication.java @@ -0,0 +1,14 @@ +package org.minager; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAutoConfiguration +public class MinagerApplication { + + public static void main(String[] args) { + SpringApplication.run(MinagerApplication.class, args); + } +} diff --git a/src/main/java/org/minager/account/AccountController.java b/src/main/java/org/minager/account/AccountController.java new file mode 100644 index 0000000..86b8039 --- /dev/null +++ b/src/main/java/org/minager/account/AccountController.java @@ -0,0 +1,96 @@ +package org.minager.account; + +import java.io.IOException; +import java.util.Optional; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.minager.core.entities.dto.PasswordWrapperDTO; +import org.minager.core.entities.dto.UserDTO; +import org.minager.core.entities.persistence.User; +import org.minager.core.security.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/account") +public class AccountController { + + private static final String HEADER_TOKEN = "token"; + + @Autowired + private AccountService accountService; + + @Autowired + private TokenService tokenService; + + /** + * Log in the user in request body. + * + * @param pUser + * The user to connect. + * @param response + * The reponse injected by Spring. + * @return The connected user object. + * @throws IOException + * If credentials are bad. + */ + @PostMapping("/login") + public UserDTO login(@RequestBody UserDTO pUser, HttpServletResponse response) throws IOException { + return accountService.checkCredentials(response, pUser); + } + + /** + * Log out the user. + * + * @param pRequest + * The request injected by Spring. + */ + @GetMapping("/logout") + public void logout(HttpServletRequest pRequest) { + tokenService.removeUser(pRequest.getHeader(HEADER_TOKEN)); + } + + /** + * Updates the user password. + * + * @param pPasswordWrapper + * The object which contains the old password for verification and + * the new password to set to the user. + * @param pRequest + * The request injected by Spring. + * @param pResponse + * The reponse injected by Spring. + * @throws IOException + * If the old password doesn't match to the user password in + * database. + */ + @PutMapping("/changePassword") + public void changePassword(@RequestBody final PasswordWrapperDTO pPasswordWrapper, + final HttpServletRequest pRequest, + final HttpServletResponse pResponse) throws IOException { + final Optional connectedUser = tokenService.getAuthenticatedUserByToken(pRequest); + if(connectedUser.isPresent()) { + accountService.changePassword(connectedUser.get(), pPasswordWrapper, pResponse); + } else { + pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); + } + } + + @PostMapping("/signin") + public UserDTO signin(@RequestBody final UserDTO pUser, final HttpServletResponse pResponse) throws IOException { + return accountService.signin(pUser, pResponse); + } + + @PutMapping("/") + public void update(@RequestBody final UserDTO pUser, final HttpServletRequest pRequest, + final HttpServletResponse pResponse) throws IOException { + accountService.updateUser(pUser, pRequest, pResponse); + } +} diff --git a/src/main/java/org/minager/account/AccountService.java b/src/main/java/org/minager/account/AccountService.java new file mode 100644 index 0000000..9aff9a2 --- /dev/null +++ b/src/main/java/org/minager/account/AccountService.java @@ -0,0 +1,124 @@ +package org.minager.account; + +import java.io.IOException; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.naming.AuthenticationException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.minager.core.entities.dto.PasswordWrapperDTO; +import org.minager.core.entities.dto.UserDTO; +import org.minager.core.entities.persistence.User; +import org.minager.core.repositories.UserRepository; +import org.minager.core.security.TokenService; +import org.minager.core.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +@Service +public class AccountService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private TokenService tokenService; + + /** + * Check the user credentials and generate him a token if they are correct. + * + * @param pUser + * The user sent from client. + * @return The user populated with the generated token. + * @throws IOException + * If the credentials are bad. + * @throws AuthenticationException + * If the credentials are wrong. + */ + public UserDTO checkCredentials(HttpServletResponse pResponse, UserDTO pUser) throws IOException { + UserDTO result = null; + + Optional user = userRepository.findByEmail(pUser.getEmail()); + + if(user.isPresent() && StringUtils.compareHash(pUser.getPassword(), user.get().getPassword())) { + tokenService.addUser(user.get()); + result = new UserDTO(user.get(), true); + } else { + pResponse.sendError(HttpServletResponse.SC_FORBIDDEN); + } + + return result; + } + + public void changePassword(final User pUser, final PasswordWrapperDTO pPasswordWrapper, + final HttpServletResponse pResponse) throws IOException { + if(pPasswordWrapper.getNewPassword().equals(pPasswordWrapper.getConfirmPassword())) { + // We fetch the connected user from database to get his hashed password + final Optional userFromDb = userRepository.findById(pUser.getId()); + if(userFromDb.isPresent() && StringUtils.compareHash(pPasswordWrapper.getOldPassword(), + userFromDb.get().getPassword())) { + userFromDb.get().setPassword(StringUtils.hashPassword(pPasswordWrapper.getNewPassword())); + userRepository.save(userFromDb.get()); + } else { + pResponse.sendError(HttpServletResponse.SC_FORBIDDEN, + "Le mot de passe saisi ne correspond pas au votre."); + } + } else { + pResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, + "Le mot de passe saisi ne correspond pas au votre."); + } + } + + public UserDTO signin(final UserDTO pUser, final HttpServletResponse pResponse) throws IOException { + User user = new User(); + + if(pUser.getName() == null || pUser.getEmail() == null || pUser.getPassword() == null || "".equals(pUser.getPassword().trim())) { + pResponse.sendError(HttpServletResponse.SC_BAD_REQUEST); + } else if(userRepository.findByEmail(pUser.getEmail()).isPresent()) { + pResponse.sendError(HttpServletResponse.SC_CONFLICT); + } else { + user.setName(pUser.getName()); + user.setEmail(pUser.getEmail()); + user.setPassword(StringUtils.hashPassword(pUser.getPassword())); + user.setInscriptionDate(new Date()); + userRepository.save(user); + } + + return new UserDTO(user); + } + + public void updateUser(final UserDTO pUser, final HttpServletRequest pRequest, + final HttpServletResponse pResponse) throws IOException { + final Optional connectedUserOpt = tokenService.getAuthenticatedUserByToken(pRequest); + if(connectedUserOpt.isPresent()) { + final User connectedUser = connectedUserOpt.get(); + + final Optional userFromDb = userRepository.findByEmail(pUser.getEmail()); + + /* + * If a user is returned by the repository, that's the email adress is used, but + * if it is not the same as the connected user, that's the email adress + * corresponds to another user. So a 409 error is sent. Otherwise, if no user is + * returned by the repository, that's the email adress is free to be used. So, + * user can change him email adress. + */ + if(userFromDb.isPresent() && !connectedUser.getEmail().equals(userFromDb.get().getEmail())) { + pResponse.sendError(HttpServletResponse.SC_CONFLICT); + } else { + connectedUser.setName(pUser.getName()); + connectedUser.setEmail(pUser.getEmail()); + + userRepository.save(connectedUser); + } + } else { + pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); + } + } +} diff --git a/src/main/java/org/minager/core/AbstractFilter.java b/src/main/java/org/minager/core/AbstractFilter.java new file mode 100644 index 0000000..56b4918 --- /dev/null +++ b/src/main/java/org/minager/core/AbstractFilter.java @@ -0,0 +1,129 @@ +package org.minager.core; + +import java.io.IOException; +import java.util.List; +import java.util.regex.Pattern; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.minager.core.security.Route; +import org.minager.core.utils.StringUtils; +import org.springframework.http.HttpMethod; + +/** + * Base class for all filters of the application.
+ *
+ * The children classes have to implements the method + * {@link AbstractFilter#getClass()} to set the URLs filtered (with all or some + * http methods), and the method + * {@link AbstractFilter#filter(HttpServletRequest, ServletResponse, FilterChain)} + * to define the filter processing. + * + * @author Takiguchi + * + */ +public abstract class AbstractFilter implements Filter { + + /** Regex url path prefix for method {@link this#isRequestFiltered(String)}. */ + private static final String PREFIX_URL_PATH = "https?:\\/\\/.*(:\\d{0,5})?"; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // Do nothing + } + + /** + * Returns the list of routes which will be processed by the filter. + * + * @return The routes. + */ + protected abstract List getRoutes(); + + /** + * Filter actions for its processing. + * + * @param request + * The http request. + * @param response + * The response. + * @param chain + * The chain. + */ + protected abstract void filter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException; + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + + if(isRequestFiltered(httpRequest.getRequestURL().toString(), httpRequest.getMethod())) { + filter(httpRequest, (HttpServletResponse) response, chain); + } else { + chain.doFilter(request, response); + } + } + + /** + * Check if the url is allowed with the given method in parameters. + * + * @param pRequestUrl + * The url request. + * @param pRequestMethod + * The http method of the request. + * @return {@code true} if the url is allowed with the method, {@code false} + * otherwise. + */ + boolean isRequestFiltered(final String pRequestUrl, final String pRequestMethod) { + boolean result = false; + + for(final Route route : getRoutes()) { + /* + * Check urls matching, and if the method of the route isn't set, all methods + * are allowed. Otherwise, we check the methods too. + */ + if(Pattern.matches(StringUtils.concat(PREFIX_URL_PATH, route.getUrl()), pRequestUrl)) { + if(!route.getMethod().isPresent() || isMethodFiltered(route, pRequestMethod)) { + result = true; + break; + } + } + } + + return result; + } + + /** + * Checks if the route do filter the method in parameters. + * + * @param pRoute + * The registered route. + * @param pRequestMethod + * The http method to check with the registered route. + */ + boolean isMethodFiltered(final Route pRoute, final String pRequestMethod) { + boolean result = false; + + if(pRoute.getMethod().isPresent()) { + for(final HttpMethod routeMethod : pRoute.getMethod().get()) { + if(routeMethod.name().equals(pRequestMethod)) { + result = true; + break; + } + } + } + + return result; + } + + @Override + public void destroy() { + // Do nothing + } +} diff --git a/src/main/java/org/minager/core/config/JpaConfiguration.java b/src/main/java/org/minager/core/config/JpaConfiguration.java new file mode 100644 index 0000000..89a13c4 --- /dev/null +++ b/src/main/java/org/minager/core/config/JpaConfiguration.java @@ -0,0 +1,42 @@ +package org.minager.core.config; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EntityScan("org.minager") +@EnableTransactionManagement +@EnableJpaRepositories("org.minager") +@PropertySource("classpath:application.properties") +public class JpaConfiguration { + + @Value("${spring.datasource.driverClassName}") + private String driverClassName; + + @Value("${spring.datasource.url}") + private String url; + + @Value("${spring.datasource.username}") + private String username; + + @Value("${spring.datasource.password}") + private String password; + + @Bean(name="dataSource") + public DataSource getDataSource() { + return DataSourceBuilder.create() + .username(username) + .password(password) + .url(url) + .driverClassName(driverClassName) + .build(); + } +} diff --git a/src/main/java/org/minager/core/constant/ResultCode.java b/src/main/java/org/minager/core/constant/ResultCode.java new file mode 100644 index 0000000..a7098a9 --- /dev/null +++ b/src/main/java/org/minager/core/constant/ResultCode.java @@ -0,0 +1,18 @@ +package org.minager.core.constant; + +public enum ResultCode { + SUCCESS(0), + FAILED(1), + STATE_UNCHANGED(2), + ILLEGAL_ARGUMENT(3); + + private int val; + + private ResultCode(final int pVal) { + val = pVal; + } + + public int val() { + return val; + } +} diff --git a/src/main/java/org/minager/core/entities/business/SystemResult.java b/src/main/java/org/minager/core/entities/business/SystemResult.java new file mode 100644 index 0000000..fbd6d05 --- /dev/null +++ b/src/main/java/org/minager/core/entities/business/SystemResult.java @@ -0,0 +1,99 @@ +package org.minager.core.entities.business; + +/** + * Object that contains the results of a system command. + * + * @author takiguchi + * + */ +public class SystemResult { + /** The result code of the command. */ + private int resultCode; + /** The standard output of the command. */ + private StringBuilder stdOut; + /** The standard errors output of the command. */ + private StringBuilder stdErr; + + public SystemResult() { + super(); + stdOut = new StringBuilder(); + stdErr = new StringBuilder(); + } + + /** + * Gets the result code. + * + * @return the result code + */ + public int getResultCode() { + return resultCode; + } + + /** + * Sets the result code. + * + * @param resultCode + * the new result code + */ + public void setResultCode(int resultCode) { + this.resultCode = resultCode; + } + + /** + * Gets the std out. + * + * @return the std out + */ + public String getStdOut() { + return stdOut.toString(); + } + + /** + * Add an output line to the {@code stdOut}. + * + * @param pLine + * The output line to append. + */ + public void addOutputLine(final String pLine) { + stdOut.append(pLine); + } + + /** + * Sets the std out. + * + * @param stdOut + * the new std out + */ + public void setStdOut(String stdOut) { + this.stdOut = new StringBuilder(stdOut); + } + + /** + * Gets the std err. + * + * @return the std err + */ + public String getStdErr() { + return stdErr.toString(); + } + + /** + * Add an error line to the {@code stdErr}. + * + * @param pLine + * The error line to append. + */ + public void addErrorLine(final String pLine) { + stdErr.append(pLine); + } + + /** + * Sets the std err. + * + * @param stdErr + * the new std err + */ + public void setStdErr(String stdErr) { + this.stdErr = new StringBuilder(stdErr); + } +} \ No newline at end of file diff --git a/src/main/java/org/minager/core/entities/dto/PasswordWrapperDTO.java b/src/main/java/org/minager/core/entities/dto/PasswordWrapperDTO.java new file mode 100644 index 0000000..2de50a1 --- /dev/null +++ b/src/main/java/org/minager/core/entities/dto/PasswordWrapperDTO.java @@ -0,0 +1,34 @@ +package org.minager.core.entities.dto; + +public class PasswordWrapperDTO { + + private String oldPassword; + + private String newPassword; + + private String confirmPassword; + + public String getOldPassword() { + return oldPassword; + } + + public void setOldPassword(String oldPassword) { + this.oldPassword = oldPassword; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + public String getConfirmPassword() { + return confirmPassword; + } + + public void setConfirmPassword(String confirmPassword) { + this.confirmPassword = confirmPassword; + } +} diff --git a/src/main/java/org/minager/core/entities/dto/UserDTO.java b/src/main/java/org/minager/core/entities/dto/UserDTO.java new file mode 100644 index 0000000..944e9e3 --- /dev/null +++ b/src/main/java/org/minager/core/entities/dto/UserDTO.java @@ -0,0 +1,97 @@ +package org.minager.core.entities.dto; + +import java.util.Date; + +import org.minager.core.entities.persistence.User; + +public class UserDTO { + + private String key; + + private String name; + + private String email; + + private String password; + + private String image; + + private Date inscriptionDate; + + private String token; + + public UserDTO() { + super(); + } + + public UserDTO(final User pUser) { + key = pUser.getKey(); + name = pUser.getName(); + email = pUser.getEmail(); + image = pUser.getImage(); + inscriptionDate = pUser.getInscriptionDate(); + } + + public UserDTO(final User pUser, final boolean pWithToken) { + this(pUser); + if(pWithToken) { + token = pUser.getToken().getValue(); + } + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Date getInscriptionDate() { + return inscriptionDate; + } + + public void setInscriptionDate(Date inscriptionDate) { + this.inscriptionDate = inscriptionDate; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } +} diff --git a/src/main/java/org/minager/core/entities/persistence/User.java b/src/main/java/org/minager/core/entities/persistence/User.java new file mode 100644 index 0000000..0277c38 --- /dev/null +++ b/src/main/java/org/minager/core/entities/persistence/User.java @@ -0,0 +1,126 @@ +package org.minager.core.entities.persistence; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.hibernate.annotations.Generated; +import org.hibernate.annotations.GenerationTime; +import org.minager.core.entities.security.Token; + +@Entity +@Table(name="`user`") +public class User implements Serializable { + private static final long serialVersionUID = 1L; + + /* ******************* */ + /* Attributes */ + /* ******************* */ + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="user_id_seq") + @SequenceGenerator(name="user_id_seq", sequenceName="user_id_seq", allocationSize=1) + private Long id; + + // This annotation serves to fetch the attribute after an insert into db + @Generated(GenerationTime.ALWAYS) + private String key; + + private String name; + + private String email; + + private String password; + + private String image; + + @Column(name = "inscription_date") + @Temporal(TemporalType.TIMESTAMP) + private Date inscriptionDate; + + /** Authentication token. */ + private transient Token token; + + /* ******************* */ + /* Constructors */ + /* ******************* */ + public User() { + super(); + token = new Token(); + } + + /* ******************* */ + /* Getters & Setters */ + /* ******************* */ + public Long getId() { + return id; + } + + public void setId(Long id) { + if(this.id != null) { + throw new IllegalAccessError("It's not allowed to rewrite the id entity."); + } + this.id = id; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Date getInscriptionDate() { + return inscriptionDate; + } + + public void setInscriptionDate(Date inscriptionDate) { + this.inscriptionDate = inscriptionDate; + } + + public Token getToken() { + return token; + } + +} diff --git a/src/main/java/org/minager/core/entities/security/Token.java b/src/main/java/org/minager/core/entities/security/Token.java new file mode 100644 index 0000000..c2a314d --- /dev/null +++ b/src/main/java/org/minager/core/entities/security/Token.java @@ -0,0 +1,82 @@ +package org.minager.core.entities.security; + +import java.math.BigInteger; +import java.security.SecureRandom; +import java.util.Calendar; + +public class Token { + /** The metric in which the validation delay is defined. */ + private static final int METRIC = Calendar.MINUTE; + /** Number of {@link METRIC} after that the token become invalid. */ + private static final int DELAY = 30; + + /** The Constant BITS_NUMBER. */ + private static final int BITS_NUMBER = 1000; + /** The Constant RADIX. */ + private static final int RADIX = 32; + + /** The value. */ + private String value; + + /** + * Last access date. For each request to the server, this date is consulted + * and if the valid delay is ok, this date must be updated. + */ + private Calendar lastAccess; + + /** + * Instantiates a new token. + */ + public Token() { + super(); + value = new BigInteger(BITS_NUMBER, new SecureRandom()).toString(RADIX); + lastAccess = Calendar.getInstance(); + } + + /** + * Gets the value. + * + * @return the value + */ + public String getValue() { + return value; + } + + /** + * Gets the last access date. + * + * @return the last access date + */ + public Calendar getLastAccess() { + return lastAccess; + } + + /** + * Sets the last access date. + */ + public void setLastAccess() { + lastAccess = Calendar.getInstance(); + } + + /** + * Indicate if the token is still valid.
+ * A token is valid is its {@link Token#lastAccess} is after the current + * date minus the {@link Token#DELAY} {@link Token#METRIC}.
+ *
+ * Example:
+ * {@link Token#DELAY} = 30 and {@link Token#METRIC} = + * {@link Calendar#MINUTE}.
+ * A token is valid only on the 30 minutes after its + * {@link Token#lastAccess}.
+ * If the current date-time minus the 30 minutes is before the + * {@link Token#lastAccess}, the token is still valid. + * + * @return {@code true} if the token is still valid, {@code false} + * otherwise. + */ + public boolean isValid() { + final Calendar lastTimeValidation = Calendar.getInstance(); + lastTimeValidation.add(METRIC, -DELAY); + return lastAccess.getTime().after(lastTimeValidation.getTime()); + } +} diff --git a/src/main/java/org/minager/core/repositories/UserRepository.java b/src/main/java/org/minager/core/repositories/UserRepository.java new file mode 100644 index 0000000..31d1601 --- /dev/null +++ b/src/main/java/org/minager/core/repositories/UserRepository.java @@ -0,0 +1,39 @@ +package org.minager.core.repositories; + +import java.util.Optional; + +import javax.transaction.Transactional; + +import org.minager.core.entities.persistence.User; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends CrudRepository { + + Optional findByEmail(@Param("email") final String pEmail); + + /** + * Checks if the password in parameters is the passwords of the user in + * database. + * + * @param pId + * The user id. + * @param pPassword + * The password to check. + * @return {@code true} if the password is the user password in database, + * {@code false} otherwise. + */ + @Query(value = "SELECT CASE WHEN EXISTS(" + + " SELECT id FROM \"user\" WHERE id = :id AND password = :password" + + ") THEN TRUE ELSE FALSE END", nativeQuery = true) + boolean checkPassword(@Param("id") final Long pId, @Param("password") final String pPassword); + + @Query(value = "UPDATE \"user\" SET password = :password WHERE id = :id", nativeQuery = true) + @Transactional + @Modifying + void updatePassword(@Param("id") final Long pId, @Param("password") final String pPassword); +} diff --git a/src/main/java/org/minager/core/security/AuthenticationFilter.java b/src/main/java/org/minager/core/security/AuthenticationFilter.java new file mode 100644 index 0000000..3805b78 --- /dev/null +++ b/src/main/java/org/minager/core/security/AuthenticationFilter.java @@ -0,0 +1,47 @@ +package org.minager.core.security; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.minager.core.AbstractFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +public class AuthenticationFilter extends AbstractFilter { + + private static final String HTTP_OPTIONS = "OPTIONS"; + + private static final String HEADER_TOKEN = "token"; + + @Autowired + private TokenService tokenService; + + @Override + protected List getRoutes() { + return Arrays.asList( + new Route("\\/api\\/server\\/start"), + new Route("\\/api\\/server\\/stop"), + new Route("\\/api\\/server\\/restart") + ); + } + + @Override + protected void filter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + if(HTTP_OPTIONS.equals(request.getMethod()) || tokenService.isUserConnected(request.getHeader(HEADER_TOKEN))) { + chain.doFilter(request, response); + } else { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } + } + +} diff --git a/src/main/java/org/minager/core/security/CorsFilter.java b/src/main/java/org/minager/core/security/CorsFilter.java new file mode 100644 index 0000000..daf1bea --- /dev/null +++ b/src/main/java/org/minager/core/security/CorsFilter.java @@ -0,0 +1,44 @@ +package org.minager.core.security; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +public class CorsFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // Do nothing + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.addHeader("Access-Control-Allow-Origin", "*"); + httpResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, HEAD"); + httpResponse.addHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); + httpResponse.addHeader("Access-Control-Expose-Headers", "Access-Control-Allow-Origin, Access-Control-Allow-Credentials"); + httpResponse.addHeader("Access-Control-Allow-Credentials", "true"); + httpResponse.addIntHeader("Access-Control-Max-Age", 10); + chain.doFilter(request, httpResponse); + } + + @Override + public void destroy() { + // Do nothing + } + +} diff --git a/src/main/java/org/minager/core/security/Route.java b/src/main/java/org/minager/core/security/Route.java new file mode 100644 index 0000000..927843b --- /dev/null +++ b/src/main/java/org/minager/core/security/Route.java @@ -0,0 +1,71 @@ +package org.minager.core.security; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import org.springframework.http.HttpMethod; + +/** + * Route for filter matching. + * + * @author Takiguchi + * + */ +public class Route { + /** The regex to match urls. */ + private String url; + /** The http method to match. Use a {@link Optional#empty()} to match all methods. */ + private Optional> method; + + /** + * Instanciate a vierge route. + */ + public Route() { + super(); + url = ""; + method = Optional.empty(); + } + + /** + * Instanciate a route for all http methods. + * + * @param pUrl + * The regex to match urls. + */ + public Route(final String pUrl) { + this(); + this.url = pUrl; + } + + /** + * Instanciate a route for methods given in parameters + * + * @param pUrl + * The regex to match urls. + * @param pMethod + * The http method to match. Use a {@link Optional#empty()} to match + * all methods. + */ + public Route(final String pUrl, final HttpMethod... pMethods) { + this(pUrl); + this.method = Optional.of(Arrays.asList(pMethods)); + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Optional> getMethod() { + return method; + } + + public void setMethod(HttpMethod pMethods) { + this.method = Optional.of(Arrays.asList(pMethods)); + } + +} diff --git a/src/main/java/org/minager/core/security/TokenService.java b/src/main/java/org/minager/core/security/TokenService.java new file mode 100644 index 0000000..fc16093 --- /dev/null +++ b/src/main/java/org/minager/core/security/TokenService.java @@ -0,0 +1,132 @@ +package org.minager.core.security; + +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; + +import javax.servlet.http.HttpServletRequest; + +import org.minager.core.entities.persistence.User; +import org.springframework.stereotype.Service; + +@Service +public class TokenService { + /** Map of connected users. */ + private static final Map connectedUsers; + + private static final String HEADER_TOKEN = "token"; + + private static final long INTERVAL_USER_CLEANING = 5; + + private static final long INTERVAL_USER_CLEANING_VAL = INTERVAL_USER_CLEANING * 60 * 1000; + + private Date lastUsersCleaning; + + /** + * Class constructor + */ + static { + connectedUsers = new TreeMap<>(); + } + + /** + * Check if the token matches to a user session, and if it is still valid. + * + * @param pToken + * The token to check. + * @return {@code true} if the token is still valid, {@code false} + * otherwise. + */ + public boolean isUserConnected(final String pToken) { + boolean result = false; + + if (pToken != null && connectedUsers.containsKey(pToken)) { + if (connectedUsers.get(pToken).getToken().isValid()) { + result = true; + } else { + connectedUsers.remove(pToken); + } + } + + // clear all the expired sessions + final Date now = new Date(); + if(lastUsersCleaning == null || now.getTime() - lastUsersCleaning.getTime() >= INTERVAL_USER_CLEANING_VAL) { + new Thread(this::clearExpiredUsers).start(); + lastUsersCleaning = now; + } + + + return result; + } + + /** + * Remove from the connected users map all the elements which their token is + * expired. + */ + private void clearExpiredUsers() { + synchronized (this) { + List usersToRemove = new LinkedList<>(); + connectedUsers.entrySet().stream().forEach(user -> { + if(!user.getValue().getToken().isValid()) { + usersToRemove.add(user.getValue()); + } + }); + usersToRemove.stream().map(User::getKey).forEach(connectedUsers::remove); + } + } + + /** + * Add the user to the connected users map. + * + * @param pUser + * The user to add. + */ + public void addUser(final User pUser) { + if(connectedUsers.get(pUser.getToken().getValue()) == null) { + connectedUsers.put(pUser.getToken().getValue(), pUser); + } + } + + /** + * Refresh the user token last access date in the token service. + * + * @param pToken + * The user token. + */ + public void refreshUserToken(final String pToken) { + final User user = connectedUsers.get(pToken); + if(user != null) { + user.getToken().setLastAccess(); + } + } + + /** + * Remove the user to the connected users map. + * + * @param pUser + * The user to remove. + */ + public void removeUser(final User pUser) { + removeUser(pUser.getToken().getValue()); + } + + /** + * Remove the user associated to the token given in parameters, from the + * connected users map. + * + * @param pToken + * The user to delete token. + */ + public void removeUser(final String pToken) { + if(pToken != null && connectedUsers.containsKey(pToken)) { + connectedUsers.remove(pToken); + } + } + + public Optional getAuthenticatedUserByToken(final HttpServletRequest pRequest) { + return Optional.ofNullable(connectedUsers.get(pRequest.getHeader(HEADER_TOKEN))); + } +} diff --git a/src/main/java/org/minager/core/services/business/SystemService.java b/src/main/java/org/minager/core/services/business/SystemService.java new file mode 100644 index 0000000..ff7839e --- /dev/null +++ b/src/main/java/org/minager/core/services/business/SystemService.java @@ -0,0 +1,69 @@ +package org.minager.core.services.business; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import org.minager.core.entities.business.SystemResult; +import org.springframework.stereotype.Service; + +@Service +public class SystemService { + + public SystemResult executeCommand(final String pCommand, final String... pArgs) { + final String command = buildCommand(pCommand, pArgs); + + final SystemResult commandResults = new SystemResult(); + + try { + // Process creation and execution of the command. + final Process process = Runtime.getRuntime().exec(command); + + // Waiting the end of the command execution. + process.waitFor(); + + // Getting of the stantard command output, and the standard error output. + BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); + BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + + String tempLine = null; + while((tempLine = outputReader.readLine()) != null) { + commandResults.addOutputLine(tempLine); + } + + while((tempLine = errorReader.readLine()) != null) { + commandResults.addErrorLine(tempLine); + } + + commandResults.setResultCode(process.exitValue()); + } catch(IOException | InterruptedException ex) { +// LOGGER.error(StringUtils.concat("Une erreur est survenue lors de l'exécution de la commande \"", command, +// "\"."), ex); + System.err.println(ex.getMessage()); + ex.printStackTrace(); + } + + return commandResults; + } + + /** + * Build the command in form of one string from the parameters. + * + * @param pCommand + * The command to execute. + * @param pArgs + * The command arguments, could be {@code null}. + * @return The command built. + */ + private String buildCommand(final String pCommand, final Object... pArgs) { + final StringBuilder command = new StringBuilder(pCommand); + + if (pArgs != null) { + for (final Object arg : pArgs) { + command.append(" ").append(arg); + } + } + + return command.toString(); + } +} diff --git a/src/main/java/org/minager/core/utils/RegexUtils.java b/src/main/java/org/minager/core/utils/RegexUtils.java new file mode 100644 index 0000000..f42912d --- /dev/null +++ b/src/main/java/org/minager/core/utils/RegexUtils.java @@ -0,0 +1,82 @@ +package org.minager.core.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class RegexUtils { + + private static final String EMAIL_REGEX = "^.*@.*\\..{2,}$"; + private static final String LOWER_LETTERS_REGEX = ".*[a-z].*"; + private static final String UPPER_LETTERS_REGEX = ".*[A-Z].*"; + private static final String NUMBER_REGEX = ".*[0-9].*"; + private static final String SPECIAL_CHAR_REGEX = ".*\\W.*"; + private static final String NUMBER_ONLY_REGEX = "^[0-9]+$"; + + // La portée "package" permet à la classe StringUtils d'utiliser les patterns + // suivants : + static final Pattern EMAIL_PATTERN; + static final Pattern LOWER_LETTERS_PATTERN; + static final Pattern UPPER_LETTERS_PATTERN; + static final Pattern NUMBER_PATTERN; + static final Pattern SPECIAL_CHAR_PATTERN; + static final Pattern NUMBER_ONLY_PATTERN; + + static { + EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX); + LOWER_LETTERS_PATTERN = Pattern.compile(LOWER_LETTERS_REGEX); + UPPER_LETTERS_PATTERN = Pattern.compile(UPPER_LETTERS_REGEX); + NUMBER_PATTERN = Pattern.compile(NUMBER_REGEX); + SPECIAL_CHAR_PATTERN = Pattern.compile(SPECIAL_CHAR_REGEX); + NUMBER_ONLY_PATTERN = Pattern.compile(NUMBER_ONLY_REGEX); + } + + /** + * Chekcs if {@code pString} corresponds to an email address. + * + * @param pString + * The string which should be an email address. + * @return {@code true} if {@link pString} corresponds to an email address, + * {@code false} otherwise. + */ + public static boolean isEmail(final String pString) { + return EMAIL_PATTERN.matcher(pString).find(); + } + + /** + * Replace the sequences of {@code pString} matched by the {@code pRegex} + * with the {@code pReplacingString}. + * + * @param pString + * The string to update. + * @param pRegex + * The regex to match the sentences to replace. + * @param pReplacingString + * The string to replace the sentences which match with the + * regex. + * @return The new string. + */ + public static String replaceSequence(final String pString, + final String pRegex, final String pReplacingString) { + return Pattern.compile(pRegex).matcher(pString) + .replaceAll(pReplacingString); + } + + /** + * Checks if {@code pString} corresponds to a number. + * + * @param pString + * The string which should be a number. + * @return {@code true} if {@code pString} corresponds to a number, + * {@code false} otherwise. + */ + public static boolean isNumber(final String pString) { + return NUMBER_ONLY_PATTERN.matcher(pString).find(); + } + + public static String getGroup(final String regex, final int numeroGroupe, final String chaine) { + final Pattern pattern = Pattern.compile(regex); + final Matcher matcher = pattern.matcher(chaine); + matcher.find(); + return matcher.group(numeroGroupe); + } +} \ No newline at end of file diff --git a/src/main/java/org/minager/core/utils/StringUtils.java b/src/main/java/org/minager/core/utils/StringUtils.java new file mode 100644 index 0000000..117d417 --- /dev/null +++ b/src/main/java/org/minager/core/utils/StringUtils.java @@ -0,0 +1,93 @@ +package org.minager.core.utils; + +import org.mindrot.jbcrypt.BCrypt; + +/** + * Generic methods about {@link String} class. + * + * @author takiguchi + * + */ +public final class StringUtils { + + /** + * Indicate if {@code pString} is null or just composed of spaces. + * + * @param pString + * The string to test. + * @return {@code true} if {@code pString} is null or just composed of + * spaces, {@code false} otherwise. + */ + public static boolean isNull(final String chaine) { + return chaine == null || chaine.trim().length() == 0; + } + + /** + * Hash the password given into parameters. + * + * @param pPassword The password to hash. + * @return The password hashed. + */ + public static String hashPassword(final String pPassword) { + return hashString(pPassword, 10); + } + + public static String hashString(final String pString, final int pSalt) { + return BCrypt.hashpw(pString, BCrypt.gensalt(pSalt)); + } + + /** + * Compare the password and the hashed string given into parameters. + * + * @param pPassword + * The password to compare to the hashed string. + * @param pHashToCompare + * The hashed string to compare to the password. + * @return {@code true} if the password matches to the hashed string. + */ + public static boolean compareHash(final String pPassword, final String pHashToCompare) { + return BCrypt.checkpw(pPassword, pHashToCompare); + } + + /** + * Concatenate the parameters to form just one single string. + * + * @param pArgs + * The strings to concatenate. + * @return The parameters concatenated. + */ + public static String concat(final Object... pArgs) { + final StringBuilder result = new StringBuilder(); + for (final Object arg : pArgs) { + result.append(arg); + } + return result.toString(); + } + + public static String printStrings(final String... pStrings) { + final StringBuilder result = new StringBuilder(); + for (int i = 0 ; i < pStrings.length ; i++) { + result.append(pStrings[i]); + if(i < pStrings.length - 1) { + result.append(","); + } + } + return result.toString(); + } + + public static boolean containLowercase(final String pString) { + return RegexUtils.LOWER_LETTERS_PATTERN.matcher(pString).find(); + } + + public static boolean containUppercase(final String pString) { + return RegexUtils.UPPER_LETTERS_PATTERN.matcher(pString).find(); + } + + public static boolean containNumber(final String pString) { + return RegexUtils.NUMBER_PATTERN.matcher(pString).find(); + } + + public static boolean containSpecialChar(final String pString) { + return RegexUtils.SPECIAL_CHAR_PATTERN.matcher(pString).find(); + } +} diff --git a/src/main/java/org/minager/serverhandling/ServerHandlingController.java b/src/main/java/org/minager/serverhandling/ServerHandlingController.java new file mode 100644 index 0000000..ad25eed --- /dev/null +++ b/src/main/java/org/minager/serverhandling/ServerHandlingController.java @@ -0,0 +1,38 @@ +package org.minager.serverhandling; + +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/server") +public class ServerHandlingController { + @Autowired + private ServerHandlingService serverHandlingService; + + @GetMapping("/status") + public int getStatus() { + return serverHandlingService.getStatus(); + } + + @PostMapping("/start") + public void startServer(final HttpServletResponse pResponse) throws IOException { + serverHandlingService.startServer(pResponse); + } + + @PostMapping("/stop") + public void stopServer(final HttpServletResponse pResponse) throws IOException { + serverHandlingService.stopServer(pResponse); + } + + @PostMapping("/restart") + public void restartServer(final HttpServletResponse pResponse) throws IOException { + serverHandlingService.restartServer(pResponse); + } +} diff --git a/src/main/java/org/minager/serverhandling/ServerHandlingService.java b/src/main/java/org/minager/serverhandling/ServerHandlingService.java new file mode 100644 index 0000000..313aacf --- /dev/null +++ b/src/main/java/org/minager/serverhandling/ServerHandlingService.java @@ -0,0 +1,59 @@ +package org.minager.serverhandling; + +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.minager.core.constant.ResultCode; +import org.minager.core.entities.business.SystemResult; +import org.minager.core.services.business.SystemService; +import org.minager.core.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class ServerHandlingService { + + @Autowired + private SystemService systemService; + + @Value("${minecraft.server.path}") + private String minecraftServerPath; + + @Value("${minecraft.server.shell.name}") + private String minecraftServerShellName; + + private String buildMinecraftServerShellPath() { + return StringUtils.concat(minecraftServerPath, + minecraftServerPath.charAt(minecraftServerPath.length() - 1) == '/' ? "" : '/', + minecraftServerShellName); + } + + public int getStatus() { + final SystemResult shellResult = systemService.executeCommand(buildMinecraftServerShellPath(), "api_status"); + return Integer.parseInt(shellResult.getStdOut()); + } + + private void startOrStopServer(final HttpServletResponse pResponse, final String pAction) throws IOException { + final SystemResult shellResult = systemService.executeCommand(buildMinecraftServerShellPath(), pAction); + + if(shellResult.getResultCode() == ResultCode.FAILED.val()) { + pResponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); + } else if(shellResult.getResultCode() == ResultCode.STATE_UNCHANGED.val()) { + pResponse.sendError(HttpServletResponse.SC_CONFLICT); + } // else -> SUCCESS, so code 200 + } + + public void startServer(final HttpServletResponse pResponse) throws IOException { + startOrStopServer(pResponse, "api_start"); + } + + public void stopServer(final HttpServletResponse pResponse) throws IOException { + startOrStopServer(pResponse, "api_stop"); + } + + public void restartServer(final HttpServletResponse pResponse) throws IOException { + startOrStopServer(pResponse, "api_restart"); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..06bb90a --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,15 @@ +# *********************************************** +# Hibernate database configuration +# *********************************************** +spring.datasource.driverClassName=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/db_minager +spring.datasource.username=minager +spring.datasource.password=P@ssword +# Disable feature detection by this undocumented parameter. Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details. +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false + +# *********************************************** +# Application custom parameters +# *********************************************** +minecraft.server.path=/home/minecraft/server +minecraft.server.shell.name=minecraft-server.sh \ No newline at end of file diff --git a/src/main/sql/0_init_db.sql b/src/main/sql/0_init_db.sql new file mode 100644 index 0000000..29aa756 --- /dev/null +++ b/src/main/sql/0_init_db.sql @@ -0,0 +1,25 @@ +-- Execute with psql as postgres user +create user minager_admin with password 'P@ssword'; +create user minager with password 'P@ssword'; +create database db_minager owner minager_admin; +\c db_minager; + +-- ****************************************************************** +-- T A B L E S +-- ****************************************************************** +drop table if exists "user"; + +create table "user" ( + "id" serial, + "key" varchar, + "name" varchar, + "email" varchar, + "password" varchar, + "image" varchar, + "inscription_date" timestamp, + constraint user_pk primary key ("id"), + constraint user_key_unique unique ("key"), + constraint user_email_unique unique ("email") +); +grant select, insert, update, delete on "user" to minager; +grant usage, select, update on user_id_seq to minager; \ No newline at end of file diff --git a/src/main/ts/.editorconfig b/src/main/ts/.editorconfig new file mode 100644 index 0000000..6e87a00 --- /dev/null +++ b/src/main/ts/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/src/main/ts/README.md b/src/main/ts/README.md new file mode 100644 index 0000000..29dcc0d --- /dev/null +++ b/src/main/ts/README.md @@ -0,0 +1,27 @@ +# Ts + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.3. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/src/main/ts/angular.json b/src/main/ts/angular.json new file mode 100644 index 0000000..ae457b5 --- /dev/null +++ b/src/main/ts/angular.json @@ -0,0 +1,137 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ts": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "schematics": { + "@schematics/angular:component": { + "styleext": "scss" + } + }, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/ts", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.png", + "src/assets" + ], + "styles": [ + "node_modules/font-awesome/scss/font-awesome.scss", + "node_modules/angular-bootstrap-md/scss/bootstrap/bootstrap.scss", + "node_modules/angular-bootstrap-md/scss/mdb-free.scss", + "src/styles.scss" + ], + "scripts": [ + "node_modules/chart.js/dist/Chart.js", + "node_modules/hammerjs/hammer.min.js" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ts:build" + }, + "configurations": { + "production": { + "browserTarget": "ts:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ts:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "src/styles.scss" + ], + "scripts": [], + "assets": [ + "src/favicon.ico", + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "ts-e2e": { + "root": "e2e/", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "ts:serve" + }, + "configurations": { + "production": { + "devServerTarget": "ts:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "ts" +} \ No newline at end of file diff --git a/src/main/ts/e2e/protractor.conf.js b/src/main/ts/e2e/protractor.conf.js new file mode 100644 index 0000000..86776a3 --- /dev/null +++ b/src/main/ts/e2e/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.e2e.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/src/main/ts/e2e/src/app.e2e-spec.ts b/src/main/ts/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..9fe8cab --- /dev/null +++ b/src/main/ts/e2e/src/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { AppPage } from './app.po'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Welcome to ts!'); + }); +}); diff --git a/src/main/ts/e2e/src/app.po.ts b/src/main/ts/e2e/src/app.po.ts new file mode 100644 index 0000000..82ea75b --- /dev/null +++ b/src/main/ts/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/src/main/ts/e2e/tsconfig.e2e.json b/src/main/ts/e2e/tsconfig.e2e.json new file mode 100644 index 0000000..a6dd622 --- /dev/null +++ b/src/main/ts/e2e/tsconfig.e2e.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} \ No newline at end of file diff --git a/src/main/ts/package.json b/src/main/ts/package.json new file mode 100644 index 0000000..91d2773 --- /dev/null +++ b/src/main/ts/package.json @@ -0,0 +1,55 @@ +{ + "name": "ts", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "^6.1.0", + "@angular/common": "^6.1.0", + "@angular/compiler": "^6.1.0", + "@angular/core": "^6.1.0", + "@angular/forms": "^6.1.0", + "@angular/http": "^6.1.0", + "@angular/platform-browser": "^6.1.0", + "@angular/platform-browser-dynamic": "^6.1.0", + "@angular/router": "^6.1.0", + "@ngtools/webpack": "^1.2.4", + "@types/chart.js": "^2.7.36", + "angular-bootstrap-md": "^6.2.4", + "angular5-csv": "^0.2.10", + "chart.js": "^2.5.0", + "core-js": "^2.5.4", + "font-awesome": "^4.7.0", + "hammerjs": "^2.0.8", + "rxjs": "~6.2.0", + "zone.js": "~0.8.26" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.8.0", + "@angular/cli": "~6.2.3", + "@angular/compiler-cli": "^6.1.0", + "@angular/language-service": "^6.1.0", + "@types/jasmine": "~2.8.8", + "@types/jasminewd2": "~2.0.3", + "@types/node": "~8.9.4", + "codelyzer": "~4.3.0", + "jasmine-core": "~2.99.1", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~3.0.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~1.1.2", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tslint": "~5.11.0", + "typescript": "~2.9.2" + } +} diff --git a/src/main/ts/src/app/app.component.html b/src/main/ts/src/app/app.component.html new file mode 100644 index 0000000..f35249f --- /dev/null +++ b/src/main/ts/src/app/app.component.html @@ -0,0 +1,6 @@ + +
+ +
+ + diff --git a/src/main/ts/src/app/app.component.scss b/src/main/ts/src/app/app.component.scss new file mode 100644 index 0000000..13dbfd3 --- /dev/null +++ b/src/main/ts/src/app/app.component.scss @@ -0,0 +1,4 @@ +main { + margin-top: 84px; + padding-top: 25px; +} \ No newline at end of file diff --git a/src/main/ts/src/app/app.component.spec.ts b/src/main/ts/src/app/app.component.spec.ts new file mode 100644 index 0000000..8d664b2 --- /dev/null +++ b/src/main/ts/src/app/app.component.spec.ts @@ -0,0 +1,27 @@ +import { TestBed, async } from '@angular/core/testing'; +import { AppComponent } from './app.component'; +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + it(`should have as title 'ts'`, async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('ts'); + })); + it('should render title in a h1 tag', async(() => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to ts!'); + })); +}); diff --git a/src/main/ts/src/app/app.component.ts b/src/main/ts/src/app/app.component.ts new file mode 100644 index 0000000..7d943bc --- /dev/null +++ b/src/main/ts/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent { + title = 'app'; +} diff --git a/src/main/ts/src/app/app.module.ts b/src/main/ts/src/app/app.module.ts new file mode 100644 index 0000000..7ce80c3 --- /dev/null +++ b/src/main/ts/src/app/app.module.ts @@ -0,0 +1,68 @@ +// ********************************************** +// Angular Core +// ********************************************** +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; + +// ********************************************** +// External dependencies +// ********************************************** +import { MDBBootstrapModule } from 'angular-bootstrap-md'; + +// ********************************************** +// App Components +// ********************************************** +import { AppComponent } from './app.component'; +import { HeaderComponent } from './header/header.component'; +import { ServerComponent } from './server/server.component'; +import { LoginComponent } from './login/login.component'; +import { DisconnectionComponent } from './disconnection/disconnection.component'; + +// ********************************************** +// App Services +// ********************************************** +import { ServerService } from './server/server.service'; +import { LoginService } from './login/login.service'; +import { AuthService } from './core/services/auth.service'; + +// Router +import { appRoutes } from './app.routes'; + +// Interceptor +import { TokenInterceptor } from './core/interceptors/token-interceptor'; + +@NgModule({ + declarations: [ + AppComponent, + HeaderComponent, + ServerComponent, + LoginComponent, + DisconnectionComponent + ], + imports: [ + BrowserModule, + HttpClientModule, + FormsModule, + RouterModule.forRoot( + appRoutes, + // { enableTracing: true } // Enabling tracing + { onSameUrlNavigation: 'reload' } + ), + MDBBootstrapModule.forRoot() + ], + providers: [ + ServerService, + LoginService, + AuthService, + { + provide: HTTP_INTERCEPTORS, + useClass: TokenInterceptor, + multi: true + } + ], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/main/ts/src/app/app.routes.ts b/src/main/ts/src/app/app.routes.ts new file mode 100644 index 0000000..838e824 --- /dev/null +++ b/src/main/ts/src/app/app.routes.ts @@ -0,0 +1,15 @@ +import { Routes } from '@angular/router'; + +import { LoginComponent } from './login/login.component'; +import { DisconnectionComponent } from './disconnection/disconnection.component'; +import { ServerComponent } from './server/server.component'; + +// import { AuthGuard } from './core/guards/auth.guard'; + +export const appRoutes: Routes = [ + { path: 'login', component: LoginComponent }, + { path: 'disconnection', component: DisconnectionComponent }, + { path: 'server', component: ServerComponent }, + { path: '', redirectTo: '/server', pathMatch: 'full' }, + { path: '**', redirectTo: '/server', pathMatch: 'full' } +]; diff --git a/src/main/ts/src/app/core/entities.ts b/src/main/ts/src/app/core/entities.ts new file mode 100644 index 0000000..8c0f12e --- /dev/null +++ b/src/main/ts/src/app/core/entities.ts @@ -0,0 +1,10 @@ +export class User { + constructor( + public key: string, + public name: string, + public email: string, + public password: string, + public inscriptionDate: Date, + public token: string + ) { } +} diff --git a/src/main/ts/src/app/core/interceptors/token-interceptor.ts b/src/main/ts/src/app/core/interceptors/token-interceptor.ts new file mode 100644 index 0000000..0a002d2 --- /dev/null +++ b/src/main/ts/src/app/core/interceptors/token-interceptor.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; + +import { Observable } from 'rxjs'; +import { map, filter, tap } from 'rxjs/operators'; + +import { User } from '../entities'; +import { AuthService } from '../services/auth.service'; + +@Injectable() +export class TokenInterceptor implements HttpInterceptor { + + constructor( + private authService: AuthService, + private router: Router + ) {} + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const token = this.authService.getToken(); + + let request: HttpRequest = req; + + if (token) { + request = req.clone({ + setHeaders: { + token: token + } + }); + } + + return next.handle(request).pipe( + tap(event => { + // Do nothing for the interceptor + }, (err: any) => { + if (err instanceof HttpErrorResponse && err.status === 401) { + this.authService.disconnect(); + this.router.navigate(['/login']); + } + }) + ); + } + + +} diff --git a/src/main/ts/src/app/core/services/auth.service.ts b/src/main/ts/src/app/core/services/auth.service.ts new file mode 100644 index 0000000..016b592 --- /dev/null +++ b/src/main/ts/src/app/core/services/auth.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { User } from '../entities'; + +const PARAM_TOKEN = 'token'; +const PARAM_USER = 'user'; + +@Injectable() +export class AuthService { + + constructor() {} + + public getToken(): string { + return localStorage.getItem(PARAM_TOKEN); + } + + public setToken(token: string): void { + localStorage.setItem(PARAM_TOKEN, token); + } + + public isAuthenticated(): boolean { + return this.getToken() != null; + } + + public disconnect(): void { + localStorage.clear(); + } + + public isAdmin(): boolean { + return false; + } + + public setUser(user: User): void { + localStorage.setItem(PARAM_USER, JSON.stringify(user)); + } + + public getUser(): User { + return JSON.parse(localStorage.getItem(PARAM_USER)); + } +} diff --git a/src/main/ts/src/app/disconnection/disconnection.component.ts b/src/main/ts/src/app/disconnection/disconnection.component.ts new file mode 100644 index 0000000..9082ff0 --- /dev/null +++ b/src/main/ts/src/app/disconnection/disconnection.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +import { AuthService } from '../core/services/auth.service'; + +@Component({ + selector: 'app-disconnection', + template: 'Déconnexion...' +}) +export class DisconnectionComponent implements OnInit { + + constructor( + private authService: AuthService, + private router: Router + ) {} + + ngOnInit(): void { + this.authService.disconnect(); + this.router.navigate(['/server']); + } +} diff --git a/src/main/ts/src/app/header/header.component.html b/src/main/ts/src/app/header/header.component.html new file mode 100644 index 0000000..dad40af --- /dev/null +++ b/src/main/ts/src/app/header/header.component.html @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/ts/src/app/header/header.component.ts b/src/main/ts/src/app/header/header.component.ts new file mode 100644 index 0000000..ab5dfa0 --- /dev/null +++ b/src/main/ts/src/app/header/header.component.ts @@ -0,0 +1,22 @@ +import { Component } from '@angular/core'; +import { AuthService } from '../core/services/auth.service'; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styles: [` + img { + width: 50px; + height: 50px; + } + `] +}) +export class HeaderComponent { + constructor( + private authService: AuthService + ) {} + + isAuthenticated(): boolean { + return this.authService.isAuthenticated(); + } +} diff --git a/src/main/ts/src/app/login/login.component.html b/src/main/ts/src/app/login/login.component.html new file mode 100644 index 0000000..b8bc0ac --- /dev/null +++ b/src/main/ts/src/app/login/login.component.html @@ -0,0 +1,22 @@ +
+ + +
+
+ + +
+ +
+
+

{{loginError}}

+
+
\ No newline at end of file diff --git a/src/main/ts/src/app/login/login.component.ts b/src/main/ts/src/app/login/login.component.ts new file mode 100644 index 0000000..ef979d6 --- /dev/null +++ b/src/main/ts/src/app/login/login.component.ts @@ -0,0 +1,60 @@ +import { Component } from '@angular/core'; +import { Router } from '@angular/router'; +import { User } from '../core/entities'; +import { LoginService } from './login.service'; +import { AuthService } from '../core/services/auth.service'; + +@Component({ + selector: 'app-login', + templateUrl: 'login.component.html', + styles: [` + #form { + padding-bottom: 10px; + } + + .submitFormArea { + line-height: 50px; + } + + #errorMsg { + max-height: 0; + overflow: hidden; + transition: max-height 0.5s ease-out; + margin: 0; + } + `] +}) +export class LoginComponent { + model: User = new User('', '', '', '', undefined, ''); + loginError; + + constructor( + private loginService: LoginService, + private authService: AuthService, + private router: Router + ) {} + + submitLogin(): void { + this.loginService.login(this.model).subscribe(user => { + this.authService.setToken(user.token); + this.authService.setUser(user); + this.router.navigate(['/server']); + }, error => { + this.setMessage('Email ou password incorrect.'); + }); + } + + setMessage(message: string): void { + this.loginError = message; + + const resultMsgDiv = document.getElementById('errorMsg'); + resultMsgDiv.style.maxHeight = '64px'; + + setTimeout(() => { + resultMsgDiv.style.maxHeight = '0px'; + setTimeout(() => { + this.loginError = undefined; + }, 550); + }, 3000); + } +} diff --git a/src/main/ts/src/app/login/login.service.ts b/src/main/ts/src/app/login/login.service.ts new file mode 100644 index 0000000..15384f0 --- /dev/null +++ b/src/main/ts/src/app/login/login.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +import { Observable } from 'rxjs'; + +import { environment } from '../../environments/environment'; + +import { User } from '../core/entities'; + +const LOGIN_URL = environment.apiUrl + '/api/account/login'; + +@Injectable() +export class LoginService { + + constructor( + private http: HttpClient + ) {} + + login(user: User): Observable { + return this.http.post(LOGIN_URL, user); + } +} diff --git a/src/main/ts/src/app/server/server.component.html b/src/main/ts/src/app/server/server.component.html new file mode 100644 index 0000000..e1c3814 --- /dev/null +++ b/src/main/ts/src/app/server/server.component.html @@ -0,0 +1,46 @@ +
+ Status du serveur : + + Vérification + + + {{serverStarted ? 'Démarré' : 'Éteint'}} + +
+
+ + +
+
+
+

{{errorMsg}}

+
+
+
+
+

{{warnMsg}}

+
+
+
+
+

{{successMsg}}

+
+
\ No newline at end of file diff --git a/src/main/ts/src/app/server/server.component.ts b/src/main/ts/src/app/server/server.component.ts new file mode 100644 index 0000000..bca0727 --- /dev/null +++ b/src/main/ts/src/app/server/server.component.ts @@ -0,0 +1,85 @@ +import { Component, OnInit } from '@angular/core'; +import { ServerService } from './server.service'; +import { AuthService } from '../core/services/auth.service'; + +@Component({ + selector: 'app-server', + templateUrl: 'server.component.html', + styles: [` + .msg { + max-height: 0; + overflow: hidden; + transition: max-height 0.5s ease-out; + margin: 0; + } + `] +}) +export class ServerComponent implements OnInit { + serverStartedChecked = false; + serverStarted = false; + errorMsg; + warnMsg; + successMsg; + restarting = false; + + constructor( + private serverService: ServerService, + private authService: AuthService + ) {} + + ngOnInit(): void { + this.serverService.getStatus().subscribe(pServerStatus => { + this.serverStartedChecked = true; + this.serverStarted = pServerStatus === 1; + }); + } + + isAuthenticated(): boolean { + return this.authService.isAuthenticated(); + } + + restartServer(): void { + this.restarting = true; + + this.serverService.restartServer().subscribe(() => { + this.setMessage('Serveur redémarré.', 'successMsg'); + }, error => { + this.setMessage('Une erreur est survenue lors du redémarrage du serveur.', + 'errorMsg'); + }, () => { + this.restarting = false; + }); + } + + startOrStopServer(): void { + this.serverService[(this.serverStarted ? 'stop' : 'start') + 'Server']().subscribe(() => { + this.setMessage('Serveur ' + (this.serverStarted ? 'éteint' : 'démarré') + '.', 'successMsg'); + this.serverStarted = !this.serverStarted; + }, error => { + if (error.status === 409) { + this.setMessage('Le serveur est déjà ' + + (this.serverStarted ? 'éteint' : 'démarré') + '.', + 'warnMsg'); + } else { + this.setMessage('Une erreur est survenue lors ' + + (this.serverStarted ? 'de l\'extinction' : 'du démarrage') + + 'du serveur.', + 'errorMsg'); + } + }); + } + + setMessage(message: string, type: string): void { + this[type] = message; + + const resultMsgDiv = document.getElementById(type); + resultMsgDiv.style.maxHeight = '64px'; + + setTimeout(() => { + resultMsgDiv.style.maxHeight = '0px'; + setTimeout(() => { + this[type] = undefined; + }, 550); + }, 3000); + } +} diff --git a/src/main/ts/src/app/server/server.service.ts b/src/main/ts/src/app/server/server.service.ts new file mode 100644 index 0000000..f2c448a --- /dev/null +++ b/src/main/ts/src/app/server/server.service.ts @@ -0,0 +1,29 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { environment } from '../../environments/environment'; + +const SERVER_URL = environment.apiUrl + '/api/server'; + +@Injectable() +export class ServerService { + constructor( + private http: HttpClient + ) {} + + getStatus(): Observable { + return this.http.get(`${SERVER_URL}/status`); + } + + startServer(): Observable { + return this.http.post(`${SERVER_URL}/start`, undefined); + } + + stopServer(): Observable { + return this.http.post(`${SERVER_URL}/stop`, undefined); + } + + restartServer(): Observable { + return this.http.post(`${SERVER_URL}/restart`, undefined); + } +} diff --git a/src/main/ts/src/assets/favicon.png b/src/main/ts/src/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..bebe7cb9fac7999fd54d120ed15cdb8206ae1f6b GIT binary patch literal 109785 zcmd3OhhLKK_dXyhZgFP=#gV4w9+fHXk)~;8YL13`mMb#_9J$NV%vFvYxy@BM60@Bv z&7DF^%}JU`iSWCh-kvil+}I8V zLx6_}7>W(t{k;6)54dAHcg)Nf#)N)~yDGE5GaMo2PN6Uummu^H4$ChT15dJtSy-E} zf9BZBBahxE{N5Hkwb%FL=`f?%{H6AJim~RrIbr z@bhUk@2DJMHCKbi5|JZt66U-Q)caIysSB^cvsC=X!82i(a z`Ri48y7zw5bU7G!QDf z?`4^rNN3;XW~SABR!Ohda%cyI#ajshQT{ZC|bY!FKjBf#t9g>@{il` zcx_!13hI9@=g1ywgU*Hh&t*o5_)^qmg8qL`yBJQdr}3N0E@3@^`s+gi5I?98XGAMgCFTfz78KksRq!pzcl?;PM{2ng`ECS-Hk zRp*Rt(%ELQDkugEdny*Jw-7;06-%?Z z6ds4NLgGe6iPv=e=@(^6=x@`5zukzXJN~->FI(f7 z({E~~^-nf9S-Pp2+*G+XscWSAE_0p(wJAu{qh)1Fz0(n!hDEj3Haed=-Ecsze8+?U zOMn%sm&vn#X{p&&{B=&#SPne|YZ>N$R%Xza#?|lK6}6=x{O<>PMwyl};kH=$p)Wti z*aJn+K4E)~V}?-}!(3BBuu#ZHb0#kp$0w8a(IW9Tjt2d^;1@S3WFAqp7#E{UfBpdC zJV~D_>1slerfuoD|9i|29BB=UsHa4Vz(uLi$)pQZvw!21Pndq+L;^;8l?KB-*iYM^ zOwj(n{sNb z-AE?zbC%xp5$BNiq%9Nwn>Et3>D8--sdv7)W>g0RBt31c3QiD^=6Ds5^ZC~#ciJ?< z=k&Ody8Gf4o>b-r99Y&y)mU>x== z?nz=Ois~O|Cur@82z!-f7`RvA-za)~m}<0{%Z96gVO3zU6I+ZKVscfds4?;yiOhU` zfh8aqtpj6p6~RmYg^DFM=DzMTCKMrB67N?jL?uaIL;P_nN$h`C7)>9*stD7cLN|I? z3gW*}|3xwm--7a?5%JY1SS+Ooi;yJ!H@|g_sTcubwZLhmW7(ePwKmZ<)EoT7-@0b` zKk6_XlRQH(_xttIi`51ruR|y|{>`reRz?H9sQb@;@*6kNjju8+tgPSjrxFBV>Kg~& zvDJ98zJI;SA>~>#P2y9L^hn2AA4+vf?KHpnjUzpjKNu%?Zg{iR?ty^K|g76=?q;5$wc9r1Z|oBVwq0 z_%r%wF&4%QN(RwEAs->%!>X{+T||#T0S-a=D>%adYb8poqVP!~Dtp%UBMwsdWWeXN zrhv%$yV?*e?Ng=gH6e-84`NmJ(npMoS*qD-t|lG_XqBn3tN(kHSt<1l@j3hy_0Gwg zja^YcwK8wpoo?{g*!*orM#0{ivs;#H7;5jC5+*9zNR&Uj;^0zs!uyF^wg5Fj>U#?5 zkN~?g+DH7Xx{4L&oYO6#*xmlnVYxzx|+BAtpq9S zsLKx)_QkfEN=fHC8)`i3W3c42oku#|`#dLWmM>##SE9H(+mq!zN@368i7&JLeTNc< z7YOp@Q_gyPn$KlqZ&tcsu62eUugSocfR6q!6@M(jEYlQi)VrCT15tLt#sgRpOq zNIf5%5Er6AKhbJ1!dyj1t95%2}Y-p;M6siS7ylL@!ib3Ess!p*qQuRJ0=tr z+E(na5%PK*o}xiZCaF@_Fb6=^LzT2}FWtb{Lz=c@?4e6bdO8w@&Shh$U{&^kY*pc) zgNR~<*udWySAcbAp>*Q#`KZV7WNRdyv?hyKg)-NTQY44a``NSbnyHwC9cy@7^j289;!{Wo?_ zQ1O4>q}^E@UD^Lr^V?+$WE=sHl1o3)=e27%{Yzn&e+yf-osS>KOZlK6PN{wA5meqy zO55Izx8WJ1)d*PD#_>0KPYbTyI!rO`85z&u$Dvr|``^CJQt$jEtBy)me)@FKLW z1opm1+dAK`VjZgycTmE?`sQ|tr0v-#*rR)P#;*An?f48QPALTMey+7vq8w3P_O6xh z;Z!3RzOF@ya3SZ*?Nc+|NA85cWXW#wJmsTvr$04eAEoKR=T6&AIv)D;boaxCW4W#~ zFv$nw>;2R2$%C=m7>J%B_`h%vi_8%d@Ghm#=l*nWr;sG6S;WcqN2s5qZs$=SKX}!Z z?`OM4*)eDxHijO711@$SfC)>tYXlil`qIgmGPJ28lg5%v;-#@`r%o-28zTQuywiD4 z8P@(2N?)po81~|2EaH664SsA0f*xJee**b34$r(CiwzN?v&>@?Q0YgR0Myy&sQrjn zAn>~WbE-ug*$jE6XH6O**t2#3RNO6Lq6LLd8d0yHa^Hl+O5gWC!PK)RfhZyATOxIP z^i7cbFuJ`7iHm+6%kRhc(g2NuGdQpm7N}T2&_}_@AiT^j`%p25E9}I>l>p0_rRX0( zXdjwO+vDv2k(>x;N}?$oM)|qR$k8LFLwDEMjVWg)Sz^#boDyC8kUi@9f3U^jciI=Y z81`5yV}9KXFWm7LJ-%EaG4B-hF?FIhGw#sCADX*evL4K;Pqfb8D~Yu5JKUEyGcB35 zynO#GgU`^sHb;1M?Ok(ux2oyQc@TPBxZW_#awYvl)#{b}`Ey1qJ09YD?kT&zM^V=F(ClP?ni0* z45{_QZx)UnNRh8S*U^|a>1a;%pT0iMy^uX6vr^x$h)5<7gjl%hyf*s2miiah7u3HVtdPi1ru8efy88NXv00SZIwHbHama+w4(a2Q zb9%OK$I$#|O-Oy~)}tmHe)ok5v5V()&^{(7BQuhgBUjwC6Lz_As9t*iHfVdwD}223 z_s(GTVC>eTe-Pn^a9mL`!>*fEjz{Gzk0fN@={{<@*5(r_1MTy{+V_5 zw}%fN1OFrAJ-$OJ5Yse%%P|dLE;F7%oO}5NZF^8 zNk4^&Cn$V!P=x9{I1G`JwW7EG#M5I=DoCA^)Q&W8vz<%|gC2!Zw^K>dRE#ijL;-P} zvc*r7r);4CW&8)%U*3jrj~0i&g}O`xk8CZwNcwI_dXK&XvXi8L(L@3T@kc&dWik%+ zpL0xc5Qx!ljMg;lpriT$hqpooScetwUN#EmT}#8=x}-kD24~8ndoZBB~*^EqAQq+{?mI{&5rwo?e(;TBzyHqX_$XV>l&GzGwl{rR{Dy(}wv70VV+VTv^eCf8If z#F}&s?o}3NBZF&dS0Zm&p4}{o+UV$R(2L$4k^QF*we>JJ*M2yX=|O)E_fLW*w#79y z(C^5Qf2e2-Bwfaf*!elz5C(DfcwOh9qR zxqn~XSe%XIltr-DENnXJ(v2znv`FpwR`QBuDv0`ySCZ1{5H)-~pYfkRYe41W@vt}c z;G`L)kWNF9dzs3&VL1QIF%8k|`t~&>4Z?{m&_Ddi!`&2z#?*dh|_^ zQ|A+5Ofd+OPhdT^jA;aXJ8I%7yYz=lHAMj7_^jWfqdPJOm8lh5AMJY@m?uttNE(fF*{AJ(QJ2JlO%!U5Ig^% zMixc8k%Bu>mfNpxUqDfGVwrYAgEr^PsfzpOq~Zw7Tog5d=x&Ql$Q(MdLNwZ230UK? zOi_8AO4seVP*3^ntgUT{|@q0WsY*9RFiN=;e`yp$8sW(DlU=ck`^p#fql+8veRCqLV{!~T0Rn0bn^ z@CpyA0sy`xc4pC_n|J81TeqxTW+QynP;$|f2LJaw3ytbd1H0^8!d|(6I<7oyz3qNP zGx)3%y8w}g#`>JZ-FY`7ksm(1om7wHp6olAnCTjI27{hp(>KbOol)Q&?(jMbQitI; z;}PW^w2F2)WA@#xXK$hhc8KU0+<=m{&_OSd$Q|rcIz5F>)+-_se_`2z{^$% zs`hSEP%wO5j2(J9=jURyg(<(HMDE-+5h4O+xlf3;g}KBBTE^I;A@)&!xoL2MAwOCN z85z zV|MN-Y0JU}xmaD-HRProlXIjSbTsY^!`NR@e?LZ0;F!`;o2~la8k!G9=T&lC?!NSK z7n`AB-_X!6e1rel?b4*f*YY-nnz;wv`&0|OD~jlO180v=@+X@T9>~0HGH}?{^WDo( z`eW~hxbC{uM~SyG14E~UubblhGo;VD^6E;?$F!8&^4l3&u-da6*kdbKZf<`a2u%4G zH8P$rK7D@4siZ!iip8Pi;HYws+DF)-8Y%wuUH(Lys^9b0k(L5K83fnq;a|5cT?@iy z+Wq3j?kxN^)lPZf_@}?a9cYpW{$4J+g@L=>v2ShBr*ExhXYwE!dbQkQ{lzC7pSd6- zdffYlKTY~Q{`sAkUJ+uuwt0=!Ti6^tPj0AIr!mO$ZLMR7CWdYFv6s+3hhQ;>g};i!>D+CAqtl8Y&ZS9v4jw9e+rP|Y=A5W z+P-YmhiBQ9yfB6;cF4;dP_Wv6lFO$k9P>9Fsb9aiGqr(G{yuWVaq#JJ_hT|{hLTq~ zZ_k$b_pcmW4E6GDjgQaf^v&^j_`1iwE$<;Ru=`wudYWlzb;4ciTg|cBl2an2iuYVU zqXZuGm9+-0mky0Z>yI0eBQOCa!r7VZIYCw|r7e$^j?!;V&8&WFf4TnDaCE?{m6x$; zwHNN!@l(d!exDG-X#J(m(dcVtF48q;wB_DiiI!3Pxz*%e?zE&GjNb)5WRess6T^7- zyJn4^Hs7$}wB97ox;lFY6pV+?qqdf;?YXi=QCja*y5Drbs{$RT2C|KM$wK4rB@!eC z1xGq`ZM3YTJLhtCQ?*;4$3zd5sj()iUDr6a+^4XdWw3m!rcHq-(C+Df3z;F(bbOk zCIglf5n=Uuz$!x64ygsCVY3y+9a|u^#}2zVj(mc&Gx-k#dYqv*l7xs#R6c(BRGbju z6+45dc?<)|WnD%W{gRD{~>vR>FuQlL5vJ~ zIrkt{nzUZu!g4a>T+XLCuMwU7U+W(|MYVLq8bKAT>`;;r=N1M*z^9`^rg#<&w(FOZ zaSmD!cE1nDaw8Zl=rYx|9c@^&&JKp zn%KPjS`+6xk~gK*zS1Wb5O+6ewwc_T3YBsyVs^-GI zLs8Fee%s@ele360IlC8HC>GXln|D3mYyAJjuJOk&(cAnqGlF zKE2E0)}^mc@)8r#@N^`u&`O>hITo2pWQ*0wEgZP7p%7kfX8d6&FG2KcpEdOw0mL?~O4A^NlThY&$9)&ZOv2z^Og@ zSFx_p(MiXzKrHDFOLqtAF@bCXN+gihM@X3C$TPAXUrb0mKvn-I_mNlC`-mg+&x{$B{80bNSq+29LkQnjm@n5c~Lbc(C zD^qPm;QCY>G(4DUBLsJ++CbzL+~BD;g5bAM%~#n)*Qfu?3Z~D$s99sY;OeL;LRw8u zeK)QkHq}0C=VM`<2Z}*Fzkou42~gVXv6<4`Dg77ch(}6SQgIF`L6tuaX?3op0+k|r z>981(Az)LkYgMfJd{2qh!o+rg2h|ldE)*UH8vGfPk=M;LTX#_(zrIcrTAMxC3-xIs zoC9K)4SU3n7;(yj9Gk9GyBU0P>SwE)|MeFl2;T0bYem=!`{#+i^C@*ulC^xQ| z^Nv$ZnjR@lP#t@tHNPC-dovK-$f&kVwkqDa`Sv5mS}KHD0yt}a#J~X!`lJ2mI$e2B zXR{^sGmUM=H~9sY%C9#6FFs=~EV{bEP9H6z|Nc89G0sa$4xJ_+ zIeR1#*Rt{DL!7(DrJBa$jxjb5>cT|asgGXhJwI-6S8M+x$6#p`Z3AnP^TYbpquB5+ zoa=atR&(5FliG{8vX-vd{&mULuHpD(+>yrVJXh^^O?AWqQ=|(cxaV}AonjEz1*da~ zUd`jhN)keg3?ILg&1yB)vsW%noQmN-L=_0gd9b}@wAC)>ab+(Yek|aV#CCM6R;j&% z_5R>l_lCPW>Qk+nL2JKPM{%TxS7qaYjqYFNFIZBwXfmhX2`o8u!S$y~Jr?RD+KZm^ z(tjONr;_QB^5Hmi<89McINtG2Z*1^nruGtfXukr&#u9do6kMsdz1DUY8dyZ0I=9ll zs*C_R9vz~XyVnFvE|SbFLH=?xW>ze~%mN0q=^0)EfDa%`<37A~NAeQ!%z1zul2pDP zK$+QkY+kQsP1Ie!4C&;2=@pX39(?o_(b?Y&aFRHEJF?*hY7d+KE}F&P-f}D^c*#lE z6Mb0#5yDM>l~Z1kLec@^OM5+5g_q7w(zQcY#FHJ7FNt`nX#|?6O2O#J+e3pgqhuh= zBnd#gS(s=~(WhQ$huAho%mMVJ+_a>DS3>AqUQqnS_+kNWp}~oL_QFInC73;w;X#nl zs12nq$X{Xb=tvrYi?-MJ?@W%u3G|u}R^~|vGn66BNCHp;(eLf@u2rv(^L(g7tfgTl@en7D<)~>p0{e=%a&Cf}%gsua4 z!*05u@n7u0=}?OV;4>*n7@Ao!Y-r}r00sXHOMQU+Cl$xL2i?2qJ@jzBW1W9R8*g(R zmSlJuM&GZ0XX zwV9B$Ir38w_%^g%g%5e>Dz6t)Faq$Ah4SzDriln9_2?5%~HiGMpRP2)=@3>Wu>g=%b}IARMUZhZ*8 zB<(=io=t_pM8P27qRj;|7(j$^)XMycF#Z=A7=?^S8G*ji5IiCsU+a-XSbV;wnuLV9uCQo0jTUu z>7UkKZzeO&0AY#w>r)yjUW6b*$Lye^@6P>{L025XwC>D}C_a2QEi?ttJ9EItMmLT?{uyZ&Tz-G0cNU*{)bZ^RDqneV>+P4I&a=^3 z?{(!y;)2+#+x=`EJ{gnt41P^eZ<{8^Y~;(x(RRPzJ*54;ypBJC5Q?D(CU&*OpP!C> z40_>?zzZ&f+;J^0j-!3i1^qQ`5gZ*|e9n)NXd*BDV=d~NMWiyK;_bc0L1TVEkjFZA zM&JCJ{r=QN0zIMI@l5ftU)N~d5sT9}^pI;giDBuxy=%%b#0@*dg3rJ7)g-m-uI&`r zvF>ZZqi%jaH{`xD*d7FPmX%uq@rSfN&v5!F2p9#%xmxPEJHQTo6*@aV@hBBD*$H?} zFNN$L8~mcz5y=aNs1|@5e4(t7GrM@I?qNev^!RbbOjO|_24nhH>+OUrEb+qhWvdx* z0s$Xl#U%ld40D(r;FcIYNiQo4wTFcXzoZw2zHEyK5uhg>d=QUHN9fZ{JOm&(k)tM| z0i1xbJs=xl3;-hhG@xOU}0k-(IM>r@DMX(Mcm)HE>Oh^d)DOs zQN{K{aI_oh$oXiP6x5kk*wsJ1-Sn@&Jm+{Bg4oP&9K&IuJ*@zDl3|iw{7y;=cq&E^ zZhECE<|#%0Afif`80%aHkr%?4I7ke=f-jS4dFnKqRNN#^UYM7@-?+GoufvV^IAk9% zG>5S{`!2FGvak{-9n)q+A%~6x;06RZXGx%7WgiRul}T~YpPJTRY>>c)0ID=DjtI2A z4+zVGmo9nAG@BF>KHKrGW=Jc7>duU0E_U}bJU8?&XhvK32}Eeu3&UT^uPaV2N09Sl z@6IcxnSNUB6@Ry_DPB^1`*5#==99Jb_jO4MS4E~|mDH^JS3~xOguWj#`ndY%Tl%M8 zzqy;E*zPq_qtlgi4-~{&JjmNyR6d#3H9zHL7HFN)b^8I1-LJc#Y0K?_b?PhQ;+d5o zt(JT93>fSs>eh#_eL`IW@$<h%MyN)JUmB}?`OpV7 zAM2D7mnQ49<$U??p{?b^u4z8ynmXR*_FjI4h2QfIj;}kuE4s=2f!`@&F5-KhJk1&0 zxRgO<_VC4KGQ63iwXN%vw7c(YMbNfwX zgFm|E%{vPB3z6~f;_d;$e_1-7oZF-@rUZWi`#K(7G zNP}rW{jG*$%3+%0zr?dgs*><>$qp>tK6Nt*i|vaFm@sO~L&_2f6qCPGf$-Z@=k& zVhX2>%fav)+IT7VANudFN|LzZeqUmHa!YP}wBl>oyNKA~oHos7N>&&m~)b1#x5qdNm0*!4p5}a;uLqQ$aajvniE!V(17cNV9Uy7O5Tb~o{#y@(t{`A?^o71~aw>j+Z;h;kX6U8;l53VQnZrp3F zVjZ>&iG8DCo)mvhuK4$hHD$cxHjtbN?hM{oPdy?Y$9;u(u+%{*>@y;`8+ zI!>yqVQ=|`CEeEX3$a;J%68dH;!CYgu0P;;zB0$au=#P!DT)5ej-7r_U!Ul+tIesZ zQhQSSXceO@8tB-*Jo;daXVJ2_PvEOboUTpJWih9+?6BLLu!+T3uhF{d#3wc^A7XvH z89U_jzcg}hKmR3sCUX>aWTUcn+~j2M@zc^RTAS*IwG}NUIc=#&Hf6n6GK8#rFnapKlm>1ZKw{yh?_lhl@7Id6c!8k-Dz~b3E zAZ_dAjqLdS+djdcP#azuiYD|%!vBwU%B25W+AKyU}=zihK69}mJ=#q|*tW@GZ z_qWOX>HXIc7a4rw@6$&3mk!`c7;k1O1J$H^oX zB(qn5AdiJbQu&A`D4t6`Ca_hAPrj!_3c&fO9jOEsV9O$L0O`PeLlFgm3`O9Ndx3qG zAq9++I9B=AsO!RokjD~eRr?W$QnZWbqnK-%C$O-YaQ!d@6NUDf4v4H>iwu&UO**WI zxB;W{xxjdnN#``#g$cLT6_fl;aE9SWhONH{3tvqNP(bvFY*p=ka+e3ad@L{xHZKr$ z5BpAli%I$(zv5J9b?_#H;DZM(tFbEg#` zUML#5WuKnCefpq+PfIx0vzYFusM-ea`1e z#&wt2(F`uD`xgI-{aRQOl;ApwigK6g&m$+5FTXM+R=#OBht2i^K^ips-smpn&m9SGM6W!~`C>Wd9} zxQoO?3YnSMt2GO9Fv)#htj}PYH3mYg3Rw~$8@pS6zjJx#b1KmYK1^_*lKHX!4aXJR@zthnQ6zWL)3q6dIg(MYwnxSs6@O0XL(b7nz&8B9%*ZTibw4GWC_jfy z3?y4bUa@ebB!o_ms!*@+;IurWw}m&ehk;S~q-Xr78pi=dAbB&kE4{?-Sx7_b$8zU3 zO0dgDn@QU9Bfj=};2J{%uRBt2|5{QpZU1S&avO#%*34dQ-D$n!E}yu)tvOc1`65Qx z7>r=G?H=!HhHWgLu;>t%)5GGfXfs#U@YAw)RmDw_Y@|V&mq{{tF1O#lHYXO_$iraU zT4b?ojf=yj3f)lB*>|3wr(gP~Ra6S(ZRwZMHKvHsB79{>ReJX5i4cUGqf1xAY;Y|TE93jhzlB|F)bV-KlUk&c)}XMl(*w9Q#f z&-6dgFm~%kW$U%fVHb$7Zf_s+tj4vcLU=mMm2f2$_}90Jq6c;b?Sar&Cf`hb8h;o; zkq6QiFp-|`!59Mo)Xzqxv*9HmD?5u#R~k^w@Hj|NAHo7cdk<2!jT$7+{B3~iA7-J_ zVN8A!AhL@8w9D-1zmr?`3dqQ#??uy(h3Cp4fDu?0@@fmf*&)P(hE)LZ0FLp18ww1P z&LOh_g#~Jg;oZ$B9Rf6%g2b|`&~$2Q=j1_3BpN;)yc8BAE;@xt@!MYmF(`@!B8Kq)s-MbG%E#ilJ?Jo7H>yX6)e3SsM2cwKo z;^yFQR3~3V`|RG-iN^yI=Fl%zFu;h}3bVd&A**9LMw*ud{S zKF&=?$AJr>N?<;UBCPlDUwIi9v9{-16;GsaZY{1tFOic}jN;D}W^wYBlR@<2w}@Iw zZnsZ*`$oK1OIJ&k1_`XjZwU-<1t(iPoJR!VXN^fMUuW(eO`x9>LMG&~DLebydU?M_ zUDZ9Jt|BlLJFQ1ITDd#sI)=;tQQusW&G~Lypp;{pSf>oEU&UuC+k_8H3q3yE8`Dts z@`~&EaCZaLd;k932mfG0@QzqzyRT1tfA3ZEFIGl0M_rRXJ2Z59)^R9F!nblBN9|j7lY#3%0n#n^S`Yfc^pD#irGqVI!V)htaT@2PN>guOmEr_}!BP%H&^d z%!lemtFnLb;_&FI1uyI~qh13c;PW%k`(fZKO_|-crpxI$iNf$Mr_!K1)CX8uOzvj; zmBa;+l$D^=z;}+-$wx)vQeY)QzHb{JD>XiTV^HN};xv2vafiznhS4so*{O|@aud#! z(HM?h8H1asMwq)|1C&slG4r^b_@vz_OX?dsgj;+wX&nvJ02j70g z)EKPFas-x4$Q>0r{{90ZTq-^TbD>h)JNl}nyvB5y*R|||HUggv(h}}m6LeeYtEPIm z!^ubDCv$kJn+%@R2L@i#`1rP*?UZMVa!&9?ck=nF)e?z&iZl!XhO|=A3zse}&SMkd z3^2Xf0NOzmeI~vdF5lnh)9^e5Mhy*85T5F}9BW^k>wWs;R|Df>g(pv%_XN!z%U_d8 z;FdzLP}Tb+njX;wm0Aij?wm9r+|4c7d@@hB}lXT#%IvP0JG}5-FRTQ)0Zq* zDha6ZdvC7MN);qZQOI%GZLE?hya?gC&ABV#N>!Tq&Y$8{0w066^dQZ%!B3_H>69a3 zap)F+6xgIfZ`b6p7W4z_r(F%GpFQ2K^kdTx`_44*1D!tBv*zGbZ11;rQ&$c!RQxj6 zMil`gz&o1)8Gh};L@`H2m}ONO2kBQT;imxcK7}lP^AYho7H}l;?f_t3t(=9L>yB3= zC<$or-9ledMC=ECzROX`q>I#GJ)wst31HkUMtgL_Yg+~EJUC6=vU!r&dIN&LHSg>w z>u*xP0N5S9Pws~xz)nnDTLV!1m?YQF@{s+6%J~eMlH;#CRC0u-$-(Rm%`-G6I>t8A zAYONUXvD-rh{nEZ2#6dj1B@8qP_vDO26nvk?ftzbz!*z*0ZtPL2_f<&#=`)6Cs^q~ zXw;?cm_X9sD%hU#_yEyYyrBHHEK$q!5oUf-~!`yfZBfs{IjK2Lxrg1M%DrqhOHVf`VnY?ZAPp z#S%G}=c{NR1^rq>cBQ%QEV}9YSPn{#r(7s|O!n^BZXiYCEIn6w%&0d6hy@7kN30qn zv`d?-?Ib4dbB`zdOd4uv7kq^KOny#*>w0kJy?Y`53aA* zpO48eRNApxVp_=e!30&(t{9g& z9dE7Rm$JP*9Cp!aqUSK14>g*0uWWs3hAmQw)1XY1RiLlr9Z!m zt@U^HGLvT&P4)gLbH(pR#qI8kgd>^u{Dkw^kcVkD8X69^%>ueCLEh@g<gblAXU75uY8cEm1C1 zmQDK{8A;oj$5_2Pd-kxYY?bk?+HIWj0Y8F= z=Vh4V&k63-1y`@N zulsOH;iLK5Ph#zEd7s*ZQ4#P)NrSpc*T_n_CGEKaYH&Ym&n*L@W{i=o%mF5;gc& zPz&Wt9C= zcM(5Nxj=iF_60AURwJOe3HY_)NSS9lP*dn~SALg)o7ks%wN)hqXfg33hOmBEodpa% z!H&mo5+}Q~Eu&Jw_A^b~v}@-bFP0EIMj8hw8KV9CE;BOQ0 zK2%OD(ERkN*&Ps_TC39o%D)kXTqF;6VE9tk?wQoJf*l$N=4v-^?wqISUr`hVZDec$ z8cYz#@oklmLOA5TAxP{6P0wAozFr(1hz`3AE2tpyBhpnv1{xgy z3qvXZtiXg3?1>{_RYd5q5O*pu20+G=3~Zi7hsVSq=5+tR?IIqUN+_crt5HQwh`R6k zALHcq+3UWwBfZsX&9rm7i<0yF11tM$kQ0TZKtbS*!%hD*r(NK;;)lkL0&u@SeCCp% z1v~(BM$lAxZQYXs;|my)0U;0Y&7t8Ks*NZ-l6pgg=qCH7m59$eWI&xbz^=dO1{;?{ z_|@I?2KyB#`mzW+Ih7zgvYcca6Ze=+(FJQeQA>;-@e8fd^?MxbWrE9_+@pPDX306? zE}Z3R6)={Lv^42{pL%$$J?WRRhu8B(Mz6R#oiPxw>VKiQlNbXI7>*Fx7gzX>ci=-Z zZu(*U3K3lv{e=U)Fm8lmOt_#`D3z}-;lU0RVpG7-ho-<7pe%I=DL9093N*TF2XOJQnh=Zl@83#j92CZnUs@flY-`L7XpJ zq)zMP;4~1JSuV;^D|o&$j#HR1*Vz10*Cr(N2#e?Q`h9udCOi&B%y1WC`}=kbJQ6B> z1ExRD4kohX&a#g=?F-*_mONX4u<+hvXSH!=Jp77ieTOjF?ns3Zq-ufo6 zhDgD=1lCuXI0~QeFAhS2jS65jCO@9Mem{YhMi`qD^UG4|*LiXEUdi#?{w`71=u_i@ z7AW|aio}(bW`u>Gvo;IvRtT5Z+4{U2s0n?u<>Ba@4eL=elF&1B)3)0zm}3pLIUS#^ zMYSg8^;sf$KJbLFFr?4UMG6cH$CW08F%KGNNiE#dnACb3_%3i%7z5(IlF{<;9SQ%M?BFizoscHy%BGvAE)!TVG7UoQaU zY+8l(AJ&6Cq5zF@QJ~d(EJEFHF+7^Adj7%HMOud&yjZ2c@8HFbT!DwkLfby4>xC8L z@`$Oj&L>1*WX}~`<7HGqyN0T;5&=mXV4x}lpMLWa>dA_Otdu!lf}sN#kpA^d{bFaz zp%==>eiMM3uticl5*oZ3&Om)+J(@1MCUYO2Ji&YU(nncV9hnC$Duc}#>I)!@bq-c(NU6Uq=*P4 z$6+sL^bj)D$J{)*rQMS19^|`gsMT=elp)hvkk!MlOtGiX`*kbH`P74=MpW(OUZKIB zMQ&qQ-|7S2D>l$Jioh~hk#6U<7ouT zy%0d?OKQc{k8u7p;ZTiQb-GvDXcE&FtI2VMl$$5oK0^n&gPMoiC(yhx3$c z=v10szNMb6{Ak>IGN-fR1$N*AtDx;kgECENVOwK_yGieu0=%1M=&^%YHCWRSxqxOR z$;e5*HjhgP(QuSStj84@7#XO-)mV~ChddF(NCEh}sAl83LB`Nx9bTnD9NNU^IkGGQ zrZIbfsEl)w4C&HfP3=442~2a6?*u-66nVVe$cse;I!(VQCG}hLzC7(%5?B*-Ci&cv zm5z|Qj`iV{-RadDCb7ePwcITxvB_qZ7q}RsO@MEN2zy~ zrdq^v3aTU1?QOwUR<{G>$?l<9e` z7ZF*7^4HFrP=XSh3T2`8iMaz14Mp3If0)gt5k9Ju26Uoe%&~K=c5*S0**LOD-;e_} z3MdMa-obb67QyZw^l)d}(2_@Hw?+n_GBD=s-HB6{067e(cnAJ3u|_Lqs6? z=n6yjZ>y#+2OtVTH`+>U22)hL7z7<#kv~EQ2JIY1x#)b-`!0x68c`ayqMf1~u;aUe zZte0?d}Wz4u7q&phCEqFz?i6T<^^;Jth)wf#STmsI&ow$28H$j@KUw};QOf^DWq0n zcOugf9_yg+nw^)yt^`Xmrqnx^`W>+EUN_ugg{xw54JVNStJ@|dn=9utS-^f*f<^QB zLc{hrd@Abd>5_U@lw_{*rC`tqf$w_&1}?BM$KIF}kouFAse`s%vCCkGzKx({?)N$z zC`jgZvzldgmY}stKuxGeWKgc@4o1xisI3xMqS%d`t?$S~e#3ipC!-X+1Bs=pO9>x;&I%H%190-Hn_>xON4~ws+Qwh>D-OT*QmqbU z%Vzs5@F>^Bp38fGS{kre?gBfsIpn3Qs~^s*QoHzgczt`RV60wu8&CR)A`iI~P#yCNZ?gzGv3ml9j`KC2t z8)xK&Sq~XY>H!u<4z)qoPev3Q`|H24W;y#|gr)%Sofg?z{qh&gaPmTn?LFI($6!c{ zXW*MDnsiyegpCxrZo3=3tcqF5B=R@gM@Io2DJY|wQ}K}a_OXc>gwe!DgORw?1{w&v zz=+95Gh{>O(woPpD;#|n+FE}&9iD)vtM|?S%6EEFW%*vXdDwtA=*l&paw~L&^MuBc zu2un&<%<2t^nx6cwl?dqBD}ccyml*Uyzmu6Jm*B?Zd_JM=edOfaG+A>`^e%#p15`~-W{*Z^eFK28ItPUddW|Ql>kB$zlL`SKI9=ENx zuVqOluoah?x@t#{4o~Gdp3*WfCXwF8;co_BTI3)Jg0C3~z4EQpL zp$OA@t0i~evlA6bXr4Nh5ZIwv<|15L@!m3cv#LuAGz6mbmKbe5dyJ&DPE#Q}Kb$Le zh6TSp<;#2sdJY5XM!mBnY$y(EaVQ^>jhBuyf@6UctG>~&UF>2ZW zuSl`7&4?xV$>>fBoS=}L#Z{BM;ZV&T3Hlp4KZz$Bc!k`$tY1zQbY=R*jxr*H{ky}+ zXbcEgMgZnh5Z)FIuvqwy6hLAQ^Qk9g^(8<_(4qVnddI-qW&{HW78f9CpYVcbdQP~( zM1WlM&q!{4sk@N5+*QGN!4&hMknyH45tIi*To_U)DNHoBIG#qbQ8x`!dzfU2f%Q0n zwhI3%bHrl+ZY%KrdUWg1AjSWdl-K{kTb=|!oIx=zgbPr7)+u`?U!2$=KSWCX6wZGC zem(d-*bNT(EUkLBIb-;JXQyy+q3MyjdCmqm8EIO-Ufq(u>OSx7uYW)R3Nt10nn#EITDmw|1E;10~tQ!C5z~<2wey{6Ob959wT<~Lwd)|eGX0ixZV|PRt2gQ3{Os$MH|DGrUx&5 zg=mi8JfO~|Nuvu6u-nuD{3cpmK4%zhC_!l-F;}XrMT5X~aXR7dW@zK-WE|kuwWl2= zlg`D!3qq`M;^#C~Q7*n5Pc&gay^72}e)Uy%^c%{oPSPPs$g9MR)0K4E*u;@-HiqnNiXD zY2Rz_m{u26nUC_M3Xr2hA(|ryP&cSCC2ym1XB<1Qg_ag)hcy`g4qyDrXSX;9dKbAH z1=F0Fq|oO0)QZq9AHuWb)>mA=x~LC4l4oiwyZOZ}&p-Or7t;Kq-tV~H*8}4Ul`YhSnP|%xoQyzwl z(D@P4^J3HC-54+*<3Stc!4|P#*@xy=ZF$>QHXWP8i|}$0Nkad(H=xAq0SZo{O>iK*lj{3t)Q0*Oi4(PuQ;zQ^8zLw{$}0#(2j} zWx#gAds_WfXiNu9zH;f-X#96Gmg+pC1ZC)H`9})8!u4cQI^pPjBc;_b8=#}OR%g$9 zS0gG<2Vc}hq)spah|XMPD=FZ-5!a1rK(4xz#^X(mU9{!ROo-eks<9qahU0<(xWqdl znjN&YsfWCmws^F~4!8(QN)ApBWBuT7@8!(MSMs9M_Z;tl3X7S6J}(bx-pE)K)0fly zUtMy7O9e6cA5Bm=-T1k%4w?r-;z^G`{^16WH^F8Uiw6GzS=X#nl>d8{p|tJ!k9_%c z2!I$6e;`KL<^T$w;Ei8WOgMh2vIMwjkKsKU-R%8wxeuS?&`qj9>4gh7s~@_4EEl%_ zI6sjX97I0s1Cv7jyoqH5@K5e1aBi=$lG9BTAnUB)t^Zb)Eues^0Lm1|DgLQv@qcB7 z9)BS+CqQ(DerpMJ6KPHJ$2|eaPqWfy^K)Y z-VV-bf4uXGnG8mXx8L6%5+cg&dD{G6+eMoS!@B&E{viz+kadT|fY1V{EdWLu4Pu%2 zZ)E}~aT1__0saWcHKZs9cu$9 zXx)zM+M9QBMfQ~KroR!0kkq&glJIYWeY}p`(yp3Mt5~`K>moQh-`JH=9P`yP>h_EP-!HRje3YcbJp|8EyT`4Kh9~9-xzN~?Mh4A!!l3)g> zXJ3E(U&h5CrI?56tM1?bLN5n6Cw|v*MMHeK73(jeI4|BHx@b^&b$5(V?F8jGYQE`d zdf=AvuGIm@Y&sQ*Ji%@vMmTxP9%?uFkEr*URU|v@@PX9Pxb9ra(KR8x?~Iy=5(A!^ z_olMSm@t}$fO@}~xLj)c0WG~^E_PxUAsa(Lo1nBGQ5^?04$rXm{AD@+z-(>YTBc2@ z%|7%T_ftCTG@W5mC!~mra%K(>dc_V<2_@xTJY^e&a{wQZnPETUNQX-JbatpsyquA9 zwUW%@iR#jTdr)f&}YL-F3FlU%QfIy6V~J z{&@zrVItV27Ma9akt#%ZpsT1wwOrQrI=r#$_bhJf zuhAxB_}PV2xzb)fuap|_1P@GbZ%QHv!3BIkACrF)$8hd4;J~u;rjJ4%u7t*jG9ug` z-m3y%ZkGRLBjCKjI4$JG_t~S)rGPi| z-sQ-xpXd&C8PeaXqsyW^$`1o0}(!v?WOPl_afq6&ra!3-nH70n$pi)SBdJi!4MvDI;OBz|S zFxlsT6#)9McdWSo)T0NiMH(RQNU(;b%|p6n3dsW6)AdNHkjX&_?405gXopeW{YMX- z=nY*b=qR?^Ri)^y+12<-NsC|7!RQ)1la7ZG+$>Dst7CcF0z#@`K7Dur?Qp7cRuhCq zmHgMD;xD}yKY^Wfw-!Vl5xmz1gvdBfU1{P{G1vf+c#XspSXt4YK3XmjB4^|QL+g?y z>UCZ9K5H&8dUS5ja=L?M8jGfWCPY45liYlOsFtr|_E=WZUHGb?5W$78(kq5c0#NtI z2S1&3`t~vw75(OP8<5ckGc5fpU*H5>dt|a4z^MZ!Al40CG0;NlKT-(m>0?IE6r-E` zx^1{c0ddyZ3bEpkh}=JR@P!4`ptBRMy(TQ*FCS$PFKFLLjF^DJHIx5{$@@V=M&rU98h znfHCNNZh3x?`i$}&b-sn6r%fILh2O|g!ae_flygu$cN~_RN4Z30RNs81%-p8HqZaR z6-TgPMUYmk4w|*%(;;MdMY9XIKDj8Hs825kk8~k$P?d~F=pTv}u~Snqa%&|A^vi3Z zzfUJv2iN}qV=8(}*%MWQ75pJ!vs9Pe8qMHUDYr~dEfCtcU0}a)#uFsQg3In35R%o; z1Hc);Ku!q~0w)h<>Tt$(!1~e>)>pP??i&fwTi#%Dn-Bm-p_9YX?QgXl1A&*R@5Wvy zzB4WXST!zpT7sV;#FT_1<#;Z-kkFw1-=UgZl)Id!%On;m#F~O;&(Sm8cS#bW@PgDS z1Tr^EHYxsebXOk|-W2ho2g^d~3s`Ro(?QfkCbV7nE1|_;+j;e1e5T1J! zLFj`17n09jF$OPwFis|yuXHiw%qMGa0JdJ|%_GfxBVk^of^jxj!iJPa2~r>V8mm~V zLk|~Z&rDuX&TZEV*ys#4nHtL!*2w<4M^^I@zU;2XFIdN3%FXs)+VP%&-=C8#iR{QZ zrfXwyaFnJe3-qakph@d#8sO$D!O%mdj zxP6ScSJK@3Z5CkiG_e?paPd=qcKA8l3xM0*Yqk;dOP!ROX0q?&x@AsXzYnxKveN!H z)gR}gn61}8%E7N!t^Mor8g~r#5S!Kt)8aOMW-hh9r_xnCzCd8MA}$ZmFm@6^Vmf?657 z$-}g5ep<#G*XNRbq{MRhUstvtwO7Rd;gPpmuE06u|Jgh}wOvqZAXP>{^B>@ip%(@1l@K7qDZE>m=Gt;FV!v`Bc-**Nl@ZLuw6)#>56#+ z_tdO;EjeBcXm=;4DOdjGG1;+Pkube-sca65Qfgx&pog&KUirf;R5+W|5_`w|-ZLf> z51m5*Q+c}?x1MG^R0+`z6?~O!O&won zVz>>fdOt3ylL^q*uV&axn2MZ^LVtPMJzsAcJ^Pt^H7JvSO3%@a1$RIZ1mE@k1PVu@ zT0dbP6S2j=2a17`Ku)r=1k@Z0VqvfS^I2|v>m(?ASK1flnP7nhH7Uxwj~G~*a`16t zC3U`0k5AeqMsGBa$L4+b4tb*-ajkK~VAI3!=wB!r6?&*I zy*sAD6_h~v83M^?c91(zpt zj4$|D?N|NoQPkMi5eM?n)dX3T)nPNw65}`4)&*-GCg=X=DdV>vYN4-k+RR5D0#{2; zso;xn`7meLG+gxV!YHS-UVMw?A;~%_0q%p~)t0ku4@WAC7G&{+xPuX9Eu#k&U-pQK zCKjV3<@7hZjU}vMHO^F3Gu%kAVzizjnb1l~IqMVp8l9VdN!?&edJ=SVZ+!4I$rDY7 zoq@W461|)025-JRu2%YA0!XL9%_x)Mpir?Xt?>% z(h}vILxw|xSbc8b#YxOS^lDglSOoI7Lk$(oS9GK6)wVYVc#Zwxy1UXC(ftEk`W^(v zXM4DQUuqoEO^(^cAIYo?eUDP9j$ePu#gYB(ele3#MY~rW%n>yx0}8oEbdT6XB`BH4 z)2h+G1yhdYu>QtUcIne+!xx6iY00HBdy3@)#6xHP=?N{Qv*Gjv?SGG?kVW8kbci?G zLmLFaPyE#Tt?fv_FFC@Lq(6W7<3Bnj&>|*yaF|*CIG)QGAh}-rDBOadyuKZ^^D$l<^m3b#w?O1J>44acl6T6*+{P;f#~#GBQa! z%)36YZT_y~9z6vP>%VAaP%gfHAz>5(mrb?X6z$QDHQ_B@7^OYYs=uVLOb&TXxLjMy zkzx=ju7ocCgILVUFk=fbN$b;PMu##9Rpla)fx_Dw#eqm2T&AsePjhw8&-@M`?G z(7^9xL!Tc|afBs}@$&{s&}+&;XvLv+@!0Bn^o%m(M$i9XwzgIF z_m??p{QSHu%5^b*iH=NivUxStsNb+&(oA}se&JEUq+aN)C0SMHbGu(|GE}0^=&pSy z4M}lbh*&hWZIGCCO;_+Im?lwDObAe#Y{m>8wBmRk(G3+66A@1%yEZt`1R9B$ozT;# z@}nYj@cv>;sV207UVAKsVmIaC`+*Ng@pK$`v zMSR#I!vkv}121TFV$AhOlqGSd^ZBOB+OGMAkEY7DF)hWc=r^^7gX#V7docKAuc_$u z_O3D&YUOYz&-KoM2rMY=#q|ry@E&Lke+db)IL;<7+;sQcmxbwV1*B9fmN>K}hErhU zzl&VoM@5tpS%?cCw9zW$r0D%i#D!kypc=CtTz-v!DcJgO<0vpQ`=cZLv5^z`#yNjc zp(~0vJ|+%O#I{x2`D$qQV|dpCAvQ+OBM5U|Re6jKp;fp!dCCW7ZWFcDST|32a1(tE)y5h&^ho}Ojus-o)$L9gG+L{9a0boW!wweE?OnTX zjl2d)SNENgYLO^y|O_Fj>~IZZni>!ps5O!RlcCoP)DuhuIK&urK@OP6YDf3Ygl zC4HP`0L71f)G=D#=zD-*&m{F&_>RHhjQk=(XDT5Q_6$jHq4(>dA)X|S$I0G8I|SUM z)-Y&T){sw)Q-t=tY5Y6}%JNA0F9WPH$hTcH1A%j%#ina_5cr#|PPIQoMwPs;@9ZgL zyhGQ|8E295!HPQ~I6Vr`uxdZeIVdTn6kiAPO%pLcoa+efRD5RVF!*if;Tz8n+S4NK zCl5;nAG%La0-rDbeV?6$QZ-9ylf@qb?8|sbUHYQ&=!qykyA*mZ^zB!BzbK$~<3U#n z))ov}Dk-HouMZ_OxG_oq27zCYHP?+?5%aC>F{*uP0)w{^7iyAZ=lHfxS~e*l8}wGU z_L<8z<@!M{21QRUjYwZbIP(RiqJ&5gKNYWfmp*H{byT-hBks3kdC1h(S4q@0^levA z(clJo`tuh+1{?26Bo*Byu0FoJ1|jNexTwy|mm=$lNCBe0ef|14VwqUugXFhMF^BgaH(= z%oHz_TSePg_UR7qF9HLF|8r|C^`rU!X93#V{(f>tMZ|7@cjj*NjFV$y8m*udWWT}z zUlTpG)jKEApTajzq_ZD(wd)*VH>?|UcgiU5s_FUgdU?B<(TS+0=OB)ZZFB?5H;N;0 zg^~vIh8CIoFT%^FF0g6^Cc_$47e+zh-V^aWN#O)bF5R{%2GG%tQUe3#x%_Y=o*-1> z$}%3_O-h;;6!v**24|^06fZ^@n8v`oy+(!5s@$Bg*sT#lXiaXeF(JUaFsYr)@JuDp zzMJp$o1(K13Oow$s*_0{=yO;7iTg8#cCI!Y_KQ+dz1P(cYgt<kejZ}73M>*icz%45=2g6yC~4BWmeiM>Qh@zRh1BL?O#Suue+aED z`Uj0zY6&f4&=v$-k)+OVEIrUrruJ?1SLrG?u(?y$o&Nrs@_EXe7YA+@8mUK97!Bt= zq^#kNus$}qp~Hhfv{h2A@OzOp^y|Nxza>}?OG1%95b$cMsr~Ri)}EU)eax=EJINxS z8BEbtosv_Ew5!bYXiA0Dd!_GQs(jKjJ|H1mXjJIDk{a$s%7MGX;N9P=fK>$yd87UF zQ**ng4Z=2Y{B-X45)~J0Bd_DdMUEfJN1wPg2m#B>t)GR4T%g&%N>+$ebhjp@Pd>gH zPtHH;>|7etz^G@4O+8xD6R7^Xb~39We5#0vICY8-{fVpW8PCsDaQ~#%D?M`0C7hLz z{$~qjJ1yVNtpwl9MKy7-pS71ogB-cb26|OzaNt8A|Uv3C+Am1^Zxj{knCICxG%h znYPpQ@?v-*_;Dn#|Cqqd=pVEg9vJ(Fro`(pA*~+>gMKr$Q%aPc+Dc(`e$^p)F4zYq z+GO|Qk7JQ2)rx+Qem8o&d0Eamt{C3e$6E9yS8(Rd+hMG#aqAqqZ!lMdy>UTDA?mqg zY80{QzNMO$_Lxd+LcDK4jp|O*KYXjKKB2KGex=l~4Fh$eK|OzDxxlu>VsmyANuZ@n zorvj%@Ev3m!hc}U|68b#y|e`M=m!TCFKnn4J#)!1TuXGif2>I6paan@0!2?2ic{1Fvpa2rJ6=f>u8Iw1l~o;S&cju;_TijTK4_9^KBo{+zbhD{pS8OlD3j zi=(haN&zJn z)KN|KWck?ii?w}enFe|^IMa*|ji1FgR&ui55XIA0PGzRJ^;jf<25@bxu|SVxZ+!5< zz{y5M>2qTeuW|2jvdfnQzwU2cV*KMNX}j5Z(kjjtkxPGYf&u|m=xL2umcDd|=0<=_ zO2#`#o+DIy*4gUBInz=@hiu`qMLcVMRtbLt-2X|`gKcu^w@KNdQ;`}k_L(Hs2J)70 z!$GN*xY&k!Hikf@FN;_`Bf?Y}k@{jtG6Lt~^(2^F1Saa^6gjzxJD=*L8B^0&GP%3m zuet>Vo0I?5ka}3o$16==Y+Mbd1*(4Ncg2lhC79VsFY*`;kIz5V1TxlgL6AmvA=vFFM1s(&LYLSkYEr z!;$vVczt|D?kI@QyL>I?9$TjK$rUv1=Op1w_}tLN#sn4;Ob)^quLUmmM5u~g*Ti(` zVaiUgG9bN2hfJhsVX{^e_KnWgkB|PuPp)8;O6IqeU|>{jqn4jzGJH2q8oss63)=8f zH}a*huI%|{5{*L}4!;VdcpW?_UBfqI5%jBN!3V`&_(qvg?#u%{-yxNmMVZLSFr}Q5 zlSuSi5-FR~R)|+%g7YD(WCPkiLma91$)`!D2V~j|PINvFC|&#sB+fF;C^q#A12V)< zsAwR3Fv=Q@bu`zgGTVY|FO}r`LZ8!us!daJI@sQ_ZUP)bUg}3j2`VF@k+~)IVRtC} z$V;h=A<^iwcUf1#$%zMn5@u!wW|uWr>0))zQ=19-06C+!wz%A@1Xh~cKqUP}aCbz{ zp9g-E_lI2qLS4~YE$rJDw@N@~Ifip{O`ite->b>?DygP-P3({L6ahRLeOiReq6T90 zYBk)s%*sle(d-RbYK7*UFO*;L)Exw=n>kDVjMZ1-_wGGWe@34XA;*+Dg;lLh;Y265 zA)O3zaI-;7zbEkweVPto?)s-Jzh~BI_~T zrP6Hu**RvRidgli`v;);CKj8>KMoTQTB;$0W$+S4Pf;0zmv+2!t+$Be678KarZnFR zpZGemuEB@1x>;7+@7z@3aHW{ku>4M90aTmk?Eko^HnJsFEXZdckNQBc$3``N2t>Y^ z6?;KHGeMj5Z3S~o7|n~m@2|dErhC`CCuwy^P}}AF9(eu9FyCQQcWj9_b5P|bV#JYc zdg^xDF<&h>zwj%{4jc=KKo1dsUKEG(soa@Q5xA=HZQLM2;Bbk%%tCiG1T%%R$#ju2 z^p~oxUD*V!%z96+biLsugVh4P8~z4w1pk1^4O*;a9It@%CAUZ1&e3V< z$KLQ%hx7myuKNOX5c#iV3mo+GMbo1&xEV8B2?#L=Obj<8;5p^Y$^!pd4xn`y zFkhvOuBhl>M;LGtPPz~tdH3(lXo-a%dnHg_CGd-u%Tx*cNU`PBavcK;e0j<&rrXgI zsPp8p;jzmndHq(!d|9~Bd0X0X!w*lFpHkG+R8YQ~etBcm0f^2m=n`AgCo?Ov9%#vZ zp6Lnss7?NnUAR6yB7;>wGosANira0IGVxnonK7^f<#w>7in9L3QF2j$CAvryCS#fV zSu#Bs9*4X>{93SiO703erHPoz5q$yQA-YCExsFdtf9IK1Jh+vYgbF3Lbd6<)OYe#| z($~D&Si^}Y(8IQ&5|M4S-w>*nR`lHm1zfryvf02CiJ|sk_n6>Pk z;0XE4ROT`U2|$(rHFf~&G&#&nA_8gt@^QPQ2Xklam9MI$fj8-2JpsB+D~5lM{#r$P zd4ROldvqjt`8LC(depmaI3agI-{7r9pk>&2g4g>F+HZ$iUqsvOv<#%B;1s#UbgW_W{QGcI5LB8s;>W#oYD%DOE`nV?<7PrTfESyfGgPede4ok&=C z{&w?Rqs4Da%y8L|oug8yJS#_h7+4p=mso_bNk=GCWEq1JQftA%&pd)b0%^RYRG~O{ zhh+}m?zazpJlw|!BaNI@>qcRq80??McDT2*%zYMlru`Up^KsrEtT|&Bqzg=@1pO< zw)@V6Yfu#4{cGNsRUZBqYZl05zVDqY{%WD6u70eqZ#PfOFHfgJB%JbP1W5- zosu^RxWy1m%wvK{DO1lJ^<9M0=JS1=8AVT(k6~5A1&2Amvd}BGA}ya7@M5(>6~~Dt zmcuC?%+?{bo!|_**phcyc^&Xz9%b6`i18b_u3^-E!zdka7?mgCm#R=QFfxLkYq;E} ztZxKzWF6Bsi>00Qy5zL6P zE<;~a|BF>!jLCWbRYN(E97OBgx=c5DErawpWYFtW!u5jTj30~;RCA{m5phvgaAB{f zf|1j0OnyEM+&5E>P@k5JiRZ8B=2Cq}s-aq(o}qWk^}6$rOxCQPVUBY0JS#Wf#^!zO zc82xu+hf<3pe?b40UYUvePoe<2etVAnTIBto3nEWkN;;3|+)q{5)%jK#d-)(q>_^TYMd)9MO* z>MX$nrK3-Dyvl;P$G?f5J!lAmRGR&4#wNe|x7M+OXN}hk`x9TN> z0K)!;C8b+&oru6?w;k(T22fCT6D-w!R= zM&Hj1bB1CcN(lr0?Xx}X<9A_HHoKj*jXg6dn$BW~Cs`iPvSBM-j)Rt@^QkMPa<5dY z?Y#fgpzu7zjmfj|Tro|rY8&*k5I+wU{`Uuikak&f;?7X$`k?gH3lAHh`;f!g-?pxe z`Gjh}^YO0r%{bnlqQRMlO)hnrNrqFU`9!s>3Kd(4*{D268C##>j?}ObEwa7}E|y_Y zRsCg@^Z7g9$wo^gzI1EvWbl-Epk>@iFw!fLm$tw5neKuxG?b6*qTMirdvn9jMEK8; zca1UG@|o61|2v~bJy#-({3j1(5yI9kM{|p?eHx<;Uiug6LdwN48MGgU`=dZLM38}v zW;$qmt*44|%%Q&OY(T(5`D)xAWD0?fVrVd?%VsZc-0BV&8&OIDas2T`z>l<3LQ7LE z{s4uh$+s7|SUUf3o*NZ$?qHC1%KmxwPGB@Dml)CWo#vo{(!*oMQ_NZFZjVXo{sEi1 zdVp)~k-s5(>%yYv&LOP|(1l?srS`(DdXDwV=kA>?-Em(v%J@#Win&^oEj^MlieQd9 z#fYc90SWnJhh)riY#!v{TEXVfgMc)$A2;ao3-0?4JlBp()ScbhUua*x9D4e%rXqg2 z8N>NM@^h8GxtT*x)HAo-7n5njR475kmBdT>NN!s=i-)p)dgD#6>F!+5&qN~40cp&T zS9Iun?oH1(y}>8DZbY*8rhAbg(;ZW>{V>u6DO&Gs{G2(b}Y)sYN$|ZAq+dAm>ir2uzWaH1it=~596H%qs*CxyPM)2F?XwkVW z!TvpB=L<7ZcxRi4T|C6I@nk{;q-rWPmgtDmp>uJbR164uRw*F!T4`!~7=i1fZ*1LU z^TQA6-#fO*(`%sKIGrhcN-x1yth}LZa#{O0=kn4aax6X^)?5%b_6VjP?Dr;C@2?Qx zA0N4#wEylaHu~;yn#1qrReJ3|QlT&guAk>zQiEhk zoBlk7fln{G0`5Psmo;DHH;D#rys;?JUxF?=DL~9+KkL-14-4G4b`4IxySGtV7h)9e zVnkLlg6ReHhfEre79O{GUWM7gg9U4bRnWsJ#`a+7R#+)Ji&|00r!MYy7Vc@td*mbP z;i2KfA2uX{%rqbcdw1g9|qbqZgYz^!EDTt|G!}h%V!}a`c5Q>kt z%6S|Z`|;nB^p#%#L*$Rcj9?&VZ2U;BvEt(EjHc>dd`YFtq10q-(*JSff)9 z2YMnmzb2nz#C>#q564eD?q)GLJ10j*C|6zJ<^*rxA=-qKUiVsrqwe2V$9fm4HEP{= z#f}rU6}4Slr^A`|ej2w%s-hkwqD)5qVDAP7!#jJ*eKE({1GlvXcc(aZbv$mU89gRp zBeF*3zK*ov-0OfhfeM0Px}No5(7D}y;hJUL^*ftB9HSOj zOlH@ef9upJyU9HM8&zA?q{B6KNLj1dRSpjvw&3)Sx|7HGfd7{7<0jq9xnS{zE@Fb@ z?O-x3l;?Y-nmGgE{Yk;1aoSYv_kRh4AGW$?92#z?l73sccvCKT8JHN9%sFkN#g!eZ zs~8OqWqfVDvEYtRb6LY|=Fen|EMV=H0!#pI zO__8Un}JurKv@CzGy*d=t#ZVkVTc+P=j?R+0igB6;tmJ-je zZ$YOcp|BZC>E#|@a_~mt*U-wtKaP;c{H~$cmHK%oX2Icep%*fi#S?dTVnBN9q~-mw z7*J{Y9kL;DD+GoWxGbFOlnw#L1WS_{`sPFAgjnat=}iy|mmZEM@F635YT;(}is zRkyTts-~Bq*qk=h8wuLM9ZRjxOA5!_E}{pek)xC+o%bG_qU%*nzyBkP*MkEh zi$(p4KyDZj74i}U3gxp2YT_6s`&P8U3%R0)T$Mq(WXUx(dmAC65 zwP`IV*QIHYYb`MDg9#GFol}4Hpth4_8kZ2hoAGFGT9W{>Vx48=eVFkRG}${k6kFIi z>ZD+A71kx~_`uR5VhtX0L`Q!S-Y!K?=BL9+I&1Zq!iXHyoQ1n@w4f^{&E8(R3g2`+ z?M~j_T{#E++oE&dpJpj|;gL#Zx@Hp?n8qF(WhM{GOjVjZOd`KBl1AkmwXyh1&b1(A z>%T2*Pc5~g_L$Hso%0e4ksdnSnp8&I!N(X+i1!|6oewRUPWiL_wd{NI_>(0|G;oOo zo{SkeBw%}!$FTGR)0jKLs0P+33PD7XJUzl5A8M>4m^KNCHi^G|-E1Y1D-cWJBnnPZ zq^u3->Z#@4u_@0gEVT9T$d`WDzz;a>!Qkd8SmzCT5TP~z_CaW-2>_9qj|JZcu^BnVpWoedaNApO^3dNsp+}X{P_1k?>j>;M+;*?Tg{Go6gDn z?KkuDB1);v!TA{pVMZdnc=g=rwV%{gZS%nyVpTwtL(heDZAQmd%Q^-%nAoFru(X+|!v3(2NWwv1h+Zd@wxvQ)?7VTD!2A*e_S2UScADn64rH z_`ERa3UgfdgN|+C*4#;Fj9y{+FFb>_zf%YOrOLFmBB=HiE43ngb6oOU*woGUIc2<8 zKibAWQi5iX8yj7gp30{lOhqzX>v+EG^l&TG2vu}0W&`68>*e-`17;l}9#`c1FnsB! z=-``*aFNb?$$}2I0!zhRcj{a~3~KG5KkT2x{sW<~dXboxM3yP16|PNc(x4u=18p?5 z_5eySN1|!SGGX%+X-9_hbdC5w_PMZdq&vzxUL}f!Ef}Z(Xts50v_I$*PXetMF;f=^ z^iEYMi>x}DYJpP@;6nnsPVA*)nba^)6KRLRu5ii^krET>q8j5;IT1xPR1D0?&kjaL z9{$d}PCHmxA85?Z`}|z;h0K?^KR@uLH-Vqtchn}qThga1{dzGCW|rck*HPxOQ=_KQ zokJ`BK;6Y#U*09&>7PQkS1Ut4v$h|{=*b%!=w-h*Y5Wb2Mt*dJ#m8c3%FhQo*u^0S zMa+kFBjzbonMv6u=Wdou-Xzi(Z=XCp1wOf3Ml>{t_&zo)h&J*?r5Qq-#Et9KF}6B9 zxGYC&lWU_P?9>bWmjUe#VJeoXR|jgZXXP+x-kXQV_%o3p-HDz)dX3r*T#7J~{a@)N1Ao~oN_0KUfL z`m$F*S7@2Q*{BT{@pYJtZKgOo$7w*)?JtUewe5oj$M*9Haifm+33?{?JY=SiC}}eu zfY6UH&*o=#SOgc_a*#k^K*W1LhZ&(uOQHdYU&^U|7QUr{}?gdH3YO0 zkFT|)&^=5CYNNj2C6hOaXGibWY$Q|1E!{7wF`=@fpdQ^Bl+N28tKC9oM|%yuFah!2Fu-Cz&^lb)kCIa`-}3O?~Rq zf?Z?d?YQexev;H3tXg}w`sps%?O@E0x?1H6Ro&b~oZJ_cI2$QJXWAW0?DzU(62>EuzmEyh1TVox(HQP6`;Kel<4@&+64XcD!w3VG)I+uoKw|Lq@a;ommAIqZ?= z|5tt@&!3dZI43{ZMyiKbO~}rebDAo;Wk}vI9pjuh*Rcv?jqJ}x;PaoB{Lz|F=3cvS zzDG_pg9i(w>yE7P?_X0IvdQ9ud-H1U$q_;;Q0gjpnNtp!EZeM5Cu2z11S zjjC;lnw^ux+97YI1{PG};82g=T@^Qpg7w94X&~X`w+%nq&fQGN)WwNVn)o3m#~F20 z?1@gLZ+(s$Pq0@u@6!XzxNg)rS;20y<8iT=-~M(pU|;7O|HSyFvkmiBY!Y4J{zc0OY` z{3&U+SZd=R*;=lJjmp`%DUbX40G)k<@Z#diW`Eq|b7_&V!}m^3PSg91(ItZC0_-3q zt0@o*NoGb9Rx54d;f5~TC)Kg<289;>myWHuU*tL_m{1W@Lvg+bqFWqb5Tc6s%_Ku~ zDuMrU5*w6!Y_(%7iM%@+XD5+iHF^LKLTznXPjSRa#}D0mO(ajCoMUDnT(Fxc36;1z zd_$ig|7PO(vkCrw1MY22*Vktf_y!}TWO)9pWY19b1#+!TD{o#)e5iI^+v&Ley)}}- zbu%Xxe5;2{NV6?ed`nuT`{CGIl}+WH_*!wV^m1xkP+$T4k3C3-{7EzV%xpp9EI{QF z6xPKLGt?@$;!;_Ai6izH>5`K=5ckg$?taZ<>Twb+)3vCnN%{CeGAonirxJ#GXeIjS zW^bL)M8S*U<*whGYeAQ`PfsV+b&Yqd)xo=7q>0>`U*2<9>pM9M#cY*!m0K;m-uYp+ zTL}WVyv&G0J$GvS$!Y<=KcbEzUBxYTLLEEk?mtJX``K7Vvi(DSg}*&|mQfabhK8hv zD$M=R{>P8oa*GZlxAqJ@YH@0OFPhow@pa0JFrEtvEyUFNk$bAyNcrpjV*_ifY$`J? z7YuZ_RjJre{-#e*vES$Pg1S@3+~HmA$xCTpykewLT$21}`(l2X{%iY&oQJD?AK%@4 zpHnWW>aH_VUZXpnpnf(L!Kx~re0m0zna*f3GGqSN_$mJX$fpXc(;~($f0pGvdcT;} z=pyWrzNr|)@neQl%4@~2c|0SnZQq()LyqZ*B8>t(pw&k}KMK7_ZuECzQ!H&}X|Aj1 zEl}dA9jkVxQ*MO(n-S*p^+<@K7g=V+E++2=_+`QFO4n9gV zJ+o5zNoOQrBM~ZxZ8_mY=Pf^}e08cqk$@Z8$JBs7=IJ&WS8mypVt@r0Q&r99=THTedR7AeR zWc|0?u=MPnApm_2c?&hEe15i2Miczq;3VqtRSF0pLz;#fTM%Ta$hb#NVU zQ^#}Zvsx7xodNfygfzN-`b@DI#v7V zIeaRE*bw!%KKRmpeZ>og`_uQIf86aJj!B68co;punZXcYOr{JIOxh_EpSIO4C?CPW zp0H0`;59Sk$%swb!s+^L@xj!E|Fw$t7n@3y{Bol%?*t90+i=6CE(MO<4<>pj{bbkRi zsdFqE!dQ9p$ou#AI@upBVU&YOjAlhRJY4}(2kZXBap?F&(97rgS+OS+n5@IJB0r(a zHs15aQ&|?pTH6|QPXFfSCU1VNxw;>3;_`I(rrfr?0MPs|hg5(JK?E`HdTFM~%8q(B|(7m=-Ep=SlC@q7*b{J z`Li!RIS3$pJ7WpnV3w?apg&{Euf0AjbM=5A1I&zO1{zn-IKH3C=f~z1Gwk}7U(vA6 zQYRkrP1&ut{Oz{dp$*Z+Db-30I~HBcES_<3zq}KYy1#g?J3pVDQ?On3s`_jtuA2T? zt_yGR%psuyN9Fup?N1V-yOI8DKbMZKW!s;3g_ww;*8P93r7y^bw0(@HIOzX%NrzzY zuc*;mb(wubni{O%7e7U=j96vUm!IPrSQKgJ&4&+^jf`Xke zKyGZrP{RX-fnf0stxK(id4ZtLrYI68OikGQr@uPN>#xo8ufJH~cYpXjSFT;*(n~M% z-S2#dg@py`wJPgtn`~}v6GTzJP16)U~| z+I>SrKu9rC5J-}w@4K#)+IK^r{XczzNqd1K_Ic*SIVxg;iRuK?Q#1IUk5Yr@FJvA* zH+M$>GE*0aN~MC7l3TZL^WLBS#1~(Dju4X9U;jQYz4iu;#snHcyBp9AVxmN&waIqk zWTGR58PY;w1V)?wZhO$>XEK2nS&Ds-LKpqM_d(HL7B~XFoJ!pbR)gJ;07a!~VEovUvhh zXOW1)AW5Z6*A@T$Z;tTBcV_v;+pE0$?%TZo!AHFH=3ns2%P(`{^DXB3dnlvYowtENyo%x9l{#>bz2f{n`r!9P{ww*AoYF2*l+*q9@%0h8ruTuO*xAccHvmP^ zU%s_33JfSgK;Jd69KvVVAZTY~qwFkLggA`2hudIj(vdVkZtbZRLRmPL;lweEzy2@N zTsUX*-urFd{^c+E{PVAP<&~Fs;o|e0IB|@bnJL!R*4f%>5`%{cWrxcmS9jJ$&E8_dJ|@V9#B%0*aw^c}Q0&3&*puEemZ7D=RB}b>#|Iu3lklyGdhWmeXgR z;oOB6m|ZwVl4v?XL>Q&SNt*8{O)0Ks`ca0yNB&S`J@@P{PumrPT7a@APu~ep42Exr zp;Q8QeH^3?M3#amTKy<_4fM~27^Z`MaY1R9FT{=%Ksl5zO5y!dPC;|`oPnY1bw?Co z=ZN7U2+)J5fyqYQ}Ka(Vyb4X#|j#=GxsasB#DUby%?XHK7DVPT#| zqrv9Z7Ohr`Ac#u6|ATW;OdGVU%uUdBG7#uhD!6`?BuNN6O@hiKQF{sh&6pM&{mUDb?S%wULKLU@P#x3X z>6^ULzpRB>rN0<-02CtM*V0_1^Mbr0U*GTV@0;j|zUUV-0d&7sU;q#Oh`SKE{crL3 zgJ^;%#JBvOl|_9hY+vLRs4-a(IS-*|GC4eopTY{(D^KL)OCP9uWtf&r6W` zNl#OhZE@kb8t0yIc<-Ygzx(|rSFfzHwswo9I~Td|?6b_z&$BQ;OSR&&xz!{H0+Kj4 zX+sS1`$Fc|L~bh_J2;Mm=lLW_Lf}{ERqKS|QQ}^QaBG>ky@3u|Ad-Aa<2MU`s*7|H zqZOA!0QmODR=Y>lmAJNrlA|5HTk)K+0s-AzLAS2=XLTQV5D)^=QN0%elNu~3sQE4x z*QOgjy&xcv2n5<_Dr$mb&a<3UFXJS29LJ$iuQN3@iR0Lrh?kxh#d9&{t~j^=q*7RU z5m>j=;pUASeDc|6eEH><7;U)l+(lk`^$m_5KMkaWNkT6OiJ}y}W3=v2J|8jE5@(Fb zBIiQ%_0J5&{Y_uoi(>kLBVg|FZ-zJH{oH<$_ZOz077&I(N}xROR}8>oFl(SZ)JOCq z{{v6q{Es0@<^*Q2yDvf*g`;tQmtM+Q^g9alJ#rFeKr!XrzbSbYn-UC&9gl00yk;TE zA_CIl_17kO;ki1Wf7#`??=*S)?SJIMkKX5%mtWdEK#j{3kF+6S{U?M}j z6k#8CkgfzvJaW=53b>S#;|T&q$@?DO6JOPtwicO{&)~4m8S1zj_60CQ zGXcb1T>=9wA9Mo@scKemcUPW-!Pwy95et{Xp>~3yME}4zsQ6k@$X9;W`d)2<;_hew z;_mJOOzhx_w@^Br8I8BM82+#AVRO`fXOc?YCgGtih z2tgbm;tnF%CT^|KYi^MwQC9r<7=%AgQ?^<`cH$i85CC?w;3laiNh5+N!E+8U2uMY0 zL}n-ygpY03z=J?wq$rRW!VkM7D-rI63hsFy>4=elKp{Tk1OhtI#8*S?hK+sHLD;fX zJa(TOUpmy)1hv`>Q|@s*Gl^|{CY@Q2VU+(bfC%@zJmzOzz{sPZEcY&iv7dSI$DWx()A*FC#mn2C^l9(u}5JfejFd~XW(l{h+Z=vl8RJDhQLUh=| z1TA#b#U#Xd%?p#HUI%vRq#~D-W6@wapq11kPEU+CQ>R^y&bpjf4EgM|vN@b=(T3a~`_{4Eck|e}&L|Cok zHRec?m^2CrJ6puvEs|avorIVqLZlH`V5Gp9WX~;z_Y(dm<#?jH01iQ*1On-Jfq-MH z%zJ&5hX4~Ak{dDU%9w!w5kWF4ld0@=s?fr|?Vvgi@{Wsh#-p|{#gwzaY~?t0dy2X} zi!UZn#zH9zzv5A=RjAi$_`cV-=elSo_KtCctK64;XL1_)K!m(}6JzL@2vsJEs)#SYo zoBa8!FZke3SGjS0kqZ}I;LMpb%+AhmWPX}Py-K^?q22D#3qn$zwR-A)x<>RP1D0iB zS!7Wv+d&&cnkGbXOj3(Ulax4)=mir5!8~ysW73o~?xBM=GU*YU5RvqdIzs3KiSD~1 z3X^^#7(B_s|3m`7gF(O=Wug4og8)J>D)~vZCW!P%&;PiCfNyM;uXTu|!PLb*-)Ulp zw>;EqGt6FC60_zVB11`1rnuV_OI*hiVE;4snHz zZDHDz^}LInryY@-7D*xKb$hI=uJYBDD_p*OnLA5Mc%H|ZXP)QmvoA4!^aQSBqqU~l z4hW)@I8I5(iuPpwCg~jz(AP0B-0m)R{!CfN$}V~0?soV=Bw_fAVuw!N-O@j7Iv|Q0 z(cCNEZ-xy02A`B@L774LzfTmU{(mj#JN}eI3MS1%9OVK)xx*f~1Q10oT*%>$f+0{a z_rWAl8Z1+Rwp@k z?i?>%yvWHDCpf;iKoEp%H(Rtj9op^S|7Y*bmL$27EU}~4%=d_lh+L3B0)^VAx~IBl zD7^_s_{iVnZ}5$8d}2?FP{^4fyV*6hG^()V9-F({a#i_oH@(-)BQsG*hbJPUBnz3b zxSN|>m>xZP^c*y;%NmHMI&+VN8&3gXt}vO@V4lHRMsF>aty?ARZ68^J?dBR?yMeV9 zebGR?}Z2Lkh{>*DrwLgWzE zU2XsZE`4x6>)lk5ktZ$j@XA5t^pK z^JmZTZ(n?Y-~8rZ@uxrj5pC1r^!`Wq`~UPmFz|t?`YpA@X%l1|>N3-~+axw2q||{u7k>;Rmw1U3vjP`3Ijy@?c3q_W|U4TRg}?{P%{xwqDue#>}if5 z60`=WEWkaE76yOwAMfE;zdXhtzPQAH`G2?g-S7V^{^ehOgR}c*`1N1?8o&7Y&+zEs zLwxl3BWyMsoS$Ff^70DT>ovC9#*GL3_2CYmeYg{$s%lh~)7@EX!Lu2d8SDW;*Y)UE z$LMn zD$yYV0U|fD!`tcN0*KiJJdw53}z-s|r3g}OOd}_WG5SUgAe6si@ zo=pD&6Pe-TvmfE3(1+})@1A}^}AN!W`= zUK!o|l~5Ts+uv+9cE|GBqAO`57KQ{uB=%J;wb9k1$^zqi5i% z>9B3Lu*~TDz$l2P_9;7MP^LOL`%QUzZc$uC(ksade#W+X@7pS=9IEn8+i@>=n4(q|~+dj!*%-2Iz|483-Ir?&I^-ukjc6 z|401n{$GQLv05GB=*Y$7)^+8(o*nuR0VGHgN8bC8kWiz+`In-k3V^WCqMcrPVYZPHJPIAI$W$9G@W%3z5bdc z9mYetzZCrQzrMoPPtWo7pPu5yvp?W>zkPy_K6;ENPd>r@`}cA0-Vx5u zPOxoSTwSfP-mLu=KaTK9Ly3NWm-u(tRA?a(Yw zusC^yrrluk@=IK|Yw+g$g9ib(-U@i1K;YTM26m6fAR?%YpGnUq*fh5o2y7Yrs>13g zKf(OL=V)Gih356s{Q&`bcOWn|bNt2Wf5NZt|4;br;ZO1Dr%y1S&)!n#DT8_xZ`ol- zKibGsVy;18%dowhnYL|<>#Hk#_4POS^2;yr^yxFaI={f>xvw!mAViPWOTN@+QXOZrHHC)lmVJ-+<7 zH`Z<0HRhrnpkVBQbxctCL?H-B5>*h#;gnVY03ZNKL_t)~f$z>qeNGAn#G7G_cID;! zK9&)H;ykhvO6bq)BCcH$OXMR3a}afVA<)S9(SUVh0k-Z>*8!%&*~tuN4=ViSuWCGd z#`y2QZ}HE+d5Yiv_6z*>zc29M!N>UY$>;dw$!GZZlTWZZTH)ctQ}q2Y+NQ;|X9e1( zMQ<&7Yh4&Da7JYBA-EMJd47$q~*le#rVl%hP zI{Ve!$AF+2MN&8x4`y#D5J zfPgoEsm&BWJ^7FL`RecR%OCxFeER7p+5PzKo+!oa2B*F#o(e{}Y9tV<%XYKDv**w8 z$3OiEUwrWeon_D;FY77YsUmm3)-ZsXCT;jM32OLUAcn z+6f1RqQ4%5fZikkQ^5%nJu6UG2A@2d;NwR#{Qch@H*X4~L;v&H4rHMW}#w%g9H752#uP=UkH zD23lEW1K@Fk;z_gU#xL$IlDEf638(}^<@YP)`~`VBG_s@VdIk3Prj?Bj!B1n@Hg?gO*M5+2qE$LM`XkMq_KiE^a6``~VCQoOFD;vnBlmhFQ@?Yq7?ag4Tw-clwvoIFY>iNfmx67=%%3L+d7xYYoZ+%M6JMR>08Euqc2RQdYxI zK}JEeXv8J`RW)ELP-QTy4IZ9W_=mr_hrjywM|gd1@zvKYe)n%L@#5)g{NZ>1AB2`T zJv+t6A3t_~9zVu|2M_S*;eDt6?<|_ObtA0x22InV>sqv(^|=K7z$Tc82BV%3(OuUy ztnKl9I!AT%2;6J{>7te<|M@!r@PY8dvbX1|h){Kxn6+z6)=$wbZ!r+?$8mbRK;K(j zZCY&G?t20Pff4wAfq;A|u%8pAe?7-({V|T0Czwtr-;(i2#g1+79MrlFoAny!=jV9& z>J?tTdWl!BUgF~X0_*k06-zV4>}Pm1qNKg7ywAKDl%=j2m&?+Z2uFd=FCP1OFnr~(~@ zgGxuB#gaOU2a27@G;c}(SdPs#lM!q4*xsQO1z8tiQYJx?vJBLAT5+AqkWC!4Zi&2JxpiEI66MY>FEg`+&^`?f#YMGoZQ3d>50n)ungOKV9;#Q zG%eb;L*Mo2`p&JU_AUxJFacpaR@W6~vnl5D8P>-S(7yf}=sWNEPam8n;MM~Gfnd}2 z=q+PH)!ve#NP1M=1iwSBm=vAcJy5k_9P^{T$`AzF>#(0@9iwiXa9Q zn*!nWMMfi7ANyYd;s^jh?7ajGP*+$jDy)tdjwxt*ym&Ri*H1eyn_604OH&>kNxu{v6y?;X7_ek0)OdW-ApE37vg zbX`9He^pgsxm@9Lbqc9x=$lI=nfS0Ez^w-W%!039UZUxGe0={HC#yLsV{R=FSk0%H zPAXhnH+X%uLEG<7wpba$;=q7F`}%8`>{<{k;MKg9_Dl0$8`#Oe1MxA_B3lQ?b^f z*>163uidWnW`m|}vE6KNy`8l3Hdybc{&#~ETQPmSHkM3c)x`ziJe}dKNW2{ae z;ppTHN6QtAapEawcCtp(_SkN%v*{I%Dt;m56A&YI0b=o9HpWrAl&kcugI(i{F`WSl z79!{tGQc4zciCM`?l`Om1Xbk~qXsYr4^HQJ@L&l{D)j3uUY&38{H4XyZwOz0^8)8D zpW=^SSZuezY_`O`lQW#%e}L1|`#3o{!D@Ac>1>Yqe1_F>iRI!1XJ?G{W{qdhUf{*c zS7_S=0<2{iW3XDSP|p^idWO~tCKcgBTnV@v0l=-yJwLz3#q|~^t2rJY8W6xffk1^H zeRP5c_g47w#RY!*!%RgLL<2~g#OP^#grl^Jc* z;MJ>F`0A^#@WmHj;Kj=qxW2x|_1dlMnX1NYw#00{!fbI5KmCheVYWO&H9x|1zQpoq ziREmHN#(+GnqF|Rag0FQuJI_u5e2P0kPAj)cFTC!us#kn`|O(8It{jv9jA2anl}V3^W2xLg>CfBLmVv z!98xlEU1A4!Xjp1xFy2_UTj8Iy}2@WgGj}fDUSsfRXFuQ7-cOSex9=zr%`84&6ky4 zMi{HX=mL3Akq%&p#~ofW7ZJyjL=thFq?rK!`QF0206E28*E=EM)}S^94^NkPcxLdc zpBV@duGbANu6kTt5MI0xJbUpHug_oL>puyu))s9G%oi&xmMc7X@Blyk=}+*>U;F|O z@1J2dajuo$Jbhk}KL*q33}h-W8L&{gjy^CPaIgSi-zQN7XgZ5$=hrwtFd)#*&h|zv z18su&TlmkpsL>M6=_U`$#e>$3dRu3K%wn`$a=lTzy9W5@sI!X zPhgo~u{y>4-j8wb@jXyILp@nwGMiz(oMW+EU^Snis%tO^oh4WRSFNDydbGVoXWb68 z_+98=0W4~skJ#suv+h-zGxj%sqik@EC9p3(#<+Pqdr%OHy<-m$V};`ypsGFLs;fv+ z?0vT1?uv#Dg`IQTSY7a0kk9wy7(mke9}eVj!S@RigAnT)=S%`iT0fHrL@4nbQtaxH z>hj4K%1}+D&;saHJ;81xgW%Jzy^VG5z+gNOl=>Ks7a#*>Kg~wWI4F=2FheECD1n9Y zg9s1C9-R^8BNHYM5a8GWa*O~~Jx~$Ivn==Kz-m6hM`s2<`Haxn1vX8O^`^yo(_^y+ zHkVsmyuQHK&%VO{@%5MJ)>ru3zxxNw=X1nuy#M1MNtL#4hZb|+BXDKRjxxe)hPHNB5c-c{QmcUz{`s@e)6k- zz>_CG$80vobhbb>nL?;?Mb+Otx5D7osr5VCqqE|7rkxQ=ZvX2`BZb1J%y0bK6swNi zD5pA>!d%WbqVNJh2*q`{BzE_k3L#V|#tl=9?lqY!yLK#0(mEEXLaaJ}q*TN72Yy#v zuK`NNif5w(DaC>1ctN5NaWFy#>J>2hB{CZLXrmqL_n|D461;NP#J^D7)&Pw)D=#| z05XM@Df*7kY#Dts#eeyKp5lM|-~WIw{;-Ed9j>z#(2 znbzs?0_E&iH=tr=fg_Rx)wxOIgyLjJWx6P+tpWV{Z-xm6BRO7h*sacu9Ua zd8e*G0!uy)P>cY=*A0DqWmtt(?ZnUZv1v9e;mLVg+#rF-U z0}O!ym5B(&u?_MJMh=}uHW5ZmgUryIfJV-P_CR1gGJs+R)bEP%pui#}Cx)?sF@SO7 zwQ35?7877O$B);~vHZ{9;QahKnx^&an~ComAzja;pOXwktRD^#>dN5k-V&3#LR}kY zhII!3et1Bj-lfidPa}~@UEyRk$7(*k0|Gx_AYhEaWID%Wnl=D}kx#f)+TQt;uZ~t& zt{%WtH7?g3nx;c*d-T1)hC&baMU#>GYB!&^P`LmI*AnMdB-+vXpY~e^q@aTf5~4VY zHj;OfK}hcWuLwdCC;D-BzhD64FCe8gKZ+}RNK1pFyMGw~04?}qrS8|GfCM5ELm(os zVKgu@IzRy!pyvE6!Bq}Qr$;Da782c`71p9ym)O7{CGhE59lGIc{a^%O6y`*uZboJG zr4od^t=+NYCP&$Yt|*)AlPFvV3osD}?dt1VxJbo$Qv?fO+*(OxTu2capf*5N!x+KI z@dO*cJwqT&>dFINihwZK3P(Uf1Ve<%5YA4Pm`&>#&3@>Mfp-Al+X8{31wQ}i6pPse z)gCDxBDw?cWH6h}@w&CR-Y_f)Y|pOn#O_&C$Zja&P9x8mrA;dE z`X(wY&<6VAX@47L{l1!-u;iC{=y?Bka;!q2OtTd{gj7Gu`%+Eqt767ljL10v02J-7 z3N^>5 zJ#L(Tj=A|sxe*|#>n+z3G@{U(2J|)+ozi<_l+nUqT0kRg0P+AKR%3)X?qIbt8NiBm z84Rz}sK*0fI6rht<7`Ofa|wjgHUTQY8cdA4uVOQe@x!L7AuJ%1yJ&{jSXCA3s>aD` zip8|XZ0g($Ka_RAI{@%4fxwINHRjVA%lQ<9ADgoXqAp zIypt{yA1Y)%a~NuY}aAC+2Cru!M2*jqR;AXA4|M&?Cv=($Z_ndbq5=6@Ue&$3-S_$ z+~h!rZq~>jC&;gLd*?o(eSiq6nmN?~N&U`@;YwtLX-V7{S>2%8-f& zy!is>Wi;PSZ2 zF$0Q3Mk({1)A0lsLSb(@1Wczj>@}n790+q7fc*DCD7Z~BCesP#$4kts&K3S5vGNW8 z?DJ#v;&@LtcnErCTyI-!+aB|2eFp^YfI#}isttbr=|jA{SmW9GHQKg+>saXNY>s

`AQ_Y^r&FLzV5e#P;A9!-_gMV>>ttW_v*IsF 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 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 \ No newline at end of file diff --git a/src/main/ts/src/environments/environment.prod.ts b/src/main/ts/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/src/main/ts/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/src/main/ts/src/environments/environment.ts b/src/main/ts/src/environments/environment.ts new file mode 100644 index 0000000..c8c637e --- /dev/null +++ b/src/main/ts/src/environments/environment.ts @@ -0,0 +1,19 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false, + apiUrl: 'http://localhost:8080', + appVersion: '0.0.1', + title: 'LOCAL' +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/src/main/ts/src/favicon.ico b/src/main/ts/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc-vil+}I8V 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

`AQ_Y^r&FLzV5e#P;A9!-_gMV>>ttW_v*IsF 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 + + + Minager + + + + + + + + + + diff --git a/src/main/ts/src/karma.conf.js b/src/main/ts/src/karma.conf.js new file mode 100644 index 0000000..b6e0042 --- /dev/null +++ b/src/main/ts/src/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; \ No newline at end of file diff --git a/src/main/ts/src/main.ts b/src/main/ts/src/main.ts new file mode 100644 index 0000000..28bfa9e --- /dev/null +++ b/src/main/ts/src/main.ts @@ -0,0 +1,13 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); + diff --git a/src/main/ts/src/polyfills.ts b/src/main/ts/src/polyfills.ts new file mode 100644 index 0000000..d310405 --- /dev/null +++ b/src/main/ts/src/polyfills.ts @@ -0,0 +1,80 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. +import 'core-js/es7/reflect'; + + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + */ + + // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + + /* + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + */ +// (window as any).__Zone_enable_cross_context_check = true; + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/main/ts/src/styles.scss b/src/main/ts/src/styles.scss new file mode 100644 index 0000000..90d4ee0 --- /dev/null +++ b/src/main/ts/src/styles.scss @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/src/main/ts/src/test.ts b/src/main/ts/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/src/main/ts/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/src/main/ts/src/tsconfig.app.json b/src/main/ts/src/tsconfig.app.json new file mode 100644 index 0000000..190fd30 --- /dev/null +++ b/src/main/ts/src/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/src/main/ts/src/tsconfig.spec.json b/src/main/ts/src/tsconfig.spec.json new file mode 100644 index 0000000..de77336 --- /dev/null +++ b/src/main/ts/src/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/src/main/ts/src/tslint.json b/src/main/ts/src/tslint.json new file mode 100644 index 0000000..52e2c1a --- /dev/null +++ b/src/main/ts/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ] + } +} diff --git a/src/main/ts/tsconfig.json b/src/main/ts/tsconfig.json new file mode 100644 index 0000000..916247e --- /dev/null +++ b/src/main/ts/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "module": "es2015", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2017", + "dom" + ] + } +} diff --git a/src/main/ts/tslint.json b/src/main/ts/tslint.json new file mode 100644 index 0000000..6ddb6b2 --- /dev/null +++ b/src/main/ts/tslint.json @@ -0,0 +1,131 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/src/test/java/org/minager/MinagerApplicationTests.java b/src/test/java/org/minager/MinagerApplicationTests.java new file mode 100644 index 0000000..cbc4d87 --- /dev/null +++ b/src/test/java/org/minager/MinagerApplicationTests.java @@ -0,0 +1,16 @@ +package org.minager; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class MinagerApplicationTests { + + @Test + public void contextLoads() { + } + +}