From 7390de076cce0c29aad46711f04809ee1a4ca35a Mon Sep 17 00:00:00 2001
From: zhangmeng <1334717033@qq.com>
Date: Wed, 17 May 2023 16:41:05 +0800
Subject: [PATCH] =?UTF-8?q?2023=E5=B9=B45=E6=9C=8817=E6=97=A516:40:02?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 7 +
.../controller/CapterScreenController.java | 260 ++++++++++++++++++
.../controller/CodecToolsController.java | 34 ++-
.../tools/controller/HomeController.java | 4 +
.../tools/controller/HttpToolsController.java | 28 ++
.../controller/NetWorkToolsController.java | 28 ++
.../controller/SmallToolsController.java | 68 +++++
.../tools/controller/SqlToolsController.java | 44 +++
.../zhangmeng/tools/utils/ResourcesUtils.java | 1 +
src/main/resources/fxml/capter-screen.fxml | 16 ++
src/main/resources/fxml/codec-tools.fxml | 1 +
src/main/resources/fxml/home.fxml | 1 +
src/main/resources/fxml/http-tools.fxml | 20 +-
src/main/resources/fxml/network-tools.fxml | 19 +-
src/main/resources/fxml/small-tools.fxml | 16 +-
src/main/resources/fxml/sql-tools.fxml | 12 +
16 files changed, 543 insertions(+), 16 deletions(-)
create mode 100644 src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java
create mode 100644 src/main/resources/fxml/capter-screen.fxml
diff --git a/pom.xml b/pom.xml
index 265eb79..9c1d75a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -211,6 +211,13 @@
19
+
+
+ org.openjfx
+ javafx-swing
+ 19
+
+
com.github.leewyatt
rxcontrols
diff --git a/src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java b/src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java
new file mode 100644
index 0000000..aaf5138
--- /dev/null
+++ b/src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java
@@ -0,0 +1,260 @@
+package com.zhangmeng.tools.controller;
+
+import javafx.embed.swing.SwingFXUtils;
+import javafx.fxml.FXML;
+import javafx.geometry.Pos;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.image.ImageView;
+import javafx.scene.image.WritableImage;
+import javafx.scene.input.*;
+import javafx.scene.layout.*;
+import javafx.scene.paint.Paint;
+import javafx.stage.Stage;
+import javafx.stage.StageStyle;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+
+/**
+ * @author : 芊芊墨客
+ * @version : 1.0
+ * @date : 2023-05-17 14:29
+ */
+@Slf4j
+public class CapterScreenController {
+
+ @FXML
+ public Button bu;
+
+ @FXML
+ public AnchorPane iv_root;
+
+ @FXML
+ private ImageView iv; //切成的图片展示区域
+
+ private Stage primaryStage; //主舞台
+ private Stage stage; //切图时候的辅助舞台
+ private double start_x; //切图区域的起始位置x
+ private double start_y; //切图区域的起始位置y
+ private double w; //切图区域宽
+ private double h; //切图区域高
+ private HBox hBox; //切图区域
+
+
+ @FXML
+ public void initialize() {
+
+ iv_root.setBorder(new Border(new BorderStroke(Paint.valueOf("#c03700"), BorderStrokeStyle.SOLID,
+ null, new BorderWidths(1))));
+
+ //为点击截图按钮绑定事件
+ bu.setOnAction(event -> {
+ show();
+ });
+ //绑定截图快捷键,使用快捷键达到点击按钮的目的
+ KeyCombination keyCombination = KeyCombination.valueOf("ctrl+alt+p");
+
+ // 处理快捷键事件
+ Runnable action = this::show;
+
+ bu.setOnKeyPressed(event -> {
+ if (keyCombination.match(event)) {
+ action.run();
+ event.consume();
+ }
+ });
+ }
+
+ /**
+ * 显示截图操作舞台并绑定鼠标截图事件
+ */
+ public void show() {
+
+ this.primaryStage = (Stage) bu.getScene().getWindow();
+
+ //将主舞台缩放到任务栏
+ primaryStage.setIconified(true);
+ //创建辅助舞台,并设置场景与布局
+ stage = new Stage();
+ //锚点布局采用半透明
+ AnchorPane anchorPane = new AnchorPane();
+ anchorPane.setStyle("-fx-background-color: #85858522");
+ //场景设置白色全透明
+ Scene scene = new Scene(anchorPane);
+ scene.setFill(Paint.valueOf("#ffffff00"));
+ stage.setScene(scene);
+ //清楚全屏中间提示文字
+ stage.setFullScreenExitHint("");
+ stage.initStyle(StageStyle.TRANSPARENT);
+ stage.setFullScreen(true);
+ stage.show();
+
+ //切图窗口绑定鼠标按下事件
+ anchorPane.setOnMousePressed(event -> {
+ //清除锚点布局中所有子元素
+ anchorPane.getChildren().clear();
+ //创建切图区域
+ hBox = new HBox();
+ //设置背景保证能看到切图区域桌面
+ hBox.setBackground(null);
+ //设置边框
+ hBox.setBorder(new Border(new BorderStroke(Paint.valueOf("#c03700"), BorderStrokeStyle.SOLID,
+ null, new BorderWidths(1))));
+ anchorPane.getChildren().add(hBox);
+ //记录并设置起始位置
+ start_x = event.getSceneX();
+ start_y = event.getSceneY();
+ AnchorPane.setLeftAnchor(hBox, start_x);
+ AnchorPane.setTopAnchor(hBox, start_y);
+ });
+ //绑定鼠标按下拖拽的事件
+ anchorPane.setOnMouseDragged(event -> {
+ //用label记录切图区域的长宽
+ Label label = new Label();
+ label.setAlignment(Pos.CENTER);
+ label.setPrefHeight(30);
+ label.setPrefWidth(170);
+ anchorPane.getChildren().add(label);
+ AnchorPane.setLeftAnchor(label, start_x + 30);
+ AnchorPane.setTopAnchor(label, start_y);
+ label.setTextFill(Paint.valueOf("#ffffff"));//白色填充
+ label.setStyle("-fx-background-color: #000000");//黑背景
+ //计算宽高并且完成切图区域的动态效果
+ w = Math.abs(event.getSceneX() - start_x);
+ h = Math.abs(event.getSceneY() - start_y);
+ hBox.setPrefWidth(w);
+ hBox.setPrefHeight(h);
+ label.setText("宽:" + w + " 高:" + h);
+ });
+
+ //绑定鼠标松开事件
+ anchorPane.setOnMouseReleased(event -> {
+ //记录最终长宽
+ w = Math.abs(event.getSceneX() - start_x);
+ h = Math.abs(event.getSceneY() - start_y);
+ anchorPane.setStyle("-fx-background-color: #00000000");
+ //添加剪切按钮,并显示在切图区域的底部
+ Button b = new Button("剪切");
+ hBox.setBorder(new Border(new BorderStroke(Paint.valueOf("#85858544"), BorderStrokeStyle.SOLID,
+ null, new BorderWidths(1))));
+
+ //绑定截图快捷键,使用快捷键达到点击按钮的目的
+ KeyCombination keyCombination = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_DOWN);
+ Runnable action = () -> {
+ // 处理快捷键事件
+ //切图辅助舞台小时
+ stage.close();
+ try {
+ //切图具体方法
+ capterImg();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ //主舞台还原
+ primaryStage.setIconified(false);
+ };
+ b.setOnKeyPressed(e -> {
+ if (keyCombination.match(e)) {
+ action.run();
+ e.consume();
+ }
+ });
+
+ hBox.getChildren().add(b);
+ hBox.setAlignment(Pos.BOTTOM_RIGHT);
+ //为切图按钮绑定切图事件
+ b.setOnAction(event1 -> {
+ //切图辅助舞台小时
+ stage.close();
+ try {
+ //切图具体方法
+ capterImg();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ //主舞台还原
+ primaryStage.setIconified(false);
+ });
+ });
+
+ scene.setOnKeyPressed(event -> {
+ if (event.getCode() == KeyCode.ESCAPE) {
+ stage.close();
+ primaryStage.setIconified(false);
+ }
+ });
+ }
+ /**
+ * 处理截屏与图像的保存
+ *
+ * @throws Exception
+ */
+ public void capterImg() throws Exception {
+ //利用awt中的方法,通过记录的起始点和长宽完成屏幕截图
+ Robot robot = new Robot();
+ Rectangle re = new Rectangle((int) start_x, (int) start_y, (int) w, (int) h);
+ BufferedImage screenCapture = robot.createScreenCapture(re);
+ //截图图片背景透明处理
+ //BufferedImage bufferedImage = transferAlpha(screenCapture);
+ //不进行背景透明处理
+ //转换图片格式展示在主舞台的场景中
+ WritableImage writableImage = SwingFXUtils.toFXImage(screenCapture, null);
+
+ iv.setFitWidth(iv_root.getPrefWidth() + 150);
+ iv.setFitHeight(iv_root.getPrefHeight() + 120 );
+
+ iv.setImage(writableImage);
+
+ //将截图内容,放入系统剪切板
+ Clipboard cb = Clipboard.getSystemClipboard();
+ ClipboardContent content = new ClipboardContent();
+ content.putImage(writableImage);
+ cb.setContent(content);
+
+ //将截取图片放入到系统固定位置
+ ImageIO.write(screenCapture, "png", new File("E:/capter.png"));
+
+ }
+
+ /**
+ * 背景透明处理
+ *
+ * @param img
+ * @return
+ */
+ public static BufferedImage transferAlpha(BufferedImage img) {
+ BufferedImage bufferedImage = null;
+ try {
+ //取左上角点作为背景点
+ int RGB = img.getRGB(img.getMinX(), img.getMinY());
+ int R = (RGB & 0xff0000) >> 16;
+ int G = (RGB & 0xff00) >> 8;
+ int B = (RGB & 0xff);
+ bufferedImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
+ for (int j1 = img.getMinY(); j1 < img.getHeight(); j1++) {
+ //遍历一行中的rgb三通道像素点,
+ for (int j2 = img.getMinX(); j2 < img.getWidth(); j2++) {
+ //获取固定点的rgb值
+ int rgb = img.getRGB(j2, j1);
+ int r = (rgb & 0xff0000) >> 16;
+ int g = (rgb & 0xff00) >> 8;
+ int b = (rgb & 0xff);
+ if ((Math.abs(r - R) < 15) && (Math.abs(g - G) < 15) && (Math.abs(b - B) < 15)) {
+ rgb = (1 << 24) | (rgb & 0x00ffffff);
+ }
+ //设置固定点的rgb值
+ bufferedImage.setRGB(j2, j1, rgb);
+ }
+
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return bufferedImage;
+ }
+}
diff --git a/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java b/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java
index da5b5ef..1e54f09 100644
--- a/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java
@@ -564,26 +564,50 @@ public class CodecToolsController {
}
public void jks_file_menu_item(ActionEvent event) {
-
+ load_encrypt(2);
}
public void music_parser_menu_item(ActionEvent event) {
-
+ load_player(3);
}
public void word_ocr_menu_item(ActionEvent event) {
-
+ load_small_tools(11);
}
public void bar_code_menu_item(ActionEvent event) {
-
+ load_small_tools(12);
}
public void pdf_menu_item(ActionEvent event) {
-
+ load_small_tools(13);
}
public void batch_update_file_name_menu_item(ActionEvent event) {
+ load_small_tools(14);
+ }
+ public void capter_screen_menu_item(ActionEvent event) {
+ load_small_tools(15);
+ }
+
+ public void json_javabean_gen_menu_item(ActionEvent event) {
+ load_sql_tools(2);
+ }
+
+ public void socket_client_aio_menu_item(ActionEvent event) {
+ load_server_tools(4);
+ }
+
+ public void socket_server_aio_menu_item(ActionEvent event) {
+ load_server_tools(5);
+ }
+
+ public void socket_server_nio_menu_item(ActionEvent event) {
+ load_server_tools(6);
+ }
+
+ public void socket_client_nio_menu_item(ActionEvent event) {
+ load_server_tools(7);
}
}
diff --git a/src/main/java/com/zhangmeng/tools/controller/HomeController.java b/src/main/java/com/zhangmeng/tools/controller/HomeController.java
index 6676d32..724c7e7 100644
--- a/src/main/java/com/zhangmeng/tools/controller/HomeController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/HomeController.java
@@ -562,4 +562,8 @@ public class HomeController implements Serializable {
public void socket_client_nio_menu_item(ActionEvent event) {
load_server_tools(7);
}
+
+ public void capter_screen_menu_item(ActionEvent event) {
+ load_small_tools(14);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java b/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java
index aad06b3..fa52243 100644
--- a/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java
@@ -498,4 +498,32 @@ public class HttpToolsController {
public void maven_jar_install_menu_item(ActionEvent event) {
load_small_tools(10);
}
+
+ public void jks_file_menu_item(ActionEvent event) {
+ load_encrypt(2);
+ }
+
+ public void music_parser_menu_item(ActionEvent event) {
+ load_player(3);
+ }
+
+ public void word_ocr_menu_item(ActionEvent event) {
+ load_small_tools(11);
+ }
+
+ public void bar_code_menu_item(ActionEvent event) {
+ load_small_tools(12);
+ }
+
+ public void pdf_menu_item(ActionEvent event) {
+ load_small_tools(13);
+ }
+
+ public void batch_update_file_name_menu_item(ActionEvent event) {
+ load_small_tools(14);
+ }
+
+ public void capter_screen_menu_item(ActionEvent event) {
+ load_small_tools(15);
+ }
}
diff --git a/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java b/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java
index 313f29e..23534d1 100644
--- a/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java
@@ -430,4 +430,32 @@ public class NetWorkToolsController {
public void maven_jar_install_menu_item(ActionEvent event) {
load_small_tools(10);
}
+
+ public void jks_file_menu_item(ActionEvent event) {
+ load_encrypt_tools(2);
+ }
+
+ public void music_parser_menu_item(ActionEvent event) {
+ load_player(3);
+ }
+
+ public void word_ocr_menu_item(ActionEvent event) {
+ load_small_tools(11);
+ }
+
+ public void bar_code_menu_item(ActionEvent event) {
+ load_small_tools(12);
+ }
+
+ public void pdf_menu_item(ActionEvent event) {
+ load_small_tools(13);
+ }
+
+ public void batch_update_file_name_menu_item(ActionEvent event) {
+ load_small_tools(14);
+ }
+
+ public void capter_screen_menu_item(ActionEvent event) {
+ load_small_tools(15);
+ }
}
diff --git a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java
index 95525cd..8d4214e 100644
--- a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java
@@ -82,6 +82,7 @@ public class SmallToolsController {
private AnchorPane bar_code;
private AnchorPane pdf_ocr;
private AnchorPane batch_update_file_name;
+ private AnchorPane capter_screen;
@FXML
private ListView listView;
@@ -394,6 +395,20 @@ public class SmallToolsController {
}
pdf_ocr(flag);
}
+
+ if (newValue.getIndex() == 14) {
+ if (batch_update_file_name != null) {
+ flag = true;
+ }
+ batch_update_file_name(flag);
+ }
+
+ if (newValue.getIndex() == 15) {
+ if (capter_screen != null) {
+ flag = true;
+ }
+ capter_screen(flag);
+ }
}
});
}
@@ -418,6 +433,7 @@ public class SmallToolsController {
case Bar_Code -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
case Pdf_Ocr -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
case BatchUpdateFileName -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
+ case Capter_Screent -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
};
}
@@ -734,6 +750,22 @@ public class SmallToolsController {
common_method();
}
+ public void capter_screen(boolean flag){
+ //默认选择第一个
+ listView.getSelectionModel().select(15);
+
+ if (!flag) {
+ try {
+ root = FXMLLoader.load(ResourcesUtils.getResource("capter-screen"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ batch_update_file_name = root;
+ } else {
+ root = batch_update_file_name;
+ }
+ common_method();
+ }
private void common_method() {
splitPane.getItems().remove(1);
@@ -910,4 +942,40 @@ public class SmallToolsController {
}
pdf_ocr(flag);
}
+
+ public void capter_screen_menu_item(ActionEvent event) {
+ boolean flag = false;
+ if (capter_screen != null){
+ flag = true;
+ }
+ capter_screen(flag);
+ }
+
+ public void jks_file_menu_item(ActionEvent event) {
+ load_encrypt(2);
+ }
+
+ public void music_parser_menu_item(ActionEvent event) {
+ load_player(3);
+ }
+
+ public void json_javabean_gen_menu_item(ActionEvent event) {
+ load_mysql_tools(2);
+ }
+
+ public void socket_client_aio_menu_item(ActionEvent event) {
+ load_server_tools(4);
+ }
+
+ public void socket_server_aio_menu_item(ActionEvent event) {
+ load_server_tools(5);
+ }
+
+ public void socket_server_nio_menu_item(ActionEvent event) {
+ load_server_tools(6);
+ }
+
+ public void socket_client_nio_menu_item(ActionEvent event) {
+ load_server_tools(7);
+ }
}
diff --git a/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java b/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java
index 3f3197b..2ccfccd 100644
--- a/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java
@@ -506,4 +506,48 @@ public class SqlToolsController {
public void spring_security_menu_item(ActionEvent event) {
load_codec_tools(1);
}
+
+ public void jks_file_menu_item(ActionEvent event) {
+ load_codec_tools(2);
+ }
+
+ public void music_parser_menu_item(ActionEvent event) {
+ load_player(3);
+ }
+
+ public void word_ocr_menu_item(ActionEvent event) {
+ load_small_tools(11);
+ }
+
+ public void bar_code_menu_item(ActionEvent event) {
+ load_small_tools(12);
+ }
+
+ public void pdf_menu_item(ActionEvent event) {
+ load_small_tools(13);
+ }
+
+ public void batch_update_file_name_menu_item(ActionEvent event) {
+ load_small_tools(14);
+ }
+
+ public void capter_screen_menu_item(ActionEvent event) {
+ load_small_tools(15);
+ }
+
+ public void socket_client_aio_menu_item(ActionEvent event) {
+ load_server_tools(4);
+ }
+
+ public void socket_server_aio_menu_item(ActionEvent event) {
+ load_server_tools(5);
+ }
+
+ public void socket_server_nio_menu_item(ActionEvent event) {
+ load_server_tools(6);
+ }
+
+ public void socket_client_nio_menu_item(ActionEvent event) {
+ load_server_tools(7);
+ }
}
diff --git a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java
index 2875ed6..19ec9b9 100644
--- a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java
+++ b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java
@@ -130,6 +130,7 @@ public class ResourcesUtils {
Bar_Code("条形码识别", 12),
Pdf_Ocr("pdf识别", 13),
BatchUpdateFileName("批量修改文件名", 14),
+ Capter_Screent("截图", 15),
;
SmallTools(String title, int index) {
diff --git a/src/main/resources/fxml/capter-screen.fxml b/src/main/resources/fxml/capter-screen.fxml
new file mode 100644
index 0000000..d3b1834
--- /dev/null
+++ b/src/main/resources/fxml/capter-screen.fxml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/fxml/codec-tools.fxml b/src/main/resources/fxml/codec-tools.fxml
index b53ed8f..295f397 100644
--- a/src/main/resources/fxml/codec-tools.fxml
+++ b/src/main/resources/fxml/codec-tools.fxml
@@ -45,6 +45,7 @@
+
diff --git a/src/main/resources/fxml/home.fxml b/src/main/resources/fxml/home.fxml
index 8bc1fe3..cdba727 100644
--- a/src/main/resources/fxml/home.fxml
+++ b/src/main/resources/fxml/home.fxml
@@ -47,6 +47,7 @@
+
diff --git a/src/main/resources/fxml/http-tools.fxml b/src/main/resources/fxml/http-tools.fxml
index e53eb2c..fda8570 100644
--- a/src/main/resources/fxml/http-tools.fxml
+++ b/src/main/resources/fxml/http-tools.fxml
@@ -17,8 +17,9 @@
@@ -53,10 +60,11 @@
-
diff --git a/src/main/resources/fxml/network-tools.fxml b/src/main/resources/fxml/network-tools.fxml
index 28d5912..129fa22 100644
--- a/src/main/resources/fxml/network-tools.fxml
+++ b/src/main/resources/fxml/network-tools.fxml
@@ -17,8 +17,9 @@
-
+
+
+
@@ -26,6 +27,7 @@
+
@@ -41,6 +43,11 @@
+
+
+
+
+
@@ -53,9 +60,11 @@
-
+
+
+
@@ -73,6 +82,10 @@
+
+
+
+
diff --git a/src/main/resources/fxml/small-tools.fxml b/src/main/resources/fxml/small-tools.fxml
index a081e5a..eb68d82 100644
--- a/src/main/resources/fxml/small-tools.fxml
+++ b/src/main/resources/fxml/small-tools.fxml
@@ -15,8 +15,9 @@
-
+
+
+
@@ -24,6 +25,7 @@
+
@@ -43,6 +45,7 @@
+
@@ -55,10 +58,11 @@
-
+
+
@@ -74,8 +78,12 @@
-
+
+
+
+
+
diff --git a/src/main/resources/fxml/sql-tools.fxml b/src/main/resources/fxml/sql-tools.fxml
index be792c9..85939ef 100644
--- a/src/main/resources/fxml/sql-tools.fxml
+++ b/src/main/resources/fxml/sql-tools.fxml
@@ -18,6 +18,8 @@
+
+
@@ -25,6 +27,7 @@
+
@@ -40,6 +43,11 @@
+
+
+
+
+
@@ -74,6 +82,10 @@
+
+
+
+