From e2ac73d6b8fe8482bd912422fe43a4637bb2b224 Mon Sep 17 00:00:00 2001
From: ACIKBAS TUNA BATIKAN <tuna.acikbas@etu.unistra.fr>
Date: Thu, 27 Apr 2023 03:00:02 +0200
Subject: [PATCH] Finished piece mouvement and Rook

---
 .../inspectionProfiles/Project_Default.xml    |  10 ++
 .../src/main/java/model/Bishop.java           |  75 ++++++++++-
 .../MavenChess/src/main/java/model/Board.java |   4 +-
 .../MavenChess/src/main/java/model/King.java  |  48 ++++++-
 .../src/main/java/model/Knight.java           |  52 +++++++-
 .../MavenChess/src/main/java/model/Pawn.java  |  16 +++
 .../MavenChess/src/main/java/model/Queen.java | 124 +++++++++++++++++-
 .../MavenChess/src/main/java/model/Rook.java  |  89 ++++++++++++-
 .../target/classes/model/Rook.class           | Bin 1599 -> 1769 bytes
 9 files changed, 388 insertions(+), 30 deletions(-)
 create mode 100644 MavenChess/.idea/inspectionProfiles/Project_Default.xml

diff --git a/MavenChess/.idea/inspectionProfiles/Project_Default.xml b/MavenChess/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..82ed0ad
--- /dev/null
+++ b/MavenChess/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,10 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+      <Languages>
+        <language minSize="74" name="Java" />
+      </Languages>
+    </inspection_tool>
+  </profile>
+</component>
\ No newline at end of file
diff --git a/MavenChess/MavenChess/src/main/java/model/Bishop.java b/MavenChess/MavenChess/src/main/java/model/Bishop.java
index fa0c14d..2f52dea 100644
--- a/MavenChess/MavenChess/src/main/java/model/Bishop.java
+++ b/MavenChess/MavenChess/src/main/java/model/Bishop.java
@@ -2,7 +2,8 @@ package model;
 
 import java.util.ArrayList;
 
-public class Bishop extends Pawn{
+public class Bishop extends Piece {
+
     public Bishop(Position p, int color) {
         super(p, color);
     }
@@ -14,13 +15,75 @@ public class Bishop extends Pawn{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
-        }
-        else {
-            // King black move
+        Position Cursor = new Position(p.getX(), p.getY());
+
+        int i = 1;
+        boolean leftTop = false;
+        boolean rightTop = false;
+        boolean leftDown = false;
+        boolean rightDown = false;
+
+        while (i < 8) {
+
+            //left diagonal
+
+            arrival = new Position(p.getX() + i, p.getY() + i);
+
+            if (!leftTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+
+            if (!b.isFree(arrival)) {
+                leftTop = true;
+            }
+
+
+
+
+
+            //right diagonal
+            arrival = new Position(p.getX() - i, p.getY() + i);
+            if (!rightTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightTop = true;
+            }
+
+
+
+            arrival = new Position(p.getX() + i, p.getY() - i);
+            if (!leftDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                leftDown = true;
+            }
+
+
+
+            arrival = new Position(p.getX() - i, p.getY() - i);
+            if (!rightDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightDown = true;
+            }
+
+
+            i++;
         }
+
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Board.java b/MavenChess/MavenChess/src/main/java/model/Board.java
index c935d12..d458d60 100644
--- a/MavenChess/MavenChess/src/main/java/model/Board.java
+++ b/MavenChess/MavenChess/src/main/java/model/Board.java
@@ -73,7 +73,7 @@ public class Board {
 	}
 
 	public boolean isFree(Position p) {
-		return (pieces[p.getID()] == null);
+		return (Position.isCorrect(p) && pieces[p.getID()] == null);
 	}
 	public boolean isBlack(Position p) {
 		return (!isFree(p) && pieces[p.getID()].getColor() == Piece.BLACK);
@@ -84,7 +84,7 @@ public class Board {
 	}
 
 	public boolean isEnnemy(Position p, Position origin) {
-		return (!isFree(p) && pieces[p.getID()].getColor() != pieces[origin.getID()].getColor());
+		return (Position.isCorrect(p) &&  !isFree(p) && pieces[p.getID()].getColor() != pieces[origin.getID()].getColor() );
 	}
 	public boolean isKing(Position p) {
 		return (!isFree(p) && pieces[p.getID()].getClass() == King.class);
diff --git a/MavenChess/MavenChess/src/main/java/model/King.java b/MavenChess/MavenChess/src/main/java/model/King.java
index af0389c..e1ec772 100644
--- a/MavenChess/MavenChess/src/main/java/model/King.java
+++ b/MavenChess/MavenChess/src/main/java/model/King.java
@@ -4,8 +4,13 @@ import java.util.ArrayList;
 
 
 public class King extends Piece {
+
+	private boolean Casteling = true;
+	private final Position original;
+
 	public King(Position p, int color) {
 		super(p, color);
+		this.original = p;
 	}
 
 
@@ -15,13 +20,44 @@ public class King extends Piece {
 		ArrayList<Position> moves = new ArrayList<Position>();
 
 		Position arrival;
-		if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-			// King white move
-		}
-		else {
-			// King black move
-		}
+		// up
+		arrival = new Position(p.getX(), p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//down
+		arrival = new Position(p.getX(), p.getY() - 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//left
+		arrival = new Position(p.getX()+1, p.getY());
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//right
+		arrival = new Position(p.getX()-1, p.getY());
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//up left
+		arrival = new Position(p.getX()-1, p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//up right
+		arrival = new Position(p.getX()+1, p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//down left
+		arrival = new Position(p.getX()-1, p.getY() -1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		//down right
+		arrival = new Position(p.getX()+1, p.getY() - 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+		arrival = new Position(p.getX(), p.getY() + 1);
+		if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); }
+
+
+
 		return moves;
 	}
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Knight.java b/MavenChess/MavenChess/src/main/java/model/Knight.java
index 601368d..7a731d0 100644
--- a/MavenChess/MavenChess/src/main/java/model/Knight.java
+++ b/MavenChess/MavenChess/src/main/java/model/Knight.java
@@ -2,7 +2,9 @@ package model;
 
 import java.util.ArrayList;
 
-public class Knight extends Pawn{
+public class Knight extends Piece {
+
+
     public Knight(Position p, int color) {
         super(p, color);
     }
@@ -14,13 +16,53 @@ public class Knight extends Pawn{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
+
+        arrival = new Position(p.getX() - 1, p.getY() + 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        // up right
+        arrival = new Position(p.getX() + 1, p.getY() + 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        // down left
+        arrival = new Position(p.getX() - 1, p.getY() - 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        //down right
+        arrival = new Position(p.getX() + 1, p.getY() - 2);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        arrival = new Position(p.getX() - 2, p.getY() + 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+
+        // up right
+        arrival = new Position(p.getX() + 2, p.getY() + 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
+        }
+        // down left
+        arrival = new Position(p.getX() - 2, p.getY() - 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
         }
-        else {
-            // King black move
+
+        //down right
+        arrival = new Position(p.getX() + 2, p.getY() - 1);
+        if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+            moves.add(arrival);
         }
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Pawn.java b/MavenChess/MavenChess/src/main/java/model/Pawn.java
index 0467039..0861484 100644
--- a/MavenChess/MavenChess/src/main/java/model/Pawn.java
+++ b/MavenChess/MavenChess/src/main/java/model/Pawn.java
@@ -3,10 +3,13 @@ package model;
 import java.util.ArrayList;
 
 public class Pawn extends Piece {
+	private final Position original;
 	public Pawn(Position p, int color) {
 		super(p, color);
+		this.original = p;
 	}
 
+
 	public ArrayList<Position> getAvailableMoves(Board b) {
 
 		// creates a dynamic list of available moves
@@ -15,6 +18,13 @@ public class Pawn extends Piece {
 		Position arrival;
 		if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
+			if(this.p.getID() == this.original.getID()){
+			//	up, free movement first time
+						arrival = new Position(p.getX(), p.getY() + 2);
+				if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
+
+			}
+
 			// up, free movement
 			arrival = new Position(p.getX(), p.getY() + 1);
 			if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
@@ -30,6 +40,12 @@ public class Pawn extends Piece {
 		}
 		else {
 
+			if(this.p.getID() == this.original.getID()){
+				//	up, free movement first time
+				arrival = new Position(p.getX(), p.getY() - 2);
+				if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
+			}
+
 			// down, free movement
 			arrival = new Position(p.getX(), p.getY() - 1);
 			if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); }
diff --git a/MavenChess/MavenChess/src/main/java/model/Queen.java b/MavenChess/MavenChess/src/main/java/model/Queen.java
index 541e831..0d740f1 100644
--- a/MavenChess/MavenChess/src/main/java/model/Queen.java
+++ b/MavenChess/MavenChess/src/main/java/model/Queen.java
@@ -14,13 +14,127 @@ public class Queen extends Piece{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
-        }
-        else {
-            // King black move
+
+        int i = 1;
+        boolean left = false;
+        boolean right = false;
+        boolean top = false;
+        boolean down = false;
+        boolean leftTop = false;
+        boolean rightTop = false;
+        boolean leftDown = false;
+        boolean rightDown = false;
+
+        while (i < 8) {
+            // Bishop moves
+            arrival = new Position(p.getX() + i, p.getY() + i);
+
+            if (!leftTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+
+            if (!b.isFree(arrival)) {
+                leftTop = true;
+            }
+
+
+
+
+
+            //right diagonal
+            arrival = new Position(p.getX() - i, p.getY() + i);
+            if (!rightTop) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightTop = true;
+            }
+
+
+
+            arrival = new Position(p.getX() + i, p.getY() - i);
+            if (!leftDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                leftDown = true;
+            }
+
+
+
+            arrival = new Position(p.getX() - i, p.getY() - i);
+            if (!rightDown) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                rightDown = true;
+            }
+
+
+            // RooK moves
+
+            arrival = new Position(p.getX() +i, p.getY());
+
+            if (!left) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+
+            if (!b.isFree(arrival)) {
+                left = true;
+            }
+
+
+
+            //right diagonal
+            arrival = new Position(p.getX()- i , p.getY() );
+            if (!right) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                right = true;
+            }
+
+
+
+            arrival = new Position(p.getX(), p.getY() + i);
+            if (!top) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                top = true;
+            }
+
+
+
+            arrival = new Position(p.getX(), p.getY() - i);
+            if (!down) {
+                if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                    moves.add(arrival);
+                }
+            }
+            if (!b.isFree(arrival)) {
+                down = true;
+            }
+
+
+            i++;
         }
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Rook.java b/MavenChess/MavenChess/src/main/java/model/Rook.java
index cbb3c82..859120d 100644
--- a/MavenChess/MavenChess/src/main/java/model/Rook.java
+++ b/MavenChess/MavenChess/src/main/java/model/Rook.java
@@ -2,9 +2,14 @@ package model;
 
 import java.util.ArrayList;
 
-public class Rook extends Pawn{
+public class Rook extends Piece {
+
+
+    private final Position original;
+
     public Rook(Position p, int color) {
         super(p, color);
+        this.original = p;
     }
 
 
@@ -14,13 +19,85 @@ public class Rook extends Pawn{
         ArrayList<Position> moves = new ArrayList<Position>();
 
         Position arrival;
-        if(color == Piece.WHITE) { // black and white have an opposite direction behavior
 
-            // King white move
-        }
-        else {
-            // King black move
+        int i = 1;
+        boolean left = false;
+        boolean right = false;
+        boolean top = false;
+        boolean down = false;
+
+
+        while (i < 8) {
+
+            //left
+
+            arrival = new Position(p.getX() + i, p.getY());
+            if (Position.isCorrect(arrival)) {
+                if (!left) {
+                    if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                        moves.add(arrival);
+                    }
+
+                    if (b.isKing(arrival)) {
+                        moves.add(arrival);
+
+                    }
+                }
+                if (!b.isFree(arrival)) {
+                    left = true;
+                }
+            }
+
+            //right
+            arrival = new Position(p.getX() - i, p.getY());
+            if (Position.isCorrect(arrival)) {
+                if (!right) {
+                    if (b.isEnnemy(arrival, p) || b.isFree(arrival)) {
+                        moves.add(arrival);
+                    }
+                    if (b.isKing(arrival)) {
+                        moves.add(arrival);
+                    }
+                }
+
+                if (!b.isFree(arrival)) {
+
+                    right = true;
+                }
+            }
+
+
+            arrival = new Position(p.getX(), p.getY() + i);
+            if (Position.isCorrect(arrival)) {
+                if (!top) {
+                    if (b.isEnnemy(arrival, p)|| b.isFree(arrival)) {
+                        moves.add(arrival);
+                    }
+                }
+
+                if (!b.isFree(arrival)) {
+
+                    top = true;
+                }
+            }
+
+
+            arrival = new Position(p.getX(), p.getY() - i);
+            if(Position.isCorrect(arrival)||b.isFree(arrival)) {
+                if (!down) {
+                    if (b.isEnnemy(arrival, p)) {
+                        moves.add(arrival);
+                    }
+                }
+                if (!b.isFree(arrival)) {
+
+                    down = true;
+                }
+            }
+
+            i++;
         }
+
         return moves;
     }
 }
diff --git a/MavenChess/MavenChess/target/classes/model/Rook.class b/MavenChess/MavenChess/target/classes/model/Rook.class
index 3fad285a58fc5c38e16638a253835fa8b8c78c1f..ee62dd3c32855be4fe2f5261aed520c175275f3d 100644
GIT binary patch
literal 1769
zcmbVNTT@$A6#f=D$w|Tq<rbh<+XCehAl6G-4boB!nl?}@3Z;XWljH~+LJo5haCrCK
zH)o1(KG;VuV@szUeeq3a{2RXMgYU&}=Y%2`9miyH&f06Q^{vad_Ri1Gp8N=43^P$Q
zAYj6<5JX7OxaJm}QgTK)1xFAXRb^Ej6SVi|>KkrFRh3&#X9wmY2qR)5YM~L9AnIG(
zaotrx*!9$sD%&MN^I=yLO@g)+d(%#CR8=WC?s@iBPF1Q=#L%o0X%Pha2j)z)37QTD
z)<NSII&?%?kD?V_7Ea=nz*usscWaJWtv+Mn?4Ei-D_+pZ=LNz3ER)xoix#@kBZ#QV
zgzI@up~}3DR61}kic9D-(Qjb@gU@?(!?nF4D^-<Dx$LZM3A&H?9xmO-8nQ5~<Azja
z(sLYLcGAL&xXkSBA~ECrxmtTlc6ljzJHNur(!T4<7G9~l-cscyRy{$&1SfK;>`ZU0
z<sI)`J71!vHRl%W(wyxny{;>b>awZ`ta@IWt28@Oa7(Voer5$N?Be*QtxDQ!%H4Em
z-m_O%t>pB8pWH$22xHowr#3a^k{874F?=5eS@Xf-|KKf(#gv?n$${LXIp=4Ya-iz2
zbED{fQWkU^tZ8d~udcr1Kt~UEe~d}SW~+8#b;@3^cO){amdbW@!(+=*|Dn!fL8G(o
zhF5SVm2P}QcXdSbhYK9m2A(srq0b1V2Fg5We7?%n9R&CVtii;Y9mrtfA<S=URw+K4
zYI}{e)+a26E7YC$?Qs>aaYavk5{Ray*O9K_kKzr!iQn)CV?`K#<tbtdJ2)|Aq>Ml+
z7)XTzDKn4?$BpLjmooJftqX(Sqx}&&<Hkq6bb1HpriUNn!hNLU!EGcG!~RC^HX0Md
zkC3>J$PnKn^Lq8tfmLD~AtMz$fLlBUH}t=7Lx01qgEH;?e23%aHqQQgzJ7-0aY)5I
zr2RsB<Kb<@pCcYqYxq+`9z6SQ=o>O&K(qH1FAJcJ6VOTay2$29wBQulahjTQ{9YuZ
z-MoW)Fo9mo^OAX=J`M)4iV;+h#3m2>XJqnoB7Q;ZugUvE^85pt{t4Ic3&!y)Ch;5I
z!tZz+e<CX;Zb}T(632{m;XS#GIk}E`$>6TMg9Vw#qI`%CB#*o-Gn$^NMNY{TT8?pw
zIFGWjH(!*l;X3ClO#5-%;9ND*dxG%|-r|dR6Pen5y}&FooYZ!iV=ft(=#*Jzlwti@
zM$j|rW85UhEox@byvs)L4<u~jlF9iN{Q-6va$jqrwXP4wqE~CbXkSNkS5Nj4SL6uX
MfGGx>u1UB50>b8Opa1{>

literal 1599
zcma)6O>Yxd6g}6T@z~D9`5@+_goHq7>^Q-YwuaVj+7Ob;$Vq`zDM6^}#GZzMi6<IQ
zQl*=2s{Vnh3$klfsoPenh*Z=ry5tA2>ar3N|9}nYd1D*M2U2Y7`Mo>$o_p^(ci!U{
zfBp?%5}zayLDYa|LPt!HT=i<Uo4;;-T^GbkPTdJ61$~)H%kDLt!13zEa(2-`TyW%`
zwPEGg1INuz`M$MTaT-Aq29gS|LlDg<$4)_NH$Vbi=r+(}q8CSAroHKT_XV;h=-!(!
z2@`1(M{!J`t=Pe>5WB3*CrrH6HZLhdze;{epl8agGl@Z*HZWx349*HVnuT2PEWaj*
zJB^uo-Co@koZZ*t-WsyE71lWuZ)1e)IE`7~w#mW1K;>v4Yhn~R)@jw4DV?c=T)9?#
zCI9L2J-Zqdv$xsIG#M9kRh+s#zrMO``=43ME-k$kuWGrAmhY%@%cuo+orb_{m8J+Q
zveByNdOn#e3wlV-)Q07_Dr(N#u<1VBt}yJnm~B?FTQ$NMmhU?omP?>zL1!yRGlof4
zn_%fTM2o{_T>Gnl;p|KIot3-XM+1*~YBf(y)Y08NZLYQZ8aW8Gv{!&h7TLKFSk?P;
z)>?~^#DcR@w}N$_lobxq=YgQf1#jK2+Ov)#KA~7Wuf)O-$27th1zgz@VqC{~DkI7-
zV2tMaw;{iW4&z+a>qIjh<2cXV>82a<xWJQo!g(i%+Fis%2>TA+<v(E~KQcuEkcmey
zmbQ_Y(+XO&phpX_Xu*gU;%Tir{<EYX!CV^s1F47TOKV>?cgMGJaz3qZ;Z$zCX&Kl;
zM{fKfh94j?#{bOc;b{vot)TCMsJ#vmJ0wKxHHcO`iwUbR4hdl#1W^ki;)jHYf2YZ>
zFP@G4Mn*L#1-_?fK#KhLqJvzg(1#wRx$^G7aSWgzm$;VrDqp8Qix|ciI0p+kd_xt!
zCCU%f?g91ri3<Hf@4s*v|KNQ*!3X#kAL2jWoKG=L8Lx_t899Mj8AMq|a7{)rFBfnl
zRR0duyoBd?k9BZdWTHI>+!gqQ_YeIq6FI`ma)js;>>?$@D6&2sJu<{>B~DYH3@~Sj
zQ*%sC;v??j_?Uf~FEOTwafOx}NbRuEgn=#tg9al+eSjS%dSx|Ww(NTHV*9tF=5Jph
PrU@ItRi>H=ceDQk%FIP5

-- 
GitLab