mirror of
https://github.com/rememberber/MooTool.git
synced 2026-09-19 10:46:38 +08:00
新增Java、Groovy编译执行器,在MooTool工具中可简单执行Java或Groovy代码
This commit is contained in:
@@ -45,6 +45,7 @@
|
||||
<oshi-core.version>6.4.6</oshi-core.version>
|
||||
<jfa.version>1.2.0</jfa.version>
|
||||
<versioncompare.version>1.5.0</versioncompare.version>
|
||||
<groovy.version>4.0.15</groovy.version>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
@@ -260,6 +261,12 @@
|
||||
<artifactId>versioncompare</artifactId>
|
||||
<version>${versioncompare.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.groovy</groupId>
|
||||
<artifactId>groovy</artifactId>
|
||||
<version>${groovy.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -154,6 +154,15 @@
|
||||
<border type="none"/>
|
||||
<children/>
|
||||
</grid>
|
||||
<grid id="679bb" binding="javaConsolePanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<tabbedpane title="java"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children/>
|
||||
</grid>
|
||||
</children>
|
||||
</tabbedpane>
|
||||
</children>
|
||||
|
||||
@@ -39,6 +39,7 @@ public class MainWindow {
|
||||
private JPanel cronPanel;
|
||||
private JPanel regexPanel;
|
||||
private JPanel imagePanel;
|
||||
private JPanel javaConsolePanel;
|
||||
|
||||
private static MainWindow mainWindow;
|
||||
|
||||
@@ -76,7 +77,7 @@ public class MainWindow {
|
||||
mainWindow.getTabbedPane().setIconAt(12, new FlatSVGIcon("icon/translate.svg"));
|
||||
mainWindow.getTabbedPane().setIconAt(13, new FlatSVGIcon("icon/schedule.svg", 15, 15));
|
||||
mainWindow.getTabbedPane().setIconAt(14, new FlatSVGIcon("icon/reg.svg"));
|
||||
|
||||
mainWindow.getTabbedPane().setIconAt(15, new FlatSVGIcon("icon/java.svg", 15, 15));
|
||||
|
||||
mainWindow.getQuickNotePanel().add(QuickNoteForm.getInstance().getQuickNotePanel(), gridConstraints);
|
||||
mainWindow.getJsonBeautyPanel().add(JsonBeautyForm.getInstance().getJsonBeautyPanel(), gridConstraints);
|
||||
@@ -93,6 +94,7 @@ public class MainWindow {
|
||||
mainWindow.getCronPanel().add(CronForm.getInstance().getCronPanel(), gridConstraints);
|
||||
mainWindow.getRegexPanel().add(RegexForm.getInstance().getRegexPanel(), gridConstraints);
|
||||
mainWindow.getImagePanel().add(ImageForm.getInstance().getImagePanel(), gridConstraints);
|
||||
mainWindow.getJavaConsolePanel().add(JavaConsoleForm.getInstance().getJavaConsolePanel(), gridConstraints);
|
||||
mainWindow.getMainPanel().updateUI();
|
||||
|
||||
TabListener.addListeners();
|
||||
@@ -163,6 +165,9 @@ public class MainWindow {
|
||||
regexPanel = new JPanel();
|
||||
regexPanel.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
|
||||
tabbedPane.addTab("正则", new ImageIcon(getClass().getResource("/icon/reg.png")), regexPanel);
|
||||
javaConsolePanel = new JPanel();
|
||||
javaConsolePanel.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
|
||||
tabbedPane.addTab("java", javaConsolePanel);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.luoboduner.moo.tool.ui.form.func.JavaConsoleForm">
|
||||
<grid id="27dc6" binding="javaConsolePanel" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="12" left="12" bottom="12" right="12"/>
|
||||
<constraints>
|
||||
<xy x="26" y="46" width="494" height="567"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<grid id="5956" layout-manager="GridLayoutManager" row-count="1" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="10" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="804be" class="javax.swing.JButton" binding="clean">
|
||||
<constraints>
|
||||
<grid row="0" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="清除"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="54894" class="javax.swing.JButton" binding="run">
|
||||
<constraints>
|
||||
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="执行"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="8d9f4" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<font size="14"/>
|
||||
<text value="输入Java或groovy代码点击执行即可"/>
|
||||
</properties>
|
||||
</component>
|
||||
<hspacer id="73c3d">
|
||||
<constraints>
|
||||
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
</hspacer>
|
||||
</children>
|
||||
</grid>
|
||||
<splitpane id="76c59">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false">
|
||||
<preferred-size width="200" height="200"/>
|
||||
</grid>
|
||||
</constraints>
|
||||
<properties>
|
||||
<continuousLayout value="false"/>
|
||||
<dividerLocation value="500"/>
|
||||
<dividerSize value="3"/>
|
||||
</properties>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<scrollpane id="7a589">
|
||||
<constraints>
|
||||
<splitpane position="left"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="61044" class="javax.swing.JTextArea" binding="codeArea">
|
||||
<constraints/>
|
||||
<properties>
|
||||
<background color="-3608620"/>
|
||||
<font name="Consolas" size="16"/>
|
||||
<text value=""/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</scrollpane>
|
||||
<scrollpane id="8cb4d">
|
||||
<constraints>
|
||||
<splitpane position="right"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="286fe" class="javax.swing.JTextArea" binding="resultArea">
|
||||
<constraints/>
|
||||
<properties>
|
||||
<background color="-820"/>
|
||||
<editable value="false"/>
|
||||
<font name="Consolas" size="16"/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</scrollpane>
|
||||
</children>
|
||||
</splitpane>
|
||||
</children>
|
||||
</grid>
|
||||
</form>
|
||||
@@ -0,0 +1,136 @@
|
||||
package com.luoboduner.moo.tool.ui.form.func;
|
||||
|
||||
import com.alibaba.fastjson2.util.IOUtils;
|
||||
import com.intellij.uiDesigner.core.GridConstraints;
|
||||
import com.intellij.uiDesigner.core.GridLayoutManager;
|
||||
import com.intellij.uiDesigner.core.Spacer;
|
||||
import com.luoboduner.moo.tool.App;
|
||||
import com.luoboduner.moo.tool.ui.listener.func.JavaConsoleListener;
|
||||
import groovy.lang.GroovyShell;
|
||||
import groovy.lang.Script;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.FontUIResource;
|
||||
import javax.swing.text.StyleContext;
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.*;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@Getter
|
||||
public class JavaConsoleForm {
|
||||
private JPanel javaConsolePanel;
|
||||
private JButton run;
|
||||
private JButton clean;
|
||||
private JTextArea codeArea;
|
||||
private JTextArea resultArea;
|
||||
private static JavaConsoleForm javaConsoleForm;
|
||||
|
||||
public JavaConsoleForm() {
|
||||
$$$setupUI$$$();
|
||||
init();
|
||||
}
|
||||
|
||||
public static JavaConsoleForm getInstance() {
|
||||
if (null == javaConsoleForm) {
|
||||
javaConsoleForm = new JavaConsoleForm();
|
||||
}
|
||||
return javaConsoleForm;
|
||||
}
|
||||
|
||||
private void init() {
|
||||
new JavaConsoleListener(getRun(), getClean(), getCodeArea(), getResultArea())
|
||||
.addListener();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method generated by IntelliJ IDEA GUI Designer
|
||||
* >>> IMPORTANT!! <<<
|
||||
* DO NOT edit this method OR call it in your code!
|
||||
*
|
||||
* @noinspection ALL
|
||||
*/
|
||||
private void $$$setupUI$$$() {
|
||||
javaConsolePanel = new JPanel();
|
||||
javaConsolePanel.setLayout(new GridLayoutManager(2, 1, new Insets(12, 12, 12, 12), -1, -1));
|
||||
final JPanel panel1 = new JPanel();
|
||||
panel1.setLayout(new GridLayoutManager(1, 4, new Insets(10, 0, 0, 0), -1, -1));
|
||||
javaConsolePanel.add(panel1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, 1, 1, null, null, null, 0, false));
|
||||
clean = new JButton();
|
||||
clean.setText("清除");
|
||||
panel1.add(clean, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
|
||||
run = new JButton();
|
||||
run.setText("执行");
|
||||
panel1.add(run, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
|
||||
final JLabel label1 = new JLabel();
|
||||
Font label1Font = this.$$$getFont$$$(null, -1, 14, label1.getFont());
|
||||
if (label1Font != null) label1.setFont(label1Font);
|
||||
label1.setText("输入Java或groovy代码点击执行即可");
|
||||
panel1.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
|
||||
final Spacer spacer1 = new Spacer();
|
||||
panel1.add(spacer1, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
|
||||
final JSplitPane splitPane1 = new JSplitPane();
|
||||
splitPane1.setContinuousLayout(false);
|
||||
splitPane1.setDividerLocation(500);
|
||||
splitPane1.setDividerSize(3);
|
||||
javaConsolePanel.add(splitPane1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(200, 200), null, 0, false));
|
||||
final JScrollPane scrollPane1 = new JScrollPane();
|
||||
splitPane1.setLeftComponent(scrollPane1);
|
||||
codeArea = new JTextArea();
|
||||
codeArea.setBackground(new Color(-3608620));
|
||||
Font codeAreaFont = this.$$$getFont$$$("Consolas", -1, 16, codeArea.getFont());
|
||||
if (codeAreaFont != null) codeArea.setFont(codeAreaFont);
|
||||
codeArea.setText("");
|
||||
scrollPane1.setViewportView(codeArea);
|
||||
final JScrollPane scrollPane2 = new JScrollPane();
|
||||
splitPane1.setRightComponent(scrollPane2);
|
||||
resultArea = new JTextArea();
|
||||
resultArea.setBackground(new Color(-820));
|
||||
resultArea.setEditable(false);
|
||||
Font resultAreaFont = this.$$$getFont$$$("Consolas", -1, 16, resultArea.getFont());
|
||||
if (resultAreaFont != null) resultArea.setFont(resultAreaFont);
|
||||
scrollPane2.setViewportView(resultArea);
|
||||
}
|
||||
|
||||
/**
|
||||
* @noinspection ALL
|
||||
*/
|
||||
private Font $$$getFont$$$(String fontName, int style, int size, Font currentFont) {
|
||||
if (currentFont == null) return null;
|
||||
String resultName;
|
||||
if (fontName == null) {
|
||||
resultName = currentFont.getName();
|
||||
} else {
|
||||
Font testFont = new Font(fontName, Font.PLAIN, 10);
|
||||
if (testFont.canDisplay('a') && testFont.canDisplay('1')) {
|
||||
resultName = fontName;
|
||||
} else {
|
||||
resultName = currentFont.getName();
|
||||
}
|
||||
}
|
||||
Font font = new Font(resultName, style >= 0 ? style : currentFont.getStyle(), size >= 0 ? size : currentFont.getSize());
|
||||
boolean isMac = System.getProperty("os.name", "").toLowerCase(Locale.ENGLISH).startsWith("mac");
|
||||
Font fontWithFallback = isMac ? new Font(font.getFamily(), font.getStyle(), font.getSize()) : new StyleContext().getFont(font.getFamily(), font.getStyle(), font.getSize());
|
||||
return fontWithFallback instanceof FontUIResource ? fontWithFallback : new FontUIResource(fontWithFallback);
|
||||
}
|
||||
|
||||
/**
|
||||
* @noinspection ALL
|
||||
*/
|
||||
public JComponent $$$getRootComponent$$$() {
|
||||
return javaConsolePanel;
|
||||
}
|
||||
|
||||
private void createUIComponents() {
|
||||
// TODO: place custom component creation code here
|
||||
Component component = getJavaConsolePanel().getComponent(1);
|
||||
((JSplitPane) component).setDividerLocation((int) (App.mainFrame.getWidth() / 5));
|
||||
}
|
||||
}
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
package com.luoboduner.moo.tool.ui.listener.func;
|
||||
|
||||
import com.luoboduner.moo.tool.ui.form.func.TimeConvertForm;
|
||||
import groovy.lang.GroovyShell;
|
||||
import groovy.lang.Script;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.*;
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@Getter
|
||||
public class JavaConsoleListener {
|
||||
|
||||
private static String TMP_FILE = System.getProperty("java.io.tmpdir") + File.separator + "temp.groovy";
|
||||
private StringBuffer log;
|
||||
|
||||
private JButton run;
|
||||
private JButton clean;
|
||||
|
||||
private JTextArea codeArea;
|
||||
private JTextArea resultArea;
|
||||
|
||||
public JavaConsoleListener(JButton run, JButton clean, JTextArea codeArea, JTextArea resultArea) {
|
||||
this.run = run;
|
||||
this.clean = clean;
|
||||
this.codeArea = codeArea;
|
||||
this.resultArea = resultArea;
|
||||
this.log = new StringBuffer();
|
||||
}
|
||||
|
||||
public void addListener() {
|
||||
this.executeClickEventListener();
|
||||
this.cleanClickEventListener();
|
||||
}
|
||||
|
||||
private void cleanClickEventListener() {
|
||||
this.clean.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
getResultArea().setText("");
|
||||
log = new StringBuffer();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void executeClickEventListener() {
|
||||
run.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
String code = getCodeArea().getText();
|
||||
if (StringUtils.isBlank(code)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
addStr("----- 当前执行时间:" + DateFormatUtils.format(new Date(), TimeConvertForm.TIME_FORMAT) + " -----");
|
||||
Object res = compileAndExecute(code);
|
||||
if (null != res) {
|
||||
addStr(res.toString());
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
logException(ex);
|
||||
}
|
||||
getResultArea().setText(log.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private Object compileAndExecute(String code) throws Exception {
|
||||
GroovyShell shell = new GroovyShell();
|
||||
File file = new File(TMP_FILE);
|
||||
if (!file.exists()) {
|
||||
file.createNewFile();
|
||||
}
|
||||
writeFile(file, code);
|
||||
Script parse = shell.parse(new FileReader(file));
|
||||
return changeOut(() -> parse.run());
|
||||
}
|
||||
|
||||
private void addStr(String str) {
|
||||
if (StringUtils.isNotBlank(str)) {
|
||||
log.append(str + "\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
private void writeFile(File file, String data) throws Exception {
|
||||
Objects.requireNonNull(file, "临时文件不能为空!");
|
||||
Objects.requireNonNull(data, "代码不能为空!");
|
||||
|
||||
try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
|
||||
fileOutputStream.write(data.getBytes());
|
||||
} catch (Exception e) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private <T> T changeOut(Supplier<T> supplier) {
|
||||
PrintStream oldStream = System.out;
|
||||
try (ByteArrayOutputStream tmpStream = new ByteArrayOutputStream(1024);
|
||||
PrintStream cacheStream = new PrintStream(tmpStream)) {
|
||||
System.setOut(cacheStream);
|
||||
T value = supplier.get();
|
||||
String strMsg = tmpStream.toString();
|
||||
addStr(strMsg);
|
||||
return value;
|
||||
} catch (Exception e) {
|
||||
logException(e);
|
||||
} finally {
|
||||
System.setOut(oldStream);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void logException(Throwable throwable) {
|
||||
try (StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter)) {
|
||||
throwable.printStackTrace(printWriter);
|
||||
addStr(stringWriter.toString());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="514pt" height="514pt" viewBox="0 0 514 514" style="" preserveAspectRatio="xMidYMid meet">
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 306.843 11.962 C 307.422 28.852 304.498 42.284 296.886 57.702 C 291.989 67.622 284.205 75.799 269.115 86.877 C 238.762 109.159 226.840 118.299 220.604 124.066 C 206.878 136.762 194.682 154.284 189.881 168.203 C 188.228 172.998 187.720 176.766 187.752 184.000 C 187.851 206.261 197.571 226.288 221.432 253.394 C 227.636 260.442 244.582 276.000 246.054 276.000 C 246.503 276.000 245.158 272.288 243.064 267.750 C 225.530 229.746 215.514 187.351 220.916 174.000 C 224.951 164.029 234.596 153.904 259.500 133.498 C 302.219 98.493 314.392 83.316 319.420 58.792 C 321.927 46.561 321.157 35.476 316.863 22.000 C 314.599 14.895 308.149 1.000 307.115 1.000 C 306.759 1.000 306.637 5.933 306.843 11.962 "/></g>
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 137.500 433.666 C 109.650 435.965 96.741 437.815 86.311 441.005 C 72.332 445.279 67.523 449.553 68.237 457.068 C 68.875 463.782 72.146 467.485 81.490 472.076 C 99.391 480.871 127.650 484.971 185.000 487.096 C 260.764 489.902 329.983 484.463 376.461 472.051 C 401.933 465.248 419.662 455.957 420.111 449.173 C 420.388 444.976 419.635 442.260 417.357 439.250 C 414.272 435.173 412.778 435.064 414.156 439.017 C 416.785 446.558 407.633 451.197 377.000 457.853 C 351.540 463.384 319.942 467.481 283.047 470.034 C 263.551 471.383 212.593 471.374 191.241 470.017 C 143.020 466.952 104.381 459.984 98.885 453.361 C 97.950 452.235 98.202 451.409 100.103 449.363 C 103.702 445.492 111.876 442.205 128.275 438.038 C 136.402 435.973 143.339 433.994 143.692 433.641 C 144.045 433.289 143.696 433.076 142.917 433.168 C 142.138 433.261 139.700 433.485 137.500 433.666 "/></g>
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 168.000 282.701 C 141.193 284.794 120.965 289.760 112.913 296.226 C 108.516 299.757 107.715 307.065 111.227 311.615 C 114.508 315.866 115.801 316.798 123.500 320.458 C 142.855 329.657 183.711 333.958 233.500 332.037 C 269.854 330.635 296.406 326.614 321.000 318.787 C 335.277 314.242 360.296 301.963 358.644 300.310 C 358.406 300.073 352.426 301.027 345.356 302.431 C 311.594 309.137 253.056 312.597 201.730 310.921 C 162.334 309.635 146.893 307.254 146.195 302.358 C 145.573 297.996 157.971 291.850 179.000 286.095 L 193.500 282.128 183.000 282.239 C 177.225 282.300 170.475 282.508 168.000 282.701 "/></g>
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 341.000 113.347 C 294.901 134.231 265.727 156.486 257.558 177.000 C 255.315 182.632 255.261 196.583 257.440 207.035 C 259.600 217.395 266.468 230.710 276.374 243.741 C 281.645 250.676 285.356 256.608 286.061 259.228 C 287.651 265.133 286.515 273.336 282.516 284.813 C 280.663 290.130 279.319 294.652 279.528 294.861 C 280.956 296.289 297.386 279.646 303.208 270.875 C 316.181 251.329 314.676 234.221 297.780 209.177 C 291.726 200.202 288.253 192.867 287.417 187.292 C 286.623 181.997 289.737 171.320 293.881 165.130 C 301.217 154.173 318.506 137.430 341.973 118.556 C 348.773 113.087 353.924 108.506 353.419 108.375 C 352.913 108.245 347.325 110.482 341.000 113.347 "/></g>
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 175.734 398.088 C 170.871 399.234 164.982 402.255 162.707 404.770 C 159.989 407.776 159.489 413.121 161.526 417.413 C 166.661 428.236 187.043 434.521 228.500 438.068 C 251.945 440.074 280.589 437.967 304.525 432.475 C 313.754 430.358 336.000 422.966 336.000 422.016 C 336.000 421.605 329.861 417.591 322.359 413.097 L 308.717 404.926 301.109 406.416 C 274.961 411.537 265.797 412.500 243.500 412.471 C 231.184 412.454 217.538 411.879 212.500 411.164 C 200.746 409.495 189.459 407.166 186.424 405.783 C 183.597 404.495 183.263 401.472 185.655 398.829 C 187.232 397.086 187.127 397.005 183.405 397.100 C 181.257 397.156 177.806 397.600 175.734 398.088 "/></g>
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 163.500 344.838 C 145.769 350.967 140.876 358.669 149.892 366.256 C 163.039 377.318 204.814 384.421 242.274 381.964 C 259.528 380.833 283.990 377.977 298.000 375.458 C 318.334 371.803 342.562 366.798 343.274 366.105 C 344.087 365.314 325.953 352.062 323.003 351.291 C 322.064 351.045 315.717 351.985 308.898 353.378 C 276.793 359.940 249.527 362.442 218.058 361.713 C 192.855 361.130 177.822 359.342 170.358 356.040 C 166.215 354.207 165.893 353.803 166.185 350.779 C 166.429 348.237 167.370 346.943 170.383 345.002 C 175.681 341.588 173.083 341.526 163.500 344.838 "/></g>
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 435.500 468.644 C 418.582 481.407 383.655 493.549 352.841 497.380 C 322.178 501.192 255.322 502.472 174.500 500.794 C 139.331 500.064 138.690 500.276 163.500 504.442 C 220.758 514.054 292.996 515.811 349.000 508.953 C 396.004 503.197 416.898 496.154 432.167 480.918 C 436.612 476.483 442.460 466.814 441.807 464.980 C 441.638 464.506 438.800 466.155 435.500 468.644 "/></g>
|
||||
<g fill="#010002FF" stroke="#010002FF">
|
||||
<path d="M 396.500 275.630 C 390.915 277.030 378.215 281.359 375.541 282.774 L 372.500 284.383 381.282 285.576 C 398.682 287.941 410.481 293.403 416.454 301.859 C 420.669 307.826 421.164 316.339 417.742 324.000 C 412.499 335.740 396.450 352.772 376.533 367.733 C 366.966 374.920 363.735 378.083 367.396 376.678 C 368.313 376.326 371.759 375.340 375.052 374.486 C 389.243 370.809 410.062 361.772 420.826 354.616 C 429.811 348.643 439.459 338.424 442.608 331.545 C 451.021 313.169 442.351 286.704 425.161 278.288 C 420.191 275.856 418.218 275.494 409.000 275.323 C 403.225 275.216 397.600 275.354 396.500 275.630 "/></g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.7 KiB |
Reference in New Issue
Block a user