From 45757593f3e38c06b2825f557f25b573c6eff744 Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Thu, 28 Apr 2022 14:01:05 +0200 Subject: [PATCH] Added CSS file for graph --- .../java/com/application/DB/Constants.java | 3 + .../GUI/LineChartFunctionality.java | 32 +++++- .../DataProcessing/NonlinearRegression.py | 3 - .../com.application/GUI/graphStyles.css | 23 +++++ .../GUI/graphical_user_interface.fxml | 96 ------------------ .../DataProcessing/NonlinearRegression.py | 3 - .../com.application/GUI/graphStyles.css | 23 +++++ .../GUI/graphical_user_interface.fxml | 96 ------------------ .../com/application/DB/Constants.class | Bin 6119 -> 6168 bytes target/classes/com/application/DB/DB.class | Bin 14919 -> 15155 bytes .../GUI/LineChartFunctionality.class | Bin 10007 -> 11202 bytes 11 files changed, 79 insertions(+), 200 deletions(-) delete mode 100644 src/main/resources/com.application/DataProcessing/NonlinearRegression.py create mode 100644 src/main/resources/com.application/GUI/graphStyles.css delete mode 100644 src/main/resources/com.application/GUI/graphical_user_interface.fxml delete mode 100644 target/classes/com.application/DataProcessing/NonlinearRegression.py create mode 100644 target/classes/com.application/GUI/graphStyles.css delete mode 100644 target/classes/com.application/GUI/graphical_user_interface.fxml diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java index 25867d4..7e1d383 100644 --- a/src/main/java/com/application/DB/Constants.java +++ b/src/main/java/com/application/DB/Constants.java @@ -27,6 +27,9 @@ public final class Constants { // Number of wanted drying periods public static int NUMBER_OF_PERIODS = 1; + // Non linear regression + public static final double ADJUST_REGRESSION = 5.5; + // Database ID/name public static final String PROJECT_ID = "sf-drying-optimization"; diff --git a/src/main/java/com/application/GUI/LineChartFunctionality.java b/src/main/java/com/application/GUI/LineChartFunctionality.java index 10b8b07..b8b65b6 100644 --- a/src/main/java/com/application/GUI/LineChartFunctionality.java +++ b/src/main/java/com/application/GUI/LineChartFunctionality.java @@ -13,6 +13,9 @@ import org.apache.commons.math3.stat.regression.SimpleRegression; import java.lang.reflect.Array; import java.util.*; +import static com.application.DB.Constants.ADJUST_REGRESSION; +//import static com.application.DB.DB. + public class LineChartFunctionality { private static LineChart<String, Number> lineChart; @@ -42,6 +45,8 @@ public class LineChartFunctionality { public static void updateLineChart(XYChart.Series<String, Number> series) { lineChart.getData().add(series); + series.getNode().setId("dataGraphs"); + lineChart.getStylesheets().add(LineChartFunctionality.class.getResource("/com.application/GUI/graphStyles.css").toExternalForm()); } public static void clearLineChart() { @@ -117,7 +122,7 @@ public class LineChartFunctionality { index++; } //allSeries.add(newSeries); - updateLineChart(newSeries); + //updateLineChart(newSeries); //lineChart.setOpacity(1); } @@ -216,6 +221,26 @@ public class LineChartFunctionality { + for (Map.Entry<Integer, Map<String, Number>> entryKwh : userInput.entrySet()) { + //System.out.println(data.size()); + XYChart.Series<String, Number> newSeries = new XYChart.Series<String, Number>(); + index = 0; + for (Object entryData : entryKwh.getValue().entrySet()) { + //System.out.println("data: \t"+entryData); + String entryString = entryData.toString(); + Double kwhValue = Double.parseDouble(entryString.split("=")[1]); + + // Connect the data to a series + newSeries.getData().add(new XYChart.Data<String, Number>(String.valueOf(index), kwhValue)); + index++; + } + //allSeries.add(newSeries); + updateLineChart(newSeries); + //lineChart.setOpacity(1); + } + + + System.out.println("Get R: " + simpleRegression.getR()); System.out.println("Get getRSquare: " + simpleRegression.getRSquare()); @@ -234,6 +259,8 @@ public class LineChartFunctionality { + + return getLineChart(); } @@ -256,9 +283,10 @@ public class LineChartFunctionality { //double p_t = ((beta*maxYValue)/(maxYValue+((beta-maxYValue)*Math.exp(-alpha*(yValue-maxYValue))))); //double p_t = ((beta* y0)/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(2*Math.PI)))))-y0; //Funker sånn halveis - double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(6.5)))))-y0; //Funker sånn halveis //double p_t = (beta * y0)/(y0 + (beta - y0)*Math.exp(-intercept*(j/n))); + double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(ADJUST_REGRESSION)))))-y0; //Beste til nå + System.out.println("---------------------------"); System.out.println("y0: " + y0); diff --git a/src/main/resources/com.application/DataProcessing/NonlinearRegression.py b/src/main/resources/com.application/DataProcessing/NonlinearRegression.py deleted file mode 100644 index 5ff2459..0000000 --- a/src/main/resources/com.application/DataProcessing/NonlinearRegression.py +++ /dev/null @@ -1,3 +0,0 @@ -print("This line will be printed.") - -print(locals()) \ No newline at end of file diff --git a/src/main/resources/com.application/GUI/graphStyles.css b/src/main/resources/com.application/GUI/graphStyles.css new file mode 100644 index 0000000..bbef3d5 --- /dev/null +++ b/src/main/resources/com.application/GUI/graphStyles.css @@ -0,0 +1,23 @@ + +.chart-series-line { + -fx-stroke-width: 7px; + -fx-effect: null; +} + +.default-color0.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0} +.default-color1.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color2.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color3.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color4.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color5.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color6.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color7.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} + +.default-color0.chart-line-symbol{-fx-background-color: green,green;} +.default-color1.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} diff --git a/src/main/resources/com.application/GUI/graphical_user_interface.fxml b/src/main/resources/com.application/GUI/graphical_user_interface.fxml deleted file mode 100644 index 4d8f5c5..0000000 --- a/src/main/resources/com.application/GUI/graphical_user_interface.fxml +++ /dev/null @@ -1,96 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<?import javafx.scene.chart.CategoryAxis?> -<?import javafx.scene.chart.LineChart?> -<?import javafx.scene.chart.NumberAxis?> -<?import javafx.scene.control.Button?> -<?import javafx.scene.control.Label?> -<?import javafx.scene.control.Menu?> -<?import javafx.scene.control.MenuBar?> -<?import javafx.scene.control.MenuItem?> -<?import javafx.scene.control.TextField?> -<?import javafx.scene.image.Image?> -<?import javafx.scene.image.ImageView?> -<?import javafx.scene.layout.AnchorPane?> -<?import javafx.scene.layout.BorderPane?> -<?import javafx.scene.layout.VBox?> -<?import javafx.scene.text.Font?> - -<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1"> - <left> - <VBox prefHeight="200.0" prefWidth="150.0" BorderPane.alignment="CENTER"> - <children> - <Label prefHeight="17.0" prefWidth="150.0" text="Tree Species" /> - <TextField /> - <Label prefHeight="17.0" prefWidth="150.0" text="Width x Height" /> - <TextField /> - <Label prefHeight="17.0" prefWidth="150.0" text="Sawsett" /> - <TextField /> - <Label prefHeight="17.0" prefWidth="150.0" text="Desired moisture level" /> - <TextField /> - <Button mnemonicParsing="false" prefHeight="25.0" prefWidth="150.0" text="Finish" /> - </children> - </VBox> - </left> - <center> - <LineChart BorderPane.alignment="CENTER"> - <xAxis> - <CategoryAxis label="Time" side="BOTTOM" /> - </xAxis> - <yAxis> - <NumberAxis label="Kwh" side="LEFT" upperBound="25000.0"> - <tickLabelFont> - <Font name="Arial" size="10.0" /> - </tickLabelFont> - </NumberAxis> - </yAxis> - </LineChart> - </center> - <top> - <BorderPane prefHeight="80.0" prefWidth="700.0" BorderPane.alignment="CENTER"> - <center> - <AnchorPane prefHeight="78.0" prefWidth="700.0" style="-fx-background-color: rgba(12, 76, 81, 1);" BorderPane.alignment="CENTER"> - <children> - <BorderPane prefHeight="50.0" prefWidth="700.0"> - <left> - <ImageView fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true" translateX="5.0" BorderPane.alignment="CENTER"> - <image> - <Image url="@moelven_logo_m.png" /> - </image> - </ImageView> - </left> - <center> - <ImageView fitHeight="30.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true"> - <image> - <Image url="@moelven_logo_title.png" /> - </image> - </ImageView> - </center> - </BorderPane> - </children> - </AnchorPane> - </center> - <top> - <MenuBar prefHeight="25.0" prefWidth="700.0" BorderPane.alignment="CENTER"> - <menus> - <Menu mnemonicParsing="false" text="File"> - <items> - <MenuItem mnemonicParsing="false" text="Close" /> - </items> - </Menu> - <Menu mnemonicParsing="false" text="Edit"> - <items> - <MenuItem mnemonicParsing="false" text="Delete" /> - </items> - </Menu> - <Menu mnemonicParsing="false" text="Help"> - <items> - <MenuItem mnemonicParsing="false" text="About" /> - </items> - </Menu> - </menus> - </MenuBar> - </top> - </BorderPane> - </top> -</BorderPane> diff --git a/target/classes/com.application/DataProcessing/NonlinearRegression.py b/target/classes/com.application/DataProcessing/NonlinearRegression.py deleted file mode 100644 index 5ff2459..0000000 --- a/target/classes/com.application/DataProcessing/NonlinearRegression.py +++ /dev/null @@ -1,3 +0,0 @@ -print("This line will be printed.") - -print(locals()) \ No newline at end of file diff --git a/target/classes/com.application/GUI/graphStyles.css b/target/classes/com.application/GUI/graphStyles.css new file mode 100644 index 0000000..bbef3d5 --- /dev/null +++ b/target/classes/com.application/GUI/graphStyles.css @@ -0,0 +1,23 @@ + +.chart-series-line { + -fx-stroke-width: 7px; + -fx-effect: null; +} + +.default-color0.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0} +.default-color1.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color2.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color3.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color4.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color5.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color6.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color7.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} + +.default-color0.chart-line-symbol{-fx-background-color: green,green;} +.default-color1.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} diff --git a/target/classes/com.application/GUI/graphical_user_interface.fxml b/target/classes/com.application/GUI/graphical_user_interface.fxml deleted file mode 100644 index 4d8f5c5..0000000 --- a/target/classes/com.application/GUI/graphical_user_interface.fxml +++ /dev/null @@ -1,96 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<?import javafx.scene.chart.CategoryAxis?> -<?import javafx.scene.chart.LineChart?> -<?import javafx.scene.chart.NumberAxis?> -<?import javafx.scene.control.Button?> -<?import javafx.scene.control.Label?> -<?import javafx.scene.control.Menu?> -<?import javafx.scene.control.MenuBar?> -<?import javafx.scene.control.MenuItem?> -<?import javafx.scene.control.TextField?> -<?import javafx.scene.image.Image?> -<?import javafx.scene.image.ImageView?> -<?import javafx.scene.layout.AnchorPane?> -<?import javafx.scene.layout.BorderPane?> -<?import javafx.scene.layout.VBox?> -<?import javafx.scene.text.Font?> - -<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1"> - <left> - <VBox prefHeight="200.0" prefWidth="150.0" BorderPane.alignment="CENTER"> - <children> - <Label prefHeight="17.0" prefWidth="150.0" text="Tree Species" /> - <TextField /> - <Label prefHeight="17.0" prefWidth="150.0" text="Width x Height" /> - <TextField /> - <Label prefHeight="17.0" prefWidth="150.0" text="Sawsett" /> - <TextField /> - <Label prefHeight="17.0" prefWidth="150.0" text="Desired moisture level" /> - <TextField /> - <Button mnemonicParsing="false" prefHeight="25.0" prefWidth="150.0" text="Finish" /> - </children> - </VBox> - </left> - <center> - <LineChart BorderPane.alignment="CENTER"> - <xAxis> - <CategoryAxis label="Time" side="BOTTOM" /> - </xAxis> - <yAxis> - <NumberAxis label="Kwh" side="LEFT" upperBound="25000.0"> - <tickLabelFont> - <Font name="Arial" size="10.0" /> - </tickLabelFont> - </NumberAxis> - </yAxis> - </LineChart> - </center> - <top> - <BorderPane prefHeight="80.0" prefWidth="700.0" BorderPane.alignment="CENTER"> - <center> - <AnchorPane prefHeight="78.0" prefWidth="700.0" style="-fx-background-color: rgba(12, 76, 81, 1);" BorderPane.alignment="CENTER"> - <children> - <BorderPane prefHeight="50.0" prefWidth="700.0"> - <left> - <ImageView fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true" translateX="5.0" BorderPane.alignment="CENTER"> - <image> - <Image url="@moelven_logo_m.png" /> - </image> - </ImageView> - </left> - <center> - <ImageView fitHeight="30.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true"> - <image> - <Image url="@moelven_logo_title.png" /> - </image> - </ImageView> - </center> - </BorderPane> - </children> - </AnchorPane> - </center> - <top> - <MenuBar prefHeight="25.0" prefWidth="700.0" BorderPane.alignment="CENTER"> - <menus> - <Menu mnemonicParsing="false" text="File"> - <items> - <MenuItem mnemonicParsing="false" text="Close" /> - </items> - </Menu> - <Menu mnemonicParsing="false" text="Edit"> - <items> - <MenuItem mnemonicParsing="false" text="Delete" /> - </items> - </Menu> - <Menu mnemonicParsing="false" text="Help"> - <items> - <MenuItem mnemonicParsing="false" text="About" /> - </items> - </Menu> - </menus> - </MenuBar> - </top> - </BorderPane> - </top> -</BorderPane> diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class index f5909ab5d7a461cab06b56f7142d8e1181ed9157..63ce6b6ba5f67a9529377d76c676478db897eb76 100644 GIT binary patch delta 2109 zcmaE^Kf|E@)W2Q(7#J8#7+!HPSTM|BXPC*wzyzXaaWR-O%;sWXVVDCFnG0gg0}=B% z7#4s;7J@j7I2aa#=p`HsOF0;paWE|BU|7Myu#$se6$is=4u&;c3~L$IaWb$ltmk0Z zz`?MQgJBZ~!)6YKEg-S2T=fhr4BJ2kYzGlLI2d+vFzn)B*v-MP2c%#x2g5!Py`O{O z02jkShC^HohZ&B5SVuv^$2b^{gXj|=;v|ST1tLy^h%@XAXW1FfaWR}{xWL6=!f=tD z;SwVQcZk1>V`Ol=i(`l@BZH97#D59)f{rd;p}`^XL9XsWuED{c{(g)Mj4q4}yw3S~ z#U+V(C1Hs<rKxNVVhmuw$iNj4<nQI`91`#8!ohHPat)&v<CV?J8DB6lUfn!_WiBgo zK10D|11?jGYYf+U7-|{Hc^Gam+~i^C0kIkx${86r!xD3HQ%f?Fi+LDsG2G^1XaR{b zdzWYMFmy7MPoB%w$$f{1;TpqT9)?hcu*rtp_M$NiVLS|dAS3!g#3Yao*~tsIWG64; zwh~EW2xDa63`$MR0lSumA&Vhw@&|4S;d?v`_Zc3rGd$#Bc*O9Shv5ms)5+32zTD4v z7@jk{;9<yTc)7WlC!2{;ZSs9S(|RWcMh0gF1_mYu7Y0cNHwG&>-<?5{!Gpm8&i7=H zWbi_g_hyh}@IjOJMUv-dkYw;f;tMcHGWa9$1sNn60_u?jgcu|l0+IM443Z2%NPJNS zNrqq~3qu$rL4n1<$Pf<pKm>y%LnM-VDF#V~C?vi#gCs*V5?_`<lA%6^Aq>TUSR@PL z7$h0uku)eVNHQcK@s$}Q84{8BARi?m@j)I+M&he5NHU}#@l_cl>lsp!ECl%|4b4I6 zNE*}`BpEW0_#hu;BJn{!%0knhjU=DLAjy!6WM3YG4?hDFLq0<R10zEr0|SFG10w?? z0|NuA)^-NQjo?r%VqjnZWq$?+J_Z&B0fu4*1_mC8B8C!%QU(SFPKGjuat0=b!pS~@ zX1*ZxLJTYn3=C-u91Q6Uq6`@f$_$xseH;w33>6HO3=9laP?I1c)eH>Kc&uUI0%anw ziHRcOlb;EyAeoxaz`;<!Ai+?`putdtWU3NF9h#{ik$SkP4Gf$NjZk-n3+W=6SjND? zP|hI8P{AO@P>E!s2!@FuktVo_%?w<id<=HyMIoPhkk929*cliYY8f~f>KFtW>KUXM z8W@xr8X0sLni(t^T98aPW@troFGvL0bWVmghIWwY3=9l1;1FkEVA;eVv4Mesfsp}Z z8yi@(0}^gL3>^$ypwa}SW%3GPvp|p%F$Pu!28JF64u)O^L54mCDTaOqWrj&e4v}T( zLURa61l1wk5Qj|G7ZH^OnF_IZ8pL9-y*<#NO%$<43fegg91L?ABpBu~XfVu2vQvqn z7tKzP2x?^YK}~!qf*e_k88{f0FbFa%WsqW6hGZfrYETmuNCepzTnznC6E6yBP3{#{ zLW;0e3>*xr83Y;DFi0`1Wl&~V$DqTofx(htBa#iq3=`1Y3=%=Mfs<h(B%DwqObtE4 zwnD-U5@C~|j<OO%j<B5!91Ob{1Q~WSNHOeTP-fVN<Pceg$!HD%iJ&@U3dA9k4~ij2 z*dd6;3>^#{3{xSQe)4BAJw}$vO5#0?MU&TyD~g*lxG~r>q%(vvbTGs)FfvR7mjcrP DL7F)G delta 2074 zcmbPX@La$C)W2Q(7#J8#7@l!4STIasXPC;xzyzYFaWR-OOy^=?VVD6DnF(Ue0ui%0 z80LUP=7Ko$I2h)G=mi`M3pp4TaWE|AU|7Pzu#|&g83)614u%z63@aH{aWb$ltma@? z!@;nYgJB&9!+H*e4Ir_NT=fhr44Xg(Yz7fqI2g8aFl^&s*v`SQ1EgRl2g5E9y_<t! z4;RB;hJ9QN`xy>^SO-DEhd3AxgXkk5;wXqX1|p7wh!gA#C)pWJaWR}`IK#zY!f=+I z;T$6acZk1>V`Ol=i(`l@BZH97#D58LTmeD;Uarm|@t!V>47|?ydBr7(c_m?qIi;x_ z4Cg1$Wz=H4u=xbz3ns>kn>Vt|Wo6E0$eA3-WomJW;W7_HB||X}!xe_BJPaKmRxLv@ zBLinxVoq*qNoH~}55qNv>pTn%AW>%T@(dn^R)*rq`?xx}Z}2c&Vz|k}5XcZTIf&a{ zG=d?BhoK8(L^p`&1L=^Re2`0a@?mZ(ktBv7Mh4EH)WjUHyLcGV7=k7X@<<5Z;$gVW zaEG1YE)T;!hWk7W4;UU!w&C&Re#FD@nBfTzLpH<H%~N=?nHW_k@tf9LF)%VXF)%PN zF*q|wGPp1}!1=BWk_>JP2zhq~Nd^xzc~2yHeg;VfFC@MIgCv7D5?_!(lEDXwFT^0p z;9HL*Ai^NY;D^K)Wsqd>N3t-0K@t=;42%rHU<ZdVNHT;Xsh47qWC%mzOEX9^gd_1~ z86+7Z7=lpr*GD2*5XB(L5RIfki9wPf28plCAjuGm#0U8(4v7!)Q9Ke~g+Y=b0g125 zAjy!3WM2S-WIaO?nv0T=G^jI3GNd5!K|V@F;)8sYhNeFqNj`%?k|7hx!Yl@U1}27V zh8zY)hFk^)24e;rMg~R(1_oBG?F@_?!J(SRz`y{?%nS^C3@i)+4EYQU3_K7;3<V5@ z3=9mM3`GpZ3``8UlWPUdd_n4k7+4q>7?K${7*ZHS8B!UP8PeeTI2dFZN*GER7#PZ+ zCP75X85p4PSi!&r$}=DnCka_28JNSs!H~-!!H~zG!H|z+pb|qBnt>pZYPf+l44e$L zP$zZ>=^~j}%)r4=!XU^{${@v1hGe1$hKV4NI=G4T3|ycb3v%M*DWY1Fb%d4bK^~W5 zU}s=psAAw?sAdpks9}&|sAW)QsAJG!Xkf5pXhgEXn4uBP%^(qE8#o!77@9#gFfcI4 zfCHR?fn^he#0CZi21W*uZERrCR!Fe%Ftjjmfyxe$mdQ7T%>qG6#28o^7#KPkI2gJZ z1R1&+q!@Y_lo|Sw93somhUO5E2&zNcAr6_GAR;OYG8JO+WQfIJdpjV(J4r}<@=6gE zq!6CTz`-z!L4sj6g9gJKBx{uzI?=2JiJ-<=7sSxXQliLlwt#_yVIhMc!y*PLhQ&xG zf?^0YS%E~5J;KG%4K;C!s1H(nEob0hSivC3u#!QFVHJZi!)gW{hP4cq4C|0gH)iNT zb1z5)*>p~ZUPv&Z#+Mp;d~JdR8zjE^pbp9wGXpya5?|XGI2g7w2r}$okYd=$pv<rv z$sw`~{b&vWiJ&@U0yc+epgUwg#32kV3>*v-8FE-ag}`JLaXm)1$-&}1jCqqEh%1Vl YFt{<;Fr+gCF?29QGB7es0v8IC0bpAx=Kufz diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index 9d33fb5ed445c83a81f92756eb4ca1881531e601..81a03bb8dbe778db793157c21df0e3c30776a0df 100644 GIT binary patch delta 4043 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 JF&t&%1OURkVBP=# delta 3742 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 a2Py^`^%;&bFfed2Ff#BlG%*}u;{*T=ULNlN diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class index 074d021597c64fa7a2a3e9ef449d69717f744a45..319d3a1d0580e0b3b0197b741a90a29fc96b1028 100644 GIT binary patch delta 5954 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 delta 4710 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 -- GitLab