From 3a37456337e49b210c9b09cd096cc8f0a4e2f97f Mon Sep 17 00:00:00 2001
From: Thastertyn <60262101+Thastertyn@users.noreply.github.com>
Date: Tue, 28 Feb 2023 21:08:53 +0100
Subject: [PATCH] Tabs, rozvrh + znamky tabs
---
.vscode/launch.json | 21 +++
src/main/java/xyz/thastertyn/App.java | 43 -----
src/main/java/xyz/thastertyn/Connection.java | 15 --
src/main/java/xyz/thastertyn/Download.java | 5 -
.../java/xyz/thastertyn/Jecna/Dochazka.java | 7 +-
.../java/xyz/thastertyn/Jecna/Jidelna.java | 5 +
src/main/java/xyz/thastertyn/Jecna/Login.java | 74 ++++++--
.../java/xyz/thastertyn/Jecna/Znamky.java | 70 +++++---
src/main/java/xyz/thastertyn/Predmet.java | 8 -
.../java/xyz/thastertyn/RozvrhDownload.java | 5 -
.../Window/Content/JecnaContent.java | 29 ++++
.../thastertyn/Window/Content/Jidelna.java | 5 +
.../xyz/thastertyn/Window/Content/Rozvrh.java | 70 ++++++++
.../xyz/thastertyn/Window/Content/Znamky.java | 127 ++++++++++++++
.../java/xyz/thastertyn/Window/Login.java | 162 ++++++++++++++++--
.../xyz/thastertyn/Window/LoginDialog.java | 112 ------------
.../xyz/thastertyn/Window/MainWindow.java | 62 +++----
.../java/xyz/thastertyn/Window/Rozvrh.java | 62 -------
.../Window/WindowSwitchListener.java | 123 +++++++++++++
target/classes/xyz/thastertyn/App.class | Bin 678 -> 678 bytes
.../classes/xyz/thastertyn/Connection.class | Bin 808 -> 0 bytes
target/classes/xyz/thastertyn/Download.class | Bin 279 -> 0 bytes
.../xyz/thastertyn/Jecna/Dochazka.class | Bin 1255 -> 1287 bytes
.../xyz/thastertyn/Jecna/Jidelna.class | Bin 0 -> 288 bytes
.../classes/xyz/thastertyn/Jecna/Login.class | Bin 3378 -> 4699 bytes
.../classes/xyz/thastertyn/Jecna/Znamky.class | Bin 5108 -> 5947 bytes
target/classes/xyz/thastertyn/Predmet.class | Bin 276 -> 0 bytes
.../xyz/thastertyn/RozvrhDownload.class | Bin 297 -> 0 bytes
.../Window/Content/JecnaContent.class | Bin 0 -> 734 bytes
.../thastertyn/Window/Content/Jidelna.class | Bin 0 -> 306 bytes
.../thastertyn/Window/Content/Rozvrh.class | Bin 0 -> 2652 bytes
.../thastertyn/Window/Content/Znamky.class | Bin 0 -> 4964 bytes
.../classes/xyz/thastertyn/Window/Login.class | Bin 1367 -> 6428 bytes
.../xyz/thastertyn/Window/LoginDialog.class | Bin 5126 -> 0 bytes
.../xyz/thastertyn/Window/MainWindow.class | Bin 3753 -> 4008 bytes
.../xyz/thastertyn/Window/Rozvrh.class | Bin 2346 -> 0 bytes
.../Window/WindowSwitchListener.class | Bin 0 -> 5762 bytes
37 files changed, 660 insertions(+), 345 deletions(-)
create mode 100644 .vscode/launch.json
delete mode 100644 src/main/java/xyz/thastertyn/Connection.java
delete mode 100644 src/main/java/xyz/thastertyn/Download.java
create mode 100644 src/main/java/xyz/thastertyn/Jecna/Jidelna.java
delete mode 100644 src/main/java/xyz/thastertyn/Predmet.java
delete mode 100644 src/main/java/xyz/thastertyn/RozvrhDownload.java
create mode 100644 src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java
create mode 100644 src/main/java/xyz/thastertyn/Window/Content/Jidelna.java
create mode 100644 src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java
create mode 100644 src/main/java/xyz/thastertyn/Window/Content/Znamky.java
delete mode 100644 src/main/java/xyz/thastertyn/Window/LoginDialog.java
delete mode 100644 src/main/java/xyz/thastertyn/Window/Rozvrh.java
create mode 100644 src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java
delete mode 100644 target/classes/xyz/thastertyn/Connection.class
delete mode 100644 target/classes/xyz/thastertyn/Download.class
create mode 100644 target/classes/xyz/thastertyn/Jecna/Jidelna.class
delete mode 100644 target/classes/xyz/thastertyn/Predmet.class
delete mode 100644 target/classes/xyz/thastertyn/RozvrhDownload.class
create mode 100644 target/classes/xyz/thastertyn/Window/Content/JecnaContent.class
create mode 100644 target/classes/xyz/thastertyn/Window/Content/Jidelna.class
create mode 100644 target/classes/xyz/thastertyn/Window/Content/Rozvrh.class
create mode 100644 target/classes/xyz/thastertyn/Window/Content/Znamky.class
delete mode 100644 target/classes/xyz/thastertyn/Window/LoginDialog.class
delete mode 100644 target/classes/xyz/thastertyn/Window/Rozvrh.class
create mode 100644 target/classes/xyz/thastertyn/Window/WindowSwitchListener.class
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..79763db
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,21 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "java",
+ "name": "Launch Current File",
+ "request": "launch",
+ "mainClass": "${file}"
+ },
+ {
+ "type": "java",
+ "name": "Launch App",
+ "request": "launch",
+ "mainClass": "xyz.thastertyn.App",
+ "projectName": "jecnak-tui"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/main/java/xyz/thastertyn/App.java b/src/main/java/xyz/thastertyn/App.java
index dcdb9b4..29eec7c 100644
--- a/src/main/java/xyz/thastertyn/App.java
+++ b/src/main/java/xyz/thastertyn/App.java
@@ -1,6 +1,5 @@
package xyz.thastertyn;
-import xyz.thastertyn.Jecna.*;
import xyz.thastertyn.Window.MainWindow;
/**
@@ -20,49 +19,7 @@ public class App {
- //#region Jidelna
- //#region JSESSIONID
- Connection.Response jidelna = Jsoup.connect("https://objednavky.jidelnasokolska.cz/")
- .header("Connection", "keep-alive")
- .method(Method.HEAD)
- .execute();
-
- String jidelnaJSESSIONID = jidelna.cookie("JSESSIONID");
- String XSRF_TOKEN = jidelna.cookie("XSRF-TOKEN");
- //#endregion
-
- //#region CSRF
- String csrf = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/login.jsp")
- .header("Connection", "keep-alive")
- .cookie("XSRF-TOKEN", XSRF_TOKEN)
- .cookie("JSESSIONID", jidelnaJSESSIONID)
- .get()
- .select("input[name=_csrf]")
- .attr("value");
-
-
- if(!XSRF_TOKEN.equals(csrf))
- {
- throw new SecurityException("CSRF tokens do not match, something is up");
- }
- //#endregion
-
- //#region Login
- Connection.Response jidelnaLogin = Jsoup.connect("https://objednavky.jidelnasokolska.cz/j_spring_security_check")
- .header("Connection", "keep-alive")
- .header("Content-Type", "application/x-www-form-urlencoded")
- .cookie("XSRF-TOKEN", XSRF_TOKEN)
- .cookie("JSESSIONID", jidelnaJSESSIONID)
- .data("j_username", Credentials.user)
- .data("j_password", Credentials.pass)
- .data("terminal", "false")
- .data("type", "web")
- .data("_csrf", XSRF_TOKEN)
- .data("targetUrl", "/faces/secured/main.jsp?terminal=false&status=true&printer=false&keyboard=false")
- .method(Method.POST)
- .execute();
- //#endregion
Document obedy = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/secured/month.jsp?terminal=false&keyboard=&printer=")
.header("Connection", "keep-alive")
diff --git a/src/main/java/xyz/thastertyn/Connection.java b/src/main/java/xyz/thastertyn/Connection.java
deleted file mode 100644
index 1d5dbbf..0000000
--- a/src/main/java/xyz/thastertyn/Connection.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package xyz.thastertyn;
-
-import org.jsoup.Jsoup;
-
-public class Connection {
-
- private static final org.jsoup.Connection CONNECTION = Jsoup.connect("")
- .header("Connection", "keep-alive")
- .cookie("role", "student");
-
- public static org.jsoup.Connection getConnection()
- {
- return CONNECTION;
- }
-}
diff --git a/src/main/java/xyz/thastertyn/Download.java b/src/main/java/xyz/thastertyn/Download.java
deleted file mode 100644
index be16dd4..0000000
--- a/src/main/java/xyz/thastertyn/Download.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package xyz.thastertyn;
-
-public class Download {
-
-}
diff --git a/src/main/java/xyz/thastertyn/Jecna/Dochazka.java b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java
index 900d7e7..ab34da4 100644
--- a/src/main/java/xyz/thastertyn/Jecna/Dochazka.java
+++ b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java
@@ -3,9 +3,9 @@ package xyz.thastertyn.Jecna;
import java.io.IOException;
import java.util.HashMap;
+import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
-import xyz.thastertyn.Connection;
import xyz.thastertyn.Tuple.Pair;
public class Dochazka {
@@ -18,9 +18,10 @@ public class Dochazka {
try {
// absence-list
- absenceDoc = Connection.getConnection()
+ absenceDoc = Jsoup.connect("https://www.spsejecna.cz" + "/absence/passing-student")
.cookie("JSESSIOND", JSESSIOND)
- .url("https://www.spsejecna.cz" + "/absence/passing-student")
+ .cookie("role", "student")
+ .header("Connection", "keep-alive")
.get();
} catch (IOException e) {
e.printStackTrace();
diff --git a/src/main/java/xyz/thastertyn/Jecna/Jidelna.java b/src/main/java/xyz/thastertyn/Jecna/Jidelna.java
new file mode 100644
index 0000000..48b4871
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Jecna/Jidelna.java
@@ -0,0 +1,5 @@
+package xyz.thastertyn.Jecna;
+
+public class Jidelna {
+
+}
diff --git a/src/main/java/xyz/thastertyn/Jecna/Login.java b/src/main/java/xyz/thastertyn/Jecna/Login.java
index 8cc25be..385301e 100644
--- a/src/main/java/xyz/thastertyn/Jecna/Login.java
+++ b/src/main/java/xyz/thastertyn/Jecna/Login.java
@@ -4,9 +4,12 @@ import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;
+import javax.security.auth.login.CredentialException;
+
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.Connection.Method;
+import org.jsoup.nodes.Document;
public class Login {
@@ -23,7 +26,7 @@ public class Login {
*
{@code false} neexistuje, nebo jsou prazdne
*
*/
- public boolean getCredentials()
+ public boolean checkForCredentials()
{
File credentials = null;
@@ -67,9 +70,8 @@ public class Login {
return Jsessionid;
}
- public byte login(String user, String pass)
+ public void loginJecna(String user, String pass) throws UnknownHostException, IOException, CredentialException
{
- try {
//#region JSESSIONID
Connection.Response response = Jsoup.connect("https://www.spsejecna.cz")
.header("Connection", "keep-alive")
@@ -89,7 +91,7 @@ public class Login {
//#endregion
//#region Login
- Connection.Response login = Jsoup.connect("https://www.spsejecna.cz/user/login")
+ Jsoup.connect("https://www.spsejecna.cz/user/login")
.method(Connection.Method.POST)
.header("Content-Type", "application/x-www-form-urlencoded")
//.header("Content-Length", "71") Adds 10 seconds to total request time
@@ -105,17 +107,63 @@ public class Login {
.execute();
//#endregion
+ Document test = Jsoup.connect("https://www.spsejecna.cz/score/student")
+ .header("Connection", "keep-alive")
+ .cookie("JSESSIONID", Jsessionid)
+ .cookie("role", "student")
+ .get();
+
+ if(test.toString().contains("Pro pokračování se přihlaste do systému"))
+ {
+ throw new CredentialException("Incorrect username or password");
+ }
+
start = System.currentTimeMillis() / 1000L;
lastCheck = start;
+ }
- return 0;
- } catch(UnknownHostException e)
- {
- // Not connected to internet
- return 127;
- } catch(IOException e)
- {
- return 126;
- }
+ public void loginJidelna() throws UnknownHostException, IOException
+ {
+ //#region JSESSIONID
+ Connection.Response jidelna = Jsoup.connect("https://objednavky.jidelnasokolska.cz/")
+ .header("Connection", "keep-alive")
+ .method(Method.HEAD)
+ .execute();
+
+ String jidelnaJSESSIONID = jidelna.cookie("JSESSIONID");
+ String XSRF_TOKEN = jidelna.cookie("XSRF-TOKEN");
+ //#endregion
+
+ //#region CSRF
+ String csrf = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/login.jsp")
+ .header("Connection", "keep-alive")
+ .cookie("XSRF-TOKEN", XSRF_TOKEN)
+ .cookie("JSESSIONID", jidelnaJSESSIONID)
+ .get()
+ .select("input[name=_csrf]")
+ .attr("value");
+
+
+ if(!XSRF_TOKEN.equals(csrf))
+ {
+ throw new SecurityException("CSRF tokens do not match, something is up");
+ }
+ //#endregion
+
+ //#region Login
+ Connection.Response jidelnaLogin = Jsoup.connect("https://objednavky.jidelnasokolska.cz/j_spring_security_check")
+ .header("Connection", "keep-alive")
+ .header("Content-Type", "application/x-www-form-urlencoded")
+ .cookie("XSRF-TOKEN", XSRF_TOKEN)
+ .cookie("JSESSIONID", jidelnaJSESSIONID)
+ .data("j_username", Credentials.user)
+ .data("j_password", Credentials.pass)
+ .data("terminal", "false")
+ .data("type", "web")
+ .data("_csrf", XSRF_TOKEN)
+ .data("targetUrl", "/faces/secured/main.jsp?terminal=false&status=true&printer=false&keyboard=false")
+ .method(Method.POST)
+ .execute();
+ //#endregion
}
}
diff --git a/src/main/java/xyz/thastertyn/Jecna/Znamky.java b/src/main/java/xyz/thastertyn/Jecna/Znamky.java
index 82fa990..6996cf1 100644
--- a/src/main/java/xyz/thastertyn/Jecna/Znamky.java
+++ b/src/main/java/xyz/thastertyn/Jecna/Znamky.java
@@ -1,9 +1,10 @@
package xyz.thastertyn.Jecna;
import java.io.IOException;
+import java.net.UnknownHostException;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
@@ -15,17 +16,20 @@ public class Znamky {
private boolean wasDownloaded;
- // key (String) reprezentuje predmet, value (arraylist) znamky a pair znamku s jeji vahou
- private HashMap>> grades = new HashMap<>();
+ private ArrayList>,Double>>> grades = new ArrayList<>();
- public void addGrade(String subject, int grade, double weight)
+ public void addGrade(int index, String subject, int grade, double weight)
{
- grades.get(subject).add(new Pair(grade, weight));
+ Pair znamka = new Pair<>(grade, weight);
+
+ grades.get(index).getValue1().getValue0().add(znamka);
}
public void addSubject(String subject)
{
- grades.put(subject, new ArrayList>());
+ Pair>, Double> p = new Pair<>(new ArrayList>(), 0.0);
+
+ grades.add(new Pair<>(subject, p));
}
private double getAverage(ArrayList> a)
@@ -39,7 +43,8 @@ public class Znamky {
divisor += p.getValue1();
}
- return (double) divident / divisor;
+ double prumer = (double) divident / divisor;
+ return (double) Math.round(prumer * 100) / 100;
}catch(ArithmeticException e)
{
@@ -47,17 +52,10 @@ public class Znamky {
}
}
- public byte downloadZnamky(final String Jsessionid)
+ public void downloadZnamky(final String Jsessionid) throws UnknownHostException, IOException
{
wasDownloaded = true;
- Document znamkyDoc = null;
-
- try {
- znamkyDoc = Downloader.download("https://www.spsejecna.cz" + "/score/student", Jsessionid).get();
- } catch (IOException e) {
- e.printStackTrace();
- return 127;
- }
+ Document znamkyDoc = Downloader.download("https://www.spsejecna.cz" + "/score/student", Jsessionid).get();
Elements rows = znamkyDoc.select("table.score").select("tr");
@@ -68,25 +66,43 @@ public class Znamky {
rows_split[i] = rows.get(i).children();
}
+ int subj = 0;
+
for(int i = 1; i < rows_split.length; i++)
{
- String predmet = rows_split[i].get(0).text();
+ String predmetFull = rows_split[i].get(0).text();
+
+ Matcher matcher = Pattern.compile("\\((.*)\\)").matcher(predmetFull);
+
+ String predmet = matcher.find() ? matcher.group(1) : predmetFull;
addSubject(predmet);
- for(Element e : rows_split[i].get(1).select("a.score"))
+ for(Element znamkaElement : rows_split[i].get(1).select("a.score"))
{
- int znamka = Integer.parseInt(e.select("span.value").text());
+ if(znamkaElement == null)
+ {
+ break;
+ }
+
+ int znamka = Integer.parseInt(znamkaElement.select("span.value").text());
// Mala znamka se bude pocitat jako polovicni vaha
- if(e.hasClass("scoreSmall"))
+ if(znamkaElement.hasClass("scoreSmall"))
{
- addGrade(predmet, znamka, 0.5);
+ addGrade(subj, predmet, znamka, 0.5);
}else{
- addGrade(predmet, znamka, 1);
+ addGrade(subj, predmet, znamka, 1);
}
}
+
+ grades.get(subj).getValue1().setValue1(getAverage(grades.get(subj).getValue1().getValue0()));
+ subj++;
}
- return 0;
+ }
+
+ public ArrayList>,Double>>> getGrades()
+ {
+ return grades;
}
@Override
@@ -96,11 +112,9 @@ public class Znamky {
{
String s = "";
- for(Map.Entry>> entry : grades.entrySet())
+ for(Pair>,Double>> p : grades)
{
- double prumer = getAverage(entry.getValue());
- double p = (double) Math.round(prumer * 100) / 100;
- s += entry.getKey() + " | " + entry.getValue().toString() + " { " + p + " }\n";
+ s += p.getValue0() + " | " + p.getValue1().getValue0().toString() + " { " + p.getValue1().getValue1() + " } ";
}
return s;
}else{
diff --git a/src/main/java/xyz/thastertyn/Predmet.java b/src/main/java/xyz/thastertyn/Predmet.java
deleted file mode 100644
index 3e8f98a..0000000
--- a/src/main/java/xyz/thastertyn/Predmet.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package xyz.thastertyn;
-
-import java.util.ArrayList;
-
-public class Predmet {
-
-
-}
diff --git a/src/main/java/xyz/thastertyn/RozvrhDownload.java b/src/main/java/xyz/thastertyn/RozvrhDownload.java
deleted file mode 100644
index 0267187..0000000
--- a/src/main/java/xyz/thastertyn/RozvrhDownload.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package xyz.thastertyn;
-
-public class RozvrhDownload {
-
-}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java b/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java
new file mode 100644
index 0000000..2967d90
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java
@@ -0,0 +1,29 @@
+package xyz.thastertyn.Window.Content;
+
+import com.googlecode.lanterna.gui2.Panel;
+
+/**
+ * Wrapper to include all classes that deal with content in some way
+ */
+public class JecnaContent {
+
+ public Panel getPanel()
+ {
+ return null;
+ }
+
+ public void download(String s)
+ {
+
+ }
+
+ public boolean hasStarted()
+ {
+ return false;
+ }
+
+ public String getLabel()
+ {
+ return "";
+ }
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java b/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java
new file mode 100644
index 0000000..62fb593
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java
@@ -0,0 +1,5 @@
+package xyz.thastertyn.Window.Content;
+
+public class Jidelna {
+
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java b/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java
new file mode 100644
index 0000000..b8aeb0f
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java
@@ -0,0 +1,70 @@
+package xyz.thastertyn.Window.Content;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.Panel;
+import com.googlecode.lanterna.gui2.table.Table;
+
+public class Rozvrh extends JecnaContent {
+
+ private Panel rozvrhPanel = new Panel();
+
+ private boolean hasStarted = false;
+
+ private xyz.thastertyn.Jecna.Rozvrh rozvrh = new xyz.thastertyn.Jecna.Rozvrh();
+
+ //private String[] labels = {"Den", "7:30-8:15", "8:25-9:10", "9:20-10:05", "10:20-11:05", "11:15-12:00", "12:10-12:55", "13:05-13:50", "14:00-14:45", "14:55-15:40", "15:50-16:35"};
+ private String[] labels = {"Den", "1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10."};
+
+ String[] days = {"PO", "UT", "ST", "CT", "PA"};
+
+ Table t = new Table<>(labels);
+
+ @Override
+ public void download(String Jsessionid)
+ {
+ try{
+ rozvrh.downloadRozvrh(Jsessionid);
+
+ String[][] r = rozvrh.getRozvrh();
+
+ String[] s = new String[labels.length];
+
+ for(int i = 0; i < r.length; i++)
+ {
+ s[0] = days[i];
+ for(int j = 1; j < r[i].length; j++) { s[j] = r[i][j]; }
+
+ t.getTableModel().addRow(s);
+ }
+ rozvrhPanel.addComponent(t);
+ hasStarted = true;
+ }catch(UnknownHostException e)
+ {
+ rozvrhPanel.addComponent(new Label("A connection error occurred"));
+ }catch(IOException e)
+ {
+ rozvrhPanel.addComponent(new Label("An error occurred"));
+ }
+ }
+
+ @Override
+ public boolean hasStarted()
+ {
+ return hasStarted;
+ }
+
+ @Override
+ public Panel getPanel()
+ {
+ return rozvrhPanel;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return "Rozvrh";
+ }
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/Znamky.java b/src/main/java/xyz/thastertyn/Window/Content/Znamky.java
new file mode 100644
index 0000000..acac87f
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/Znamky.java
@@ -0,0 +1,127 @@
+package xyz.thastertyn.Window.Content;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.googlecode.lanterna.TextColor;
+import com.googlecode.lanterna.graphics.SimpleTheme;
+import com.googlecode.lanterna.gui2.Direction;
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.LinearLayout;
+import com.googlecode.lanterna.gui2.Panel;
+import xyz.thastertyn.Tuple.Pair;
+
+public class Znamky extends JecnaContent {
+
+ private Panel znamkyPanel = new Panel().setLayoutManager(new LinearLayout(Direction.HORIZONTAL));
+
+ private xyz.thastertyn.Jecna.Znamky znamky = new xyz.thastertyn.Jecna.Znamky();
+
+ private boolean hasStarted = false;
+
+ @Override
+ public void download(String JsessionId)
+ {
+ try{
+ znamky.downloadZnamky(JsessionId);
+
+ Panel predmetyPanel = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL));
+ Panel znamkyP = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL));
+ Panel vyslPanel = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL));
+
+ ArrayList>,Double>>> grades = znamky.getGrades();
+
+ for(Pair>,Double>> predmet : grades)
+ {
+ predmetyPanel.addComponent(new Label(predmet.getValue0()));
+
+ Panel znamkyZPredmetu = new Panel().setLayoutManager(new LinearLayout(Direction.HORIZONTAL));
+
+ if(predmet.getValue1().getValue0().isEmpty())
+ {
+ znamkyZPredmetu.addComponent(new Label(""));
+ }
+
+ for(Pair znamka : predmet.getValue1().getValue0())
+ {
+ // TODO pridat predmet.getValue0() ktery premeni znamky na jmeno predmetu jako funkci (not a bug, its a feature)
+ Label znamkaLabel = new Label(znamka.getValue0() + "");
+ switch(znamka.getValue0())
+ {
+ case 1:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.GREEN));
+ break;
+ case 2:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.BLUE));
+ break;
+ case 3:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.YELLOW));
+ break;
+ case 4:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.MAGENTA));
+ break;
+ case 5:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.RED));
+ break;
+ }
+
+ znamkyZPredmetu.addComponent(znamkaLabel);
+ }
+
+ znamkyP.addComponent(znamkyZPredmetu);
+
+ double prumer = predmet.getValue1().getValue1();
+
+ Label vysl = new Label("" + prumer);
+
+ if(prumer >= 1 && prumer < 1.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.GREEN));
+ }else if(prumer >= 1.5 && prumer < 2.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.BLUE));
+
+ }else if(prumer >= 2.5 && prumer < 3.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.YELLOW));
+
+ }else if(prumer >= 3.5 && prumer < 4.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.MAGENTA));
+ }else if(prumer >= 4.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.RED));
+ }
+
+ vyslPanel.addComponent(vysl);
+ }
+
+ znamkyPanel.addComponent(predmetyPanel);
+ znamkyPanel.addComponent(znamkyP);
+ znamkyPanel.addComponent(vyslPanel);
+
+ hasStarted = true;
+ }catch(IOException e)
+ {
+ znamkyPanel.addComponent(new Label("An error has occured"));
+ }
+ }
+
+ @Override
+ public Panel getPanel()
+ {
+ return znamkyPanel;
+ }
+
+ @Override
+ public boolean hasStarted()
+ {
+ return hasStarted;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return "Znamky";
+ }
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Login.java b/src/main/java/xyz/thastertyn/Window/Login.java
index 1253417..ed3dd78 100644
--- a/src/main/java/xyz/thastertyn/Window/Login.java
+++ b/src/main/java/xyz/thastertyn/Window/Login.java
@@ -1,36 +1,164 @@
package xyz.thastertyn.Window;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+
+import javax.security.auth.login.CredentialException;
+
+import com.googlecode.lanterna.TerminalSize;
+import com.googlecode.lanterna.gui2.Button;
+import com.googlecode.lanterna.gui2.EmptySpace;
+import com.googlecode.lanterna.gui2.GridLayout;
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.LocalizedString;
+import com.googlecode.lanterna.gui2.Panel;
+import com.googlecode.lanterna.gui2.TextBox;
+import com.googlecode.lanterna.gui2.Window;
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
+import com.googlecode.lanterna.gui2.GridLayout.Alignment;
+import com.googlecode.lanterna.gui2.dialogs.DialogWindow;
+import com.googlecode.lanterna.gui2.dialogs.MessageDialog;
+import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton;
-public class Login {
-
- String user = "";
- String pass = "";
+public class Login extends DialogWindow {
- xyz.thastertyn.Jecna.Login login = new xyz.thastertyn.Jecna.Login();
+ private TextBox username;
+ private TextBox password;
+ private String user;
+ private String pass;
- LoginDialog dialog = new LoginDialog("Login", "Enter your username and password");
+ private xyz.thastertyn.Jecna.Login login = new xyz.thastertyn.Jecna.Login();
- public void showDialog(WindowBasedTextGUI textGUI)
+ Login()
{
- String[] input = dialog.showDialog(textGUI);
+ super("Login");
+ this.user = null;
+ this.pass = null;
+ this.username = new TextBox();
+ this.password = new TextBox().setMask('*');
- user = input[0];
- pass = input[1];
+ Panel buttonPanel = new Panel();
+ buttonPanel
+ .setLayoutManager(
+ new GridLayout(2).setHorizontalSpacing(1))
+ .addComponent(
+ new Button(LocalizedString.OK.toString(), this::onOK)
+ .setLayoutData(GridLayout.createLayoutData(
+ GridLayout.Alignment.CENTER,
+ GridLayout.Alignment.CENTER,
+ true,
+ false)))
+ .addComponent(
+ new Button(LocalizedString.Cancel.toString(), this::onCancel));
- login();
+ Panel mainPanel = new Panel()
+ .setLayoutManager(new GridLayout(1)
+ .setLeftMarginSize(1)
+ .setRightMarginSize(1));
+
+ mainPanel.addComponent(new Label("Enter your username and password"));
+
+ mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
+
+ Panel userPanel = new Panel()
+ .setLayoutManager(new GridLayout(3))
+ .setLayoutData(
+ GridLayout.createLayoutData(
+ GridLayout.Alignment.FILL,
+ Alignment.CENTER,
+ true,
+ false));
+
+ this.username.setLayoutData(
+ GridLayout.createLayoutData(
+ GridLayout.Alignment.FILL,
+ GridLayout.Alignment.CENTER,
+ true,
+ false));
+
+ userPanel.addComponent(new Label("Username: "))
+ .addComponent(username)
+ .addTo(mainPanel);
+
+ this.password
+ .setLayoutData(
+ GridLayout.createLayoutData(GridLayout.Alignment.FILL,
+ GridLayout.Alignment.CENTER,
+ true,
+ false))
+ .addTo(mainPanel);
+
+ Panel passPanel = new Panel()
+ .setLayoutManager(new GridLayout(3))
+ .setLayoutData(GridLayout.createLayoutData(
+ GridLayout.Alignment.FILL,
+ Alignment.CENTER,
+ true,
+ false));
+
+ passPanel.addComponent(new Label("Password: "))
+ .addComponent(password)
+ .addTo(mainPanel);
+
+ mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
+
+ buttonPanel.setLayoutData(
+ GridLayout.createLayoutData(
+ Alignment.END,
+ Alignment.CENTER,
+ false, false))
+ .addTo(mainPanel);
+
+ setHints(Arrays.asList(Window.Hint.CENTERED));
+ setComponent(mainPanel);
}
- private void login()
+ public void onOK()
{
- login.login(user, pass);
+ this.user = username.getText();
+ this.pass = password.getText();
- user = null;
- pass = null;
+ if (user.isEmpty() || pass.isEmpty())
+ {
+ MessageDialog.showMessageDialog(getTextGUI(), getTitle(), "Username and password cannot be blank",
+ MessageDialogButton.OK);
+ return;
+ }
+
+ try
+ {
+ login.loginJecna(user, pass);
+ } catch (UnknownHostException e) {
+ MessageDialog.showMessageDialog(getTextGUI(), "No Internet connection",
+ "There seems to be no internet connection, reverting to cached data", MessageDialogButton.OK);
+ return;
+ } catch (CredentialException e)
+ {
+ MessageDialog.showMessageDialog(getTextGUI(), "Incorrect username or password",
+ "The username or password you entered is incorrect", MessageDialogButton.OK);
+ return;
+ } catch (IOException e)
+ {
+ MessageDialog.showMessageDialog(getTextGUI(), "There was an error", "Maybe try again and it will go away",
+ MessageDialogButton.OK);
+ return;
+ }
+
+ close();
}
- public String getJsessionId()
- {
+ public String getJessionId() {
return login.getJSESSIONID();
}
+
+ public void onCancel() {
+ close();
+ }
+
+ @Override
+ public String[] showDialog(WindowBasedTextGUI textGUI) {
+ super.showDialog(textGUI);
+ return new String[] { user, pass };
+ }
}
diff --git a/src/main/java/xyz/thastertyn/Window/LoginDialog.java b/src/main/java/xyz/thastertyn/Window/LoginDialog.java
deleted file mode 100644
index f7296f4..0000000
--- a/src/main/java/xyz/thastertyn/Window/LoginDialog.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package xyz.thastertyn.Window;
-
-import com.googlecode.lanterna.TerminalSize;
-import com.googlecode.lanterna.gui2.Button;
-import com.googlecode.lanterna.gui2.EmptySpace;
-import com.googlecode.lanterna.gui2.GridLayout;
-import com.googlecode.lanterna.gui2.Label;
-import com.googlecode.lanterna.gui2.LocalizedString;
-import com.googlecode.lanterna.gui2.Panel;
-import com.googlecode.lanterna.gui2.TextBox;
-import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
-import com.googlecode.lanterna.gui2.GridLayout.Alignment;
-import com.googlecode.lanterna.gui2.dialogs.DialogWindow;
-import com.googlecode.lanterna.gui2.dialogs.MessageDialog;
-import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton;
-
-public class LoginDialog extends DialogWindow {
-
- private TextBox username;
- private TextBox password;
- private String user;
- private String pass;
-
- LoginDialog(
- String title,
- String description
- )
- {
- super(title);
- this.user = null;
- this.pass = null;
- this.username = new TextBox();
- this.password = new TextBox().setMask('*');
-
- Panel buttonPanel = new Panel();
- buttonPanel.setLayoutManager((new GridLayout(2).setHorizontalSpacing(1)));
- buttonPanel
- .addComponent((new Button(LocalizedString.OK.toString(), this::onOK)
- .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.CENTER, GridLayout.Alignment.CENTER, true, false))));
- buttonPanel.addComponent(new Button(LocalizedString.Cancel.toString(), this::onCancel));
-
- Panel mainPanel = new Panel();
- mainPanel.setLayoutManager(new GridLayout(1).setLeftMarginSize(1).setRightMarginSize(1));
-
- if(description != null)
- {
- mainPanel.addComponent(new Label(description));
- }
-
- mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
-
- Panel userPanel = new Panel()
- .setLayoutManager(new GridLayout(3))
- .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, Alignment.CENTER, true, false));
-
- this.username.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, GridLayout.Alignment.CENTER, true, false));
-
- userPanel.addComponent(new Label("Username: "))
- .addComponent(username)
- .addTo(mainPanel);
-
- this.password.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, GridLayout.Alignment.CENTER, true, false))
- .addTo(mainPanel);
-
- Panel passPanel = new Panel()
- .setLayoutManager(new GridLayout(3))
- .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, Alignment.CENTER, true, false));
-
- passPanel.addComponent(new Label("Password: "))
- .addComponent(password)
- .addTo(mainPanel);
-
- mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
-
- buttonPanel.setLayoutData(
- GridLayout.createLayoutData(
- Alignment.END,
- Alignment.CENTER,
- false, false))
- .addTo(mainPanel);
-
- setComponent(mainPanel);
- }
-
- public void onOK()
- {
- if(username.getText().isEmpty() || password.getText().isEmpty())
- {
- MessageDialog.showMessageDialog(getTextGUI(), getTitle(), "Username and password cannot be blank", MessageDialogButton.OK);
- return;
- }
-
- this.user = username.getText();
- this.pass = password.getText();
-
- close();
- }
-
- public void onCancel()
- {
- close();
- }
-
- @Override
- public String[] showDialog(WindowBasedTextGUI textGUI)
- {
- user = null;
- pass = null;
- super.showDialog(textGUI);
- return new String[] {user, pass};
- }
-}
diff --git a/src/main/java/xyz/thastertyn/Window/MainWindow.java b/src/main/java/xyz/thastertyn/Window/MainWindow.java
index 1b274cb..33e2342 100644
--- a/src/main/java/xyz/thastertyn/Window/MainWindow.java
+++ b/src/main/java/xyz/thastertyn/Window/MainWindow.java
@@ -2,13 +2,12 @@ package xyz.thastertyn.Window;
import java.io.IOException;
import java.util.Arrays;
-
import com.googlecode.lanterna.TextColor;
import com.googlecode.lanterna.gui2.BasicWindow;
-import com.googlecode.lanterna.gui2.Borders;
import com.googlecode.lanterna.gui2.DefaultWindowManager;
import com.googlecode.lanterna.gui2.Direction;
import com.googlecode.lanterna.gui2.EmptySpace;
+import com.googlecode.lanterna.gui2.Label;
import com.googlecode.lanterna.gui2.LinearLayout;
import com.googlecode.lanterna.gui2.MultiWindowTextGUI;
import com.googlecode.lanterna.gui2.Panel;
@@ -19,58 +18,53 @@ import com.googlecode.lanterna.screen.TerminalScreen;
import com.googlecode.lanterna.terminal.DefaultTerminalFactory;
import com.googlecode.lanterna.terminal.Terminal;
-import xyz.thastertyn.Jecna.Credentials;
-import xyz.thastertyn.Jecna.Login;
-
public class MainWindow {
-
- Login l = new Login();
+ private Terminal terminal;
+ private Screen screen;
+ private Window window;
+ private MultiWindowTextGUI textGUI;
+
+
public void run()
{
- Terminal terminal = null;
try {
+ //#region init
// Setup terminal and screen layers
terminal = new DefaultTerminalFactory().createTerminal();
- Screen screen = new TerminalScreen(terminal);
+ screen = new TerminalScreen(terminal);
screen.startScreen();
+ // Create window to hold the panel
+ window = new BasicWindow();
+ window.setHints(Arrays.asList(Window.Hint.CENTERED));
+
+ // Create gui and start gui
+ textGUI = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK_BRIGHT));
+ //#endregion
+
// Create panel to hold components
final Panel mainPanel = new Panel();
- mainPanel.setLayoutManager(new LinearLayout(Direction.HORIZONTAL));
+ mainPanel.setLayoutManager(new LinearLayout(Direction.VERTICAL));
- // Create window to hold the panel
- BasicWindow window = new BasicWindow();
window.setComponent(mainPanel);
- window.setHints(Arrays.asList(Window.Hint.CENTERED));
mainPanel.addComponent(new Separator(Direction.VERTICAL).setLayoutData(LinearLayout.createLayoutData(LinearLayout.Alignment.Fill)));
- final Panel content = new Panel();
- mainPanel.addComponent(content);
+ Panel content = new Panel();
+ content.addTo(mainPanel);
- xyz.thastertyn.Window.Login login = new xyz.thastertyn.Window.Login();
+ Login login = new Login();
+ login.showDialog(textGUI);
- /*Rozvrh r = new Rozvrh();
- r.download(login.getJsessionId());
-
- content.addComponent(r.getPanel());*/
+ window.addWindowListener(new WindowSwitchListener(content, login.getJessionId()));
+
+ textGUI.addWindowAndWait(window);
- // Create gui and start gui
- final MultiWindowTextGUI gui = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK_BRIGHT));
- login.showDialog(gui);
- /*KeyStroke k = terminal.readInput();
- if(k.equals(KeyStroke.fromString("")))
- {
- window.close();
- }*/
- gui.addWindowAndWait(window);
-
-
- } catch (IOException e) {
- e.printStackTrace();
- }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
}
diff --git a/src/main/java/xyz/thastertyn/Window/Rozvrh.java b/src/main/java/xyz/thastertyn/Window/Rozvrh.java
deleted file mode 100644
index 8a8d45f..0000000
--- a/src/main/java/xyz/thastertyn/Window/Rozvrh.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package xyz.thastertyn.Window;
-
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.List;
-
-import com.googlecode.lanterna.TerminalSize;
-import com.googlecode.lanterna.TextColor;
-import com.googlecode.lanterna.graphics.SimpleTheme;
-import com.googlecode.lanterna.gui2.Direction;
-import com.googlecode.lanterna.gui2.Panel;
-import com.googlecode.lanterna.gui2.Separator;
-import com.googlecode.lanterna.gui2.TextGUIGraphics;
-import com.googlecode.lanterna.gui2.table.Table;
-import com.googlecode.lanterna.gui2.table.TableCellRenderer;
-
-public class Rozvrh {
-
- private Panel rozvrhPanel = new Panel();
-
- private xyz.thastertyn.Jecna.Rozvrh rozvrh = new xyz.thastertyn.Jecna.Rozvrh();
-
- private String[] labels = {"Den", "7:30-8:15", "8:25-9:10", "9:20-10:05", "10:20-11:05", "11:15-12:00", "12:10-12:55", "13:05-13:50", "14:00-14:45", "14:55-15:40", "15:50-16:35"};
-
- String[] days = {"PO", "UT", "ST", "CT", "PA"};
-
- Table t = new Table<>(labels);
-
- public byte download(String Jsessionid)
- {
- try
- {
- rozvrh.downloadRozvrh(Jsessionid);
-
- String[][] r = rozvrh.getRozvrh();
-
- String[] s = new String[labels.length];
-
- for(int i = 0; i < r.length; i++)
- {
- s[0] = days[i];
- for(int j = 1; j < r[i].length; j++) { s[j] = r[i][j]; }
-
- t.getTableModel().addRow(s);
- }
- t.addTo(rozvrhPanel);
-
- return 0;
- }catch(UnknownHostException e)
- {
- return 127;
- }catch(IOException e)
- {
- return 126;
- }
- }
-
- public Panel getPanel()
- {
- return rozvrhPanel;
- }
-}
diff --git a/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java b/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java
new file mode 100644
index 0000000..4a70d2c
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java
@@ -0,0 +1,123 @@
+package xyz.thastertyn.Window;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import com.googlecode.lanterna.TerminalPosition;
+import com.googlecode.lanterna.TerminalSize;
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.Panel;
+import com.googlecode.lanterna.gui2.Window;
+import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
+import com.googlecode.lanterna.gui2.WindowListener;
+import com.googlecode.lanterna.input.KeyStroke;
+import com.googlecode.lanterna.input.KeyType;
+
+import xyz.thastertyn.Window.Content.JecnaContent;
+import xyz.thastertyn.Window.Content.Rozvrh;
+import xyz.thastertyn.Window.Content.Znamky;
+
+public class WindowSwitchListener implements WindowListener {
+
+ WindowBasedTextGUI gui;
+
+ private JecnaContent[] contents = {new Rozvrh(), new Znamky()};
+
+ private String JsessionId;
+
+ Panel panel;
+ Label label;
+
+ int current = 0;
+
+ public WindowSwitchListener(Panel holder, String JsessionId)
+ {
+ panel = holder;
+ this.JsessionId = JsessionId;
+ this.label = label;
+ defaultPanel();
+ }
+
+ private void defaultPanel()
+ {
+ contents[0].download(JsessionId);
+ panel.removeAllComponents();
+ panel.addComponent(contents[0].getPanel());
+ //label.setText(contents[0].getLabel());
+ }
+
+ public void next()
+ {
+ if(current + 1 == contents.length)
+ {
+ current = 0;
+ }else{
+ current++;
+ }
+
+ if(!contents[current].hasStarted())
+ {
+ contents[current].download(JsessionId);
+ }
+
+ panel.removeAllComponents();
+ panel.addComponent(contents[current].getPanel());
+
+ //label.setText(contents[current].getLabel());
+ }
+
+ public void previous()
+ {
+ if(current - 1 == -1)
+ {
+ current = contents.length - 1;
+ }else{
+ current--;
+ }
+
+ if(!contents[current].hasStarted())
+ {
+ contents[current].download(JsessionId);
+ }
+ panel.removeAllComponents();
+ panel.addComponent(contents[current].getPanel());
+
+ //label.setText(contents[current].getLabel());
+ }
+
+
+
+ @Override
+ public void onInput(Window basePane, KeyStroke keyStroke, AtomicBoolean deliverEvent) {
+ KeyType type = keyStroke.getKeyType();
+
+ switch(type)
+ {
+ case Tab:
+ if(!keyStroke.isShiftDown())
+ {
+ next();
+ }else{
+ previous();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void onUnhandledInput(Window basePane, KeyStroke keyStroke, AtomicBoolean hasBeenHandled) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void onResized(Window window, TerminalSize oldSize, TerminalSize newSize) {
+ window.invalidate();
+ }
+
+ @Override
+ public void onMoved(Window window, TerminalPosition oldPosition, TerminalPosition newPosition) {
+ // TODO Auto-generated method stub
+ }
+
+}
diff --git a/target/classes/xyz/thastertyn/App.class b/target/classes/xyz/thastertyn/App.class
index 8c05ee8d916ff55ddc090c324eade17e126e9041..8fc5f3f79614baaf8f20bb1295a3cec31d6aca30 100644
GIT binary patch
delta 31
mcmZ3+x{P&$8WSVuWOXJVUTy{s23`gM20jK62F=M0OlkmLk_7|+
delta 31
mcmZ3+x{P&$8WSVeWOXJVULFPx20jJ>27U$+hLFh(OlkmMrv)(Diu-7K?mt&V4F2t{Dz2E#=_aM;K1gO
zP-gE#mIWGKTsT!evX?m#wNC
zVQ{UDb~l9Z?7SdEx3*R(LL7|{V?fAqZPeZ7xm5k5EIUOw&21&SLiXD0-)7_*y(Y}^
zf9$Ua>4V+$m0D?kWc-)w!bid!9Du(7GkIgigq1jGAYOc8_`!_;DWe~Q7mgW6hdO2+
Lvm%@@2FQK@MU*?y
diff --git a/target/classes/xyz/thastertyn/Jecna/Dochazka.class b/target/classes/xyz/thastertyn/Jecna/Dochazka.class
index 5e449962e129bfb14cc0e24a6a3e64ed1fe13f6d..42f6c0eb8800c1502c487945f0bd3bef004a57c2 100644
GIT binary patch
delta 438
zcmYL_-A)=&6otPtGj)b3jmaol|9@H#tmCLym13^Ae!EJ>8%M5
z;f;wgCQb3e2k=4kElfAHi8niYo&D{#&N&Z}Q`fzFytxI|$z8c;%5)g-HjH%2Ws+%|
zDaBye{t+A;hDWWS(63Qum{r)7u-Vj=PWRIA(+=~BNTHM~mGZ^?>`UH~u!$>%pO^QZ
z_So7bS>Zn84lAO6YTfe7jry_fyRSt_lT-}U
zbh)bA{iF9$HrVXm8w)cTwrxHrh7QWd<)9u0`C{%@MYlTt!gsEh%$Pd4z{HZ52j18p
zCcL?KJ>HmjDer&ddqIy?lOF4eZ|6As{%^L-3zRIyNsm=6wA1ned05Q;1;`l5&c!>Hb%`RV+pb+(jfa6
Di@Q!J
delta 371
zcmYL_KTpC?6vfYbttpfm6$-S1g7^mnu?qMXaZv_Hgn`L85z;8e6ob`(i=(SaN8{|`
zVoZ!U_yPPPegX#<<82sRZgTGVo%`OsxAK=){``Ia08qg0vwX)&GA0p~5Mj`J{cFQM
zXNMKIFEQ9Jy
zaCJn%JQkcoUS%ogf#t_tKdm5xB?jTLd*=MGtn4|m5M(#^5FpYXi8tu}SZ0730siCwiyQ-F84e!dsbycWDm;M^ry+tI
zWdd#n9;!i7A@~r6pWHBM4LYK9k2vkC5|JLhKu(C1n~P(erfCq8*uW+@;Uc!MO{0ng
PNZ>~jaw0K1Bsofdvd}#N
diff --git a/target/classes/xyz/thastertyn/Jecna/Jidelna.class b/target/classes/xyz/thastertyn/Jecna/Jidelna.class
new file mode 100644
index 0000000000000000000000000000000000000000..b7f18699fdecc733d1084a02b69bea741370bfd6
GIT binary patch
literal 288
zcmaJ+u};HK3_Pbv10kgqGeTl(8TuABDi$P$Dk=l0yOUb;
zxGMh3a7W0Vn@wBEqYaz#W43XKg==UCeFw@Ejw`0B%s~Um%{NZI)QFHNhBkEIOff&y
NiE>XB;ao97e-BA#K6d~B
literal 0
HcmV?d00001
diff --git a/target/classes/xyz/thastertyn/Jecna/Login.class b/target/classes/xyz/thastertyn/Jecna/Login.class
index f8ffa277b96031a11b2beeb2b7f80b7c47e4fce6..572fe36a60ac3b1e9dc54413698a52330c270ed3 100644
GIT binary patch
delta 2625
zcma)8dvp}l8UNkvV`i5r372SD9(F;4lGoUS*aJ0M4M`=E2MHJuAxw5B+1ba;GBX6PrreS*ZbSkl_EWbq`}=o64*nB~RDilHeIHsB(L
zV9YR5nku5-*%P>euf;8{q1(;ovl2dsyz^S%(%AzHT+_2Td$q1))H>TpsrvjiVcd$X
z0zS_$&3P*@jZ(f1w>zH>)?M{QhCrW^&Z%L13EKqR$q*UG#ZuFRf!vT*GX$n3VY{1&
zU$Jdd#NE!b!OJd*;~ohP613db+Ob^3y$lk8XVZq7<^5So_&!Gx=H_=%39Y6^WQ(|;
zyiFrbw!I93W#?S3MC>D%V#aP&`z3r8-Q*cpY(+$ah(-~Ql8cq=&S>QRIKzc)74-`$
z7B18h>5BUK71w^;((EeBqv&fAzK(AY%{@jsZESE33Kc;S-(;BU>^a;o`DqBnS{g
zU^p%z1kq_0Wzlb|md!BTc{4CQPmmU`i56GWI)U+BDkEXrS!fZKagj*d|%T_efzYJK7s-mbc!}&?4eA!-D^BZ;ujFExJ&7BCR%QWkvjuVafz~
zb;T^RXN`atN%P(%O)Gk@+%a+=C)~UrGt8@}9HJh*mJ6D0*wKt)#}d_1%gCs9f*_A-
zRy3Cl;{{ZU_!&c8G0*n@Rb;Zu%DR+wjkba=ug8dZnQBjVjq(t}&+$tEzhH>&D7zp(
z-Xloa4Ip)#@!UtLa^25LXml;Vc7>su8BJHxB7RG^rbkIzB;eOcptdLT^9;TXYPX0#
zkkvy*#2XADTQPf8dxc5+{>;!S7g4p;JasKKE@zY?xYvw^uk#|$wQR-CS#`FVQ|G$H
zk$J?DQv16N#f%rHbb&@_CvHYY;|*nm`!0`rO4TKd)a3e!q@<;8^L2*Bbu8#aLUL#_
z{3s(0PIi`s24;N>C76v;T#N`RFb|jFN>maa)wmwD&fB5wk@@7YfIL1y9t+9iljLzV
zeXnzNhBelB&!ms$7n4g9b$<~)+<<11zXX(&A%Gyj%J{NjbnsPtbpdO97(}c9tpo*R
z7+NZ8`1%5@5*$V;-#F2audh6W(gHU5$n`VS^EMA*3;)6p?pWmKcai5Hc6fn!{>yx)
z7n*;CFDnj451SB#@8)~FX#9bQzkmmQ;15+5e;=+c{yxGV^9E!-Fp^*=f8s-u8jDxR
zyXh?oL;^$j79SkK<-72ar_s8KA3B1ev-F8W)CL>}E(j~F%~
zj;&CsgZJP*^kN?pcnlhzL=r>vG#!PG6Z9&bMiwvAj&m^aI<1|j7wH}J;XU*-0h?GU
zZULvXt}fDtsVJuz5$WC_YGLk(ZVZt=6Yt_#Ai2BR|d^u8!C&ixidsou?m(*U8gg}A?!xZg~m
zZY5RRhFaW#`SfI8g*&kr+ej7LNfmdIBJRd&vaO*vxd-Xo&7r-?x&(pv@AYBCnkcNt66W?>lQi8vE-*@nL`sFl_lX~C%
NRD@)=7XJu_{tYePyzu}4
delta 1258
zcmYjRU2GIp6#nkc%+Bm~+QRKFbSW(eO$)`kL`hW|e@baXf46oEU8OCZwnKO5c4ld(
z6;N5~zo6CaRS|zcMMX_jT50W~@MdCsFa(p5U`+JUH+}Mj7|(8vA(OfH+;hJ9&Uene
zcYZ0KU+4evpUYPP?7-Eu{|~uf*mUP^b$fhD!Wp(~hDvc(u8?lc8A^qr1bO*Ns5Z+)022pAjZ&}05Z7VhkeE`o
zhZ2;tIoc47HbvT-cIUxHQiYRcNGqiQ9fwiI;2m_F5zEvt&JY&ANyVbb8{#ocWaB+q
z`p0z~!BO#`xAKlB7`SC8C*1wEF={^GIwPiiPp=}XYFh$JcW`fEm
z+AU&EE)zd_`RZpFlu08oVfyhLUQqG8_{&?i>cy-O*>K%44JR2k=VaWg=9l;3WgV~N
zitmU-yEMGYpi^62({`)7jwVTVTEx|gsGxL_F^l#_!yCjk<|HU~nn4|RCx!^E;S51m
z1ZRtSN5{M9A>@$Z8X6ijG-`N1D|%vJ)FSwY;&-)#`uUNLkMW6+wYxMw*5OkfpNVB{
zbI}(%RA@dhe5Jz&O~stBrA_Q>k(Sm7pD*lXCc}nSaabx1)iMNI4;hn2*mA;6k%l9K
zW-@y&YQ^_?{Y()Rdf1l-8TrJNC;IfM()IA5429T;5H?{e%29(#G?KLk+r%w>I<%b-
zcN1a7pzS+lRO<@e?ozmj`L04vV=As<$E*emN1Xr3O
zV3?u3s+x~vFzUeq3i;UWI6hK!356NB5;g;llk+{g
zL{W_{>fK({VIOt4n@}-ykiQc>wCcqH^dXLZx(^19VSrBVAf_>d({%05;UF$xn3Be^
zNH_0W`sNA}_yME1mV!filK2_pScZ!mm;@&&ozQ5!i6R7O&RPw$JuGK6lI0<3i?~D^
zArbZj&X7+g+8~<9rx2e+@o#9nk+YU)+(lpO@cfPIDlXQmRJ{iqGUW8&GN}S3_D~%$
PeD`pO{sb{x@%sJ+h8Y}y
diff --git a/target/classes/xyz/thastertyn/Jecna/Znamky.class b/target/classes/xyz/thastertyn/Jecna/Znamky.class
index bc021b48096617377daa0010b6211b3d7670213e..78c6ac40c17b3e2cffd4b90087d83744e4a76aba 100644
GIT binary patch
literal 5947
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
Ykmp^`-Ou5C85TxWx=HX($BD@Q038-B3;+NC
literal 5108
zcmb_gd3;pW75;8!GH)_@1_)~)AyE-YAQ{w3A&CJ(0E0=e210{dACpJ&$Yf@G?+qcS
zRjDnOTBWtM(Jq#5=|YRPGJsT@E_AWG-R!TmNEf?rcCW4RyLaA9WhhiPvyXkMVSEgmtVU50JRcW=?}_E`j`Vq);QP!pn{(bKb0f+#R|
z$=P_cwp4e?2+DO-U?CHJOUVxsvJpG*ss(drKOsn3?etWf9eIfk4@msD`izi#1%7
zfkR>G!K>q9ED_Ll8_}e>d8fdfC9S!xGg%0s2Fo-o&7)E}AJRmv!0aV0xr$z{LO35`
znUCcH7f*7`vrj1js>G!_E+f6+Bc9UsBy!}d<|I8fm*xm~+!H8NbSAZ1NtQv=>g^-g
zqD3G?tDPCuJma2jI*4g9RjYNZ!CFR=NK$*{B$4E}o;rDS%3QDAZQ4dJ$uZBfqbe+$
z$cAbLcip60=cH^;o;D9y7-CY4XvLScwE1?!-1Q-ow}g1QT4D!-`4#Qff|q
zn;A-ET21$4(VUa~3p7t1`2X8{IXXIBBht^A;Pu9m9&e7MC(eX=&6HHL?7Fs&LIi>!
zqKo@nH{sNW!-Io^bxy)DIhSHaU1V?AiNtL)?6^q@eF(d;N5dc?ozUUZtv5TvXnF{H
zWzxK81R8UzHE$#-K4c9`X*2T+2e(p8Xdv5kls#2ZL+SI(X~
zg+vH<;eduWvTID`NynRTH=CSeM%8c+Pjc|wIMZ_B^-)vC=`;j!k3fNIhj383dJD(N
zxT^`mQszD#Zoz`=pLf;ZZ8HAFYcT
z4sQ;Vj+yO&)z9)C#~&H!aUErtPh*=L({ac_i?gq2ue!#OQv&m+rWzfj+eSXe*k}B9
ze31SZv+|clyOtC3h
zHmODHrJZ6th41P3zML$<%qWteKdqw~>jG=KGkN$iexl(Sfs*mT(QdeXI!@zR-YM*O
zGRCy{dEMEh;iu&FxLo=u%}H|DWG$V-&*kOl7ytW)mu2f2{8HYQ8fCb@*6|w|Zh+xl
zWe$aK2EWtsd;Eb*Mj~O#Flr|)^eG}@ng5A1v+9;Ac@218$Cq&^h`-9Eo4Irbf0yR}
zA)8v>T`uofH1aR0acf9wJRih=ILbQWydKATtN5LwD${<|mkJWEP~|bp&-}DVk|b<)
zOAgk3Iddeys+SI{Z%;R4cBIbMc`f0zAYn3&RV&>8m7L20uB+lQcC5+qn4<0|gB&q$z2-hK{K2nU+tNV}){8iC1E!lCH!m)T_YRTs_CF
z)RUHGD90yJ$%9;xLep8U${BZsay2Kdkaab~b5$U#l6z^yS|m>5BA!d4+3mZ+*Ti$J
zuP+=yV_D$|@Pa>z^XvWP`^)?(Y#zm;6s}RvU8AT;p}RkF&lMH93z2)8q~i4g4~~tN
z@2}V&Khj=uM4fRfx?u1m68Oa`fD0JNgcx@ZCm}1aNQ4k|PuKX5;wI5v>MT8uoAVSnkHQ@B?yz4dV%toQp?5Z<|E{@I1KvkOyr`zVG}c(C)%LctXZ9U6Pi
zFGX&VBA5Cy67Q)G)RYBMc%NEkI;3Lh2U7S@3M2Kw5v(o?dKnw8*UGfg538+@9>>R4
z6!G;)3XeQM3Y7(B7tO-a6poERS8vn!EOk}V9#?Uc`JXs6w$FE%$JJOHb9mwMsl?sD
zH1HoJJpSd}S;@UsT&c$b-USw-iK$z|ZOK7tRKaCS4hm7QDJcg4@>0CZr)c4WfQ9O<(_;eW#
z)7mJLx&l@BEMqIAy*s_90aE32+zBv(<<$K=EsU_Ee1URBiU#+iXpHWCD&?m%UJjY{
zJG2)uU&BESUlKD*#t=qPcHdjpIFA%##&9V@lk933=02Os7<<*rsp}pGrE||XaS(Ex
zq-iHs@pM71-OEOB(*wAx^eb($C8Y4x6Zob;#|U=SdK`GFy=K`7d{-85~qB6;P97n&k3Rzlj#=nLb&~vPCN?7Hfe@UKLow^Wjg!pU%e%*g3`^m_^yp
X3xw>T1;Qs}50*ESr$nL90!1$Yp|3E1
diff --git a/target/classes/xyz/thastertyn/Predmet.class b/target/classes/xyz/thastertyn/Predmet.class
deleted file mode 100644
index 8ffad90deee3154f9bace5d72c533bc95fae967a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 276
zcmZvXK~KU!5QX2ALbX&N9E?|Q>cPEm({Lf-)TjxD`?gGENokX1ORWFO6A1@@06)q&
zYkK7J&Ad0syqVMQ@dv;JqX+@v`m^~`ZmoBYt!qm4W_h(`7a=5!HhQmBq00~Tnr%3D
zgx<3$jhhlWclS#|IIC71ql3!?UGxaU)Rg>EZ!@;Zi`}eTHMSq7wsMvtCUoa=B}FaG
zn|Lnfs`P~Boi^Iv6B<{;DItEaGnJu%RvQVLgifxFdRo30%Du{>R)mY(ma?8or$hd2
z#=g=E!XW<_;+Bw2?9!F$QHN8#zl_%b50_vV{tN6BAXrmQ;+TPCw8P1k8xbnLLxcbT
diff --git a/target/classes/xyz/thastertyn/Window/Content/JecnaContent.class b/target/classes/xyz/thastertyn/Window/Content/JecnaContent.class
new file mode 100644
index 0000000000000000000000000000000000000000..4a1dc850350ef3af307b7638ab268243f6218f8b
GIT binary patch
literal 734
zcma)3O-~y!6r7h0B&6YMflvw;E+|0(OBI|zT#$OGR)7?gO5B`{wK&??(#C0l-^8Ju
zD)rDG&>w|(-b85{IB*&Jt>3(vH~aVb_a6X9*eRhv*uT4f5bjnEoXXt25#O}w+8^TF
z8mEjCUsY`6xG14WSn0{{Ql!!(;0j;SEh{WtXr~kNz#xa+x;CiC==)N%;DSP~oUrPG(Lqn-{(rS%_rE
zTUcicujZApMF3M
z{WDO;2gd5CfzL&*2uoOI^yDU=zOO((Jx(#JQ_RAIxq{U(^EmJ4X|s}HPOR}TFEx_%
sw-9TL90E2N{}T@$XT)o7ir26?W*+2|fFS%h>w9~O8cckD$_2Jx009StCjbBd
literal 0
HcmV?d00001
diff --git a/target/classes/xyz/thastertyn/Window/Content/Jidelna.class b/target/classes/xyz/thastertyn/Window/Content/Jidelna.class
new file mode 100644
index 0000000000000000000000000000000000000000..245148867b43e6292a929f4f5eb7482718adfe50
GIT binary patch
literal 306
zcma)%F;2rk5Jmqub_~Xlh#OEK5(>6S7eo_@0$EUiLcO*}WFxaHIh%xVE2>BoIRJ-3
z%tko?&HwXfG@~~^zu!9mBlJ^5gv*c3r}8ts@Z9>1Rjvgr7tENDJ-cOF@x2Kr^8@5f;KK!kMjnJX1q#trlGc0s;6i3bpam5d3<&`j42z*zG8#>qna(gWbYoAWLN=2a
z&Hj{B#m7AHl80Copej~;%S--3enS31Dy2EM2Z;hf^Dy_^{_eM)``vGTfB4G-0Eh97
zf{?(z8?$qUKVcPp+w*4~V=V7v-RnlT>-e_g8$<5gHE%*eL?E@X<~cj#Sj%Pt6<%O?
z-g4{$gY;$GDI@2)xq_W>v$j#N=-zWIBR7+8GXkv+ff&;;earLhtbn*6P*(CHP}{dE
zco1zlJ6e_%tZ}3ex6$Ky!Wn&qMJS;fYw_||yAHiqR&yK*z1
zb1Z+xvjsYz+wkPt6gp*&C-Y9;?-U3plB3M2n?%GA##RkFHY?aJu;(hH}Id>=US3O_qvACfH*;DiQ*r))o~hVjHoEc!=0S
zJWM=DJVI$B8HCu=QYz%=Dy&3TP@wLg@UUidTpu!zx}Sn#3Mr
zH}SMQ?~)d0HB>@Va84kxAvsT6TnxSFlce?wY)!1w5Xn*LdQig)*d(y2FYnj`GgITX
z7u>sm-sfhl!l>otWgjdHBmP95J=D0m6W4t(yl$1x$SJrMTREOs+Y!l8c^_jM-oS{!
z3y+mc?@bqJD7vikFLXJ=!W#I$U`
z5fz?5b=PVI1l{v{^lyI#hhg{(AfvVx~LeW$e@W0*k09Nn4~1
z8u+@y{EsU`NX|&^LUKX|$jKKV=MWKcx&+8kK&vY5L#U<|xy5F#TPXP>_y)d9Eg_z|
zk8SBC>{vieD!hPQ{NBy)`UNzksw#fP-gH>sZ>A&qi)K2iC(U%3e!xsCdb62Ub;C?o
zmFcZq75xxbRX@VDTtCV+rXM#K(2-J0K3pat;}jLnFko*w^)ot_@Y(_f
z?gc5I=ej2-F@^|B+Qiwmh2_+-h%Dmxlz$uFvh>%fr?D&+gCUqifnki43KchLE9tsR
z_YDUYF)DEp>3$jR0rMINw@2o2qB%^#nRukljI>ARQQaJmHt{PSZ8L90Md{zMw~%{rS8Qgq&P_q(7p*CT5uZ%?w}Rl
z<4{1%P(a|_WnxGJuHy!&slsKLj5h4=7232VYme863lKCAH|Zc^_~
zu=|L+kC{~x%0tvC_(Z`i@i+f-D*wXvN2ozafl!zjm*TL3nQ8`8cvq#iGl=r0qU2`R
zkKBZUO3MP_u_vxFx^k7b8F{U7%}=Y0JJ&V-44*F>Hxpu>Qqr)1D_x!z*#W3Icrn
E4>8($cK`qY
literal 0
HcmV?d00001
diff --git a/target/classes/xyz/thastertyn/Window/Content/Znamky.class b/target/classes/xyz/thastertyn/Window/Content/Znamky.class
new file mode 100644
index 0000000000000000000000000000000000000000..360f92fcf12e7c1b7ba4855e96d3d04223ded74a
GIT binary patch
literal 4964
zcmcgwTW}j!8UD^n)=Kg=PMp|{QoC_n)7A#GaAxba1Gl*o2sJ9g}}q-$xB*O7PC
z)hdY-O1ZSqmQn}-+FYh|3az0Os6!(+F@->ZLSdNUfxf~Foq;E27+#<=5dO1T*^*+(
zc|!7P&;IAXpYQ+AS-F?DwQ_)QS
zq$bZEpA+F^XerIPUx{e4EyhrO+7dh{Yf7Aqgd_T_Kc?%kxDwH$ia#!sdP9@_v6Q;Y
zZ*c_}Tp1yT+Hip_OS$a~F?z}05mPoyCCb1iNwQPbRI`i0(bPP~;Or$MUN}%8p&XKk
z4Gi^byWquoREXHb&|H!^tZIsEgylIsWqMGJ%_44RXe=qyry5GcRCP^)4_hdNeM7^c
z$)Ul~?l41B>HI9q2E5pa8Xi+EL+dR|HIMPgwo0hOHiq>{#mx9VAZv0=F&Ku|P?g6X
zXfEw-W;H!vxJyDATp~Wga7T#+^`Ze4oWDte2sa^B0k2j(XyUDE#U#|CG9HJh-~V#K-GDALN+~6jvn-h=%uu*sL9Ss
z2;xDi1x-0+GHl9fumT;Lnjtg>MC@bm6)eqYDiK$xCRIbk{uu^802Z#64NDQn88)mq6rvtV^UTA5WmNFpVI)}UxR8znsT>T%s@=pGyi
zNjQO%3}rpx?%o5XI$6G0fE${VaM}{?9}WfwMSPO_L@{Sa`iH$p;8Pqrk2A!IBV^f7
zplF|3VL4iqhYVVcAcW6I_$)q0$)(0=C8>17%x2YMT??QqNahK7Qo`qXLYzI}!$D4X
zO2X5e;F<`A!$aeo^hF8Ja*{aE-5;dwgVUaq@MTVO3#s}`(jpB$v+67jXX
zQtZ=H)I7a7hi^!D9xu>-9kobSde6|Uyx<51&JQYzAe4nH(a(_}uCTSR=vZ}nf
zO*7nBj&-T!{ST40^U
zW9hs(nQJoVZ&A0X+-^~U9D5n;1-j_FI<<=;U0lc!!{tIlNF&jp!*OqCBYb!&G^OdN_w=7~^%M#X4ETVD=8z(NKY7uv&apx7(6TN}xjaRU}#c>7A3zoW8`mH8$
zU>%%vhNwX$wqq08=(&xk+yp76@7;7~@MA~DXxVvkj5?F>VauD?-kQeFJiEIyb_Z4?
z4z5P*aB@9q?CB`;m8B8r5a$KiCtgK2!*%p`xZ0Kwn((>OIB*?MNYGLkmvPGRHqI>Ku{1tCK9A{~nJ4mQ
z26JYhljW~-Yyn+_INj3F8RntGPlht82
z+k<;p2llW-xQ~s}tIu%+m_{!(Poj%GMQ24+0LFwV91%`pQg{wWg$sCCSimE~Rn!abAR_z@QQ?nJgg+rBe1K`;ZjlCmR~7ylR9m>6?%cAY^5=zi
cAIlMS*mec{!ZPqn{EF^g5>4V={ARE3e?}#B
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
Ml!$4fj3HV6e}&gzE&u=k
literal 1367
zcmbVL>rN9v7(GKvZ!S_>OSLUnK%^I>TJZ*W2?D01LQJuQ_-kn=Wl7m3-K~I6rHMeI
zi4WjI8P9ARAQX-IW51c5J$ue~IrHP^*Y5yk@Y0Vyf#kvA$AYu1+m38Ghh|~JFzeQS
zp=>n_(+{sect`)B7n-`+D6DPm$eJVIZQHUX5GkL1syHpfY|Qc7o^IO${Y^z6kSbr`
zUy(Ia@6Z$Ns~b9z0^=8P=kr)}K?*)^n1=IQz>~>VsrAaL%Md&WYtS$dKtupR2wd0D
z51-l%Y4F46#|?qR?=uM@jfY%#gip?RQ!$Fq0|QtldJxvKmcUV_Vh4Sq*2^XdA_@
zEf#cJ*4O2M^ZH$BE?ZUgOl!!aAh7%&1n+wb4zb+(Y6t@Yey5|vlYdT*gE7p#Hq9En
zR3(nbO6AF44`M-Jpdp9~zet%C_!GKe{U&z|~76t&usoWP#W9lRN_-!E-_|v?@VWid?0%e5ymL5T8uhFu131U)72m&
zig-YkAaOHz$V~f`7rMG{iB{z%shi*v#A=gLZ+
lmh}{~UHT$dMITV~$C&%XeWz7E_k8T!|AEv0pS!3RzW_k=E}8%U
diff --git a/target/classes/xyz/thastertyn/Window/LoginDialog.class b/target/classes/xyz/thastertyn/Window/LoginDialog.class
deleted file mode 100644
index 926ccde4872dc4937632f830f81f5541d9f585ce..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 5126
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
ZC?(fU+`vThLfZ5`Ow!pv1N;rNe*x4nv5UsAYE7
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
literal 0
HcmV?d00001