Commit
·
d04c26a
1
Parent(s):
01b3928
initinal
Browse files- Dockerfile +14 -0
- README.md +5 -3
- lombok.config +11 -0
- pom.xml +75 -0
- src/main/java/com/jetbrains/help/JetbrainsHelpApplication.java +55 -0
- src/main/java/com/jetbrains/help/context/AgentContextHolder.java +108 -0
- src/main/java/com/jetbrains/help/context/CertificateContextHolder.java +111 -0
- src/main/java/com/jetbrains/help/context/LicenseContextHolder.java +77 -0
- src/main/java/com/jetbrains/help/context/PluginsContextHolder.java +203 -0
- src/main/java/com/jetbrains/help/context/ProductsContextHolder.java +54 -0
- src/main/java/com/jetbrains/help/controller/OpenApiController.java +62 -0
- src/main/java/com/jetbrains/help/properties/JetbrainsHelpProperties.java +17 -0
- src/main/java/com/jetbrains/help/route/IndexController.java +73 -0
- src/main/java/com/jetbrains/help/util/FileTools.java +46 -0
- src/main/resources/application.yml +11 -0
- src/main/resources/banner.txt +10 -0
- src/main/resources/external/agent/ja-netfilter.zip +3 -0
- src/main/resources/external/certificate/root.key +30 -0
- src/main/resources/external/data/plugin.json +1612 -0
- src/main/resources/external/data/product.json +67 -0
- src/main/resources/static/css/index.css +574 -0
- src/main/resources/static/images/icons.svg +713 -0
- src/main/resources/static/js/index.js +79 -0
- src/main/resources/static/js/jquery.js +2 -0
- src/main/resources/templates/index.html +116 -0
Dockerfile
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM maven:3-ibm-semeru-21-jammy as build
|
| 2 |
+
WORKDIR /app
|
| 3 |
+
COPY . .
|
| 4 |
+
# improve maven download speed(Domestic network)
|
| 5 |
+
# COPY config/settings.xml /root/.m2/
|
| 6 |
+
RUN mvn clean package
|
| 7 |
+
|
| 8 |
+
FROM ibm-semeru-runtimes:open-21-jre
|
| 9 |
+
WORKDIR /app
|
| 10 |
+
COPY --from=build /app/target/Jetbrains-Help.jar Jetbrains-Help.jar
|
| 11 |
+
ENV TZ=Asia/Shanghai
|
| 12 |
+
RUN ln -sf /usr/share/zoneinfo/{TZ} /etc/localtime && echo "{TZ}" > /etc/timezone
|
| 13 |
+
EXPOSE 10768
|
| 14 |
+
ENTRYPOINT ["java", "-jar", "Jetbrains-Help.jar"]
|
README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
| 1 |
---
|
| 2 |
title: Jetbrains Tools
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: docker
|
| 7 |
pinned: false
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
|
|
| 1 |
---
|
| 2 |
title: Jetbrains Tools
|
| 3 |
+
emoji: 🌖
|
| 4 |
+
colorFrom: red
|
| 5 |
+
colorTo: green
|
| 6 |
sdk: docker
|
| 7 |
pinned: false
|
| 8 |
+
app_port: 10768
|
| 9 |
---
|
| 10 |
|
| 11 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
| 12 |
+
[README.md](README.md)
|
lombok.config
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## 以当前目录为根目录
|
| 2 |
+
config.stopBubbling=true
|
| 3 |
+
|
| 4 |
+
## 默认以链式生成Setter
|
| 5 |
+
lombok.accessors.chain=true
|
| 6 |
+
|
| 7 |
+
## 默认ToString包含超类
|
| 8 |
+
lombok.tostring.callsuper=call
|
| 9 |
+
|
| 10 |
+
## 默认比较器包含超类
|
| 11 |
+
lombok.equalsandhashcode.callsuper=call
|
pom.xml
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
| 3 |
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
| 4 |
+
<modelVersion>4.0.0</modelVersion>
|
| 5 |
+
<parent>
|
| 6 |
+
<groupId>org.springframework.boot</groupId>
|
| 7 |
+
<artifactId>spring-boot-starter-parent</artifactId>
|
| 8 |
+
<version>3.2.4</version>
|
| 9 |
+
<relativePath/> <!-- lookup parent from repository -->
|
| 10 |
+
</parent>
|
| 11 |
+
<groupId>com.jetbrains.help</groupId>
|
| 12 |
+
<artifactId>Jetbrains-Help</artifactId>
|
| 13 |
+
<version>0.0.1-SNAPSHOT</version>
|
| 14 |
+
<name>Jetbrains-Help</name>
|
| 15 |
+
<description>Jetbrains-Help</description>
|
| 16 |
+
<properties>
|
| 17 |
+
<java.version>21</java.version>
|
| 18 |
+
</properties>
|
| 19 |
+
<dependencies>
|
| 20 |
+
<dependency>
|
| 21 |
+
<groupId>org.springframework.boot</groupId>
|
| 22 |
+
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
| 23 |
+
</dependency>
|
| 24 |
+
<dependency>
|
| 25 |
+
<groupId>org.springframework.boot</groupId>
|
| 26 |
+
<artifactId>spring-boot-starter-web</artifactId>
|
| 27 |
+
</dependency>
|
| 28 |
+
<dependency>
|
| 29 |
+
<groupId>org.springframework.boot</groupId>
|
| 30 |
+
<artifactId>spring-boot-configuration-processor</artifactId>
|
| 31 |
+
<optional>true</optional>
|
| 32 |
+
</dependency>
|
| 33 |
+
<dependency>
|
| 34 |
+
<groupId>org.projectlombok</groupId>
|
| 35 |
+
<artifactId>lombok</artifactId>
|
| 36 |
+
<optional>true</optional>
|
| 37 |
+
</dependency>
|
| 38 |
+
|
| 39 |
+
<dependency>
|
| 40 |
+
<groupId>cn.hutool</groupId>
|
| 41 |
+
<artifactId>hutool-all</artifactId>
|
| 42 |
+
<version>5.8.26</version>
|
| 43 |
+
</dependency>
|
| 44 |
+
|
| 45 |
+
<dependency>
|
| 46 |
+
<groupId>org.bouncycastle</groupId>
|
| 47 |
+
<artifactId>bcpkix-jdk18on</artifactId>
|
| 48 |
+
<version>1.78</version>
|
| 49 |
+
</dependency>
|
| 50 |
+
<dependency>
|
| 51 |
+
<groupId>org.bouncycastle</groupId>
|
| 52 |
+
<artifactId>bcprov-jdk18on</artifactId>
|
| 53 |
+
<version>1.78</version>
|
| 54 |
+
</dependency>
|
| 55 |
+
</dependencies>
|
| 56 |
+
|
| 57 |
+
<build>
|
| 58 |
+
<finalName>${artifactId}</finalName>
|
| 59 |
+
<plugins>
|
| 60 |
+
<plugin>
|
| 61 |
+
<groupId>org.springframework.boot</groupId>
|
| 62 |
+
<artifactId>spring-boot-maven-plugin</artifactId>
|
| 63 |
+
<configuration>
|
| 64 |
+
<excludes>
|
| 65 |
+
<exclude>
|
| 66 |
+
<groupId>org.projectlombok</groupId>
|
| 67 |
+
<artifactId>lombok</artifactId>
|
| 68 |
+
</exclude>
|
| 69 |
+
</excludes>
|
| 70 |
+
</configuration>
|
| 71 |
+
</plugin>
|
| 72 |
+
</plugins>
|
| 73 |
+
</build>
|
| 74 |
+
|
| 75 |
+
</project>
|
src/main/java/com/jetbrains/help/JetbrainsHelpApplication.java
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.collection.CollUtil;
|
| 4 |
+
import cn.hutool.core.net.Ipv4Util;
|
| 5 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 6 |
+
import cn.hutool.core.util.StrUtil;
|
| 7 |
+
import cn.hutool.extra.spring.SpringUtil;
|
| 8 |
+
import com.jetbrains.help.context.*;
|
| 9 |
+
import lombok.SneakyThrows;
|
| 10 |
+
import lombok.extern.slf4j.Slf4j;
|
| 11 |
+
import org.springframework.boot.SpringApplication;
|
| 12 |
+
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
| 13 |
+
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
| 14 |
+
import org.springframework.context.annotation.Import;
|
| 15 |
+
import org.springframework.context.event.EventListener;
|
| 16 |
+
import org.springframework.scheduling.annotation.EnableScheduling;
|
| 17 |
+
import org.springframework.scheduling.annotation.Scheduled;
|
| 18 |
+
|
| 19 |
+
import java.net.InetAddress;
|
| 20 |
+
import java.util.Collection;
|
| 21 |
+
import java.util.List;
|
| 22 |
+
|
| 23 |
+
@Slf4j
|
| 24 |
+
@EnableScheduling
|
| 25 |
+
@Import(SpringUtil.class)
|
| 26 |
+
@SpringBootApplication
|
| 27 |
+
public class JetbrainsHelpApplication {
|
| 28 |
+
|
| 29 |
+
public static void main(String[] args) {
|
| 30 |
+
SpringApplication.run(JetbrainsHelpApplication.class, args);
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
@SneakyThrows
|
| 34 |
+
@EventListener(ApplicationReadyEvent.class)
|
| 35 |
+
public void ready() {
|
| 36 |
+
ProductsContextHolder.init();
|
| 37 |
+
PluginsContextHolder.init();
|
| 38 |
+
CertificateContextHolder.init();
|
| 39 |
+
AgentContextHolder.init();
|
| 40 |
+
|
| 41 |
+
InetAddress localHost = InetAddress.getLocalHost();
|
| 42 |
+
String address = CharSequenceUtil.format("http://{}:{}", localHost.getHostAddress(), SpringUtil.getProperty("server.port"));
|
| 43 |
+
String runSuccessWarn = "\n====================================================================================\n" +
|
| 44 |
+
"= Jetbrains-Help Run Success~ =\n" +
|
| 45 |
+
"= address:" + address + " =\n" +
|
| 46 |
+
"====================================================================================\n";
|
| 47 |
+
log.info(runSuccessWarn);
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
@Scheduled(cron = "0 0 12 * * ?")
|
| 51 |
+
public void refresh() {
|
| 52 |
+
PluginsContextHolder.refreshJsonFile();
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
}
|
src/main/java/com/jetbrains/help/context/AgentContextHolder.java
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.context;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.io.FileUtil;
|
| 4 |
+
import cn.hutool.core.io.IORuntimeException;
|
| 5 |
+
import cn.hutool.core.io.IoUtil;
|
| 6 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 7 |
+
import cn.hutool.core.util.ZipUtil;
|
| 8 |
+
import cn.hutool.crypto.KeyUtil;
|
| 9 |
+
import cn.hutool.crypto.PemUtil;
|
| 10 |
+
import com.jetbrains.help.util.FileTools;
|
| 11 |
+
import lombok.AccessLevel;
|
| 12 |
+
import lombok.NoArgsConstructor;
|
| 13 |
+
import lombok.SneakyThrows;
|
| 14 |
+
import lombok.extern.slf4j.Slf4j;
|
| 15 |
+
|
| 16 |
+
import java.io.File;
|
| 17 |
+
import java.math.BigInteger;
|
| 18 |
+
import java.nio.charset.StandardCharsets;
|
| 19 |
+
import java.security.cert.X509Certificate;
|
| 20 |
+
import java.security.interfaces.RSAPublicKey;
|
| 21 |
+
import java.util.concurrent.CompletableFuture;
|
| 22 |
+
|
| 23 |
+
@Slf4j
|
| 24 |
+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
| 25 |
+
public class AgentContextHolder {
|
| 26 |
+
|
| 27 |
+
private static final String JA_NETFILTER_FILE_PATH = "external/agent/ja-netfilter";
|
| 28 |
+
|
| 29 |
+
private static final String POWER_CONF_FILE_NAME = JA_NETFILTER_FILE_PATH + "/config/power.conf";
|
| 30 |
+
|
| 31 |
+
private static File jaNetfilterFile;
|
| 32 |
+
|
| 33 |
+
private static File jaNetfilterZipFile;
|
| 34 |
+
|
| 35 |
+
public static void init() {
|
| 36 |
+
log.info("Agent context init loading...");
|
| 37 |
+
jaNetfilterZipFile = FileTools.getFileOrCreat(JA_NETFILTER_FILE_PATH + ".zip");
|
| 38 |
+
if (!FileTools.fileExists(JA_NETFILTER_FILE_PATH)) {
|
| 39 |
+
unzipJaNetfilter();
|
| 40 |
+
if (!powerConfHasInit()) {
|
| 41 |
+
log.info("Agent config init loading...");
|
| 42 |
+
loadPowerConf();
|
| 43 |
+
zipJaNetfilter();
|
| 44 |
+
log.info("Agent config init success !");
|
| 45 |
+
}
|
| 46 |
+
}
|
| 47 |
+
log.info("Agent context init success !");
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
public static File jaNetfilterZipFile() {
|
| 51 |
+
return AgentContextHolder.jaNetfilterZipFile;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
private static boolean powerConfHasInit() {
|
| 55 |
+
File powerConfFile = FileTools.getFileOrCreat(POWER_CONF_FILE_NAME);
|
| 56 |
+
String powerConfStr;
|
| 57 |
+
try {
|
| 58 |
+
powerConfStr = IoUtil.readUtf8(FileUtil.getInputStream(powerConfFile));
|
| 59 |
+
} catch (IORuntimeException e) {
|
| 60 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} File read failed", POWER_CONF_FILE_NAME), e);
|
| 61 |
+
}
|
| 62 |
+
return CharSequenceUtil.containsAll(powerConfStr, "[Result]", "EQUAL,");
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
private static void loadPowerConf() {
|
| 66 |
+
CompletableFuture
|
| 67 |
+
.supplyAsync(AgentContextHolder::generatePowerConfigRule)
|
| 68 |
+
.thenApply(AgentContextHolder::generatePowerConfigStr)
|
| 69 |
+
.thenAccept(AgentContextHolder::overridePowerConfFileContent)
|
| 70 |
+
.exceptionally(throwable -> {
|
| 71 |
+
log.error("agent context init or refresh failed", throwable);
|
| 72 |
+
return null;
|
| 73 |
+
}).join();
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
@SneakyThrows
|
| 77 |
+
private static String generatePowerConfigRule() {
|
| 78 |
+
X509Certificate crt = (X509Certificate) KeyUtil.readX509Certificate(IoUtil.toStream(CertificateContextHolder.crtFile()));
|
| 79 |
+
RSAPublicKey publicKey = (RSAPublicKey) PemUtil.readPemPublicKey(IoUtil.toStream(CertificateContextHolder.publicKeyFile()));
|
| 80 |
+
RSAPublicKey rootPublicKey = (RSAPublicKey) PemUtil.readPemPublicKey(IoUtil.toStream(CertificateContextHolder.rootKeyFile()));
|
| 81 |
+
BigInteger x = new BigInteger(1, crt.getSignature());
|
| 82 |
+
BigInteger y = BigInteger.valueOf(65537L);
|
| 83 |
+
BigInteger z = rootPublicKey.getModulus();
|
| 84 |
+
BigInteger r = x.modPow(publicKey.getPublicExponent(), publicKey.getModulus());
|
| 85 |
+
return CharSequenceUtil.format("EQUAL,{},{},{}->{}", x, y, z, r);
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
private static String generatePowerConfigStr(String ruleValue) {
|
| 89 |
+
return CharSequenceUtil.builder("[Result]", "\n", ruleValue).toString();
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
private static void overridePowerConfFileContent(String configStr) {
|
| 93 |
+
File powerConfFile = FileTools.getFileOrCreat(POWER_CONF_FILE_NAME);
|
| 94 |
+
try {
|
| 95 |
+
FileUtil.writeString(configStr, powerConfFile, StandardCharsets.UTF_8);
|
| 96 |
+
} catch (IORuntimeException e) {
|
| 97 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} File write failed", POWER_CONF_FILE_NAME), e);
|
| 98 |
+
}
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
private static void unzipJaNetfilter() {
|
| 102 |
+
jaNetfilterFile = ZipUtil.unzip(jaNetfilterZipFile);
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
private static void zipJaNetfilter() {
|
| 106 |
+
jaNetfilterZipFile = ZipUtil.zip(jaNetfilterFile);
|
| 107 |
+
}
|
| 108 |
+
}
|
src/main/java/com/jetbrains/help/context/CertificateContextHolder.java
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.context;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.date.DateField;
|
| 4 |
+
import cn.hutool.core.date.DateUtil;
|
| 5 |
+
import cn.hutool.core.io.FileUtil;
|
| 6 |
+
import cn.hutool.crypto.PemUtil;
|
| 7 |
+
import cn.hutool.crypto.SecureUtil;
|
| 8 |
+
import com.jetbrains.help.util.FileTools;
|
| 9 |
+
import lombok.AccessLevel;
|
| 10 |
+
import lombok.NoArgsConstructor;
|
| 11 |
+
import lombok.extern.slf4j.Slf4j;
|
| 12 |
+
import org.bouncycastle.asn1.x500.X500Name;
|
| 13 |
+
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
|
| 14 |
+
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
|
| 15 |
+
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
|
| 16 |
+
import org.bouncycastle.operator.ContentSigner;
|
| 17 |
+
import org.bouncycastle.operator.OperatorCreationException;
|
| 18 |
+
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
|
| 19 |
+
|
| 20 |
+
import java.io.File;
|
| 21 |
+
import java.math.BigInteger;
|
| 22 |
+
import java.nio.charset.StandardCharsets;
|
| 23 |
+
import java.security.KeyPair;
|
| 24 |
+
import java.security.PrivateKey;
|
| 25 |
+
import java.security.PublicKey;
|
| 26 |
+
import java.security.cert.Certificate;
|
| 27 |
+
import java.security.cert.CertificateEncodingException;
|
| 28 |
+
import java.security.cert.CertificateException;
|
| 29 |
+
|
| 30 |
+
@Slf4j
|
| 31 |
+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
| 32 |
+
public class CertificateContextHolder {
|
| 33 |
+
|
| 34 |
+
private static final String ROOT_KEY_FILE_NAME = "external/certificate/root.key";
|
| 35 |
+
private static final String PRIVATE_KEY_FILE_NAME = "external/certificate/private.key";
|
| 36 |
+
private static final String PUBLIC_KEY_FILE_NAME = "external/certificate/public.key";
|
| 37 |
+
private static final String CET_FILE_NAME = "external/certificate/ca.crt";
|
| 38 |
+
|
| 39 |
+
private static File rootKeyFile;
|
| 40 |
+
|
| 41 |
+
private static File privateKeyFile;
|
| 42 |
+
|
| 43 |
+
private static File publicKeyFile;
|
| 44 |
+
|
| 45 |
+
private static File crtFile;
|
| 46 |
+
|
| 47 |
+
public static void init() {
|
| 48 |
+
log.info("certificate context init loading...");
|
| 49 |
+
rootKeyFile = FileTools.getFileOrCreat(ROOT_KEY_FILE_NAME);
|
| 50 |
+
if (!FileTools.fileExists(PRIVATE_KEY_FILE_NAME)
|
| 51 |
+
|| !FileTools.fileExists(PUBLIC_KEY_FILE_NAME)
|
| 52 |
+
|| !FileTools.fileExists(CET_FILE_NAME)) {
|
| 53 |
+
log.info("certificate context generate loading...");
|
| 54 |
+
generateCertificate();
|
| 55 |
+
log.info("certificate context generate success!");
|
| 56 |
+
} else {
|
| 57 |
+
privateKeyFile = FileTools.getFileOrCreat(PRIVATE_KEY_FILE_NAME);
|
| 58 |
+
publicKeyFile = FileTools.getFileOrCreat(PUBLIC_KEY_FILE_NAME);
|
| 59 |
+
crtFile = FileTools.getFileOrCreat(CET_FILE_NAME);
|
| 60 |
+
}
|
| 61 |
+
log.info("certificate context init success !");
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
public static File rootKeyFile() {
|
| 66 |
+
return CertificateContextHolder.rootKeyFile;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
public static File privateKeyFile() {
|
| 70 |
+
return CertificateContextHolder.privateKeyFile;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
public static File publicKeyFile() {
|
| 74 |
+
return CertificateContextHolder.publicKeyFile;
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
public static File crtFile() {
|
| 78 |
+
return CertificateContextHolder.crtFile;
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
public static void generateCertificate() {
|
| 82 |
+
KeyPair keyPair = SecureUtil.generateKeyPair("RSA", 4096);
|
| 83 |
+
PrivateKey privateKey = keyPair.getPrivate();
|
| 84 |
+
PublicKey publicKey = keyPair.getPublic();
|
| 85 |
+
privateKeyFile = FileTools.getFileOrCreat(PRIVATE_KEY_FILE_NAME);
|
| 86 |
+
PemUtil.writePemObject("PRIVATE KEY", privateKey.getEncoded(), FileUtil.getWriter(privateKeyFile, StandardCharsets.UTF_8, false));
|
| 87 |
+
publicKeyFile = FileTools.getFileOrCreat(PUBLIC_KEY_FILE_NAME);
|
| 88 |
+
PemUtil.writePemObject("PUBLIC KEY", publicKey.getEncoded(), FileUtil.getWriter(publicKeyFile, StandardCharsets.UTF_8, false));
|
| 89 |
+
JcaX509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(
|
| 90 |
+
new X500Name("CN=JetProfile CA"),
|
| 91 |
+
BigInteger.valueOf(System.currentTimeMillis()),
|
| 92 |
+
DateUtil.yesterday(),
|
| 93 |
+
DateUtil.date().offset(DateField.YEAR, 100),
|
| 94 |
+
new X500Name("CN=Jetbrains-Help"),
|
| 95 |
+
SubjectPublicKeyInfo.getInstance(publicKey.getEncoded()));
|
| 96 |
+
try {
|
| 97 |
+
ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSA").build(privateKey);
|
| 98 |
+
Certificate certificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateBuilder.build(signer));
|
| 99 |
+
crtFile = FileTools.getFileOrCreat(CET_FILE_NAME);
|
| 100 |
+
PemUtil.writePemObject("CERTIFICATE", certificate.getEncoded(), FileUtil.getWriter(crtFile, StandardCharsets.UTF_8, false));
|
| 101 |
+
} catch (OperatorCreationException e) {
|
| 102 |
+
throw new IllegalArgumentException("Certificate operator creation exception", e);
|
| 103 |
+
} catch (CertificateEncodingException e) {
|
| 104 |
+
throw new IllegalArgumentException("The certificate encoding exception", e);
|
| 105 |
+
} catch (CertificateException e) {
|
| 106 |
+
throw new IllegalArgumentException("The certificate read exception", e);
|
| 107 |
+
}
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
}
|
src/main/java/com/jetbrains/help/context/LicenseContextHolder.java
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.context;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.codec.Base64;
|
| 4 |
+
import cn.hutool.core.collection.CollUtil;
|
| 5 |
+
import cn.hutool.core.io.IoUtil;
|
| 6 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 7 |
+
import cn.hutool.core.util.IdUtil;
|
| 8 |
+
import cn.hutool.crypto.PemUtil;
|
| 9 |
+
import cn.hutool.crypto.SecureUtil;
|
| 10 |
+
import cn.hutool.crypto.SignUtil;
|
| 11 |
+
import cn.hutool.crypto.asymmetric.Sign;
|
| 12 |
+
import cn.hutool.json.JSONUtil;
|
| 13 |
+
import lombok.AccessLevel;
|
| 14 |
+
import lombok.Data;
|
| 15 |
+
import lombok.NoArgsConstructor;
|
| 16 |
+
import lombok.extern.slf4j.Slf4j;
|
| 17 |
+
|
| 18 |
+
import java.security.PrivateKey;
|
| 19 |
+
import java.security.PublicKey;
|
| 20 |
+
import java.security.cert.Certificate;
|
| 21 |
+
import java.security.cert.CertificateEncodingException;
|
| 22 |
+
import java.util.List;
|
| 23 |
+
import java.util.Set;
|
| 24 |
+
|
| 25 |
+
import static cn.hutool.crypto.asymmetric.SignAlgorithm.SHA1withRSA;
|
| 26 |
+
|
| 27 |
+
@Slf4j
|
| 28 |
+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
| 29 |
+
public class LicenseContextHolder {
|
| 30 |
+
|
| 31 |
+
public static String generateLicense(String licensesName, String assigneeName, String expiryDate, Set<String> productCodeSet) {
|
| 32 |
+
String licenseId = IdUtil.fastSimpleUUID();
|
| 33 |
+
List<Product> products = productCodeSet.stream()
|
| 34 |
+
.map(productCode -> new Product()
|
| 35 |
+
.setCode(productCode)
|
| 36 |
+
.setFallbackDate(expiryDate)
|
| 37 |
+
.setPaidUpTo(expiryDate))
|
| 38 |
+
.toList();
|
| 39 |
+
LicensePart licensePart = new LicensePart()
|
| 40 |
+
.setLicenseId(licenseId)
|
| 41 |
+
.setLicenseeName(licensesName)
|
| 42 |
+
.setAssigneeName(assigneeName)
|
| 43 |
+
.setProducts(products);
|
| 44 |
+
String licensePartJson = JSONUtil.toJsonStr(licensePart);
|
| 45 |
+
String licensePartBase64 = Base64.encode(licensePartJson);
|
| 46 |
+
PrivateKey privateKey = PemUtil.readPemPrivateKey(IoUtil.toStream(CertificateContextHolder.privateKeyFile()));
|
| 47 |
+
PublicKey publicKey = PemUtil.readPemPublicKey(IoUtil.toStream(CertificateContextHolder.publicKeyFile()));
|
| 48 |
+
Certificate certificate = SecureUtil.readX509Certificate(IoUtil.toStream(CertificateContextHolder.crtFile()));
|
| 49 |
+
Sign sign = SignUtil.sign(SHA1withRSA, privateKey.getEncoded(), publicKey.getEncoded());
|
| 50 |
+
String signatureBase64 = Base64.encode(sign.sign(licensePartJson));
|
| 51 |
+
String certBase64;
|
| 52 |
+
try {
|
| 53 |
+
certBase64 = Base64.encode(certificate.getEncoded());
|
| 54 |
+
} catch (CertificateEncodingException e) {
|
| 55 |
+
throw new IllegalArgumentException("Certificate extraction failed", e);
|
| 56 |
+
}
|
| 57 |
+
return CharSequenceUtil.format("{}-{}-{}-{}", licenseId, licensePartBase64, signatureBase64, certBase64);
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
@Data
|
| 61 |
+
public static class LicensePart {
|
| 62 |
+
|
| 63 |
+
private String licenseId;
|
| 64 |
+
private String licenseeName;
|
| 65 |
+
private String assigneeName;
|
| 66 |
+
private List<Product> products;
|
| 67 |
+
private String metadata = "0120230914PSAX000005";
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
@Data
|
| 71 |
+
public static class Product {
|
| 72 |
+
private String code;
|
| 73 |
+
private String fallbackDate;
|
| 74 |
+
private String paidUpTo;
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
}
|
src/main/java/com/jetbrains/help/context/PluginsContextHolder.java
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.context;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.io.FileUtil;
|
| 4 |
+
import cn.hutool.core.io.IORuntimeException;
|
| 5 |
+
import cn.hutool.core.io.IoUtil;
|
| 6 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 7 |
+
import cn.hutool.http.HttpUtil;
|
| 8 |
+
import cn.hutool.json.JSONUtil;
|
| 9 |
+
import com.jetbrains.help.util.FileTools;
|
| 10 |
+
import lombok.AccessLevel;
|
| 11 |
+
import lombok.Data;
|
| 12 |
+
import lombok.NoArgsConstructor;
|
| 13 |
+
import lombok.extern.slf4j.Slf4j;
|
| 14 |
+
|
| 15 |
+
import java.io.File;
|
| 16 |
+
import java.io.IOException;
|
| 17 |
+
import java.io.InputStream;
|
| 18 |
+
import java.nio.charset.StandardCharsets;
|
| 19 |
+
import java.util.List;
|
| 20 |
+
import java.util.concurrent.CompletableFuture;
|
| 21 |
+
|
| 22 |
+
@Slf4j
|
| 23 |
+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
| 24 |
+
public class PluginsContextHolder {
|
| 25 |
+
|
| 26 |
+
private static final String PLUGIN_BASIC_URL = "https://plugins.jetbrains.com";
|
| 27 |
+
|
| 28 |
+
private static final String PLUGIN_LIST_URL = PLUGIN_BASIC_URL + "/api/searchPlugins?max=10000&offset=0&orderBy=name";
|
| 29 |
+
|
| 30 |
+
private static final String PLUGIN_INFO_URL = PLUGIN_BASIC_URL + "/api/plugins/";
|
| 31 |
+
|
| 32 |
+
private static final String PLUGIN_JSON_FILE_NAME = "external/data/plugin.json";
|
| 33 |
+
|
| 34 |
+
private static List<PluginCache> pluginCacheList;
|
| 35 |
+
|
| 36 |
+
private static File pluginsJsonFile;
|
| 37 |
+
|
| 38 |
+
public static void init() {
|
| 39 |
+
log.info("Plugin context init loading...");
|
| 40 |
+
pluginsJsonFile = FileTools.getFileOrCreat(PLUGIN_JSON_FILE_NAME);
|
| 41 |
+
|
| 42 |
+
String pluginJsonArray;
|
| 43 |
+
try {
|
| 44 |
+
pluginJsonArray = IoUtil.readUtf8(FileUtil.getInputStream(pluginsJsonFile));
|
| 45 |
+
} catch (IORuntimeException e) {
|
| 46 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} File read failed", PLUGIN_JSON_FILE_NAME), e);
|
| 47 |
+
}
|
| 48 |
+
if (CharSequenceUtil.isBlank(pluginJsonArray) || !JSONUtil.isTypeJSON(pluginJsonArray)) {
|
| 49 |
+
refreshJsonFile();
|
| 50 |
+
} else {
|
| 51 |
+
pluginCacheList = JSONUtil.toList(pluginJsonArray, PluginCache.class);
|
| 52 |
+
log.info("Plugin context init success !");
|
| 53 |
+
}
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
public static List<PluginCache> pluginCacheList() {
|
| 57 |
+
return PluginsContextHolder.pluginCacheList;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
public static void refreshJsonFile() {
|
| 61 |
+
log.info("Init or Refresh plugin context from 'JetBrains.com' loading...");
|
| 62 |
+
CompletableFuture
|
| 63 |
+
.supplyAsync(PluginsContextHolder::pluginList)
|
| 64 |
+
.thenApply(PluginsContextHolder::pluginListFilter)
|
| 65 |
+
.thenApply(PluginsContextHolder::pluginConversion)
|
| 66 |
+
.thenAccept(PluginsContextHolder::overrideJsonFile)
|
| 67 |
+
.exceptionally(throwable -> {
|
| 68 |
+
log.error("Plugin context init or refresh failed", throwable);
|
| 69 |
+
return null;
|
| 70 |
+
});
|
| 71 |
+
log.info("Init or Refresh plugin context success !");
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
public static void overrideJsonFile(List<PluginCache> pluginCaches) {
|
| 75 |
+
pluginCacheList.addAll(pluginCaches);
|
| 76 |
+
String jsonStr = JSONUtil.toJsonStr(pluginCacheList);
|
| 77 |
+
try {
|
| 78 |
+
FileUtil.writeString(jsonStr, pluginsJsonFile, StandardCharsets.UTF_8);
|
| 79 |
+
} catch (IORuntimeException e) {
|
| 80 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} File write failed", PLUGIN_JSON_FILE_NAME), e);
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
public static PluginList pluginList() {
|
| 86 |
+
return HttpUtil.createGet(PLUGIN_LIST_URL)
|
| 87 |
+
.thenFunction(response -> {
|
| 88 |
+
try (InputStream is = response.bodyStream()) {
|
| 89 |
+
if (!response.isOk()) {
|
| 90 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} The request failed = {}", PLUGIN_LIST_URL, response));
|
| 91 |
+
}
|
| 92 |
+
return IoUtil.readObj(is, PluginList.class);
|
| 93 |
+
} catch (IOException e) {
|
| 94 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} The request io read failed", PLUGIN_LIST_URL), e);
|
| 95 |
+
}
|
| 96 |
+
});
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
public static List<PluginList.Plugin> pluginListFilter(PluginList pluginList) {
|
| 100 |
+
return pluginList.getPlugins()
|
| 101 |
+
.stream()
|
| 102 |
+
.filter(plugin -> !PluginsContextHolder.pluginCacheList.contains(new PluginCache().setId(plugin.getId())))
|
| 103 |
+
.filter(plugin -> !CharSequenceUtil.equals(plugin.getPricingModel(), "FREE"))
|
| 104 |
+
.toList();
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
public static List<PluginCache> pluginConversion(List<PluginList.Plugin> pluginList) {
|
| 108 |
+
return pluginList
|
| 109 |
+
.stream()
|
| 110 |
+
.map(plugin -> {
|
| 111 |
+
String productCode = pluginInfo(plugin.getId()).getPurchaseInfo().getProductCode();
|
| 112 |
+
return new PluginCache()
|
| 113 |
+
.setId(plugin.getId())
|
| 114 |
+
.setProductCode(productCode)
|
| 115 |
+
.setName(plugin.getName())
|
| 116 |
+
.setPricingModel(plugin.getPricingModel())
|
| 117 |
+
.setIcon(PLUGIN_BASIC_URL + plugin.getIcon())
|
| 118 |
+
;
|
| 119 |
+
})
|
| 120 |
+
.toList();
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
public static PluginInfo pluginInfo(Long pluginId) {
|
| 124 |
+
return HttpUtil.createGet(PLUGIN_INFO_URL + pluginId)
|
| 125 |
+
.thenFunction(response -> {
|
| 126 |
+
try (InputStream is = response.bodyStream()) {
|
| 127 |
+
if (!response.isOk()) {
|
| 128 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} The request failed = {}", PLUGIN_INFO_URL, response));
|
| 129 |
+
}
|
| 130 |
+
return IoUtil.readObj(is, PluginInfo.class);
|
| 131 |
+
} catch (IOException e) {
|
| 132 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} The request io read failed", PLUGIN_LIST_URL), e);
|
| 133 |
+
}
|
| 134 |
+
});
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
|
| 138 |
+
@Data
|
| 139 |
+
public static class PluginCache {
|
| 140 |
+
|
| 141 |
+
private Long id;
|
| 142 |
+
private String productCode;
|
| 143 |
+
private String name;
|
| 144 |
+
private String pricingModel;
|
| 145 |
+
private String icon;
|
| 146 |
+
|
| 147 |
+
@Override
|
| 148 |
+
public final boolean equals(Object o) {
|
| 149 |
+
if (this == o) return true;
|
| 150 |
+
if (!(o instanceof PluginCache that)) return false;
|
| 151 |
+
|
| 152 |
+
return id.equals(that.id);
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
@Override
|
| 156 |
+
public int hashCode() {
|
| 157 |
+
return id.hashCode();
|
| 158 |
+
}
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
@Data
|
| 162 |
+
public static class PluginInfo {
|
| 163 |
+
|
| 164 |
+
private Long id;
|
| 165 |
+
|
| 166 |
+
private PurchaseInfo purchaseInfo;
|
| 167 |
+
|
| 168 |
+
@Data
|
| 169 |
+
public static class PurchaseInfo {
|
| 170 |
+
|
| 171 |
+
private String productCode;
|
| 172 |
+
}
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
@Data
|
| 176 |
+
public static class PluginList {
|
| 177 |
+
|
| 178 |
+
private List<Plugin> plugins;
|
| 179 |
+
private Long total;
|
| 180 |
+
|
| 181 |
+
|
| 182 |
+
@Data
|
| 183 |
+
public static class Plugin {
|
| 184 |
+
|
| 185 |
+
private Long id;
|
| 186 |
+
private String name;
|
| 187 |
+
private String preview;
|
| 188 |
+
private Integer downloads;
|
| 189 |
+
private String pricingModel;
|
| 190 |
+
private String organization;
|
| 191 |
+
private String icon;
|
| 192 |
+
private String previewImage;
|
| 193 |
+
private Double rating;
|
| 194 |
+
private VendorInfo vendorInfo;
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
@Data
|
| 198 |
+
public static class VendorInfo {
|
| 199 |
+
private String name;
|
| 200 |
+
private Boolean isVerified;
|
| 201 |
+
}
|
| 202 |
+
}
|
| 203 |
+
}
|
src/main/java/com/jetbrains/help/context/ProductsContextHolder.java
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.context;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.io.FileUtil;
|
| 4 |
+
import cn.hutool.core.io.IORuntimeException;
|
| 5 |
+
import cn.hutool.core.io.IoUtil;
|
| 6 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 7 |
+
import cn.hutool.json.JSONUtil;
|
| 8 |
+
import com.jetbrains.help.util.FileTools;
|
| 9 |
+
import lombok.AccessLevel;
|
| 10 |
+
import lombok.Data;
|
| 11 |
+
import lombok.NoArgsConstructor;
|
| 12 |
+
import lombok.extern.slf4j.Slf4j;
|
| 13 |
+
|
| 14 |
+
import java.io.File;
|
| 15 |
+
import java.util.List;
|
| 16 |
+
|
| 17 |
+
@Slf4j
|
| 18 |
+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
| 19 |
+
public class ProductsContextHolder {
|
| 20 |
+
|
| 21 |
+
private static final String PRODUCT_JSON_FILE_NAME = "external/data/product.json";
|
| 22 |
+
|
| 23 |
+
private static List<ProductCache> productCacheList;
|
| 24 |
+
|
| 25 |
+
public static void init() {
|
| 26 |
+
log.info("Product context init loading...");
|
| 27 |
+
File productJsonFile = FileTools.getFileOrCreat(PRODUCT_JSON_FILE_NAME);
|
| 28 |
+
|
| 29 |
+
String productJsonArray;
|
| 30 |
+
try {
|
| 31 |
+
productJsonArray = IoUtil.readUtf8(FileUtil.getInputStream(productJsonFile));
|
| 32 |
+
} catch (IORuntimeException e) {
|
| 33 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} File read failed !", PRODUCT_JSON_FILE_NAME), e);
|
| 34 |
+
}
|
| 35 |
+
if (CharSequenceUtil.isBlank(productJsonArray) || !JSONUtil.isTypeJSON(productJsonArray)) {
|
| 36 |
+
log.error("Jetbrains Product data does not exist !");
|
| 37 |
+
} else {
|
| 38 |
+
productCacheList = JSONUtil.toList(productJsonArray, ProductCache.class);
|
| 39 |
+
log.info("Product context init success !");
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
public static List<ProductCache> productCacheList() {
|
| 44 |
+
return ProductsContextHolder.productCacheList;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
@Data
|
| 48 |
+
public static class ProductCache {
|
| 49 |
+
|
| 50 |
+
private String name;
|
| 51 |
+
private String productCode;
|
| 52 |
+
private String iconClass;
|
| 53 |
+
}
|
| 54 |
+
}
|
src/main/java/com/jetbrains/help/controller/OpenApiController.java
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.controller;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.collection.CollUtil;
|
| 4 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 5 |
+
import cn.hutool.core.util.StrUtil;
|
| 6 |
+
import com.jetbrains.help.context.LicenseContextHolder;
|
| 7 |
+
import com.jetbrains.help.context.PluginsContextHolder;
|
| 8 |
+
import com.jetbrains.help.context.ProductsContextHolder;
|
| 9 |
+
import lombok.Data;
|
| 10 |
+
import org.springframework.web.bind.annotation.PostMapping;
|
| 11 |
+
import org.springframework.web.bind.annotation.RequestBody;
|
| 12 |
+
import org.springframework.web.bind.annotation.RestController;
|
| 13 |
+
|
| 14 |
+
import java.util.Collection;
|
| 15 |
+
import java.util.HashSet;
|
| 16 |
+
import java.util.List;
|
| 17 |
+
import java.util.Set;
|
| 18 |
+
|
| 19 |
+
@RestController
|
| 20 |
+
public class OpenApiController {
|
| 21 |
+
|
| 22 |
+
@Data
|
| 23 |
+
public static class GenerateLicenseReqBody {
|
| 24 |
+
|
| 25 |
+
private String licenseName;
|
| 26 |
+
|
| 27 |
+
private String assigneeName;
|
| 28 |
+
|
| 29 |
+
private String expiryDate;
|
| 30 |
+
|
| 31 |
+
private String productCode;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
@PostMapping("generateLicense")
|
| 35 |
+
public String generateLicense(@RequestBody GenerateLicenseReqBody body) {
|
| 36 |
+
Set<String> productCodeSet;
|
| 37 |
+
if (CharSequenceUtil.isBlank(body.getProductCode())) {
|
| 38 |
+
List<String> productCodeList = ProductsContextHolder.productCacheList()
|
| 39 |
+
.stream()
|
| 40 |
+
.map(ProductsContextHolder.ProductCache::getProductCode)
|
| 41 |
+
.filter(StrUtil::isNotBlank)
|
| 42 |
+
.map(productCode -> CharSequenceUtil.splitTrim(productCode, ","))
|
| 43 |
+
.flatMap(Collection::stream)
|
| 44 |
+
.toList();
|
| 45 |
+
List<String> pluginCodeList = PluginsContextHolder.pluginCacheList()
|
| 46 |
+
.stream()
|
| 47 |
+
.map(PluginsContextHolder.PluginCache::getProductCode)
|
| 48 |
+
.filter(StrUtil::isNotBlank)
|
| 49 |
+
.toList();
|
| 50 |
+
productCodeSet = CollUtil.newHashSet(productCodeList);
|
| 51 |
+
productCodeSet.addAll(pluginCodeList);
|
| 52 |
+
}else {
|
| 53 |
+
productCodeSet = CollUtil.newHashSet(CharSequenceUtil.splitTrim(body.getProductCode(), ','));
|
| 54 |
+
}
|
| 55 |
+
return LicenseContextHolder.generateLicense(
|
| 56 |
+
body.getLicenseName(),
|
| 57 |
+
body.getAssigneeName(),
|
| 58 |
+
body.getExpiryDate(),
|
| 59 |
+
productCodeSet
|
| 60 |
+
);
|
| 61 |
+
}
|
| 62 |
+
}
|
src/main/java/com/jetbrains/help/properties/JetbrainsHelpProperties.java
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.properties;
|
| 2 |
+
|
| 3 |
+
import lombok.Data;
|
| 4 |
+
import org.springframework.boot.context.properties.ConfigurationProperties;
|
| 5 |
+
import org.springframework.context.annotation.Configuration;
|
| 6 |
+
|
| 7 |
+
@Data
|
| 8 |
+
@Configuration
|
| 9 |
+
@ConfigurationProperties("help")
|
| 10 |
+
public class JetbrainsHelpProperties {
|
| 11 |
+
|
| 12 |
+
private String defaultLicenseName;
|
| 13 |
+
|
| 14 |
+
private String defaultAssigneeName;
|
| 15 |
+
|
| 16 |
+
private String defaultExpiryDate;
|
| 17 |
+
}
|
src/main/java/com/jetbrains/help/route/IndexController.java
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.route;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.io.FileUtil;
|
| 4 |
+
import cn.hutool.core.io.IoUtil;
|
| 5 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 6 |
+
import cn.hutool.core.util.StrUtil;
|
| 7 |
+
import com.jetbrains.help.JetbrainsHelpApplication;
|
| 8 |
+
import com.jetbrains.help.context.AgentContextHolder;
|
| 9 |
+
import com.jetbrains.help.context.PluginsContextHolder;
|
| 10 |
+
import com.jetbrains.help.context.ProductsContextHolder;
|
| 11 |
+
import com.jetbrains.help.properties.JetbrainsHelpProperties;
|
| 12 |
+
import lombok.AllArgsConstructor;
|
| 13 |
+
import lombok.RequiredArgsConstructor;
|
| 14 |
+
import org.springframework.core.io.InputStreamResource;
|
| 15 |
+
import org.springframework.core.io.Resource;
|
| 16 |
+
import org.springframework.http.MediaType;
|
| 17 |
+
import org.springframework.http.ResponseEntity;
|
| 18 |
+
import org.springframework.stereotype.Controller;
|
| 19 |
+
import org.springframework.ui.Model;
|
| 20 |
+
import org.springframework.web.bind.annotation.GetMapping;
|
| 21 |
+
import org.springframework.web.bind.annotation.RequestParam;
|
| 22 |
+
import org.springframework.web.bind.annotation.ResponseBody;
|
| 23 |
+
|
| 24 |
+
import java.io.File;
|
| 25 |
+
import java.util.List;
|
| 26 |
+
|
| 27 |
+
import static org.springframework.http.HttpHeaders.CONTENT_DISPOSITION;
|
| 28 |
+
import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM;
|
| 29 |
+
|
| 30 |
+
@Controller
|
| 31 |
+
@RequiredArgsConstructor
|
| 32 |
+
public class IndexController {
|
| 33 |
+
|
| 34 |
+
private final JetbrainsHelpProperties jetbrainsHelpProperties;
|
| 35 |
+
|
| 36 |
+
@GetMapping
|
| 37 |
+
public String index(Model model) {
|
| 38 |
+
List<ProductsContextHolder.ProductCache> productCacheList = ProductsContextHolder.productCacheList();
|
| 39 |
+
List<PluginsContextHolder.PluginCache> pluginCacheList = PluginsContextHolder.pluginCacheList();
|
| 40 |
+
model.addAttribute("products", productCacheList);
|
| 41 |
+
model.addAttribute("plugins", pluginCacheList);
|
| 42 |
+
model.addAttribute("defaults", jetbrainsHelpProperties);
|
| 43 |
+
return "index";
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
@GetMapping("search")
|
| 47 |
+
public String index(@RequestParam(required = false) String search, Model model) {
|
| 48 |
+
List<ProductsContextHolder.ProductCache> productCacheList = ProductsContextHolder.productCacheList();
|
| 49 |
+
List<PluginsContextHolder.PluginCache> pluginCacheList = PluginsContextHolder.pluginCacheList();
|
| 50 |
+
if (CharSequenceUtil.isNotBlank(search)) {
|
| 51 |
+
productCacheList = productCacheList.stream()
|
| 52 |
+
.filter(productCache -> CharSequenceUtil.containsIgnoreCase(productCache.getName(), search))
|
| 53 |
+
.toList();
|
| 54 |
+
pluginCacheList = pluginCacheList.stream()
|
| 55 |
+
.filter(pluginCache -> CharSequenceUtil.containsIgnoreCase(pluginCache.getName(), search))
|
| 56 |
+
.toList();
|
| 57 |
+
}
|
| 58 |
+
model.addAttribute("products", productCacheList);
|
| 59 |
+
model.addAttribute("plugins", pluginCacheList);
|
| 60 |
+
model.addAttribute("defaults", jetbrainsHelpProperties);
|
| 61 |
+
return "index::product-list";
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
@GetMapping("ja-netfilter")
|
| 65 |
+
@ResponseBody
|
| 66 |
+
public ResponseEntity<Resource> downloadJaNetfilter() {
|
| 67 |
+
File jaNetfilterZipFile = AgentContextHolder.jaNetfilterZipFile();
|
| 68 |
+
return ResponseEntity.ok()
|
| 69 |
+
.header(CONTENT_DISPOSITION, "attachment;filename=" + jaNetfilterZipFile.getName())
|
| 70 |
+
.contentType(APPLICATION_OCTET_STREAM)
|
| 71 |
+
.body(new InputStreamResource(FileUtil.getInputStream(jaNetfilterZipFile)));
|
| 72 |
+
}
|
| 73 |
+
}
|
src/main/java/com/jetbrains/help/util/FileTools.java
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
package com.jetbrains.help.util;
|
| 2 |
+
|
| 3 |
+
import cn.hutool.core.io.FileUtil;
|
| 4 |
+
import cn.hutool.core.text.CharSequenceUtil;
|
| 5 |
+
import cn.hutool.core.util.ObjectUtil;
|
| 6 |
+
import cn.hutool.core.util.StrUtil;
|
| 7 |
+
import org.springframework.boot.system.ApplicationHome;
|
| 8 |
+
import org.springframework.core.io.ClassPathResource;
|
| 9 |
+
|
| 10 |
+
import java.io.File;
|
| 11 |
+
import java.io.IOException;
|
| 12 |
+
|
| 13 |
+
public interface FileTools {
|
| 14 |
+
|
| 15 |
+
ApplicationHome application = new ApplicationHome();
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
static boolean fileExists(String path) {
|
| 19 |
+
return getFile(path).exists();
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
static File getFile(String path) {
|
| 23 |
+
File homeDir = application.getDir();
|
| 24 |
+
File source = application.getSource();
|
| 25 |
+
ClassPathResource classPathResource = new ClassPathResource(path);
|
| 26 |
+
return ObjectUtil.isNull(source) ? FileUtil.file(classPathResource.getPath()) : FileUtil.file(homeDir, path);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
static File getFileOrCreat(String path) {
|
| 30 |
+
File file = getFile(path);
|
| 31 |
+
if (ObjectUtil.isNotNull(application.getSource())) {
|
| 32 |
+
ClassPathResource classPathResource = new ClassPathResource(path);
|
| 33 |
+
File classPathFile = FileUtil.file(classPathResource.getPath());
|
| 34 |
+
if (classPathResource.exists() && !file.exists()) {
|
| 35 |
+
try {
|
| 36 |
+
FileUtil.writeFromStream(classPathResource.getInputStream(), classPathFile);
|
| 37 |
+
} catch (Exception e) {
|
| 38 |
+
throw new IllegalArgumentException(CharSequenceUtil.format("{} File read failed", classPathFile.getPath()), e);
|
| 39 |
+
}
|
| 40 |
+
FileUtil.copy(classPathFile, file, true);
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
return file;
|
| 44 |
+
|
| 45 |
+
}
|
| 46 |
+
}
|
src/main/resources/application.yml
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
spring:
|
| 2 |
+
application:
|
| 3 |
+
name: Jetbrains-Help
|
| 4 |
+
thymeleaf:
|
| 5 |
+
cache: false
|
| 6 |
+
server:
|
| 7 |
+
port: 10768
|
| 8 |
+
help:
|
| 9 |
+
default-license-name: Mr.Kong
|
| 10 |
+
default-assignee-name: Focusprogram
|
| 11 |
+
default-expiry-date: 2100-01-01
|
src/main/resources/banner.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
██╗███████╗████████╗██████╗ ██████╗ █████╗ ██╗███╗ ██╗███████╗ ██╗ ██╗███████╗██╗ ██████╗
|
| 3 |
+
██║██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██╔══██╗██║████╗ ██║██╔════╝ ██║ ██║██╔════╝██║ ██╔══██╗
|
| 4 |
+
██║█████╗ ██║ ██████╔╝██████╔╝███████║██║██╔██╗ ██║███████╗█████╗███████║█████╗ ██║ ██████╔╝
|
| 5 |
+
██ ██║██╔══╝ ██║ ██╔══██╗██╔══██╗██╔══██║██║██║╚██╗██║╚════██║╚════╝██╔══██║██╔══╝ ██║ ██╔═══╝
|
| 6 |
+
╚█████╔╝███████╗ ██║ ██████╔╝██║ ██║██║ ██║██║██║ ╚████║███████║ ██║ ██║███████╗███████╗██║
|
| 7 |
+
╚════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝
|
| 8 |
+
|
| 9 |
+
${AnsiColor.BRIGHT_YELLOW} Spring Boot Version: ${spring-boot.version}
|
| 10 |
+
|
src/main/resources/external/agent/ja-netfilter.zip
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:39e3171f70dc338add05378f1df3cf785bb3aa1918939cbf44f9c46fa7dfbb65
|
| 3 |
+
size 66088
|
src/main/resources/external/certificate/root.key
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-----BEGIN CERTIFICATE-----
|
| 2 |
+
MIIFOzCCAyOgAwIBAgIJANJssYOyg3nhMA0GCSqGSIb3DQEBCwUAMBgxFjAUBgNV
|
| 3 |
+
BAMMDUpldFByb2ZpbGUgQ0EwHhcNMTUxMDAyMTEwMDU2WhcNNDUxMDI0MTEwMDU2
|
| 4 |
+
WjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMIICIjANBgkqhkiG9w0BAQEFAAOC
|
| 5 |
+
Ag8AMIICCgKCAgEA0tQuEA8784NabB1+T2XBhpB+2P1qjewHiSajAV8dfIeWJOYG
|
| 6 |
+
y+ShXiuedj8rL8VCdU+yH7Ux/6IvTcT3nwM/E/3rjJIgLnbZNerFm15Eez+XpWBl
|
| 7 |
+
m5fDBJhEGhPc89Y31GpTzW0vCLmhJ44XwvYPntWxYISUrqeR3zoUQrCEp1C6mXNX
|
| 8 |
+
EpqIGIVbJ6JVa/YI+pwbfuP51o0ZtF2rzvgfPzKtkpYQ7m7KgA8g8ktRXyNrz8bo
|
| 9 |
+
iwg7RRPeqs4uL/RK8d2KLpgLqcAB9WDpcEQzPWegbDrFO1F3z4UVNH6hrMfOLGVA
|
| 10 |
+
xoiQhNFhZj6RumBXlPS0rmCOCkUkWrDr3l6Z3spUVgoeea+QdX682j6t7JnakaOw
|
| 11 |
+
jzwY777SrZoi9mFFpLVhfb4haq4IWyKSHR3/0BlWXgcgI6w6LXm+V+ZgLVDON52F
|
| 12 |
+
LcxnfftaBJz2yclEwBohq38rYEpb+28+JBvHJYqcZRaldHYLjjmb8XXvf2MyFeXr
|
| 13 |
+
SopYkdzCvzmiEJAewrEbPUaTllogUQmnv7Rv9sZ9jfdJ/cEn8e7GSGjHIbnjV2ZM
|
| 14 |
+
Q9vTpWjvsT/cqatbxzdBo/iEg5i9yohOC9aBfpIHPXFw+fEj7VLvktxZY6qThYXR
|
| 15 |
+
Rus1WErPgxDzVpNp+4gXovAYOxsZak5oTV74ynv1aQ93HSndGkKUE/qA/JECAwEA
|
| 16 |
+
AaOBhzCBhDAdBgNVHQ4EFgQUo562SGdCEjZBvW3gubSgUouX8bMwSAYDVR0jBEEw
|
| 17 |
+
P4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2Zp
|
| 18 |
+
bGUgQ0GCCQDSbLGDsoN54TAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkq
|
| 19 |
+
hkiG9w0BAQsFAAOCAgEAjrPAZ4xC7sNiSSqh69s3KJD3Ti4etaxcrSnD7r9rJYpK
|
| 20 |
+
BMviCKZRKFbLv+iaF5JK5QWuWdlgA37ol7mLeoF7aIA9b60Ag2OpgRICRG79QY7o
|
| 21 |
+
uLviF/yRMqm6yno7NYkGLd61e5Huu+BfT459MWG9RVkG/DY0sGfkyTHJS5xrjBV6
|
| 22 |
+
hjLG0lf3orwqOlqSNRmhvn9sMzwAP3ILLM5VJC5jNF1zAk0jrqKz64vuA8PLJZlL
|
| 23 |
+
S9TZJIYwdesCGfnN2AETvzf3qxLcGTF038zKOHUMnjZuFW1ba/12fDK5GJ4i5y+n
|
| 24 |
+
fDWVZVUDYOPUixEZ1cwzmf9Tx3hR8tRjMWQmHixcNC8XEkVfztID5XeHtDeQ+uPk
|
| 25 |
+
X+jTDXbRb+77BP6n41briXhm57AwUI3TqqJFvoiFyx5JvVWG3ZqlVaeU/U9e0gxn
|
| 26 |
+
8qyR+ZA3BGbtUSDDs8LDnE67URzK+L+q0F2BC758lSPNB2qsJeQ63bYyzf0du3wB
|
| 27 |
+
/gb2+xJijAvscU3KgNpkxfGklvJD/oDUIqZQAnNcHe7QEf8iG2WqaMJIyXZlW3me
|
| 28 |
+
0rn+cgvxHPt6N4EBh5GgNZR4l0eaFEV+fxVsydOQYo1RIyFMXtafFBqQl6DDxujl
|
| 29 |
+
FeU3FZ+Bcp12t7dlM4E0/sS1XdL47CfGVj4Bp+/VbF862HmkAbd7shs7sDQkHbU=
|
| 30 |
+
-----END CERTIFICATE-----
|
src/main/resources/external/data/plugin.json
ADDED
|
@@ -0,0 +1,1612 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"id": 9269,
|
| 4 |
+
"productCode": "PAEMIDE",
|
| 5 |
+
"name": "AEM IDE",
|
| 6 |
+
"pricingModel": "PAID",
|
| 7 |
+
"icon": "https://plugins.jetbrains.com/files/9269/503057/icon/pluginIcon.svg"
|
| 8 |
+
},
|
| 9 |
+
{
|
| 10 |
+
"id": 9863,
|
| 11 |
+
"productCode": "PAEM",
|
| 12 |
+
"name": "AEM Support",
|
| 13 |
+
"pricingModel": "PAID",
|
| 14 |
+
"icon": "https://plugins.jetbrains.com/files/9863/509753/icon/pluginIcon.svg"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"id": 21263,
|
| 18 |
+
"productCode": "PAICODING",
|
| 19 |
+
"name": "AI Coding",
|
| 20 |
+
"pricingModel": "PAID",
|
| 21 |
+
"icon": "https://plugins.jetbrains.com/files/21263/513630/icon/pluginIcon.svg"
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"id": 21289,
|
| 25 |
+
"productCode": "PCAICOMMITAPP",
|
| 26 |
+
"name": "AICommit",
|
| 27 |
+
"pricingModel": "PAID",
|
| 28 |
+
"icon": "https://plugins.jetbrains.com/files/21289/504423/icon/pluginIcon.svg"
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
"id": 12408,
|
| 32 |
+
"productCode": "PBISAA",
|
| 33 |
+
"name": "Android Antidecompiler",
|
| 34 |
+
"pricingModel": "PAID",
|
| 35 |
+
"icon": "https://plugins.jetbrains.com/files/12408/229970/icon/pluginIcon.svg"
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"id": 15456,
|
| 39 |
+
"productCode": "PAPH",
|
| 40 |
+
"name": "Android Package Helper",
|
| 41 |
+
"pricingModel": "PAID",
|
| 42 |
+
"icon": "https://plugins.jetbrains.com/files/15456/104869/icon/pluginIcon.svg"
|
| 43 |
+
},
|
| 44 |
+
{
|
| 45 |
+
"id": 13156,
|
| 46 |
+
"productCode": "PWIFIADB",
|
| 47 |
+
"name": "Android WiFiADB",
|
| 48 |
+
"pricingModel": "PAID",
|
| 49 |
+
"icon": "https://plugins.jetbrains.com/files/13156/154275/icon/pluginIcon.svg"
|
| 50 |
+
},
|
| 51 |
+
{
|
| 52 |
+
"id": 9707,
|
| 53 |
+
"productCode": "PANSIHIGHLIGHT",
|
| 54 |
+
"name": "ANSI Highlighter Premium",
|
| 55 |
+
"pricingModel": "PAID",
|
| 56 |
+
"icon": "https://plugins.jetbrains.com/files/9707/518674/icon/pluginIcon.svg"
|
| 57 |
+
},
|
| 58 |
+
{
|
| 59 |
+
"id": 18357,
|
| 60 |
+
"productCode": "PCDAPIRUNNER",
|
| 61 |
+
"name": "API Runner",
|
| 62 |
+
"pricingModel": "PAID",
|
| 63 |
+
"icon": "https://plugins.jetbrains.com/files/18357/269544/icon/pluginIcon.svg"
|
| 64 |
+
},
|
| 65 |
+
{
|
| 66 |
+
"id": 16682,
|
| 67 |
+
"productCode": "PAPPLETRUNNER",
|
| 68 |
+
"name": "Applet Runner",
|
| 69 |
+
"pricingModel": "FREEMIUM",
|
| 70 |
+
"icon": "https://plugins.jetbrains.com/files/16682/506565/icon/pluginIcon.svg"
|
| 71 |
+
},
|
| 72 |
+
{
|
| 73 |
+
"id": 21566,
|
| 74 |
+
"productCode": "PARMADILLO",
|
| 75 |
+
"name": "Armadillo",
|
| 76 |
+
"pricingModel": "FREEMIUM",
|
| 77 |
+
"icon": "https://plugins.jetbrains.com/files/21566/354792/icon/pluginIcon.svg"
|
| 78 |
+
},
|
| 79 |
+
{
|
| 80 |
+
"id": 17699,
|
| 81 |
+
"productCode": "PASTOCK",
|
| 82 |
+
"name": "AStock",
|
| 83 |
+
"pricingModel": "PAID",
|
| 84 |
+
"icon": "https://plugins.jetbrains.com/files/17699/468853/icon/pluginIcon.svg"
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
"id": 13016,
|
| 88 |
+
"productCode": "PATOMONEDARK",
|
| 89 |
+
"name": "Atom One Dark By Mayke",
|
| 90 |
+
"pricingModel": "PAID",
|
| 91 |
+
"icon": "https://plugins.jetbrains.com/files/13016/122178/icon/pluginIcon.svg"
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"id": 14088,
|
| 95 |
+
"productCode": "PGOLANGCODESUGG",
|
| 96 |
+
"name": "Auto GOLang Code Suggestions",
|
| 97 |
+
"pricingModel": "PAID",
|
| 98 |
+
"icon": "https://plugins.jetbrains.com/files/14088/191484/icon/pluginIcon.svg"
|
| 99 |
+
},
|
| 100 |
+
{
|
| 101 |
+
"id": 14070,
|
| 102 |
+
"productCode": "PJAVACODESUGG",
|
| 103 |
+
"name": "Auto Java Code Suggestions",
|
| 104 |
+
"pricingModel": "PAID",
|
| 105 |
+
"icon": "https://plugins.jetbrains.com/files/14070/191711/icon/pluginIcon.svg"
|
| 106 |
+
},
|
| 107 |
+
{
|
| 108 |
+
"id": 14166,
|
| 109 |
+
"productCode": "PJSCODESUGG",
|
| 110 |
+
"name": "Auto Javascript Code Suggestions",
|
| 111 |
+
"pricingModel": "PAID",
|
| 112 |
+
"icon": "https://plugins.jetbrains.com/files/14166/191485/icon/pluginIcon.svg"
|
| 113 |
+
},
|
| 114 |
+
{
|
| 115 |
+
"id": 14167,
|
| 116 |
+
"productCode": "PPHPCODESUGG",
|
| 117 |
+
"name": "Auto PHP Code Suggestions",
|
| 118 |
+
"pricingModel": "PAID",
|
| 119 |
+
"icon": "https://plugins.jetbrains.com/files/14167/191710/icon/pluginIcon.svg"
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
"id": 14594,
|
| 123 |
+
"productCode": "PPYCODESUGG",
|
| 124 |
+
"name": "Auto Python Code Suggestions",
|
| 125 |
+
"pricingModel": "PAID",
|
| 126 |
+
"icon": "https://plugins.jetbrains.com/files/14594/190896/icon/pluginIcon.svg"
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
"id": 14089,
|
| 130 |
+
"productCode": "PRUBYCODESUGG",
|
| 131 |
+
"name": "Auto Ruby Code Suggestions",
|
| 132 |
+
"pricingModel": "PAID",
|
| 133 |
+
"icon": "https://plugins.jetbrains.com/files/14089/191482/icon/pluginIcon.svg"
|
| 134 |
+
},
|
| 135 |
+
{
|
| 136 |
+
"id": 10904,
|
| 137 |
+
"productCode": "PBRWJV",
|
| 138 |
+
"name": "AutoCode for Java",
|
| 139 |
+
"pricingModel": "PAID",
|
| 140 |
+
"icon": "https://plugins.jetbrains.com"
|
| 141 |
+
},
|
| 142 |
+
{
|
| 143 |
+
"id": 23577,
|
| 144 |
+
"productCode": "PAUTOLOG",
|
| 145 |
+
"name": "AutoLog",
|
| 146 |
+
"pricingModel": "PAID",
|
| 147 |
+
"icon": "https://plugins.jetbrains.com/files/23577/473858/icon/pluginIcon.svg"
|
| 148 |
+
},
|
| 149 |
+
{
|
| 150 |
+
"id": 14742,
|
| 151 |
+
"productCode": "PAWSLAMBDADEPLR",
|
| 152 |
+
"name": "AWS Lambda Deployer",
|
| 153 |
+
"pricingModel": "PAID",
|
| 154 |
+
"icon": "https://plugins.jetbrains.com"
|
| 155 |
+
},
|
| 156 |
+
{
|
| 157 |
+
"id": 22319,
|
| 158 |
+
"productCode": "PAZD",
|
| 159 |
+
"name": "Azd",
|
| 160 |
+
"pricingModel": "PAID",
|
| 161 |
+
"icon": "https://plugins.jetbrains.com/files/22319/517134/icon/pluginIcon.svg"
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"id": 22194,
|
| 165 |
+
"productCode": "PAZURECODING",
|
| 166 |
+
"name": "Azure Coding",
|
| 167 |
+
"pricingModel": "PAID",
|
| 168 |
+
"icon": "https://plugins.jetbrains.com/files/22194/355932/icon/pluginIcon.svg"
|
| 169 |
+
},
|
| 170 |
+
{
|
| 171 |
+
"id": 13841,
|
| 172 |
+
"productCode": "PBASHSUPPORTPRO",
|
| 173 |
+
"name": "BashSupport Pro",
|
| 174 |
+
"pricingModel": "PAID",
|
| 175 |
+
"icon": "https://plugins.jetbrains.com/files/13841/514417/icon/pluginIcon.svg"
|
| 176 |
+
},
|
| 177 |
+
{
|
| 178 |
+
"id": 12895,
|
| 179 |
+
"productCode": "PBETTERHIGHLIGH",
|
| 180 |
+
"name": "Better Highlights",
|
| 181 |
+
"pricingModel": "FREEMIUM",
|
| 182 |
+
"icon": "https://plugins.jetbrains.com/files/12895/514904/icon/pluginIcon.svg"
|
| 183 |
+
},
|
| 184 |
+
{
|
| 185 |
+
"id": 13538,
|
| 186 |
+
"productCode": "PCREVIEW",
|
| 187 |
+
"name": "Bitbucket Pull Requests",
|
| 188 |
+
"pricingModel": "PAID",
|
| 189 |
+
"icon": "https://plugins.jetbrains.com/files/13538/516839/icon/pluginIcon.svg"
|
| 190 |
+
},
|
| 191 |
+
{
|
| 192 |
+
"id": 16222,
|
| 193 |
+
"productCode": "PBITRISECI",
|
| 194 |
+
"name": "Bitrise Dashboard",
|
| 195 |
+
"pricingModel": "PAID",
|
| 196 |
+
"icon": "https://plugins.jetbrains.com/files/16222/463944/icon/pluginIcon.svg"
|
| 197 |
+
},
|
| 198 |
+
{
|
| 199 |
+
"id": 20061,
|
| 200 |
+
"productCode": "PBREWBUNDLE",
|
| 201 |
+
"name": "Brew Bundle",
|
| 202 |
+
"pricingModel": "PAID",
|
| 203 |
+
"icon": "https://plugins.jetbrains.com/files/20061/471756/icon/pluginIcon.svg"
|
| 204 |
+
},
|
| 205 |
+
{
|
| 206 |
+
"id": 20985,
|
| 207 |
+
"productCode": "PBUILDMON",
|
| 208 |
+
"name": "Build Monitor",
|
| 209 |
+
"pricingModel": "FREEMIUM",
|
| 210 |
+
"icon": "https://plugins.jetbrains.com/files/20985/452340/icon/pluginIcon.svg"
|
| 211 |
+
},
|
| 212 |
+
{
|
| 213 |
+
"id": 17692,
|
| 214 |
+
"productCode": "PCAPELASTIC",
|
| 215 |
+
"name": "Cap-Elasticsearch",
|
| 216 |
+
"pricingModel": "PAID",
|
| 217 |
+
"icon": "https://plugins.jetbrains.com/files/17692/256059/icon/pluginIcon.svg"
|
| 218 |
+
},
|
| 219 |
+
{
|
| 220 |
+
"id": 17785,
|
| 221 |
+
"productCode": "PCAPREDIS",
|
| 222 |
+
"name": "Cap-Redis",
|
| 223 |
+
"pricingModel": "PAID",
|
| 224 |
+
"icon": "https://plugins.jetbrains.com/files/17785/256060/icon/pluginIcon.svg"
|
| 225 |
+
},
|
| 226 |
+
{
|
| 227 |
+
"id": 21314,
|
| 228 |
+
"productCode": "PCHATGPTCODING",
|
| 229 |
+
"name": "ChatGPT Coding",
|
| 230 |
+
"pricingModel": "PAID",
|
| 231 |
+
"icon": "https://plugins.jetbrains.com/files/21314/346162/icon/pluginIcon.svg"
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"id": 19114,
|
| 235 |
+
"productCode": "PCIINTG",
|
| 236 |
+
"name": "CIclone",
|
| 237 |
+
"pricingModel": "PAID",
|
| 238 |
+
"icon": "https://plugins.jetbrains.com/files/19114/472822/icon/pluginIcon.svg"
|
| 239 |
+
},
|
| 240 |
+
{
|
| 241 |
+
"id": 15458,
|
| 242 |
+
"productCode": "PCIRCLECI",
|
| 243 |
+
"name": "CircleCI Dashboard",
|
| 244 |
+
"pricingModel": "PAID",
|
| 245 |
+
"icon": "https://plugins.jetbrains.com/files/15458/463945/icon/pluginIcon.svg"
|
| 246 |
+
},
|
| 247 |
+
{
|
| 248 |
+
"id": 22813,
|
| 249 |
+
"productCode": "PCITRIC",
|
| 250 |
+
"name": "Citric",
|
| 251 |
+
"pricingModel": "PAID",
|
| 252 |
+
"icon": "https://plugins.jetbrains.com/files/22813/515382/icon/pluginIcon.svg"
|
| 253 |
+
},
|
| 254 |
+
{
|
| 255 |
+
"id": 23887,
|
| 256 |
+
"productCode": "PCLAI",
|
| 257 |
+
"name": "CLAi",
|
| 258 |
+
"pricingModel": "PAID",
|
| 259 |
+
"icon": "https://plugins.jetbrains.com/files/23887/515259/icon/pluginIcon.svg"
|
| 260 |
+
},
|
| 261 |
+
{
|
| 262 |
+
"id": 12869,
|
| 263 |
+
"productCode": "PCMAKEPLUS",
|
| 264 |
+
"name": "CMake Plus",
|
| 265 |
+
"pricingModel": "PAID",
|
| 266 |
+
"icon": "https://plugins.jetbrains.com/files/12869/496990/icon/pluginIcon.svg"
|
| 267 |
+
},
|
| 268 |
+
{
|
| 269 |
+
"id": 17501,
|
| 270 |
+
"productCode": "PISCRATCH",
|
| 271 |
+
"name": "Code Note: In IDE Note-Taking, Project Notes",
|
| 272 |
+
"pricingModel": "PAID",
|
| 273 |
+
"icon": "https://plugins.jetbrains.com/files/17501/509149/icon/pluginIcon.svg"
|
| 274 |
+
},
|
| 275 |
+
{
|
| 276 |
+
"id": 18394,
|
| 277 |
+
"productCode": "PCODEREFACTORAI",
|
| 278 |
+
"name": "Code Refactor AI",
|
| 279 |
+
"pricingModel": "PAID",
|
| 280 |
+
"icon": "https://plugins.jetbrains.com/files/18394/153532/icon/pluginIcon.svg"
|
| 281 |
+
},
|
| 282 |
+
{
|
| 283 |
+
"id": 14896,
|
| 284 |
+
"productCode": "PCWMP",
|
| 285 |
+
"name": "Code With Me",
|
| 286 |
+
"pricingModel": "FREEMIUM",
|
| 287 |
+
"icon": "https://plugins.jetbrains.com"
|
| 288 |
+
},
|
| 289 |
+
{
|
| 290 |
+
"id": 19097,
|
| 291 |
+
"productCode": "PWGCODECREATOR",
|
| 292 |
+
"name": "codeCreator",
|
| 293 |
+
"pricingModel": "FREEMIUM",
|
| 294 |
+
"icon": "https://plugins.jetbrains.com"
|
| 295 |
+
},
|
| 296 |
+
{
|
| 297 |
+
"id": 19578,
|
| 298 |
+
"productCode": "PCODEKITS",
|
| 299 |
+
"name": "CodeKits",
|
| 300 |
+
"pricingModel": "FREEMIUM",
|
| 301 |
+
"icon": "https://plugins.jetbrains.com/files/19578/302019/icon/pluginIcon.svg"
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"id": 10811,
|
| 305 |
+
"productCode": "PCODEMRBASE",
|
| 306 |
+
"name": "CodeMR",
|
| 307 |
+
"pricingModel": "PAID",
|
| 308 |
+
"icon": "https://plugins.jetbrains.com/files/10811/186959/icon/pluginIcon.svg"
|
| 309 |
+
},
|
| 310 |
+
{
|
| 311 |
+
"id": 14104,
|
| 312 |
+
"productCode": "PVCS",
|
| 313 |
+
"name": "commit-template",
|
| 314 |
+
"pricingModel": "PAID",
|
| 315 |
+
"icon": "https://plugins.jetbrains.com/files/14104/250600/icon/pluginIcon.svg"
|
| 316 |
+
},
|
| 317 |
+
{
|
| 318 |
+
"id": 20293,
|
| 319 |
+
"productCode": "PCONNECTUI",
|
| 320 |
+
"name": "Connect Api",
|
| 321 |
+
"pricingModel": "FREEMIUM",
|
| 322 |
+
"icon": "https://plugins.jetbrains.com/files/20293/452254/icon/pluginIcon.svg"
|
| 323 |
+
},
|
| 324 |
+
{
|
| 325 |
+
"id": 21857,
|
| 326 |
+
"productCode": "PCUEFY",
|
| 327 |
+
"name": "Cuefy",
|
| 328 |
+
"pricingModel": "PAID",
|
| 329 |
+
"icon": "https://plugins.jetbrains.com/files/21857/428708/icon/pluginIcon.svg"
|
| 330 |
+
},
|
| 331 |
+
{
|
| 332 |
+
"id": 23561,
|
| 333 |
+
"productCode": "PDATABASEBUDDY",
|
| 334 |
+
"name": "Database Buddy",
|
| 335 |
+
"pricingModel": "PAID",
|
| 336 |
+
"icon": "https://plugins.jetbrains.com/files/23561/474923/icon/pluginIcon.svg"
|
| 337 |
+
},
|
| 338 |
+
{
|
| 339 |
+
"id": 16861,
|
| 340 |
+
"productCode": "PDATABASE",
|
| 341 |
+
"name": "Database Helper",
|
| 342 |
+
"pricingModel": "PAID",
|
| 343 |
+
"icon": "https://plugins.jetbrains.com/files/16861/500171/icon/pluginIcon.svg"
|
| 344 |
+
},
|
| 345 |
+
{
|
| 346 |
+
"id": 19161,
|
| 347 |
+
"productCode": "PDBDATABASETOOL",
|
| 348 |
+
"name": "Database Tool",
|
| 349 |
+
"pricingModel": "PAID",
|
| 350 |
+
"icon": "https://plugins.jetbrains.com/files/19161/514290/icon/pluginIcon.svg"
|
| 351 |
+
},
|
| 352 |
+
{
|
| 353 |
+
"id": 10925,
|
| 354 |
+
"productCode": "PDB",
|
| 355 |
+
"name": "Database Tools and SQL for WebStorm",
|
| 356 |
+
"pricingModel": "PAID",
|
| 357 |
+
"icon": "https://plugins.jetbrains.com/files/10925/511241/icon/pluginIcon.svg"
|
| 358 |
+
},
|
| 359 |
+
{
|
| 360 |
+
"id": 22472,
|
| 361 |
+
"productCode": "PDATAGRAPH",
|
| 362 |
+
"name": "DataGraph - JSON, YAML, XML Visualization",
|
| 363 |
+
"pricingModel": "FREEMIUM",
|
| 364 |
+
"icon": "https://plugins.jetbrains.com/files/22472/503936/icon/pluginIcon.svg"
|
| 365 |
+
},
|
| 366 |
+
{
|
| 367 |
+
"id": 11461,
|
| 368 |
+
"productCode": "DC",
|
| 369 |
+
"name": "dotCover",
|
| 370 |
+
"pricingModel": "PAID",
|
| 371 |
+
"icon": "https://plugins.jetbrains.com/files/11461/81836/icon/META-INF_pluginIcon.svg"
|
| 372 |
+
},
|
| 373 |
+
{
|
| 374 |
+
"id": 11462,
|
| 375 |
+
"productCode": "DPN",
|
| 376 |
+
"name": "dotTrace",
|
| 377 |
+
"pricingModel": "PAID",
|
| 378 |
+
"icon": "https://plugins.jetbrains.com/files/11462/81835/icon/META-INF_pluginIcon.svg"
|
| 379 |
+
},
|
| 380 |
+
{
|
| 381 |
+
"id": 18896,
|
| 382 |
+
"productCode": "PDYNAMODB",
|
| 383 |
+
"name": "DynamoDB",
|
| 384 |
+
"pricingModel": "PAID",
|
| 385 |
+
"icon": "https://plugins.jetbrains.com/files/18896/503820/icon/pluginIcon.svg"
|
| 386 |
+
},
|
| 387 |
+
{
|
| 388 |
+
"id": 14512,
|
| 389 |
+
"productCode": "PELASTICSEARCH",
|
| 390 |
+
"name": "Elasticsearch",
|
| 391 |
+
"pricingModel": "PAID",
|
| 392 |
+
"icon": "https://plugins.jetbrains.com/files/14512/511081/icon/pluginIcon.svg"
|
| 393 |
+
},
|
| 394 |
+
{
|
| 395 |
+
"id": 18209,
|
| 396 |
+
"productCode": "PELSA",
|
| 397 |
+
"name": "ElasticSearch-Admin",
|
| 398 |
+
"pricingModel": "PAID",
|
| 399 |
+
"icon": "https://plugins.jetbrains.com"
|
| 400 |
+
},
|
| 401 |
+
{
|
| 402 |
+
"id": 18663,
|
| 403 |
+
"productCode": "PEXCELEDITOR",
|
| 404 |
+
"name": "ExcelEditor",
|
| 405 |
+
"pricingModel": "FREEMIUM",
|
| 406 |
+
"icon": "https://plugins.jetbrains.com/files/18663/510865/icon/pluginIcon.svg"
|
| 407 |
+
},
|
| 408 |
+
{
|
| 409 |
+
"id": 15379,
|
| 410 |
+
"productCode": "PGODRUNNER",
|
| 411 |
+
"name": "Execution God Recorder",
|
| 412 |
+
"pricingModel": "PAID",
|
| 413 |
+
"icon": "https://plugins.jetbrains.com/files/15379/102175/icon/pluginIcon.svg"
|
| 414 |
+
},
|
| 415 |
+
{
|
| 416 |
+
"id": 20238,
|
| 417 |
+
"productCode": "PEXTENSION",
|
| 418 |
+
"name": "Extensions Manager",
|
| 419 |
+
"pricingModel": "PAID",
|
| 420 |
+
"icon": "https://plugins.jetbrains.com/files/20238/308627/icon/pluginIcon.svg"
|
| 421 |
+
},
|
| 422 |
+
{
|
| 423 |
+
"id": 11058,
|
| 424 |
+
"productCode": "PEXTRAICONS",
|
| 425 |
+
"name": "Extra Icons",
|
| 426 |
+
"pricingModel": "PAID",
|
| 427 |
+
"icon": "https://plugins.jetbrains.com/files/11058/516273/icon/pluginIcon.svg"
|
| 428 |
+
},
|
| 429 |
+
{
|
| 430 |
+
"id": 23927,
|
| 431 |
+
"productCode": "PEXTRAIDETWEAKS",
|
| 432 |
+
"name": "Extra IDE Tweaks",
|
| 433 |
+
"pricingModel": "PAID",
|
| 434 |
+
"icon": "https://plugins.jetbrains.com/files/23927/515986/icon/pluginIcon.svg"
|
| 435 |
+
},
|
| 436 |
+
{
|
| 437 |
+
"id": 16988,
|
| 438 |
+
"productCode": "PFASTREQUEST",
|
| 439 |
+
"name": "Fast Request - API Buddy",
|
| 440 |
+
"pricingModel": "PAID",
|
| 441 |
+
"icon": "https://plugins.jetbrains.com/files/16988/498000/icon/pluginIcon.svg"
|
| 442 |
+
},
|
| 443 |
+
{
|
| 444 |
+
"id": 18971,
|
| 445 |
+
"productCode": "PFASTSHELL",
|
| 446 |
+
"name": "FastShell",
|
| 447 |
+
"pricingModel": "FREEMIUM",
|
| 448 |
+
"icon": "https://plugins.jetbrains.com/files/18971/200999/icon/pluginIcon.svg"
|
| 449 |
+
},
|
| 450 |
+
{
|
| 451 |
+
"id": 23146,
|
| 452 |
+
"productCode": "PFEIGNHELPER",
|
| 453 |
+
"name": "Feign-Helper",
|
| 454 |
+
"pricingModel": "PAID",
|
| 455 |
+
"icon": "https://plugins.jetbrains.com/files/23146/473643/icon/pluginIcon.svg"
|
| 456 |
+
},
|
| 457 |
+
{
|
| 458 |
+
"id": 16217,
|
| 459 |
+
"productCode": "PFUZYFIPC",
|
| 460 |
+
"name": "Find In Files (Favorites)",
|
| 461 |
+
"pricingModel": "PAID",
|
| 462 |
+
"icon": "https://plugins.jetbrains.com/files/16217/518682/icon/pluginIcon.svg"
|
| 463 |
+
},
|
| 464 |
+
{
|
| 465 |
+
"id": 23609,
|
| 466 |
+
"productCode": "PFIREBASE",
|
| 467 |
+
"name": "Firebase Firestore",
|
| 468 |
+
"pricingModel": "PAID",
|
| 469 |
+
"icon": "https://plugins.jetbrains.com/files/23609/503413/icon/pluginIcon.svg"
|
| 470 |
+
},
|
| 471 |
+
{
|
| 472 |
+
"id": 15189,
|
| 473 |
+
"productCode": "PFIREHIGHLIGHT",
|
| 474 |
+
"name": "Firebase Rules",
|
| 475 |
+
"pricingModel": "PAID",
|
| 476 |
+
"icon": "https://plugins.jetbrains.com/files/15189/471752/icon/pluginIcon.svg"
|
| 477 |
+
},
|
| 478 |
+
{
|
| 479 |
+
"id": 23685,
|
| 480 |
+
"productCode": "PSCIPIOFTL",
|
| 481 |
+
"name": "Flexible Freemarker",
|
| 482 |
+
"pricingModel": "PAID",
|
| 483 |
+
"icon": "https://plugins.jetbrains.com/files/23685/483800/icon/pluginIcon.svg"
|
| 484 |
+
},
|
| 485 |
+
{
|
| 486 |
+
"id": 14718,
|
| 487 |
+
"productCode": "PFLUTTER",
|
| 488 |
+
"name": "Flutter Storm",
|
| 489 |
+
"pricingModel": "PAID",
|
| 490 |
+
"icon": "https://plugins.jetbrains.com/files/14718/367205/icon/pluginIcon.svg"
|
| 491 |
+
},
|
| 492 |
+
{
|
| 493 |
+
"id": 13086,
|
| 494 |
+
"productCode": "PGDOC",
|
| 495 |
+
"name": "Generate Document",
|
| 496 |
+
"pricingModel": "PAID",
|
| 497 |
+
"icon": "https://plugins.jetbrains.com/files/13086/499172/icon/pluginIcon.svg"
|
| 498 |
+
},
|
| 499 |
+
{
|
| 500 |
+
"id": 22971,
|
| 501 |
+
"productCode": "PGENSETANDSET",
|
| 502 |
+
"name": "GenerateSetAndGet",
|
| 503 |
+
"pricingModel": "PAID",
|
| 504 |
+
"icon": "https://plugins.jetbrains.com/files/22971/467619/icon/pluginIcon.svg"
|
| 505 |
+
},
|
| 506 |
+
{
|
| 507 |
+
"id": 20319,
|
| 508 |
+
"productCode": "PGERRYAURORA",
|
| 509 |
+
"name": "Gerry Aurora",
|
| 510 |
+
"pricingModel": "PAID",
|
| 511 |
+
"icon": "https://plugins.jetbrains.com/files/20319/435418/icon/pluginIcon.svg"
|
| 512 |
+
},
|
| 513 |
+
{
|
| 514 |
+
"id": 20246,
|
| 515 |
+
"productCode": "PGERRYCHERRY",
|
| 516 |
+
"name": "Gerry Cherry",
|
| 517 |
+
"pricingModel": "PAID",
|
| 518 |
+
"icon": "https://plugins.jetbrains.com/files/20246/435417/icon/pluginIcon.svg"
|
| 519 |
+
},
|
| 520 |
+
{
|
| 521 |
+
"id": 20247,
|
| 522 |
+
"productCode": "PGERRYCOFFEE",
|
| 523 |
+
"name": "Gerry Coffee",
|
| 524 |
+
"pricingModel": "PAID",
|
| 525 |
+
"icon": "https://plugins.jetbrains.com/files/20247/435420/icon/pluginIcon.svg"
|
| 526 |
+
},
|
| 527 |
+
{
|
| 528 |
+
"id": 20049,
|
| 529 |
+
"productCode": "PGERRYCYBERPUNK",
|
| 530 |
+
"name": "Gerry Cyberpunk",
|
| 531 |
+
"pricingModel": "PAID",
|
| 532 |
+
"icon": "https://plugins.jetbrains.com/files/20049/435415/icon/pluginIcon.svg"
|
| 533 |
+
},
|
| 534 |
+
{
|
| 535 |
+
"id": 20236,
|
| 536 |
+
"productCode": "PGERRYNATURE",
|
| 537 |
+
"name": "Gerry Nature",
|
| 538 |
+
"pricingModel": "PAID",
|
| 539 |
+
"icon": "https://plugins.jetbrains.com/files/20236/435419/icon/pluginIcon.svg"
|
| 540 |
+
},
|
| 541 |
+
{
|
| 542 |
+
"id": 20075,
|
| 543 |
+
"productCode": "PGERRYSPACE",
|
| 544 |
+
"name": "Gerry Space",
|
| 545 |
+
"pricingModel": "PAID",
|
| 546 |
+
"icon": "https://plugins.jetbrains.com/files/20075/435416/icon/pluginIcon.svg"
|
| 547 |
+
},
|
| 548 |
+
{
|
| 549 |
+
"id": 19668,
|
| 550 |
+
"productCode": "PGERRYTHEMESPRO",
|
| 551 |
+
"name": "Gerry Themes Pro",
|
| 552 |
+
"pricingModel": "PAID",
|
| 553 |
+
"icon": "https://plugins.jetbrains.com/files/19668/517943/icon/pluginIcon.svg"
|
| 554 |
+
},
|
| 555 |
+
{
|
| 556 |
+
"id": 10083,
|
| 557 |
+
"productCode": "PGITSCOPE",
|
| 558 |
+
"name": "Git Scope",
|
| 559 |
+
"pricingModel": "PAID",
|
| 560 |
+
"icon": "https://plugins.jetbrains.com/files/10083/396420/icon/pluginIcon.svg"
|
| 561 |
+
},
|
| 562 |
+
{
|
| 563 |
+
"id": 23813,
|
| 564 |
+
"productCode": "PGITWORKTREE",
|
| 565 |
+
"name": "Git Worktree",
|
| 566 |
+
"pricingModel": "FREEMIUM",
|
| 567 |
+
"icon": "https://plugins.jetbrains.com/files/23813/493642/icon/pluginIcon.svg"
|
| 568 |
+
},
|
| 569 |
+
{
|
| 570 |
+
"id": 14056,
|
| 571 |
+
"productCode": "PGITFLOWPLUS",
|
| 572 |
+
"name": "GitFlowPlus",
|
| 573 |
+
"pricingModel": "FREEMIUM",
|
| 574 |
+
"icon": "https://plugins.jetbrains.com/files/14056/506220/icon/pluginIcon.svg"
|
| 575 |
+
},
|
| 576 |
+
{
|
| 577 |
+
"id": 20144,
|
| 578 |
+
"productCode": "PGITHUBCI",
|
| 579 |
+
"name": "Github CI Dashboard",
|
| 580 |
+
"pricingModel": "PAID",
|
| 581 |
+
"icon": "https://plugins.jetbrains.com/files/20144/463946/icon/pluginIcon.svg"
|
| 582 |
+
},
|
| 583 |
+
{
|
| 584 |
+
"id": 15457,
|
| 585 |
+
"productCode": "PGITLABCI",
|
| 586 |
+
"name": "Gitlab CI Pipeline Dashboard",
|
| 587 |
+
"pricingModel": "PAID",
|
| 588 |
+
"icon": "https://plugins.jetbrains.com/files/15457/463947/icon/pluginIcon.svg"
|
| 589 |
+
},
|
| 590 |
+
{
|
| 591 |
+
"id": 22202,
|
| 592 |
+
"productCode": "PGITLABCICD",
|
| 593 |
+
"name": "GitLab CICD - Pipelines \u0026 Jobs, Builds Run Cancel Retry View Log",
|
| 594 |
+
"pricingModel": "PAID",
|
| 595 |
+
"icon": "https://plugins.jetbrains.com/files/22202/517828/icon/pluginIcon.svg"
|
| 596 |
+
},
|
| 597 |
+
{
|
| 598 |
+
"id": 18689,
|
| 599 |
+
"productCode": "PGITLAB",
|
| 600 |
+
"name": "GitLab Merge Requests",
|
| 601 |
+
"pricingModel": "PAID",
|
| 602 |
+
"icon": "https://plugins.jetbrains.com/files/18689/516838/icon/pluginIcon.svg"
|
| 603 |
+
},
|
| 604 |
+
{
|
| 605 |
+
"id": 7499,
|
| 606 |
+
"productCode": "PGITTOOLBOX",
|
| 607 |
+
"name": "GitToolBox",
|
| 608 |
+
"pricingModel": "FREEMIUM",
|
| 609 |
+
"icon": "https://plugins.jetbrains.com/files/7499/512954/icon/pluginIcon.svg"
|
| 610 |
+
},
|
| 611 |
+
{
|
| 612 |
+
"id": 19906,
|
| 613 |
+
"productCode": "PGOPARSER",
|
| 614 |
+
"name": "GoParser",
|
| 615 |
+
"pricingModel": "PAID",
|
| 616 |
+
"icon": "https://plugins.jetbrains.com/files/19906/293012/icon/pluginIcon.svg"
|
| 617 |
+
},
|
| 618 |
+
{
|
| 619 |
+
"id": 20411,
|
| 620 |
+
"productCode": "PWXUFQYRHZCRSEO",
|
| 621 |
+
"name": "Gorm",
|
| 622 |
+
"pricingModel": "PAID",
|
| 623 |
+
"icon": "https://plugins.jetbrains.com/files/20411/502598/icon/pluginIcon.svg"
|
| 624 |
+
},
|
| 625 |
+
{
|
| 626 |
+
"id": 22035,
|
| 627 |
+
"productCode": "PGPTASSISTANT",
|
| 628 |
+
"name": "GPT Assistant",
|
| 629 |
+
"pricingModel": "PAID",
|
| 630 |
+
"icon": "https://plugins.jetbrains.com/files/22035/510722/icon/pluginIcon.svg"
|
| 631 |
+
},
|
| 632 |
+
{
|
| 633 |
+
"id": 15535,
|
| 634 |
+
"productCode": "PHEROKU",
|
| 635 |
+
"name": "Heroku Dashboard",
|
| 636 |
+
"pricingModel": "PAID",
|
| 637 |
+
"icon": "https://plugins.jetbrains.com/files/15535/463948/icon/pluginIcon.svg"
|
| 638 |
+
},
|
| 639 |
+
{
|
| 640 |
+
"id": 7525,
|
| 641 |
+
"productCode": "PHYBRISCOMMERCE",
|
| 642 |
+
"name": "Hybris Integration",
|
| 643 |
+
"pricingModel": "PAID",
|
| 644 |
+
"icon": "https://plugins.jetbrains.com/files/7525/517492/icon/pluginIcon.svg"
|
| 645 |
+
},
|
| 646 |
+
{
|
| 647 |
+
"id": 12634,
|
| 648 |
+
"productCode": "PIEDIS",
|
| 649 |
+
"name": "Iedis 2",
|
| 650 |
+
"pricingModel": "PAID",
|
| 651 |
+
"icon": "https://plugins.jetbrains.com/files/12634/167816/icon/pluginIcon.svg"
|
| 652 |
+
},
|
| 653 |
+
{
|
| 654 |
+
"id": 22459,
|
| 655 |
+
"productCode": "PIMAGETOVECTOR",
|
| 656 |
+
"name": "ImageToVector",
|
| 657 |
+
"pricingModel": "PAID",
|
| 658 |
+
"icon": "https://plugins.jetbrains.com/files/22459/376877/icon/pluginIcon.svg"
|
| 659 |
+
},
|
| 660 |
+
{
|
| 661 |
+
"id": 23859,
|
| 662 |
+
"productCode": "PINTELLIPHP",
|
| 663 |
+
"name": "IntelliPHP - AI Autocomplete for PHP",
|
| 664 |
+
"pricingModel": "PAID",
|
| 665 |
+
"icon": "https://plugins.jetbrains.com/files/23859/505657/icon/pluginIcon.svg"
|
| 666 |
+
},
|
| 667 |
+
{
|
| 668 |
+
"id": 20526,
|
| 669 |
+
"productCode": "PWAUFKYVHQCRXEO",
|
| 670 |
+
"name": "IoGame",
|
| 671 |
+
"pricingModel": "PAID",
|
| 672 |
+
"icon": "https://plugins.jetbrains.com/files/20526/468605/icon/pluginIcon.svg"
|
| 673 |
+
},
|
| 674 |
+
{
|
| 675 |
+
"id": 11560,
|
| 676 |
+
"productCode": "PBISJ",
|
| 677 |
+
"name": "Java Antidecompiler",
|
| 678 |
+
"pricingModel": "PAID",
|
| 679 |
+
"icon": "https://plugins.jetbrains.com/files/11560/367010/icon/pluginIcon.svg"
|
| 680 |
+
},
|
| 681 |
+
{
|
| 682 |
+
"id": 10828,
|
| 683 |
+
"productCode": "PJDCLEANREAD",
|
| 684 |
+
"name": "JavaDoc Clean Read",
|
| 685 |
+
"pricingModel": "PAID",
|
| 686 |
+
"icon": "https://plugins.jetbrains.com/files/10828/375796/icon/pluginIcon.svg"
|
| 687 |
+
},
|
| 688 |
+
{
|
| 689 |
+
"id": 20888,
|
| 690 |
+
"productCode": "PWXUQQYVOXCRSEO",
|
| 691 |
+
"name": "JavaOrm",
|
| 692 |
+
"pricingModel": "PAID",
|
| 693 |
+
"icon": "https://plugins.jetbrains.com/files/20888/438337/icon/pluginIcon.svg"
|
| 694 |
+
},
|
| 695 |
+
{
|
| 696 |
+
"id": 14557,
|
| 697 |
+
"productCode": "PVISUALGC",
|
| 698 |
+
"name": "JDK VisualGC",
|
| 699 |
+
"pricingModel": "FREEMIUM",
|
| 700 |
+
"icon": "https://plugins.jetbrains.com/files/14557/453632/icon/pluginIcon.svg"
|
| 701 |
+
},
|
| 702 |
+
{
|
| 703 |
+
"id": 22282,
|
| 704 |
+
"productCode": "AIP",
|
| 705 |
+
"name": "JetBrains AI Assistant",
|
| 706 |
+
"pricingModel": "FREEMIUM",
|
| 707 |
+
"icon": "https://plugins.jetbrains.com/files/22282/515367/icon/pluginIcon.svg"
|
| 708 |
+
},
|
| 709 |
+
{
|
| 710 |
+
"id": 21173,
|
| 711 |
+
"productCode": "PJETCLIENT",
|
| 712 |
+
"name": "JetClient - The Ultimate REST Client",
|
| 713 |
+
"pricingModel": "FREEMIUM",
|
| 714 |
+
"icon": "https://plugins.jetbrains.com/files/21173/515501/icon/pluginIcon.svg"
|
| 715 |
+
},
|
| 716 |
+
{
|
| 717 |
+
"id": 9238,
|
| 718 |
+
"productCode": "PJETFORCER",
|
| 719 |
+
"name": "JetForcer | The Smartest Force.com IDE",
|
| 720 |
+
"pricingModel": "PAID",
|
| 721 |
+
"icon": "https://plugins.jetbrains.com"
|
| 722 |
+
},
|
| 723 |
+
{
|
| 724 |
+
"id": 12621,
|
| 725 |
+
"productCode": "PJFORMDESIGNER",
|
| 726 |
+
"name": "JFormDesigner (Marketplace Edition)",
|
| 727 |
+
"pricingModel": "PAID",
|
| 728 |
+
"icon": "https://plugins.jetbrains.com/files/12621/516265/icon/pluginIcon.svg"
|
| 729 |
+
},
|
| 730 |
+
{
|
| 731 |
+
"id": 23812,
|
| 732 |
+
"productCode": "PJMETERPLUGINSM",
|
| 733 |
+
"name": "JMeter Plugins Manager",
|
| 734 |
+
"pricingModel": "PAID",
|
| 735 |
+
"icon": "https://plugins.jetbrains.com/files/23812/492356/icon/pluginIcon.svg"
|
| 736 |
+
},
|
| 737 |
+
{
|
| 738 |
+
"id": 23855,
|
| 739 |
+
"productCode": "PJMETERRUNNER",
|
| 740 |
+
"name": "JMeter Runner",
|
| 741 |
+
"pricingModel": "PAID",
|
| 742 |
+
"icon": "https://plugins.jetbrains.com/files/23855/494217/icon/pluginIcon.svg"
|
| 743 |
+
},
|
| 744 |
+
{
|
| 745 |
+
"id": 15242,
|
| 746 |
+
"productCode": "PJPASQL",
|
| 747 |
+
"name": "JPA SQL",
|
| 748 |
+
"pricingModel": "FREEMIUM",
|
| 749 |
+
"icon": "https://plugins.jetbrains.com/files/15242/510410/icon/pluginIcon.svg"
|
| 750 |
+
},
|
| 751 |
+
{
|
| 752 |
+
"id": 23360,
|
| 753 |
+
"productCode": "PJQEXPRESS",
|
| 754 |
+
"name": "jqExpress",
|
| 755 |
+
"pricingModel": "PAID",
|
| 756 |
+
"icon": "https://plugins.jetbrains.com/files/23360/492713/icon/pluginIcon.svg"
|
| 757 |
+
},
|
| 758 |
+
{
|
| 759 |
+
"id": 22597,
|
| 760 |
+
"productCode": "POXYJSONSCHGEN",
|
| 761 |
+
"name": "JSON Schema Generator",
|
| 762 |
+
"pricingModel": "PAID",
|
| 763 |
+
"icon": "https://plugins.jetbrains.com/files/22597/471041/icon/pluginIcon.svg"
|
| 764 |
+
},
|
| 765 |
+
{
|
| 766 |
+
"id": 23554,
|
| 767 |
+
"productCode": "POXYJSONDIAGRAM",
|
| 768 |
+
"name": "JSON Schema Visualizer/Editor",
|
| 769 |
+
"pricingModel": "PAID",
|
| 770 |
+
"icon": "https://plugins.jetbrains.com/files/23554/503415/icon/pluginIcon.svg"
|
| 771 |
+
},
|
| 772 |
+
{
|
| 773 |
+
"id": 20297,
|
| 774 |
+
"productCode": "POXYJSONCONVERT",
|
| 775 |
+
"name": "JSON-YAML-XML Converter",
|
| 776 |
+
"pricingModel": "PAID",
|
| 777 |
+
"icon": "https://plugins.jetbrains.com/files/20297/472486/icon/pluginIcon.svg"
|
| 778 |
+
},
|
| 779 |
+
{
|
| 780 |
+
"id": 18975,
|
| 781 |
+
"productCode": "PJSONNETEMLSUP",
|
| 782 |
+
"name": "Jsonnet Pro",
|
| 783 |
+
"pricingModel": "PAID",
|
| 784 |
+
"icon": "https://plugins.jetbrains.com/files/18975/458972/icon/pluginIcon.svg"
|
| 785 |
+
},
|
| 786 |
+
{
|
| 787 |
+
"id": 19297,
|
| 788 |
+
"productCode": "PJSONTOANYLANGU",
|
| 789 |
+
"name": "JsonToAnyLanguage",
|
| 790 |
+
"pricingModel": "FREEMIUM",
|
| 791 |
+
"icon": "https://plugins.jetbrains.com/files/19297/351202/icon/pluginIcon.svg"
|
| 792 |
+
},
|
| 793 |
+
{
|
| 794 |
+
"id": 14393,
|
| 795 |
+
"productCode": "PJSONTOTS",
|
| 796 |
+
"name": "JsonToTypeScript",
|
| 797 |
+
"pricingModel": "FREEMIUM",
|
| 798 |
+
"icon": "https://plugins.jetbrains.com/files/14393/321300/icon/pluginIcon.svg"
|
| 799 |
+
},
|
| 800 |
+
{
|
| 801 |
+
"id": 22284,
|
| 802 |
+
"productCode": "PKAFKA",
|
| 803 |
+
"name": "Kafka Client",
|
| 804 |
+
"pricingModel": "PAID",
|
| 805 |
+
"icon": "https://plugins.jetbrains.com/files/22284/428744/icon/pluginIcon.svg"
|
| 806 |
+
},
|
| 807 |
+
{
|
| 808 |
+
"id": 20111,
|
| 809 |
+
"productCode": "PKAFKAIDE",
|
| 810 |
+
"name": "Kafkaide",
|
| 811 |
+
"pricingModel": "PAID",
|
| 812 |
+
"icon": "https://plugins.jetbrains.com/files/20111/425515/icon/pluginIcon.svg"
|
| 813 |
+
},
|
| 814 |
+
{
|
| 815 |
+
"id": 18286,
|
| 816 |
+
"productCode": "PKSEXPLORER",
|
| 817 |
+
"name": "KS-Explorer",
|
| 818 |
+
"pricingModel": "PAID",
|
| 819 |
+
"icon": "https://plugins.jetbrains.com/files/18286/518701/icon/pluginIcon.svg"
|
| 820 |
+
},
|
| 821 |
+
{
|
| 822 |
+
"id": 13441,
|
| 823 |
+
"productCode": "PLARAVEL",
|
| 824 |
+
"name": "Laravel Idea",
|
| 825 |
+
"pricingModel": "PAID",
|
| 826 |
+
"icon": "https://plugins.jetbrains.com/files/13441/507406/icon/pluginIcon.svg"
|
| 827 |
+
},
|
| 828 |
+
{
|
| 829 |
+
"id": 19661,
|
| 830 |
+
"productCode": "PLATTEPRO",
|
| 831 |
+
"name": "Latte Pro",
|
| 832 |
+
"pricingModel": "PAID",
|
| 833 |
+
"icon": "https://plugins.jetbrains.com/files/19661/440924/icon/pluginIcon.svg"
|
| 834 |
+
},
|
| 835 |
+
{
|
| 836 |
+
"id": 15405,
|
| 837 |
+
"productCode": "PLEDGER",
|
| 838 |
+
"name": "Ledger CLI",
|
| 839 |
+
"pricingModel": "PAID",
|
| 840 |
+
"icon": "https://plugins.jetbrains.com/files/15405/458942/icon/pluginIcon.svg"
|
| 841 |
+
},
|
| 842 |
+
{
|
| 843 |
+
"id": 17166,
|
| 844 |
+
"productCode": "PLEP",
|
| 845 |
+
"name": "LeetCode Editor Pro",
|
| 846 |
+
"pricingModel": "PAID",
|
| 847 |
+
"icon": "https://plugins.jetbrains.com/files/17166/502109/icon/pluginIcon.svg"
|
| 848 |
+
},
|
| 849 |
+
{
|
| 850 |
+
"id": 22223,
|
| 851 |
+
"productCode": "PLOCALSTACK",
|
| 852 |
+
"name": "LocalStack Integrator",
|
| 853 |
+
"pricingModel": "FREEMIUM",
|
| 854 |
+
"icon": "https://plugins.jetbrains.com/files/22223/518671/icon/pluginIcon.svg"
|
| 855 |
+
},
|
| 856 |
+
{
|
| 857 |
+
"id": 20554,
|
| 858 |
+
"productCode": "PMAGE",
|
| 859 |
+
"name": "Magento and Adobe Commerce PhpStorm by Atwix",
|
| 860 |
+
"pricingModel": "FREEMIUM",
|
| 861 |
+
"icon": "https://plugins.jetbrains.com/files/20554/505887/icon/pluginIcon.svg"
|
| 862 |
+
},
|
| 863 |
+
{
|
| 864 |
+
"id": 23556,
|
| 865 |
+
"productCode": "PSCIPIOMGNL",
|
| 866 |
+
"name": "Magnolia CMS Integration",
|
| 867 |
+
"pricingModel": "PAID",
|
| 868 |
+
"icon": "https://plugins.jetbrains.com/files/23556/483799/icon/pluginIcon.svg"
|
| 869 |
+
},
|
| 870 |
+
{
|
| 871 |
+
"id": 17688,
|
| 872 |
+
"productCode": "PRSMGNL",
|
| 873 |
+
"name": "Magnolia YAML Assistant",
|
| 874 |
+
"pricingModel": "FREEMIUM",
|
| 875 |
+
"icon": "https://plugins.jetbrains.com/files/17688/511232/icon/pluginIcon.svg"
|
| 876 |
+
},
|
| 877 |
+
{
|
| 878 |
+
"id": 8006,
|
| 879 |
+
"productCode": "PMATERIALUI",
|
| 880 |
+
"name": "Material Theme UI",
|
| 881 |
+
"pricingModel": "FREEMIUM",
|
| 882 |
+
"icon": "https://plugins.jetbrains.com/files/8006/518563/icon/pluginIcon.svg"
|
| 883 |
+
},
|
| 884 |
+
{
|
| 885 |
+
"id": 19308,
|
| 886 |
+
"productCode": "PMATERIALCUSTOM",
|
| 887 |
+
"name": "Material Theme UI Custom Theme",
|
| 888 |
+
"pricingModel": "PAID",
|
| 889 |
+
"icon": "https://plugins.jetbrains.com/files/19308/384272/icon/pluginIcon.svg"
|
| 890 |
+
},
|
| 891 |
+
{
|
| 892 |
+
"id": 19250,
|
| 893 |
+
"productCode": "PMATERIALEXTRAS",
|
| 894 |
+
"name": "Material Theme UI Extras",
|
| 895 |
+
"pricingModel": "PAID",
|
| 896 |
+
"icon": "https://plugins.jetbrains.com/files/19250/384271/icon/pluginIcon.svg"
|
| 897 |
+
},
|
| 898 |
+
{
|
| 899 |
+
"id": 17456,
|
| 900 |
+
"productCode": "PMATERIALHC",
|
| 901 |
+
"name": "Material Theme UI High Contrast",
|
| 902 |
+
"pricingModel": "PAID",
|
| 903 |
+
"icon": "https://plugins.jetbrains.com/files/17456/384270/icon/pluginIcon.svg"
|
| 904 |
+
},
|
| 905 |
+
{
|
| 906 |
+
"id": 19309,
|
| 907 |
+
"productCode": "PMATERIALLANG",
|
| 908 |
+
"name": "Material Theme UI Language Additions",
|
| 909 |
+
"pricingModel": "PAID",
|
| 910 |
+
"icon": "https://plugins.jetbrains.com/files/19309/384269/icon/pluginIcon.svg"
|
| 911 |
+
},
|
| 912 |
+
{
|
| 913 |
+
"id": 19310,
|
| 914 |
+
"productCode": "PMATERIALFRAME",
|
| 915 |
+
"name": "Material Theme UI Project Frame",
|
| 916 |
+
"pricingModel": "PAID",
|
| 917 |
+
"icon": "https://plugins.jetbrains.com/files/19310/385745/icon/pluginIcon.svg"
|
| 918 |
+
},
|
| 919 |
+
{
|
| 920 |
+
"id": 13615,
|
| 921 |
+
"productCode": "PMRINTEGEE",
|
| 922 |
+
"name": "Merge Request Integration EE - Code Review for GitLab",
|
| 923 |
+
"pricingModel": "PAID",
|
| 924 |
+
"icon": "https://plugins.jetbrains.com/files/13615/113000/icon/pluginIcon.svg"
|
| 925 |
+
},
|
| 926 |
+
{
|
| 927 |
+
"id": 23687,
|
| 928 |
+
"productCode": "PMICRONAUTLAUNC",
|
| 929 |
+
"name": "Micronaut Launch",
|
| 930 |
+
"pricingModel": "PAID",
|
| 931 |
+
"icon": "https://plugins.jetbrains.com/files/23687/478379/icon/pluginIcon.svg"
|
| 932 |
+
},
|
| 933 |
+
{
|
| 934 |
+
"id": 13720,
|
| 935 |
+
"productCode": "PMINBATIS",
|
| 936 |
+
"name": "MinBatis",
|
| 937 |
+
"pricingModel": "PAID",
|
| 938 |
+
"icon": "https://plugins.jetbrains.com/files/13720/116149/icon/pluginIcon.svg"
|
| 939 |
+
},
|
| 940 |
+
{
|
| 941 |
+
"id": 23999,
|
| 942 |
+
"productCode": "PMONGODB",
|
| 943 |
+
"name": "Mongo DB",
|
| 944 |
+
"pricingModel": "PAID",
|
| 945 |
+
"icon": "https://plugins.jetbrains.com/files/23999/518250/icon/pluginIcon.svg"
|
| 946 |
+
},
|
| 947 |
+
{
|
| 948 |
+
"id": 20761,
|
| 949 |
+
"productCode": "PMONGOEXPERT",
|
| 950 |
+
"name": "Mongo Expert",
|
| 951 |
+
"pricingModel": "PAID",
|
| 952 |
+
"icon": "https://plugins.jetbrains.com/files/20761/510302/icon/pluginIcon.svg"
|
| 953 |
+
},
|
| 954 |
+
{
|
| 955 |
+
"id": 17465,
|
| 956 |
+
"productCode": "PCDMQTTCLIENT",
|
| 957 |
+
"name": "MQTT Client",
|
| 958 |
+
"pricingModel": "PAID",
|
| 959 |
+
"icon": "https://plugins.jetbrains.com/files/17465/308433/icon/pluginIcon.svg"
|
| 960 |
+
},
|
| 961 |
+
{
|
| 962 |
+
"id": 13905,
|
| 963 |
+
"productCode": "PMYBATISLOG",
|
| 964 |
+
"name": "MyBatis Log",
|
| 965 |
+
"pricingModel": "PAID",
|
| 966 |
+
"icon": "https://plugins.jetbrains.com/files/13905/447241/icon/pluginIcon.svg"
|
| 967 |
+
},
|
| 968 |
+
{
|
| 969 |
+
"id": 18389,
|
| 970 |
+
"productCode": "PMBCODEHELPPRO",
|
| 971 |
+
"name": "Mybatis Smart Code Help Pro",
|
| 972 |
+
"pricingModel": "FREEMIUM",
|
| 973 |
+
"icon": "https://plugins.jetbrains.com/files/18389/516824/icon/pluginIcon.svg"
|
| 974 |
+
},
|
| 975 |
+
{
|
| 976 |
+
"id": 23478,
|
| 977 |
+
"productCode": "PMYBATISCODE",
|
| 978 |
+
"name": "MybatisCode",
|
| 979 |
+
"pricingModel": "PAID",
|
| 980 |
+
"icon": "https://plugins.jetbrains.com/files/23478/472229/icon/pluginIcon.svg"
|
| 981 |
+
},
|
| 982 |
+
{
|
| 983 |
+
"id": 14522,
|
| 984 |
+
"productCode": "PMYBATISHELPER",
|
| 985 |
+
"name": "MyBatisCodeHelperPro (Marketplace Edition)",
|
| 986 |
+
"pricingModel": "PAID",
|
| 987 |
+
"icon": "https://plugins.jetbrains.com/files/14522/510194/icon/pluginIcon.svg"
|
| 988 |
+
},
|
| 989 |
+
{
|
| 990 |
+
"id": 22655,
|
| 991 |
+
"productCode": "PMYSQLPROXY",
|
| 992 |
+
"name": "MySQL Proxy",
|
| 993 |
+
"pricingModel": "FREEMIUM",
|
| 994 |
+
"icon": "https://plugins.jetbrains.com/files/22655/436599/icon/pluginIcon.svg"
|
| 995 |
+
},
|
| 996 |
+
{
|
| 997 |
+
"id": 18387,
|
| 998 |
+
"productCode": "PNEONPRO",
|
| 999 |
+
"name": "NEON Nette Support",
|
| 1000 |
+
"pricingModel": "PAID",
|
| 1001 |
+
"icon": "https://plugins.jetbrains.com/files/18387/479200/icon/pluginIcon.svg"
|
| 1002 |
+
},
|
| 1003 |
+
{
|
| 1004 |
+
"id": 19977,
|
| 1005 |
+
"productCode": "PNETLIFY",
|
| 1006 |
+
"name": "Netlify Dashboard",
|
| 1007 |
+
"pricingModel": "PAID",
|
| 1008 |
+
"icon": "https://plugins.jetbrains.com/files/19977/463949/icon/pluginIcon.svg"
|
| 1009 |
+
},
|
| 1010 |
+
{
|
| 1011 |
+
"id": 19963,
|
| 1012 |
+
"productCode": "PNEXTSKETCH",
|
| 1013 |
+
"name": "NextSketch",
|
| 1014 |
+
"pricingModel": "PAID",
|
| 1015 |
+
"icon": "https://plugins.jetbrains.com/files/19963/272018/icon/pluginIcon.svg"
|
| 1016 |
+
},
|
| 1017 |
+
{
|
| 1018 |
+
"id": 20805,
|
| 1019 |
+
"productCode": "PNEXTSKETCHTWO",
|
| 1020 |
+
"name": "NextSketch2",
|
| 1021 |
+
"pricingModel": "PAID",
|
| 1022 |
+
"icon": "https://plugins.jetbrains.com/files/20805/308349/icon/pluginIcon.svg"
|
| 1023 |
+
},
|
| 1024 |
+
{
|
| 1025 |
+
"id": 23765,
|
| 1026 |
+
"productCode": "PNFLUTTER",
|
| 1027 |
+
"name": "NFlutter",
|
| 1028 |
+
"pricingModel": "PAID",
|
| 1029 |
+
"icon": "https://plugins.jetbrains.com/files/23765/492994/icon/pluginIcon.svg"
|
| 1030 |
+
},
|
| 1031 |
+
{
|
| 1032 |
+
"id": 18280,
|
| 1033 |
+
"productCode": "PNGINX",
|
| 1034 |
+
"name": "Nginx Configuration Pro",
|
| 1035 |
+
"pricingModel": "PAID",
|
| 1036 |
+
"icon": "https://plugins.jetbrains.com/files/18280/239000/icon/pluginIcon.svg"
|
| 1037 |
+
},
|
| 1038 |
+
{
|
| 1039 |
+
"id": 19205,
|
| 1040 |
+
"productCode": "PNGROK",
|
| 1041 |
+
"name": "Ngrok",
|
| 1042 |
+
"pricingModel": "FREEMIUM",
|
| 1043 |
+
"icon": "https://plugins.jetbrains.com/files/19205/510423/icon/pluginIcon.svg"
|
| 1044 |
+
},
|
| 1045 |
+
{
|
| 1046 |
+
"id": 21833,
|
| 1047 |
+
"productCode": "PNOSQLNAVMDB",
|
| 1048 |
+
"name": "NoSQL Navigator For MongoDB",
|
| 1049 |
+
"pricingModel": "PAID",
|
| 1050 |
+
"icon": "https://plugins.jetbrains.com/files/21833/433051/icon/pluginIcon.svg"
|
| 1051 |
+
},
|
| 1052 |
+
{
|
| 1053 |
+
"id": 22128,
|
| 1054 |
+
"productCode": "PNPMPACKAGEJSON",
|
| 1055 |
+
"name": "NPM Package Json",
|
| 1056 |
+
"pricingModel": "PAID",
|
| 1057 |
+
"icon": "https://plugins.jetbrains.com/files/22128/451192/icon/pluginIcon.svg"
|
| 1058 |
+
},
|
| 1059 |
+
{
|
| 1060 |
+
"id": 13499,
|
| 1061 |
+
"productCode": "PODOO",
|
| 1062 |
+
"name": "Odoo",
|
| 1063 |
+
"pricingModel": "PAID",
|
| 1064 |
+
"icon": "https://plugins.jetbrains.com/files/13499/512679/icon/pluginIcon.svg"
|
| 1065 |
+
},
|
| 1066 |
+
{
|
| 1067 |
+
"id": 13151,
|
| 1068 |
+
"productCode": "POFFICEFLOOR",
|
| 1069 |
+
"name": "OfficeFloor",
|
| 1070 |
+
"pricingModel": "PAID",
|
| 1071 |
+
"icon": "https://plugins.jetbrains.com/files/13151/131867/icon/pluginIcon.svg"
|
| 1072 |
+
},
|
| 1073 |
+
{
|
| 1074 |
+
"id": 19889,
|
| 1075 |
+
"productCode": "POPENAPICRUDWIZ",
|
| 1076 |
+
"name": "OpenAPI CRUD Wizard",
|
| 1077 |
+
"pricingModel": "FREEMIUM",
|
| 1078 |
+
"icon": "https://plugins.jetbrains.com/files/19889/478359/icon/pluginIcon.svg"
|
| 1079 |
+
},
|
| 1080 |
+
{
|
| 1081 |
+
"id": 12887,
|
| 1082 |
+
"productCode": "POPENAPI",
|
| 1083 |
+
"name": "OpenAPI Editor",
|
| 1084 |
+
"pricingModel": "PAID",
|
| 1085 |
+
"icon": "https://plugins.jetbrains.com/files/12887/512174/icon/pluginIcon.svg"
|
| 1086 |
+
},
|
| 1087 |
+
{
|
| 1088 |
+
"id": 14371,
|
| 1089 |
+
"productCode": "PIMAGEVIEWER",
|
| 1090 |
+
"name": "OpenCV Image Viewer",
|
| 1091 |
+
"pricingModel": "FREEMIUM",
|
| 1092 |
+
"icon": "https://plugins.jetbrains.com/files/14371/480879/icon/pluginIcon.svg"
|
| 1093 |
+
},
|
| 1094 |
+
{
|
| 1095 |
+
"id": 12626,
|
| 1096 |
+
"productCode": "PORCHIDE",
|
| 1097 |
+
"name": "OrchidE - Ansible Language Support",
|
| 1098 |
+
"pricingModel": "PAID",
|
| 1099 |
+
"icon": "https://plugins.jetbrains.com"
|
| 1100 |
+
},
|
| 1101 |
+
{
|
| 1102 |
+
"id": 19660,
|
| 1103 |
+
"productCode": "PAWSQLADVISOR",
|
| 1104 |
+
"name": "PawSQL Advisor,SQL Audit/Rewrite/Index Advice,Tune SQL by Clicks",
|
| 1105 |
+
"pricingModel": "PAID",
|
| 1106 |
+
"icon": "https://plugins.jetbrains.com/files/19660/502106/icon/pluginIcon.svg"
|
| 1107 |
+
},
|
| 1108 |
+
{
|
| 1109 |
+
"id": 17440,
|
| 1110 |
+
"productCode": "PHPBUILDER",
|
| 1111 |
+
"name": "PHP Data Object Generator",
|
| 1112 |
+
"pricingModel": "FREEMIUM",
|
| 1113 |
+
"icon": "https://plugins.jetbrains.com/files/17440/458368/icon/pluginIcon.svg"
|
| 1114 |
+
},
|
| 1115 |
+
{
|
| 1116 |
+
"id": 18981,
|
| 1117 |
+
"productCode": "PPHPHOUDINI",
|
| 1118 |
+
"name": "PHP Houdini",
|
| 1119 |
+
"pricingModel": "PAID",
|
| 1120 |
+
"icon": "https://plugins.jetbrains.com/files/18981/271233/icon/pluginIcon.svg"
|
| 1121 |
+
},
|
| 1122 |
+
{
|
| 1123 |
+
"id": 16935,
|
| 1124 |
+
"productCode": "PHPEAPLUGIN",
|
| 1125 |
+
"name": "Php Inspections (EA Ultimate)",
|
| 1126 |
+
"pricingModel": "PAID",
|
| 1127 |
+
"icon": "https://plugins.jetbrains.com"
|
| 1128 |
+
},
|
| 1129 |
+
{
|
| 1130 |
+
"id": 14821,
|
| 1131 |
+
"productCode": "PPUMLSTUDIO",
|
| 1132 |
+
"name": "PlantUML Studio",
|
| 1133 |
+
"pricingModel": "PAID",
|
| 1134 |
+
"icon": "https://plugins.jetbrains.com/files/14821/172312/icon/pluginIcon.svg"
|
| 1135 |
+
},
|
| 1136 |
+
{
|
| 1137 |
+
"id": 13733,
|
| 1138 |
+
"productCode": "PPOJOTOJSONSCH",
|
| 1139 |
+
"name": "POJO to JSON Schema",
|
| 1140 |
+
"pricingModel": "PAID",
|
| 1141 |
+
"icon": "https://plugins.jetbrains.com/files/13733/95154/icon/pluginIcon.svg"
|
| 1142 |
+
},
|
| 1143 |
+
{
|
| 1144 |
+
"id": 22429,
|
| 1145 |
+
"productCode": "PPOLARISTOMCATS",
|
| 1146 |
+
"name": "Polaris Tomcat Server",
|
| 1147 |
+
"pricingModel": "PAID",
|
| 1148 |
+
"icon": "https://plugins.jetbrains.com/files/22429/506445/icon/pluginIcon.svg"
|
| 1149 |
+
},
|
| 1150 |
+
{
|
| 1151 |
+
"id": 21361,
|
| 1152 |
+
"productCode": "POLYBPMNGDNEXT",
|
| 1153 |
+
"name": "PolyBPMN visualizer",
|
| 1154 |
+
"pricingModel": "PAID",
|
| 1155 |
+
"icon": "https://plugins.jetbrains.com/files/21361/479001/icon/pluginIcon.svg"
|
| 1156 |
+
},
|
| 1157 |
+
{
|
| 1158 |
+
"id": 14434,
|
| 1159 |
+
"productCode": "PQMLEDITOR",
|
| 1160 |
+
"name": "QmlEditor",
|
| 1161 |
+
"pricingModel": "PAID",
|
| 1162 |
+
"icon": "https://plugins.jetbrains.com/files/14434/314029/icon/pluginIcon.svg"
|
| 1163 |
+
},
|
| 1164 |
+
{
|
| 1165 |
+
"id": 16405,
|
| 1166 |
+
"productCode": "PQTSQSSEDITOR",
|
| 1167 |
+
"name": "Qt Style Sheets Editor",
|
| 1168 |
+
"pricingModel": "PAID",
|
| 1169 |
+
"icon": "https://plugins.jetbrains.com/files/16405/193379/icon/pluginIcon.svg"
|
| 1170 |
+
},
|
| 1171 |
+
{
|
| 1172 |
+
"id": 19027,
|
| 1173 |
+
"productCode": "PQUARKUSHELPER",
|
| 1174 |
+
"name": "Quarkus Assistant",
|
| 1175 |
+
"pricingModel": "PAID",
|
| 1176 |
+
"icon": "https://plugins.jetbrains.com/files/19027/477162/icon/pluginIcon.svg"
|
| 1177 |
+
},
|
| 1178 |
+
{
|
| 1179 |
+
"id": 18269,
|
| 1180 |
+
"productCode": "PQUERYFLAG",
|
| 1181 |
+
"name": "QueryFlag",
|
| 1182 |
+
"pricingModel": "PAID",
|
| 1183 |
+
"icon": "https://plugins.jetbrains.com/files/18269/508126/icon/pluginIcon.svg"
|
| 1184 |
+
},
|
| 1185 |
+
{
|
| 1186 |
+
"id": 10080,
|
| 1187 |
+
"productCode": "PRAINBOWBRACKET",
|
| 1188 |
+
"name": "Rainbow Brackets",
|
| 1189 |
+
"pricingModel": "FREEMIUM",
|
| 1190 |
+
"icon": "https://plugins.jetbrains.com/files/10080/509542/icon/pluginIcon.svg"
|
| 1191 |
+
},
|
| 1192 |
+
{
|
| 1193 |
+
"id": 19316,
|
| 1194 |
+
"productCode": "PRANCHER",
|
| 1195 |
+
"name": "Rancher",
|
| 1196 |
+
"pricingModel": "PAID",
|
| 1197 |
+
"icon": "https://plugins.jetbrains.com/files/19316/367013/icon/pluginIcon.svg"
|
| 1198 |
+
},
|
| 1199 |
+
{
|
| 1200 |
+
"id": 13838,
|
| 1201 |
+
"productCode": "PRDFANDSPARQL",
|
| 1202 |
+
"name": "RDF and SPARQL",
|
| 1203 |
+
"pricingModel": "PAID",
|
| 1204 |
+
"icon": "https://plugins.jetbrains.com/files/13838/499816/icon/pluginIcon.svg"
|
| 1205 |
+
},
|
| 1206 |
+
{
|
| 1207 |
+
"id": 9564,
|
| 1208 |
+
"productCode": "PRNCONSOLE",
|
| 1209 |
+
"name": "React Native Console",
|
| 1210 |
+
"pricingModel": "PAID",
|
| 1211 |
+
"icon": "https://plugins.jetbrains.com/files/9564/514551/icon/pluginIcon.svg"
|
| 1212 |
+
},
|
| 1213 |
+
{
|
| 1214 |
+
"id": 12820,
|
| 1215 |
+
"productCode": "PREDIS",
|
| 1216 |
+
"name": "Redis",
|
| 1217 |
+
"pricingModel": "PAID",
|
| 1218 |
+
"icon": "https://plugins.jetbrains.com/files/12820/433300/icon/pluginIcon.svg"
|
| 1219 |
+
},
|
| 1220 |
+
{
|
| 1221 |
+
"id": 19360,
|
| 1222 |
+
"productCode": "PREDISCLIHELPER",
|
| 1223 |
+
"name": "Redis Client",
|
| 1224 |
+
"pricingModel": "PAID",
|
| 1225 |
+
"icon": "https://plugins.jetbrains.com/files/19360/479210/icon/pluginIcon.svg"
|
| 1226 |
+
},
|
| 1227 |
+
{
|
| 1228 |
+
"id": 15722,
|
| 1229 |
+
"productCode": "PREDISMANAGER",
|
| 1230 |
+
"name": "Redis Manager",
|
| 1231 |
+
"pricingModel": "PAID",
|
| 1232 |
+
"icon": "https://plugins.jetbrains.com/files/15722/270538/icon/pluginIcon.svg"
|
| 1233 |
+
},
|
| 1234 |
+
{
|
| 1235 |
+
"id": 19599,
|
| 1236 |
+
"productCode": "PREDISS",
|
| 1237 |
+
"name": "Redis Operator",
|
| 1238 |
+
"pricingModel": "PAID",
|
| 1239 |
+
"icon": "https://plugins.jetbrains.com/files/19599/518569/icon/pluginIcon.svg"
|
| 1240 |
+
},
|
| 1241 |
+
{
|
| 1242 |
+
"id": 16160,
|
| 1243 |
+
"productCode": "PREDISTOOLS",
|
| 1244 |
+
"name": "Redis-Cli",
|
| 1245 |
+
"pricingModel": "PAID",
|
| 1246 |
+
"icon": "https://plugins.jetbrains.com/files/16160/286263/icon/pluginIcon.svg"
|
| 1247 |
+
},
|
| 1248 |
+
{
|
| 1249 |
+
"id": 15433,
|
| 1250 |
+
"productCode": "PREGEXTOOL",
|
| 1251 |
+
"name": "Regex Tool",
|
| 1252 |
+
"pricingModel": "PAID",
|
| 1253 |
+
"icon": "https://plugins.jetbrains.com/files/15433/510718/icon/pluginIcon.svg"
|
| 1254 |
+
},
|
| 1255 |
+
{
|
| 1256 |
+
"id": 14723,
|
| 1257 |
+
"productCode": "PRESTKIT",
|
| 1258 |
+
"name": "RestfulBox",
|
| 1259 |
+
"pricingModel": "FREEMIUM",
|
| 1260 |
+
"icon": "https://plugins.jetbrains.com/files/14723/464469/icon/pluginIcon.svg"
|
| 1261 |
+
},
|
| 1262 |
+
{
|
| 1263 |
+
"id": 22726,
|
| 1264 |
+
"productCode": "PRETROFITASSIT",
|
| 1265 |
+
"name": "Retrofit Assistant",
|
| 1266 |
+
"pricingModel": "PAID",
|
| 1267 |
+
"icon": "https://plugins.jetbrains.com/files/22726/514538/icon/pluginIcon.svg"
|
| 1268 |
+
},
|
| 1269 |
+
{
|
| 1270 |
+
"id": 22428,
|
| 1271 |
+
"productCode": "PWXUQRYTOXCRSEO",
|
| 1272 |
+
"name": "RustTool",
|
| 1273 |
+
"pricingModel": "PAID",
|
| 1274 |
+
"icon": "https://plugins.jetbrains.com/files/22428/513930/icon/pluginIcon.svg"
|
| 1275 |
+
},
|
| 1276 |
+
{
|
| 1277 |
+
"id": 13668,
|
| 1278 |
+
"productCode": "PSFCC",
|
| 1279 |
+
"name": "Salesforce B2C Commerce (SFCC)",
|
| 1280 |
+
"pricingModel": "PAID",
|
| 1281 |
+
"icon": "https://plugins.jetbrains.com/files/13668/510847/icon/pluginIcon.svg"
|
| 1282 |
+
},
|
| 1283 |
+
{
|
| 1284 |
+
"id": 22748,
|
| 1285 |
+
"productCode": "PSCHEMAREGVIEW",
|
| 1286 |
+
"name": "Schema Registry Viewer",
|
| 1287 |
+
"pricingModel": "PAID",
|
| 1288 |
+
"icon": "https://plugins.jetbrains.com/files/22748/496140/icon/pluginIcon.svg"
|
| 1289 |
+
},
|
| 1290 |
+
{
|
| 1291 |
+
"id": 12108,
|
| 1292 |
+
"productCode": "PSCIPIO",
|
| 1293 |
+
"name": "Scipio ERP Integration",
|
| 1294 |
+
"pricingModel": "PAID",
|
| 1295 |
+
"icon": "https://plugins.jetbrains.com/files/12108/478355/icon/pluginIcon.svg"
|
| 1296 |
+
},
|
| 1297 |
+
{
|
| 1298 |
+
"id": 19556,
|
| 1299 |
+
"productCode": "PSCREENCODEPRO",
|
| 1300 |
+
"name": "ScreenCodePro",
|
| 1301 |
+
"pricingModel": "PAID",
|
| 1302 |
+
"icon": "https://plugins.jetbrains.com/files/19556/198086/icon/pluginIcon.svg"
|
| 1303 |
+
},
|
| 1304 |
+
{
|
| 1305 |
+
"id": 22232,
|
| 1306 |
+
"productCode": "PSENTRY",
|
| 1307 |
+
"name": "Sentry",
|
| 1308 |
+
"pricingModel": "FREEMIUM",
|
| 1309 |
+
"icon": "https://plugins.jetbrains.com/files/22232/514906/icon/pluginIcon.svg"
|
| 1310 |
+
},
|
| 1311 |
+
{
|
| 1312 |
+
"id": 15945,
|
| 1313 |
+
"productCode": "PSENTRYINTEG",
|
| 1314 |
+
"name": "Sentry Integration",
|
| 1315 |
+
"pricingModel": "PAID",
|
| 1316 |
+
"icon": "https://plugins.jetbrains.com/files/15945/111527/icon/pluginIcon.svg"
|
| 1317 |
+
},
|
| 1318 |
+
{
|
| 1319 |
+
"id": 8286,
|
| 1320 |
+
"productCode": "PSEQUENCEDIAGRA",
|
| 1321 |
+
"name": "SequenceDiagram",
|
| 1322 |
+
"pricingModel": "FREEMIUM",
|
| 1323 |
+
"icon": "https://plugins.jetbrains.com/files/8286/485614/icon/pluginIcon.svg"
|
| 1324 |
+
},
|
| 1325 |
+
{
|
| 1326 |
+
"id": 23115,
|
| 1327 |
+
"productCode": "PSEQDIAORG",
|
| 1328 |
+
"name": "SequenceDiagram.org",
|
| 1329 |
+
"pricingModel": "PAID",
|
| 1330 |
+
"icon": "https://plugins.jetbrains.com/files/23115/485275/icon/pluginIcon.svg"
|
| 1331 |
+
},
|
| 1332 |
+
{
|
| 1333 |
+
"id": 14437,
|
| 1334 |
+
"productCode": "PSI",
|
| 1335 |
+
"name": "Shared Project Indexes",
|
| 1336 |
+
"pricingModel": "PAID",
|
| 1337 |
+
"icon": "https://plugins.jetbrains.com/files/14437/508994/icon/pluginIcon.svg"
|
| 1338 |
+
},
|
| 1339 |
+
{
|
| 1340 |
+
"id": 7410,
|
| 1341 |
+
"productCode": "PSWPLUGIN",
|
| 1342 |
+
"name": "Shopware",
|
| 1343 |
+
"pricingModel": "PAID",
|
| 1344 |
+
"icon": "https://plugins.jetbrains.com/files/7410/167127/icon/pluginIcon.svg"
|
| 1345 |
+
},
|
| 1346 |
+
{
|
| 1347 |
+
"id": 18151,
|
| 1348 |
+
"productCode": "PBEANCONVERTER",
|
| 1349 |
+
"name": "Simple Object Copy",
|
| 1350 |
+
"pricingModel": "PAID",
|
| 1351 |
+
"icon": "https://plugins.jetbrains.com"
|
| 1352 |
+
},
|
| 1353 |
+
{
|
| 1354 |
+
"id": 20243,
|
| 1355 |
+
"productCode": "PSKOL",
|
| 1356 |
+
"name": "Skol",
|
| 1357 |
+
"pricingModel": "PAID",
|
| 1358 |
+
"icon": "https://plugins.jetbrains.com/files/20243/518236/icon/pluginIcon.svg"
|
| 1359 |
+
},
|
| 1360 |
+
{
|
| 1361 |
+
"id": 14053,
|
| 1362 |
+
"productCode": "PSMARTJUMP",
|
| 1363 |
+
"name": "Smart Jump",
|
| 1364 |
+
"pricingModel": "PAID",
|
| 1365 |
+
"icon": "https://plugins.jetbrains.com/files/14053/274462/icon/pluginIcon.svg"
|
| 1366 |
+
},
|
| 1367 |
+
{
|
| 1368 |
+
"id": 20565,
|
| 1369 |
+
"productCode": "PTAILWINDTOOLS",
|
| 1370 |
+
"name": "Snippet Toolkit for Tailwind CSS",
|
| 1371 |
+
"pricingModel": "PAID",
|
| 1372 |
+
"icon": "https://plugins.jetbrains.com/files/20565/502104/icon/pluginIcon.svg"
|
| 1373 |
+
},
|
| 1374 |
+
{
|
| 1375 |
+
"id": 23743,
|
| 1376 |
+
"productCode": "PSOTERISECURITY",
|
| 1377 |
+
"name": "Soteri Secret Scanner",
|
| 1378 |
+
"pricingModel": "PAID",
|
| 1379 |
+
"icon": "https://plugins.jetbrains.com/files/23743/484143/icon/pluginIcon.svg"
|
| 1380 |
+
},
|
| 1381 |
+
{
|
| 1382 |
+
"id": 22318,
|
| 1383 |
+
"productCode": "PSOURCESYNCPRO",
|
| 1384 |
+
"name": "Source Synchronizer Pro",
|
| 1385 |
+
"pricingModel": "PAID",
|
| 1386 |
+
"icon": "https://plugins.jetbrains.com/files/22318/503948/icon/pluginIcon.svg"
|
| 1387 |
+
},
|
| 1388 |
+
{
|
| 1389 |
+
"id": 14338,
|
| 1390 |
+
"productCode": "PSPARQL",
|
| 1391 |
+
"name": "SPARQL",
|
| 1392 |
+
"pricingModel": "PAID",
|
| 1393 |
+
"icon": "https://plugins.jetbrains.com/files/14338/165810/icon/pluginIcon.svg"
|
| 1394 |
+
},
|
| 1395 |
+
{
|
| 1396 |
+
"id": 22635,
|
| 1397 |
+
"productCode": "PSPEECHTOTEXT",
|
| 1398 |
+
"name": "Speech-To-Text (AWS Transcribe)",
|
| 1399 |
+
"pricingModel": "PAID",
|
| 1400 |
+
"icon": "https://plugins.jetbrains.com/files/22635/388024/icon/pluginIcon.svg"
|
| 1401 |
+
},
|
| 1402 |
+
{
|
| 1403 |
+
"id": 18622,
|
| 1404 |
+
"productCode": "PSPRINGBOOTIDEA",
|
| 1405 |
+
"name": "Spring Boot Helper",
|
| 1406 |
+
"pricingModel": "PAID",
|
| 1407 |
+
"icon": "https://plugins.jetbrains.com/files/18622/472683/icon/pluginIcon.svg"
|
| 1408 |
+
},
|
| 1409 |
+
{
|
| 1410 |
+
"id": 22304,
|
| 1411 |
+
"productCode": "PSRCODEGEN",
|
| 1412 |
+
"name": "Spring Rest Code Generator",
|
| 1413 |
+
"pricingModel": "PAID",
|
| 1414 |
+
"icon": "https://plugins.jetbrains.com/files/22304/391163/icon/pluginIcon.svg"
|
| 1415 |
+
},
|
| 1416 |
+
{
|
| 1417 |
+
"id": 15574,
|
| 1418 |
+
"productCode": "PFLYINSKYZJBZ",
|
| 1419 |
+
"name": "spring-assistant-@valueToYml",
|
| 1420 |
+
"pricingModel": "PAID",
|
| 1421 |
+
"icon": "https://plugins.jetbrains.com/files/15574/412050/icon/pluginIcon.svg"
|
| 1422 |
+
},
|
| 1423 |
+
{
|
| 1424 |
+
"id": 20534,
|
| 1425 |
+
"productCode": "PSQLFLUFFLINTER",
|
| 1426 |
+
"name": "Sqlfluff Linter (Ultimate Edition)",
|
| 1427 |
+
"pricingModel": "PAID",
|
| 1428 |
+
"icon": "https://plugins.jetbrains.com/files/20534/502715/icon/pluginIcon.svg"
|
| 1429 |
+
},
|
| 1430 |
+
{
|
| 1431 |
+
"id": 22742,
|
| 1432 |
+
"productCode": "PSQLFORMATTER",
|
| 1433 |
+
"name": "SQLFormatter",
|
| 1434 |
+
"pricingModel": "PAID",
|
| 1435 |
+
"icon": "https://plugins.jetbrains.com"
|
| 1436 |
+
},
|
| 1437 |
+
{
|
| 1438 |
+
"id": 22713,
|
| 1439 |
+
"productCode": "PDBSSH",
|
| 1440 |
+
"name": "SSH Tool",
|
| 1441 |
+
"pricingModel": "PAID",
|
| 1442 |
+
"icon": "https://plugins.jetbrains.com/files/22713/516730/icon/pluginIcon.svg"
|
| 1443 |
+
},
|
| 1444 |
+
{
|
| 1445 |
+
"id": 15851,
|
| 1446 |
+
"productCode": "PSTORMSECTIONS",
|
| 1447 |
+
"name": "StormSections",
|
| 1448 |
+
"pricingModel": "FREEMIUM",
|
| 1449 |
+
"icon": "https://plugins.jetbrains.com/files/15851/449282/icon/pluginIcon.svg"
|
| 1450 |
+
},
|
| 1451 |
+
{
|
| 1452 |
+
"id": 14482,
|
| 1453 |
+
"productCode": "PSTRKER",
|
| 1454 |
+
"name": "Stryker",
|
| 1455 |
+
"pricingModel": "FREEMIUM",
|
| 1456 |
+
"icon": "https://plugins.jetbrains.com/files/14482/134911/icon/pluginIcon.svg"
|
| 1457 |
+
},
|
| 1458 |
+
{
|
| 1459 |
+
"id": 23458,
|
| 1460 |
+
"productCode": "PSWISSKITCONVER",
|
| 1461 |
+
"name": "SwissKit Converter",
|
| 1462 |
+
"pricingModel": "PAID",
|
| 1463 |
+
"icon": "https://plugins.jetbrains.com/files/23458/469170/icon/pluginIcon.svg"
|
| 1464 |
+
},
|
| 1465 |
+
{
|
| 1466 |
+
"id": 7219,
|
| 1467 |
+
"productCode": "PSYMFONYPLUGIN",
|
| 1468 |
+
"name": "Symfony Support",
|
| 1469 |
+
"pricingModel": "FREEMIUM",
|
| 1470 |
+
"icon": "https://plugins.jetbrains.com/files/7219/514919/icon/pluginIcon.svg"
|
| 1471 |
+
},
|
| 1472 |
+
{
|
| 1473 |
+
"id": 10695,
|
| 1474 |
+
"productCode": "PVLOG",
|
| 1475 |
+
"name": "SystemVerilog",
|
| 1476 |
+
"pricingModel": "PAID",
|
| 1477 |
+
"icon": "https://plugins.jetbrains.com/files/10695/163626/icon/pluginIcon.svg"
|
| 1478 |
+
},
|
| 1479 |
+
{
|
| 1480 |
+
"id": 14203,
|
| 1481 |
+
"productCode": "PSVERILOG",
|
| 1482 |
+
"name": "SystemVerilog Studio",
|
| 1483 |
+
"pricingModel": "PAID",
|
| 1484 |
+
"icon": "https://plugins.jetbrains.com"
|
| 1485 |
+
},
|
| 1486 |
+
{
|
| 1487 |
+
"id": 22685,
|
| 1488 |
+
"productCode": "PNEKOCAT",
|
| 1489 |
+
"name": "TamaCat the Embedded Internet Browser",
|
| 1490 |
+
"pricingModel": "FREEMIUM",
|
| 1491 |
+
"icon": "https://plugins.jetbrains.com/files/22685/456002/icon/pluginIcon.svg"
|
| 1492 |
+
},
|
| 1493 |
+
{
|
| 1494 |
+
"id": 18857,
|
| 1495 |
+
"productCode": "PTERMINAL",
|
| 1496 |
+
"name": "Terminal Pro",
|
| 1497 |
+
"pricingModel": "FREEMIUM",
|
| 1498 |
+
"icon": "https://plugins.jetbrains.com/files/18857/505301/icon/pluginIcon.svg"
|
| 1499 |
+
},
|
| 1500 |
+
{
|
| 1501 |
+
"id": 20050,
|
| 1502 |
+
"productCode": "PTLDRAI",
|
| 1503 |
+
"name": "TLDR",
|
| 1504 |
+
"pricingModel": "FREEMIUM",
|
| 1505 |
+
"icon": "https://plugins.jetbrains.com/files/20050/394140/icon/pluginIcon.svg"
|
| 1506 |
+
},
|
| 1507 |
+
{
|
| 1508 |
+
"id": 14384,
|
| 1509 |
+
"productCode": "PTOOLSET",
|
| 1510 |
+
"name": "Toolset",
|
| 1511 |
+
"pricingModel": "FREEMIUM",
|
| 1512 |
+
"icon": "https://plugins.jetbrains.com/files/14384/497387/icon/pluginIcon.svg"
|
| 1513 |
+
},
|
| 1514 |
+
{
|
| 1515 |
+
"id": 20683,
|
| 1516 |
+
"productCode": "PTRAVISCI",
|
| 1517 |
+
"name": "Travis CI Dashboard",
|
| 1518 |
+
"pricingModel": "PAID",
|
| 1519 |
+
"icon": "https://plugins.jetbrains.com/files/20683/463950/icon/pluginIcon.svg"
|
| 1520 |
+
},
|
| 1521 |
+
{
|
| 1522 |
+
"id": 18232,
|
| 1523 |
+
"productCode": "PDJANGOTPLPEP",
|
| 1524 |
+
"name": "Typed Django Template",
|
| 1525 |
+
"pricingModel": "FREEMIUM",
|
| 1526 |
+
"icon": "https://plugins.jetbrains.com/files/18232/370564/icon/pluginIcon.svg"
|
| 1527 |
+
},
|
| 1528 |
+
{
|
| 1529 |
+
"id": 19675,
|
| 1530 |
+
"productCode": "PUNIAPPSUPPORT",
|
| 1531 |
+
"name": "Uniapp Support",
|
| 1532 |
+
"pricingModel": "PAID",
|
| 1533 |
+
"icon": "https://plugins.jetbrains.com/files/19675/450668/icon/pluginIcon.svg"
|
| 1534 |
+
},
|
| 1535 |
+
{
|
| 1536 |
+
"id": 21813,
|
| 1537 |
+
"productCode": "PVERILOGLANGUAG",
|
| 1538 |
+
"name": "Verilog Language Support",
|
| 1539 |
+
"pricingModel": "PAID",
|
| 1540 |
+
"icon": "https://plugins.jetbrains.com/files/21813/472208/icon/pluginIcon.svg"
|
| 1541 |
+
},
|
| 1542 |
+
{
|
| 1543 |
+
"id": 23086,
|
| 1544 |
+
"productCode": "PVOQAL",
|
| 1545 |
+
"name": "Voqal Assistant",
|
| 1546 |
+
"pricingModel": "PAID",
|
| 1547 |
+
"icon": "https://plugins.jetbrains.com/files/23086/518244/icon/pluginIcon.svg"
|
| 1548 |
+
},
|
| 1549 |
+
{
|
| 1550 |
+
"id": 18860,
|
| 1551 |
+
"productCode": "PWIREMOCHA",
|
| 1552 |
+
"name": "WireMocha",
|
| 1553 |
+
"pricingModel": "PAID",
|
| 1554 |
+
"icon": "https://plugins.jetbrains.com/files/18860/517127/icon/pluginIcon.svg"
|
| 1555 |
+
},
|
| 1556 |
+
{
|
| 1557 |
+
"id": 7232,
|
| 1558 |
+
"productCode": "PWLANG",
|
| 1559 |
+
"name": "Wolfram Language",
|
| 1560 |
+
"pricingModel": "PAID",
|
| 1561 |
+
"icon": "https://plugins.jetbrains.com/files/7232/476166/icon/pluginIcon.svg"
|
| 1562 |
+
},
|
| 1563 |
+
{
|
| 1564 |
+
"id": 18425,
|
| 1565 |
+
"productCode": "PXSDVISUALIZER",
|
| 1566 |
+
"name": "XSD / WSDL Visualizer",
|
| 1567 |
+
"pricingModel": "PAID",
|
| 1568 |
+
"icon": "https://plugins.jetbrains.com/files/18425/515020/icon/pluginIcon.svg"
|
| 1569 |
+
},
|
| 1570 |
+
{
|
| 1571 |
+
"id": 19024,
|
| 1572 |
+
"productCode": "POXYXSDJSONSCH",
|
| 1573 |
+
"name": "XSD to JSON Schema",
|
| 1574 |
+
"pricingModel": "FREEMIUM",
|
| 1575 |
+
"icon": "https://plugins.jetbrains.com/files/19024/472499/icon/pluginIcon.svg"
|
| 1576 |
+
},
|
| 1577 |
+
{
|
| 1578 |
+
"id": 9739,
|
| 1579 |
+
"productCode": "PYAOQIANGBPMN",
|
| 1580 |
+
"name": "Yaoqiang BPMN Editor",
|
| 1581 |
+
"pricingModel": "PAID",
|
| 1582 |
+
"icon": "https://plugins.jetbrains.com"
|
| 1583 |
+
},
|
| 1584 |
+
{
|
| 1585 |
+
"id": 23693,
|
| 1586 |
+
"productCode": "PYIIFRAMEWORK",
|
| 1587 |
+
"name": "Yii2 Framework Support",
|
| 1588 |
+
"pricingModel": "PAID",
|
| 1589 |
+
"icon": "https://plugins.jetbrains.com/files/23693/504334/icon/pluginIcon.svg"
|
| 1590 |
+
},
|
| 1591 |
+
{
|
| 1592 |
+
"id": 12437,
|
| 1593 |
+
"productCode": "PZENUML",
|
| 1594 |
+
"name": "ZenUML Support",
|
| 1595 |
+
"pricingModel": "FREEMIUM",
|
| 1596 |
+
"icon": "https://plugins.jetbrains.com/files/12437/466910/icon/pluginIcon.svg"
|
| 1597 |
+
},
|
| 1598 |
+
{
|
| 1599 |
+
"id": 15773,
|
| 1600 |
+
"productCode": "PZEROCODE",
|
| 1601 |
+
"name": "Zerocode Scenario Helper",
|
| 1602 |
+
"pricingModel": "PAID",
|
| 1603 |
+
"icon": "https://plugins.jetbrains.com/files/15773/155295/icon/pluginIcon.svg"
|
| 1604 |
+
},
|
| 1605 |
+
{
|
| 1606 |
+
"id": 18341,
|
| 1607 |
+
"productCode": "PZKA",
|
| 1608 |
+
"name": "Zookeeper-Admin",
|
| 1609 |
+
"pricingModel": "PAID",
|
| 1610 |
+
"icon": "https://plugins.jetbrains.com"
|
| 1611 |
+
}
|
| 1612 |
+
]
|
src/main/resources/external/data/product.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"name": "All Jetbrains's Product Or Plugin",
|
| 4 |
+
"productCode": "",
|
| 5 |
+
"iconClass": "icon-al"
|
| 6 |
+
},
|
| 7 |
+
{
|
| 8 |
+
"name": "IntelliJ IDEA",
|
| 9 |
+
"productCode": "II,PCWMP,PSI",
|
| 10 |
+
"iconClass": "icon-ii"
|
| 11 |
+
},
|
| 12 |
+
{
|
| 13 |
+
"name": "PhpStorm",
|
| 14 |
+
"productCode": "PS,PCWMP,PSI",
|
| 15 |
+
"iconClass": "icon-ps"
|
| 16 |
+
},
|
| 17 |
+
{
|
| 18 |
+
"name": "AppCode",
|
| 19 |
+
"productCode": "AC,PCWMP,PSI",
|
| 20 |
+
"iconClass": "icon-ac"
|
| 21 |
+
},
|
| 22 |
+
{
|
| 23 |
+
"name": "DataGrip",
|
| 24 |
+
"productCode": "DB,PSI,PDB",
|
| 25 |
+
"iconClass": "icon-db"
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
"name": "RubyMine",
|
| 29 |
+
"productCode": "RM,PCWMP,PSI",
|
| 30 |
+
"iconClass": "icon-rm"
|
| 31 |
+
},
|
| 32 |
+
{
|
| 33 |
+
"name": "WebStorm",
|
| 34 |
+
"productCode": "WS,PCWMP,PSI",
|
| 35 |
+
"iconClass": "icon-ws"
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"name": "Rider",
|
| 39 |
+
"productCode": "RD,PDB,PSI,PCWMP",
|
| 40 |
+
"iconClass": "icon-rd"
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
"name": "CLion",
|
| 44 |
+
"productCode": "CL,PSI,PCWMP",
|
| 45 |
+
"iconClass": "icon-cl"
|
| 46 |
+
},
|
| 47 |
+
{
|
| 48 |
+
"name": "PyCharm",
|
| 49 |
+
"productCode": "PC,PSI,PCWMP",
|
| 50 |
+
"iconClass": "icon-pc"
|
| 51 |
+
},
|
| 52 |
+
{
|
| 53 |
+
"name": "GoLand",
|
| 54 |
+
"productCode": "GO,PSI,PCWMP",
|
| 55 |
+
"iconClass": "icon-go"
|
| 56 |
+
},
|
| 57 |
+
{
|
| 58 |
+
"name": "DataSpell",
|
| 59 |
+
"productCode": "DS,PSI,PDB,PCWMP",
|
| 60 |
+
"iconClass": "icon-ds"
|
| 61 |
+
},
|
| 62 |
+
{
|
| 63 |
+
"name": "dotMemory",
|
| 64 |
+
"productCode": "DM",
|
| 65 |
+
"iconClass": "icon-dm"
|
| 66 |
+
}
|
| 67 |
+
]
|
src/main/resources/static/css/index.css
ADDED
|
@@ -0,0 +1,574 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.form {
|
| 2 |
+
background-color: #15172b;
|
| 3 |
+
border-radius: 20px;
|
| 4 |
+
box-sizing: border-box;
|
| 5 |
+
height: 500px;
|
| 6 |
+
padding: 20px;
|
| 7 |
+
width: 320px;
|
| 8 |
+
}
|
| 9 |
+
|
| 10 |
+
.title {
|
| 11 |
+
color: #eee;
|
| 12 |
+
font-family: sans-serif;
|
| 13 |
+
font-size: 36px;
|
| 14 |
+
font-weight: 600;
|
| 15 |
+
margin-top: 30px;
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
.subtitle {
|
| 19 |
+
color: #eee;
|
| 20 |
+
font-family: sans-serif;
|
| 21 |
+
font-size: 16px;
|
| 22 |
+
font-weight: 600;
|
| 23 |
+
margin-top: 10px;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
.input-container {
|
| 27 |
+
height: 50px;
|
| 28 |
+
position: relative;
|
| 29 |
+
width: 100%;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
.ic1 {
|
| 33 |
+
margin-top: 40px;
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
.ic2 {
|
| 37 |
+
margin-top: 30px;
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
.input {
|
| 41 |
+
background-color: #303245;
|
| 42 |
+
border-radius: 12px;
|
| 43 |
+
border: 0;
|
| 44 |
+
box-sizing: border-box;
|
| 45 |
+
color: #eee;
|
| 46 |
+
font-size: 18px;
|
| 47 |
+
height: 100%;
|
| 48 |
+
outline: 0;
|
| 49 |
+
padding: 4px 20px 0;
|
| 50 |
+
width: 100%;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.cut {
|
| 54 |
+
background-color: #15172b;
|
| 55 |
+
border-radius: 10px;
|
| 56 |
+
height: 20px;
|
| 57 |
+
left: 20px;
|
| 58 |
+
position: absolute;
|
| 59 |
+
top: -20px;
|
| 60 |
+
transform: translateY(0);
|
| 61 |
+
transition: transform 200ms;
|
| 62 |
+
width: 76px;
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
.cut-short {
|
| 66 |
+
width: 50px;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
.input:focus ~ .cut,
|
| 70 |
+
.input:not(:placeholder-shown) ~ .cut {
|
| 71 |
+
transform: translateY(8px);
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
.placeholder {
|
| 75 |
+
color: #65657b;
|
| 76 |
+
font-family: sans-serif;
|
| 77 |
+
left: 20px;
|
| 78 |
+
line-height: 14px;
|
| 79 |
+
pointer-events: none;
|
| 80 |
+
position: absolute;
|
| 81 |
+
transform-origin: 0 50%;
|
| 82 |
+
transition: transform 200ms, color 200ms;
|
| 83 |
+
top: 20px;
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
.input:focus ~ .placeholder,
|
| 87 |
+
.input:not(:placeholder-shown) ~ .placeholder {
|
| 88 |
+
transform: translateY(-30px) translateX(10px) scale(0.75);
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
.input:not(:placeholder-shown) ~ .placeholder {
|
| 92 |
+
color: #808097;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
.input:focus ~ .placeholder {
|
| 96 |
+
color: #dc2f55;
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
.submit {
|
| 100 |
+
background-color: #08d;
|
| 101 |
+
border-radius: 12px;
|
| 102 |
+
border: 0;
|
| 103 |
+
box-sizing: border-box;
|
| 104 |
+
color: #eee;
|
| 105 |
+
cursor: pointer;
|
| 106 |
+
font-size: 18px;
|
| 107 |
+
height: 50px;
|
| 108 |
+
margin-top: 38px;
|
| 109 |
+
text-align: center;
|
| 110 |
+
width: 100%;
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
.submit:active {
|
| 114 |
+
background-color: #06b;
|
| 115 |
+
}
|
| 116 |
+
:root {
|
| 117 |
+
--text-grey: #9e9e9e;
|
| 118 |
+
--text-main: rgba(0, 0, 0, 0.87);
|
| 119 |
+
--spacing: 4px;
|
| 120 |
+
--size: 64px;
|
| 121 |
+
--radius: 1.5rem;
|
| 122 |
+
--accent: #5380f7;
|
| 123 |
+
--text-sm: 0.875rem;
|
| 124 |
+
--main-bg: #fff;
|
| 125 |
+
--card-bg: #fff;
|
| 126 |
+
--hover-color: #eee;
|
| 127 |
+
--border-color: rgba(0, 0, 0, 0.05);
|
| 128 |
+
--grey-400: rgba(0, 0, 0, 0.04);
|
| 129 |
+
--grey-600: rgba(0, 0, 0, 0.06);
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
@media (prefers-color-scheme: dark) {
|
| 133 |
+
:root {
|
| 134 |
+
--main-bg: rgb(0, 0, 0);
|
| 135 |
+
--card-bg: rgb(31, 34, 38);
|
| 136 |
+
--text-main: #d9d9d9;
|
| 137 |
+
--text-grey: #6e767d;
|
| 138 |
+
--accent: #1d9bf0;
|
| 139 |
+
--hover-color: rgba(255, 255, 255, 0.07);
|
| 140 |
+
--border-color: #4b4648;
|
| 141 |
+
}
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
body {
|
| 145 |
+
font-size: 1rem;
|
| 146 |
+
line-height: 1.5;
|
| 147 |
+
word-wrap: break-word;
|
| 148 |
+
font-kerning: normal;
|
| 149 |
+
font-family: 'Gotham SSm A', 'Gotham SSm B', 'Arial Unicode MS', Helvetica, sans-serif;
|
| 150 |
+
margin: 0;
|
| 151 |
+
padding: 0;
|
| 152 |
+
-webkit-font-smoothing: antialiased;
|
| 153 |
+
background-color: var(--main-bg);
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
* ul, * ol {
|
| 157 |
+
list-style: none;
|
| 158 |
+
padding: 0;
|
| 159 |
+
margin: 0;
|
| 160 |
+
}
|
| 161 |
+
|
| 162 |
+
*[role='button'], button {
|
| 163 |
+
cursor: pointer;
|
| 164 |
+
}
|
| 165 |
+
|
| 166 |
+
.color-primary {
|
| 167 |
+
color: var(--text-main);
|
| 168 |
+
}
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
.mt-0 {
|
| 172 |
+
margin-top: 0;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
|
| 176 |
+
.radius-1 {
|
| 177 |
+
border-radius: var(--radius);
|
| 178 |
+
}
|
| 179 |
+
|
| 180 |
+
.px-6 {
|
| 181 |
+
padding-left: calc(var(--spacing) * 6);
|
| 182 |
+
padding-right: calc(var(--spacing) * 6);
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
.py-6 {
|
| 186 |
+
padding-left: calc(var(--spacing)* 6);
|
| 187 |
+
padding-right: calc(var(--spacing)* 6);
|
| 188 |
+
}
|
| 189 |
+
|
| 190 |
+
.py-10 {
|
| 191 |
+
padding-top: calc(var(--spacing) * 10);
|
| 192 |
+
padding-bottom: calc(var(--spacing) * 10);
|
| 193 |
+
}
|
| 194 |
+
|
| 195 |
+
.pd-6 {
|
| 196 |
+
padding: calc(var(--spacing) * 6);
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
|
| 200 |
+
.pt-1 {
|
| 201 |
+
padding-top: var(--spacing);
|
| 202 |
+
}
|
| 203 |
+
|
| 204 |
+
.pb-0 {
|
| 205 |
+
padding-bottom: 0;
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
.overflow-hidden {
|
| 209 |
+
overflow: hidden;
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
.flex {
|
| 213 |
+
display: flex;
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
.justify-between {
|
| 217 |
+
justify-content: space-between;
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
.justify-center {
|
| 221 |
+
justify-content: center;
|
| 222 |
+
}
|
| 223 |
+
|
| 224 |
+
|
| 225 |
+
.items-center {
|
| 226 |
+
align-items: center;
|
| 227 |
+
}
|
| 228 |
+
|
| 229 |
+
.shrink-0 {
|
| 230 |
+
flex-shrink: 0;
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
.text-grey {
|
| 234 |
+
color: var(--text-grey);
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
.text-sm {
|
| 238 |
+
font-size: 0.875rem;
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
.bg-card {
|
| 242 |
+
background-color: var(--card-bg);
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
.truncate {
|
| 246 |
+
/* display: -webkit-box; */
|
| 247 |
+
/* -webkit-box-orient: vertical; */
|
| 248 |
+
/* -webkit-line-clamp: var(--line, 3); */
|
| 249 |
+
/* overflow: hidden; */
|
| 250 |
+
}
|
| 251 |
+
|
| 252 |
+
.truncate-1 {
|
| 253 |
+
--line: 1;
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
.overflow-ellipsis {
|
| 257 |
+
text-overflow: ellipsis;
|
| 258 |
+
}
|
| 259 |
+
|
| 260 |
+
.z-grid {
|
| 261 |
+
display: grid;
|
| 262 |
+
grid-gap: var(--gutter, 1rem);
|
| 263 |
+
grid-template-columns: repeat(auto-fill, minmax(min(var(--space, 10rem), 100%), 1fr));
|
| 264 |
+
}
|
| 265 |
+
|
| 266 |
+
|
| 267 |
+
.card {
|
| 268 |
+
box-shadow: rgb(0 0 0 / 30%) 0 8px 40px -12px;
|
| 269 |
+
border-radius: 1.5rem;
|
| 270 |
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) 0ms;
|
| 271 |
+
width: 90%;
|
| 272 |
+
position: relative;
|
| 273 |
+
overflow: visible;
|
| 274 |
+
background-color: var(--card-bg);
|
| 275 |
+
margin: 0 auto;
|
| 276 |
+
}
|
| 277 |
+
|
| 278 |
+
.card:hover {
|
| 279 |
+
transform: translateY(-2px);
|
| 280 |
+
}
|
| 281 |
+
|
| 282 |
+
.card:hover .mask {
|
| 283 |
+
bottom: -1.5rem;
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
.card:hover .mask-c-1 {
|
| 287 |
+
bottom: -2.5rem;
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
.container {
|
| 291 |
+
padding-top: calc(var(--spacing) * 10);
|
| 292 |
+
}
|
| 293 |
+
|
| 294 |
+
.container p {
|
| 295 |
+
position: relative;
|
| 296 |
+
cursor: pointer;
|
| 297 |
+
transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
|
| 298 |
+
}
|
| 299 |
+
|
| 300 |
+
.container p::after {
|
| 301 |
+
content: attr(data-content);
|
| 302 |
+
position: absolute;
|
| 303 |
+
transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
|
| 304 |
+
color: transparent;
|
| 305 |
+
top: 0;
|
| 306 |
+
left: 0;
|
| 307 |
+
width: 100%;
|
| 308 |
+
height: 100%;
|
| 309 |
+
display: flex;
|
| 310 |
+
align-items: center;
|
| 311 |
+
justify-content: center;
|
| 312 |
+
border-radius: var(--radius);
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
.container p:hover {
|
| 316 |
+
color: transparent;
|
| 317 |
+
}
|
| 318 |
+
|
| 319 |
+
.container p:hover::after {
|
| 320 |
+
color: var(--text-main);
|
| 321 |
+
background-color: var(--hover-color);
|
| 322 |
+
}
|
| 323 |
+
|
| 324 |
+
.toggle li {
|
| 325 |
+
z-index: 99;
|
| 326 |
+
position: relative;
|
| 327 |
+
background: transparent;
|
| 328 |
+
padding: 0 20px;
|
| 329 |
+
color: var(--text-main);
|
| 330 |
+
transition: background-color 250ms ease-out;
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
.toggle li:hover {
|
| 334 |
+
background-color: var(--hover-color);
|
| 335 |
+
}
|
| 336 |
+
|
| 337 |
+
.toggle li.active a {
|
| 338 |
+
color: var(--accent);
|
| 339 |
+
}
|
| 340 |
+
|
| 341 |
+
.toggle li:first-child {
|
| 342 |
+
border-top-left-radius: var(--text-sm);
|
| 343 |
+
border-top-right-radius: var(--text-sm);
|
| 344 |
+
}
|
| 345 |
+
|
| 346 |
+
.toggle li:last-child {
|
| 347 |
+
border-bottom-left-radius: var(--text-sm);
|
| 348 |
+
border-bottom-right-radius: var(--text-sm);
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
.toggle li:last-child a {
|
| 352 |
+
border-bottom: 0;
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
.toggle li a {
|
| 356 |
+
display: block;
|
| 357 |
+
border-bottom: 1px solid var(--border-color);
|
| 358 |
+
padding: 16px 0;
|
| 359 |
+
color: inherit;
|
| 360 |
+
text-decoration: none;
|
| 361 |
+
white-space: nowrap;
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
.icon {
|
| 365 |
+
background-image: url('../images/icons.svg?t=4567');
|
| 366 |
+
background-size: 64px;
|
| 367 |
+
background-position-x: 0;
|
| 368 |
+
}
|
| 369 |
+
|
| 370 |
+
.icon-al {
|
| 371 |
+
background-position-y: -1728px;
|
| 372 |
+
}
|
| 373 |
+
|
| 374 |
+
.icon-ii {
|
| 375 |
+
background-position-y: -448px;
|
| 376 |
+
}
|
| 377 |
+
|
| 378 |
+
.icon-ps {
|
| 379 |
+
background-position-y: -512px;
|
| 380 |
+
}
|
| 381 |
+
|
| 382 |
+
.icon-ac {
|
| 383 |
+
background-position-y: -192px;
|
| 384 |
+
}
|
| 385 |
+
|
| 386 |
+
.icon-db {
|
| 387 |
+
background-position-y: -320px;
|
| 388 |
+
}
|
| 389 |
+
|
| 390 |
+
.icon-rm {
|
| 391 |
+
background-position-y: -896px;
|
| 392 |
+
}
|
| 393 |
+
|
| 394 |
+
.icon-ws {
|
| 395 |
+
background-position-y: -960px;
|
| 396 |
+
}
|
| 397 |
+
|
| 398 |
+
.icon-rd {
|
| 399 |
+
background-position-y: -832px;
|
| 400 |
+
}
|
| 401 |
+
|
| 402 |
+
.icon-cl {
|
| 403 |
+
background-position-y: -256px;
|
| 404 |
+
}
|
| 405 |
+
|
| 406 |
+
.icon-pc {
|
| 407 |
+
background-position-y: -576px;
|
| 408 |
+
}
|
| 409 |
+
|
| 410 |
+
.icon-go {
|
| 411 |
+
background-position-y: -384px;
|
| 412 |
+
}
|
| 413 |
+
|
| 414 |
+
.icon-ds {
|
| 415 |
+
background-position-y: -1792px;
|
| 416 |
+
}
|
| 417 |
+
|
| 418 |
+
.icon-dc {
|
| 419 |
+
background-position-y: -1408px;
|
| 420 |
+
}
|
| 421 |
+
|
| 422 |
+
.icon-dpn {
|
| 423 |
+
background-position-y: -1536px;
|
| 424 |
+
}
|
| 425 |
+
|
| 426 |
+
.icon-dm {
|
| 427 |
+
background-position-y: -1472px;
|
| 428 |
+
}
|
| 429 |
+
|
| 430 |
+
.mask {
|
| 431 |
+
transition: 0.2s;
|
| 432 |
+
position: absolute;
|
| 433 |
+
z-index: -1;
|
| 434 |
+
width: 88%;
|
| 435 |
+
height: 100%;
|
| 436 |
+
bottom: 0;
|
| 437 |
+
border-radius: 1.5rem;
|
| 438 |
+
background-color: var(--grey-600);
|
| 439 |
+
left: 50%;
|
| 440 |
+
transform: translateX(-50%);
|
| 441 |
+
}
|
| 442 |
+
|
| 443 |
+
.mask-c-1 {
|
| 444 |
+
bottom: 0;
|
| 445 |
+
width: 72%;
|
| 446 |
+
background-color: var(--grey-400);
|
| 447 |
+
}
|
| 448 |
+
|
| 449 |
+
.avatar-wrapper {
|
| 450 |
+
position: relative;
|
| 451 |
+
width: var(--size);
|
| 452 |
+
height: var(--size);
|
| 453 |
+
font-size: 1.25rem;
|
| 454 |
+
user-select: none;
|
| 455 |
+
transform: translateY(50%);
|
| 456 |
+
}
|
| 457 |
+
|
| 458 |
+
.avatar-wrapper img, .avatar-wrapper .icon {
|
| 459 |
+
width: 100%;
|
| 460 |
+
height: 100%;
|
| 461 |
+
margin: 0;
|
| 462 |
+
background-color: var(--card-bg);
|
| 463 |
+
color: transparent;
|
| 464 |
+
object-fit: cover;
|
| 465 |
+
text-align: center;
|
| 466 |
+
text-indent: 10000px;
|
| 467 |
+
}
|
| 468 |
+
|
| 469 |
+
|
| 470 |
+
header.tip a {
|
| 471 |
+
color: var(--accent);
|
| 472 |
+
text-decoration: none;
|
| 473 |
+
}
|
| 474 |
+
|
| 475 |
+
header.tip p {
|
| 476 |
+
word-break: break-word;
|
| 477 |
+
word-wrap: break-word;
|
| 478 |
+
}
|
| 479 |
+
|
| 480 |
+
|
| 481 |
+
main hr {
|
| 482 |
+
margin: 0;
|
| 483 |
+
padding: 0;
|
| 484 |
+
background: var(--border-color);
|
| 485 |
+
height: 1px;
|
| 486 |
+
border: none;
|
| 487 |
+
}
|
| 488 |
+
|
| 489 |
+
footer {
|
| 490 |
+
--_size: 40px;
|
| 491 |
+
padding-top: var(--_size);
|
| 492 |
+
width: 96%;
|
| 493 |
+
margin: calc(var(--spacing) * 10) auto 0;
|
| 494 |
+
padding-bottom: var(--_size);
|
| 495 |
+
border-top: 1px solid var(--border-color);
|
| 496 |
+
-moz-box-align: center;
|
| 497 |
+
-webkit-box-pack: justify;
|
| 498 |
+
}
|
| 499 |
+
|
| 500 |
+
footer .lt-panel p:nth-of-type(1) {
|
| 501 |
+
color: inherit;
|
| 502 |
+
}
|
| 503 |
+
header.tip {
|
| 504 |
+
top: 2.3%;
|
| 505 |
+
background-color: var(--card-bg);
|
| 506 |
+
color: var(--text-main);
|
| 507 |
+
z-index: 99;
|
| 508 |
+
width: 80%;
|
| 509 |
+
margin: 0 auto;
|
| 510 |
+
border-radius: 16px;
|
| 511 |
+
box-shadow: rgb(0 0 0 / 30%) 0 8px 40px -12px;
|
| 512 |
+
transition: transform 250ms ease, box-shadow 250ms ease;
|
| 513 |
+
}
|
| 514 |
+
.sticky {
|
| 515 |
+
position: sticky;
|
| 516 |
+
}
|
| 517 |
+
|
| 518 |
+
|
| 519 |
+
.parent {
|
| 520 |
+
position: relative;
|
| 521 |
+
}
|
| 522 |
+
.search {
|
| 523 |
+
width: 300px;
|
| 524 |
+
height: 40px;
|
| 525 |
+
border-radius: 18px;
|
| 526 |
+
outline: none;
|
| 527 |
+
/*border: 1px solid #ccc;*/
|
| 528 |
+
padding-left: 20px;
|
| 529 |
+
/*position: absolute;*/
|
| 530 |
+
}
|
| 531 |
+
|
| 532 |
+
.modal-container {
|
| 533 |
+
display: none;
|
| 534 |
+
position: fixed;
|
| 535 |
+
top: 50%;
|
| 536 |
+
left: 50%;
|
| 537 |
+
width: 50%;
|
| 538 |
+
height: 50%;
|
| 539 |
+
transform: translate(-50%, -50%);
|
| 540 |
+
background-color: #808097;
|
| 541 |
+
padding: 20px;
|
| 542 |
+
z-index: 1001;
|
| 543 |
+
transition: transform 0.3s ease;
|
| 544 |
+
border-radius: 1.5rem;
|
| 545 |
+
overflow-y: auto;
|
| 546 |
+
}
|
| 547 |
+
|
| 548 |
+
.modal-close {
|
| 549 |
+
/* position: absolute; */
|
| 550 |
+
top: 10px;
|
| 551 |
+
height: 30px;
|
| 552 |
+
width: 60px;
|
| 553 |
+
cursor: pointer;
|
| 554 |
+
float: right;
|
| 555 |
+
border-radius: 1rem;
|
| 556 |
+
border: 2px solid #65657b
|
| 557 |
+
}
|
| 558 |
+
|
| 559 |
+
.modal-container::-webkit-scrollbar {
|
| 560 |
+
width: 12px;
|
| 561 |
+
}
|
| 562 |
+
|
| 563 |
+
.modal-container::-webkit-scrollbar-track {
|
| 564 |
+
background: #f1f1f1;
|
| 565 |
+
}
|
| 566 |
+
|
| 567 |
+
.modal-container::-webkit-scrollbar-thumb {
|
| 568 |
+
background: #888;
|
| 569 |
+
border-radius: 6px;
|
| 570 |
+
}
|
| 571 |
+
|
| 572 |
+
.modal-container::-webkit-scrollbar-thumb:hover {
|
| 573 |
+
background: #555;
|
| 574 |
+
}
|
src/main/resources/static/images/icons.svg
ADDED
|
|
src/main/resources/static/js/index.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
$(document).ready(function () {
|
| 2 |
+
// Set default headers for AJAX requests
|
| 3 |
+
$.ajaxSetup({
|
| 4 |
+
headers: {
|
| 5 |
+
'Content-Type': 'application/json'
|
| 6 |
+
}
|
| 7 |
+
});
|
| 8 |
+
|
| 9 |
+
const basePath = location.pathname.substring(0, location.pathname.lastIndexOf('/'));
|
| 10 |
+
|
| 11 |
+
// Function to handle submission of license information
|
| 12 |
+
window.submitLicenseInfo = function () {
|
| 13 |
+
let licenseInfo = {
|
| 14 |
+
licenseeName: $('#licenseeName').val(),
|
| 15 |
+
assigneeName: $('#assigneeName').val(),
|
| 16 |
+
expiryDate: $('#expiryDate').val()
|
| 17 |
+
};
|
| 18 |
+
localStorage.setItem('licenseInfo', JSON.stringify(licenseInfo));
|
| 19 |
+
$('#mask, #form').hide();
|
| 20 |
+
};
|
| 21 |
+
|
| 22 |
+
// Function to handle search input
|
| 23 |
+
$('#search').on('input', function (e) {
|
| 24 |
+
$("#product-list").load(basePath + '/search?search=' + e.target.value);
|
| 25 |
+
});
|
| 26 |
+
|
| 27 |
+
// Function to show license form
|
| 28 |
+
window.showLicenseForm = function () {
|
| 29 |
+
let licenseInfo = JSON.parse(localStorage.getItem('licenseInfo'));
|
| 30 |
+
$('#licenseeName').val(licenseInfo?.licenseeName || 'Mr.Kong');
|
| 31 |
+
$('#assigneeName').val(licenseInfo?.assigneeName || 'Focusprogram');
|
| 32 |
+
$('#expiryDate').val(licenseInfo?.expiryDate || '2100-01-01');
|
| 33 |
+
$('#mask, #form').show();
|
| 34 |
+
};
|
| 35 |
+
|
| 36 |
+
// Function to show VM options
|
| 37 |
+
window.showVmoptins = function () {
|
| 38 |
+
alert("-javaagent:/(Your Path)/ja-netfilter/ja-netfilter.jar\n" +
|
| 39 |
+
"--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED\n" +
|
| 40 |
+
"--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED");
|
| 41 |
+
};
|
| 42 |
+
|
| 43 |
+
// Function to copy license
|
| 44 |
+
window.copyLicense = async function (e) {
|
| 45 |
+
while (localStorage.getItem('licenseInfo') === null) {
|
| 46 |
+
$('#mask, #form').show();
|
| 47 |
+
await new Promise(r => setTimeout(r, 1000));
|
| 48 |
+
}
|
| 49 |
+
let licenseInfo = JSON.parse(localStorage.getItem('licenseInfo'));
|
| 50 |
+
let productCode = $(e).closest('.card').data('productCodes');
|
| 51 |
+
let data = {
|
| 52 |
+
"licenseName": licenseInfo.licenseeName,
|
| 53 |
+
"assigneeName": licenseInfo.assigneeName,
|
| 54 |
+
"expiryDate": licenseInfo.expiryDate,
|
| 55 |
+
"productCode": productCode,
|
| 56 |
+
};
|
| 57 |
+
$.post(basePath + '/generateLicense', JSON.stringify(data))
|
| 58 |
+
.then(response => {
|
| 59 |
+
copyText(response)
|
| 60 |
+
});
|
| 61 |
+
};
|
| 62 |
+
|
| 63 |
+
// Function to copy text to clipboard
|
| 64 |
+
const copyText = async (val) => {
|
| 65 |
+
if (navigator.clipboard && navigator.permissions) {
|
| 66 |
+
await navigator.clipboard.writeText(val);
|
| 67 |
+
alert("The activation code has been copied");
|
| 68 |
+
} else {
|
| 69 |
+
document.querySelector('.modal-container').style.display = 'block';
|
| 70 |
+
var modalContent = document.getElementById('modal-content');
|
| 71 |
+
modalContent.innerHTML = "<h1 style='text-align: center;'>Active Code</h1><p>" + val + "</p>";
|
| 72 |
+
}
|
| 73 |
+
};
|
| 74 |
+
|
| 75 |
+
window.closeModal = function () {
|
| 76 |
+
document.querySelector('.modal-container').style.display = 'none';
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
});
|
src/main/resources/static/js/jquery.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
|
| 2 |
+
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+zt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray("script",v.dataTypes)&&ce.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce});
|
src/main/resources/templates/index.html
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
| 3 |
+
|
| 4 |
+
<head>
|
| 5 |
+
<meta charset="UTF-8" />
|
| 6 |
+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
| 7 |
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
| 8 |
+
<title>Jetbrains-Help</title>
|
| 9 |
+
<link rel="stylesheet" type="text/css" th:href="@{/css/index.css}">
|
| 10 |
+
<link rel="icon" href="https://www.jetbrains.com/favicon.ico?r=1234">
|
| 11 |
+
</head>
|
| 12 |
+
|
| 13 |
+
<body>
|
| 14 |
+
<header class="tip sticky flex items-center py-6">
|
| 15 |
+
<p>
|
| 16 |
+
🇨🇳 Download <a href="ja-netfilter" title="Download jetbra first">ja-netfilter.zip</a> , and configure
|
| 17 |
+
your JetBrains's <strong onclick="showVmoptins()">vmoptions!</strong> <br>
|
| 18 |
+
🇨🇳 Also you can <a onclick="showLicenseForm()">Refill license information</a> to customizer your
|
| 19 |
+
license!</br>
|
| 20 |
+
<strong>🇨🇳 Please note that this page is only developed and used by <span
|
| 21 |
+
th:text="${defaults.getDefaultLicenseName()} + '/' + ${defaults.getDefaultAssigneeName()}"></span>
|
| 22 |
+
personally!</strong>
|
| 23 |
+
</p>
|
| 24 |
+
<form class="parent">
|
| 25 |
+
<input type="text" class="search" id="search" placeholder="Search Product or Plugin">
|
| 26 |
+
</form>
|
| 27 |
+
</header>
|
| 28 |
+
<div class="modal-container">
|
| 29 |
+
<button class="modal-close" onclick="closeModal()">Close</button></br>
|
| 30 |
+
<div id="modal-content">
|
| 31 |
+
</div>
|
| 32 |
+
</div>
|
| 33 |
+
<main id="product-list" class="px-6 z-grid py-10" style="--space: 20rem; --gutter: 3.5rem">
|
| 34 |
+
<th:block th:fragment="product-list">
|
| 35 |
+
<th:block th:each="product:${products}">
|
| 36 |
+
<article class="card" th:data-product="${product.getName()}"
|
| 37 |
+
th:data-product-codes="${product.getProductCode()}">
|
| 38 |
+
<header>
|
| 39 |
+
<div class="flex items-center justify-between px-6 pt-1 pb-0 bg-card radius-1">
|
| 40 |
+
<div class="avatar-wrapper flex items-center justify-center overflow-hidden shrink-0">
|
| 41 |
+
<div class="icon" th:classappend="${product.getIconClass()}" role="img"></div>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
<hr />
|
| 45 |
+
</header>
|
| 46 |
+
<div class="pd-6 overflow-hidden bg-card container radius-1">
|
| 47 |
+
<h1 class="truncate truncate-1 color-primary mt-0 overflow-ellipsis"
|
| 48 |
+
th:title="${product.getName()}" th:text="${product.getName()}"></h1>
|
| 49 |
+
<p title="Copy to clipboard" class="truncate text-sm text-grey" onclick="copyLicense(this)"
|
| 50 |
+
data-content="Copy to clipboard">
|
| 51 |
+
**********
|
| 52 |
+
</p>
|
| 53 |
+
</div>
|
| 54 |
+
<div class="mask"></div>
|
| 55 |
+
<div class="mask mask-c-1"></div>
|
| 56 |
+
</article>
|
| 57 |
+
</th:block>
|
| 58 |
+
<th:block th:each="plugin:${plugins}">
|
| 59 |
+
<article class="card" th:data-product="${plugin.getName()}"
|
| 60 |
+
th:data-product-codes="${plugin.getProductCode()}">
|
| 61 |
+
<header>
|
| 62 |
+
<div class="flex items-center justify-between px-6 pt-1 pb-0 bg-card radius-1">
|
| 63 |
+
<div class="avatar-wrapper flex items-center justify-center overflow-hidden shrink-0">
|
| 64 |
+
<div class="icon" role="img"
|
| 65 |
+
th:style="'background-image: url(' + ${plugin.getIcon()} + ')'"></div>
|
| 66 |
+
</div>
|
| 67 |
+
</div>
|
| 68 |
+
<hr />
|
| 69 |
+
</header>
|
| 70 |
+
<div class="pd-6 overflow-hidden bg-card container radius-1">
|
| 71 |
+
<h1 class="truncate truncate-1 color-primary mt-0 overflow-ellipsis"
|
| 72 |
+
th:title="${plugin.getName()}" th:text="${plugin.getName()}"></h1>
|
| 73 |
+
<p title="Copy to clipboard" class="truncate text-sm text-grey" onclick="copyLicense(this)"
|
| 74 |
+
data-content="Copy to clipboard">
|
| 75 |
+
**********
|
| 76 |
+
</p>
|
| 77 |
+
</div>
|
| 78 |
+
<div class="mask"></div>
|
| 79 |
+
<div class="mask mask-c-1"></div>
|
| 80 |
+
</article>
|
| 81 |
+
</th:block>
|
| 82 |
+
</th:block>
|
| 83 |
+
</main>
|
| 84 |
+
<div id="mask"
|
| 85 |
+
style="position:fixed;top:0;left:0;z-index:998;width:100%;height:100%;display:none;background-color:#000;opacity:0.5;overflow:hidden;">
|
| 86 |
+
</div>
|
| 87 |
+
<div id="form" style="position:fixed;top:20%;left:40%;width:40%;height:500px;z-index:999;display:none;">
|
| 88 |
+
<div class="form">
|
| 89 |
+
<div class="title">License Form</div>
|
| 90 |
+
<div class="subtitle">Customization is welcome</div>
|
| 91 |
+
<div class="input-container ic1">
|
| 92 |
+
<input id="licenseeName" class="input" type="text" placeholder=" "
|
| 93 |
+
th:value="${defaults.getDefaultLicenseName()}" />
|
| 94 |
+
<div class="cut"></div>
|
| 95 |
+
<label for="licenseeName" class="placeholder">License Name</label>
|
| 96 |
+
</div>
|
| 97 |
+
<div class="input-container ic2">
|
| 98 |
+
<input id="assigneeName" class="input" type="text" placeholder=" "
|
| 99 |
+
th:value="${defaults.getDefaultAssigneeName()}" />
|
| 100 |
+
<div class="cut"></div>
|
| 101 |
+
<label for="assigneeName" class="placeholder">Assigne Name</label>
|
| 102 |
+
</div>
|
| 103 |
+
<div class="input-container ic2">
|
| 104 |
+
<input id="expiryDate" class="input" type="text" placeholder=""
|
| 105 |
+
th:value="${defaults.getDefaultExpiryDate()}" />
|
| 106 |
+
<div class="cut cut-short"></div>
|
| 107 |
+
<label for="expiryDate" class="placeholder">Expiry Date</label>
|
| 108 |
+
</div>
|
| 109 |
+
<button class="submit" onclick="submitLicenseInfo(this)">Confirm</button>
|
| 110 |
+
</div>
|
| 111 |
+
</div>
|
| 112 |
+
</body>
|
| 113 |
+
<script type="text/javascript" th:src="@{/js/jquery.js}"></script>
|
| 114 |
+
<script type="text/javascript" th:src="@{/js/index.js}"></script>
|
| 115 |
+
|
| 116 |
+
</html>
|