master
wangbing 5 years ago
parent 808dc18885
commit cd06fce8a0

@ -464,6 +464,8 @@ public class SpringBootCallable implements Callable {
File base = new File(root.getAbsolutePath(), "base"); File base = new File(root.getAbsolutePath(), "base");
base.mkdirs(); base.mkdirs();
File auth = new File(root.getAbsolutePath(), "auth");
auth.mkdirs();
File freemarker = new File(root.getAbsolutePath(), "freemarker"); File freemarker = new File(root.getAbsolutePath(), "freemarker");
freemarker.mkdirs(); freemarker.mkdirs();
File utils = new File(root.getAbsolutePath(), "utils"); File utils = new File(root.getAbsolutePath(), "utils");
@ -471,6 +473,10 @@ public class SpringBootCallable implements Callable {
File validation = new File(root.getAbsolutePath(), "validation"); File validation = new File(root.getAbsolutePath(), "validation");
validation.mkdirs(); validation.mkdirs();
//auth
freeMarkerManager.outputTemp(new File(auth.getAbsolutePath(), "LocalData.java"), option + "/java/frame/auth/LocalData.java", ctx);
freeMarkerManager.outputTemp(new File(auth.getAbsolutePath(), "Verification.java"), option + "/java/frame/auth/Verification.java", ctx);
//base //base
freeMarkerManager.outputTemp(new File(base.getAbsolutePath(), "BaseEntity.java"), option + "/java/frame/base/BaseEntity.java", ctx); freeMarkerManager.outputTemp(new File(base.getAbsolutePath(), "BaseEntity.java"), option + "/java/frame/base/BaseEntity.java", ctx);
freeMarkerManager.outputTemp(new File(base.getAbsolutePath(), "BaseFindRequest.java"), option + "/java/frame/base/BaseFindRequest.java", ctx); freeMarkerManager.outputTemp(new File(base.getAbsolutePath(), "BaseFindRequest.java"), option + "/java/frame/base/BaseFindRequest.java", ctx);
@ -504,7 +510,6 @@ public class SpringBootCallable implements Callable {
freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "RSAUtil.java"), option + "/java/frame/utils/RSAUtil.java", ctx); freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "RSAUtil.java"), option + "/java/frame/utils/RSAUtil.java", ctx);
freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "ValidationUtil.java"), option + "/java/frame/utils/ValidationUtil.java", ctx); freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "ValidationUtil.java"), option + "/java/frame/utils/ValidationUtil.java", ctx);
freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "WebUtils.java"), option + "/java/frame/utils/WebUtils.java", ctx); freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "WebUtils.java"), option + "/java/frame/utils/WebUtils.java", ctx);
freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "LocalData.java"), option + "/java/frame/utils/LocalData.java", ctx);
freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "IDgenerator.java"), option + "/java/frame/utils/IDgenerator.java", ctx); freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "IDgenerator.java"), option + "/java/frame/utils/IDgenerator.java", ctx);
freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "Message.java"), option + "/java/frame/utils/Message.java", ctx); freeMarkerManager.outputTemp(new File(utils.getAbsolutePath(), "Message.java"), option + "/java/frame/utils/Message.java", ctx);

@ -13,7 +13,7 @@ import java.io.InputStreamReader;
import ${basePackage}.module.${m.moduleName}.req.*; import ${basePackage}.module.${m.moduleName}.req.*;
import ${basePackage}.module.${m.moduleName}.mgr.*; import ${basePackage}.module.${m.moduleName}.mgr.*;
</#list> </#list>
import ${basePackage}.frame.utils.LocalData; import ${basePackage}.frame.auth.LocalData;
import ${basePackage}.frame.utils.MapperUtil; import ${basePackage}.frame.utils.MapperUtil;
import ${basePackage}.frame.utils.Message; import ${basePackage}.frame.utils.Message;
import ${basePackage}.frame.base.BaseResponse; import ${basePackage}.frame.base.BaseResponse;

@ -13,7 +13,7 @@ import java.io.InputStreamReader;
import ${basePackage}.module.${m.moduleName}.req.*; import ${basePackage}.module.${m.moduleName}.req.*;
import ${basePackage}.module.${m.moduleName}.mgr.*; import ${basePackage}.module.${m.moduleName}.mgr.*;
</#list> </#list>
import ${basePackage}.frame.utils.LocalData; import ${basePackage}.frame.auth.LocalData;
import ${basePackage}.frame.utils.MapperUtil; import ${basePackage}.frame.utils.MapperUtil;
import ${basePackage}.frame.utils.Message; import ${basePackage}.frame.utils.Message;
import ${basePackage}.frame.base.BaseResponse; import ${basePackage}.frame.base.BaseResponse;

@ -4,7 +4,7 @@ import ${basePackage}.frame.base.FileUploadResponse;
import ${basePackage}.frame.base.BaseResponse; import ${basePackage}.frame.base.BaseResponse;
import ${basePackage}.frame.base.ErrorType; import ${basePackage}.frame.base.ErrorType;
import ${basePackage}.frame.base.Screen; import ${basePackage}.frame.base.Screen;
import ${basePackage}.frame.utils.LocalData; import ${basePackage}.frame.auth.LocalData;
import ${basePackage}.config.ActionConfig; import ${basePackage}.config.ActionConfig;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;

@ -9,9 +9,9 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import xyz.wbsite.frame.base.Token; import ${basePackage}.frame.base.Token;
import xyz.wbsite.frame.utils.CookieUtil; import ${basePackage}.frame.utils.CookieUtil;
import xyz.wbsite.frame.auth.LocalData; import ${basePackage}.frame.auth.LocalData;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@Configuration @Configuration
@ -20,6 +20,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${r"${web.url.auth.excluded}"}") @Value("${r"${web.url.auth.excluded}"}")
private String[] excluded; private String[] excluded;
@Value("${r"${spring.mvc.static-path-pattern}"}")
private String[] staticPath;
@Override @Override
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {

@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import ${basePackage}.frame.base.Token; import ${basePackage}.frame.base.Token;
import ${basePackage}.frame.utils.LocalData; import ${basePackage}.frame.auth.LocalData;
import ${basePackage}.frame.utils.LogUtil; import ${basePackage}.frame.utils.LogUtil;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;

@ -0,0 +1,84 @@
package ${basePackage}.frame.auth;
import ${basePackage}.frame.base.Token;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* LocalData -
*
* @author wangbing
* @version 0.0.1
* @since 2017-01-01
*/
public class LocalData {
private static Token temp = null;
private static Token system = null;
static {
// 组装临时Token和系统Token
temp = new Token();
temp.setId(-1);
temp.setUserId(-1);
temp.setUserName("游客");
temp.putResource("ajax.system.admin.login");
system = new Token();
system.setId(0);
system.setUserId(0);
system.setUserName("system");
system.putResource(".*");
}
public static Token getTempToken() {
return temp;
}
public static Token getSysToken() {
return system;
}
/**
* target = '/aa/bb'
*/
private static final ThreadLocal<String> targetHolder = new ThreadLocal();
public static String getTarget() {
return targetHolder.get();
}
public static void setTarget(String target) {
targetHolder.set(target);
}
/**
*
*/
private static final ThreadLocal<Token> tokenHolder = new ThreadLocal();
public static Token getToken() {
return tokenHolder.get();
}
public static void setToken(Token token) {
tokenHolder.set(token);
}
public static HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
public static HttpServletResponse getResponse() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
}
public static ApplicationContext getApplicationContext() {
return WebApplicationContextUtils.getWebApplicationContext(getRequest().getServletContext());
}
}

@ -0,0 +1,17 @@
package ${basePackage}.frame.auth;
import ${basePackage}.frame.validation.DictValidator;
import javax.validation.Constraint;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DictValidator.class)
public @interface Verification {
String name() default "";
}

@ -17,7 +17,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Locale; import java.util.Locale;
import ${basePackage}.frame.base.Control; import ${basePackage}.frame.base.Control;
import ${basePackage}.frame.utils.LocalData; import ${basePackage}.frame.auth.LocalData;
/** /**
* *

@ -1,6 +1,6 @@
package ${basePackage}.frame.freemarker; package ${basePackage}.frame.freemarker;
import ${basePackage}.frame.utils.LocalData; import ${basePackage}.frame.auth.LocalData;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.DispatcherServlet;

@ -1,210 +1,85 @@
<!DOCTYPE html>
<html>
<head> <head>
<meta charset="UTF-8" http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style> <title>404-对不起!您访问的页面不存在</title>
<style type="text/css">
body { body {
margin: 0px; background-color: #dfdfdf;
padding: 0px;
background-color: #f2f2f2;
} }
.box { .box {
border: 10px solid #0000002b;
margin: 100px auto;
padding: 50px;
width: 700px; width: 700px;
margin: 50px auto; background-color: #ffffff;
display: table; display: table;
} }
.container { .box div {
vertical-align: top;
display: table-cell; display: table-cell;
vertical-align: middle;
}
.code {
font-weight: 500;
top: 100px;
left: 400px;
text-align: center;
width: 300px;
margin-top: 30px;
margin-bottom: 10px;
font-family: 'Varela Round', sans-serif;
font-size: 60px;
color: #6bbee0;
letter-spacing: 3px;
text-shadow: 0 0 5px #78d0ec;
animation: flux 2s linear infinite;
}
.message {
font-family: 'Poppins', sans-serif;
font-size: 20px;
color: #505050;
font-weight: 500;
}
.message2 {
font-family: 'Poppins', sans-serif;
font-size: 15px;
color: #505050;
font-weight: 300;
width: 360px;
white-space: nowrap;
} }
.door-frame { .box div.img {
height: 340px; width: 200px;
width: 220px;
border-radius: 90px 90px 0 0;
background-color: #8594A5;
display: flex;
justify-content: center;
align-items: center;
} }
.door { .box div.info {
height: 280px; width: 500px;
width: 170px; padding-left: 50px;
border-radius: 70px 70px 0 0; padding-top: 20px;
background-color: #A0AEC0;
} }
.eye { .box div.info {
top: 15px; font-size: 14px;
left: 25px;
height: 5px;
width: 15px;
border-radius: 50%;
background-color: white;
animation: eye 7s ease-in-out infinite;
position: absolute;
} }
.eye2 { .box div.info a {
left: 65px; margin-top: 50px;
}
.window {
height: 40px;
width: 130px;
background-color: #1C2127;
border-radius: 3px;
margin: 80px auto;
position: relative;
}
.leaf {
height: 40px;
width: 130px;
background-color: #8594A5;
border-radius: 3px;
margin: 80px auto;
animation: leaf 7s infinite;
transform-origin: right;
}
.handle {
height: 8px;
width: 30px;
border-radius: 4px;
background-color: #EBF3FC;
position: absolute;
margin-top: 195px;
margin-left: 30px;
}
.rectangle {
height: 60px;
width: 20px;
background-color: #CBD8E6;
border-radius: 4px;
position: absolute;
margin-top: 160px;
margin-left: 20px;
}
.message3 {
margin-top: 20px;
font-size: 12px;
}
a.login {
font-size: 15px;
text-decoration: none; text-decoration: none;
color: rgba(0, 130, 192, 0.69); background: #f2f2f2;
cursor: pointer;
border: 3px solid #0000002b;
padding: 5px;
} }
a.login:hover { .box div.info a:hover {
color: #0074c0; background: #e6e6e6;
border: 3px solid #0000002b
} }
@keyframes leaf { </style>
0% { </head>
transform: scaleX(1);
}
5% {
transform: scaleX(0.2);
}
70% {
transform: scaleX(0.2);
}
75% {
transform: scaleX(1);
}
100% {
transform: scaleX(1);
}
}
@keyframes eye { <body>
0% { <div class="box">
opacity: 0; <div class="img">
transform: translateX(0) <svg t="1571239589656" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
} p-id="3448" width="200" height="200">
5% { <path d="M512 928C282.25 928 96 741.75 96 512S282.25 96 512 96s416 186.25 416 416-186.25 416-416 416zM288 448c-17.673 0-32 14.327-32 32v96h480c17.673 0 32-14.327 32-32v-96H288z"
opacity: 0; p-id="3449"></path>
} </svg>
15% { </div>
opacity: 1;
transform: translateX(0)
}
20% {
transform: translateX(15px)
}
35% {
transform: translateX(15px)
}
40% {
transform: translateX(-15px)
}
60% {
transform: translateX(-15px)
}
65% {
transform: translateX(0)
}
}
@keyframes flux { <div class="info">
0%, <p>抱歉!您尚未登录或登录信息已失效,或尚未授权!</p>
100% {
text-shadow: 0 0 5px #00FFC6, 0 0 15px #00FFC6, 0 0 50px #00FFC6, 0 0 50px #00FFC6, 0 0 2px #B9FFE8, 2px 2px 3px #12E29C;
color: #4BFFEF;
}
50% {
text-shadow: 0 0 3px #00B58D, 0 0 7px #00B58D, 0 0 25px #00B58D, 0 0 25px #00B58D, 0 0 2px #00B58D, 2px 2px 3px #006A60;
color: #63D3AE;
}
}
<br>
</style> <a onclick="history.back()">返回上页</a> <a id="login" href="${Uri.getUrl("/login.htm")}">登录</a>
</div>
<script> <script>
window.onload = function () { window.onload = function () {
var count = 4; var count = 3;
function go() { function go() {
if (count > 0) { if (count > 0) {
var e = document.getElementById("timer"); var e = document.getElementById("login");
e.innerHTML = count + " 秒后自动跳转登录页" e.innerHTML = "登录(" + count + " 秒后自动跳转)"
count--; count--;
} else { } else {
location.href = '${Uri.getUrl("/login.htm")}'; location.href = '${Uri.getUrl("/login.htm")}';
@ -214,6 +89,14 @@
setInterval(go, 1000); setInterval(go, 1000);
}; };
</script> </script>
</div>
</body>
</html>
<head>
</head> </head>
<body> <body>
<div class="box"> <div class="box">
@ -247,3 +130,5 @@
</div> </div>
</body> </body>

@ -1,40 +1,80 @@
<!DOCTYPE html>
<html>
<head> <head>
<style> <meta charset="UTF-8" http-equiv="Content-Type" content="text/html; charset=utf-8"/>
html,body{
overflow: hidden; <title>500-服务器走了下神!</title>
}
.box{ <style type="text/css">
width: 100%; body {
height: 100%; background-color: #dfdfdf;
overflow: scroll; }
}
.box a{ .box {
color: #c38168; border: 10px solid #0000002b;
line-height: 18px; margin: 100px auto;
text-decoration: underline; padding: 50px;
} width: 700px;
.box::-webkit-scrollbar {/*滚动条整体样式*/ background-color: #ffffff;
width: 10px; /*高宽分别对应横竖滚动条的尺寸*/ display: table;
height: 1px;
}
.box::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(73, 73, 73, 0.2);
background: #828282;
}
.box::-webkit-scrollbar-track {/*滚动条里面轨道*/
-webkit-box-shadow: inset 0 0 5px rgba(125, 125, 125, 0.2);
border-radius: 10px;
background: #EDEDED;
} }
.box > div {
vertical-align: top;
display: table-cell;
}
.box > div.img {
width: 200px;
}
.box > div.info {
width: 500px;
padding-left: 50px;
padding-top: 20px;
}
.box > div.info {
font-size: 14px;
}
.box > div.info a {
display: inline-block;
text-decoration: none;
background: #f2f2f2;
cursor: pointer;
border: 3px solid #0000002b;
padding: 5px;
}
.box > div.info a:hover {
background: #e6e6e6;
border: 3px solid #0000002b
}
</style> </style>
</head> </head>
<body>
<body>
<div class="box"> <div class="box">
<p> <div class="img">
${msg} <svg t="1571233328721" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
</p> p-id="4252" width="198" height="198">
</div> <path d="M969.143 548.571q0 14.848-10.862 25.71t-25.71 10.862h-128q0 97.719-38.29 165.705L885.138 870.29Q896 881.152 896 896t-10.862 25.71q-10.276 10.861-25.71 10.861t-25.71-10.861L720.568 809.143q-2.853 2.852-8.558 7.424t-23.99 16.274-37.157 20.846-46.848 16.567-55.443 7.424v-512H475.43v512q-29.148 0-58.003-7.717t-49.7-18.87-37.705-22.273-24.869-18.578l-8.558-8.01-104.557 118.273q-11.447 11.995-27.429 11.995-13.714 0-24.576-9.143-10.862-10.276-11.703-25.417t8.85-26.587L252.6 741.632q-33.134-65.134-33.134-156.562h-128q-14.848 0-25.71-10.862t-10.861-25.71 10.861-25.71 25.71-10.861h128v-168.01l-98.852-98.852q-10.862-10.862-10.862-25.71t10.862-25.71 25.71-10.861 25.709 10.862l98.853 98.852h482.304l98.852-98.852q10.862-10.862 25.71-10.862t25.71 10.862 10.861 25.71-10.861 25.71l-98.853 98.852v168.009h128q14.848 0 25.71 10.862t10.861 25.71zM694.857 219.43H329.143q0-75.996 53.43-129.427T512 36.572t129.426 53.43 53.431 129.427z"
fill="" p-id="4253"></path>
</svg>
</div>
<div class="info">
<p style="font-size: 18px;font-weight: bold">服务器内部错误,错误信息如下:</p>
<p>${msg}</p>
<br>
<a onclick="history.back()">返回上页</a> <a href="/">返回首页</a>
</div>
</div>
</body> </body>
</html>

File diff suppressed because it is too large Load Diff

@ -1,40 +1,80 @@
<!DOCTYPE html>
<html>
<head> <head>
<style> <meta charset="UTF-8" http-equiv="Content-Type" content="text/html; charset=utf-8"/>
html,body{
overflow: hidden; <title>500-服务器走了下神!</title>
}
.box{ <style type="text/css">
width: 100%; body {
height: 100%; background-color: #dfdfdf;
overflow: scroll; }
}
.box a{ .box {
color: #c38168; border: 10px solid #0000002b;
line-height: 18px; margin: 100px auto;
text-decoration: underline; padding: 50px;
} width: 700px;
.box::-webkit-scrollbar {/*滚动条整体样式*/ background-color: #ffffff;
width: 10px; /*高宽分别对应横竖滚动条的尺寸*/ display: table;
height: 1px;
}
.box::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(73, 73, 73, 0.2);
background: #828282;
}
.box::-webkit-scrollbar-track {/*滚动条里面轨道*/
-webkit-box-shadow: inset 0 0 5px rgba(125, 125, 125, 0.2);
border-radius: 10px;
background: #EDEDED;
} }
.box > div {
vertical-align: top;
display: table-cell;
}
.box > div.img {
width: 200px;
}
.box > div.info {
width: 500px;
padding-left: 50px;
padding-top: 20px;
}
.box > div.info {
font-size: 14px;
}
.box > div.info a {
display: inline-block;
text-decoration: none;
background: #f2f2f2;
cursor: pointer;
border: 3px solid #0000002b;
padding: 5px;
}
.box > div.info a:hover {
background: #e6e6e6;
border: 3px solid #0000002b
}
</style> </style>
</head> </head>
<body>
<body>
<div class="box"> <div class="box">
<p> <div class="img">
${msg} <svg t="1571233328721" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
</p> p-id="4252" width="198" height="198">
</div> <path d="M969.143 548.571q0 14.848-10.862 25.71t-25.71 10.862h-128q0 97.719-38.29 165.705L885.138 870.29Q896 881.152 896 896t-10.862 25.71q-10.276 10.861-25.71 10.861t-25.71-10.861L720.568 809.143q-2.853 2.852-8.558 7.424t-23.99 16.274-37.157 20.846-46.848 16.567-55.443 7.424v-512H475.43v512q-29.148 0-58.003-7.717t-49.7-18.87-37.705-22.273-24.869-18.578l-8.558-8.01-104.557 118.273q-11.447 11.995-27.429 11.995-13.714 0-24.576-9.143-10.862-10.276-11.703-25.417t8.85-26.587L252.6 741.632q-33.134-65.134-33.134-156.562h-128q-14.848 0-25.71-10.862t-10.861-25.71 10.861-25.71 25.71-10.861h128v-168.01l-98.852-98.852q-10.862-10.862-10.862-25.71t10.862-25.71 25.71-10.861 25.709 10.862l98.853 98.852h482.304l98.852-98.852q10.862-10.862 25.71-10.862t25.71 10.862 10.861 25.71-10.861 25.71l-98.853 98.852v168.009h128q14.848 0 25.71 10.862t10.861 25.71zM694.857 219.43H329.143q0-75.996 53.43-129.427T512 36.572t129.426 53.43 53.431 129.427z"
fill="" p-id="4253"></path>
</svg>
</div>
<div class="info">
<p style="font-size: 18px;font-weight: bold">服务器内部错误,错误信息如下:</p>
<p>${msg}</p>
<br>
<a onclick="history.back()">返回上页</a> <a href="/">返回首页</a>
</div>
</div>
</body> </body>
</html>

Loading…
Cancel
Save

Powered by TurnKey Linux.