Instruction:
作为 Java 安全专家，检测此代码中的安全漏洞：
## 内容1
### 文件路径：
CHANGELOG.MD
### 代码内容：
## 0.1-beta

初始版本

## 0.2-beta

Security:
- 修复潜在RCE漏洞 [GHSA-732j-763p-cvqg](https://github.com/4ra1n/super-xray/security/advisories/GHSA-732j-763p-cvqg)

Bug:
- [important] 复制和删除文件应该选择Java代码实现 #3
- [important] 最终执行命令不应该使用bash/cmd方式 #4
- [important] 使用PoC模式后再使用Plugins不会生效的问题 #5
- [important] Windows中cmd窗口乱码 #16

## 0.3-beta

该版本为**重大更新**

之前强制停止的逻辑并不能真正地停止，使用`kill/taskkill`命令才可以做到，该版本仅在`Mac OS`测试通过，在`Windows`中不确定。开一个新线程循环监听是否强制停止，如果收到消息立即结束。

Security:
- 修复潜在提权漏洞 [GHSA-2g28-xrw6-fq5f](https://github.com/4ra1n/super-xray/security/advisories/GHSA-2g28-xrw6-fq5f)

Bug:
- [important] 被动扫描后无法主动扫描的问题 #23
- [important] PoC参数为空的问题 #21
- [important] 被动扫描是否应该增加一个停止监听的功能 #20
- [important] windows11中高级配置的xss设置无法显示 #19
- [important] windows保存配置编码问题 #18
- [important] 完成真正的停止逻辑 #26（仅在MacOS测试通过）

Others:
- 打印命令应该用一个新的Form更优雅地展示 #9

## 0.4-beta

这个版本主要是提高稳定性，对已有`bug`进行修复，并且加入了两个重要：
- 皮肤选择功能，可以选择七款主题皮肤之一（需要操作系统支持）
- 保存上次xray设置的功能，不用每次打开都重新选择

Bug:
- [important] windows taskkill 命令 bug #29
- [important] 允许界面扩大缩小并重构高级配置的UI #28
- [important] 查看配置文件只改变Panel大小但Area不变 #31
- [important] windows 控制台乱码修复不完善 #27
- [important] 设置从上次配置自动加载xray #17
- [important] 反连平台支持token认证 #32

Others:
- 支持使用本地自定义PoC的功能 #6
- [new feature] 新增一个主题皮肤选择的功能 #11

## 0.5-beta

比较关键的问题是： 运行中无法访问已有的漏洞报告，因为采用的是`start/open`命令，报告被`xray`进程占用无法打开，但是可以读。
所以解决方案是复制一份实时的然后打开。其他方面是一些`UI`的小`bug`以及将日志输出到具体的文件，而不是全打在命令行。
输出的日志文件和所有产生的漏洞报告都可以在关闭软件的时候自动删除。

Bug:
- [important] 进程占导致无法打开被动扫描中的报告 #44
- [important] 换皮肤后一些按钮的背景色不应该是灰色 #42
- [important] 被动扫描可能会由于输出文件存在无法启动 #33
- 没有设置输出的情况下打开输出文件报错 #38

Others:
- [important] 添加一个跳转xray下载地址的按钮 #45
- [important] 添加start.bat和start.sh #41
- [new feature] 是否有必要提供一个下载按钮 #10 (采用 #45 的方案解决)
- 在Mac OS中如果保存了xray配置每次打开都会弹出提示 #36
- 皮肤RadioButton默认不该是空而应是当前皮肤 #37
- 应该将日志输出到临时文件并关闭后删除 #43
- 添加一个是否自动删除扫描报告的按钮 #39
- 增加一个清屏的按钮 #8

## 0.6-beta

支持了英文版本，修复了各种UI的问题

Bug:
- [important] 在1080P下界面无法完全显示 #46
- [important] 切换语言和皮肤时无法正确容纳UI #51
- [important] 关闭应用前应该先停止所有xray进程 #50
- 切换语言时无法正常显示PoC数量 #52
- 解析所有POC的逻辑有问题导致漏掉部分 #53

Others:
- [important] 添加一款现代皮肤IDEA同款 #54
- [new feature] english version #40
- #36问题的修复不完善 #47
- 打开扫描结果的Label与Button的UI不匹配 #48
- 点击底部Label跳转Github #49

## 0.7

该版本是第一个正式版，支持了`JDK8`的版本，当环境是`JDK8`时使用`JNA`技术访问`Native`方法，通过`Windows API`实现功能；
当环境是`JDK9+`时，反射调用方法即可。修复了一处功能`bug`并优先加载当前目录的`config.yaml`文件，不会删除，实现了保存设置功能。

另外提供了两种`exe`的下载：
- 内置`JRE`和`xray`的`exe`可以一键启动：`super-xray-0.7-jre-exe.zip`
- 调用系统`JRE`的`exe`：`super-xray-0.7-system-jre.exe`

第一种不需要安装任何环境，解压后直接使用；第二种需要本地`JAVA_HOME`或环境变量有配置`Java`

Bug:
- [important] 寻找一种能够支持JDK8的魔法 #61
- [important] 反连平台没有设置remote_server为true #57
- 不能支持JDK8的解决方案建议 #63 (同 #61)
- 使用IDEA皮肤时底部恢复按钮无法展示完全 #55

Others:
- [important] 配置文件无法保存每次都会新建 #58
- 优化启动脚本 #60 (最终没有优化因为支持了`JDK8`)

## 内容2
### 文件路径：
src/main/java/com/chaitin/xray/form/LookupConfigForm.java
### 代码内容：
package com.chaitin.xray.form;

import com.chaitin.xray.utils.StringUtil;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import org.yaml.snakeyaml.Yaml;

import javax.swing.*;
import java.awt.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class LookupConfigForm {
    public JPanel lookupConfigPanel;
    private JTextArea configTextArea;
    private JButton saveConfigButton;
    private JButton refreshConfigButton;
    private JScrollPane configTextPanel;
    private JPanel configButtonPanel;

    private void initLang() {
        if (MainForm.LANG == MainForm.CHINESE) {
            saveConfigButton.setText("保存配置文件");
            refreshConfigButton.setText("刷新最新配置文件");
        } else {
            saveConfigButton.setText("Save Config");
            refreshConfigButton.setText("Refresh Config");
        }
    }

    public LookupConfigForm() {

        initLang();

        configTextArea.setText(MainForm.configStr);
        configTextArea.setCaretPosition(0);

        refreshConfigButton.addActionListener(e -> {
            if (!StringUtil.notEmpty(MainForm.configPath)) {
                JOptionPane.showMessageDialog(null, "无法刷新");
                return;
            }
            try {
                byte[] data = Files.readAllBytes(Paths.get(MainForm.configPath));
                configTextArea.setText(null);
                configTextArea.setText(new String(data));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            JOptionPane.showMessageDialog(null, "已刷新配置");
        });

        saveConfigButton.addActionListener(e -> {
            if (!StringUtil.notEmpty(MainForm.configPath)) {
                JOptionPane.showMessageDialog(null, "无法保存");
                return;
            }
            try {
                Yaml yaml = new Yaml();
                String newConfig = configTextArea.getText();
                MainForm.configObj = yaml.load(newConfig);

                MainForm.configStr = newConfig;

                MainForm.instance.reloadConfig(false, false);

                Files.write(Paths.get(MainForm.configPath),
                        newConfig.getBytes(StandardCharsets.UTF_8));
                JOptionPane.showMessageDialog(null, "已保存配置");
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, "您的配置有误");
                ex.printStackTrace();
            }
        });
    }

    {
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
        $$$setupUI$$$();
    }

    /**
     * Method generated by IntelliJ IDEA GUI Designer
     * >>> IMPORTANT!! <<<
     * DO NOT edit this method OR call it in your code!
     *
     * @noinspection ALL
     */
    private void $$$setupUI$$$() {
        lookupConfigPanel = new JPanel();
        lookupConfigPanel.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1));
        lookupConfigPanel.setBackground(new Color(-725535));
        configTextPanel = new JScrollPane();
        configTextPanel.setBackground(new Color(-725535));
        lookupConfigPanel.add(configTextPanel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, new Dimension(600, 500), new Dimension(600, 500), null, 0, false));
        configTextArea = new JTextArea();
        configTextArea.setBackground(new Color(-725535));
        configTextArea.setForeground(new Color(-12828863));
        configTextPanel.setViewportView(configTextArea);
        configButtonPanel = new JPanel();
        configButtonPanel.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
        configButtonPanel.setBackground(new Color(-725535));
        lookupConfigPanel.add(configButtonPanel, 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, null, null, 0, false));
        saveConfigButton = new JButton();
        saveConfigButton.setText("保存配置文件");
        configButtonPanel.add(saveConfigButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        refreshConfigButton = new JButton();
        refreshConfigButton.setText("刷新最新配置文件");
        configButtonPanel.add(refreshConfigButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
    }

    /**
     * @noinspection ALL
     */
    public JComponent $$$getRootComponent$$$() {
        return lookupConfigPanel;
    }

}

## 内容3
### 文件路径：
src/main/java/com/chaitin/xray/form/MainForm.java
### 代码内容：
package com.chaitin.xray.form;

import com.chaitin.xray.Application;
import com.chaitin.xray.model.Const;
import com.chaitin.xray.model.DB;
import com.chaitin.xray.model.Poc;
import com.chaitin.xray.model.XrayCmd;
import com.chaitin.xray.utils.*;
import com.formdev.flatlaf.FlatLightLaf;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import com.intellij.uiDesigner.core.Spacer;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.yaml.snakeyaml.Yaml;

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.List;

public class MainForm {
    private static final Logger logger = LogManager.getLogger(MainForm.class);

    public static MainForm instance;
    private XrayCmd xrayCmd;
    public static String configStr;
    public static String configTemplate;
    public static String configPath;
    public static Map<String, Object> configObj;
    private static ArrayList<JCheckBox> checkBoxList;
    private static boolean pluginAll = false;
    private static String outputFilePath;
    private static final List<String> existOutputList = new ArrayList<>();
    private static DB db;

    private JButton choseDirButton;
    private JPanel SuperXray;
    private JPanel pathButtonPanel;
    private JLabel xrayPathLabel;
    private JTextField xrayPathTextField;
    private JLabel noteLabel;
    private JPanel configPanel;
    private JPanel bottomPanel;
    private JLabel authorLabel;
    private JPanel leftConfigPanel;
    private JPanel rightConfigPanel;
    private JPanel catConfigPanel;
    private JLabel catConfigLabel;
    private JPanel loadXrayPanel;
    private JCheckBox bruteForceCheckBox;
    private JCheckBox baselineCheckBox;
    private JCheckBox cmdInjectionCheckBox;
    private JCheckBox crlfInjectionCheckBox;
    private JCheckBox dirscanCheckBox;
    private JCheckBox fastjsonCheckBox;
    private JCheckBox jsonpCheckBox;
    private JCheckBox pathTraversalCheckBox;
    private JCheckBox phantasmCheckBox;
    private JCheckBox redirectCheckBox;
    private JCheckBox shiroCheckBox;
    private JCheckBox sqldetCheckBox;
    private JCheckBox ssrfCheckBox;
    private JCheckBox strutsCheckBox;
    private JCheckBox thinkphpCheckBox;
    private JCheckBox uploadCheckBox;
    private JCheckBox xxeCheckBox;
    private JCheckBox xssCheckBox;
    private JButton enableAllButton;
    private JButton advanceButton;
    private JButton reverseConfigButton;
    private JButton pocButton;
    private JButton activeScanButton;
    private JButton mitmScanButton;
    private JButton outputConfigButton;
    private JButton proxyConfigButton;
    private JPanel outputConfigPanel;
    private JScrollPane outputPanel;
    private JTextArea outputTextArea;
    private JPanel scanOutConfigPanel;
    private JRadioButton htmlRadioButton;
    private JRadioButton cliRadioButton;
    private JRadioButton jsonRadioButton;
    private JButton urlFileButton;
    private JTextField urlFileField;
    private JTextField rawFileField;
    private JButton rawFileButton;
    private JTextField urlField;
    private JButton urlButton;
    private JButton lookupConfigButton;
    private JButton lookupCmdButton;
    private JButton confirmPluginButton;
    private JPanel pocPanel;
    private JButton allPoCButton;
    private JTextField usePoCText;
    private JPanel scanTargetPanel;
    private JPanel proxyConfigPanel;
    private JPanel reverseConfigPanel;
    private JPanel startScanPanel;
    private JPanel otherPanel;
    private JPanel midConfigPanel;
    private JLabel pocNumLabel;
    private JTextField portText;
    private JLabel portLabel;
    private JPanel mitmPanel;
    private JTextField proxyText;
    private JLabel proxyLabel;
    private JPanel proxyPanel;
    private JTextField dnsText;
    private JTextField httpReverseText;
    private JPanel reverseUrlPanel;
    private JLabel httpReverseLabel;
    private JLabel dnsReverseLabel;
    private JButton stopButton;
    private JButton resetConfigButton;
    private JButton openResultButton;
    private JLabel stopLabel;
    private JLabel openResultLabel;
    private JLabel resetConfigLabel;
    private JPanel resetPanel;
    private JPanel openResultPanel;
    private JPanel stopPanel;
    private JPanel otherButton;
    private JPanel utilPanel;
    private JButton httpUtilButton;
    private JButton encodeUtilButton;
    private JButton listenUtilButton;
    private JButton updatePocButton;
    private JTextField localPoCText;
    private JButton localPoCButton;
    private JPanel skinPanel;
    private JButton saveSkinButton;
    private JRadioButton metalRadioButton;
    private JRadioButton flatLafRadioButton;
    private JRadioButton nimbusRadioButton;
    private JRadioButton windowsRadioButton;
    private JRadioButton winClassicRadioButton;
    private JRadioButton gtkRadioButton;
    private JRadioButton aquaRadioButton;
    private JTextField tokenText;
    private JLabel tokenLabel;
    private JCheckBox autoDelCheckBox;
    private JButton cleanAreaButton;
    private JButton xrayUrlButton;
    private JRadioButton chineseLangButton;
    private JRadioButton englishLangButton;
    private JButton langButton;

    public void init() {
        logger.info("init main form");
        checkBoxList = new ArrayList<>();
        xrayCmd = new XrayCmd();

        try {
            Path dbPath = Paths.get("super-xray.db");
            if (Files.exists(dbPath)) {
                byte[] data = Files.readAllBytes(dbPath);
                db = DB.parseDB(data);
            } else {
                db = new DB();
                db.setLastXrayPath(null);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        reloadConfig(true, false);

        logger.info("init look up config button");
        lookupConfigButton.addActionListener(e -> {
            String t;
            if (LANG == CHINESE) {
                t = "查看配置文件";
            } else {
                t = "Lookup Config";
            }
            JFrame frame = new JFrame(t);
            frame.setContentPane(new LookupConfigForm().lookupConfigPanel);
            frame.pack();
            frame.setVisible(true);
        });

        logger.info("init look up cmd button");
        lookupCmdButton.addActionListener(e ->
                JOptionPane.showMessageDialog(null, xrayCmd.buildCmd()));
    }

    @SuppressWarnings("unchecked")
    public void reloadConfig(boolean init, boolean reset) {
        Path curConfig = Paths.get("config.yaml");
        if (init) {
            if (reset) {
                InputStream is = this.getClass().getClassLoader().getResourceAsStream("config.yaml");
                configStr = IOUtil.readStringFromIs(is);
            } else {
                if (Files.exists(curConfig)) {
                    try {
                        configStr = new String(Files.readAllBytes(curConfig));
                    } catch (Exception ex) {
                        logger.error(ex);
                    }
                } else {
                    InputStream is = this.getClass().getClassLoader().getResourceAsStream("config.yaml");
                    configStr = IOUtil.readStringFromIs(is);
                }
            }
        } else {
            if (Files.exists(curConfig)) {
                try {
                    configStr = new String(Files.readAllBytes(curConfig));
                } catch (Exception ex) {
                    logger.error(ex);
                }
            }
        }
        configTemplate = configStr;

        Yaml yaml = new Yaml();
        configObj = yaml.load(configStr);

        try {
            if (StringUtil.notEmpty(configPath)) {
                Files.write(Paths.get(configPath),
                        configStr.getBytes(StandardCharsets.UTF_8));
                Files.write(curConfig,
                        configStr.getBytes(StandardCharsets.UTF_8));
            }
        } catch (Exception ex) {
            logger.error(ex);
        }

        for (Map.Entry<String, Object> entry : configObj.entrySet()) {
            if (entry.getKey().equals("plugins")) {
                Map<String, Object> plugins = (Map<String, Object>) entry.getValue();
                for (Map.Entry<String, Object> plugin : plugins.entrySet()) {
                    if (plugin.getKey().equals("baseline")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        baselineCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("brute-force")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        bruteForceCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("cmd-injection")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        cmdInjectionCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("crlf-injection")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        crlfInjectionCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("dirscan")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        dirscanCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("fastjson")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        fastjsonCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("jsonp")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        jsonpCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("path-traversal")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        pathTraversalCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("phantasm")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        phantasmCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("redirect")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        redirectCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("shiro")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        shiroCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("sqldet")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        sqldetCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("ssrf")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        ssrfCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("struts")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        strutsCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("thinkphp")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        thinkphpCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("upload")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        uploadCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("xss")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        xssCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                    if (plugin.getKey().equals("xxe")) {
                        Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                        xxeCheckBox.setSelected((boolean) (items.get("enabled")));
                    }
                }
            }
        }

        String data = null;
        for (Map.Entry<String, Object> entry : configObj.entrySet()) {
            if (entry.getKey().equals("http")) {
                Map<String, Object> httpModule = (Map<String, Object>) entry.getValue();
                data = (String) httpModule.get("proxy");
            }
        }
        if (data != null) {
            proxyText.setText(data);
        }

        for (Map.Entry<String, Object> entry : configObj.entrySet()) {
            if (entry.getKey().equals("reverse")) {
                Map<String, Object> reverse = (Map<String, Object>) entry.getValue();
                Map<String, Object> client = (Map<String, Object>) reverse.get("client");
                String token = (String) reverse.get("token");
                String httpUrl = (String) client.get("http_base_url");
                String dnsServer = (String) client.get("dns_server_ip");
                if (StringUtil.notEmpty(httpUrl) || StringUtil.notEmpty(dnsServer)) {
                    client.put("remote_server", true);
                }
                tokenText.setText(token);
                httpReverseText.setText(httpUrl);
                dnsText.setText(dnsServer);
            }
        }
    }

    private volatile boolean stop = false;

    private void execAndFresh(String[] finalCmd) {
        outputTextArea.setText(null);
        Thread thread = new Thread(() -> {
            try {
                Process process = ExecUtil.exec(finalCmd);
                if (process == null) {
                    return;
                }
                InputStream inputStream = process.getInputStream();
                if (inputStream == null) {
                    return;
                }
                BufferedReader isReader;
                if (OSUtil.isWindows()) {
                    InputStreamReader isr = new InputStreamReader(inputStream,
                            StandardCharsets.UTF_8);
                    isReader = new BufferedReader(isr);
                } else {
                    isReader = new BufferedReader(new InputStreamReader(inputStream));
                }
                String thisLine;
                new Thread(() -> {
                    while (true) {
                        if (stop) {
                            logger.info(String.format("stop pid: %d", JNAUtil.getProcessID(process)));
                            try {
                                if (!OSUtil.isWindows()) {
                                    new ProcessBuilder("kill", "-9",
                                            Long.toString(JNAUtil.getProcessID(process))).start();
                                } else {
                                    new ProcessBuilder("cmd.exe", "/c",
                                            String.format("taskkill /f /pid %d", JNAUtil.getProcessID(process))).start();
                                }
                                return;
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }).start();
                while ((!stop) && (thisLine = isReader.readLine()) != null) {
                    outputTextArea.append(thisLine);
                    outputTextArea.append("\n");
                    outputTextArea.setCaretPosition(outputTextArea.getText().length());
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
        thread.start();
    }

    private void loadXray(String absPath) {
        logger.info(String.format("user chose file: %s", absPath));
        String targetDir = Paths.get(absPath).toFile().getParent() + File.separator;
        XrayUtil.rmAllConfig(targetDir);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> XrayUtil.rmAllConfig(targetDir)));

        xrayPathTextField.setText(absPath);
        if (!OSUtil.isWindows()) {
            ExecUtil.chmod(absPath);
        }

        String[] cmd = new String[]{absPath};
        Thread t = new Thread(() -> ExecUtil.execCmdNoRet(cmd));
        t.start();
        if (OSUtil.isMacOS() &&
                (!StringUtil.notEmpty(db.getLastXrayPath()) ||
                        db.getLastXrayPath().equals("null"))) {
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, Const.MacNeedAgree);
            } else {
                JOptionPane.showMessageDialog(null, Const.MacNeedAgreeEn);
            }
        }

        try {
            Thread.sleep(1000);
            t.interrupt();
        } catch (Exception ex) {
            logger.error(ex);
        }
        XrayUtil.cpAllConfig(targetDir);

        try {
            Path configPathPath = Paths.get(targetDir + Const.ConfigYaml);
            configPath = configPathPath.toFile().getAbsolutePath();
            Files.write(configPathPath,
                    configStr.getBytes(StandardCharsets.UTF_8));
        } catch (Exception ex) {
            logger.error(ex);
        }

        xrayCmd.setXray(absPath);

        stop = false;
        execAndFresh(cmd);
    }

    public void initLoadXray() {
        logger.info("init load xray module");

        if (StringUtil.notEmpty(db.getLastXrayPath()) &&
                !db.getLastXrayPath().equals("null")) {
            loadXray(db.getLastXrayPath());
        }

        choseDirButton.addActionListener(e -> {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            int option = fileChooser.showOpenDialog(new JFrame());
            if (option == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                String absPath = file.getAbsolutePath();

                loadXray(absPath);

                DB data = new DB();
                data.setLastXrayPath(absPath);
                try {
                    Files.write(Paths.get("super-xray.db"), data.getDB().getBytes());
                } catch (Exception ex) {
                    logger.error(ex);
                }

            } else {
                if (LANG == CHINESE) {
                    xrayPathTextField.setText("你取消了选择");
                } else {
                    xrayPathTextField.setText("Cancel");
                }
            }
        });
    }

    public void initPluginCheckBox() {
        logger.info("init all plugins");
        pluginAll = true;
        checkBoxList.add(bruteForceCheckBox);
        checkBoxList.add(baselineCheckBox);
        checkBoxList.add(cmdInjectionCheckBox);
        checkBoxList.add(jsonpCheckBox);
        checkBoxList.add(phantasmCheckBox);
        checkBoxList.add(shiroCheckBox);
        checkBoxList.add(ssrfCheckBox);
        checkBoxList.add(thinkphpCheckBox);
        checkBoxList.add(xssCheckBox);
        checkBoxList.add(crlfInjectionCheckBox);
        checkBoxList.add(dirscanCheckBox);
        checkBoxList.add(fastjsonCheckBox);
        checkBoxList.add(pathTraversalCheckBox);
        checkBoxList.add(redirectCheckBox);
        checkBoxList.add(sqldetCheckBox);
        checkBoxList.add(strutsCheckBox);
        checkBoxList.add(uploadCheckBox);
        checkBoxList.add(xxeCheckBox);
        enableAllButton.addActionListener(e -> {
            if (!pluginAll) {
                for (JCheckBox checkBox : checkBoxList) {
                    checkBox.setSelected(true);
                }
                pluginAll = true;
            } else {
                for (JCheckBox checkBox : checkBoxList) {
                    checkBox.setSelected(false);
                }
                pluginAll = false;
            }
        });
    }

    @SuppressWarnings("unchecked")
    public void initPluginSave() {
        confirmPluginButton.addActionListener(e -> {
            for (Map.Entry<String, Object> entry : configObj.entrySet()) {
                if (entry.getKey().equals("plugins")) {
                    Map<String, Object> plugins = (Map<String, Object>) entry.getValue();
                    for (Map.Entry<String, Object> plugin : plugins.entrySet()) {
                        if (plugin.getKey().equals("baseline")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (baselineCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("brute-force")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (bruteForceCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("cmd-injection")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (cmdInjectionCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("crlf-injection")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (crlfInjectionCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("dirscan")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (dirscanCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("fastjson")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (fastjsonCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("jsonp")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (jsonpCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("path-traversal")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (pathTraversalCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("phantasm")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (phantasmCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("redirect")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (redirectCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("shiro")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (shiroCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("sqldet")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (sqldetCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("ssrf")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (ssrfCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("struts")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (strutsCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("thinkphp")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (thinkphpCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("upload")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (uploadCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("xss")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (xssCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                        if (plugin.getKey().equals("xxe")) {
                            Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                            if (xxeCheckBox.isSelected()) {
                                items.put("enabled", true);
                            } else {
                                items.put("enabled", false);
                            }
                        }
                    }
                }
            }
            refreshConfig();
            xrayCmd.setPoc(null);
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "设置完成");
            } else {
                JOptionPane.showMessageDialog(null, "Success");
            }
        });
    }

    public void refreshConfig() {
        Yaml yaml = new Yaml();
        StringWriter writer = new StringWriter();
        yaml.dump(configObj, writer);
        configStr = writer.toString();
        try {
            Files.write(Paths.get("config.yaml"),
                    configStr.getBytes(StandardCharsets.UTF_8));
            Files.write(Paths.get(configPath),
                    configStr.getBytes(StandardCharsets.UTF_8));
        } catch (Exception ex) {
            ex.printStackTrace();
            logger.error(ex);
        }
    }

    public void initAdvanceConfig() {
        logger.info("init advance config button");
        advanceButton.addActionListener(e -> {
            String t;
            if (LANG == CHINESE) {
                t = "高级配置";
            } else {
                t = "Advance Config";
            }
            JFrame frame = new JFrame(t);
            frame.setContentPane(new AdvanceConfigForm().advanceConfigPanel);
            frame.setResizable(true);
            frame.pack();
            frame.setVisible(true);
        });
    }

    public void initOutputConfig() {
        logger.info("init output config module");
        htmlRadioButton.setSelected(true);
        jsonRadioButton.setSelected(false);
        cliRadioButton.setSelected(false);
        outputConfigButton.addActionListener(e -> {
            refreshOutput();
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "设置输出成功");
            } else {
                JOptionPane.showMessageDialog(null, "Success");
            }
        });
    }

    public void refreshOutput() {
        String uuid = UUID.randomUUID().toString();
        if (htmlRadioButton.isSelected()) {
            outputFilePath = Paths.get(String.format("./xray-%s.html", uuid)).toFile().getAbsolutePath();
            existOutputList.add(outputFilePath);
            xrayCmd.setOutputPrefix("--html-output");
            xrayCmd.setOutput(outputFilePath);
        }
        if (jsonRadioButton.isSelected()) {
            outputFilePath = Paths.get(String.format("./xray-%s.txt", uuid)).toFile().getAbsolutePath();
            existOutputList.add(outputFilePath);
            xrayCmd.setOutputPrefix("--json-output");
            xrayCmd.setOutput(outputFilePath);
        }
        if (cliRadioButton.isSelected()) {
            xrayCmd.setOutput(null);
        }
    }

    public void initTargetUrlConfig() {
        urlButton.addActionListener(e -> {
            urlFileField.setText(null);
            rawFileField.setText(null);
            String url = urlField.getText();
            logger.info(String.format("target url: %s", url));
            xrayCmd.setInputPrefix("--url");
            xrayCmd.setInput(url);
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "设置URL成功");
            } else {
                JOptionPane.showMessageDialog(null, "Success");
            }
        });
    }

    public void initUrlFileConfig() {
        logger.info("init url file module");
        urlFileButton.addActionListener(e -> {
            urlField.setText(null);
            rawFileField.setText(null);
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            int option = fileChooser.showOpenDialog(new JFrame());
            if (option == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                String absPath = file.getAbsolutePath();
                urlFileField.setText(absPath);
                xrayCmd.setInputPrefix("--url-file");
                xrayCmd.setInput(String.format("%s", absPath));
            } else {
                if (LANG == CHINESE) {
                    rawFileField.setText("你取消了选择");
                } else {
                    rawFileField.setText("Cancel");
                }
            }
        });
    }

    public void initRawScanConfig() {
        logger.info("init raw scan module");
        rawFileButton.addActionListener(e -> {
            urlField.setText(null);
            urlFileField.setText(null);
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            int option = fileChooser.showOpenDialog(new JFrame());
            if (option == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                String absPath = file.getAbsolutePath();
                rawFileField.setText(absPath);
                xrayCmd.setInputPrefix("--raw-request");
                xrayCmd.setInput(String.format("%s", absPath));
            } else {
                if (LANG == CHINESE) {
                    rawFileField.setText("你取消了选择");
                } else {
                    rawFileField.setText("Cancel");
                }
            }
        });
    }

    public void initActiveScan() {
        logger.info("init active scan module");
        activeScanButton.addActionListener(e -> {
            try {
                refreshOutput();
                xrayCmd.setModule("webscan");
                xrayCmd.setConfig(String.format("%s", configPath));
                xrayCmd.setOthers(null);
                String[] finalCmd = xrayCmd.buildCmd();
                outputTextArea.setText(null);
                stop = false;
                execAndFresh(finalCmd);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
    }

    public void initAllPoC() {
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("poc.list");
        String allPocStr = IOUtil.readStringFromIs(is);
        assert allPocStr != null;
        String[] temp = allPocStr.split("\n");
        Poc.addPoc(temp);
        if (LANG == CHINESE) {
            pocNumLabel.setText(String.format("当前共有: %s 个PoC", Poc.getPocList().size()));
        } else {
            pocNumLabel.setText(String.format("PoC Num: %s", Poc.getPocList().size()));
        }
        allPoCButton.addActionListener(e -> {
            String t;
            if (LANG == CHINESE) {
                t = "查看所有PoC";
            } else {
                t = "All PoC";
            }
            JFrame frame = new JFrame(t);
            frame.setContentPane(new AllPoCForm().searchPoC);
            frame.setResizable(false);
            frame.pack();
            frame.setVisible(true);
        });
    }

    @SuppressWarnings("unchecked")
    private void onlyUsePhantasm(String poc) {
        xrayCmd.setPoc(String.format("%s", poc));

        for (JCheckBox box : checkBoxList) {
            box.setSelected(false);
        }
        phantasmCheckBox.setSelected(true);

        for (Map.Entry<String, Object> entry : configObj.entrySet()) {
            if (entry.getKey().equals("plugins")) {
                Map<String, Object> plugins = (Map<String, Object>) entry.getValue();
                for (Map.Entry<String, Object> plugin : plugins.entrySet()) {
                    Map<String, Object> items = (Map<String, Object>) plugin.getValue();
                    if (plugin.getKey().equals("phantasm")) {
                        items.put("enabled", true);
                    } else {
                        items.put("enabled", false);
                    }
                }
            }
        }

        refreshConfig();
    }

    public void initTargetPoC() {
        localPoCButton.addActionListener(e -> {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            int option = fileChooser.showOpenDialog(new JFrame());
            if (option == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                String absPath = file.getAbsolutePath();
                String[] temp = absPath.split("\\.");
                String suffix = temp[temp.length - 1].toLowerCase().trim();
                if (!suffix.equals("yml") && !suffix.equals("yaml")) {
                    if (LANG == CHINESE) {
                        JOptionPane.showMessageDialog(null, "你选择的不是合法YAML文件");
                    } else {
                        JOptionPane.showMessageDialog(null, "Error File Type");
                    }
                    return;
                }
                localPoCText.setText(absPath);
                onlyUsePhantasm(absPath);
                if (LANG == CHINESE) {
                    JOptionPane.showMessageDialog(null, "设置PoC成功");
                } else {
                    JOptionPane.showMessageDialog(null, "Success");
                }
            }
        });

        updatePocButton.addActionListener(e -> {
            String[] cmd = new String[]{xrayCmd.getXray(), "ws", "--list"};
            InputStream is = Objects.requireNonNull(ExecUtil.exec(cmd)).getInputStream();
            stop = false;
            execAndFresh(cmd);
            List<String> poc = new ArrayList<>();
            String data = IOUtil.readStringFromIs(is);
            assert data != null;
            String[] temp = data.split("\n");
            for (String s : temp) {
                s = s.trim();
                if (s.endsWith("\r")) {
                    s = s.substring(0, s.length() - 1);
                }
                if (s.contains(":")) {
                    continue;
                }
                if (s.contains("test") && !s.contains("testrail")) {
                    continue;
                }
                if (!s.contains("poc")) {
                    continue;
                }
                s = s.substring(2);
                poc.add(s.trim());
            }
            Poc.clear();
            Poc.addAll(poc);
            if (LANG == CHINESE) {
                pocNumLabel.setText(String.format("当前共有: %s 个PoC", Poc.getPocList().size()));
            } else {
                pocNumLabel.setText(String.format("PoC Num: %s", Poc.getPocList().size()));
            }
        });

        pocButton.addActionListener(e -> {
            String poc = usePoCText.getText();
            logger.info(poc);
            if (!Poc.getPocList().contains(poc.trim())) {
                if (LANG == CHINESE) {
                    JOptionPane.showMessageDialog(null, "PoC不存在");
                } else {
                    JOptionPane.showMessageDialog(null, "PoC Not Exist");
                }
                return;
            }
            onlyUsePhantasm(poc);
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "设置PoC成功");
            } else {
                JOptionPane.showMessageDialog(null, "Success");
            }
        });
    }

    private static boolean mitmRunning = false;

    public void initMitmScan() {
        mitmScanButton.addActionListener(e -> {
            if (!mitmRunning) {
                String port = portText.getText();
                xrayCmd.setModule("webscan");
                xrayCmd.setConfig(String.format("%s", configPath));
                xrayCmd.setInput(null);

                if (StringUtil.notEmpty(xrayCmd.getOutput())) {
                    refreshOutput();
                }

                xrayCmd.setOthersPrefix("--listen");
                xrayCmd.setOthers("127.0.0.1:" + port);
                String[] cmd = xrayCmd.buildCmd();
                stop = false;
                execAndFresh(cmd);
                if (LANG == CHINESE) {
                    mitmScanButton.setText("关闭被动监听");
                } else {
                    mitmScanButton.setText("Shutdown");
                }
                portText.setEnabled(false);
                mitmRunning = true;
            } else {
                stop = true;
                portText.setEnabled(true);
                if (LANG == CHINESE) {
                    mitmScanButton.setText("开启被动扫描");
                } else {
                    mitmScanButton.setText("Start MITM");
                }
                mitmRunning = false;
                outputTextArea.setText(null);
            }
        });
    }

    @SuppressWarnings("unchecked")
    public void initHttpProxy() {
        String data = null;
        for (Map.Entry<String, Object> entry : configObj.entrySet()) {
            if (entry.getKey().equals("http")) {
                Map<String, Object> httpModule = (Map<String, Object>) entry.getValue();
                data = (String) httpModule.get("proxy");
            }
        }
        if (data != null) {
            proxyText.setText(data);
        }
        proxyConfigButton.addActionListener(e -> {
            String httpProxy = proxyText.getText();
            for (Map.Entry<String, Object> entry : configObj.entrySet()) {
                if (entry.getKey().equals("http")) {
                    Map<String, Object> httpModule = (Map<String, Object>) entry.getValue();
                    httpModule.put("proxy", httpProxy);
                }
            }
            refreshConfig();
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "设置代理成功");
            } else {
                JOptionPane.showMessageDialog(null, "Success");
            }
        });
    }

    @SuppressWarnings("unchecked")
    public void initReverse() {
        for (Map.Entry<String, Object> entry : configObj.entrySet()) {
            if (entry.getKey().equals("reverse")) {
                Map<String, Object> reverse = (Map<String, Object>) entry.getValue();
                Map<String, Object> client = (Map<String, Object>) reverse.get("client");
                String token = (String) reverse.get("token");
                String httpUrl = (String) client.get("http_base_url");
                String dnsServer = (String) client.get("dns_server_ip");
                if (StringUtil.notEmpty(httpUrl) || StringUtil.notEmpty(dnsServer)) {
                    client.put("remote_server", true);
                }
                tokenText.setText(token);
                httpReverseText.setText(httpUrl);
                dnsText.setText(dnsServer);
            }
        }

        reverseConfigButton.addActionListener(e -> {
            String http = httpReverseText.getText();
            String dns = dnsText.getText();
            String token = tokenText.getText();
            for (Map.Entry<String, Object> entry : configObj.entrySet()) {
                if (entry.getKey().equals("reverse")) {
                    Map<String, Object> reverse = (Map<String, Object>) entry.getValue();
                    Map<String, Object> client = (Map<String, Object>) reverse.get("client");
                    reverse.put("token", token);
                    client.put("remote_server", true);
                    client.put("http_base_url", http);
                    client.put("dns_server_ip", dns);
                }
            }
            refreshConfig();
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "设置反连成功");
            } else {
                JOptionPane.showMessageDialog(null, "Success");
            }
        });
    }

    public void initForcedStop() {
        stopButton.addActionListener(e -> {
            stop = true;
            outputTextArea.setText(null);
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "已强制停止");
            } else {
                JOptionPane.showMessageDialog(null, "Stop Success");
            }
        });
    }

    public void initOpenOutput() {
        autoDelCheckBox.setSelected(false);

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            if (autoDelCheckBox.isSelected()) {
                for (String s : existOutputList) {
                    try {
                        Files.delete(Paths.get(s));
                    } catch (Exception ignored) {
                    }
                }
            }
        }));

        openResultButton.addActionListener(e -> {
            if (outputFilePath == null) {
                return;
            }
            if (StringUtil.notEmpty(outputFilePath.trim())) {
                if (Files.exists(Paths.get(outputFilePath))) {
                    String tempOutput = outputFilePath.replace(".html",
                            "copy.html");
                    try {
                        // copy
                        Files.write(Paths.get(tempOutput),
                                Files.readAllBytes(Paths.get(outputFilePath)));
                    } catch (Exception ignored) {
                    }
                    existOutputList.add(tempOutput);
                    new Thread(() -> ExecUtil.execOpen(tempOutput)).start();
                } else {
                    logger.info("output file not exist");
                }
            } else {
                logger.warn("output file is none");
            }
        });
    }

    public void initReset() {
        resetConfigButton.addActionListener(e -> {
            reloadConfig(true, true);
            if (LANG == CHINESE) {
                JOptionPane.showMessageDialog(null, "已恢复");
            } else {
                JOptionPane.showMessageDialog(null, "Success");
            }
        });
    }

    private void initHttpUtil() {
        httpUtilButton.addActionListener(e -> {
            String t;
            if (LANG == CHINESE) {
                t = "Http工具";
            } else {
                t = "Repeater";
            }
            JFrame frame = new JFrame(t);
            frame.setContentPane(new HttpUtilForm().httpUtilPanel);
            frame.setResizable(false);
            frame.pack();
            frame.setVisible(true);
        });
    }

    public void initListenUtil() {
        listenUtilButton.addActionListener(e -> {
            String t;
            if (LANG == CHINESE) {
                t = "监听端口工具";
            } else {
                t = "Listener";
            }
            JFrame frame = new JFrame(t);
            frame.setContentPane(new ListenUtilForm().listenUtilPanel);
            frame.setResizable(false);
            frame.pack();
            frame.setVisible(true);
        });
    }

    public void initEncodeUtil() {
        encodeUtilButton.addActionListener(e -> {
            String t;
            if (LANG == CHINESE) {
                t = "编码工具";
            } else {
                t = "Decoder";
            }
            JFrame frame = new JFrame(t);
            frame.setContentPane(new EncodeUtilForm().encodeUtilPanel);
            frame.setResizable(false);
            frame.pack();
            frame.setVisible(true);
        });
    }

    private void initSkin() {
        switch (Application.globalSkin) {
            case Const.nimbus:
                nimbusRadioButton.setSelected(true);
                break;
            case Const.aqua:
                aquaRadioButton.setSelected(true);
                break;
            case Const.gtk:
                gtkRadioButton.setSelected(true);
                break;
            case Const.metal:
                metalRadioButton.setSelected(true);
                break;
            case Const.flatLaf:
                flatLafRadioButton.setSelected(true);
                break;
            case Const.windows:
                windowsRadioButton.setSelected(true);
                break;
            case Const.winClassic:
                winClassicRadioButton.setSelected(true);
                break;
            default:
                logger.error("error skin");
        }

        saveSkinButton.addActionListener(e -> {
            try {
                if (nimbusRadioButton.isSelected()) {
                    try {
                        Class.forName(Const.nimbus);
                    } catch (Exception ignored) {
                        if (LANG == CHINESE) {
                            JOptionPane.showMessageDialog(null, "您的操作系统不能设置该皮肤");
                        } else {
                            JOptionPane.showMessageDialog(null,
                                    "Your OS not support this skin");
                        }
                        return;
                    }
                    UIManager.setLookAndFeel(Const.nimbus);
                    db.setSkin(Const.nimbus);
                } else if (metalRadioButton.isSelected()) {
                    try {
                        Class.forName(Const.metal);
                    } catch (Exception ignored) {
                        if (LANG == CHINESE) {
                            JOptionPane.showMessageDialog(null, "您的操作系统不能设置该皮肤");
                        } else {
                            JOptionPane.showMessageDialog(null,
                                    "Your OS not support this skin");
                        }
                        return;
                    }
                    UIManager.setLookAndFeel(Const.metal);
                    db.setSkin(Const.metal);
                } else if (windowsRadioButton.isSelected()) {
                    try {
                        Class.forName(Const.windows);
                    } catch (Exception ignored) {
                        if (LANG == CHINESE) {
                            JOptionPane.showMessageDialog(null, "您的操作系统不能设置该皮肤");
                        } else {
                            JOptionPane.showMessageDialog(null,
                                    "Your OS not support this skin");
                        }
                        return;
                    }
                    UIManager.setLookAndFeel(Const.windows);
                    db.setSkin(Const.windows);
                } else if (winClassicRadioButton.isSelected()) {
                    try {
                        Class.forName(Const.winClassic);
                    } catch (Exception ignored) {
                        if (LANG == CHINESE) {
                            JOptionPane.showMessageDialog(null, "您的操作系统不能设置该皮肤");
                        } else {
                            JOptionPane.showMessageDialog(null,
                                    "Your OS not support this skin");
                        }
                        return;
                    }
                    UIManager.setLookAndFeel(Const.winClassic);
                    db.setSkin(Const.winClassic);
                } else if (flatLafRadioButton.isSelected()) {
                    try {
                        FlatLightLaf.setup();
                    } catch (Exception ignored) {
                        if (LANG == CHINESE) {
                            JOptionPane.showMessageDialog(null, "您的操作系统不能设置该皮肤");
                        } else {
                            JOptionPane.showMessageDialog(null,
                                    "Your OS not support this skin");
                        }
                        return;
                    }
                    FlatLightLaf.setup();
                    db.setSkin(Const.flatLaf);
                } else if (gtkRadioButton.isSelected()) {
                    try {
                        Class.forName(Const.gtk);
                    } catch (Exception ignored) {
                        if (LANG == CHINESE) {
                            JOptionPane.showMessageDialog(null, "您的操作系统不能设置该皮肤");
                        } else {
                            JOptionPane.showMessageDialog(null,
                                    "Your OS not support this skin");
                        }
                        return;
                    }
                    UIManager.setLookAndFeel(Const.gtk);
                    db.setSkin(Const.gtk);
                } else if (aquaRadioButton.isSelected()) {
                    try {
                        Class.forName(Const.aqua);
                    } catch (Exception ignored) {
                        if (LANG == CHINESE) {
                            JOptionPane.showMessageDialog(null, "您的操作系统不能设置该皮肤");
                        } else {
                            JOptionPane.showMessageDialog(null,
                                    "Your OS not support this skin");
                        }
                        return;
                    }
                    UIManager.setLookAndFeel(Const.aqua);
                    db.setSkin(Const.aqua);
                }
                SwingUtilities.updateComponentTreeUI(SuperXray);
                SuperXray.revalidate();
                db.saveDB();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
    }

    private void initOther() {
        cleanAreaButton.addActionListener(e -> outputTextArea.setText(null));
        xrayUrlButton.addActionListener(e -> {
            try {
                Desktop desktop = Desktop.getDesktop();
                URI oURL = new URI("https://download.xray.cool/xray");
                desktop.browse(oURL);
            } catch (Exception ex) {
                logger.error(ex);
            }
        });
        authorLabel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                try {
                    Desktop desktop = Desktop.getDesktop();
                    URI oURL = new URI("https://github.com/4ra1n");
                    desktop.browse(oURL);
                } catch (Exception ex) {
                    logger.error(ex);
                }
            }
        });
    }

    public static final int CHINESE = 0;
    public static final int ENGLISH = 1;
    public static int LANG;

    public void initLang() {
        chineseLangButton.setSelected(true);
        LANG = CHINESE;
        englishLangButton.setSelected(false);
        langButton.addActionListener(e -> {
            if (chineseLangButton.isSelected()) {
                LANG = CHINESE;
            } else if (englishLangButton.isSelected()) {
                LANG = ENGLISH;
            }
            refreshLang();
            if (LANG == CHINESE) {
                pocNumLabel.setText(String.format("当前共有: %s 个PoC", Poc.getPocList().size()));
            } else {
                pocNumLabel.setText(String.format("PoC Num: %s", Poc.getPocList().size()));
            }
        });
    }

    public void refreshLang() {
        if (LANG == ENGLISH) {
            xrayPathLabel.setText("You selected xray:");
            noteLabel.setText("<html> Note: Using control+c/v to copy/paste in Mac OS </html>");
            langButton.setText("Confirm Language");
            skinPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Skin Select", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            saveSkinButton.setText("Confirm Skin");
            leftConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Plugins Config", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            catConfigLabel.setText("<html> Using Plugins <br> " +
                    "<b>Please press confirm button after check</b> " +
                    "<p>(Some only supported by the advanced version)</p> </html>");
            bruteForceCheckBox.setText("bruteforce");
            baselineCheckBox.setText("baseline");
            phantasmCheckBox.setText("phantasm");
            sqldetCheckBox.setText("sqldet");
            enableAllButton.setText("All select / Cancel");
            advanceButton.setText("Advance Config");
            pocPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "PoC Module", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            pocNumLabel.setText("Total PoC Num:");
            updatePocButton.setText("Update PoC DB");
            allPoCButton.setText("Lookup All PoC");
            pocButton.setText("Use PoC");
            localPoCButton.setText("Chose Local PoC");
            scanTargetPanel.setBorder(BorderFactory.createTitledBorder(null,
                    " Target Config", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            rawFileButton.setText("Use Request File");
            urlButton.setText("Target Url");
            urlFileButton.setText("Target Url List");
            outputConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Output Module", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            outputConfigButton.setText("Save Output Config");
            utilPanel.setBorder(BorderFactory.createTitledBorder(null, "Tools",
                    TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            httpUtilButton.setText("Repeater");
            listenUtilButton.setText("Listener");
            encodeUtilButton.setText("Decoder");
            proxyConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Proxy Config", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            proxyLabel.setText("Input HTTP Proxy");
            proxyConfigButton.setText("Confirm");
            reverseConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Reverse", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            tokenLabel.setText("Token");
            httpReverseLabel.setText("Input HTTP URL(IP)");
            dnsReverseLabel.setText("DNS IP(IP)");
            reverseConfigButton.setText("Confirm");
            startScanPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Start", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            activeScanButton.setText("Start Active Scan");
            portLabel.setText("Listen Port");
            mitmScanButton.setText("Open MITM Scan");
            otherPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Others", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            lookupCmdButton.setText("Lookup Current Command");
            lookupConfigButton.setText("Lookup Current Config");
            xrayUrlButton.setText("Xray Download");
            cleanAreaButton.setText("Clear Console");
            outputPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Console", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            stopLabel.setText("  Force Stop");
            resetConfigLabel.setText("Reset Default Config");
            openResultLabel.setText(" Open Scan Result");
            stopButton.setText("Stop");
            resetConfigButton.setText("Reset");
            autoDelCheckBox.setText("Delete All Reports When Exit");
            openResultButton.setText("Open");
            choseDirButton.setText("Chose File");
            confirmPluginButton.setText("Confirm");
        } else if (LANG == CHINESE) {
            xrayPathLabel.setText("你选择的xray文件是：");
            noteLabel.setText("<html> 注意：在 Mac OS 中请用 control+c/v 复制/粘贴 </html>");
            langButton.setText("确认语言");
            skinPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "皮肤选择", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            saveSkinButton.setText("确认皮肤");
            leftConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "扫描插件配置", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            catConfigLabel.setText("<html> 使用的插件： <br> " +
                    "<b>请配置完成后点击->确认插件</b> <p>(部分插件仅高级版支持)</p> </html>");
            bruteForceCheckBox.setText("bruteforce（暴力破解）");
            baselineCheckBox.setText("baseline（基线检查）");
            phantasmCheckBox.setText("phantasm（PoC合集）");
            sqldetCheckBox.setText("sqldet（sql注入）");
            enableAllButton.setText("全选 / 取消全选");
            advanceButton.setText("高级配置");
            pocPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "PoC模块", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            pocNumLabel.setText("当前xray的PoC数量：");
            updatePocButton.setText("同步PoC数据库");
            allPoCButton.setText("查看所有PoC");
            pocButton.setText("指定PoC");
            localPoCButton.setText("选择本地PoC");
            scanTargetPanel.setBorder(BorderFactory.createTitledBorder(null,
                    " 扫描目标设置", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            rawFileButton.setText("指定request文件");
            urlButton.setText("指定url");
            urlFileButton.setText("指定url列表文件");
            outputConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "输出模块", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            outputConfigButton.setText("点击确认输出配置");
            utilPanel.setBorder(BorderFactory.createTitledBorder(null, "小工具",
                    TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            httpUtilButton.setText("http 请求测试");
            listenUtilButton.setText("监听端口");
            encodeUtilButton.setText("编码工具");
            proxyConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "代理配置", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            proxyLabel.setText("输入HTTP代理URL");
            proxyConfigButton.setText("确认");
            reverseConfigPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "反连平台", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            tokenLabel.setText("Token");
            httpReverseLabel.setText("请输入HTTP URL（IP形式）");
            dnsReverseLabel.setText("DNS IP（IP形式）");
            reverseConfigButton.setText("确认配置");
            startScanPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "启动", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            activeScanButton.setText("开启主动扫描");
            portLabel.setText("被动监听端口:");
            mitmScanButton.setText("开启被动扫描");
            otherPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "其他", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            lookupCmdButton.setText("查看当前命令");
            lookupConfigButton.setText("查看当前配置文件");
            xrayUrlButton.setText("xray下载网站");
            cleanAreaButton.setText("清空命令行输出");
            outputPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "命令行输出结果：", TitledBorder.DEFAULT_JUSTIFICATION,
                    TitledBorder.DEFAULT_POSITION, null, null));
            stopLabel.setText("  如果意外地运行了危险的程序可以点击：");
            resetConfigLabel.setText("恢复默认配置：");
            openResultLabel.setText(" 打开扫描结果：（如果存在）");
            stopButton.setText("强制停止");
            resetConfigButton.setText("确认");
            autoDelCheckBox.setText("关闭后自动删除报告");
            openResultButton.setText("点击打开扫描结果");
            choseDirButton.setText("点击按钮选择");
            confirmPluginButton.setText("确认插件");
        }
    }

    private void initExit() {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            instance.stop = true;
            try {
                Thread.sleep(3000);
            } catch (Exception ignored) {
            }
        }));
    }

    public MainForm() {
        init();
        initLang();
        initSkin();
        initLoadXray();
        initPluginCheckBox();
        initPluginSave();
        initAdvanceConfig();
        initOutputConfig();
        initRawScanConfig();
        initUrlFileConfig();
        initTargetUrlConfig();
        initAllPoC();
        initHttpProxy();
        initTargetPoC();
        initActiveScan();
        initMitmScan();
        initReverse();
        initForcedStop();
        initOpenOutput();
        initReset();
        initHttpUtil();
        initListenUtil();
        initEncodeUtil();
        initOther();
        initExit();
    }

    public static void startMainForm() {
        JFrame frame = new JFrame(Const.ApplicationName);
        instance = new MainForm();
        frame.setContentPane(instance.SuperXray);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        frame.setSize(1280, 960);

    }

    {
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
        $$$setupUI$$$();
    }

    /**
     * Method generated by IntelliJ IDEA GUI Designer
     * >>> IMPORTANT!! <<<
     * DO NOT edit this method OR call it in your code!
     *
     * @noinspection ALL
     */
    private void $$$setupUI$$$() {
        SuperXray = new JPanel();
        SuperXray.setLayout(new GridLayoutManager(6, 1, new Insets(0, 0, 0, 0), -1, -1));
        SuperXray.setBackground(new Color(-725535));
        loadXrayPanel = new JPanel();
        loadXrayPanel.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
        loadXrayPanel.setBackground(new Color(-725535));
        SuperXray.add(loadXrayPanel, new GridConstraints(0, 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, null, null, 0, false));
        loadXrayPanel.setBorder(BorderFactory.createTitledBorder(null, "Super Xray", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        pathButtonPanel = new JPanel();
        pathButtonPanel.setLayout(new GridLayoutManager(2, 6, new Insets(0, 0, 0, 0), -1, -1));
        pathButtonPanel.setBackground(new Color(-725535));
        loadXrayPanel.add(pathButtonPanel, new GridConstraints(0, 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, null, null, 0, false));
        choseDirButton = new JButton();
        choseDirButton.setText("点击按钮选择");
        pathButtonPanel.add(choseDirButton, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, 1, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        noteLabel = new JLabel();
        noteLabel.setText("<html>\n注意：在 Mac OS 中请用 control+c/v 复制/粘贴\n</html>");
        pathButtonPanel.add(noteLabel, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), null, null, 0, false));
        skinPanel = new JPanel();
        skinPanel.setLayout(new GridLayoutManager(2, 4, new Insets(0, 0, 0, 0), -1, -1));
        skinPanel.setBackground(new Color(-725535));
        pathButtonPanel.add(skinPanel, new GridConstraints(0, 5, 2, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
        skinPanel.setBorder(BorderFactory.createTitledBorder(null, "皮肤选择", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        metalRadioButton = new JRadioButton();
        metalRadioButton.setBackground(new Color(-725535));
        metalRadioButton.setText("Metal");
        skinPanel.add(metalRadioButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        flatLafRadioButton = new JRadioButton();
        flatLafRadioButton.setBackground(new Color(-725535));
        flatLafRadioButton.setText("FlatLaf");
        skinPanel.add(flatLafRadioButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        nimbusRadioButton = new JRadioButton();
        nimbusRadioButton.setBackground(new Color(-725535));
        nimbusRadioButton.setText("Nimbus");
        skinPanel.add(nimbusRadioButton, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        windowsRadioButton = new JRadioButton();
        windowsRadioButton.setBackground(new Color(-725535));
        windowsRadioButton.setText("Win");
        skinPanel.add(windowsRadioButton, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        winClassicRadioButton = new JRadioButton();
        winClassicRadioButton.setBackground(new Color(-725535));
        winClassicRadioButton.setText("Win Classic");
        skinPanel.add(winClassicRadioButton, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        gtkRadioButton = new JRadioButton();
        gtkRadioButton.setBackground(new Color(-725535));
        gtkRadioButton.setText("Gtk");
        skinPanel.add(gtkRadioButton, new GridConstraints(1, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        saveSkinButton = new JButton();
        saveSkinButton.setText("确认皮肤");
        skinPanel.add(saveSkinButton, new GridConstraints(1, 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));
        aquaRadioButton = new JRadioButton();
        aquaRadioButton.setBackground(new Color(-725535));
        aquaRadioButton.setText("Aqua");
        skinPanel.add(aquaRadioButton, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        xrayPathLabel = new JLabel();
        xrayPathLabel.setText("你选择的xray文件是：");
        pathButtonPanel.add(xrayPathLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        xrayPathTextField = new JTextField();
        xrayPathTextField.setEditable(false);
        xrayPathTextField.setEnabled(false);
        pathButtonPanel.add(xrayPathTextField, new GridConstraints(0, 1, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(500, -1), null, 0, false));
        englishLangButton = new JRadioButton();
        englishLangButton.setBackground(new Color(-725535));
        englishLangButton.setText("English");
        pathButtonPanel.add(englishLangButton, new GridConstraints(1, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        chineseLangButton = new JRadioButton();
        chineseLangButton.setBackground(new Color(-725535));
        chineseLangButton.setText("简体中文");
        pathButtonPanel.add(chineseLangButton, new GridConstraints(1, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        langButton = new JButton();
        langButton.setText("确认语言");
        pathButtonPanel.add(langButton, new GridConstraints(1, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        configPanel = new JPanel();
        configPanel.setLayout(new GridLayoutManager(2, 3, new Insets(0, 0, 0, 0), -1, -1));
        configPanel.setBackground(new Color(-725535));
        SuperXray.add(configPanel, 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, null, null, 0, false));
        leftConfigPanel = new JPanel();
        leftConfigPanel.setLayout(new GridLayoutManager(11, 4, new Insets(0, 0, 0, 0), -1, -1));
        leftConfigPanel.setBackground(new Color(-725535));
        leftConfigPanel.setEnabled(true);
        leftConfigPanel.setForeground(new Color(-4540485));
        leftConfigPanel.setToolTipText("");
        configPanel.add(leftConfigPanel, 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, null, null, 0, false));
        leftConfigPanel.setBorder(BorderFactory.createTitledBorder(null, "扫描插件配置", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        catConfigPanel = new JPanel();
        catConfigPanel.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
        catConfigPanel.setBackground(new Color(-725535));
        leftConfigPanel.add(catConfigPanel, new GridConstraints(0, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, 1, 1, null, null, null, 0, false));
        catConfigLabel = new JLabel();
        catConfigLabel.setText("<html>\n使用的插件：\n<br>\n<b>请配置完成后点击->确认插件</b>\n<p>(部分插件仅高级版支持)</p>\n</html>");
        catConfigPanel.add(catConfigLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        confirmPluginButton = new JButton();
        confirmPluginButton.setText("确认插件");
        catConfigPanel.add(confirmPluginButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        bruteForceCheckBox = new JCheckBox();
        bruteForceCheckBox.setBackground(new Color(-725535));
        bruteForceCheckBox.setText("bruteforce（暴力破解）");
        leftConfigPanel.add(bruteForceCheckBox, new GridConstraints(1, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        baselineCheckBox = new JCheckBox();
        baselineCheckBox.setBackground(new Color(-725535));
        baselineCheckBox.setText("baseline（基线检查）");
        leftConfigPanel.add(baselineCheckBox, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        cmdInjectionCheckBox = new JCheckBox();
        cmdInjectionCheckBox.setBackground(new Color(-725535));
        cmdInjectionCheckBox.setText("cmd-injection");
        leftConfigPanel.add(cmdInjectionCheckBox, new GridConstraints(3, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        crlfInjectionCheckBox = new JCheckBox();
        crlfInjectionCheckBox.setBackground(new Color(-725535));
        crlfInjectionCheckBox.setText("crlf-injection");
        leftConfigPanel.add(crlfInjectionCheckBox, new GridConstraints(1, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        dirscanCheckBox = new JCheckBox();
        dirscanCheckBox.setBackground(new Color(-725535));
        dirscanCheckBox.setText("dirscan");
        leftConfigPanel.add(dirscanCheckBox, new GridConstraints(2, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        fastjsonCheckBox = new JCheckBox();
        fastjsonCheckBox.setBackground(new Color(-725535));
        fastjsonCheckBox.setText("fastjson");
        leftConfigPanel.add(fastjsonCheckBox, new GridConstraints(3, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        jsonpCheckBox = new JCheckBox();
        jsonpCheckBox.setBackground(new Color(-725535));
        jsonpCheckBox.setText("jsonp");
        leftConfigPanel.add(jsonpCheckBox, new GridConstraints(4, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        pathTraversalCheckBox = new JCheckBox();
        pathTraversalCheckBox.setBackground(new Color(-725535));
        pathTraversalCheckBox.setText("path-traversal");
        leftConfigPanel.add(pathTraversalCheckBox, new GridConstraints(4, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        phantasmCheckBox = new JCheckBox();
        phantasmCheckBox.setBackground(new Color(-725535));
        phantasmCheckBox.setText("phantasm（PoC合集）");
        leftConfigPanel.add(phantasmCheckBox, new GridConstraints(5, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        redirectCheckBox = new JCheckBox();
        redirectCheckBox.setBackground(new Color(-725535));
        redirectCheckBox.setEnabled(true);
        redirectCheckBox.setText("redirect");
        leftConfigPanel.add(redirectCheckBox, new GridConstraints(5, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        shiroCheckBox = new JCheckBox();
        shiroCheckBox.setBackground(new Color(-725535));
        shiroCheckBox.setText("shiro");
        leftConfigPanel.add(shiroCheckBox, new GridConstraints(6, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        sqldetCheckBox = new JCheckBox();
        sqldetCheckBox.setBackground(new Color(-725535));
        sqldetCheckBox.setText("sqldet（sql注入）");
        leftConfigPanel.add(sqldetCheckBox, new GridConstraints(6, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        ssrfCheckBox = new JCheckBox();
        ssrfCheckBox.setBackground(new Color(-725535));
        ssrfCheckBox.setText("ssrf");
        leftConfigPanel.add(ssrfCheckBox, new GridConstraints(7, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        strutsCheckBox = new JCheckBox();
        strutsCheckBox.setBackground(new Color(-725535));
        strutsCheckBox.setText("struts");
        leftConfigPanel.add(strutsCheckBox, new GridConstraints(7, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        thinkphpCheckBox = new JCheckBox();
        thinkphpCheckBox.setBackground(new Color(-725535));
        thinkphpCheckBox.setText("thinkphp");
        leftConfigPanel.add(thinkphpCheckBox, new GridConstraints(8, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        uploadCheckBox = new JCheckBox();
        uploadCheckBox.setBackground(new Color(-725535));
        uploadCheckBox.setText("upload");
        leftConfigPanel.add(uploadCheckBox, new GridConstraints(8, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        xxeCheckBox = new JCheckBox();
        xxeCheckBox.setBackground(new Color(-725535));
        xxeCheckBox.setText("xxe");
        leftConfigPanel.add(xxeCheckBox, new GridConstraints(9, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        xssCheckBox = new JCheckBox();
        xssCheckBox.setBackground(new Color(-725535));
        xssCheckBox.setText("xss");
        leftConfigPanel.add(xssCheckBox, new GridConstraints(9, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        enableAllButton = new JButton();
        enableAllButton.setText("全选 / 取消全选");
        leftConfigPanel.add(enableAllButton, new GridConstraints(10, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        advanceButton = new JButton();
        advanceButton.setText("高级配置");
        leftConfigPanel.add(advanceButton, new GridConstraints(10, 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));
        rightConfigPanel = new JPanel();
        rightConfigPanel.setLayout(new GridLayoutManager(8, 1, new Insets(0, 0, 0, 0), -1, -1));
        rightConfigPanel.setBackground(new Color(-725535));
        rightConfigPanel.setEnabled(true);
        configPanel.add(rightConfigPanel, new GridConstraints(1, 2, 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, null, null, 0, false));
        proxyConfigPanel = new JPanel();
        proxyConfigPanel.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
        proxyConfigPanel.setBackground(new Color(-725535));
        rightConfigPanel.add(proxyConfigPanel, new GridConstraints(0, 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, null, null, 0, false));
        proxyConfigPanel.setBorder(BorderFactory.createTitledBorder(null, "代理配置", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        proxyPanel = new JPanel();
        proxyPanel.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
        proxyPanel.setBackground(new Color(-725535));
        proxyConfigPanel.add(proxyPanel, new GridConstraints(0, 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, null, null, 0, false));
        proxyConfigButton = new JButton();
        proxyConfigButton.setText("确认");
        proxyPanel.add(proxyConfigButton, 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));
        proxyLabel = new JLabel();
        proxyLabel.setText("输入HTTP代理URL");
        proxyPanel.add(proxyLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        proxyText = new JTextField();
        proxyPanel.add(proxyText, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        reverseConfigPanel = new JPanel();
        reverseConfigPanel.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1));
        reverseConfigPanel.setBackground(new Color(-725535));
        rightConfigPanel.add(reverseConfigPanel, 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, null, null, 0, false));
        reverseConfigPanel.setBorder(BorderFactory.createTitledBorder(null, "反连平台", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        reverseUrlPanel = new JPanel();
        reverseUrlPanel.setLayout(new GridLayoutManager(3, 2, new Insets(0, 0, 0, 0), -1, -1));
        reverseUrlPanel.setBackground(new Color(-725535));
        reverseConfigPanel.add(reverseUrlPanel, new GridConstraints(0, 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, null, null, 0, false));
        httpReverseLabel = new JLabel();
        httpReverseLabel.setText("请输入HTTP URL（IP形式）");
        reverseUrlPanel.add(httpReverseLabel, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        httpReverseText = new JTextField();
        reverseUrlPanel.add(httpReverseText, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        dnsReverseLabel = new JLabel();
        dnsReverseLabel.setText("DNS IP（IP形式）");
        reverseUrlPanel.add(dnsReverseLabel, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        dnsText = new JTextField();
        reverseUrlPanel.add(dnsText, new GridConstraints(2, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        tokenLabel = new JLabel();
        tokenLabel.setText("Token");
        reverseUrlPanel.add(tokenLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        tokenText = new JTextField();
        reverseUrlPanel.add(tokenText, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        reverseConfigButton = new JButton();
        reverseConfigButton.setText("确认配置");
        reverseConfigPanel.add(reverseConfigButton, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        startScanPanel = new JPanel();
        startScanPanel.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1));
        startScanPanel.setBackground(new Color(-725535));
        rightConfigPanel.add(startScanPanel, new GridConstraints(5, 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, null, null, 0, false));
        startScanPanel.setBorder(BorderFactory.createTitledBorder(null, "启动", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        activeScanButton = new JButton();
        activeScanButton.setText("开启主动扫描");
        startScanPanel.add(activeScanButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        mitmPanel = new JPanel();
        mitmPanel.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
        mitmPanel.setBackground(new Color(-725535));
        startScanPanel.add(mitmPanel, 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, null, null, 0, false));
        mitmScanButton = new JButton();
        mitmScanButton.setText("开启被动扫描");
        mitmPanel.add(mitmScanButton, 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));
        portText = new JTextField();
        portText.setText("");
        mitmPanel.add(portText, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        portLabel = new JLabel();
        portLabel.setText("被动监听端口:");
        mitmPanel.add(portLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        otherPanel = new JPanel();
        otherPanel.setLayout(new GridLayoutManager(2, 2, new Insets(0, 0, 0, 0), -1, -1));
        otherPanel.setBackground(new Color(-725535));
        rightConfigPanel.add(otherPanel, new GridConstraints(6, 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, null, null, 0, false));
        otherPanel.setBorder(BorderFactory.createTitledBorder(null, "其他", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        lookupCmdButton = new JButton();
        lookupCmdButton.setText("查看当前命令");
        otherPanel.add(lookupCmdButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        lookupConfigButton = new JButton();
        lookupConfigButton.setText("查看当前配置文件");
        otherPanel.add(lookupConfigButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        cleanAreaButton = new JButton();
        cleanAreaButton.setText("清空命令行输出");
        otherPanel.add(cleanAreaButton, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        xrayUrlButton = new JButton();
        xrayUrlButton.setText("xray下载网站");
        otherPanel.add(xrayUrlButton, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        midConfigPanel = new JPanel();
        midConfigPanel.setLayout(new GridLayoutManager(4, 1, new Insets(0, 0, 0, 0), -1, -1));
        midConfigPanel.setBackground(new Color(-725535));
        configPanel.add(midConfigPanel, new GridConstraints(1, 1, 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, null, null, 0, false));
        pocPanel = new JPanel();
        pocPanel.setLayout(new GridLayoutManager(3, 3, new Insets(0, 0, 0, 0), -1, -1));
        pocPanel.setBackground(new Color(-725535));
        midConfigPanel.add(pocPanel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, 1, 1, null, null, null, 0, false));
        pocPanel.setBorder(BorderFactory.createTitledBorder(null, "PoC模块", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        pocButton = new JButton();
        pocButton.setText("指定PoC");
        pocPanel.add(pocButton, new GridConstraints(1, 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));
        allPoCButton = new JButton();
        allPoCButton.setText("查看所有PoC");
        pocPanel.add(allPoCButton, 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));
        usePoCText = new JTextField();
        pocPanel.add(usePoCText, new GridConstraints(1, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        pocNumLabel = new JLabel();
        pocNumLabel.setText("当前xray的PoC数量：");
        pocPanel.add(pocNumLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        updatePocButton = new JButton();
        updatePocButton.setText("同步PoC数据库");
        pocPanel.add(updatePocButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        localPoCText = new JTextField();
        localPoCText.setEditable(false);
        localPoCText.setEnabled(false);
        pocPanel.add(localPoCText, new GridConstraints(2, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        localPoCButton = new JButton();
        localPoCButton.setText("选择本地PoC");
        pocPanel.add(localPoCButton, new GridConstraints(2, 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));
        scanTargetPanel = new JPanel();
        scanTargetPanel.setLayout(new GridLayoutManager(3, 2, new Insets(0, 0, 0, 0), -1, -1));
        scanTargetPanel.setBackground(new Color(-725535));
        midConfigPanel.add(scanTargetPanel, 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, null, null, 0, false));
        scanTargetPanel.setBorder(BorderFactory.createTitledBorder(null, " 扫描目标设置", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        rawFileField = new JTextField();
        rawFileField.setEditable(false);
        rawFileField.setEnabled(false);
        scanTargetPanel.add(rawFileField, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        rawFileButton = new JButton();
        rawFileButton.setText("指定request文件");
        scanTargetPanel.add(rawFileButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        urlField = new JTextField();
        urlField.setEditable(true);
        scanTargetPanel.add(urlField, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        urlButton = new JButton();
        urlButton.setText("指定url");
        scanTargetPanel.add(urlButton, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        urlFileField = new JTextField();
        urlFileField.setEditable(false);
        urlFileField.setEnabled(false);
        scanTargetPanel.add(urlFileField, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
        urlFileButton = new JButton();
        urlFileButton.setText("指定url列表文件");
        scanTargetPanel.add(urlFileButton, new GridConstraints(2, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        outputConfigPanel = new JPanel();
        outputConfigPanel.setLayout(new GridLayoutManager(2, 2, new Insets(0, 0, 0, 0), -1, -1));
        outputConfigPanel.setBackground(new Color(-725535));
        midConfigPanel.add(outputConfigPanel, new GridConstraints(2, 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, null, null, 0, false));
        outputConfigPanel.setBorder(BorderFactory.createTitledBorder(null, "输出模块", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        outputConfigButton = new JButton();
        outputConfigButton.setText("点击确认输出配置");
        outputConfigPanel.add(outputConfigButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        scanOutConfigPanel = new JPanel();
        scanOutConfigPanel.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
        scanOutConfigPanel.setBackground(new Color(-725535));
        outputConfigPanel.add(scanOutConfigPanel, new GridConstraints(0, 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, null, null, 0, false));
        htmlRadioButton = new JRadioButton();
        htmlRadioButton.setBackground(new Color(-725535));
        htmlRadioButton.setText("html");
        scanOutConfigPanel.add(htmlRadioButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        cliRadioButton = new JRadioButton();
        cliRadioButton.setBackground(new Color(-725535));
        cliRadioButton.setText("cli");
        scanOutConfigPanel.add(cliRadioButton, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        jsonRadioButton = new JRadioButton();
        jsonRadioButton.setBackground(new Color(-725535));
        jsonRadioButton.setText("json");
        scanOutConfigPanel.add(jsonRadioButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        utilPanel = new JPanel();
        utilPanel.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
        utilPanel.setBackground(new Color(-725535));
        midConfigPanel.add(utilPanel, new GridConstraints(3, 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, null, null, 0, false));
        utilPanel.setBorder(BorderFactory.createTitledBorder(null, "小工具", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        httpUtilButton = new JButton();
        httpUtilButton.setText("http 请求测试");
        utilPanel.add(httpUtilButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        encodeUtilButton = new JButton();
        encodeUtilButton.setText("编码工具");
        utilPanel.add(encodeUtilButton, 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));
        listenUtilButton = new JButton();
        listenUtilButton.setText("监听端口");
        utilPanel.add(listenUtilButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        bottomPanel = new JPanel();
        bottomPanel.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1));
        bottomPanel.setBackground(new Color(-725535));
        SuperXray.add(bottomPanel, new GridConstraints(4, 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, null, null, 0, false));
        authorLabel = new JLabel();
        authorLabel.setHorizontalAlignment(0);
        authorLabel.setHorizontalTextPosition(0);
        authorLabel.setText("<html> <p>Author: 4ra1n (https://github.com/4ra1n) from Chaitin Tech</p> </html>");
        bottomPanel.add(authorLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final Spacer spacer1 = new Spacer();
        bottomPanel.add(spacer1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, new Dimension(-1, 20), null, null, 0, false));
        outputPanel = new JScrollPane();
        outputPanel.setBackground(new Color(-725535));
        outputPanel.setForeground(new Color(-725535));
        SuperXray.add(outputPanel, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, new Dimension(-1, 200), null, null, 0, false));
        outputPanel.setBorder(BorderFactory.createTitledBorder(null, "命令行输出结果：", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
        outputTextArea = new JTextArea();
        outputTextArea.setBackground(new Color(-12828863));
        outputTextArea.setEditable(false);
        outputTextArea.setForeground(new Color(-16711895));
        outputTextArea.setLineWrap(true);
        outputPanel.setViewportView(outputTextArea);
        otherButton = new JPanel();
        otherButton.setLayout(new GridLayoutManager(1, 4, new Insets(0, 0, 0, 0), -1, -1));
        otherButton.setBackground(new Color(-725535));
        SuperXray.add(otherButton, new GridConstraints(3, 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, null, null, 0, false));
        resetPanel = new JPanel();
        resetPanel.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
        resetPanel.setBackground(new Color(-725535));
        otherButton.add(resetPanel, new GridConstraints(0, 1, 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, null, null, 0, false));
        resetConfigLabel = new JLabel();
        resetConfigLabel.setText("恢复默认配置：");
        resetPanel.add(resetConfigLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        resetConfigButton = new JButton();
        resetConfigButton.setText("确认");
        resetPanel.add(resetConfigButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, 1, GridConstraints.SIZEPOLICY_FIXED, null, null, new Dimension(100, -1), 0, false));
        openResultPanel = new JPanel();
        openResultPanel.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
        openResultPanel.setBackground(new Color(-725535));
        otherButton.add(openResultPanel, new GridConstraints(0, 2, 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, null, null, 1, false));
        openResultLabel = new JLabel();
        openResultLabel.setText(" 打开扫描结果：（如果存在）");
        openResultPanel.add(openResultLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        openResultButton = new JButton();
        openResultButton.setText("点击打开扫描结果");
        openResultPanel.add(openResultButton, 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));
        autoDelCheckBox = new JCheckBox();
        autoDelCheckBox.setBackground(new Color(-725535));
        autoDelCheckBox.setText("关闭后自动删除报告");
        openResultPanel.add(autoDelCheckBox, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        stopPanel = new JPanel();
        stopPanel.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
        stopPanel.setBackground(new Color(-725535));
        otherButton.add(stopPanel, new GridConstraints(0, 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, null, null, 0, false));
        stopLabel = new JLabel();
        stopLabel.setText("  如果意外地运行了危险的程序可以点击：");
        stopPanel.add(stopLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        stopButton = new JButton();
        stopButton.setText("强制停止");
        stopPanel.add(stopButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, 1, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        ButtonGroup buttonGroup;
        buttonGroup = new ButtonGroup();
        buttonGroup.add(htmlRadioButton);
        buttonGroup.add(cliRadioButton);
        buttonGroup.add(jsonRadioButton);
        buttonGroup = new ButtonGroup();
        buttonGroup.add(metalRadioButton);
        buttonGroup.add(flatLafRadioButton);
        buttonGroup.add(nimbusRadioButton);
        buttonGroup.add(windowsRadioButton);
        buttonGroup.add(winClassicRadioButton);
        buttonGroup.add(gtkRadioButton);
        buttonGroup.add(aquaRadioButton);
        buttonGroup = new ButtonGroup();
        buttonGroup.add(chineseLangButton);
        buttonGroup.add(englishLangButton);
    }

    /**
     * @noinspection ALL
     */
    public JComponent $$$getRootComponent$$$() {
        return SuperXray;
    }

}

Output:
【漏洞类型】远程代码执行（RCE）
【严重性】高
【漏洞摘要】这是由于使用`Yaml`库加载未验证的用户输入的YAML配置文件导致的远程代码执行漏洞。具体表现为在`LookupConfigForm.java`文件的`saveConfigButton`按钮的`actionPerformed`方法中，直接使用用户在文本区域编辑的配置内容将其加载到`MainForm.configObj`中，而没有进行任何安全验证或限制。攻击者可以通过构造恶意的YAML配置文件来执行任意代码。
【关键代码模式】Yaml.load(newConfig)
【修复方法说明】修复方法通过使用`SafeConstructor`和`LoaderOptions`来创建`Yaml`对象，从而限制了YAML配置文件的加载行为，防止了远程代码执行漏洞的产生。