From 18f253d9c5649211c6ff216cda79b3a7666e06b6 Mon Sep 17 00:00:00 2001 From: ayazb7 <60544937+ayazb7@users.noreply.github.com> Date: Fri, 15 Apr 2022 00:29:33 +0100 Subject: [PATCH] Adding Score scene --- .../comp1206/event/ScoreUpdatedListener.java | 5 + .../java/uk/ac/soton/comp1206/game/Game.java | 14 +- .../soton/comp1206/scene/ChallengeScene.java | 26 ++- .../uk/ac/soton/comp1206/scene/MenuScene.java | 14 +- .../ac/soton/comp1206/scene/ScoresScene.java | 174 ++++++++++++++++-- .../uk/ac/soton/comp1206/ui/ScoresList.java | 91 +++++++++ tetrecs/src/main/resources/style/game.css | 2 +- tetrecs/target/classes/module-info.class | Bin 629 -> 614 bytes tetrecs/target/classes/style/game.css | 2 +- .../uk/ac/soton/comp1206/game/Game.class | Bin 9713 -> 10086 bytes .../soton/comp1206/scene/ChallengeScene.class | Bin 13212 -> 14316 bytes .../ac/soton/comp1206/scene/MenuScene.class | Bin 4719 -> 5209 bytes 12 files changed, 302 insertions(+), 26 deletions(-) create mode 100644 tetrecs/src/main/java/uk/ac/soton/comp1206/event/ScoreUpdatedListener.java create mode 100644 tetrecs/src/main/java/uk/ac/soton/comp1206/ui/ScoresList.java diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/event/ScoreUpdatedListener.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/event/ScoreUpdatedListener.java new file mode 100644 index 0000000..c88cfdb --- /dev/null +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/event/ScoreUpdatedListener.java @@ -0,0 +1,5 @@ +package uk.ac.soton.comp1206.event; + +public interface ScoreUpdatedListener { + void updateHighScore(); +} diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java index b8751b6..68ab9a8 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java @@ -7,10 +7,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import uk.ac.soton.comp1206.component.GameBlock; import uk.ac.soton.comp1206.component.GameBlockCoordinate; -import uk.ac.soton.comp1206.event.GameLoopListener; -import uk.ac.soton.comp1206.event.GameOverListener; -import uk.ac.soton.comp1206.event.LineClearedListener; -import uk.ac.soton.comp1206.event.NextPieceListener; +import uk.ac.soton.comp1206.event.*; import uk.ac.soton.comp1206.utility.Multimedia; import java.util.*; @@ -50,6 +47,7 @@ public class Game { protected LineClearedListener lineClearedListener = null; protected GameOverListener gameOverListener = null; protected GameLoopListener gameLoopListener = null; + protected ScoreUpdatedListener scoreUpdatedListener = null; protected Timer timer; @@ -327,6 +325,10 @@ public class Game { this.gameLoopListener = listener; } + public void setScoreUpdatedListener(ScoreUpdatedListener listener) { + this.scoreUpdatedListener = listener; + } + public void rotatePiece(int rotations) { this.currentPiece.rotate(rotations); } @@ -354,6 +356,10 @@ public class Game { public void setScore(int score) { logger.info("Score is now " + score); this.score.set(score); + + if (this.scoreUpdatedListener != null) { + scoreUpdatedListener.updateHighScore(); + } } public void setLevel(int level) { diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java index a0f2afa..7ebc981 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java @@ -1,12 +1,17 @@ package uk.ac.soton.comp1206.scene; import javafx.application.Platform; +import javafx.beans.Observable; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.value.ObservableValue; import javafx.geometry.Pos; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.*; import javafx.scene.text.Text; +import javafx.util.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -17,6 +22,7 @@ import uk.ac.soton.comp1206.ui.GamePane; import uk.ac.soton.comp1206.ui.GameWindow; import uk.ac.soton.comp1206.utility.Multimedia; +import java.util.ArrayList; import java.util.HashSet; /** @@ -35,6 +41,8 @@ public class ChallengeScene extends BaseScene { private int keyBoardPosX = 0; private int keyBoardPosY = 0; + private IntegerProperty hiscore = new SimpleIntegerProperty(0); + /** * Create a new Single Player challenge scene * @@ -54,9 +62,12 @@ public class ChallengeScene extends BaseScene { Multimedia.playBackgroundMusic("game_start.wav", false); Multimedia.getBackgroundPlayer().setOnEndOfMedia(() -> Multimedia.playBackgroundMusic("game.wav", true)); + this.hiscore.set(getHighScore()); + this.game.setNextPieceListener(this::nextPiece); this.game.setLineClearedListener(this::lineCleared); this.game.setGameLoopListener(this::gameTimer); + this.game.setScoreUpdatedListener(this::updateHiScore); this.scene.setOnKeyPressed(this::keyHandler); @@ -70,6 +81,13 @@ public class ChallengeScene extends BaseScene { game.start(); } + private void updateHiScore() { + if (this.hiscore.get() < this.game.getScore().get()) { + logger.info("Updating Highscore"); + this.hiscore.set(this.game.getScore().get()); + } + } + private void keyHandler(KeyEvent e) { this.board.setHover(this.board.getBlock(keyBoardPosX, keyBoardPosY), false); if (e.getCode().equals(KeyCode.ESCAPE)) { @@ -189,7 +207,8 @@ public class ChallengeScene extends BaseScene { hiScoreTitle.getStyleClass().add("heading"); gameInfo.getChildren().add(hiScoreTitle); - var hiScoreVal = new Text("10000"); + var hiScoreVal = new Text(); + hiScoreVal.textProperty().bind(this.hiscore.asString()); hiScoreVal.getStyleClass().add("hiscore"); gameInfo.getChildren().add(hiScoreVal); @@ -279,6 +298,11 @@ public class ChallengeScene extends BaseScene { } } + private int getHighScore() { + ArrayList<Pair<String, Integer>> localScores = ScoresScene.loadScores(); + return localScores.get(0).getValue(); + } + /** * Setup the game object and model */ diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java index cee420b..cf60f59 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java @@ -76,12 +76,7 @@ public class MenuScene extends BaseScene { Text exitLabel = new Text("Exit"); exitLabel.getStyleClass().add("menuItem"); - exitLabel.setOnMouseClicked(new EventHandler<MouseEvent>() { - @Override - public void handle(MouseEvent mouseEvent) { - App.getInstance().shutdown(); - } - }); + exitLabel.setOnMouseClicked(e -> shutDown()); menuButtons.getChildren().add(exitLabel); menuButtons.setAlignment(Pos.CENTER); @@ -100,7 +95,8 @@ public class MenuScene extends BaseScene { */ @Override public void initialise() { - Multimedia.playBackgroundMusic("menu.mp3", true); + Multimedia.playBackgroundMusic("menumusic.mp3", true); + this.scene.setOnKeyPressed(e -> shutDown()); } /** @@ -116,4 +112,8 @@ public class MenuScene extends BaseScene { gameWindow.displayInstructions(); } + private void shutDown() { + App.getInstance().shutdown(); + } + } diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ScoresScene.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ScoresScene.java index 8f0eab4..f3c2c35 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ScoresScene.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ScoresScene.java @@ -1,23 +1,47 @@ package uk.ac.soton.comp1206.scene; +import javafx.application.Platform; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.TextField; import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.text.Text; +import javafx.util.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import uk.ac.soton.comp1206.game.Game; import uk.ac.soton.comp1206.ui.GamePane; import uk.ac.soton.comp1206.ui.GameWindow; +import uk.ac.soton.comp1206.ui.ScoresList; import uk.ac.soton.comp1206.utility.Multimedia; +import java.io.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + public class ScoresScene extends BaseScene{ private static final Logger logger = LogManager.getLogger(ScoresScene.class); + private final Game game; + + private ObservableList<Pair<String, Integer>> localScores; + private Pair<String, Integer> gameScore; + + private VBox widgets; + private ScoresList localList; + /** * Create a new scene, passing in the GameWindow the scene will be displayed in * @@ -25,13 +49,15 @@ public class ScoresScene extends BaseScene{ */ public ScoresScene(GameWindow gameWindow, Game game) { super(gameWindow); - + this.game = game; logger.info("Creating Scores Scene"); } @Override public void initialise() { - this.scene.setOnKeyPressed(this::escapeToMenu); + this.scene.setOnKeyPressed(e -> { + if (e.getCode().equals(KeyCode.ESCAPE)) escapeToMenu(); + }); Multimedia.playSound("explode.wav"); Multimedia.playBackgroundMusic("end.wav", false); Multimedia.getBackgroundPlayer().setOnEndOfMedia(this.gameWindow::startMenu); @@ -43,6 +69,8 @@ public class ScoresScene extends BaseScene{ root = new GamePane(gameWindow.getWidth(), gameWindow.getHeight()); + this.localScores = FXCollections.observableArrayList(this.loadScores()); + StackPane instructionsPane = new StackPane(); instructionsPane.setMaxWidth(gameWindow.getWidth()); instructionsPane.setMaxHeight(gameWindow.getHeight()); @@ -52,31 +80,153 @@ public class ScoresScene extends BaseScene{ BorderPane mainPane = new BorderPane(); instructionsPane.getChildren().add(mainPane); - VBox widgets = new VBox(); + widgets = new VBox(); ImageView title = new ImageView(getClass().getResource("/images/TetrECS.png").toExternalForm()); title.setPreserveRatio(true); - title.setFitWidth(this.gameWindow.getWidth() / 1.25); + title.setFitWidth(this.gameWindow.getWidth() / 1.75); widgets.getChildren().add(title); Text gameOver = new Text("Game Over"); gameOver.getStyleClass().add("bigtitle"); widgets.getChildren().add(gameOver); - Text hiScorestitle = new Text("High Scores"); - hiScorestitle.getStyleClass().add("title"); - widgets.getChildren().add(hiScorestitle); + localList = new ScoresList("Local Scores"); + + checkHiScore(); + + HBox scoreLists = new HBox(); + widgets.getChildren().add(scoreLists); + + scoreLists.getChildren().add(localList); + + Text onlineScoresTitle = new Text("Online Scores"); + onlineScoresTitle.getStyleClass().add("heading"); + scoreLists.getChildren().add(onlineScoresTitle); + + scoreLists.setAlignment(Pos.CENTER); + scoreLists.setSpacing(100); widgets.setAlignment(Pos.CENTER); widgets.setSpacing(20); mainPane.setCenter(widgets); + + } + + public void checkHiScore() { + boolean isHiScore = false; + int score = this.game.getScore().get(); + + for (Pair<String, Integer> nameScore : this.localScores) { + if (nameScore.getValue() < score) { + isHiScore = true; + break; + } + } + + if (isHiScore) { + logger.info("User has got a high score"); + + Text hiScoreTitle = new Text("You've got a new High Score!"); + hiScoreTitle.getStyleClass().add("title"); + widgets.getChildren().add(hiScoreTitle); + + TextField usernameEntry = new TextField(); + usernameEntry.setPromptText("Enter username"); + usernameEntry.requestFocus(); + widgets.getChildren().add(usernameEntry); + + Button submitBtn = new Button("Submit"); + widgets.getChildren().add(submitBtn); + + submitBtn.setOnAction(e -> { + this.localScores.add(new Pair<>(usernameEntry.getText(), score)); + + this.widgets.getChildren().remove(usernameEntry); + this.widgets.getChildren().remove(submitBtn); + + this.writeScores((List<Pair<String, Integer>>) localScores); + + this.localScores.sort(new Comparator<Pair<String, Integer>>() { + @Override + public int compare(Pair<String, Integer> l1, Pair<String, Integer> l2) { + if (l1.getValue() > l2.getValue()) { + return -1; + } else if (l1.getValue().equals(l2.getValue())) { + return 0; + } else { + return 1; + } + } + }); + localList.getScores().bind(new SimpleListProperty<>(this.localScores)); + localList.reveal(); + Multimedia.playSound("pling.wav"); + }); + } else { + logger.info("User does not have a high score"); + Text hiScoreTitle = new Text("High Scores"); + hiScoreTitle.getStyleClass().add("title"); + widgets.getChildren().add(hiScoreTitle); + + localList.getScores().bind(new SimpleListProperty<>(this.localScores)); + localList.reveal(); + } } - private void escapeToMenu(KeyEvent e) { - if (e.getCode().equals(KeyCode.ESCAPE)) { - Multimedia.stopSound(); - this.gameWindow.startMenu(); + public static ArrayList<Pair<String, Integer>> loadScores() { + logger.info("Loading scores from file"); + ArrayList<Pair<String, Integer>> localScores = new ArrayList<>(); + try{ + BufferedReader br = new BufferedReader(new FileReader("localscores.txt")); + + String line = br.readLine(); + while(line != null) { + String[] values = line.split(":"); + localScores.add(new Pair<>(values[0], Integer.parseInt(values[1]))); + line = br.readLine(); + } + br.close(); + + } catch(IOException e) { + logger.info("Error reading file: " + e.getMessage()); } + + localScores.sort(new Comparator<Pair<String, Integer>>() { + @Override + public int compare(Pair<String, Integer> l1, Pair<String, Integer> l2) { + if (l1.getValue() > l2.getValue()) { + return -1; + } else if (l1.getValue().equals(l2.getValue())) { + return 0; + } else { + return 1; + } + } + }); + + return localScores; + } + + public void writeScores(List<Pair<String, Integer>> nameScores) { + logger.info("Writing scores to text file"); + + try { + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("localscores.txt"))); + + for (Pair<String, Integer> nameScore : nameScores) { + bw.write(nameScore.getKey() + ":" + nameScore.getValue()); + bw.newLine(); + } + bw.close(); + } catch (Exception e) { + logger.info("Error writing to file: " + e.getMessage()); + } + } + + private void escapeToMenu() { + Multimedia.stopSound(); + this.gameWindow.startMenu(); } } diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/ui/ScoresList.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/ui/ScoresList.java new file mode 100644 index 0000000..af28a6a --- /dev/null +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/ui/ScoresList.java @@ -0,0 +1,91 @@ +package uk.ac.soton.comp1206.ui; + +import javafx.animation.Animation; +import javafx.animation.FadeTransition; +import javafx.animation.SequentialTransition; +import javafx.animation.Transition; +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.ListChangeListener; +import javafx.geometry.Pos; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; +import javafx.scene.text.TextAlignment; +import javafx.util.Duration; +import javafx.util.Pair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import uk.ac.soton.comp1206.component.GameBlock; + +import java.util.ArrayList; + + +public class ScoresList extends VBox { + private static final Logger logger = LogManager.getLogger(ScoresList.class); + + public final SimpleListProperty<Pair<String, Integer>> scores = new SimpleListProperty(); + + private ArrayList<Text> nameScores = new ArrayList<>(); + + private String listName; + + public ScoresList(String listName) { + setVisible(false); + + getStyleClass().add("scorelist"); + + this.listName = listName; + + setSpacing(5); + setAlignment(Pos.CENTER); + + this.scores.addListener((ListChangeListener<? super Pair<String, Integer>>) e -> updateList()); + } + + public void updateList() { + logger.info("Updating score list"); + + nameScores.clear(); + getChildren().clear(); + + Text title = new Text(listName); + title.getStyleClass().add("heading"); + getChildren().add(title); + + int i = 0; + for (Pair<String, Integer> score : scores) { + i++; + if (i > 10) { + break; + } + + Text nameScore = new Text(score.getKey() + ": " + score.getValue()); + nameScore.setTextAlignment(TextAlignment.CENTER); + nameScore.setFill(GameBlock.COLOURS[i]); + + nameScores.add(nameScore); + getChildren().add(nameScore); + } + + } + + public void reveal() { + logger.info("Playing reveal animations"); + + setVisible(true); + SequentialTransition sq = new SequentialTransition(); + + for (Text nameScore : nameScores) { + FadeTransition ft = new FadeTransition(Duration.millis(250), nameScore); + ft.setFromValue(0); + ft.setToValue(1); + sq.getChildren().add(ft); + } + + sq.play(); + } + + public ListProperty<Pair<String, Integer>> getScores() { + return this.scores; + } +} diff --git a/tetrecs/src/main/resources/style/game.css b/tetrecs/src/main/resources/style/game.css index df6fa61..9eee303 100644 --- a/tetrecs/src/main/resources/style/game.css +++ b/tetrecs/src/main/resources/style/game.css @@ -114,7 +114,7 @@ } .scorelist { - -fx-font-size: 20px; + -fx-font-size: 18px; -fx-font-family: 'Orbitron'; } diff --git a/tetrecs/target/classes/module-info.class b/tetrecs/target/classes/module-info.class index b6eb5d5dc3206e20460f1afbfd5d3d22095a88f2..861f46b22632e03297e81eb1e4ffa1c4d743d09d 100644 GIT binary patch delta 328 zcmey$@{EP+)W2Q(7#J9A8Pq0ng)j><a84``_vK+^;LA!ZOVle)F3Kz@$;?X^X5eFF z;0KANRp=$>=am%Y=M)Pw2rx2mLj}_+a&v?kgcuokpaQw6DVd4F3?dV+sL6^mG6?6D z>6ND@73U{sr<Uj?=VYelm54A%GBSuvHe?iG7GaQ{tj8$BBFo4iGue<)ls7N6q&&YU zTZBQLkwFS1!d;x4nwKiVpa|oqmVu2>W@L~9$@3)V=N9DWfyGoOUu3jRXJBAw;AmiA z;9}rr0Fk^5AixhI7zDwjFaraFD1#W7&CVbJrlr87449MylL}x`2~4VhNk#^cDn<sd FSpeu$J!t>{ delta 296 zcmaFH@|A__)W2Q(7#J9A8Pq3og$OY+@EGbD=mz^a1_XQfhX^xpO-vN`<z-~x%StRu z)GJOd$}A|!%u5$$;Adpu2Z^Os=q2apl@#UY6bmy5GBR*O1=A{WbA%a$85ww>0=cOv znTf&-q7#p*F-lB)Bf%oY$RIK~kx_(Mgh6JqJfjSY93z9w<U~eMuDsNe^8BJ~5e9|H zag6eeN|Wmt<r!5b&tp_(QDbC~1gV*Pi%~V5gMpoavw?wun}LS`MDj6!fB=YK5CW4T p3=9ln4B}umJA)*cmIjluU{W4TDuPL6FsTYA85uyT7#YB30RWm>G)Mpd diff --git a/tetrecs/target/classes/style/game.css b/tetrecs/target/classes/style/game.css index df6fa61..9eee303 100644 --- a/tetrecs/target/classes/style/game.css +++ b/tetrecs/target/classes/style/game.css @@ -114,7 +114,7 @@ } .scorelist { - -fx-font-size: 20px; + -fx-font-size: 18px; -fx-font-family: 'Orbitron'; } diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/game/Game.class b/tetrecs/target/classes/uk/ac/soton/comp1206/game/Game.class index 97e05b42bbb29b8c097703f72b56f60458245a6a..f240a5fb067647a6e97467e55deccf97ca0b1c87 100644 GIT binary patch literal 10086 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 literal 9713 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 diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/scene/ChallengeScene.class b/tetrecs/target/classes/uk/ac/soton/comp1206/scene/ChallengeScene.class index c376e054ce27bc4038ee3abe557de47110c82a4b..190abd750f56f6ec1d22c4f9aeec33d970d691b1 100644 GIT binary patch literal 14316 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 delta 7271 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 diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/scene/MenuScene.class b/tetrecs/target/classes/uk/ac/soton/comp1206/scene/MenuScene.class index 6fa262bd093cd2c01b74abc8920c2ac3a1ac22ec..5a5424bebb75fe9dda472b832ce79f17ba0d6c4e 100644 GIT binary patch delta 1547 zcmaE_a#Mrr)W2Q(7#J9A86`GywXq2aF)%aKb29WZOkii2$ipy+Ve;hvY}Ra3c^IZK zOrPw)Zq72Bhhfg-YIYg61w0H385T{R%dW1tgpq+aH#M&`x3oAjSueN1n2TW<!*X_p z6+8?p8CEees84JZo&1&Ev7VEGgJBI1!&-)Qj0~*B$*Fm%j0_?^S&3zdX%+flzJ4%B z)LMvvg`u8{VI#vPc81M73|kml85x8y)iE;g7pIo^=Xs}A1{9?h7pJCxY~IGhu${r4 zk%6<gB)=dyzcep}i$RBBCl7<nE|4%^aY<rPiE~C`PEKlGdMZe64-doM$@v^oeES&= zurnOwVK~Han2|wZVxy?IV?hBU19y6AiDzDMNn&1dDkFo8hNjQNMo~M*f&yzUhW!jj zc^Hm?4CW}#C@o3JFVEv*;9xkx!*CKV=mHiz&2WaD;VcisIfnC$49b)5a>#7n%wfkQ zE}WB?o0O8Ml9`uTl9`y3S)8h3$jG2Dc><THkaudOYguYuiM3`JBLib9BZKVZiCiL5 zaA8IUKB(@b(#)I`6@$s|xwMr8obvNaic5+T3w%>cGV)W3`Pmr0a4~#k_{Prgorgi0 z;m2ez?j!QQ7#X;nK-x0%(iIr_*%<zCG5lrt$IkGdhmnDiakDNDGb1Y_Gb4leWCu2p zU~A1VepW_SE(Q)pHXeqj49^4@p7FCXa)Jc7co<%Sc|0H<FAu{zFpnR^6X0QZ#qe5y z;WZ-zk7r(9YLRnJVsUY5F*~Ek<XT=$Rz@*K2D!-%ymFII^2%^?GB7f*GO#f)GF+Ja zfmhM>A_D^h9|JQ31A{yRD}w?9KZ7E}B?bltF$N|E1_l9!%M4c-KtO;&lR=Atk%5un zDuX>pHv<FH9tKthE(Qk16`RBOk{H>vb}{raFibwcFJjcUjbVx;s|dr4Z49$?w=tAT zvhHN?Wnu`|-NXQr(iLHtyNzL%j_x*w`5PG+7?>C?PG%FRuFqx&V60#WVr*atX6#@H zWt_qg#yFcHoN*CDB;#_1Xt2Z5AXY*hX3AL1aE;+Q10zE|qb0))hMNpb3{8w`47V6= zGcYquXB1?(!*G{@h2b#6Q-*sCw;5O&&N19#xX<u_fsNrG!zzY{3=bIC8I>7Y86Gh_ zsAu3{3}y&rc+BvC0TfP8U_NDVV_;%nWME(r5n9Z$gJG%G7KYVYyBO9pFl=Mk0QCSo z9FrK>7?K%;8B)N`<$>sfI+qC)uaMAVaA#lyhcWjKhOJs#7}U2h)bBtyE1Q9tA%}sB zAs1{GBu==YW-%~uGdyQ_0XF3&!!xL<4q!e50|&&&-3Sx8z_t}Iurm}QnZ^M(jf0^c zX52}*$4$Xe&cMLFgJIt`h9l^vl`ya|l!8rz_>&!CngA0hNkUy@33U;x);5OY2m?S# zkbxl?tQq1l)_RC;1_lOJhBpjv85jkaKna}~bNrFbK`{mtKpYJ3;XYCXM+gH0rx3>u zhEtmv*g;NWWB}!ZaEP148JHP9fK%m1hEEI(3<eCW44)Yo8GbVSW?*JyVq{@thq5@} bEN(c9k5Q0Oh=GBDi-D0*m{F8boIw%*%nej_ delta 1051 zcmcbq@m_`N)W2Q(7#J9A8Gdi%YGY$#XXs;OP@CAOBB)}>#n8(zfro*WVIm`griRbN zMil{T%`i@e$qZB28K&|uOk<cnc@dj6+e{vYSq!r$KV~y$na{(pV6q&$4BHYOhNTS4 zCOfdJ%dB8z;K)tQE7i*_Fy>-d#ju*4VGR$%T84Fu4C)gbMJLZ?ca#H(Z{T6r$Y9UN zz*$_9Ul5#MnwP@Gpu@14hhfX)I1X{mZ9ELyLDIr0nZ*S;iItvt#U(|h$t9WjdBt1| zI~jJdGwkMJ*u$`Qvn*#U)8rT2nmpWosl_F}skuq1Ma7f(dBphcaWULyc)-r^kcUB; z;n8Gco+I*47#X;nN;7j(GV{_E82Q;4o^dfeXL!NR@REn&6~pVzV!X_ZtPF1%8N??$ zu!)#kYliW&GQ8(v;9&T`!*H45iU7kEepZIhAb~GD4A&X1Ff#CX=H;apIp-u67pE4p zGkj-cP@Q~`S9Wp@4+k?l!_UbZ_-wh^7#JB?89?N|$v^lMUH3CEFz_)jGcYj7Gq5r! zFz_=dG8|xFU=U+qVqjnpU^vKdhyery7&IBQ7#JBC84fepGcYpjV_;y~$H2<K#lXP0 zYI7Wa5~JU4hTcf6?F{|f7@8zmw=tATa_(gCWnu`IWZlFtX&b`~NmdbtIolZK>4M}~ zA#%D9DP0kUh1(eB>F91_SiF&efq{u(|70G)>iS%UP{t~TaK<Kv2*xgkD8^|F(TsB$ zVi=b)a9NC3Mu4dMo<OHCO|8ICX<Wng5;XS8NG#&Dd0iJ^&6gW&|jNd{(y>5Re* zrx;E%urM5Ec+PN!;Uohq!#RdK3}+e6F|aZGV_3s*p5Yt=JEJl~JHrKrbM*`yjKK`y z3>O*BF>o?4GF*aroxzlWiGh)Ufq`9UIm-@)l~6Y`Ffed|!!4bGjUfZ<Iv$8JsOy+O zF$W1f26qNVuv+dN4C}SFFsN^1*n}_!5+(Kd49pA#3|tI_V6z}`!VNWxfq|RhD#JCf zDc2dUKuvW3^BEX8AVzLQ7zuG%2?IMrDUxX%aML)Trg1RbfO)f!K@seH1_n+cjvWj; zHZ!n;%wuE#r5aEgVqg$wU}3lkj<H(|w;321SQr=?dKvC8Ffhn4Ff-g`U}SjA@RWg> m;SIw(hL2FzCx(v<Ul|w}gcz6@dO?Ycfq~&0!w-gE43Yq|0q#5i -- GitLab